pax_global_header00006660000000000000000000000064151140506100014503gustar00rootroot0000000000000052 comment=986c300c29055b837bfeb5f3c8e1b61583a52938 mapserver-8.6.0/000077500000000000000000000000001511405061000135225ustar00rootroot00000000000000mapserver-8.6.0/.clang-format000066400000000000000000000002071511405061000160740ustar00rootroot00000000000000--- Language: Cpp BasedOnStyle: LLVM SortIncludes: false Standard: Cpp11 TabWidth: 2 UseTab: Never mapserver-8.6.0/.flake8000066400000000000000000000017241511405061000147010ustar00rootroot00000000000000[flake8] max-line-length = 88 ignore = # Unnecessary dict/list/tuple call - rewrite as a literal C408 # whitespace before ':' - doesn't work well with black E203 # missing whitespace around operator - let black worry about that E225 # inline comment should start with '# ' E262 # block comment should start with '# ' E265 # too many leading '#' for block comment E266 # expected 2 blank lines, found 1 E302 # module level import not at top of file E402 # line too long - let black handle that E501 # comparison to None should be E711 # comparison to False/True should be E712 # ambiguous variable name E741 # may be undefined, or defined from star imports F405 # trailing W291 # line break occurred before a binary operator - let black worry about that W503 # line break occurred after a binary operator - let black worry about that W504mapserver-8.6.0/.git-blame-ignore-revs000066400000000000000000000000511511405061000176160ustar00rootroot00000000000000d3c6274e83eab857f122aacad925cf276e99212f mapserver-8.6.0/.github/000077500000000000000000000000001511405061000150625ustar00rootroot00000000000000mapserver-8.6.0/.github/FUNDING.yml000066400000000000000000000002561511405061000167020ustar00rootroot00000000000000# point to OSGeo sponsor page github: [OSGeo] # point to PayPal directly custom: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KRJ2X44N3HA6U&source=urlmapserver-8.6.0/.github/ISSUE_TEMPLATE.md000066400000000000000000000031471511405061000175740ustar00rootroot00000000000000 ## Expected behavior and actual behavior. For example (please modify !!!): I expected the following request to work (paste request) and it returns an error message instead (paste error). ## Steps to reproduce the problem. For example (please modify !!!): "mapserv -nh QUERY_STRING='map=test.map&...'" ## Attach simple test case (drag/drop it here) Please create a .zip file that contains: - small .map file - data - commands.txt (containing commands to reproduce your problem such as map2img, mapserv, etc. ## Operating system For example (please modify !!!): Ubuntu 16.04 64 bit ## MapServer version and installation method For example (please modify !!!): the 7.6.1 version from ubuntugis-unstable PPA mapserver-8.6.0/.github/dependabot.yml000066400000000000000000000001661511405061000177150ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" mapserver-8.6.0/.github/workflows/000077500000000000000000000000001511405061000171175ustar00rootroot00000000000000mapserver-8.6.0/.github/workflows/backport.yml000066400000000000000000000010131511405061000214420ustar00rootroot00000000000000name: Backport on: pull_request_target: types: - closed - labeled jobs: backport: runs-on: ubuntu-latest name: Backport steps: - name: Backport Bot id: backport if: github.event.pull_request.merged && ( ( github.event.action == 'closed' && contains( join( github.event.pull_request.labels.*.name ), 'backport') ) || contains( github.event.label.name, 'backport' ) ) uses: m-kuhn/backport@v1.2.7 with: github_token: ${{ secrets.GITHUB_TOKEN }}mapserver-8.6.0/.github/workflows/build-mapscript-php.yml000066400000000000000000000014361511405061000235320ustar00rootroot00000000000000name: Build and test PHP MapScript on: push: branches: - '*' except: - /^(cherry-pick-)?backport-\d+-to-/ pull_request: branches: - '*' except: - /^(cherry-pick-)?backport-\d+-to-/ concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true permissions: contents: read jobs: build: runs-on: ubuntu-24.04 strategy: matrix: php-version: [8.5, 8.4] steps: - name: Checkout code uses: actions/checkout@v5 - name: Set up PHP and Install Dependencies run: | docker run \ -e WORK_DIR="$PWD" \ -e PHP_VERSION="${{ matrix.php-version }}" \ -v $PWD:$PWD ubuntu:24.04 $PWD/scripts/build-mapscript-php.sh mapserver-8.6.0/.github/workflows/build-mapscript-python.yml000066400000000000000000000014231511405061000242600ustar00rootroot00000000000000name: Build and test Python MapScript on: push: branches: - '*' except: - /^(cherry-pick-)?backport-\d+-to-/ concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true permissions: contents: read jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: [3.9, "3.10", 3.11, 3.12, 3.13] steps: - name: Checkout code uses: actions/checkout@v5 - name: Set up Python and Install Dependencies run: | docker run \ -e WORK_DIR="$PWD" \ -e PYTHON_VERSION="${{ matrix.python-version }}" \ -e MAPSCRIPT_PYTHON_ONLY="true" \ -v $PWD:$PWD ubuntu:24.04 $PWD/scripts/build-mapscript-python.sh mapserver-8.6.0/.github/workflows/build.yml000066400000000000000000000020731511405061000207430ustar00rootroot00000000000000name: Build on: [push, pull_request] concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true permissions: contents: read jobs: build: runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - name: Regular, with coverage WITH_ASAN: "false" WITH_COVERAGE: "true" - name: Address_sanitizer WITH_ASAN: "true" WITH_COVERAGE: "false" name: ${{ matrix.name }} steps: - name: Checkout repository contents uses: actions/checkout@v5 - name: Build run: | docker run \ -e WORK_DIR="$PWD" \ -e WITH_ASAN="${{ matrix.WITH_ASAN }}" \ -e WITH_COVERAGE="${{ matrix.WITH_COVERAGE }}" \ -v $PWD:$PWD ubuntu:24.04 $PWD/.github/workflows/start.sh - name: Coveralls uses: coverallsapp/github-action@v2 if: ${{ matrix.WITH_COVERAGE == 'true' }} with: format: lcov file: mapserver.info mapserver-8.6.0/.github/workflows/build_alpine.sh000077500000000000000000000012361511405061000221070ustar00rootroot00000000000000#!/bin/sh set -eu cd "$WORK_DIR" apk add \ g++ \ make \ cmake \ gdal-dev \ proj-dev \ geos-dev \ curl-dev \ fcgi-dev \ libxml2-dev \ protobuf-c-dev \ freetype-dev \ fribidi-dev \ harfbuzz-dev \ exempi-dev \ giflib-dev \ libpq-dev \ python3-dev \ swig mkdir build cd build cmake .. \ -DCMAKE_CXX_FLAGS="-Werror" \ -DCMAKE_C_FLAGS="-Werror" \ -DWITH_CLIENT_WFS=1 -DWITH_CLIENT_WMS=1 -DWITH_KML=1 -DWITH_SOS=1 \ -DWITH_PYTHON=1 -DWITH_THREAD_SAFETY=1 -DWITH_FRIBIDI=1 -DWITH_FCGI=1 -DWITH_EXEMPI=1 \ -DCMAKE_BUILD_TYPE=Release -DWITH_CURL=1 -DWITH_HARFBUZZ=1 make -j$(nproc) mapserver-8.6.0/.github/workflows/build_alpine.yml000066400000000000000000000010051511405061000222650ustar00rootroot00000000000000name: Build Alpine Linux on: [push, pull_request] concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true permissions: contents: read jobs: build: runs-on: ubuntu-latest name: build_alpine steps: - name: Checkout repository contents uses: actions/checkout@v5 - name: Build run: | docker run \ -e WORK_DIR="$PWD" \ -v $PWD:$PWD alpine:edge $PWD/.github/workflows/build_alpine.sh mapserver-8.6.0/.github/workflows/check-crlf.yml000066400000000000000000000012641511405061000216460ustar00rootroot00000000000000# check for Windows CRLF in files # homepage: https://github.com/marketplace/actions/check-crlf name: Check CRLF on: [push, pull_request] concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true permissions: contents: read jobs: Check-CRLF: name: verify that only LF linefeeds are used runs-on: ubuntu-latest steps: - name: Checkout repository contents uses: actions/checkout@v5 - name: Use action to check for CRLF endings uses: erclu/check-crlf@master with: # ignore directories containing *.pdf and *.tab exclude: msautotest/misc/data/ /msautotest/renderers/expected/ mapserver-8.6.0/.github/workflows/cifuzz.yml000066400000000000000000000014411511405061000211540ustar00rootroot00000000000000name: CIFuzz on: [pull_request] concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true permissions: contents: read jobs: Fuzzing: runs-on: ubuntu-latest steps: - name: Build Fuzzers id: build uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master with: oss-fuzz-project-name: 'mapserver' dry-run: false - name: Run Fuzzers uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master with: oss-fuzz-project-name: 'mapserver' fuzz-seconds: 600 dry-run: false - name: Upload Crash uses: actions/upload-artifact@v5 if: failure() && steps.build.outcome == 'success' with: name: artifacts path: ./out/artifacts mapserver-8.6.0/.github/workflows/code_checks.yml000066400000000000000000000006201511405061000220720ustar00rootroot00000000000000name: Code Checks on: [push, pull_request] concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true permissions: contents: read jobs: linting: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: actions/setup-python@v6 with: python-version: '3.12' - uses: pre-commit/action@v3.0.1 mapserver-8.6.0/.github/workflows/codeql.yml000066400000000000000000000112201511405061000211050ustar00rootroot00000000000000name: "CodeQL" on: push: pull_request: concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true permissions: contents: read jobs: analyze: name: Analyze # Runner size impacts CodeQL analysis time. To learn more, please see: # - https://gh.io/recommended-hardware-resources-for-running-codeql # - https://gh.io/supported-runners-and-hardware-resources # - https://gh.io/using-larger-runners # Consider using larger runners for possible analysis time improvements. runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ 'c-cpp' ] # CodeQL supports [ 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' ] # Use only 'java-kotlin' to analyze code written in Java, Kotlin or both # Use only 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support steps: - name: Checkout repository uses: actions/checkout@v5 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs # queries: security-extended,security-and-quality config: | query-filters: - exclude: id: cpp/non-https-url - name: Install dependencies run: | sudo apt update sudo apt-get install -y ccache cmake g++ sudo apt-get install -y --allow-unauthenticated build-essential protobuf-c-compiler libprotobuf-c-dev bison flex libfribidi-dev \ librsvg2-dev colordiff libpq-dev libpng-dev libjpeg-dev libgif-dev libgeos-dev libfreetype6-dev libfcgi-dev libcurl4-gnutls-dev \ libcairo2-dev libgdal-dev libproj-dev libxml2-dev libexempi-dev libharfbuzz-dev # cache the .ccache directory # key it on the runner os, build type, deps, and arch # It's especially important to include arch in the key because we # may get runtime errors with -mavx2 from objects built on a # different architecture. - name: Restore build cache if: matrix.language == 'c-cpp' id: restore-cache uses: actions/cache/restore@v4 with: path: ${{ github.workspace }}/.ccache key: ${{ matrix.id }}-${{ steps.get-arch.outputs.arch }}-${{ github.ref_name }}-${{ github.run_id }} restore-keys: | ${{ matrix.id }}-${{ steps.get-arch.outputs.arch }}-${{ github.ref_name }} ${{ matrix.id }}-${{ steps.get-arch.outputs.arch }} - name: Configure ccache if: matrix.language == 'c-cpp' run: | echo CCACHE_BASEDIR=${{ github.workspace }} >> ${GITHUB_ENV} echo CCACHE_DIR=${{ github.workspace }}/.ccache >> ${GITHUB_ENV} echo CCACHE_MAXSIZE=250M >> ${GITHUB_ENV} ccache -z - name: Build if: matrix.language == 'c-cpp' run: | mkdir build cd build export CC="ccache gcc" export CXX="ccache g++" cmake .. -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DWITH_CLIENT_WMS=1 \ -DWITH_CLIENT_WFS=1 -DWITH_KML=1 -DWITH_SOS=1 \ -DWITH_THREAD_SAFETY=1 -DWITH_FRIBIDI=1 -DWITH_FCGI=1 -DWITH_EXEMPI=1 \ -DWITH_RSVG=1 -DWITH_CURL=1 -DWITH_HARFBUZZ=1 -DWITH_MSSQL2008=ON make -j$(nproc) - name: Summarize ccache if: matrix.language == 'c-cpp' run: | ccache -s - name: Save build cache if: matrix.language == 'c-cpp' uses: actions/cache/save@v4 with: path: ${{ github.workspace }}/.ccache key: ${{ steps.restore-cache.outputs.cache-primary-key }} - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v4 with: category: "/language:${{matrix.language}}" mapserver-8.6.0/.github/workflows/conda.yml000066400000000000000000000023341511405061000207300ustar00rootroot00000000000000 name: Conda-Forge builds on: [push, pull_request] concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true jobs: build: name: CF ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: os: [macos-latest, windows-latest, ubuntu-latest] steps: - uses: actions/checkout@v5 - uses: ilammy/msvc-dev-cmd@v1 if: matrix.os == 'windows-latest' - name: Support longpaths run: git config --system core.longpaths true if: matrix.os == 'windows-latest' - uses: mamba-org/setup-micromamba@v2 with: init-shell: bash environment-file: ci/conda/environment.yml environment-name: "build" cache-environment: true cache-downloads: true - name: Setup shell: bash -l {0} run: | mkdir build - name: CMake shell: bash -l {0} run: | if [ "$RUNNER_OS" == "Windows" ]; then export CC=cl.exe export CXX=cl.exe fi ../ci/conda/cmake.sh working-directory: ./build - name: Compile shell: bash -l {0} run: | ninja working-directory: ./build mapserver-8.6.0/.github/workflows/coverity-scan.yml000066400000000000000000000015571511405061000224400ustar00rootroot00000000000000name: coverity-scan # Controls when the action will run. on: # Run this action on a schedule (we're allowed a maximum of two per day) schedule: - cron: '0 18 * * SUN' # Sunday at 18:00 UTC # Allows you to run this workflow manually from the Actions tab workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true permissions: contents: read # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: build: runs-on: ubuntu-latest if: github.repository == 'MapServer/MapServer' steps: - uses: actions/checkout@v5 - name: Build run: | docker run \ -e WORK_DIR="$PWD" \ -e TOKEN="${{ secrets.COVERITY_SCAN_TOKEN }}" \ -v $PWD:$PWD ubuntu:24.04 $PWD/scripts/coverity-scan.sh mapserver-8.6.0/.github/workflows/cppcheck.yml000066400000000000000000000011261511405061000214220ustar00rootroot00000000000000name: cppcheck on: [push, pull_request] concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true permissions: contents: read jobs: cppcheck_2004: runs-on: ubuntu-latest if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')" steps: - name: Checkout uses: actions/checkout@v5 - name: Run cppcheck test run: | docker run \ -e WORK_DIR="$PWD" \ -v $PWD:$PWD ubuntu:24.04 $PWD/scripts/cppcheck.sh mapserver-8.6.0/.github/workflows/irc_notify.yml000066400000000000000000000032031511405061000220050ustar00rootroot00000000000000# send build notifications to the #mapserver IRC channel # homepage: https://github.com/marketplace/actions/notify-irc name: "IRC Push Notification" on: push: branches: - main pull_request: branches: - main concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true permissions: contents: read jobs: irc_notify: runs-on: ubuntu-latest #if: github.repository == 'MapServer/MapServer' steps: - name: irc push uses: rectalogic/notify-irc@v2 if: github.event_name == 'push' with: channel: "#mapserver" server: "irc.libera.chat" nickname: mapserver-github-notifier message: | ${{ github.actor }} pushed ${{ github.event.ref }} ${{ github.event.compare }} ${{ join(github.event.commits.*.message) }} - name: irc pull request uses: rectalogic/notify-irc@v2 if: github.event_name == 'pull_request' with: channel: "#mapserver" server: "irc.libera.chat" nickname: mapserver-github-notifier message: | ${{ github.actor }} opened PR ${{ github.event.pull_request.html_url }} ${{ github.event.pull_request.title }} - name: irc tag created uses: rectalogic/notify-irc@v2 if: github.event_name == 'create' && github.event.ref_type == 'tag' with: channel: "#mapserver" server: "irc.libera.chat" nickname: mapserver-github-notifier message: | ${{ github.actor }} tagged ${{ github.repository }} ${{ github.event.ref }} mapserver-8.6.0/.github/workflows/start.sh000077500000000000000000000170161511405061000206200ustar00rootroot00000000000000#!/bin/sh set -e apt-get update -y export PYTHON_VERSION=system LANG=en_US.UTF-8 export LANG DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ sudo locales tzdata software-properties-common python3-dev python3-venv python3-pip python3-setuptools git curl \ apt-transport-https ca-certificates gnupg software-properties-common wget #install PHP 8.1 DEBIAN_FRONTEND=noninteractive add-apt-repository ppa:ondrej/php -y DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ sudo php8.1-dev php8.1-xml php8.1-mbstring && \ echo "$LANG UTF-8" > /etc/locale.gen && \ dpkg-reconfigure --frontend=noninteractive locales && \ update-locale LANG=$LANG USER=root export USER # Install pyenv curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash export PATH="/root/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" # ensure python points to python3 ln -s /usr/bin/python3 /usr/bin/python # set the global Python version pyenv global $PYTHON_VERSION cd "$WORK_DIR" ci/ubuntu/setup.sh ci/ubuntu/build.sh # Validate openapi document pip install check-jsonschema --break-system-packages wget https://raw.githubusercontent.com/OAI/OpenAPI-Specification/refs/heads/main/_archive_/schemas/v3.0/schema.yaml -O openapi_schema.yaml echo "Run check-jsonschema --schemafile openapi_schema.yaml msautotest/api/expected/ogcapi_api.json" check-jsonschema --schemafile openapi_schema.yaml msautotest/api/expected/ogcapi_api.json ##################################### # Test MapServer as CGI and FastCGI # ##################################### make cmakebuild_nocoverage MFLAGS="-j${nproc}" ln -s mapserv /tmp/install-mapserver/bin/mapserv.cgi ln -s mapserv /tmp/install-mapserver/bin/mapserv.fcgi DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends apache2 libapache2-mod-fcgid a2enmod fcgid cgid a2disconf serve-cgi-bin a2dissite 000-default echo "ServerName www.example.com" > /etc/apache2/conf-available/servername.conf a2enconf servername cat </etc/apache2/sites-available/001-mapserver.conf ErrorLog \${APACHE_LOG_DIR}/mapserv-error.log CustomLog \${APACHE_LOG_DIR}/mapserv-access.log combined SetEnv MAPSERVER_CONFIG_FILE ${WORK_DIR}/msautotest/etc/mapserv.conf FcgidInitialEnv MAPSERVER_CONFIG_FILE ${WORK_DIR}/msautotest/etc/mapserv.conf ScriptAlias /cgi-bin/ "/tmp/install-mapserver/bin/" AddHandler fcgid-script .fcgi AddHandler cgi-script .cgi AllowOverride All Options +ExecCGI -MultiViews +FollowSymLinks Order Allow,Deny Allow from all Require all granted EOF a2ensite 001-mapserver service apache2 restart # Prepare mapfile and related resources cat msautotest/wxs/wfs_simple.map | sed "s/\.\/data\/epsg2/\/tmp\/data\/epsg2/" | sed "s/SHAPEPATH \.\/data/SHAPEPATH \/tmp\/data/" | sed "s/ etc/ \/tmp\/etc/" > /tmp/wfs_simple.map cp -r $WORK_DIR/msautotest/wxs/data /tmp cp -r $WORK_DIR/msautotest/wxs/etc /tmp echo "Running CGI query" curl -s "http://localhost/cgi-bin/mapserv.cgi?MAP=/tmp/wfs_simple.map&SERVICE=WFS&REQUEST=GetCapabilities" > /tmp/res.xml cat /tmp/res.xml | grep wfs:WFS_Capabilities >/dev/null || (cat /tmp/res.xml && /bin/false) echo "Running FastCGI query" curl -s "http://localhost/cgi-bin/mapserv.fcgi?MAP=/tmp/wfs_simple.map&SERVICE=WFS&REQUEST=GetCapabilities" > /tmp/res.xml cat /tmp/res.xml | grep wfs:WFS_Capabilities >/dev/null || (cat /tmp/res.xml && /bin/false) echo "Running FastCGI query again" curl -s "http://localhost/cgi-bin/mapserv.fcgi?MAP=/tmp/wfs_simple.map&SERVICE=WFS&REQUEST=GetCapabilities" > /tmp/res.xml cat /tmp/res.xml | grep wfs:WFS_Capabilities >/dev/null || (cat /tmp/res.xml && /bin/false) echo "Check that we return an error if given no arguments" curl -s "http://localhost/cgi-bin/mapserv.fcgi" > /tmp/res.xml cat /tmp/res.xml | grep -q 'QUERY_STRING is set, but empty' || (cat /tmp/res.xml && /bin/false) echo "Check again to make sure further errors are reported (#6543)" curl -s "http://localhost/cgi-bin/mapserv.fcgi" > /tmp/res.xml cat /tmp/res.xml | grep -q 'QUERY_STRING is set, but empty' || (cat /tmp/res.xml && /bin/false) cd msautotest/wxs export PATH=/tmp/install-mapserver/bin:$PATH # Demonstrate that mapserv will error out if cannot find config file mapserv 2>&1 | grep "msLoadConfig(): Unable to access file" >/dev/null && echo yes mapserv QUERY_STRING="MAP=wfs_simple.map&REQUEST=GetCapabilities" 2>&1 | grep "msLoadConfig(): Unable to access file" >/dev/null && echo yes mapserv QUERY_STRING="map=ows_context.map&CONTEXT=ows_context.xml&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetCapabilities" 2>&1 | grep "msLoadConfig(): Unable to access file" >/dev/null && echo "Check that we can't load a OWS context file if MS_CONTEXT_PATTERN is not defined: yes" echo "Check that MS_MAP_NO_PATH works" cat </tmp/mapserver.conf CONFIG ENV "MS_MAP_NO_PATH" "1" END MAPS "MYMAPFILE" "/tmp/wfs_simple.map" END END EOF # Also demonstrate that mapserv can find config file in ${CMAKE_INSTALL_FULL_SYSCONFDIR}/etc/mapserver.conf by default ln -s /tmp/mapserver.conf /tmp/install-mapserver/etc mapserv QUERY_STRING="MAP=MYMAPFILE&SERVICE=WFS&REQUEST=GetCapabilities" > /tmp/res.txt rm /tmp/install-mapserver/etc/mapserver.conf cat /tmp/res.txt | grep wfs:WFS_Capabilities >/dev/null || (cat /tmp/res.txt && /bin/false) echo "Check that -conf switch parameter works in a non-CGI context" mapserv QUERY_STRING="MAP=MYMAPFILE&SERVICE=WFS&REQUEST=GetCapabilities" -conf /tmp/mapserver.conf > /tmp/res.txt cat /tmp/res.txt | grep wfs:WFS_Capabilities >/dev/null || (cat /tmp/res.txt && /bin/false) echo "Check that MS_MAP_NO_PATH works (rejecting a value not defined in the MAPS section)" MAPSERVER_CONFIG_FILE=/tmp/mapserver.conf mapserv QUERY_STRING="MAP=FOO&SERVICE=WFS&REQUEST=GetCapabilities" > /tmp/res.txt cat /tmp/res.txt | grep "Web application error" >/dev/null || (cat /tmp/res.txt && /bin/false) echo "Check that MS_MAP_PATTERN works (accepting valid MAP)" cat </tmp/mapserver.conf CONFIG ENV "MS_MAP_PATTERN" "^wfs_simple\.map$" END END EOF MAPSERVER_CONFIG_FILE=/tmp/mapserver.conf mapserv QUERY_STRING="MAP=wfs_simple.map&SERVICE=WFS&REQUEST=GetCapabilities" > /tmp/res.txt cat /tmp/res.txt | grep wfs:WFS_Capabilities >/dev/null || (cat /tmp/res.txt && /bin/false) echo "Check that MS_MAP_PATTERN works (rejecting invalid MAP)" cat </tmp/mapserver.conf CONFIG ENV "MS_MAP_PATTERN" "mypatternmapserv" END END EOF MAPSERVER_CONFIG_FILE=/tmp/mapserver.conf mapserv QUERY_STRING="MAP=wfs_simple.map&SERVICE=WFS&REQUEST=GetCapabilities" > /tmp/res.txt cat /tmp/res.txt | grep "Web application error" >/dev/null || (cat /tmp/res.txt && /bin/false) echo "Check that MS_MAPFILE works alone" cat </tmp/mapserver.conf CONFIG ENV "MS_MAPFILE" "wfs_simple.map" END END EOF MAPSERVER_CONFIG_FILE=/tmp/mapserver.conf mapserv QUERY_STRING="SERVICE=WFS&REQUEST=GetCapabilities" > /tmp/res.txt cat /tmp/res.txt | grep wfs:WFS_Capabilities >/dev/null || (cat /tmp/res.txt && /bin/false) echo "Check that a MAP query parameter isn't accepted when MS_MAPFILE and MS_MAP_NO_PATH are specified" cat </tmp/mapserver.conf CONFIG ENV "MS_MAPFILE" "wfs_simple.map" "MS_MAP_NO_PATH" "1" END END EOF MAPSERVER_CONFIG_FILE=/tmp/mapserver.conf mapserv QUERY_STRING="MAP=wfs_simple.map&SERVICE=WFS&REQUEST=GetCapabilities" > /tmp/res.txt cat /tmp/res.txt | grep "Web application error" >/dev/null || (cat /tmp/res.txt && /bin/false) echo "Done !" mapserver-8.6.0/.pre-commit-config.yaml000066400000000000000000000016711511405061000200100ustar00rootroot00000000000000repos: - repo: https://github.com/psf/black rev: 22.3.0 hooks: - id: black - repo: https://github.com/timothycrosley/isort rev: 5.12.0 hooks: - id: isort args: ["--profile", "black"] - repo: https://github.com/pycqa/flake8 rev: 7.2.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-clang-format rev: 'v15.0.7' hooks: - id: clang-format exclude_types: [c#, java, javascript, json, proto] exclude: > (?x)^( build | src/renderers/agg/ | src/flatgeobuf/ | src/opengl/ | src/third-party/ | src/maplexer.c | src/mapparser.c | src/mapparser.h | src/dejavu-sans-condensed.h | src/uthash.h ) mapserver-8.6.0/CITATION.cff000066400000000000000000000033261511405061000154200ustar00rootroot00000000000000cff-version: 1.2.0 title: MapServer message: If you use this software, please cite it using the metadata from this file. version: 8.6.0 date-released: 2025-12-03 abstract: MapServer is an Open Source platform for publishing spatial data and interactive mapping applications to the web. type: software authors: - family-names: McKenna given-names: Jeff affiliation: GatewayGeo orcid: https://orcid.org/0000-0003-3900-1863 - family-names: Lime given-names: Steve affiliation: MNIT DNR - family-names: Bonfort given-names: Thomas affiliation: Airbus - family-names: Boué given-names: Jérome - family-names: Butler given-names: Howard affiliation: Hobu Inc orcid: https://orcid.org/0000-0002-5340-1380 - family-names: Girvin given-names: Seth affiliation: Geographika - family-names: Kralidis given-names: Tom - family-names: Meissl given-names: Stephan affiliation: EOX orcid: https://orcid.org/0000-0002-1407-8859 - family-names: Morissette given-names: Daniel affiliation: Mapgears - family-names: Nacionales given-names: Perry affiliation: University of Minnesota - family-names: Rahkonen given-names: Jukka affiliation: National Land Survey of Finland - family-names: Rouault given-names: Even affiliation: Spatialys orcid: https://orcid.org/0000-0002-5068-0476 - family-names: Smith given-names: Mike affiliation: US Army Corps of Engineers - family-names: Szekeres given-names: Tamas repository-code: https://github.com/MapServer/MapServer license: MIT doi: 10.5281/zenodo.6994443 keywords: - web - geospatial - software - ogc - standards - gdal - open source - free software - MIT mapserver-8.6.0/CMakeLists.txt000066400000000000000000001323461511405061000162730ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.16...3.29) project (MapServer) if("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}") message(FATAL_ERROR "In-source builds are not permitted. Make a separate folder for building: mkdir build; cd build; cmake .. Before that, remove the files created by this failed run: rm -rf CMakeCache.txt CMakeFiles") endif("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}") include(CheckLibraryExists) include(CheckFunctionExists) include(CheckSymbolExists) include(CheckIncludeFile) include(CheckCSourceCompiles) set (MapServer_VERSION_MAJOR 8) set (MapServer_VERSION_MINOR 6) set (MapServer_VERSION_REVISION 0) set (MapServer_VERSION_SUFFIX "") # Set C++ version # Make CMAKE_CXX_STANDARD available as cache option overridable by user set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard version to use (default is 17)") message(STATUS "Requiring C++${CMAKE_CXX_STANDARD}") set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) message(STATUS "Requiring C++${CMAKE_CXX_STANDARD} - done") # Set C version # Make CMAKE_C_STANDARD available as cache option overridable by user set(CMAKE_C_STANDARD 17 CACHE STRING "C standard version to use (default is 17)") message(STATUS "Requiring C${CMAKE_C_STANDARD}") set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) message(STATUS "Requiring C${CMAKE_C_STANDARD} - done") set(TARGET_VERSION_MAJOR ${MapServer_VERSION_MAJOR}) set(TARGET_VERSION_MINOR ${MapServer_VERSION_MINOR}) MATH(EXPR MapServer_IS_DEV_VERSION "${MapServer_VERSION_MINOR}%2") if(MapServer_IS_DEV_VERSION) set (MapServer_VERSION_STRING "${MapServer_VERSION_MAJOR}.${MapServer_VERSION_MINOR}-dev") else(MapServer_IS_DEV_VERSION) set (MapServer_VERSION_STRING "${MapServer_VERSION_MAJOR}.${MapServer_VERSION_MINOR}.${MapServer_VERSION_REVISION}") set (MapServer_VERSION_STRING "${MapServer_VERSION_STRING}${MapServer_VERSION_SUFFIX}") endif(MapServer_IS_DEV_VERSION) MATH(EXPR MapServer_VERSION_NUM "${MapServer_VERSION_MAJOR}*10000+${MapServer_VERSION_MINOR}*100+${MapServer_VERSION_REVISION}") SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) foreach(_version IN ITEMS 3.20) if(CMAKE_VERSION VERSION_LESS "${_version}") list(INSERT CMAKE_MODULE_PATH 0 "${PROJECT_SOURCE_DIR}/cmake/${_version}") endif() endforeach() if (APPLE) set(CMAKE_FIND_FRAMEWORK "LAST") endif (APPLE) # Offer the user the choice of overriding the installation directories set(INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries") set(INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables") set(INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files") if(WIN32 AND NOT CYGWIN) set(DEF_INSTALL_CMAKE_DIR CMake) else() set(DEF_INSTALL_CMAKE_DIR share/mapserver/cmake) endif() set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files") # Make relative paths absolute (needed later on) foreach(p LIB BIN INCLUDE CMAKE) set(var INSTALL_${p}_DIR) if(NOT IS_ABSOLUTE "${${var}}") set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}") endif() endforeach() macro (ms_link_libraries) if(BUILD_DYNAMIC) target_link_libraries(mapserver PRIVATE ${ARGV}) endif(BUILD_DYNAMIC) if(BUILD_STATIC) target_link_libraries(mapserver_static PRIVATE ${ARGV}) endif(BUILD_STATIC) endmacro() macro( report_optional_not_found component ) message(SEND_ERROR "${component} library/component/dependency could not be found. HINTS: - disable ${component} support by adding -DWITH_${component}=0 - add the ${component} install directory to the CMAKE_PREFIX_PATH variable (-DCMAKE_PREFIX_PATH=\"/path/to/${component}-install-dir;/path/to/other/dirs\"") endmacro() macro( report_mandatory_not_found component ) message(SEND_ERROR "${component} library/component could not be found and is a mandatory dependency HINT: - add the ${component} install directory to the CMAKE_PREFIX_PATH variable (-DCMAKE_PREFIX_PATH=\"/path/to/${component}-install-dir;/path/to/other/dirs\"") endmacro() macro( report_dependency_error component dependency) message(SEND_ERROR "${component} support requires ${dependency} support, however ${dependency} support has been disabled. HINTS: - re-run with -DWITH_${dependency}=1 (or without -DWITH_${dependency}=0) - disable ${component} support by adding -DWITH_${component}=0" ) endmacro() SET(CMAKE_REQUIRED_INCLUDES "math.h") if(NOT(WIN32)) SET(CMAKE_REQUIRED_LIBRARIES "m") endif(NOT(WIN32)) check_function_exists("strrstr" HAVE_STRRSTR) check_function_exists("strcasecmp" HAVE_STRCASECMP) check_function_exists("strcasestr" HAVE_STRCASESTR) check_function_exists("strlcat" HAVE_STRLCAT) check_function_exists("strlcpy" HAVE_STRLCPY) check_function_exists("strlen" HAVE_STRLEN) check_function_exists("strncasecmp" HAVE_STRNCASECMP) IF((HAVE_STRLCAT OR HAVE_STRLCPY) AND CMAKE_SYSTEM_NAME MATCHES "Linux") add_definitions(-D_DEFAULT_SOURCE) ENDIF() check_symbol_exists(vsnprintf stdio.h HAVE_VSNPRINTF) IF(NOT HAVE_VSNPRINTF) check_function_exists("vsnprintf" HAVE_VSNPRINTF) ENDIF() check_function_exists("lrintf" HAVE_LRINTF) check_function_exists("lrint" HAVE_LRINT) check_include_file(dlfcn.h HAVE_DLFCN_H) check_c_source_compiles(" int main(int argc, char **argv) { long x=0,y=0; for(x=0;x<5;x++) { if(y>1) break; y=__sync_fetch_and_add(&x,1); } }" HAVE_SYNC_FETCH_AND_ADD) include_directories(${CMAKE_CURRENT_BINARY_DIR}) #options supported by the cmake builder option(WITH_PROTOBUFC "Choose if protocol buffers support should be built in (required for vector tiles)" ON) option(WITH_KML "Enable native KML output support (requires libxml2 support)" OFF) option(WITH_SOS "Enable SOS Server support (requires PROJ and libxml2 support)" OFF) option(WITH_WMS "Enable WMS Server support (requires PROJ support)" ON) option(WITH_FRIBIDI "Choose if FriBidi glyph shaping support should be built in (useful for right-to-left languages) (requires HARFBUZZ)" ON) option(WITH_HARFBUZZ "Choose if Harfbuzz complex text layout should be included (needed for e.g. arabic and hindi) (requires FRIBIDI)" ON) option(WITH_ICONV "Choose if Iconv Internationalization support should be built in" ON) option(WITH_CAIRO "Choose if CAIRO rendering support should be built in (required for SVG and PDF output)" ON) option(WITH_SVGCAIRO "Choose if SVG symbology support (via libsvgcairo) should be built in (requires cairo, libsvg, libsvg-cairo. Incompatible with librsvg)" OFF) option(WITH_RSVG "Choose if SVG symbology support (via librsvg) should be built in (requires cairo, librsvg. Incompatible with libsvg-cairo)" OFF) option(WITH_MYSQL "Choose if MYSQL joining support should be built in" OFF) option(WITH_FCGI "Choose if FastCGI support should be built in" ON) option(WITH_GEOS "Choose if GEOS geometry operations support should be built in" ON) option(WITH_POSTGIS "Choose if Postgis input support should be built in" ON) option(WITH_CLIENT_WMS "Enable Client WMS Layer support (requires CURL)" OFF) option(WITH_CLIENT_WFS "Enable Client WMS Layer support (requires CURL)" OFF) option(WITH_CURL "Enable Curl HTTP support (required for wms/wfs client, and remote SLD)" OFF) option(WITH_WFS "Enable WFS Server support (requires PROJ and OGR support)" ON) option(WITH_WCS "Enable WCS Server support (requires PROJ and GDAL support)" ON) option(WITH_OGCAPI "Enable OGCAPI Server support (requires PROJ and OGR support)" ON) option(WITH_LIBXML2 "Choose if libxml2 support should be built in (used for sos, wcs 1.1,2.0 and wfs 1.1)" ON) option(WITH_THREAD_SAFETY "Choose if a thread-safe version of libmapserver should be built (only recommended for some mapscripts)" OFF) option(WITH_GIF "Enable GIF support (for PIXMAP loading)" ON) option(WITH_PYTHON "Enable Python mapscript support" OFF) option(WITH_PHPNG "Enable PHPNG (SWIG) mapscript support" OFF) option(WITH_PERL "Enable Perl mapscript support" OFF) option(WITH_RUBY "Enable Ruby mapscript support" OFF) option(WITH_JAVA "Enable Java mapscript support" OFF) option(WITH_CSHARP "Enable C# mapscript support" OFF) option(WITH_ORACLESPATIAL "include oracle spatial database input support" OFF) option(WITH_ORACLE_PLUGIN "include oracle spatial database input support as plugin" OFF) option(WITH_MSSQL2008 "include mssql 2008 database input support as plugin" OFF) option(WITH_EXEMPI "include xmp output metadata support" OFF) option(WITH_XMLMAPFILE "include native xml mapfile support (requires libxslt/libexslt)" OFF) option(WITH_V8 "include javascript v8 scripting" OFF) option(WITH_PIXMAN "use (experimental) support for pixman for layer compositing operations" OFF) option(BUILD_STATIC "Also build a static version of mapserver" OFF) option(LINK_STATIC_LIBMAPSERVER "Link to static version of libmapserver (also for mapscripts)" OFF) option(WITH_APACHE_MODULE "include (experimental) support for apache module" OFF) option(WITH_GENERIC_NINT "generic rounding" OFF) option(WITH_PYMAPSCRIPT_ANNOTATIONS "Add annotations to Python mapscript output" OFF) option(INSTALL_HTML_BOOTSTRAP "Whether to install HTML Bootstrap resources for OGCAPIs" ON) option(FUZZER "Build fuzzers using libFuzzer (requires Clang, will disable executable - mapserv, etc. - generation)" OFF) mark_as_advanced(FUZZER) option(BUILD_FUZZER_REPRODUCER "Build fuzzer reproducer programs" ON) if(FUZZER AND BUILD_FUZZER_REPRODUCER) message(FATAL_ERROR "FUZZER and BUILD_FUZZER_REPRODUCER options are mutually exclusive") endif() #TODO: USE_OGL? , USE_SDE, USE_CLUSTER_EXTERNAL USE_CLUSTER_PLUGIN, USE_MSSQL2008, USE_MSSQL2008_PLUGIN # SIGNORE_MISSING_DATA, CGI_CL_DEBUG_ARGS, EXTRA DEBUG FLAGS?, # PERLV_ld_DETECT? # Add compiler flags for warnings if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror=format-security") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror=format-security") endif() if(FUZZER) if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang") message(FATAL_ERROR "Need clang for libFuzzer support") endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=fuzzer,address -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer,address -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION") endif() if(NOT DEFINED CMAKE_INSTALL_LIBDIR) set(_LIBDIR_DEFAULT "lib") # Override this default 'lib' with 'lib64' iff: # - we are on Linux system but NOT cross-compiling # - we are NOT on debian # - we are on a 64 bits system # reason is: amd64 ABI: http://www.x86-64.org/documentation/abi.pdf # Note that the future of multi-arch handling may be even # more complicated than that: http://wiki.debian.org/Multiarch if(CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT CMAKE_CROSSCOMPILING AND NOT EXISTS "/etc/debian_version") if(NOT DEFINED CMAKE_SIZEOF_VOID_P) message(AUTHOR_WARNING "Unable to determine default CMAKE_INSTALL_LIBDIR directory because no target architecture is known. " "Please enable at least one language before including GNUInstallDirs.") else() if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") set(_LIBDIR_DEFAULT "lib64") endif() endif() endif() set(CMAKE_INSTALL_LIBDIR "${_LIBDIR_DEFAULT}" CACHE PATH "object code libraries (${_LIBDIR_DEFAULT})") endif() if(NOT DEFINED CMAKE_INSTALL_RPATH) SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) endif() SET(CMAKE_MACOSX_RPATH ON) if(LINK_STATIC_LIBMAPSERVER) set(BUILD_STATIC 1) set(BUILD_DYNAMIC 0) set(MAPSERVER_LIBMAPSERVER mapserver_static) else(LINK_STATIC_LIBMAPSERVER) set(BUILD_DYNAMIC 1) set(MAPSERVER_LIBMAPSERVER mapserver) endif(LINK_STATIC_LIBMAPSERVER) set(agg_SOURCES src/renderers/agg/src/agg_arc.cpp src/renderers/agg/src/agg_vcgen_dash.cpp src/renderers/agg/src/agg_vcgen_contour.cpp src/renderers/agg/src/agg_curves.cpp src/renderers/agg/src/agg_embedded_raster_fonts.cpp src/renderers/agg/src/agg_trans_affine.cpp src/renderers/agg/src/agg_vcgen_stroke.cpp src/renderers/agg/src/agg_font_freetype.cpp src/renderers/agg/src/agg_line_aa_basics.cpp src/renderers/agg/src/clipper.cpp ) include_directories(src/renderers/agg/include) set(v8_SOURCES src/mapscript/v8/v8_object_wrap.hpp src/mapscript/v8/point.cpp src/mapscript/v8/line.cpp src/mapscript/v8/shape.cpp src/mapscript/v8/v8_mapscript.cpp src/mapv8.cpp ) include_directories(src/mapscript/v8/) # point to FlatGeobuf files set(flatgeobuf_SOURCES src/flatgeobuf/flatgeobuf_c.cpp src/flatgeobuf/geometryreader.cpp src/flatgeobuf/packedrtree.cpp ) include_directories(src/flatgeobuf/include) find_package(PCRE2) set(WITH_PCRE2_DEFAULT OFF) if(WIN32 AND (NOT DEFINED REGEX_DIR) AND PCRE2_FOUND) set(WITH_PCRE2_DEFAULT ON) endif() option(WITH_PCRE2 "Use PCRE2 instead of POSIX regex" ${PCRE2_FOUND}) if(WITH_PCRE2 AND NOT PCRE2_FOUND) message(FATAL_ERROR "WITH_PCRE2=ON set, but PCRE2 not found") endif() #add_definitions(-DHASH_DEBUG=1) set(REGEX_SOURCES "") if(WIN32 AND NOT WITH_PCRE2) if(NOT DEFINED REGEX_DIR) message(FATAL_ERROR "Variable REGEX_DIR should point to regex-0.12 source directory, or PCRE2 library should be available") endif() set(REGEX_SOURCES ${REGEX_DIR}/regex.c) include_directories(${REGEX_DIR}) add_definitions(-DREGEX_MALLOC -DUSE_GENERIC_MS_NINT -DHAVE_STRING_H) add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) set(REGEX_MALLOC 1) set(USE_GENERIC_MS_NINT 1) set(HAVE_STRING_H 0) if(MSVC) # Suppress warnings for regex.c set_source_files_properties(${REGEX_SOURCES} PROPERTIES COMPILE_FLAGS /w) endif(MSVC) if(MINGW) # mingw provides stdlib.h add_definitions(-DSTDC_HEADERS=1) endif(MINGW) endif() set(mapserver_SOURCES src/fontcache.c src/cgiutil.c src/mapgeos.c src/maporaclespatial.c src/mapsearch.c src/mapwms.cpp src/classobject.c src/mapgml.c src/mapoutput.c src/mapwmslayer.c src/layerobject.c src/mapgraticule.c src/mapows.c src/mapogcapi.cpp src/mapservutil.c src/mapxbase.c src/maphash.c src/mapowscommon.c src/mapshape.c src/mapxml.c src/mapbits.c src/maphttp.c src/mapparser.c src/mapstring.cpp src/mapxmp.c src/mapcairo.c src/mapimageio.c src/mappluginlayer.c src/mapsymbol.c src/mapchart.c src/mapimagemap.c src/mappool.c src/maptclutf.c src/mapcluster.c src/mapio.c src/mappostgis.cpp src/maptemplate.c src/mapcontext.c src/mapjoin.c src/mappostgresql.c src/mapthread.c src/mapcopy.c src/maplabel.c src/mapprimitive.cpp src/maptile.c src/mapcpl.c src/maplayer.c src/mapproject.c src/maptime.c src/mapcrypto.c src/maplegend.c src/hittest.c src/maptree.c src/mapdebug.c src/maplexer.c src/mapquantization.c src/mapunion.cpp src/mapdraw.c src/maplibxml2.c src/mapquery.cpp src/maputil.c src/strptime.c src/mapdrawgdal.c src/mapraster.c src/mapuvraster.cpp src/mapdummyrenderer.c src/mapobject.c src/maprasterquery.c src/mapwcs.cpp src/maperror.c src/mapogcfilter.cpp src/mapregex.c src/mapwcs11.cpp src/mapfile.c src/mapogcfiltercommon.cpp src/maprendering.c src/mapwcs20.cpp src/mapogcsld.cpp src/mapmetadata.c src/mapresample.c src/mapwfs.cpp src/mapgdal.cpp src/mapogcsos.c src/mapscale.c src/mapwfs11.cpp src/mapwfs20.c src/mapgeomtransform.c src/mapogroutput.cpp src/mapwfslayer.c src/mapagg.cpp src/mapkml.cpp src/mapgeomutil.cpp src/mapkmlrenderer.cpp src/fontcache.c src/textlayout.c src/maputfgrid.cpp src/mapogr.cpp src/mapcontour.c src/mapsmoothing.c src/mapv8.cpp ${REGEX_SOURCES} src/kerneldensity.c src/idw.c src/interpolation.c src/mapflatgeobuf.c src/mapcompositingfilter.c src/mapmvt.c src/mapiconv.c src/mapgraph.cpp src/mapserv-config.cpp src/maprasterlabel.cpp src/mapserv-index.cpp) set(mapserver_HEADERS src/cgiutil.h src/dejavu-sans-condensed.h src/dxfcolor.h src/fontcache.h src/hittest.h src/mapagg.h src/mapaxisorder.h src/mapcopy.h src/mapentities.h src/maperror.h src/mapfile.h src/mapgml.h src/maphash.h src/maphttp.h src/mapio.h src/mapkmlrenderer.h src/maplibxml2.h src/mapogcfilter.h src/mapogcsld.h src/mapoglcontext.h src/mapoglrenderer.h src/mapowscommon.h src/mapows.h src/mapparser.h src/mapogcapi.h src/mappostgis.h src/mapprimitive.h src/mapproject.h src/mapraster.h src/mapregex.h src/mapresample.h src/mapserver-api.h src/mapserver.h src/apps/mapserv.h src/mapshape.h src/mapsymbol.h src/maptemplate.h src/mapthread.h src/maptile.h src/maptime.h src/maptree.h src/maputfgrid.h src/mapwcs.h src/uthash.h src/mapiconv.h src/mapflatgeobuf.h src/mapgraph.h src/mapserv-config.h src/mapserv-index.h) if(WIN32) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/src/version.rc.in ${CMAKE_CURRENT_BINARY_DIR}/src/version.rc @ONLY) set(mapserver_SOURCES ${mapserver_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/src/version.rc) endif(WIN32) if(WITH_PROTOBUFC) find_package(ProtobufC) if(NOT PROTOBUFC_FOUND) report_optional_not_found(PROTOBUFC) else(NOT PROTOBUFC_FOUND) list(APPEND ALL_INCLUDE_DIRS ${PROTOBUFC_INCLUDE_DIR}) FILE(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/renderers/mvt) # Create custom command for protoc-c ADD_CUSTOM_COMMAND( COMMAND ${PROTOBUFC_COMPILER} ARGS --c_out=${PROJECT_BINARY_DIR}/renderers/mvt --proto_path=${PROJECT_SOURCE_DIR}/src/renderers/mvt ${PROJECT_SOURCE_DIR}/src/renderers/mvt/vector_tile.proto OUTPUT ${PROJECT_BINARY_DIR}/renderers/mvt/vector_tile.pb-c.c ${PROJECT_BINARY_DIR}/renderers/mvt/vector_tile.pb-c.h ) SET_SOURCE_FILES_PROPERTIES(${PROJECT_BINARY_DIR}/renderers/mvt/vector_tile.pb-c.h ${PROJECT_BINARY_DIR}/renderers/mvt/vector_tile.pb-c.c GENERATED) set (vectortile_SOURCES ${PROJECT_BINARY_DIR}/renderers/mvt/vector_tile.pb-c.c) set (USE_PBF 1) endif(NOT PROTOBUFC_FOUND) endif (WITH_PROTOBUFC) if(BUILD_DYNAMIC) add_library(mapserver SHARED ${vectortile_SOURCES} ${mapserver_SOURCES} ${agg_SOURCES} ${v8_SOURCES} ${flatgeobuf_SOURCES}) set_target_properties( mapserver PROPERTIES VERSION ${MapServer_VERSION_STRING} SOVERSION 2 ) endif(BUILD_DYNAMIC) if(BUILD_STATIC) add_library(mapserver_static STATIC ${vectortile_SOURCES} ${mapserver_SOURCES} ${agg_SOURCES} ${v8_SOURCES} ${flatgeobuf_SOURCES}) set_target_properties( mapserver_static PROPERTIES VERSION ${MapServer_VERSION_STRING} SOVERSION 2 ) endif(BUILD_STATIC) #SOVERSION is not necessarily the same as the #major version. The rule is that any breakage of the ABI must be #indicated by incrementing the SOVERSION. So, adding e.g. functions is no #problem, modifying argument lists or removing functions would required #the SOVERSION to be incremented. Similar rules hold of course for #non-opaque data-structures. if( NOT FUZZER ) add_executable(mapserv src/apps/mapserv.c) target_link_libraries(mapserv ${MAPSERVER_LIBMAPSERVER}) add_executable(map2img src/apps/map2img.c) target_link_libraries(map2img ${MAPSERVER_LIBMAPSERVER}) add_executable(shptree src/apps/shptree.c) target_link_libraries(shptree ${MAPSERVER_LIBMAPSERVER}) add_executable(coshp src/apps/coshp.c) target_link_libraries(coshp ${MAPSERVER_LIBMAPSERVER}) add_executable(shptreevis src/apps/shptreevis.c) target_link_libraries(shptreevis ${MAPSERVER_LIBMAPSERVER}) add_executable(sortshp src/apps/sortshp.c) target_link_libraries(sortshp ${MAPSERVER_LIBMAPSERVER}) add_executable(legend src/apps/legend.c) target_link_libraries(legend ${MAPSERVER_LIBMAPSERVER}) add_executable(scalebar src/apps/scalebar.c) target_link_libraries(scalebar ${MAPSERVER_LIBMAPSERVER}) add_executable(msencrypt src/apps/msencrypt.c) target_link_libraries(msencrypt ${MAPSERVER_LIBMAPSERVER}) add_executable(tile4ms src/apps/tile4ms.c) target_link_libraries(tile4ms ${MAPSERVER_LIBMAPSERVER}) add_executable(shptreetst src/apps/shptreetst.c) target_link_libraries(shptreetst ${MAPSERVER_LIBMAPSERVER}) endif() if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(USE_EXTENDED_DEBUG 1) endif (CMAKE_BUILD_TYPE STREQUAL "Debug") find_package(PNG) if(PNG_FOUND) include_directories(${PNG_INCLUDE_DIR}) ms_link_libraries( ${PNG_LIBRARIES}) list(APPEND ALL_INCLUDE_DIRS ${PNG_INCLUDE_DIR}) set(USE_PNG 1) else(PNG_FOUND) report_mandatory_not_found(PNG) endif(PNG_FOUND) find_package(JPEG) if(JPEG_FOUND) include_directories(${JPEG_INCLUDE_DIR}) ms_link_libraries( ${JPEG_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${JPEG_INCLUDE_DIR}) set(USE_JPEG 1) else(JPEG_FOUND) report_mandatory_not_found(JPEG) endif(JPEG_FOUND) find_package(Freetype) if(NOT FREETYPE_FOUND) report_mandatory_not_found(FREETYPE) endif(NOT FREETYPE_FOUND) include_directories(${FREETYPE_INCLUDE_DIRS}) ms_link_libraries( ${FREETYPE_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIRS}) find_package(Proj) if(NOT PROJ_FOUND) report_mandatory_not_found(PROJ) endif(NOT PROJ_FOUND) include_directories(${PROJ_INCLUDE_DIR}) ms_link_libraries( ${PROJ_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${PROJ_INCLUDE_DIR}) if(USE_PBF) include_directories(${PROJECT_BINARY_DIR}/renderers/mvt) include_directories(${PROTOBUFC_INCLUDE_DIR}) ms_link_libraries( ${PROTOBUFC_LIBRARY}) endif() if(WITH_PIXMAN) find_package(PIXMAN) if(PIXMAN_FOUND) include_directories(${PIXMAN_INCLUDE_DIR}) ms_link_libraries(${PIXMAN_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${PIXMAN_INCLUDE_DIR}) set (USE_PIXMAN 1) else(PIXMAN_FOUND) report_optional_not_found(PIXMAN) endif(PIXMAN_FOUND) endif (WITH_PIXMAN) if(WITH_WMS) set(USE_WMS_SVR 1) endif(WITH_WMS) if(WITH_FRIBIDI) find_package(FriBiDi) if(NOT FRIBIDI_FOUND) report_optional_not_found(FRIBIDI) else(NOT FRIBIDI_FOUND) include_directories(${FRIBIDI_INCLUDE_DIR}) ms_link_libraries( ${FRIBIDI_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${FRIBIDI_INCLUDE_DIR}) set (USE_FRIBIDI 1) if(FRIBIDI_LEGACY) message(WARNING "Old Fribidi found, upgrade recommended") endif(FRIBIDI_LEGACY) endif(NOT FRIBIDI_FOUND) endif (WITH_FRIBIDI) if(WITH_HARFBUZZ) find_package(HarfBuzz) if(NOT HARFBUZZ_FOUND) report_optional_not_found(HARFBUZZ) else(NOT HARFBUZZ_FOUND) include_directories(${HARFBUZZ_INCLUDE_DIR}) ms_link_libraries( ${HARFBUZZ_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${HARFBUZZ_INCLUDE_DIR}) set (USE_HARFBUZZ 1) endif(NOT HARFBUZZ_FOUND) endif (WITH_HARFBUZZ) if( USE_HARFBUZZ AND NOT(USE_FRIBIDI) ) report_dependency_error(HARFBUZZ FRIBIDI) endif( USE_HARFBUZZ AND NOT(USE_FRIBIDI) ) if( USE_FRIBIDI AND NOT(USE_HARFBUZZ) ) report_dependency_error(FRIBIDI HARFBUZZ) endif( USE_FRIBIDI AND NOT(USE_HARFBUZZ) ) if(WITH_ICONV) find_package(Iconv) if(ICONV_FOUND) include_directories(${Iconv_INCLUDE_DIR}) ms_link_libraries( ${Iconv_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${Iconv_INCLUDE_DIR}) set (USE_ICONV 1) else(ICONV_FOUND) report_optional_not_found(ICONV) endif(ICONV_FOUND) endif (WITH_ICONV) if(WITH_GENERIC_NINT) set(USE_GENERIC_MS_NINT 1) endif(WITH_GENERIC_NINT) if(WITH_CAIRO) find_package(Cairo) if(CAIRO_FOUND) include_directories(${CAIRO_INCLUDE_DIRS}) ms_link_libraries( ${CAIRO_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${CAIRO_INCLUDE_DIR}) set (USE_CAIRO 1) else(CAIRO_FOUND) report_optional_not_found(CAIRO) endif(CAIRO_FOUND) endif (WITH_CAIRO) if(WITH_MYSQL) find_package(MySQL) if(MYSQL_FOUND) include_directories(${MYSQL_INCLUDE_DIR}) ms_link_libraries( ${MYSQL_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${MYSQL_INCLUDE_DIR}) set (USE_MYSQL 1) if (WIN32) find_package(Zstd REQUIRED CONFIG) include_directories(${ZSTD_INCLUDE_DIRS}) ms_link_libraries(zstd::libzstd_shared) endif (WIN32) else(MYSQL_FOUND) report_optional_not_found(MYSQL) endif(MYSQL_FOUND) endif (WITH_MYSQL) if(WITH_ORACLE_PLUGIN AND WITH_ORACLESPATIAL) message(SEND_ERROR "WITH_ORACLESPATIAL and WITH_ORACLE_PLUGIN cannot be used simultaneously") endif(WITH_ORACLE_PLUGIN AND WITH_ORACLESPATIAL) if(WITH_ORACLESPATIAL OR WITH_ORACLE_PLUGIN) if(NOT DEFINED ENV{ORACLE_HOME}) MESSAGE( SEND_ERROR "ORACLE_HOME environment variable not set, needed for detection") endif() find_package(ORACLE) if(ORACLE_FOUND) include_directories(${ORACLE_INCLUDE_DIR}) list(APPEND ALL_INCLUDE_DIRS ${ORACLE_INCLUDE_DIR}) else(ORACLE_FOUND) report_optional_not_found(ORACLESPATIAL) #FIXME: error message here could be misleading, only states ORACLESPATIAL whereas #the request could have been for ORACLE_PLUGIN endif(ORACLE_FOUND) endif(WITH_ORACLESPATIAL OR WITH_ORACLE_PLUGIN) if(ORACLE_FOUND AND WITH_ORACLESPATIAL) ms_link_libraries( ${ORACLE_LIBRARY}) set (USE_ORACLESPATIAL 1) endif(ORACLE_FOUND AND WITH_ORACLESPATIAL) if(ORACLE_FOUND AND WITH_ORACLE_PLUGIN) add_library(msplugin_oracle MODULE src/maporaclespatial.c) target_link_libraries(msplugin_oracle ${ORACLE_LIBRARY} ${MAPSERVER_LIBMAPSERVER}) set_target_properties(msplugin_oracle PROPERTIES COMPILE_FLAGS -DUSE_ORACLE_PLUGIN) set (USE_ORACLE_PLUGIN 1) endif(ORACLE_FOUND AND WITH_ORACLE_PLUGIN) if(WITH_MSSQL2008) find_package(ODBC) if(ODBC_FOUND) add_library(msplugin_mssql2008 MODULE src/mapmssql2008.c) target_link_libraries(msplugin_mssql2008 ${ODBC_LIBRARY} ${MAPSERVER_LIBMAPSERVER}) set_target_properties(msplugin_mssql2008 PROPERTIES COMPILE_FLAGS "-DUSE_MSSQL2008_PLUGIN -DUSE_MSSQL2008") list(APPEND ALL_INCLUDE_DIRS ${ODBC_INCLUDE_DIR}) set (USE_MSSQL2008 1) else(ODBC_FOUND) report_optional_not_found(ODBC) endif(ODBC_FOUND) endif(WITH_MSSQL2008) if(WITH_FCGI) find_package(FCGI) if(FCGI_FOUND) include_directories(${FCGI_INCLUDE_DIR}) if( NOT FUZZER ) target_link_libraries(mapserv ${FCGI_LIBRARY}) endif() list(APPEND ALL_INCLUDE_DIRS ${FCGI_INCLUDE_DIR}) set (USE_FASTCGI 1) else(FCGI_FOUND) report_optional_not_found(FCGI) endif(FCGI_FOUND) endif (WITH_FCGI) if(WITH_GEOS) find_package(GEOS) if(GEOS_FOUND) include_directories(${GEOS_INCLUDE_DIR}) ms_link_libraries( ${GEOS_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${GEOS_INCLUDE_DIR}) set (USE_GEOS 1) else(GEOS_FOUND) report_optional_not_found(GEOS) endif(GEOS_FOUND) endif (WITH_GEOS) if(WITH_POSTGIS) find_package(PostgreSQL) # map new module variables to uppercase variables set (POSTGRESQL_FOUND ${PostgreSQL_FOUND}) set (POSTGRESQL_LIBRARY ${PostgreSQL_LIBRARIES}) set (POSTGRESQL_INCLUDE_DIR ${PostgreSQL_INCLUDE_DIRS}) if(POSTGRESQL_FOUND) #uppercase our variables if ( NOT DEFINED POSTGRESQL_LIBRARY ) set( POSTGRESQL_LIBRARY ${PostgreSQL_LIBRARY}) endif() if ( NOT DEFINED POSTGRESQL_INCLUDE_DIR ) set( POSTGRESQL_INCLUDE_DIR ${PostgreSQL_INCLUDE_DIR}) endif() include_directories(${POSTGRESQL_INCLUDE_DIR}) ms_link_libraries( ${POSTGRESQL_LIBRARY}) CHECK_LIBRARY_EXISTS(pq "PQserverVersion" POSTGRESQL_LIBRARY POSTGIS_HAS_SERVER_VERSION) list(APPEND ALL_INCLUDE_DIRS ${POSTGRESQL_INCLUDE_DIR}) set (USE_POSTGIS 1) else(POSTGRESQL_FOUND) report_optional_not_found(POSTGIS) endif(POSTGRESQL_FOUND) endif (WITH_POSTGIS) find_package(GDAL) if(NOT GDAL_FOUND) report_mandatory_not_found(GDAL) endif(NOT GDAL_FOUND) include_directories(${GDAL_INCLUDE_DIR}) ms_link_libraries( ${GDAL_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${GDAL_INCLUDE_DIR}) if(WITH_SVGCAIRO) if(WITH_RSVG) message(SEND_ERROR "WITH_SVGCAIRO cannot be enabled with WITH_RSVG") endif(WITH_RSVG) find_package(SVGCairo) if(SVGCAIRO_FOUND) include_directories(${SVG_INCLUDE_DIR} ${SVGCAIRO_INCLUDE_DIR}) ms_link_libraries( ${SVG_LIBRARY} ${SVGCAIRO_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${SVG_INCLUDE_DIR} ${SVGCAIRO_INCLUDE_DIR}) set (USE_SVG_CAIRO 1) else(SVGCAIRO_FOUND) report_optional_not_found(SVGCAIRO) endif(SVGCAIRO_FOUND) endif (WITH_SVGCAIRO) if(WITH_RSVG) if(WITH_SVGCAIRO) message(SEND_ERROR "WITH_RSVG cannot be enabled with WITH_CAIROSVG") endif(WITH_SVGCAIRO) find_package(RSVG) if(RSVG_FOUND AND GOBJECT_FOUND) include_directories(${RSVG_INCLUDE_DIRS}) ms_link_libraries( ${RSVG_LIBRARY} ) list(APPEND ALL_INCLUDE_DIRS ${RSVG_INCLUDE_DIRS}) include_directories(${GOBJECT_INCLUDE_DIRS}) ms_link_libraries( ${GOBJECT_LIBRARY} ) list(APPEND ALL_INCLUDE_DIRS ${GOBJECT_INCLUDE_DIRS}) set (USE_RSVG 1) else(RSVG_FOUND AND GOBJECT_FOUND) report_optional_not_found(RSVG) endif(RSVG_FOUND AND GOBJECT_FOUND) endif (WITH_RSVG) if(WITH_CLIENT_WMS OR WITH_CLIENT_WFS) set(WITH_CURL ON) endif(WITH_CLIENT_WMS OR WITH_CLIENT_WFS) if(WITH_CURL) find_package(CURL) if(CURL_FOUND) include_directories(${CURL_INCLUDE_DIR}) ms_link_libraries( ${CURL_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${CURL_INCLUDE_DIR}) set(USE_CURL 1) else(CURL_FOUND) report_optional_not_found(CURL) endif(CURL_FOUND) endif(WITH_CURL) if(WITH_CLIENT_WMS OR WITH_CLIENT_WFS) if(NOT USE_CURL) if(WITH_CLIENT_WFS) report_dependency_error(CLIENT_WFS CURL) endif(WITH_CLIENT_WFS) if(WITH_CLIENT_WMS) report_dependency_error(CLIENT_WMS CURL) endif(WITH_CLIENT_WMS) endif(NOT USE_CURL) endif(WITH_CLIENT_WMS OR WITH_CLIENT_WFS) if(WITH_CLIENT_WMS) set(USE_WMS_LYR 1) endif(WITH_CLIENT_WMS) if(WITH_CLIENT_WFS) set(USE_WFS_LYR 1) endif(WITH_CLIENT_WFS) if(WITH_WFS) set(USE_WFS_SVR 1) endif(WITH_WFS) if(WITH_WCS) set(USE_WCS_SVR 1) endif(WITH_WCS) if(WITH_OGCAPI) set(USE_OGCAPI_SVR 1) endif(WITH_OGCAPI) if(WITH_LIBXML2) find_package(LibXml2) if(LIBXML2_FOUND) include_directories(${LIBXML2_INCLUDE_DIR}) if(NOT DEFINED LIBXML2_LIBRARY) set(LIBXML2_LIBRARY ${LIBXML2_LIBRARIES}) endif() ms_link_libraries( ${LIBXML2_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${LIBXML2_INCLUDE_DIR}) set (USE_LIBXML2 1) else(LIBXML2_FOUND) report_optional_not_found(LIBXML2) endif(LIBXML2_FOUND) endif (WITH_LIBXML2) if( USE_WCS_SVR AND NOT USE_LIBXML2 ) message(WARNING "WCS 1.1 and 2.0 require libxml2 support but it was not found. WCS 1.1 and 2.0 will not be supported by this build") endif( USE_WCS_SVR AND NOT USE_LIBXML2 ) if( USE_WFS_SVR AND NOT USE_LIBXML2 ) message(WARNING "WFS 1.1 and 2.0 require libxml2 support but it was not found. WFS 1.1 and 2.0 will not be supported by this build") endif( USE_WFS_SVR AND NOT USE_LIBXML2 ) if(WITH_SOS) if(USE_LIBXML2) set(USE_SOS_SVR 1) else(USE_LIBXML2) report_dependency_error(SOS LIBXML2) endif(USE_LIBXML2) endif(WITH_SOS) if(WITH_KML) if(USE_LIBXML2) set(USE_KML 1) else(USE_LIBXML2) report_dependency_error(KML LIBXML2) endif(USE_LIBXML2) endif(WITH_KML) if(WITH_THREAD_SAFETY) set( CMAKE_THREAD_PREFER_PTHREAD 1 ) find_package(Threads) if (THREADS_FOUND) ms_link_libraries( ${CMAKE_THREAD_LIBS_INIT}) set(USE_THREAD 1) endif (THREADS_FOUND) endif(WITH_THREAD_SAFETY) if(WITH_XMLMAPFILE) if(NOT USE_LIBXML2) report_dependency_error(KML LIBXML2) endif(NOT USE_LIBXML2) #check for xslt and exslt find_package(LibXslt) if(LIBXSLT_FOUND) if(NOT DEFINED LIBXSLT_LIBRARY) set(LIBXSLT_LIBRARY ${LIBXSLT_LIBRARIES}) endif() include_directories(${LIBXSLT_INCLUDE_DIR}) ms_link_libraries( ${LIBXSLT_LIBRARY} ${LIBXSLT_EXSLT_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${LIBXSLT_INCLUDE_DIR}) set(USE_XMLMAPFILE 1) else(LIBXSLT_FOUND) message(SEND_ERROR "Xml Mapfile support requires XSLT support which was not found. HINTS: - add the libxslt install directory to the CMAKE_PREFIX_PATH variable (-DCMAKE_PREFIX_PATH=\"/path/to/libxslt-install-dir;/path/to/other/dirs\" - disable Xml Mapfile support by adding -DWITH_XMLMAPFILE=0" ) endif(LIBXSLT_FOUND) endif(WITH_XMLMAPFILE) if(WITH_GIF) find_package(GIF) if(GIF_FOUND) include_directories(${GIF_INCLUDE_DIR}) ms_link_libraries( ${GIF_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${GIF_INCLUDE_DIR}) set(USE_GIF 1) else(GIF_FOUND) report_optional_not_found(GIF) endif(GIF_FOUND) endif(WITH_GIF) if(WITH_EXEMPI) find_package(Exempi) if(EXEMPI_FOUND) include_directories(${LIBEXEMPI_INCLUDE_DIR}) ms_link_libraries( ${LIBEXEMPI_LIBRARY}) list(APPEND ALL_INCLUDE_DIRS ${LIBEXEMPI_INCLUDE_DIR}) set(USE_EXEMPI 1) else(EXEMPI_FOUND) report_optional_not_found(EXEMPI) endif(EXEMPI_FOUND) endif(WITH_EXEMPI) if(WITH_PYTHON) add_subdirectory("src/mapscript/python") set(USE_PYTHON_MAPSCRIPT 1) endif(WITH_PYTHON) if(WITH_V8) FIND_PACKAGE(V8) IF(V8_FOUND EQUAL 1) SET(USE_V8_MAPSCRIPT 1) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) INCLUDE_DIRECTORIES(${V8_INCLUDE}) list(APPEND ALL_INCLUDE_DIRS ${V8_INCLUDE}) MS_LINK_LIBRARIES( ${V8_LIBS}) ELSE(V8_FOUND) MESSAGE(SEND_ERROR "V8 JavaScript support requested but not found. HINTS: - set V8_ROOT environment variable to the installation path of V8. - add the V8 install directory to the CMAKE_PREFIX_PATH variable (-DCMAKE_PREFIX_PATH=\"/path/to/${component}-install-dir;/path/to/other/dirs\") ") ENDIF() ENDIF(WITH_V8) if(WITH_PCRE2) SET(USE_PCRE2 1) ms_link_libraries(PCRE2::PCRE2-POSIX) endif() if(WITH_PHPNG) add_subdirectory("src/mapscript/phpng") set(USE_PHPNG_MAPSCRIPT 1) endif(WITH_PHPNG) if(WITH_APACHE_MODULE) add_subdirectory("src/apache") set(USE_APACHE_MODULE 1) endif(WITH_APACHE_MODULE) if(WITH_PERL) add_subdirectory("src/mapscript/perl") set(USE_PERL_MAPSCRIPT 1) endif(WITH_PERL) if(WITH_RUBY) add_subdirectory("src/mapscript/ruby") set(USE_RUBY_MAPSCRIPT 1) endif(WITH_RUBY) if(WITH_JAVA) add_subdirectory("src/mapscript/java") set(USE_JAVA_MAPSCRIPT 1) endif(WITH_JAVA) if(WITH_CSHARP) add_subdirectory("src/mapscript/csharp") set(USE_CSHARP_MAPSCRIPT 1) endif(WITH_CSHARP) if(FUZZER OR BUILD_FUZZER_REPRODUCER) add_subdirectory("fuzzers") endif() if(UNIX) ms_link_libraries( ${CMAKE_DL_LIBS} m ) endif(UNIX) if (WIN32) ms_link_libraries( ${MS_EXTERNAL_LIBS} ws2_32.lib ) if (MSVC) #4701 : Potentially uninitialized local variable 'name' used (https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-4-c4701) set_target_properties(mapserver PROPERTIES COMPILE_FLAGS "/EHsc /wd4267 /wd4244 /wd4018 /w14701") endif(MSVC) endif (WIN32) configure_file ( "${PROJECT_SOURCE_DIR}/src/mapserver-config.h.in" "${PROJECT_BINARY_DIR}/mapserver-config.h" ) configure_file ( "${PROJECT_SOURCE_DIR}/src/mapserver-version.h.in" "${PROJECT_BINARY_DIR}/mapserver-version.h" ) if(BUILD_DYNAMIC) set_target_properties(mapserver PROPERTIES PUBLIC_HEADER "${mapserver_HEADERS};${PROJECT_BINARY_DIR}/mapserver-config.h;${PROJECT_BINARY_DIR}/mapserver-version.h" ) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUCC OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") target_compile_options(mapserver PRIVATE -Wall -Wextra -Werror=format-security) endif() endif(BUILD_DYNAMIC) if (NOT("${LIBMAPSERVER_EXTRA_FLAGS}" STREQUAL "")) set_source_files_properties(${mapserver_SOURCES} PROPERTIES COMPILE_FLAGS ${LIBMAPSERVER_EXTRA_FLAGS}) endif() macro(status_optional_component component enabled libpath) if("${enabled}" EQUAL "1") message(STATUS " * ${component}: ${libpath}") else() message(STATUS " * ${component}: disabled") endif() endmacro() macro(status_optional_feature feature enabled) if("${enabled}" EQUAL "1") message(STATUS " * ${feature}: ENABLED") else() message(STATUS " * ${feature}: disabled") endif() endmacro() message(STATUS "* Summary of configured options for this build") message(STATUS " * Mandatory components") message(STATUS " * GDAL: ${GDAL_LIBRARY}") message(STATUS " * PROJ: ${PROJ_LIBRARY}") message(STATUS " * png: ${PNG_LIBRARY}") message(STATUS " * jpeg: ${JPEG_LIBRARY}") message(STATUS " * freetype: ${FREETYPE_LIBRARY}") message(STATUS " * Optional components") status_optional_component("PCRE2" "${USE_PCRE2}" "${PCRE2-POSIX_LIBRARY}") status_optional_component("GIF" "${USE_GIF}" "${GIF_LIBRARY}") status_optional_component("MYSQL" "${USE_MYSQL}" "${MYSQL_LIBRARY}") status_optional_component("FRIBIDI" "${USE_FRIBIDI}" "${FRIBIDI_LIBRARY}") status_optional_component("HARFBUZZ" "${USE_HARFBUZZ}" "${HARFBUZZ_LIBRARY}") status_optional_component("CAIRO" "${USE_CAIRO}" "${CAIRO_LIBRARY}") status_optional_component("SVGCAIRO" "${USE_SVG_CAIRO}" "${SVGCAIRO_LIBRARY}") status_optional_component("RSVG" "${USE_RSVG}" "${RSVG_LIBRARY}") status_optional_component("CURL" "${USE_CURL}" "${CURL_LIBRARY}") status_optional_component("PIXMAN" "${USE_PIXMAN}" "${PIXMAN_LIBRARY}") status_optional_component("LIBXML2" "${USE_LIBXML2}" "${LIBXML2_LIBRARY}") status_optional_component("POSTGIS" "${USE_POSTGIS}" "${POSTGRESQL_LIBRARY}") status_optional_component("GEOS" "${USE_GEOS}" "${GEOS_LIBRARY}") status_optional_component("FastCGI" "${USE_FASTCGI}" "${FCGI_LIBRARY}") status_optional_component("PROTOBUFC" "${USE_PBF}" "${PROTOBUFC_LIBRARY}") if(USE_ORACLESPATIAL OR USE_ORACLE_PLUGIN) if(USE_ORACLESPATIAL) status_optional_component("Oracle Spatial" "${USE_ORACLESPATIAL}" "${ORACLE_LIBRARY}") else(USE_ORACLESPATIAL) status_optional_component("Oracle Spatial (Built as plugin)" "${USE_ORACLE_PLUGIN}" "${ORACLE_LIBRARY}") endif(USE_ORACLESPATIAL) else(USE_ORACLESPATIAL OR USE_ORACLE_PLUGIN) status_optional_component("Oracle Spatial" "" "${ORACLE_LIBRARY}") endif(USE_ORACLESPATIAL OR USE_ORACLE_PLUGIN) if(USE_MSSQL2008) status_optional_component("MSSQL 2008 (Built as plugin)" "${USE_MSSQL2008}" "${ODBC_LIBRARY}") endif(USE_MSSQL2008) status_optional_component("Exempi XMP" "${USE_EXEMPI}" "${LIBEXEMPI_LIBRARY}") message(STATUS " * Optional features") status_optional_feature("WMS SERVER" "${USE_WMS_SVR}") status_optional_feature("WFS SERVER" "${USE_WFS_SVR}") status_optional_feature("WCS SERVER" "${USE_WCS_SVR}") status_optional_feature("SOS SERVER" "${USE_SOS_SVR}") status_optional_feature("OGCAPI SERVER" "${USE_OGCAPI_SVR}") status_optional_feature("Install HTML Bootstrap resources for OGCAPI" "${INSTALL_HTML_BOOTSTRAP}") status_optional_feature("WMS CLIENT" "${USE_WMS_LYR}") status_optional_feature("WFS CLIENT" "${USE_WFS_LYR}") status_optional_feature("ICONV" "${USE_ICONV}") status_optional_feature("Thread-safety support" "${USE_THREAD}") status_optional_feature("KML output" "${USE_KML}") status_optional_feature("XML Mapfile support" "${USE_XMLMAPFILE}") message(STATUS " * Mapscripts") status_optional_feature("Python" "${USE_PYTHON_MAPSCRIPT}") status_optional_feature("PHPNG" "${USE_PHPNG_MAPSCRIPT}") status_optional_feature("PERL" "${USE_PERL_MAPSCRIPT}") status_optional_feature("RUBY" "${USE_RUBY_MAPSCRIPT}") status_optional_feature("JAVA" "${USE_JAVA_MAPSCRIPT}") status_optional_feature("C#" "${USE_CSHARP_MAPSCRIPT}") status_optional_feature("V8 Javascript" "${USE_V8_MAPSCRIPT}") status_optional_feature("Apache Module (Experimental)" "${USE_APACHE_MODULE}") status_optional_feature("Python MapScript Annotations" "${WITH_PYMAPSCRIPT_ANNOTATIONS}") message(STATUS "") message(STATUS "PROJECT_BINARY_DIR is set to ${PROJECT_BINARY_DIR}") message(STATUS "Will install files to ${CMAKE_INSTALL_PREFIX}") message(STATUS "Will install libraries to ${INSTALL_LIB_DIR}") include_directories("${PROJECT_BINARY_DIR}") if(WIN32) set(REGEX_MALLOC 1) set(USE_GENERIC_MS_NINT 1) # FIXME: https://stackoverflow.com/a/65321305 this handles older MSVC # SDKs that are used by Conda Forge windows builds add_definitions(-D_XKEYCHECK_H=1) endif(WIN32) #INSTALL(FILES mapserver-api.h ${PROJECT_BINARY_DIR}/mapserver-version.h DESTINATION include) if(USE_ORACLE_PLUGIN) INSTALL(TARGETS msplugin_oracle DESTINATION ${INSTALL_LIB_DIR}) endif(USE_ORACLE_PLUGIN) if(USE_MSSQL2008) INSTALL(TARGETS msplugin_mssql2008 DESTINATION ${INSTALL_LIB_DIR}) endif(USE_MSSQL2008) if(NOT FUZZER) INSTALL(TARGETS coshp sortshp shptree shptreevis msencrypt legend scalebar tile4ms shptreetst map2img mapserv RUNTIME DESTINATION ${INSTALL_BIN_DIR} COMPONENT bin ) endif() if(BUILD_STATIC) INSTALL(TARGETS mapserver_static DESTINATION ${INSTALL_LIB_DIR} COMPONENT staticlib ) endif(BUILD_STATIC) if(BUILD_DYNAMIC) INSTALL(TARGETS mapserver EXPORT mapserverTargets ARCHIVE DESTINATION ${INSTALL_LIB_DIR} COMPONENT shlib LIBRARY DESTINATION ${INSTALL_LIB_DIR} COMPONENT shlib PUBLIC_HEADER DESTINATION ${INSTALL_INCLUDE_DIR}/mapserver COMPONENT dev ) # Add all targets to the build-tree export set export(TARGETS mapserver FILE "${PROJECT_BINARY_DIR}/mapserverTargets.cmake" ) # Export the package for use from the build-tree # (this registers the build-tree with a global CMake-registry) export(PACKAGE mapserver) list(APPEND ALL_INCLUDE_DIRS ${INSTALL_INCLUDE_DIR}) list(APPEND ALL_INCLUDE_DIRS ${INSTALL_INCLUDE_DIR}/mapserver) list(REMOVE_DUPLICATES ALL_INCLUDE_DIRS) # Create the mapserver-config.cmake and mapserver-config-version files file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}" "${ALL_INCLUDE_DIRS}") # ... for the build tree set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}" "${PROJECT_BINARY_DIR}") configure_file(src/mapserver-config.cmake.in "${PROJECT_BINARY_DIR}/mapserver-config.cmake" @ONLY) # ... for the install tree set(CONF_INCLUDE_DIRS "\${MAPSERVER_CMAKE_DIR}/${REL_INCLUDE_DIR}") configure_file(src/mapserver-config.cmake.in "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/mapserver-config.cmake" @ONLY) # ... for both configure_file(src/mapserver-config-version.cmake.in "${PROJECT_BINARY_DIR}/mapserver-config-version.cmake" @ONLY) # Install the mapserver-config.cmake and mapserver-config-version.cmake install(FILES "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/mapserver-config.cmake" "${PROJECT_BINARY_DIR}/mapserver-config-version.cmake" DESTINATION "${INSTALL_CMAKE_DIR}" COMPONENT dev ) # Install the export set for use with the install-tree install(EXPORT mapserverTargets DESTINATION "${INSTALL_CMAKE_DIR}" COMPONENT dev ) endif(BUILD_DYNAMIC) if(UNIX) include(GNUInstallDirs) set(DEFAULT_DATA_SUBDIR ${CMAKE_INSTALL_DATAROOTDIR}/mapserver) else() set(DEFAULT_DATA_SUBDIR share/mapserver) endif() set(DEFAULT_CONFIG_FILE ${CMAKE_INSTALL_FULL_SYSCONFDIR}/mapserver.conf) # Locations are changeable by user to customize layout of MapServer installation # (default values are platform-specific) set(MAPSERVER_DATA_SUBDIR ${DEFAULT_DATA_SUBDIR} CACHE STRING "Subdirectory where data will be installed") set(MAPSERVER_CONFIG_FILE "${DEFAULT_CONFIG_FILE}" CACHE STRING "Full file name for default configuration file (mapserver.conf)") # Mark *DIR variables as advanced and dedicated to use by power-users only. mark_as_advanced( MAPSERVER_DATA_SUBDIR MAPSERVER_CONFIG_FILE ) add_definitions(-DMAPSERVER_BUILD) add_definitions(-DMAPSERVER_CONFIG_FILE="${MAPSERVER_CONFIG_FILE}") install( FILES ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-plain/collection.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-plain/collection-item.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-plain/collection-items.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-plain/collections.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-plain/conformance.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-plain/debug.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-plain/footer.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-plain/header.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-plain/landing.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-plain/openapi.html DESTINATION ${MAPSERVER_DATA_SUBDIR}/ogcapi/templates/html-plain/ ) install( FILES ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-index-plain/footer.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-index-plain/header.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-index-plain/landing.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-index-plain/map.html DESTINATION ${MAPSERVER_DATA_SUBDIR}/ogcapi/templates/html-index-plain/ ) if(INSTALL_HTML_BOOTSTRAP) install( FILES ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-bootstrap/collection.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-bootstrap/collection-item.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-bootstrap/collection-items.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-bootstrap/collections.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-bootstrap/conformance.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-bootstrap/debug.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-bootstrap/footer.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-bootstrap/header.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-bootstrap/landing.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-bootstrap/openapi.html DESTINATION ${MAPSERVER_DATA_SUBDIR}/ogcapi/templates/html-bootstrap/ ) install( FILES ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-index-bootstrap/footer.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-index-bootstrap/header.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-index-bootstrap/landing.html ${PROJECT_SOURCE_DIR}/share/ogcapi/templates/html-index-bootstrap/map.html DESTINATION ${MAPSERVER_DATA_SUBDIR}/ogcapi/templates/html-index-bootstrap/ ) endif() install( FILES ${PROJECT_SOURCE_DIR}/etc/mapserver-sample.conf DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/ ) option(BUILD_TESTING "Build unit test" ON) if(BUILD_DYNAMIC AND BUILD_TESTING) enable_testing() add_executable(unit_test tests/unit/test.cpp) target_link_libraries(unit_test PRIVATE mapserver) add_test(NAME unit_test COMMAND unit_test) endif() mapserver-8.6.0/CONTRIBUTING.md000066400000000000000000000045521511405061000157610ustar00rootroot00000000000000# How to contribute to MapServer Contributions to the MapServer project are most welcome, and can take many forms such as detailed bug reports, documentation, tests, features, and patches. Note that all contributions are managed by the MapServer [Project Steering Committee](https://mapserver.org/psc.html). ## Bugs and Help GitHub issues should only be created to log bugs. For general help and support the MapServer [mailing lists](https://mapserver.org/community/lists.html) should be used. If you are unsure if you have discovered a bug, or may need help with configuring MapServer please post to the [mapserver-users list](https://lists.osgeo.org/mailman/listinfo/mapserver-users). There is also a [MapServer FAQ](https://mapserver.org/faq.html) which may have a solution to your problem. If you have discovered a bug, please refer to the [Bug Submission page](https://mapserver.org/development/bugs.html) for guidelines on creating an issue on GitHub. Please also search the existing issues to see if the bug has already been reported, and add any further details to the existing issue. For professional support please see the [MapServer Service Providers page](https://mapserver.org/community/service_providers.html). ## Development A separate [mapserver-dev mailing list](https://lists.osgeo.org/mailman/listinfo/mapserver-dev) is available for developers working on the MapServer code. Send a short message there to introduce yourself to the community, and mention what you are interested in working on. Details on using GitHub can be found on the [MapServer GitHub page](https://mapserver.org/development/git.html). Request for Comments (RFCs), where upcoming major changes to the source code are proposed, and a description of the various software tests & release plans, can be found on the [MapServer Development page](https://mapserver.org/development/). Additional developer notes can be found in the [MapServer wiki](https://github.com/mapserver/mapserver/wiki#developer-notes), including coding style and guidelines, memory management, and working with Git. ## Documentation The MapServer documentation is stored in a [separate repository](https://github.com/MapServer/MapServer-documentation). Please submit any documentation issues or changes there. See the [Documentation Development Guide](https://mapserver.org/development/documentation.html) for further details. mapserver-8.6.0/HISTORY.md000066400000000000000000005002231511405061000152070ustar00rootroot00000000000000MapServer Revision History ========================== This is a human-readable revision history which will attempt to document required changes for users to migrate from one version of MapServer to the next. Developers are strongly encouraged to document their changes and their impacts on the users here. (Please add the most recent changes to the top of the list.) For a complete change history, please see the Git log comments. For more details about recent point releases, please see the online changelog at: https://mapserver.org/development/changelog/ The online Migration Guide can be found at https://mapserver.org/MIGRATION_GUIDE.html 8.6.0 release (2025-12-03) -------------------------- - CI: upgrade PCRE2 to 10.47 release (#7400) (see major changes below) 8.6.0-rc1 release (2025-11-27) ------------------------------ - OGCAPI: return OGC-NumberReturned, OGC-NumberMatched and Link HTTP headers (#7390) - output GDAL files: fix from init=epsg:xxxx layers (#7392) 8.6.0-beta2 release (2025-11-18) -------------------------------- - additional URL creation logic for generated index URLs (#7388) 8.6.0-beta1 release (2025-11-13) -------------------------------- - allow append of additional query parameters for OGCAPI: Features (#7360) - new MapServer index page (#7350) - WMS GetFeatureInfo: add options to precisely identify points through their symbols (#7318) - add FALLBACK parameter for CLASS object, to be applied if none of the previously defined classes has been applied (#7309) - add vendorSpecificParameters to OpenAPI document (#7295) see detailed changelog for other fixes 8.4.1 release (2025-09-19) -------------------------- - security: add missing column name escaping for WFS filters through OGR (#7349) - fix opacity for gradient legend symbol (#7255) see detailed changelog for other fixes 8.4.0 release (2025-01-15) -------------------------- - add CITATION.cff, useful for Zenodo/DOI (#7209) (see major changes below) 8.4.0-rc1 release (2025-01-08) ------------------------------ - include stdbool.h in mapserver.h (#7205) 8.4.0-beta2 release (2024-12-14) -------------------------------- - add explicit error message when proj.db cannot be found (#7203) 8.4.0-beta1 release (2024-12-13) -------------------------------- - add PCRE2 support (#7073) - add CONNECTIONTYPE RASTERLABEL (#7135) - set MS_LEGEND_KEYSIZE_MAX to 1000 (#7154) - add 4 new COMPOSITE.COMPOP blending operations (#7065) - allow encryption key files to use paths relative to a mapfile (#7181) - allow use_default_extent_for_getfeature to be used for OGC Features API and PostGIS (#7197) see detailed changelog for other fixes 8.2.2 release (2024-09-02) -------------------------- - fix build against FreeType 2.13.3 release (#7142) see detailed changelog for other fixes 8.2.1 release (2024-07-21) -------------------------- - security: validate tostring() expression function (#7123) - handle PHP MapScript out of source builds (#7108) 7.6.7 release (2024-07-21) -------------------------- - security: validate tostring() expression function (#7123) 8.2.0 release (2024-07-08) -------------------------- RC3 was released as the final 8.2.0 (see major changes below) 8.2.0-rc3 release (2024-06-28) ------------------------------ - fix memory corruption in msUpdate...FromString (#7038) 8.2.0-rc2 release (2024-06-27) ------------------------------ - fix SWIG MapScript build failure (#7090) 8.2.0-rc1 release (2024-06-14) ------------------------------ - no changes since beta3 (see major changes below) 8.2.0-beta3 release (2024-06-11) -------------------------------- - security fix to prevent SQL injections through regex validation (#7075) 7.6.6 release (2024-06-11) -------------------------- - security fix to prevent SQL injections through regex validation (#7075) 8.2.0-beta2 release (2024-06-08) -------------------------------- - fix Python MapScript installation (#7071) 8.2.0-beta1 release (2024-06-06) -------------------------------- - restructure repo to move source code into /src (#6837) - remove sym2img.c from codebase (#6593) - handle templates + includes (#6113) - handle empty query response (#6907) - remove support for GDAL < 3 (#6901) - remove support for PROJ < 6 (#6900) - OGC API Features: implement Part 2 - CRS (#6893) - allow custom projections to be requested via WMS (#6795) - allow mapfiles to be accessed via URL Keys (#6862) - allow expressions in LABEL PRIORITY (#6884) - reference SLD files in Mapfiles (#7034) see detailed changelog for other fixes 8.0.1 release (2023-04-17) -------------------------- - fix WFS paging on Oracle (#6774) - allow runtime substitutions on the Web template parameter (#6804) - handle multiple PROJ_DATA paths through config (#6863) see detailed changelog for other fixes 8.0.0 release (2022-09-12) -------------------------- RC2 was released as the final 8.0.0 (see major changes below) 8.0.0-rc2 release (2022-09-05) ------------------------------ - fix !BOX! token not working for a PostGIS connection (#6601) - check if a LAYER has a NAME, before including it in a GROUP (#6603) 8.0.0-rc1 release (2022-08-19) ------------------------------ - add missing include to fix build issue on some compilers (#6595) - update the distributed mapserver-sample.conf (#6598) 8.0.0-beta2 release (2022-08-09) -------------------------------- - install coshp utility (#6540) - improve error messages about missing mandatory metadata (#6542) - fix reprojection of lines crossing the antimeridian (#6557) - config file parsing: use msSetPROJ_LIB() when ENV PROJ_LIB is set (#6565) - handle PROJ_DATA as well as PROJ_LIB (#6573) - reset layer filteritem to its old value in case of no overlap (#6550) 8.0.0-beta1 release (2022-06-27) -------------------------------- - add new MapServer config file requirement (RFC 135) - initial OGC API support (RFC 134) - rename shp2img utility to map2img (RFC 136) - make STYLES parameter mandatory for WMS GetMap requests (#6012) - improve SLD label conformance (#6017) - enable PHP 8 MapScript support, through SWIG, re-enable unit tests, and remove old native PHP MapScript (#6430) - remove deprecated mapfile parameters (RFC 133) - improve numerical validation of mapfile parameter values (#6458) - fix various security vulnerabilities found by libFuzzer (#6419) - add new GEOMTRANSFORM 'centerline' labeling method for polygons (#6417) - upgrade Travis and GitHub CI to run on Ubuntu Focal (#6430) 7.6.5 release (2023-04-17) -------------------------- - remove password content from logs (#6621) - increase security and stability (#6818) see detailed changelog for other fixes 7.6.4 release (2021-07-12) -------------------------- - improved performance of GPKG and SpatiaLite queries (#6361) - WFS: fix paging with GPKG/Spatialite datasources and non-point geometries (#6325) - PostGIS: use ST_Intersects instead of && for bounding box (#6348) see detailed changelog for other fixes 7.6.3 release (2021-04-30) -------------------------- - fix security flaw for processing the MAP parameter (#6313) - fix code defects through Coverity Scan warnings (#6307) - add support for PROJ 8 (#6249) see detailed changelog for other fixes 7.6.2 release (2020-12-07) -------------------------- - No major changes, see detailed changelog for bug fixes 7.6.1 release (2020-07-31) -------------------------- - No major changes, see detailed changelog for bug fixes 7.6.0 release (2020-05-08) -------------------------- - for essential WMS client layers set EXCEPTIONS to XML by default (#6066) 7.6.0-rc4 release (2020-05-04) ------------------------------ - Fix case insensitive 'using unique' for PostGIS connections (#6062) - Add handling essential WMS layers (#6061) 7.6.0-rc3 release (2020-04-24) ------------------------------ - Handle special characters in paths on Windows (#5995) - Add attribute binding for label ALIGN, OFFSET, POSITION (#6052) 7.6.0-rc2 release (2020-04-10) ------------------------------ - Fix memory corruption in msGEOSGetCentroid (#6041) 7.6.0-rc1 release (2020-04-05) ------------------------------ - Fix alpha value for hex colors (#6023) 7.6.0-beta2 release (2020-03-28) -------------------------------- - fixed build with PHPNG + gnu_source (#6015) - fixed rendermode with geomtransform (#6021) 7.6.0-beta1 release (2020-03-22) -------------------------------- - Full support for PROJ6 API (#5888) - Enable PointZM data support (X,Y,Z,M coordinates) by default - SLD support enhancements (RFC 124) except PR#5832 - CONNECTIONOPTIONS support in mapfile LAYER (RFC 125) - Enforce C99 and C++11 build requirements (RFC 128) 7.4.4 release (2020-3-20) ------------------------- - Security release, see ticket #6014 for more information. 7.4.3 release (2019-12-16) -------------------------- - No major changes, see detailed changelog for bug fixes 7.4.2 release (2019-9-13) ------------------------- - No major changes, see detailed changelog for bug fixes 7.4.1 release (2019-7-12) ------------------------- - No major changes, see detailed changelog for bug fixes 7.4.0 release (2019-5-14) ------------------------- - No major changes, see detailed changelog for bug fixes 7.4.0-rc2 release (2019-5-10) ---------------------------- - No major changes, see detailed changelog for bug fixes 7.4.0-rc1 release (2019-5-1) ---------------------------- - No major changes, see detailed changelog for bug fixes 7.4.0-beta2 release (2019-4-17) ------------------------------- - Addresses XSS issue with [layers] template tag (fix available in 6.4, 7.0 and 7.2 branches as well) - Added Perl/Mapscript to Travis CI - No other major changes, see detailed changelog for bug fixes 7.4.0-beta1 release (2019-3-29) ------------------------------- - Python MapScript binding is available as installable Wheels with a full test suite and examples - C# MapScript binding is now compatible with .NET Core - PHP 7 MapScript binding support - both PHP/MapScript and Swig/MapScript - Added workaround to allow compiling against Proj 6 (#5766) 7.2.2 release (2019-2-19) -------------------------- - No major changes, see detailed changelog for bug fixes 7.2.1 release (2018-10-1) -------------------------- - No major changes, see detailed changelog for bug fixes 7.2.0 release (2018-07-23) -------------------------- - Fixed issue with ring handling with polygons in MVT support (#5626) - No other major changes, see detailed changelog for bug fixes 7.2.0-beta2 release (2018-6-13) - Update beta1 release notes to remove reference to PHP7 support - No other major changes, see detailed changelog for bug fixes 7.2.0-beta1 release (2018-5-9) ------------------------------ - Support for Enhanced Layer Metadata Management (RFC82) - Calculate MINDISTANCE from label bounds instead of label center (#5369) - Reposition follow labels on maxoverlapangle colisions (RFC112) - Implement chainable compositing filters (RFC113) - Faster retrieval of shape count (RFC114) - WMS layer groups are now requestable - Support C-style multi-line content types (#5362) - Python 3.x support (#5561) - Support Vendor-Specific OGC FILTER parameter in WMS requests (RFC118) - Mapbox Vector Tile (MVT) Support (RFC119) - INSPIRE download service support for WCS 2.0 (RFC120) 7.0.0 release (2015/07/24) -------------------------- - No major changes, see detailed changelog for bug fixes 7.0.0-beta2 release (2015/06/29) -------------------------------- - No major changes, see detailed changelog for bug fixes 7.0.0-beta1 release (2015/02/12) -------------------------------- - RFC91 Layer Filter Normalization - Implement WCS20 Extensions (#4898) - Require validation of ExternalGraphic OnlineResource (#4883) - Require validation on the CGI queryfile parameter. (#4874) - Apply RFC86 scaletoken substitutions to layer->PROCESSING entries - RFC113 Layer Compositing Pipeline - RFC109 Optimizing Runtime Substitutions - RFC108 Heatmap / Kernel-Density Layers - RFC106 Support of Geomtransform JavaScript Plugin - RFC105 Support for WFS 2.0 (server side) - RFC104 Bitmap Label removal, replaced with inlined truetype font - RFC103 Layer Level Character Encoding - RFC102 Support of Styleitem JavaScript Plugin - RFC99 GD removal - RFC98 Complex Text Rendering / Text Rendering Overhaul - RFC93 UTF Grid Support 6.4 release (2013/09/17) --------------------------- - RFC 101: Support for Content Dependent Legend Rendering - Add Support for librsvg as an alternative to libsvg-cairo - RFC100: Add support for raster tile index with tiles of mixed SRS (TILESRS keyword) - RFC94: Shape Smoothing - RFC95 : add EXPRESSION {value1,value2,...} support to parser (#4648) - RFC92: Migration from autotools to cmake (#4617) - RFC88: Saving MapServer Objects to Strings (#4563) - RFC90: Enable/Disable Layers in OGC Web Services by IP Lists - RFC85,89 Added Simplify,SimplityPT and Generalize geomtransform, implementation of geomtransform at the layer level - RFC86: Scale-dependant token replacements (#4538) - Fix symbol scaling for vector symbols with no height (#4497,#3511) - Implementation of layer masking for WCS coverages (#4469) - Implementation of offsets on follow labels (#4399) 6.2.0 release (git branch-6-2) 2012/11/14: ------------------------------------------ - Fix WFS GetFeature result bounds are not written in requested projection (#4494) - Fixed wrong size in LegendURL of root layer (#4441) - Fixed wms_style_name in GetMap requests (#4439) - Fix segfault in queryByFilter function in MapScript - Adjusted WCS 2.0 to WCS Core 2.0.1 and GMLCOV 1.0.1 corrigenda (#4003) - Adjusted mediatype to multipart/related in WCS 2.0 (#4003) - Fix symbolObj.getImage seg fault in PHP/MapScript - Fix bad handling of startindex in some drivers (#4011) WFSGetFeature also now uses a global maxfeatures and startindex to support maxfeatures across layers rather than within layers - Fixed bugs with WCS 1.1/2.0 with VSIMEM (#4369) - Add notable changes here. Less important changes should go only in the commit message and not appear here. - Fixed the OGR driver to use point or line spatial filter geometries in degenerated cases (#4420) - implement OFFSET x -99 on ANGLE FOLLOW labels (#4399) Version 6.2 (beta1: 20120629): ------------------------------ - Fix WFS filter is produced as non-standard XML (#4171) - Fix pixmap symbol loading issue (#4329) - Added INSPIRE ExtendedCapabilities and DOCTYPE definition to WMS 1.1.1 (#3608) - Fix wms_enable_request-related errors are not properly tagged (#4187) - Fixed "msGetMarkerSize() called on unloaded pixmap symbol" in mapsymbol.c (#4225) - Fixed PHP MapScript support for PHP 5.4 (#4309) - Fix msOGREscapeSQLParam could return random data (#4335) - Fixed locations of supported and native formats in Capabilities and CoverageDescriptions for WCS 2.0 (#4003) - Made format parameter for WCS 2.0 GetCoverage requests optional (#4003) - Swig mapscript for multi-label support (#4310) - Fix creation of a vector symbolObj in mapscript (#4318) - Added coverage metadata in WCS (#4306) - Ignore unknown requets parameteres in WCS 2.0 (#4307). - Fixed getFeature request with custom output format fails on filter encoding (#4190) - Fixed resolution when UoM changes in WCS 2.0 (#4283) - Added missing DEFRESOLUTION parameter to msCopyMap() function (#4272) - Migrated svn to git, and issue tracking from trac to github - Fixed mapscript is unusable in a web application due to memory leaks (#4262) - Fixed legend image problem with annotation layers with label offsets (#4147) - Add support for multiple labels per feature (RFC81) - Add support for INSPIRE view service (RFC 75) - Drop support for GDAL/OGR older than 1.5.0 (#4224) - PDF backend: add support for generating geospatial PDF, when GDAL 2.0 with PDF driver is used, and the GEO_ENCODING FORMATOPTION (set to ISO32000 or OGC_BP) is added to the OUTPUTFORMAT definition. (#4216) - Python mapscript: fix swig mappings to work with both python 2.5.and 2.6 (#3940) - Added classgroup CGI parameter support (#4207) - Java mapscript: renamed shared library and completed libtool support (#2595) - Fixed WCS 2.0 axis order (#4191) - Added MS_CJC_* constants in PHP/MapScript (#4183) - Fixed Memory Leak with Fribidi Strings (#4188) - Allow multiple label definitions within a class (RFC 77/#4127) - shp2img: make it possible to specify layers (with -l option) that match GROUP names. - reuse a pre-parsed mapfile across fastcgi loops in case the mapfile is specified with the MS_MAPFILE env variable. (#4018) - Ability to do use PropertyIsLike with a column of a different type than text (postgis) (#4176) - Fixed SLD with FILTER doesn't apply properly to database layers (#4112) - Fixed lexer buffer size issue with single quotes in a string (#4175) - WFS Quote Escape issue (#4087) - Raster layer fails to be drawn if the window is less than half a pixel (#4172) - shptree: Improvement to reduce size of .qix files (#4169) - avoid potential gd fontcache deadlock on fastcgi exit signals(#4093) - Adjusted WCS GetCapabilities for an empty list of layers (#4140) - Adjusted WMS GetCapabilities for an empty list of layers (#3755) - Refactor cgi masperv to not call exit on argument errors (#3099) - Add --with-apache-module configure option to build an apache dso module (#2565) - Use libtool to build object files and libraries - Dynamically link libmapserver to the created binaries by default (requires the make install step to be run) - Python mapscript builds with make instead of setuptools - Fix LABELPNT geomtransform position for non-cached labels (#4121) - Add RFC80 font fallback support (#4114) - Added POLAROFFSET style option for a different symbol transform (#4117) - automatically translate vector symbol points (#4116) - Add RFC79 Layer masking (#4111) - Fixed single pixel coverages in WCS 2.0 (#4110) - Add svg symbols support (#3671) - Fixed subsetting in WCS 2.0 (#4099) - Upgrade clipper library to 4.6.3 - Make openlayers wms template request images with mimetype of outputformat defined in the mapfile's imagetype - Fix memory leak in msSLDParseRasterSymbolizer() - Fix compilation error with clang in renderers/agg/include/agg_renderer_outline_aa.h - Add stable hatch rendering (#3847) - Added vector field rendering (#4094) - Add wms dimensions support (#3466) - Fixed segfault when calling classObj::updateFromString() with SYMBOL (#4062) - Use a renderer native follow text implementation if available. - Fixed layer with inline feature to support multiple classes (#4070) - Add support for rfc45 anchorpoint on marker symbols (#4066) - Add initial gap support for line marker symbols (#3879) - Fix center to center computation of gaps for line marker symbols and polygon tile patterns (#3867) - Add initial gap support for line patterns (#3879) - Fixed grid of thin lines in polygon symbol fills (#3868) - Fixed cannot add a style to a label in PHP/SWIG Mapscript (#4038) - Fixed schema validity issue for WCS 1.1 GetCoverage responses (#4047) - remove default compiler search paths from the GD CFLAGS/LDFLAGS (#4046) - Fixed Python Mapscript does not write COLOR to reference map (#4042) - Added XMP support for metadata embedding, RFC 76, (#3932) - Added GetLegendGraphic Cascading support (#3923) - Rewrite postgres TIME queries to take advantage of indexes (#3374) - Unified OWS requests and applied to WCS (defaults to version 2.0 now) (#3925) - WCS 1.0: Fix crash with some _rangeset_axes values (#4020) - WCS 2.0: Adjusted offset vector and origin (#4006) - Added addParameter() method to MapScript (#3973) - Changed msDrawVectorLayer() not to cache shapes if attribute binding is present after the first style (#3976) - Fix mapscript to build when TRUE macro is not defined (#3926) - Fix mapscript php build issues with MSVC (#4004) - PHP MapScript is missing many styleObj properties (#3901) - PHP/Mapscript: Segmentation fault when getting complex object using PHP 5.2 (#3930) - PHP/Mapscript: Fixed webObj->metadata returns a webObj (#3971) - WCS 1.1: Added check for imageCRS in msOWSCommonBoundingBox() (#3966) - Fixed contains operator in logical expressions (#3974) - WCS 1.0: WCS Exceptions raise mapscript exceptions (#3972) - WMS: LAYERS parameter is optional when sld is given (#1166) - Add runtime substitution for "filename" output format option (#3571) and allow setting defaults in either metadata or validation (preferred) blocks for both layer and output format. - Add non antialiased text rendering for GD (#3896) - Fixed OGC filter using expressions (#3481) - Fix incorrect rendering of GD lines between 1 and 2 pixels wide (#3962) - Add gamma correction to AGG polygon rendering (#3165) - Initialize the scalebar image color to transparent by default (#3957) - Do not divide by zero in io read/write funcs (#4135) IMPORTANT SECURITY FIX: - Fixes to prevent SQL injections through OGC filter encoding (in WMS, WFS and SOS), as well as a potential SQL injection in WMS time support. Your system may be vulnerable if it has MapServer with OGC protocols enabled, with layers connecting to an SQL RDBMS backend, either natively or via OGR (#3903) - Fix performance issue with Oracle and scrollable cursors (#3905) - Fix attribute binding for layer styles (#3941) - Added missing fclose() when writing query files (#3943) - Fix double-free in msAddImageSymbol() when filename is a http resource (#3939) - Fix rendering of lines with outlinewidth set if not on first style (#3935) - Correct SLD with spatial filters bbox and intersects (#3929) - Applied patch for ticket (symbol writing issues) (#3589) - Added WMS GetFeatureInfo Cascading (#3764) - Fixed png lib is not found on multiarch systems (#3921) - Fixed PHP MapScript opacity property of StyleObj no longer works (#3920) - Fixed Using STYLEITEM AUTO, loadExpression fails when the label text contains a space or begins with a double quote (#3481) - Fix for the cluster processing if the shape bounds doesn't overlap with the given extent (#3913) - Add support for dashes on polygon hatches (#3912) - Union layer 3 new processing options added (#3900) - Changed msRemoveStyle to allow removing all styles (#3895) - Fixed mssql2008 to return correct geometries with chart layer type (#3894) - Ensure msLayerSetProcessingKey() supports setting a NULL value to clear a processing key. - Write SYMBOLSET/END tags when saving a symbol file (#3885) - Make java threadtests work again (#3887) - Fix segfault on malformed filters (#3888) - Fixed the query handling problem with the Oracle spatial driver (#3878) - Fixed potential crash with AVERAGE resampling and crazy reprojection (#3886) - Adjusted OperationsMetadata for POST in WCS 2.0 GetCapabilities response - Fix for the warnings in mapunion.c (#3880) - SLD: correct when same layer is used with multiple styles (#1602) - Fixed the build problem in mapunion.c (#3877) - Implement to get all shapes with the clustered layer (#3873) - Union layer: Fixed the crash when styling source layers using attributes (#3870) - Added GEOS difference operator to expression support (#3871) - Improve rangeset item checking so that Bands=1,2,3 is supported with WCS 1.0 (#3919). - Fix GetMapserverUnitUsingProj() for proj=latlong (#3883) - Add support for OGR output of 2.5D geometries (#3906) Version 6.0.0 (2011-05-11) -------------------------- - apply fix for #3834 on legend icon rendering (#3866) - Union layer: Fixed a potential seg fault in msUnionLayerNextShape (#3859) - Cluster layer: Fixed the problem when returning undefined attribute (#3700) - Union layer: Fix for the item initialization at the source layer (#3859) - Union layer: Fixed the potential seg fault when STYLEITEM AUTO is used (#3859) Version 6.0.0-rc2 (2011-05-05) ------------------------------ - Fixed seg fault with [shpxy] tag... (#3860) - Removed obsolete msQueryByOperator() function - Call msLayerClose() before msLayerOpen() in the various query functions (#3692) - Fix WMS 1.3.0 to use full list of epsg codes with inverted axis (#3582) - PHP/Mapscript: Added getResultsBounds() method in layer object (#2967) - Fix SLD containing a PropertyIsLike filter (#3855) - Fixed msUnionLayerNextShape to return correct values (#3859) - Union layer: fix for the failure if one or more of the source layers are not in the current extent (#3858) - Fix memory leak in msResampleGDALToMap() (#3857) - Fix missing initialization of default formats in WCS 1.x. - Fix maxoverlapangle when value is set to 0 (#3856) Version 6.0.0-rc1 (2011-04-27) ------------------------------ - Fix for the styleitem handling with union layer (#3674) - Fixed mindistance label test to check layer indexes. (#3851) - Fixed segmentation fault in PHP/MapScript and improved the php object method calls (#3730) - Fix build issue related to unnecessary use of gdal-config --dep-libs (#3316) Version 6.0.0-beta7 (2011-04-20) -------------------------------- - Union Layer: fix for the STYLEITEM AUTO option (#3674) - Union Layer: Add support for the layer FILTER expressions, add "Union:SourceLayerVisible" predefined attribute (#3674) - fix circle layer drawing for edge case when point1.x==point2.x (#1356) - fix incorrect quantization for images with very large number of colors (#3848) - fix poor performance of polygon hatching (#3846) - upgrade clipper library to 4.2 (related to #3846) - Fix configure output for "WFS Client" (was reporting WMS info, #3842) - KML: latlon bbox for raster layers could end up being wrong for non-square requests (#3840) Version 6.0.0-beta6 (2011-04-13) -------------------------------- - define EQUAL/EQUALN macros if cpl_port.h was not included (#3844) - add configurable PNG/ZLIB compression level (#3841) - SLD: use pixmap size when parameter size is not specified (#2305) - fix memory leaks in mapgraticule.c (#3831) - fix runtime sub validation against web metadata, was using wrong lookup key - clean up the symbolset if we've used an alternate renderer for a layer (#3834,#3616) - fix crash on embedded legend with cairo raster renderer - fix crashes in SVG renderer on polygon symbol fills (#3837) - fix crash/corruptions with raster layers in pdf outputs (#3799) - fix memory leak in msFreeLabelCacheSlot (#3829) - use a circle brush for wide GD lines (#3835) - fix segmentation fault with transparent layers containing symbols (#3834) - fix memory leak on tiled vector polygons - fix segfault with marker symbols on short lines (#3823) - wms_getmap_formatlist causes first defined outputformat to be returned by getmap (#3826) - fix building of mapcluster.c when OGR support is disabled - fix some valgrind found memory leaks (offset symbols, and gd io contexts) - skip marker symbol with no defined SYMBOL (caused some memory leaks with uninitialized vector points) - fix crash in GD lines with floating point dash patterns (#3823) - Check renderer before using it when calculating label size (#3822) - allow palette file path to be relative to mapfile (#2115) - use supplied offset for brushed lines (#3825, #3792) - fix division by 0 error in bar charts for some ill-defined cases (#3218) - add GAP, POSITION and CAPS/JOINS to mapfile writer (#3797) - fix GEOMTRANSFORM rotation orientation for vector symbols (#3802) - GD Driver broken in FastCGI (#3813) - configure: look for libexslt.so under lib64 as well - Coding style and formatting fixes (#3819, #3820, #3821, and more) - More improvements to OpenGL error handling (#3791) - Added WMS GetFeatureInfo RADIUS=bbox vendor-specific option (#3561) Version 6.0.0-beta5 (2011-04-06) -------------------------------- - Fix setting of top-level mapObj member variables in PHP MapScript (#3815) - More robust OpenGL context creation on older video cards and drivers (#3791) - Allow users to set the maximum number of vector features to be drawn (#3739) - Fixed FCGI on Windows problem related to lexer (#3812) - KML: Add ows/kml_exclude_items (#3560) - Removed all refs left to MS_SYMBOL_CARTOLINE (#3798) - Removed GAP, PATTERN, LINECAP/JOIN and POSITION from symbolObj (#3797) - Fixed handling of STYLEITEM AUTO label position codes 10,11,12 (#3806) - Fixed msGEOSGeometry2Shape to handle 'GEOMETRYCOLLECTION EMPTY' as null geometry instead of raising an error (#3811) - Re-added the MYSQL JOIN support. Had been removed with the MYGIS deprecated driver. - Add opacity to legend (#3740) - Updated PHP/MapScript with the new objects properties (#3735) - KML: set layer's projection when it is not defined (#3809) - Updated xml mapfile schema and xsl with the new lexer properties (#3735) - Updated PHP/MapScript for MS RFC 69: clustering. (#3700) - Move allocation of cgiRequestObj paramNames/Values to msAllocCgiObj() (#1888) - Add support for simple aggregates for the cluster layer attributes (#3700) - Improved error reporting in msSaveImage() (#3733) - configure: look for libxslt.so under lib64 as well - added missing ';' before charset in WFS DescribeFeatureType header (#3793) - add brushed line support for agg renderer (#3792) - fix bug with marker symbols along offset line - fix for the cluster layer returning invalid feature count (#3794) - remove some compiler warnings - fix incorrect scaling of hatch symbol spacing (#3773) - fix incorrect background color for INIMAGE exceptions (#3790) Version 6.0.0-beta4 (2011-03-30) -------------------------------- - Fix shp2img's -i flag to honour map level transparent, image quality and interlace settings. - Make sure command-line programs use an exit status other than 0 when an error is encountered. (#3753) - Applied patch to filter unwanted fribidi characters (#3763) - Fixed lexer to set the proper state on URL variable substitutions - Fixed Memory leak in PostGIS driver (#3768) - Fixed PHP/MapScript symbol property setter method - fix memory leak in bar charts - fix some valgrind errors on agg rotated pixmap symbols - WCS 2.0: Adjusted definition of NilValues. - Fixed handling of PROJ_LIB value relative to mapfile path (#3094) - Fixed compilation error with opengl support (#3769) - add support for gml:Box for spatial filters (#3789) - fix query map generation error introduced in beta2 when output format initialized was made as needed. - fix incorrect PATTERN behavior on agg lines (#3787) - report SOS DescribeObservationType in Capabilities (#3777) - Updated lexer to detect time attribute bindings (e.g. `[item]`) in logical expressions - Fixed layer context expressions (REQUIRES/LABELREQUIRES) (#3737) - KML: Output ExtendedData (#3728) - Fixed OWS usage of multiple layers with same name (#3778) - WCS implementation should not lookup wms_* metadata (#3779) - WCS 2.0: Adjusted definition of rangeType. - Fixed OWS GetCapabilities to report only requests/operations that are enabled. - WCS 2.0: Report only bands in the range subset. - OWS requests should be completely blocked by default (#3755) - SLD: check for limit on dash arrays (#3772) - WMS: Apply sld after bbox and srs have been parsed (#3765) Version 6.0.0-beta3 (2011-03-23) -------------------------------- - apply min/max size/width style values to polygon spacing (vaguely related to #3132) - assure that a created tile has a non-zero width and height (#3370) - use png_sig_cmp instead of png_check_sig (#3762) - Rendering: scale style OFFSET and GAP the same way we scale other style attributes. Beforehand, we scaled them proportionaly to the computed width. - KML: fix rounding problem for point feautres (#3767) - KML: update code to reflect output changes. Fix true type symbols. (#3766) - SLD: Text Symbolizer now uses the new expression syntax (#3757) - WFS: correct bbox values for GetFeature with featureid request (#3761) - Mapscript Seg Fault on mapObj->getMetaData (#3738) - Correct double free in msCleanup(). - Initialize default formats in WCS. - Fix csharp Makefile.in (#3758) - Allow run-time subs in class->text (makes sense if you allow it in class->expression). - Fix build problem when --enable-cgi-cl-debug-args is enabled (#2853) Version 6.0.0-beta2 (2011-03-18) -------------------------------- - correct scaling of symbol GAP and PATTERN (#3752) - remove references to SWF/MING - CGI runtime substitution requires a validation pattern (was optional before) (#3522) - add a default png8 outputformat that uses AGG/PNG with quantization - change MS_INIT_COLOR to take alpha as a parameter - stop using style->opacity in rendering code, use alpha from colorObjs. - Fixed big Oracle memory leak when rendering in KML (#3719) - avoid linking in postgres dependencies unnecessarily (#3708) - don't initialize outputformats until they are selected - use "seamless" creation of tiles for polygon fills with vector symbols - Ability to escape single/double quotes inside a string (#3706) - Globally replace msCaseFindSubstring with strcasestr (#3255) - support GROUP layers in shp2img (#3746) - Honour MAXSIZE for WCS 2.0 responses (#3204). - fallback to ows_title for WCS ows:Title of CoverageDescription (#3528) - Added msIO_stripStdoutBufferContentHeaders() to strip off all Content-* headers from a buffer (#3673, #3665). - Added raster classification support for STYLE level OPACITY. - Allow attribute references, that is [itemname], within a TEXT string (#3736) - Fixed segmentation fault when parsing invalid extent arguments in shp2img (#3734) - Make "openlayers mode" work even without OWS support (#3732) - Add a static table to define the axis order for some epsg codes (#3582) - Add possibility to use KML_NAME_ITEM (#3728) - Fixed mapfile parsing error when a label angle referenced an attribute (e.g. ANGLE [angle]) #3727 - Removed executable flag on some source files (#3726) - Fixed SQL Spatial to be able to use UniqueIdentifier field as unique key (#3722) - Fix PHP Windows build (#3714) - Fixed --with-opengl build issue: Look for OpenGL libs under /usr/lib64 as well (#3724) Version 6.0.0-beta1 (2011-03-09) -------------------------------- - Fixed Core Dump from Format=KML/Z with Oracle Spatial layers (#3713) - Call msPluginFreeVirtualTableFactory from msCleanup (#2164) - Avoid the crash if anglemode 'FOLLOW' is specified with bitmap fonts. (#3379) - Add argument check for processTemplate, processLegendTemplate and processQueryTemplate in the C# bindings (#3699) - Remove shapeObj.line, shapeObj.values, lineObj.point from the SWIG API which are redundant and undocumented. (#3269) - Remove map-oriented query modes (e.g. QUERYMAP). Use qformat parameter instead. (#3712) - Implement single-pass query handling in mssql2008 driver as per RFC 65. - Fixed Sql Server 2008 key column name truncation (#3654) - Added label position binding (#3612) and label shadow size binding (#2924) - Implement MS RFC 69: Support for clustering of features in point layers (#3700) - Implement MS RFC 68: Support for combining features from multiple layers (#3674) - Add support for WCS 1.1 Post (#3710) - Fixed OGR query handling according to RFC 65 (#3647) - Implement CLOSE_CONNECTION=ALWAYS to suppress the connection pooling for a particular layer. - Implemented RFC 67: Enable/Disable layers in ogc web services (#3703) - Class title can now be used in legends. It's value takes precedence over class name. Previously title was not used any place in the code but it is supported for read/write. (#3702) - Allow definition of nodata attribute for layers without results (via resultset tag). (#3701) - mapprojhack.c: restructure to avoid needing projects, or any internal knowledge of PROJ.4. - Fix newlines around part boundaries in WCS multipart results (#3672) - Added minfeaturesize support at layer or class level (#1340) - Implemented support in for classifying rasters using the new expression parsing (msGetClass()...) (#3663) - Implemented RFC 65 which improves and simplifies one-pass query support. This causes a few MapScript regressions with getShape/getFeature/getResultsShape. (#3647) - Support setting filenames for WCS GetCoverage results (#3665) - OGR auto-styling: use the color parameter and set the style's opacity when it is available. Allow symbols that can be stored externally (#3660) - Add possibility to use symbols stored externally, accessed through http (#3662) - Better handling of temporary files (#3354) - Support curved features in PostGIS (#3621) - NODATA values now excluded from autoscaling min/max for non-eight scaling computations (#3650) - Fixed missing time in msDrawMap logging (#3651) - Fixed Auto Angle - incorrectly placed Labels (#3648) - Fixed Improper validation of symbol index values (#3641) - Removed BACKGROUNDCOLOR, BACKGROUNDSHADOWCOLOR and BACKGROUNDSHADOWOFFSET label parameters (#3609) - Fixed Transformation from XML to MapFile only handles one PROCESSING element (#3631) - Fixed 16bit classification support - problem introduced with new renderer architecture (#3624) - Cleanup open gdal datasets in msGDALCleanup() (if we have a very new GDAL). This makes it easier to identify memory leaks. - Add support for per layer tuning of the shape to pixel conversion (SIMPLIFY, ROUND, SNAPTOGRID, FULLRESOLUTION) - Fixed: Memory allocation results should always be checked (#3559) - Fixed free(): invalid next size in mapfile.c (#3604) - Added a built-in OpenLayers map viewer (#3549) - Fixed issues with static buffers and sprintf (#3537) - Fix for the memory corruption when mapping the string data type in the Java bindings (3491) - Fixed double free in shp2img.c (#3497) - Fixed number of CGI params is limited to 100 (#3583) - Fixed duplicated XML and HTML errors from WFS GetFeature (#3571) - Support group names for GetLegendGraphic and GetStyles (#3411) - apply patch (thanks rouault) to advertise resultType=hits in WFS 1.1 Capabilities (#3575) - mapshape.c: Fix writing of geometries with z/m and fail gracefully attempting to create such files if USE_POINT_Z_M is not enabled (#3564) - sortshp.c: improve error handling (#3564) - MSSQL2008: Add support for geography data type by extending the DATA syntax to 'geometry_column(geometry_type) from table_name' - Fixed ability to get the error message and code of an OWS exception (#3554) - Fixed msOGRGetSymbolId according to the changes in gdal 1.8 (#3556) - Support holding WMS client requests in RAM instead of writing to disk (#3555) - RFC-61: Enhance MapServer Feature Style Support (#3544) - Restrict cascaded WMS requests based on EXTENT (#3543) - Avoid EPSG lookups for WMS client layers if possible (#3533) - RFC-60: Add ability to skip ANGLE FOLLOW labels with too much character overlap (#3523) - Fixed SWF: not a valid Bitmap FillStyle (#3548) - Set dependency on libxml2 when building --with-wfs (#3512) - Fixed TRUE is undefined in shptreevis (#3545) - shptreevis: bug truncates visualization shapefile if there are more nodes in the tree than there are shapes being indexed! - Fixed multiple include tags not supported in xml mapfiles (#3530) - Support reading .dbf files between 2GB and 4GB (#3514) - Avoid warnings about ms_cvsid being unused with gcc. - Ensure the class is not marked BeforeFieldInit causing memory corruption with C#/CLR4 (#3438) - Fixed MSSQL2008 driver returning invalid extent (#3498) - Added coordinate scaling to shpxy tag via parameters scale, scale_x or scale_y. - Fix computation of shape bounds when the first line contains no points (#3119)(fixes #3383) - Allow map relative specification in the PROJ_LIB config item (#3094) - Try to report reprojection errors in SLD Filter evaluation (#3495) - Disabled some insecure (and potentially exploitable) mapserv command-line debug arguments (#3485). The --enable-cgi-cl-debug-args configure switch can be used to re-enable them for devs who really cannot get away without them and who understand the potential security risk (not recommended for production servers or those who don't understand the security implications). - Fixed segmentation fault in ogr driver when shape type is null - Fixed synchronized MS_UNITS and inchesPerUnits array (#3173) - Fixed possible buffer overflow in msTmpFile() (#3484) - Fixed Using STYLEITEM AUTO, loadExpression fails when the label text contains a double quote (#3481) - PHP/MapScript: Expose getGeomTransform/setGeomTransform instead of exposing the private vars for rfc48 (#2825) - PHP/MapScript: Fixed updateFromString functions to resolve symbol names (#3273) - PHP/MapScript: ability to use the php clone keyword (#3472) - Modified mapserver units enum order to fix some problems with external software (#3173) - Fixed configure does not detect libGD version dependencies (#3478) - Fixed Drawing inline text not working (bitmap) (#3475) - ensure well formed XML when msWCSGetCapabilities_CoverageOfferingBrief returns MS_FAILURE (#3469) - Fixed msQueryByRect does not use tolerance (#3453) - Fixed MapScript processTemplate and processQueryTemplate seg fault (#3468) - Fixed shapeObj->toWkt() returns single point for multipoint geometry (#2762) - Fixed Internal server error when Oracle returns ora-28002 code (#3457) - Fixed PHP/MapScript ms_iogetstdoutbufferbytes() always returning 0 bytes written (#3041) - MapScript resultsGetShape() method fails with a OracleSpatial layer (#3462) - PHP/MapScript circular references between objects (#3405) - Handle null results with gml:Null/gml:null according to version (#3299) - Reworked mapfile writing to use helper functions so that core types (e.g. numbers, strings, colors, keywords, etc...) are always written consistently. - Ensure mapwmslayer.c does not unlink file before closing connection on it (#3451) - Fix security exception issue in C# with MSVC2010 (#3438) - Write out join CONNECTIONTYPE when saving a mapfile. (#3435) - Fixed attribute queries to use an extent stored (and cached) as part of the queryObj rather than the map->extent. (#3424) - Reverted msLayerWhichItems() to 5.4-like behavior although still supporting retrieving all items (#3356,#3342) - Grid layer: remove drawing of unnecessary gird lines (#3433) - Avoid errors and debug output for CONNECTION-less OGR layers in mappool.c if they have a tileindex. - Implement support for raw imagemodes to use NULLVALUE formatoption to set the background value of result images, and to try and mark nodata (#1709) - Implement support for wcs_rangeset_nullvalue to set NULLVALUE and return null value definition in describe coverage result (#655) - Try to avoid exhausting the color table when rendering 24bit key images into 8bit results (#1594) - Avoid crash, and ensure error report when loading keyimage fails (#1594) - Improve the handling of simple string comparisons for raster classified values (#3425) - Generate good SQL when using !BOX! token and no filter. (#3422) - Implement non-shapefile tileindex support for raster query (#2796). - Improve support for [red/green/blue] classification expressions for raster query (#1021) - Fixed imageObj->saveImage() sends unnecessary headers (#3418) - Avoid automatically regenerating maplexer.c (#2310) - Change rounding rules for average resampling (#1932) - Implement support for filename encryption per RFC 18 for rasters (#3416) - Fixed segfault when using shapefile with empty geometry and tileindex (#3365) - Avoid race condition on core_lock on win32 mutex init (#3396) - Avoid use of inline keyword for C code (#3327) - Support WFS parsing through libxml2 (#3364) - Fixed PHP/MapScript imageObj->saveImage() function (#3410) - Implement wms_nonsquare_ok metadata item for WMS servers that do not support non-square pixels (#3409) - Fixed MapScript shape->classindex is always 0 (#3406) - Fixed PHP MapScript integer passing broken on 64bit systems (#3412) - Fix MS_NONSQUARE to work in mode=map (#3413) - Support inclusion of raster layers in query map drawing even if the results may not be that useful (#1842). - Fixed auto angle: incorrectly rotated Labels. Added AUTO2 angle mode. (#1688) - Preliminary implementation of validity mask (imageObj->img_mask) for raw raster data (#2181) - Added libgd < 2.0.30 compatibility (#3293) - Incorporate support for GDAL nodata on RGB images (#2404) - Incorporated support for GDAL masks (GDAL RFC 15) (#2640) - Fixed XML transformation issues with expressions and symbols (#3397) - Check error returns from mapstring functions (#2988) - Add support for multiliple srs in WFS 1.1.0 (#3227) - Fixed PHP/MapScript owsRequestObj->loadParams() method when using php in a non cgi/fcgi/cli mode. (#1975) - Ensure that non-file raster datasets work (#3253) - Correct mutex locking problem with rasters with no inherent georef. (#3368) - Correct ungeoreferenced defaults via GetExtent() on raster layer (#3368) - PHP Mapscript refactoring: take full advantage of PHP 5 / Zend Engine 2 (#3278)" - Fixed msRemoveHashTable() to return the proper value on failure/success. - Correct one pass query problems and OGC filter query (#3305) - Fixed msMSSQL2008CloseConnection() to free the statement handle properly (#3244) - Fixed the query handling with the MSSQL2008 driver (#3058) - Fixed swig zoomRectangle() method: the maxy in the rect object have to be < miny value (#3286) - Fix crash with GRID layers with no classes (#3352) - Remove "legacy" raster support, all raster rendering via GDAL now. - Very preliminary render plugin support for raster rendering. (RFC 54) - support correct MIME type output for WFS 1.1.0 (#3295) - add WMS 1.3.0 LayerLimit support (#3284) - fix WFS 1.1.0 exception attributes (#3301) - add more useful error message when query file extension test fails (#3302) - s/gml:null/gml:Null for empty WFS GetFeature responses (#3299) - Support metatiling and buffers in mode=tile (#3323) - Enhance error messages in msGetTruetypeTextBBox() (#3314) - Report parsing errors in INCLUDEd files using the line number within the file (#3329) - Avoid memory error when building SQL bbox (#3324) - Reproject rectangles as polygons to get datelin wrapping (#3179) - Add support for the WMS capabilities items AuthorityURL, Identifier (#3251) - Added support to write a null shape in a shape file. (#3277) - Apply ON_MISSING_DATA to zero-length WMS client calls (#2785, #3243) - PHP/Mapscript: added labelCacheMember object and mapObj::getLabel() method (#1794) - Add shplabel tag support in templates (#3241) - Bumped GEOS requirement to version 3.0+ (#3215) - Fixed memory leak related to templates (#2996) - Added support of 44xx gtypes in oracle spatial driver (#2830) - Fixed curl proxy auth support for http connections (#571) - PHP/MapScript: removed deprecated class properties (#2170) - Fixed OGR datasource double free (#3261) - Fix compilation warnings around use of strcasestr (#3257) - Made %substitution% strings case insensitive (#3250) - Added support to get the extent of a raster layer that use a tileindex (#3252) - Fixed configure to support FTGL 2.1.2 (#3247) - Changed msSaveImageBufferGD to be in accordance with msSaveImageGD (#3201) - PHP/Mapscript: added layerObj units property (#3249) - Changed the query map rendering implementation without adding extra layers to the map (#3069) - SQL Server 2008 plugin is not handling null field values correctly (#2893) - Hatch symbol not properly saved (#2905) - Expose symbolObj.inmapfile to the SWIG API, have already been exposed to PHP (#3233) - Expose getGeomTransform/setGeomTransform to SWIG instead of exposing the private vars for rfc48 (#3214) - Fixed writeSymbol to support writing 'ANGLE AUTO' (#3214) - Fixed problems with point queries not working via the CGI (mode=query or mode=nquery) (#3246) - Support QueryByShape() with point and line geometries (#3248) - Honour MAXSIZE for WCS responses (#3204) - Implemented RFC 52 LayerResultsGetShape support for OGR connection type. - Fixed uninitialized variable with malloc used in osPointCluster() (#3236) - Oracle driver: remove BLOB columns instead of changing them to null (#3228) - Fixed ogc sld functions to return proper values (#2165) - MAP EXTENT truncates GetFeature requests for data outside bounds (#1287) - Added msStringSplitComplex function (#471) - Mapserver WFS should send maxfeatures to the spatial database (#2605) - WFS paging support (#2799) - Fixed joins do not accept encrypted passwords (#2912) - Fixed HTML legend image samples truncated (#2636) - WMS GetFeatureInfo should respect the scale like GetMap does (#842) - Filter encoding: simple filters using propertyislike not applied properly #2720, #2840 - Fix VBAR Chart production when using GD for rendering (#3482) Version 5.6.0 (2009-12-04): --------------------------- - WFS hits count is incorrect if the request contain 2 layers or more (#3244) - Fixed a problem with layer plugin where copyVirtualTable didn't copy the LayerResultsGetShape function pointer (#3223) Version 5.6.0-rc1 (2009-11-27): ------------------------------- - Fixed a problem with shape-based queries against projected layers when using a tolerance (#3211) - Fixed long expression evaluation (#2123) - Added simplfy and topologyPreservingSimplify to MapScript (#2753) - Fixed Oracle FastCGI memory leak (#3187) - layer->project flag not being reset properly for drawquerylayer (#673 #2079) - OGC SLD: support multi-polygons geometries for filters embedded in an SLD (#3097) - [WMC] embedded SLD in context does not work with namespace prefix (#3115) - Support name aliases used in sld text symbolizer (#3114) - decode html and unicode entities for polygon truetype symbol fills (#3203) - Parse PropertyName parameter for wfs requests (#675) - Fixed when saving a map, layer->transform isn't written properly in all cases. (#3198) - Fixed buffer overflow in oracle spatial driver with large sql data (#2694) - Improve FastCGI include file finding logic (#3200) Version 5.6.0-beta5 (2009-11-04): --------------------------------- - Apply a minimum width on label outline (new outlines were too thin by default) - Don't apply scalefactor to polygon outline widths (but apply the resolutionfactor) - Fix vector symbol size calculation (#2896) - Applied code clean up patch for mapsearch.c. (#3189) - Fixed labels centering when the label is longer than the line (#2867) - Ensure Python MapScript building doesn't reorder the libraries, support the 'subprocess' module where available for setup.py, and default to using the "super" swig invocation described in the Python MapScript README when mapscript_wrap.c isn't available on the file system. #2663 contains the reordering issue. - Fixed memory leak with shapefiles associated with one-pass query implementation (#3188) - Fix abs/fabs usage that prevented angle follow labels to be discarded if they were too wrapped on themselves - Allow CGI mapshape and imgshape variables to consume WKT strings (#3185) - Added support for nautical miles unit (#3173) - Fixed encoding metadata ignored by a few wcs/wfs 1.1 and sos requests (#3182) - PHP/Mapscript: added "autofollow" and "repeatdistance" in labelObj (#3175) - Added charset in content-type http header for wms/wfs/sos/wcs requests (#2583) - Python/MapScript: improve compatibility for different swig versions (#3180) - maprasterquery.c: a few fixes since beta4 (#3181, #3168). - mapows.c: Generate WMS LatLongBoundingBox in WGS84 datum (#2578) Version 5.6.0-beta4 (2009-10-18): --------------------------------- - Allow processing of single shapefiles with no items (e.g. an empty dbf file) (#3147) - Added resolution scaling for swf, svg, pdf and imagemap drivers (#3157) - Correct cases where a valid WFS Layer might return errors if map extent does not overlap the layer extent (#3139) - fix problem with 0-length line patterns in AGG - Fixed problem of text/html WMS GetFeatureInfo which was returning HTML image map output instead of the expected text/html template output. This was done by changing the imagemap outputformat to use the "text/html; driver=imagemap" mime type (#3024) - more resolution fixes for resolution scaling (symbolscale case) (#3157) - Make sure layer extents are saved when a mapfile is written (#2969) - Fixed CurvePolygons from oracle not drawn (#2772) - Fixed raster queries (broken by RFC 52 changes) (#3166) - Fixed coordinate projection problem in some cases with WMS GetFeatureInfo output in GML2 format (#2989) - Added resolution scaling of some properties for GD driver (#3157) - Modified GD functions API to be consistent with all others drivers (#3157) - OGC Filter: strip all namespaces (not only ogc, gml) (#1350) - Use decimal values for size and width in SVG output format (#2835) - Correct invalid test when loading movies in an swf output (#2524) - Return WMS GetCapabilities v1.3.0 by default as required by spec (#3169) - Fixed mapObj.zoomScale() and mapobj.zoomRectangle() scaling problem in Mapscript (#3131) - Few more fixes for high res output (#3157) - Allow "DRIVER 'TEMPLATE'" or "DRIVER TEMPLATE" in output formats - Correct sld generated from mapserver classes (#3133) - Correct libjpeg v7 compatibility issue in old jpeg interface code (#3167) - Correct FEATURE_COUNT limits on WMS GetFeatureInfo raster queries (#3168) - Correct SCALE_BUCKETS issue with 16bit raster scaling (#3174) Version 5.6.0-beta3 (2009-10-07): --------------------------------- - make RFC55 highres output be friendly with scaledependant rendering (#3157) - avoid fractured and overlapping glyphs with angle follow (#2812) - Fixed SDE layer seg fault (#3152) - Fixed placement of labels using ANGLE AUTO which were not always positioned correctly (#3160) - Enable output of geometry in GML GetFeatureInfo if wms_geometries and wms_geom_type are specified (#2989) - fix URN typo in mapwfs.c for urn:EPSG:geographicCRS:... - don't apply scalefactor to label outlines (#3157) - update namespaces and schema pointers (#2872) - add RFC49 and RFC40 keywords to copy functions (#2865) - minor fix to correct numberOfResults when maxfeatures is set in mapfile (#2907) - Fixed possible crash with WFS GetFeature when no projection is specified at the map level (#3129) - Fixed anchor point of vertically stacked bar graphs - Fixed TEXT property that cannot be removed in the CLASS object. PHP/Mapscript (#3063) - Fixed use of minfeaturesize auto with curved labels (#3151) - Fixed msRemoveHashTable function when 2 keys have the same hash (#3146) - Fix raster thread deadlock condition on posix/linux (#3145) - Do not route thread debug output through msDebug which requires locking. - Fix WCS coverage metadata handling if size/resolution missing (#2683). - Fix WCS crash with use of datasets that aren't physical files (#2901). - Fix WCS failure with WCS 1.1 OGC URN (urn:ogc:def:crs:OGC::CRS84) (#3161). Version 5.6.0-beta2 (2009-10-01): --------------------------------- - Fixed a couple of issues with Oracle Spatial and single pass queries (#3069) - Added layer.resultsGetShape() to PHP MapScript for use with queries (#3069) - Fixed query maps under the new single pass query process (#3069) - WFS Client seg fault (OGR layer not opened) (#3136) - Reduce use of sqrt() calls when determining distances (#3134) - support axis ordering for WFS 1.1 (#2899) - const changes to avoid warnings with msLoadProjectionString() - mapgd.c: removed unused drawVectorSymbolGD() function. - Use http://www.mapserver.org/mapserver namespace URI in XML mapfile schema (#3142) - Fixed issue with PHP_REGEX_INC in mapscript/php3/Makefile.in (#3078) Version 5.6.0-beta1 (2009-09-23): --------------------------------- - WMS 1.3.0 expects a CRS parameter instead of SRS (#2979) - Allow users to set wms getmap and getlegendgraphic image format list (#455) - Fixed MapScript shapeObj->toWkt() segfaults (#2763) - add vertical bar charts to dynamic charting (#3128) - Get the intersection points and labels #3101 - Fixed shp2img not to cause a crash when the map couldn't be loaded - Fix problem with overflowing shape->index for (most) query modes (#2850) - Useful error message when PK is missing and data is subselect (#3124) - Add WMS root Layer metadata support (#3121) - Fixed build problem of PHP/Mapscript when php is compiled with gd as a shared extension (#3117) - Improve safety of srcx/y checks in nearest neighbour raster resampler (#3120) - Added support for 4d geometry types and oci bind variables for Oracle (#3107) - Implement SECTION support for the WCS 1.1 GetCapabilities request (#3105) - Fixed WCS processing when both crs and response_crs are specified (#3083) - Fixed msFreeMap causing memory corruption in msFreeOutputFormat (#3113) - Fix WMC XML output when Dimension is used (#3110) - Enable LOAD_WHOLE_IMAGE processing option by default when rendering WMS client layer images (#3111). - add default values for CGI %key% substitutions (#3108) - fix clipping of polygon shapes in line layers (#3059) - RFC 51 implementation: XML Mapfiles Format (#2872) - Fix output for valid WCS 1.1 XML (#3086) - Avoid double free with postgresql joins. (#2936) - Don't attempt to project layers given in pixel coordinates (layer->transform != MS_TRUE) (#3096) - Modify loading imagery from GDAL to load all bands at once to avoid multiple passes through pixel interleaved data (mapdrawgdal.c). This is just an optimization - there should be no change in results or features. - Modern GDALs clear the config when destroying driver manager. Skip this call to avoid TLS leakage on cleanup (mapgdal.c). - Fixed msMSSQL2008LayerGetShape to retrieve proper wkb geometries (#3082) - Fixed the shape index for the inline layers (#3074) - Fixed MINDISTANCE not considering label size on lines (#3050) - Labeling enhancements: ability to repeat labels along a line/multiline (#3030) - Modified STYLEITEM code to use the new way of rendering thick lines (#3025) - Fixed template processor to respect layer order. (#2619) - Add MS_DEBUGLEVEL and MS_ERRORFILE commandline switches for mapserv.c. - Exposed msMapOffsetExtent, msMapScaleExtent and msMapSetCenter methods in PHP/Mapscript (#2460) - Removed ZEND_DEBUG define in PHP/Mapscript (#2717) - Fixed PHP/Mapscript to support PHP 5.3 (#3065, #3066) - remove -O optimization flags to configure script if configured with --enable-debug - Fixed performance bottleneck when computing a polygon center of gravity for label point computation. (#3053) - make WFS numberOfFeatures match maxFeatures if passed (#2907) - Add logging in layer visibility tests to help users find why layers don't draw (#3054) - include PNG libs first (#3046) - merge graphics branch: RFC54 implementation, cairo rendering (png, svg, pdf), opengl rendering (non functional yet) - Do pre-emptive test for map.extent/layer.extent interaction (#3043) - Add centroid geomtransform (#2825) - Test database connections before using them (#2932) - Support non-numeric join criteria (#2006) - Ensure there's enough room in the SQL to hold a long (#1284) - Fix filter error in multi-clause filters (#2937) - Fix agg freetype character lookup when no unicode charmap is present (#3018) - Fix memory leak in SQL building (#2997) - Fork AGG rendering library in our trunk - Fixed a memory leak when unescaping quotes in logical expressions (#2938) - Fixed template code for item, shpxy and extent tags to properly initialize tag arguments in cases where there are multiple tags in one chunk of template (#2990) - Fix mapogcfilter.c not to cause syntax error if PROJ.4 is not compiled in (#2987) - Rework Python MapScript's setup.py to be more like Python's to fix a number of issues including (#2637) and to use mapserver-config and ditch the old mapscriptvars approach - Prevent from changing the connection type to MS_RASTER when setConnectionType(MS_WMS) is used (#2908) - Improve rounding logic for computing the src_xoff/yoff (#2976) - Fix filename path processing for raster queries and WCS get coverage so that non-filesystem filenames are not altered (#2901) - Improved security relative to untrusted directories and mapfiles (RFC 56) - Fixed several security issues found in an audit of the CGI application (#2939, #2941, #2942, #2943, #2944) - setConnectionType(MS_WMS) doesn't work with mapscript (#2908) - Perl Mapscript: improvement of imageObj wrapper (#2962) - Improve control of output resolution (RFC 55, #2948) - mapraster.c: use GDALOpenShared(), and CLOSE_CONNECTION=DEFERRED (#2815) - AGG font outline method change (#1243) - Change mapbit.c bitmask type from char to new 32bit ms_bitarray (#2930) - Added resolution writing in image files (#2891) - Try to save resolution values to GeoTIFF via GDAL (#2891) - Refactor legend icon drawing (remove renderer specific versions) Add label styling or markers for annotation layer legend icons (#2917) - Update EXTENT warning message (#2914) - add support for SRSNAME parameter (#2899) - add support for resultType (#2907) - WFS 1.1.0 should use OWS Common 1.0.0 (#2925) - clean up GEOS init and cleanup functions (#2929) - add support for disabling SLD (#1395) - fix to output gml:boundedBy again (#2907) - fix warning for change in bitmask type (#2930) - fix time advertising in WMS 1.3.0 (#2935) - fix SOS blockSeparator output (#3014) - fix MIME type support (#3020) Version 5.4.0-beta3 (2009-3-5): -------------------------------- - SLD: Correct crash with large class names (#2915) - Added Java MapScript WIN64 support (#2250) - Fixed a problem with long running processes, embedded scalebars/legends and AGG. (#2887) - Applied patch to deal with a couple of WCS issues (time ranges, #2487) and PostGIS tileindex-based time filters (#1856) - Adding -DUSE_GENERIC_MS_NINT to the WIN64 MapScript builds (#2250) - Fixed C# the compiler options for MSVC 2008 (#2910) - Fix build problem with mapogcsld.c when OWS services are not available (#473) - Fix build on windows (maputil.c) Version 5.4.0-beta2 (2009-2-25): -------------------------------- - Fixed a problem where default shade symbols (solid fill, no size) were being scaled and not rendered as expected (related to #2896 I believe) - Fixed a problem with offset polylines (AGG only) (#2868) - Generate SLD version 1.1.0 (#473) - Tracking original geometry type so we can make better decisions on what positions to use with POSITION AUTO and annotation layers. (#2770) - Setting up the same size units between the OGR auto-style and the OGR label attribute binding option (#2900) - Take better care of the extra items with the inline layers to prevent from memory corruption (#2870) - Fixed the compiler options for MSVC 2008 (#2898) Version 5.4.0-beta1 (2009-2-18): -------------------------------- - restored much of the pre-5.0 capabilities to update a mapfile via URL but in a more secure manner (RFC44) - WMS 1.3.0 support added (#473) - OWS GetCapabilities should skip layers with status == MS_DELETE (#2582) - Set the default symbol size to 1 instead of 0 (#2896) - fix WMS LegendURL to print sld_version for 1.3.0 Capabilities (#473) - add GetSchemaExtension to WMS to support GetStyles in Capabilities XML (#473) - move xlink declaration to root of WMS 1.3.0 DescribeLayerResponse - Fixed a scalebar rounding problem causing to draw zero scalebar width (#2890) - SLD: if it contains a Filter Encoding tag, try to always set the layer's FILTER element (#2889) - Add support for rendering INLINE layers with layer attributes (items) (#2870) - Fix mapserver crash when rendering a query map in HILITE mode and there are is no STYLE defined (#2803) - Added projection support to [...ext] tags for template output. - Removed the error generation when the OGR layer contains no fields (#2883) - Added enhancements to mapogr.cpp for style annotations (#2879) - Fixed memory leaks when using msUpdate*FromString methods. (#2857) - Fixed the problem when removing the attribute binding in mapscript. - SOS XML validity fixes (#2646) - add WFS calls for schema resolution (#2646) - add gml:id to om:Observation (#2646) - fix some XML validity issues (#2646) - Fixed endianness issues with wide character strings for ArcSDE (#2878). Thanks Russell McOrmond - Fixed WMS request with LAYERS parameter: may cause segmentation fault (#2871) - fix when layer status = DEFAULT and passing list of layers (#2066) - Fixed msAddLabel may cause access violation in certain conditions - Changed base type of labelObj size, minsize and maxsize from int to double (#2766) - add support for WMS Server title in LAYER object (#885) - Fixed build problem using --with-gd=static and freetype (#2697) - RFC49 implementation (#2865) - Fixed Blobs not filtered in OracleSpatial Attribute/WFS queries (#2829) - Fixed memory leak of map::setProjection in PHP/MapScript (#2861) - Fixed "internal PHP GC memory leaks" in PHP/MapScript (#2767) - Fixed bug with wms layer group hierarchy (#2810) - Added updateFromString() methods for several objects in PHP/Mapscript (#2298) - Added ms_newMapObjFromString mapObj constructor in PHP/Mapscript (#2399) - Add support to compile mssql2008 when SDE or ORACLE is not compiled (#2851) - Add support for creating debug builds for the plugins on Windows - Correct half pixel error in WMS layer's BBOX request to remote WMS (#2843) - Expose Map/Layer's Projection objects in PHP/MapScript (#2845) - Added getUnits() methods to projectionObj in Mapscript (#2798) - Improved Tag parsing in template code. (#2781) - Added hashtable object and metadata methods for php-mapscript (#2773) - mappostgis.c: Fix trailing spaces in fixed varchar fields (#2817) - RFC48 implementation: GEOMTRANSFORM on styleObj (#2825) - mapwms.c: cleanup warnings with recent gcc versions (#2822) - mapogcsos.c: Cleanup warning and error messages - mapagg.cpp: Fix center of rotation for truetype marker symbols - mapowscommon.c: use msLibXml2GenerateList to generate listed XML elements - mapowscommon.c: output version string correctly (#2821) - Added removeLayer function to mapObj in PHP/MapScript. (#762) - Exposed PIXELS value via URL configuration - Add Support for SLD TextSymbolizer HALO and ANGLE (#2806) - IGNORE_MISSING_DATA: largely replaced by run-time CONFIG property, ON_MISSING_DATA, which supports three modes: FAIL, LOG, and IGNORE. (#2785) ms-rfc-47.txt - mapstring.c: msStringTrim(*char str), front-and-back whitespace trimmer - mappostgis.c: re-write to remove binary cursors and break up logic into smaller parts, add support for maxfeatures - mapogcfilter.c: increase array size (code was assigning to out of bounds subscript) - MapScript: Added getBinding method to label and style object (#2670) - mapowscommon.c: use strcasecmp to check for language value - raster query fix for tileindex with relative paths (#2722) - Fixed msOGRGetValues function to return default values if the object type is not TEXT. (#2311) - Fix for the access violation caused by msMSSQL2008LayerGetShape (#2795) - Fixed msMSSQL2008LayerGetItems to retrieve the column names properly (#2791) - Prevent from calling msMSSQL2008CloseConnection from msMSSQL2008LayerClose causing memory corruption issues (#2790) - new polygon label placement algorithm (#2793) - stop drawing an artificial outline around polygons to ensure continuity - users needing this feature will have to explicitly add an outlinecolor of the same color as the fill color - added formatoption QUANTIZE_NEW to force going through the pngquant quantization algorithm instead of the GD one for imagemode RGB (the GD one can be kind of buggy) - fix some integer rounding errors in the agg line offseter (#2659) - fix a bug with shapes with duplicate end points. was causing nans in the angle follow placement code (#2695) - refactor msGetLabelSizeEx (now merged with msGetLabelSize) (#2390) - native label size computation for AGG when using angle follow (#2357) - memory leak in msInsertLayer, from Ned Harding (#2784) - label size computation refactoring (#2390) - don't draw label background if we're using angle follow. (#2726) - legend keyimage resampling with agg (#2715) - tileindexed rasters when DATA is manipulated via mapscript work (#2783) - styleObj width now supports attribute binding - RFC40 implementation: label text wrapping and alignment (#2383) - baseline adjustment for multiline labels (#1449) - Added support to access to the labelObj OUTLINEWIDTH property in PHP/MapScript - PHP paste image should also work with AGG (#2682) - Fixed bug when QUERYMAP hilite color is set and the shape's color in a layer is from a data source (#2769) - Decoupled AUTO label placement from the positions enum in mapserver.h. Added explicit case for POLYGON layers where CC is the default and then we try UC, LC, CL and CR. (#2770) - Changed base type of styleObj size and width from int to double (#2766) - Correct allocation error in mapmssql2008.c - Add possibility to use a full resolution setting for svg output (#1706) - Fixed GetFeature through tileindex bug: the tileindex of the shape found wasn't set properly in the resultcache object. (#2359) - Removed comma to correct WCS 1.1 Coverages formatting in payload directory. (#2764) - Correct bug when LABEL_NO_CLIP in combination with minfeaturesize (#2758) - Fix a label size computation for AGG bug when scalefactor is used (#2756) - various SOS updates for CITE compliance (#2646) - Added support for static linking with the lib gd in configure script (#2696) - Support OpenLayer's ol:opacity extension to OGC Web Map Context docs (#2746) - Added MS_VERSION_NUM for use with #if statements in code based on libmapserver (#2750) - Fixed the configure script: failed to detect php5 on ubuntu. (#2365) - Fixed a memory leak associated with not deleting the lexer buffer before parsing certain types of strings. (#2729) - Added legend graphics for layer of type annotation for the AGG and GD renderer (#1523) - Masking the out-of-range characters to avoid the crash in the AGG renderer (#2739) - Accept WMS requests in which the optional SERVICE parameter is missing. A new test was incorrectly added in 5.2.0 that resulted in the error "Incomplete WFS request: SERVICE parameter missing" when the SERVICE parameter was missing in WMS requests in which the SERVICE parameter is optional (#2737) - Support for the MapInfo style zoom layering option (#2738) - Implement Equals and GetHashCode properly for the mapscript C# classes - Expose msConnectLayer to the SWIG mapscript interface with a new layerObj.setConnectionType() method that should be used instead of setting the layerObj.connectiontype directly (#2735) - SLD: when creating well known symbols on the fly the pen-up value used should be -99. - SWF: Button names reflects the layer id and shape id (#2691) - Support reading projection parameter for OGC filters (#2712) - Several enhancements to STYLEITEM AUTO support for labels (#2708) and TTF symbols (#2721) in OGR layers - Expose special attributes OGR:LabelText, OGR:LAbelAngle, OGR:LabelSize and OGR:LabelColor to MapScript getShape() calls (#2719) Version 5.2.0 (2008-07-16): --------------------------- - mapfile.c: Fixed a bug that prevented using named symbols via URL configuration. (#2700) Version 5.2.0-rc1 (2008-07-09): ------------------------------- - mapowscommon.c: fix support multiple namespaces (#2690) - Fix OGC simple filters on SDE layers (#2685) - wfs11 getcapabilities: correct memory corruption (#2686) - Allow building against Curl 7.10.6 and older which lack CURLOPT_PROXYAUTH option required for *_proxy_auth_type metadata (#571) - Avoid fatal error when creating new ShapeFileObj with MapScript (#2674) - Fixed problem with WMS INIMAGE exceptions vs AGG output formats (#2438) - mapshape.c: Fixed integer pointer math being applied to uchars (#2667) - Fixed seg fault with saveImage() in PHP MapScript due to #2673 (#2677) - Fixed configure error related to new fribidi2 pkg-config support (#2664) - Fixed windows build problem (#2676) - Fix raster query bounds problem (#2679) Version 5.2.0-beta4 (2008-07-02): --------------------------------- - Added support in configure script for pkg-config for fribidi2 (#2664) - Added more debug/tuning output to mapserv and shp2img at debug level 2 (#2673) - maptemplate.c: removed extra line feeds from mime header output. (#2672) - mapresample.c: fix for bug 2540 when using raster resampling and AGG. - mapsde.c: Check at compile time that we have SE_connection_test_server, which appears to only be available for ArcSDE 9+ (#2665). - mapshape.c: restore old behavior of tiled shapes relative to shapepath with new behavior for when shapepath is undefined (#2369) - maputil.c: fix a bug for offset lines with agg, when the first segment was horizontal (#2659) - mapraster.c: fix for tiled rasters with relative shape paths defined, from dfurhy (#2369) - maptemplate.c: fixed a problem with extent tags with _esc extension not working (#2666) Version 5.2.0-beta3 (2008-06-26): --------------------------------- - mapsde.c: processing option added to allow using fully qualified names for attributes (#2423). - mapsde.c: Test for an active connection before closing it (#2498). - mapdraw.c: Fixed issue where path following labels were not being drawn if FORCEd. (#2600) - mapshape.c: Applied patch to make the location of tiled data relative to the tileindex directory if SHAPEPATH is not set. (#2369) - maptemplate.c: Fixed issues in RFC 36 implementation that prevented mapscript mapObj->processQueryTemplate() method from working. - WMS/WFS: extend warning message (#1396) - WFS: Respect units for the DWhitin parameter (#2297) - WFS: correct OGC Contains filter (#2306) - WMS: set srsName correctly for GetFeatureInfo (#2502) - SOS: detect invalid time strings (#2560) - SOS: more srsName support (#2558) - mapserv.c, maptemplate.c: fixed problem with arguments to msGenerateImages(). (#2655) - WMS: produce warning if layer extent is null (#1396) - WFS: project LatLongBoundingBox if required (#2579) - SOS: generate error for some invalid filters (#2604) - SLD: Use style's width parameter when generating sld (#1192) Version 5.2.0-beta2 (2008-06-18): --------------------------------- - mapogcsos.c: support invalid procedure in GetObservation (#2561) - Fixed possible buffer overrun with Oracle Spatial driver (#2572) - mapogcsos.c: support srsName in GetObservation (#2414) - Filter Encoding: Modify DWithin definition (#2564) - Added webObj legendformat and browseformat mapping in PHP MapScript (#2309) - Removed static buffer size limit in msIO_*printf() functions (#2214) - Fixed libiconv detection in configure for OSX 10.5 64 bit (#2396) - mapstring.c: possible buffer overflow in msGetPath (#2649) - maputil.c: Correct expression evaluation with text containing apostrophes (#2641) - mapwfs.c: Possibly generate an error message when applying filter encoding (#2444) - Added MS_LABEL_BINDING constants for SWIG MapScript (#2643) - mapogcsos.c: fix POST support (#2379) - maplibxml2.c: helper functions XML POST fix (#2379) - mapwfs.c: fix segfault when srsName is not passed on BBOX Filter (#2644) - mapwfs.c: do not return error for empty query results (#2444) - Remove C++-style comments and most other warnings thrown by -pedantic (#2598) - mapwfs.c/mapwfs11.c: set GML MIME type correctly - mapogcsos.c: advertise supported SRS list via MAP.WEB.METADATA.sos_srs (#2414) - mapwfs.c: set layer extent to map extent for default GetFeature requests with no spatial predicates (#1287) Version 5.2.0-beta1 (2008-06-11): --------------------------------- - WMS/WFS layers can now specify a proxy servert (#571) - mapwmslayer.c: set QUERY_LAYERS correctly (#2001) - mapwcs.c: handle PARAMETER values correctly (#2509) - SOS: fix various memory leaks (#2412) - mapwcs.c: advertise temporal support in GetCapabilities (#2487) - Fixed flaw in findTag() in maptemplate.c that prevented multiple tags on the same line being processed under certain conditions. (#2633) - Return results even when extents are missing (#2420) - Avoid displaying OGR connection strings in error messages (#2629) - WCS: respect wcs_name metadata for GetCoverage and DescribeCoverage requests (#2036) - CGI: added -nh option to allow for the suppression of content headers from the command line (#2594) - PostGIS: fix postgis idle-in-transaction problem (#2626) - AGG: enable ellipse symbol rotation for POINT/ANNOTATION layers (#2617) - RFC36: add more extensions to support templates (#2576) - AGG: allow dashed hatch symbols (#2614) - AGG: enable offset lines of type x -99 (#2588) - AGG: use an agg specific label size calculation function where possible (#2357) - mapogcsld.c: fetch TextSymbolizer/Label/ogc:PropertyName correctly (#2611) - Don't ignore .qix file when DATA reference includes .shp extension (#590) - CGI able to alter layers with space and underscores (#2516) - WFS Multipoint query with PostGIS bug fixed (#2443) - Tiling API (RFC 43) mode=tile, tilemode=spheremerc, tile=x y zoom (#2581) - Remove C++-style comments and most other warnings thrown by -pedantic (#2598) - Fix PostGIS transaction behavior in fcgi situations (#2497, #2613) - Improve performance for large shape files (#2282) - encode WMS parameters correctly (#1296) - Added alignment option within a scalebar (#2468) - RFC-42 HTTP Cookie Forwarding (#2566) - Fixed handling of encrypted connection strings in postgis driver (#2563) - mapagg.cpp: AGG: add opacity at the style level (#1155) - mapwms.c: add Cache-Control max-age HTTP header support (#2551) - mapogcsos.c: support URI encoded procedures correctly (#2547) - Added support for EMPTY template with WMS GetFeatureInfo (#546) - Throw an exception if the WCS request does not overlap layer (#2503) - Acquire TLOCK_PROJ for pj_transform() calls (#2533). - Fixed problem with large imagemaps generating no output (#2526) - mapwms.c: make version optional for GetCapabilities again (#2528) - support URN scheme for components of observed property elements (#2522) - Fixed gdImagePtr gdPImg memory leak in msSaveImageBufferGD() (#2525) - mapogcsos.c: handle invalid POST requests (#2521) - mapogcsos.c: handle ACCEPTVERSIONS parameter (#2515) - mapwcs.c/mapwcs11.c: s/neighbour/neighbor/g (#2518) - mapwms.c: relax FORMAT parameter restrictions for GetFeatureInfo (#2517) - mapwcs.c: support COVERAGE lists for DescribeCoverage (#2508) - mapwcs.c: fix lonLatEnvelope/@srsName (#2507) - mapwcs.c: omit VendorSpecificCapabilities (#2506) - mapwcs.c: test for either resx/resy OR width/height (#2505) - mapwcs.c: make GetCoverage demand one of TIME or BBOX (#2504) - mapwms.c: make GetLegendGraphic listen to TRANSPARENT in OUTPUTFORMAT (#2494) - OWS: support updatesequence (#2384) - mapwms.c: test VERSION after service=WMS (#2475) - OWS: output Capabilities XML updateSequence if set (#2384) - mapwcs.c: better handling of REQUEST parameter (#2490) - mapwcs.c: point to correct exception schema (#2481) - mapows.c: add version negotiation (#996) - mapwfs.c: return default GML2 when invalid OUTPUTFORMAT passed (#2479) - mapowscommon.c: add OWS Common style version negotiation (#996) - mapwcs.c: better section parameter handling for CITE (#2485) - mapwfs.c: point to the correct schema for exceptions (#2480) - shp2img.c/shp2pdf.c: clean up usage text, check for invalid layers (#2066) - completed implementation of RFC24 (#2442, #2032) - mapwcs.c: require VERSION parameter for DescribeCoverage and GetCoverage (#2473) - mapwcs.c: change error token to MS_WCSERR instead of MS_WMSERR (#2474) - mapwcs.c: set exception MIME type to application/vnd.ogc.se_xml for 1.0.0 (#2470) - mapwcs.c: Generate a decently formatted exception if an WCS XML POST request is received (#2476). - mapowscommon.c: support OWS Common 1.1.0 as well (#2071) - mapogcsos.c: support SOS 1.0.0 (#2246) - Implement mapObj.setCenter, mapObj.offsetExtent, mapObj.scaleExtent, rectObj.getCenter at the SWIG API (#2346) - mapogcfilter.c: use USE_LIBXML2 in ifdefs (#2416) - clean up naming conventions of Shapefile API (#599) - use msComputeBounds() instead, since it's already in the codebase (#2087) - set shapeObj bounds from WKT (#2087) - fixed issue where path following labels sometimes used the supplied setting for position. In all cases with ANGLE FOLLOW we want to force position MS_CC regardless of what is set in the mapfile. - enforce (-99 -99) to be the penup value for vector symbols (#1036) - Support for labeling features (polygon & line) prior to clipping. This results in stable label positions regardless of map extent. (#2447) - Support for quantization and forced palette png output with RGBA images (#2436) - SLD using a single BBOX filter should generate an SQL ststement for oracle/postgis/ogr (#2450) - Accurate Calculation of legend size for WMS LegendURL (#2435) - Converted mapogr.cpp to use OGR C API instead of C++ classes to allow GDAL/OGR updates without having to recompile MapServer (#545, #697) - add missing space on dashed polygon outlines with svg (#2429) - Restored behavior of MS 4.10 and made WMS STYLES parameter optional again in GetMap and GetFeatureInfo requests (#2427) - Speed up forced palette rendering (#2422) - WMS GetFeatureInfo: honour FEATURE_COUNT for any INFO_FORMAT and apply the FEATURE_COUNT per layer instead of globally (#2423, #1686) - enable soft outlines on truetype labels. This is triggered with a new keyword OUTLINEWIDTH for the LABEL block (#2417) - fix clipping rectangle to take width as well as size into account (#2411) - AGG: added and use a line and polygon adaptor to avoid copying shapeObj points to an agg path_storage. avoids a few mallocs and a few copies. - fixed symbolsetObj not to set the SWIG immutable flag permanently don't expose refcount and the symbol attributes (Ticket #2407) - fix for support of entity encoded text in angle follow text (#2403) - AGG: initial support for native computation of label sizes (#2357) - AGG: support text symbols specified by their character number (#2398) - AGG: fix angle orientation for various symbols - allow scientific notation for attributes binded to an int (#2394) - merge GD and AGG label cache drawing functions (#2390) - Enable AGG rendering of bitmap font labels instead of falling back to GD (#2387) - clean up treatment of encoding and wrap character - Fix legend label placement for multiline labels (#2382) - enforce WRAP parameter in legend label (#2382) - AGG: pixel level simplification for line and polygon shapes (#2381) - fixed blue/green color swapping for space delimited strings bound to an attribute. (bug 2378) - don't remove points that are checked as being colinear (#2366) - add initial(?) support for reading a pie chart's size from an attribute (#2136) - don't bail out in map parsing if the outputformat had to be modified (bug #2321) - use a renderer agnostic legend icon drawing function which switches to the GD or AGG specific one depending on the outputformat (#2348) - AGG: switch alpha buffer when drawing query layer - Fixed legend icons not drawing when using maxscaledenom - AGG: fix embedded scalebar rendering when using postlabelcache (#2327) - AGG: allow for fast and aliased rendering of simple lines and polygons thick lines and patterns (i.e. dashes)aren't supported. this is triggered when the symbol is of TYPE SYMBOL *and* its ANTIALIAS is off (waiting to find a better solution to trigger this). - AGG: the pixmap of pixmap symbols is now cached in an agg-compatible state the first time it is accessed. this avoids rereading and retransforming it each time that symbol is used. - AGG: the imageObj now stores in what state it's alpha channel is in. The number ofmsAlphaGD2AGG/AGG2GD calls is now reduced, but most importantly each of these calls is usually just a check for this state and does no computation. - AGG: fixed a few artifacts in embedded legend rendering on rgba images. - Fixed modulus operator in the parser (#2323) - maprasterquery.c: Fix crash when queries on done on raster layers with no styles (#2343) - maprasterquery.c: Modify msRASTERLayerOpen() to create a defaulted raster layer info if there isn't one, to avoid the errors about open only being supported after a query. Also wipe the raster layer info in case of an empty result set, or failures of a query to reduce likelihood of leaking the raster layer info. - Improve out of memory handling in mapdrawgdal.c, and mapgd.c. (#2351) - Improve configuration logic for fastcgi (#2355). - WMS: image/wbmp should be image/vnd.wap.wbmp (#2360) - SOS: support maxfeatures for GetObservation requests (#2353) - mapdraw.c,mapquery.c: Reset layer->project flag for each full layer drawing or query so that need to reproject will be reconsidered (#673). - PHP MapScript: fix for getStdoutBufferString() and getStdoutBufferBytes() functions on win32 (#2401) - mapowscommon.c: fix namespace leak issues (#2375) - mapogcsos.c: add SWE DataBlock support (#2248) - mapogcsos.c: fix build warnings, namespace and schema pointers (#2248) - mappdf.c: support output in fastcgi case via msIO_fwrite() (#2406) - mapogcsos.c: Initial support for POST requests (#2379) and updated msSOSDispatch() handling - mapogr.cpp: Use pooling api to ensure per-thread sharing of connections only (#2408) - mapogcsos.c: change substituted variable from sensorid to procedure (#2409) - maplibxml2.c: Initial implementation of libxml2 convenience functions - configure: Modified so libxml2 support is requested for WCS and SOS, and is indicated by USE_LIBXML2 definition. Use @ALL_ENABLED@ in DEFINEs and mapscriptvars generation. - mapresample.c: Fixed support for multi-band data in RAW mode for bilinear and nearest neighbour resamplers (#2364). - mapdraw.c: Improve error reporting if a raster layer requested in a query map (#1842). - mapfile.c: add simple urn:ogc:def:crs:OGC::CRS84 support. Version 5.0.0 (2007-09-17) -------------------------- - AGG: Fix angle computation for truetype marker symbols on lines (#2316) - Fix support for bilinear resampling of raster data with AGG (#2303) Version 5.0.0-rc2 (2007-09-10) ------------------------------ - Prevent seg fault in msWMSLoadGetMapParams when request is missing (#2299) - Fixed calculation of scale in PHP MapScript mapObj.zoomScale() (#2300) - Fixed conflict between runtime substitution validation and qstring validation. - Fixed agg configure logic (now should work with --with-agg alone) (#2295) - Fixed interleaving of multi-band results for raster query (#2294). Version 5.0.0-rc1 (2007-09-05) ------------------------------ - Fixed "MinFeatureSize AUTO" labeling for polygon layers, works for polygon annotation layers too (#2232) - Fixed path following labels with short (2/3 character) strings (#2223) - AGG fix a bug when rendering polygons with tiled pixmaps - Added requirement to provide validation pattern for cgi-based attribute queries using the layer metadata key 'qstring_validation_pattern' (#2286) - Fixed msDebug causing a crash with VS2005 (#2287) - Added stronger checks on libpdf version in configure script (#2278) - Added msGetVersionInt() to MapScript (ms_GetVersionInt() in PHP) (#2279) - _isnan prototype for MSVC builds from #2277 - AGG: Fix a bug when rendering brushed lines with vector or pixmap symbols (artifacts could appear on outline) - AGG: Adjust symbol height when brushing a line with a vector symbol so that the line width isn't truncated - Only include process.h on win32 (non-cygwin) systems, moved from maptemplate.h to mapserver.h. (#2276) Version 5.0.0-beta6 (2007-08-29) -------------------------------- - Fixed problem with outline of polygons rendered twice with OGR STYLEITEM AUTO and AGG output (#2271) - Fixed problem compiling with only WMS/WFS client but none of the WMS, WFS, WCS or SOS server options enabled (#2272) - Fixed buffer overflow in handling of WMS SRS=AUTO:... (#1824) - AGG: render thick lines and polygon outlines with round caps and joins by default - Typo in mapfile writing (#2267) - Fixed mapping of class->keyimage in PHP MapScript (#2268) - Look for libagg under lib64 subdir as well in configure (#2265) - AGG: revert previous optimizations. now use caching of the rendering object to avoid the re-creation of some structures each time a shape is drawn - AGG: optimizations for faster rendering. we now do not initialize the font cache when no text is to be rendered - AGG: fixed rendering of polygons with holes (#2264) - AGG - raster layers: fix typo in mapresample.c that produced random background colors when using OFFSITE (#2263) - AGG: Fix a bug when rendering tiled polygons with truetype, pixmap or vector symbols (usually only affected bright colors) - Avoid passing null to msInsertHashTable in processLegendTemplate when layer.name or layer.group not specified (#2261) - Fixed problems with fonts in PDF output (#2142) - AGG: smooth font shadows Version 5.0.0-beta5 (2007-08-22) -------------------------------- - Fixed XSS vulnerabilities (#2256) - Allow building with AGG from source when libaggfontfreetype is missing. configure --with-agg=DIR now automatically tries to build agg_font_freetype.o from source if libaggfontfreetype is missing (#2215) - Fixed possible buffer overflow in template processing (#2252) - fix blending of transparent layers with RGBA images - AGG: speed up rendering of pixmap marker symbols - Implement OGR thread-safety via use of an OGR lock (#1977). - Fixed compile warnings (#2226) - Fixed mappdf.c compile warnings, PDF support was probably unusable before that fix (#2251) - Adding -DUSE_GENERIC_MS_NINT to the WIN64 builds (#2250) - Adding msSaveImageBuffer and use that function from the mapscript library instead of the renderer specific functions. (#2241) - Split each format into it's own element in WCS describe coverage results (#2244). - Support to run the mapscript c# examples on x64 platform (#2240) - Fixed problem introduced in 5.0.0-beta4: all HTML legend icons were empty white images (#2243) - Fixed WMS Client to always send STYLES parameter with WMS GetMap requests (#2242) - Fixed support for label encoding in SVG output (#2239) - Added support for label encoding in legend (#2239) - Fixed PHP MapScript layer->queryByAttributes() to not accept empty or null qitem arg (#480) - AGG: fixed incorrect rendering of pixmaps on MSB architectures (#2235) - Added layer.getFeature() in PHP MapScript with optional tileindex arg, and deprecated layer.getShape() to match what we had in SWIG (#900) - Added class.getTextString() and deprecated/renamed class.getExpression() and layer.getFilter() to class.getExpressionString() and layer.getFilterString() to match what we have in SWIG MapScript (#1892) Version 5.0.0-beta4 (2007-08-15) -------------------------------- - Updated msImageCreateAGG to only allow RGB or RGBA pixel models (#2231) - Fixed problem with symbol.setImagePath() when file doesn't exist (#1962) - Python MapScript failures (#2230) - msInsertLayer should not free the incoming layer anymore (#2229) - Include only parsed in the first mapfile (#2021) - Incorrect lookup of symbol in symbolset (#2227) - Mapfile includes and MapScript (#2089) - Fixed alignment of GetLegendGraphic output when mapfile contains no legend object (#966) - Fixed seg. fault when generaing HTML legend for raster layers with no classes (#2228). The same issue was also causing several Chameleon apps using HTML legend to seg fault (#2218) - Do not use case sensitive searches in string2list, which is used for msWhichItems (#2067) - Ensure that we can write AGG images with Python MapScript's write() method - Support unicode attributes for ArcSDE 9.2 and above (#2225) - GD: Truetype line symbolization should follow line orientation only if GAP is <=0 - AGG: Added truetype symbolization for lines and polygons - AGG: Draw an outline of size 1 of the fill color around polygons if an outlinecolor isn't specified (avoids faint outline) - Added summary of options at end of configure output (#1966) - Updated configure script to detect and require GEOS 2.2.2+ (#1896) - Renamed --enable-coverage configure option to --enable-gcov to avoid confusion with WCS or Arc/Info coverages (#2217) - Fixed --enable-gcov (formerly --enable-coverage) option to work with php_mapscript.so (#2216) - check for OGR support in if SLD is used (#1998) - msWMSLoadGetMapParams: fixed handling of required parameters (#1088) - if any of srs, bbox, format, width, height are NOT found, throw exception - if styles AND sld are NOT found, throw an exception - NOTE: this may cause issues with some existing clients who do not pass required parameters Version 5.0.0-beta3 (2007-08-08) -------------------------------- Known issues: - This beta contains significant improvements and fixes on the AGG rendering front. However some build issues remain on some platforms. Please see ticket #2215 if building with AGG support doesn't work with the default configure script: http://trac.osgeo.org/mapserver/ticket/2215 Bug fixes: - mapagg.cpp rewrite - the AGG renderer should now support all the GD features - Use AGG when requested for drawing the legend - Fixed problems with very large HTML legends producing no output (#1946) - Use OGR-specific destructors for objects that have them rather than 'delete' (#697) - Include style-related info in HTML legend icon filenames to solve issues with caching of icons when the class or style params are changed (#745) - Fixed issues with wms_layer_group metadata in WMS GetCapabilities (#2122) - Use msSaveImageBufferAGG for AGG formats in getBytes (#2205). - Make sure to emit $(AGG) to mapscriptvars because of conditional inclusion of struct members to imageObj. (#2205) - Make imageextra field in imageObj not conditional (not #ifdef'ed) (#2205) - AGG/PNG and AGG/JPEG are the only valid agg drivers. Imagetypes aggpng24 and aggjpeg can be used to refer to the default output formats. (#2195) - Fix memory leak with labepath object (#2199) - Fix memory leak msImageTruetypePolyline (#2200) - SWF: Fix incorrect symbol assignments (#2198) - Fixed memory leaks in processing of WFS requests (#2077) - Avoid use of uninitialised memory in msCopySymbol() (#2194) Version 5.0.0-beta2 (2007-08-01) -------------------------------- - Oracle Spatial: Fixed some issues related with the maporaclespatial.c source code: warnings with calls in gcc 4.x versions (#1845), gtype translation error, generating memory problem (#2056), problems with items allocation (#1961 and #1736), and some memory-leaks errors (#1662). - AGG: Fixed a significant number of rendering issues including conflicts with OPACITY ALPHA and ANTIALIAS TRUE settings w/regards to polygon fills. Fixed ellipse and vector markers. Fixed AGG/GD alpha channel conflicts by writing conversion to/from functions. (#2191-partial, #2173, #2177) - SOS: Turn layer off if eventTime is not in the sos_offering_timeextent (#2154) - WFS: Correct bugs related to query by featureid support (#2102) - WMS: Add svg as a supported format for GetMap request (#1347) - WMS: Correct WMS time overriding Filter parameter (#1261) - Fix problem with LUT scaling ranges with explicit value for 255 (#2167). - WCS: Fixed resampling/reprojecting for tileindex datasets (#2180) - Fixed formatting of configure --help (#2182) - Fixed AGG configure option to use 'test -f' instead of 'test -e' which doesn't work on Solaris (#2183) - Fixed mapwms.c to support selecting AGG/ outputformats via FORMAT=. - Removed unused styleObj.isachild member (#2169) Version 5.0.0-beta1 (2007-07-25) -------------------------------- New features in 5.0: - MS RFC 19: Added Style and Label attribute binding - MS RFC 21: Raster Color Correction via color lookup table - MS RFC 27: Added label priority - MS RFC 29: Added dynamic charting (pie and bar charts) - MS RFC 31: New mechanism to load/set objects via URL using mapfile syntax - MS RFC 32: Added support for map rendering using the AGG library for better output quality Long time issues resolved in 5.0: - MS RFC 17: Use dynamic allocation for symbols, layers, classes and styles (got rid of the static limit on the number of instances of each in a map) - MS RFC 24: Improved memory management and garbage collection for MapScript - MS RFC 26: Terminology cleanup (layer transparency renamed to opacity, scale becomes scaledenom, symbol style becomes symbol pattern) - MS RFC 28: Enhanced the debug/logging mechanism to facilitate troubleshooting and tuning applications. Added support for multiple debug levels and more control on output location. Other fixes/enhancements in this beta: - Upgrade Filter encoding to use geos and support all missing operators (#2105) - Use of static color Palette support for gd output (#2096) - MapServer's main header file map.h has been renamed mapserver.h (#1437) - A mapserver-config script has been created - Single and double quotes escaping in string expressions used by FILTER. (Resolves tickets #2123 and #2141) - SLD: Support of Graphic Stroke for a Linesymbolizer (#2139) - GD : draw symbols along a line using pixmap symbols (#2121) - SVG : Polygons should not be filled if color is not given (#2055) - WMS : fixed request with a BBOX and and SLD containing Filter encoding (2079) - SWF : use highlight color from querymap (2074) - Support for embedding manifests as resources for the VS2005 builds. (ticket #2048) - Changed OGRLayerGetAutoStyle not to pass NULL pointer to GetRGBFromString causing access violation (bug 1950). - Fix SDE returning the row_id_column multiple times (bug 2040). - Fix text outline bug. (bug 2027) - Improve error reporting when OWS services are requested but the support is not compiled in. (bug 2025) - Fix support for OFFSITE for simple greyscale rasters (bug 2024). - [SLD] : Error on last class in raster class names based on the ColorMapEntry (bug 1844) - [Filter Encoding] : Check if Literal value in Filter is empty (bug 1995) - [SLD] : Else filters are now generated at the end of classes (bug 1925) - Enabled setting of a layer tileindex (e.g. map_layername_tileindex) via the CGI program. (bug 1992) - Added feature to the CGI to check runtime substitutions against patterns defined in layer metadata. (bug 1918) - Exposed label point computation to mapscript (bug 1979) - [SLD]: use the url as symbol name for external symbols (bug 1985) - [SLD] : support of mixing static text with column names (bug 1857) - maperror.c: fix for wrapping long in image errors, thanks to Chris Schmidt (bug 1963) - maperror.c: fix closing of stderr/stdout after writing error msg (bug 1970) - Preliminary implementation of RFC 21 (Raster Color Correction). - [SLD] : when reading an SLD, sequence of classes was reversed (Bug 1925) - Fixed a bug with SDE capability requests where we were double freeing because sde->row_id_column wasn't set to NULL in msSDELayerOpen - [OGC:SOS] : Fixed bugs related to metadata and xml output (1731, 1739, 1740, 1741). Fixed bug with large xml output (bug 1938) - fixed performance problem in raster reprojection (bug 1944) - added msOWSGetLanguage function in mapows.c/h (bug 1955) - added mapowscommon.c/mapowscommon.h and updated mapogcsos.c to use mapowscommon.c functions (bug 1954) - added more Perl mapscript examples in mapscript/perl/examples/, most of which exemplify recently added GEOS functionality - php_mapscript.c: Fixed setRotation() method to check for MS_SUCCESS, not MS_TRUE (bug 1968) - mapobject.c: Fixed msMapSetExtent() to avoid trying to calculate the scale if the map size hasn't been set yet (bug 1968) - mapobject.c: ensure msMapComputeGeotransform() returns MS_FAILURE, not MS_FALSE (bug 1968) - mapdraw.c: Actually report that we aren't configure with wms client support if that is why we can't draw a layer. - mapows.c: fixed XML error (bug 2070) - mapwms.c: Fixed text/plain output duplicate (bug 1379) - mapwms.c: Attribution element output in GetCapabilities only 1.0.7 and higher (bug 2080) - mapwms.c: UserDefinedSymbolization element output in GetCapabilities only 1.0.7 and higher (bug 2081) - mapwms.c: GetLegendGraphic and GetStyles only appear in 1.1.1 and higher responses (bug 1826) - mapwcs.c: - msWCSDescribeCoverage: throw Exception if Coverage doesn't exist (bug 649) - msWCSException: updated as per WCS 1.0 Appendix A.6 - mapogcsos.c: Added ability to output gml:id via MAP/LAYER/METADATA ows/sos/gml_featureid (bug 1754) - mapcontext.c: Added ogc namespace (#2002) - Note that starting with this release the source code is now managed in Subversion (SVN) instead of CVS and we have migrated from bugzilla to Trac for bug tracking. Version 4.10.0 (2006-10-04) --------------------------- - No source code changes since 4.10.0-rc1 Known issues in 4.10.0: - PHP5 not detected properly on Mandriva Linux (bug 1923) - Mapfile INCLUDE does not work with relative paths on Windows (bug 1880) - Curved labels don't work with multibyte character encodings (bug 1921) - Quotes in DATA or CONNECTION strings produce parsing errors (bug 1549) Version 4.10.0-RC1 (2006-09-27) ------------------------------- - SLD: quantity values for raster sld can be float values instead of just being integer - Hiding labelitemindex, labelsizeitemindex, labelangleitemindex from the SWIG interface (bug 1906) - Fixed computation of geotransform to match BBOX (to edges of image) not map.extent (to center of edge pixels). (bug 1916) - mapraster.c: Use msResampleGDALToMap() for "upside down" images. (bug 1904) Version 4.10.0-beta3 (2006-09-06) --------------------------------- - Web Map Context use format metadata when formatlist not available. (bug 1723) - Web Map Context boolean values true/false now interpreted. (bug 1692) - Added support for MULTIPOLYGON, MULTILINESTRING, and MULTIPOINT in msShapeFromWKT() when going through OGR (i.e. GEOS disabled) (bug 1891) - Fixed MapScript getExpressionString() that was failing on expressions longer that 256 chars (SWIG) and 512 chars (PHP). (bug 1428) - WMSSLD: use Title of Rule if Name not present (bug 1889) - Fixed syntax error (for visual c++) in mapimagemap.c. - Fixed mapgeos.c problems with multipoint and multilinestring WKT (bug 1897). - Implemented translation via OGR to WKT for multipoint, multiline and multipolygon (bug 1618) Version 4.10.0-beta2 (2006-08-28) --------------------------------- - Applied patch supplied by Vilson Farias for extra commas with imagemap output (bug 760). - Fixed possible heap overflow with oversized POST requests (bug 1885) - Set ./lib and ./include properly for MING support (bug 1866) - More robust library checking on OSX (bug 1867) - Removed mpatrol support (use valgrind instead for something similar and less intrusive). (bug 1883) - Added mapserver compilation flags to the SWIG c# command line (bug 1881) - Fix OSX shared library options for PHP (bug 1877). - Added setSymbolByName to styleObj for the SWIG mapscript in order to set both the symbol and the symbolname members (bug 1835) - Generate ogc filters now outputs the ocg name space (bug 1863) - Don't return a WCS ref in WMS DescribeLayer responses when layer type is CONNECTIONTYPE WMS (cascaded WMS layers not supported for WCS) (bug 1874) - Correct partly the problem of translating regex to ogc:Literal (bug 1644) - schemas.opengeospatial.net has been shutdown, use schemas.opengis.net instead as the default schema repository for OGC services (bug 1873) - MIGRATION_GUIDE.TXT has been created to document backwards incompatible changes between 4.8 and 4.10 - Modify mapgd.c to use MS_NINT_GENERIC to avoid rounding issues. (bug 1716) - added --disable-fast-nint configure directive (bug 1716) - Fixed php_mapscript Windows build that was broken in beta1 (bug 1872) - Supported tag in SLD label (Bug 1857) - Use the label element in the ColorMapEntry for the raster symbolizer (Bug 1844) - Adding Geos functions to php mapscript (bug 1327) - Added a type cast to msio.i so as to eliminate the warning with the SWIG unix/osx builds - Fixed csharp/Makefile.in for supporting the OSX builds and creating the platform dependent mapscript_csharp.dll.config file. - Fixed error in detection of libpdf.sl in configure.in (bug 1868). Version 4.10.0-beta1 (2006-08-17) --------------------------------- - Marking the following SWIG object members immutable (bug 1803) layerObj.metadata, classObj.label, classObj.metadata, fontSetObj.fonts, legendObj.label, mapObj.symbolset, mapObj.fontset, mapObj.labelcache, mapObj.reference, mapObj.scalebar, mapObj.legend, mapObj.querymap mapObj.web, mapObj.configoptions, webObj.metadata, imageObj.format, classObj.layer, legendObj.map, webObj.map, referenceMapObj.map labelPathObj was made completely hidden (according to Steve's suggestion) - Fixed problem with PHP MapScript's saveWebImage() filename collisions when mapscript was loaded in php.ini with PHP as an Apache DSO (bug 1322) - Produce warning in WFS GetFeature output if ???_featureid is specified but corresponding item is not found in layer (bug 1781). Also produce a warning in GetCapabilities if ???_featureid not set (bug 1782) - Removed the default preallocation of 4 values causing memory leaks. (related to bug 1801) Added initValues to achieve the similar functionality if needed. - Fixed error in msAddImageSymbol() where a symbol's imagepath was not set (bug 1832). - Added INCLUDE capability in mapfile parser (bug 279) - Revert changes to mapzoom.i that swapped miny and maxy (Bug 1817). - MapScript (swig) creation of an outputFormatObj will now set the inmapfile flag so that it gets written out to saved maps by default (Bug 1816). - Converted GEOS support to use the GEOS C-API (versiopn 2.2.2 and higher). Wrapped remaining relevant GEOS functionality and exposed via SWIG-based MapScript. - If a layer has wms_timedefault metadata, make sure it is applied even if there is no TIME= item in the url. (Bug 1810) - Support for GEOS/ICONV/XML2 use flags in Java Makefile.in (related to bug 1801) - Missing GEOS support caused heap corruption using shapeObj C# on linux (Bug 1801) - Fix time filter propagation for raster layers to their tileindex layers. New code in maprasterquery.c (bug 1809) - Added logic to collect LD_SHARED even if PHP not requested in configure. - Fix problems with msio/rfc16 stuff on windows. Don't depend on comparing function pointers or "stdio" handles. (mapio.c, mapio.h, msio.i) - Support WMC Min/Max scale in write mode (bug 1581) - Fixed leak of shapefile handles (shp/shx/dbf) on tiled layers (bug 1802) - Added webObj constructor and destructor to swig interface with calls to initWeb and freeWeb (bug 1798). - mapows.c: ensure msOWSDispatch() is always available even if there are no services to dispatch. This makes mapscript binding easier. - FLTAddToLayerResultCache wasn't properly closing the layer after it was done with it. - Added ability to encrypt tokens (passwords, etc.) in database connection strings (MS-RFC-18, bug 1792) - Fixed zoomRectangle in mapscript: miny and maxy were swapped, making it impossible to zoom by rect; also the error message was referring to the wrong rect. There were no open issues on bugzilla. Reverted because of 1817. - Implementation of RFC 16 mapio services (bug 1788). - Use lp->layerinfo for OGR connections (instead of ogrlayerinfo) (bug 331) - Support treating POLYGONZ as MS_SHAPE_POLYGON. (bug 1784) - Complete support for international languages in Java Mapscript (bug 1753) - Output feature id as @fid instead of @gml:id in WFS 1.0.0 / GML 2.1.2 GetFeature requests (bug 1759) - Allow use of wms/ows_include_items and wms/ows_exclude_items to control which items to output in text/plain GetFeatureInfo. Making the behavior of this INFO_FORMAT consistent with the new behavior of GML GetFeatureInfo output introduced in v4.8. (bug 1761) IMPORTANT NOTE: With this change if the *_include_items metadata is not specified for a given layer then no items are output for that layer (previous behavior was to always all items by default in text/plain) - Make sure mappostgis.c closes MYCURSOR in layer close function so that CLOSE_CONNECTION=DEFER works properly. (bug 1757) - Support large (>2GB) raster files relative to SHAPEPATH. (bug 1748) - Set User-Agent in HTTP headers of client WMS/WFS connections (bug 1749) - Detection of os-dependent Java headers for Java mapscript (bug 1209) - Preventing to take ownership of the memory when constructing objects with parent objects using C# mapscript (causing nullreference exception, Bug 1743) - SWF: Adding format option to turn off loading movies automatically (Bug 1696) - Fixed FP exception in mapgd.c when pixmap symbol 'sizey' not set (bug 1735) - Added config file for mapping the library file so the DllImport is looking for to its unix equivalent (Bug 1596) Thanks to Scott Ellington - Added /csharp/Makefile.in for supporting the creation of Makefile during configuration with MONO/Linux (fix for bug 1595 and 1597) - Added C# typemaps for char** and outputFormatObj** - Support for dispatching multiple error messages to the MapScript interface (bug 1704). - Fix inter-tile "cracking" problem (Bug 1715). - OGC FILTER: Correct bug when generating an sql expression containing an escape character. - Allow a user to set a PROCESSING directive for an SDE layer to specify using the attributes or spatial index first. (bug 1708). - Cheap and easy way of fudging the boundary extents for msSDEWhichShapes in the case where the rectangle is really a point (bug 1699). - Implement QUANTIZE options for GD/PNG driver (Bug 1690, Bug 1701). - WMS: Publish the GetStyles operation in the capabilities document. - PHP_MAPSCRIPT: Add antialias parameter in the style object (Bug 1685) - WFS: Add the possibility to set wfs_maxfeatures to 0 (Bug 1678) - SLD: set the default color on the style when using default settings in PointSymbolizer. (bug 1681) - Incorporate range coloring support for rasters (bug 1673) - Fixed mapthread.c looking for the unix compiler symbol rather than just testing whether or not _WIN32 is defined for the usage of posix threads because unix is not defined on compilers like GCC 4.0.1 for OS X. - Fixed the fuzzy brush support so that the transition between 1 pixel aa lines and brushes is less obvious. The old code would not allow for a 3x3 fuzzy brush to be built. (bug 1659) - Added missing mapscript function msConnPoolCloseUnreferenced() (bug 1661) We need to make conn. pooling handling transparent to mapscript users so that they do not have to call this function once in a while, for instance by creating an evictor thread. - Added calls to msSetup/msCleanup() at MapScript load/unload time (bug 1665) - Reorganized nmake.opt to be more focused on functionality groups rather than the propensity of a section to be edited. Default values are now all set to be pointed at the MapServer Build Kit, which can be obtained at http://hobu.stat.iastate.edu/mapserver/ - configure.in/Makefile.in: Use PROJ_LIBS instead of PROJ_LIB. PROJ_LIB is sometimes defined in the environment, but points to $prefix/share/proj not the proj link libraries. - Update Web Map Context to 1.1.0, add the dimension support. (bug 1581) - Support SLD body in context document. (bug 887) - When generating an ogc filter for class regex expressions, use the backslah as the default escape character (Bug 1637) - Add connectiontype initialization logic when the layer's virtual table is initialized (Bug 1615) - Added modulus operator to mapparser.y. - Added new support for [item...] tag in CGI-based templates (bug 1636) - Reverted behavior to pre-1.61: do not allow for use of the FILTERITEM attribute (bug 1629) - Treat classindex as an int instead of a char in resultCacheMemberObj to prevent problems with more than 128 classes (bug 1633) - WMS : SLD / stretch images when using FE (Bug 1627) - Add gml:lineStringMember in GML2 MultiLineString geometry (bug 1569). - PHP : add shape->sontainsshape that uses geos lib (Bug 1623). - Move gBYTE_ORDER inside the pg layerinfo structure to allow for differently byte ordered connections (bug 1587). - Fix the memory allocation bug in sdeShapeCopy (Bug 1606) - Fixed OGR WKT support (Bug 1614). - Added shapeObj::toWkt() and ms_shapeObjFromWkt() to PHP MapScript (bug 1466) - Finished implementation of OGR Shape2WKT function (Bug 1614). - Detect/add -DHAVE_VSNPRINTF in configure script and prevent systematic buffer overflow in imagemap code when vsnprintf() not available (bug 1613) - Default layer->project to MS_TRUE even if no projection is set, to allow geotransforms (nonsquare pixels, etc) to be applied (bug 1645). - Force stdin into binary mode on win32 when reading post bodies. (bug 1768) Version 4.8.0-rc2 (2006-01-09) ------------------------------ - Commit fix for GD on win32 when different heaps are in use. (Bug 1513) - Correct bound reprojection issue with ogc filer (Bug 1600) - Correct mapscript windows build problem when flag USE_WMS_SVR was not set (Bug 1529) - Fix up allocation of the SDE ROW_ID columns and how the functions that call it were using it. (bug 1605) - Fixed crash with 3D polygons in Oracle Spatial (bug 1593) Version 4.8.0-rc1 (2005-12-22) ------------------------------ - Fixed shape projection to recompute shape bounds. (Bug 1586) - Fixed segfault when copying/removing styles via MapScript. (Bug 1565) - Fixed segfault when doing attribute queries on layers with a FILTER already set but with no FILTERITEM. Version 4.8.0-beta3 (2005-12-16) -------------------------------- - Initialize properly variable in php mapscript (Bug 1584) - New support for pseudo anti-aliased fat lines using brushes with variable transparency. - Arbitrary rotation support for vector symbols courtesy of Map Media. - Support for user-defined mime-types for CGI-based browse and legend templates (bug 1518). - mapraster.c: Allow mapresample.c code to be called even if projections are not set on the map or layer object. This is no longer a requirement. (Bug 1562) - Fix problem with WMS 1.1.1 OGC test problem with get capabilities dtd (Bug 1576) - PDF : adding dash line support (Bug 492) - Fixed configure/build problem (empty include dir) when iconv.h is not found (bug 1419) - PDF : segfault on annotation layer when no style is set (Bug 1559) - PostGIS layer test cases and fix for broken views and sub-selects (bug 1443). - SDE: Removed (commented out) support for SDE rasters at this time. As far as I know, I'm the only one to ever get it to work, it hasn't kept up with the connection pooling stuff we did, and its utility is quite limited in comparison to regular gdal-based raster support (projections, resampling, etc) (HB - bug 1560). - SDE: Put msSDELayerGetRowIDColumn at the top of mapsde.c so things would compile correctly. This function is not included (or necessary) in the rest of the MS RFC 3 layer virtualization at this time. - WFS : TYPENAME is manadatory for GetFeature request (Bug 1554). - SLD : error parsing font parameters with the keyword "normal" (Bug 1552) - mapgraticule.c: Use MIN/MAXINTERVAL value when we define grid position and interval (bug 1530) - mapdrawgdal.c: Fix bug with nodata values not in the color table when rendering some raster layers (bug 1541). - mapogcsld.c : If a RULE name is not given, set the class name to "Unknown" (Bug 1451) Version 4.8.0-beta2 (2005-11-23) -------------------------------- - Use dynamic allocation for ellipse symbol's STYLE array, avoiding the static limitation on the STYLE argument values. (bug 1539) - Fix bug in mapproject.c when splitting over the horizon lines. - Fix Tcl mapscript's getBytes method (bug 1533). - Use mapscript.i in-place when building Ruby mapscript, copying not necessary (bug 1528). - Expose maximum lengths of layer, class, and style arrays in mapscript (bug 1522). - correct msGetVersion to indicate if mapserver was build with MYGIS support. - Fixed hang in msProjectRect() for very small rectangles due to round off problems (bug 1526). Version 4.8.0-beta1 (2005-11-04) -------------------------------- - Bug 1509: Fixed bounding box calculation in mapresample.c. The bottom right corner was being missed in the calculation. - MS RFC 2: added OGR based shape<->WKT implementation. - mapgdal.c: fixed some mutex lock release issues on error conditions. - MS RFC 8: External plugin layer providers (bug 1477) - SLD : syntax error when auto generating external symbols (Bug 1508). - MS RFC 3: Layer vtable architecture (bug 1477) - wms time : correct a problem when handling wms times with tile index rasters (bug 1506). - WMS TIME : Add support for multiple interval extents (Bug 1498) - Removed deprecated --with-php-regex-dir switch (bug 1468) - support wms_attribution element for LAYER's (Bug 1502) - Correct php/mapscript bug : initialization of scale happens when preparequery is called (Bug 1334). - msProjectShape() will now project the lines it can, but completely delete lines that cannot be projected properly and "NULL" the shape if there are no lines left. (Bug 411) - Expose msLayerWhichShapes and msLayerNextShape in MapScript. (bug 1481) - Added support to MapScript to change images in a previously defined symbol. (bug 1471) - mapogcfiler.c : bug 1490. Crash when size of sld filters was huge. - Fixed --enable-point-z-m fix in configure.in (== -> =) (bug 1485). - Extra scalebar layer creation is prevented with a typo fix in mapscale.c. Good catch, Tamas (bug 1480). - mapwmslayer.c : use transparency set at the layer level on wms client layers (Bug 1458) - mapresample.c: added BILINEAR/AVERAGE resampling options. - mapfile.c: avoid tail recursion in freeFeatureList(). - maplegend.c: fixed leak of imageObj when embedding legends. - msGDALCleanup(): better error handler cleanup. - Modified msResetErrorList() to free the last error link too, to ensure msCleanup() scrubs all error related memory. - Fix in msGetGDALGetTransform() to use default geotransform even if GDALGetGeoTransform() fails but alters the geotransform array. - Typemaps for C# to enable imageObj.getBytes() method (bug 1389). - Enable -DUSE_ZLIB via configure for compressed SVG output (bug 1307). - maputil.c/msAddLine(): rewrite msAddLine() to call msAddLineDirectly, and use realloc() in msAddLineDirectly() to optimize growth of shapeObjs. (bug 1432) - msTmpFile: ensure counter is incremented to avoid duplicate temporary filenames. (bug 1312) - SLD external graphic symbol format tests now for mime type like image/gif instead of just GIF. (bug 1430) - Added support for OGR layers to use SQL type filers (bug 1292) - mapio/cgiutil - fixed POST support in fastcgi mode. (bug 1259) - mapresample.c - ensure that multi-band raw results can be resampled. (bug 1372) - Add support in OGC FE for matchCase attribute on PropertyIsEqual and PropertyIsLike (bug 1416) - Fixed sortshp.c to free shapes after processing to avoid major memory leak. (bug 1418) - fixed msHTTPInit() not ever being called which prevented msHTTPCleanup() from properly cleaning up cUrl with curl_global_cleanup(). (bug 1417) - mapsde.c: add thread locking in msSDELCacheAdd - fixed mappool.c so that any thread can release a connection, not just it's allocator. (bug 1402) - mapthread.c/h: Added TLOCK_SDE and TLOCK_ORACLE - not used yet. - Fixed copying of layer and join items. (bug 1403) - Fixed copying of processing directives within copy of a layer. (bug 1399) - Problems with string initialization. (bug 1312) - Fix svg output for multipolygons. (bug 1390) - Added querymapObj to PHP MapScript (bug 535) Version 4.6.0 (2005-06-14) -------------------------- - Bug 1163 : Filter Encoding spatial operator is Intersects and not Intersect. - Fixed GEOS to shapeObj for multipolgon geometries. Version 4.6.0-rc1 (2005-06-09) ------------------------------ - Bug 1375: Fixed seg fault in mapscript caused by the USE_POINT_Z_M flag. This flag was not carried to the mapscript Makefile(s). - Bug 1367: Fixed PHP MapScript's symbolObj->setPoints() to correctly set symbolObj->sizex/sizey - Bug 1373: Added $layerObj->removeClass() to PHP MapScript (was already in SWIG MapScript) Version 4.6.0-beta3 (2005-05-27) -------------------------------- - Bug 1298 : enable Attribution element in wms Capabilities XML - Bug 1354: Added a regex wrapper, allowing MapServer to build with PHP compiled with its builtin regex - Bug 1364: HTML legend templates: support [if] tests on "group_name" in leg_group_html blocks, and for "class_name" in leg_class_html blocks. - Bug 1149: From WMS 1.1.1, SRS are given in individual tags in root Layer element. - First pass at properly handling XML exceptions from CONNECTIONTYPE WMS layers. Still needs some work. (bug 1246) - map.h/mapdraw.c: removed MAX/MIN macros in favour of MS_MAX/MS_MIN. - Bug 1341, 1342 : Parse the unit parameter for DWithin filter request. Set the layer tolerance and toleranceunit with parameters parsed. - Bug 1277 : Support of multiple logical operators in Filter Encoding. - mapwcs.c: If msDrawRasterLayerLow() fails, ensure that the error message is posted as a WCS exception. - Added experimental support for "labelcache_map_edge_buffer" metadata to define a buffer area with no labels around the edge of a map (bug 1353) Version 4.6.0-beta2 (2005-05-11) -------------------------------- - Bug 179 : add a small buffer around the cliping rectangle to avoid lines around the edges. - Finished code to convert back and forth between GEOS geometries. Buffer and convex hull operations are exposed in mapscript. - fontset.fonts hash now exposed in mapscript (bug 1345). - Bug 1336 : Retrieve distance value for DWithin filter request done with line and polygon shapes/ - Bug 985 / 1015: Don't render raster layers as classified if none of the classes has an expression set (gdal renderer only). - Bug 1344: Fixed several issues in writing of inline SYMBOLS when saving mapfile (missing quotes around CHARACTER and other string members of SYMBOL object, check for NULLs, and write correct identifiers for POSITION, LINECAP and LINEJOIN). Version 4.6.0-beta1 (2005-04-26) -------------------------------- - Bug 1305: Added support for gradient coloring in class styles - Bug 1335 : missing call to msInitShape in function msQueryByShape - Bug 804 : SWF output : Make sure that the layer index is consistent when saving movies if some of the layers are not drawn (because the status is off or out of scale ...) - Bug 1332 - shptreevis.c: fixed setting of this_rec, as the output dbf file was not getting any records at all. - Fixed Makefile.vc to make .exe files depend on the DLL, so if the DLL fails to build, things will stop. Avoids the need for unnecessary cleans on win32. Also fixed the rule for MS_VERSION for mapscriptvars. - Bug 1262 : the SERVICE parameter is now required for wms and wfs GetCapbilities request. It is not required for other WMS requests. It is required for all WFS requests. - Bug 1302 : the wfs/ows_service parameter is not used any more. The service is always set to WFS for WFS layers. - Bug 791: initialize some fields in msDBFCreate() - avoids crashes in some circumstances. - Bug 1329 : Apply sld named layer on all layers of the same group - Bug 1328 : support style's width parameter for line and polygon layers. - Bug 564: Fixed old problem with labels occasionally drawn upside down - Bug 1325: php mapscript function $class->settext needs only 1 argument. - Bug 1319: Fixed mutex creation (was creator-owned) in mapthread.c. win32 issue only. - Bug 1103: Set the default tolerance value based on the layer type. The default is now 3 for point and line layers and 0 for all the others. - Bug 1244: Removing Z and M parameter from pointObj by default. A new compilation option is available to active those option --enable-point-z-m. This gives an overall performance gain around 7 to 10%. - Bug 1225: MapServer now requires GD 2.0.16 or more recent - MapScript: shapeObj allocates memory for 4 value strings, shapeObj.setValue() lets users set values of a shapeObj. - MapScript: imageObj.getBytes() replaces imageObj.write() (bugs 1176, 1064). - Bug 1308: Correction of SQL expression generated on wfs filters for postgis/oracle layers. - Bug 1304: Avoid extra white space in gml:coordinates for gml:Box. - mapogr.c: Insure that tile index reading is restarted in msOGRLayerInitItemInfo() or else fastcgi repeat requests for a layer may fail on subsequent renders. - mapogr.c: Set a real OGRPolygon spatial filter, not just an OGRLinearRing. Otherwise GEOS enabled OGR builds will do expensive, and incorrect Intersects() tests. - mapogr.cpp / mapprimitive.c: Optimize msAddLine() and add msAddLineDirectly() - mapprimitive.c: Optimizations in msTransformShapeToPixel() (avoid division) - map.h: Made MS_NINT inline assembly for win32, linux/i86. - mapprimitive.c: optimized msClipPolygonRect and msClipPolylineRect for case where the shape is completely inside the clip rect. - Add support for SVG output. See Bug 1281 for details. - Bug 1231: use mimetype "image/png; mode=24bits" for 24bit png format. This makes it separately selectable by WMS. - Bug 1206: Applied locking patch for expression parser for rasters. - Bug 1273: Fixed case in msProjectPoint() were in or out are NULL and a failure occurs to return NULL. Fixed problem of WMS capabilities with 'inf' in it. - SLD generation bug 1150 : replacing tag to - Fixed bug 1118 in msOWSGetLayerExtent() (mapows.c). - Fixed ogcfilter bug #1252 - Turned all C++ (//) comments into C comments (bug 1238) - mapproject.h/configure.in: Don't check for USE_PROJ_API_H anymore. Assume we have a modern PROJ.4. - Bug 839: Fix memory leak of font name in label cache (in mapfile.c). - Added msForceTmpFileBase() and mapserv -tmpbase switch to allow overriding temporary file naming conventions. Mainly intended to make writing testscripts using mapserv easier. FrankW. - maporaclespatil.c: Bug fix for: #1109, #1110, #1111, #1112, #1136, #1210, #1211, #1212, #1213. Support for compound polygons, fixed internal sql to stay more accurate for geodetic data, added the support for getextent function. Added VERSION token for layer data string. - mapimagemap.c: Preliminary implementation of support for emitting MS_SYMBOL_VECTOR symbols in msDrawMarkerSymbolIM(). - Bug 1204: Added multi-threading support in mapthread.c. List of connections is managed within a mutex lock, and connections are only allowed to be used by one thread at a time. - Bug 1185 : php/mapscript : add constant MS_GD_ALPHA - Bug 1173: In HTML legend, added opt_flag support for layer groups. - Bug 1179: added --with-warnings configure switch, overhauled warning logic. - Bug 1168: Improve autoscaling through classification rounding issues. - Fixed bug writing RGB/RGBA images via GDAL output on bigendian systems. - Bug 1152 : Fix WMS style capabilities output for FastCGI enabled builds. - Bug 1135 : Added support for rotating labels with the map if they were rendered with some particular angle already. - Bug 1143 : Missing call to msInitShape. - Fixed PHP5 support for windows : Bug 1100. - Correct bug 1151 : generates twice a tag when generating an SLD. This was happening the style did not have a size set. - Oracle Spatial. Fixed problem with LayerClose function. Added token NONE for DATA statement. Thanks Valik with the hints about the LayerClose problem and Francois with the hints about NONE token. - numpoints and stylelength members of the symbol object needs to be in sync with the low level values after calls to setpoints ans setstyle (Bug 1137). - Use doubles instead of integers in function php3_ms_symbol_setPoints (Bug 1137). - Change the output of the expression when using a wild card for PropertyIsLike (Bug 1107). - Delete temporary sld file created on disk (Bug 1123) - Fixed msFreeFileCtx() to call free() instead of gdFree() as per bug 1125. Also renamed gdFreeFileCtx() to msFreeFileCtx(). - Ensure error stack is cleared before accepting another call in FastCGI mode in mapserv.c. Bug 1122 - Support translation of all geometry types to points in mapogr.cpp (now also supports multipolygon, multilinestring and geometrycollection. bug 1124. - Added support for passing OGR layer FILTER queries down to OGR via the SetAttributeFilter() method if prefixed with WHERE keyword. Bug 1126. - Fixed support for SIZEUNITS based scaling of text when map is rotated. Bug 1127. Version 4.4.0 (2004-11-29) -------------------------- - Fixed WMS GetCapabilities 1.1.0 crash when wms_style_<...>_legendurl_* metadata were used (bug 1096) - WCS GetCapabilities : Added ResponsibleParty support. - WMS GetCapabilities : Service online resource was not url encoded (bug 1093) - Fixed php mapscript problem with wfs_filter selection : Bug 1092. - Fixed encoding problem with WFS server when wfs_service_onlineresource was not explicitly specified (bug 1082) - Add trailing "?" or "&" to connection string when required in WFS client layers using GET method (bug 1082) - Fixed : SLD rasters was failing when there was Spatial Filter (Bug 1087) - Fixed mapwfslayer.c build error when WFS was not enabled (bug 1083) - Check that we have vsnprintf in mapimagemap.c before using it. Version 4.4.0-beta3 (2004-11-22) -------------------------------- - Added tests to minimize the threat of recursion problems when evaluating LAYER REQUIRES or LABELREQUIRES expressions. Note that via MapScript it is possible to circumvent that test by defining layers with problems after running prepareImage. Other things crop up in that case too (symbol scaling dies) so it should be considered bad programming practice (bug 1059). - Added --with-sderaster configure option. - Make sure that msDrawWMSLayerLow calls msDrawLayer instead of msDrawRasterLayerLow directly ensuring that some logic (transparency) that are in msDrawLayer are applied (bug 541). - Force GD/JPEG outputFormatObjects to IMAGEMODE RGB and TRANSPARENT OFF if they are RGBA or ON. Makes user error such as in bug 1703 less likely. - Advertise only gd and gdal formats for wms capabilities (bug 455). - Pass config option GML_FIELDTYPES=ALWAYS_STRING to OGR so that all GML attributes are returned as strings to MapServer. This is most efficient and prevents problems with autodetection of some attribute types (bug 1043). - msOGCWKT2ProjectionObj() now uses the OGRSpatialReference::SetFromUserInput() method. This allows various convenient setting options, including the ability to handle ESRI WKT by prefixing the WKT string with "ESRI::". - Fixed GetLegendGraphic in WMS Capabilities that were missing the '?' or '&' separator if it was not included in wms_onlineresource (bug 1065). - Updated WMS/WFS client and server code to lookup "ows_*" metadata names in addition to the default "wms_*" (or "wfs_*") metadatas (WCS was already implemented this way). This reduces the amount of duplication in mapfiles that support multiple OGC interfaces since "ows_*" metadata can be used almost everywhere for common metadata items shared by multiple OGC interfaces (bug 568). - Added ows_service_onlineresource metadata for WMS/WFS to distinguish between service and GetMap/Capabilities onlineresources (bug 375). - Added map->setSize() to PHP MapScript (bug 1066). - Re-enabled building PHP MapScript using PHP's bundled regex/*.o. This is needed to build in an environment with PHP configured as an Apache DSO (bugs 990, 520). - Fixed problem with raster dither support on windows (related to ascii encoding pointers) (bug 722). - Moved PHP/SWIG MapScript layer->getExtent() logic down to msLayerGetExtent() to avoid code duplication (bug 1051). - Added SDE Raster drawing support (experimental). - HTML legends: Added [leg_header_html] and [leg_footer_html] (bug 1032). - Added "z" support in SWIG MapScript for pointObj (bug 871). - In PHP Mpascript when using ms_newrectobj, the members minx, miny, maxx, maxy are initialized to -1 (bug 788). - Write out proper world file with remote WMS result, it was off by half a pixel (bug 1050). - Send a warning in the wms capabilities if the layer status is set to default (bug 638). - Fixed PHP MapScript compile warnings: dereferencing type-punned pointer will break strict-aliasing rules (bug 1053). - Added $layer->isVisible() to PHP MapScript (bug 539). - Ported $layer->getExtent() to PHP MapScript (bug 826). - wms_group_abstract can now be used in the capabilities (bug 754). - If wms_stylelist is an empty string, do not output the tag for MapContexts (bug 595). - Avoid passing FILE* to GD library by utilizing GD's gdIOCtx interface (bug 1047). - Output warning in wms/wfs capabilities document if layer,group,map names have space in them (bug 486, bug 646). - maporaclespatial.c: fixed declarations problems (bug 1044). - Allow use of msOWSPrintURLType with no metadata. In this case the default parameters will be used (bug 1001). - Ensure the outputFormatObj attached to msImageLoadGDStream() results reflect the interlacedness of the loaded image. Also ensure that the RGB PNG reference images work (make imagemode match gdImg) (bug 1039). - Fixed support for non-square pixels in WCS (bug 1014). - Expose only GD formats for GetLegendGraphic in the capabilities (bug 1001). - Check for supported formats when process a GetLegendGraphic request (bug 1030). - mapraster.c: fixed problem with leaks in tileindexed case where the tile index is missing (bug 713). - Oracle Spatial: implemented connection pool support for Oracle Spatial. New layer data parameters to support query functions, added "using unique ". Added "FILTER", "RELATE" and "GEOMRELATE" parameters, now permit users to choose the Oracle Spatial Filter. Modified the internal SQL to always apply FILTER function. And improve the Oracle Spatial performance. - Centralize "stdout binary mode setting" for win32 in msIO_needBinaryStdout(). Use it when writing GDAL files to stdout in mapgdal.c. Fixes problems with output of binary files from GDAL outputformat drivers on win32 via WMS/WCS. - MapServer now provides one default style named (default), title and LegendURL when generating capabilities. Added also the possibility to use the keyword default for STYLES parameter when doing a GetMap (..&STYLES=default,defeault,...) (bug 1001). - Add xlink:type="simple" in WMS MetadataURL (bug 1027). Version 4.4.0-beta2 (2004-11-03) -------------------------------- - free mapServObj properly in mapserv.c in OWS dispatch case to fix minor memory leaks. - modified msCloseConnections() to also close raster layers so that held raster query results will be freed. - modified raster queries to properly set the classindex in the resultcache. - modified msDrawQueryCache() to be very careful to not try and lookup information on out-of-range classindex values. This seems to occur when default shapes come back with a classindex of 0 even if there are no classes. (ie. raster query results). - the loadmapcontext function has changed it behavior. Before the 4.4 release when loading layers from a map context, the layer name was built using a unique prefix + the name found in the context (eg for the 2nd layer in map context named park, the layer name generated would possibly be l:2:park). Now the loadmapcontext takes a 2nd optional argument to force the creation of the unique names. The default behavior is now to have the layer name equals to the name found in the context file (bug 1023). - Fixed problem with WMS GetCapabilities aborting when wms_layer_group is used for some layers but not for all (bug 1024). - Changed raster queries to return the list of all pixel values as an attribute named "value_list" rather than "values" to avoid conflict with special [values] substitution rule in maptemplate.c. - Fixed raster queries to reproject results back to map projection, and to do point queries distance checking against the correct projection (bug 1021). - Get rid of WMS 1.0.8 support. It's not an officially supported version of the spec anyway: it's synonymous for 1.1.0 (bug 1022). - Allow use of '=' inside HTML template tag parser (bug 978). - Use metadata ows_schema_location for WMS/WFS/WCS/SLD (bugs 999, 1013, 938). The default value if metadata is not found is http://schemas.opengeospatial.net. - Generate a RULE tag when generating an SLD (bug 1010). - WMS GetLegendGraphic uses now the RULE value to return an icon for a class that has the same name as the RULE value (bug 843). - Add msOWSPrintURLType: This function is a generic URL printing function for OGC specification metadata (WMS, WFS, WCS, WMC, etc.) (bug 944). - Support MetadataURL, DataURL and LegendURL tags in WMS capabilities document and MetadataURL in WFS capabilities. - SWIG mapscript: clone methods for layerObj, classObj, styleObj (bug 1012). - Implemented an intarray helper class for SWIG mapscript which allows for multi-language manipulation of layer drawing order (bugs 853, 1005). - Fixed WMS GetLegendGraphic which was returning an exception (GD error) when requested layer was out of scale (bug 1006). - Fixed maplexer.l to work with flex 2.5.31 (bug 975). - WMS GetMap requests now have MS_NONSQUARE enabled by default. This means that if the width/height ratio doesn't match the extent's x/y ratio then the map is stretched as stated in the WMS specification (bug 862). - In WMS, layers with no explicit projection defined will receive a copy of the map's projectionObj if a new SRS is specified in the GetMap request or if MS_NONSQUARE is enabled. This will prevent the problem with layers that don't show up in WMS request when the server administrator forgets to explicitly set projections on all the layers in a WMS mapfile (bug 947). - Implemented FastCGI cleanup support for win32 and unix in mapserv.c. - Solved configure/compile issues with libiconv (bugs 909, 1017). Version 4.4.0-beta1 (2004-10-21) -------------------------------- - "shared" compilation target now supports some kind of versioning, should at least prevent libmap.so version collisions when upgrading MapServer on a server (bug 982). - When no RULE parameter has been specified in the WMS request a legend should be returned with all classes for the specified LAYER. Changes has been made in mapwms.c (bug 653). Also if the SCALE parameter is provided in the WMS request is will be used to determine whether the legend of the specified layer should be drawn in the case that the layer is scale dependent (big 809). - Nested layers in the capabilities are supported by using a new metadata tag WMS_LAYER_GROUP (bug 776). - Added greyscale+alpha render support if mapdrawgdal.c (bug 965). - Added --with-fastcgi support to configure. - support OGC mapcontext through mapserver cgi (bug 946). - support for reading 3d shape file (z) (bug 869). - add php mapscript functions to expose the z element (bug 870). - imageObj::write() method for SWIG mapscript (bug 941). - Protect users from 3 potential sources of threading problems: parsing expression strings outside of msLoadMap, evaluating mapserver logical expressions, and loading symbol set files outside of msLoadMap (bug 339). - Various fixes allowing unit tests to run leak free under valgrind on i686. Memory is now properly freed when exiting from common error states (bug 927). - Restored ability to render transparent (indexed or alpha) pixmap symbols on RGB map images, including annotation layers and embedded scalebars. This feature remains OFF by default for map layers and is enabled by specifying TRANSPARENCY ALPHA (bugs 926, 490). - mapserv_fcgi.c removed. Committed new comprehensive FastCGI support. - New mapserver exceptions for Java mapscript thanks to Umberto Nicoletti (bug 895). - Removed mapindex.c, mapindex.h, shpindex.c components of old unused shapefile indexing method. - Use the symbol size instead of 1 for the default style size value. This is done by setting the default size to -1 and adding msSymbolGetDefaultSize() everywhere to get the default symbolsize (Bug 751). - Correct Bug with GML BBOX output when using a with a GetFeature request (Bug 913). - Encode all metadatas and mapfile parameters outputted in a xml document (Bug 802). - Implement the ENCODING label parameter to support internationalization. Note this require the iconv library (Bug 858). - New and improved Java mapscript build provided by unicoletti@prometeo.it and examples by Y.K. Choo (bug 876). - MapContext: Cleanup code to make future integration more easily and output SRS and DataURL in the order required by the spec. - Fixed issue with polygon outline colors and brush caching (bug 868). - New C# mapscript makefiles and examples provided by Y.K. Choo committed under mapscript/csharp/ (bug 867). - Renamed 'string' member of labelCacheMemberObj to 'text' to avoid conflicts in SWIG mapscript with C# and Java types (bug 852). - Fixed Bug 866 : problem when generating an sld on a pplygon layer - SWIG mapscript: map's output image width and height should be set simultaneously using new mapObj::setSize() method. This performs necessary map geotransform computation. Direct setting of map width and height is deprecated (bug 836). - Fixed bug 832 (validate srs value) : When the SRS parameter in a GetMap request contains a SRS that is valid for some, but not all of the layers being requested, then the server shall throw a Service Exception (code = "InvalidSRS"). Before this fix, mapserver use to reproject the layers to the requested SRS. - Fixed bug 834: SE_ROW_ID in SDE not initialized for unregistered SDE tables - Fixed bug 823 : adding a validation of the SRS parameter when doing a GetMap request on a wms server. Here is the OGC statement : 'When the SRS parameter in a GetMap request contains a SRS that is valid for some, but not all of the layers being requested, then the server shall throw a Service Exception (code = "InvalidSRS").' - Set the background color of polygons or circles when using transparent PIXMAP symbol. - SWIG mapscript class extensions are completely moved from mapscript.i into separate interface files under mapscript/swiginc. - Overhaul of mapscript unit testing framework with a comprehensive test runner mapscript/python/tests/runtests.py. - Modified the MS_VALID_EXTENT macro to take an extent as its argument instead of the quartet of members. MapServer now checks that extents input through the mapfile are valid in mapfile.c (web, map, reference, and layer). Modified msMapSetExtent in mapobject.c to use the new macro instead of its home-grown version. Modified all cases that used MS_VALID_EXTENT to the new use case. - Layers now accept an EXTENT through the mapfile (bug 786). Nothing is done with it at this point, and getExtent still queries the datasource rather than getting information from the mapfile-specified extent. - Fixed problem with WMS GetFeatureInfo when map was reprojected. Was a problem with msProjectRect and zero-size search rectangles (bug 794) - MapServer version now output to mapscriptvars and read by Perl Makefile.PL and Python setup.py (bug 795). - Map.web, layer, and class metadata are exposed in SWIG mapscript as first-class objects (bug 737). - Add support for spatial filters in the SLD (Bug 782) - A few fixes to allow php_mapscript to work with both PHP4 and PHP5. PHP5 support should still be considered experimental. (bug 718) - Fixed SDE only recognizing SE_ROW_ID as the unique column (bug 536). The code now autosenses the unique row id column. - Enhanced SDE support to include support for queries against user-specified versions. The version name can be specified as the last parameter of the CONNECTION string. - Fixed automated generation of onlineresource in OWS GetCapabilities when the xxx_onlineresource metadata is not specified: the map= parameter used to be omitted and is now included in the default onlineresource if it was explicitly set in QUERY_STRING (bug 643) - Fixed possible crash when producing WMS errors INIMAGE (bug 644) - Fixed automated generation of onlineresource in OWS GetCapabilities when the xxx_onlineresource metadata is not specified: the map= parameter used to be omitted and is now included in the default onlineresource if it was explicitly set in QUERY_STRING (bug 643) - Fixed an issue with annotation label overlap. There was an issue with the way msRectToPolygon was computing it's bounding box. (bug 618) - Removed "xbasewohoo" debug output when using JOINs and fixed a few error messages related to MySQL joins (bug 652) - Fixed "raster cracking" problem (bug 493) - Improvements to Makefile.vc, and nmake.opt so that a mapscriptvars file can be produced on windows. - Updated setup.py so Python MapScript builds on win32. - Added preliminary raster query support. - No more Python-stopping but otherwise benign errors raised from msDrawWMSLayer() (bug 650). - Finished prototyping all MapServer functions used by SWIG-Mapscript and added 'void' to prototypes of no-arg functions, eliminating all but two SWIG-Mapscript build warnings (bug 658). - Mapscript: resolved issue with pens and dynamic drawing of points (bug 663). - Mapscript: fixes to tests of shape copying and new image symbols. - Mapscript: new OWSRequest class based on cgiRequestObj structure in cgiutil.h is a first step to allow programming with MapServer's OWS dispatching (bug 670). - Mapscript: styles member of classObj structure is no longer exposed to SWIG (bug 611). - Implementation geotransform/rotation support in cgi core, and mapscript.i. - Testing: fixed syntax error, 'EPSG' -> 'epsg' in test.map (bug 687). Added an embedded scalebar which demonstrates that bug 519 is fixed. The test data package is also made more complete by including two fonts from Bitstream's open Vera fonts (bug 694). - Mapscript (SWIG): remove promote and demote methods from layerObj. Use of container's moveLayerUp/moveLayerDown is better, and this brings the module nearer to PHP-Mapscript (bug 692). - mapogr.cpp: Now echos CPLGetLastErrorMsg() results if OGR open fails. - mapraster.c: fixed tile index corruption problem (bug 698) - Mladen Turk's map copying macros in mapcopy.h clean up map cloning and allow for copying of fontset and symbolset. Added cloning tests in python/tests/testCloneMap.py and refactored testing suite (bugs 640 & 701). - Mapscript: removing obsolete python/setup_wnone.py file. - CONFIG MS_NONSQUARE YES now enables non-square pixel mode (mostly for WMS). Changes in mapdraw.c (msDrawMap()) to use the geotransform "hack" to allow non-square pixels. - When using the text/html mime type in a GetFeature request, if the layer's template is not set to a valid file, errors occur. Correction is : the text/html is not advertized by default and will only be advertized if the user has defined "WMS_FEATURE_INFO_MIME_TYPE" "text/html" (bug 736) - Make PHP MapScript's layer->open() produce a PHP Warning instead of a Fatal error (bug 742) - MapServer hash tables are now a structure containing a items pointer to hashObj. See maphash.h for new prototypes of hash table functions. In SWIG mapscript, Map, Layer, and Class metadata are now instances of the new hashTableObj class. fontset.fonts and Map.configoptions are also instances of hashTableObj. The older getMetaData/setMetaData and metadata iterator methods can be deprecated (bug 737). - Mapscript-SWIG: made the arguments of mapObj and layerObj constructors optional. A layerObj can now exist outside of a map and can be added to a mapObj using the insertLayer method. mapObj.removeLayer now returns a copy of the removed Layer rather than an integer (bug 759). - Fixed $map->processTemplate() which was always returning NULL. Bug introduced in version 4.0 in all flavors of MapScript (bug 410) Version 4.2-beta1 (2004-04-17) ------------------------------ - Added support for WMS 1.1.1 in the WMS interface. - Added support for WMS-SLD in client and server mode. - Added support for attribute filters in the WFS interface. - WMS Interface: several fixes to address issues found in running tests against the OGC testsuite. One of the side-effects is that incomplete GetMap requests that used to work in previous versions will produce errors now (see bug 622). - Modified configure scripts to be able to configure/build PHP MapScript using an installed PHP instead of requiring the full source tree. - Added ability to combine multiple WMS connections to the same server into a single request when the layers are adjacent and compatible. (bug 116) - Support POSTed requests without Content-Length set. - Added support for proper classification of non-8bit rasters. - Added support for BYTE rawmode output type. - Added support for multiple bands of output in rawmode. - MySQL joins available - Fixed problems with detection of OGRRegisterAll() with GDAL 1.1.9 in configure due to GDAL's library name change. Fixed a few other minor issues with GDAL/OGR in configure. - Modified configure to disable native TIFF/PNG/JPEG/GIF support by default if GDAL is enabled. You can still enable them explicitly if you like. - Replace wms_style_%s_legendurl, wms_logourl, wms_descriptionurl, wms_dataurl and wms_metadataurl metadata by four new metadata by metadata replaced. The new metadata are called legendurl_width, legendurl_height, legendurl_format, legendurl_href, logourl_width, etc... Old dependency to the metadata with four value in it , space separated, are not kept. - Implement DataURL, MetadataURL and DescriptionURL metadata in mapcontext.c (bug 523) - PHP MapScript's pasteImage() now takes a hex color value (e.g. 0xrrggbb) for the transparent color instead of a color index. (bug 463) - OGR data sources with relative paths are now checked relative to SHAPEPATH first, and if not found then we try again relative to the mapfile location. (bug 295) - There is a new mapObj parameter called MAXSIZE to control maximum image size to serve via the CGI and WMS interfaces. The default is 2048 as before but it can be changed in the map file now. (bug 435) - Added simple dataset for unit and regression tests (bug 453) - PostGIS: added postresql_NOTICE_HANDLER() sending output via msDebug() and only when layer->debug is set (bug 418) - Added Apache version detection in configure and added non-blocking flag on stderr in msDebug() to work around Apache 2.x bug (bug 458) - MapScript rectObj: added optional bounding value args to constructor and extended rectObj class with a toPolygon method (bug 508). - MapScript pointObj: added optional x/y args to constructor (bug 508). - MapScript colorObj: added optional RGB color value args to colorObj constructor, and extended colorObj class with setRGB, setHex, and toHex methods. The hex methods use hex color strings like '#ffffff' rather than '0xffffff' for compatibility with HTML (bug 509). - MapScript outputFormatObj: extended with a getOption method (bug 510). - MapScript imageObj: added optional mapObj argument to the save method resolving bug 549 without breaking current API. Also added optional driver and filename arguments to constructor which allows imageObj instances to be created with a specified driver or from files on disk (bug 530). Added new code to Python MapScript which extends the filename option to Python file-like objects (bug 550). This means StringIO and urllib's network objects! - MapScript classObj and styleObj: added a new styleObj shadow class and extended classObj with getStyle, insertStyle, and removeStyle methods. MapScript now supports multiple styles for dynamically created classes (bug 548). - MapScript layerObj: added getExtent, getNumFeatures extension methods, allowing getShape to access inline features (bug 562). - Added fixes for AMD64/Linux in configure (bug 565) - Removed OGR_STATIC stuff in configure script that used to allow us to build with OGR statically by pointing to the OGR source tree. That means you can only build with OGR when *installed* as part of GDAL, but that's what everyone is doing these days anyway. - Mapscript outputFormatObj: extended constructor to allow format names, and mapObj methods to append and remove output formats from the outputformatlist (bug 511). - New SWIG mapscript development documentation in the spirit of the PHP-Mapscript readme file, but using reST (bug 576). - Paving way for future changes to SWIG mapscript API with new features enabled by NEXT_GENERATION_API symbol (bug 586). - Added ability to set string member variables to NULL in PHP MapScript (bug 591) - New key iterators for map, layer, and class metadata hash tables (bug 434) and fontset fonts hash table (bug 439). - Fixed potential crash when using nquery with a querymap enabled and some layers have a template set at the layer level instead of inside classes (bug 569). - New CONFIG keyword in the MAP object in a .map file to be used to set external configuration parameters such as PROJ_LIB and control of some GDAL and OGR driver behaviours (bug 619) Version 4.0 (2003-08-01) ------------------------ - Fixed problem with truncated expressions (bugs 242 and 340) - Attempt at fixing GD vs libiconv dependency problems (bug 348) - Fixed problem with invalid BoundingBox tag in WMS capabilities (bug 34) - Fixed problems with SIZEUNITS not working properly (bug 373) - Fixed MacOSX configure problems for linking php_mapscript (bug 208) - Fixed problem with reference map marker symbol not showing up (bug 378) - Use in WMS 1.0.0 capabilities instead of (bug 129) - One-to-one and one-to-many joins now work for Xbase files and are available to query templates. Low level one-to-one Xbase joins are available via OGR. Version 4.0-beta2 (2003-07-11) ------------------------------ - Added prototype of FastCGI support in mapserv_fcgi.c (not built by default). - Report full error stack in the mapserv CGI and PHP MapScript (bug 346) - Old index (.qix) format is deprecated (bug 273) - Fixed problem with embedded legend and scalebar that would result in layers being added to the HTML legends (bug 171) - Changed joins (XBase only at this point) over to the open-prepare-next... next-close way of doing things. Compiles fine, but needs more testing. One-to-many support should work now but it needs to be hooked into the template code yet. Last thing before a candidate 4.0 release. - Added ability to generate images in MapScript processQueryTemplate (bug 341) - Added saving of output formats in msSaveMap() - Fixed problem in PHP MapScript with variables that were not dereferenced before their values were changed by the MapScript wrappers (bug 323) - Added support for Web Map Context 1.0.0 - Treat zero-length template values as NULL so that it's possible to set("template", "") from MapScript to make layer non-queryable (bug 338) - Ditched the shapepath argument to the shapefileObj constructor - CARTOLINE join style default changed to MS_CJC_NONE - Tweaked code in legend builder to handle polygon layers slightly different. Now if a polygon layer contains only outlines and no fills (i.e. a polyline) then it is drawn using the zigzag legend shape rather than the box. I'll add legend outlines back in shortly. - Restored legend key outlines (triggered by setting OUTLINECOLOR). If an outline is requested then line symbols are clipped to the outline, otherwise lines are allowed to bleed a pixel or two beyond those boundaries- for most cases this looks fine but for fat lines it is gonna look goofy regardless. In those cases use the KEYIMAGE. - Fixed a bug in the scanline writer so that x coordinates can be in any order when passed in to the function. (bug 336) - Updated loadExpressionString in mapfile.c to be a bit more tolerant of input. Now if a string does not match the logical or regex pattern it is automatically cast as a string expression. Removes the need for silly quotes. Version 4.0-beta1 (2003-06-06) ------------------------------ - Added imagemap outputformat, which makes possible use of client-side imagemaps in browsers. - Added MySQL support for non-spatial OpenGIS Simple Features SQL stored data - msQueryByShape and msQueryByFeature honor layer tolerances. In effect you can to buffered queries now. At the moment only polygon select features are supported, but there's nothing inherent in the underlying computations that says lines won't work as well. - Simple one-to-one joins are working again. Reworked the join code so that table connections are persistent within a join (across joins is a todo). Joins, like layers are wrapped with a connection neutral front end, that sets us up to do MySQL or whatever in addition to XBase. - Removed shapepath argument to all layer access functions (affects MapScript). It's still used but we leverage the layer pointer back to the parent mapObj so the API is cleaner. - Changed default presentation of feature attributes to escape a few problematic characters for HTML display (eg. > becomes >). Added [itemname_raw] substitution to allow access to unaltered data. - Added initial version of Jan Hartman's connection pooling code. - Replaced libwww with libcurl for WMS/WFS client HTTP requests. (libcurl 7.10 required, see http://curl.haxx.se/libcurl/c/) - Added CONNECTION to the list of mapfile parameters that can accept %variable% substitutions when processed by the cgi version. This is useful for passing in username and/or passwords to database data sources. - Added support for DATA and TEMPLATE (header/footer/etc...) filtering using an regex declared in the mapfile (DATAPATTERN and TEMPLATEPATTERN). Certain parameters in a mapfile cannot be changed via a URL without first being filtered. - Added support for environment variable MS_MAPFILE_PATTERN. This allows you to override the default regex in favor of one more restrictive (I would hope) of your own. - Disabled CGI SAVEMAP option. - Removed CGI TEMPLATE option since you can use the map_web_template syntax. Simplifies security maintenance by only having to deal with this option in a single place. - Added offset support (styleObj) for raster based output (GD for sure, not quite sure how OGR output is created although I believe is uses GD anyway). This allows for feature drop shadows and support for cool linear symbols like used to be supported in pre-3.4 versions. These offsets are not scalable at the moment. - Null shapes (attributes but no vertices) are skipped for shapefiles using the msLayerNextShape interface. Otherwise applications should check the shapeObj type member for MS_SHAPE_NULL. - Changed where label cache is allocated and cleared. Now it isn't allocated until drawing takes place. Any old cache is cleared before a new one is allocated. The cache is still intact following rendering for post-processing using MapScript. - Fixed screw up in pre-processing of logical expressions for item lists. Under certain circumstances that list could get corrupted and expressions would fail. - Added NOT operator to expression parser. - Added layer and map level DEBUG options to map file. - Major changes to support vector output (PDF, SWF, GML, ...): imageObj is used by all rendering functions instead of gdImagePtr, New msSaveImage() prototype - Support for GD-2.0, including 24 bits output. Dropped support for GD 1.x - Support for output to any GDAL-supported format via the new OUTPUTFORMAT object. - New styleObj to replace the OVERLAY* parameter in classes. - PostGIS: Added Sean Gillies 's patch for "using unique ". Added "using SRID=#" to specify a spatial reference for an arbitrary sql query. - ... and numerous fixes not listed here... Version 3.6.0-beta1 (2002-04-30) -------------------------------- - MapScript: qitem and qstring params added to layer->queryByAttribute(). Instead of being driven by the layer's FILTER/FILTERITEM, the query by attribute is now driven by the values passed via qitem,qstring, and the layer's FILTER/FILTERITEM are ignored. - Symbol and MapFile changes: ANTIALIAS and FILLED keywords now take a boolean (TRUE/FALSE) argument i.e. ANTIALIAS becomes ANTIALIAS TRUE and FILLED becomes FILLED TRUE - Reference Map: Added options to show a different marker when the reference box becomes too small. See the mapfile reference docs for more details on the new reference object parameters (MARKER, MARKERSIZE, MAXBOXSIZE, MINBOXSIZE) - Added MINSCALE/MAXSCALE at the CLASS level. - Support for tiled OGR datasets. - PHP 4.1.2 and 4.2.0 support for PHP MapScript. - Added LAYER TRANSPARENCY, value between 1-100 - Fixes to the SWIG interface for clean Java build. - New HTML legend templates for CGI and MapScript. See HTML-Legend-HOWTO. - WMS server now supports query results using HTML query templates instead of just plain/text. - Added support functions for thread safety (--with-thread). Still not 100% thread-safe. Version 3.5.0 (2002-12-18) -------------------------- - No Revision history before version 3.5 mapserver-8.6.0/INSTALL.CMAKE000066400000000000000000000222341511405061000153750ustar00rootroot00000000000000CMake Build Instructions ======================== Since version 6.4, MapServer is built with the CMake build tool instead of the previous autotools chain. CMake is opensource and free of charge and is usually included in distribution packages, or can be downloaded and compiled with no third party dependencies. CMake itself does not do the actual compiling of the MapServer source code, it mainly creates platform specific build files that can then be used by standard build utilities (make on unixes, visual studio on windows, xcode on osx, etc...) Install CMake ------------- MapServer now requires at least CMake version 3.0, although the CMake process was first implemented in MapServer 6.4 with CMake 2.6.0. Distro Packaged Version ....................... Linux distributions usually include the cmake package, that can be installed with your usual package manager: apt-get, yum, yast, etc... Installing Your Own ................... Head over to http://www.cmake.org/cmake/resources/software.html to download a source tarball (for unixes) or a binary installer (for windows). If you are building from source, the build process is detailed in the tarball readme files, and consists only in $ tar xzf cmake-x.y.z.tar.gz $ cd cmake-x.y.z $ ./bootstrap $ make # make install Creating the MapServer platform specific project with CMake ----------------------------------------------------------- Although you can run and build from MapServer's source directory as created by downloading a tarball or using a git clone, it is **highly** recommended to run "out-of-source" builds, i.e. having all build files be compiled and created in a different directory than the actual MapServer sources. This allows to have different configurations running alongside each other (e.g. release and debug builds, cross-compiling, enabled features, etc...). Running CMake From the Command Line ................................... mkdir build cd build cmake .. ## fix dependency issues make Running the GUI version of cmake ................................ CMake can be run in graphical mode, in which case the list of available options are presented in a more user-friendly manner mkdir build cd build ccmake .. ## follow instructions, fix dependency issues make Options and Dependencies ........................ Depending on what packages are available in the default locations of your system, the previous "cmake .." step will most probably have failed with messages indicating missing dependencies (by default, MapServer has *many* of those). The error message that CMake prints out should give you a rather good idea of what steps you should take next, depending on whether the failed dependency is a feature you require in your build or not. - Either disable the dependency by rerunning cmake with -DWITH_DEPENDENCY=0, e.g. $ cmake .. -DWITH_CAIRO=0 - Or, if the failed dependency relates to a feature you want built in, and that cmake has not been able to find it's installation location, there are 3 possible reasons: 1 You have not installed the third party package, and/or the third party development headers. Use your standard package manager to install the failing package, along with it's development headers. The development packages on linux usually end with "-dev" or "-devel", e.g. libcairo2-devel , libpng-dev, etc... $ (sudo) apt-get install libcairo-dev $ cmake .. 2 You have installed the third party package in a non standard location, which you must give to cmake so it can find the required headers and libraries $ cmake .. -DCMAKE_PREFIX_PATH=/opt/cairo-1.18.2 Cmake expects these nonstandard prefixes to contain standard subdirectories, i.e. /opt/cairo-1.18.2/include/cairo.h and /opt/cairo-1.18.2/lib/libcairo.so. You can specify multiple prefixes on the cmake command line by separating them with the platform specific separator (e.g. ":" on unixes), e.g. $ cmake .. -DCMAKE_PREFIX_PATH=/opt/cairo-1.18.2:/opt/freeware 3 If you're certain that the packages development headers are installed, and/or that you pointed to a valid installation prefix, but cmake is still failing, then there's an issue with MapServer's cmake setup, and you can bring this up on the mailing list or issue tracker. Available Options ----------------- Following is a list of option, taken from MapServer's CMakeLists.txt configuration file. After the description of the option, the ON/OFF flag states if the option is enabled by default (in which case the cmake step will fail if the dependency cannot be found). All of these can be enabled or disabled by passing "-DWITH_XXX=0" or "-DWITH_XXX=1" to the "cmake .." invocation in order to override a default selection. This Readme file may be out of sync with the actual CMakeLists files shipped. Refer to the CMakeLists.txt file for up-to-date options. - option(WITH_PROJ "Choose if reprojection support should be built in" ON) - option(WITH_KML "Enable native KML output support (requires libxml2 support)" OFF) - option(WITH_SOS "Enable SOS Server support (requires PROJ and libxml2 support)" OFF) - option(WITH_WMS "Enable WMS Server support (requires proj support)" ON) - option(WITH_FRIBIDI "Choose if FriBidi glyph reordering should be enabled (useful for right-to-left languages)(requires harfbuzz)" ON) - option(WITH_HARFBUZZ "Choose if Harfbuzz complex script glyph shaping support should be built in (requires fribidi)" ON) - option(WITH_ICONV "Choose if Iconv Internationalization support should be built in" ON) - option(WITH_CAIRO "Choose if CAIRO rendering support should be built in (required for SVG and PDF output)" ON) - option(WITH_SVGCAIRO "Choose if SVG symbology support (via libsvgcairo) should be built in (requires cairo, libsvg, libsvg-cairo. Incompatible with librsvg)" OFF) - option(WITH_RSVG "Choose if SVG symbology support (via librsvg) should be built in (requires cairo, librsvg. Incompatible with libsvg-cairo)" OFF) - option(WITH_MYSQL "Choose if MYSQL joining support should be built in" OFF) - option(WITH_FCGI "Choose if FastCGI support should be built in" ON) - option(WITH_GEOS "Choose if GEOS geometry operations support should be built in" ON) - option(WITH_POSTGIS "Choose if Postgis input support should be built in" ON) - option(WITH_GDAL "Choose if GDAL input raster support should be built in" ON) - option(WITH_OGR "Choose if OGR/GDAL input vector support should be built in" ON) - option(WITH_CURL "Enable Curl HTTP support (required for wms/wfs client, remote SLDs and pixmap symbols)" OFF) - option(WITH_CLIENT_WMS "Enable Client WMS Layer support (requires CURL and GDAL support)" OFF) - option(WITH_CLIENT_WFS "Enable Client WMS Layer support (requires CURL and OGR support)" OFF) - option(WITH_WFS "Enable WFS Server support (requires PROJ and OGR support)" ON) - option(WITH_WCS "Enable WCS Server support (requires PROJ and GDAL support)" ON) - option(WITH_LIBXML2 "Choose if libxml2 support should be built in (used for sos, wcs 1.1,2.0 and wfs 1.1)" ON) - option(WITH_THREAD_SAFETY "Choose if a thread-safe version of libmapserver should be built (only recommended for some mapscripts)" OFF) - option(WITH_GIF "Enable GIF support (for PIXMAP loading)" ON) - option(WITH_PYTHON "Enable Python mapscript support" OFF) - option(WITH_PHP "Enable PHP mapscript support" OFF) - option(WITH_PERL "Enable Perl mapscript support" OFF) - option(WITH_RUBY "Enable Ruby mapscript support" OFF) - option(WITH_JAVA "Enable Java mapscript support" OFF) - option(WITH_CSHARP "Enable C# mapscript support" OFF) - option(WITH_ORACLESPATIAL "include oracle spatial database input support" OFF) - option(WITH_ORACLE_PLUGIN "include oracle spatial database input support as plugin" OFF) - option(WITH_MSSQL2008 "include mssql 2008 database input support as plugin" OFF) - option(WITH_SDE_PLUGIN "include ArcSDE support as a plugin (must specify SDE_INCLUDE_DIR and SDE_LIBRARY_DIR)." OFF) - option(WITH_SDE "include ArcSDE support. Add -DSDE_VERSION=91 to use 9.1 arcSDE version" OFF) - option(WITH_EXEMPI "include xmp output metadata support" OFF) - option(WITH_XMLMAPFILE "include native xml mapfile support (requires libxslt/libexslt)" OFF) - option(WITH_V8 "include javascript v8 scripting" OFF) The following options are for advanced users, i.e. you should not enable them unless you know what you are doing: - option(BUILD_STATIC "Also build a static version of mapserver" OFF) - option(LINK_STATIC_LIBMAPSERVER "Link to static version of libmapserver (also for mapscripts)" OFF) - option(WITH_APACHE_MODULE "include (experimental) support for apache module" OFF) - option(WITH_GENERIC_NINT "generic rounding" OFF) The following are some common CMake options not specific to MapServer itself: - CMAKE_INSTALL_PREFIX : path where mapserver binaries and libraries should be installed. Defaults to /usr/local on unix. - CMAKE_PREFIX_PATH : platform-specific separator separated list of prefixes where dependencies will be looked for, e.g. "-DCMAKE_PREFIX_PATH=/opt/freeware:/opt/jdk-1.5.6" - CMAKE_BUILD_TYPE : Specify the build type. Usually one of 'Debug' or 'Release', e.g. "-DCMAKE_BUILD_TYPE=Release" "-DCMAKE_BUILD_TYPE=Debug" You can find a more extensive list of cmake variables here: http://www.cmake.org/Wiki/CMake_Useful_Variables mapserver-8.6.0/INSTALL.md000066400000000000000000000006721511405061000151570ustar00rootroot00000000000000Visit https://mapserver.org/ for full documentation and installation instructions. Unix compilation instructions ----------------------------- See [INSTALL.CMAKE](INSTALL.CMAKE) or the document on the MapServer website at https://mapserver.org/installation/unix.html Win32 compilation instructions ------------------------------ See README.WIN32 or the document on the MapServer website at https://mapserver.org/installation/win32.html mapserver-8.6.0/LICENSE.md000066400000000000000000000027631511405061000151360ustar00rootroot00000000000000MapServer Licensing =================== MapServer General ----------------- Copyright (c) 2008-2025 Open Source Geospatial Foundation. Copyright (c) 1996-2008 Regents of the University of Minnesota. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies of this Software or works derived from this Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. FlatGeobuf ---------- Refer to the FlatGeobuf license found at [/src/flatgeobuf/LICENSE](src/flatgeobuf/LICENSE) FlatBuffers ----------- Refer to the FlatBuffers license found at [/src/flatgeobuf/include/flatbuffers/LICENSE](src/flatgeobuf/include/flatbuffers/LICENSE)mapserver-8.6.0/MIGRATION_GUIDE.md000066400000000000000000000011311511405061000163060ustar00rootroot00000000000000***************************************************************************** MapServer Migration Guide ***************************************************************************** The current version of the MapServer Migration Guide is available online at https://mapserver.org/MIGRATION_GUIDE.html. For developers: The main copy of the MIGRATION_GUIDE is now located in the root of the /MapServer/MapServer-documentation source tree ( https://github.com/MapServer/MapServer-documentation ). Developers are welcome and encouraged to edit/update the guide in the documentation tree directly. mapserver-8.6.0/Makefile000066400000000000000000000131331511405061000151630ustar00rootroot00000000000000AUTOTEST_OPTS?=--strict_mode PHP_MAPSCRIPT?=build/src/mapscript/phpng/php_mapscriptng.so PYTHON_MAPSCRIPT_PATH=build/src/mapscript/python JAVA_MAPSCRIPT_PATH=build/src/mapscript/java CSHARP_MAPSCRIPT_PATH=build/src/mapscript/csharp PERL_MAPSCRIPT_PATH=build/src/mapscript/perl BUILDPATH=../../build FLEX=flex YACC=yacc CMAKEFLAGS_MAPSCRIPT_PYTHON=-DWITH_CLIENT_WMS=1 \ -DWITH_CLIENT_WFS=1 -DWITH_KML=1 -DWITH_SOS=1 \ -DWITH_PYTHON=1 -DWITH_THREAD_SAFETY=1 -DWITH_FRIBIDI=1 -DWITH_FCGI=1 -DWITH_EXEMPI=1 \ -DCMAKE_BUILD_TYPE=Release -DWITH_RSVG=1 -DWITH_CURL=1 -DWITH_HARFBUZZ=1 \ ${EXTRA_CMAKEFLAGS} -DLIBMAPSERVER_EXTRA_FLAGS="${LIBMAPSERVER_EXTRA_FLAGS}" \ -DCMAKE_INSTALL_PREFIX=/tmp/install-mapserver CMAKEFLAGS_MAPSCRIPT_PHP=-DWITH_CLIENT_WMS=1 \ -DWITH_CLIENT_WFS=1 -DWITH_KML=1 -DWITH_SOS=1 -DWITH_PHPNG=1 \ -DWITH_PYTHON=0 -DWITH_THREAD_SAFETY=1 -DWITH_FRIBIDI=1 -DWITH_FCGI=1 -DWITH_EXEMPI=1 \ -DCMAKE_BUILD_TYPE=Release -DWITH_RSVG=1 -DWITH_CURL=1 -DWITH_HARFBUZZ=1 \ ${EXTRA_CMAKEFLAGS} -DLIBMAPSERVER_EXTRA_FLAGS="${LIBMAPSERVER_EXTRA_FLAGS}" \ -DCMAKE_INSTALL_PREFIX=/tmp/install-mapserver CMAKEFLAGS_NOCOVERAGE=-DWITH_CLIENT_WMS=1 \ -DWITH_CLIENT_WFS=1 -DWITH_KML=1 -DWITH_SOS=1 -DWITH_CSHARP=1 -DWITH_PHPNG=1 -DWITH_PERL=1 \ -DWITH_PYTHON=1 -DWITH_JAVA=1 -DWITH_THREAD_SAFETY=1 -DWITH_FRIBIDI=1 -DWITH_FCGI=1 -DWITH_EXEMPI=1 \ -DCMAKE_BUILD_TYPE=Release -DWITH_RSVG=1 -DWITH_CURL=1 -DWITH_HARFBUZZ=1 -DWITH_MSSQL2008=ON \ ${EXTRA_CMAKEFLAGS} -DLIBMAPSERVER_EXTRA_FLAGS="${LIBMAPSERVER_EXTRA_FLAGS}" \ -DCMAKE_INSTALL_PREFIX=/tmp/install-mapserver CMAKEFLAGS=-DCMAKE_C_FLAGS="--coverage ${CMAKE_C_FLAGS}" -DCMAKE_CXX_FLAGS="--coverage ${CMAKE_CXX_FLAGS}" \ -DCMAKE_SHARED_LINKER_FLAGS="-lgcov" ${CMAKEFLAGS_NOCOVERAGE} all: cmakebuild cmakebuild: lexer parser if test ! -s build/Makefile; then mkdir -p build ; cd build ; cmake .. $(CMAKEFLAGS); fi cd build && $(MAKE) $(MFLAGS) && ctest -V cmakebuild_nocoverage: lexer parser if test ! -s build_nocoverage/Makefile; then mkdir -p build_nocoverage ; cd build_nocoverage ; cmake .. $(CMAKEFLAGS_NOCOVERAGE); fi cd build_nocoverage && $(MAKE) $(MFLAGS) && $(MAKE) $(MFLAGS) install cmakebuild_mapscript_python: lexer parser if test ! -s build/Makefile; then mkdir -p build ; cd build ; cmake .. $(CMAKEFLAGS_MAPSCRIPT_PYTHON); fi cd build && $(MAKE) $(MFLAGS) cmakebuild_mapscript_php: lexer parser if test ! -s build/Makefile; then mkdir -p build ; cd build ; cmake .. $(CMAKEFLAGS_MAPSCRIPT_PHP); fi cd build && $(MAKE) $(MFLAGS) warning: $(error "This Makefile is used to run the \"test\" target") api-testcase: cd msautotest/api && rm -f result/* && export PATH=$(BUILDPATH):$(PATH) && (./run_test.py $(AUTOTEST_OPTS) || /bin/true) config-testcase: cd msautotest/config && rm -f result/* && export PATH=$(BUILDPATH):$(PATH) && (./run_test.py $(AUTOTEST_OPTS) || /bin/true) wxs-testcase: cd msautotest/wxs && chmod 777 tmp && rm -f result/* && export PATH=$(BUILDPATH):$(PATH) && (./run_test.py $(AUTOTEST_OPTS) || /bin/true) renderers-testcase: cd msautotest/renderers && rm -f result/* && export PATH=$(BUILDPATH):$(PATH) && (./run_test.py $(AUTOTEST_OPTS) || /bin/true) misc-testcase: cd msautotest/misc && rm -f result/* && export PATH=$(BUILDPATH):$(PATH) && (./run_test.py $(AUTOTEST_OPTS) || /bin/true) gdal-testcase: cd msautotest/gdal && rm -f result/* && export PATH=$(BUILDPATH):$(PATH) && (./run_test.py $(AUTOTEST_OPTS) || /bin/true) query-testcase: cd msautotest/query && rm -f result/* && export PATH=$(BUILDPATH):$(PATH) && (./run_test.py $(AUTOTEST_OPTS) || /bin/true) sld-testcase: cd msautotest/sld && rm -f result/* && export PATH=$(BUILDPATH):$(PATH) && (./run_test.py $(AUTOTEST_OPTS) || /bin/true) mspython-testcase: test -f "$(PYTHON_MAPSCRIPT_PATH)/_mapscript.so" && (export PYTHONPATH="../../$(PYTHON_MAPSCRIPT_PATH)" && cd msautotest/mspython && python run_all_tests.py) mspython-wheel: cd build && cmake --build . --target pythonmapscript-wheel php-testcase: test -f "$(PHP_MAPSCRIPT)" && (export PHP_MAPSCRIPT_SO="../../$(PHP_MAPSCRIPT)" && cd msautotest/php && ./run_test.sh) java-testcase: test -d "$(JAVA_MAPSCRIPT_PATH)" && (export JAVA_MAPSCRIPT_SO="../../../$(JAVA_MAPSCRIPT_PATH)" && cd src/mapscript/java && ./run_test.sh) csharp-testcase: test -d "$(CSHARP_MAPSCRIPT_PATH)" && (export CSHARP_MAPSCRIPT_SO="../../../$(CSHARP_MAPSCRIPT_PATH)" && cd src/mapscript/csharp && ./run_test.sh) perl-testcase: cd "$(PERL_MAPSCRIPT_PATH)" \ && export PERL5LIB=`pwd` \ && prove tests \ && perl examples/RFC24.pl ../../../../tests/test.map \ && perl examples/shp_in_shp.pl --infile1 ../../../../tests/line.shp --infile1_shpid 0 --infile2 ../../../../tests/polygon.shp --infile2_shpid 0 \ && perl examples/dump.pl --file ../../../../tests/line.shp \ && perl examples/thin.pl --input ../../../../tests/polygon --output examples/junk --tolerance=5 test: cmakebuild @$(MAKE) $(MFLAGS) api-testcase config-testcase wxs-testcase renderers-testcase misc-testcase gdal-testcase query-testcase sld-testcase mspython-testcase @./scripts/print-test-results.sh @$(MAKE) $(MFLAGS) php-testcase @$(MAKE) $(MFLAGS) csharp-testcase @$(MAKE) $(MFLAGS) perl-testcase asan_compatible_tests: cmakebuild @$(MAKE) $(MFLAGS) api-testcase config-testcase wxs-testcase renderers-testcase misc-testcase gdal-testcase query-testcase sld-testcase @./scripts/print-test-results.sh lexer: maplexer.c parser: mapparser.c maplexer.c: src/maplexer.l $(FLEX) --nounistd -Pmsyy -i -o$(CURDIR)/src/maplexer.c src/maplexer.l mapparser.c: src/mapparser.y $(YACC) -d -o$(CURDIR)/src/mapparser.c src/mapparser.y mapserver-8.6.0/README.WIN32000066400000000000000000000256311511405061000152120ustar00rootroot00000000000000-------------------------------------------------------------------- README.WIN32 - Microsoft Visual C++ Build instructions for MapServer -------------------------------------------------------------------- IMPORTANT - READ THIS FIRST: ---------------------------- The Win32 build process is not very friendly for unexperienced users. So it is strongly recommended that you use one of the precompiled binaries available on the MapServer site: http://www.mapserver.org/download.html#windows There are precompiled Win32 binaries available for the last stable release and the latest nightly build and they include the most common options... so you shouldn't have to compile your own executables. If for some reason you still decide to compile Win32 binaries yourself, then don't do it unless you really know what you're doing... and hopefully the rest of this file contains some hints that may help you. Good Luck! -------------------------------------------------------------------- The easyest way to build Mapserver on Windows on your own is to use the build-system from http://gisinternals.com/. GISInternals provide a complete set of sources and dependencies and even makefiles for the full version of Visual Studio (not Express or Community). You don't have to download and compile them all by your own. If you are not using full version of Visual Studio you can not use the makefiles from GISInternals but you can still use the downloads to make your life easier. Building with the full version of Visual Studio is easy. Download the SDK for you version and follow the readme inside the packages. This Readme will cover the compilation with Visual Studio 2012 Express on Windows with CMake and the GISInternals-Packages for the following reasons: - not everybody wants to buy Visual Studio and there is no reason to force you to buy it just tu build Mapserver on Windows - CMake is the configuration-system for Linux. Why should you use something else which needs to be maintainerd? - as of today, PHP-Mapscript is not supported for PHP-7. PHP-5.6 is build with VC11. To make PHP-Mapscript compatible with the downloadable PHP-Version you need to build with VC11 which is Visual Studio 2012. - GISInternals Downloads contain most dependencies. it's way easier If you want to compile Mapserver with any other version of Visual Studio you can for sure use this documentation as help but maybe, some things here won't work for you. -------------------------------------------------------------------- Prerequisites -------------------------------------------------------------------- To build Mapserver on Windows with Visual Studio 2012 Express you need Visual Studio 2012 Express installed. Install CMake (https://cmake.org/) and add CMake bin-directory to your PATH environment variable. You can even to this after opening VS2012 x86 Native Tools Command Prompt by entering: set PATH=%PATH%;"C:\Program Files\CMake\bin" ... if CMake is installed to "C:\Program Files\CMake" ;) -------------------------------------------------------------------- Downloading dependencies -------------------------------------------------------------------- For our first build, we will use stable releases to build mapserver. Download MSVC 2012 win32 Packages for GDAL-2.1.2 and Mapserver-7.0.2 from http://gisinternals.com/release.php. We need "Compiled binaries in a single .zip package", "GDAL and MapServer sources" and "Compiled libraries and headers". Download the MSVC 2012 win32 Development Kit from http://gisinternals.com/sdk.php. Extract everything to C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2. There should be the directories inside now: bin, doc, gdal, include, lib, regex-0.12, relase-1700, ... After you got this done, feel free to use other packages which fit your needs better. -------------------------------------------------------------------- Mapserver-sources -------------------------------------------------------------------- Download at least Mapserver-7.0.3 or current 7.0-Branch from github and extract or clone from github to C:\dev\work\mapserver. -------------------------------------------------------------------- Building Mapserver -------------------------------------------------------------------- After downloading and extracting everything, to build Mapserver, follow this steps: 1. Open VS2012 x86 Native Tools Command Prompt (i'm german, hope it is translated correctly). 2. Add CMake-bin to your PATH: set PATH=%PATH%;"C:\Program Files\CMake\bin" 3. Create build-Directory: mkdir C:\dev\work\mapserver\build cd C:\dev\work\mapserver\build 4. Configure: cmake .. -G "NMake Makefiles" -DBUILD_SHARED_LIBS=1 -DCMAKE_BUILD_TYPE=Release -Wno-dev cmake .. -DCMAKE_PREFIX_PATH=C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2;C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\bin;C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\lib;C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\include cmake .. -DREGEX_DIR=C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\regex-0.12 cmake .. -DWITH_POSTGIS=0 -DWITH_SOS=1 -DWITH_KML=1 cmake .. -DWITH_CLIENT_WMS=1 -DWITH_CLIENT_WFS=1 cmake .. -DWITH_THREAD_SAFETY=1 -DWITH_FCGI=1 cmake .. -DWITH_CAIRO=1 -DCAIRO_LIBRARY=C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\lib\cairo.lib cmake .. -DWITH_SVGCAIRO=1 -DSVGCAIRO_LIBRARY=C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\lib\libsvg-cairo.lib cmake .. -DSVG_LIBRARY=1 -DSVG_LIBRARY=C:\dev\work\release-1700-gdal-2-1-2-mapserver-7-0-2\lib\libsvg.lib 5. build nmake That's it. You can use all CMake parameters and options as you are used from CMake to fit mapserver to your needs from here. Enjoy! -------------------------------------------------------------------- MapScript -------------------------------------------------------------------- To compile the various versions of MapScript (Perl, PHP, etc) first compile the main mapserver directory and then see the README files in the mapscript/perl, mapscript/php or mapscript/python directory for specific instructions. -------------------------------------------------------------------- Dependencies Part 2 -------------------------------------------------------------------- The following sections describe how to get mapserver dependencies when not downloading GISInternals packages. -------------------------------------------------------------------- GD library -------------------------------------------------------------------- - MapServer uses the GD library from http://boutell.com/ and the Win32 makefiles are set by default to work with the pre-built GD version 2.0.33 provided by Boutell.com. These predefine "gdwin32" binaries include freetype2, libpng, libjpeg, libz, and libgif built-in. This is very convenient to get a mapserver build going quickly. If you are building GD and it's supporting libraries (libpng, libjpeg, libgif, and freetype) from source then it is very important to make sure that you update the -DUSE_GD_* flags and various subcomponent paths in the nmake.opt. You will also have to take great care to build the various components in a way that is compatible with MapServer. For instance, if the various components are statically linked into MapServer you will need to use the same build options (ie. /MT or /MT) for all components. Here are some useful pointers: - The original GD library: http://boutell.com/gd/ - libpng: http://www.libpng.org/pub/png/libpng.html - zlib: http://www.info-zip.org/pub/infozip/zlib/ - libjpeg: ftp://ftp.uu.net/graphics/jpeg/ - Freetype: http://www.freetype.org/download.html -------------------------------------------------------------------- REGEX library -------------------------------------------------------------------- - MapServer uses the REGEX library which is standard on all the Unix systems that I know of, but does not come with VC++. If the MapServer distribution did not include a copy of the REGEX library, then you can get a copy from: ftp://ftp.gnu.org/pub/gnu/regex/regex-0.12.tar.gz The default in the nmake.opt is set to compile with GNU regex-0.12 located in the "regex-0.12" directory. - If you are planning to compile the PHP3_MAPSCRIPT.DLL module, then it is important to make sure that the main Makefile.vc creates MAPSERVER.LIB with the same version of REGEX that PHP uses. See the notes in the main Makefile.vc about that. -------------------------------------------------------------------- Notes on Freetype build. -------------------------------------------------------------------- - You can use the Visual Workspace in freetype/lib/arch/win32 to build the library. -------------------------------------------------------------------- Notes on the proj module -------------------------------------------------------------------- - The Proj.4 (cartographic projection routines) is located at http://www.remotesensing.org/proj/ Note on the epsg files location and the nad directory : * there is an environnemnt variable PROJ_LIB_DIR that can be set to locate the directory where the epsg file is located * if you build this module, at the top of the makefile (./src/makefile.vc), you can set the PROJ_LIB variable and this setting will be used to locate the proj support files. ---------------------------------------------------------------------- Notes on libcurl ---------------------------------------------------------------------- Notes libcurl : used to support WMS client connection Mapserver 5.x is using libcurl instead of libwww for WMS client support. - the library is located at http://curl.haxx.se/download.html Quick notes on how to build the library using MSVC++: - Download and extract the library (at this time it is known to work with version 7.10.2 or more recent) - Open the workspace curlib.dsw located under curl-XXX/lib - Build libcurl.dll. Note that the default active configuration of the project is Win32 Debug. You can modify the configuration to Release version (Build/Set Active Configuration) Notes on mapserver's nmake.opt modifications : - uncomment the flag WMSCLIENT= -DUSE_WMS_LYR - uncomment and modify according to your installation the flags related to libcurl : * CURL_INC = -I../curl-7.10.2/include * CURL_LIB = ../curl-7.10.2/lib/Release/libcurl.lib * WINSOCK_LIB = "C:\Program Files\Microsoft Visual Studio\VC98\Lib\WSOCK32.LIB" You also need to install the libcurl.dll in your system directory. (The dll will be located in libc-XXX/lib/Release abfter your build of the library) ------------------------------------------------------------ Notes on GDAL ------------------------------------------------------------ - If you are compiling the GDAL library (http://www.gdal.org/) with the PNG support, make sure that the libpng that you use in mapserver is the same as the one used in GDAL. $Id$ mapserver-8.6.0/README.md000066400000000000000000000062501511405061000150040ustar00rootroot00000000000000MapServer ========= [![Build Status](https://github.com/mapserver/mapserver/actions/workflows/build.yml/badge.svg)](https://github.com/mapserver/mapserver/actions?query=workflow%3A%22build%22+branch%3Amain) [![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/vw1n07095a8bg23u?svg=true)](https://ci.appveyor.com/project/mapserver/mapserver) [![Coveralls Status](https://coveralls.io/repos/github/MapServer/MapServer/badge.svg?branch=main)](https://coveralls.io/github/MapServer/MapServer?branch=main) [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.6994443.svg)](https://doi.org/10.5281/zenodo.6994443) [![Release](https://img.shields.io/github/v/release/MapServer/MapServer)](https://github.com/MapServer/MapServer/releases) ------- Summary ------- MapServer is a system for developing web-based GIS applications. The basic system consists of a CGI program that can be configured to respond to a variety of spatial requests like making maps, scalebars, and point, area and feature queries. Virtually all aspects of an application, from web interface to map appearance can be developed without any programming. For the more ambitious user, MapServer applications can be enhanced using Python, PHP, Java, JavaScript or many other web technologies. For more information and complete documentation please visit: https://mapserver.org/ Bug reports and enhancement submissions can be reported in the MapServer issue tracker at the following url. If you do make changes and/or enhancements, please let us know so that they might be incorporated into future releases. https://github.com/MapServer/MapServer/issues Join the MapServer user mailing list online at: https://mapserver.org/community/lists.html Credits ------- MapServer was originally written by Stephen Lime. Major funding for development of MapServer has been provided by NASA through cooperative argreements with the University of Minnesota, Department of Forest Resources. PHP/MapScript developed by DM Solutions Group. GDAL/OGR support and significant WMS support provided by DM Solutions Group which received funding support from Canadian Government's GeoConnections Program and the Canadian Forest Service. Raster support developed by Pete Olson of the State of Minnesota, Land Management Information Center, and maintained by Frank Warmerdam (DM Solutions). PostGIS spatial database support provided by Dave Blasby of Refractions Research. PDF support developed by Jeff Spielberg and Jamie Wall of Market Insite Group, Inc. OracleSpatial support developed by Rodrigo Cabral of CTTMAR/UNIVALI, Brazil. Portions Copyright (c) 1998 State of Minnesota, Land Management Information Center. Portions derived from Shapelib, Copyright 1995-1999 Frank Warmerdam. Supporting packages are covered by their own copyrights. License ------- See [LICENSE.md](LICENSE.md) Security policy --------------- See [SECURITY.md](SECURITY.md) How to Contribute ----------------- See [CONTRIBUTING.md](CONTRIBUTING.md) Documentation Repository ------------------------ Use the separate [MapServer-documentation](https://github.com/MapServer/MapServer-documentation) repository for filing documentation tickets and changes.mapserver-8.6.0/SECURITY.md000066400000000000000000000061411511405061000153150ustar00rootroot00000000000000# MapServer Security Policy ## Reporting a Vulnerability in MapServer Security/vulnerability reports should not be submitted through GitHub tickets or the public mailing lists, but instead please provide details to the Project Steering Committee via the GitHub [Report a vulnerability](https://github.com/MapServer/MapServer/security/advisories/new) option link at the top of this page, or send your report to the email address: **mapserver-security nospam @ osgeo.org** (remove the blanks and ‘nospam’). Please follow the general guidelines for bug submissions, when describing the vulnerability (see https://mapserver.org/development/bugs.html). ## Supported Versions The MapServer PSC (Project Steering Committee) will release patches for security vulnerabilities for the last release branch of the **two most recent release series** (such as 8.x, 7.x, 6.x, etc..., where "x" is the most recent release in the series, such as: 7.6.6 being supported, but not 7.6.5). For example, once 8.8 is released, support for 8.6 will be dropped. Patches will only be provided **for a period of three years** from the release date of the current series. For example, as 8.6 has been released, now 8.6.x will be supported/patched (7.6.x support ended on 2025-09-12, which was three years from the date of the 8.0 series release). Currently, the following versions are supported: | Version | Supported | Support Until | | ------- | ------------------ |-------------- | | 8.6.x | :white_check_mark: | | | 8.4.x | :x: | | | 8.2.x | :x: | | | 8.0.x | :x: | | | 7.6.x | :x: | 2025-09-12 | | 7.4.x | :x: | | | 7.2.x | :x: | | | 7.0.x | :x: | | | 6.4.x | :x: | | | < 6.4 | :x: | | - _MapServer 8.6.0 was released on 2025-12-03_ - _MapServer 8.4.0 was released on 2025-01-15_ - _MapServer 8.2.0 was released on 2024-07-08_ - _MapServer 8.0.0 was released on 2022-09-12_ - _MapServer 7.0.0 was released on 2015-07-24_ ## Version Numbering: Explained version x.y.z means: **x** - Major release series number. - Major releases indicate substantial changes to the software and backwards compatibility is not guaranteed across series. Current release series is 8. **y** - Minor release series number. - Minor releases indicate smaller, functional additions or improvements to the software and should be generally backwards compatible within a major release series. Users should be able to confidently upgrade from one minor release to another within the same release series, so from 7.4.x to 7.6.x. **z** - Point release series number. - Point releases indicate maintenance releases - usually a combination of bug and security fixes and perhaps small feature additions. Backwards compatibility should be preserved and users should be able to confidently upgrade between point releases within the same release series, so from 7.6.4 to 7.6.5. mapserver-8.6.0/Vagrantfile000066400000000000000000000032431511405061000157110ustar00rootroot00000000000000# -*- mode: ruby -*- # vi: set ft=ruby : require 'socket' require 'fileutils' # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" $set_environment_variables = < {% include "footer.html" %} mapserver-8.6.0/share/ogcapi/templates/html-bootstrap/collection-items.html000066400000000000000000000101461511405061000272050ustar00rootroot00000000000000{% include "header.html" %} {% set show_prev_link = false %} {% set show_next_link = false %} {% for link in response.links %} {% if link.rel == "alternate" %}{% set json_link = link %}{% endif %} {% if link.rel == "prev" %}{% set prev_link = link %}{% set show_prev_link = true %}{% endif %} {% if link.rel == "next" %}{% set next_link = link %}{% set show_next_link = true %}{% endif %} {% endfor %}

{{ template.title }} - Collection Items: {{ response.collection.title }}

Loading...

Number of matching items: {{ response.numberMatched }}
Number of returned items: {{ response.numberReturned }}
Page: of

{% if show_prev_link == true %} {% endif %}
{% if show_next_link == true %} {% endif %}
{% if response.features %} {% for key, value in response.features.0.properties %} {% endfor %} {% endif %} {% for feature in response.features %} {% for key, value in feature.properties %} {% endfor %} {% endfor %}
ID{{ key }}
{{ feature.id }}{{ value }}
{% include "footer.html" %} mapserver-8.6.0/share/ogcapi/templates/html-bootstrap/collection.html000066400000000000000000000045151511405061000260710ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Collection: {{ response.title }}

{{ response.description }}

{% if existsIn(response, "keywords") and length(response.keywords) > 0 %}

{% for keyword in response.keywords %} {{ keyword }} {% endfor %}

{% endif %} {% if existsIn(response, "storageCrs") %}

Storage CRS: {{ response.storageCrs }}

{% endif %} {% if existsIn(response, "crs") %}

Supported CRS:

    {% for href in response.crs %}
  • {{ href }}
  • {% endfor %}

{% endif %}

Links

Loading...
{% include "footer.html" %} mapserver-8.6.0/share/ogcapi/templates/html-bootstrap/collections.html000066400000000000000000000022301511405061000262440ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Collections

{%- for collection in response.collections %} {% endfor -%}
# Title Type Description
{{ loop.index1 }} {{ collection.title }} {{ collection.itemType }} {{ collection.description }}
{%- include "footer.html" -%} mapserver-8.6.0/share/ogcapi/templates/html-bootstrap/conformance.html000066400000000000000000000014071511405061000262250ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Conformance

This API implements the conformance classes from standards and community specifications that are listed below.

Links

    {% for url in response.conformsTo %}
  • {{ url }}
  • {% endfor %}
{% include "footer.html" %} mapserver-8.6.0/share/ogcapi/templates/html-bootstrap/debug.html000066400000000000000000000007311511405061000250200ustar00rootroot00000000000000{% if existsIn(template.tags, "debug") %} {% if template.tags.debug == "true" %}

Template Data

API Root: {{ template.api_root }}
Path: {{ template.path }}
Params: {{ template.params }}
Extra Params: {{ {{ template.extra_params }}
Title: {{ template.title }}
Tags: {{ template.tags }}

{% endif %} {% endif %} mapserver-8.6.0/share/ogcapi/templates/html-bootstrap/footer.html000066400000000000000000000001161511405061000252250ustar00rootroot00000000000000 {% include "debug.html" %} mapserver-8.6.0/share/ogcapi/templates/html-bootstrap/header.html000066400000000000000000000470221511405061000251660ustar00rootroot00000000000000 {{ template.title }}
mapserver-8.6.0/share/ogcapi/templates/html-bootstrap/landing.html000066400000000000000000000010361511405061000253450ustar00rootroot00000000000000{% include "header.html" %}

{{ response.title }}

{{ response.description }}

Links

{% include "footer.html" %} mapserver-8.6.0/share/ogcapi/templates/html-bootstrap/openapi.html000066400000000000000000000034531511405061000253710ustar00rootroot00000000000000 Swagger UI - {{ template.title }}
mapserver-8.6.0/share/ogcapi/templates/html-index-bootstrap/000077500000000000000000000000001511405061000241505ustar00rootroot00000000000000mapserver-8.6.0/share/ogcapi/templates/html-index-bootstrap/footer.html000066400000000000000000000000531511405061000263320ustar00rootroot00000000000000
mapserver-8.6.0/share/ogcapi/templates/html-index-bootstrap/header.html000066400000000000000000000443771511405061000263050ustar00rootroot00000000000000 MapServer Landing Page
mapserver-8.6.0/share/ogcapi/templates/html-index-bootstrap/landing.html000066400000000000000000000024431511405061000264550ustar00rootroot00000000000000{% include "header.html" %}

MapServer Homepage

This page lists all available Mapfiles hosted by MapServer.

Links

{% for link in response.linkset -%} {% endfor %}
# Key Name Layer Count HTML Documentation JSON
{{ loop.index1 }} {{ link.key }} {{ link.title }} {{ link.layer-count }} {{ link.service-doc.0.title }} {{ link.service-desc.0.title }}
{% include "footer.html" -%}mapserver-8.6.0/share/ogcapi/templates/html-index-bootstrap/map.html000066400000000000000000000035711511405061000256210ustar00rootroot00000000000000{% include "header.html" %}

MapServer Mapfile Landing Page

  • Title: {{response.title}}
  • Layer Count: {{response.layer-count}}
  • Map Name: {{response.name}}

Below are all the services available for this Mapfile.

{% set index = 1 -%} {% for link in response.linkset -%} {% if existsIn(link, "service-doc") -%} {% for service in link.service-doc -%} {% set index = index + 1 -%} {% endfor -%} {% endif -%} {% if existsIn(link, "service-desc") -%} {% for service in link.service-desc -%} {% set index = index + 1 -%} {% endfor -%} {% endif -%} {% endfor -%}
# Type Service Title
{{ index }} {{ service.service }} {{ service.title }} {{ link.title }}
{{ index }} {{ service.service }} {{ service.title }} {{ link.title }}
{% include "footer.html" -%}mapserver-8.6.0/share/ogcapi/templates/html-index-plain/000077500000000000000000000000001511405061000232365ustar00rootroot00000000000000mapserver-8.6.0/share/ogcapi/templates/html-index-plain/footer.html000066400000000000000000000000171511405061000254200ustar00rootroot00000000000000 mapserver-8.6.0/share/ogcapi/templates/html-index-plain/header.html000066400000000000000000000001771511405061000253610ustar00rootroot00000000000000 MapServer Landing Page mapserver-8.6.0/share/ogcapi/templates/html-index-plain/landing.html000066400000000000000000000015441511405061000255440ustar00rootroot00000000000000{% include "header.html" %}

MapServer Homepage

This page lists all available Mapfiles hosted by MapServer.

{% for link in response.linkset -%} {% endfor %}
# Key Name Layer Count HTML Documentation JSON
{{ loop.index1 }} {{ link.key }} {{ link.title }} {{ link.layer-count }} {{ link.service-doc.0.title }} {{ link.service-desc.0.title }}
{% include "footer.html" -%} mapserver-8.6.0/share/ogcapi/templates/html-index-plain/map.html000066400000000000000000000025731511405061000247100ustar00rootroot00000000000000{% include "header.html" %}

MapServer Mapfile Landing Page

  • Title: {{response.title}}
  • Layer Count: {{response.layer-count}}
  • Map Name: {{response.name}}

Below are all the services available for this Mapfile.

{% set index = 1 -%} {% for link in response.linkset -%} {% if existsIn(link, "service-doc") -%} {% for service in link.service-doc -%} {% set index = index + 1 -%} {% endfor -%} {% endif -%} {% if existsIn(link, "service-desc") -%} {% for service in link.service-desc -%} {% set index = index + 1 -%} {% endfor -%} {% endif -%} {% endfor -%}
# Type Service Title
{{ index }} {{ service.service }} {{ service.title }} {{ link.title }}
{{ index }} {{ service.service }} {{ service.title }} {{ link.title }}
{% include "footer.html" -%}mapserver-8.6.0/share/ogcapi/templates/html-plain/000077500000000000000000000000001511405061000221315ustar00rootroot00000000000000mapserver-8.6.0/share/ogcapi/templates/html-plain/collection-item.html000066400000000000000000000004501511405061000261050ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Collection Item: {{ response.collection.title }}

Properties:

  • ID: {{ response.id }}
  • {% for key, value in response.properties %}
  • {{ key }}: {{ value }}
  • {% endfor %}
{% include "footer.html" %} mapserver-8.6.0/share/ogcapi/templates/html-plain/collection-items.html000066400000000000000000000015341511405061000262740ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Collection Items: {{ response.collection.title }}

Number of matching items: {{ response.numberMatched }}
Number of returned items: {{ response.numberReturned }}

{% if response.features %} {% for key, value in response.features.0.properties %} {% endfor %} {% endif %} {% for feature in response.features %} {% for key, value in feature.properties %} {% endfor %} {% endfor %}
ID{{ key }}
{{ feature.id }}{{ value }}
{% include "footer.html" %} mapserver-8.6.0/share/ogcapi/templates/html-plain/collection.html000066400000000000000000000014451511405061000251560ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Collection: {{ response.title }}

{{ response.description }}

{% if existsIn(response, "keywords") and length(response.keywords) > 0 %}

Keywords

    {% for keyword in response.keywords %}
  • {{ keyword }}
  • {% endfor %}
{% endif %} {% if existsIn(response, "storageCrs") %}

Storage CRS

{{ response.storageCrs }} {% endif %} {% if existsIn(response, "crs") %}

Supported CRS

    {% for href in response.crs %}
  • {{ href }}
  • {% endfor %}
{% endif %}

Links

{% include "footer.html" %} mapserver-8.6.0/share/ogcapi/templates/html-plain/collections.html000066400000000000000000000011361511405061000253360ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Collections

{%- for collection in response.collections %} {% endfor -%}
# Title Type Description
{{ loop.index1 }} {{ collection.title }} {{ collection.itemType }} {{ collection.description }}
{%- include "footer.html" -%} mapserver-8.6.0/share/ogcapi/templates/html-plain/conformance.html000066400000000000000000000005501511405061000253110ustar00rootroot00000000000000{% include "header.html" %}

{{ template.title }} - Conformance

This API implements the conformance classes from standards and community specifications that are listed below.

Links

    {% for url in response.conformsTo %}
  • {{ url }}
  • {% endfor %}
{% include "footer.html" %} mapserver-8.6.0/share/ogcapi/templates/html-plain/debug.html000066400000000000000000000005561511405061000241130ustar00rootroot00000000000000{% if existsIn(template.tags, "debug") %} {% if template.tags.debug == "true" %}

Template Data

API Root: {{ template.api_root }}
Path: {{ template.path }}
Params: {{ template.params }}
Extra Params: {{ {{ template.extra_params }}
Title: {{ template.title }}
Tags: {{ template.tags }}

{% endif %} {% endif %} mapserver-8.6.0/share/ogcapi/templates/html-plain/footer.html000066400000000000000000000000611511405061000243120ustar00rootroot00000000000000 {% include "debug.html" %} mapserver-8.6.0/share/ogcapi/templates/html-plain/header.html000066400000000000000000000002001511405061000242370ustar00rootroot00000000000000 {{ template.title }} mapserver-8.6.0/share/ogcapi/templates/html-plain/landing.html000066400000000000000000000004021511405061000244270ustar00rootroot00000000000000{% include "header.html" %}

{{ response.title }}

{{ response.description }}

Links

{% include "footer.html" %} mapserver-8.6.0/share/ogcapi/templates/html-plain/openapi.html000066400000000000000000000034531511405061000244570ustar00rootroot00000000000000 Swagger UI - {{ template.title }}
mapserver-8.6.0/src/000077500000000000000000000000001511405061000143115ustar00rootroot00000000000000mapserver-8.6.0/src/apache/000077500000000000000000000000001511405061000155325ustar00rootroot00000000000000mapserver-8.6.0/src/apache/CMakeLists.txt000066400000000000000000000025571511405061000203030ustar00rootroot00000000000000add_library(mod_mapserver MODULE mod_mapserver.c) target_link_libraries(mod_mapserver ${MAPSERVER_LIBMAPSERVER}) set_target_properties(mod_mapserver PROPERTIES PREFIX "") IF(APPLE) if(HTTPD_EXECUTABLE) if(XCODE) SET(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -bundle_loader ${HTTPD_EXECUTABLE}") else(XCODE) SET(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "${CMAKE_SHARED_MODULE_CREATE_C_FLAGS} -bundle_loader ${HTTPD_EXECUTABLE}") endif(XCODE) else(HTTPD_EXECUTABLE) if(XCODE) SET(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -undefined dynamic_lookup") else(XCODE) SET(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "${CMAKE_SHARED_MODULE_CREATE_C_FLAGS} -Wl,-undefined,dynamic_lookup") endif(XCODE) endif(HTTPD_EXECUTABLE) ENDIF(APPLE) find_package(APACHE) if(APACHE_FOUND) include_directories(${APACHE_INCLUDE_DIR}) else(APACHE_FOUND) report_mandatory_not_found(APACHE) endif(APACHE_FOUND) find_package(APR) if(APR_FOUND) include_directories(${APR_INCLUDE_DIR}) target_link_libraries(mod_mapserver ${APR_LIBRARY}) if(DEFINED APR_CPPFLAGS) add_definitions("${APR_CPPFLAGS}") endif(DEFINED APR_CPPFLAGS) else(APR_FOUND) report_mandatory_not_found(APR) endif(APR_FOUND) if(APACHE_MODULE_DIR) INSTALL(TARGETS mod_mapserver DESTINATION ${APACHE_MODULE_DIR}) endif(APACHE_MODULE_DIR) mapserver-8.6.0/src/apache/mod_mapserver.c000066400000000000000000000337341511405061000205530ustar00rootroot00000000000000/* * mod_mapserver.c -- Apache sample wms module */ #include "httpd.h" #include "http_config.h" #include "http_protocol.h" #include "http_log.h" #include "ap_config.h" #include "apr.h" #include "apr_strings.h" #include "apr_tables.h" #include "apr_file_info.h" #include "../mapserver.h" /* for mapObj */ #include "../cgiutil.h" #include "../apps/mapserv.h" module AP_MODULE_DECLARE_DATA mapserver_module; typedef struct { apr_pool_t *config_pool; apr_time_t mtime; char *mapfile_name; char *uri; mapObj *map; } mapserver_dir_config; /* These are the IO redirection hooks. They are mostly copied over from * mapio.c. Note that cbData contains Apache's request_rec! */ static int msIO_apacheWrite(void *cbData, void *data, int byteCount) { /* simply use the block writing function which is very similar to fwrite */ return ap_rwrite(data, byteCount, (request_rec *)cbData); } static int msIO_apacheError(void *cbData, void *data, int byteCount) { /* error reporting is done through the log file... */ ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "%s", (char *)data); return strlen((char *)data); } int msIO_installApacheRedirect(request_rec *r) { msIOContext stdout_ctx, stderr_ctx; stdout_ctx.label = "apache"; stdout_ctx.write_channel = MS_TRUE; stdout_ctx.readWriteFunc = msIO_apacheWrite; stdout_ctx.cbData = (void *)r; stderr_ctx.label = "apache"; stderr_ctx.write_channel = MS_TRUE; stderr_ctx.readWriteFunc = msIO_apacheError; stderr_ctx.cbData = (void *)r; msIO_installHandlers(NULL, &stdout_ctx, &stderr_ctx); return MS_TRUE; } /* The maximum number of arguments we support. The number is taken from * cgiutil.h I think. It is only used for easier param decoding. */ #define WMS_MAX_ARGS 100 /* This is our simple query decoding function. Should be improved but for now * it works... */ static int mapserver_decode_args(apr_pool_t *p, char *args, char ***ParamNames, char ***ParamValues) { char **argv = NULL; int i; int n; int argc = 0; char *sep; /* alloc the name/value pointer list */ argv = (char **)apr_pcalloc(p, (WMS_MAX_ARGS + 1) * 2 * sizeof(char *)); *ParamNames = argv; *ParamValues = argv + WMS_MAX_ARGS + 1; /* No arguments? Then we're done */ if (!args) return 0; argv[0] = args; /* separate the arguments */ for (i = 1, n = 0; args[n] && (i < WMS_MAX_ARGS); n++) if (args[n] == '&') { argv[i++] = args + n + 1; args[n] = '\0'; } /* eliminate empty args */ for (n = 0, i = 0; argv[i]; i++) if (*(argv[i]) != '\0') argv[n++] = argv[i]; else argv[i] = NULL; /* argument count is the number of non-zero arguments! */ argc = n; /* split the name/value pairs */ for (i = 0; argv[i]; i++) { sep = strchr(argv[i], '='); if (!sep) continue; *sep = '\0'; argv[i + WMS_MAX_ARGS + 1] = (char *)apr_pstrdup(p, sep + 1); if (ap_unescape_url(argv[i + WMS_MAX_ARGS + 1]) == HTTP_BAD_REQUEST) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "%s: malformed URI, couldn't unescape param %s", __func__, argv[i]); argv[i + WMS_MAX_ARGS + 1] = NULL; } else { plustospace(argv[i + WMS_MAX_ARGS + 1]); } } return argc; } static char *mapserver_read_post_data(request_rec *r) { int size; long blen, rsize, rpos = 0; char *buffer = NULL; char buf[512]; if (ap_setup_client_block(r, REQUEST_CHUNKED_ERROR) != OK) return NULL; if (!ap_should_client_block(r)) return NULL; buffer = (char *)apr_palloc(r->pool, r->remaining + 1); if (!buffer) return NULL; size = r->remaining; buffer[size] = '\0'; while ((blen = ap_get_client_block(r, buf, sizeof(buf))) > 0) { if (rpos + blen > size) { rsize = blen - rpos; } else { rsize = blen; } memcpy((char *)buffer + rpos, buf, rsize); rpos += rsize; } return buffer; } /* ** Extract Map File name from params and load it. ** Returns map object or NULL on error. */ static mapObj *msModuleLoadMap(mapservObj *mapserv, mapserver_dir_config *conf) { int i; /* OK, here's the magic: we take the mapObj from our stored config. * We will use a copy of it created by msCopyMap since MapServer * modifies the object at several places during request processing */ mapObj *map = msNewMapObj(); if (!map) return NULL; msCopyMap(map, conf->map); /* check for any %variable% substitutions here, also do any map_ changes, we * do this here so WMS/WFS */ /* services can take advantage of these "vendor specific" extensions */ for (i = 0; i < mapserv->request->NumParams; i++) { /* ** a few CGI variables should be skipped altogether ** ** qstring: there is separate per layer validation for attribute queries and *the substitution checks ** below conflict with that so we avoid it here */ if (strncasecmp(mapserv->request->ParamNames[i], "qstring", 7) == 0) continue; if (strncasecmp(mapserv->request->ParamNames[i], "map_", 4) == 0 || strncasecmp(mapserv->request->ParamNames[i], "map.", 4) == 0) { /* check to see if there are any additions to the mapfile */ if (msUpdateMapFromURL(map, mapserv->request->ParamNames[i], mapserv->request->ParamValues[i]) != MS_SUCCESS) { msFreeMap(map); return NULL; } continue; } } msApplySubstitutions(map, mapserv->request->ParamNames, mapserv->request->ParamValues, mapserv->request->NumParams); msApplyDefaultSubstitutions(map); /* check to see if a ogc map context is passed as argument. if there */ /* is one load it */ for (i = 0; i < mapserv->request->NumParams; i++) { if (strcasecmp(mapserv->request->ParamNames[i], "context") == 0) { if (mapserv->request->ParamValues[i] && strlen(mapserv->request->ParamValues[i]) > 0) { if (strncasecmp(mapserv->request->ParamValues[i], "http", 4) == 0) { if (msGetConfigOption(map, "CGI_CONTEXT_URL")) msLoadMapContextURL(map, mapserv->request->ParamValues[i], MS_FALSE); } else msLoadMapContext(map, mapserv->request->ParamValues[i], MS_FALSE); } } } /* * RFC-42 HTTP Cookie Forwarding * Here we set the http_cookie_data metadata to handle the * HTTP Cookie Forwarding. The content of this metadata is the cookie * content. In the future, this metadata will probably be replaced * by an object that is part of the mapObject that would contain * information on the application status (such as cookie). */ if (mapserv->request->httpcookiedata != NULL) { msInsertHashTable(&(map->web.metadata), "http_cookie_data", mapserv->request->httpcookiedata); } return map; } /*** * The main request handler. **/ static int mapserver_handler(request_rec *r) { /* acquire the appropriate configuration for this directory */ mapserver_dir_config *conf; conf = (mapserver_dir_config *)ap_get_module_config(r->per_dir_config, &mapserver_module); /* decline the request if there's no map configured */ if (!conf || !conf->map) return DECLINED; apr_finfo_t mapstat; if (apr_stat(&mapstat, conf->mapfile_name, APR_FINFO_MTIME, r->pool) == APR_SUCCESS) { if (apr_time_sec(mapstat.mtime) > apr_time_sec(conf->mtime)) { mapObj *newmap = msLoadMap(conf->mapfile_name, NULL); if (newmap) { msFreeMap(conf->map); conf->map = newmap; conf->mtime = mapstat.mtime; } else { ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL, "unable to reload map file %s", conf->mapfile_name); } } } else { ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL, "%s: unable to stat file %s", __func__, conf->mapfile_name); } /* make a copy of the URI so we can modify it safely */ char *uri = apr_pstrdup(r->pool, r->uri); int len = strlen(uri); int conf_uri_len = strlen(conf->uri); /* If the URI points to a subdirectory we want to decline. */ if (len > conf_uri_len) return DECLINED; int argc = 0; char **ParamNames = NULL; char **ParamValues = NULL; char *post_data = NULL; int szMethod = -1; char *szContentType = NULL; mapservObj *mapserv = NULL; /* Try decoding the query string */ if (r->method_number == M_GET) { argc = mapserver_decode_args(r->pool, (char *)apr_pstrdup(r->pool, r->args), &ParamNames, &ParamValues); szMethod = MS_GET_REQUEST; } else if (r->method_number == M_POST) { szContentType = (char *)apr_table_get(r->headers_in, "Content-Type"); post_data = mapserver_read_post_data(r); szMethod = MS_POST_REQUEST; if (strcmp(szContentType, "application/x-www-form-urlencoded") == 0) { argc = mapserver_decode_args(r->pool, (char *)apr_pstrdup(r->pool, r->args), &ParamNames, &ParamValues); } } else return HTTP_METHOD_NOT_ALLOWED; if (!argc && !post_data) return HTTP_BAD_REQUEST; /* Now we install the IO redirection. */ if (msIO_installApacheRedirect(r) != MS_TRUE) ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "%s: could not install apache redirect", __func__); mapserv = msAllocMapServObj(); mapserv->request->NumParams = argc; mapserv->request->ParamNames = ParamNames; mapserv->request->ParamValues = ParamValues; mapserv->request->type = (enum MS_REQUEST_TYPE)szMethod; mapserv->request->postrequest = post_data; mapserv->request->contenttype = szContentType; // mapserv->map = msModuleLoadMap(mapserv,conf); mapserv->map = conf->map; if (!mapserv->map) { msCGIWriteError(mapserv); goto end_request; } if (msCGIDispatchRequest(mapserv) != MS_SUCCESS) { msCGIWriteError(mapserv); goto end_request; } end_request: if (mapserv) { mapserv->request->ParamNames = NULL; mapserv->request->ParamValues = NULL; mapserv->request->postrequest = NULL; mapserv->request->contenttype = NULL; mapserv->map = NULL; msFreeMapServObj(mapserv); } msResetErrorList(); /* Check if status was set inside MapServer functions. If it was, we * return it's value instead of simply OK. This is to support redirects * from maptemplate.c */ if (r->status == HTTP_MOVED_TEMPORARILY) return r->status; return OK; } /* This function will be called on startup to allow us to register our * handler. We don't do anything else yet... */ static void mapserver_register_hooks(apr_pool_t *p) { ap_hook_handler(mapserver_handler, NULL, NULL, APR_HOOK_MIDDLE); } /* That's the second part of the overall magic. This function will be called * when the configuration reaches the "WMS_Map" parameter. It will be passed * in as argument and should contain the full path and name of the map file. * We try to load it and store the resulting mapObj in the config of the * current directory. If we fail we throw a message... */ static const char *mapserver_set_map(cmd_parms *cmd, void *config, const char *arg) { mapserver_dir_config *conf = (mapserver_dir_config *)config; /* if the mapObj already exists the WMS_Map was given more than once - * may be the user forgot to comment something out... */ if (conf->map) { msWriteError(stderr); return (char *)apr_psprintf(cmd->temp_pool, "An MAP-file has already been registered for " "this URI - not accepting '%s'.", arg); } /* Simply try loading the argument as map file. */ conf->mapfile_name = apr_pstrdup(cmd->pool, arg); conf->map = msLoadMap((char *)arg, NULL); /* Ooops - we failed. We report it and fail. So beware: Always do a * configcheck before really restarting your web server! */ if (!conf->map) { msWriteError(stderr); return (char *)apr_psprintf( cmd->temp_pool, "The given MAP-file '%s' could not be loaded", arg); } apr_finfo_t status; if (apr_stat(&status, conf->mapfile_name, APR_FINFO_MTIME, cmd->pool) != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL, "%s: unable to stat file %s", __func__, conf->mapfile_name); } conf->mtime = status.mtime; return NULL; } /* This function creates the (default) directory configuration. Well, we have * no defaults to set so we simply alloc the memory... */ static void *mapserver_create_dir_config(apr_pool_t *p, char *dir) { mapserver_dir_config *newconf; newconf = (mapserver_dir_config *)apr_pcalloc(p, sizeof(mapserver_dir_config)); newconf->config_pool = p; newconf->uri = apr_pstrdup(p, dir); newconf->map = NULL; newconf->mapfile_name = NULL; newconf->mtime = apr_time_from_sec(0); if (dir) { int len = strlen(dir); if (len > 1 && dir[len - 1] == '/') newconf->uri[len - 1] = '\0'; } return newconf; } /* This structure defines our single config option which takes exactly one * argument. */ static const command_rec mapserver_options[] = { AP_INIT_TAKE1("Mapfile", mapserver_set_map, NULL, ACCESS_CONF, "WMS_Map "), {NULL}}; /* The following structure declares everything Apache needs to treat us as * a module. Merging would mean inheriting from the parent directory but that * doesn't make much sense here since we would only inherit the map file... */ /* Dispatch list for API hooks */ module AP_MODULE_DECLARE_DATA mapserver_module = { STANDARD20_MODULE_STUFF, mapserver_create_dir_config, /* create per-dir config structures */ NULL, /* merge per-dir config structures */ NULL, /* create per-server config structures */ NULL, /* merge per-server config structures */ mapserver_options, /* table of config file commands */ mapserver_register_hooks /* register hooks */ }; mapserver-8.6.0/src/apps/000077500000000000000000000000001511405061000152545ustar00rootroot00000000000000mapserver-8.6.0/src/apps/coshp.c000066400000000000000000000201351511405061000165350ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: Command line utility to sort a shapefile based on the * spatial index file. * ****************************************************************************** * Copyright (c) 2021 Paul Ramsey * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include #include #include #include "../mapserver.h" typedef struct { SHPHandle inSHP, outSHP; DBFHandle inDBF, outDBF; int currentOutRecord; int numDbfFields; } writeState; static char *AddFileSuffix(const char *Filename, const char *Suffix) { char *pszFullname, *pszBasename; int i; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *)msSmallMalloc(strlen(Filename) + 5); strcpy(pszBasename, Filename); for (i = (int)strlen(pszBasename) - 1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i--) { } if (pszBasename[i] == '.') pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ /* a PC to Unix with upper case filenames won't work! */ /* -------------------------------------------------------------------- */ pszFullname = (char *)msSmallMalloc(strlen(pszBasename) + 5); sprintf(pszFullname, "%s%s", pszBasename, Suffix); free(pszBasename); return (pszFullname); } static int writeShape(writeState *state, int shapeId) { int j = 0; int i = state->currentOutRecord; char fName[20]; int fWidth, fnDecimals; shapeObj shape; /* Copy the DBF record over */ for (j = 0; j < state->numDbfFields; j++) { DBFFieldType dbfField = msDBFGetFieldInfo(state->inDBF, j, fName, &fWidth, &fnDecimals); switch (dbfField) { case FTInteger: msDBFWriteIntegerAttribute( state->outDBF, i, j, msDBFReadIntegerAttribute(state->inDBF, shapeId, j)); break; case FTDouble: msDBFWriteDoubleAttribute( state->outDBF, i, j, msDBFReadDoubleAttribute(state->inDBF, shapeId, j)); break; case FTString: msDBFWriteStringAttribute( state->outDBF, i, j, msDBFReadStringAttribute(state->inDBF, shapeId, j)); break; default: fprintf(stderr, "Unsupported data type for field: %s, exiting.\n", fName); exit(0); } } /* Copy the SHP record over */ msSHPReadShape(state->inSHP, shapeId, &shape); msSHPWriteShape(state->outSHP, &shape); msFreeShape(&shape); /* Increment output row number */ state->currentOutRecord++; return MS_SUCCESS; } static int writeNode(writeState *state, treeNodeObj *node) { int i; if (node->ids) { for (i = 0; i < node->numshapes; i++) { int curRec = state->currentOutRecord; writeShape(state, node->ids[i]); node->ids[i] = curRec; } } for (i = 0; i < node->numsubnodes; i++) { if (node->subnode[i]) writeNode(state, node->subnode[i]); } return MS_SUCCESS; } int main(int argc, char *argv[]) { treeObj *tree; /* In-memory index */ shapefileObj shapefile; /* Input shapefile */ SHPHandle outSHP; /* Output SHP */ DBFHandle outDBF; /* Output DBF */ DBFFieldType dbfField; writeState state; int shpType, nShapes; char fName[20]; int fWidth, fnDecimals; char buffer[1024]; int numFields; int i; if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } /* ------------------------------------------------------------------------------- */ /* Check the number of arguments, return syntax if not correct */ /* ------------------------------------------------------------------------------- */ if (argc != 3) { fprintf(stderr, "Syntax: %s [infile] [outfile]\n", argv[0]); exit(1); } msSetErrorFile("stderr", NULL); /* ------------------------------------------------------------------------------- */ /* Open the shapefile */ /* ------------------------------------------------------------------------------- */ if (msShapefileOpen(&shapefile, "rb", argv[1], MS_TRUE) < 0) { fprintf(stdout, "Error opening shapefile %s.\n", argv[1]); exit(0); } nShapes = shapefile.numshapes; shpType = shapefile.type; numFields = msDBFGetFieldCount(shapefile.hDBF); /* ------------------------------------------------------------------------------- */ /* Index the shapefile (auto-calculate depth) */ /* ------------------------------------------------------------------------------- */ tree = msCreateTree(&shapefile, 0); msTreeTrim(tree); /* ------------------------------------------------------------------------------- */ /* Setup the output .shp/.shx and .dbf files */ /* ------------------------------------------------------------------------------- */ outSHP = msSHPCreate(argv[2], shpType); if (outSHP == NULL) { fprintf(stderr, "Failed to create file '%s'.\n", argv[2]); exit(1); } sprintf(buffer, "%s.dbf", argv[2]); outDBF = msDBFCreate(buffer); if (outDBF == NULL) { fprintf(stderr, "Failed to create dbf file '%s'.\n", buffer); exit(1); } /* Clone the fields from the input to the output definition */ for (i = 0; i < numFields; i++) { dbfField = msDBFGetFieldInfo( shapefile.hDBF, i, fName, &fWidth, &fnDecimals); /* ---- Get field info from in file ---- */ msDBFAddField(outDBF, fName, dbfField, fWidth, fnDecimals); } /* ------------------------------------------------------------------------------- */ /* Write the sorted .shp/.shx and .dbf files */ /* ------------------------------------------------------------------------------- */ /* Set up writer state */ state.inSHP = shapefile.hSHP; state.outSHP = outSHP; state.inDBF = shapefile.hDBF; state.outDBF = outDBF; state.currentOutRecord = 0; state.numDbfFields = numFields; writeNode(&state, tree->root); /* ------------------------------------------------------------------------------- */ /* Write the spatial index */ /* ------------------------------------------------------------------------------- */ msWriteTree(tree, AddFileSuffix(argv[2], MS_INDEX_EXTENSION), MS_NEW_LSB_ORDER); msDestroyTree(tree); /* ------------------------------------------------------------------------------- */ /* Close all files */ /* ------------------------------------------------------------------------------- */ msShapefileClose(&shapefile); msSHPClose(outSHP); msDBFClose(outDBF); fprintf(stdout, "Wrote %d spatially sorted shapes into shapefile '%s'\n", nShapes, argv[2]); return (0); } mapserver-8.6.0/src/apps/coshp.md000066400000000000000000000113671511405061000167220ustar00rootroot00000000000000# MapServer QIX File (aka ShpTree) https://support.esri.com/en/white-paper/279 ## Shape File Model The shape file consists of three standard components. * **shp** file contains the binary representations of the shapes (points, lines, polygons) * **dbf** file contains the associated attribute information for each shape, one row per shape * **shx** includes an ordered list of byte offsets of shapes in the **shp** file The records in each component are inter-related by their **order of appearance**. The first entry in the **shx** file is the byte offset to the first shape in the shape file, and the first record of the dbf file contains the attributes of the first shape. In addition to the standard three components, the QIX model adds a fourth component. * **qix** file contains a binary quad-tree, in which every node in the three includes a bounds, a list of child nodes, and a list of "shape ids" that are contained in that node. The "shape ids" are just the record numbers. So "shape id" **0** corresponds to the first record in the shp/dbf/shx files, and so on. ## Header There is an **8 byte** header. * **byte 0, len 3** are file signature string, always "SQT" * **byte 3, len 1** signals the byte-order of multi-byte types * [see code](https://github.com/MapServer/MapServer/blob/8af82513f8be8a380acbb5d92f9c5dec360ee5f1/maptree.h#L72-L76) * 1 = LSB (little-endian) * 2 = MSB (big-endian) * 0 = native (the endian of the system that wrote the file (probably LSB)) * **byte 4, len 1** is the version number * 1 = current version * **byte 5, len 3** is reserved for future use * **byte 8, len 4** is an **integer** count of number of shapes in the tree * **byte 12, len 4** is an **integer** count of depth of the three All **integer** values may require a byte swap, if the system byte order differs from the file byte order. ## Nodes Nodes contain an * **byte 0, len 4** is an **integer** offset from the just after the numShapes of this node to the start of the next sibling node * **byte 4, len 8** is a the **double** minx of the node * **byte 12, len 8** is a the **double** miny of the node * **byte 20, len 8** is a the **double** maxx of the node * **byte 28, len 8** is a the **double** maxy of the node * **byte 36, len 4** is an **integer** numShapes, the count of shape ids stored in this node * **byte 40, len 4\*numShapes** is an **array of integer** shape ids * **byte 40+4\*numShapes, 40+4\*numShapes+4** is an **integer** numChildren number of child nodes under this node All **integer** and **double** values may require a byte swap, if the system byte order differs from the file byte order. Note that the **offset** is the distance in bytes from just after the numShapes entry, 40 bytes from the start of the node. Or put another way, "offset + 40" is the distance from the start of **this** node to the start of the **next sibling** node. ## Arrangement of Components * The file starts with a header. * A node and all its descendents always form a contiguous range of the file. * A node has at most four children. * Both internal and leaf nodes may contain shape ids. ``` Header Node A Node AA Node AAA Node AAB Node AAC Node AB Node ABA Node ABB Node AC Node B Node BA Node BAA Node BAB Node BB Node C ``` ## Searching ### The Tree The spatial search will involve a "query box" and will return a list of "shape id". * Recursively search from the top node. * Check that the node box and the query box intersect. * If they do not, return. * If they do, then add the "shape ids" in the node to the result list. * Call the search function on each child node. You can use the "offset" of each child to find the location of the next child in the set. Implementation of a reader will probably want to opportunistically load portions of the whole tree into a memory structure, rather than hopping around with random reads. If "distance to next sibling" < some size, load whole subtree into memory and iterate on that. ### For Features Once the tree search is complete, retrieving the features involves pulling the data from the **shp** and **dbf** files. If the shape file has been "cloud optimized", a query rectangle should involve a minimized number of range requests on the data files, since the order of records should match the order of nodes in the tree. Analyze the "shape id" list coming out of the tree search, and find contiguous or almost-contiguous ranges of ids. Lookup the [byte offsets](https://www.esri.com/content/dam/esrisites/sitecore-archive/Files/Pdfs/library/whitepapers/pdfs/shapefile.pdf#page=28) from the **shx** file, then retrieve those ranges of data from the **shp** file. The **dbf** file is based on a fixed-length record, so once the header is read, finding the byte offset of a record just involving multiplying the record length by the shape id number. mapserver-8.6.0/src/apps/legend.c000066400000000000000000000041731511405061000166630ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Mainline of commandline legend generation test utility. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" int main(int argc, char *argv[]) { mapObj *map = NULL; imageObj *img = NULL; msSetup(); if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } if (argc < 3) { fprintf(stdout, "Syntax: legend [mapfile] [output image]\n"); exit(0); } map = msLoadMap(argv[1], NULL, NULL); if (!map) { msWriteError(stderr); exit(0); } img = msDrawLegend(map, MS_FALSE, NULL); if (!img) { msWriteError(stderr); exit(0); } msSaveImage(NULL, img, argv[2]); msFreeImage(img); msFreeMap(map); return (MS_TRUE); } mapserver-8.6.0/src/apps/map2img.c000066400000000000000000000316721511405061000167650ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Commandline .map rendering utility, mostly for testing. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include "../mapserver.h" #include "../maptime.h" #include "limits.h" /** * Check if the required number of arguments are available for the * parsed option or otherwise print an error message and exit. * * @param option option name for the error message * @param num_required_arguments number of arguments required by option * @param num_remaining_arguments number of arguments following the option * @param config optional config object to free if we exit * @param map optional map object to free if we exit */ static void hasMoreArgumentsOrExit(const char *option, int num_required_arguments, int num_remaining_arguments, configObj *config, mapObj *map) { (void)map; if (num_remaining_arguments < num_required_arguments) { if (num_required_arguments == 1) fprintf(stderr, "Argument %s requires an additional argument.\n", option); else fprintf(stderr, "Argument %s needs %i space separated arguments.\n", option, num_required_arguments); msCleanup(); msFreeConfig(config); exit(1); } } int main(int argc, char *argv[]) { int i, j, k; mapObj *map = NULL; imageObj *image = NULL; configObj *config = NULL; char **layers = NULL; int num_layers = 0; int layer_found = 0; char *outfile = NULL; /* no -o sends image to STDOUT */ int iterations = 1; int draws = 0; /* ---- output version info and exit --- */ if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } /* ---- check the number of arguments, return syntax if not correct ---- */ if (argc < 3) { fprintf(stdout, "\nPurpose: convert a mapfile to an image\n\n"); fprintf(stdout, "Syntax: map2img -m mapfile [-o image] [-e minx miny maxx " "maxy] [-s sizex sizey]\n" " [-l \"layer1 [layers2...]\"] [-i format]\n" " [-all_debug n] [-map_debug n] " "[-layer_debug n] [-p n] [-c n] [-d layername datavalue]\n" " [-conf filename]\n"); fprintf(stdout, " -m mapfile: Map file to operate on - required\n"); fprintf( stdout, " -i format: Override the IMAGETYPE value to pick output format\n"); fprintf(stdout, " -o image: output filename (stdout if not provided)\n"); fprintf(stdout, " -e minx miny maxx maxy: extents to render\n"); fprintf(stdout, " -s sizex sizey: output image size\n"); fprintf(stdout, " -l layers: layers / groups to enable - make sure they " "are quoted and space separated if more than one listed\n"); fprintf(stdout, " -all_debug n: Set debug level for map and all layers\n"); fprintf(stdout, " -map_debug n: Set map debug level\n"); fprintf(stdout, " -layer_debug layer_name n: Set layer debug level\n"); fprintf(stdout, " -c n: draw map n number of times\n"); fprintf(stdout, " -p n: pause for n seconds after reading the map\n"); fprintf(stdout, " -d layername datavalue: change DATA value for layer\n"); fprintf( stdout, " -conf filename: filename of the MapServer configuration file.\n"); exit(0); } if (msSetup() != MS_SUCCESS) { msWriteError(stderr); exit(1); } bool some_debug_requested = FALSE; const char *config_filename = NULL; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-c") == 0) { /* user specified number of draws */ hasMoreArgumentsOrExit("-c", 1, argc - i - 1, config, map); iterations = atoi(argv[i + 1]); if (iterations < 0 || iterations > INT_MAX - 1) { printf("Invalid number of iterations"); return 1; } printf("We will draw %d times...\n", iterations); continue; } if (strcmp(argv[i], "-all_debug") == 0) { /* global debug */ hasMoreArgumentsOrExit("-all_debug", 1, argc - i - 1, config, map); int debug_level = atoi(argv[++i]); some_debug_requested = TRUE; msSetGlobalDebugLevel(debug_level); continue; } if (i < argc - 1 && (strcmp(argv[i], "-map_debug") == 0 || strcmp(argv[i], "-layer_debug") == 0)) { some_debug_requested = TRUE; continue; } if (strcmp(argv[i], "-conf") == 0) { hasMoreArgumentsOrExit("-conf", 1, argc - i - 1, config, map); config_filename = argv[i + 1]; ++i; continue; } } if (some_debug_requested) { /* Send output to stderr by default */ if (msGetErrorFile() == NULL) msSetErrorFile("stderr", NULL); } config = msLoadConfig(config_filename); for (draws = 0; draws < iterations; draws++) { struct mstimeval requeststarttime, requestendtime; if (msGetGlobalDebugLevel() >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&requeststarttime, NULL); /* Use PROJ_DATA/PROJ_LIB env vars if set */ msProjDataInitFromEnv(); /* Use MS_ERRORFILE and MS_DEBUGLEVEL env vars if set */ if (msDebugInitFromEnv() != MS_SUCCESS) { msWriteError(stderr); msCleanup(); msFreeConfig(config); exit(1); } for (i = 1; i < argc; i++) { /* Step though the user arguments, 1st to find map file */ if (strcmp(argv[i], "-m") == 0) { hasMoreArgumentsOrExit("-m", 1, argc - i - 1, config, map); map = msLoadMap(argv[i + 1], NULL, config); if (!map) { msWriteError(stderr); msCleanup(); msFreeConfig(config); exit(1); } msApplyDefaultSubstitutions(map); } } if (!map) { fprintf(stderr, "Mapfile (-m) option not specified.\n"); msCleanup(); msFreeConfig(config); exit(1); } for (i = 1; i < argc; i++) { /* Step though the user arguments */ if (strcmp(argv[i], "-m") == 0) { /* skip it */ i += 1; } if (strcmp(argv[i], "-p") == 0) { hasMoreArgumentsOrExit("-p", 1, argc - i - 1, config, map); int pause_length = atoi(argv[i + 1]); time_t start_time = time(NULL); printf("Start pause of %d seconds.\n", pause_length); while (time(NULL) < start_time + pause_length) { } printf("Done pause.\n"); i += 1; } if (strcmp(argv[i], "-o") == 0) { /* load the output image filename */ hasMoreArgumentsOrExit("-o", 1, argc - i - 1, config, map); outfile = argv[i + 1]; i += 1; } if (strcmp(argv[i], "-i") == 0) { hasMoreArgumentsOrExit("-i", 1, argc - i - 1, config, map); outputFormatObj *format; format = msSelectOutputFormat(map, argv[i + 1]); if (format == NULL) printf("No such OUTPUTFORMAT as %s.\n", argv[i + 1]); else { msFree((char *)map->imagetype); map->imagetype = msStrdup(argv[i + 1]); msApplyOutputFormat(&(map->outputformat), format, MS_NOOVERRIDE); } i += 1; } if (strcmp(argv[i], "-d") == 0) { /* swap layer data */ hasMoreArgumentsOrExit("-d", 2, argc - i - 1, config, map); for (j = 0; j < map->numlayers; j++) { if (strcmp(GET_LAYER(map, j)->name, argv[i + 1]) == 0) { free(GET_LAYER(map, j)->data); GET_LAYER(map, j)->data = msStrdup(argv[i + 2]); break; } } i += 2; } if (strcmp(argv[i], "-all_debug") == 0) { /* global debug */ hasMoreArgumentsOrExit("-all_debug", 1, argc - i - 1, config, map); int debug_level = atoi(argv[++i]); /* msSetGlobalDebugLevel() already called. Just need to force debug * level in map and all layers */ map->debug = debug_level; for (j = 0; j < map->numlayers; j++) { GET_LAYER(map, j)->debug = debug_level; } } if (strcmp(argv[i], "-map_debug") == 0) { /* debug */ hasMoreArgumentsOrExit("-map_debug", 1, argc - i - 1, config, map); map->debug = atoi(argv[++i]); } if (strcmp(argv[i], "-layer_debug") == 0) { /* debug */ hasMoreArgumentsOrExit("-layer_debug", 2, argc - i - 1, config, map); const char *layer_name = argv[++i]; int debug_level = atoi(argv[++i]); int got_layer = 0; for (j = 0; j < map->numlayers; j++) { if (strcmp(GET_LAYER(map, j)->name, layer_name) == 0) { GET_LAYER(map, j)->debug = debug_level; got_layer = 1; } } if (!got_layer) fprintf(stderr, " Did not find layer '%s' from -layer_debug switch.\n", layer_name); } if (strcmp(argv[i], "-e") == 0) { /* change extent */ hasMoreArgumentsOrExit("-e", 4, argc - i - 1, config, map); map->extent.minx = atof(argv[i + 1]); map->extent.miny = atof(argv[i + 2]); map->extent.maxx = atof(argv[i + 3]); map->extent.maxy = atof(argv[i + 4]); i += 4; } if (strcmp(argv[i], "-s") == 0) { hasMoreArgumentsOrExit("-s", 2, argc - i - 1, config, map); msMapSetSize(map, atoi(argv[i + 1]), atoi(argv[i + 2])); i += 2; } if (strcmp(argv[i], "-l") == 0) { /* load layer list */ hasMoreArgumentsOrExit("-l", 1, argc - i - 1, config, map); layers = msStringSplit(argv[i + 1], ' ', &(num_layers)); for (j = 0; j < num_layers; j++) { /* loop over -l */ layer_found = 0; for (k = 0; k < map->numlayers; k++) { if ((GET_LAYER(map, k)->name && strcasecmp(GET_LAYER(map, k)->name, layers[j]) == 0) || (GET_LAYER(map, k)->group && strcasecmp(GET_LAYER(map, k)->group, layers[j]) == 0)) { layer_found = 1; break; } } if (layer_found == 0) { fprintf(stderr, "Layer (-l) \"%s\" not found\n", layers[j]); msFreeCharArray(layers, num_layers); msFreeMap(map); msCleanup(); msFreeConfig(config); exit(1); } } for (j = 0; j < map->numlayers; j++) { if (GET_LAYER(map, j)->status == MS_DEFAULT) continue; else { GET_LAYER(map, j)->status = MS_OFF; for (k = 0; k < num_layers; k++) { if ((GET_LAYER(map, j)->name && strcasecmp(GET_LAYER(map, j)->name, layers[k]) == 0) || (GET_LAYER(map, j)->group && strcasecmp(GET_LAYER(map, j)->group, layers[k]) == 0)) { GET_LAYER(map, j)->status = MS_ON; break; } } } } msFreeCharArray(layers, num_layers); i += 1; } } image = msDrawMap(map, MS_FALSE); if (!image) { msWriteError(stderr); msFreeMap(map); msCleanup(); msFreeConfig(config); exit(1); } if (msSaveImage(map, image, outfile) != MS_SUCCESS) { msWriteError(stderr); } msFreeImage(image); msFreeMap(map); if (msGetGlobalDebugLevel() >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&requestendtime, NULL); msDebug("map2img total time: %.3fs\n", (requestendtime.tv_sec + requestendtime.tv_usec / 1.0e6) - (requeststarttime.tv_sec + requeststarttime.tv_usec / 1.0e6)); } } /* for(draws=0; draws #include #ifdef USE_FASTCGI #define NO_FCGI_DEFINES #include "fcgi_stdio.h" #endif #include "mapserv.h" #include "../mapio.h" #include "../maptime.h" #include "cpl_conv.h" #ifndef _WIN32 #include #endif /************************************************************************/ /* FastCGI cleanup functions. */ /************************************************************************/ static int finish_process = 0; #ifndef _WIN32 static void msCleanupOnSignal(int nInData) { (void)nInData; finish_process = 1; } #endif #ifdef _WIN32 static void msCleanupOnExit(void) { finish_process = 1; } #endif #ifdef USE_FASTCGI /************************************************************************/ /* msIO_fcgiRead() */ /* */ /* This is the default implementation via stdio. */ /************************************************************************/ static int msIO_fcgiRead(void *cbData, void *data, int byteCount) { return (int)FCGI_fread(data, 1, byteCount, (FCGI_FILE *)cbData); } /************************************************************************/ /* msIO_fcgiWrite() */ /* */ /* This is the default implementation via stdio. */ /************************************************************************/ static int msIO_fcgiWrite(void *cbData, void *data, int byteCount) { return (int)FCGI_fwrite(data, 1, byteCount, (FCGI_FILE *)cbData); } /************************************************************************/ /* msIO_installFastCGIRedirect() */ /************************************************************************/ static int msIO_installFastCGIRedirect() { msIOContext stdin_ctx, stdout_ctx, stderr_ctx; stdin_ctx.label = "fcgi"; stdin_ctx.write_channel = MS_FALSE; stdin_ctx.readWriteFunc = msIO_fcgiRead; stdin_ctx.cbData = (void *)FCGI_stdin; stdout_ctx.label = "fcgi"; stdout_ctx.write_channel = MS_TRUE; stdout_ctx.readWriteFunc = msIO_fcgiWrite; stdout_ctx.cbData = (void *)FCGI_stdout; stderr_ctx.label = "fcgi"; stderr_ctx.write_channel = MS_TRUE; stderr_ctx.readWriteFunc = msIO_fcgiWrite; stderr_ctx.cbData = (void *)FCGI_stderr; msIO_installHandlers(&stdin_ctx, &stdout_ctx, &stderr_ctx); return MS_TRUE; } #endif /************************************************************************/ /* main() */ /************************************************************************/ int main(int argc, char *argv[]) { int sendheaders = MS_TRUE; struct mstimeval execstarttime, execendtime; struct mstimeval requeststarttime, requestendtime; mapservObj *mapserv = NULL; configObj *config = NULL; /* ** Process -v and -h command line arguments first end exit. We want to avoid *any error messages ** associated with msLoadConfig() or msSetup(). */ const char *config_filename = NULL; const bool use_command_line_options = getenv("QUERY_STRING") == NULL; if (use_command_line_options) { /* WARNING: * Do not parse command line arguments (especially those that could have * dangerous consequences if controlled through a web request), without * checking that the QUERY_STRING environment variable is *not* set, because * in a CGI context, command line arguments can be generated from the * content of the QUERY_STRING, and thus cause a security problem. For ex, * "http://example.com/mapserv.cgi?-conf+bar would result in "mapserv.cgi * -conf bar" being invoked. See * https://github.com/MapServer/MapServer/pull/6429#issuecomment-952533589 * and https://datatracker.ietf.org/doc/html/rfc3875#section-4.4 */ for (int iArg = 1; iArg < argc; iArg++) { if (strcmp(argv[iArg], "-v") == 0) { printf("%s\n", msGetVersion()); fflush(stdout); exit(0); } else if (strcmp(argv[iArg], "-h") == 0 || strcmp(argv[iArg], "--help") == 0) { printf("Usage: mapserv [--help] [-v] [-nh] [QUERY_STRING=value] " "[PATH_INFO=value]\n"); printf(" [-conf filename]\n"); printf("\n"); printf("Options :\n"); printf(" -h, --help Display this help message.\n"); printf(" -v Display version and exit.\n"); printf( " -nh Suppress HTTP headers in CGI mode.\n"); printf(" -conf filename Filename of the MapServer " "configuration file.\n"); printf(" QUERY_STRING=value Set the QUERY_STRING in GET request " "mode.\n"); printf(" PATH_INFO=value Set the PATH_INFO for an API " "request.\n"); fflush(stdout); exit(0); } else if (iArg < argc - 1 && strcmp(argv[iArg], "-conf") == 0) { config_filename = argv[iArg + 1]; ++iArg; } } } config = msLoadConfig(config_filename); // first thing if (config == NULL) { #ifdef USE_FASTCGI msIO_installFastCGIRedirect(); // FastCGI setup for error handling here FCGI_Accept(); #endif msCGIWriteError(mapserv); exit(0); } /* -------------------------------------------------------------------- */ /* Initialize mapserver. This sets up threads, GD and GEOS as */ /* well as using MS_ERRORFILE and MS_DEBUGLEVEL env vars if set. */ /* -------------------------------------------------------------------- */ if (msSetup() != MS_SUCCESS) { #ifdef USE_FASTCGI msIO_installFastCGIRedirect(); // FastCGI setup for error handling here FCGI_Accept(); #endif msCGIWriteError(mapserv); msCleanup(); msFreeConfig(config); exit(0); } const char *ms_index_dir = msConfigGetEnv(config, "MS_INDEX_TEMPLATE_DIRECTORY"); if (msGetGlobalDebugLevel() >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&execstarttime, NULL); /* -------------------------------------------------------------------- */ /* Process arguments. In normal use as a cgi-bin there are no */ /* commandline switches, but we provide a few for test/debug */ /* purposes. */ /* -------------------------------------------------------------------- */ if (use_command_line_options) { for (int iArg = 1; iArg < argc; iArg++) { if (strcmp(argv[iArg], "-nh") == 0) { sendheaders = MS_FALSE; msIO_setHeaderEnabled(MS_FALSE); } else if (strncmp(argv[iArg], "QUERY_STRING=", 13) == 0) { /* Debugging hook... pass "QUERY_STRING=..." on the command-line */ putenv("REQUEST_METHOD=GET"); /* coverity[tainted_string] */ putenv(argv[iArg]); } else if (strncmp(argv[iArg], "PATH_INFO=", 10) == 0) { /* Debugging hook for APIs... pass "PATH_INFO=..." on the command-line */ putenv("REQUEST_METHOD=GET"); /* coverity[tainted_string] */ putenv(argv[iArg]); } } } /* -------------------------------------------------------------------- */ /* Setup cleanup magic, mainly for FastCGI case. */ /* -------------------------------------------------------------------- */ #ifndef _WIN32 signal(SIGUSR1, msCleanupOnSignal); signal(SIGTERM, msCleanupOnSignal); #endif #ifdef USE_FASTCGI msIO_installFastCGIRedirect(); /* In FastCGI case we loop accepting multiple requests. In normal CGI */ /* use we only accept and process one request. */ while (!finish_process && FCGI_Accept() >= 0) { #endif /* def USE_FASTCGI */ /* -------------------------------------------------------------------- */ /* Process a request. */ /* -------------------------------------------------------------------- */ mapserv = msAllocMapServObj(); mapserv->sendheaders = sendheaders; /* override the default if necessary (via command line -nh switch) */ mapserv->request->NumParams = loadParams(mapserv->request, NULL, NULL, 0, NULL); if (msCGIIsAPIRequest(mapserv) == MS_FALSE && mapserv->request->NumParams == -1) { /* no QUERY_STRING or PATH_INFO */ if (ms_index_dir != NULL) { // return the landing page msCGIDispatchIndexRequest(mapserv, config); goto end_request; } msCGIWriteError(mapserv); goto end_request; } mapserv->map = msCGILoadMap(mapserv, config); if (!mapserv->map) { for (int i = 0; i < mapserv->request->NumParams; i++) { /* a map parameter was sent */ if (strcasecmp(mapserv->request->ParamNames[i], "map") == 0) { msCGIWriteError(mapserv); goto end_request; } } if (ms_index_dir != NULL && strcmp(mapserv->request->path_info, "/") == 0) { // return the landing page msCGIDispatchIndexRequest(mapserv, config); goto end_request; } msCGIWriteError(mapserv); goto end_request; } if (mapserv->map->debug >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&requeststarttime, NULL); #ifdef USE_FASTCGI if (mapserv->map->debug) { static int nRequestCounter = 1; msDebug("CGI Request %d on process %d\n", nRequestCounter, getpid()); nRequestCounter++; } #endif if (mapserv->request->api_path != NULL) { switch (mapserv->request->api_path_length) { case 0: // just in case, treat as normal if (msCGIDispatchRequest(mapserv) != MS_SUCCESS) { msCGIWriteError(mapserv); goto end_request; } break; case 1: if (ms_index_dir != NULL) { // Try normal dispatch first if (msCGIDispatchRequest(mapserv) != MS_SUCCESS) { // Fallback to landing page if (msCGIDispatchMapIndexRequest(mapserv, config) != MS_SUCCESS) { msCGIWriteError(mapserv); goto end_request; } } } else { if (msCGIDispatchRequest(mapserv) != MS_SUCCESS) { msCGIWriteError(mapserv); goto end_request; } } break; default: // length > 1 if (msCGIDispatchAPIRequest(mapserv) != MS_SUCCESS) { msCGIWriteError(mapserv); goto end_request; } break; } } else { // api_path == NULL if (msCGIDispatchRequest(mapserv) != MS_SUCCESS) { msCGIWriteError(mapserv); goto end_request; } } end_request: if (mapserv->map && mapserv->map->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&requestendtime, NULL); msDebug("mapserv request processing time (msLoadMap not incl.): %.3fs\n", (requestendtime.tv_sec + requestendtime.tv_usec / 1.0e6) - (requeststarttime.tv_sec + requeststarttime.tv_usec / 1.0e6)); } msFreeMapServObj(mapserv); #ifdef USE_FASTCGI /* FCGI_ --- return to top of loop */ msResetErrorList(); continue; } /* end fastcgi loop */ #endif /* normal case, processing is complete */ if (msGetGlobalDebugLevel() >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&execendtime, NULL); msDebug("mapserv total execution time: %.3fs\n", (execendtime.tv_sec + execendtime.tv_usec / 1.0e6) - (execstarttime.tv_sec + execstarttime.tv_usec / 1.0e6)); } msCleanup(); msFreeConfig(config); #ifdef _WIN32 /* flush pending writes to stdout */ fflush(stdout); #endif exit(0); } mapserver-8.6.0/src/apps/mapserv.h000066400000000000000000000062431511405061000171070ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Declarations supporting mapserv.c. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPSERV_H #define MAPSERV_H #if defined(_WIN32) && !defined(__CYGWIN__) #include #endif #include #include #include "../maptemplate.h" #include "../maptile.h" #include "../cgiutil.h" /* ** Defines */ #define NUMEXP "[-]?(([0-9]+)|([0-9]*[.][0-9]+)([eE][-+]?[0-9]+)?)" #define EXTENT_PADDING .05 /* ** Macros */ #define TEMPLATE_TYPE(s) \ (((strncmp("http://", s, 7) == 0) || (strncmp("https://", s, 8) == 0) || \ (strncmp("ftp://", s, 6)) == 0) \ ? MS_URL \ : MS_FILE) MS_DLL_EXPORT void msCGIWriteError(mapservObj *mapserv); MS_DLL_EXPORT mapObj *msCGILoadMap(mapservObj *mapserv, configObj *context); MS_DLL_EXPORT int msCGIDispatchMapIndexRequest(mapservObj *mapserv, configObj *config); MS_DLL_EXPORT int msCGIDispatchIndexRequest(mapservObj *mapserv, configObj *config); int msCGISetMode(mapservObj *mapserv); int msCGILoadForm(mapservObj *mapserv); int msCGIDispatchBrowseRequest(mapservObj *mapserv); int msCGIDispatchCoordinateRequest(mapservObj *mapserv); int msCGIDispatchQueryRequest(mapservObj *mapserv); int msCGIDispatchImageRequest(mapservObj *mapserv); int msCGIDispatchLegendRequest(mapservObj *mapserv); int msCGIDispatchLegendIconRequest(mapservObj *mapserv); MS_DLL_EXPORT int msCGIDispatchRequest(mapservObj *mapserv); MS_DLL_EXPORT int msCGIIsAPIRequest(mapservObj *mapserv); MS_DLL_EXPORT int msCGIDispatchAPIRequest(mapservObj *mapserv); #endif /* MAPSERV_H */ mapserver-8.6.0/src/apps/msencrypt.c000066400000000000000000000052361511405061000174520ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Command-line encryption utility (see MS-RFC-18) * Author: Daniel Morissette * ****************************************************************************** * Copyright (c) 1996-2006 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" void PrintUsage() { printf("Usage: msencrypt <-keygen filename>|<-key filename " "string_to_encrypt>\n"); } int main(int argc, char *argv[]) { if (argc == 3 && strcmp(argv[1], "-keygen") == 0) { /* TODO: Move this to a function */ unsigned char pabyKey[16]; char szKeyEncoded[50]; FILE *fp; msGenerateEncryptionKey(pabyKey); msHexEncode(pabyKey, szKeyEncoded, 16); if ((fp = fopen(argv[2], "wt")) != NULL) { fprintf(fp, "%s\n", szKeyEncoded); fclose(fp); } else { printf("ERROR: Failed writing to %s\n", argv[2]); return -1; } } else if (argc == 4 && strcmp(argv[1], "-key") == 0) { unsigned char key[16]; char *pszBuf; if (msReadEncryptionKeyFromFile(argv[2], key, NULL) != MS_SUCCESS) { printf("ERROR: Failed reading key from file %s\n", argv[2]); return -1; } pszBuf = (char *)malloc((strlen(argv[3]) * 2 + 17) * sizeof(char)); MS_CHECK_ALLOC(pszBuf, (strlen(argv[3]) * 2 + 17) * sizeof(char), -1); msEncryptStringWithKey(key, argv[3], pszBuf); printf("%s\n", pszBuf); msFree(pszBuf); } else { PrintUsage(); } return 0; } mapserver-8.6.0/src/apps/scalebar.c000066400000000000000000000043131511405061000171750ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Commandline scalebar generating utility, mostly for testing. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" int main(int argc, char *argv[]) { mapObj *map = NULL; imageObj *image = NULL; msSetup(); if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } /* ---- check the number of arguments, return syntax if not correct ---- */ if (argc < 3) { fprintf(stdout, "Syntax: scalebar [mapfile] [output image]\n"); exit(1); } map = msLoadMap(argv[1], NULL, NULL); if (!map) { msWriteError(stderr); exit(1); } image = msDrawScalebar(map); if (!image) { msWriteError(stderr); exit(1); } msSaveImage(map, image, argv[2]); msFreeImage(image); msFreeMap(map); return (MS_TRUE); } mapserver-8.6.0/src/apps/shptree.c000066400000000000000000000134611511405061000170770ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Commandline utility to generate .qix shapefile spatial indexes. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" #include "../maptree.h" #include char *AddFileSuffix(const char *Filename, const char *Suffix) { char *pszFullname, *pszBasename; int i; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *)msSmallMalloc(strlen(Filename) + 5); strcpy(pszBasename, Filename); for (i = (int)strlen(pszBasename) - 1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i--) { } if (pszBasename[i] == '.') pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ /* a PC to Unix with upper case filenames won't work! */ /* -------------------------------------------------------------------- */ pszFullname = (char *)msSmallMalloc(strlen(pszBasename) + 5); sprintf(pszFullname, "%s%s", pszBasename, Suffix); free(pszBasename); return (pszFullname); } int main(int argc, char *argv[]) { shapefileObj shapefile; treeObj *tree; int byte_order = MS_NEW_LSB_ORDER, i; int depth = 0; if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } /* -------------------------------------------------------------------- */ /* Establish the byte order on this machine to decide default */ /* index format */ /* -------------------------------------------------------------------- */ i = 1; /* cppcheck-suppress knownConditionTrueFalse */ if (*((uchar *)&i) == 1) byte_order = MS_NEW_LSB_ORDER; else byte_order = MS_NEW_MSB_ORDER; if (argc < 2) { fprintf(stdout, "Syntax:\n"); fprintf(stdout, " shptree [] []\n"); fprintf(stdout, "Where:\n"); fprintf(stdout, " is the name of the .shp file to index.\n"); fprintf(stdout, " (optional) is the maximum depth of the index\n"); fprintf(stdout, " to create, default is 0 meaning that shptree\n"); fprintf(stdout, " will calculate a reasonable default depth.\n"); fprintf(stdout, " (optional) is one of:\n"); fprintf(stdout, " NL: LSB byte order, using new index format\n"); fprintf(stdout, " NM: MSB byte order, using new index format\n"); fprintf(stdout, " The following old format options are deprecated:\n"); fprintf(stdout, " N: Native byte order\n"); fprintf(stdout, " L: LSB (intel) byte order\n"); fprintf(stdout, " M: MSB byte order\n"); fprintf(stdout, " The default index_format on this system is: %s\n\n", (byte_order == MS_NEW_LSB_ORDER) ? "NL" : "NM"); exit(0); } if (argc >= 3) depth = atoi(argv[2]); if (argc >= 4) { if (!strcasecmp(argv[3], "N")) byte_order = MS_NATIVE_ORDER; if (!strcasecmp(argv[3], "L")) byte_order = MS_LSB_ORDER; if (!strcasecmp(argv[3], "M")) byte_order = MS_MSB_ORDER; if (!strcasecmp(argv[3], "NL")) byte_order = MS_NEW_LSB_ORDER; if (!strcasecmp(argv[3], "NM")) byte_order = MS_NEW_MSB_ORDER; } if (msShapefileOpen(&shapefile, "rb", argv[1], MS_TRUE) == -1) { fprintf(stdout, "Error opening shapefile %s.\n", argv[1]); exit(0); } printf( "creating index of %s %s format\n", (byte_order < 1 ? "old (deprecated)" : "new"), ((byte_order == MS_NATIVE_ORDER) ? "native" : ((byte_order == MS_LSB_ORDER) || (byte_order == MS_NEW_LSB_ORDER) ? " LSB" : "MSB"))); tree = msCreateTree(&shapefile, depth); if (!tree) { #if MAX_SUBNODE == 2 fprintf(stdout, "Error generating binary tree.\n"); #else fprintf(stdout, "Error generating quadtree.\n"); #endif exit(0); } msWriteTree(tree, AddFileSuffix(argv[1], MS_INDEX_EXTENSION), byte_order); msDestroyTree(tree); /* ** Clean things up */ msShapefileClose(&shapefile); return (0); } mapserver-8.6.0/src/apps/shptreetst.c000066400000000000000000000126331511405061000176320ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Utility program to visualize a quadtree search * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" #include #ifndef _WIN32 #include #endif #include #include #ifdef SHPT_POLYGON #undef MAPSERVER #else #define MAPSERVER 1 #define SHPT_POLYGON MS_SHP_POLYGON #endif char *AddFileSuffix(const char *Filename, const char *Suffix) { char *pszFullname, *pszBasename; int i; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *)msSmallMalloc(strlen(Filename) + 5); strcpy(pszBasename, Filename); for (i = (int)strlen(pszBasename) - 1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i--) { } if (pszBasename[i] == '.') pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ /* a PC to Unix with upper case filenames won't work! */ /* -------------------------------------------------------------------- */ pszFullname = (char *)msSmallMalloc(strlen(pszBasename) + 5); sprintf(pszFullname, "%s%s", pszBasename, Suffix); msFree(pszBasename); return (pszFullname); } int main(int argc, char **argv) { SHPTreeHandle qix; int i, j; rectObj rect; int pos; ms_bitarray bitmap = NULL; /* char mBigEndian; */ treeNodeObj *node = NULL; /* -------------------------------------------------------------------- */ /* Display a usage message. */ /* -------------------------------------------------------------------- */ if (argc <= 1) { printf("shptreetst shapefile {minx miny maxx maxy}\n"); exit(1); } /* i = 1; if( *((unsigned char *) &i) == 1 ) mBigEndian = 0; else mBigEndian = 1; */ qix = msSHPDiskTreeOpen(AddFileSuffix(argv[1], ".qix"), 0 /* no debug*/); if (qix == NULL) { printf("unable to open index file %s \n", argv[1]); exit(-1); } printf("This %s %s index supports a shapefile with %d shapes, %d depth \n", (qix->version ? "new" : "old"), (qix->LSB_order ? "LSB" : "MSB"), (int)qix->nShapes, (int)qix->nDepth); /* -------------------------------------------------------------------- */ /* Skim over the list of shapes, printing all the vertices. */ /* -------------------------------------------------------------------- */ pos = ftell(qix->fp); j = 0; while (pos && j < 20) { j++; /* fprintf (stderr,"box %d, at %d pos \n", j, (int) ftell(qix)); */ node = readTreeNode(qix); if (node) { fprintf(stdout, "shapes %d, node %d, %f,%f,%f,%f \n", (int)node->numshapes, node->numsubnodes, node->rect.minx, node->rect.miny, node->rect.maxx, node->rect.maxy); } else { pos = 0; } } printf("read entire file now at quad box rec %d file pos %ld\n", j, ftell(qix->fp)); j = qix->nShapes; msSHPDiskTreeClose(qix); if (argc >= 5) { rect.minx = atof(argv[2]); rect.miny = atof(argv[3]); rect.maxx = atof(argv[4]); rect.maxy = atof(argv[5]); } else { if (node == NULL) { printf("node == NULL"); return 1; } printf("using last read box as a search \n"); rect.minx = node->rect.minx; rect.miny = node->rect.miny; rect.maxx = node->rect.maxx; rect.maxy = node->rect.maxy; } bitmap = msSearchDiskTree(argv[1], rect, 0 /* no debug*/, j); /* j < INT_MAX - 1 test just to please Coverity untrusted bound loop warning */ if (bitmap && j < INT_MAX - 1) { printf("result of rectangle search was \n"); for (i = 0; i < j; i++) { if (msGetBit(bitmap, i)) { printf(" %d,", i); } } } printf("\n"); return (0); } mapserver-8.6.0/src/apps/shptreevis.c000066400000000000000000000156531511405061000176260ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Utility program to visualize a quadtree * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" #include #ifndef _WIN32 #include #endif #include #ifdef SHPT_POLYGON #undef MAPSERVER #else #define MAPSERVER 1 #define SHPT_POLYGON SHP_POLYGON #endif char *AddFileSuffix(const char *Filename, const char *Suffix) { char *pszFullname, *pszBasename; size_t i; /* -------------------------------------------------------------------- */ /* Compute the base (layer) name. If there is any extension */ /* on the passed in filename we will strip it off. */ /* -------------------------------------------------------------------- */ pszBasename = (char *)msSmallMalloc(strlen(Filename) + 5); strcpy(pszBasename, Filename); for (i = strlen(pszBasename) - 1; i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/' && pszBasename[i] != '\\'; i--) { } if (pszBasename[i] == '.') pszBasename[i] = '\0'; /* -------------------------------------------------------------------- */ /* Open the .shp and .shx files. Note that files pulled from */ /* a PC to Unix with upper case filenames won't work! */ /* -------------------------------------------------------------------- */ pszFullname = (char *)msSmallMalloc(strlen(pszBasename) + 5); sprintf(pszFullname, "%s%s", pszBasename, Suffix); free(pszBasename); return (pszFullname); } int main(int argc, char **argv) { SHPHandle hSHP; DBFHandle hDBF; SHPTreeHandle qix; char *myfile = NULL; treeNodeObj *node; #ifdef MAPSERVER shapeObj shape; lineObj line[3]; pointObj pts[6]; #else SHPObject *shape; double X[6], Y[6]; #endif int result; /* char mBigEndian; int i; */ int this_rec; /* -------------------------------------------------------------------- */ /* Display a usage message. */ /* -------------------------------------------------------------------- */ if (argc <= 2) { printf("shptreevis shapefile new_shapefile \n"); exit(1); } /* i = 1; if( *((unsigned char *) &i) == 1 ) mBigEndian = 0; else mBigEndian = 1; */ qix = msSHPDiskTreeOpen(AddFileSuffix(argv[1], ".qix"), 0 /* no debug*/); if (qix == NULL) { printf("unable to open index file %s \n", argv[1]); exit(-1); } /* -------------------------------------------------------------------- */ /* Open the passed shapefile. */ /* -------------------------------------------------------------------- */ myfile = AddFileSuffix(argv[2], ".shp"); #ifdef MAPSERVER hSHP = msSHPCreate(myfile, SHPT_POLYGON); hDBF = msDBFCreate(AddFileSuffix(argv[2], ".dbf")); #else hSHP = SHPCreate(myfile, SHPT_POLYGON); hDBF = DBFCreate(AddFileSuffix(argv[2], ".dbf")); #endif if ((!hSHP) || (!hDBF)) { printf("create error for %s ... exiting \n", myfile); exit(-1); } /* add fields to dbf */ #ifdef MAPSERVER msDBFAddField(hDBF, "ITEMS", FTInteger, 15, 0); msDBFAddField(hDBF, "SUBNODES", FTInteger, 15, 0); msDBFAddField(hDBF, "FACTOR", FTInteger, 15, 0); #else DBFAddField(hDBF, "ITEMS", FTInteger, 15, 0); DBFAddField(hDBF, "SUBNODES", FTInteger, 15, 0); DBFAddField(hDBF, "FACTOR", FTInteger, 15, 0); #endif #ifndef MAPSERVER SHPClose(hSHP); hSHP = SHPOpen(myfile, "r+b"); DBFClose(hDBF); hDBF = DBFOpen(myfile, "r+b"); #endif printf("This %s %s index supports a shapefile with %d shapes, %d depth \n", (qix->version ? "new" : "old"), (qix->LSB_order ? "LSB" : "MSB"), (int)qix->nShapes, (int)qix->nDepth); /* -------------------------------------------------------------------- */ /* Skim over the list of shapes, printing all the vertices. */ /* -------------------------------------------------------------------- */ while (1) { node = readTreeNode(qix); if (node) { this_rec = hDBF->nRecords; #ifdef MAPSERVER msDBFWriteIntegerAttribute(hDBF, this_rec, 0, node->numshapes); msDBFWriteIntegerAttribute(hDBF, this_rec, 1, node->numsubnodes); #else DBFWriteIntegerAttribute(hDBF, this_rec, 0, node->numshapes); DBFWriteIntegerAttribute(hDBF, this_rec, 1, node->numsubnodes); #endif #ifdef MAPSERVER shape.numlines = 1; shape.type = SHPT_POLYGON; pts[0].x = node->rect.minx; pts[0].y = node->rect.miny; pts[1].x = node->rect.maxx; pts[1].y = node->rect.miny; pts[2].x = node->rect.maxx; pts[2].y = node->rect.maxy; pts[3].x = node->rect.minx; pts[3].y = node->rect.maxy; pts[4].x = node->rect.minx; pts[4].y = node->rect.miny; line[0].numpoints = 5; line[0].point = &pts[0]; shape.line = &line[0]; shape.bounds = node->rect; result = msSHPWriteShape(hSHP, &shape); if (result < 0) { printf("unable to write shape \n"); exit(0); } #else X[0] = node->rect.minx; X[1] = node->rect.maxx; X[2] = node->rect.maxx; X[3] = node->rect.minx; X[4] = node->rect.minx; Y[0] = node->rect.miny; Y[1] = node->rect.miny; Y[2] = node->rect.maxy; Y[3] = node->rect.maxy; Y[4] = node->rect.miny; shape = SHPCreateSimpleObject(SHPT_POLYGON, 5, X, Y, NULL); SHPWriteObject(hSHP, -1, shape); SHPDestroyObject(shape); #endif } else break; } #ifdef MAPSERVER msSHPClose(hSHP); msDBFClose(hDBF); #else SHPClose(hSHP); DBFClose(hDBF); #endif msSHPDiskTreeClose(qix); return (0); } mapserver-8.6.0/src/apps/sortshp.c000066400000000000000000000202561511405061000171270ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Command line utility to sort a shapefile based on a single * attribute in ascending or descending order. Useful for * prioritizing drawing or labeling of shapes. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include #include #include #include "../mapserver.h" typedef struct { double number; char string[255]; int index; } sortStruct; static int compare_string_descending(const void *a, const void *b) { const sortStruct *i = a, *j = b; return (strcmp(j->string, i->string)); } static int compare_string_ascending(const void *a, const void *b) { const sortStruct *i = a, *j = b; return (strcmp(i->string, j->string)); } static int compare_number_descending(const void *a, const void *b) { const sortStruct *i = a, *j = b; if (i->number > j->number) return (-1); if (i->number < j->number) return (1); return (0); } static int compare_number_ascending(const void *a, const void *b) { const sortStruct *i = a, *j = b; if (i->number > j->number) return (1); if (i->number < j->number) return (-1); return (0); } int main(int argc, char *argv[]) { SHPHandle inSHP, outSHP; /* ---- Shapefile file pointers ---- */ DBFHandle inDBF, outDBF; /* ---- DBF file pointers ---- */ sortStruct *array; shapeObj shape; int shpType, nShapes; int fieldNumber = -1; /* ---- Field number of item to be sorted on ---- */ DBFFieldType dbfField; char fName[20]; int fWidth, fnDecimals; char buffer[1024]; int i, j; int num_fields, num_records; if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } /* ------------------------------------------------------------------------------- */ /* Check the number of arguments, return syntax if not correct */ /* ------------------------------------------------------------------------------- */ if (argc != 5) { fprintf( stderr, "Syntax: sortshp [infile] [outfile] [item] [ascending|descending]\n"); exit(1); } msSetErrorFile("stderr", NULL); /* ------------------------------------------------------------------------------- */ /* Open the shapefile */ /* ------------------------------------------------------------------------------- */ inSHP = msSHPOpen(argv[1], "rb"); if (!inSHP) { fprintf(stderr, "Unable to open %s shapefile.\n", argv[1]); exit(1); } msSHPGetInfo(inSHP, &nShapes, &shpType); /* ------------------------------------------------------------------------------- */ /* Open the dbf file */ /* ------------------------------------------------------------------------------- */ snprintf(buffer, sizeof(buffer), "%s.dbf", argv[1]); inDBF = msDBFOpen(buffer, "rb"); if (inDBF == NULL) { fprintf(stderr, "Unable to open %s XBASE file.\n", buffer); exit(1); } num_fields = msDBFGetFieldCount(inDBF); num_records = msDBFGetRecordCount(inDBF); for (i = 0; i < num_fields; i++) { msDBFGetFieldInfo(inDBF, i, fName, NULL, NULL); if (strncasecmp(argv[3], fName, (int)strlen(argv[3])) == 0) { /* ---- Found it ---- */ fieldNumber = i; break; } } if (fieldNumber < 0) { fprintf(stderr, "Item %s doesn't exist in %s\n", argv[3], buffer); exit(1); } array = (sortStruct *)malloc(sizeof(sortStruct) * num_records); /* ---- Allocate the array ---- */ if (!array) { fprintf(stderr, "Unable to allocate sort array.\n"); exit(1); } /* ------------------------------------------------------------------------------- */ /* Load the array to be sorted */ /* ------------------------------------------------------------------------------- */ dbfField = msDBFGetFieldInfo(inDBF, fieldNumber, NULL, NULL, NULL); switch (dbfField) { case FTString: for (i = 0; i < num_records; i++) { strlcpy(array[i].string, msDBFReadStringAttribute(inDBF, i, fieldNumber), sizeof(array[i].string)); array[i].index = i; } if (*argv[4] == 'd') qsort(array, num_records, sizeof(sortStruct), compare_string_descending); else qsort(array, num_records, sizeof(sortStruct), compare_string_ascending); break; case FTInteger: case FTDouble: for (i = 0; i < num_records; i++) { array[i].number = msDBFReadDoubleAttribute(inDBF, i, fieldNumber); array[i].index = i; } if (*argv[4] == 'd') qsort(array, num_records, sizeof(sortStruct), compare_number_descending); else qsort(array, num_records, sizeof(sortStruct), compare_number_ascending); break; default: fprintf(stderr, "Data type for item %s not supported.\n", argv[3]); exit(1); } /* ------------------------------------------------------------------------------- */ /* Setup the output .shp/.shx and .dbf files */ /* ------------------------------------------------------------------------------- */ outSHP = msSHPCreate(argv[2], shpType); if (outSHP == NULL) { fprintf(stderr, "Failed to create file '%s'.\n", argv[2]); exit(1); } sprintf(buffer, "%s.dbf", argv[2]); outDBF = msDBFCreate(buffer); if (outDBF == NULL) { fprintf(stderr, "Failed to create dbf file '%s'.\n", buffer); exit(1); } for (i = 0; i < num_fields; i++) { dbfField = msDBFGetFieldInfo( inDBF, i, fName, &fWidth, &fnDecimals); /* ---- Get field info from in file ---- */ msDBFAddField(outDBF, fName, dbfField, fWidth, fnDecimals); } /* ------------------------------------------------------------------------------- */ /* Write the sorted .shp/.shx and .dbf files */ /* ------------------------------------------------------------------------------- */ for (i = 0; i < num_records; i++) { /* ---- For each shape/record ---- */ for (j = 0; j < num_fields; j++) { /* ---- For each .dbf field ---- */ dbfField = msDBFGetFieldInfo(inDBF, j, fName, &fWidth, &fnDecimals); switch (dbfField) { case FTInteger: msDBFWriteIntegerAttribute( outDBF, i, j, msDBFReadIntegerAttribute(inDBF, array[i].index, j)); break; case FTDouble: msDBFWriteDoubleAttribute( outDBF, i, j, msDBFReadDoubleAttribute(inDBF, array[i].index, j)); break; case FTString: msDBFWriteStringAttribute( outDBF, i, j, msDBFReadStringAttribute(inDBF, array[i].index, j)); break; default: fprintf(stderr, "Unsupported data type for field: %s, exiting.\n", fName); exit(0); } } msSHPReadShape(inSHP, array[i].index, &shape); msSHPWriteShape(outSHP, &shape); msFreeShape(&shape); } free(array); msSHPClose(inSHP); msDBFClose(inDBF); msSHPClose(outSHP); msDBFClose(outDBF); return (0); } mapserver-8.6.0/src/apps/testcopy.c000066400000000000000000000052731511405061000173010ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Test of msCopyMap() * Author: Sean Gilles * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "../mapserver.h" void printAtts(mapObj *, const char *); int main(int argc, char *argv[]) { mapObj *original_map, *clone_map; /* --------------------------------------------------------------------- * Test 1: free original before freeing clone * --------------------------------------------------------------------- */ /* Load map file */ original_map = msLoadMap("tests/test.map", NULL); if (original_map == NULL) { /* Write errors */ msWriteError(stderr); msResetErrorList(); exit(0); } /* Dump out some attributes */ printAtts(original_map, "Original"); /* Clone it */ clone_map = msNewMapObj(); msCopyMap(clone_map, original_map); /* Write errors */ msWriteError(stderr); msResetErrorList(); /* Free */ msFreeMap(original_map); /* Dump clone's attributes */ printAtts(clone_map, "Clone"); /* Free clone */ msFreeMap(clone_map); exit(0); } void printAtts(mapObj *map, const char *title) { printf("\n%s Attributes\n----------------------\n", title); printf("Map Name: %s\n", map->name); printf("Numlayers: %d\n", map->numlayers); printf("Map Fontset Filename: %s\n", map->fontset.filename); printf("Map Symbolset Filename: %s\n", map->symbolset.filename); } mapserver-8.6.0/src/apps/testexpr.c000066400000000000000000000045321511405061000173020ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Commandline tester for expression evaluation * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include "../mapserver.h" #include "../mapparser.h" #include "../mapfile.h" extern int msyyparse(); extern int msyylex(); extern char *msyystring_buffer; extern int msyyresult; /* result of parsing, true/false */ extern int msyystate; extern char *msyystring; int main(int argc, char *argv[]) { int status; if (argc > 1 && strcmp(argv[1], "-v") == 0) { printf("%s\n", msGetVersion()); exit(0); } /* ---- check the number of arguments, return syntax if not correct ---- */ if (argc < 2) { fprintf(stdout, "Syntax: testexpr [string]\n"); exit(0); } msyystate = MS_TOKENIZE_EXPRESSION; msyystring = argv[1]; status = msyyparse(); if (status != 0) printf("Error parsing expression near %s.\n", msyystring_buffer); else printf("Expression evalulated to: %d.\n", msyyresult); exit(0); } mapserver-8.6.0/src/apps/tile4ms.c000066400000000000000000000216441511405061000170100ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Create shapefile of rectangles from extents of several shapefiles * (=tiles) * Create DBF with file names for shape tiles, in column LOCATION as * required by mapserv. * For use with Mapserv tiling capability. * Author: Herbie Freytag hfreytag@dlwc.nsw.gov.au * * Note: * Resulting shape files do not display in ArcView. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ /* * This is a modified version of Herbie's program that works with MapServer's * shapelib and should be using the MapServer makefile. * */ #include "../mapserver.h" #include /***********************************************************************/ int process_shapefiles(char *metaFileNameP, char *tileFileNameP, int tile_path_only) { SHPHandle hSHP, tileSHP; rectObj extentRect; lineObj line; shapeObj shapeRect; DBFHandle tileDBF; DBFHandle shpDBF; typedef struct DBFFieldDef_struct { DBFFieldType type; char name[12]; int width; int decimals; } DBFFieldDef; DBFFieldDef *theFields = NULL; char fldname[256]; int width; int decimals; int fieldCnt; int i; FILE *metaFP = NULL; char *p; char tileshapeName[256]; char tiledbfName[256]; char shapeFileName[256]; int entityNum; int tilesFound = 0; int tilesProcessed = 0; msInitShape(&shapeRect); line.point = (pointObj *)msSmallMalloc(sizeof(pointObj) * 5); line.numpoints = 5; /* open metafile */ /* ------------- */ if (NULL == (metaFP = fopen(metaFileNameP, "r"))) { printf("Unable to open:%s\n", metaFileNameP); return (1); } /* create new tileindex shapefiles and create a header */ /* -------------------------------------------------- */ snprintf(tileshapeName, sizeof(tileshapeName), "%s.shp", tileFileNameP); if (NULL == (tileSHP = msSHPCreate(tileFileNameP, SHP_POLYGON))) { fclose(metaFP); printf("Unable to create %s.shp (.shx)\n", tileFileNameP); return (1); } /* create new tileindex dbf-file */ /* ----------------------------- */ snprintf(tiledbfName, sizeof(tiledbfName), "%s.dbf", tileFileNameP); if (NULL == (tileDBF = msDBFCreate(tiledbfName))) { fclose(metaFP); msSHPClose(tileSHP); printf("DBFCreate(%s) failed.\n", tiledbfName); return (1); } if (msDBFAddField(tileDBF, "LOCATION", FTString, 255, 0) == -1) { fclose(metaFP); msSHPClose(tileSHP); msDBFClose(tileDBF); printf("DBFAddField(fieldname='LOCATION') failed.\n"); return (1); } /* loop through files listed in metafile */ /* ===================================== */ while (fgets(shapeFileName, 255, metaFP)) { if ((p = strchr(shapeFileName, '\n')) != NULL) *p = '\0'; if (!strlen(shapeFileName)) break; tilesFound++; /* read the DBFFields for this shapefile */ /* and save them if the first, otherwise compare them */ shpDBF = msDBFOpen(shapeFileName, "rb"); if (shpDBF == NULL) { printf("Aborted. Unable to open DBF:%s\n", shapeFileName); break; } if (theFields == NULL) { fieldCnt = msDBFGetFieldCount(shpDBF); theFields = (DBFFieldDef *)msSmallCalloc(fieldCnt, sizeof(DBFFieldDef)); for (i = 0; i < fieldCnt; i++) { theFields[i].type = msDBFGetFieldInfo(shpDBF, i, theFields[i].name, &theFields[i].width, &theFields[i].decimals); if (theFields[i].type == FTInvalid) { printf("Aborted. DBF Invalid field (%d of %d) file:%s\n", i, fieldCnt, shapeFileName); break; } } } else { fieldCnt = msDBFGetFieldCount(shpDBF); for (i = 0; i < fieldCnt; i++) { if (theFields[i].type != msDBFGetFieldInfo(shpDBF, i, fldname, &width, &decimals) || strcmp(theFields[i].name, fldname) || theFields[i].width != width || theFields[i].decimals != decimals) { printf("Aborted. DBF fields do not match for file:%s\n", shapeFileName); break; } } } msDBFClose(shpDBF); /* Get rid of .shp extension if it was included. */ if (strlen(shapeFileName) > 4 && (p = shapeFileName + strlen(shapeFileName) - 4) && strcasecmp(p, ".shp") == 0) *p = '\0'; if (!strlen(shapeFileName)) break; /* read extent from shapefile */ /* -------------------------- */ hSHP = msSHPOpen(shapeFileName, "rb"); if (hSHP == NULL) { printf("Aborted. Unable to open SHP:%s\n", shapeFileName); break; } msSHPReadBounds(hSHP, -1, &extentRect); /* SHPGetInfo(hSHP, &nEntities, &nShapeType, adfBndsMin, adfBndsMax); */ /* printf("File: %s Bounds 0/1: * (%15.10lg,%15.10lg)\n\t(%15.10lg,%15.10lg)\n", shapeFileName, * adfBndsMin[0], adfBndsMin[1], adfBndsMax[0], adfBndsMax[1] ); */ msSHPClose(hSHP); /* create rectangle describing current shapefile extent */ /* ---------------------------------------------------- */ line.point[0].x = line.point[4].x = extentRect.minx; /* bottom left */ line.point[0].y = line.point[4].y = extentRect.miny; line.point[1].x = extentRect.minx; /* top left */ line.point[1].y = extentRect.maxy; line.point[2].x = extentRect.maxx; /* top left */ line.point[2].y = extentRect.maxy; line.point[3].x = extentRect.maxx; /* bottom right */ line.point[3].y = extentRect.miny; /* create and add shape object. Returns link to entry in DBF file */ /* --------------------------------------------------------------- */ shapeRect.type = MS_SHAPE_POLYGON; msAddLine(&shapeRect, &line); entityNum = msSHPWriteShape(tileSHP, &shapeRect); msFreeShape(&shapeRect); /* store filepath of current shapefile as attribute of rectangle */ /* ------------------------------------------------------------- */ /* Strip off filename if requested */ if (tile_path_only) { char *pszTmp; if ((pszTmp = strrchr(shapeFileName, '/')) != NULL || (pszTmp = strrchr(shapeFileName, '\\')) != NULL) { *(pszTmp + 1) = '\0'; /* Keep the trailing '/' only. */ } } msDBFWriteStringAttribute(tileDBF, entityNum, 0, shapeFileName); tilesProcessed++; } msSHPClose(tileSHP); msDBFClose(tileDBF); fclose(metaFP); free(line.point); free(theFields); printf("Processed %i of %i files\n", tilesProcessed, tilesFound); return (0); } /***********************************************************************/ void print_usage_and_exit(void) { printf("\nusage: tile4ms [-tile-path-only]\n"); printf("\tINPUT file containing list of shapefile " "names\n\t\t(complete paths 255 chars max, no extension)\n"); printf("\tOUTPUT shape file of extent rectangles and " "names\n\t\tof tiles in .dbf\n"); printf("-tile-path-only\tOptional flag. If specified then only the path to " "the \n\t\tshape files will be stored in the LOCATION " "field\n\t\tinstead of storing the full filename.\n\n"); exit(1); } /***********************************************************************/ int main(int argc, char **argv) { int tile_path_only = 0; /* stun user with existence of help */ /* -------------------------------- */ if ((argc == 2) && (strstr(argv[1], "-h"))) { print_usage_and_exit(); } /* check arguments */ /* --------------- */ if (argc < 3) { print_usage_and_exit(); } if (argc == 4 && strcmp(argv[3], "-tile-path-only") == 0) { tile_path_only = 1; } process_shapefiles(argv[1], argv[2], tile_path_only); exit(0); } mapserver-8.6.0/src/cgiutil.c000066400000000000000000000366111511405061000161240ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: cgiRequestObj and CGI parameter parsing. * Author: Steve Lime and the MapServer team. * * Notes: Portions derived from NCSA HTTPd Server's example CGI programs *(util.c). * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include #include #include #include "mapserver.h" #include "cgiutil.h" #include "cpl_conv.h" #define LF 10 #define CR 13 int readPostBody(cgiRequestObj *request, char **data) { size_t data_max, data_len; int chunk_size; (void)request; msIO_needBinaryStdin(); /* -------------------------------------------------------------------- */ /* If the length is provided, read in one gulp. */ /* -------------------------------------------------------------------- */ if (getenv("CONTENT_LENGTH") != NULL) { data_max = (size_t)atoi(getenv("CONTENT_LENGTH")); /* Test for suspicious CONTENT_LENGTH (negative value or SIZE_MAX) */ if (data_max >= SIZE_MAX) { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("Suspicious Content-Length.\n"); msSetError(MS_WEBERR, "Suspicious Content-Length.", "readPostBody()"); return MS_FAILURE; } *data = (char *)malloc(data_max + 1); if (*data == NULL) { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("malloc() failed, Content-Length: %u unreasonably // large?\n", (unsigned int)data_max ); msSetError(MS_WEBERR, "malloc() failed, Content-Length: %u unreasonably large?", "readPostBody()", (unsigned int)data_max); return MS_FAILURE; } if ((int)msIO_fread(*data, 1, data_max, stdin) < (int)data_max) { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("POST body is short\n"); msSetError(MS_WEBERR, "POST body is short.", "readPostBody()"); return MS_FAILURE; } (*data)[data_max] = '\0'; return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* Otherwise read in chunks to the end. */ /* -------------------------------------------------------------------- */ #define DATA_ALLOC_SIZE 10000 data_max = DATA_ALLOC_SIZE; data_len = 0; *data = (char *)msSmallMalloc(data_max + 1); (*data)[data_max] = '\0'; while ((chunk_size = msIO_fread(*data + data_len, 1, data_max - data_len, stdin)) > 0) { data_len += chunk_size; if (data_len == data_max) { /* Realloc buffer, making sure we check for possible size_t overflow */ if (data_max > SIZE_MAX - (DATA_ALLOC_SIZE + 1)) { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("Possible size_t overflow, cannot reallocate input // buffer, POST body too large?\n" ); msSetError(MS_WEBERR, "Possible size_t overflow, cannot reallocate input buffer, " "POST body too large?", "readPostBody()"); return MS_FAILURE; } data_max = data_max + DATA_ALLOC_SIZE; *data = (char *)msSmallRealloc(*data, data_max + 1); } } (*data)[data_len] = '\0'; return MS_SUCCESS; } static char *msGetEnv(const char *name, void *thread_context) { (void)thread_context; return getenv(name); } int loadParams(cgiRequestObj *request, char *(*getenv2)(const char *, void *thread_context), char *raw_post_data, ms_uint32 raw_post_data_length, void *thread_context) { int m = 0; char *s, *queryString = NULL, *httpCookie = NULL; int debuglevel; int maxParams = MS_DEFAULT_CGI_PARAMS; if (getenv2 == NULL) getenv2 = &msGetEnv; if (getenv2("REQUEST_METHOD", thread_context) == NULL) { msIO_printf("This script can only be used to decode form results and \n"); msIO_printf("should be initiated as a CGI process via a httpd server.\n"); msIO_printf("For other options please try using the --help switch.\n"); return -1; } debuglevel = (int)msGetGlobalDebugLevel(); if (strcmp(getenv2("REQUEST_METHOD", thread_context), "POST") == 0 && CPLGetConfigOption("MS_NO_POST", NULL) == NULL) { /* we've got a post from a form */ char *post_data; int data_len; request->type = MS_POST_REQUEST; if (request->contenttype == NULL) { s = getenv2("CONTENT_TYPE", thread_context); if (s != NULL) { request->contenttype = msStrdup(s); } else { /* we've to set default Content-Type which is * application/octet-stream according to * W3 RFC 2626 section 7.2.1 */ request->contenttype = msStrdup("application/octet-stream"); } } if (raw_post_data) { post_data = msStrdup(raw_post_data); data_len = raw_post_data_length; } else { if (MS_SUCCESS != readPostBody(request, &post_data)) return -1; data_len = strlen(post_data); } /* if the content_type is application/x-www-form-urlencoded, we have to parse it like the QUERY_STRING variable */ if (strncmp(request->contenttype, "application/x-www-form-urlencoded", strlen("application/x-www-form-urlencoded")) == 0) { while (data_len > 0 && isspace(post_data[data_len - 1])) post_data[--data_len] = '\0'; while (post_data[0]) { if (m >= maxParams) { maxParams *= 2; request->ParamNames = (char **)msSmallRealloc( request->ParamNames, sizeof(char *) * maxParams); request->ParamValues = (char **)msSmallRealloc( request->ParamValues, sizeof(char *) * maxParams); } request->ParamValues[m] = makeword(post_data, '&'); plustospace(request->ParamValues[m]); unescape_url(request->ParamValues[m]); request->ParamNames[m] = makeword(request->ParamValues[m], '='); m++; } free(post_data); } else request->postrequest = post_data; /* check the QUERY_STRING even in the post request since it can contain information. Eg a wfs request with */ s = getenv2("QUERY_STRING", thread_context); if (s) { if (debuglevel >= MS_DEBUGLEVEL_DEBUG) msDebug("loadParams() QUERY_STRING: %s\n", s); queryString = msStrdup(s); while (queryString[0] != '\0') { if (m >= maxParams) { maxParams *= 2; request->ParamNames = (char **)msSmallRealloc( request->ParamNames, sizeof(char *) * maxParams); request->ParamValues = (char **)msSmallRealloc( request->ParamValues, sizeof(char *) * maxParams); } request->ParamValues[m] = makeword(queryString, '&'); plustospace(request->ParamValues[m]); unescape_url(request->ParamValues[m]); request->ParamNames[m] = makeword(request->ParamValues[m], '='); m++; } } } else { if (strcmp(getenv2("REQUEST_METHOD", thread_context), "GET") == 0) { /* we've got a get request */ request->type = MS_GET_REQUEST; s = getenv2("QUERY_STRING", thread_context); if (s == NULL) { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("No query information to decode. QUERY_STRING not // set.\n"); msSetError(MS_WEBERR, "No query information to decode. QUERY_STRING not set.", "loadParams()"); return -1; } if (debuglevel >= MS_DEBUGLEVEL_DEBUG) msDebug("loadParams() QUERY_STRING: %s\n", s); if (strlen(s) == 0) { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("No query information to decode. QUERY_STRING is set, but // empty.\n"); msSetError( MS_WEBERR, "No query information to decode. QUERY_STRING is set, but empty.", "loadParams()"); return -1; } /* don't modify the string returned by getenv2 */ queryString = msStrdup(s); while (queryString[0] != '\0') { if (m >= maxParams) { maxParams *= 2; request->ParamNames = (char **)msSmallRealloc( request->ParamNames, sizeof(char *) * maxParams); request->ParamValues = (char **)msSmallRealloc( request->ParamValues, sizeof(char *) * maxParams); } request->ParamValues[m] = makeword(queryString, '&'); plustospace(request->ParamValues[m]); unescape_url(request->ParamValues[m]); request->ParamNames[m] = makeword(request->ParamValues[m], '='); m++; } } else { // msIO_setHeader("Content-Type","text/html"); // msIO_sendHeaders(); // msIO_printf("This script should be referenced with a METHOD of GET or // METHOD of POST.\n"); msSetError(MS_WEBERR, "This script should be referenced with a METHOD of GET or " "METHOD of POST.", "loadParams()"); return -1; } } /* check for any available cookies */ s = getenv2("HTTP_COOKIE", thread_context); if (s != NULL) { httpCookie = msStrdup(s); request->httpcookiedata = msStrdup(s); while (httpCookie[0] != '\0') { if (m >= maxParams) { maxParams *= 2; request->ParamNames = (char **)msSmallRealloc( request->ParamNames, sizeof(char *) * maxParams); request->ParamValues = (char **)msSmallRealloc( request->ParamValues, sizeof(char *) * maxParams); } request->ParamValues[m] = makeword(httpCookie, ';'); plustospace(request->ParamValues[m]); unescape_url(request->ParamValues[m]); request->ParamNames[m] = makeword_skip(request->ParamValues[m], '=', ' '); m++; } } if (queryString) free(queryString); if (httpCookie) free(httpCookie); return (m); } void getword(char *word, char *line, char stop) { int x = 0, y; for (x = 0; ((line[x]) && (line[x] != stop)); x++) word[x] = line[x]; word[x] = '\0'; if (line[x]) ++x; y = 0; while ((line[y++] = line[x++])) ; } char *makeword_skip(char *line, char stop, char skip) { int x = 0, y, offset = 0; char *word = (char *)msSmallMalloc(sizeof(char) * (strlen(line) + 1)); for (x = 0; ((line[x]) && (line[x] == skip)); x++) ; offset = x; for (x = offset; ((line[x]) && (line[x] != stop)); x++) word[x - offset] = line[x]; word[x - offset] = '\0'; if (line[x]) ++x; y = 0; while ((line[y++] = line[x++])) ; return word; } char *makeword(char *line, char stop) { int x = 0, y; char *word = (char *)msSmallMalloc(sizeof(char) * (strlen(line) + 1)); for (x = 0; ((line[x]) && (line[x] != stop)); x++) word[x] = line[x]; word[x] = '\0'; if (line[x]) ++x; y = 0; while ((line[y++] = line[x++])) ; return word; } char *fmakeword(FILE *f, char stop, int *cl) { int wsize; char *word; int ll; wsize = 102400; ll = 0; word = (char *)msSmallMalloc(sizeof(char) * (wsize + 1)); while (1) { word[ll] = (char)fgetc(f); if (ll == wsize) { word[ll + 1] = '\0'; wsize += 102400; word = (char *)msSmallRealloc(word, sizeof(char) * (wsize + 1)); } --(*cl); if ((word[ll] == stop) || (feof(f)) || (!(*cl))) { if (word[ll] != stop) ll++; word[ll] = '\0'; word = (char *)msSmallRealloc(word, ll + 1); return word; } ++ll; } } char x2c(char *what) { register char digit; digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0')); digit *= 16; digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0')); return (digit); } void unescape_url(char *url) { register int x, y; for (x = 0, y = 0; url[y]; ++x, ++y) { if ((url[x] = url[y]) == '%') { url[x] = x2c(&url[y + 1]); y += 2; } } url[x] = '\0'; } void plustospace(char *str) { register int x; for (x = 0; str[x]; x++) if (str[x] == '+') str[x] = ' '; } int rind(char *s, char c) { register int x; for (x = strlen(s) - 1; x != -1; x--) if (s[x] == c) return x; return -1; } void send_fd(FILE *f, FILE *fd) { int c; while (1) { c = fgetc(f); if (c == EOF) return; fputc((char)c, fd); } } int ind(char *s, char c) { register int x; for (x = 0; s[x]; x++) if (s[x] == c) return x; return -1; } /* ** patched version according to CERT advisory... */ void escape_shell_cmd(char *cmd) { register int x, y, l; l = strlen(cmd); for (x = 0; cmd[x]; x++) { if (ind("&;`'\"|*?~<>^()[]{}$\\\n", cmd[x]) != -1) { for (y = l + 1; y > x; y--) cmd[y] = cmd[y - 1]; l++; /* length has been increased */ cmd[x] = '\\'; x++; /* skip the character */ } } } /* ** Allocate a new request holder structure */ cgiRequestObj *msAllocCgiObj() { cgiRequestObj *request = (cgiRequestObj *)malloc(sizeof(cgiRequestObj)); if (!request) return NULL; request->ParamNames = (char **)msSmallMalloc(MS_DEFAULT_CGI_PARAMS * sizeof(char *)); request->ParamValues = (char **)msSmallMalloc(MS_DEFAULT_CGI_PARAMS * sizeof(char *)); request->NumParams = 0; request->type = MS_GET_REQUEST; request->contenttype = NULL; request->postrequest = NULL; request->httpcookiedata = NULL; request->path_info = NULL; request->api_path = NULL; request->api_path_length = 0; return request; } void msFreeCgiObj(cgiRequestObj *request) { msFreeCharArray(request->ParamNames, request->NumParams); msFreeCharArray(request->ParamValues, request->NumParams); request->ParamNames = NULL; request->ParamValues = NULL; request->NumParams = 0; request->type = -1; msFree(request->contenttype); msFree(request->postrequest); msFree(request->httpcookiedata); request->contenttype = NULL; request->postrequest = NULL; request->httpcookiedata = NULL; if (request->api_path) { msFreeCharArray(request->api_path, request->api_path_length); request->api_path = NULL; request->api_path_length = 0; } msFree(request); } mapserver-8.6.0/src/cgiutil.h000066400000000000000000000066701511405061000161330ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: cgiRequestObj and CGI parsing utility related declarations. * Author: Steve Lime and the MapServer team. * * Notes: Portions derived from NCSA HTTPd Server's example CGI programs *(util.c). * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef CGIUTIL_H #define CGIUTIL_H #ifdef __cplusplus extern "C" { #endif #if defined(_WIN32) && !defined(__CYGWIN__) #define MS_DLL_EXPORT __declspec(dllexport) #else #define MS_DLL_EXPORT #endif /* ** Misc. defines */ #define MS_DEFAULT_CGI_PARAMS 100 enum MS_REQUEST_TYPE { MS_GET_REQUEST, MS_POST_REQUEST }; /** Class for programming OWS services */ typedef struct { #ifndef SWIG char **ParamNames; char **ParamValues; #endif #ifdef SWIG %immutable; #endif int NumParams; ///< The number of querystring parameters #ifdef SWIG %mutable; #endif enum MS_REQUEST_TYPE type; ///< A :ref:`request type constant` char *contenttype; ///< The content type of the request char *postrequest; ///< Any POST data request char *httpcookiedata; ///< Any cookie data associated with the request #ifndef SWIG const char *path_info; int api_path_length; char **api_path; #endif } cgiRequestObj; /* ** Function prototypes */ #ifndef SWIG MS_DLL_EXPORT int loadParams(cgiRequestObj *request, char *(*getenv2)(const char *, void *thread_context), char *raw_post_data, ms_uint32 raw_post_data_length, void *thread_context); MS_DLL_EXPORT void getword(char *, char *, char); MS_DLL_EXPORT char *makeword_skip(char *, char, char); MS_DLL_EXPORT char *makeword(char *, char); MS_DLL_EXPORT char *fmakeword(FILE *, char, int *); MS_DLL_EXPORT char x2c(char *); MS_DLL_EXPORT void unescape_url(char *); MS_DLL_EXPORT void plustospace(char *); MS_DLL_EXPORT int rind(char *, char); MS_DLL_EXPORT void send_fd(FILE *, FILE *); MS_DLL_EXPORT int ind(char *, char); MS_DLL_EXPORT void escape_shell_cmd(char *); MS_DLL_EXPORT cgiRequestObj *msAllocCgiObj(void); MS_DLL_EXPORT void msFreeCgiObj(cgiRequestObj *request); #endif /*SWIG*/ #ifdef __cplusplus } #endif #endif /* CGIUTIL_H */ mapserver-8.6.0/src/classobject.c000066400000000000000000000145551511405061000167630ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Functions for operating on a classObj that don't belong in a * more specific file such as mapfile.c. * Adapted from mapobject.c. * Author: Sean Gillies, sgillies@frii.com * ****************************************************************************** * Copyright (c) 2004, Sean Gillies * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" /* ** Add a label to a classObj (order doesn't matter for labels like it does with *styles) */ int msAddLabelToClass(classObj *class, labelObj *label) { if (!label) { msSetError(MS_CHILDERR, "Can't add a NULL label.", "msAddLabelToClass()"); return MS_FAILURE; } if (msGrowClassLabels(class) == NULL) return MS_FAILURE; /* msGrowClassLabels will alloc the label, free it in this case */ free(class->labels[class->numlabels]); class->labels[class->numlabels] = label; MS_REFCNT_INCR(label); class->numlabels++; return MS_SUCCESS; } /* ** Remove a label from a classObj. */ labelObj *msRemoveLabelFromClass(classObj *class, int nLabelIndex) { int i; labelObj *label; if (nLabelIndex < 0 || nLabelIndex >= class->numlabels) { msSetError(MS_CHILDERR, "Cannot remove label, invalid index %d", "msRemoveLabelFromClass()", nLabelIndex); return NULL; } else { label = class->labels[nLabelIndex]; for (i = nLabelIndex; i < class->numlabels - 1; i++) { class->labels[i] = class->labels[i + 1]; } class->labels[class->numlabels - 1] = NULL; class->numlabels--; MS_REFCNT_DECR(label); return label; } } /** * Move the style up inside the array of styles. */ int msMoveStyleUp(classObj *class, int nStyleIndex) { styleObj *psTmpStyle = NULL; if (class && nStyleIndex < class->numstyles && nStyleIndex > 0) { psTmpStyle = (styleObj *)malloc(sizeof(styleObj)); initStyle(psTmpStyle); msCopyStyle(psTmpStyle, class->styles[nStyleIndex]); msCopyStyle(class->styles[nStyleIndex], class->styles[nStyleIndex - 1]); msCopyStyle(class->styles[nStyleIndex - 1], psTmpStyle); return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveStyleUp()", nStyleIndex); return (MS_FAILURE); } /** * Move the style down inside the array of styles. */ int msMoveStyleDown(classObj *class, int nStyleIndex) { styleObj *psTmpStyle = NULL; if (class && nStyleIndex < class->numstyles - 1 && nStyleIndex >= 0) { psTmpStyle = (styleObj *)malloc(sizeof(styleObj)); initStyle(psTmpStyle); msCopyStyle(psTmpStyle, class->styles[nStyleIndex]); msCopyStyle(class->styles[nStyleIndex], class->styles[nStyleIndex + 1]); msCopyStyle(class->styles[nStyleIndex + 1], psTmpStyle); return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveStyleDown()", nStyleIndex); return (MS_FAILURE); } /* Moved here from mapscript.i * * Returns the index at which the style was inserted * */ int msInsertStyle(classObj *class, styleObj *style, int nStyleIndex) { int i; if (!style) { msSetError(MS_CHILDERR, "Can't insert a NULL Style", "msInsertStyle()"); return -1; } /* Ensure there is room for a new style */ if (msGrowClassStyles(class) == NULL) { return -1; } /* Catch attempt to insert past end of styles array */ else if (nStyleIndex >= class->numstyles) { msSetError(MS_CHILDERR, "Cannot insert style beyond index %d", "insertStyle()", class->numstyles - 1); return -1; } else if (nStyleIndex < 0) { /* Insert at the end by default */ class->styles[class->numstyles] = style; MS_REFCNT_INCR(style); class->numstyles++; return class->numstyles - 1; } else { /* Move styles existing at the specified nStyleIndex or greater */ /* to a higher nStyleIndex */ for (i = class->numstyles - 1; i >= nStyleIndex; i--) { class->styles[i + 1] = class->styles[i]; } class->styles[nStyleIndex] = style; MS_REFCNT_INCR(style); class->numstyles++; return nStyleIndex; } } styleObj *msRemoveStyle(classObj *class, int nStyleIndex) { int i; styleObj *style; if (nStyleIndex < 0 || nStyleIndex >= class->numstyles) { msSetError(MS_CHILDERR, "Cannot remove style, invalid nStyleIndex %d", "removeStyle()", nStyleIndex); return NULL; } else { style = class->styles[nStyleIndex]; for (i = nStyleIndex; i < class->numstyles - 1; i++) { class->styles[i] = class->styles[i + 1]; } class->styles[class->numstyles - 1] = NULL; class->numstyles--; MS_REFCNT_DECR(style); return style; } } /** * Delete the style identified by the index and shift * styles that follows the deleted style. */ int msDeleteStyle(classObj *class, int nStyleIndex) { if (class && nStyleIndex < class->numstyles && nStyleIndex >= 0) { if (freeStyle(class->styles[nStyleIndex]) == MS_SUCCESS) msFree(class->styles[nStyleIndex]); for (int i = nStyleIndex; i < class->numstyles - 1; i++) { class->styles[i] = class->styles[i + 1]; } class->styles[class->numstyles - 1] = NULL; class->numstyles--; return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msDeleteStyle()", nStyleIndex); return (MS_FAILURE); } mapserver-8.6.0/src/dejavu-sans-condensed.h000066400000000000000000150115301511405061000206500ustar00rootroot00000000000000/* Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below) Bitstream Vera Fonts Copyright ------------------------------ Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. Arev Fonts Copyright ------------------------------ Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Tavmjong Bah" or the word "Arev". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Tavmjong Bah Arev" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. */ #ifndef _DEJAVU_SANS_CONDENSED_H #define _DEJAVU_SANS_CONDENSED_H /* to regenerate this file, use the `xxd -i` command */ unsigned char dejavu_sans_condensed_ttf[] = { 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x01, 0x00, 0x00, 0x04, 0x00, 0x30, 0x46, 0x46, 0x54, 0x4d, 0x66, 0x09, 0x1f, 0xf9, 0x00, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x00, 0x1c, 0x47, 0x44, 0x45, 0x46, 0xc3, 0x10, 0xc5, 0x70, 0x00, 0x00, 0x01, 0x58, 0x00, 0x00, 0x01, 0xc2, 0x47, 0x50, 0x4f, 0x53, 0xfc, 0xcc, 0xe2, 0x8c, 0x00, 0x00, 0x03, 0x1c, 0x00, 0x00, 0x70, 0xc4, 0x47, 0x53, 0x55, 0x42, 0x81, 0x22, 0xfe, 0xaf, 0x00, 0x00, 0x73, 0xe0, 0x00, 0x00, 0x0d, 0x50, 0x4f, 0x53, 0x2f, 0x32, 0x8d, 0x18, 0xe6, 0xc7, 0x00, 0x00, 0x81, 0x30, 0x00, 0x00, 0x00, 0x56, 0x63, 0x6d, 0x61, 0x70, 0x26, 0x77, 0xbd, 0xfb, 0x00, 0x00, 0x81, 0x88, 0x00, 0x00, 0x0e, 0x0e, 0x63, 0x76, 0x74, 0x20, 0x00, 0x69, 0x1d, 0x39, 0x00, 0x00, 0x8f, 0x98, 0x00, 0x00, 0x01, 0xfe, 0x66, 0x70, 0x67, 0x6d, 0x71, 0x34, 0x76, 0x6a, 0x00, 0x00, 0x91, 0x98, 0x00, 0x00, 0x00, 0xab, 0x67, 0x61, 0x73, 0x70, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x92, 0x44, 0x00, 0x00, 0x00, 0x0c, 0x67, 0x6c, 0x79, 0x66, 0xbf, 0x93, 0x97, 0x69, 0x00, 0x00, 0x92, 0x50, 0x00, 0x06, 0x16, 0x80, 0x68, 0x65, 0x61, 0x64, 0x00, 0x93, 0x52, 0xd5, 0x00, 0x06, 0xa8, 0xd0, 0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, 0x0c, 0x31, 0x19, 0x73, 0x00, 0x06, 0xa9, 0x08, 0x00, 0x00, 0x00, 0x24, 0x68, 0x6d, 0x74, 0x78, 0xd6, 0x38, 0x75, 0x2e, 0x00, 0x06, 0xa9, 0x2c, 0x00, 0x00, 0x48, 0x38, 0x6b, 0x65, 0x72, 0x6e, 0x87, 0x38, 0x36, 0x5f, 0x00, 0x06, 0xf1, 0x64, 0x00, 0x00, 0x3f, 0xfc, 0x6c, 0x6f, 0x63, 0x61, 0x2b, 0x97, 0xe6, 0xcc, 0x00, 0x07, 0x31, 0x60, 0x00, 0x00, 0x48, 0x3c, 0x6d, 0x61, 0x78, 0x70, 0x16, 0x7b, 0x04, 0x5b, 0x00, 0x07, 0x79, 0x9c, 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0xf0, 0xf9, 0x25, 0x82, 0x00, 0x07, 0x79, 0xbc, 0x00, 0x00, 0x3d, 0xc5, 0x70, 0x6f, 0x73, 0x74, 0x6b, 0x1b, 0xc9, 0x76, 0x00, 0x07, 0xb7, 0x84, 0x00, 0x00, 0xb1, 0xbd, 0x70, 0x72, 0x65, 0x70, 0x3b, 0x07, 0xf1, 0x00, 0x00, 0x08, 0x69, 0x44, 0x00, 0x00, 0x05, 0x68, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x89, 0x6f, 0x31, 0x00, 0x00, 0x00, 0x00, 0xce, 0x3f, 0xd8, 0x63, 0x00, 0x00, 0x00, 0x00, 0xce, 0x3f, 0xd8, 0x64, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x56, 0x01, 0x5e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x03, 0x02, 0xb0, 0x00, 0x01, 0x02, 0xb1, 0x02, 0xc5, 0x00, 0x03, 0x02, 0xc6, 0x02, 0xc6, 0x00, 0x01, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x03, 0x02, 0xcb, 0x02, 0xcc, 0x00, 0x01, 0x02, 0xcd, 0x02, 0xd1, 0x00, 0x03, 0x02, 0xd2, 0x02, 0xd3, 0x00, 0x01, 0x02, 0xd4, 0x02, 0xe4, 0x00, 0x03, 0x02, 0xe5, 0x02, 0xe9, 0x00, 0x01, 0x02, 0xea, 0x02, 0xf3, 0x00, 0x03, 0x02, 0xf4, 0x02, 0xf4, 0x00, 0x01, 0x02, 0xf5, 0x02, 0xf5, 0x00, 0x03, 0x02, 0xf6, 0x02, 0xf6, 0x00, 0x01, 0x02, 0xf7, 0x02, 0xff, 0x00, 0x03, 0x03, 0x00, 0x03, 0x00, 0x00, 0x01, 0x03, 0x01, 0x03, 0x04, 0x00, 0x03, 0x03, 0x05, 0x03, 0x05, 0x00, 0x01, 0x03, 0x06, 0x03, 0x06, 0x00, 0x03, 0x03, 0x07, 0x03, 0x07, 0x00, 0x01, 0x03, 0x08, 0x03, 0x09, 0x00, 0x03, 0x03, 0x0a, 0x03, 0x0a, 0x00, 0x01, 0x03, 0x0b, 0x03, 0x0c, 0x00, 0x03, 0x03, 0x0d, 0x04, 0x16, 0x00, 0x01, 0x04, 0x17, 0x04, 0x1b, 0x00, 0x03, 0x04, 0x1c, 0x05, 0x49, 0x00, 0x01, 0x05, 0x4a, 0x05, 0x4f, 0x00, 0x03, 0x05, 0x50, 0x07, 0x70, 0x00, 0x01, 0x07, 0x71, 0x07, 0x71, 0x00, 0x02, 0x07, 0x72, 0x07, 0x7b, 0x00, 0x01, 0x07, 0x7c, 0x07, 0x7e, 0x00, 0x02, 0x07, 0x7f, 0x07, 0xd1, 0x00, 0x01, 0x07, 0xd2, 0x07, 0xd2, 0x00, 0x02, 0x07, 0xd3, 0x07, 0xe2, 0x00, 0x01, 0x07, 0xe3, 0x07, 0xe9, 0x00, 0x03, 0x07, 0xea, 0x07, 0xea, 0x00, 0x02, 0x07, 0xeb, 0x07, 0xee, 0x00, 0x01, 0x07, 0xef, 0x07, 0xf0, 0x00, 0x02, 0x07, 0xf1, 0x08, 0x08, 0x00, 0x01, 0x08, 0x09, 0x08, 0x0a, 0x00, 0x02, 0x08, 0x0b, 0x08, 0x23, 0x00, 0x01, 0x08, 0x24, 0x08, 0x24, 0x00, 0x02, 0x08, 0x25, 0x0f, 0x08, 0x00, 0x01, 0x0f, 0x09, 0x0f, 0x0f, 0x00, 0x02, 0x0f, 0x10, 0x0f, 0x10, 0x00, 0x01, 0x0f, 0x11, 0x0f, 0x11, 0x00, 0x03, 0x0f, 0x12, 0x0f, 0x12, 0x00, 0x01, 0x0f, 0x13, 0x0f, 0x13, 0x00, 0x03, 0x0f, 0x14, 0x10, 0xea, 0x00, 0x01, 0x10, 0xeb, 0x10, 0xf5, 0x00, 0x03, 0x10, 0xf6, 0x11, 0x49, 0x00, 0x01, 0x11, 0x4a, 0x11, 0x51, 0x00, 0x03, 0x11, 0x52, 0x11, 0xab, 0x00, 0x01, 0x11, 0xac, 0x11, 0xac, 0x00, 0x03, 0x11, 0xad, 0x12, 0x0d, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x02, 0xb1, 0x02, 0xc6, 0x00, 0x01, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x02, 0x02, 0xcd, 0x02, 0xd7, 0x00, 0x02, 0x02, 0xd8, 0x02, 0xd8, 0x00, 0x03, 0x02, 0xd9, 0x02, 0xd9, 0x00, 0x04, 0x02, 0xda, 0x02, 0xe4, 0x00, 0x02, 0x02, 0xea, 0x02, 0xed, 0x00, 0x02, 0x02, 0xee, 0x02, 0xf5, 0x00, 0x01, 0x02, 0xf6, 0x02, 0xf6, 0x00, 0x02, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x01, 0x02, 0xf8, 0x02, 0xfa, 0x00, 0x02, 0x02, 0xfb, 0x02, 0xfd, 0x00, 0x01, 0x02, 0xfe, 0x02, 0xff, 0x00, 0x02, 0x03, 0x01, 0x03, 0x02, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x00, 0x02, 0x03, 0x04, 0x03, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x01, 0xd8, 0x02, 0x32, 0x00, 0x14, 0x44, 0x46, 0x4c, 0x54, 0x00, 0x7a, 0x61, 0x72, 0x61, 0x62, 0x00, 0x86, 0x61, 0x72, 0x6d, 0x6e, 0x00, 0xa8, 0x62, 0x72, 0x61, 0x69, 0x00, 0xb4, 0x63, 0x61, 0x6e, 0x73, 0x00, 0xc0, 0x63, 0x68, 0x65, 0x72, 0x00, 0xcc, 0x63, 0x79, 0x72, 0x6c, 0x00, 0xd8, 0x67, 0x65, 0x6f, 0x72, 0x00, 0xf4, 0x67, 0x72, 0x65, 0x6b, 0x01, 0x00, 0x68, 0x61, 0x6e, 0x69, 0x01, 0x10, 0x68, 0x65, 0x62, 0x72, 0x01, 0x1c, 0x6b, 0x61, 0x6e, 0x61, 0x01, 0x2a, 0x6c, 0x61, 0x6f, 0x20, 0x01, 0x36, 0x6c, 0x61, 0x74, 0x6e, 0x01, 0x42, 0x6d, 0x61, 0x74, 0x68, 0x01, 0x82, 0x6e, 0x6b, 0x6f, 0x20, 0x01, 0x8e, 0x6f, 0x67, 0x61, 0x6d, 0x01, 0x9c, 0x72, 0x75, 0x6e, 0x72, 0x01, 0xa8, 0x74, 0x66, 0x6e, 0x67, 0x01, 0xb4, 0x74, 0x68, 0x61, 0x69, 0x01, 0xc2, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x4b, 0x55, 0x52, 0x20, 0x00, 0x16, 0x53, 0x4e, 0x44, 0x20, 0x00, 0x16, 0x55, 0x52, 0x44, 0x20, 0x00, 0x16, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x4d, 0x4b, 0x44, 0x20, 0x00, 0x10, 0x53, 0x52, 0x42, 0x20, 0x00, 0x10, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x08, 0x49, 0x53, 0x4d, 0x20, 0x00, 0x34, 0x4b, 0x53, 0x4d, 0x20, 0x00, 0x34, 0x4c, 0x53, 0x4d, 0x20, 0x00, 0x34, 0x4d, 0x4f, 0x4c, 0x20, 0x00, 0x34, 0x4e, 0x53, 0x4d, 0x20, 0x00, 0x34, 0x52, 0x4f, 0x4d, 0x20, 0x00, 0x34, 0x53, 0x4b, 0x53, 0x20, 0x00, 0x34, 0x53, 0x53, 0x4d, 0x20, 0x00, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x6b, 0x65, 0x72, 0x6e, 0x00, 0x2c, 0x6b, 0x65, 0x72, 0x6e, 0x00, 0x32, 0x6d, 0x61, 0x72, 0x6b, 0x00, 0x3a, 0x6d, 0x61, 0x72, 0x6b, 0x00, 0x40, 0x6d, 0x61, 0x72, 0x6b, 0x00, 0x48, 0x6d, 0x6b, 0x6d, 0x6b, 0x00, 0x4e, 0x6d, 0x6b, 0x6d, 0x6b, 0x00, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x10, 0x00, 0x18, 0x00, 0x22, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x44, 0x00, 0x4c, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x44, 0x00, 0x06, 0x00, 0x04, 0x00, 0x02, 0x00, 0xf0, 0x03, 0xd0, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x08, 0x86, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x0f, 0xc0, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x11, 0x72, 0x17, 0x1c, 0x17, 0x9c, 0x1b, 0x3a, 0x2c, 0x8e, 0x44, 0xde, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x46, 0x1c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x6d, 0xca, 0x00, 0x01, 0x00, 0x58, 0x00, 0x4e, 0x00, 0x01, 0x00, 0x62, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3c, 0x00, 0x01, 0x01, 0xcc, 0x08, 0xfc, 0x00, 0x01, 0x01, 0xcc, 0x09, 0xc4, 0x00, 0x01, 0x01, 0xcc, 0x08, 0xfc, 0x00, 0x01, 0x01, 0xcc, 0x08, 0x34, 0x00, 0x01, 0x01, 0xcc, 0x09, 0xc4, 0x00, 0x01, 0x01, 0xcc, 0x08, 0x34, 0x00, 0x01, 0x01, 0xcc, 0x07, 0xd0, 0x00, 0x01, 0x01, 0xcc, 0x09, 0x60, 0x00, 0x02, 0x00, 0x01, 0x11, 0x4a, 0x11, 0x51, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x11, 0x4a, 0x11, 0x51, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0x5a, 0x01, 0x26, 0x00, 0x01, 0x01, 0x94, 0x00, 0x0c, 0x00, 0x23, 0x00, 0x48, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x5a, 0x00, 0x60, 0x00, 0x66, 0x00, 0x6c, 0x00, 0x72, 0x00, 0x78, 0x00, 0x7e, 0x00, 0x84, 0x00, 0x8a, 0x00, 0x90, 0x00, 0x96, 0x00, 0x9c, 0x00, 0xa2, 0x00, 0xa8, 0x00, 0xae, 0x00, 0xb4, 0x00, 0xba, 0x00, 0xc0, 0x00, 0xc6, 0x00, 0xcc, 0x00, 0xd2, 0x00, 0xd8, 0x00, 0xde, 0x00, 0xe4, 0x00, 0xea, 0x00, 0xf0, 0x00, 0xf6, 0x00, 0xfc, 0x01, 0x02, 0x01, 0x08, 0x01, 0x0e, 0x01, 0x14, 0x00, 0x01, 0xfe, 0x34, 0xfd, 0xde, 0x00, 0x01, 0xfe, 0x34, 0xfd, 0xde, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfd, 0xda, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x89, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x89, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x89, 0x00, 0x01, 0xfe, 0x34, 0xfd, 0xda, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x14, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x74, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x74, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x1f, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x3b, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x18, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x15, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x38, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x38, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x38, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0xbf, 0x00, 0x01, 0xfe, 0x34, 0xfd, 0xda, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x1f, 0x00, 0x01, 0xfe, 0x35, 0xfe, 0x13, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x0b, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x0e, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x0e, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x0e, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x0e, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x0e, 0x00, 0x01, 0xfe, 0x34, 0xfe, 0x13, 0x00, 0x01, 0xfe, 0x34, 0xfd, 0xda, 0x00, 0x02, 0x00, 0x08, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x00, 0x02, 0xcd, 0x02, 0xd1, 0x00, 0x04, 0x02, 0xd4, 0x02, 0xe2, 0x00, 0x09, 0x02, 0xea, 0x02, 0xed, 0x00, 0x18, 0x02, 0xf8, 0x02, 0xfa, 0x00, 0x1c, 0x02, 0xfe, 0x02, 0xff, 0x00, 0x1f, 0x03, 0x03, 0x03, 0x03, 0x00, 0x21, 0x03, 0x06, 0x03, 0x06, 0x00, 0x22, 0x00, 0x02, 0x00, 0x09, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x00, 0x02, 0xcd, 0x02, 0xd1, 0x00, 0x04, 0x02, 0xd4, 0x02, 0xd7, 0x00, 0x09, 0x02, 0xda, 0x02, 0xe2, 0x00, 0x0d, 0x02, 0xea, 0x02, 0xed, 0x00, 0x16, 0x02, 0xf8, 0x02, 0xfa, 0x00, 0x1a, 0x02, 0xfe, 0x02, 0xff, 0x00, 0x1d, 0x03, 0x03, 0x03, 0x03, 0x00, 0x1f, 0x03, 0x06, 0x03, 0x06, 0x00, 0x20, 0x00, 0x21, 0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x92, 0x00, 0x00, 0x00, 0x98, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0xaa, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x00, 0xc2, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xce, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xda, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xe6, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x01, 0x0a, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x01, 0x16, 0x00, 0x00, 0x01, 0x1c, 0x00, 0x00, 0x01, 0x22, 0x00, 0x00, 0x01, 0x28, 0x00, 0x00, 0x01, 0x2e, 0x00, 0x00, 0x01, 0x34, 0x00, 0x00, 0x01, 0x3a, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0x46, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x35, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0x42, 0x01, 0xde, 0x00, 0x01, 0x02, 0x8e, 0x00, 0x0c, 0x00, 0x3a, 0x00, 0x76, 0x00, 0x7c, 0x00, 0x82, 0x00, 0x88, 0x00, 0x8e, 0x00, 0x94, 0x00, 0x9a, 0x00, 0xa0, 0x00, 0xa6, 0x00, 0xac, 0x00, 0xb2, 0x00, 0xb8, 0x00, 0xbe, 0x00, 0xc4, 0x00, 0xca, 0x00, 0xd0, 0x00, 0xd6, 0x00, 0xdc, 0x00, 0xe2, 0x00, 0xe8, 0x00, 0xee, 0x00, 0xf4, 0x00, 0xfa, 0x01, 0x00, 0x01, 0x06, 0x01, 0x0c, 0x01, 0x12, 0x01, 0x18, 0x01, 0x1e, 0x01, 0x24, 0x01, 0x2a, 0x01, 0x30, 0x01, 0x36, 0x01, 0x3c, 0x01, 0x42, 0x01, 0x48, 0x01, 0x4e, 0x01, 0x54, 0x01, 0x5a, 0x01, 0x60, 0x01, 0x66, 0x01, 0x6c, 0x01, 0x72, 0x01, 0x78, 0x01, 0x7e, 0x01, 0x84, 0x01, 0x8a, 0x01, 0x90, 0x01, 0x96, 0x01, 0x9c, 0x01, 0xa2, 0x01, 0xa8, 0x01, 0xae, 0x01, 0xb4, 0x01, 0xba, 0x01, 0xc0, 0x01, 0xc6, 0x01, 0xcc, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x3d, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x44, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0xc5, 0x00, 0x01, 0xfe, 0x34, 0x07, 0x04, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0xa8, 0x00, 0x01, 0xfe, 0x34, 0x06, 0xa8, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x07, 0x56, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x44, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x93, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x3d, 0x00, 0x01, 0xfe, 0x34, 0x07, 0xd0, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x44, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x44, 0x00, 0x01, 0xfe, 0x34, 0x07, 0x04, 0x00, 0x01, 0xfe, 0x34, 0x07, 0x04, 0x00, 0x01, 0xfe, 0x34, 0x07, 0x04, 0x00, 0x01, 0xfe, 0x34, 0x06, 0xda, 0x00, 0x01, 0xfe, 0x34, 0x07, 0x04, 0x00, 0x01, 0x00, 0x00, 0x07, 0x6e, 0x00, 0x01, 0x00, 0x00, 0x07, 0x6e, 0x00, 0x01, 0x00, 0x00, 0x07, 0x6e, 0x00, 0x01, 0x00, 0x00, 0x07, 0x6e, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x68, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x14, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xdb, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x05, 0xf8, 0x00, 0x01, 0xfe, 0x34, 0x06, 0x1e, 0x00, 0x02, 0x00, 0x10, 0x02, 0xb1, 0x02, 0xc2, 0x00, 0x00, 0x02, 0xee, 0x02, 0xee, 0x00, 0x12, 0x02, 0xf0, 0x02, 0xf3, 0x00, 0x13, 0x02, 0xf5, 0x02, 0xf5, 0x00, 0x17, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x18, 0x02, 0xfb, 0x02, 0xfd, 0x00, 0x19, 0x03, 0x01, 0x03, 0x02, 0x00, 0x1c, 0x03, 0x04, 0x03, 0x04, 0x00, 0x1e, 0x03, 0x08, 0x03, 0x09, 0x00, 0x1f, 0x03, 0x0b, 0x03, 0x0c, 0x00, 0x21, 0x05, 0x4a, 0x05, 0x4f, 0x00, 0x23, 0x07, 0xe3, 0x07, 0xe9, 0x00, 0x29, 0x10, 0xeb, 0x10, 0xeb, 0x00, 0x30, 0x10, 0xed, 0x10, 0xed, 0x00, 0x31, 0x10, 0xef, 0x10, 0xf5, 0x00, 0x32, 0x11, 0xac, 0x11, 0xac, 0x00, 0x39, 0x00, 0x02, 0x00, 0x0c, 0x02, 0xb1, 0x02, 0xc2, 0x00, 0x00, 0x02, 0xee, 0x02, 0xee, 0x00, 0x12, 0x02, 0xf0, 0x02, 0xf3, 0x00, 0x13, 0x02, 0xf5, 0x02, 0xf5, 0x00, 0x17, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x18, 0x02, 0xfb, 0x02, 0xfd, 0x00, 0x19, 0x03, 0x01, 0x03, 0x02, 0x00, 0x1c, 0x03, 0x04, 0x03, 0x04, 0x00, 0x1e, 0x05, 0x4a, 0x05, 0x4f, 0x00, 0x1f, 0x07, 0xe3, 0x07, 0xe9, 0x00, 0x25, 0x10, 0xeb, 0x10, 0xf5, 0x00, 0x2c, 0x11, 0xac, 0x11, 0xac, 0x00, 0x37, 0x00, 0x38, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x12, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x24, 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x01, 0x36, 0x00, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00, 0x01, 0x48, 0x00, 0x00, 0x01, 0x4e, 0x00, 0x00, 0x01, 0x54, 0x00, 0x00, 0x01, 0x5a, 0x00, 0x00, 0x01, 0x60, 0x00, 0x00, 0x01, 0x66, 0x00, 0x00, 0x01, 0x6c, 0x00, 0x00, 0x01, 0x72, 0x00, 0x00, 0x01, 0x78, 0x00, 0x00, 0x01, 0x7e, 0x00, 0x00, 0x01, 0x84, 0x00, 0x00, 0x01, 0x8a, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, 0x96, 0x00, 0x00, 0x01, 0x9c, 0x00, 0x00, 0x01, 0xa2, 0x00, 0x00, 0x01, 0xa8, 0x00, 0x00, 0x01, 0xae, 0x00, 0x00, 0x01, 0xb4, 0x00, 0x00, 0x01, 0xba, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x01, 0xc6, 0x00, 0x00, 0x01, 0xcc, 0x00, 0x00, 0x01, 0xd2, 0x00, 0x00, 0x01, 0xd8, 0x00, 0x00, 0x01, 0xde, 0x00, 0x00, 0x01, 0xe4, 0x00, 0x00, 0x01, 0xea, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x01, 0xf6, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x0e, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x26, 0x00, 0x00, 0x02, 0x2c, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0xb0, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0xb0, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x05, 0x02, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0x06, 0xe6, 0x06, 0xbe, 0x00, 0x01, 0x06, 0xf0, 0x00, 0x0c, 0x00, 0xd6, 0x01, 0xae, 0x01, 0xb4, 0x01, 0xba, 0x01, 0xc0, 0x01, 0xc6, 0x01, 0xcc, 0x01, 0xd2, 0x01, 0xd8, 0x01, 0xde, 0x01, 0xe4, 0x01, 0xea, 0x01, 0xf0, 0x01, 0xf6, 0x01, 0xfc, 0x02, 0x02, 0x02, 0x08, 0x02, 0x0e, 0x02, 0x14, 0x02, 0x1a, 0x02, 0x20, 0x02, 0x26, 0x02, 0x2c, 0x02, 0x32, 0x02, 0x38, 0x02, 0x3e, 0x02, 0x44, 0x02, 0x4a, 0x02, 0x50, 0x02, 0x56, 0x02, 0x5c, 0x02, 0x62, 0x02, 0x68, 0x02, 0x6e, 0x02, 0x74, 0x02, 0x7a, 0x02, 0x80, 0x02, 0x86, 0x02, 0x8c, 0x02, 0x92, 0x02, 0x98, 0x02, 0x9e, 0x02, 0xa4, 0x02, 0xaa, 0x02, 0xb0, 0x02, 0xb6, 0x02, 0xbc, 0x02, 0xc2, 0x02, 0xc8, 0x02, 0xce, 0x02, 0xd4, 0x02, 0xda, 0x02, 0xe0, 0x02, 0xe6, 0x02, 0xec, 0x02, 0xf2, 0x02, 0xf8, 0x02, 0xfe, 0x03, 0x04, 0x03, 0x0a, 0x03, 0x10, 0x03, 0x16, 0x03, 0x1c, 0x03, 0x22, 0x03, 0x28, 0x03, 0x2e, 0x03, 0x34, 0x03, 0x3a, 0x03, 0x40, 0x03, 0x46, 0x03, 0x4c, 0x03, 0x52, 0x03, 0x58, 0x03, 0x5e, 0x03, 0x64, 0x03, 0x6a, 0x03, 0x70, 0x03, 0x76, 0x03, 0x7c, 0x03, 0x82, 0x03, 0x88, 0x03, 0x8e, 0x03, 0x94, 0x03, 0x9a, 0x03, 0xa0, 0x03, 0xa6, 0x03, 0xac, 0x03, 0xb2, 0x03, 0xb8, 0x03, 0xbe, 0x03, 0xc4, 0x03, 0xca, 0x03, 0xd0, 0x03, 0xd6, 0x03, 0xdc, 0x03, 0xe2, 0x03, 0xe8, 0x03, 0xee, 0x03, 0xf4, 0x03, 0xfa, 0x04, 0x00, 0x04, 0x06, 0x04, 0x0c, 0x04, 0x12, 0x04, 0x18, 0x04, 0x1e, 0x04, 0x24, 0x04, 0x2a, 0x04, 0x30, 0x04, 0x36, 0x04, 0x3c, 0x04, 0x42, 0x04, 0x48, 0x04, 0x4e, 0x04, 0x54, 0x04, 0x5a, 0x04, 0x60, 0x04, 0x66, 0x04, 0x6c, 0x04, 0x72, 0x04, 0x78, 0x04, 0x7e, 0x04, 0x84, 0x04, 0x8a, 0x04, 0x90, 0x04, 0x96, 0x04, 0x9c, 0x04, 0xa2, 0x04, 0xa8, 0x04, 0xae, 0x04, 0xb4, 0x04, 0xba, 0x04, 0xc0, 0x04, 0xc6, 0x04, 0xcc, 0x04, 0xd2, 0x04, 0xd8, 0x04, 0xde, 0x04, 0xe4, 0x04, 0xea, 0x04, 0xf0, 0x04, 0xf6, 0x04, 0xfc, 0x05, 0x02, 0x05, 0x08, 0x05, 0x0e, 0x05, 0x14, 0x05, 0x1a, 0x05, 0x20, 0x05, 0x26, 0x05, 0x2c, 0x05, 0x32, 0x05, 0x38, 0x05, 0x3e, 0x05, 0x44, 0x05, 0x4a, 0x05, 0x50, 0x05, 0x56, 0x05, 0x5c, 0x05, 0x62, 0x05, 0x68, 0x05, 0x6e, 0x05, 0x74, 0x05, 0x7a, 0x05, 0x80, 0x05, 0x86, 0x05, 0x8c, 0x05, 0x92, 0x05, 0x98, 0x05, 0x9e, 0x05, 0xa4, 0x05, 0xaa, 0x05, 0xb0, 0x05, 0xb6, 0x05, 0xbc, 0x05, 0xc2, 0x05, 0xc8, 0x05, 0xce, 0x05, 0xd4, 0x05, 0xda, 0x05, 0xe0, 0x05, 0xe6, 0x05, 0xec, 0x05, 0xf2, 0x05, 0xf8, 0x05, 0xfe, 0x06, 0x04, 0x06, 0x0a, 0x06, 0x10, 0x06, 0x16, 0x06, 0x1c, 0x06, 0x22, 0x06, 0x28, 0x06, 0x2e, 0x06, 0x34, 0x06, 0x3a, 0x06, 0x40, 0x06, 0x46, 0x06, 0x4c, 0x06, 0x52, 0x06, 0x58, 0x06, 0x5e, 0x06, 0x64, 0x06, 0x6a, 0x06, 0x70, 0x06, 0x76, 0x06, 0x7c, 0x06, 0x82, 0x06, 0x88, 0x06, 0x8e, 0x06, 0x94, 0x06, 0x9a, 0x06, 0xa0, 0x06, 0xa6, 0x06, 0xac, 0x00, 0x01, 0x03, 0x2a, 0x03, 0xe8, 0x00, 0x01, 0x01, 0x0d, 0x03, 0xe8, 0x00, 0x01, 0x01, 0x0d, 0x03, 0xe8, 0x00, 0x01, 0x02, 0x76, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xc2, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xd2, 0x03, 0xb6, 0x00, 0x01, 0x01, 0xc2, 0x03, 0x52, 0x00, 0x01, 0x01, 0xc2, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xd2, 0x03, 0xb6, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x03, 0x2a, 0x03, 0x52, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x03, 0x2a, 0x03, 0xe8, 0x00, 0x01, 0x01, 0x0d, 0x05, 0x14, 0x00, 0x01, 0x01, 0x0d, 0x05, 0x14, 0x00, 0x01, 0x02, 0x49, 0x06, 0x0e, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xaa, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xaa, 0x00, 0x01, 0x02, 0x49, 0x05, 0xdc, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x78, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x78, 0x00, 0x01, 0x02, 0x49, 0x05, 0xdc, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x78, 0x00, 0x01, 0x02, 0x1c, 0x05, 0x78, 0x00, 0x01, 0x02, 0x49, 0x04, 0xe2, 0x00, 0x01, 0x02, 0x1c, 0x04, 0x7e, 0x00, 0x01, 0x02, 0x1c, 0x04, 0x7e, 0x00, 0x01, 0x02, 0x76, 0x02, 0xee, 0x00, 0x01, 0x02, 0x76, 0x02, 0xee, 0x00, 0x01, 0x04, 0x42, 0x08, 0x34, 0x00, 0x01, 0x01, 0x31, 0x08, 0x34, 0x00, 0x01, 0x01, 0x31, 0x08, 0x34, 0x00, 0x01, 0x02, 0x76, 0x03, 0xb6, 0x00, 0x01, 0x01, 0x0d, 0x04, 0xb0, 0x00, 0x01, 0x01, 0x0d, 0x04, 0xb0, 0x00, 0x01, 0x02, 0x76, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xef, 0x03, 0x52, 0x00, 0x01, 0x01, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x0e, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x0e, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x0e, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x80, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x80, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x80, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x21, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x21, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x21, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x23, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x23, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x23, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xb0, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xb0, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xb0, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xdd, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xdd, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xdd, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x63, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x63, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x63, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x7e, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x7e, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x7e, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x69, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x69, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x69, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xad, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xad, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xad, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd2, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd2, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd2, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf2, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x52, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x52, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x52, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xad, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xad, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xad, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf2, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xca, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe5, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe5, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x68, 0x03, 0xe8, 0x00, 0x01, 0x01, 0x68, 0x03, 0xe8, 0x00, 0x01, 0x01, 0x95, 0x06, 0x40, 0x00, 0x01, 0x01, 0x95, 0x05, 0xaa, 0x00, 0x01, 0x01, 0x95, 0x05, 0xdc, 0x00, 0x01, 0x02, 0x76, 0x02, 0xee, 0x00, 0x01, 0x02, 0x76, 0x02, 0xee, 0x00, 0x01, 0x02, 0x76, 0x02, 0xee, 0x00, 0x01, 0x02, 0x76, 0x03, 0xe8, 0x00, 0x01, 0x02, 0x76, 0x04, 0xe2, 0x00, 0x01, 0x02, 0x1c, 0x03, 0x20, 0x00, 0x01, 0x02, 0xfd, 0x04, 0x1a, 0x00, 0x01, 0x02, 0xfd, 0x04, 0x1a, 0x00, 0x01, 0x02, 0x1c, 0x03, 0x20, 0x00, 0x01, 0x02, 0x49, 0x03, 0x84, 0x00, 0x01, 0x02, 0x49, 0x03, 0x84, 0x00, 0x01, 0x02, 0x1c, 0x03, 0x20, 0x00, 0x01, 0x02, 0xfd, 0x04, 0xe2, 0x00, 0x01, 0x02, 0xfd, 0x04, 0xe2, 0x00, 0x01, 0x02, 0x1c, 0x03, 0x20, 0x00, 0x01, 0x01, 0xef, 0x03, 0x20, 0x00, 0x01, 0x01, 0xef, 0x03, 0x20, 0x00, 0x01, 0x02, 0x1c, 0x03, 0x20, 0x00, 0x01, 0x02, 0x1c, 0x04, 0xe2, 0x00, 0x01, 0x02, 0x1c, 0x04, 0xe2, 0x00, 0x01, 0x02, 0x1e, 0x06, 0x72, 0x00, 0x01, 0x01, 0x31, 0x06, 0x72, 0x00, 0x01, 0x01, 0x31, 0x06, 0x72, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x78, 0x00, 0x01, 0x01, 0xc2, 0x06, 0x72, 0x00, 0x01, 0x01, 0xbc, 0x05, 0x78, 0x00, 0x01, 0x02, 0x76, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xc2, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xd2, 0x03, 0xb6, 0x00, 0x01, 0x02, 0x76, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x46, 0x00, 0x01, 0x01, 0xd2, 0x04, 0xb0, 0x00, 0x01, 0x02, 0x76, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xc2, 0x04, 0x4c, 0x00, 0x01, 0x01, 0xd2, 0x03, 0xb6, 0x00, 0x01, 0x01, 0xc2, 0x03, 0x52, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x46, 0x00, 0x01, 0x01, 0xd2, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xc2, 0x03, 0x52, 0x00, 0x01, 0x01, 0xc2, 0x06, 0x40, 0x00, 0x01, 0x01, 0xd2, 0x05, 0xaa, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x78, 0x00, 0x01, 0x00, 0x6c, 0x05, 0x78, 0x00, 0x01, 0x00, 0x6c, 0x05, 0x78, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x78, 0x00, 0x01, 0x00, 0xe1, 0x06, 0x0e, 0x00, 0x01, 0x00, 0xe1, 0x06, 0x0e, 0x00, 0x01, 0x02, 0xe6, 0x06, 0x0e, 0x00, 0x01, 0x00, 0xf7, 0x06, 0xa4, 0x00, 0x01, 0x00, 0xf7, 0x06, 0xa4, 0x00, 0x01, 0x02, 0x76, 0x05, 0xdc, 0x00, 0x01, 0x00, 0xe1, 0x06, 0x0e, 0x00, 0x01, 0x00, 0xe1, 0x06, 0x0e, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x78, 0x00, 0x01, 0x00, 0xe1, 0x06, 0xa4, 0x00, 0x01, 0x00, 0xe1, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x78, 0x00, 0x01, 0x00, 0xe1, 0x06, 0xa4, 0x00, 0x01, 0x00, 0xe1, 0x06, 0xa4, 0x00, 0x01, 0x01, 0xc2, 0x05, 0x78, 0x00, 0x01, 0x00, 0xf7, 0x08, 0x66, 0x00, 0x01, 0x00, 0xf7, 0x08, 0x66, 0x00, 0x01, 0x04, 0x42, 0x08, 0x34, 0x00, 0x01, 0x01, 0x31, 0x08, 0x34, 0x00, 0x01, 0x01, 0x31, 0x08, 0x34, 0x00, 0x01, 0x04, 0x42, 0x08, 0x66, 0x00, 0x01, 0x01, 0x31, 0x08, 0x66, 0x00, 0x01, 0x01, 0x31, 0x08, 0x66, 0x00, 0x01, 0x02, 0x49, 0x05, 0x14, 0x00, 0x01, 0x01, 0x31, 0x06, 0x72, 0x00, 0x01, 0x01, 0x31, 0x06, 0x72, 0x00, 0x01, 0x02, 0x49, 0x02, 0xee, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x02, 0x49, 0x02, 0xee, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x01, 0x0d, 0x04, 0x1a, 0x00, 0x01, 0x02, 0x76, 0x03, 0xe8, 0x00, 0x01, 0x01, 0x0d, 0x05, 0x14, 0x00, 0x01, 0x01, 0x0d, 0x05, 0x14, 0x00, 0x02, 0x00, 0x06, 0x10, 0xfc, 0x11, 0x06, 0x00, 0x00, 0x11, 0x08, 0x11, 0x19, 0x00, 0x0b, 0x11, 0x35, 0x11, 0x3d, 0x00, 0x1d, 0x11, 0x3f, 0x11, 0x3f, 0x00, 0x26, 0x11, 0x52, 0x11, 0xab, 0x00, 0x27, 0x11, 0xb9, 0x12, 0x0d, 0x00, 0x81, 0x00, 0x02, 0x00, 0x01, 0x11, 0x4a, 0x11, 0x51, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x01, 0xcc, 0x04, 0xb0, 0x00, 0x01, 0x00, 0x20, 0x00, 0x1a, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x00, 0x01, 0x00, 0xa9, 0x00, 0x02, 0x00, 0x09, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x00, 0x02, 0xcd, 0x02, 0xd1, 0x00, 0x04, 0x02, 0xd4, 0x02, 0xd7, 0x00, 0x09, 0x02, 0xda, 0x02, 0xe4, 0x00, 0x0d, 0x02, 0xea, 0x02, 0xed, 0x00, 0x18, 0x02, 0xf8, 0x02, 0xfa, 0x00, 0x1c, 0x02, 0xfe, 0x02, 0xff, 0x00, 0x1f, 0x03, 0x03, 0x03, 0x03, 0x00, 0x21, 0x03, 0x06, 0x03, 0x06, 0x00, 0x22, 0x00, 0x23, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x12, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x24, 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x01, 0x36, 0x00, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00, 0x01, 0x48, 0x00, 0x00, 0x01, 0x4e, 0x00, 0x00, 0x01, 0x54, 0x00, 0x00, 0x01, 0x5a, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xfe, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xfe, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x35, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0x05, 0x8c, 0x04, 0xb6, 0x00, 0x01, 0x05, 0x94, 0x00, 0x0c, 0x00, 0x95, 0x01, 0x2c, 0x01, 0x32, 0x01, 0x38, 0x01, 0x3e, 0x01, 0x44, 0x01, 0x4a, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5c, 0x01, 0x62, 0x01, 0x68, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x7a, 0x01, 0x80, 0x01, 0x86, 0x01, 0x8c, 0x01, 0x92, 0x01, 0x98, 0x01, 0x9e, 0x01, 0xa4, 0x01, 0xaa, 0x01, 0xb0, 0x01, 0xb6, 0x01, 0xbc, 0x01, 0xc2, 0x01, 0xc8, 0x01, 0xce, 0x01, 0xd4, 0x01, 0xda, 0x01, 0xe0, 0x01, 0xe6, 0x01, 0xec, 0x01, 0xf2, 0x01, 0xf8, 0x01, 0xfe, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1c, 0x02, 0x22, 0x02, 0x28, 0x02, 0x2e, 0x02, 0x34, 0x02, 0x3a, 0x02, 0x40, 0x02, 0x46, 0x02, 0x4c, 0x02, 0x52, 0x02, 0x58, 0x02, 0x5e, 0x02, 0x64, 0x02, 0x6a, 0x02, 0x70, 0x02, 0x76, 0x02, 0x7c, 0x02, 0x82, 0x02, 0x88, 0x02, 0x8e, 0x02, 0x94, 0x02, 0x9a, 0x02, 0xa0, 0x02, 0xa6, 0x02, 0xac, 0x02, 0xb2, 0x02, 0xb8, 0x02, 0xbe, 0x02, 0xc4, 0x02, 0xca, 0x02, 0xd0, 0x02, 0xd6, 0x02, 0xdc, 0x02, 0xe2, 0x02, 0xe8, 0x02, 0xee, 0x02, 0xf4, 0x02, 0xfa, 0x03, 0x00, 0x03, 0x06, 0x03, 0x0c, 0x03, 0x12, 0x03, 0x18, 0x03, 0x1e, 0x03, 0x24, 0x03, 0x2a, 0x03, 0x30, 0x03, 0x36, 0x03, 0x3c, 0x03, 0x42, 0x03, 0x48, 0x03, 0x4e, 0x03, 0x54, 0x03, 0x5a, 0x03, 0x60, 0x03, 0x66, 0x03, 0x6c, 0x03, 0x72, 0x03, 0x78, 0x03, 0x7e, 0x03, 0x84, 0x03, 0x8a, 0x03, 0x90, 0x03, 0x96, 0x03, 0x9c, 0x03, 0xa2, 0x03, 0xa8, 0x03, 0xae, 0x03, 0xb4, 0x03, 0xba, 0x03, 0xc0, 0x03, 0xc6, 0x03, 0xcc, 0x03, 0xd2, 0x03, 0xd8, 0x03, 0xde, 0x03, 0xe4, 0x03, 0xea, 0x03, 0xf0, 0x03, 0xf6, 0x03, 0xfc, 0x04, 0x02, 0x04, 0x08, 0x04, 0x0e, 0x04, 0x14, 0x04, 0x1a, 0x04, 0x20, 0x04, 0x26, 0x04, 0x2c, 0x04, 0x32, 0x04, 0x38, 0x04, 0x3e, 0x04, 0x44, 0x04, 0x4a, 0x04, 0x50, 0x04, 0x56, 0x04, 0x5c, 0x04, 0x62, 0x04, 0x68, 0x04, 0x6e, 0x04, 0x74, 0x04, 0x7a, 0x04, 0x80, 0x04, 0x86, 0x04, 0x8c, 0x04, 0x92, 0x04, 0x98, 0x04, 0x9e, 0x04, 0xa4, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x02, 0x00, 0x23, 0x00, 0x24, 0x00, 0x3d, 0x00, 0x00, 0x00, 0x44, 0x00, 0x5d, 0x00, 0x1a, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x34, 0x00, 0xba, 0x00, 0xba, 0x00, 0x35, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0x36, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0x38, 0x00, 0xf3, 0x00, 0xf3, 0x00, 0x3a, 0x01, 0x28, 0x01, 0x29, 0x00, 0x3b, 0x01, 0x41, 0x01, 0x41, 0x00, 0x3d, 0x01, 0x48, 0x01, 0x48, 0x00, 0x3e, 0x01, 0x51, 0x01, 0x52, 0x00, 0x3f, 0x01, 0x59, 0x01, 0x59, 0x00, 0x41, 0x01, 0x61, 0x01, 0x61, 0x00, 0x42, 0x01, 0x79, 0x01, 0x7b, 0x00, 0x43, 0x02, 0x12, 0x02, 0x12, 0x00, 0x46, 0x02, 0x16, 0x02, 0x16, 0x00, 0x47, 0x02, 0x1b, 0x02, 0x1b, 0x00, 0x48, 0x02, 0x1d, 0x02, 0x1d, 0x00, 0x49, 0x02, 0x2a, 0x02, 0x2a, 0x00, 0x4a, 0x02, 0x37, 0x02, 0x37, 0x00, 0x4b, 0x02, 0x54, 0x02, 0x54, 0x00, 0x4c, 0x05, 0x23, 0x05, 0x23, 0x00, 0x4d, 0x05, 0x5a, 0x05, 0x63, 0x00, 0x4e, 0x0e, 0x38, 0x0e, 0x3a, 0x00, 0x58, 0x0e, 0x3d, 0x0e, 0x3e, 0x00, 0x5b, 0x0e, 0x44, 0x0e, 0x44, 0x00, 0x5d, 0x0e, 0x48, 0x0e, 0x49, 0x00, 0x5e, 0x0e, 0x62, 0x0e, 0x65, 0x00, 0x60, 0x0e, 0x6b, 0x0e, 0x75, 0x00, 0x64, 0x0e, 0x78, 0x0e, 0x81, 0x00, 0x6f, 0x0e, 0x83, 0x0e, 0x87, 0x00, 0x79, 0x0e, 0x8c, 0x0e, 0x8f, 0x00, 0x7e, 0x0e, 0x96, 0x0e, 0xa2, 0x00, 0x82, 0x0e, 0xa4, 0x0e, 0xa8, 0x00, 0x8f, 0x11, 0x1c, 0x11, 0x1c, 0x00, 0x94, 0x00, 0x01, 0x00, 0x02, 0x0f, 0x11, 0x0f, 0x13, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x00, 0x62, 0x00, 0x4e, 0x00, 0x01, 0x00, 0x6a, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x12, 0x00, 0x18, 0x00, 0x1e, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x30, 0x00, 0x36, 0x00, 0x3c, 0x00, 0x01, 0x02, 0x0f, 0x06, 0x14, 0x00, 0x01, 0x02, 0xa1, 0x07, 0x6d, 0x00, 0x01, 0x02, 0x53, 0x06, 0x14, 0x00, 0x01, 0x01, 0x02, 0x06, 0x14, 0x00, 0x01, 0x02, 0x34, 0x06, 0x14, 0x00, 0x01, 0x02, 0x3d, 0x06, 0x14, 0x00, 0x01, 0x02, 0xa1, 0x07, 0x50, 0x00, 0x01, 0x03, 0x97, 0x07, 0x89, 0x00, 0x01, 0x00, 0x08, 0x00, 0xc3, 0x00, 0xd0, 0x00, 0xd5, 0x00, 0xed, 0x01, 0x0f, 0x01, 0x2d, 0x05, 0x5a, 0x05, 0x5b, 0x00, 0x01, 0x00, 0x02, 0x02, 0xb1, 0x02, 0xb2, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x8c, 0x02, 0xd6, 0x00, 0x01, 0x03, 0x92, 0x00, 0x0c, 0x00, 0x59, 0x00, 0xb4, 0x00, 0xba, 0x00, 0xc0, 0x00, 0xc6, 0x00, 0xcc, 0x00, 0xd2, 0x00, 0xd8, 0x00, 0xde, 0x00, 0xe4, 0x00, 0xea, 0x00, 0xf0, 0x00, 0xf6, 0x00, 0xfc, 0x01, 0x02, 0x01, 0x08, 0x01, 0x0e, 0x01, 0x14, 0x01, 0x1a, 0x01, 0x20, 0x01, 0x26, 0x01, 0x2c, 0x01, 0x32, 0x01, 0x38, 0x01, 0x3e, 0x01, 0x44, 0x01, 0x4a, 0x01, 0x50, 0x01, 0x56, 0x01, 0x5c, 0x01, 0x62, 0x01, 0x68, 0x01, 0x6e, 0x01, 0x74, 0x01, 0x7a, 0x01, 0x80, 0x01, 0x86, 0x01, 0x8c, 0x01, 0x92, 0x01, 0x98, 0x01, 0x9e, 0x01, 0xa4, 0x01, 0xaa, 0x01, 0xb0, 0x01, 0xb6, 0x01, 0xbc, 0x01, 0xc2, 0x01, 0xc8, 0x01, 0xce, 0x01, 0xd4, 0x01, 0xda, 0x01, 0xe0, 0x01, 0xe6, 0x01, 0xec, 0x01, 0xf2, 0x01, 0xf8, 0x01, 0xfe, 0x02, 0x04, 0x02, 0x0a, 0x02, 0x10, 0x02, 0x16, 0x02, 0x1c, 0x02, 0x22, 0x02, 0x28, 0x02, 0x2e, 0x02, 0x34, 0x02, 0x3a, 0x02, 0x40, 0x02, 0x46, 0x02, 0x4c, 0x02, 0x52, 0x02, 0x58, 0x02, 0x5e, 0x02, 0x64, 0x02, 0x6a, 0x02, 0x70, 0x02, 0x76, 0x02, 0x7c, 0x02, 0x82, 0x02, 0x88, 0x02, 0x8e, 0x02, 0x94, 0x02, 0x9a, 0x02, 0xa0, 0x02, 0xa6, 0x02, 0xac, 0x02, 0xb2, 0x02, 0xb8, 0x02, 0xbe, 0x02, 0xc4, 0x00, 0x01, 0x04, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf7, 0x00, 0x00, 0x00, 0x01, 0x01, 0xf5, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5e, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x77, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x28, 0x00, 0x00, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x01, 0xf6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x04, 0x7f, 0xfe, 0x80, 0x00, 0x01, 0x03, 0x6f, 0xfe, 0x80, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x7d, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x77, 0x00, 0x00, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x02, 0x47, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x95, 0x00, 0x00, 0x00, 0x01, 0x02, 0x16, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x05, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x04, 0xec, 0x00, 0x00, 0x00, 0x01, 0x05, 0x96, 0x00, 0x00, 0x00, 0x01, 0x04, 0xbd, 0x00, 0x00, 0x00, 0x01, 0x02, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x02, 0x85, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5e, 0x00, 0x00, 0x00, 0x01, 0x01, 0xf6, 0x00, 0x00, 0x00, 0x01, 0x01, 0x69, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0xfe, 0x52, 0x00, 0x01, 0x00, 0x59, 0x00, 0x24, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x36, 0x00, 0x38, 0x00, 0x3d, 0x00, 0x44, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x56, 0x00, 0x58, 0x00, 0x5d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x9a, 0x00, 0xae, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xba, 0x00, 0xc3, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0xd5, 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, 0x00, 0xf2, 0x00, 0xf3, 0x01, 0x0f, 0x01, 0x2d, 0x01, 0x48, 0x01, 0x51, 0x01, 0x52, 0x01, 0x59, 0x01, 0x61, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x91, 0x01, 0x92, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x02, 0x12, 0x02, 0x16, 0x02, 0x1b, 0x02, 0x1d, 0x02, 0x2a, 0x02, 0x37, 0x02, 0x54, 0x05, 0x7e, 0x05, 0x7f, 0x06, 0x18, 0x06, 0x19, 0x0e, 0x38, 0x0e, 0x44, 0x0e, 0x6c, 0x0e, 0x6d, 0x0e, 0x6e, 0x0e, 0x6f, 0x0e, 0x7e, 0x0e, 0x7f, 0x0e, 0x9c, 0x0e, 0x9d, 0x0e, 0xa0, 0x0e, 0xa1, 0x0e, 0xa2, 0x0e, 0xa7, 0x11, 0x1c, 0x11, 0xb8, 0x00, 0x01, 0x00, 0x01, 0x02, 0xd8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0xfe, 0x48, 0x00, 0x00, 0x00, 0x01, 0x0f, 0xba, 0x0d, 0x8e, 0x00, 0x01, 0x0f, 0xf4, 0x00, 0x0c, 0x01, 0xb0, 0x03, 0x62, 0x03, 0x68, 0x03, 0x6e, 0x03, 0x74, 0x03, 0x7a, 0x03, 0x80, 0x03, 0x86, 0x03, 0x8c, 0x03, 0x92, 0x03, 0x98, 0x03, 0x9e, 0x03, 0xa4, 0x03, 0xaa, 0x03, 0xb0, 0x03, 0xb6, 0x03, 0xbc, 0x03, 0xc2, 0x03, 0xc8, 0x03, 0xce, 0x03, 0xd4, 0x03, 0xda, 0x03, 0xe0, 0x03, 0xe6, 0x03, 0xec, 0x03, 0xf2, 0x03, 0xf8, 0x03, 0xfe, 0x04, 0x04, 0x04, 0x0a, 0x04, 0x10, 0x04, 0x16, 0x04, 0x1c, 0x04, 0x22, 0x04, 0x28, 0x04, 0x2e, 0x04, 0x34, 0x04, 0x3a, 0x04, 0x40, 0x04, 0x46, 0x04, 0x4c, 0x04, 0x52, 0x04, 0x58, 0x04, 0x5e, 0x04, 0x64, 0x04, 0x6a, 0x04, 0x70, 0x04, 0x76, 0x04, 0x7c, 0x04, 0x82, 0x04, 0x88, 0x04, 0x8e, 0x04, 0x94, 0x04, 0x9a, 0x04, 0xa0, 0x04, 0xa6, 0x04, 0xac, 0x04, 0xb2, 0x04, 0xb8, 0x04, 0xbe, 0x04, 0xc4, 0x04, 0xca, 0x04, 0xd0, 0x04, 0xd6, 0x04, 0xdc, 0x04, 0xe2, 0x04, 0xe8, 0x04, 0xee, 0x04, 0xf4, 0x04, 0xfa, 0x05, 0x00, 0x05, 0x06, 0x05, 0x0c, 0x05, 0x12, 0x05, 0x18, 0x05, 0x1e, 0x05, 0x24, 0x05, 0x2a, 0x05, 0x30, 0x05, 0x36, 0x05, 0x3c, 0x05, 0x42, 0x05, 0x48, 0x05, 0x4e, 0x05, 0x54, 0x05, 0x5a, 0x05, 0x60, 0x05, 0x66, 0x05, 0x6c, 0x05, 0x72, 0x05, 0x78, 0x05, 0x7e, 0x05, 0x84, 0x05, 0x8a, 0x05, 0x90, 0x05, 0x96, 0x05, 0x9c, 0x05, 0xa2, 0x05, 0xa8, 0x05, 0xae, 0x05, 0xb4, 0x05, 0xba, 0x05, 0xc0, 0x05, 0xc6, 0x05, 0xcc, 0x05, 0xd2, 0x05, 0xd8, 0x05, 0xde, 0x05, 0xe4, 0x05, 0xea, 0x05, 0xf0, 0x05, 0xf6, 0x05, 0xfc, 0x06, 0x02, 0x06, 0x08, 0x06, 0x0e, 0x06, 0x14, 0x06, 0x1a, 0x06, 0x20, 0x06, 0x26, 0x06, 0x2c, 0x06, 0x32, 0x06, 0x38, 0x06, 0x3e, 0x06, 0x44, 0x06, 0x4a, 0x06, 0x50, 0x06, 0x56, 0x06, 0x5c, 0x06, 0x62, 0x06, 0x68, 0x06, 0x6e, 0x06, 0x74, 0x06, 0x7a, 0x06, 0x80, 0x06, 0x86, 0x06, 0x8c, 0x06, 0x92, 0x06, 0x98, 0x06, 0x9e, 0x06, 0xa4, 0x06, 0xaa, 0x06, 0xb0, 0x06, 0xb6, 0x06, 0xbc, 0x06, 0xc2, 0x06, 0xc8, 0x06, 0xce, 0x06, 0xd4, 0x06, 0xda, 0x06, 0xe0, 0x06, 0xe6, 0x06, 0xec, 0x06, 0xf2, 0x06, 0xf8, 0x06, 0xfe, 0x07, 0x04, 0x07, 0x0a, 0x07, 0x10, 0x07, 0x16, 0x07, 0x1c, 0x07, 0x22, 0x07, 0x28, 0x07, 0x2e, 0x07, 0x34, 0x07, 0x3a, 0x07, 0x40, 0x07, 0x46, 0x07, 0x4c, 0x07, 0x52, 0x07, 0x58, 0x07, 0x5e, 0x07, 0x64, 0x07, 0x6a, 0x07, 0x70, 0x07, 0x76, 0x07, 0x7c, 0x07, 0x82, 0x07, 0x88, 0x07, 0x8e, 0x07, 0x94, 0x07, 0x9a, 0x07, 0xa0, 0x07, 0xa6, 0x07, 0xac, 0x07, 0xb2, 0x07, 0xb8, 0x07, 0xbe, 0x07, 0xc4, 0x07, 0xca, 0x07, 0xd0, 0x07, 0xd6, 0x07, 0xdc, 0x07, 0xe2, 0x07, 0xe8, 0x07, 0xee, 0x07, 0xf4, 0x07, 0xfa, 0x08, 0x00, 0x08, 0x06, 0x08, 0x0c, 0x08, 0x12, 0x08, 0x18, 0x08, 0x1e, 0x08, 0x24, 0x08, 0x2a, 0x08, 0x30, 0x08, 0x36, 0x08, 0x3c, 0x08, 0x42, 0x08, 0x48, 0x08, 0x4e, 0x08, 0x54, 0x08, 0x5a, 0x08, 0x60, 0x08, 0x66, 0x08, 0x6c, 0x08, 0x72, 0x08, 0x78, 0x08, 0x7e, 0x08, 0x84, 0x08, 0x8a, 0x08, 0x90, 0x08, 0x96, 0x08, 0x9c, 0x08, 0xa2, 0x08, 0xa8, 0x08, 0xae, 0x08, 0xb4, 0x08, 0xba, 0x08, 0xc0, 0x08, 0xc6, 0x08, 0xcc, 0x08, 0xd2, 0x08, 0xd8, 0x08, 0xde, 0x08, 0xe4, 0x08, 0xea, 0x08, 0xf0, 0x08, 0xf6, 0x08, 0xfc, 0x09, 0x02, 0x09, 0x08, 0x09, 0x0e, 0x09, 0x14, 0x09, 0x1a, 0x09, 0x20, 0x09, 0x26, 0x09, 0x2c, 0x09, 0x32, 0x09, 0x38, 0x09, 0x3e, 0x09, 0x44, 0x09, 0x4a, 0x09, 0x50, 0x09, 0x56, 0x09, 0x5c, 0x09, 0x62, 0x09, 0x68, 0x09, 0x6e, 0x09, 0x74, 0x09, 0x7a, 0x09, 0x80, 0x09, 0x86, 0x09, 0x8c, 0x09, 0x92, 0x09, 0x98, 0x09, 0x9e, 0x09, 0xa4, 0x09, 0xaa, 0x09, 0xb0, 0x09, 0xb6, 0x09, 0xbc, 0x09, 0xc2, 0x09, 0xc8, 0x09, 0xce, 0x09, 0xd4, 0x09, 0xda, 0x09, 0xe0, 0x09, 0xe6, 0x09, 0xec, 0x09, 0xf2, 0x09, 0xf8, 0x09, 0xfe, 0x0a, 0x04, 0x0a, 0x0a, 0x0a, 0x10, 0x0a, 0x16, 0x0a, 0x1c, 0x0a, 0x22, 0x0a, 0x28, 0x0a, 0x2e, 0x0a, 0x34, 0x0a, 0x3a, 0x0a, 0x40, 0x0a, 0x46, 0x0a, 0x4c, 0x0a, 0x52, 0x0a, 0x58, 0x0a, 0x5e, 0x0a, 0x64, 0x0a, 0x6a, 0x0a, 0x70, 0x0a, 0x76, 0x0a, 0x7c, 0x0a, 0x82, 0x0a, 0x88, 0x0a, 0x8e, 0x0a, 0x94, 0x0a, 0x9a, 0x0a, 0xa0, 0x0a, 0xa6, 0x0a, 0xac, 0x0a, 0xb2, 0x0a, 0xb8, 0x0a, 0xbe, 0x0a, 0xc4, 0x0a, 0xca, 0x0a, 0xd0, 0x0a, 0xd6, 0x0a, 0xdc, 0x0a, 0xe2, 0x0a, 0xe8, 0x0a, 0xee, 0x0a, 0xf4, 0x0a, 0xfa, 0x0b, 0x00, 0x0b, 0x06, 0x0b, 0x0c, 0x0b, 0x12, 0x0b, 0x18, 0x0b, 0x1e, 0x0b, 0x24, 0x0b, 0x2a, 0x0b, 0x30, 0x0b, 0x36, 0x0b, 0x3c, 0x0b, 0x42, 0x0b, 0x48, 0x0b, 0x4e, 0x0b, 0x54, 0x0b, 0x5a, 0x0b, 0x60, 0x0b, 0x66, 0x0b, 0x6c, 0x0b, 0x72, 0x0b, 0x78, 0x0b, 0x7e, 0x0b, 0x84, 0x0b, 0x8a, 0x0b, 0x90, 0x0b, 0x96, 0x0b, 0x9c, 0x0b, 0xa2, 0x0b, 0xa8, 0x0b, 0xae, 0x0b, 0xb4, 0x0b, 0xba, 0x0b, 0xc0, 0x0b, 0xc6, 0x0b, 0xcc, 0x0b, 0xd2, 0x0b, 0xd8, 0x0b, 0xde, 0x0b, 0xe4, 0x0b, 0xea, 0x0b, 0xf0, 0x0b, 0xf6, 0x0b, 0xfc, 0x0c, 0x02, 0x0c, 0x08, 0x0c, 0x0e, 0x0c, 0x14, 0x0c, 0x1a, 0x0c, 0x20, 0x0c, 0x26, 0x0c, 0x2c, 0x0c, 0x32, 0x0c, 0x38, 0x0c, 0x3e, 0x0c, 0x44, 0x0c, 0x4a, 0x0c, 0x50, 0x0c, 0x56, 0x0c, 0x5c, 0x0c, 0x62, 0x0c, 0x68, 0x0c, 0x6e, 0x0c, 0x74, 0x0c, 0x7a, 0x0c, 0x80, 0x0c, 0x86, 0x0c, 0x8c, 0x0c, 0x92, 0x0c, 0x98, 0x0c, 0x9e, 0x0c, 0xa4, 0x0c, 0xaa, 0x0c, 0xb0, 0x0c, 0xb6, 0x0c, 0xbc, 0x0c, 0xc2, 0x0c, 0xc8, 0x0c, 0xce, 0x0c, 0xd4, 0x0c, 0xda, 0x0c, 0xe0, 0x0c, 0xe6, 0x0c, 0xec, 0x0c, 0xf2, 0x0c, 0xf8, 0x0c, 0xfe, 0x0d, 0x04, 0x0d, 0x0a, 0x0d, 0x10, 0x0d, 0x16, 0x0d, 0x1c, 0x0d, 0x22, 0x0d, 0x28, 0x0d, 0x2e, 0x0d, 0x34, 0x0d, 0x3a, 0x0d, 0x40, 0x0d, 0x46, 0x0d, 0x4c, 0x0d, 0x52, 0x0d, 0x58, 0x0d, 0x5e, 0x0d, 0x64, 0x0d, 0x6a, 0x0d, 0x70, 0x0d, 0x76, 0x0d, 0x7c, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf7, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa1, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0f, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x56, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa9, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x51, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x03, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x85, 0x00, 0x00, 0x00, 0x01, 0x02, 0x33, 0x00, 0x00, 0x00, 0x01, 0x02, 0x77, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x71, 0x00, 0x00, 0x00, 0x01, 0x02, 0x60, 0x00, 0x00, 0x00, 0x01, 0x02, 0x28, 0x00, 0x00, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x03, 0x84, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x47, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x01, 0xee, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x25, 0x00, 0x00, 0x00, 0x01, 0x02, 0x23, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x03, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x04, 0x7f, 0xfe, 0x80, 0x00, 0x01, 0x03, 0x6f, 0xfe, 0x80, 0x00, 0x01, 0x02, 0xa1, 0x00, 0x00, 0x00, 0x01, 0x02, 0x28, 0x00, 0x00, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x02, 0x88, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x48, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x71, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x28, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x7d, 0x00, 0x00, 0x00, 0x01, 0x01, 0x17, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0xfe, 0x7a, 0x00, 0x01, 0x02, 0x23, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x77, 0x00, 0x00, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x02, 0x47, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x52, 0x00, 0x00, 0x00, 0x01, 0x01, 0x0f, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x02, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x02, 0x33, 0x00, 0x00, 0x00, 0x01, 0x02, 0x23, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x46, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x8d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x4b, 0x00, 0x00, 0x00, 0x01, 0x01, 0x95, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x25, 0x00, 0x00, 0x00, 0x01, 0x02, 0x16, 0x00, 0x00, 0x00, 0x01, 0x02, 0x16, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x2c, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x2c, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x25, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x25, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0xec, 0x00, 0x00, 0x00, 0x01, 0x01, 0x59, 0x00, 0x00, 0x00, 0x01, 0x01, 0x70, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcb, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfa, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xa3, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x84, 0x00, 0x00, 0x00, 0x01, 0x03, 0x84, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x84, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x48, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x48, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x48, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x04, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfc, 0xfe, 0x52, 0x00, 0x01, 0x00, 0xff, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x24, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x35, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0x15, 0x00, 0x00, 0x00, 0x01, 0x01, 0xef, 0xfe, 0x52, 0x00, 0x01, 0x00, 0xfa, 0xfe, 0x52, 0x00, 0x01, 0x00, 0xfa, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xbf, 0xfe, 0x52, 0x00, 0x01, 0x00, 0xfa, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xd9, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xc2, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x02, 0x26, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xe1, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x84, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x84, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x24, 0x00, 0x00, 0x00, 0x01, 0x02, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5f, 0xff, 0xf6, 0x00, 0x01, 0x01, 0x02, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x66, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x22, 0x00, 0x00, 0x00, 0x01, 0x02, 0x47, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x84, 0x00, 0x00, 0x00, 0x01, 0x02, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x97, 0x00, 0x00, 0x00, 0x01, 0x03, 0x97, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x97, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf3, 0xfe, 0x52, 0x00, 0x01, 0x04, 0x19, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd0, 0xfe, 0x52, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3e, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe4, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb7, 0x00, 0x00, 0x00, 0x01, 0x02, 0x41, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x01, 0x85, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x02, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x02, 0x29, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x01, 0xcb, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xa1, 0x00, 0x00, 0x00, 0x01, 0x02, 0x28, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa1, 0xfe, 0x89, 0x00, 0x01, 0x02, 0x28, 0xfe, 0x89, 0x00, 0x01, 0x02, 0xa1, 0xfe, 0xbf, 0x00, 0x01, 0x02, 0x28, 0xfe, 0xbf, 0x00, 0x01, 0x02, 0xa1, 0xfe, 0x74, 0x00, 0x01, 0x02, 0x28, 0xfe, 0x74, 0x00, 0x01, 0x02, 0xa1, 0xfe, 0x15, 0x00, 0x01, 0x02, 0x28, 0xfe, 0x15, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x01, 0x03, 0x37, 0x00, 0x00, 0x00, 0x01, 0x01, 0xb7, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf7, 0x00, 0x00, 0x00, 0x01, 0x03, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x02, 0xfd, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x01, 0xda, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa7, 0x00, 0x00, 0x00, 0x01, 0x02, 0x94, 0x00, 0x00, 0x00, 0x01, 0x02, 0xda, 0x00, 0x00, 0x00, 0x01, 0x02, 0xe2, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd3, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xbf, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x03, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x03, 0x3c, 0x00, 0x00, 0x00, 0x01, 0x03, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02, 0xad, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3a, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x02, 0xe2, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc4, 0x00, 0x00, 0x00, 0x01, 0x02, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x03, 0x33, 0x00, 0x00, 0x00, 0x01, 0x03, 0xde, 0x00, 0x00, 0x00, 0x01, 0x02, 0xc7, 0x00, 0x00, 0x00, 0x01, 0x02, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc1, 0x00, 0x08, 0x00, 0x01, 0x02, 0x5a, 0x00, 0x07, 0x00, 0x01, 0x01, 0x56, 0x00, 0x00, 0x00, 0x01, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x03, 0x09, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xaf, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x71, 0x00, 0x00, 0x00, 0x01, 0x02, 0x56, 0x00, 0x00, 0x00, 0x01, 0x02, 0x56, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x18, 0x00, 0x00, 0x00, 0x01, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x77, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1a, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x76, 0x00, 0x00, 0x00, 0x01, 0x02, 0x7c, 0xff, 0xe4, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x03, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x02, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x21, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5f, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x02, 0x34, 0x00, 0x00, 0x00, 0x01, 0x01, 0xa5, 0x00, 0x00, 0x00, 0x01, 0x02, 0x51, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x77, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xb5, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x48, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x1e, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x5b, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x0f, 0xfe, 0x56, 0x00, 0x01, 0x01, 0xe3, 0x00, 0x00, 0x00, 0x01, 0x04, 0x80, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x03, 0xc5, 0x00, 0x00, 0x00, 0x01, 0x03, 0x74, 0x00, 0x00, 0x00, 0x01, 0x04, 0x4a, 0x00, 0x00, 0x00, 0x01, 0x03, 0x6f, 0x00, 0x00, 0x00, 0x01, 0x03, 0x96, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1d, 0x00, 0x00, 0x00, 0x01, 0x03, 0x96, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1d, 0xff, 0xf6, 0x00, 0x01, 0x03, 0x96, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1d, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x69, 0x00, 0x00, 0x00, 0x01, 0x03, 0x39, 0x00, 0x00, 0x00, 0x01, 0x01, 0x69, 0x00, 0x00, 0x00, 0x01, 0x02, 0x83, 0x00, 0x00, 0x00, 0x01, 0x01, 0x83, 0x00, 0x00, 0x00, 0x01, 0x02, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x02, 0x85, 0x00, 0x00, 0x00, 0x01, 0x04, 0xe3, 0x00, 0x00, 0x00, 0x01, 0x03, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x03, 0x4c, 0x00, 0x00, 0x00, 0x01, 0x03, 0x63, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x47, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xab, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xbe, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x01, 0xc4, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xa9, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa9, 0x00, 0x00, 0x00, 0x01, 0x02, 0x62, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x02, 0x51, 0x00, 0x00, 0x00, 0x01, 0x01, 0xee, 0x00, 0x00, 0x00, 0x01, 0x03, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x03, 0x4b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x11, 0x00, 0x00, 0x00, 0x01, 0x01, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x03, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x01, 0x10, 0x00, 0x00, 0x00, 0x01, 0x04, 0x51, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa9, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x02, 0xe9, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb9, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb9, 0x00, 0x00, 0x00, 0x01, 0x03, 0x06, 0x00, 0x00, 0x00, 0x01, 0x01, 0x69, 0x00, 0x00, 0x00, 0x01, 0x01, 0x68, 0xfe, 0x52, 0x00, 0x01, 0x02, 0xb5, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x03, 0xb0, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd5, 0x00, 0x00, 0x00, 0x01, 0x02, 0x40, 0x00, 0x00, 0x00, 0x01, 0x02, 0x8c, 0x00, 0x00, 0x00, 0x01, 0x02, 0xfd, 0x00, 0x00, 0x00, 0x01, 0x02, 0x9a, 0x00, 0x00, 0x00, 0x01, 0x04, 0x05, 0x00, 0x00, 0x00, 0x01, 0x02, 0xe6, 0x00, 0x00, 0x00, 0x01, 0x02, 0x8b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x6e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x37, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x02, 0x49, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0xfe, 0x52, 0x00, 0x01, 0x01, 0x62, 0x00, 0x01, 0x00, 0x01, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x01, 0x99, 0x00, 0x00, 0x00, 0x01, 0x02, 0x3d, 0xfe, 0x52, 0x00, 0x02, 0x00, 0x5c, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3d, 0x00, 0x0a, 0x00, 0x44, 0x00, 0x5d, 0x00, 0x24, 0x00, 0x8e, 0x00, 0x91, 0x00, 0x3e, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x42, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0x43, 0x00, 0xae, 0x00, 0xb2, 0x00, 0x44, 0x00, 0xba, 0x00, 0xba, 0x00, 0x49, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x4a, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0x4b, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0x4d, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0x4f, 0x00, 0xe9, 0x00, 0xef, 0x00, 0x50, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0x57, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0x59, 0x01, 0x0d, 0x01, 0x0d, 0x00, 0x5a, 0x01, 0x0f, 0x01, 0x0f, 0x00, 0x5b, 0x01, 0x28, 0x01, 0x29, 0x00, 0x5c, 0x01, 0x2d, 0x01, 0x2d, 0x00, 0x5e, 0x01, 0x41, 0x01, 0x41, 0x00, 0x5f, 0x01, 0x45, 0x01, 0x45, 0x00, 0x60, 0x01, 0x48, 0x01, 0x48, 0x00, 0x61, 0x01, 0x4e, 0x01, 0x4e, 0x00, 0x62, 0x01, 0x51, 0x01, 0x52, 0x00, 0x63, 0x01, 0x54, 0x01, 0x54, 0x00, 0x65, 0x01, 0x59, 0x01, 0x59, 0x00, 0x66, 0x01, 0x61, 0x01, 0x61, 0x00, 0x67, 0x01, 0x6c, 0x01, 0x6c, 0x00, 0x68, 0x01, 0x76, 0x01, 0x76, 0x00, 0x69, 0x01, 0x79, 0x01, 0x7b, 0x00, 0x6a, 0x01, 0x91, 0x01, 0x92, 0x00, 0x6d, 0x01, 0xca, 0x01, 0xcd, 0x00, 0x6f, 0x01, 0xf6, 0x01, 0xf8, 0x00, 0x73, 0x02, 0x05, 0x02, 0x0c, 0x00, 0x76, 0x02, 0x0e, 0x02, 0x4a, 0x00, 0x7e, 0x02, 0x4c, 0x02, 0x67, 0x00, 0xbb, 0x02, 0x69, 0x02, 0x6b, 0x00, 0xd7, 0x02, 0x6d, 0x02, 0x6d, 0x00, 0xda, 0x03, 0x46, 0x03, 0x46, 0x00, 0xdb, 0x03, 0x49, 0x03, 0x49, 0x00, 0xdc, 0x03, 0x4c, 0x03, 0x4c, 0x00, 0xdd, 0x03, 0x88, 0x03, 0x88, 0x00, 0xde, 0x03, 0x9a, 0x03, 0x9a, 0x00, 0xdf, 0x03, 0xea, 0x03, 0xeb, 0x00, 0xe0, 0x04, 0x06, 0x04, 0x07, 0x00, 0xe2, 0x04, 0x22, 0x04, 0x22, 0x00, 0xe4, 0x04, 0x33, 0x04, 0x33, 0x00, 0xe5, 0x04, 0x36, 0x04, 0x36, 0x00, 0xe6, 0x04, 0x7c, 0x04, 0x7d, 0x00, 0xe7, 0x04, 0xba, 0x04, 0xbb, 0x00, 0xe9, 0x04, 0xbd, 0x04, 0xc2, 0x00, 0xeb, 0x04, 0xc5, 0x04, 0xcd, 0x00, 0xf1, 0x04, 0xd1, 0x04, 0xd5, 0x00, 0xfa, 0x04, 0xd9, 0x04, 0xde, 0x00, 0xff, 0x05, 0x23, 0x05, 0x23, 0x01, 0x05, 0x05, 0x5a, 0x05, 0x63, 0x01, 0x06, 0x05, 0x7e, 0x05, 0x7f, 0x01, 0x10, 0x06, 0x18, 0x06, 0x19, 0x01, 0x12, 0x06, 0x4a, 0x06, 0x4b, 0x01, 0x14, 0x07, 0xec, 0x07, 0xec, 0x01, 0x16, 0x07, 0xf4, 0x07, 0xf7, 0x01, 0x17, 0x07, 0xf9, 0x07, 0xfb, 0x01, 0x1b, 0x07, 0xfe, 0x07, 0xfe, 0x01, 0x1e, 0x08, 0x01, 0x08, 0x06, 0x01, 0x1f, 0x08, 0x0d, 0x08, 0x0d, 0x01, 0x25, 0x08, 0x11, 0x08, 0x11, 0x01, 0x26, 0x08, 0x15, 0x08, 0x16, 0x01, 0x27, 0x08, 0x18, 0x08, 0x1a, 0x01, 0x29, 0x08, 0x1c, 0x08, 0x1c, 0x01, 0x2c, 0x08, 0x1e, 0x08, 0x22, 0x01, 0x2d, 0x08, 0x25, 0x08, 0x28, 0x01, 0x32, 0x0a, 0x1d, 0x0a, 0x1d, 0x01, 0x36, 0x0e, 0x2b, 0x0e, 0x2b, 0x01, 0x37, 0x0e, 0x2d, 0x0e, 0x2e, 0x01, 0x38, 0x0e, 0x30, 0x0e, 0x41, 0x01, 0x3a, 0x0e, 0x43, 0x0e, 0x45, 0x01, 0x4c, 0x0e, 0x48, 0x0e, 0x49, 0x01, 0x4f, 0x0e, 0x62, 0x0e, 0x65, 0x01, 0x51, 0x0e, 0x67, 0x0e, 0x68, 0x01, 0x55, 0x0e, 0x6a, 0x0e, 0x75, 0x01, 0x57, 0x0e, 0x78, 0x0e, 0x87, 0x01, 0x63, 0x0e, 0x8c, 0x0e, 0x8f, 0x01, 0x73, 0x0e, 0x95, 0x0e, 0xa8, 0x01, 0x77, 0x0f, 0x93, 0x0f, 0xa5, 0x01, 0x8b, 0x0f, 0xbd, 0x0f, 0xbd, 0x01, 0x9e, 0x0f, 0xbf, 0x0f, 0xbf, 0x01, 0x9f, 0x0f, 0xf4, 0x0f, 0xfd, 0x01, 0xa0, 0x11, 0x1c, 0x11, 0x1d, 0x01, 0xaa, 0x11, 0x34, 0x11, 0x34, 0x01, 0xac, 0x11, 0x3e, 0x11, 0x3e, 0x01, 0xad, 0x11, 0x48, 0x11, 0x48, 0x01, 0xae, 0x11, 0xb8, 0x11, 0xb8, 0x01, 0xaf, 0x00, 0x02, 0x00, 0x09, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x00, 0x02, 0xcd, 0x02, 0xd1, 0x00, 0x04, 0x02, 0xd4, 0x02, 0xd7, 0x00, 0x09, 0x02, 0xda, 0x02, 0xe4, 0x00, 0x0d, 0x02, 0xea, 0x02, 0xed, 0x00, 0x18, 0x02, 0xf8, 0x02, 0xfa, 0x00, 0x1c, 0x02, 0xfe, 0x02, 0xff, 0x00, 0x1f, 0x03, 0x03, 0x03, 0x03, 0x00, 0x21, 0x03, 0x06, 0x03, 0x06, 0x00, 0x22, 0x00, 0x23, 0x00, 0x00, 0x00, 0x8e, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x9a, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0xa6, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xb2, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0xca, 0x00, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe8, 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x0c, 0x00, 0x00, 0x01, 0x12, 0x00, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x24, 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x01, 0x36, 0x00, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x01, 0x42, 0x00, 0x00, 0x01, 0x48, 0x00, 0x00, 0x01, 0x4e, 0x00, 0x00, 0x01, 0x54, 0x00, 0x00, 0x01, 0x5a, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xfe, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xfe, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x35, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x34, 0xff, 0xff, 0x00, 0x01, 0x15, 0x68, 0x12, 0xca, 0x00, 0x01, 0x15, 0xb4, 0x00, 0x0c, 0x02, 0x53, 0x04, 0xa8, 0x04, 0xae, 0x04, 0xb4, 0x04, 0xba, 0x04, 0xc0, 0x04, 0xc6, 0x04, 0xcc, 0x04, 0xd2, 0x04, 0xd8, 0x04, 0xde, 0x04, 0xe4, 0x04, 0xea, 0x04, 0xf0, 0x04, 0xf6, 0x04, 0xfc, 0x05, 0x02, 0x05, 0x08, 0x05, 0x0e, 0x05, 0x14, 0x05, 0x1a, 0x05, 0x20, 0x05, 0x26, 0x05, 0x2c, 0x05, 0x32, 0x05, 0x38, 0x05, 0x3e, 0x05, 0x44, 0x05, 0x4a, 0x05, 0x50, 0x05, 0x56, 0x05, 0x5c, 0x05, 0x62, 0x05, 0x68, 0x05, 0x6e, 0x05, 0x74, 0x05, 0x7a, 0x05, 0x80, 0x05, 0x88, 0x05, 0x8e, 0x05, 0x96, 0x05, 0x9c, 0x05, 0xa4, 0x05, 0xaa, 0x05, 0xb0, 0x05, 0xb6, 0x05, 0xbc, 0x05, 0xc2, 0x05, 0xc8, 0x05, 0xce, 0x05, 0xd4, 0x05, 0xda, 0x05, 0xe2, 0x05, 0xe8, 0x05, 0xee, 0x05, 0xf4, 0x05, 0xfa, 0x06, 0x00, 0x06, 0x08, 0x06, 0x0e, 0x06, 0x14, 0x06, 0x1a, 0x06, 0x20, 0x06, 0x26, 0x06, 0x2c, 0x06, 0x32, 0x06, 0x38, 0x06, 0x3e, 0x06, 0x46, 0x06, 0x4c, 0x06, 0x52, 0x06, 0x5a, 0x06, 0x60, 0x06, 0x66, 0x06, 0x6c, 0x06, 0x74, 0x06, 0x7a, 0x06, 0x80, 0x06, 0x86, 0x06, 0x8c, 0x06, 0x92, 0x06, 0x98, 0x06, 0x9e, 0x06, 0xa4, 0x06, 0xaa, 0x06, 0xb0, 0x06, 0xb6, 0x06, 0xbc, 0x06, 0xc2, 0x06, 0xc8, 0x06, 0xce, 0x06, 0xd4, 0x06, 0xda, 0x06, 0xe0, 0x06, 0xe6, 0x06, 0xec, 0x06, 0xf2, 0x06, 0xf8, 0x06, 0xfe, 0x07, 0x04, 0x07, 0x0a, 0x07, 0x10, 0x07, 0x16, 0x07, 0x1c, 0x07, 0x22, 0x07, 0x28, 0x07, 0x2e, 0x07, 0x34, 0x07, 0x3a, 0x07, 0x40, 0x07, 0x46, 0x07, 0x4c, 0x07, 0x52, 0x07, 0x58, 0x07, 0x5e, 0x07, 0x64, 0x07, 0x6a, 0x07, 0x70, 0x07, 0x76, 0x07, 0x7c, 0x07, 0x82, 0x07, 0x88, 0x07, 0x8e, 0x07, 0x94, 0x07, 0x9a, 0x07, 0xa0, 0x07, 0xa6, 0x07, 0xac, 0x07, 0xb2, 0x07, 0xb8, 0x07, 0xbe, 0x07, 0xc4, 0x07, 0xca, 0x07, 0xd0, 0x07, 0xd6, 0x07, 0xdc, 0x07, 0xe2, 0x07, 0xe8, 0x07, 0xee, 0x07, 0xf6, 0x07, 0xfc, 0x08, 0x02, 0x08, 0x08, 0x08, 0x0e, 0x08, 0x14, 0x08, 0x1a, 0x08, 0x22, 0x08, 0x28, 0x08, 0x2e, 0x08, 0x34, 0x08, 0x3a, 0x08, 0x40, 0x08, 0x46, 0x08, 0x4c, 0x08, 0x52, 0x08, 0x58, 0x08, 0x5e, 0x08, 0x64, 0x08, 0x6a, 0x08, 0x70, 0x08, 0x76, 0x08, 0x7c, 0x08, 0x82, 0x08, 0x88, 0x08, 0x8e, 0x08, 0x94, 0x08, 0x9a, 0x08, 0xa0, 0x08, 0xa6, 0x08, 0xac, 0x08, 0xb2, 0x08, 0xb8, 0x08, 0xc0, 0x08, 0xc6, 0x08, 0xcc, 0x08, 0xd2, 0x08, 0xd8, 0x08, 0xde, 0x08, 0xe4, 0x08, 0xea, 0x08, 0xf0, 0x08, 0xf6, 0x08, 0xfc, 0x09, 0x02, 0x09, 0x08, 0x09, 0x0e, 0x09, 0x14, 0x09, 0x1a, 0x09, 0x20, 0x09, 0x26, 0x09, 0x2c, 0x09, 0x32, 0x09, 0x38, 0x09, 0x3e, 0x09, 0x44, 0x09, 0x4a, 0x09, 0x50, 0x09, 0x56, 0x09, 0x5c, 0x09, 0x62, 0x09, 0x68, 0x09, 0x6e, 0x09, 0x74, 0x09, 0x7a, 0x09, 0x80, 0x09, 0x86, 0x09, 0x8c, 0x09, 0x92, 0x09, 0x98, 0x09, 0x9e, 0x09, 0xa4, 0x09, 0xaa, 0x09, 0xb0, 0x09, 0xb6, 0x09, 0xbc, 0x09, 0xc2, 0x09, 0xc8, 0x09, 0xce, 0x09, 0xd4, 0x09, 0xda, 0x09, 0xe0, 0x09, 0xe6, 0x09, 0xec, 0x09, 0xf2, 0x09, 0xf8, 0x09, 0xfe, 0x0a, 0x04, 0x0a, 0x0a, 0x0a, 0x12, 0x0a, 0x18, 0x0a, 0x1e, 0x0a, 0x24, 0x0a, 0x2a, 0x0a, 0x30, 0x0a, 0x36, 0x0a, 0x3c, 0x0a, 0x42, 0x0a, 0x48, 0x0a, 0x4e, 0x0a, 0x54, 0x0a, 0x5a, 0x0a, 0x60, 0x0a, 0x66, 0x0a, 0x6c, 0x0a, 0x72, 0x0a, 0x78, 0x0a, 0x7e, 0x0a, 0x84, 0x0a, 0x8a, 0x0a, 0x90, 0x0a, 0x96, 0x0a, 0x9c, 0x0a, 0xa2, 0x0a, 0xa8, 0x0a, 0xae, 0x0a, 0xb4, 0x0a, 0xba, 0x0a, 0xc0, 0x0a, 0xc6, 0x0a, 0xcc, 0x0a, 0xd2, 0x0a, 0xd8, 0x0a, 0xde, 0x0a, 0xe4, 0x0a, 0xea, 0x0a, 0xf0, 0x0a, 0xf6, 0x0a, 0xfc, 0x0b, 0x02, 0x0b, 0x08, 0x0b, 0x0e, 0x0b, 0x14, 0x0b, 0x1a, 0x0b, 0x20, 0x0b, 0x26, 0x0b, 0x2c, 0x0b, 0x32, 0x0b, 0x38, 0x0b, 0x3e, 0x0b, 0x44, 0x0b, 0x4a, 0x0b, 0x50, 0x0b, 0x56, 0x0b, 0x5c, 0x0b, 0x62, 0x0b, 0x68, 0x0b, 0x6e, 0x0b, 0x74, 0x0b, 0x7a, 0x0b, 0x80, 0x0b, 0x86, 0x0b, 0x8c, 0x0b, 0x92, 0x0b, 0x98, 0x0b, 0x9e, 0x0b, 0xa4, 0x0b, 0xaa, 0x0b, 0xb0, 0x0b, 0xb6, 0x0b, 0xbc, 0x0b, 0xc2, 0x0b, 0xc8, 0x0b, 0xce, 0x0b, 0xd4, 0x0b, 0xda, 0x0b, 0xe0, 0x0b, 0xe6, 0x0b, 0xec, 0x0b, 0xf2, 0x0b, 0xf8, 0x0b, 0xfe, 0x0c, 0x04, 0x0c, 0x0a, 0x0c, 0x10, 0x0c, 0x16, 0x0c, 0x1c, 0x0c, 0x22, 0x0c, 0x28, 0x0c, 0x2e, 0x0c, 0x34, 0x0c, 0x3a, 0x0c, 0x40, 0x0c, 0x46, 0x0c, 0x4c, 0x0c, 0x52, 0x0c, 0x58, 0x0c, 0x5e, 0x0c, 0x64, 0x0c, 0x6a, 0x0c, 0x70, 0x0c, 0x76, 0x0c, 0x7c, 0x0c, 0x82, 0x0c, 0x88, 0x0c, 0x8e, 0x0c, 0x94, 0x0c, 0x9a, 0x0c, 0xa0, 0x0c, 0xa6, 0x0c, 0xac, 0x0c, 0xb2, 0x0c, 0xb8, 0x0c, 0xbe, 0x0c, 0xc4, 0x0c, 0xca, 0x0c, 0xd0, 0x0c, 0xd6, 0x0c, 0xdc, 0x0c, 0xe2, 0x0c, 0xe8, 0x0c, 0xee, 0x0c, 0xf4, 0x0c, 0xfa, 0x0d, 0x00, 0x0d, 0x06, 0x0d, 0x0c, 0x0d, 0x12, 0x0d, 0x18, 0x0d, 0x1e, 0x0d, 0x24, 0x0d, 0x2a, 0x0d, 0x30, 0x0d, 0x36, 0x0d, 0x3c, 0x0d, 0x42, 0x0d, 0x48, 0x0d, 0x4e, 0x0d, 0x54, 0x0d, 0x5a, 0x0d, 0x60, 0x0d, 0x66, 0x0d, 0x6c, 0x0d, 0x72, 0x0d, 0x78, 0x0d, 0x7e, 0x0d, 0x84, 0x0d, 0x8a, 0x0d, 0x90, 0x0d, 0x96, 0x0d, 0x9c, 0x0d, 0xa2, 0x0d, 0xa8, 0x0d, 0xae, 0x0d, 0xb4, 0x0d, 0xba, 0x0d, 0xc0, 0x0d, 0xc6, 0x0d, 0xcc, 0x0d, 0xd2, 0x0d, 0xd8, 0x0d, 0xde, 0x0d, 0xe4, 0x0d, 0xea, 0x0d, 0xf0, 0x0d, 0xf6, 0x0d, 0xfc, 0x0e, 0x02, 0x0e, 0x08, 0x0e, 0x0e, 0x0e, 0x14, 0x0e, 0x1a, 0x0e, 0x20, 0x0e, 0x26, 0x0e, 0x2c, 0x0e, 0x32, 0x0e, 0x38, 0x0e, 0x3e, 0x0e, 0x44, 0x0e, 0x4a, 0x0e, 0x50, 0x0e, 0x56, 0x0e, 0x5c, 0x0e, 0x62, 0x0e, 0x68, 0x0e, 0x6e, 0x0e, 0x74, 0x0e, 0x7a, 0x0e, 0x80, 0x0e, 0x86, 0x0e, 0x8c, 0x0e, 0x92, 0x0e, 0x98, 0x0e, 0x9e, 0x0e, 0xa4, 0x0e, 0xaa, 0x0e, 0xb0, 0x0e, 0xb6, 0x0e, 0xbc, 0x0e, 0xc2, 0x0e, 0xc8, 0x0e, 0xce, 0x0e, 0xd4, 0x0e, 0xda, 0x0e, 0xe2, 0x0e, 0xe8, 0x0e, 0xee, 0x0e, 0xf4, 0x0e, 0xfa, 0x0f, 0x00, 0x0f, 0x06, 0x0f, 0x0c, 0x0f, 0x12, 0x0f, 0x18, 0x0f, 0x1e, 0x0f, 0x26, 0x0f, 0x2c, 0x0f, 0x32, 0x0f, 0x38, 0x0f, 0x3e, 0x0f, 0x44, 0x0f, 0x4a, 0x0f, 0x50, 0x0f, 0x56, 0x0f, 0x5c, 0x0f, 0x62, 0x0f, 0x68, 0x0f, 0x6e, 0x0f, 0x74, 0x0f, 0x7a, 0x0f, 0x80, 0x0f, 0x86, 0x0f, 0x8c, 0x0f, 0x92, 0x0f, 0x98, 0x0f, 0x9e, 0x0f, 0xa4, 0x0f, 0xaa, 0x0f, 0xb0, 0x0f, 0xb6, 0x0f, 0xbc, 0x0f, 0xc2, 0x0f, 0xc8, 0x0f, 0xce, 0x0f, 0xd4, 0x0f, 0xda, 0x0f, 0xe0, 0x0f, 0xe6, 0x0f, 0xec, 0x0f, 0xf2, 0x0f, 0xf8, 0x0f, 0xfe, 0x10, 0x04, 0x10, 0x0a, 0x10, 0x10, 0x10, 0x16, 0x10, 0x1c, 0x10, 0x22, 0x10, 0x28, 0x10, 0x2e, 0x10, 0x34, 0x10, 0x3a, 0x10, 0x40, 0x10, 0x46, 0x10, 0x4c, 0x10, 0x52, 0x10, 0x58, 0x10, 0x5e, 0x10, 0x64, 0x10, 0x6a, 0x10, 0x72, 0x10, 0x78, 0x10, 0x7e, 0x10, 0x84, 0x10, 0x8a, 0x10, 0x90, 0x10, 0x96, 0x10, 0x9c, 0x10, 0xa2, 0x10, 0xa8, 0x10, 0xae, 0x10, 0xb4, 0x10, 0xba, 0x10, 0xc0, 0x10, 0xc6, 0x10, 0xcc, 0x10, 0xd2, 0x10, 0xd8, 0x10, 0xde, 0x10, 0xe4, 0x10, 0xea, 0x10, 0xf2, 0x10, 0xf8, 0x10, 0xfe, 0x11, 0x04, 0x11, 0x0a, 0x11, 0x10, 0x11, 0x16, 0x11, 0x1c, 0x11, 0x22, 0x11, 0x28, 0x11, 0x2e, 0x11, 0x34, 0x11, 0x3c, 0x11, 0x42, 0x11, 0x48, 0x11, 0x4e, 0x11, 0x54, 0x11, 0x5a, 0x11, 0x60, 0x11, 0x66, 0x11, 0x6c, 0x11, 0x72, 0x11, 0x78, 0x11, 0x7e, 0x11, 0x84, 0x11, 0x8a, 0x11, 0x90, 0x11, 0x96, 0x11, 0x9c, 0x11, 0xa2, 0x11, 0xa8, 0x11, 0xae, 0x11, 0xb4, 0x11, 0xba, 0x11, 0xc0, 0x11, 0xc6, 0x11, 0xcc, 0x11, 0xd2, 0x11, 0xd8, 0x11, 0xde, 0x11, 0xe4, 0x11, 0xea, 0x11, 0xf0, 0x11, 0xf6, 0x11, 0xfc, 0x12, 0x02, 0x12, 0x08, 0x12, 0x0e, 0x12, 0x14, 0x12, 0x1a, 0x12, 0x20, 0x12, 0x26, 0x12, 0x2c, 0x12, 0x32, 0x12, 0x38, 0x12, 0x3e, 0x12, 0x44, 0x12, 0x4a, 0x12, 0x50, 0x12, 0x56, 0x12, 0x5c, 0x12, 0x62, 0x12, 0x68, 0x12, 0x6e, 0x12, 0x74, 0x12, 0x7a, 0x12, 0x80, 0x12, 0x86, 0x12, 0x8c, 0x12, 0x92, 0x12, 0x98, 0x12, 0x9e, 0x12, 0xa4, 0x12, 0xaa, 0x12, 0xb0, 0x12, 0xb6, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xf7, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa1, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x06, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x10, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x0f, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x0c, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x51, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x8f, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x85, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x33, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x77, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x0f, 0x04, 0x7b, 0x00, 0x23, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x60, 0x04, 0x7b, 0x00, 0x17, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x53, 0x04, 0x7b, 0x00, 0x12, 0x00, 0x01, 0x01, 0xb0, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x2c, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x02, 0x02, 0x34, 0x04, 0x7b, 0x00, 0x0c, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x30, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xef, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x14, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xf3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x23, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x7f, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x34, 0x04, 0x7b, 0x00, 0x1a, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x0f, 0x04, 0x7b, 0x00, 0x23, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x4c, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x2f, 0x05, 0xf0, 0x00, 0x02, 0x01, 0x00, 0x04, 0x7b, 0x00, 0x04, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xab, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xb0, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1f, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xf7, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x7d, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x1b, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x06, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x78, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x10, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x10, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfb, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x41, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x79, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xef, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x63, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x33, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x23, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x77, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x77, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x53, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x47, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xf3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x4b, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x0f, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x33, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x23, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x46, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x8d, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x02, 0x01, 0x9f, 0x04, 0x7b, 0x00, 0x03, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x16, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x16, 0x04, 0x7b, 0x00, 0x02, 0x02, 0x0f, 0x04, 0x7c, 0x00, 0x08, 0x00, 0x01, 0x02, 0x06, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x06, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa3, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x2c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x2c, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x01, 0x06, 0x2f, 0x00, 0x01, 0x00, 0xec, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x59, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x70, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xcb, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x02, 0x02, 0x34, 0x04, 0x7b, 0x00, 0x0e, 0x00, 0x01, 0x04, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x9e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xfa, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xfa, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x24, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x31, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x5b, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x01, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x15, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xef, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xbf, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xd9, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xf3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x26, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x84, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x01, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x84, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x01, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x24, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x0d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5f, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x02, 0x66, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x2c, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x84, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x01, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xf3, 0x05, 0xf0, 0x00, 0x01, 0x04, 0x19, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xd0, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x0f, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3e, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x0f, 0x04, 0x7c, 0x00, 0x08, 0x00, 0x01, 0x02, 0x0a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xf4, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5f, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x41, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x46, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe0, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x0a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x31, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x2c, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe4, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x65, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x60, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x07, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3e, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3e, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x07, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xc0, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xf4, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x51, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x10, 0x05, 0xf0, 0x00, 0x01, 0x04, 0x59, 0x05, 0xf0, 0x00, 0x01, 0x04, 0x00, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x56, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xe0, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x23, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xf7, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x30, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x18, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x85, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x6d, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xd9, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xd9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x1c, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x2c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x13, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x96, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x58, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x24, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x0a, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xaa, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x4b, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x3e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x06, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x41, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xac, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xb7, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x41, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5a, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x23, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x13, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5a, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x10, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x4b, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x4b, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xd2, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xcd, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x86, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xaa, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xef, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x01, 0x02, 0x06, 0x2f, 0x00, 0x01, 0x03, 0x94, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x8d, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x15, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5a, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x5c, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x07, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xc1, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x0c, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x1a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xaa, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x2a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd1, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xe0, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x3a, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xda, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xe0, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x3a, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xc5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd4, 0x05, 0xfa, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xcf, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x52, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xe0, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x3e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xb1, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x0e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x10, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5f, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xb7, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x0a, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x85, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xac, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x35, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xac, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x41, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe4, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xab, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x18, 0x04, 0x83, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x06, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfc, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xb7, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x41, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x85, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x76, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x76, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x76, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xab, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe0, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x4e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x4e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x29, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x25, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xf3, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xcb, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfc, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xac, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xa1, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa1, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa1, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa1, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x97, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x37, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xb7, 0x05, 0xf0, 0x00, 0x02, 0x02, 0xf7, 0x05, 0xf0, 0x00, 0x16, 0x00, 0x01, 0x03, 0xd5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x0f, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x98, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xa7, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x94, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xda, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xe2, 0x05, 0xe2, 0x00, 0x01, 0x02, 0xd3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xbf, 0x05, 0xf0, 0x00, 0x02, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x0c, 0x00, 0x01, 0x03, 0x2a, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x3c, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x08, 0x05, 0xe2, 0x00, 0x01, 0x02, 0xad, 0x05, 0xe2, 0x00, 0x01, 0x02, 0x3a, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x0f, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xe2, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x82, 0x04, 0x44, 0x00, 0x01, 0x02, 0x7f, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x33, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xde, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xc7, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x7f, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xc1, 0x05, 0xe7, 0x00, 0x01, 0x02, 0x5a, 0x05, 0xe7, 0x00, 0x01, 0x01, 0x56, 0x06, 0x31, 0x00, 0x01, 0x02, 0xab, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x09, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xaf, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x0e, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x0c, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x0c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x18, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x77, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1a, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x76, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x7c, 0x05, 0xd3, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x8f, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xf3, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x21, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5f, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x65, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x34, 0x04, 0x7b, 0x00, 0x01, 0x01, 0xa5, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x51, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x77, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1e, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x0f, 0x04, 0x7b, 0x00, 0x08, 0x00, 0x01, 0x01, 0xe3, 0x04, 0x7b, 0x00, 0x01, 0x04, 0x80, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x6f, 0x04, 0x7b, 0x00, 0x01, 0x03, 0xc5, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x74, 0x04, 0x7b, 0x00, 0x01, 0x04, 0x4a, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x6f, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x96, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1d, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x96, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1d, 0x04, 0x71, 0x00, 0x01, 0x03, 0x96, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1d, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x01, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x0c, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x69, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x39, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x83, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xe8, 0x05, 0xf0, 0x00, 0x02, 0x02, 0x85, 0x04, 0x7b, 0x00, 0x00, 0x00, 0x01, 0x04, 0xe3, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xaa, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x62, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x4c, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x63, 0x04, 0x7b, 0x00, 0x01, 0x02, 0xd6, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x30, 0x04, 0x7b, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xab, 0x05, 0xf0, 0x00, 0x02, 0x01, 0x00, 0x04, 0x7b, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa4, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x6d, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xc4, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x06, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x2c, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x5b, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x48, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x3d, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xe1, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x51, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xef, 0x04, 0x7b, 0x00, 0x01, 0x03, 0x0f, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x4b, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x11, 0x05, 0xf0, 0x00, 0x01, 0x01, 0xfc, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x1a, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x10, 0x07, 0x88, 0x00, 0x01, 0x04, 0x51, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xe9, 0x06, 0x04, 0x00, 0x01, 0x02, 0xb9, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb9, 0x05, 0xf0, 0x00, 0x01, 0x03, 0x06, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x69, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x68, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xb5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa8, 0x05, 0xf0, 0x00, 0x01, 0x03, 0xb0, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xd5, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x40, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x8c, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xfd, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x9a, 0x05, 0xf0, 0x00, 0x01, 0x04, 0x05, 0x05, 0xf7, 0x00, 0x01, 0x02, 0xe6, 0x05, 0xf7, 0x00, 0x01, 0x02, 0x8b, 0x05, 0xf7, 0x00, 0x01, 0x02, 0x6e, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x1f, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x37, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0x49, 0x05, 0xf0, 0x00, 0x01, 0x02, 0xa9, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x01, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x02, 0x9f, 0x05, 0xf0, 0x00, 0x01, 0x00, 0xfa, 0x05, 0xf0, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x02, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x99, 0x05, 0xf0, 0x00, 0x02, 0x03, 0x43, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x24, 0x00, 0x3d, 0x00, 0x0a, 0x00, 0x44, 0x00, 0x5d, 0x00, 0x24, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x3e, 0x00, 0xa8, 0x00, 0xa9, 0x00, 0x3f, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x41, 0x00, 0xba, 0x00, 0xba, 0x00, 0x42, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x43, 0x00, 0xc6, 0x00, 0xc7, 0x00, 0x44, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0x46, 0x00, 0xe8, 0x00, 0xe9, 0x00, 0x47, 0x00, 0xf3, 0x00, 0xf3, 0x00, 0x49, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0x4a, 0x01, 0x0d, 0x01, 0x0d, 0x00, 0x4b, 0x01, 0x15, 0x01, 0x15, 0x00, 0x4c, 0x01, 0x28, 0x01, 0x29, 0x00, 0x4d, 0x01, 0x35, 0x01, 0x35, 0x00, 0x4f, 0x01, 0x41, 0x01, 0x42, 0x00, 0x50, 0x01, 0x45, 0x01, 0x45, 0x00, 0x52, 0x01, 0x48, 0x01, 0x49, 0x00, 0x53, 0x01, 0x4e, 0x01, 0x4e, 0x00, 0x55, 0x01, 0x50, 0x01, 0x56, 0x00, 0x56, 0x01, 0x58, 0x01, 0x59, 0x00, 0x5d, 0x01, 0x5b, 0x01, 0x5d, 0x00, 0x5f, 0x01, 0x5f, 0x01, 0x5f, 0x00, 0x62, 0x01, 0x61, 0x01, 0x61, 0x00, 0x63, 0x01, 0x66, 0x01, 0x66, 0x00, 0x64, 0x01, 0x69, 0x01, 0x6a, 0x00, 0x65, 0x01, 0x6c, 0x01, 0x70, 0x00, 0x67, 0x01, 0x74, 0x01, 0x7b, 0x00, 0x6c, 0x01, 0xac, 0x01, 0xac, 0x00, 0x74, 0x01, 0xf6, 0x01, 0xf9, 0x00, 0x75, 0x02, 0x05, 0x02, 0x0c, 0x00, 0x79, 0x02, 0x0e, 0x02, 0x4a, 0x00, 0x81, 0x02, 0x4c, 0x02, 0x67, 0x00, 0xbe, 0x02, 0x69, 0x02, 0x6b, 0x00, 0xda, 0x02, 0x6d, 0x02, 0x6d, 0x00, 0xdd, 0x03, 0x45, 0x03, 0x5d, 0x00, 0xde, 0x03, 0x64, 0x03, 0x65, 0x00, 0xf7, 0x03, 0x69, 0x03, 0x69, 0x00, 0xf9, 0x03, 0x6b, 0x03, 0x6b, 0x00, 0xfa, 0x03, 0x6d, 0x03, 0x6d, 0x00, 0xfb, 0x03, 0x6f, 0x03, 0x6f, 0x00, 0xfc, 0x03, 0x77, 0x03, 0x77, 0x00, 0xfd, 0x03, 0x84, 0x03, 0x8a, 0x00, 0xfe, 0x03, 0x8c, 0x03, 0x8c, 0x01, 0x05, 0x03, 0x90, 0x03, 0x90, 0x01, 0x06, 0x03, 0x98, 0x03, 0x9a, 0x01, 0x07, 0x03, 0x9d, 0x03, 0x9e, 0x01, 0x0a, 0x03, 0xa3, 0x03, 0xac, 0x01, 0x0c, 0x03, 0xae, 0x03, 0xcc, 0x01, 0x16, 0x03, 0xce, 0x03, 0xe3, 0x01, 0x35, 0x03, 0xe8, 0x03, 0xef, 0x01, 0x4b, 0x03, 0xf3, 0x04, 0x01, 0x01, 0x53, 0x04, 0x04, 0x04, 0x09, 0x01, 0x62, 0x04, 0x22, 0x04, 0x23, 0x01, 0x68, 0x04, 0x2a, 0x04, 0x2b, 0x01, 0x6a, 0x04, 0x2e, 0x04, 0x36, 0x01, 0x6c, 0x04, 0x40, 0x04, 0x40, 0x01, 0x75, 0x04, 0x4d, 0x04, 0x4d, 0x01, 0x76, 0x04, 0x58, 0x04, 0x58, 0x01, 0x77, 0x04, 0x5e, 0x04, 0x5e, 0x01, 0x78, 0x04, 0x62, 0x04, 0x62, 0x01, 0x79, 0x04, 0x7c, 0x04, 0x7d, 0x01, 0x7a, 0x04, 0x8b, 0x04, 0x8b, 0x01, 0x7c, 0x04, 0x92, 0x04, 0x93, 0x01, 0x7d, 0x04, 0xa7, 0x04, 0xa7, 0x01, 0x7f, 0x04, 0xb2, 0x04, 0xb3, 0x01, 0x80, 0x04, 0xb5, 0x04, 0xb5, 0x01, 0x82, 0x04, 0xb7, 0x04, 0xb7, 0x01, 0x83, 0x04, 0xba, 0x04, 0xc2, 0x01, 0x84, 0x04, 0xc5, 0x04, 0xce, 0x01, 0x8d, 0x04, 0xd1, 0x04, 0xd5, 0x01, 0x97, 0x04, 0xd8, 0x04, 0xde, 0x01, 0x9c, 0x04, 0xe2, 0x04, 0xe2, 0x01, 0xa3, 0x05, 0x23, 0x05, 0x23, 0x01, 0xa4, 0x05, 0x5c, 0x05, 0x63, 0x01, 0xa5, 0x06, 0x4a, 0x06, 0x4b, 0x01, 0xad, 0x07, 0xec, 0x07, 0xec, 0x01, 0xaf, 0x07, 0xf4, 0x07, 0xf7, 0x01, 0xb0, 0x07, 0xf9, 0x07, 0xfb, 0x01, 0xb4, 0x07, 0xfe, 0x07, 0xfe, 0x01, 0xb7, 0x08, 0x01, 0x08, 0x06, 0x01, 0xb8, 0x08, 0x0d, 0x08, 0x0d, 0x01, 0xbe, 0x08, 0x11, 0x08, 0x11, 0x01, 0xbf, 0x08, 0x15, 0x08, 0x16, 0x01, 0xc0, 0x08, 0x18, 0x08, 0x1a, 0x01, 0xc2, 0x08, 0x1c, 0x08, 0x1c, 0x01, 0xc5, 0x08, 0x1e, 0x08, 0x22, 0x01, 0xc6, 0x08, 0x25, 0x08, 0x28, 0x01, 0xcb, 0x0a, 0x1d, 0x0a, 0x1d, 0x01, 0xcf, 0x0e, 0x2b, 0x0e, 0x45, 0x01, 0xd0, 0x0e, 0x48, 0x0e, 0x49, 0x01, 0xeb, 0x0e, 0x62, 0x0e, 0x65, 0x01, 0xed, 0x0e, 0x67, 0x0e, 0x68, 0x01, 0xf1, 0x0e, 0x6a, 0x0e, 0x75, 0x01, 0xf3, 0x0e, 0x78, 0x0e, 0x87, 0x01, 0xff, 0x0e, 0x89, 0x0e, 0x89, 0x02, 0x0f, 0x0e, 0x8b, 0x0e, 0x8f, 0x02, 0x10, 0x0e, 0x94, 0x0e, 0xa8, 0x02, 0x15, 0x0f, 0x93, 0x0f, 0xa5, 0x02, 0x2a, 0x0f, 0xbd, 0x0f, 0xbd, 0x02, 0x3d, 0x0f, 0xbf, 0x0f, 0xbf, 0x02, 0x3e, 0x0f, 0xf4, 0x0f, 0xfd, 0x02, 0x3f, 0x11, 0x1b, 0x11, 0x1d, 0x02, 0x49, 0x11, 0x34, 0x11, 0x34, 0x02, 0x4c, 0x11, 0x3e, 0x11, 0x3e, 0x02, 0x4d, 0x11, 0x42, 0x11, 0x42, 0x02, 0x4e, 0x11, 0x45, 0x11, 0x46, 0x02, 0x4f, 0x11, 0x48, 0x11, 0x48, 0x02, 0x51, 0x11, 0xb8, 0x11, 0xb8, 0x02, 0x52, 0x00, 0x02, 0x00, 0x0c, 0x02, 0xb1, 0x02, 0xc5, 0x00, 0x00, 0x02, 0xee, 0x02, 0xf3, 0x00, 0x15, 0x02, 0xf5, 0x02, 0xf5, 0x00, 0x1b, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x1c, 0x02, 0xfb, 0x02, 0xfd, 0x00, 0x1d, 0x03, 0x01, 0x03, 0x02, 0x00, 0x20, 0x03, 0x04, 0x03, 0x04, 0x00, 0x22, 0x04, 0x17, 0x04, 0x1b, 0x00, 0x23, 0x05, 0x4a, 0x05, 0x4f, 0x00, 0x28, 0x07, 0xe3, 0x07, 0xe9, 0x00, 0x2e, 0x10, 0xeb, 0x10, 0xf5, 0x00, 0x35, 0x11, 0xac, 0x11, 0xac, 0x00, 0x40, 0x00, 0x41, 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x0e, 0x00, 0x00, 0x01, 0x16, 0x00, 0x00, 0x01, 0x1e, 0x00, 0x00, 0x01, 0x24, 0x00, 0x00, 0x01, 0x2a, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x01, 0x36, 0x00, 0x00, 0x01, 0x3e, 0x00, 0x00, 0x01, 0x46, 0x00, 0x00, 0x01, 0x4c, 0x00, 0x00, 0x01, 0x52, 0x00, 0x00, 0x01, 0x58, 0x00, 0x00, 0x01, 0x60, 0x00, 0x00, 0x01, 0x66, 0x00, 0x00, 0x01, 0x6c, 0x00, 0x00, 0x01, 0x72, 0x00, 0x00, 0x01, 0x78, 0x00, 0x00, 0x01, 0x7e, 0x00, 0x00, 0x01, 0x84, 0x00, 0x00, 0x01, 0x8a, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x01, 0x96, 0x00, 0x00, 0x01, 0x9c, 0x00, 0x00, 0x01, 0xa2, 0x00, 0x00, 0x01, 0xa8, 0x00, 0x00, 0x01, 0xae, 0x00, 0x00, 0x01, 0xb4, 0x00, 0x00, 0x01, 0xba, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x01, 0xc6, 0x00, 0x00, 0x01, 0xcc, 0x00, 0x00, 0x01, 0xd2, 0x00, 0x00, 0x01, 0xd8, 0x00, 0x00, 0x01, 0xde, 0x00, 0x00, 0x01, 0xe4, 0x00, 0x00, 0x01, 0xea, 0x00, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x01, 0xf6, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x02, 0x0e, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x02, 0x1a, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x02, 0x26, 0x00, 0x00, 0x02, 0x2c, 0x00, 0x00, 0x02, 0x32, 0x00, 0x00, 0x02, 0x38, 0x00, 0x00, 0x02, 0x3e, 0x00, 0x00, 0x02, 0x46, 0x00, 0x00, 0x02, 0x4e, 0x00, 0x00, 0x02, 0x54, 0x00, 0x00, 0x02, 0x5a, 0x00, 0x00, 0x02, 0x60, 0x00, 0x00, 0x02, 0x66, 0x00, 0x00, 0x02, 0x6c, 0x00, 0x00, 0x02, 0x72, 0x00, 0x00, 0x02, 0x78, 0x00, 0x00, 0x02, 0x7e, 0x00, 0x00, 0x02, 0x84, 0x00, 0x00, 0x02, 0x8a, 0x00, 0x00, 0x02, 0x90, 0x00, 0x00, 0x02, 0x96, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x04, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x04, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x04, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x08, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0xb0, 0x03, 0x6f, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x72, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x72, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0xb0, 0x04, 0x72, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfd, 0xcd, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0xa6, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x6e, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x48, 0x04, 0x7b, 0x00, 0x01, 0xfd, 0x39, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x0c, 0x00, 0x02, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x10, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0xfe, 0x34, 0x04, 0x7b, 0x00, 0x01, 0x01, 0x3e, 0x00, 0xfe, 0x00, 0x01, 0x01, 0x44, 0x00, 0x0c, 0x00, 0x1e, 0x00, 0x3e, 0x00, 0x44, 0x00, 0x4a, 0x00, 0x50, 0x00, 0x56, 0x00, 0x5c, 0x00, 0x62, 0x00, 0x68, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x7a, 0x00, 0x80, 0x00, 0x86, 0x00, 0x8c, 0x00, 0x92, 0x00, 0x98, 0x00, 0x9e, 0x00, 0xa4, 0x00, 0xaa, 0x00, 0xb0, 0x00, 0xb6, 0x00, 0xbc, 0x00, 0xc2, 0x00, 0xc8, 0x00, 0xce, 0x00, 0xd4, 0x00, 0xda, 0x00, 0xe0, 0x00, 0xe6, 0x00, 0xec, 0x00, 0x01, 0x04, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x03, 0x60, 0x00, 0x00, 0x00, 0x01, 0x01, 0x35, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd7, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa3, 0x00, 0x00, 0x00, 0x01, 0x02, 0x59, 0x00, 0x00, 0x00, 0x01, 0x02, 0x77, 0xff, 0xfe, 0x00, 0x01, 0x03, 0x54, 0x00, 0x00, 0x00, 0x01, 0x03, 0x14, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x35, 0x00, 0x00, 0x00, 0x01, 0x03, 0xb1, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe1, 0xfe, 0x56, 0x00, 0x01, 0x01, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd7, 0x00, 0x00, 0x00, 0x01, 0x02, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x02, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x35, 0x00, 0x00, 0x00, 0x01, 0x02, 0xd7, 0x00, 0x00, 0x00, 0x01, 0x02, 0x77, 0x00, 0x00, 0x00, 0x01, 0x02, 0x53, 0x00, 0x00, 0x00, 0x01, 0x02, 0x47, 0xfe, 0x52, 0x00, 0x01, 0x02, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x95, 0x00, 0x00, 0x00, 0x01, 0x01, 0x23, 0x00, 0x00, 0x00, 0x01, 0x02, 0x35, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe1, 0xfe, 0x52, 0x00, 0x01, 0x04, 0xb6, 0x00, 0x00, 0x00, 0x01, 0x01, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1e, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x32, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x44, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x9a, 0x00, 0xba, 0x00, 0xf3, 0x01, 0x48, 0x01, 0x59, 0x01, 0x61, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x02, 0x12, 0x02, 0x16, 0x02, 0x2a, 0x02, 0x37, 0x02, 0x54, 0x0e, 0x38, 0x11, 0x1c, 0x00, 0x01, 0x00, 0x01, 0x02, 0xd9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0xfe, 0x29, 0x00, 0x00, 0x00, 0x02, 0x26, 0xf0, 0x00, 0x04, 0x00, 0x00, 0x21, 0x30, 0x23, 0x20, 0x00, 0x35, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x72, 0x00, 0x39, 0x00, 0x4b, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0xff, 0x9a, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc9, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0x00, 0x00, 0xff, 0x75, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0xff, 0x61, 0xff, 0x75, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x61, 0x00, 0x00, 0xff, 0x61, 0xff, 0x75, 0xff, 0xad, 0xff, 0x90, 0xfe, 0xf8, 0xff, 0x03, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0xff, 0xb7, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0x90, 0xff, 0x90, 0xff, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xc9, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xb7, 0xff, 0x61, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0x6b, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0xff, 0x90, 0x00, 0x00, 0xff, 0xb7, 0xff, 0x90, 0xff, 0x44, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0xfe, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xd3, 0xff, 0xc9, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xc1, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xc1, 0xff, 0x90, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, 0xff, 0xc9, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0xff, 0x7d, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xdc, 0xff, 0x9a, 0x00, 0x00, 0xff, 0x9a, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xe6, 0xff, 0x9a, 0xff, 0x1f, 0xff, 0x44, 0x00, 0x00, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x61, 0xfd, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xff, 0xad, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0x44, 0x00, 0x00, 0xff, 0xd3, 0xfe, 0xc1, 0x00, 0x00, 0xff, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xb7, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa4, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x26, 0xfe, 0xb7, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0x7d, 0x00, 0x00, 0xff, 0xad, 0xff, 0xb7, 0xff, 0xc1, 0xff, 0xad, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0x00, 0x00, 0xff, 0x7d, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0x90, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x9a, 0xff, 0xd3, 0xff, 0xa4, 0x00, 0x00, 0xff, 0xa4, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0xff, 0x7d, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0xff, 0x0d, 0xff, 0x1f, 0xff, 0x61, 0x00, 0x00, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xad, 0xfe, 0xa4, 0x00, 0x00, 0xfe, 0xa4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xa4, 0xfe, 0xd3, 0xfe, 0xad, 0x00, 0x00, 0xfe, 0xc9, 0x00, 0x00, 0xfe, 0xad, 0x00, 0x00, 0xfe, 0xc1, 0xff, 0x44, 0xff, 0x90, 0x00, 0x00, 0xff, 0x88, 0xff, 0x11, 0xfe, 0xe0, 0x00, 0x00, 0xfe, 0xf4, 0xfe, 0xe7, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xfe, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x88, 0xfe, 0xf8, 0xff, 0x59, 0xff, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc9, 0xff, 0x4e, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, 0xff, 0x61, 0x00, 0x00, 0xff, 0x61, 0xff, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xe6, 0x00, 0x00, 0xff, 0xad, 0xff, 0x15, 0xff, 0x88, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7d, 0x00, 0x00, 0x00, 0x00, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0xff, 0x88, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0x90, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x88, 0x00, 0x00, 0xff, 0x88, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xfe, 0xf8, 0x00, 0x00, 0xff, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7d, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x61, 0xff, 0xad, 0xff, 0xd3, 0x00, 0x00, 0xff, 0x0d, 0xfe, 0x61, 0xfe, 0xf0, 0xff, 0x61, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xe6, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x1f, 0xff, 0x6b, 0x00, 0x00, 0xff, 0x90, 0xfe, 0xe6, 0xfe, 0xf0, 0x00, 0x00, 0xfe, 0xf0, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xdc, 0xfe, 0xf8, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0x6b, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xb7, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x00, 0xff, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0xff, 0x90, 0xff, 0xa4, 0x00, 0x00, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0xff, 0xb7, 0xff, 0x7d, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x44, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xd3, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xd3, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc9, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xfe, 0xc9, 0x00, 0x00, 0xff, 0xc9, 0xff, 0x61, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xfe, 0xdc, 0xff, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0xff, 0x90, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x4e, 0xff, 0x90, 0xff, 0x90, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0x00, 0x00, 0xff, 0x75, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0xff, 0x61, 0xff, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf8, 0xff, 0x03, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0x00, 0x00, 0xff, 0x75, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0xff, 0x61, 0xff, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xfe, 0xf8, 0xff, 0x03, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0x00, 0x00, 0xff, 0x75, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0xff, 0x61, 0xff, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xfe, 0xf8, 0xff, 0x03, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xad, 0xff, 0xa4, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x6b, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0x90, 0xff, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xa4, 0xff, 0x90, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0x00, 0x00, 0xff, 0x75, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0xff, 0x61, 0xff, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xfe, 0xf8, 0xff, 0x02, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x90, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0xad, 0xff, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xfe, 0xf8, 0xff, 0x02, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xc9, 0xff, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7d, 0xff, 0x44, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xdc, 0xff, 0xd3, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0xff, 0xd3, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc9, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xfe, 0xc9, 0x00, 0x00, 0xff, 0x44, 0xff, 0x0d, 0xff, 0x1f, 0xff, 0x61, 0x00, 0x00, 0xff, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xad, 0xfe, 0xa4, 0x00, 0x00, 0xfe, 0xa4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xa4, 0xfe, 0xd3, 0xfe, 0xad, 0x00, 0x00, 0xfe, 0xc9, 0x00, 0x00, 0xfe, 0xad, 0x00, 0x00, 0xfe, 0xc1, 0xff, 0x44, 0xff, 0x90, 0x00, 0x00, 0xff, 0x88, 0xfe, 0xad, 0xfe, 0xa4, 0x00, 0x00, 0xfe, 0xa4, 0xfe, 0xc9, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xfe, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd3, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x72, 0x00, 0x39, 0x00, 0x4b, 0x00, 0x00, 0xff, 0x44, 0x00, 0x00, 0xff, 0x88, 0xff, 0xad, 0xff, 0x9a, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xc9, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xf8, 0xff, 0xc1, 0xff, 0xb7, 0xff, 0xc1, 0xff, 0xc1, 0xff, 0xb7, 0xff, 0xc1, 0xff, 0xb7, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x88, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x90, 0xff, 0x6b, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xb7, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7d, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0xff, 0xb7, 0xff, 0x90, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb7, 0x00, 0x2f, 0xff, 0x90, 0xff, 0x90, 0x00, 0x00, 0xfe, 0xe6, 0x00, 0x00, 0xfe, 0x88, 0xff, 0x03, 0xff, 0xb7, 0xfe, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xb7, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x15, 0xff, 0x3c, 0x00, 0x00, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0xff, 0x90, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x52, 0x00, 0x10, 0x00, 0x10, 0x00, 0x01, 0x00, 0x24, 0x00, 0x24, 0x00, 0x02, 0x00, 0x25, 0x00, 0x25, 0x00, 0x03, 0x00, 0x26, 0x00, 0x26, 0x00, 0x04, 0x00, 0x27, 0x00, 0x27, 0x00, 0x05, 0x00, 0x29, 0x00, 0x29, 0x00, 0x06, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x07, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x08, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x09, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x0b, 0x00, 0x32, 0x00, 0x32, 0x00, 0x0c, 0x00, 0x33, 0x00, 0x33, 0x00, 0x0d, 0x00, 0x34, 0x00, 0x34, 0x00, 0x0e, 0x00, 0x35, 0x00, 0x35, 0x00, 0x0f, 0x00, 0x36, 0x00, 0x36, 0x00, 0x10, 0x00, 0x37, 0x00, 0x37, 0x00, 0x11, 0x00, 0x38, 0x00, 0x38, 0x00, 0x12, 0x00, 0x39, 0x00, 0x39, 0x00, 0x13, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x14, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x15, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x16, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x17, 0x00, 0x48, 0x00, 0x48, 0x00, 0x18, 0x00, 0x49, 0x00, 0x49, 0x00, 0x19, 0x00, 0x4e, 0x00, 0x4e, 0x00, 0x1a, 0x00, 0x51, 0x00, 0x51, 0x00, 0x1b, 0x00, 0x52, 0x00, 0x52, 0x00, 0x1c, 0x00, 0x55, 0x00, 0x55, 0x00, 0x1d, 0x00, 0x59, 0x00, 0x59, 0x00, 0x1e, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x1f, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x20, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x21, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x22, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x23, 0x00, 0x82, 0x00, 0x82, 0x00, 0x24, 0x00, 0x83, 0x00, 0x84, 0x00, 0x25, 0x00, 0x85, 0x00, 0x85, 0x00, 0x26, 0x00, 0x86, 0x00, 0x86, 0x00, 0x25, 0x00, 0x88, 0x00, 0x88, 0x00, 0x27, 0x00, 0x89, 0x00, 0x89, 0x00, 0x28, 0x00, 0x92, 0x00, 0x92, 0x00, 0x05, 0x00, 0x94, 0x00, 0x98, 0x00, 0x0c, 0x00, 0x9b, 0x00, 0x9e, 0x00, 0x12, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x16, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0x29, 0x00, 0xa1, 0x00, 0xa1, 0x00, 0x2a, 0x00, 0xaa, 0x00, 0xad, 0x00, 0x18, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x2b, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x1b, 0x00, 0xb4, 0x00, 0xb8, 0x00, 0x1c, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0x21, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0x21, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x2c, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x2c, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x2d, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0x28, 0x00, 0xce, 0x00, 0xce, 0x00, 0x28, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x05, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0x2e, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0x18, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x07, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0x0b, 0x00, 0xff, 0x00, 0xff, 0x00, 0x0b, 0x01, 0x02, 0x01, 0x02, 0x00, 0x2f, 0x01, 0x0a, 0x01, 0x0a, 0x00, 0x1b, 0x01, 0x16, 0x01, 0x16, 0x00, 0x0f, 0x01, 0x17, 0x01, 0x17, 0x00, 0x1d, 0x01, 0x1a, 0x01, 0x1a, 0x00, 0x0f, 0x01, 0x1b, 0x01, 0x1b, 0x00, 0x30, 0x01, 0x20, 0x01, 0x20, 0x00, 0x10, 0x01, 0x22, 0x01, 0x22, 0x00, 0x10, 0x01, 0x26, 0x01, 0x26, 0x00, 0x31, 0x01, 0x30, 0x01, 0x30, 0x00, 0x12, 0x01, 0x3a, 0x01, 0x3a, 0x00, 0x16, 0x01, 0x3f, 0x01, 0x3f, 0x00, 0x17, 0x07, 0x45, 0x07, 0x45, 0x00, 0x32, 0x07, 0x51, 0x07, 0x51, 0x00, 0x33, 0x07, 0x53, 0x07, 0x53, 0x00, 0x34, 0x0e, 0x60, 0x0e, 0x60, 0x00, 0x11, 0x0e, 0x78, 0x0e, 0x78, 0x00, 0x0a, 0x0e, 0x79, 0x0e, 0x79, 0x00, 0x1a, 0x00, 0x02, 0x00, 0xa2, 0x00, 0x10, 0x00, 0x10, 0x00, 0x01, 0x00, 0x11, 0x00, 0x11, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x1d, 0x00, 0x03, 0x00, 0x24, 0x00, 0x24, 0x00, 0x04, 0x00, 0x25, 0x00, 0x25, 0x00, 0x05, 0x00, 0x26, 0x00, 0x26, 0x00, 0x06, 0x00, 0x27, 0x00, 0x27, 0x00, 0x07, 0x00, 0x29, 0x00, 0x29, 0x00, 0x08, 0x00, 0x2a, 0x00, 0x2a, 0x00, 0x09, 0x00, 0x2b, 0x00, 0x2b, 0x00, 0x08, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x0a, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x08, 0x00, 0x32, 0x00, 0x32, 0x00, 0x0b, 0x00, 0x33, 0x00, 0x33, 0x00, 0x08, 0x00, 0x34, 0x00, 0x34, 0x00, 0x0c, 0x00, 0x35, 0x00, 0x35, 0x00, 0x08, 0x00, 0x36, 0x00, 0x36, 0x00, 0x0d, 0x00, 0x37, 0x00, 0x37, 0x00, 0x0e, 0x00, 0x38, 0x00, 0x38, 0x00, 0x0f, 0x00, 0x39, 0x00, 0x39, 0x00, 0x10, 0x00, 0x3a, 0x00, 0x3a, 0x00, 0x11, 0x00, 0x3b, 0x00, 0x3b, 0x00, 0x12, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x13, 0x00, 0x3d, 0x00, 0x3d, 0x00, 0x14, 0x00, 0x44, 0x00, 0x44, 0x00, 0x15, 0x00, 0x46, 0x00, 0x46, 0x00, 0x16, 0x00, 0x47, 0x00, 0x47, 0x00, 0x17, 0x00, 0x48, 0x00, 0x48, 0x00, 0x18, 0x00, 0x49, 0x00, 0x49, 0x00, 0x19, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x1a, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x1b, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x1c, 0x00, 0x50, 0x00, 0x50, 0x00, 0x1a, 0x00, 0x51, 0x00, 0x51, 0x00, 0x1d, 0x00, 0x52, 0x00, 0x52, 0x00, 0x1e, 0x00, 0x54, 0x00, 0x54, 0x00, 0x17, 0x00, 0x55, 0x00, 0x55, 0x00, 0x1f, 0x00, 0x56, 0x00, 0x56, 0x00, 0x20, 0x00, 0x57, 0x00, 0x57, 0x00, 0x21, 0x00, 0x58, 0x00, 0x58, 0x00, 0x22, 0x00, 0x59, 0x00, 0x59, 0x00, 0x23, 0x00, 0x5a, 0x00, 0x5a, 0x00, 0x24, 0x00, 0x5b, 0x00, 0x5b, 0x00, 0x25, 0x00, 0x5c, 0x00, 0x5c, 0x00, 0x26, 0x00, 0x6d, 0x00, 0x6d, 0x00, 0x27, 0x00, 0x7d, 0x00, 0x7d, 0x00, 0x28, 0x00, 0x82, 0x00, 0x86, 0x00, 0x04, 0x00, 0x88, 0x00, 0x88, 0x00, 0x29, 0x00, 0x89, 0x00, 0x89, 0x00, 0x2a, 0x00, 0x94, 0x00, 0x98, 0x00, 0x0b, 0x00, 0x9b, 0x00, 0x9e, 0x00, 0x0f, 0x00, 0x9f, 0x00, 0x9f, 0x00, 0x13, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0x08, 0x00, 0xa2, 0x00, 0xa2, 0x00, 0x2b, 0x00, 0xa3, 0x00, 0xa3, 0x00, 0x15, 0x00, 0xa4, 0x00, 0xa7, 0x00, 0x2b, 0x00, 0xa9, 0x00, 0xa9, 0x00, 0x16, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0x2c, 0x00, 0xab, 0x00, 0xab, 0x00, 0x18, 0x00, 0xac, 0x00, 0xad, 0x00, 0x2c, 0x00, 0xb2, 0x00, 0xb2, 0x00, 0x2d, 0x00, 0xb3, 0x00, 0xb3, 0x00, 0x1d, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0x2e, 0x00, 0xb5, 0x00, 0xb5, 0x00, 0x1e, 0x00, 0xb6, 0x00, 0xb8, 0x00, 0x2e, 0x00, 0xbb, 0x00, 0xbb, 0x00, 0x2f, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0x22, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0x2f, 0x00, 0xbf, 0x00, 0xbf, 0x00, 0x26, 0x00, 0xc1, 0x00, 0xc1, 0x00, 0x26, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x30, 0x00, 0xc3, 0x00, 0xc3, 0x00, 0x31, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x30, 0x00, 0xc5, 0x00, 0xc5, 0x00, 0x31, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x30, 0x00, 0xc7, 0x00, 0xc7, 0x00, 0x31, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0x06, 0x00, 0xc9, 0x00, 0xc9, 0x00, 0x32, 0x00, 0xca, 0x00, 0xca, 0x00, 0x33, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0x34, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0x33, 0x00, 0xcd, 0x00, 0xcd, 0x00, 0x35, 0x00, 0xce, 0x00, 0xce, 0x00, 0x06, 0x00, 0xcf, 0x00, 0xcf, 0x00, 0x32, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x07, 0x00, 0xd1, 0x00, 0xd1, 0x00, 0x36, 0x00, 0xd3, 0x00, 0xd3, 0x00, 0x37, 0x00, 0xd5, 0x00, 0xd5, 0x00, 0x38, 0x00, 0xd7, 0x00, 0xd7, 0x00, 0x38, 0x00, 0xd9, 0x00, 0xd9, 0x00, 0x38, 0x00, 0xdb, 0x00, 0xdb, 0x00, 0x38, 0x00, 0xdd, 0x00, 0xdd, 0x00, 0x18, 0x00, 0xde, 0x00, 0xde, 0x00, 0x33, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x39, 0x00, 0xe1, 0x00, 0xe1, 0x00, 0x1a, 0x00, 0xe2, 0x00, 0xe2, 0x00, 0x33, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0x3a, 0x00, 0xf1, 0x00, 0xf1, 0x00, 0x3b, 0x00, 0xf5, 0x00, 0xf5, 0x00, 0x3b, 0x00, 0xfb, 0x00, 0xfb, 0x00, 0x08, 0x00, 0xff, 0x00, 0xff, 0x00, 0x08, 0x01, 0x0a, 0x01, 0x0a, 0x00, 0x1d, 0x01, 0x0e, 0x01, 0x0e, 0x00, 0x33, 0x01, 0x0f, 0x01, 0x0f, 0x00, 0x3c, 0x01, 0x10, 0x01, 0x10, 0x00, 0x33, 0x01, 0x11, 0x01, 0x11, 0x00, 0x3c, 0x01, 0x12, 0x01, 0x12, 0x00, 0x3d, 0x01, 0x13, 0x01, 0x13, 0x00, 0x3c, 0x01, 0x16, 0x01, 0x16, 0x00, 0x08, 0x01, 0x17, 0x01, 0x17, 0x00, 0x1f, 0x01, 0x19, 0x01, 0x19, 0x00, 0x3b, 0x01, 0x1a, 0x01, 0x1a, 0x00, 0x08, 0x01, 0x1b, 0x01, 0x1b, 0x00, 0x1f, 0x01, 0x1c, 0x01, 0x1c, 0x00, 0x0d, 0x01, 0x1e, 0x01, 0x1e, 0x00, 0x0d, 0x01, 0x20, 0x01, 0x20, 0x00, 0x0d, 0x01, 0x21, 0x01, 0x21, 0x00, 0x20, 0x01, 0x22, 0x01, 0x22, 0x00, 0x0d, 0x01, 0x23, 0x01, 0x23, 0x00, 0x20, 0x01, 0x24, 0x01, 0x24, 0x00, 0x3e, 0x01, 0x25, 0x01, 0x25, 0x00, 0x35, 0x01, 0x26, 0x01, 0x26, 0x00, 0x0e, 0x01, 0x27, 0x01, 0x27, 0x00, 0x21, 0x01, 0x28, 0x01, 0x28, 0x00, 0x3f, 0x01, 0x2b, 0x01, 0x2b, 0x00, 0x40, 0x01, 0x2d, 0x01, 0x2d, 0x00, 0x40, 0x01, 0x2f, 0x01, 0x2f, 0x00, 0x40, 0x01, 0x30, 0x01, 0x30, 0x00, 0x0f, 0x01, 0x31, 0x01, 0x31, 0x00, 0x22, 0x01, 0x33, 0x01, 0x33, 0x00, 0x40, 0x01, 0x35, 0x01, 0x35, 0x00, 0x40, 0x01, 0x36, 0x01, 0x36, 0x00, 0x41, 0x01, 0x37, 0x01, 0x37, 0x00, 0x42, 0x01, 0x38, 0x01, 0x38, 0x00, 0x43, 0x01, 0x39, 0x01, 0x39, 0x00, 0x44, 0x01, 0x3a, 0x01, 0x3a, 0x00, 0x13, 0x01, 0x3f, 0x01, 0x3f, 0x00, 0x14, 0x01, 0x88, 0x01, 0x88, 0x00, 0x34, 0x01, 0xac, 0x01, 0xac, 0x00, 0x45, 0x01, 0xad, 0x01, 0xad, 0x00, 0x46, 0x01, 0xae, 0x01, 0xae, 0x00, 0x45, 0x01, 0xaf, 0x01, 0xaf, 0x00, 0x46, 0x01, 0xda, 0x01, 0xda, 0x00, 0x0d, 0x01, 0xdc, 0x01, 0xdc, 0x00, 0x47, 0x01, 0xdd, 0x01, 0xdd, 0x00, 0x34, 0x01, 0xf0, 0x01, 0xf0, 0x00, 0x33, 0x01, 0xf1, 0x01, 0xf1, 0x00, 0x48, 0x01, 0xf3, 0x01, 0xf3, 0x00, 0x34, 0x01, 0xf4, 0x01, 0xf4, 0x00, 0x49, 0x01, 0xf5, 0x01, 0xf5, 0x00, 0x4a, 0x05, 0xd0, 0x05, 0xd0, 0x00, 0x41, 0x05, 0xd1, 0x05, 0xd1, 0x00, 0x4b, 0x05, 0xd2, 0x05, 0xd2, 0x00, 0x4c, 0x05, 0xd3, 0x05, 0xd3, 0x00, 0x42, 0x05, 0xd4, 0x05, 0xd4, 0x00, 0x41, 0x05, 0xd5, 0x05, 0xd5, 0x00, 0x42, 0x06, 0x42, 0x06, 0x42, 0x00, 0x43, 0x06, 0x43, 0x06, 0x43, 0x00, 0x44, 0x07, 0x51, 0x07, 0x51, 0x00, 0x4d, 0x07, 0x52, 0x07, 0x52, 0x00, 0x4e, 0x07, 0x53, 0x07, 0x53, 0x00, 0x4f, 0x0e, 0x78, 0x0e, 0x78, 0x00, 0x08, 0x00, 0x01, 0x00, 0x61, 0x00, 0x10, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x51, 0x00, 0x52, 0x00, 0x55, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x6d, 0x00, 0x7d, 0x00, 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x88, 0x00, 0x89, 0x00, 0x92, 0x00, 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xaa, 0x00, 0xab, 0x00, 0xac, 0x00, 0xad, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0xbf, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc4, 0x00, 0xc6, 0x00, 0xc8, 0x00, 0xce, 0x00, 0xd0, 0x00, 0xd2, 0x00, 0xdd, 0x00, 0xe0, 0x00, 0xfb, 0x00, 0xff, 0x01, 0x02, 0x01, 0x0a, 0x01, 0x16, 0x01, 0x17, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x20, 0x01, 0x22, 0x01, 0x26, 0x01, 0x30, 0x01, 0x3a, 0x01, 0x3f, 0x07, 0x45, 0x07, 0x51, 0x07, 0x53, 0x0e, 0x60, 0x0e, 0x78, 0x0e, 0x79, 0x00, 0x02, 0x00, 0x60, 0x00, 0x04, 0x00, 0x00, 0x00, 0x24, 0x00, 0x58, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xd8, 0x00, 0x00, 0xff, 0xb1, 0x00, 0x00, 0xff, 0xa3, 0x00, 0x00, 0xff, 0x9c, 0x00, 0x01, 0x0e, 0xaa, 0x00, 0x17, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x0e, 0xc2, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x0e, 0xaa, 0x0e, 0xae, 0x00, 0x00, 0x0e, 0xb0, 0x0e, 0xb4, 0x00, 0x05, 0x0e, 0xb6, 0x0e, 0xba, 0x00, 0x0a, 0x0e, 0xbc, 0x0e, 0xc0, 0x00, 0x0f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a, 0x01, 0xf0, 0x02, 0x9e, 0x00, 0x14, 0x44, 0x46, 0x4c, 0x54, 0x00, 0x7a, 0x61, 0x72, 0x61, 0x62, 0x00, 0x88, 0x61, 0x72, 0x6d, 0x6e, 0x00, 0xa6, 0x62, 0x72, 0x61, 0x69, 0x00, 0xb2, 0x63, 0x61, 0x6e, 0x73, 0x00, 0xbe, 0x63, 0x68, 0x65, 0x72, 0x00, 0xca, 0x63, 0x79, 0x72, 0x6c, 0x00, 0xd6, 0x67, 0x65, 0x6f, 0x72, 0x00, 0xf8, 0x67, 0x72, 0x65, 0x6b, 0x01, 0x04, 0x68, 0x61, 0x6e, 0x69, 0x01, 0x14, 0x68, 0x65, 0x62, 0x72, 0x01, 0x20, 0x6b, 0x61, 0x6e, 0x61, 0x01, 0x2c, 0x6c, 0x61, 0x6f, 0x20, 0x01, 0x38, 0x6c, 0x61, 0x74, 0x6e, 0x01, 0x44, 0x6d, 0x61, 0x74, 0x68, 0x01, 0x9e, 0x6e, 0x6b, 0x6f, 0x20, 0x01, 0xaa, 0x6f, 0x67, 0x61, 0x6d, 0x01, 0xb6, 0x72, 0x75, 0x6e, 0x72, 0x01, 0xc2, 0x74, 0x66, 0x6e, 0x67, 0x01, 0xce, 0x74, 0x68, 0x61, 0x69, 0x01, 0xda, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x06, 0x00, 0x16, 0x00, 0x03, 0x4b, 0x55, 0x52, 0x20, 0x00, 0x16, 0x53, 0x4e, 0x44, 0x20, 0x00, 0x16, 0x55, 0x52, 0x44, 0x20, 0x00, 0x16, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x10, 0x00, 0x02, 0x4d, 0x4b, 0x44, 0x20, 0x00, 0x18, 0x53, 0x52, 0x42, 0x20, 0x00, 0x18, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x01, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x34, 0x00, 0x08, 0x49, 0x53, 0x4d, 0x20, 0x00, 0x46, 0x4b, 0x53, 0x4d, 0x20, 0x00, 0x46, 0x4c, 0x53, 0x4d, 0x20, 0x00, 0x46, 0x4d, 0x4f, 0x4c, 0x20, 0x00, 0x34, 0x4e, 0x53, 0x4d, 0x20, 0x00, 0x46, 0x52, 0x4f, 0x4d, 0x20, 0x00, 0x34, 0x53, 0x4b, 0x53, 0x20, 0x00, 0x46, 0x53, 0x53, 0x4d, 0x20, 0x00, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x07, 0x00, 0x02, 0x00, 0x05, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x01, 0x00, 0x03, 0x00, 0x0e, 0x20, 0x52, 0x51, 0x44, 0x00, 0x56, 0x61, 0x61, 0x6c, 0x74, 0x00, 0x5c, 0x61, 0x61, 0x6c, 0x74, 0x00, 0x62, 0x63, 0x63, 0x6d, 0x70, 0x00, 0x68, 0x63, 0x63, 0x6d, 0x70, 0x00, 0x6e, 0x63, 0x63, 0x6d, 0x70, 0x00, 0x76, 0x64, 0x6c, 0x69, 0x67, 0x00, 0x7e, 0x64, 0x6c, 0x69, 0x67, 0x00, 0x84, 0x68, 0x6c, 0x69, 0x67, 0x00, 0x8a, 0x6c, 0x69, 0x67, 0x61, 0x00, 0x90, 0x6c, 0x6f, 0x63, 0x6c, 0x00, 0x96, 0x6c, 0x6f, 0x63, 0x6c, 0x00, 0x9c, 0x73, 0x61, 0x6c, 0x74, 0x00, 0xa2, 0x73, 0x61, 0x6c, 0x74, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x16, 0x00, 0x2e, 0x00, 0x36, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x90, 0x00, 0x98, 0x00, 0xa0, 0x00, 0xa8, 0x00, 0xb0, 0x00, 0xb8, 0x00, 0xc0, 0x00, 0xc8, 0x00, 0xd0, 0x00, 0xd8, 0x00, 0xe0, 0x00, 0xe8, 0x00, 0x06, 0x00, 0x09, 0x00, 0x01, 0x00, 0xc2, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x01, 0x12, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x01, 0x3e, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0a, 0x04, 0xb2, 0x05, 0x0a, 0x05, 0x62, 0x05, 0xba, 0x06, 0x12, 0x06, 0x6a, 0x06, 0xac, 0x06, 0xf4, 0x07, 0x3c, 0x07, 0x84, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x07, 0xac, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x07, 0xb0, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x07, 0xb4, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x07, 0xe8, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x07, 0xf8, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x08, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x9c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0xba, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0xd8, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x08, 0xee, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0x52, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0x88, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0x90, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0x98, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0xa0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0xa8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0xb0, 0x00, 0x02, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x02, 0x00, 0x02, 0x07, 0x42, 0x07, 0x42, 0x00, 0x00, 0x11, 0x52, 0x11, 0xab, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x07, 0x42, 0x07, 0x42, 0x00, 0x01, 0x11, 0x52, 0x11, 0xab, 0x00, 0x01, 0x00, 0x03, 0x00, 0x08, 0x00, 0x14, 0x00, 0x1e, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x16, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x8c, 0x00, 0x05, 0x00, 0x00, 0x03, 0x0c, 0x03, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x39, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xf1, 0x02, 0x0b, 0x02, 0x2a, 0x02, 0x5f, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xba, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf7, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x03, 0x01, 0x03, 0x02, 0x03, 0x04, 0x03, 0x87, 0x03, 0xea, 0x03, 0xec, 0x04, 0x17, 0x04, 0x18, 0x04, 0x19, 0x04, 0x1a, 0x05, 0x7d, 0x06, 0x1b, 0x07, 0xe3, 0x07, 0xe4, 0x07, 0xe5, 0x07, 0xe6, 0x08, 0x31, 0x08, 0x32, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x24, 0x00, 0x3d, 0x00, 0x03, 0x00, 0x45, 0x00, 0x45, 0x00, 0x03, 0x00, 0x47, 0x00, 0x47, 0x00, 0x03, 0x00, 0x49, 0x00, 0x49, 0x00, 0x03, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x03, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x03, 0x00, 0x57, 0x00, 0x57, 0x00, 0x03, 0x00, 0x82, 0x00, 0x98, 0x00, 0x03, 0x00, 0x9a, 0x00, 0xa1, 0x00, 0x03, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x03, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x03, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x03, 0x00, 0xc8, 0x00, 0xc8, 0x00, 0x03, 0x00, 0xca, 0x00, 0xca, 0x00, 0x03, 0x00, 0xcc, 0x00, 0xcc, 0x00, 0x03, 0x00, 0xce, 0x00, 0xce, 0x00, 0x03, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x03, 0x00, 0xd2, 0x00, 0xd2, 0x00, 0x03, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x03, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x03, 0x00, 0xd8, 0x00, 0xd8, 0x00, 0x03, 0x00, 0xda, 0x00, 0xda, 0x00, 0x03, 0x00, 0xdc, 0x00, 0xdc, 0x00, 0x03, 0x00, 0xde, 0x00, 0xde, 0x00, 0x03, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x03, 0x00, 0xe2, 0x00, 0xe2, 0x00, 0x03, 0x00, 0xe4, 0x00, 0xe4, 0x00, 0x03, 0x00, 0xe6, 0x00, 0xea, 0x00, 0x03, 0x00, 0xec, 0x00, 0xec, 0x00, 0x03, 0x00, 0xee, 0x00, 0xee, 0x00, 0x03, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x03, 0x00, 0xf1, 0x00, 0xf1, 0x00, 0x01, 0x00, 0xf2, 0x00, 0xf2, 0x00, 0x03, 0x00, 0xf4, 0x00, 0xf4, 0x00, 0x03, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0x03, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0x03, 0x00, 0xfb, 0x01, 0x05, 0x00, 0x03, 0x01, 0x07, 0x01, 0x07, 0x00, 0x03, 0x01, 0x09, 0x01, 0x09, 0x00, 0x03, 0x01, 0x0c, 0x01, 0x0c, 0x00, 0x03, 0x01, 0x0e, 0x01, 0x0e, 0x00, 0x03, 0x01, 0x10, 0x01, 0x10, 0x00, 0x03, 0x01, 0x12, 0x01, 0x12, 0x00, 0x03, 0x01, 0x14, 0x01, 0x14, 0x00, 0x03, 0x01, 0x16, 0x01, 0x16, 0x00, 0x03, 0x01, 0x18, 0x01, 0x18, 0x00, 0x03, 0x01, 0x1a, 0x01, 0x1a, 0x00, 0x03, 0x01, 0x1c, 0x01, 0x1c, 0x00, 0x03, 0x01, 0x1e, 0x01, 0x1e, 0x00, 0x03, 0x01, 0x20, 0x01, 0x20, 0x00, 0x03, 0x01, 0x22, 0x01, 0x22, 0x00, 0x03, 0x01, 0x24, 0x01, 0x24, 0x00, 0x03, 0x01, 0x26, 0x01, 0x26, 0x00, 0x03, 0x01, 0x28, 0x01, 0x28, 0x00, 0x03, 0x01, 0x2a, 0x01, 0x2a, 0x00, 0x03, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x03, 0x01, 0x2e, 0x01, 0x2e, 0x00, 0x03, 0x01, 0x30, 0x01, 0x30, 0x00, 0x03, 0x01, 0x32, 0x01, 0x32, 0x00, 0x03, 0x01, 0x34, 0x01, 0x34, 0x00, 0x03, 0x01, 0x36, 0x01, 0x36, 0x00, 0x03, 0x01, 0x38, 0x01, 0x38, 0x00, 0x03, 0x01, 0x3a, 0x01, 0x3b, 0x00, 0x03, 0x01, 0x3d, 0x01, 0x3d, 0x00, 0x03, 0x01, 0x3f, 0x01, 0x3f, 0x00, 0x03, 0x01, 0x41, 0x01, 0x41, 0x00, 0x03, 0x01, 0x48, 0x01, 0x48, 0x00, 0x03, 0x01, 0x52, 0x01, 0x52, 0x00, 0x03, 0x01, 0x54, 0x01, 0x54, 0x00, 0x03, 0x01, 0x56, 0x01, 0x56, 0x00, 0x03, 0x01, 0x79, 0x01, 0x7a, 0x00, 0x03, 0x01, 0x8f, 0x01, 0x8f, 0x00, 0x03, 0x01, 0x91, 0x01, 0x93, 0x00, 0x03, 0x01, 0x95, 0x01, 0x95, 0x00, 0x03, 0x01, 0xa4, 0x01, 0xa4, 0x00, 0x03, 0x01, 0xac, 0x01, 0xac, 0x00, 0x03, 0x01, 0xae, 0x01, 0xae, 0x00, 0x03, 0x01, 0xda, 0x01, 0xda, 0x00, 0x03, 0x01, 0xdc, 0x01, 0xdc, 0x00, 0x03, 0x01, 0xf0, 0x01, 0xf0, 0x00, 0x03, 0x01, 0xf4, 0x01, 0xf4, 0x00, 0x03, 0x02, 0x0b, 0x02, 0x0b, 0x00, 0x01, 0x02, 0x2a, 0x02, 0x2a, 0x00, 0x01, 0x02, 0x5f, 0x02, 0x5f, 0x00, 0x01, 0x02, 0xb1, 0x02, 0xc5, 0x00, 0x02, 0x02, 0xc7, 0x02, 0xca, 0x00, 0x04, 0x02, 0xcd, 0x02, 0xe4, 0x00, 0x04, 0x02, 0xea, 0x02, 0xed, 0x00, 0x04, 0x02, 0xee, 0x02, 0xf5, 0x00, 0x02, 0x02, 0xf6, 0x02, 0xf6, 0x00, 0x04, 0x02, 0xf7, 0x02, 0xf7, 0x00, 0x02, 0x02, 0xf8, 0x02, 0xfa, 0x00, 0x04, 0x02, 0xfb, 0x02, 0xfd, 0x00, 0x02, 0x02, 0xfe, 0x02, 0xff, 0x00, 0x04, 0x03, 0x01, 0x03, 0x02, 0x00, 0x02, 0x03, 0x03, 0x03, 0x03, 0x00, 0x04, 0x03, 0x04, 0x03, 0x04, 0x00, 0x02, 0x03, 0x87, 0x03, 0x87, 0x00, 0x01, 0x03, 0xea, 0x03, 0xea, 0x00, 0x01, 0x03, 0xec, 0x03, 0xec, 0x00, 0x01, 0x04, 0x17, 0x04, 0x1a, 0x00, 0x02, 0x05, 0x7d, 0x05, 0x7d, 0x00, 0x01, 0x06, 0x1b, 0x06, 0x1b, 0x00, 0x01, 0x07, 0xe3, 0x07, 0xe6, 0x00, 0x02, 0x08, 0x31, 0x08, 0x32, 0x00, 0x01, 0x00, 0x03, 0x00, 0x08, 0x00, 0x16, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x08, 0x00, 0x16, 0x00, 0x26, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x04, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x02, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x24, 0x00, 0x03, 0x00, 0x00, 0x00, 0x34, 0x00, 0x46, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0xa7, 0x02, 0xa7, 0x00, 0x01, 0x02, 0xa8, 0x02, 0xab, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x24, 0x00, 0x03, 0x00, 0x00, 0x00, 0x34, 0x00, 0x46, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa7, 0x00, 0x05, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x24, 0x00, 0x03, 0x00, 0x00, 0x00, 0x34, 0x00, 0x46, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa7, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x12, 0x00, 0x02, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x24, 0x00, 0x03, 0x00, 0x00, 0x00, 0x34, 0x00, 0x46, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x02, 0xa7, 0x00, 0x05, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x12, 0x00, 0x1c, 0x00, 0x24, 0x00, 0x24, 0x00, 0x03, 0x00, 0x00, 0x00, 0x34, 0x00, 0x46, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0xa7, 0x02, 0xaa, 0x00, 0x02, 0x02, 0xab, 0x02, 0xab, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x02, 0x00, 0x12, 0x00, 0x18, 0x00, 0x18, 0x00, 0x28, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0xa7, 0x00, 0x02, 0x00, 0x02, 0x02, 0xa7, 0x02, 0xa7, 0x00, 0x01, 0x0e, 0xaa, 0x0e, 0xad, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x02, 0x00, 0x12, 0x00, 0x18, 0x00, 0x18, 0x00, 0x2e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0xa8, 0x00, 0x02, 0x00, 0x03, 0x02, 0xa8, 0x02, 0xa8, 0x00, 0x01, 0x0e, 0xae, 0x0e, 0xae, 0x00, 0x02, 0x0e, 0xb0, 0x0e, 0xb2, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x02, 0x00, 0x12, 0x00, 0x18, 0x00, 0x18, 0x00, 0x2e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0xa9, 0x00, 0x02, 0x00, 0x03, 0x02, 0xa9, 0x02, 0xa9, 0x00, 0x01, 0x0e, 0xb3, 0x0e, 0xb4, 0x00, 0x02, 0x0e, 0xb6, 0x0e, 0xb7, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x02, 0x00, 0x12, 0x00, 0x18, 0x00, 0x18, 0x00, 0x2e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0xaa, 0x00, 0x02, 0x00, 0x03, 0x02, 0xaa, 0x02, 0xaa, 0x00, 0x01, 0x0e, 0xb8, 0x0e, 0xba, 0x00, 0x02, 0x0e, 0xbc, 0x0e, 0xbc, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x02, 0x00, 0x12, 0x00, 0x18, 0x00, 0x18, 0x00, 0x28, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x02, 0xab, 0x00, 0x02, 0x00, 0x02, 0x02, 0xab, 0x02, 0xab, 0x00, 0x01, 0x0e, 0xbd, 0x0e, 0xc0, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x01, 0x00, 0x06, 0x0b, 0x43, 0x00, 0x01, 0x00, 0x01, 0x03, 0xc5, 0x00, 0x01, 0x00, 0x06, 0x10, 0x0f, 0x00, 0x01, 0x00, 0x01, 0x01, 0x0c, 0x00, 0x01, 0x00, 0x36, 0x00, 0x01, 0x00, 0x08, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x22, 0x00, 0x28, 0x0f, 0x0d, 0x00, 0x03, 0x00, 0x49, 0x00, 0x4f, 0x0f, 0x0c, 0x00, 0x03, 0x00, 0x49, 0x00, 0x4c, 0x0f, 0x0b, 0x00, 0x02, 0x00, 0x4f, 0x0f, 0x0a, 0x00, 0x02, 0x00, 0x4c, 0x0f, 0x09, 0x00, 0x02, 0x00, 0x49, 0x00, 0x01, 0x00, 0x01, 0x00, 0x49, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x0f, 0x0f, 0x00, 0x02, 0x00, 0x57, 0x00, 0x01, 0x00, 0x01, 0x00, 0x56, 0x00, 0x01, 0x00, 0x12, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x0f, 0x0e, 0x00, 0x02, 0x00, 0x57, 0x00, 0x01, 0x00, 0x01, 0x01, 0x41, 0x00, 0x01, 0x00, 0x88, 0x00, 0x08, 0x00, 0x16, 0x00, 0x28, 0x00, 0x3a, 0x00, 0x46, 0x00, 0x50, 0x00, 0x5a, 0x00, 0x66, 0x00, 0x72, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, 0x07, 0x7e, 0x00, 0x02, 0x00, 0x22, 0x07, 0x71, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0c, 0x07, 0x7d, 0x00, 0x02, 0x00, 0x04, 0x07, 0x7c, 0x00, 0x02, 0x00, 0x22, 0x00, 0x01, 0x00, 0x04, 0x08, 0x24, 0x00, 0x03, 0x00, 0x24, 0x00, 0x3b, 0x00, 0x01, 0x00, 0x04, 0x07, 0xd2, 0x00, 0x02, 0x00, 0x56, 0x00, 0x01, 0x00, 0x04, 0x08, 0x09, 0x00, 0x02, 0x00, 0x30, 0x00, 0x01, 0x00, 0x04, 0x08, 0x0a, 0x00, 0x03, 0x00, 0x28, 0x00, 0x2f, 0x00, 0x01, 0x00, 0x04, 0x07, 0xea, 0x00, 0x03, 0x00, 0x12, 0x00, 0x46, 0x00, 0x02, 0x00, 0x06, 0x00, 0x0e, 0x07, 0xf0, 0x00, 0x03, 0x00, 0x12, 0x00, 0x58, 0x07, 0xef, 0x00, 0x03, 0x00, 0x12, 0x00, 0x52, 0x00, 0x01, 0x00, 0x08, 0x00, 0x04, 0x00, 0x22, 0x00, 0x29, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x44, 0x00, 0x46, 0x00, 0x02, 0x00, 0x14, 0x00, 0x07, 0x03, 0x67, 0x03, 0x66, 0x03, 0x68, 0x03, 0x64, 0x03, 0x65, 0x03, 0x6a, 0x03, 0x69, 0x00, 0x01, 0x00, 0x07, 0x03, 0x23, 0x03, 0x39, 0x03, 0x3f, 0x03, 0x46, 0x03, 0x4c, 0x03, 0x54, 0x03, 0x5a, 0x00, 0x02, 0x00, 0x14, 0x00, 0x07, 0x03, 0x67, 0x03, 0x66, 0x03, 0x68, 0x03, 0x64, 0x03, 0x65, 0x03, 0x6a, 0x03, 0x69, 0x00, 0x01, 0x00, 0x07, 0x03, 0x23, 0x03, 0x39, 0x03, 0x3f, 0x03, 0x46, 0x03, 0x4c, 0x03, 0x54, 0x03, 0x5a, 0x00, 0x02, 0x00, 0x10, 0x00, 0x05, 0x11, 0x48, 0x11, 0x34, 0x02, 0x13, 0x11, 0x3e, 0x11, 0x1b, 0x00, 0x01, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x4f, 0x01, 0x0c, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x06, 0x00, 0x12, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x01, 0x11, 0x48, 0x00, 0x01, 0x11, 0x34, 0x00, 0x01, 0x02, 0x13, 0x00, 0x01, 0x11, 0x3e, 0x00, 0x01, 0x11, 0xb8, 0x00, 0x01, 0x11, 0x1b, 0x00, 0x01, 0x00, 0x06, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x4f, 0x00, 0x5c, 0x01, 0x0c, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x0c, 0x10, 0xee, 0x10, 0xec, 0x10, 0xef, 0x10, 0xed, 0x10, 0xf2, 0x10, 0xf3, 0x10, 0xeb, 0x11, 0xac, 0x10, 0xf4, 0x10, 0xf0, 0x10, 0xf5, 0x10, 0xf1, 0x00, 0x01, 0x00, 0x0c, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, 0xb4, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xbd, 0x02, 0xc0, 0x02, 0xc2, 0x00, 0x02, 0x00, 0x20, 0x00, 0x0d, 0x00, 0xf3, 0x01, 0xf9, 0x11, 0x42, 0x02, 0x21, 0x11, 0x1c, 0x11, 0x1d, 0x01, 0xf9, 0x00, 0xf3, 0x01, 0xf9, 0x11, 0x45, 0x11, 0x46, 0x11, 0x43, 0x11, 0x44, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0xf1, 0x02, 0x0b, 0x02, 0x2a, 0x02, 0x5f, 0x03, 0x87, 0x03, 0xea, 0x03, 0xec, 0x05, 0x7d, 0x06, 0x1b, 0x08, 0x31, 0x08, 0x32, 0x00, 0x01, 0x00, 0x06, 0x0c, 0x02, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x0c, 0x07, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x0c, 0x0c, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x0c, 0x11, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x0c, 0x16, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x05, 0x0e, 0xc2, 0x0e, 0xc2, 0x0e, 0xc2, 0x0e, 0xc2, 0x0e, 0xc2, 0x00, 0x02, 0x00, 0x01, 0x02, 0xa7, 0x02, 0xab, 0x00, 0x00, 0x00, 0x01, 0x03, 0xa6, 0x01, 0x90, 0x00, 0x04, 0x00, 0x00, 0x05, 0x33, 0x05, 0x99, 0x00, 0x00, 0x01, 0x1e, 0x05, 0x33, 0x05, 0x99, 0x00, 0x00, 0x03, 0xd7, 0x00, 0x66, 0x02, 0x12, 0x00, 0x00, 0x02, 0x0b, 0x06, 0x06, 0x03, 0x08, 0x04, 0x02, 0x02, 0x04, 0xe0, 0x00, 0x02, 0xff, 0x52, 0x00, 0xfd, 0xff, 0x02, 0x24, 0x00, 0x21, 0x04, 0x00, 0x20, 0x00, 0x50, 0x66, 0x45, 0x64, 0x00, 0x40, 0x00, 0x20, 0xff, 0xff, 0x06, 0x14, 0xfe, 0x14, 0x01, 0x9a, 0x07, 0x6d, 0x01, 0xe3, 0x60, 0x00, 0x01, 0xff, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x8c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x04, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x04, 0x8c, 0x00, 0x04, 0x04, 0x60, 0x00, 0x00, 0x01, 0x14, 0x01, 0x00, 0x00, 0x07, 0x00, 0x14, 0x00, 0x00, 0x00, 0x7e, 0x02, 0xe9, 0x02, 0xee, 0x02, 0xf3, 0x02, 0xf7, 0x03, 0x4f, 0x03, 0x53, 0x03, 0x58, 0x03, 0x5a, 0x03, 0x62, 0x03, 0x77, 0x03, 0x7e, 0x03, 0x8a, 0x03, 0x8c, 0x03, 0xa1, 0x05, 0x25, 0x1d, 0x14, 0x1d, 0x23, 0x1d, 0x2e, 0x1d, 0x5b, 0x1d, 0x6a, 0x1d, 0x78, 0x1d, 0x7b, 0x1d, 0x7d, 0x1d, 0x85, 0x1d, 0xbf, 0x1d, 0xc9, 0x1e, 0xfb, 0x1f, 0x15, 0x1f, 0x1d, 0x1f, 0x45, 0x1f, 0x4d, 0x1f, 0x57, 0x1f, 0x59, 0x1f, 0x5b, 0x1f, 0x5d, 0x1f, 0x7d, 0x1f, 0xb4, 0x1f, 0xc4, 0x1f, 0xd3, 0x1f, 0xdb, 0x1f, 0xef, 0x1f, 0xf4, 0x1f, 0xfe, 0x20, 0x64, 0x20, 0x71, 0x20, 0x8e, 0x20, 0x9c, 0x20, 0xb5, 0x20, 0xba, 0x20, 0xd1, 0x20, 0xd7, 0x20, 0xdc, 0x20, 0xe1, 0x21, 0x09, 0x21, 0x49, 0x21, 0x4b, 0x21, 0x4e, 0x21, 0x85, 0x21, 0x89, 0x23, 0x11, 0x23, 0x19, 0x23, 0x21, 0x23, 0x28, 0x23, 0x2c, 0x23, 0x75, 0x23, 0x7a, 0x23, 0x7d, 0x23, 0x87, 0x23, 0x94, 0x23, 0xae, 0x23, 0xcf, 0x23, 0xe3, 0x23, 0xe5, 0x23, 0xe8, 0x24, 0x23, 0x24, 0x69, 0x26, 0x9c, 0x26, 0xb8, 0x26, 0xc3, 0x26, 0xe2, 0x27, 0x04, 0x27, 0x09, 0x27, 0x27, 0x27, 0x4b, 0x27, 0x4d, 0x27, 0x52, 0x27, 0x56, 0x27, 0x5e, 0x27, 0x94, 0x27, 0xaf, 0x27, 0xbe, 0x27, 0xc6, 0x27, 0xe0, 0x27, 0xeb, 0x28, 0xff, 0x29, 0x07, 0x29, 0x0b, 0x29, 0x41, 0x29, 0x84, 0x29, 0xd5, 0x29, 0xeb, 0x29, 0xfb, 0x2a, 0x02, 0x2a, 0x1c, 0x2a, 0x2f, 0x2a, 0x6b, 0x2a, 0xa0, 0x2a, 0xba, 0x2a, 0xfa, 0x2b, 0x1a, 0x2b, 0x24, 0x2b, 0x54, 0x2c, 0x77, 0x2c, 0x7f, 0xa7, 0x16, 0xa7, 0x1f, 0xa7, 0x2b, 0xa7, 0x41, 0xa7, 0x4b, 0xa7, 0x53, 0xa7, 0x57, 0xa7, 0x67, 0xa7, 0x83, 0xa7, 0x8e, 0xa7, 0x91, 0xa7, 0xaa, 0xa7, 0xff, 0xef, 0x19, 0xf0, 0x03, 0xf4, 0x26, 0xf4, 0x41, 0xf6, 0xc5, 0xfb, 0x06, 0xfe, 0x23, 0xff, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xa0, 0x02, 0xec, 0x02, 0xf3, 0x02, 0xf7, 0x03, 0x00, 0x03, 0x51, 0x03, 0x57, 0x03, 0x5a, 0x03, 0x5c, 0x03, 0x70, 0x03, 0x7a, 0x03, 0x84, 0x03, 0x8c, 0x03, 0x8e, 0x03, 0xa3, 0x1d, 0x00, 0x1d, 0x16, 0x1d, 0x26, 0x1d, 0x30, 0x1d, 0x5d, 0x1d, 0x77, 0x1d, 0x7b, 0x1d, 0x7d, 0x1d, 0x85, 0x1d, 0x9b, 0x1d, 0xc4, 0x1e, 0x00, 0x1f, 0x00, 0x1f, 0x18, 0x1f, 0x20, 0x1f, 0x48, 0x1f, 0x50, 0x1f, 0x59, 0x1f, 0x5b, 0x1f, 0x5d, 0x1f, 0x5f, 0x1f, 0x80, 0x1f, 0xb6, 0x1f, 0xc6, 0x1f, 0xd6, 0x1f, 0xdd, 0x1f, 0xf2, 0x1f, 0xf6, 0x20, 0x00, 0x20, 0x6a, 0x20, 0x74, 0x20, 0x90, 0x20, 0xa0, 0x20, 0xb8, 0x20, 0xd0, 0x20, 0xd6, 0x20, 0xdb, 0x20, 0xe1, 0x21, 0x00, 0x21, 0x0b, 0x21, 0x4b, 0x21, 0x4e, 0x21, 0x50, 0x21, 0x89, 0x21, 0x90, 0x23, 0x18, 0x23, 0x1c, 0x23, 0x24, 0x23, 0x2b, 0x23, 0x73, 0x23, 0x7a, 0x23, 0x7d, 0x23, 0x87, 0x23, 0x94, 0x23, 0x9b, 0x23, 0xce, 0x23, 0xe3, 0x23, 0xe5, 0x23, 0xe8, 0x24, 0x22, 0x24, 0x60, 0x25, 0x00, 0x26, 0xa0, 0x26, 0xc0, 0x26, 0xe2, 0x27, 0x01, 0x27, 0x06, 0x27, 0x0c, 0x27, 0x29, 0x27, 0x4d, 0x27, 0x4f, 0x27, 0x56, 0x27, 0x58, 0x27, 0x61, 0x27, 0x98, 0x27, 0xb1, 0x27, 0xc5, 0x27, 0xe0, 0x27, 0xe6, 0x27, 0xf0, 0x29, 0x06, 0x29, 0x0a, 0x29, 0x40, 0x29, 0x83, 0x29, 0xce, 0x29, 0xeb, 0x29, 0xfa, 0x2a, 0x00, 0x2a, 0x0c, 0x2a, 0x2f, 0x2a, 0x6a, 0x2a, 0x7d, 0x2a, 0xae, 0x2a, 0xf9, 0x2b, 0x00, 0x2b, 0x1f, 0x2b, 0x53, 0x2c, 0x60, 0x2c, 0x79, 0xa7, 0x08, 0xa7, 0x1b, 0xa7, 0x22, 0xa7, 0x30, 0xa7, 0x46, 0xa7, 0x4e, 0xa7, 0x56, 0xa7, 0x64, 0xa7, 0x80, 0xa7, 0x89, 0xa7, 0x90, 0xa7, 0xa0, 0xa7, 0xfa, 0xef, 0x00, 0xf0, 0x00, 0xf4, 0x00, 0xf4, 0x28, 0xf6, 0xc5, 0xfb, 0x00, 0xfe, 0x20, 0xff, 0xf9, 0xff, 0xff, 0x00, 0x00, 0xff, 0xe3, 0xff, 0xc2, 0xff, 0xc0, 0xff, 0xbc, 0xff, 0xb9, 0xff, 0xb1, 0xff, 0xb0, 0xff, 0xad, 0xff, 0xac, 0xff, 0xab, 0xff, 0x9e, 0xff, 0x9c, 0xff, 0x97, 0xff, 0x96, 0xff, 0x95, 0xff, 0x94, 0xe7, 0xba, 0xe7, 0xb9, 0xe7, 0xb7, 0xe7, 0xb6, 0xe7, 0xb5, 0xe7, 0xa9, 0xe7, 0xa7, 0xe7, 0xa6, 0xe7, 0x9f, 0xe7, 0x8a, 0xe7, 0x86, 0xe7, 0x50, 0xe7, 0x4c, 0xe7, 0x4a, 0xe7, 0x48, 0xe7, 0x46, 0xe7, 0x44, 0xe7, 0x43, 0xe7, 0x42, 0xe7, 0x41, 0xe7, 0x40, 0xe7, 0x3e, 0xe7, 0x3d, 0xe7, 0x3c, 0xe7, 0x3a, 0xe7, 0x39, 0xe7, 0x37, 0xe7, 0x36, 0xe7, 0x35, 0xe7, 0x30, 0xe7, 0x2e, 0xe7, 0x2d, 0xe7, 0x2a, 0xe7, 0x28, 0xe7, 0x13, 0xe7, 0x0f, 0xe7, 0x0c, 0xe7, 0x08, 0xe6, 0xea, 0xe6, 0xe9, 0xe6, 0xe8, 0xe6, 0xe6, 0xe6, 0xe5, 0xe6, 0xe2, 0xe6, 0xdc, 0xe6, 0xd6, 0xe6, 0xd4, 0xe6, 0xd2, 0xe6, 0xd0, 0xe6, 0x8a, 0xe6, 0x86, 0xe6, 0x84, 0xe6, 0x7b, 0xe6, 0x6f, 0xe6, 0x69, 0xe6, 0x4a, 0xe6, 0x37, 0xe6, 0x36, 0xe6, 0x34, 0xe5, 0xfb, 0xe5, 0xbf, 0xe5, 0x29, 0xe5, 0x26, 0xe5, 0x1f, 0xe5, 0x01, 0xe4, 0xe3, 0xe4, 0xe2, 0xe4, 0xe0, 0xe4, 0xdf, 0xe4, 0xde, 0xe4, 0xdd, 0xe4, 0xda, 0xe4, 0xd9, 0xe4, 0xd7, 0xe4, 0xd4, 0xe4, 0xd3, 0xe4, 0xcd, 0xe4, 0xb4, 0xe4, 0xaf, 0xe4, 0xab, 0xe4, 0xa5, 0xe4, 0xa3, 0xe4, 0x6f, 0xe4, 0x2e, 0xe3, 0xe5, 0xe3, 0xd0, 0xe3, 0xc2, 0xe3, 0xbe, 0xe3, 0xb5, 0xe3, 0xa3, 0xe3, 0x69, 0xe3, 0x58, 0xe3, 0x4b, 0xe3, 0x0d, 0xe3, 0x08, 0xe3, 0x04, 0xe2, 0xd6, 0xe1, 0xcb, 0xe1, 0xca, 0x67, 0x42, 0x67, 0x3e, 0x67, 0x3c, 0x67, 0x38, 0x67, 0x34, 0x67, 0x32, 0x67, 0x30, 0x67, 0x24, 0x67, 0x0c, 0x67, 0x07, 0x67, 0x06, 0x66, 0xf8, 0x66, 0xa9, 0x1f, 0xa9, 0x1e, 0xc3, 0x1a, 0xc7, 0x1a, 0xc6, 0x18, 0x43, 0x14, 0x09, 0x10, 0xf0, 0x0f, 0x1b, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x07, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x02, 0xe9, 0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x02, 0xec, 0x00, 0x00, 0x02, 0xee, 0x00, 0x00, 0x02, 0xac, 0x00, 0x00, 0x02, 0xf3, 0x00, 0x00, 0x02, 0xf3, 0x00, 0x00, 0x02, 0xaf, 0x00, 0x00, 0x02, 0xf7, 0x00, 0x00, 0x02, 0xf7, 0x00, 0x00, 0x02, 0xb0, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x4f, 0x00, 0x00, 0x02, 0xb1, 0x00, 0x00, 0x03, 0x51, 0x00, 0x00, 0x03, 0x53, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x03, 0x57, 0x00, 0x00, 0x03, 0x58, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x03, 0x5a, 0x00, 0x00, 0x03, 0x5a, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x03, 0x5c, 0x00, 0x00, 0x03, 0x62, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x03, 0x70, 0x00, 0x00, 0x03, 0x77, 0x00, 0x00, 0x03, 0x0e, 0x00, 0x00, 0x03, 0x7a, 0x00, 0x00, 0x03, 0x7e, 0x00, 0x00, 0x03, 0x16, 0x00, 0x00, 0x03, 0x84, 0x00, 0x00, 0x03, 0x8a, 0x00, 0x00, 0x03, 0x1b, 0x00, 0x00, 0x03, 0x8c, 0x00, 0x00, 0x03, 0x8c, 0x00, 0x00, 0x03, 0x22, 0x00, 0x00, 0x03, 0x8e, 0x00, 0x00, 0x03, 0xa1, 0x00, 0x00, 0x03, 0x23, 0x00, 0x00, 0x03, 0xa3, 0x00, 0x00, 0x05, 0x25, 0x00, 0x00, 0x03, 0x37, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x1d, 0x14, 0x00, 0x00, 0x04, 0xba, 0x00, 0x00, 0x1d, 0x16, 0x00, 0x00, 0x1d, 0x23, 0x00, 0x00, 0x04, 0xcf, 0x00, 0x00, 0x1d, 0x26, 0x00, 0x00, 0x1d, 0x2e, 0x00, 0x00, 0x04, 0xdd, 0x00, 0x00, 0x1d, 0x30, 0x00, 0x00, 0x1d, 0x5b, 0x00, 0x00, 0x04, 0xe6, 0x00, 0x00, 0x1d, 0x5d, 0x00, 0x00, 0x1d, 0x6a, 0x00, 0x00, 0x05, 0x12, 0x00, 0x00, 0x1d, 0x77, 0x00, 0x00, 0x1d, 0x78, 0x00, 0x00, 0x05, 0x20, 0x00, 0x00, 0x1d, 0x7b, 0x00, 0x00, 0x1d, 0x7b, 0x00, 0x00, 0x05, 0x22, 0x00, 0x00, 0x1d, 0x7d, 0x00, 0x00, 0x1d, 0x7d, 0x00, 0x00, 0x05, 0x23, 0x00, 0x00, 0x1d, 0x85, 0x00, 0x00, 0x1d, 0x85, 0x00, 0x00, 0x05, 0x24, 0x00, 0x00, 0x1d, 0x9b, 0x00, 0x00, 0x1d, 0xbf, 0x00, 0x00, 0x05, 0x25, 0x00, 0x00, 0x1d, 0xc4, 0x00, 0x00, 0x1d, 0xc9, 0x00, 0x00, 0x05, 0x4a, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x1e, 0xfb, 0x00, 0x00, 0x05, 0x50, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x1f, 0x15, 0x00, 0x00, 0x06, 0x4c, 0x00, 0x00, 0x1f, 0x18, 0x00, 0x00, 0x1f, 0x1d, 0x00, 0x00, 0x06, 0x62, 0x00, 0x00, 0x1f, 0x20, 0x00, 0x00, 0x1f, 0x45, 0x00, 0x00, 0x06, 0x68, 0x00, 0x00, 0x1f, 0x48, 0x00, 0x00, 0x1f, 0x4d, 0x00, 0x00, 0x06, 0x8e, 0x00, 0x00, 0x1f, 0x50, 0x00, 0x00, 0x1f, 0x57, 0x00, 0x00, 0x06, 0x94, 0x00, 0x00, 0x1f, 0x59, 0x00, 0x00, 0x1f, 0x59, 0x00, 0x00, 0x06, 0x9c, 0x00, 0x00, 0x1f, 0x5b, 0x00, 0x00, 0x1f, 0x5b, 0x00, 0x00, 0x06, 0x9d, 0x00, 0x00, 0x1f, 0x5d, 0x00, 0x00, 0x1f, 0x5d, 0x00, 0x00, 0x06, 0x9e, 0x00, 0x00, 0x1f, 0x5f, 0x00, 0x00, 0x1f, 0x7d, 0x00, 0x00, 0x06, 0x9f, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x00, 0x1f, 0xb4, 0x00, 0x00, 0x06, 0xbe, 0x00, 0x00, 0x1f, 0xb6, 0x00, 0x00, 0x1f, 0xc4, 0x00, 0x00, 0x06, 0xf3, 0x00, 0x00, 0x1f, 0xc6, 0x00, 0x00, 0x1f, 0xd3, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x1f, 0xd6, 0x00, 0x00, 0x1f, 0xdb, 0x00, 0x00, 0x07, 0x10, 0x00, 0x00, 0x1f, 0xdd, 0x00, 0x00, 0x1f, 0xef, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x1f, 0xf2, 0x00, 0x00, 0x1f, 0xf4, 0x00, 0x00, 0x07, 0x29, 0x00, 0x00, 0x1f, 0xf6, 0x00, 0x00, 0x1f, 0xfe, 0x00, 0x00, 0x07, 0x2c, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x64, 0x00, 0x00, 0x07, 0x35, 0x00, 0x00, 0x20, 0x6a, 0x00, 0x00, 0x20, 0x71, 0x00, 0x00, 0x07, 0x9a, 0x00, 0x00, 0x20, 0x74, 0x00, 0x00, 0x20, 0x8e, 0x00, 0x00, 0x07, 0xa2, 0x00, 0x00, 0x20, 0x90, 0x00, 0x00, 0x20, 0x9c, 0x00, 0x00, 0x07, 0xbd, 0x00, 0x00, 0x20, 0xa0, 0x00, 0x00, 0x20, 0xb5, 0x00, 0x00, 0x07, 0xca, 0x00, 0x00, 0x20, 0xb8, 0x00, 0x00, 0x20, 0xba, 0x00, 0x00, 0x07, 0xe0, 0x00, 0x00, 0x20, 0xd0, 0x00, 0x00, 0x20, 0xd1, 0x00, 0x00, 0x07, 0xe3, 0x00, 0x00, 0x20, 0xd6, 0x00, 0x00, 0x20, 0xd7, 0x00, 0x00, 0x07, 0xe5, 0x00, 0x00, 0x20, 0xdb, 0x00, 0x00, 0x20, 0xdc, 0x00, 0x00, 0x07, 0xe7, 0x00, 0x00, 0x20, 0xe1, 0x00, 0x00, 0x20, 0xe1, 0x00, 0x00, 0x07, 0xe9, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x21, 0x09, 0x00, 0x00, 0x07, 0xea, 0x00, 0x00, 0x21, 0x0b, 0x00, 0x00, 0x21, 0x49, 0x00, 0x00, 0x07, 0xf4, 0x00, 0x00, 0x21, 0x4b, 0x00, 0x00, 0x21, 0x4b, 0x00, 0x00, 0x08, 0x33, 0x00, 0x00, 0x21, 0x4e, 0x00, 0x00, 0x21, 0x4e, 0x00, 0x00, 0x08, 0x34, 0x00, 0x00, 0x21, 0x50, 0x00, 0x00, 0x21, 0x85, 0x00, 0x00, 0x08, 0x35, 0x00, 0x00, 0x21, 0x89, 0x00, 0x00, 0x21, 0x89, 0x00, 0x00, 0x08, 0x6b, 0x00, 0x00, 0x21, 0x90, 0x00, 0x00, 0x23, 0x11, 0x00, 0x00, 0x08, 0x6c, 0x00, 0x00, 0x23, 0x18, 0x00, 0x00, 0x23, 0x19, 0x00, 0x00, 0x09, 0xee, 0x00, 0x00, 0x23, 0x1c, 0x00, 0x00, 0x23, 0x21, 0x00, 0x00, 0x09, 0xf0, 0x00, 0x00, 0x23, 0x24, 0x00, 0x00, 0x23, 0x28, 0x00, 0x00, 0x09, 0xf6, 0x00, 0x00, 0x23, 0x2b, 0x00, 0x00, 0x23, 0x2c, 0x00, 0x00, 0x09, 0xfb, 0x00, 0x00, 0x23, 0x73, 0x00, 0x00, 0x23, 0x75, 0x00, 0x00, 0x09, 0xfd, 0x00, 0x00, 0x23, 0x7a, 0x00, 0x00, 0x23, 0x7a, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x23, 0x7d, 0x00, 0x00, 0x23, 0x7d, 0x00, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x23, 0x87, 0x00, 0x00, 0x23, 0x87, 0x00, 0x00, 0x0a, 0x02, 0x00, 0x00, 0x23, 0x94, 0x00, 0x00, 0x23, 0x94, 0x00, 0x00, 0x0a, 0x03, 0x00, 0x00, 0x23, 0x9b, 0x00, 0x00, 0x23, 0xae, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x23, 0xce, 0x00, 0x00, 0x23, 0xcf, 0x00, 0x00, 0x0a, 0x18, 0x00, 0x00, 0x23, 0xe3, 0x00, 0x00, 0x23, 0xe3, 0x00, 0x00, 0x0a, 0x1a, 0x00, 0x00, 0x23, 0xe5, 0x00, 0x00, 0x23, 0xe5, 0x00, 0x00, 0x0a, 0x1b, 0x00, 0x00, 0x23, 0xe8, 0x00, 0x00, 0x23, 0xe8, 0x00, 0x00, 0x0a, 0x1c, 0x00, 0x00, 0x24, 0x22, 0x00, 0x00, 0x24, 0x23, 0x00, 0x00, 0x0a, 0x1d, 0x00, 0x00, 0x24, 0x60, 0x00, 0x00, 0x24, 0x69, 0x00, 0x00, 0x0a, 0x1f, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x26, 0x9c, 0x00, 0x00, 0x0a, 0x29, 0x00, 0x00, 0x26, 0xa0, 0x00, 0x00, 0x26, 0xb8, 0x00, 0x00, 0x0b, 0xc6, 0x00, 0x00, 0x26, 0xc0, 0x00, 0x00, 0x26, 0xc3, 0x00, 0x00, 0x0b, 0xdf, 0x00, 0x00, 0x26, 0xe2, 0x00, 0x00, 0x26, 0xe2, 0x00, 0x00, 0x0b, 0xe3, 0x00, 0x00, 0x27, 0x01, 0x00, 0x00, 0x27, 0x04, 0x00, 0x00, 0x0b, 0xe4, 0x00, 0x00, 0x27, 0x06, 0x00, 0x00, 0x27, 0x09, 0x00, 0x00, 0x0b, 0xe8, 0x00, 0x00, 0x27, 0x0c, 0x00, 0x00, 0x27, 0x27, 0x00, 0x00, 0x0b, 0xec, 0x00, 0x00, 0x27, 0x29, 0x00, 0x00, 0x27, 0x4b, 0x00, 0x00, 0x0c, 0x08, 0x00, 0x00, 0x27, 0x4d, 0x00, 0x00, 0x27, 0x4d, 0x00, 0x00, 0x0c, 0x2b, 0x00, 0x00, 0x27, 0x4f, 0x00, 0x00, 0x27, 0x52, 0x00, 0x00, 0x0c, 0x2c, 0x00, 0x00, 0x27, 0x56, 0x00, 0x00, 0x27, 0x56, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x27, 0x58, 0x00, 0x00, 0x27, 0x5e, 0x00, 0x00, 0x0c, 0x31, 0x00, 0x00, 0x27, 0x61, 0x00, 0x00, 0x27, 0x94, 0x00, 0x00, 0x0c, 0x38, 0x00, 0x00, 0x27, 0x98, 0x00, 0x00, 0x27, 0xaf, 0x00, 0x00, 0x0c, 0x6c, 0x00, 0x00, 0x27, 0xb1, 0x00, 0x00, 0x27, 0xbe, 0x00, 0x00, 0x0c, 0x84, 0x00, 0x00, 0x27, 0xc5, 0x00, 0x00, 0x27, 0xc6, 0x00, 0x00, 0x0c, 0x92, 0x00, 0x00, 0x27, 0xe0, 0x00, 0x00, 0x27, 0xe0, 0x00, 0x00, 0x0c, 0x94, 0x00, 0x00, 0x27, 0xe6, 0x00, 0x00, 0x27, 0xeb, 0x00, 0x00, 0x0c, 0x95, 0x00, 0x00, 0x27, 0xf0, 0x00, 0x00, 0x28, 0xff, 0x00, 0x00, 0x0c, 0x9b, 0x00, 0x00, 0x29, 0x06, 0x00, 0x00, 0x29, 0x07, 0x00, 0x00, 0x0d, 0xab, 0x00, 0x00, 0x29, 0x0a, 0x00, 0x00, 0x29, 0x0b, 0x00, 0x00, 0x0d, 0xad, 0x00, 0x00, 0x29, 0x40, 0x00, 0x00, 0x29, 0x41, 0x00, 0x00, 0x0d, 0xaf, 0x00, 0x00, 0x29, 0x83, 0x00, 0x00, 0x29, 0x84, 0x00, 0x00, 0x0d, 0xb1, 0x00, 0x00, 0x29, 0xce, 0x00, 0x00, 0x29, 0xd5, 0x00, 0x00, 0x0d, 0xb3, 0x00, 0x00, 0x29, 0xeb, 0x00, 0x00, 0x29, 0xeb, 0x00, 0x00, 0x0d, 0xbb, 0x00, 0x00, 0x29, 0xfa, 0x00, 0x00, 0x29, 0xfb, 0x00, 0x00, 0x0d, 0xbc, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x02, 0x00, 0x00, 0x0d, 0xbe, 0x00, 0x00, 0x2a, 0x0c, 0x00, 0x00, 0x2a, 0x1c, 0x00, 0x00, 0x0d, 0xc1, 0x00, 0x00, 0x2a, 0x2f, 0x00, 0x00, 0x2a, 0x2f, 0x00, 0x00, 0x0d, 0xd2, 0x00, 0x00, 0x2a, 0x6a, 0x00, 0x00, 0x2a, 0x6b, 0x00, 0x00, 0x0d, 0xd3, 0x00, 0x00, 0x2a, 0x7d, 0x00, 0x00, 0x2a, 0xa0, 0x00, 0x00, 0x0d, 0xd5, 0x00, 0x00, 0x2a, 0xae, 0x00, 0x00, 0x2a, 0xba, 0x00, 0x00, 0x0d, 0xf9, 0x00, 0x00, 0x2a, 0xf9, 0x00, 0x00, 0x2a, 0xfa, 0x00, 0x00, 0x0e, 0x06, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2b, 0x1a, 0x00, 0x00, 0x0e, 0x08, 0x00, 0x00, 0x2b, 0x1f, 0x00, 0x00, 0x2b, 0x24, 0x00, 0x00, 0x0e, 0x23, 0x00, 0x00, 0x2b, 0x53, 0x00, 0x00, 0x2b, 0x54, 0x00, 0x00, 0x0e, 0x29, 0x00, 0x00, 0x2c, 0x60, 0x00, 0x00, 0x2c, 0x77, 0x00, 0x00, 0x0e, 0x2b, 0x00, 0x00, 0x2c, 0x79, 0x00, 0x00, 0x2c, 0x7f, 0x00, 0x00, 0x0e, 0x43, 0x00, 0x00, 0xa7, 0x08, 0x00, 0x00, 0xa7, 0x16, 0x00, 0x00, 0x0e, 0x4a, 0x00, 0x00, 0xa7, 0x1b, 0x00, 0x00, 0xa7, 0x1f, 0x00, 0x00, 0x0e, 0x59, 0x00, 0x00, 0xa7, 0x22, 0x00, 0x00, 0xa7, 0x2b, 0x00, 0x00, 0x0e, 0x5e, 0x00, 0x00, 0xa7, 0x30, 0x00, 0x00, 0xa7, 0x41, 0x00, 0x00, 0x0e, 0x68, 0x00, 0x00, 0xa7, 0x46, 0x00, 0x00, 0xa7, 0x4b, 0x00, 0x00, 0x0e, 0x7a, 0x00, 0x00, 0xa7, 0x4e, 0x00, 0x00, 0xa7, 0x53, 0x00, 0x00, 0x0e, 0x80, 0x00, 0x00, 0xa7, 0x56, 0x00, 0x00, 0xa7, 0x57, 0x00, 0x00, 0x0e, 0x86, 0x00, 0x00, 0xa7, 0x64, 0x00, 0x00, 0xa7, 0x67, 0x00, 0x00, 0x0e, 0x88, 0x00, 0x00, 0xa7, 0x80, 0x00, 0x00, 0xa7, 0x83, 0x00, 0x00, 0x0e, 0x8c, 0x00, 0x00, 0xa7, 0x89, 0x00, 0x00, 0xa7, 0x8e, 0x00, 0x00, 0x0e, 0x90, 0x00, 0x00, 0xa7, 0x90, 0x00, 0x00, 0xa7, 0x91, 0x00, 0x00, 0x0e, 0x96, 0x00, 0x00, 0xa7, 0xa0, 0x00, 0x00, 0xa7, 0xaa, 0x00, 0x00, 0x0e, 0x98, 0x00, 0x00, 0xa7, 0xfa, 0x00, 0x00, 0xa7, 0xff, 0x00, 0x00, 0x0e, 0xa3, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0xef, 0x19, 0x00, 0x00, 0x0e, 0xa9, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x0e, 0xc3, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x26, 0x00, 0x00, 0x0e, 0xc7, 0x00, 0x00, 0xf4, 0x28, 0x00, 0x00, 0xf4, 0x41, 0x00, 0x00, 0x0e, 0xee, 0x00, 0x00, 0xf6, 0xc5, 0x00, 0x00, 0xf6, 0xc5, 0x00, 0x00, 0x0f, 0x08, 0x00, 0x00, 0xfb, 0x00, 0x00, 0x00, 0xfb, 0x06, 0x00, 0x00, 0x0f, 0x09, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xfe, 0x23, 0x00, 0x00, 0x0f, 0x10, 0x00, 0x00, 0xff, 0xf9, 0x00, 0x00, 0xff, 0xfd, 0x00, 0x00, 0x0f, 0x14, 0x00, 0x01, 0x03, 0x00, 0x00, 0x01, 0x03, 0x1e, 0x00, 0x00, 0x0f, 0x19, 0x00, 0x01, 0x03, 0x20, 0x00, 0x01, 0x03, 0x23, 0x00, 0x00, 0x0f, 0x38, 0x00, 0x01, 0xd3, 0x00, 0x00, 0x01, 0xd3, 0x56, 0x00, 0x00, 0x0f, 0x3c, 0x00, 0x01, 0xd5, 0x38, 0x00, 0x01, 0xd5, 0x39, 0x00, 0x00, 0x0f, 0x93, 0x00, 0x01, 0xd5, 0x3b, 0x00, 0x01, 0xd5, 0x3e, 0x00, 0x00, 0x0f, 0x95, 0x00, 0x01, 0xd5, 0x40, 0x00, 0x01, 0xd5, 0x44, 0x00, 0x00, 0x0f, 0x99, 0x00, 0x01, 0xd5, 0x46, 0x00, 0x01, 0xd5, 0x46, 0x00, 0x00, 0x0f, 0x9e, 0x00, 0x01, 0xd5, 0x4a, 0x00, 0x01, 0xd5, 0x50, 0x00, 0x00, 0x0f, 0x9f, 0x00, 0x01, 0xd5, 0x52, 0x00, 0x01, 0xd5, 0x6b, 0x00, 0x00, 0x0f, 0xa6, 0x00, 0x01, 0xd5, 0xa0, 0x00, 0x01, 0xd5, 0xd3, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x01, 0xd7, 0xd8, 0x00, 0x01, 0xd7, 0xeb, 0x00, 0x00, 0x0f, 0xf4, 0x00, 0x01, 0xf0, 0x30, 0x00, 0x01, 0xf0, 0x93, 0x00, 0x00, 0x10, 0x08, 0x00, 0x01, 0xf0, 0xa0, 0x00, 0x01, 0xf0, 0xae, 0x00, 0x00, 0x10, 0x6c, 0x00, 0x01, 0xf0, 0xb1, 0x00, 0x01, 0xf0, 0xbe, 0x00, 0x00, 0x10, 0x7b, 0x00, 0x01, 0xf0, 0xc1, 0x00, 0x01, 0xf0, 0xcf, 0x00, 0x00, 0x10, 0x89, 0x00, 0x01, 0xf0, 0xd1, 0x00, 0x01, 0xf0, 0xdf, 0x00, 0x00, 0x10, 0x98, 0x00, 0x01, 0xf4, 0x2d, 0x00, 0x01, 0xf4, 0x2e, 0x00, 0x00, 0x10, 0xa7, 0x00, 0x01, 0xf4, 0x31, 0x00, 0x01, 0xf4, 0x31, 0x00, 0x00, 0x10, 0xa9, 0x00, 0x01, 0xf4, 0x35, 0x00, 0x01, 0xf4, 0x35, 0x00, 0x00, 0x10, 0xaa, 0x00, 0x01, 0xf6, 0x00, 0x00, 0x01, 0xf6, 0x23, 0x00, 0x00, 0x10, 0xab, 0x00, 0x01, 0xf6, 0x25, 0x00, 0x01, 0xf6, 0x2b, 0x00, 0x00, 0x10, 0xcf, 0x00, 0x01, 0xf6, 0x2d, 0x00, 0x01, 0xf6, 0x40, 0x00, 0x00, 0x10, 0xd6, 0x00, 0x06, 0x02, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x00, 0x00, 0x86, 0x00, 0x87, 0x00, 0x89, 0x00, 0x8b, 0x00, 0x93, 0x00, 0x98, 0x00, 0x9e, 0x00, 0xa3, 0x00, 0xa2, 0x00, 0xa4, 0x00, 0xa6, 0x00, 0xa5, 0x00, 0xa7, 0x00, 0xa9, 0x00, 0xab, 0x00, 0xaa, 0x00, 0xac, 0x00, 0xad, 0x00, 0xaf, 0x00, 0xae, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb3, 0x00, 0xb5, 0x00, 0xb4, 0x00, 0xb6, 0x00, 0xb8, 0x00, 0xb7, 0x00, 0xbc, 0x00, 0xbb, 0x00, 0xbd, 0x00, 0xbe, 0x07, 0x55, 0x00, 0x72, 0x00, 0x64, 0x00, 0x65, 0x00, 0x69, 0x07, 0x57, 0x00, 0x78, 0x00, 0xa1, 0x00, 0x70, 0x00, 0x6b, 0x08, 0x0b, 0x00, 0x76, 0x00, 0x6a, 0x09, 0x3c, 0x00, 0x88, 0x00, 0x9a, 0x08, 0xfa, 0x00, 0x73, 0x09, 0x40, 0x09, 0x41, 0x00, 0x67, 0x00, 0x77, 0x08, 0xde, 0x08, 0xed, 0x08, 0xeb, 0x03, 0x54, 0x09, 0x07, 0x00, 0x6c, 0x00, 0x7c, 0x03, 0x3d, 0x00, 0xa8, 0x00, 0xba, 0x00, 0x81, 0x00, 0x63, 0x00, 0x6e, 0x08, 0xf6, 0x01, 0x54, 0x09, 0x24, 0x08, 0xe2, 0x00, 0x6d, 0x00, 0x7d, 0x07, 0x5b, 0x00, 0x62, 0x00, 0x82, 0x00, 0x85, 0x00, 0x97, 0x01, 0x14, 0x01, 0x15, 0x07, 0x48, 0x07, 0x49, 0x07, 0x51, 0x07, 0x52, 0x07, 0x4d, 0x07, 0x4e, 0x00, 0xb9, 0x0a, 0xf3, 0x00, 0xc1, 0x01, 0x3a, 0x07, 0x79, 0x07, 0xd6, 0x07, 0x6e, 0x07, 0x6f, 0x0f, 0x0a, 0x0f, 0x0b, 0x07, 0x56, 0x00, 0x79, 0x07, 0x4f, 0x07, 0x53, 0x07, 0x65, 0x00, 0x84, 0x00, 0x8c, 0x00, 0x83, 0x00, 0x8d, 0x00, 0x8a, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x91, 0x00, 0x8e, 0x00, 0x95, 0x00, 0x96, 0x00, 0x00, 0x00, 0x94, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9b, 0x00, 0xf3, 0x02, 0x88, 0x02, 0x9e, 0x00, 0x71, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x00, 0x7a, 0x02, 0x9f, 0x02, 0x9d, 0x02, 0x89, 0x00, 0x00, 0x01, 0x35, 0x00, 0xb8, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xc1, 0x00, 0xaa, 0x00, 0x9c, 0x01, 0xa6, 0x00, 0xb8, 0x00, 0x66, 0x00, 0x00, 0x00, 0x71, 0x00, 0xcb, 0x00, 0xa0, 0x02, 0xb2, 0x00, 0x85, 0x00, 0x75, 0x00, 0xb8, 0x00, 0xc3, 0x01, 0xcb, 0x01, 0x89, 0x02, 0x2d, 0x00, 0xcb, 0x00, 0xa6, 0x00, 0xf0, 0x00, 0xd3, 0x00, 0xaa, 0x00, 0x87, 0x00, 0xcb, 0x03, 0xaa, 0x04, 0x00, 0x01, 0x4a, 0x00, 0x33, 0x00, 0xcb, 0x00, 0x00, 0x00, 0xd9, 0x05, 0x02, 0x00, 0xf4, 0x01, 0x54, 0x00, 0xb4, 0x00, 0x9c, 0x01, 0x39, 0x01, 0x14, 0x01, 0x39, 0x07, 0x06, 0x04, 0x00, 0x04, 0x4e, 0x04, 0xb4, 0x04, 0x52, 0x04, 0xb8, 0x04, 0xe7, 0x04, 0xcd, 0x00, 0x37, 0x04, 0x73, 0x04, 0xcd, 0x04, 0x60, 0x04, 0x73, 0x01, 0x33, 0x03, 0xa2, 0x05, 0x56, 0x05, 0xa6, 0x05, 0x56, 0x05, 0x39, 0x03, 0xc5, 0x02, 0x12, 0x00, 0xc9, 0x00, 0x1f, 0x00, 0xb8, 0x01, 0xdf, 0x00, 0x73, 0x00, 0xba, 0x03, 0xe9, 0x03, 0x33, 0x03, 0xbc, 0x04, 0x44, 0x04, 0x0e, 0x00, 0xdf, 0x03, 0xcd, 0x03, 0xaa, 0x00, 0xe5, 0x03, 0xaa, 0x04, 0x04, 0x00, 0x00, 0x00, 0xcb, 0x00, 0x8f, 0x00, 0xa4, 0x00, 0x7b, 0x00, 0xb8, 0x00, 0x14, 0x01, 0x6f, 0x00, 0x7f, 0x02, 0x7b, 0x02, 0x52, 0x00, 0x8f, 0x00, 0xc7, 0x05, 0xcd, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x6f, 0x00, 0xcb, 0x00, 0xcd, 0x01, 0x9e, 0x01, 0xd3, 0x00, 0xf0, 0x00, 0xba, 0x01, 0x83, 0x00, 0xd5, 0x00, 0x98, 0x03, 0x04, 0x02, 0x48, 0x00, 0x9e, 0x01, 0xd5, 0x00, 0xc1, 0x00, 0xcb, 0x00, 0xf6, 0x00, 0x83, 0x03, 0x54, 0x02, 0x7f, 0x00, 0x00, 0x03, 0x33, 0x02, 0x66, 0x00, 0xd3, 0x00, 0xc7, 0x00, 0xa4, 0x00, 0xcd, 0x00, 0x8f, 0x00, 0x9a, 0x00, 0x73, 0x04, 0x00, 0x05, 0xd5, 0x01, 0x0a, 0x00, 0xfe, 0x02, 0x2b, 0x00, 0xa4, 0x00, 0xb4, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x62, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x1d, 0x03, 0x2d, 0x05, 0xd5, 0x05, 0xd5, 0x05, 0xd5, 0x05, 0xf0, 0x00, 0x7f, 0x00, 0x7b, 0x00, 0x54, 0x00, 0xa4, 0x06, 0xb8, 0x06, 0x14, 0x07, 0x23, 0x01, 0xd3, 0x00, 0xb8, 0x00, 0xcb, 0x00, 0xa6, 0x01, 0xc3, 0x01, 0xec, 0x06, 0x93, 0x00, 0xa0, 0x00, 0xd3, 0x03, 0x5c, 0x03, 0x71, 0x03, 0xdb, 0x01, 0x85, 0x04, 0x23, 0x04, 0xa8, 0x04, 0x48, 0x00, 0x8f, 0x01, 0x39, 0x01, 0x14, 0x01, 0x39, 0x03, 0x60, 0x00, 0x8f, 0x05, 0xd5, 0x01, 0x9a, 0x06, 0x14, 0x07, 0x23, 0x06, 0x66, 0x01, 0x79, 0x04, 0x60, 0x04, 0x60, 0x04, 0x60, 0x04, 0x7b, 0x00, 0x9c, 0x00, 0x00, 0x02, 0x77, 0x04, 0x60, 0x01, 0xaa, 0x00, 0xe9, 0x04, 0x60, 0x07, 0x62, 0x00, 0x7b, 0x00, 0xc5, 0x00, 0x7f, 0x02, 0x7b, 0x00, 0x00, 0x00, 0xb4, 0x02, 0x52, 0x05, 0xcd, 0x00, 0x66, 0x00, 0xbc, 0x00, 0x66, 0x00, 0x77, 0x06, 0x10, 0x00, 0xcd, 0x01, 0x3b, 0x01, 0x85, 0x03, 0x89, 0x00, 0x8f, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x1d, 0x00, 0xcd, 0x07, 0x4a, 0x04, 0x2f, 0x00, 0x9c, 0x00, 0x9c, 0x00, 0x00, 0x07, 0x7d, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x6f, 0x03, 0x35, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x7b, 0x00, 0xae, 0x00, 0xb2, 0x00, 0x2d, 0x03, 0x96, 0x00, 0x8f, 0x02, 0x7b, 0x00, 0xf6, 0x00, 0x83, 0x03, 0x54, 0x06, 0x37, 0x05, 0xf6, 0x00, 0x8f, 0x00, 0x9c, 0x04, 0xe1, 0x02, 0x66, 0x00, 0x8f, 0x01, 0x8d, 0x02, 0xf6, 0x00, 0xcd, 0x03, 0x44, 0x00, 0x29, 0x00, 0x66, 0x04, 0xee, 0x00, 0x73, 0x00, 0x00, 0x14, 0x00, 0x00, 0x96, 0x00, 0x00, 0xb7, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x2c, 0x20, 0x10, 0xb0, 0x02, 0x25, 0x49, 0x64, 0xb0, 0x40, 0x51, 0x58, 0x20, 0xc8, 0x59, 0x21, 0x2d, 0x2c, 0xb0, 0x02, 0x25, 0x49, 0x64, 0xb0, 0x40, 0x51, 0x58, 0x20, 0xc8, 0x59, 0x21, 0x2d, 0x2c, 0x20, 0x10, 0x07, 0x20, 0xb0, 0x00, 0x50, 0xb0, 0x0d, 0x79, 0x20, 0xb8, 0xff, 0xff, 0x50, 0x58, 0x04, 0x1b, 0x05, 0x59, 0xb0, 0x05, 0x1c, 0xb0, 0x03, 0x25, 0x08, 0xb0, 0x04, 0x25, 0x23, 0xe1, 0x20, 0xb0, 0x00, 0x50, 0xb0, 0x0d, 0x79, 0x20, 0xb8, 0xff, 0xff, 0x50, 0x58, 0x04, 0x1b, 0x05, 0x59, 0xb0, 0x05, 0x1c, 0xb0, 0x03, 0x25, 0x08, 0xe1, 0x2d, 0x2c, 0x4b, 0x50, 0x58, 0x20, 0xb0, 0xfd, 0x45, 0x44, 0x59, 0x21, 0x2d, 0x2c, 0xb0, 0x02, 0x25, 0x45, 0x60, 0x44, 0x2d, 0x2c, 0x4b, 0x53, 0x58, 0xb0, 0x02, 0x25, 0xb0, 0x02, 0x25, 0x45, 0x44, 0x59, 0x21, 0x21, 0x2d, 0x2c, 0x45, 0x44, 0x2d, 0x2c, 0xb0, 0x02, 0x25, 0xb0, 0x02, 0x25, 0x49, 0xb0, 0x05, 0x25, 0xb0, 0x05, 0x25, 0x49, 0x60, 0xb0, 0x20, 0x63, 0x68, 0x20, 0x8a, 0x10, 0x8a, 0x23, 0x3a, 0x8a, 0x10, 0x65, 0x3a, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0xff, 0xff, 0x00, 0x03, 0x00, 0x02, 0x00, 0x5b, 0xfe, 0x96, 0x03, 0xf6, 0x05, 0xa4, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x5c, 0x03, 0x99, 0xfc, 0xce, 0x02, 0xcc, 0xfd, 0x34, 0xfe, 0x96, 0x07, 0x0e, 0xf8, 0xf2, 0x72, 0x06, 0x29, 0x00, 0x00, 0x00, 0x02, 0x01, 0x16, 0x00, 0x00, 0x01, 0xcd, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x11, 0x33, 0x11, 0x03, 0x23, 0x03, 0x01, 0x16, 0xb7, 0xb7, 0xb7, 0x12, 0x92, 0x13, 0xfe, 0xfe, 0x05, 0xd5, 0xfd, 0x71, 0xfe, 0x9b, 0x01, 0x65, 0x00, 0x02, 0x00, 0xb1, 0x03, 0xaa, 0x02, 0x9f, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0x4a, 0x99, 0x01, 0xed, 0x98, 0x05, 0xd5, 0xfd, 0xd5, 0x02, 0x2b, 0xfd, 0xd5, 0x02, 0x2b, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x00, 0x05, 0x7c, 0x05, 0xbe, 0x00, 0x03, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x21, 0x03, 0x21, 0x0b, 0x01, 0x21, 0x13, 0x33, 0x03, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x03, 0x23, 0x13, 0x21, 0x03, 0x23, 0x13, 0x21, 0x35, 0x21, 0x13, 0x21, 0x35, 0x21, 0x13, 0x03, 0xae, 0xfe, 0xfa, 0x4b, 0x01, 0x07, 0x3d, 0x5d, 0x01, 0x06, 0x5f, 0x90, 0x5d, 0x01, 0x19, 0xfe, 0xc4, 0x4a, 0x01, 0x1f, 0xfe, 0xbe, 0x5d, 0x90, 0x5c, 0xfe, 0xf9, 0x5d, 0x91, 0x5e, 0xfe, 0xe4, 0x01, 0x3d, 0x4c, 0xfe, 0xde, 0x01, 0x45, 0x5c, 0x03, 0x85, 0xfe, 0xb2, 0x03, 0x87, 0xfe, 0x61, 0x01, 0x9f, 0xfe, 0x61, 0x9a, 0xfe, 0xb2, 0x99, 0xfe, 0x62, 0x01, 0x9e, 0xfe, 0x62, 0x01, 0x9e, 0x99, 0x01, 0x4e, 0x9a, 0x01, 0x9f, 0x00, 0x00, 0x03, 0x00, 0x99, 0xfe, 0xd3, 0x03, 0xfc, 0x06, 0x14, 0x00, 0x21, 0x00, 0x28, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x23, 0x03, 0x2e, 0x01, 0x27, 0x35, 0x1e, 0x01, 0x17, 0x11, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x35, 0x33, 0x15, 0x1e, 0x01, 0x17, 0x15, 0x2e, 0x01, 0x27, 0x11, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x03, 0x11, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x11, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x02, 0x6f, 0x5a, 0x01, 0x5f, 0xbd, 0x5f, 0x5c, 0xbc, 0x64, 0xc7, 0xb5, 0xc4, 0xb8, 0x5a, 0x53, 0x9d, 0x4b, 0x4b, 0x9d, 0x53, 0xcc, 0xc1, 0xcd, 0xc0, 0x5a, 0x69, 0x6d, 0x65, 0xcb, 0x72, 0x74, 0x6f, 0xfe, 0xd3, 0x01, 0x2d, 0x02, 0x2d, 0x2d, 0xb4, 0x40, 0x41, 0x01, 0x01, 0xc8, 0x24, 0xac, 0x96, 0xa3, 0xbc, 0x0e, 0xeb, 0xe8, 0x04, 0x1f, 0x1b, 0xaf, 0x2a, 0x2e, 0x04, 0xfe, 0x55, 0x23, 0xb4, 0x9c, 0xa9, 0xc3, 0x0f, 0x03, 0x00, 0x01, 0x9a, 0x0d, 0x6a, 0x58, 0x56, 0x60, 0xd5, 0xfe, 0x4f, 0x11, 0x6e, 0x5a, 0x58, 0x68, 0x00, 0x05, 0x00, 0x65, 0xff, 0xe3, 0x06, 0x72, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x27, 0x00, 0x33, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x25, 0x33, 0x01, 0x23, 0x13, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x05, 0x3c, 0x4e, 0x59, 0x59, 0x4e, 0x4d, 0x59, 0x59, 0x4d, 0x8e, 0xa8, 0xa9, 0x8d, 0x90, 0xa7, 0xa8, 0xfc, 0xee, 0x4d, 0x59, 0x58, 0x4e, 0x4f, 0x59, 0x5a, 0x02, 0xdf, 0x90, 0xfc, 0xb7, 0x90, 0x1c, 0x8f, 0xa9, 0xa9, 0x8f, 0x8f, 0xa6, 0xa7, 0x02, 0x91, 0x94, 0x84, 0x82, 0x95, 0x95, 0x82, 0x83, 0x95, 0x7f, 0xdc, 0xbb, 0xbb, 0xdb, 0xdb, 0xbb, 0xbc, 0xdb, 0x02, 0x61, 0x95, 0x82, 0x84, 0x94, 0x94, 0x84, 0x81, 0x96, 0x7f, 0xf9, 0xf3, 0x06, 0x0d, 0xdb, 0xbb, 0xbd, 0xda, 0xdb, 0xbc, 0xba, 0xdc, 0x00, 0x02, 0x00, 0x74, 0xff, 0xe3, 0x05, 0x65, 0x05, 0xf0, 0x00, 0x09, 0x00, 0x30, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x09, 0x01, 0x3e, 0x01, 0x37, 0x33, 0x06, 0x02, 0x07, 0x13, 0x23, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x01, 0xc0, 0x52, 0x4c, 0xbf, 0x90, 0x55, 0x96, 0x41, 0xfe, 0xa2, 0x01, 0xc9, 0x35, 0x3c, 0x05, 0xa8, 0x0b, 0x5e, 0x53, 0xfb, 0xe3, 0x81, 0x5d, 0xce, 0x76, 0xd8, 0xfe, 0xec, 0x79, 0x78, 0x2b, 0x2d, 0xc8, 0xa5, 0x4b, 0x95, 0x4c, 0x4e, 0x8e, 0x3e, 0x5e, 0x76, 0x35, 0x03, 0x23, 0x51, 0xa1, 0x58, 0x92, 0xc2, 0x3f, 0x40, 0x02, 0x8f, 0xfd, 0xf8, 0x59, 0xcb, 0x72, 0x84, 0xfe, 0xfe, 0x7e, 0xfe, 0xe3, 0x93, 0x59, 0x57, 0x01, 0x13, 0xd7, 0x80, 0xe1, 0x63, 0x3f, 0x7d, 0x3c, 0xa2, 0xc5, 0x24, 0x24, 0xb6, 0x2f, 0x31, 0x6f, 0x58, 0x33, 0x67, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb1, 0x03, 0xaa, 0x01, 0x4b, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x4a, 0x99, 0x05, 0xd5, 0xfd, 0xd5, 0x02, 0x2b, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0x3c, 0x06, 0x12, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x23, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x02, 0x3c, 0x79, 0x75, 0x76, 0x78, 0x90, 0x88, 0x86, 0x86, 0x88, 0x06, 0x12, 0xe6, 0xfe, 0x3e, 0xe7, 0xe7, 0xfe, 0x3b, 0xe5, 0xeb, 0x01, 0xc6, 0xe0, 0xdf, 0x01, 0xc4, 0xec, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x93, 0xfe, 0xf2, 0x02, 0x31, 0x06, 0x12, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x23, 0x36, 0x12, 0x35, 0x34, 0x02, 0x94, 0x90, 0x87, 0x86, 0x86, 0x87, 0x90, 0x77, 0x76, 0x76, 0x06, 0x12, 0xec, 0xfe, 0x3c, 0xdf, 0xe0, 0xfe, 0x3a, 0xeb, 0xe5, 0x01, 0xc5, 0xe7, 0xe7, 0x01, 0xc2, 0x00, 0x00, 0x01, 0x00, 0x36, 0x02, 0x4a, 0x03, 0x63, 0x05, 0xf0, 0x00, 0x11, 0x00, 0x00, 0x01, 0x0d, 0x01, 0x07, 0x25, 0x11, 0x23, 0x11, 0x05, 0x27, 0x2d, 0x01, 0x37, 0x05, 0x11, 0x33, 0x11, 0x25, 0x03, 0x63, 0xfe, 0xbd, 0x01, 0x43, 0x35, 0xfe, 0xd2, 0x66, 0xfe, 0xd1, 0x34, 0x01, 0x43, 0xfe, 0xbd, 0x34, 0x01, 0x2f, 0x66, 0x01, 0x2e, 0x04, 0xdf, 0xc2, 0xc3, 0x62, 0xcb, 0xfe, 0x87, 0x01, 0x79, 0xcb, 0x62, 0xc3, 0xc2, 0x63, 0xcb, 0x01, 0x79, 0xfe, 0x87, 0xcb, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x03, 0x50, 0x01, 0xf5, 0xfe, 0x0b, 0x97, 0xfe, 0x0a, 0x01, 0xf6, 0x05, 0x04, 0xfd, 0xd3, 0xaa, 0xfd, 0xd3, 0x02, 0x2d, 0xaa, 0x02, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, 0xff, 0x12, 0x01, 0x96, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x00, 0x37, 0x33, 0x15, 0x03, 0x23, 0x13, 0xd8, 0xbe, 0x94, 0x74, 0x4a, 0xfe, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xdf, 0x02, 0x40, 0x02, 0x83, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x5a, 0x01, 0xe5, 0xfe, 0x1b, 0x02, 0x83, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc5, 0x00, 0x00, 0x01, 0x83, 0x00, 0xfe, 0x00, 0x03, 0x00, 0x00, 0x37, 0x33, 0x15, 0x23, 0xc5, 0xbe, 0xbe, 0xfe, 0xfe, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x42, 0x02, 0x6d, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x01, 0xd4, 0x99, 0xfe, 0x2c, 0x99, 0x05, 0xd5, 0xf9, 0x6d, 0x00, 0x02, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x1b, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x27, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x02, 0x4a, 0x8c, 0x8e, 0x8e, 0x8c, 0x8d, 0x8d, 0x8d, 0x8d, 0xe2, 0xee, 0xee, 0xe2, 0xe2, 0xee, 0xee, 0x05, 0x50, 0xfe, 0xcd, 0xfe, 0xcc, 0xfe, 0xcd, 0xfe, 0xcd, 0x01, 0x33, 0x01, 0x33, 0x01, 0x34, 0x01, 0x33, 0xa0, 0xfe, 0x73, 0xfe, 0x86, 0xfe, 0x87, 0xfe, 0x73, 0x01, 0x8d, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x8d, 0x00, 0x01, 0x00, 0xca, 0x00, 0x00, 0x03, 0xeb, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x00, 0x37, 0x21, 0x11, 0x05, 0x35, 0x25, 0x33, 0x11, 0x21, 0x15, 0x21, 0xe5, 0x01, 0x29, 0xfe, 0xbc, 0x01, 0x42, 0xb6, 0x01, 0x29, 0xfc, 0xfa, 0xaa, 0x04, 0x73, 0x48, 0xb8, 0x48, 0xfa, 0xd5, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x03, 0xdd, 0x05, 0xf0, 0x00, 0x1c, 0x00, 0x00, 0x25, 0x21, 0x15, 0x21, 0x35, 0x36, 0x00, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x02, 0x01, 0x62, 0x02, 0x7a, 0xfc, 0xab, 0x67, 0x01, 0x66, 0x2e, 0x57, 0x45, 0x96, 0x79, 0x55, 0xbe, 0x6c, 0x6e, 0xbf, 0x4f, 0xd1, 0xf8, 0x3e, 0x52, 0x17, 0xf1, 0xaa, 0xaa, 0xaa, 0x77, 0x01, 0x91, 0x3a, 0x6d, 0x97, 0x49, 0x77, 0x96, 0x42, 0x43, 0xcc, 0x31, 0x32, 0xe8, 0xc2, 0x5c, 0xa5, 0x70, 0x1d, 0xfe, 0xeb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8c, 0xff, 0xe3, 0x04, 0x02, 0x05, 0xf0, 0x00, 0x28, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x04, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x02, 0xec, 0x82, 0x93, 0xfe, 0xef, 0xfc, 0x55, 0xb3, 0x60, 0x4c, 0xb4, 0x62, 0xab, 0xb3, 0xa6, 0x95, 0x9c, 0xa3, 0x86, 0x8f, 0x93, 0x89, 0x4b, 0xaa, 0x67, 0x67, 0xb5, 0x50, 0xcf, 0xf2, 0x80, 0x03, 0x25, 0x1f, 0xc4, 0x90, 0xdd, 0xf2, 0x25, 0x25, 0xc3, 0x31, 0x32, 0x96, 0x8f, 0x84, 0x95, 0xa6, 0x77, 0x70, 0x73, 0x7b, 0x24, 0x26, 0xb4, 0x20, 0x20, 0xd1, 0xb2, 0x7c, 0xab, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0x00, 0x04, 0x2e, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x02, 0xb9, 0xfe, 0x35, 0x01, 0xcb, 0x30, 0xe5, 0xbf, 0xbf, 0xb5, 0xfd, 0xa1, 0x05, 0x25, 0xfc, 0xe3, 0x03, 0xcd, 0xfc, 0x33, 0xa8, 0xfe, 0xa0, 0x01, 0x60, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, 0xff, 0xe3, 0x03, 0xf4, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x00, 0x15, 0x14, 0x00, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0xc7, 0x02, 0xca, 0xfd, 0xdc, 0x28, 0x4f, 0x28, 0xe1, 0x01, 0x07, 0xfe, 0xf2, 0xf6, 0x55, 0xaf, 0x5e, 0x51, 0xad, 0x60, 0x9c, 0xb6, 0xb6, 0x9c, 0x49, 0x91, 0x4b, 0x05, 0xd5, 0xaa, 0xfe, 0x92, 0x0f, 0x0f, 0xfe, 0xee, 0xea, 0xf1, 0xfe, 0xf5, 0x20, 0x20, 0xcb, 0x31, 0x30, 0xb6, 0x9c, 0x9c, 0xb6, 0x24, 0x26, 0x00, 0x00, 0x02, 0x00, 0x80, 0xff, 0xe3, 0x04, 0x21, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x13, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x03, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x02, 0x60, 0x7a, 0x8f, 0x8f, 0x7a, 0x7b, 0x8f, 0x8f, 0xee, 0x44, 0x8c, 0x44, 0xb4, 0xbe, 0x0d, 0x35, 0xa0, 0x60, 0xcb, 0xeb, 0xf5, 0xcc, 0xe9, 0xf6, 0x01, 0x2e, 0x00, 0xff, 0x44, 0x8c, 0x03, 0x3b, 0xba, 0xa2, 0xa1, 0xbb, 0xbb, 0xa1, 0xa2, 0xba, 0x02, 0x79, 0xb8, 0x24, 0x26, 0xfe, 0xf2, 0xfe, 0xef, 0x57, 0x5d, 0xfe, 0xef, 0xeb, 0xe6, 0xfe, 0xea, 0x01, 0x8d, 0x01, 0x79, 0x01, 0x62, 0x01, 0xa5, 0x1e, 0x00, 0x01, 0x00, 0x97, 0x00, 0x00, 0x03, 0xf8, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x97, 0x03, 0x60, 0xfe, 0x18, 0xbd, 0x01, 0xca, 0xfd, 0x7b, 0x05, 0xd5, 0x56, 0xfa, 0x81, 0x05, 0x2b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x7d, 0xff, 0xe3, 0x04, 0x17, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x25, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x02, 0x4a, 0x82, 0x94, 0x94, 0x82, 0x82, 0x95, 0x95, 0xfe, 0xc8, 0x75, 0x82, 0xe5, 0xc8, 0xc9, 0xe4, 0x82, 0x74, 0x83, 0x93, 0xef, 0xde, 0xde, 0xef, 0x94, 0x41, 0x82, 0x76, 0x75, 0x84, 0x84, 0x75, 0x76, 0x82, 0x02, 0xc5, 0x9a, 0x87, 0x87, 0x9a, 0x9b, 0x86, 0x87, 0x9a, 0x56, 0x20, 0xb2, 0x80, 0xb3, 0xd0, 0xd0, 0xb3, 0x80, 0xb2, 0x20, 0x22, 0xc6, 0x8f, 0xd9, 0xe8, 0xe8, 0xd9, 0x8f, 0xc6, 0x01, 0x61, 0x74, 0x82, 0x82, 0x74, 0x74, 0x82, 0x82, 0x00, 0x02, 0x00, 0x74, 0xff, 0xe3, 0x04, 0x14, 0x05, 0xf0, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x37, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x13, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x35, 0x34, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x00, 0x23, 0x22, 0x26, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0xca, 0x45, 0x8c, 0x44, 0xb4, 0xbe, 0x0d, 0x34, 0xa0, 0x61, 0xca, 0xeb, 0xf5, 0xcb, 0xe9, 0xf6, 0xfe, 0xd3, 0xff, 0x45, 0x8c, 0x01, 0x1e, 0x7b, 0x8f, 0x8f, 0x7b, 0x7a, 0x8f, 0x8f, 0x1f, 0xb8, 0x24, 0x26, 0x01, 0x0d, 0x01, 0x12, 0x56, 0x5c, 0x01, 0x0f, 0xeb, 0xe6, 0x01, 0x16, 0xfe, 0x73, 0xfe, 0x86, 0xfe, 0x9f, 0xfe, 0x5b, 0x1e, 0x02, 0x97, 0xba, 0xa2, 0xa1, 0xbb, 0xbb, 0xa1, 0xa2, 0xba, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd8, 0x00, 0x00, 0x01, 0x96, 0x04, 0x23, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x37, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0xd8, 0xbe, 0xbe, 0xbe, 0xbe, 0xfe, 0xfe, 0x04, 0x23, 0xfe, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8e, 0xff, 0x12, 0x01, 0x96, 0x04, 0x23, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x03, 0x23, 0x13, 0xd8, 0xbe, 0xbe, 0xbe, 0x94, 0x74, 0x4a, 0x04, 0x23, 0xfe, 0xfd, 0xd9, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x5e, 0x05, 0x46, 0x04, 0xa6, 0x00, 0x06, 0x00, 0x00, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x05, 0x45, 0xfc, 0x5f, 0x03, 0xa1, 0xfb, 0x7e, 0x04, 0x82, 0x03, 0xf0, 0xfe, 0x91, 0xfe, 0x93, 0xb6, 0x01, 0xd1, 0xa6, 0x01, 0xd1, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x03, 0xa2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x5e, 0x05, 0x46, 0x04, 0xa6, 0x00, 0x06, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x9f, 0x03, 0xf0, 0xb6, 0xfe, 0x2f, 0xa6, 0xfe, 0x2f, 0xb6, 0x01, 0x6d, 0x00, 0x00, 0x02, 0x00, 0x84, 0x00, 0x00, 0x03, 0x52, 0x05, 0xf0, 0x00, 0x03, 0x00, 0x24, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x13, 0x23, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x07, 0x0e, 0x01, 0x15, 0x01, 0x60, 0xb7, 0xb7, 0xb1, 0xac, 0x33, 0x51, 0x51, 0x33, 0x2e, 0x76, 0x61, 0x47, 0xa1, 0x58, 0x55, 0xae, 0x5c, 0xa6, 0xc9, 0x41, 0x51, 0x4f, 0x2b, 0x23, 0x07, 0x05, 0x06, 0xfe, 0xfe, 0x01, 0x91, 0x9a, 0x65, 0x82, 0x56, 0x59, 0x35, 0x5e, 0x31, 0x59, 0x6e, 0x46, 0x43, 0xbc, 0x39, 0x38, 0xc2, 0x9f, 0x4c, 0x89, 0x56, 0x56, 0x2f, 0x35, 0x19, 0x15, 0x3c, 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x79, 0xfe, 0x9c, 0x06, 0xb3, 0x05, 0xa2, 0x00, 0x0b, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x11, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x24, 0x23, 0x22, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x04, 0x23, 0x22, 0x24, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x24, 0x33, 0x32, 0x04, 0x17, 0x1e, 0x01, 0x15, 0x10, 0x00, 0x07, 0x02, 0xae, 0x80, 0x6f, 0x6f, 0x7f, 0x82, 0x6e, 0x6d, 0x80, 0x01, 0xea, 0x36, 0x8b, 0x5d, 0x9b, 0xc1, 0xc2, 0x9a, 0x5d, 0x8c, 0x35, 0x81, 0x83, 0x95, 0x39, 0x39, 0x5e, 0xfe, 0xf3, 0x9e, 0x6f, 0xcc, 0x56, 0x8d, 0xa0, 0x68, 0x62, 0x5e, 0xf9, 0x8d, 0x74, 0xe0, 0x5e, 0x51, 0x71, 0xfe, 0xf7, 0x89, 0xa6, 0xfe, 0xd8, 0x73, 0x73, 0x78, 0x7a, 0x71, 0x74, 0x01, 0x31, 0xaa, 0xbe, 0x01, 0x47, 0x6f, 0x43, 0x47, 0xfe, 0xe2, 0xfc, 0x02, 0x19, 0x8f, 0xa3, 0xa4, 0x8e, 0x8c, 0xa5, 0xa4, 0xfe, 0x48, 0x4d, 0x49, 0xf9, 0xc8, 0xc8, 0xfa, 0x4b, 0x4c, 0x83, 0xfd, 0x20, 0x16, 0xdf, 0xb1, 0x6b, 0xbc, 0x50, 0x83, 0x8b, 0x41, 0x40, 0x66, 0xfe, 0xb5, 0xc1, 0x9f, 0xfe, 0xea, 0x6a, 0x68, 0x6d, 0x57, 0x51, 0x6f, 0x61, 0x67, 0x83, 0x7d, 0x7d, 0x01, 0x49, 0xbd, 0xb6, 0x01, 0x4a, 0x7d, 0x7f, 0x87, 0xae, 0xa0, 0x62, 0xe6, 0x7b, 0xfe, 0xf9, 0xfe, 0xd0, 0x06, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x03, 0x21, 0x01, 0x33, 0x01, 0x23, 0x03, 0x21, 0x03, 0x23, 0x02, 0x76, 0xf7, 0x01, 0xef, 0xfe, 0xa1, 0xcf, 0x02, 0x00, 0xbd, 0x7b, 0xfd, 0xa2, 0x7a, 0xc0, 0x05, 0x0e, 0xfd, 0x19, 0x03, 0xae, 0xfa, 0x2b, 0x01, 0x7f, 0xfe, 0x81, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x01, 0x6b, 0x01, 0x23, 0x93, 0x8d, 0x8d, 0x93, 0xfe, 0xdd, 0x01, 0x0d, 0x85, 0x83, 0x83, 0x85, 0xfe, 0x3d, 0x01, 0xd0, 0xd0, 0xe1, 0x73, 0x70, 0x87, 0x94, 0xf5, 0xe2, 0xfe, 0x1e, 0x02, 0xc9, 0xfd, 0xdd, 0x87, 0x8b, 0x8c, 0x85, 0x02, 0x66, 0xfe, 0x3e, 0x6f, 0x72, 0x71, 0x70, 0xa6, 0xc0, 0xb1, 0x89, 0xa2, 0x14, 0x20, 0xcb, 0x98, 0xc8, 0xda, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x00, 0x19, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x04, 0xa3, 0x5c, 0xd0, 0x75, 0xe6, 0xf5, 0xf5, 0xe6, 0x75, 0xd0, 0x5c, 0x5f, 0xd6, 0x76, 0xfe, 0xce, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x32, 0x78, 0xd6, 0x05, 0x62, 0xd5, 0x5f, 0x5e, 0xfe, 0xc7, 0xfe, 0xd8, 0xfe, 0xd9, 0xfe, 0xc7, 0x5e, 0x5f, 0xd3, 0x48, 0x48, 0x01, 0x9f, 0x01, 0x67, 0x01, 0x68, 0x01, 0x9f, 0x47, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x1f, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x11, 0x00, 0x00, 0x01, 0x11, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x25, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x01, 0x6b, 0xdb, 0x01, 0x16, 0x01, 0x03, 0xfe, 0xfd, 0xfe, 0xea, 0xfe, 0x6f, 0x01, 0x75, 0x01, 0x87, 0x01, 0x6d, 0xfe, 0x91, 0xfe, 0x7b, 0xfe, 0x8b, 0x05, 0x2f, 0xfb, 0x77, 0x01, 0x18, 0x01, 0x2e, 0x01, 0x2c, 0x01, 0x17, 0xa6, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0xb5, 0x03, 0x51, 0xfd, 0x65, 0x02, 0x80, 0xfd, 0x80, 0x02, 0xac, 0xfc, 0x9e, 0x05, 0xd5, 0xaa, 0xfe, 0x46, 0xaa, 0xfd, 0xe3, 0xaa, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xba, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0xb5, 0x03, 0x04, 0xfd, 0xb2, 0x02, 0x15, 0xfd, 0xeb, 0xb6, 0x05, 0xd5, 0xaa, 0xfe, 0x48, 0xaa, 0xfd, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x00, 0x25, 0x11, 0x21, 0x35, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x04, 0x49, 0xfe, 0xd7, 0x01, 0xdd, 0x69, 0xfe, 0x90, 0xfe, 0xc5, 0xfe, 0x9d, 0x01, 0x63, 0x01, 0x3b, 0x83, 0xed, 0x64, 0x65, 0xe3, 0x7d, 0xf6, 0xf8, 0xf8, 0xf6, 0x61, 0x97, 0xd5, 0x01, 0x91, 0xa6, 0xfd, 0x7f, 0x53, 0x55, 0x01, 0x99, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x99, 0x48, 0x46, 0xd7, 0x5f, 0x60, 0xfe, 0xce, 0xfe, 0xd1, 0xfe, 0xd2, 0xfe, 0xce, 0x25, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x94, 0xb6, 0xb6, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfa, 0x2b, 0x02, 0xc7, 0xfd, 0x39, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6b, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0xb5, 0xb6, 0xb6, 0x05, 0xd5, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa0, 0xfe, 0x66, 0x01, 0x6b, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0xb5, 0xb6, 0xb9, 0xcc, 0x45, 0x38, 0x79, 0x63, 0x05, 0xd5, 0xfa, 0x93, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x5b, 0xea, 0xfd, 0x65, 0x02, 0xca, 0xef, 0xfd, 0x7b, 0xb6, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x77, 0xfd, 0x48, 0xfc, 0xe3, 0x02, 0xcf, 0xfd, 0x31, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x15, 0x21, 0xb5, 0xb6, 0x02, 0x8e, 0xfc, 0xbc, 0x05, 0xd5, 0xfa, 0xd5, 0xaa, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x21, 0x09, 0x01, 0x21, 0x11, 0x23, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0xb5, 0x01, 0x0f, 0x01, 0x57, 0x01, 0x58, 0x01, 0x0f, 0xb1, 0xfe, 0xa5, 0xb6, 0xfe, 0xa5, 0xb0, 0x05, 0xd5, 0xfc, 0x08, 0x03, 0xf8, 0xfa, 0x2b, 0x05, 0x1f, 0xfc, 0x00, 0x04, 0x00, 0xfa, 0xe1, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x23, 0x01, 0x11, 0x23, 0xb5, 0xf5, 0x02, 0x54, 0xb0, 0xf5, 0xfd, 0xac, 0xb0, 0x05, 0xd5, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0x2b, 0x04, 0xe1, 0xfb, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x27, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x02, 0xd6, 0xc6, 0xe9, 0xe9, 0xc6, 0xc6, 0xe8, 0xe8, 0xc6, 0x01, 0x1b, 0x01, 0x52, 0xfe, 0xae, 0xfe, 0xe5, 0xfe, 0xe5, 0xfe, 0xad, 0x01, 0x53, 0x05, 0x4c, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x48, 0xa4, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0x9f, 0xfe, 0x5b, 0x01, 0xa4, 0x01, 0x62, 0x01, 0x62, 0x01, 0xa5, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x01, 0x6b, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0xfe, 0x66, 0x01, 0x9a, 0xe2, 0xe7, 0xe7, 0xe2, 0xe4, 0xb6, 0x05, 0x2f, 0xfd, 0xcf, 0x92, 0x87, 0x86, 0x92, 0xa6, 0xe3, 0xdb, 0xdd, 0xe2, 0xfd, 0xa8, 0x00, 0x02, 0x00, 0x67, 0xfe, 0xf8, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x1b, 0x01, 0x23, 0x27, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x02, 0x02, 0xd6, 0xc6, 0xe9, 0xe9, 0xc6, 0xc6, 0xe8, 0xe8, 0x39, 0xef, 0xdb, 0xc7, 0x1e, 0x1f, 0x0f, 0xfe, 0xe5, 0xfe, 0xad, 0x01, 0x53, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x52, 0xbc, 0x05, 0x4c, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x48, 0xfa, 0xcf, 0xfe, 0xdd, 0xef, 0x02, 0x02, 0x01, 0xa5, 0x01, 0x61, 0x01, 0x62, 0x01, 0xa5, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0xfc, 0xfe, 0x8e, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x17, 0x13, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x32, 0x3b, 0x6e, 0x38, 0xb9, 0xc4, 0xac, 0x42, 0x7d, 0x6c, 0xc6, 0xb6, 0x01, 0x9a, 0xe7, 0xe2, 0x75, 0xfd, 0xc8, 0xe4, 0x84, 0x86, 0x86, 0x84, 0x02, 0xbc, 0x16, 0x90, 0x7e, 0xfe, 0x68, 0x01, 0x7f, 0x96, 0x62, 0xfd, 0x89, 0x05, 0xd5, 0xd6, 0xd8, 0x8d, 0xba, 0x02, 0x4f, 0xfd, 0xee, 0x87, 0x83, 0x83, 0x85, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x05, 0xf0, 0x00, 0x27, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x04, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0xda, 0x67, 0xb8, 0x55, 0x95, 0xa1, 0x6b, 0x96, 0x6d, 0xcc, 0xc1, 0xfe, 0xfb, 0xfd, 0x60, 0xd7, 0x73, 0x6f, 0xd4, 0x67, 0x9b, 0xaa, 0x7a, 0x8b, 0x6e, 0xcc, 0xb5, 0xfb, 0xdc, 0x5f, 0xc4, 0x05, 0xa4, 0xc5, 0x37, 0x36, 0x80, 0x76, 0x63, 0x65, 0x1f, 0x19, 0x2b, 0xd9, 0xb6, 0xd9, 0xe0, 0x30, 0x2f, 0xd0, 0x45, 0x46, 0x88, 0x7e, 0x6e, 0x7c, 0x1f, 0x18, 0x2d, 0xc0, 0xab, 0xc6, 0xe4, 0x26, 0x00, 0x00, 0x01, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x03, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x05, 0x04, 0x70, 0xfe, 0x23, 0xb6, 0xfe, 0x23, 0x05, 0xd5, 0xaa, 0xfa, 0xd5, 0x05, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x00, 0x23, 0x22, 0x00, 0x11, 0xa0, 0xb7, 0x9d, 0xaf, 0xaf, 0x9c, 0xb7, 0xfe, 0xfc, 0xfe, 0xff, 0xfe, 0xfc, 0x05, 0xd5, 0xfc, 0x75, 0xf0, 0xd3, 0xd3, 0xf0, 0x03, 0x8b, 0xfc, 0x5c, 0xfe, 0xdc, 0xfe, 0xd6, 0x01, 0x2a, 0x01, 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x21, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x02, 0x0f, 0xfd, 0xff, 0xbe, 0x01, 0xaa, 0x01, 0xab, 0xbd, 0xfe, 0x00, 0x05, 0xd5, 0xfb, 0x17, 0x04, 0xe9, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0x09, 0x01, 0x23, 0x3d, 0xb8, 0x01, 0x1a, 0x01, 0x1a, 0xcc, 0x01, 0x1b, 0x01, 0x1a, 0xb8, 0xfe, 0xaf, 0xe5, 0xfe, 0xe5, 0xfe, 0xe1, 0xe4, 0x05, 0xd5, 0xfb, 0x12, 0x04, 0xee, 0xfb, 0x12, 0x04, 0xee, 0xfa, 0x2b, 0x05, 0x10, 0xfa, 0xf0, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x74, 0xc3, 0x01, 0x4e, 0x01, 0x50, 0xc3, 0xfe, 0x50, 0x01, 0xcd, 0xc3, 0xfe, 0x86, 0xfe, 0x83, 0xc4, 0x01, 0xe0, 0x05, 0xd5, 0xfd, 0xd5, 0x02, 0x2b, 0xfd, 0x33, 0xfc, 0xf8, 0x02, 0x7b, 0xfd, 0x85, 0x03, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x00, 0x03, 0x33, 0x09, 0x01, 0x33, 0x01, 0x11, 0x23, 0x11, 0x04, 0xc4, 0x01, 0x74, 0x01, 0x72, 0xc4, 0xfe, 0x24, 0xb6, 0x05, 0xd5, 0xfd, 0x9a, 0x02, 0x66, 0xfc, 0xf2, 0xfd, 0x39, 0x02, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x68, 0x04, 0x1f, 0xfc, 0xaf, 0x03, 0x66, 0xfb, 0xb7, 0x03, 0x51, 0xfc, 0xc4, 0x05, 0xd5, 0x9a, 0xfb, 0x6f, 0xaa, 0x9a, 0x04, 0x91, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0x1c, 0x06, 0x14, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x9e, 0x01, 0x7e, 0xd8, 0xd8, 0xfe, 0x82, 0x06, 0x14, 0x8f, 0xf9, 0xfc, 0x8f, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0x42, 0x02, 0x6d, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x13, 0x01, 0x23, 0x01, 0x99, 0x01, 0xd4, 0x99, 0xfe, 0x2c, 0x05, 0xd5, 0xf9, 0x6d, 0x06, 0x93, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb3, 0xfe, 0xf2, 0x02, 0x31, 0x06, 0x14, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x02, 0x31, 0xfe, 0x82, 0xd7, 0xd7, 0x06, 0x14, 0xf8, 0xde, 0x8f, 0x06, 0x04, 0x8f, 0x00, 0x01, 0x00, 0xc3, 0x03, 0xa8, 0x05, 0x46, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x03, 0x5c, 0x01, 0xe9, 0xb5, 0xfe, 0x74, 0xfe, 0x74, 0xb5, 0x01, 0xe9, 0x05, 0xd5, 0xfd, 0xd3, 0x01, 0x8b, 0xfe, 0x75, 0x02, 0x2d, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x1d, 0x03, 0xac, 0xfe, 0xac, 0x00, 0x03, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x03, 0xac, 0xfc, 0x42, 0xfe, 0xac, 0x8f, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0x04, 0xf0, 0x02, 0x49, 0x06, 0x66, 0x00, 0x03, 0x00, 0x00, 0x01, 0x13, 0x23, 0x01, 0x01, 0x4a, 0xfe, 0x8a, 0xfe, 0xdb, 0x06, 0x66, 0xfe, 0x8a, 0x01, 0x76, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x25, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x37, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x02, 0x78, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0xa6, 0xa6, 0x38, 0xa9, 0x7b, 0x9b, 0xb6, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xdb, 0xd8, 0x02, 0x33, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x4c, 0xfd, 0x81, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0xfc, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x33, 0x03, 0x81, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0xfd, 0xcd, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xa7, 0xa7, 0x02, 0x2f, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x02, 0x52, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x64, 0xa8, 0x06, 0x14, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x19, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x03, 0x83, 0x46, 0x8d, 0x48, 0xa2, 0xb2, 0xb2, 0xa2, 0x48, 0x8d, 0x46, 0x45, 0x95, 0x53, 0xe4, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x4d, 0x92, 0x04, 0x35, 0xac, 0x2b, 0x2b, 0xe3, 0xcd, 0xcd, 0xe3, 0x2b, 0x2b, 0xaa, 0x24, 0x24, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x3a, 0x23, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xeb, 0x06, 0x14, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x45, 0xa6, 0xa6, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0xfe, 0x00, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x03, 0xb6, 0x02, 0x5e, 0xf9, 0xec, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0xfe, 0x15, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x15, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x12, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x04, 0x0c, 0xfd, 0x06, 0x0b, 0xb9, 0xa4, 0x60, 0xb3, 0x58, 0x59, 0xbb, 0x60, 0xf2, 0xfe, 0xe7, 0x01, 0x0b, 0xe3, 0xcb, 0xed, 0xa6, 0x02, 0x94, 0x7a, 0x8b, 0xa7, 0x0c, 0x02, 0x5e, 0x5a, 0xbe, 0xc7, 0x34, 0x34, 0xae, 0x2a, 0x2c, 0x01, 0x38, 0x01, 0x0a, 0x01, 0x13, 0x01, 0x43, 0xfe, 0xdd, 0xc4, 0x97, 0xb4, 0xae, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x02, 0xac, 0x06, 0x14, 0x00, 0x13, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x02, 0xac, 0x9e, 0x5a, 0x45, 0x01, 0x11, 0xfe, 0xef, 0xa6, 0x9f, 0x9f, 0x9c, 0xaa, 0x06, 0x14, 0x99, 0x50, 0x68, 0x63, 0x8f, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0xab, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x28, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x17, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x03, 0x45, 0x95, 0x86, 0x85, 0x94, 0x94, 0x85, 0x86, 0x95, 0xa6, 0xe5, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0x33, 0xa0, 0x70, 0xba, 0xe2, 0xe2, 0xba, 0x70, 0xa0, 0x33, 0xa6, 0x02, 0x3d, 0xc8, 0xdc, 0xdc, 0xc8, 0xc7, 0xdc, 0xdc, 0xeb, 0xfe, 0xe2, 0xfe, 0xe9, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0xbd, 0xbf, 0x5b, 0x63, 0x62, 0x01, 0x3a, 0x01, 0x03, 0x01, 0x04, 0x01, 0x3a, 0x62, 0x63, 0xaa, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x14, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xf4, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x06, 0x14, 0xfd, 0x9e, 0x65, 0x64, 0xef, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x11, 0x33, 0x15, 0x23, 0xae, 0xa5, 0xa5, 0xa5, 0xa5, 0x04, 0x60, 0xfb, 0xa0, 0x06, 0x14, 0xe9, 0x00, 0x02, 0xff, 0xde, 0xfe, 0x56, 0x01, 0x54, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x15, 0x23, 0xae, 0xa5, 0x92, 0xa3, 0x3f, 0x2c, 0x5e, 0x45, 0xa5, 0xa5, 0x04, 0x60, 0xfb, 0x8c, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x06, 0x28, 0xe9, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x26, 0x06, 0x14, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0xa7, 0xa7, 0x01, 0xee, 0xd4, 0xfd, 0xe9, 0x02, 0x2d, 0xd8, 0xfe, 0x00, 0xa7, 0x06, 0x14, 0xfc, 0x69, 0x01, 0xe3, 0xfd, 0xf4, 0xfd, 0xac, 0x02, 0x23, 0xfd, 0xdd, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0xae, 0xa5, 0xa5, 0x06, 0x14, 0xf9, 0xec, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x67, 0x04, 0x7b, 0x00, 0x22, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xbe, 0x3f, 0xac, 0x75, 0x9e, 0xab, 0xa7, 0x66, 0x6a, 0x80, 0x96, 0xa6, 0x67, 0x6b, 0x7f, 0x95, 0xa7, 0xa7, 0x39, 0x9e, 0x6d, 0x6e, 0x9a, 0x03, 0x89, 0x7c, 0x76, 0xf5, 0xe2, 0xfd, 0x5c, 0x02, 0x9e, 0xa1, 0x9c, 0xbe, 0xa4, 0xfd, 0x87, 0x02, 0x9e, 0xa2, 0x9b, 0xbf, 0xa3, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x67, 0x62, 0x7c, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x04, 0x7b, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xf4, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x65, 0x64, 0xef, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x02, 0x34, 0x85, 0x9b, 0x9a, 0x86, 0x85, 0x9a, 0x9a, 0x85, 0xd8, 0xf7, 0xf7, 0xd8, 0xd9, 0xf5, 0xf5, 0x03, 0xdf, 0xe7, 0xc9, 0xc9, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0x9c, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x01, 0x39, 0x01, 0x13, 0x01, 0x14, 0x01, 0x38, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x4e, 0xa7, 0xa7, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x01, 0xff, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0xa8, 0xfd, 0xae, 0x06, 0x0a, 0xaa, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x01, 0xeb, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x11, 0x23, 0x01, 0x11, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x02, 0x34, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xa6, 0xa6, 0x02, 0x2f, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0xfd, 0xae, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0x64, 0xaa, 0xf9, 0xf6, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x02, 0xf6, 0x04, 0x7b, 0x00, 0x11, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x02, 0xf6, 0x1c, 0x42, 0x27, 0x8d, 0x96, 0xa7, 0xa7, 0x34, 0xa8, 0x77, 0x11, 0x2a, 0x19, 0x03, 0xb4, 0x12, 0x11, 0xcb, 0xbe, 0xfd, 0xb2, 0x04, 0x60, 0xae, 0x66, 0x63, 0x05, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x04, 0x7b, 0x00, 0x27, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0x30, 0x46, 0x97, 0x51, 0x7b, 0x7c, 0x59, 0x85, 0x38, 0xb1, 0x94, 0xde, 0xc2, 0x51, 0xb0, 0x61, 0x5c, 0xb2, 0x57, 0x75, 0x7e, 0x5b, 0x9a, 0x39, 0x9a, 0x89, 0xca, 0xb9, 0x5c, 0xa2, 0x04, 0x3f, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0e, 0x2a, 0x99, 0x89, 0x9c, 0xb6, 0x23, 0x23, 0xbe, 0x35, 0x35, 0x59, 0x51, 0x4b, 0x50, 0x25, 0x0f, 0x24, 0x95, 0x82, 0x9e, 0xac, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x02, 0xa7, 0x05, 0x9e, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x52, 0x01, 0x55, 0xfe, 0xab, 0x43, 0x67, 0xab, 0xab, 0xbf, 0x92, 0x79, 0x79, 0x05, 0x9e, 0xfe, 0xc2, 0x8f, 0xfd, 0xa0, 0x89, 0x4e, 0x9a, 0x9f, 0xd2, 0x02, 0x60, 0x8f, 0x01, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x04, 0x7b, 0x00, 0x13, 0x00, 0x14, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x01, 0x9d, 0xa5, 0x70, 0x6f, 0x87, 0x9b, 0xa6, 0xa6, 0x3c, 0x9f, 0x6a, 0xad, 0xb4, 0x01, 0xa0, 0x01, 0xba, 0x02, 0xa6, 0xfd, 0x61, 0x9f, 0x9f, 0xbe, 0xa4, 0x02, 0x7b, 0xfb, 0xa0, 0xac, 0x66, 0x63, 0xf0, 0x03, 0xa8, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x06, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0x37, 0xaf, 0x01, 0x3b, 0x01, 0x3b, 0xb0, 0xfe, 0x86, 0xe1, 0x04, 0x60, 0xfc, 0x54, 0x03, 0xac, 0xfb, 0xa0, 0x00, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x04, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x1b, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x4d, 0xa6, 0xcf, 0xce, 0xc3, 0xcf, 0xce, 0xa6, 0xfe, 0xf8, 0xc3, 0xd9, 0xda, 0xc3, 0x04, 0x60, 0xfc, 0x96, 0x03, 0x6a, 0xfc, 0x96, 0x03, 0x6a, 0xfb, 0xa0, 0x03, 0x96, 0xfc, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x02, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x03, 0xf4, 0xfe, 0x93, 0x01, 0x7f, 0xc3, 0xfe, 0xdb, 0xfe, 0xda, 0xc3, 0x01, 0x88, 0xfe, 0x99, 0xc4, 0x01, 0x0b, 0x01, 0x0b, 0x04, 0x60, 0xfd, 0xdf, 0xfd, 0xc1, 0x01, 0xb8, 0xfe, 0x48, 0x02, 0x4a, 0x02, 0x16, 0xfe, 0x71, 0x01, 0x8f, 0x00, 0x01, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x05, 0x0e, 0x01, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3f, 0x01, 0x01, 0x33, 0x09, 0x01, 0x33, 0x02, 0x51, 0x46, 0x85, 0x70, 0x84, 0x61, 0x44, 0x4c, 0x2e, 0x1e, 0xfe, 0x68, 0xaf, 0x01, 0x3b, 0x01, 0x3b, 0xb0, 0x68, 0xc8, 0x7a, 0x9a, 0x48, 0x86, 0x54, 0x04, 0x4e, 0xfc, 0x94, 0x03, 0x6c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x04, 0x60, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x66, 0x03, 0x12, 0xfd, 0x92, 0x02, 0x6e, 0xfc, 0xd7, 0x02, 0x6f, 0xfd, 0xa8, 0x04, 0x60, 0xa8, 0xfc, 0xdb, 0x93, 0xa8, 0x03, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe6, 0xfe, 0xb2, 0x03, 0xaf, 0x06, 0x14, 0x00, 0x24, 0x00, 0x00, 0x05, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x1d, 0x01, 0x14, 0x16, 0x33, 0x03, 0xae, 0x38, 0xe0, 0x98, 0x61, 0x80, 0x37, 0x37, 0x81, 0x60, 0x98, 0xe0, 0x38, 0x3d, 0x7f, 0x4d, 0x52, 0x63, 0x64, 0x51, 0x4d, 0x7f, 0xbe, 0x90, 0x94, 0xdd, 0xef, 0x97, 0x74, 0x8f, 0x73, 0x95, 0xf0, 0xdd, 0x93, 0x8f, 0x58, 0x8d, 0xf8, 0x9d, 0x8e, 0x19, 0x1b, 0x8e, 0x9c, 0xf8, 0x8d, 0x58, 0x00, 0x01, 0x00, 0xea, 0xfe, 0x1d, 0x01, 0x83, 0x06, 0x1d, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x83, 0x99, 0x06, 0x1d, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe6, 0xfe, 0xb2, 0x03, 0xaf, 0x06, 0x14, 0x00, 0x24, 0x00, 0x00, 0x17, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x3d, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x14, 0x06, 0x2b, 0x01, 0xe6, 0x3f, 0x7e, 0x4d, 0x51, 0x64, 0x64, 0x51, 0x4d, 0x7e, 0x3f, 0x39, 0xe0, 0x97, 0x61, 0x7f, 0x38, 0x38, 0x7f, 0x61, 0x97, 0xe0, 0x39, 0xbe, 0x56, 0x8f, 0xf8, 0x9c, 0x8e, 0x1b, 0x19, 0x8e, 0x9d, 0xf8, 0x8e, 0x57, 0x8f, 0x93, 0xdd, 0xf0, 0x95, 0x73, 0x8f, 0x74, 0x97, 0xef, 0xdd, 0x94, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x01, 0xd3, 0x05, 0x46, 0x03, 0x31, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x0a, 0x05, 0x06, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x08, 0x05, 0x07, 0x0d, 0x8b, 0x55, 0x4d, 0x98, 0x03, 0x31, 0xb2, 0x4f, 0x44, 0x3b, 0x04, 0x02, 0x03, 0x05, 0x3e, 0x4d, 0x53, 0xb2, 0x4f, 0x45, 0x3c, 0x04, 0x02, 0x03, 0x05, 0x3e, 0x4c, 0x00, 0x02, 0x01, 0x16, 0x00, 0x00, 0x01, 0xcd, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x01, 0x23, 0x35, 0x33, 0x11, 0x23, 0x11, 0x13, 0x33, 0x13, 0x01, 0xcd, 0xb7, 0xb7, 0xb7, 0x13, 0x92, 0x12, 0x04, 0xd7, 0xfe, 0xfa, 0x2b, 0x02, 0x8f, 0x01, 0x65, 0xfe, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9a, 0xfe, 0xc7, 0x03, 0xba, 0x05, 0x98, 0x00, 0x06, 0x00, 0x21, 0x00, 0x00, 0x25, 0x11, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x01, 0x15, 0x2e, 0x01, 0x27, 0x03, 0x3e, 0x01, 0x37, 0x15, 0x0e, 0x01, 0x07, 0x11, 0x23, 0x11, 0x26, 0x02, 0x11, 0x10, 0x12, 0x37, 0x11, 0x33, 0x13, 0x1e, 0x01, 0x02, 0x62, 0x84, 0x94, 0x94, 0x01, 0xdb, 0x43, 0x7a, 0x3d, 0x01, 0x3f, 0x7b, 0x41, 0x3a, 0x7c, 0x45, 0x5c, 0xd9, 0xee, 0xee, 0xd9, 0x5c, 0x01, 0x42, 0x7b, 0x83, 0x03, 0x58, 0x12, 0xe2, 0xb8, 0xb9, 0xe2, 0x03, 0xa1, 0xac, 0x29, 0x2a, 0x03, 0xfc, 0xa0, 0x05, 0x2a, 0x27, 0xaa, 0x1e, 0x23, 0x07, 0xfe, 0xe4, 0x01, 0x20, 0x14, 0x01, 0x33, 0x01, 0x01, 0x01, 0x02, 0x01, 0x32, 0x16, 0x01, 0x1f, 0xfe, 0xe1, 0x04, 0x21, 0x00, 0x00, 0x01, 0x00, 0x74, 0x00, 0x00, 0x03, 0xf2, 0x05, 0xf0, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x10, 0x36, 0x33, 0x32, 0x16, 0x03, 0xe0, 0x45, 0x7a, 0x37, 0x85, 0x69, 0x01, 0x60, 0xfe, 0xa0, 0x01, 0xf6, 0xfc, 0x82, 0xd4, 0xb3, 0xb3, 0xc1, 0xd1, 0x37, 0x88, 0x05, 0xb4, 0xb6, 0x29, 0x29, 0x9b, 0xd4, 0xd7, 0x8f, 0xfe, 0x2f, 0xaa, 0xaa, 0x01, 0xd1, 0x8f, 0xee, 0x01, 0x05, 0xf3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x54, 0x00, 0x52, 0x04, 0x43, 0x04, 0xb2, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x37, 0x17, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x07, 0x27, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x27, 0x37, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x22, 0xba, 0x67, 0xba, 0x22, 0x20, 0x22, 0x24, 0xbc, 0x67, 0xba, 0x35, 0x68, 0x37, 0x34, 0x6c, 0x37, 0xbb, 0x65, 0xba, 0x21, 0x22, 0x22, 0x23, 0xbb, 0x68, 0xba, 0x32, 0x68, 0x3a, 0x36, 0x69, 0x53, 0x8c, 0x66, 0x65, 0x8e, 0x8d, 0x66, 0x65, 0x8d, 0x03, 0xe1, 0xd1, 0x73, 0xce, 0x3b, 0x77, 0x3e, 0x3f, 0x73, 0x39, 0xcf, 0x71, 0xcf, 0x28, 0x26, 0x25, 0x25, 0xcf, 0x73, 0xce, 0x3e, 0x76, 0x3a, 0x40, 0x74, 0x38, 0xce, 0x73, 0xcf, 0x27, 0x25, 0x24, 0xfe, 0x7c, 0x70, 0x9a, 0x9a, 0x70, 0x72, 0x9c, 0x9d, 0x00, 0x01, 0x00, 0x49, 0x00, 0x00, 0x04, 0x4a, 0x05, 0xd5, 0x00, 0x18, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x35, 0x27, 0x21, 0x35, 0x33, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x33, 0x15, 0x21, 0x07, 0x15, 0x21, 0x04, 0x18, 0xfe, 0x8d, 0xb5, 0xfe, 0x8a, 0x01, 0x76, 0x4c, 0xfe, 0xd6, 0xed, 0xfe, 0xe3, 0xab, 0x01, 0x55, 0x01, 0x53, 0xac, 0xfe, 0xe2, 0xed, 0xfe, 0xd7, 0x4c, 0x01, 0x75, 0x01, 0xc7, 0xfe, 0x39, 0x01, 0xc7, 0x7b, 0x33, 0x9b, 0x7b, 0x02, 0x4a, 0xfd, 0x44, 0x02, 0xbc, 0xfd, 0xb6, 0x7b, 0x9b, 0x33, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xea, 0xfe, 0xa2, 0x01, 0x83, 0x05, 0x98, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x13, 0x11, 0x23, 0x11, 0x01, 0x83, 0x99, 0x99, 0x99, 0x01, 0x98, 0xfd, 0x0a, 0x02, 0xf6, 0x04, 0x00, 0xfd, 0x0a, 0x02, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x52, 0xff, 0x3d, 0x03, 0x45, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x13, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x55, 0x39, 0x37, 0x7d, 0xe1, 0x38, 0x38, 0x81, 0xb8, 0x4b, 0x80, 0x33, 0x57, 0x61, 0xb9, 0x18, 0x0c, 0xbe, 0x76, 0x53, 0x54, 0x38, 0x34, 0xb8, 0x9c, 0x41, 0x8b, 0x4f, 0x4e, 0x85, 0x34, 0x5c, 0x66, 0xc7, 0x16, 0xc1, 0x73, 0x53, 0x52, 0x35, 0x35, 0xb4, 0x96, 0x41, 0x8a, 0x03, 0xa8, 0x2e, 0x5a, 0x2e, 0x4c, 0x85, 0x87, 0x2d, 0x5b, 0x2e, 0x4b, 0x88, 0x02, 0x93, 0xa4, 0x27, 0x27, 0x50, 0x47, 0x5a, 0x73, 0x0f, 0x08, 0x77, 0x9a, 0x65, 0x5a, 0x8c, 0x35, 0x34, 0x6d, 0x40, 0x8e, 0xa8, 0x1d, 0x1d, 0xa4, 0x27, 0x27, 0x54, 0x4c, 0x66, 0x7b, 0x0e, 0x78, 0x99, 0x66, 0x5b, 0x8f, 0x31, 0x2c, 0x70, 0x45, 0x82, 0x9f, 0x1d, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc1, 0x05, 0x46, 0x02, 0xd9, 0x06, 0x10, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x02, 0x21, 0xb7, 0xb7, 0xfe, 0xa1, 0xb6, 0xb6, 0x06, 0x10, 0xca, 0xca, 0xca, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xfe, 0x00, 0x00, 0x06, 0x35, 0x05, 0xcd, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x49, 0x00, 0x00, 0x01, 0x32, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x3e, 0x01, 0x17, 0x22, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0x9a, 0x88, 0xed, 0x62, 0x62, 0x61, 0x61, 0x62, 0x62, 0xed, 0x88, 0x89, 0xed, 0x62, 0x62, 0x61, 0x61, 0x62, 0x62, 0xed, 0x89, 0x76, 0xcc, 0x54, 0x55, 0x56, 0x56, 0x55, 0x54, 0xcc, 0x76, 0x76, 0xcd, 0x54, 0x54, 0x54, 0x55, 0x53, 0x54, 0xcd, 0x97, 0x3c, 0x75, 0x3b, 0x86, 0x97, 0x9a, 0x8c, 0x3a, 0x6d, 0x3c, 0x3d, 0x7b, 0x3f, 0xc2, 0xe2, 0xe2, 0xc2, 0x42, 0x7a, 0x05, 0xcd, 0x6e, 0x6d, 0x6d, 0xfe, 0xfa, 0x9a, 0x98, 0xfe, 0xfb, 0x6d, 0x6d, 0x6e, 0x6e, 0x6d, 0x6d, 0x01, 0x05, 0x98, 0x9a, 0x01, 0x06, 0x6d, 0x6d, 0x6e, 0x67, 0x5e, 0x5e, 0x5e, 0xe5, 0x82, 0x81, 0xe3, 0x5e, 0x5e, 0x5f, 0x5f, 0x5e, 0x5d, 0xe2, 0x83, 0x85, 0xe3, 0x5d, 0x5e, 0x5e, 0xf5, 0x81, 0x21, 0x20, 0xaf, 0x9d, 0x9f, 0xae, 0x1f, 0x22, 0x7f, 0x1d, 0x1c, 0xf4, 0xd0, 0xd1, 0xf2, 0x1c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0x01, 0xd5, 0x02, 0xe9, 0x05, 0xf0, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x29, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x07, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x7d, 0x02, 0x6b, 0xfd, 0x95, 0x02, 0x69, 0x86, 0x27, 0x82, 0x53, 0x74, 0x88, 0xab, 0xaa, 0xa3, 0x69, 0x69, 0x38, 0x7a, 0x3e, 0x42, 0x83, 0x3e, 0xa4, 0xa1, 0xf8, 0x91, 0x71, 0x58, 0x4a, 0x5d, 0x75, 0x02, 0x50, 0x7b, 0x02, 0xb8, 0xfe, 0x40, 0x70, 0x3f, 0x44, 0x87, 0x71, 0x87, 0x8a, 0x04, 0x5b, 0x5b, 0x22, 0x22, 0x7f, 0x1c, 0x1c, 0xb0, 0xf0, 0x43, 0x4f, 0x40, 0x4d, 0x90, 0x72, 0x1d, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x8d, 0x03, 0xbb, 0x04, 0x23, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x15, 0x09, 0x01, 0x15, 0x01, 0x35, 0x13, 0x15, 0x09, 0x01, 0x15, 0x01, 0x35, 0x03, 0xbb, 0xfe, 0xf1, 0x01, 0x0f, 0xfe, 0x5a, 0x1f, 0xfe, 0xf1, 0x01, 0x0f, 0xfe, 0x5a, 0x04, 0x23, 0xbf, 0xfe, 0xf4, 0xfe, 0xf4, 0xbf, 0x01, 0xa2, 0x52, 0x01, 0xa2, 0xbf, 0xfe, 0xf4, 0xfe, 0xf4, 0xbf, 0x01, 0xa2, 0x52, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x01, 0x1f, 0x05, 0x46, 0x03, 0x5e, 0x00, 0x05, 0x00, 0x00, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, 0xc3, 0x04, 0x82, 0x97, 0xfc, 0x15, 0x03, 0x5e, 0xfd, 0xc1, 0x01, 0x95, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xdf, 0x02, 0x40, 0x02, 0x83, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x5a, 0x01, 0xe5, 0xfe, 0x1b, 0x02, 0x83, 0xa4, 0x00, 0x00, 0x00, 0x04, 0x00, 0xfe, 0x00, 0x00, 0x06, 0x35, 0x05, 0xcd, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x38, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x22, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x27, 0x32, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x3e, 0x01, 0x13, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x1f, 0x01, 0x23, 0x27, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x03, 0x9a, 0x76, 0xcc, 0x54, 0x55, 0x56, 0x56, 0x55, 0x54, 0xcc, 0x76, 0x76, 0xcd, 0x54, 0x54, 0x54, 0x55, 0x53, 0x54, 0xcd, 0x76, 0x88, 0xed, 0x62, 0x62, 0x61, 0x61, 0x62, 0x62, 0xed, 0x88, 0x89, 0xed, 0x62, 0x62, 0x61, 0x61, 0x62, 0x62, 0xed, 0x70, 0x6e, 0x6e, 0x63, 0x4f, 0x50, 0x5b, 0x9e, 0x9d, 0x5f, 0x56, 0x15, 0x3d, 0x29, 0x7b, 0x9a, 0x75, 0x35, 0x41, 0x31, 0x3b, 0x8c, 0x05, 0x66, 0x5e, 0x5e, 0x5e, 0xe5, 0x82, 0x81, 0xe3, 0x5e, 0x5e, 0x5f, 0x5f, 0x5e, 0x5d, 0xe2, 0x83, 0x85, 0xe3, 0x5d, 0x5e, 0x5e, 0x67, 0x6e, 0x6d, 0x6d, 0xfe, 0xfa, 0x9a, 0x98, 0xfe, 0xfb, 0x6d, 0x6d, 0x6e, 0x6e, 0x6d, 0x6d, 0x01, 0x05, 0x98, 0x9a, 0x01, 0x06, 0x6d, 0x6d, 0x6e, 0xfe, 0x62, 0xfe, 0xec, 0x3e, 0x4b, 0x4c, 0x3f, 0x67, 0x77, 0x79, 0x56, 0x70, 0x11, 0x08, 0x4d, 0x49, 0xdf, 0xd1, 0x60, 0x33, 0xfe, 0x9c, 0x03, 0x44, 0x00, 0x01, 0x00, 0xbf, 0x05, 0x62, 0x02, 0xda, 0x05, 0xf6, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0xc0, 0x02, 0x1a, 0xfd, 0xe6, 0x05, 0xf6, 0x94, 0x00, 0x00, 0x00, 0x02, 0x00, 0xaf, 0x03, 0x75, 0x02, 0xeb, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0xcd, 0x48, 0x63, 0x63, 0x48, 0x48, 0x63, 0x64, 0x47, 0x39, 0x6b, 0x26, 0x2a, 0x29, 0xa6, 0x79, 0x79, 0xa2, 0xa5, 0x05, 0x6f, 0x6f, 0x50, 0x4f, 0x6d, 0x6d, 0x4f, 0x4f, 0x70, 0x81, 0x31, 0x2e, 0x2d, 0x72, 0x42, 0x84, 0xb7, 0xb4, 0x87, 0x86, 0xba, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0x04, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, 0x21, 0x15, 0x21, 0x03, 0x50, 0x01, 0xf5, 0xfe, 0x0b, 0x97, 0xfe, 0x0a, 0x01, 0xf6, 0xfe, 0x0a, 0x04, 0x82, 0xfb, 0x7e, 0x05, 0x04, 0xfe, 0x7d, 0xaa, 0xfe, 0x7d, 0x01, 0x83, 0xaa, 0x01, 0x83, 0xfb, 0xa6, 0xaa, 0x00, 0x01, 0x00, 0x54, 0x02, 0x9c, 0x02, 0x6f, 0x05, 0xf0, 0x00, 0x18, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x35, 0x36, 0x37, 0x00, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x01, 0x06, 0xf1, 0x01, 0x7e, 0xfd, 0xe6, 0x1e, 0x39, 0x01, 0x36, 0x5e, 0x4d, 0x2e, 0x6e, 0x41, 0x45, 0x78, 0x33, 0x83, 0x9c, 0xfe, 0xd7, 0x33, 0x03, 0x0e, 0x72, 0x6e, 0x1f, 0x38, 0x01, 0x31, 0x5e, 0x42, 0x51, 0x23, 0x23, 0x7b, 0x1c, 0x1c, 0x84, 0x6c, 0x8b, 0xfe, 0xe4, 0x30, 0x00, 0x00, 0x01, 0x00, 0x58, 0x02, 0x8d, 0x02, 0x86, 0x05, 0xf0, 0x00, 0x28, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0xd8, 0x52, 0x5b, 0xab, 0x9f, 0x33, 0x71, 0x3f, 0x2f, 0x6b, 0x3c, 0x62, 0x6c, 0x63, 0x62, 0x4d, 0x55, 0x54, 0x57, 0x5a, 0x55, 0x24, 0x5c, 0x49, 0x42, 0x73, 0x32, 0x81, 0x98, 0x51, 0x04, 0x60, 0x12, 0x6d, 0x52, 0x7c, 0x86, 0x15, 0x14, 0x79, 0x1b, 0x1a, 0x4f, 0x46, 0x4a, 0x4c, 0x6c, 0x3f, 0x3c, 0x3a, 0x3d, 0x12, 0x17, 0x73, 0x11, 0x12, 0x76, 0x63, 0x45, 0x60, 0x00, 0x01, 0x01, 0x4d, 0x04, 0xee, 0x02, 0xfd, 0x06, 0x66, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x02, 0x4a, 0xb3, 0xfe, 0xdb, 0x8a, 0x06, 0x66, 0xfe, 0x88, 0x00, 0x01, 0x00, 0x9c, 0xfe, 0x56, 0x04, 0x68, 0x04, 0x60, 0x00, 0x20, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x11, 0x9d, 0xa5, 0x7c, 0x7a, 0x85, 0x86, 0xa6, 0x1f, 0x22, 0x08, 0x1c, 0x1a, 0x25, 0x42, 0x1f, 0x3e, 0x4a, 0x0e, 0x2d, 0x82, 0x59, 0x5b, 0x81, 0x26, 0xfe, 0x56, 0x06, 0x0a, 0xfd, 0x48, 0x91, 0x94, 0xa8, 0xa8, 0x02, 0x8d, 0xfc, 0xa2, 0x3c, 0x39, 0x0b, 0x0c, 0x94, 0x17, 0x16, 0x4e, 0x50, 0x4f, 0x4f, 0x4e, 0x4e, 0xfd, 0xd7, 0x00, 0x01, 0x00, 0x8e, 0xff, 0x3b, 0x03, 0xcd, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x02, 0x3a, 0x01, 0x93, 0x7f, 0xab, 0x80, 0xc1, 0xd4, 0xea, 0x05, 0xd5, 0xf9, 0x66, 0x06, 0x1f, 0xf9, 0xe1, 0x03, 0x4e, 0x11, 0xdd, 0xb8, 0xbe, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc5, 0x02, 0x48, 0x01, 0x83, 0x03, 0x46, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0xc5, 0xbe, 0xbe, 0x03, 0x46, 0xfe, 0x00, 0x01, 0x01, 0x05, 0xfe, 0x75, 0x02, 0x7b, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x21, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x02, 0x18, 0x32, 0x30, 0x6c, 0x6a, 0x29, 0x4e, 0x27, 0x1e, 0x43, 0x2a, 0x35, 0x36, 0x26, 0x29, 0x3e, 0x69, 0x30, 0x59, 0x5b, 0x0c, 0x0c, 0x83, 0x11, 0x0f, 0x30, 0x2e, 0x1e, 0x57, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7b, 0x02, 0x9c, 0x02, 0x7f, 0x05, 0xdf, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x8c, 0xb8, 0xc9, 0xcf, 0x7c, 0xb8, 0xfe, 0x0e, 0x03, 0x0a, 0x02, 0x63, 0x29, 0x74, 0x27, 0xfd, 0x2b, 0x6e, 0x00, 0x00, 0x03, 0x00, 0x56, 0x01, 0xd5, 0x03, 0x0e, 0x05, 0xf0, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x7d, 0x02, 0x6b, 0xfd, 0x95, 0x01, 0x36, 0xa1, 0xb9, 0xb9, 0xa1, 0xa1, 0xbc, 0xbc, 0xa1, 0x5f, 0x71, 0x72, 0x5e, 0x5e, 0x71, 0x70, 0x02, 0x50, 0x7b, 0x04, 0x1b, 0xdd, 0xbf, 0xbf, 0xdb, 0xdc, 0xbe, 0xbf, 0xdd, 0x73, 0xa1, 0x88, 0x85, 0xa0, 0xa0, 0x85, 0x89, 0xa0, 0x00, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x8d, 0x03, 0xdb, 0x04, 0x23, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x01, 0x15, 0x01, 0x35, 0x09, 0x01, 0x25, 0x01, 0x15, 0x01, 0x35, 0x09, 0x01, 0xae, 0x01, 0xa6, 0xfe, 0x5a, 0x01, 0x0f, 0xfe, 0xf1, 0x01, 0x86, 0x01, 0xa6, 0xfe, 0x5a, 0x01, 0x0f, 0xfe, 0xf1, 0x04, 0x23, 0xfe, 0x5e, 0x52, 0xfe, 0x5e, 0xbf, 0x01, 0x0c, 0x01, 0x0c, 0xbf, 0xfe, 0x5e, 0x52, 0xfe, 0x5e, 0xbf, 0x01, 0x0c, 0x01, 0x0c, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0xc0, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa2, 0x04, 0x17, 0xfd, 0x64, 0x10, 0x07, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0x86, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x00, 0x74, 0x04, 0x17, 0xfd, 0x64, 0x10, 0x07, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x58, 0xff, 0xe3, 0x06, 0xc0, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x75, 0x00, 0x00, 0x10, 0x27, 0x07, 0xa2, 0x04, 0x17, 0xfd, 0x64, 0x10, 0x07, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x00, 0x02, 0x00, 0x80, 0xff, 0xe3, 0x03, 0x4e, 0x05, 0xd5, 0x00, 0x20, 0x00, 0x24, 0x00, 0x00, 0x01, 0x33, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x35, 0x13, 0x23, 0x35, 0x33, 0x01, 0xc2, 0xab, 0x31, 0x52, 0x50, 0x35, 0x2e, 0x76, 0x62, 0x47, 0xa2, 0x56, 0x55, 0xac, 0x5d, 0xa6, 0xc9, 0x41, 0x50, 0x50, 0x2b, 0x22, 0x07, 0x07, 0x05, 0xb0, 0xb5, 0xb5, 0x04, 0x44, 0x9c, 0x65, 0x82, 0x57, 0x58, 0x35, 0x5e, 0x31, 0x59, 0x6e, 0x46, 0x43, 0xbc, 0x39, 0x38, 0xc2, 0x9f, 0x4c, 0x89, 0x56, 0x56, 0x2f, 0x35, 0x19, 0x15, 0x3c, 0x36, 0x01, 0x0e, 0xfe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0x43, 0x01, 0x75, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0x43, 0x01, 0x75, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x10, 0xef, 0x04, 0x43, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x5e, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x10, 0xed, 0x04, 0x43, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6d, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x21, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x0b, 0x01, 0x21, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x01, 0x23, 0x03, 0x21, 0x03, 0x23, 0x02, 0xff, 0x50, 0x39, 0x3a, 0x4e, 0x4f, 0x39, 0x39, 0x50, 0x89, 0xf5, 0x01, 0xeb, 0xfe, 0x82, 0x37, 0x38, 0x8f, 0x68, 0x67, 0x91, 0x39, 0x36, 0x01, 0xdf, 0xbd, 0x7b, 0xfd, 0xa2, 0x7a, 0xc0, 0x06, 0x5a, 0x3f, 0x59, 0x57, 0x41, 0x3f, 0x58, 0x58, 0xfe, 0xf3, 0xfd, 0x19, 0x03, 0x4e, 0x29, 0x73, 0x49, 0x73, 0xa0, 0xa1, 0x72, 0x46, 0x76, 0x29, 0xfa, 0x8b, 0x01, 0x7f, 0xfe, 0x81, 0x00, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x06, 0x8e, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x03, 0x23, 0x01, 0x17, 0x01, 0x21, 0x11, 0x06, 0x7c, 0xfd, 0x66, 0x02, 0x80, 0xfd, 0x80, 0x02, 0xac, 0xfc, 0x9d, 0xfe, 0x25, 0x90, 0xb9, 0x02, 0x33, 0x7d, 0xfe, 0xd7, 0x01, 0x9d, 0x05, 0xd5, 0xaa, 0xfe, 0x46, 0xaa, 0xfd, 0xe3, 0xaa, 0x01, 0x7f, 0xfe, 0x81, 0x05, 0xd5, 0x9e, 0xfc, 0xf0, 0x03, 0x10, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x75, 0x04, 0xa4, 0x05, 0xf0, 0x12, 0x26, 0x00, 0x26, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0x01, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0x28, 0x01, 0x75, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0x28, 0x01, 0x75, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x10, 0xef, 0x04, 0x28, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0x28, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x01, 0x8e, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x02, 0xde, 0x01, 0x75, 0xff, 0xff, 0x00, 0x91, 0x00, 0x00, 0x01, 0xe9, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x02, 0xde, 0x01, 0x75, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x02, 0x24, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x10, 0xef, 0x02, 0xde, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x02, 0x1c, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x02, 0xde, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x05, 0x28, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x00, 0x13, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x11, 0x23, 0x35, 0x33, 0x13, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0xbe, 0x01, 0x76, 0x01, 0x86, 0x01, 0x6d, 0xfe, 0x92, 0xfe, 0x7b, 0xfe, 0x8a, 0xb5, 0xb5, 0xb7, 0x01, 0x2e, 0xfe, 0xd2, 0xda, 0x01, 0x16, 0x01, 0x03, 0xfe, 0xfd, 0xfe, 0xea, 0x05, 0xd5, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x02, 0xbc, 0x90, 0x01, 0xe3, 0xfe, 0x1d, 0x90, 0xfd, 0xea, 0x01, 0x18, 0x01, 0x2e, 0x01, 0x2c, 0x01, 0x17, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x5e, 0x12, 0x26, 0x00, 0x31, 0x00, 0x00, 0x11, 0x07, 0x10, 0xed, 0x04, 0x7e, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0xa3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0xa3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x10, 0xef, 0x04, 0xa3, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x5e, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x10, 0xed, 0x04, 0xa3, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0xa3, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfc, 0x00, 0x3f, 0x05, 0x0d, 0x04, 0xc5, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x02, 0x07, 0x09, 0x01, 0x27, 0x09, 0x01, 0x37, 0x09, 0x01, 0x05, 0x0c, 0xfe, 0x65, 0x01, 0x9b, 0x6b, 0xfe, 0x63, 0xfe, 0x63, 0x6a, 0x01, 0x9a, 0xfe, 0x66, 0x6a, 0x01, 0x9d, 0x01, 0x9d, 0x04, 0x4c, 0xfe, 0x35, 0xfe, 0x37, 0x79, 0x01, 0xcb, 0xfe, 0x35, 0x79, 0x01, 0xc9, 0x01, 0xcb, 0x79, 0xfe, 0x35, 0x01, 0xcb, 0x00, 0x00, 0x03, 0x00, 0x5b, 0xff, 0xba, 0x05, 0x4f, 0x06, 0x17, 0x00, 0x09, 0x00, 0x13, 0x00, 0x2b, 0x00, 0x00, 0x09, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x14, 0x16, 0x17, 0x07, 0x26, 0x02, 0x35, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x37, 0x17, 0x07, 0x16, 0x12, 0x15, 0x10, 0x00, 0x21, 0x22, 0x26, 0x27, 0x07, 0x27, 0x04, 0x3d, 0xfd, 0x7b, 0x38, 0x91, 0x55, 0xc6, 0xe8, 0x24, 0x6c, 0x37, 0x91, 0x56, 0xc6, 0xe9, 0x23, 0x23, 0x78, 0x46, 0x47, 0x01, 0x53, 0x01, 0x1b, 0x75, 0xc7, 0x4e, 0x92, 0x5c, 0x99, 0x46, 0x48, 0xfe, 0xae, 0xfe, 0xe5, 0x73, 0xc7, 0x52, 0x92, 0x5c, 0x04, 0x58, 0xfc, 0xb2, 0x40, 0x43, 0x01, 0x48, 0x01, 0x1a, 0x70, 0xb8, 0xb8, 0x40, 0x43, 0xfe, 0xb8, 0xfe, 0xe5, 0x70, 0xbc, 0x44, 0x9e, 0x66, 0x01, 0x08, 0xa0, 0x01, 0x62, 0x01, 0xa5, 0x4d, 0x4b, 0xbf, 0x59, 0xc6, 0x67, 0xfe, 0xf6, 0x9e, 0xfe, 0x9f, 0xfe, 0x5b, 0x4b, 0x4b, 0xbf, 0x58, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0x70, 0x01, 0x75, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0x70, 0x01, 0x75, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x10, 0xef, 0x04, 0x70, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0x70, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0x01, 0x01, 0x75, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x13, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0xb5, 0xb6, 0xe4, 0xe2, 0xe7, 0xe7, 0xe2, 0xe4, 0xb6, 0xb6, 0xe4, 0x7f, 0x8b, 0x8a, 0x80, 0x05, 0xd5, 0xfe, 0xf8, 0xe1, 0xdc, 0xdc, 0xe2, 0xfe, 0xae, 0x04, 0x27, 0xfd, 0xd1, 0x92, 0x86, 0x86, 0x91, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0xe3, 0x04, 0x35, 0x06, 0x14, 0x00, 0x2f, 0x00, 0x00, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0xa7, 0xd7, 0xc5, 0xbb, 0xc5, 0x03, 0x88, 0x97, 0x34, 0x3a, 0x34, 0x95, 0x56, 0xca, 0xbe, 0x3a, 0x7a, 0x42, 0x48, 0x7e, 0x3b, 0x68, 0x6c, 0x35, 0x5b, 0x53, 0x56, 0x4e, 0x96, 0x88, 0x07, 0x76, 0x66, 0x75, 0x7a, 0xa9, 0x04, 0x71, 0xc8, 0xdb, 0xe8, 0xe0, 0x08, 0x73, 0x60, 0x2f, 0x51, 0x2a, 0x25, 0x6a, 0x8e, 0x64, 0xac, 0xb7, 0x19, 0x18, 0xa4, 0x1e, 0x1d, 0x5f, 0x5b, 0x3f, 0x54, 0x3e, 0x37, 0x3b, 0x87, 0x5b, 0x7f, 0xac, 0x1d, 0x67, 0x70, 0x8b, 0x83, 0xfb, 0x93, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x66, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x00, 0x43, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x66, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x00, 0x76, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x66, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x02, 0x88, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x37, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x02, 0x9e, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x10, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x06, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x02, 0x9c, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0xb1, 0x04, 0x7b, 0x00, 0x06, 0x00, 0x33, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x03, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x1d, 0x01, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x06, 0x0a, 0x01, 0x94, 0x7b, 0x8a, 0xa7, 0x0c, 0x3d, 0x42, 0xbf, 0x77, 0xcb, 0xee, 0xfd, 0x06, 0x0b, 0xb8, 0xa4, 0x5e, 0xb4, 0x5a, 0x5a, 0xbb, 0x60, 0x96, 0xdf, 0x45, 0x42, 0xc3, 0x80, 0xaa, 0xbd, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0x80, 0xc0, 0xd7, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0x02, 0x94, 0x97, 0xb4, 0xae, 0x9e, 0x01, 0x30, 0x5a, 0x5e, 0xfe, 0xdd, 0xfa, 0x5a, 0xbf, 0xc8, 0x35, 0x35, 0xae, 0x2a, 0x2c, 0x79, 0x77, 0x78, 0x78, 0xbb, 0xa8, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0x60, 0xfe, 0x18, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x03, 0x84, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0x00, 0x81, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x66, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x06, 0x00, 0x43, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x66, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x66, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x06, 0x02, 0x88, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x10, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xcc, 0x00, 0x00, 0x01, 0x7c, 0x06, 0x66, 0x10, 0x27, 0x00, 0x43, 0xff, 0x34, 0x00, 0x00, 0x12, 0x06, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x81, 0x00, 0x00, 0x02, 0x31, 0x06, 0x66, 0x10, 0x27, 0x00, 0x76, 0xff, 0x34, 0x00, 0x00, 0x12, 0x06, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe1, 0x00, 0x00, 0x02, 0x20, 0x06, 0x66, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x11, 0x07, 0x02, 0x88, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x02, 0x0c, 0x06, 0x10, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, 0xff, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x14, 0x00, 0x0e, 0x00, 0x28, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x13, 0x16, 0x12, 0x15, 0x14, 0x00, 0x23, 0x22, 0x02, 0x11, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x27, 0x05, 0x27, 0x37, 0x27, 0x33, 0x17, 0x25, 0x17, 0x05, 0x02, 0xf2, 0x2d, 0x4f, 0x25, 0x96, 0xa7, 0x9d, 0x83, 0x83, 0x9c, 0x30, 0x08, 0x71, 0x67, 0xff, 0x00, 0xcf, 0xd0, 0xfe, 0xf8, 0xc7, 0x10, 0x2f, 0x26, 0x8f, 0xfe, 0xe1, 0x1e, 0xfd, 0xa3, 0xcd, 0x72, 0x01, 0x2c, 0x1e, 0xfe, 0xf6, 0x03, 0x93, 0x11, 0x10, 0xd8, 0xc3, 0xbc, 0xde, 0xde, 0xbc, 0x7a, 0xbc, 0x01, 0x26, 0x8f, 0xfe, 0xe0, 0xad, 0xff, 0xfe, 0xc9, 0x01, 0x37, 0x00, 0xff, 0xfa, 0x01, 0x37, 0x05, 0x05, 0xb4, 0x6b, 0x63, 0x5c, 0xcc, 0x91, 0x6f, 0x61, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x37, 0x12, 0x26, 0x00, 0x51, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9e, 0x00, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x06, 0x00, 0x43, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x06, 0x02, 0x88, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x37, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x06, 0x02, 0x9e, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x10, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x68, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x96, 0x05, 0x46, 0x04, 0x6f, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x01, 0x21, 0x15, 0x21, 0x02, 0x96, 0xdd, 0xdd, 0xdd, 0xdd, 0xfe, 0x2d, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x6f, 0xf6, 0xfe, 0x12, 0xf5, 0x02, 0x41, 0xaa, 0x00, 0x00, 0x03, 0x00, 0x40, 0xff, 0xa2, 0x04, 0x26, 0x04, 0xbc, 0x00, 0x09, 0x00, 0x13, 0x00, 0x2b, 0x00, 0x00, 0x09, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x35, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x37, 0x17, 0x07, 0x1e, 0x01, 0x15, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x07, 0x27, 0x03, 0x2e, 0xfe, 0x4a, 0x25, 0x5d, 0x3a, 0x85, 0x9a, 0x12, 0x52, 0x26, 0x5d, 0x38, 0x88, 0x98, 0x11, 0x12, 0x70, 0x31, 0x30, 0xf5, 0xd9, 0x54, 0x8f, 0x3c, 0x7d, 0x56, 0x83, 0x2f, 0x31, 0xf7, 0xd8, 0x56, 0x91, 0x39, 0x7d, 0x56, 0x03, 0x21, 0xfd, 0xb0, 0x2a, 0x28, 0xe8, 0xc8, 0x4f, 0x75, 0x9a, 0x29, 0x29, 0xeb, 0xd3, 0x48, 0x6e, 0x2e, 0x97, 0x4d, 0xc5, 0x77, 0x01, 0x14, 0x01, 0x38, 0x33, 0x34, 0xa8, 0x4f, 0xb3, 0x4d, 0xc6, 0x78, 0xfe, 0xed, 0xfe, 0xc7, 0x34, 0x33, 0xa8, 0x4e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x66, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x06, 0x00, 0x43, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x66, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x66, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x11, 0x06, 0x02, 0x88, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x10, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x66, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x55, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x4e, 0xa7, 0xa7, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x01, 0xff, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0xa8, 0xfd, 0xae, 0x07, 0xbe, 0xfd, 0xa2, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x01, 0xeb, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x10, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x55, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0xaa, 0x01, 0x3b, 0x13, 0x06, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x05, 0xf6, 0x10, 0x26, 0x00, 0x71, 0x43, 0x00, 0x13, 0x06, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x92, 0x10, 0x27, 0x02, 0x9a, 0x00, 0xb9, 0x01, 0x4a, 0x13, 0x06, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x1f, 0x10, 0x26, 0x02, 0x9a, 0x47, 0xd7, 0x13, 0x06, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x75, 0x05, 0x15, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0x02, 0x9a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xfe, 0x75, 0x04, 0x0d, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0x01, 0x92, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x07, 0x6b, 0x12, 0x26, 0x00, 0x26, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0xa8, 0x01, 0x75, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x06, 0x66, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x7b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x04, 0xc4, 0x01, 0x75, 0x13, 0x06, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x06, 0x66, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, 0x10, 0x07, 0x02, 0x88, 0x00, 0x94, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0xc4, 0x01, 0x75, 0x12, 0x06, 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x04, 0x2d, 0x00, 0x00, 0x12, 0x06, 0x00, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x26, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0xa8, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x06, 0x66, 0x12, 0x26, 0x00, 0x46, 0x00, 0x00, 0x10, 0x06, 0x02, 0x89, 0x7b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x1f, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf0, 0x04, 0x6e, 0x01, 0x75, 0x12, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x05, 0x46, 0x06, 0x14, 0x12, 0x26, 0x00, 0x47, 0x00, 0x00, 0x11, 0x07, 0x10, 0xea, 0x04, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x05, 0x28, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x76, 0x06, 0x14, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x45, 0xfe, 0xdb, 0x01, 0x25, 0xa6, 0x8a, 0x8a, 0xa6, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0xfe, 0x00, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x03, 0xb6, 0x01, 0x4e, 0x7d, 0x93, 0x93, 0x7d, 0xfa, 0xfc, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0xfe, 0x15, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x33, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0x00, 0x91, 0x01, 0x3d, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x05, 0xf6, 0x10, 0x27, 0x00, 0x71, 0x00, 0x87, 0x00, 0x00, 0x13, 0x06, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x2a, 0x01, 0x75, 0x13, 0x06, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x48, 0x10, 0x27, 0x02, 0x9a, 0x00, 0x87, 0x00, 0x00, 0x13, 0x06, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x28, 0x01, 0x75, 0x12, 0x06, 0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x04, 0x21, 0x00, 0x00, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x75, 0x04, 0x19, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0x01, 0x9e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0x01, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x67, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x2f, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x61, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x11, 0x07, 0x02, 0x89, 0x00, 0x85, 0xff, 0xfb, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x04, 0xd3, 0x01, 0x75, 0x13, 0x06, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x06, 0x66, 0x10, 0x26, 0x02, 0x88, 0x5e, 0x00, 0x13, 0x06, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf2, 0x04, 0x98, 0x01, 0x75, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x06, 0x48, 0x12, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x10, 0x06, 0x02, 0x9a, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0xd3, 0x01, 0x75, 0x13, 0x06, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xf9, 0x00, 0x00, 0x12, 0x06, 0x00, 0x4a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x01, 0x04, 0xfe, 0x05, 0xf0, 0x10, 0x27, 0x02, 0xd7, 0x04, 0xd4, 0xff, 0xed, 0x12, 0x06, 0x00, 0x2a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x06, 0x34, 0x10, 0x27, 0x02, 0xc3, 0x03, 0x7c, 0x01, 0x0c, 0x12, 0x06, 0x00, 0x4a, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x04, 0x82, 0x01, 0x75, 0x13, 0x06, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe7, 0x00, 0x00, 0x03, 0xf4, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x02, 0xc7, 0x01, 0x75, 0x13, 0x06, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xe4, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x01, 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x17, 0x15, 0x21, 0x35, 0x01, 0x4c, 0xb6, 0x02, 0x94, 0xb6, 0x98, 0x98, 0xb6, 0xfd, 0x6c, 0xb6, 0x97, 0x97, 0xb6, 0x02, 0x94, 0x05, 0xd5, 0xe0, 0xe0, 0xe0, 0xa4, 0xfb, 0xaf, 0x02, 0xc7, 0xfd, 0x39, 0x04, 0x51, 0xa4, 0xa4, 0xe0, 0xe0, 0x00, 0x00, 0x01, 0x00, 0x6c, 0x00, 0x00, 0x04, 0x29, 0x06, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x04, 0x29, 0xa6, 0x6f, 0x70, 0x86, 0x9b, 0xa7, 0x70, 0x70, 0xa7, 0x01, 0x3d, 0xfe, 0xc3, 0x3b, 0xa2, 0x69, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0xf6, 0xa4, 0x7a, 0x7a, 0xa4, 0xfe, 0xbc, 0x65, 0x64, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x02, 0x39, 0x07, 0x5e, 0x10, 0x27, 0x10, 0xed, 0x02, 0xdd, 0x01, 0x75, 0x13, 0x06, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd7, 0x00, 0x00, 0x02, 0x2a, 0x06, 0x37, 0x10, 0x27, 0x02, 0x9e, 0xff, 0x34, 0x00, 0x00, 0x13, 0x06, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1d, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0xff, 0x43, 0x01, 0x3b, 0x13, 0x06, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf3, 0x00, 0x00, 0x02, 0x0e, 0x05, 0xf5, 0x10, 0x27, 0x00, 0x71, 0xff, 0x34, 0xff, 0xff, 0x13, 0x06, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x02, 0x2a, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x02, 0xdd, 0x01, 0x75, 0x13, 0x06, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x02, 0x1b, 0x06, 0x48, 0x10, 0x27, 0x02, 0x9a, 0xff, 0x34, 0x00, 0x00, 0x13, 0x06, 0x00, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xfe, 0x75, 0x01, 0xef, 0x05, 0xd5, 0x10, 0x27, 0x02, 0x9d, 0xff, 0x74, 0x00, 0x00, 0x12, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0xfe, 0x75, 0x01, 0xd7, 0x06, 0x14, 0x10, 0x27, 0x02, 0x9d, 0xff, 0x5c, 0x00, 0x00, 0x12, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6d, 0x07, 0x50, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf3, 0x02, 0xde, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x04, 0x7b, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x13, 0xae, 0xa5, 0xa5, 0x52, 0x04, 0x60, 0xfb, 0xa0, 0x04, 0x7b, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x66, 0x03, 0x8b, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x2d, 0x02, 0x20, 0x00, 0x00, 0x11, 0x06, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0xfe, 0x56, 0x03, 0x53, 0x06, 0x14, 0x10, 0x27, 0x00, 0x4d, 0x01, 0xff, 0x00, 0x00, 0x11, 0x06, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa0, 0xfe, 0x66, 0x02, 0x23, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x02, 0xdd, 0x01, 0x75, 0x13, 0x06, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0xfe, 0x56, 0x02, 0x20, 0x06, 0x66, 0x10, 0x27, 0x02, 0x88, 0xff, 0x34, 0x00, 0x00, 0x13, 0x06, 0x01, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x1e, 0x04, 0xe0, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x98, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x1e, 0x04, 0x26, 0x06, 0x14, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x35, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x26, 0x04, 0x60, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0xa7, 0xa7, 0x01, 0xee, 0xd4, 0xfd, 0xe9, 0x02, 0x2d, 0xd8, 0xfe, 0x00, 0xa7, 0x04, 0x60, 0xfe, 0x1b, 0x01, 0xe5, 0xfd, 0xf2, 0xfd, 0xae, 0x02, 0x21, 0xfd, 0xdf, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x03, 0x16, 0x01, 0x76, 0x12, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x02, 0x10, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x03, 0x04, 0x01, 0x76, 0x13, 0x06, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x1e, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x25, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7a, 0xfe, 0x1e, 0x01, 0x83, 0x06, 0x14, 0x10, 0x27, 0x02, 0xd7, 0x02, 0xce, 0x00, 0x0a, 0x13, 0x06, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x27, 0x10, 0xea, 0x02, 0x5c, 0xff, 0xc3, 0x12, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x02, 0xb4, 0x06, 0x14, 0x10, 0x27, 0x10, 0xea, 0x02, 0x00, 0x00, 0x02, 0x11, 0x06, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x79, 0x01, 0xf9, 0x00, 0x77, 0x12, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x02, 0x44, 0x06, 0x14, 0x10, 0x27, 0x00, 0x79, 0x00, 0xc1, 0x00, 0x73, 0x11, 0x06, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf3, 0x00, 0x00, 0x04, 0x03, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x25, 0x17, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x07, 0x27, 0x37, 0xbe, 0xb7, 0x01, 0x19, 0x48, 0xfe, 0x9f, 0x02, 0x8e, 0xfc, 0xbb, 0x85, 0x46, 0xcb, 0x05, 0xd5, 0xfd, 0x98, 0xdb, 0x6f, 0xfe, 0xee, 0xfd, 0xe3, 0xaa, 0x02, 0x3b, 0x6a, 0x6e, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x0e, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x37, 0x17, 0x07, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0xb3, 0xa6, 0x70, 0x45, 0xb5, 0xa6, 0x6f, 0x42, 0xb1, 0x06, 0x14, 0xfd, 0xa6, 0x5a, 0x6a, 0x8d, 0xfc, 0xe3, 0x02, 0x9a, 0x58, 0x6a, 0x8d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x4b, 0x01, 0x76, 0x13, 0x06, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x6d, 0x10, 0x26, 0x00, 0x76, 0x3c, 0x07, 0x13, 0x06, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x1e, 0x04, 0xae, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x80, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x1e, 0x03, 0xf4, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x1c, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x5f, 0x12, 0x26, 0x00, 0x31, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x76, 0x01, 0x67, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x66, 0x12, 0x26, 0x00, 0x51, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb8, 0x00, 0x00, 0x05, 0x27, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x51, 0x01, 0x33, 0x00, 0x00, 0x10, 0x06, 0x02, 0x7e, 0x18, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0x97, 0x05, 0xf0, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x10, 0x21, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x12, 0x19, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x03, 0xe2, 0xfe, 0xeb, 0xa1, 0xc1, 0xb6, 0xb6, 0x46, 0x5e, 0x60, 0x89, 0xcd, 0xd1, 0x49, 0x49, 0xa3, 0x4e, 0x2c, 0x5c, 0x47, 0x03, 0x7f, 0x01, 0xac, 0xff, 0xde, 0xfc, 0xb2, 0x05, 0xd5, 0xf1, 0x86, 0x43, 0x43, 0xfe, 0xc1, 0xfe, 0xcc, 0xfc, 0x6f, 0xd5, 0x61, 0x60, 0x9c, 0x5a, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x04, 0x7b, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x03, 0xf4, 0x4a, 0x49, 0xa3, 0xe5, 0xd2, 0x5f, 0x22, 0x22, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0x50, 0x51, 0x6a, 0xad, 0x59, 0x5a, 0x02, 0xa4, 0xfd, 0x48, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x31, 0x99, 0x02, 0xb2, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x65, 0x32, 0x32, 0x77, 0x78, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x01, 0x0a, 0x01, 0x3b, 0x13, 0x06, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x05, 0xf5, 0x10, 0x26, 0x00, 0x71, 0x68, 0xff, 0x13, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x04, 0xa3, 0x01, 0x75, 0x13, 0x06, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x48, 0x10, 0x26, 0x02, 0x9a, 0x68, 0x00, 0x13, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xf4, 0x04, 0xa3, 0x01, 0x75, 0x12, 0x06, 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x27, 0x02, 0x9f, 0x00, 0x90, 0x00, 0x00, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0x00, 0x00, 0x07, 0x3e, 0x05, 0xd5, 0x00, 0x10, 0x00, 0x19, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x17, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x33, 0x07, 0x2e, 0xfd, 0x64, 0x02, 0x80, 0xfd, 0x80, 0x02, 0xac, 0xfc, 0x42, 0xfe, 0x7a, 0xfe, 0x6e, 0x01, 0x92, 0x01, 0x86, 0x5c, 0x74, 0xfe, 0xdf, 0xfe, 0xe0, 0x01, 0x20, 0x01, 0x21, 0x74, 0x05, 0xd5, 0xaa, 0xfe, 0x46, 0xaa, 0xfd, 0xe3, 0xaa, 0x01, 0x7c, 0x01, 0x70, 0x01, 0x6d, 0x01, 0x7c, 0xaa, 0xfe, 0xe1, 0xfe, 0xe0, 0xfe, 0xdf, 0xfe, 0xdf, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x06, 0xfd, 0x04, 0x7b, 0x00, 0x06, 0x00, 0x27, 0x00, 0x33, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x05, 0x15, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x25, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x06, 0x56, 0x02, 0x94, 0x7b, 0x8a, 0xa6, 0x0d, 0x02, 0xf4, 0xfd, 0x07, 0x0b, 0xb7, 0xa5, 0x5f, 0xb4, 0x59, 0x5a, 0xbc, 0x5f, 0x90, 0xda, 0x49, 0x40, 0xbc, 0x7e, 0xd9, 0xf5, 0xf5, 0xd9, 0x7e, 0xbe, 0x3c, 0x46, 0xd1, 0x80, 0xcc, 0xed, 0xfb, 0x38, 0x85, 0x9b, 0x9a, 0x86, 0x85, 0x9a, 0x9a, 0x02, 0x94, 0x98, 0xb3, 0xae, 0x9e, 0x35, 0x5a, 0xbe, 0xc7, 0x34, 0x34, 0xae, 0x2a, 0x2c, 0x6e, 0x6d, 0x6e, 0x6d, 0x01, 0x39, 0x01, 0x13, 0x01, 0x14, 0x01, 0x38, 0x6f, 0x6c, 0x6b, 0x70, 0xfe, 0xdd, 0x87, 0xe7, 0xc9, 0xc9, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x20, 0x01, 0x76, 0x12, 0x06, 0x00, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x39, 0x06, 0x6d, 0x10, 0x26, 0x00, 0x76, 0x3b, 0x07, 0x12, 0x06, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x1e, 0x04, 0xcc, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x8e, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x75, 0xfe, 0x1e, 0x02, 0xf6, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd7, 0x02, 0xc9, 0x00, 0x0a, 0x12, 0x06, 0x00, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x07, 0x5f, 0x12, 0x26, 0x00, 0x35, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x0a, 0x01, 0x67, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x05, 0x06, 0x66, 0x12, 0x26, 0x00, 0x55, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x20, 0x01, 0x76, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x06, 0x6d, 0x10, 0x26, 0x00, 0x76, 0x3c, 0x07, 0x12, 0x06, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x04, 0x1e, 0x01, 0x75, 0x13, 0x06, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x06, 0x66, 0x10, 0x26, 0x02, 0x88, 0x21, 0x00, 0x13, 0x06, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x75, 0x04, 0x2c, 0x05, 0xf0, 0x12, 0x26, 0x00, 0x36, 0x00, 0x00, 0x10, 0x06, 0x00, 0x7a, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xfe, 0x75, 0x03, 0x67, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, 0x10, 0x06, 0x00, 0x7a, 0x15, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x36, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x17, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x06, 0x66, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, 0x11, 0x07, 0x02, 0xbd, 0x03, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0xfe, 0x75, 0x04, 0x6c, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x7a, 0x48, 0x00, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0xfe, 0x75, 0x02, 0xa7, 0x05, 0x9e, 0x10, 0x26, 0x00, 0x7a, 0xe4, 0x00, 0x12, 0x06, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x07, 0x5f, 0x12, 0x26, 0x00, 0x37, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x01, 0x01, 0x67, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0x00, 0x00, 0x02, 0xb2, 0x06, 0x82, 0x12, 0x26, 0x00, 0x57, 0x00, 0x00, 0x11, 0x07, 0x10, 0xea, 0x01, 0xfe, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x21, 0x15, 0x21, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x05, 0x04, 0x70, 0xfe, 0x23, 0xef, 0xef, 0xb6, 0xef, 0xef, 0xfe, 0x23, 0x05, 0xd5, 0xaa, 0xfd, 0xc0, 0xaa, 0xfd, 0xbf, 0x02, 0x41, 0xaa, 0x02, 0x40, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x02, 0xa7, 0x05, 0x9e, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x01, 0x52, 0x01, 0x55, 0xfe, 0xab, 0x01, 0x55, 0xfe, 0xab, 0x21, 0x22, 0x67, 0xab, 0xab, 0xbf, 0x49, 0x49, 0x79, 0x79, 0x79, 0x79, 0x05, 0x9e, 0xfe, 0xc2, 0x8f, 0xe9, 0x8e, 0xe9, 0x89, 0x27, 0x27, 0x9a, 0x50, 0x4f, 0xd2, 0xe9, 0x8e, 0xe9, 0x8f, 0x01, 0x3e, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x5e, 0x10, 0x27, 0x10, 0xed, 0x04, 0x70, 0x01, 0x75, 0x13, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x37, 0x10, 0x26, 0x02, 0x9e, 0x76, 0x00, 0x13, 0x06, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0xd6, 0x01, 0x3b, 0x13, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x05, 0xf5, 0x10, 0x26, 0x00, 0x71, 0x76, 0xff, 0x13, 0x06, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x70, 0x01, 0x75, 0x13, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x48, 0x10, 0x26, 0x02, 0x9a, 0x76, 0x00, 0x13, 0x06, 0x00, 0x58, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6f, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9c, 0x00, 0xd8, 0x00, 0x69, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0xca, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x11, 0x06, 0x02, 0x9c, 0x70, 0xc4, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xf4, 0x04, 0x70, 0x01, 0x75, 0x12, 0x06, 0x00, 0x38, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xef, 0x06, 0x66, 0x10, 0x27, 0x02, 0x9f, 0x00, 0x9e, 0x00, 0x00, 0x12, 0x06, 0x00, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xfe, 0x75, 0x04, 0xa5, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0x00, 0xe1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xfe, 0x75, 0x04, 0x6b, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0x01, 0xf0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x07, 0x74, 0x10, 0x27, 0x10, 0xef, 0x05, 0x5c, 0x01, 0x7c, 0x13, 0x06, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x06, 0x6d, 0x10, 0x27, 0x02, 0x88, 0x01, 0x24, 0x00, 0x07, 0x13, 0x06, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x74, 0x10, 0x27, 0x10, 0xef, 0x04, 0x00, 0x01, 0x7c, 0x13, 0x06, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x6d, 0x10, 0x26, 0x02, 0x88, 0x55, 0x07, 0x13, 0x06, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0x01, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x20, 0x01, 0x76, 0x12, 0x06, 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x06, 0x6d, 0x10, 0x26, 0x00, 0x76, 0x3c, 0x07, 0x12, 0x06, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x45, 0x01, 0x75, 0x12, 0x06, 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xae, 0x00, 0x00, 0x13, 0x06, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf0, 0x04, 0x45, 0x01, 0x75, 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x06, 0x66, 0x12, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x02, 0xac, 0x06, 0x14, 0x00, 0x10, 0x00, 0x00, 0x21, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x01, 0x6f, 0xa6, 0x9f, 0x9f, 0x9c, 0xaa, 0x9d, 0x9e, 0x5a, 0x22, 0x23, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0xab, 0x99, 0x28, 0x29, 0x67, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1c, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x0f, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x15, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x03, 0x81, 0x4b, 0x4b, 0x83, 0x84, 0x4b, 0x4b, 0x4b, 0x4b, 0x84, 0x83, 0x4b, 0x4b, 0xfd, 0xcd, 0x34, 0x50, 0x4f, 0x6f, 0xb8, 0x72, 0x73, 0x73, 0x72, 0xb8, 0x6f, 0x4f, 0x50, 0x34, 0xa7, 0x8a, 0x8a, 0xa7, 0x01, 0x24, 0xfe, 0xdc, 0x02, 0x2f, 0xcb, 0x74, 0x73, 0x73, 0x74, 0xcb, 0xcb, 0x74, 0x73, 0x73, 0x74, 0x02, 0x52, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0xfe, 0xf8, 0xfe, 0xf8, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0xa8, 0x05, 0x04, 0x7d, 0x93, 0x93, 0x7d, 0x00, 0x00, 0x03, 0xff, 0xa1, 0x00, 0x00, 0x04, 0xc8, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x11, 0x00, 0x29, 0x00, 0x00, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x36, 0x01, 0xc5, 0x01, 0x23, 0x93, 0x8d, 0x8d, 0x93, 0xfe, 0xdd, 0x01, 0x0d, 0x85, 0x83, 0x83, 0x85, 0xfe, 0x3d, 0x01, 0xd0, 0xd0, 0xe1, 0x73, 0x70, 0x87, 0x94, 0xf5, 0xe2, 0xfe, 0x1e, 0x77, 0x6a, 0x8c, 0xac, 0x02, 0xc9, 0xfd, 0xdd, 0x87, 0x8b, 0x8c, 0x85, 0x02, 0x66, 0xfe, 0x3e, 0x6f, 0x72, 0x71, 0x70, 0xa6, 0xc0, 0xb1, 0x89, 0xa2, 0x14, 0x20, 0xcb, 0x98, 0xc8, 0xda, 0x05, 0x30, 0x5f, 0x69, 0x31, 0x46, 0xb5, 0xa3, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x12, 0x06, 0x03, 0xa5, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x16, 0x00, 0x26, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x15, 0x23, 0x11, 0x21, 0x15, 0x25, 0x01, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x4e, 0x34, 0x50, 0x4f, 0x6f, 0xb8, 0x72, 0x73, 0x73, 0x72, 0xb8, 0x6f, 0x4f, 0x50, 0x34, 0xa7, 0x02, 0xfa, 0xfd, 0xad, 0x02, 0x33, 0x4b, 0x4b, 0x83, 0x84, 0x4b, 0x4b, 0x4b, 0x4b, 0x84, 0x83, 0x4b, 0x4b, 0x03, 0xb6, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0xfe, 0xf8, 0xfe, 0xf8, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0xa8, 0x06, 0x14, 0xa6, 0x01, 0xfc, 0xc0, 0xcb, 0x74, 0x73, 0x73, 0x74, 0xcb, 0xcb, 0x74, 0x73, 0x73, 0x74, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x01, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x23, 0x01, 0x03, 0xae, 0x47, 0x46, 0x93, 0xfe, 0xdd, 0x01, 0x23, 0x93, 0x46, 0x47, 0xfd, 0xbd, 0x01, 0x2c, 0xe2, 0xf5, 0xf5, 0xe2, 0xfe, 0x1e, 0xb5, 0x01, 0x19, 0x01, 0xb7, 0x8b, 0x44, 0x43, 0xfd, 0xdd, 0x44, 0x43, 0x04, 0xa8, 0xfd, 0x9a, 0xda, 0xde, 0xdd, 0xda, 0x04, 0x44, 0x01, 0x91, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x15, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x23, 0x01, 0x33, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x4e, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xa7, 0xa7, 0x01, 0x05, 0x49, 0x02, 0x33, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0x03, 0xb6, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x64, 0xa8, 0x04, 0x44, 0x01, 0xd1, 0xfc, 0x1a, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x00, 0x19, 0x00, 0x00, 0x13, 0x3e, 0x01, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x06, 0x07, 0x68, 0x5d, 0xd5, 0x79, 0x01, 0x31, 0x01, 0x5f, 0xfe, 0xa1, 0xfe, 0xcf, 0x77, 0xd5, 0x5f, 0x5b, 0xd0, 0x75, 0xe7, 0xf4, 0xf4, 0xe7, 0x75, 0xd0, 0x5b, 0x05, 0x62, 0x47, 0x47, 0xfe, 0x61, 0xfe, 0x98, 0xfe, 0x99, 0xfe, 0x61, 0x48, 0x48, 0xd3, 0x5f, 0x5e, 0x01, 0x39, 0x01, 0x27, 0x01, 0x28, 0x01, 0x39, 0x5e, 0x5f, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x05, 0xb8, 0x07, 0x64, 0x00, 0x24, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x04, 0xa3, 0x5c, 0xd0, 0x75, 0xe6, 0xf5, 0xf5, 0xe6, 0x75, 0xd0, 0x5c, 0x5f, 0xd6, 0x76, 0xfe, 0xce, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x32, 0x56, 0x8c, 0x0c, 0x0b, 0x0e, 0x4b, 0x5c, 0xcc, 0x45, 0x38, 0x79, 0x63, 0x05, 0x62, 0xd5, 0x5f, 0x5e, 0xfe, 0xc7, 0xfe, 0xd8, 0xfe, 0xd9, 0xfe, 0xc7, 0x5e, 0x5f, 0xd3, 0x48, 0x48, 0x01, 0x9f, 0x01, 0x67, 0x01, 0x68, 0x01, 0x9f, 0x24, 0x03, 0x04, 0xc3, 0x62, 0x7a, 0xaa, 0x96, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x52, 0x06, 0x14, 0x00, 0x22, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x17, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x03, 0x83, 0x46, 0x8d, 0x48, 0xa2, 0xb2, 0xb2, 0xa2, 0x48, 0x8d, 0x46, 0x45, 0x95, 0x53, 0xe4, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x40, 0x3f, 0x91, 0xa3, 0x3e, 0x2b, 0x5e, 0x45, 0x04, 0x7e, 0xf5, 0x2b, 0x2b, 0xe3, 0xcd, 0xcd, 0xe3, 0x2b, 0x2b, 0xaa, 0x24, 0x24, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x3a, 0x0c, 0x0f, 0xd6, 0xc0, 0x9c, 0x61, 0x00, 0x00, 0xff, 0xff, 0x00, 0x09, 0x00, 0x00, 0x05, 0x28, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x92, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa1, 0x00, 0x00, 0x05, 0x79, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x11, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x25, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x11, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x36, 0x01, 0xc5, 0xdb, 0x01, 0x16, 0x01, 0x03, 0xfe, 0xfd, 0xfe, 0xea, 0xfe, 0x6f, 0x01, 0x75, 0x01, 0x87, 0x01, 0x6d, 0xfe, 0x91, 0xfe, 0x7b, 0xfe, 0x8b, 0x77, 0x6a, 0x8c, 0xac, 0x05, 0x2f, 0xfb, 0x77, 0x01, 0x18, 0x01, 0x2e, 0x01, 0x2c, 0x01, 0x17, 0xa6, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x05, 0x30, 0x5f, 0x69, 0x31, 0x46, 0xb5, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x14, 0x00, 0x00, 0x01, 0x10, 0x29, 0x01, 0x11, 0x21, 0x22, 0x06, 0x11, 0x21, 0x11, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x21, 0x01, 0x75, 0x01, 0x20, 0x01, 0x23, 0xfe, 0xdd, 0x93, 0x8d, 0x02, 0xf9, 0xfe, 0x1e, 0xe2, 0xf5, 0xf5, 0xe2, 0x01, 0x2c, 0xfd, 0xbd, 0x01, 0xb7, 0xfe, 0xef, 0x02, 0x23, 0x87, 0x03, 0x93, 0xfa, 0x2b, 0xda, 0xde, 0xdd, 0xda, 0x01, 0xc0, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xeb, 0x06, 0x14, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x00, 0x13, 0x35, 0x21, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x11, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0xf2, 0x02, 0xf9, 0xa6, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xfd, 0xcc, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x05, 0x6e, 0xa6, 0xf9, 0xec, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0x64, 0x01, 0xb9, 0xfc, 0xc0, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x02, 0x04, 0x63, 0x00, 0x19, 0x00, 0x27, 0x00, 0x00, 0x25, 0x16, 0x15, 0x10, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x11, 0x10, 0x12, 0x33, 0x32, 0x12, 0x03, 0x14, 0x02, 0x03, 0x36, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x3e, 0x01, 0x03, 0x14, 0x8d, 0xfe, 0x73, 0xc7, 0x6c, 0x5c, 0xdd, 0xde, 0xee, 0xbb, 0x69, 0x80, 0xf6, 0xd8, 0xd7, 0xf8, 0x01, 0x8c, 0x23, 0x01, 0x9a, 0x85, 0x85, 0x9b, 0xa9, 0x72, 0x39, 0x2e, 0x59, 0x63, 0x42, 0x4f, 0x8d, 0xfe, 0xf0, 0x46, 0x99, 0x46, 0x75, 0x5c, 0x30, 0x25, 0x70, 0x87, 0x01, 0x0f, 0x01, 0x0f, 0x01, 0x39, 0xfe, 0xc7, 0xfe, 0xed, 0x9c, 0xfe, 0xfc, 0x01, 0xa0, 0xcb, 0xe5, 0xe8, 0xc3, 0xc2, 0xc7, 0x0b, 0x06, 0x0e, 0x2a, 0xdc, 0x00, 0x01, 0x00, 0x75, 0x00, 0x00, 0x03, 0xd8, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x03, 0xd8, 0xfc, 0x9e, 0x02, 0xac, 0xfd, 0x80, 0x02, 0x80, 0xfd, 0x64, 0x05, 0xd5, 0xfa, 0x2b, 0xaa, 0x02, 0x1d, 0xaa, 0x01, 0xba, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x00, 0x13, 0x21, 0x10, 0x02, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x37, 0x16, 0x12, 0x33, 0x32, 0x12, 0x37, 0x69, 0x04, 0x1b, 0xf8, 0xf6, 0x7e, 0xe2, 0x65, 0x64, 0xec, 0x84, 0x01, 0x3b, 0x01, 0x63, 0xfe, 0xae, 0xfe, 0xe5, 0xfe, 0xd8, 0xfe, 0xbb, 0xc6, 0x0c, 0xe5, 0xb6, 0xb6, 0xe6, 0x0b, 0x03, 0x0c, 0x01, 0x0c, 0x01, 0x32, 0x60, 0x5f, 0xd7, 0x46, 0x48, 0xfe, 0x67, 0xfe, 0x92, 0xfe, 0x9f, 0xfe, 0x5b, 0x01, 0xb7, 0xcc, 0xc3, 0xfe, 0xe4, 0x01, 0x1c, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x93, 0xff, 0xe3, 0x04, 0x09, 0x05, 0xf0, 0x00, 0x28, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x24, 0x35, 0x34, 0x36, 0x01, 0xa9, 0x76, 0x80, 0xf1, 0xcf, 0x50, 0xb5, 0x68, 0x67, 0xab, 0x4a, 0x89, 0x93, 0x8e, 0x86, 0xa4, 0x9c, 0x95, 0xa7, 0xb4, 0xab, 0x62, 0xb4, 0x4b, 0x5f, 0xb3, 0x55, 0xfc, 0xfe, 0xef, 0x92, 0x03, 0x25, 0x21, 0xab, 0x7c, 0xb2, 0xd1, 0x20, 0x20, 0xb4, 0x26, 0x24, 0x7b, 0x73, 0x70, 0x77, 0xa6, 0x95, 0x84, 0x8f, 0x96, 0x32, 0x31, 0xc3, 0x25, 0x25, 0xf2, 0xdd, 0x90, 0xc4, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa0, 0xfe, 0x66, 0x03, 0xba, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0xb5, 0x03, 0x04, 0xfd, 0xb2, 0x02, 0x15, 0xfd, 0xeb, 0xb9, 0xcc, 0x45, 0x38, 0x79, 0x63, 0x05, 0xd5, 0xaa, 0xfe, 0x48, 0xaa, 0xfd, 0x9f, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0x8b, 0xfe, 0x56, 0x02, 0xac, 0x06, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x02, 0xac, 0x9e, 0x5a, 0x45, 0x01, 0x11, 0xfe, 0xef, 0x9c, 0xab, 0x9c, 0x9e, 0x59, 0x46, 0x9f, 0x9f, 0x9c, 0xaa, 0x06, 0x14, 0x99, 0x50, 0x68, 0x63, 0x8f, 0xfb, 0xeb, 0xbb, 0xab, 0x99, 0x50, 0x68, 0x04, 0x2a, 0x8f, 0x4e, 0xbb, 0xab, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x05, 0xef, 0x07, 0x64, 0x00, 0x26, 0x00, 0x00, 0x25, 0x11, 0x21, 0x35, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x04, 0x49, 0xfe, 0xd7, 0x01, 0xdd, 0x69, 0xfe, 0x90, 0xfe, 0xc5, 0xfe, 0x9d, 0x01, 0x63, 0x01, 0x3b, 0x51, 0x93, 0x3e, 0xb5, 0xcc, 0x45, 0x38, 0x79, 0x63, 0x65, 0xe3, 0x7d, 0xf6, 0xf8, 0xf8, 0xf6, 0x61, 0x97, 0xd5, 0x01, 0x91, 0xa6, 0xfd, 0x7f, 0x53, 0x55, 0x01, 0x99, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x99, 0x19, 0x19, 0xbc, 0xea, 0xaa, 0x96, 0xc2, 0xd7, 0x5f, 0x60, 0xfe, 0xce, 0xfe, 0xd1, 0xfe, 0xd2, 0xfe, 0xce, 0x25, 0x00, 0x00, 0x02, 0x00, 0x07, 0xfe, 0x52, 0x04, 0xeb, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x25, 0x00, 0x00, 0x01, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x13, 0x01, 0x33, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x33, 0x02, 0x79, 0x31, 0x27, 0x19, 0x1c, 0x2e, 0x27, 0x28, 0x2e, 0x1c, 0x19, 0x28, 0x31, 0x01, 0xa9, 0xc8, 0xfd, 0xf5, 0x5d, 0x3c, 0x2a, 0x44, 0x5a, 0x8b, 0x8b, 0x5b, 0x43, 0x29, 0x3d, 0x5d, 0xfd, 0xf4, 0xc8, 0xfe, 0xfd, 0x20, 0x14, 0x42, 0x39, 0x49, 0x79, 0x5c, 0x5c, 0x79, 0x49, 0x39, 0x42, 0x14, 0x20, 0x03, 0x7a, 0x03, 0x5e, 0xfb, 0xcf, 0xc8, 0xae, 0x77, 0x42, 0x8b, 0x41, 0x57, 0x57, 0x41, 0x8b, 0x42, 0x77, 0xae, 0xc8, 0x04, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x8d, 0x06, 0x14, 0x00, 0x2a, 0x00, 0x00, 0x25, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x11, 0x14, 0x00, 0x2b, 0x01, 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x16, 0x33, 0x04, 0xc4, 0x86, 0x4c, 0x4e, 0x42, 0x38, 0x6d, 0xca, 0x62, 0x64, 0xfe, 0xfd, 0xc7, 0x3f, 0xa9, 0x8d, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x44, 0x5e, 0x9c, 0x62, 0x65, 0x9b, 0xde, 0x70, 0x5f, 0x21, 0x94, 0x1d, 0x8f, 0x91, 0xfe, 0xec, 0xf5, 0xfe, 0xe6, 0xc8, 0xce, 0x01, 0x08, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x06, 0x14, 0xfd, 0x9e, 0x65, 0x64, 0xef, 0xe8, 0xfe, 0xf2, 0x93, 0x67, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x02, 0x7f, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x11, 0xb5, 0xb6, 0x63, 0x78, 0x39, 0x45, 0xcd, 0xb8, 0x05, 0xd5, 0xfc, 0x2d, 0xc2, 0x96, 0xaa, 0xf4, 0x01, 0x0e, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x02, 0x17, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xb5, 0xb6, 0xac, 0xac, 0xb6, 0xac, 0xac, 0x05, 0xd5, 0xfd, 0x16, 0xaa, 0xfd, 0xbf, 0x02, 0x41, 0xaa, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x5f, 0x05, 0xf0, 0x00, 0x17, 0x00, 0x00, 0x01, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x05, 0x5e, 0x99, 0x41, 0x23, 0x3f, 0x21, 0xfe, 0x14, 0x02, 0xca, 0xef, 0xfd, 0x7b, 0xb6, 0xb6, 0x02, 0x2e, 0x4c, 0x66, 0x7a, 0x4d, 0x4c, 0x04, 0x48, 0x79, 0x36, 0x50, 0x23, 0xfd, 0xf9, 0xfc, 0xe3, 0x02, 0xcf, 0xfd, 0x31, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x43, 0x4f, 0x5c, 0x5b, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa6, 0x00, 0x00, 0x04, 0x26, 0x06, 0x14, 0x00, 0x12, 0x00, 0x00, 0x13, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0xa6, 0x93, 0xa3, 0xac, 0x97, 0x5f, 0x44, 0x01, 0xee, 0xd4, 0xfd, 0xe9, 0x02, 0x2d, 0xd8, 0xfe, 0x00, 0xa7, 0x04, 0x7e, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xfd, 0xff, 0x01, 0xe3, 0xfd, 0xf4, 0xfd, 0xac, 0x02, 0x23, 0xfd, 0xdd, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x01, 0xf3, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xae, 0xa5, 0xa0, 0xa0, 0xa5, 0xa5, 0xa5, 0x06, 0x14, 0xfd, 0x38, 0x90, 0xfd, 0x44, 0x02, 0xbc, 0x90, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x06, 0x14, 0x00, 0x0f, 0x00, 0x00, 0x33, 0x01, 0x27, 0x05, 0x27, 0x25, 0x27, 0x33, 0x17, 0x25, 0x17, 0x05, 0x01, 0x23, 0x09, 0x01, 0x37, 0x01, 0xba, 0x40, 0xfe, 0xf2, 0x1e, 0x01, 0x0b, 0x43, 0xb4, 0x2f, 0x01, 0x1a, 0x1e, 0xfe, 0xe8, 0x01, 0xbc, 0xb0, 0xfe, 0xe6, 0xfe, 0xa4, 0x04, 0x32, 0xbc, 0x65, 0x63, 0x63, 0xc5, 0x8a, 0x68, 0x61, 0x68, 0xfa, 0xd7, 0x03, 0x3c, 0xfc, 0xc4, 0x00, 0x00, 0x01, 0x00, 0xa0, 0xff, 0xe3, 0x06, 0x70, 0x05, 0xd5, 0x00, 0x27, 0x00, 0x00, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x03, 0x49, 0x3f, 0xac, 0x75, 0x9e, 0x55, 0x56, 0xb7, 0x23, 0x33, 0x6a, 0x80, 0x96, 0xb6, 0x34, 0x33, 0x6b, 0x6f, 0x4a, 0x4b, 0xb7, 0xb7, 0x39, 0x9e, 0x6d, 0x6e, 0x4d, 0x4c, 0xd5, 0x7c, 0x76, 0x7b, 0x7a, 0xe2, 0x04, 0x1b, 0xfb, 0xef, 0xba, 0x35, 0x4e, 0xbe, 0xa4, 0x03, 0xec, 0xfb, 0xef, 0xa2, 0x4e, 0x4d, 0x5f, 0x60, 0xa3, 0x03, 0xec, 0xfa, 0x29, 0xae, 0x67, 0x62, 0x3e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa0, 0xfe, 0x66, 0x04, 0xae, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x23, 0x01, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0xb5, 0xf5, 0x02, 0x54, 0xb0, 0xf5, 0xfd, 0xac, 0xb8, 0xcc, 0x40, 0x38, 0x79, 0x63, 0x05, 0xd5, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0x2b, 0x04, 0xe1, 0xfb, 0x87, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x04, 0x7b, 0x10, 0x06, 0x03, 0x4b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x19, 0x00, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x22, 0x02, 0x07, 0x21, 0x26, 0x02, 0x01, 0x1a, 0x01, 0x33, 0x32, 0x12, 0x13, 0x68, 0x01, 0x53, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x52, 0xfe, 0xae, 0xfe, 0xe5, 0xfe, 0xe5, 0xfe, 0xad, 0x02, 0x6f, 0xb6, 0xe6, 0x0b, 0x03, 0x4e, 0x0c, 0xe5, 0xfd, 0x9a, 0x07, 0xe2, 0xc6, 0xc6, 0xe0, 0x07, 0x02, 0xe9, 0x01, 0x62, 0x01, 0xa5, 0xfe, 0x5b, 0xfe, 0x9f, 0xfe, 0x9e, 0xfe, 0x5b, 0x01, 0xa4, 0x03, 0xc5, 0xfe, 0xe4, 0xc3, 0xc3, 0x01, 0x1c, 0xfd, 0x7a, 0xfe, 0xff, 0xfe, 0xc2, 0x01, 0x3d, 0x01, 0x02, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xe3, 0x05, 0x81, 0x06, 0x14, 0x10, 0x26, 0x00, 0x32, 0xf5, 0x00, 0x10, 0x07, 0x02, 0xcc, 0x05, 0x11, 0x01, 0x34, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xe3, 0x04, 0x58, 0x04, 0xeb, 0x10, 0x27, 0x02, 0xcc, 0x03, 0xe9, 0x00, 0x0b, 0x10, 0x06, 0x00, 0x52, 0x04, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x06, 0x21, 0x05, 0xf0, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x00, 0x21, 0x11, 0x34, 0x26, 0x23, 0x11, 0x06, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x17, 0x21, 0x32, 0x16, 0x19, 0x01, 0x01, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x37, 0x11, 0x26, 0x05, 0x6b, 0x63, 0x6e, 0xa9, 0xfe, 0xe4, 0xfe, 0xe6, 0xfe, 0xad, 0x01, 0x53, 0x01, 0x1b, 0x65, 0x57, 0x01, 0x0a, 0xcc, 0xb9, 0xfc, 0xb5, 0xc6, 0xe9, 0xe9, 0xc6, 0x9e, 0x73, 0x7c, 0x03, 0xd3, 0xc2, 0x96, 0xfb, 0x8b, 0xd3, 0x01, 0xa4, 0x01, 0x62, 0x01, 0x62, 0x01, 0xa5, 0x1b, 0xf4, 0xfe, 0xf2, 0xfc, 0x2d, 0x05, 0x4c, 0xfe, 0xb8, 0xfe, 0xe6, 0xfe, 0xe5, 0xfe, 0xb8, 0x67, 0x04, 0x18, 0x46, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0xd1, 0x04, 0x7b, 0x00, 0x16, 0x00, 0x21, 0x00, 0x00, 0x01, 0x11, 0x34, 0x27, 0x26, 0x23, 0x11, 0x06, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x17, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x26, 0x04, 0x2a, 0x22, 0x22, 0x5e, 0x7c, 0xd8, 0xd9, 0xf5, 0xf5, 0xd9, 0x5a, 0x4a, 0xc2, 0xa3, 0x4a, 0x49, 0xfd, 0x64, 0x85, 0x9b, 0x9a, 0x86, 0x74, 0x3a, 0x4c, 0xfe, 0x56, 0x04, 0x74, 0x99, 0x31, 0x30, 0xfc, 0xbc, 0x9d, 0x01, 0x39, 0x01, 0x13, 0x01, 0x14, 0x01, 0x38, 0x1b, 0x60, 0x60, 0xd6, 0xfb, 0x8c, 0x05, 0x89, 0xe7, 0xc9, 0xc9, 0xe7, 0x3a, 0x02, 0xf0, 0x36, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa1, 0x00, 0x00, 0x04, 0x73, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x36, 0x01, 0xc5, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0xfe, 0x66, 0x01, 0x9a, 0xe2, 0xe7, 0xe7, 0xe2, 0xe4, 0xb6, 0x77, 0x6a, 0x8c, 0xac, 0x05, 0x2f, 0xfd, 0xcf, 0x92, 0x87, 0x86, 0x92, 0xa6, 0xe3, 0xdb, 0xdd, 0xe2, 0xfd, 0xa8, 0x05, 0x30, 0x5f, 0x69, 0x31, 0x46, 0xb5, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa6, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x4e, 0xa8, 0x93, 0xa3, 0xe5, 0xd0, 0x5f, 0x44, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x01, 0xff, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0xa8, 0xfd, 0xae, 0x06, 0x28, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xc8, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x01, 0xeb, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x02, 0x00, 0xb4, 0xfe, 0xf8, 0x04, 0xcc, 0x05, 0xd5, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x17, 0x13, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0x11, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x03, 0x32, 0x3b, 0x6e, 0x38, 0xb9, 0xc4, 0xac, 0x42, 0x7d, 0x6c, 0xc6, 0xb6, 0xb6, 0xe4, 0xe7, 0xe2, 0x75, 0xfd, 0xc8, 0xe4, 0x7f, 0x8b, 0x8a, 0x80, 0x01, 0xb4, 0x16, 0x90, 0x7e, 0xfe, 0x68, 0x01, 0x7f, 0x96, 0x62, 0xfe, 0x91, 0x05, 0xd5, 0xfe, 0xf8, 0xd6, 0xd8, 0x8d, 0xba, 0x02, 0x4f, 0xfd, 0xd1, 0x92, 0x01, 0x0c, 0x91, 0x00, 0x01, 0x00, 0x66, 0xff, 0xe3, 0x04, 0x19, 0x05, 0xf0, 0x00, 0x21, 0x00, 0x00, 0x13, 0x36, 0x20, 0x16, 0x10, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x14, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x36, 0x37, 0x36, 0x34, 0x27, 0x26, 0x20, 0x07, 0xb8, 0xcd, 0x01, 0x98, 0xfb, 0xb5, 0xcc, 0x6e, 0x8b, 0x7a, 0xaa, 0x9b, 0xcb, 0xdf, 0xe9, 0xc1, 0xfd, 0x83, 0x82, 0xc1, 0xcc, 0x6d, 0x96, 0x36, 0x35, 0x50, 0x51, 0xfe, 0xc4, 0xcd, 0x05, 0xa4, 0x4c, 0xe4, 0xfe, 0x8f, 0xc0, 0x2d, 0x18, 0x1f, 0x7c, 0xec, 0x88, 0x8b, 0xd0, 0x5f, 0x70, 0x70, 0xd9, 0xb6, 0xd9, 0x2b, 0x19, 0x1f, 0x32, 0x33, 0xd9, 0x40, 0x40, 0x6d, 0x00, 0x01, 0x00, 0x5a, 0xff, 0xe3, 0x03, 0x5d, 0x04, 0x7b, 0x00, 0x27, 0x00, 0x00, 0x13, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x90, 0x44, 0xa2, 0x5c, 0xba, 0xc9, 0x89, 0x9a, 0x39, 0x9a, 0x5b, 0x7e, 0x75, 0x57, 0xb3, 0x5b, 0x61, 0xaf, 0x51, 0xc3, 0xde, 0x94, 0xb1, 0x39, 0x85, 0x58, 0x7b, 0x7c, 0x51, 0x97, 0x46, 0x04, 0x3f, 0x1e, 0x1e, 0xac, 0x9e, 0x82, 0x95, 0x24, 0x0f, 0x25, 0x50, 0x4b, 0x51, 0x59, 0x35, 0x35, 0xbe, 0x23, 0x23, 0xb6, 0x9c, 0x89, 0x99, 0x2a, 0x0e, 0x21, 0x49, 0x40, 0x54, 0x54, 0x28, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x10, 0x06, 0x03, 0x37, 0x00, 0x00, 0x00, 0x02, 0xff, 0x0d, 0xfe, 0x56, 0x02, 0x8f, 0x06, 0x14, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x22, 0x35, 0x34, 0x21, 0x32, 0x17, 0x16, 0x17, 0x33, 0x15, 0x25, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x33, 0x01, 0x52, 0x45, 0x59, 0x9e, 0x9c, 0xaa, 0x9d, 0xab, 0xf3, 0x01, 0x11, 0xa3, 0x49, 0x30, 0x10, 0xac, 0xfe, 0xac, 0x08, 0x0e, 0x1e, 0x63, 0x70, 0x03, 0x02, 0x6b, 0x04, 0x6a, 0xfb, 0x3d, 0x68, 0x50, 0x99, 0xab, 0xbb, 0x04, 0xae, 0xd2, 0xd8, 0x60, 0x40, 0x6f, 0x9b, 0x9a, 0x2c, 0x18, 0x30, 0x41, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0xfe, 0x56, 0x02, 0xa7, 0x05, 0x9e, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x52, 0x01, 0x55, 0xfe, 0xab, 0x43, 0x67, 0xab, 0x94, 0xa2, 0x3f, 0x2b, 0x60, 0x22, 0x22, 0xc0, 0x96, 0x79, 0x79, 0x05, 0x9e, 0xfe, 0xc2, 0x8f, 0xfd, 0xa0, 0x89, 0x4e, 0xae, 0xd6, 0xc0, 0x9c, 0x30, 0x31, 0x99, 0x14, 0x9f, 0xd2, 0x02, 0x60, 0x8f, 0x01, 0x3e, 0x00, 0x01, 0x00, 0x15, 0x00, 0x00, 0x04, 0x6c, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x36, 0x01, 0x83, 0x02, 0xe8, 0xfe, 0x23, 0xb6, 0x55, 0x77, 0x6a, 0x8c, 0xac, 0x05, 0xd5, 0xaa, 0xfa, 0xd5, 0x05, 0x2b, 0x5a, 0x69, 0x31, 0x46, 0xb5, 0xa3, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x02, 0xa7, 0x06, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x15, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x01, 0x52, 0x01, 0x55, 0xfe, 0xab, 0x43, 0x67, 0xab, 0xab, 0xbf, 0x92, 0x79, 0x79, 0x9d, 0xaa, 0x9c, 0x9e, 0x59, 0x45, 0x04, 0xc3, 0x63, 0x8f, 0xfd, 0xa0, 0x89, 0x4e, 0x9a, 0x9f, 0xd2, 0x02, 0x60, 0x8f, 0x4e, 0xbb, 0xab, 0x99, 0x51, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0x66, 0x04, 0x6c, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x19, 0x01, 0x21, 0x05, 0x04, 0x70, 0xfe, 0x23, 0x63, 0x79, 0x39, 0x47, 0xcc, 0xb8, 0xfe, 0x23, 0x05, 0xd5, 0xaa, 0xfb, 0x3d, 0xc2, 0x96, 0xaa, 0xf4, 0x01, 0x0e, 0x04, 0xc3, 0xff, 0xff, 0x00, 0x9b, 0xff, 0xf7, 0x05, 0xbc, 0x06, 0x14, 0x10, 0x26, 0x00, 0x38, 0xfc, 0x14, 0x10, 0x07, 0x02, 0xcc, 0x05, 0x4d, 0x01, 0x34, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xe3, 0x04, 0xdf, 0x04, 0xeb, 0x10, 0x27, 0x02, 0xcc, 0x04, 0x70, 0x00, 0x0b, 0x10, 0x06, 0x00, 0x58, 0x02, 0x00, 0x00, 0x01, 0x00, 0x46, 0xff, 0xe3, 0x05, 0x3b, 0x05, 0xca, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x21, 0x16, 0x12, 0x15, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x37, 0x21, 0x35, 0x21, 0x15, 0x06, 0x02, 0x15, 0x14, 0x12, 0x33, 0x32, 0x12, 0x35, 0x34, 0x02, 0x27, 0x35, 0x21, 0x05, 0x3a, 0xfe, 0xe0, 0x91, 0x80, 0xfe, 0xa6, 0xfe, 0xef, 0xfe, 0xed, 0xfe, 0xa8, 0x82, 0x8e, 0xfe, 0xe1, 0x02, 0x1c, 0xa0, 0xb3, 0xee, 0xc3, 0xc2, 0xee, 0xb2, 0xa0, 0x02, 0x1c, 0x05, 0x18, 0x8d, 0xfe, 0xd8, 0xc2, 0xfe, 0xcb, 0xfe, 0x77, 0x01, 0x8a, 0x01, 0x3e, 0xb8, 0x01, 0x2a, 0x8b, 0xb2, 0xb2, 0x61, 0xfe, 0xb4, 0xca, 0xef, 0xfe, 0xdd, 0x01, 0x22, 0xf0, 0xca, 0x01, 0x4c, 0x61, 0xb2, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xff, 0xe1, 0x04, 0xeb, 0x05, 0xd5, 0x00, 0x1b, 0x00, 0x00, 0x25, 0x32, 0x12, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x17, 0x16, 0x12, 0x15, 0x10, 0x07, 0x06, 0x21, 0x27, 0x26, 0x27, 0x26, 0x19, 0x01, 0x33, 0x11, 0x14, 0x16, 0x33, 0x02, 0x7f, 0xc2, 0xee, 0x59, 0x3b, 0x63, 0xa2, 0x90, 0x80, 0xad, 0xac, 0xfe, 0xee, 0x45, 0xd1, 0x57, 0x5d, 0xb6, 0x63, 0x78, 0x8d, 0x01, 0x22, 0xf0, 0xca, 0xa6, 0x6d, 0x57, 0x44, 0x01, 0x8d, 0xfe, 0xd8, 0xc2, 0xfe, 0xcb, 0xc5, 0xc4, 0x02, 0x06, 0x74, 0x7a, 0x01, 0x0e, 0x03, 0xf0, 0xfc, 0x10, 0xc2, 0x96, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x05, 0x58, 0x05, 0xf0, 0x00, 0x17, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x07, 0x01, 0x11, 0x23, 0x11, 0x01, 0x33, 0x09, 0x01, 0x36, 0x33, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x26, 0x04, 0x5b, 0x33, 0x13, 0x22, 0x0f, 0xfe, 0xaa, 0xb6, 0xfe, 0x24, 0xc4, 0x01, 0x74, 0x01, 0x2d, 0x51, 0x93, 0x7a, 0x4d, 0x4c, 0x99, 0x42, 0x05, 0x47, 0x0e, 0x18, 0x19, 0xfd, 0xbf, 0xfd, 0x39, 0x02, 0xc7, 0x03, 0x0e, 0xfd, 0x9a, 0x01, 0xf9, 0x88, 0x5c, 0x5b, 0x6e, 0x83, 0x79, 0x36, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0xfe, 0x56, 0x05, 0x43, 0x04, 0x7b, 0x00, 0x1f, 0x00, 0x00, 0x05, 0x0e, 0x01, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3f, 0x01, 0x01, 0x33, 0x01, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x02, 0x51, 0x46, 0x85, 0x70, 0x84, 0x61, 0x44, 0x4c, 0x2e, 0x1e, 0xfe, 0x68, 0xaf, 0x01, 0x3b, 0xfe, 0x13, 0x2b, 0x4f, 0x7a, 0x76, 0xa6, 0xa0, 0x49, 0x33, 0x33, 0x25, 0x12, 0x09, 0x68, 0xc8, 0x7a, 0x9a, 0x48, 0x86, 0x54, 0x04, 0x4e, 0xfc, 0x94, 0x02, 0xc0, 0x34, 0x33, 0x60, 0xbf, 0x86, 0x72, 0x72, 0x3a, 0x54, 0x2a, 0x14, 0x19, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x33, 0x15, 0x21, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x01, 0x21, 0x68, 0x04, 0x1f, 0xfe, 0x98, 0xfd, 0xfe, 0x9b, 0xfe, 0x7f, 0x03, 0x66, 0xfb, 0xb7, 0x01, 0x8d, 0xfe, 0xf3, 0x01, 0x75, 0x01, 0x5c, 0xfc, 0xc4, 0x05, 0xd5, 0x9a, 0xfe, 0x11, 0x90, 0xfd, 0xee, 0xaa, 0x9a, 0x02, 0x22, 0x90, 0x01, 0xdf, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x04, 0x60, 0x00, 0x11, 0x00, 0x00, 0x13, 0x21, 0x15, 0x03, 0x33, 0x15, 0x21, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x23, 0x35, 0x21, 0x13, 0x21, 0x66, 0x03, 0x12, 0xe2, 0xaf, 0xfe, 0xe2, 0xfe, 0xe3, 0x02, 0x6e, 0xfc, 0xd7, 0x01, 0x0d, 0xbe, 0x01, 0x2e, 0xf2, 0xfd, 0xa8, 0x04, 0x60, 0xa8, 0xfe, 0xdc, 0x90, 0xfe, 0x8f, 0x93, 0xa8, 0x01, 0x5c, 0x90, 0x01, 0x39, 0x00, 0x01, 0x00, 0x90, 0xff, 0xc1, 0x04, 0x79, 0x05, 0xd5, 0x00, 0x22, 0x00, 0x00, 0x25, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x02, 0x64, 0xad, 0x59, 0x5a, 0x53, 0x54, 0x94, 0x9d, 0x01, 0x5b, 0xfd, 0x49, 0x03, 0x9a, 0xfe, 0x8e, 0x5f, 0x73, 0x58, 0x4e, 0x49, 0x89, 0x89, 0xfc, 0x6b, 0x70, 0x72, 0x78, 0x5f, 0x72, 0x72, 0x6b, 0x4b, 0x4b, 0x8f, 0x86, 0x49, 0x4a, 0x98, 0x01, 0xea, 0xaa, 0x9a, 0xfe, 0x16, 0x38, 0x2a, 0x6d, 0x68, 0x8a, 0xdc, 0x7a, 0x79, 0x13, 0x12, 0x25, 0xc3, 0x31, 0x19, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, 0xff, 0xc1, 0x04, 0x3c, 0x05, 0xd5, 0x00, 0x22, 0x00, 0x00, 0x25, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x01, 0x35, 0x21, 0x15, 0x21, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x02, 0x68, 0x7b, 0x71, 0x73, 0x5f, 0x79, 0x71, 0x70, 0x6c, 0xfc, 0x88, 0x89, 0x49, 0x4d, 0x58, 0x73, 0x60, 0xfe, 0x8e, 0x03, 0x9a, 0xfd, 0x49, 0x01, 0x5a, 0x9c, 0x95, 0x54, 0x52, 0x5a, 0x59, 0x6b, 0x19, 0x19, 0x31, 0xc3, 0x25, 0x12, 0x13, 0x79, 0x7a, 0xdc, 0x8a, 0x68, 0x6d, 0x2a, 0x38, 0x01, 0xea, 0x9a, 0xaa, 0xfe, 0x16, 0x98, 0x4a, 0x49, 0x86, 0x8f, 0x4b, 0x4b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5d, 0xfe, 0x4c, 0x03, 0xd3, 0x04, 0x60, 0x00, 0x20, 0x00, 0x00, 0x09, 0x01, 0x35, 0x21, 0x15, 0x21, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x24, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x02, 0x1f, 0xfe, 0x8e, 0x03, 0x12, 0xfd, 0xa8, 0x01, 0x83, 0x9c, 0x95, 0x54, 0x53, 0x5a, 0x5a, 0xab, 0x62, 0xb4, 0x4b, 0x5f, 0x5a, 0x59, 0x55, 0xfc, 0xfe, 0xef, 0x48, 0x4e, 0x58, 0x73, 0x01, 0xdc, 0x01, 0xdc, 0xa8, 0x93, 0xfe, 0x0d, 0xa6, 0x4a, 0x4b, 0x84, 0x8f, 0x4b, 0x4b, 0x32, 0x31, 0xc3, 0x25, 0x13, 0x12, 0xf2, 0xdd, 0x8a, 0x68, 0x6d, 0x2a, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xfe, 0x56, 0x03, 0x84, 0x04, 0x60, 0x00, 0x20, 0x00, 0x00, 0x01, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x20, 0x11, 0x34, 0x25, 0x24, 0x35, 0x34, 0x23, 0x30, 0x21, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x20, 0x15, 0x10, 0x05, 0x06, 0x15, 0x14, 0x02, 0x3f, 0x4c, 0x45, 0x47, 0x49, 0x4e, 0x48, 0x4e, 0x57, 0xfe, 0x50, 0x01, 0x6d, 0x01, 0x00, 0xd4, 0xfe, 0xfc, 0x01, 0xb4, 0xfd, 0xa8, 0x03, 0x12, 0xfe, 0xc2, 0x01, 0x4a, 0xfe, 0x5e, 0xcb, 0xfe, 0xee, 0x15, 0x15, 0x2c, 0xb3, 0x20, 0x0d, 0x0e, 0x01, 0x19, 0xee, 0x35, 0x25, 0x62, 0x7c, 0x02, 0x38, 0x93, 0xa8, 0xfe, 0x64, 0xe5, 0xfe, 0xec, 0x31, 0x18, 0x61, 0x8b, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x03, 0xdd, 0x05, 0xf0, 0x00, 0x24, 0x00, 0x00, 0x25, 0x21, 0x15, 0x21, 0x35, 0x01, 0x37, 0x21, 0x35, 0x21, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x33, 0x15, 0x23, 0x07, 0x01, 0x62, 0x02, 0x7a, 0xfc, 0xab, 0x01, 0x1b, 0x67, 0xfe, 0xca, 0x01, 0xb1, 0x56, 0x21, 0x23, 0x4a, 0x4c, 0x79, 0x55, 0x5f, 0x5f, 0x6c, 0x6e, 0xbf, 0x4f, 0xd1, 0xf8, 0x1f, 0x1c, 0x42, 0x5e, 0xd5, 0x2b, 0xaa, 0xaa, 0xaa, 0x01, 0x40, 0x75, 0x90, 0x6d, 0x48, 0x4c, 0x49, 0x77, 0x4b, 0x4b, 0x21, 0x21, 0x43, 0xcc, 0x31, 0x32, 0xe8, 0xc2, 0x5c, 0x52, 0x49, 0x60, 0x90, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x53, 0xff, 0xc1, 0x04, 0x7a, 0x05, 0xd5, 0x00, 0x19, 0x00, 0x00, 0x01, 0x10, 0x20, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x25, 0x36, 0x17, 0x16, 0x10, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x20, 0x24, 0x35, 0x01, 0x09, 0x02, 0xbc, 0xa7, 0x94, 0xfe, 0x2b, 0x03, 0x44, 0xfd, 0x72, 0x01, 0x4e, 0xe6, 0x92, 0x49, 0x35, 0x1a, 0x11, 0x29, 0x89, 0xfd, 0xfd, 0xfe, 0xef, 0x01, 0x90, 0xfe, 0xdb, 0x01, 0x25, 0x86, 0x93, 0x03, 0x2c, 0xaa, 0xfe, 0x25, 0x01, 0x01, 0xd0, 0x68, 0xfe, 0xe0, 0x56, 0x29, 0x1d, 0x24, 0x79, 0xf2, 0xdd, 0x00, 0x01, 0x00, 0x5d, 0xfe, 0x4c, 0x03, 0xd3, 0x04, 0x60, 0x00, 0x1a, 0x00, 0x00, 0x17, 0x16, 0x33, 0x20, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x32, 0x1e, 0x01, 0x10, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x5e, 0x98, 0xba, 0x01, 0x6d, 0xa6, 0x95, 0xfe, 0xc3, 0x02, 0xc9, 0xfd, 0xdc, 0xc7, 0x5f, 0xcd, 0x95, 0x35, 0x19, 0x12, 0x28, 0x89, 0xfc, 0xa9, 0xbe, 0xa7, 0x63, 0x01, 0x25, 0x86, 0x93, 0x03, 0x2c, 0xaa, 0xfe, 0x26, 0x63, 0xd4, 0xfe, 0xe0, 0x56, 0x29, 0x1d, 0x24, 0x79, 0x4a, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xff, 0xe3, 0x03, 0x48, 0x05, 0x9e, 0x00, 0x24, 0x00, 0x00, 0x01, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x01, 0xea, 0x01, 0x99, 0x64, 0x62, 0x63, 0x7c, 0xf7, 0x4d, 0x49, 0x48, 0x45, 0x42, 0x4b, 0x47, 0x48, 0xa1, 0x59, 0x33, 0x01, 0x34, 0x4d, 0xad, 0x38, 0x02, 0xce, 0xce, 0xb5, 0xd0, 0x03, 0xe6, 0x7d, 0x1e, 0x77, 0x73, 0xaa, 0xba, 0x7d, 0x9d, 0x12, 0x11, 0x23, 0xac, 0x28, 0x18, 0x16, 0x72, 0x41, 0x85, 0x62, 0x4c, 0x72, 0x01, 0x0f, 0xa4, 0x01, 0x14, 0xfe, 0xec, 0xa4, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x00, 0x05, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x10, 0x01, 0x00, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x01, 0x4e, 0xa7, 0xa7, 0x2f, 0x79, 0x49, 0xbd, 0xa6, 0x45, 0x46, 0xfd, 0x21, 0x02, 0x33, 0x33, 0x32, 0x6c, 0xc6, 0x9c, 0x7a, 0xfe, 0xd0, 0x06, 0x0a, 0xaa, 0x42, 0x52, 0x31, 0x70, 0x71, 0x99, 0xfe, 0x57, 0xfe, 0xe4, 0x01, 0x90, 0xf9, 0x85, 0x42, 0x41, 0xef, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x01, 0x6b, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0xb5, 0xb6, 0xb6, 0x05, 0xd5, 0xf8, 0x81, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x56, 0x02, 0xd7, 0x05, 0xd5, 0x10, 0x27, 0x01, 0x82, 0x01, 0x6c, 0x00, 0x00, 0x10, 0x06, 0x01, 0x82, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0xfe, 0x56, 0x03, 0x40, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x01, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x01, 0x4e, 0xb6, 0x01, 0x3c, 0xfe, 0xc4, 0x01, 0x3c, 0xfe, 0xc4, 0xb6, 0xfe, 0xc4, 0x01, 0x3c, 0xfe, 0xc4, 0x01, 0x3c, 0x05, 0xd5, 0xfd, 0x97, 0xa8, 0xf0, 0xaa, 0xfd, 0x2c, 0x02, 0xd4, 0xaa, 0xf0, 0xa8, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6c, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x04, 0x9f, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x09, 0xbc, 0x07, 0x6d, 0x10, 0x27, 0x01, 0x3f, 0x05, 0x1f, 0x00, 0x00, 0x10, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x08, 0xb8, 0x06, 0x66, 0x10, 0x27, 0x01, 0x40, 0x05, 0x40, 0x00, 0x00, 0x10, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x07, 0xb6, 0x06, 0x66, 0x10, 0x27, 0x01, 0x40, 0x04, 0x3d, 0x00, 0x00, 0x10, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x66, 0x05, 0x87, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x2d, 0x04, 0x1c, 0x00, 0x00, 0x10, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x56, 0x05, 0x48, 0x06, 0x14, 0x10, 0x27, 0x00, 0x4d, 0x03, 0xf4, 0x00, 0x00, 0x10, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0xfe, 0x56, 0x02, 0xa4, 0x06, 0x14, 0x10, 0x27, 0x00, 0x4d, 0x01, 0x51, 0x00, 0x00, 0x10, 0x06, 0x00, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x66, 0x06, 0x41, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x2d, 0x04, 0xd6, 0x00, 0x00, 0x10, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x56, 0x06, 0x0c, 0x06, 0x14, 0x10, 0x27, 0x00, 0x4d, 0x04, 0xb8, 0x00, 0x00, 0x10, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x05, 0x48, 0x06, 0x14, 0x10, 0x27, 0x00, 0x4d, 0x03, 0xf4, 0x00, 0x00, 0x10, 0x06, 0x00, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x45, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x66, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x51, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x02, 0x24, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x02, 0xde, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x02, 0x22, 0x06, 0x66, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x11, 0x07, 0x02, 0x89, 0xff, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf0, 0x04, 0xa3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x6a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0x77, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x66, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x11, 0x06, 0x02, 0x89, 0x6a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x08, 0x33, 0x10, 0x26, 0x11, 0x1e, 0x2b, 0x00, 0x12, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0x6f, 0x01, 0x3b, 0x12, 0x06, 0x00, 0xbe, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x06, 0x11, 0x21, 0x31, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x07, 0x22, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x11, 0x21, 0xff, 0xc5, 0xfe, 0xc8, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x06, 0x11, 0x26, 0x2b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x07, 0x22, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x11, 0x26, 0xff, 0xca, 0xfe, 0xc8, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x08, 0x60, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x06, 0x11, 0x22, 0x2b, 0x06, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x07, 0x22, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x11, 0x22, 0xff, 0xc5, 0xfe, 0xc8, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x06, 0x02, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x33, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x1e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x31, 0x12, 0x26, 0x00, 0xa6, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0x00, 0x4a, 0x01, 0x3b, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x33, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0xf4, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x10, 0x07, 0x11, 0x20, 0xff, 0x9e, 0xfe, 0xc1, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x06, 0x8e, 0x07, 0x34, 0x10, 0x27, 0x00, 0x71, 0x02, 0x8e, 0x01, 0x3e, 0x12, 0x06, 0x00, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0xb1, 0x05, 0xf2, 0x10, 0x27, 0x00, 0x71, 0x01, 0xb7, 0xff, 0xfc, 0x12, 0x06, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x6a, 0x05, 0xf0, 0x00, 0x25, 0x00, 0x00, 0x01, 0x11, 0x33, 0x15, 0x23, 0x15, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x37, 0x35, 0x23, 0x35, 0x33, 0x35, 0x21, 0x35, 0x04, 0xfd, 0x6d, 0x6d, 0x69, 0xfe, 0x90, 0xfe, 0xc5, 0xfe, 0x9d, 0x01, 0x63, 0x01, 0x3b, 0x83, 0xed, 0x64, 0x65, 0xe3, 0x7d, 0xf6, 0xf8, 0xf8, 0xf6, 0x61, 0x97, 0x3c, 0xe4, 0xe4, 0xfe, 0xd7, 0x03, 0x0c, 0xfe, 0xd6, 0x58, 0xff, 0x53, 0x55, 0x01, 0x99, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x99, 0x48, 0x46, 0xd7, 0x5f, 0x60, 0xfe, 0xce, 0xfe, 0xd1, 0xfe, 0xd2, 0xfe, 0xce, 0x25, 0x27, 0xb5, 0x58, 0x84, 0xa6, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x7b, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x34, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x17, 0x14, 0x07, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x21, 0x35, 0x21, 0x36, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x03, 0x45, 0x95, 0x86, 0x85, 0x94, 0x94, 0x85, 0x86, 0x95, 0xa6, 0x11, 0xa1, 0xb3, 0x1c, 0x34, 0x72, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0x51, 0x13, 0x0f, 0xfd, 0xc4, 0x02, 0x57, 0x14, 0x33, 0xa0, 0x70, 0xba, 0xe2, 0xe2, 0xba, 0x70, 0xa0, 0x33, 0xa6, 0x02, 0x3d, 0xc8, 0xdc, 0xdc, 0xc8, 0xc7, 0xdc, 0xdc, 0xeb, 0x6e, 0x58, 0x46, 0x5d, 0x40, 0x8c, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0x5f, 0x17, 0x1c, 0x45, 0x47, 0x5e, 0x5b, 0x63, 0x62, 0x01, 0x3a, 0x01, 0x03, 0x01, 0x04, 0x01, 0x3a, 0x62, 0x63, 0xaa, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x04, 0xc3, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x06, 0x63, 0x10, 0x26, 0x02, 0x89, 0x43, 0xfd, 0x12, 0x06, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xe0, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf0, 0x04, 0x2b, 0x01, 0x75, 0x12, 0x06, 0x00, 0x2e, 0x00, 0x00, 0xff, 0xff, 0xff, 0xeb, 0x00, 0x00, 0x04, 0x26, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x4e, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf0, 0x02, 0xcb, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x75, 0x05, 0x44, 0x05, 0xf0, 0x10, 0x27, 0x02, 0x9d, 0x01, 0x15, 0x00, 0x00, 0x12, 0x06, 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x04, 0x03, 0x04, 0x7b, 0x10, 0x26, 0x02, 0x9d, 0x73, 0x00, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x75, 0x05, 0x44, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x01, 0x0a, 0x01, 0x3b, 0x12, 0x06, 0x01, 0xac, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x04, 0x03, 0x05, 0xf5, 0x10, 0x26, 0x00, 0x71, 0x68, 0xff, 0x12, 0x06, 0x01, 0xad, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x90, 0xff, 0xc1, 0x04, 0x79, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf0, 0x04, 0x45, 0x01, 0x75, 0x12, 0x06, 0x01, 0x79, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0xfe, 0x4c, 0x03, 0xc4, 0x06, 0x66, 0x10, 0x26, 0x02, 0x89, 0x18, 0x00, 0x10, 0x06, 0x02, 0x54, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0xfe, 0x56, 0x02, 0x27, 0x06, 0x66, 0x10, 0x27, 0x02, 0x89, 0xff, 0x3b, 0x00, 0x00, 0x11, 0x06, 0x01, 0xf9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x09, 0xbc, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x3d, 0x05, 0x1f, 0x00, 0x00, 0x10, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x08, 0xb8, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x5d, 0x05, 0x40, 0x00, 0x00, 0x10, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x07, 0xb6, 0x06, 0x14, 0x10, 0x27, 0x00, 0x5d, 0x04, 0x3d, 0x00, 0x00, 0x10, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x98, 0x01, 0x76, 0x12, 0x06, 0x00, 0x2a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x06, 0x63, 0x12, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x18, 0xfd, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xff, 0xe3, 0x07, 0x5c, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x17, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x94, 0xb6, 0x38, 0x37, 0x8a, 0x85, 0x3b, 0x38, 0xb6, 0x5a, 0x57, 0xfd, 0xf8, 0x5d, 0x5a, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfb, 0xec, 0x9f, 0x50, 0x4e, 0x01, 0x4f, 0x4b, 0xa4, 0x02, 0x9f, 0xfd, 0x5a, 0xdf, 0x80, 0x78, 0x78, 0x76, 0xe9, 0x01, 0x0d, 0xfd, 0x39, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0x82, 0x05, 0xf0, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x10, 0x01, 0x00, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x03, 0x01, 0x6b, 0xb6, 0xb6, 0x32, 0x83, 0x4e, 0xcb, 0xb3, 0x4a, 0x4c, 0xfc, 0xe9, 0x02, 0x5d, 0x36, 0x36, 0x75, 0xd5, 0xa7, 0x9c, 0xfd, 0xba, 0x07, 0x7f, 0xb9, 0x48, 0x57, 0x35, 0x78, 0x7a, 0xa4, 0xfe, 0x37, 0xfe, 0xce, 0x01, 0xae, 0x01, 0x0c, 0x8f, 0x47, 0x46, 0xfe, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xee, 0x04, 0x9b, 0x01, 0x75, 0x12, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x64, 0x12, 0x26, 0x00, 0x51, 0x00, 0x00, 0x10, 0x07, 0x00, 0x43, 0x00, 0xfc, 0xff, 0xfe, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x73, 0x12, 0x26, 0x00, 0x87, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x05, 0xb9, 0x01, 0x7d, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x04, 0x60, 0x07, 0x73, 0x12, 0x26, 0x00, 0xa7, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x05, 0x54, 0x01, 0x7d, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x06, 0x8e, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x05, 0xb9, 0x01, 0x76, 0x12, 0x06, 0x00, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0xb1, 0x06, 0x63, 0x12, 0x26, 0x00, 0xa8, 0x00, 0x00, 0x10, 0x07, 0x00, 0x76, 0x01, 0x41, 0xff, 0xfd, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xba, 0x05, 0x4f, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x7e, 0x01, 0x76, 0x12, 0x06, 0x00, 0x9a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x40, 0xff, 0xa2, 0x04, 0x26, 0x06, 0x63, 0x12, 0x26, 0x00, 0xba, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x19, 0xfd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x70, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf5, 0x04, 0x68, 0x01, 0x7a, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x64, 0x10, 0x27, 0x02, 0xc0, 0x04, 0x22, 0xff, 0xfe, 0x12, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x36, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf1, 0x04, 0x43, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x48, 0x10, 0x27, 0x02, 0xc2, 0x03, 0xf4, 0x00, 0x00, 0x12, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x70, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf5, 0x04, 0x2e, 0x01, 0x7a, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x63, 0x10, 0x27, 0x02, 0xc0, 0x04, 0x41, 0xff, 0xfd, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x36, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf1, 0x04, 0x2f, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x48, 0x10, 0x27, 0x02, 0xc2, 0x04, 0x32, 0x00, 0x00, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0xff, 0xaf, 0x00, 0x00, 0x02, 0x35, 0x07, 0x70, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf5, 0x03, 0x03, 0x01, 0x7a, 0xff, 0xff, 0xff, 0xc9, 0x00, 0x00, 0x02, 0x41, 0x06, 0x63, 0x10, 0x27, 0x02, 0xc0, 0x03, 0x0f, 0xff, 0xfd, 0x12, 0x06, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0x38, 0x07, 0x36, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf1, 0x02, 0xeb, 0x01, 0x3e, 0xff, 0xff, 0xff, 0xe5, 0x00, 0x00, 0x02, 0x1a, 0x06, 0x48, 0x10, 0x27, 0x02, 0xc2, 0x02, 0xd4, 0x00, 0x00, 0x12, 0x06, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x70, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf5, 0x04, 0xba, 0x01, 0x7a, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x64, 0x10, 0x27, 0x02, 0xc0, 0x04, 0x29, 0xff, 0xfe, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x36, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf1, 0x04, 0x99, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x48, 0x10, 0x27, 0x02, 0xc2, 0x04, 0x22, 0x00, 0x00, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb3, 0x00, 0x00, 0x04, 0xcc, 0x07, 0x70, 0x12, 0x26, 0x00, 0x35, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf5, 0x04, 0x06, 0x01, 0x7a, 0xff, 0xff, 0x00, 0x75, 0x00, 0x00, 0x02, 0xf6, 0x06, 0x63, 0x10, 0x27, 0x02, 0xc0, 0x03, 0xbb, 0xff, 0xfd, 0x12, 0x06, 0x00, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x07, 0x36, 0x12, 0x26, 0x00, 0x35, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf1, 0x04, 0x0d, 0x01, 0x3e, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x08, 0x06, 0x48, 0x10, 0x27, 0x02, 0xc2, 0x03, 0xc2, 0x00, 0x00, 0x12, 0x06, 0x00, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x70, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf5, 0x04, 0x93, 0x01, 0x7a, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x64, 0x10, 0x27, 0x02, 0xc0, 0x04, 0x58, 0xff, 0xfe, 0x12, 0x06, 0x00, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0x36, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf1, 0x04, 0x6e, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x48, 0x10, 0x27, 0x02, 0xc2, 0x04, 0x34, 0x00, 0x00, 0x12, 0x06, 0x00, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x14, 0x04, 0x2c, 0x05, 0xf0, 0x10, 0x27, 0x02, 0xd7, 0x04, 0x04, 0x00, 0x00, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xfe, 0x14, 0x03, 0x67, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd7, 0x03, 0xc1, 0x00, 0x00, 0x12, 0x06, 0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0xfe, 0x14, 0x04, 0x6c, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd7, 0x03, 0xe4, 0x00, 0x00, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0xfe, 0x14, 0x02, 0xa7, 0x05, 0x9e, 0x10, 0x27, 0x02, 0xd7, 0x03, 0x9a, 0x00, 0x00, 0x12, 0x06, 0x00, 0x57, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8c, 0xfe, 0x52, 0x04, 0x02, 0x05, 0xf0, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x04, 0x11, 0x14, 0x0e, 0x03, 0x07, 0x35, 0x36, 0x24, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x35, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x03, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x02, 0x02, 0xec, 0x01, 0x15, 0x64, 0xa6, 0xe7, 0xfa, 0x8a, 0xb4, 0x01, 0x13, 0xa6, 0x53, 0x70, 0x65, 0x56, 0x67, 0x93, 0xdf, 0x36, 0x5c, 0x5e, 0x37, 0x20, 0x31, 0x44, 0x41, 0x22, 0xa5, 0xdb, 0xd7, 0xb9, 0x76, 0xb7, 0x70, 0x15, 0x34, 0x63, 0x02, 0xa2, 0x43, 0xfe, 0xdb, 0x70, 0xce, 0xa0, 0x88, 0x60, 0x22, 0xa0, 0x37, 0x8c, 0x99, 0x9d, 0x4f, 0x65, 0x84, 0x33, 0x48, 0xab, 0x6a, 0x1a, 0x41, 0x63, 0x8b, 0x52, 0x37, 0x56, 0x33, 0x22, 0x0c, 0xb8, 0xbe, 0xa4, 0x56, 0xb6, 0x80, 0x3c, 0x66, 0x71, 0x74, 0x00, 0x01, 0x00, 0x3f, 0xfe, 0x4f, 0x03, 0x5d, 0x04, 0x7b, 0x00, 0x34, 0x00, 0x00, 0x01, 0x1e, 0x03, 0x15, 0x14, 0x0e, 0x05, 0x07, 0x35, 0x3e, 0x04, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x35, 0x37, 0x3e, 0x04, 0x35, 0x34, 0x2e, 0x03, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x02, 0x63, 0x3f, 0x65, 0x38, 0x1d, 0x3b, 0x61, 0x89, 0x8d, 0xa1, 0x87, 0x42, 0x92, 0xdc, 0x8e, 0x5a, 0x24, 0x6b, 0x53, 0x36, 0x38, 0xc3, 0xc9, 0x1f, 0x3a, 0x4f, 0x38, 0x29, 0x1c, 0x2c, 0x3d, 0x3a, 0x20, 0x3e, 0x97, 0x84, 0xef, 0x79, 0x65, 0xa5, 0x69, 0x5d, 0x01, 0xcd, 0x08, 0x44, 0x5a, 0x58, 0x25, 0x4b, 0x8a, 0x6c, 0x61, 0x46, 0x3d, 0x27, 0x0f, 0x82, 0x2e, 0x60, 0x5b, 0x62, 0x5b, 0x33, 0x58, 0x70, 0x19, 0x56, 0x8b, 0x55, 0x0d, 0x20, 0x3c, 0x45, 0x66, 0x39, 0x2c, 0x46, 0x2a, 0x1b, 0x0a, 0x3b, 0x5a, 0x9a, 0x85, 0x47, 0x92, 0x61, 0x6e, 0x99, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf0, 0x04, 0x84, 0x01, 0x75, 0x12, 0x06, 0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf1, 0x00, 0x00, 0x03, 0xf4, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf0, 0x02, 0xd1, 0x01, 0x75, 0x13, 0x06, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0x97, 0x05, 0xf0, 0x00, 0x13, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x17, 0x32, 0x12, 0x19, 0x01, 0x23, 0x03, 0xe2, 0x8b, 0x8a, 0xa1, 0xc1, 0xb6, 0xb6, 0x48, 0xb9, 0x8c, 0xcd, 0xd1, 0xb4, 0x03, 0x7f, 0xd7, 0xd5, 0xff, 0xde, 0xfc, 0xb2, 0x05, 0xd5, 0xf1, 0x87, 0x86, 0x01, 0xfe, 0xc1, 0xfe, 0xcc, 0xfa, 0xd9, 0x00, 0x03, 0x00, 0x65, 0xff, 0x70, 0x05, 0xa4, 0x06, 0x14, 0x00, 0x07, 0x00, 0x28, 0x00, 0x34, 0x00, 0x00, 0x25, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x22, 0x07, 0x36, 0x33, 0x32, 0x15, 0x10, 0x21, 0x22, 0x27, 0x06, 0x07, 0x23, 0x36, 0x37, 0x26, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x11, 0x33, 0x00, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x10, 0x27, 0x26, 0x20, 0x07, 0x04, 0x3d, 0x10, 0x21, 0x90, 0x2f, 0x2f, 0xb5, 0x63, 0x7a, 0xdc, 0xfe, 0xcc, 0x42, 0x30, 0x1e, 0x16, 0xb0, 0x1a, 0x3c, 0x2b, 0x34, 0x4f, 0x50, 0x70, 0xb7, 0x73, 0x72, 0x72, 0x73, 0xb7, 0x70, 0x50, 0x4f, 0x34, 0xa6, 0xfd, 0x26, 0x4a, 0x4c, 0x01, 0x07, 0x4b, 0x4c, 0x4c, 0x4b, 0xfe, 0xf9, 0x4c, 0x82, 0x05, 0xaf, 0x2d, 0x01, 0x20, 0xb8, 0xce, 0xfe, 0xbf, 0x0f, 0x48, 0x3a, 0x45, 0x93, 0x3c, 0x24, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0x02, 0x10, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0x02, 0x5e, 0xfc, 0xe6, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0x74, 0x01, 0x96, 0x74, 0x73, 0x73, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0xa2, 0x05, 0xf0, 0x00, 0x0c, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x34, 0x26, 0x03, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x32, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x02, 0x84, 0xa6, 0x60, 0x60, 0x60, 0x60, 0x01, 0x4b, 0x60, 0x61, 0xbf, 0xdc, 0x75, 0x99, 0x56, 0x35, 0xb8, 0x97, 0x55, 0x57, 0x45, 0x62, 0x75, 0xcd, 0x87, 0x7d, 0x99, 0x88, 0x9a, 0x56, 0x56, 0x8c, 0x8c, 0xfd, 0xf5, 0x8c, 0x8c, 0x56, 0x57, 0x9a, 0x9a, 0x3c, 0x4c, 0x75, 0x68, 0xe7, 0x02, 0xc5, 0x4d, 0x4d, 0xfe, 0xf2, 0x4d, 0x4d, 0x4d, 0x4e, 0x86, 0x87, 0x9a, 0x02, 0x27, 0x03, 0x7c, 0x4f, 0x45, 0x48, 0x2d, 0x41, 0x41, 0x88, 0x9e, 0x2b, 0x4d, 0x08, 0x64, 0x68, 0x61, 0xba, 0x80, 0xb2, 0x20, 0x22, 0x63, 0x63, 0x8f, 0xd9, 0x74, 0x74, 0x74, 0x74, 0xd9, 0x8f, 0x63, 0x63, 0x22, 0x1f, 0x46, 0x59, 0x58, 0x82, 0x53, 0x4a, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x00, 0x05, 0x0f, 0x00, 0x0d, 0x00, 0x34, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x02, 0x32, 0x81, 0x4b, 0x4a, 0x4a, 0x4b, 0x01, 0x03, 0x4b, 0x4b, 0x4b, 0x4a, 0xe5, 0x34, 0x2f, 0x41, 0x75, 0x84, 0x49, 0x49, 0x77, 0x77, 0xfe, 0x43, 0x77, 0x77, 0x93, 0x84, 0x82, 0x35, 0x2f, 0x39, 0x91, 0x27, 0x42, 0x41, 0x75, 0x76, 0x41, 0x43, 0x28, 0x02, 0xc5, 0x4d, 0x4d, 0xfe, 0xf2, 0x4d, 0x4d, 0x4d, 0x4e, 0x86, 0x87, 0x4d, 0x4d, 0x02, 0x4a, 0x40, 0x62, 0x99, 0x40, 0x59, 0x20, 0x22, 0x63, 0x63, 0x8f, 0xd9, 0x74, 0x74, 0x74, 0x74, 0xd9, 0x8f, 0xc6, 0x22, 0x23, 0x56, 0x4b, 0x8e, 0x59, 0x49, 0x41, 0xe8, 0x41, 0x41, 0x41, 0x41, 0x74, 0x77, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, 0xfe, 0x56, 0x04, 0x9c, 0x05, 0xd5, 0x00, 0x15, 0x00, 0x00, 0x05, 0x10, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x04, 0x9c, 0x8e, 0x41, 0x67, 0xe4, 0xd1, 0x5f, 0x22, 0x22, 0xfc, 0x5d, 0x03, 0x51, 0xfc, 0xc4, 0x04, 0x1f, 0xfc, 0xaf, 0x03, 0x66, 0x14, 0xfe, 0xdf, 0x50, 0x25, 0x9c, 0x30, 0x31, 0x99, 0x14, 0x9a, 0x04, 0x91, 0xaa, 0x9a, 0xfb, 0x6f, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0x56, 0x03, 0x79, 0x04, 0x60, 0x00, 0x15, 0x00, 0x00, 0x05, 0x10, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x03, 0x78, 0x8e, 0x41, 0x66, 0xe5, 0xd2, 0x5e, 0x22, 0x23, 0xfd, 0x7c, 0x02, 0x6f, 0xfd, 0xa8, 0x03, 0x12, 0xfd, 0x92, 0x02, 0x6e, 0x14, 0xfe, 0xdf, 0x50, 0x25, 0x9c, 0x30, 0x31, 0x99, 0x14, 0xa8, 0x03, 0x25, 0x93, 0xa8, 0xfc, 0xdb, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x43, 0x01, 0x75, 0x12, 0x06, 0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xdc, 0x00, 0x00, 0x12, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x75, 0x04, 0x17, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0x00, 0x92, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x06, 0x00, 0x7a, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x33, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x1e, 0x58, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x31, 0x12, 0x26, 0x00, 0xb8, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0x00, 0x68, 0x01, 0x3b, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x33, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x25, 0x5e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0xe9, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x07, 0x11, 0x25, 0xff, 0xbc, 0xfe, 0xb6, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0xa3, 0x01, 0x75, 0x12, 0x06, 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x04, 0x01, 0x00, 0x00, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x33, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x20, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x31, 0x12, 0x26, 0x01, 0xf1, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0x00, 0x68, 0x01, 0x3b, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0x66, 0x01, 0x3b, 0x12, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x05, 0xf5, 0x10, 0x26, 0x00, 0x71, 0x55, 0xff, 0x12, 0x06, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7c, 0xff, 0x70, 0x03, 0x06, 0x06, 0x0e, 0x00, 0x07, 0x00, 0x19, 0x00, 0x00, 0x25, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x22, 0x07, 0x36, 0x33, 0x32, 0x15, 0x10, 0x21, 0x22, 0x27, 0x06, 0x07, 0x23, 0x36, 0x37, 0x26, 0x37, 0x11, 0x33, 0x01, 0xa0, 0x0f, 0x21, 0x90, 0x2e, 0x2f, 0xb6, 0x63, 0x7a, 0xdc, 0xfe, 0xcc, 0x42, 0x2f, 0x1f, 0x15, 0xb1, 0x1a, 0x3d, 0x2d, 0x01, 0xa6, 0x82, 0x05, 0xaf, 0x2d, 0x01, 0x20, 0xb8, 0xce, 0xfe, 0xbf, 0x0f, 0x48, 0x3a, 0x45, 0x93, 0x3c, 0x5a, 0x05, 0x30, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x70, 0x05, 0xad, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x2b, 0x00, 0x00, 0x25, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x22, 0x07, 0x36, 0x33, 0x32, 0x15, 0x10, 0x21, 0x22, 0x27, 0x06, 0x07, 0x23, 0x36, 0x37, 0x26, 0x37, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x04, 0x46, 0x10, 0x21, 0x90, 0x2f, 0x2f, 0xb5, 0x63, 0x7a, 0xdc, 0xfe, 0xcc, 0x42, 0x30, 0x1e, 0x16, 0xb0, 0x1a, 0x3c, 0x2c, 0x01, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0x50, 0x51, 0x6a, 0xad, 0x59, 0x5a, 0x82, 0x05, 0xaf, 0x2d, 0x01, 0x20, 0xb8, 0xce, 0xfe, 0xbf, 0x0f, 0x48, 0x3a, 0x45, 0x93, 0x3c, 0x5a, 0x01, 0xc0, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x65, 0x32, 0x32, 0x77, 0x78, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x31, 0xff, 0x70, 0x03, 0x0b, 0x05, 0x9e, 0x00, 0x07, 0x00, 0x21, 0x00, 0x00, 0x25, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x22, 0x07, 0x36, 0x33, 0x32, 0x15, 0x10, 0x21, 0x22, 0x27, 0x06, 0x07, 0x23, 0x36, 0x37, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x01, 0xa4, 0x10, 0x21, 0x90, 0x2f, 0x2f, 0xb5, 0x62, 0x7b, 0xdb, 0xfe, 0xcd, 0x42, 0x31, 0x1d, 0x16, 0xb0, 0x1a, 0x3c, 0x2c, 0x79, 0x79, 0xa7, 0x01, 0x55, 0xfe, 0xab, 0x82, 0x05, 0xaf, 0x2d, 0x01, 0x20, 0xb8, 0xce, 0xfe, 0xbf, 0x0f, 0x48, 0x3a, 0x45, 0x93, 0x3c, 0x5a, 0x02, 0xf3, 0x8f, 0x01, 0x3e, 0xfe, 0xc2, 0x8f, 0x00, 0x00, 0x01, 0xff, 0xde, 0xfe, 0x56, 0x01, 0x54, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0xae, 0xa5, 0x92, 0xa3, 0x3f, 0x2c, 0x5e, 0x45, 0x04, 0x60, 0xfb, 0x8c, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x06, 0xcb, 0x06, 0x14, 0x00, 0x09, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x10, 0x17, 0x16, 0x20, 0x36, 0x10, 0x26, 0x20, 0x07, 0x13, 0x32, 0x17, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x27, 0x15, 0x23, 0x35, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x00, 0x10, 0x27, 0x26, 0x20, 0x07, 0x06, 0x10, 0x17, 0x16, 0x20, 0x37, 0x01, 0x11, 0x4a, 0x4c, 0x01, 0x07, 0x97, 0x97, 0xfe, 0xf9, 0x4c, 0xa7, 0xdc, 0x67, 0xa7, 0x66, 0xdc, 0xb7, 0xe6, 0xe6, 0xb7, 0xdc, 0x66, 0xa7, 0x67, 0xdc, 0xb7, 0x73, 0x72, 0x72, 0x73, 0x04, 0xd4, 0x4b, 0x4b, 0xfe, 0xf9, 0x4c, 0x4a, 0x4a, 0x4c, 0x01, 0x07, 0x4b, 0x02, 0xfa, 0xfe, 0x6a, 0x74, 0x73, 0xe7, 0x01, 0x96, 0xe7, 0x73, 0x01, 0x0d, 0xc5, 0x02, 0x5e, 0xfd, 0xa2, 0xc5, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0xc5, 0xa8, 0xa8, 0xc5, 0xa2, 0xa2, 0x02, 0x10, 0xa2, 0xa2, 0xfc, 0xe9, 0x01, 0x96, 0x74, 0x73, 0x73, 0x74, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x65, 0xfe, 0x56, 0x06, 0xcb, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x25, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x10, 0x27, 0x26, 0x20, 0x07, 0x06, 0x10, 0x17, 0x16, 0x20, 0x37, 0x03, 0x22, 0x27, 0x11, 0x23, 0x11, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x35, 0x33, 0x15, 0x36, 0x33, 0x32, 0x12, 0x10, 0x02, 0x00, 0x10, 0x17, 0x16, 0x20, 0x36, 0x10, 0x26, 0x20, 0x07, 0x06, 0x1f, 0x4b, 0x4b, 0xfe, 0xf9, 0x4c, 0x4a, 0x4a, 0x4c, 0x01, 0x07, 0x4b, 0xa6, 0xdc, 0x66, 0xa7, 0x67, 0xdc, 0xb7, 0x73, 0x72, 0x72, 0x73, 0xb7, 0xdc, 0x67, 0xa7, 0x66, 0xdc, 0xb7, 0xe6, 0xe6, 0xfb, 0x2c, 0x4a, 0x4c, 0x01, 0x07, 0x97, 0x97, 0xfe, 0xf9, 0x4c, 0x01, 0x64, 0x01, 0x96, 0x74, 0x73, 0x73, 0x74, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0xfe, 0xf3, 0xc5, 0xfd, 0xae, 0x02, 0x52, 0xc5, 0xa2, 0xa2, 0x02, 0x10, 0xa2, 0xa2, 0xc5, 0xaa, 0xaa, 0xc5, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x03, 0x17, 0xfe, 0x6a, 0x74, 0x73, 0xe7, 0x01, 0x96, 0xe7, 0x73, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfd, 0xff, 0xba, 0x04, 0xf0, 0x06, 0x17, 0x00, 0x12, 0x00, 0x16, 0x00, 0x19, 0x00, 0x00, 0x01, 0x33, 0x13, 0x01, 0x17, 0x09, 0x01, 0x23, 0x03, 0x21, 0x0f, 0x01, 0x23, 0x07, 0x27, 0x23, 0x37, 0x27, 0x37, 0x01, 0x03, 0x33, 0x01, 0x03, 0x21, 0x03, 0x02, 0x0f, 0xcf, 0x78, 0x01, 0x3e, 0x5c, 0xfe, 0x98, 0x01, 0x56, 0xbd, 0x7b, 0xfe, 0x0e, 0xb9, 0x2d, 0x3f, 0x35, 0x4a, 0x02, 0x01, 0x12, 0x2b, 0x02, 0x4e, 0xf7, 0x14, 0x01, 0x4b, 0xab, 0x01, 0x3b, 0x60, 0x05, 0xd5, 0xfe, 0xa1, 0x01, 0xa1, 0x59, 0xfe, 0x27, 0xfc, 0x1b, 0x01, 0x7f, 0xf1, 0x8e, 0x46, 0x46, 0x01, 0x11, 0x38, 0x04, 0xc4, 0xfd, 0x19, 0x01, 0xb1, 0xfe, 0x4f, 0x01, 0x1f, 0x00, 0x02, 0x00, 0x0a, 0xff, 0xba, 0x04, 0xfd, 0x06, 0x17, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x00, 0x17, 0x27, 0x13, 0x26, 0x11, 0x10, 0x37, 0x36, 0x21, 0x32, 0x17, 0x16, 0x17, 0x37, 0x17, 0x07, 0x15, 0x26, 0x27, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x20, 0x27, 0x13, 0x01, 0x23, 0x26, 0x23, 0x22, 0x07, 0x06, 0x11, 0x14, 0x67, 0x5c, 0xc6, 0x69, 0xaf, 0xaf, 0x01, 0x32, 0x78, 0x6a, 0x37, 0x35, 0x5a, 0x5c, 0x59, 0x29, 0x2c, 0xfd, 0x42, 0x08, 0x0a, 0x7a, 0xe6, 0x75, 0x69, 0x67, 0x5c, 0x5f, 0x6b, 0x6b, 0x76, 0xfe, 0xd5, 0xaf, 0x34, 0x02, 0x8f, 0x01, 0x69, 0x75, 0xe6, 0x7a, 0x7b, 0x46, 0x58, 0x01, 0x05, 0xbb, 0x01, 0x17, 0x01, 0x68, 0xcf, 0xd0, 0x24, 0x12, 0x1b, 0x78, 0x59, 0x76, 0xbb, 0x2b, 0x21, 0xfc, 0x66, 0x0d, 0x0c, 0x9d, 0x2f, 0x2f, 0x5f, 0xd3, 0x48, 0x24, 0x24, 0xc7, 0x01, 0x15, 0x03, 0x5c, 0x2f, 0x9c, 0x9d, 0xfe, 0xd8, 0xad, 0x00, 0x00, 0x02, 0x00, 0x08, 0xff, 0xa2, 0x03, 0xee, 0x04, 0xbc, 0x00, 0x22, 0x00, 0x2b, 0x00, 0x00, 0x17, 0x27, 0x37, 0x26, 0x35, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x37, 0x17, 0x07, 0x15, 0x26, 0x27, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x13, 0x01, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x5e, 0x56, 0xaa, 0x4c, 0x88, 0x87, 0xeb, 0x4d, 0x49, 0x29, 0x29, 0x50, 0x55, 0x6a, 0x16, 0x16, 0xfe, 0x0b, 0x06, 0x05, 0x59, 0xa2, 0x48, 0x46, 0x47, 0x46, 0x45, 0x4a, 0x4b, 0x53, 0xd8, 0x85, 0x32, 0x01, 0xbc, 0x3f, 0x40, 0xa2, 0x59, 0x59, 0x5e, 0x4e, 0xe6, 0x8d, 0xcc, 0x01, 0x12, 0x9d, 0x9d, 0x11, 0x0a, 0x10, 0x6c, 0x4f, 0x8f, 0x55, 0x0e, 0x0b, 0xfd, 0x5e, 0x08, 0x08, 0x71, 0x15, 0x16, 0x2b, 0xaa, 0x24, 0x12, 0x12, 0x90, 0x01, 0x05, 0x02, 0x56, 0x11, 0x71, 0x72, 0xcd, 0x67, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x35, 0x33, 0xb5, 0xb6, 0xac, 0xac, 0x02, 0x8e, 0xfc, 0xbc, 0xac, 0xac, 0x05, 0xd5, 0xfd, 0x77, 0x90, 0xfd, 0xee, 0xaa, 0x02, 0xbc, 0x90, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb9, 0xff, 0xba, 0x04, 0xad, 0x06, 0x17, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x00, 0x01, 0x15, 0x23, 0x01, 0x11, 0x23, 0x11, 0x01, 0x27, 0x01, 0x11, 0x21, 0x35, 0x21, 0x37, 0x17, 0x09, 0x01, 0x21, 0x04, 0x6b, 0x2f, 0xfe, 0x52, 0xb6, 0xfe, 0x3e, 0x5c, 0x02, 0x1e, 0xfe, 0x23, 0x04, 0x23, 0x32, 0x5c, 0xfd, 0xe2, 0x01, 0x0e, 0xfe, 0xf2, 0x05, 0x69, 0x3e, 0xfd, 0xcc, 0xfd, 0x09, 0x02, 0x07, 0xfd, 0xb3, 0x58, 0x02, 0xc7, 0x02, 0x52, 0xaa, 0x42, 0x59, 0xfe, 0x0b, 0x01, 0x62, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xfe, 0x10, 0x03, 0xb1, 0x04, 0x7b, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x1f, 0x01, 0x16, 0x33, 0x15, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x02, 0xbc, 0x2d, 0x2e, 0x9a, 0x39, 0x9a, 0x44, 0x45, 0xca, 0xb9, 0x5c, 0xa2, 0x44, 0x46, 0x97, 0x51, 0x7b, 0x3e, 0x3e, 0x2c, 0x2d, 0x85, 0x38, 0xb3, 0x48, 0x4a, 0x6e, 0x4f, 0x77, 0x90, 0x84, 0x26, 0x44, 0x23, 0x4c, 0x66, 0x40, 0x50, 0xd5, 0x1c, 0x20, 0x0e, 0x10, 0x57, 0x61, 0x5c, 0x59, 0x59, 0x57, 0x75, 0x3f, 0x3f, 0x01, 0x27, 0x4b, 0x28, 0x28, 0x25, 0x0f, 0x24, 0x4a, 0x4b, 0x82, 0x9e, 0xac, 0x1e, 0x1e, 0xae, 0x28, 0x28, 0x2a, 0x2a, 0x54, 0x40, 0x25, 0x24, 0x21, 0x0e, 0x2c, 0x4b, 0x4c, 0x89, 0x9c, 0x5b, 0x40, 0x13, 0x9f, 0x7e, 0x24, 0x9a, 0x3d, 0x26, 0x5b, 0xf3, 0x1e, 0x10, 0x03, 0x02, 0x12, 0x23, 0xbe, 0x35, 0x1a, 0x1b, 0x2d, 0x2c, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0x10, 0x03, 0xc8, 0x04, 0x60, 0x00, 0x18, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x16, 0x17, 0x13, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x2b, 0x01, 0x3d, 0x01, 0x01, 0x21, 0x66, 0x03, 0x12, 0xfd, 0x93, 0x53, 0x2c, 0xee, 0x84, 0x26, 0x44, 0x62, 0x85, 0x4b, 0x67, 0x40, 0x50, 0xd5, 0x37, 0x51, 0x55, 0x02, 0x6f, 0xfd, 0xa8, 0x04, 0x60, 0xa8, 0xfc, 0xdd, 0x10, 0x31, 0xfe, 0xf8, 0x7e, 0x24, 0x9a, 0x3d, 0x26, 0x5b, 0xf3, 0x3f, 0x9c, 0x0c, 0x03, 0x25, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x18, 0x00, 0x00, 0x01, 0x23, 0x11, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x22, 0x06, 0x07, 0x35, 0x36, 0x3b, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x02, 0x4f, 0x23, 0xb6, 0xd9, 0x7f, 0x8b, 0x8b, 0x7f, 0xe4, 0x3e, 0x9e, 0x47, 0x89, 0x9a, 0xe4, 0xdc, 0xed, 0xee, 0x02, 0x5a, 0xfd, 0xa6, 0x03, 0x00, 0x91, 0x87, 0x88, 0x8f, 0x2a, 0x2c, 0xb6, 0x46, 0xdc, 0xe1, 0xd7, 0xe7, 0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0x03, 0x34, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x00, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x11, 0x23, 0x01, 0x11, 0x5a, 0x7f, 0x8a, 0x44, 0x4c, 0x79, 0x42, 0x4d, 0x4e, 0x46, 0x89, 0x9a, 0xe2, 0x70, 0x77, 0xbf, 0xaf, 0xb5, 0x01, 0xa6, 0x91, 0x87, 0x8d, 0x41, 0x48, 0x15, 0x15, 0x2b, 0xb6, 0x46, 0x6e, 0x74, 0xdb, 0xd5, 0xe5, 0xfe, 0xfc, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x28, 0x00, 0x00, 0x01, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x11, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x01, 0x6b, 0x01, 0x38, 0xfe, 0xc8, 0x01, 0x23, 0x93, 0x8d, 0x8d, 0x93, 0xfe, 0xdd, 0x01, 0x0d, 0x85, 0x83, 0x83, 0x85, 0xfe, 0x3d, 0x01, 0xd0, 0xd0, 0xe1, 0x73, 0x70, 0x87, 0x94, 0xf5, 0xe2, 0xfe, 0x1e, 0xac, 0xac, 0x02, 0xc9, 0xc9, 0x90, 0xca, 0x87, 0x8b, 0x8c, 0x85, 0x02, 0x66, 0xfe, 0x3e, 0x6f, 0x72, 0x71, 0x70, 0xa6, 0xc0, 0xb1, 0x89, 0xa2, 0x14, 0x20, 0xcb, 0x98, 0xc8, 0xda, 0x01, 0x70, 0x90, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0a, 0xff, 0xe3, 0x05, 0x3a, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x10, 0x00, 0x23, 0x22, 0x00, 0x11, 0x35, 0x23, 0x35, 0x33, 0x05, 0x21, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0xa0, 0xb7, 0x02, 0x97, 0xb7, 0x94, 0x94, 0xfe, 0xfc, 0xfe, 0xff, 0xfe, 0xfc, 0x95, 0x95, 0x03, 0x4e, 0xfd, 0x69, 0x9d, 0xaf, 0xaf, 0x9c, 0x05, 0xd5, 0xfd, 0x96, 0x02, 0x6a, 0xfd, 0x96, 0xa4, 0x96, 0xfe, 0xdc, 0xfe, 0xd6, 0x01, 0x2a, 0x01, 0x24, 0x96, 0xa4, 0xa4, 0x7d, 0xf0, 0xd3, 0xd3, 0xf0, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x06, 0x03, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0xff, 0x42, 0x04, 0x17, 0x06, 0x93, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x33, 0x07, 0x33, 0x15, 0x23, 0x03, 0x33, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x07, 0x23, 0x37, 0x23, 0x11, 0x21, 0x01, 0x13, 0x23, 0x11, 0x1b, 0x01, 0x21, 0x11, 0x03, 0x59, 0x99, 0x3b, 0x4f, 0x83, 0x88, 0xf0, 0xfe, 0xdc, 0xa6, 0x01, 0xf6, 0xfd, 0xd5, 0x3a, 0x99, 0x3a, 0x9e, 0x02, 0x69, 0xfe, 0x6a, 0xa6, 0xc3, 0xf7, 0x88, 0xfe, 0x81, 0x06, 0x93, 0xbe, 0xaa, 0xfe, 0x46, 0xaa, 0xfd, 0xe3, 0xaa, 0xbe, 0xbe, 0x05, 0xd5, 0xfa, 0xd5, 0x02, 0x1d, 0xfd, 0xe3, 0x02, 0xc7, 0x01, 0xba, 0xfe, 0x46, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0xff, 0x42, 0x04, 0x0c, 0x05, 0x1e, 0x00, 0x05, 0x00, 0x26, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x03, 0x05, 0x15, 0x21, 0x03, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x23, 0x13, 0x26, 0x27, 0x26, 0x11, 0x10, 0x00, 0x33, 0x32, 0x17, 0x37, 0x33, 0x07, 0x16, 0x17, 0x16, 0x05, 0x13, 0x26, 0x23, 0x22, 0x06, 0x07, 0x1b, 0x01, 0x23, 0x16, 0x03, 0x66, 0x02, 0x4a, 0x0d, 0x0e, 0x64, 0x01, 0x71, 0xfe, 0x5a, 0x86, 0x43, 0x57, 0x60, 0xb3, 0x58, 0x59, 0xbb, 0x60, 0x6f, 0x5a, 0x47, 0x99, 0x62, 0x1e, 0x19, 0x8d, 0x01, 0x0b, 0xe3, 0x32, 0x2d, 0x3f, 0x99, 0x53, 0x34, 0x2a, 0x76, 0xfd, 0xf6, 0x79, 0x12, 0x13, 0x8b, 0xa7, 0x0c, 0x51, 0x64, 0xbb, 0x0a, 0x02, 0x94, 0x97, 0x5a, 0x10, 0x0d, 0xfe, 0xf2, 0x36, 0x5a, 0xfe, 0x97, 0x1c, 0x34, 0x34, 0xae, 0x2a, 0x2c, 0x21, 0xc2, 0x01, 0x09, 0x17, 0x1d, 0x9c, 0x01, 0x0a, 0x01, 0x13, 0x01, 0x43, 0x09, 0xac, 0xe0, 0x22, 0x32, 0x92, 0xc5, 0x01, 0x4a, 0x02, 0xae, 0x9e, 0xfe, 0x63, 0x01, 0x0e, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xa0, 0xfe, 0x66, 0x02, 0x17, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x01, 0x23, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x02, 0x17, 0xac, 0xb9, 0xcc, 0x45, 0x38, 0x79, 0x63, 0xac, 0xac, 0xb6, 0xac, 0x02, 0x77, 0xfd, 0xf1, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0x02, 0x0f, 0xa6, 0x02, 0xb8, 0xfd, 0x48, 0x00, 0x02, 0xff, 0xde, 0xfe, 0x56, 0x01, 0xe6, 0x06, 0x14, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x15, 0x23, 0xae, 0xa5, 0x93, 0x93, 0x92, 0xa3, 0x3f, 0x2c, 0x5e, 0x45, 0xa3, 0xa3, 0xa5, 0xa5, 0x04, 0x60, 0xfe, 0x08, 0xa4, 0xfe, 0x28, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x01, 0xd8, 0xa4, 0x03, 0xac, 0xe9, 0x00, 0x02, 0x00, 0x67, 0xfe, 0x66, 0x06, 0x05, 0x05, 0xf1, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x01, 0x35, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x11, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x01, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x04, 0x3b, 0xb0, 0x63, 0x79, 0x3e, 0x45, 0xcd, 0xb8, 0x46, 0xd4, 0x95, 0xf2, 0xfe, 0xce, 0x01, 0x32, 0xf2, 0x95, 0xd4, 0xfd, 0x2f, 0xd3, 0xb8, 0xb8, 0xd4, 0xd4, 0xb8, 0xb8, 0xd3, 0x04, 0xed, 0xe8, 0xfa, 0x93, 0xc2, 0x96, 0xaa, 0xf4, 0x01, 0x0e, 0x7f, 0x84, 0x80, 0x01, 0xab, 0x01, 0x5c, 0x01, 0x5c, 0x01, 0xab, 0x80, 0xfd, 0x78, 0xfe, 0xe3, 0xfe, 0xbb, 0x01, 0x45, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x45, 0xfe, 0xbb, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0xba, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x01, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x04, 0xba, 0x3f, 0xa3, 0x93, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xa6, 0x44, 0x5f, 0x2c, 0xfc, 0x57, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0xfe, 0x56, 0xc0, 0xd6, 0xbc, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0x64, 0xaa, 0xfb, 0x8c, 0x99, 0x61, 0x03, 0x3d, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0xcc, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x20, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x17, 0x13, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x32, 0x3b, 0x6e, 0x38, 0xb9, 0xc4, 0xac, 0x42, 0x7d, 0x6c, 0xc6, 0xb6, 0xac, 0xac, 0x01, 0x9a, 0xe7, 0xe2, 0x75, 0xfd, 0xc8, 0xe4, 0x84, 0x86, 0x86, 0x84, 0x02, 0xbc, 0x16, 0x90, 0x7e, 0xfe, 0x68, 0x01, 0x7f, 0x96, 0x62, 0xfd, 0x89, 0x02, 0x77, 0xa6, 0x02, 0xb8, 0xd6, 0xd8, 0x8d, 0xba, 0x02, 0x4f, 0xfd, 0xee, 0x87, 0x83, 0x83, 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x02, 0xf6, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x00, 0x01, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x01, 0xe8, 0x9a, 0xa7, 0x9a, 0x9a, 0xa7, 0x34, 0xa8, 0x77, 0x11, 0x2a, 0x19, 0x01, 0x1c, 0x42, 0x27, 0x8d, 0x96, 0x02, 0x68, 0xa4, 0xfe, 0x3c, 0x01, 0xc4, 0xa4, 0x01, 0xf8, 0xae, 0x66, 0x63, 0x05, 0x05, 0xbd, 0x12, 0x11, 0xce, 0xa1, 0x00, 0x00, 0x00, 0x02, 0xff, 0xf7, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x14, 0x00, 0x00, 0x03, 0x33, 0x17, 0x21, 0x37, 0x33, 0x07, 0x33, 0x15, 0x23, 0x03, 0x11, 0x23, 0x11, 0x03, 0x23, 0x35, 0x33, 0x05, 0x21, 0x17, 0x04, 0xc4, 0x88, 0x01, 0xd7, 0x87, 0xc4, 0x88, 0x8c, 0xf0, 0xf0, 0xb6, 0xf0, 0xf1, 0x8d, 0x02, 0x38, 0xfe, 0xf0, 0x88, 0x05, 0xd5, 0xe0, 0xe0, 0xe0, 0xa4, 0xfe, 0x76, 0xfd, 0x39, 0x02, 0xc7, 0x01, 0x8a, 0xa4, 0xa4, 0xe2, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0xfe, 0x56, 0x04, 0x3d, 0x04, 0x60, 0x00, 0x18, 0x00, 0x1b, 0x00, 0x00, 0x05, 0x0e, 0x01, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3f, 0x01, 0x03, 0x21, 0x35, 0x33, 0x03, 0x33, 0x13, 0x21, 0x13, 0x33, 0x03, 0x33, 0x15, 0x21, 0x2b, 0x01, 0x13, 0x02, 0x51, 0x46, 0x85, 0x70, 0x84, 0x61, 0x44, 0x4c, 0x2e, 0x1e, 0xb9, 0xfe, 0xf4, 0xd8, 0xab, 0xaf, 0xa6, 0x01, 0x2b, 0xa5, 0xb0, 0xa7, 0xd7, 0xfe, 0xf5, 0xad, 0xc5, 0x62, 0x68, 0xc8, 0x7a, 0x9a, 0x48, 0x86, 0x54, 0x01, 0xf2, 0x8f, 0x01, 0xcd, 0xfe, 0x33, 0x01, 0xcd, 0xfe, 0x33, 0x8f, 0xfe, 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xf0, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x25, 0x00, 0x00, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x07, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x01, 0xe7, 0xc9, 0x9a, 0x74, 0x64, 0x89, 0xa7, 0xa5, 0xa5, 0x39, 0xa9, 0x7a, 0x9b, 0xb7, 0xe4, 0xe2, 0xe8, 0x96, 0x88, 0x57, 0xa4, 0x4b, 0x5b, 0xab, 0x51, 0xda, 0xd8, 0x02, 0x2b, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x4c, 0x02, 0x7f, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0xfc, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xeb, 0x04, 0x7b, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x35, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x45, 0xa6, 0xa6, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0xfe, 0x00, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x03, 0xb6, 0xaa, 0xfb, 0xa0, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0xfe, 0x15, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xe3, 0x04, 0x2d, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x33, 0x03, 0x81, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0xfd, 0xcc, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xa6, 0xa6, 0x02, 0x2f, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x02, 0x52, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x64, 0xaa, 0x04, 0x60, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x03, 0x81, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0xfd, 0xcd, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xa7, 0xa1, 0x95, 0xe5, 0xd2, 0x51, 0x52, 0x02, 0x2f, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x02, 0x52, 0x64, 0x61, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x64, 0xa8, 0x04, 0x7e, 0xc3, 0xd3, 0x9c, 0x7d, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x72, 0xff, 0xe3, 0x03, 0x90, 0x04, 0x7b, 0x00, 0x19, 0x00, 0x00, 0x13, 0x3e, 0x01, 0x33, 0x32, 0x00, 0x11, 0x10, 0x00, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x72, 0x46, 0x94, 0x54, 0xe4, 0x01, 0x0c, 0xfe, 0xf1, 0xec, 0x4d, 0x91, 0x45, 0x46, 0x8e, 0x48, 0xa1, 0xb2, 0xb2, 0xa1, 0x48, 0x8e, 0x46, 0x04, 0x33, 0x24, 0x24, 0xfe, 0xc2, 0xfe, 0xf2, 0xfe, 0xee, 0xfe, 0xc6, 0x23, 0x23, 0xac, 0x2b, 0x2b, 0xe3, 0xcd, 0xcd, 0xe3, 0x2b, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0x73, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x27, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x06, 0x15, 0x23, 0x34, 0x37, 0x26, 0x27, 0x26, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x01, 0x16, 0x33, 0x32, 0x35, 0x34, 0x23, 0x22, 0x03, 0x83, 0x46, 0x8d, 0x48, 0xa2, 0xb2, 0x59, 0x06, 0x06, 0x23, 0x38, 0x42, 0x5f, 0x92, 0x43, 0x39, 0x55, 0x4b, 0x8c, 0x48, 0x41, 0x06, 0x89, 0x0a, 0x32, 0x2b, 0x86, 0x01, 0x0f, 0xeb, 0x4d, 0x92, 0xfe, 0xaf, 0x34, 0x46, 0x83, 0x77, 0x5b, 0x04, 0x35, 0xac, 0x2b, 0x2b, 0xe3, 0xcd, 0xcd, 0x72, 0x08, 0x06, 0x51, 0x2c, 0x33, 0x48, 0x3d, 0x59, 0x7d, 0x2f, 0x29, 0x11, 0x39, 0x44, 0x68, 0x51, 0x23, 0x33, 0xa1, 0x01, 0x0c, 0x01, 0x12, 0x01, 0x3a, 0x23, 0xfc, 0x3a, 0x13, 0x39, 0x4b, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0xba, 0x06, 0x14, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x01, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x11, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x04, 0xba, 0x3f, 0xa3, 0x93, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xa6, 0x44, 0x5f, 0x2c, 0xfc, 0x57, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0xfe, 0x56, 0xc0, 0xd6, 0xbc, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0x64, 0x02, 0x5e, 0xf9, 0xd8, 0x99, 0x61, 0x03, 0x3d, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x05, 0x27, 0x06, 0x14, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x01, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x45, 0x93, 0xa3, 0xab, 0x98, 0x5f, 0x44, 0xa6, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0xfe, 0x00, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x03, 0xb6, 0xc8, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xfb, 0x82, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0xfe, 0x15, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x00, 0x19, 0x00, 0x22, 0x00, 0x00, 0x13, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x21, 0x37, 0x05, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x66, 0x76, 0x76, 0xcc, 0xe3, 0x85, 0x86, 0x8d, 0x8d, 0xf1, 0x60, 0xbb, 0x5a, 0x59, 0x5a, 0x59, 0x5f, 0xa5, 0x5c, 0x5c, 0x0b, 0xfd, 0x07, 0xa5, 0x02, 0x4f, 0x0d, 0x54, 0x52, 0x8b, 0x7a, 0x4a, 0x4b, 0x02, 0x5e, 0xfa, 0x92, 0x91, 0xa1, 0xa2, 0xfe, 0xed, 0xfe, 0xf6, 0x9c, 0x9c, 0x2c, 0x2a, 0xae, 0x34, 0x1a, 0x1a, 0x63, 0x64, 0xbe, 0x90, 0x01, 0x9e, 0x57, 0x57, 0x5a, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x35, 0x21, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x00, 0x11, 0x10, 0x00, 0x23, 0x22, 0x02, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x66, 0x02, 0xf9, 0x0b, 0xb8, 0xa5, 0x5f, 0xb3, 0x59, 0x5a, 0xbb, 0x60, 0xf1, 0x01, 0x1a, 0xfe, 0xf5, 0xe3, 0xcc, 0xec, 0xa5, 0x02, 0x95, 0x7a, 0x8b, 0xa6, 0x0d, 0x02, 0x00, 0x5a, 0xbe, 0xc7, 0x34, 0x34, 0xae, 0x2a, 0x2c, 0xfe, 0xc8, 0xfe, 0xf6, 0xfe, 0xed, 0xfe, 0xbd, 0x01, 0x23, 0xc4, 0x97, 0xb4, 0xae, 0x9e, 0x00, 0x02, 0x00, 0x6f, 0xff, 0xe3, 0x05, 0xde, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x34, 0x00, 0x00, 0x25, 0x36, 0x27, 0x36, 0x27, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x01, 0x16, 0x15, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x26, 0x27, 0x26, 0x07, 0x06, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x37, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x02, 0xf9, 0x5c, 0x02, 0x01, 0x09, 0xfd, 0xd5, 0x1b, 0x1d, 0x4a, 0x7a, 0x97, 0x01, 0x3d, 0x1c, 0x86, 0x85, 0xe3, 0xcd, 0x75, 0x54, 0x18, 0x02, 0xb1, 0x11, 0x18, 0x44, 0xbd, 0x61, 0x57, 0x5a, 0x59, 0x5a, 0xbb, 0x60, 0xf1, 0x8d, 0x20, 0x18, 0xb7, 0xa6, 0x22, 0x22, 0x5e, 0x27, 0x39, 0x9d, 0x4f, 0x4a, 0xd6, 0x8a, 0xcf, 0x3e, 0x38, 0xfe, 0x9c, 0x45, 0x23, 0x5a, 0x02, 0x90, 0x60, 0x76, 0xfe, 0xed, 0xa2, 0xa1, 0x91, 0x67, 0x9c, 0x01, 0xbb, 0x27, 0x23, 0x64, 0x01, 0x01, 0x19, 0x1a, 0x34, 0xae, 0x2a, 0x2c, 0x9c, 0x23, 0x29, 0x75, 0x94, 0x99, 0x31, 0x30, 0x9c, 0x60, 0x5a, 0xc8, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x04, 0x7c, 0x12, 0x06, 0x03, 0x49, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x04, 0x7c, 0x12, 0x06, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0xff, 0xe3, 0x05, 0x8d, 0x04, 0x7c, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x37, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x05, 0x06, 0x02, 0x7b, 0x70, 0x7c, 0xe8, 0xd6, 0x48, 0x4d, 0x4b, 0x51, 0x40, 0x4c, 0x4d, 0x53, 0x88, 0x4d, 0x4b, 0x46, 0x41, 0x7b, 0x85, 0x8b, 0x69, 0x3c, 0x3d, 0x3f, 0x3e, 0x6b, 0x40, 0x49, 0x48, 0x57, 0x58, 0x99, 0x45, 0xb0, 0x66, 0x55, 0x0e, 0xd4, 0xa6, 0x22, 0x22, 0x5f, 0x26, 0x39, 0x9d, 0x4f, 0x4a, 0xfe, 0xfd, 0x3a, 0x02, 0x5c, 0x18, 0x92, 0x6c, 0xad, 0xb6, 0x0e, 0x0e, 0x1c, 0xab, 0x25, 0x13, 0x12, 0x38, 0x38, 0x5a, 0x58, 0x38, 0x33, 0x98, 0x2c, 0x2d, 0x46, 0x40, 0x2e, 0x2e, 0x0d, 0x0d, 0x1d, 0xa7, 0x18, 0x18, 0x4e, 0x42, 0x6a, 0x86, 0x94, 0x99, 0x31, 0x30, 0x9c, 0x60, 0x5a, 0xc8, 0xa6, 0x46, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x4b, 0x04, 0x7c, 0x00, 0x1a, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x20, 0x00, 0x11, 0x10, 0x37, 0x36, 0x02, 0xa6, 0xe2, 0x57, 0x59, 0x59, 0x5e, 0xbd, 0x88, 0x4c, 0x4c, 0x46, 0x41, 0x7b, 0x86, 0x8c, 0x68, 0x3d, 0x3d, 0x3f, 0x3e, 0x5e, 0xb1, 0x65, 0x67, 0x36, 0x36, 0x65, 0x70, 0x7c, 0xe8, 0xd7, 0xfe, 0xe6, 0xfe, 0xf4, 0x87, 0x88, 0x03, 0xdc, 0x6e, 0x72, 0xcd, 0xd0, 0x6f, 0x74, 0x38, 0x38, 0x5a, 0x58, 0x38, 0x33, 0x98, 0x2c, 0x2d, 0x46, 0x40, 0x2e, 0x2e, 0xa0, 0x4e, 0x4f, 0x8d, 0x5d, 0x40, 0x41, 0x18, 0x18, 0x92, 0x6c, 0xad, 0xb6, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x9d, 0x9e, 0x00, 0x01, 0xff, 0xde, 0xfe, 0x56, 0x01, 0xe6, 0x04, 0x60, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0xae, 0xa5, 0x93, 0x93, 0x92, 0xa3, 0x3f, 0x2c, 0x5e, 0x45, 0xa3, 0xa3, 0x04, 0x60, 0xfe, 0x08, 0xa4, 0xfe, 0x28, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x01, 0xd8, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x05, 0x26, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x30, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x17, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x03, 0x45, 0x95, 0x86, 0x85, 0x94, 0x94, 0x85, 0x86, 0x95, 0xa6, 0xe5, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0x33, 0xa0, 0x70, 0xba, 0xe2, 0xe2, 0xba, 0x70, 0xa0, 0x33, 0x93, 0xa3, 0xab, 0x98, 0x5f, 0x44, 0x02, 0x3d, 0xc8, 0xdc, 0xdc, 0xc8, 0xc7, 0xdc, 0xdc, 0xeb, 0xfe, 0xe2, 0xfe, 0xe9, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0xbd, 0xbf, 0x5b, 0x63, 0x62, 0x01, 0x3a, 0x01, 0x03, 0x01, 0x04, 0x01, 0x3a, 0x62, 0x63, 0xc8, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x04, 0x60, 0x00, 0x0a, 0x00, 0x23, 0x00, 0x00, 0x01, 0x11, 0x21, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x17, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x34, 0x12, 0x33, 0x21, 0x03, 0x45, 0xfe, 0xcc, 0x79, 0x87, 0x94, 0x85, 0x86, 0x95, 0xa6, 0xe5, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0x33, 0xa0, 0x70, 0xba, 0xe2, 0xe2, 0xba, 0x01, 0xe9, 0x02, 0x3d, 0x01, 0x88, 0xcd, 0xbb, 0xc7, 0xdc, 0xdc, 0xeb, 0xfe, 0xe2, 0xfe, 0xe9, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0xbd, 0xbf, 0x5b, 0x63, 0x62, 0x01, 0x3a, 0x01, 0x03, 0xf9, 0x01, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xe1, 0x04, 0x7b, 0x00, 0x1d, 0x00, 0x00, 0x25, 0x11, 0x23, 0x35, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x4b, 0x8b, 0x01, 0x21, 0x5b, 0xc2, 0x6e, 0xe4, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x5e, 0xb1, 0x54, 0x55, 0xad, 0x59, 0xa2, 0xb2, 0xb2, 0xa2, 0x47, 0x6f, 0x9e, 0x01, 0x11, 0x8c, 0xfd, 0xf0, 0x24, 0x24, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x3a, 0x37, 0x37, 0xaa, 0x3e, 0x3e, 0xe3, 0xcd, 0xcd, 0xe3, 0x0f, 0x00, 0x02, 0x00, 0x56, 0xfe, 0x52, 0x03, 0xf4, 0x04, 0x60, 0x00, 0x13, 0x00, 0x23, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x33, 0x01, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x02, 0x25, 0x01, 0x22, 0xad, 0xfe, 0x88, 0x5f, 0x23, 0x35, 0x87, 0x87, 0x87, 0x87, 0x35, 0x23, 0x5f, 0xfe, 0x88, 0xad, 0x01, 0x22, 0x3c, 0x1c, 0x19, 0x19, 0x24, 0x34, 0x34, 0x24, 0x19, 0x19, 0x1c, 0x01, 0xe8, 0x02, 0x78, 0xfc, 0xdc, 0xb1, 0x53, 0x80, 0x63, 0x81, 0x82, 0x82, 0x81, 0x63, 0x80, 0x53, 0xb1, 0x03, 0x24, 0xfa, 0x8e, 0x1b, 0x18, 0x2d, 0x45, 0x49, 0x64, 0x63, 0x63, 0x64, 0x49, 0x45, 0x2d, 0x18, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x56, 0xff, 0xe3, 0x03, 0xf4, 0x04, 0x60, 0x00, 0x13, 0x00, 0x23, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x33, 0x01, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x02, 0x25, 0x01, 0x0b, 0xc4, 0xfe, 0x99, 0x41, 0x27, 0x3e, 0x87, 0x87, 0x87, 0x87, 0x3e, 0x27, 0x41, 0xfe, 0x99, 0xc4, 0x01, 0x0b, 0x3c, 0x1c, 0x19, 0x23, 0x1c, 0x32, 0x32, 0x1c, 0x23, 0x19, 0x1c, 0x02, 0xd1, 0x01, 0x8f, 0xfd, 0xea, 0x62, 0x4c, 0x78, 0x3e, 0x82, 0x81, 0x81, 0x82, 0x3e, 0x78, 0x4c, 0x62, 0x02, 0x16, 0xfc, 0x1f, 0x1b, 0x18, 0x2d, 0x21, 0x40, 0x32, 0x46, 0x46, 0x32, 0x40, 0x21, 0x2d, 0x18, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9c, 0xfe, 0x56, 0x03, 0xe9, 0x04, 0x60, 0x00, 0x13, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x9d, 0xa5, 0x70, 0x6f, 0x87, 0x9b, 0xa6, 0xa6, 0x3c, 0x9f, 0x6a, 0xad, 0xb4, 0x01, 0xba, 0x02, 0xa6, 0xfd, 0x61, 0x9f, 0x9f, 0xbe, 0xa4, 0x02, 0x7b, 0xf9, 0xf6, 0x02, 0x56, 0x66, 0x63, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xf4, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0x93, 0xa3, 0xe5, 0xd0, 0x5f, 0x45, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x7e, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xcc, 0x65, 0x64, 0xef, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x14, 0x00, 0x21, 0x00, 0x00, 0x01, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x10, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x36, 0x33, 0x32, 0x16, 0x03, 0xf4, 0x93, 0xa3, 0xe5, 0xd2, 0x5f, 0x44, 0xdf, 0x86, 0x9b, 0xa7, 0x93, 0xa3, 0xe5, 0xd0, 0x5f, 0x45, 0x76, 0xd0, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0x48, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x02, 0xb2, 0x01, 0x3d, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x7e, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xcc, 0xc9, 0xef, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x01, 0xe8, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x15, 0x23, 0xaf, 0xa5, 0x94, 0x94, 0xa5, 0xa2, 0xa2, 0xa5, 0xa5, 0x04, 0x60, 0xfe, 0x08, 0xa4, 0xfe, 0x3c, 0x01, 0xc4, 0xa4, 0x03, 0xac, 0xe9, 0x00, 0x00, 0xff, 0xff, 0x00, 0x95, 0x00, 0x00, 0x02, 0x30, 0x04, 0x60, 0x10, 0x06, 0x03, 0x4d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x68, 0x00, 0x00, 0x02, 0x44, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x68, 0x01, 0xdc, 0x98, 0x98, 0xfe, 0x24, 0x9f, 0x03, 0xbc, 0xa4, 0xa4, 0xfc, 0xe8, 0xa4, 0xa4, 0x03, 0x18, 0x00, 0x01, 0x00, 0x43, 0x00, 0x00, 0x02, 0x96, 0x06, 0x14, 0x00, 0x23, 0x00, 0x00, 0x01, 0x33, 0x11, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x01, 0x1d, 0xa6, 0x01, 0x02, 0x0f, 0x0c, 0x22, 0x10, 0x10, 0x02, 0x71, 0x02, 0x2e, 0x2e, 0x52, 0x12, 0x11, 0xa6, 0x05, 0x05, 0x0f, 0x0c, 0x22, 0x10, 0x10, 0x02, 0x70, 0x01, 0x2e, 0x2e, 0x52, 0x16, 0x14, 0x06, 0x14, 0xfc, 0xed, 0x01, 0x01, 0x09, 0x25, 0x24, 0x52, 0x87, 0x49, 0x4a, 0x04, 0xfd, 0x85, 0x03, 0x02, 0x04, 0x03, 0x09, 0x25, 0x24, 0x52, 0x87, 0x49, 0x4a, 0x06, 0x00, 0x02, 0x00, 0x45, 0x00, 0x00, 0x02, 0xff, 0x06, 0x14, 0x00, 0x11, 0x00, 0x18, 0x00, 0x00, 0x01, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x34, 0x27, 0x23, 0x22, 0x37, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x14, 0x33, 0x01, 0x78, 0xa6, 0xe1, 0xe1, 0xa6, 0x01, 0x37, 0xfc, 0x01, 0x01, 0xdd, 0x30, 0x25, 0x0e, 0x15, 0x31, 0x46, 0x01, 0x53, 0x06, 0x14, 0xfc, 0xfe, 0xa0, 0xfd, 0x8e, 0x02, 0x54, 0x0f, 0x0f, 0xbd, 0xf6, 0x19, 0xfa, 0x84, 0x4b, 0x39, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x56, 0x02, 0x23, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x01, 0x53, 0x37, 0x6c, 0x2c, 0x3f, 0xac, 0x89, 0x06, 0x14, 0xf9, 0xce, 0x7c, 0x74, 0x9c, 0xcc, 0xca, 0x06, 0x28, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x4c, 0x04, 0xb1, 0x06, 0x14, 0x00, 0x24, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x02, 0xf0, 0x5e, 0x74, 0x59, 0x4d, 0x49, 0xfe, 0xee, 0xfc, 0x55, 0x59, 0x5a, 0x5f, 0x4c, 0xb4, 0x62, 0xaa, 0x5a, 0x5a, 0x53, 0x52, 0x96, 0x9d, 0x01, 0x83, 0xfd, 0xac, 0xa5, 0xa5, 0x03, 0x0e, 0x01, 0xdc, 0x38, 0x2b, 0x6c, 0x68, 0x8a, 0xdd, 0xf2, 0x12, 0x13, 0x25, 0xc3, 0x31, 0x32, 0x4b, 0x4b, 0x8f, 0x84, 0x4b, 0x4a, 0xa6, 0x01, 0xf3, 0xfc, 0x33, 0x06, 0x14, 0xfe, 0x4c, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0xe6, 0x06, 0x67, 0x04, 0x62, 0x00, 0x26, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x03, 0x50, 0x3d, 0x58, 0x56, 0x75, 0x9e, 0xab, 0xa7, 0x66, 0x6a, 0x80, 0x4b, 0x4b, 0xa6, 0x67, 0x6b, 0x7f, 0x95, 0xa7, 0xa7, 0x37, 0x51, 0x4f, 0x6d, 0x6d, 0x4e, 0x4c, 0xd8, 0x79, 0x3d, 0x3c, 0xf6, 0xe2, 0x02, 0xa4, 0xfd, 0x62, 0xa2, 0x9c, 0x60, 0x5e, 0xa4, 0x02, 0x7a, 0xfd, 0x62, 0xa2, 0x9c, 0xc0, 0xa2, 0x02, 0x7a, 0xfb, 0x9e, 0xb0, 0x65, 0x33, 0x32, 0x3e, 0x3e, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x06, 0x67, 0x04, 0x62, 0x00, 0x26, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x03, 0x50, 0x3d, 0x58, 0x56, 0x75, 0x9e, 0xab, 0xa7, 0x66, 0x6a, 0x80, 0x4b, 0x4b, 0xa6, 0x67, 0x6b, 0x7f, 0x95, 0xa7, 0xa7, 0x37, 0x51, 0x4f, 0x6d, 0x6d, 0x4e, 0x4c, 0xd8, 0x79, 0x3d, 0x3c, 0xf6, 0xe2, 0x02, 0xa4, 0xfd, 0x62, 0xa2, 0x9c, 0x60, 0x5e, 0xa4, 0x02, 0x7a, 0xfd, 0x62, 0xa2, 0x9c, 0xc0, 0xa2, 0x02, 0x7a, 0xf9, 0xf4, 0x02, 0x5a, 0x65, 0x33, 0x32, 0x3e, 0x3e, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x06, 0x67, 0x04, 0x7b, 0x00, 0x30, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x03, 0xbe, 0x3f, 0xac, 0x75, 0x9e, 0x55, 0x56, 0x4a, 0x49, 0xa3, 0xe4, 0xd1, 0x5f, 0x22, 0x22, 0x01, 0x66, 0x6a, 0x80, 0x96, 0xa6, 0x33, 0x34, 0x6b, 0x7f, 0x4a, 0x4b, 0xa7, 0xa7, 0x39, 0x9e, 0x6d, 0x6e, 0x4c, 0x4e, 0x03, 0x89, 0x7c, 0x76, 0x7b, 0x7a, 0xe2, 0xfd, 0x48, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x31, 0x99, 0x02, 0xb2, 0xa1, 0x9c, 0xbe, 0xa4, 0xfd, 0x87, 0x02, 0x9e, 0xa2, 0x4e, 0x4d, 0x5f, 0x60, 0xa3, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x67, 0x62, 0x3e, 0x3e, 0x00, 0x01, 0xff, 0xde, 0xfe, 0x56, 0x03, 0xfa, 0x04, 0x7b, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xfa, 0xa6, 0x6f, 0x70, 0x86, 0x9c, 0x92, 0xa3, 0x3f, 0x2c, 0x5e, 0x45, 0xa6, 0x3c, 0xa1, 0x69, 0xae, 0xb2, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x73, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x04, 0x74, 0xae, 0x65, 0x64, 0xef, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0xc3, 0x04, 0x7b, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x26, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x03, 0x98, 0x4a, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x22, 0x22, 0x5e, 0x2d, 0x3f, 0xa3, 0xfe, 0xb6, 0x60, 0xd6, 0x02, 0xb2, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x65, 0x64, 0xef, 0xe8, 0xfd, 0x48, 0x99, 0x31, 0x30, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa1, 0x00, 0x00, 0x03, 0xf4, 0x04, 0x60, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x23, 0x01, 0x11, 0x23, 0xa1, 0xf5, 0x01, 0xad, 0xb1, 0xf5, 0xfe, 0x53, 0xb1, 0x04, 0x60, 0xfc, 0x79, 0x03, 0x87, 0xfb, 0xa0, 0x03, 0x6c, 0xfc, 0x94, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x00, 0x01, 0x22, 0x06, 0x07, 0x21, 0x2e, 0x01, 0x03, 0x32, 0x36, 0x35, 0x21, 0x14, 0x16, 0x13, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x02, 0x32, 0x84, 0x86, 0x10, 0x02, 0x35, 0x10, 0x86, 0x84, 0x87, 0x97, 0xfd, 0xc5, 0x97, 0x87, 0xd8, 0xf7, 0xf7, 0xd8, 0xd9, 0xf5, 0xf5, 0x03, 0xdf, 0xc1, 0x7f, 0x7f, 0xc1, 0xfc, 0xa0, 0xe8, 0x94, 0x94, 0xe8, 0x03, 0xfc, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x01, 0x39, 0x01, 0x13, 0x01, 0x14, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x05, 0x87, 0x04, 0x60, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x20, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x21, 0x17, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x05, 0x7a, 0xfe, 0x0c, 0x01, 0xe0, 0xfe, 0x20, 0x02, 0x01, 0xfd, 0x31, 0xfe, 0xdb, 0x96, 0x97, 0x97, 0x96, 0x01, 0x25, 0x26, 0x22, 0xd8, 0x6c, 0x6c, 0x6c, 0x6c, 0xd8, 0x22, 0x04, 0x60, 0x9a, 0xfe, 0xdd, 0x9b, 0xfe, 0x94, 0x9c, 0x8e, 0x8f, 0x01, 0x14, 0x01, 0x12, 0x8e, 0x8f, 0x82, 0x6c, 0x6b, 0xd8, 0xd9, 0x6c, 0x6d, 0x00, 0x00, 0x02, 0x00, 0x85, 0xff, 0xdc, 0x04, 0xb8, 0x04, 0x7c, 0x00, 0x13, 0x00, 0x24, 0x00, 0x00, 0x01, 0x15, 0x14, 0x16, 0x32, 0x37, 0x36, 0x35, 0x10, 0x02, 0x20, 0x02, 0x11, 0x14, 0x17, 0x16, 0x32, 0x36, 0x3d, 0x01, 0x05, 0x10, 0x00, 0x20, 0x00, 0x11, 0x14, 0x06, 0x07, 0x06, 0x22, 0x26, 0x27, 0x0e, 0x01, 0x22, 0x26, 0x02, 0xf4, 0x56, 0x61, 0x22, 0x42, 0xbc, 0xfe, 0x97, 0xb6, 0x42, 0x22, 0x60, 0x56, 0xfe, 0x37, 0x01, 0x22, 0x01, 0xec, 0x01, 0x25, 0x34, 0x2a, 0x57, 0xc2, 0x91, 0x0b, 0x10, 0x8e, 0xc0, 0xc2, 0x02, 0x94, 0xc4, 0xa3, 0xb5, 0x30, 0x5b, 0x9d, 0x01, 0x0f, 0x01, 0x31, 0xfe, 0xd0, 0xfe, 0xf0, 0x9d, 0x5b, 0x30, 0xb5, 0xa3, 0xc4, 0xc8, 0x01, 0x54, 0x01, 0x5c, 0xfe, 0xa4, 0xfe, 0x80, 0x6c, 0xb2, 0x36, 0x70, 0xa3, 0x75, 0x79, 0x9f, 0xed, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x64, 0xfe, 0x56, 0x04, 0x56, 0x06, 0x14, 0x12, 0x06, 0x03, 0x69, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe5, 0x02, 0x4f, 0x04, 0x60, 0x00, 0x0e, 0x00, 0x00, 0x25, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x01, 0xa8, 0x67, 0xec, 0x22, 0x32, 0x01, 0x36, 0x4f, 0x8d, 0x96, 0xa6, 0xa6, 0xae, 0xc9, 0x0a, 0xbd, 0x23, 0xcb, 0xbe, 0x02, 0x4e, 0xfb, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe5, 0x02, 0x4f, 0x06, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x25, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x01, 0xa8, 0x67, 0xec, 0x22, 0x32, 0x01, 0x36, 0x4f, 0x8f, 0x94, 0xa6, 0xa6, 0xae, 0xc9, 0x0a, 0xbd, 0x23, 0xce, 0xbb, 0x03, 0xf8, 0xf9, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x56, 0x03, 0x1e, 0x04, 0x60, 0x00, 0x16, 0x00, 0x00, 0x25, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x01, 0xa8, 0x67, 0xec, 0x22, 0x32, 0x01, 0x36, 0x4f, 0x8d, 0x96, 0xa6, 0x45, 0x5e, 0x2c, 0x3f, 0xa2, 0x93, 0xae, 0xc9, 0x0a, 0xbd, 0x23, 0xcb, 0xbe, 0x02, 0x4e, 0xfb, 0x8c, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x58, 0x02, 0xf6, 0x04, 0x7b, 0x00, 0x11, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x02, 0xf6, 0x1c, 0x42, 0x27, 0x8d, 0x96, 0xa7, 0xa7, 0x34, 0xa8, 0x77, 0x11, 0x2a, 0x19, 0x03, 0xb4, 0x12, 0x11, 0xcb, 0xbe, 0xfc, 0x0a, 0x06, 0x08, 0xae, 0x66, 0x63, 0x05, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x02, 0xf6, 0x04, 0x7b, 0x00, 0x19, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x02, 0xf6, 0x1c, 0x42, 0x27, 0x8e, 0x96, 0x44, 0x5f, 0xd2, 0xe5, 0xa3, 0x93, 0xa7, 0x34, 0xa8, 0x77, 0x11, 0x2a, 0x19, 0x03, 0xb4, 0x12, 0x11, 0xcb, 0xbe, 0xfd, 0x9e, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0x04, 0x74, 0xae, 0x66, 0x63, 0x05, 0x05, 0x00, 0x01, 0x00, 0x76, 0x00, 0x00, 0x03, 0x25, 0x04, 0x7b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x01, 0xb0, 0x94, 0xfe, 0x33, 0x93, 0x93, 0xa3, 0xe5, 0xd2, 0x5f, 0x44, 0x02, 0xe5, 0xfd, 0xbf, 0xa4, 0xa4, 0x02, 0x41, 0xd6, 0xc0, 0x9c, 0x61, 0x00, 0x00, 0x00, 0x01, 0x00, 0x68, 0x00, 0x00, 0x03, 0x25, 0x04, 0x7b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x02, 0x83, 0xa2, 0xfe, 0x24, 0x94, 0x44, 0x5f, 0xd2, 0xe5, 0xa3, 0x93, 0x02, 0xe5, 0xfd, 0xbf, 0xa4, 0xa4, 0x02, 0x41, 0x99, 0x61, 0x9c, 0xc0, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x22, 0x04, 0x60, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x17, 0x13, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x02, 0xc5, 0x2b, 0x68, 0x2d, 0x9d, 0xb0, 0x92, 0x42, 0x6f, 0x49, 0x98, 0xa7, 0x01, 0x5e, 0xc4, 0xc0, 0x64, 0xfe, 0x29, 0xb2, 0x6b, 0x73, 0x6a, 0x74, 0x02, 0x0d, 0x0a, 0x74, 0x5d, 0xfe, 0xce, 0x01, 0x1f, 0x80, 0x3a, 0xfe, 0x27, 0x04, 0x60, 0x9e, 0xa5, 0x69, 0x8c, 0x01, 0x9d, 0xfe, 0xaf, 0x56, 0x4e, 0x4d, 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x22, 0x04, 0x60, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x32, 0x36, 0x37, 0x13, 0x33, 0x03, 0x0e, 0x01, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x13, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0xa7, 0xa7, 0x98, 0x49, 0x6f, 0x42, 0x92, 0xb0, 0x9d, 0x2d, 0x68, 0x2b, 0x60, 0x64, 0xc0, 0xc4, 0xfe, 0xa2, 0xa7, 0xb2, 0x74, 0x6a, 0x73, 0x6b, 0x04, 0x60, 0xfe, 0x27, 0x3a, 0x80, 0x01, 0x1f, 0xfe, 0xce, 0x5d, 0x74, 0x0a, 0x1b, 0x8c, 0x69, 0xa5, 0x9e, 0x01, 0xec, 0xfe, 0xaf, 0x60, 0x4d, 0x4e, 0x56, 0x00, 0x00, 0x01, 0x00, 0x63, 0xfe, 0x56, 0x03, 0x67, 0x04, 0x7b, 0x00, 0x30, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0x30, 0x46, 0x97, 0x51, 0x7b, 0x7c, 0x59, 0x85, 0x38, 0xb1, 0x94, 0xde, 0xc2, 0x5b, 0x4f, 0x12, 0x44, 0x5e, 0xd2, 0xe4, 0xa3, 0x93, 0xb7, 0xae, 0x75, 0x7e, 0x5b, 0x9a, 0x39, 0x9a, 0x89, 0xca, 0xb9, 0x5c, 0xa2, 0x04, 0x3f, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0e, 0x2a, 0x99, 0x89, 0x9c, 0xb6, 0x11, 0x04, 0x0c, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0xfb, 0x6a, 0x59, 0x51, 0x4b, 0x50, 0x25, 0x0f, 0x24, 0x95, 0x82, 0x9e, 0xac, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xdc, 0xfe, 0x56, 0x02, 0x8f, 0x06, 0x14, 0x00, 0x13, 0x00, 0x00, 0x17, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0xab, 0x9d, 0xaa, 0x9c, 0x9e, 0x59, 0x45, 0x93, 0xa3, 0x3f, 0x2c, 0x5f, 0x43, 0x14, 0x04, 0xc2, 0xbb, 0xab, 0x99, 0x50, 0x68, 0xfb, 0x29, 0xd6, 0xc0, 0x9c, 0x61, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xdc, 0xfe, 0x56, 0x02, 0x8f, 0x06, 0x14, 0x00, 0x20, 0x00, 0x00, 0x13, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x23, 0x35, 0xab, 0x9d, 0xaa, 0x9c, 0x9e, 0x59, 0x45, 0x92, 0x92, 0x93, 0xa3, 0x3f, 0x2c, 0x5f, 0x43, 0xa2, 0xa2, 0x9e, 0x04, 0x60, 0x4e, 0xbb, 0xab, 0x99, 0x50, 0x68, 0xfd, 0xa8, 0x03, 0xa4, 0xfe, 0x28, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0x01, 0xd8, 0xa4, 0x01, 0x69, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0xfe, 0x56, 0x02, 0xe3, 0x04, 0x65, 0x00, 0x13, 0x00, 0x00, 0x05, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x01, 0x6e, 0x45, 0x59, 0x9e, 0x9c, 0xaa, 0x9d, 0x43, 0x5f, 0x2c, 0x3f, 0xa3, 0x93, 0x14, 0x03, 0x28, 0x68, 0x50, 0x99, 0xab, 0xbb, 0xfc, 0xed, 0x99, 0x61, 0x9c, 0xc0, 0x00, 0x00, 0x00, 0x02, 0xff, 0x0d, 0xfe, 0x56, 0x02, 0x8f, 0x06, 0x14, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x00, 0x21, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x23, 0x20, 0x35, 0x34, 0x3b, 0x01, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x03, 0x23, 0x22, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x52, 0xa4, 0xac, 0x10, 0x30, 0x49, 0xa3, 0xfe, 0xef, 0xf3, 0xab, 0x9d, 0xaa, 0x9c, 0x9e, 0x59, 0x45, 0xb0, 0xa1, 0x6b, 0x02, 0x03, 0x70, 0x63, 0x1e, 0x0e, 0x9b, 0x6f, 0x40, 0x60, 0xd8, 0xd2, 0x04, 0xae, 0xbb, 0xab, 0x99, 0x50, 0x68, 0xfa, 0xa3, 0x33, 0x41, 0x30, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0xfe, 0xc0, 0x02, 0xa7, 0x04, 0x5e, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x15, 0x11, 0x33, 0x15, 0x23, 0x11, 0x01, 0x87, 0xfe, 0xab, 0x01, 0x55, 0x44, 0x67, 0xaa, 0xaa, 0xbf, 0x92, 0x7a, 0x7a, 0xfe, 0xc0, 0x01, 0x3e, 0x8f, 0x02, 0x60, 0x89, 0x4e, 0x9a, 0x9f, 0xd2, 0xfd, 0xa0, 0x8f, 0xfe, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0xfe, 0x56, 0x02, 0xab, 0x05, 0x9e, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x52, 0x01, 0x55, 0xfe, 0xab, 0x44, 0x5e, 0xb6, 0xc9, 0xa3, 0x93, 0x79, 0x79, 0x05, 0x9e, 0xfe, 0xc2, 0x8f, 0xfc, 0x1b, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0x03, 0xe5, 0x8f, 0x01, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0xe3, 0x04, 0x91, 0x04, 0x60, 0x00, 0x16, 0x00, 0x1e, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x23, 0x35, 0x05, 0x21, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x9d, 0xa5, 0x02, 0x01, 0xa6, 0xa7, 0xa7, 0xa6, 0x3c, 0x9f, 0x6a, 0xad, 0xb4, 0x9d, 0x03, 0x42, 0xfe, 0x00, 0x70, 0x6f, 0x81, 0xa0, 0x02, 0x68, 0x01, 0xf8, 0xfe, 0x08, 0x01, 0xf8, 0xfe, 0x08, 0xa4, 0xfe, 0x3c, 0xac, 0x66, 0x63, 0xf0, 0xe7, 0x0a, 0xa4, 0xa5, 0x02, 0x9f, 0x9f, 0xba, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe2, 0x04, 0x11, 0x04, 0x60, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x34, 0x36, 0x37, 0x23, 0x35, 0x21, 0x15, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x37, 0x21, 0x04, 0x10, 0xd4, 0x57, 0x73, 0xff, 0x00, 0xca, 0xcb, 0xff, 0x00, 0x73, 0x57, 0xd5, 0x01, 0x8e, 0x5c, 0x7b, 0x9f, 0x81, 0x82, 0x9e, 0x7a, 0x5c, 0x01, 0x01, 0x88, 0x03, 0xbc, 0x48, 0xeb, 0x98, 0xeb, 0xfe, 0xdc, 0x01, 0x24, 0xeb, 0x98, 0xeb, 0x48, 0xa4, 0xdc, 0x42, 0xd7, 0x8b, 0x9f, 0xc2, 0xc2, 0x9f, 0x8b, 0xd7, 0x42, 0xdc, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x03, 0xed, 0x04, 0x62, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x37, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x17, 0x16, 0x03, 0xec, 0x7f, 0x83, 0xc8, 0x3f, 0xa3, 0x49, 0x49, 0xa5, 0x23, 0x24, 0x5c, 0x2e, 0x82, 0x9e, 0x42, 0x42, 0x63, 0x5d, 0x50, 0x96, 0x2e, 0x1e, 0x02, 0x0f, 0xee, 0x8f, 0x92, 0x60, 0x60, 0xd6, 0x02, 0xca, 0xfd, 0x36, 0x99, 0x31, 0x32, 0x02, 0xc4, 0x9e, 0xe8, 0x65, 0x63, 0x1e, 0x96, 0x08, 0x30, 0x5b, 0xab, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x06, 0x00, 0x00, 0x33, 0x01, 0x33, 0x01, 0x23, 0x09, 0x01, 0x37, 0x01, 0x7a, 0xe1, 0x01, 0x7a, 0xb0, 0xfe, 0xc5, 0xfe, 0xc5, 0x04, 0x60, 0xfb, 0xa0, 0x03, 0xac, 0xfc, 0x54, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x04, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x21, 0x23, 0x0b, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x05, 0x96, 0xa6, 0xce, 0xcf, 0xc3, 0xcf, 0xce, 0xa6, 0x01, 0x08, 0xc3, 0xd9, 0xda, 0xc3, 0x03, 0x6a, 0xfc, 0x96, 0x03, 0x6a, 0xfc, 0x96, 0x04, 0x60, 0xfc, 0x6a, 0x03, 0x96, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x06, 0x14, 0x00, 0x11, 0x00, 0x00, 0x33, 0x01, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x01, 0x23, 0x09, 0x01, 0x37, 0x01, 0xbb, 0x47, 0x41, 0x43, 0x70, 0x84, 0x61, 0x45, 0x25, 0x29, 0x2b, 0x1e, 0x01, 0x98, 0xb0, 0xfe, 0xc4, 0xfe, 0xc6, 0x04, 0xd2, 0xc7, 0x3e, 0x3d, 0x9a, 0x24, 0x23, 0x87, 0x5e, 0xfb, 0xb2, 0x03, 0x6c, 0xfc, 0x94, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5b, 0x00, 0x00, 0x03, 0xfa, 0x04, 0x60, 0x00, 0x08, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x01, 0x11, 0x23, 0x11, 0x5c, 0xc3, 0x01, 0x08, 0x01, 0x10, 0xc3, 0xfe, 0x87, 0xb7, 0x04, 0x60, 0xfe, 0x38, 0x01, 0xc8, 0xfd, 0x90, 0xfe, 0x10, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0x56, 0x04, 0x46, 0x04, 0x60, 0x00, 0x13, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x21, 0x35, 0x01, 0x21, 0x66, 0x03, 0x12, 0xfd, 0x92, 0x02, 0x6e, 0x45, 0x5e, 0x2b, 0x40, 0xa2, 0x93, 0xfd, 0x7e, 0x02, 0x6f, 0xfd, 0xa8, 0x04, 0x60, 0xa8, 0xfc, 0xdb, 0xa7, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0x14, 0xa8, 0x03, 0x25, 0x00, 0x02, 0x00, 0x4f, 0xff, 0x91, 0x03, 0x79, 0x04, 0x60, 0x00, 0x1a, 0x00, 0x21, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x33, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x16, 0x07, 0x06, 0x2b, 0x01, 0x06, 0x15, 0x23, 0x34, 0x37, 0x21, 0x35, 0x01, 0x21, 0x01, 0x33, 0x32, 0x35, 0x34, 0x07, 0x06, 0x66, 0x03, 0x12, 0xfd, 0x92, 0x9d, 0x1e, 0x4c, 0x3b, 0x56, 0x77, 0x34, 0x22, 0x01, 0x38, 0x49, 0x72, 0x5e, 0x03, 0x8a, 0x03, 0xfe, 0xba, 0x02, 0x6f, 0xfd, 0xa8, 0x01, 0xcc, 0x32, 0x7c, 0x3f, 0x4f, 0x04, 0x60, 0xa8, 0xfc, 0xdb, 0xa2, 0x47, 0x37, 0x57, 0x39, 0x57, 0x60, 0x2f, 0x3d, 0x33, 0x3c, 0x3b, 0x34, 0xa8, 0x03, 0x25, 0xfc, 0xc6, 0x36, 0x5d, 0x02, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0x4c, 0x03, 0xc4, 0x04, 0x60, 0x00, 0x20, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x02, 0x03, 0x5f, 0x73, 0x59, 0x4d, 0x49, 0xfe, 0xee, 0xfc, 0x54, 0x59, 0x5a, 0x60, 0x4c, 0xb4, 0x62, 0xab, 0x59, 0x5a, 0x53, 0x54, 0x94, 0x9d, 0x01, 0x83, 0xfd, 0xa8, 0x03, 0x13, 0x01, 0xdc, 0x38, 0x2a, 0x6d, 0x68, 0x8a, 0xdd, 0xf2, 0x12, 0x13, 0x25, 0xc3, 0x31, 0x32, 0x4b, 0x4b, 0x8f, 0x84, 0x4b, 0x4a, 0xa6, 0x01, 0xf3, 0x93, 0xa8, 0x00, 0x00, 0x02, 0x00, 0x62, 0xfe, 0x4c, 0x03, 0xfb, 0x04, 0x60, 0x00, 0x24, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x20, 0x37, 0x36, 0x05, 0x16, 0x17, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x23, 0x34, 0x27, 0x30, 0x07, 0x06, 0x37, 0x26, 0x23, 0x22, 0x07, 0x14, 0x33, 0x32, 0x37, 0x01, 0xb6, 0xfe, 0xd3, 0x02, 0x01, 0x01, 0x0d, 0xdd, 0x8e, 0x0b, 0x53, 0x54, 0x94, 0x9d, 0x01, 0x83, 0xfd, 0xa8, 0x03, 0x13, 0xfe, 0x8e, 0x5e, 0x74, 0x5a, 0x4c, 0x49, 0x23, 0x5a, 0x8a, 0x24, 0x12, 0x88, 0x08, 0x70, 0xb1, 0x76, 0x01, 0x8e, 0xab, 0x59, 0xfe, 0x4c, 0xbd, 0xfb, 0x05, 0x04, 0x3b, 0x2a, 0x31, 0x85, 0x4a, 0x4a, 0xa6, 0x01, 0xf3, 0x93, 0xa8, 0xfe, 0x24, 0x38, 0x2b, 0x6c, 0x67, 0x8b, 0x71, 0x55, 0x65, 0xa4, 0x52, 0x38, 0x11, 0x79, 0xfa, 0x2a, 0x4b, 0x2f, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x48, 0x06, 0x12, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x11, 0x23, 0x01, 0x32, 0x39, 0xad, 0x4d, 0x34, 0x01, 0x33, 0x59, 0xa1, 0x48, 0x47, 0x47, 0x46, 0x45, 0x48, 0x49, 0x4d, 0xf7, 0x7d, 0x62, 0x62, 0x64, 0x99, 0xb6, 0x03, 0x1e, 0x72, 0x4c, 0x62, 0x85, 0x41, 0x72, 0x16, 0x15, 0x2b, 0xac, 0x23, 0x11, 0x12, 0x9d, 0x7d, 0xba, 0xaa, 0x73, 0x77, 0x1e, 0xfd, 0x74, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x48, 0x06, 0x12, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x14, 0x17, 0x16, 0x33, 0x02, 0x64, 0xb6, 0x99, 0x65, 0x61, 0x63, 0x7c, 0xf7, 0x4d, 0x48, 0x49, 0x45, 0x46, 0x48, 0x46, 0x48, 0xa1, 0x59, 0x33, 0x01, 0x34, 0x4d, 0xad, 0x03, 0x1e, 0xfc, 0xe2, 0x02, 0x8c, 0x1e, 0x77, 0x73, 0xaa, 0xba, 0x7d, 0x9d, 0x12, 0x11, 0x23, 0xac, 0x2b, 0x15, 0x16, 0x72, 0x41, 0x85, 0x62, 0x4c, 0x72, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x48, 0x06, 0x12, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x13, 0x33, 0x11, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x34, 0x27, 0x26, 0x23, 0x01, 0x32, 0x01, 0xb6, 0x99, 0x64, 0x62, 0x62, 0x7d, 0xf7, 0x4d, 0x49, 0x48, 0x45, 0x46, 0x47, 0x47, 0x48, 0xa1, 0x59, 0x33, 0x01, 0x34, 0x4d, 0xad, 0x02, 0xf4, 0x03, 0x1e, 0xfd, 0x74, 0x1e, 0x77, 0x73, 0xaa, 0xba, 0x7d, 0x9d, 0x12, 0x11, 0x23, 0xac, 0x2b, 0x15, 0x16, 0x72, 0x41, 0x85, 0x62, 0x4c, 0x72, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0x4c, 0x03, 0x48, 0x06, 0x14, 0x00, 0x23, 0x00, 0x00, 0x13, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x4f, 0x63, 0x7c, 0xf7, 0x4d, 0x48, 0x49, 0x45, 0x42, 0x4c, 0x46, 0x48, 0x9f, 0x5b, 0x34, 0x34, 0x5c, 0x9e, 0x48, 0x46, 0x48, 0x46, 0x45, 0x49, 0x48, 0x4d, 0xf7, 0x7c, 0x63, 0x04, 0x40, 0xba, 0x7d, 0x9d, 0x12, 0x11, 0x23, 0xac, 0x28, 0x18, 0x16, 0x72, 0x41, 0x85, 0xfb, 0xe0, 0x85, 0x41, 0x72, 0x16, 0x15, 0x2b, 0xac, 0x23, 0x11, 0x12, 0x9d, 0x7d, 0xba, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x22, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x06, 0x22, 0x27, 0x26, 0x00, 0x20, 0x02, 0x11, 0x10, 0x12, 0x20, 0x12, 0x11, 0x10, 0x01, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x10, 0x00, 0x02, 0x70, 0x1e, 0x1d, 0x2b, 0x2a, 0x1e, 0x1d, 0x3b, 0x55, 0x1d, 0x1e, 0x01, 0x2c, 0xfe, 0x74, 0xe9, 0xe9, 0x01, 0x8c, 0xe8, 0xfe, 0x52, 0x01, 0x1b, 0x01, 0x52, 0xfe, 0xae, 0xfe, 0xe5, 0xfe, 0xe5, 0xfe, 0xad, 0x01, 0x53, 0x02, 0xe9, 0x2e, 0x22, 0x22, 0x22, 0x22, 0x2e, 0x2f, 0x42, 0x21, 0x21, 0x02, 0x92, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0xec, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0x9f, 0xfe, 0x5b, 0x01, 0xa4, 0x02, 0xc4, 0x01, 0xa5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xd2, 0x04, 0x60, 0x10, 0x06, 0x03, 0xc6, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x4b, 0x04, 0x7c, 0x00, 0x1a, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x20, 0x17, 0x16, 0x11, 0x10, 0x00, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x02, 0x0b, 0x6b, 0x3e, 0x3f, 0x3d, 0x3c, 0x69, 0x8b, 0x85, 0x7b, 0x41, 0x46, 0x4b, 0x4d, 0x88, 0xbd, 0x5d, 0x59, 0x59, 0x57, 0xef, 0x01, 0x3e, 0x88, 0x88, 0xfe, 0xf4, 0xfe, 0xe5, 0xd6, 0xe8, 0x7c, 0x70, 0x65, 0x36, 0x36, 0x66, 0x66, 0x03, 0xdc, 0x2e, 0x2e, 0x40, 0x46, 0x2d, 0x2c, 0x98, 0x33, 0x38, 0x58, 0x5a, 0x38, 0x38, 0x74, 0x6f, 0xd0, 0xcd, 0x72, 0x6e, 0xa0, 0x9e, 0x9d, 0xfe, 0xee, 0xfe, 0xf2, 0xfe, 0xc2, 0xb6, 0xad, 0x6c, 0x92, 0x18, 0x18, 0x41, 0x40, 0x5d, 0x8d, 0x4f, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x05, 0x37, 0x06, 0x14, 0x00, 0x27, 0x00, 0x00, 0x25, 0x11, 0x23, 0x35, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x03, 0x4b, 0x8b, 0x01, 0x21, 0x5b, 0xc2, 0x6e, 0xe4, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x32, 0x5e, 0x2c, 0x93, 0xa3, 0xe5, 0xd0, 0x5f, 0x45, 0x55, 0xad, 0x59, 0xa2, 0xb2, 0xb2, 0xa2, 0x47, 0x6f, 0x9e, 0x01, 0x11, 0x8c, 0xfd, 0xf0, 0x24, 0x24, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x3a, 0x0f, 0x0f, 0x21, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xfe, 0xe5, 0x3e, 0x3e, 0xe3, 0xcd, 0xcd, 0xe3, 0x0f, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x0e, 0x04, 0x60, 0x10, 0x06, 0x03, 0xd1, 0x00, 0x00, 0x00, 0x03, 0xff, 0x0d, 0xfe, 0x56, 0x01, 0xf7, 0x06, 0x14, 0x00, 0x03, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x15, 0x33, 0x11, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x23, 0x20, 0x35, 0x34, 0x3b, 0x01, 0x07, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0xae, 0xa5, 0xa5, 0xa5, 0xa3, 0xaa, 0x10, 0x32, 0x43, 0xa9, 0xfe, 0xef, 0xf3, 0xae, 0x08, 0xa5, 0x69, 0x73, 0x56, 0x26, 0x1a, 0x06, 0x14, 0xe9, 0xcb, 0xfb, 0xa0, 0x8b, 0x78, 0x47, 0x60, 0xdd, 0xcd, 0x8b, 0x42, 0x41, 0x30, 0x20, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x4c, 0x04, 0x26, 0x04, 0x60, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x23, 0x11, 0x01, 0x23, 0x09, 0x01, 0x33, 0x01, 0x11, 0x33, 0x04, 0x26, 0xa6, 0xfe, 0x11, 0xd3, 0x02, 0x16, 0xfd, 0xd3, 0xd8, 0x02, 0x01, 0xa6, 0xfe, 0x4c, 0x03, 0x97, 0xfe, 0x1d, 0x02, 0x0c, 0x02, 0x54, 0xfd, 0xdd, 0x02, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x8d, 0x04, 0x60, 0x00, 0x05, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x15, 0x21, 0xa7, 0xa6, 0x02, 0x3f, 0xfd, 0x1b, 0x04, 0x60, 0xfc, 0x33, 0x93, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x05, 0x60, 0x06, 0x12, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x01, 0x11, 0x96, 0x83, 0x84, 0x97, 0x97, 0x84, 0x83, 0x96, 0x02, 0x34, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0x93, 0xa3, 0xe4, 0xd0, 0x5e, 0x45, 0xa7, 0x02, 0x2f, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0xfd, 0xae, 0x64, 0x61, 0x01, 0x44, 0x01, 0x08, 0x01, 0x08, 0x01, 0x44, 0x61, 0x64, 0xc6, 0xd6, 0xc0, 0x9c, 0x61, 0x99, 0xf9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x48, 0x06, 0x12, 0x00, 0x24, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x01, 0x32, 0x39, 0xac, 0x4e, 0x34, 0x01, 0x33, 0x59, 0xa1, 0x48, 0x47, 0x47, 0x46, 0x45, 0x48, 0x49, 0x4d, 0xf7, 0x7d, 0x62, 0x62, 0x64, 0x99, 0xd0, 0xd0, 0xb6, 0xce, 0xcd, 0x03, 0x1e, 0x72, 0x4c, 0x62, 0x85, 0x41, 0x72, 0x16, 0x15, 0x2b, 0xac, 0x23, 0x11, 0x12, 0x9d, 0x7d, 0xba, 0xaa, 0x73, 0x77, 0x1e, 0xd4, 0xa4, 0xfe, 0xec, 0x01, 0x14, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x48, 0x06, 0x12, 0x00, 0x24, 0x00, 0x00, 0x13, 0x35, 0x33, 0x35, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0xde, 0xd0, 0x99, 0x65, 0x61, 0x63, 0x7c, 0xf7, 0x4d, 0x48, 0x49, 0x45, 0x47, 0x47, 0x46, 0x48, 0xa1, 0x59, 0x33, 0x01, 0x34, 0x4d, 0xad, 0x38, 0xce, 0xce, 0xb6, 0x01, 0x14, 0xa4, 0xd4, 0x1e, 0x77, 0x73, 0xaa, 0xba, 0x7d, 0x9d, 0x12, 0x11, 0x23, 0xac, 0x2b, 0x15, 0x16, 0x72, 0x41, 0x85, 0x62, 0x4c, 0x72, 0xfe, 0x9a, 0xa4, 0xfe, 0xec, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x06, 0xfd, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x29, 0x00, 0x00, 0x00, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x10, 0x27, 0x26, 0x20, 0x07, 0x25, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x2b, 0x01, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x11, 0x01, 0x01, 0x11, 0x4a, 0x4c, 0x01, 0x07, 0x4b, 0x4c, 0x4c, 0x4b, 0xfe, 0xf9, 0x4c, 0x01, 0xea, 0xa6, 0x03, 0x11, 0xfd, 0x92, 0x02, 0x6e, 0xfc, 0xef, 0x18, 0x8e, 0x34, 0x4f, 0x50, 0x70, 0xb7, 0x73, 0x72, 0x72, 0x73, 0xb7, 0x70, 0x50, 0x4f, 0xda, 0x02, 0x57, 0x02, 0xfa, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0x74, 0x01, 0x96, 0x74, 0x73, 0x73, 0x48, 0x02, 0x5e, 0xfe, 0x4c, 0xa8, 0xfc, 0xdb, 0x93, 0xa8, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0x02, 0x10, 0xa2, 0xa2, 0x31, 0x30, 0x4d, 0xfc, 0xf9, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x4c, 0x07, 0x4d, 0x06, 0x14, 0x00, 0x34, 0x00, 0x40, 0x00, 0x00, 0x01, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x04, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x10, 0x27, 0x26, 0x20, 0x07, 0x03, 0xeb, 0xa6, 0x34, 0x4f, 0x50, 0x70, 0xb7, 0x73, 0x72, 0x72, 0x73, 0xb7, 0x70, 0x50, 0x4f, 0x34, 0xa6, 0x03, 0x12, 0xfe, 0x8e, 0x60, 0x73, 0x58, 0x4e, 0x48, 0xfe, 0xef, 0xfc, 0x55, 0x59, 0x5a, 0x5f, 0x4b, 0xb4, 0x62, 0xab, 0x5a, 0x5a, 0x53, 0x54, 0x95, 0x9c, 0x01, 0x83, 0xfa, 0xce, 0x4a, 0x4c, 0x01, 0x07, 0x4b, 0x4c, 0x4c, 0x4b, 0xfe, 0xf9, 0x4c, 0x03, 0xcd, 0xfc, 0x33, 0xa8, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0x02, 0x10, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0x02, 0x5e, 0xfe, 0x4c, 0xa8, 0xfe, 0x24, 0x38, 0x2a, 0x6d, 0x68, 0x8a, 0xdd, 0xf2, 0x12, 0x13, 0x25, 0xc3, 0x31, 0x32, 0x4b, 0x4b, 0x8f, 0x84, 0x4b, 0x4a, 0xa6, 0x01, 0xf3, 0xd3, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0x74, 0x01, 0x96, 0x74, 0x73, 0x73, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0xff, 0x91, 0x06, 0xfc, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x33, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x10, 0x27, 0x26, 0x20, 0x07, 0x25, 0x11, 0x01, 0x25, 0x21, 0x15, 0x01, 0x33, 0x12, 0x33, 0x32, 0x15, 0x16, 0x21, 0x23, 0x06, 0x15, 0x23, 0x34, 0x37, 0x21, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x11, 0x33, 0x01, 0x33, 0x32, 0x35, 0x34, 0x23, 0x06, 0x01, 0x11, 0x4a, 0x4c, 0x01, 0x07, 0x4b, 0x4c, 0x4c, 0x4b, 0xfe, 0xf9, 0x4c, 0x02, 0x90, 0x02, 0x56, 0xfd, 0xaa, 0x03, 0x10, 0xfd, 0x92, 0x9d, 0x36, 0xc5, 0xcd, 0x01, 0xfe, 0xd4, 0x25, 0x03, 0x8a, 0x03, 0xfe, 0xba, 0x8d, 0x34, 0x4f, 0x50, 0x70, 0xb7, 0x73, 0x72, 0x72, 0x73, 0xb7, 0x70, 0x50, 0x4f, 0x34, 0xa6, 0x01, 0xca, 0x12, 0x9c, 0x3f, 0x4f, 0x02, 0xfa, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0x74, 0x01, 0x96, 0x74, 0x73, 0x73, 0x5f, 0xfc, 0xfa, 0x03, 0x06, 0x93, 0xa8, 0xfc, 0xdb, 0x01, 0x20, 0xf6, 0xbd, 0x33, 0x3c, 0x3b, 0x34, 0xa8, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0x02, 0x10, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0x02, 0x5e, 0xfa, 0x7f, 0x36, 0x5b, 0x02, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x00, 0x05, 0xa0, 0x05, 0x9e, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x17, 0x16, 0x33, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23, 0x21, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x52, 0x01, 0x55, 0xfe, 0xab, 0x21, 0x22, 0x67, 0x02, 0x07, 0x75, 0x3f, 0x3f, 0x55, 0xa0, 0x39, 0x9a, 0x89, 0xc9, 0xba, 0x5c, 0xa2, 0x44, 0x46, 0x97, 0x51, 0x7c, 0x7b, 0x58, 0x85, 0x39, 0xb2, 0x93, 0x70, 0x44, 0xed, 0xfd, 0xfd, 0xbf, 0x49, 0x49, 0x79, 0x79, 0x05, 0x9e, 0xfe, 0xc2, 0x8f, 0xfd, 0xa0, 0x89, 0x27, 0x27, 0x2d, 0x2c, 0x34, 0x49, 0x4d, 0x2a, 0x0f, 0x24, 0x95, 0x82, 0x9e, 0xac, 0x1e, 0x1e, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0e, 0x2c, 0x97, 0x89, 0x92, 0x65, 0x3e, 0x50, 0x4f, 0xd2, 0x02, 0x60, 0x8f, 0x01, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x31, 0xfe, 0x56, 0x04, 0x88, 0x06, 0x14, 0x00, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x11, 0x21, 0x30, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x13, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x02, 0x11, 0x21, 0x11, 0x14, 0x17, 0x16, 0x33, 0x01, 0x52, 0x01, 0x52, 0x4e, 0x49, 0xb0, 0x9c, 0x9e, 0x59, 0x22, 0x24, 0x02, 0x49, 0x49, 0xa3, 0x3f, 0x2c, 0x5e, 0x22, 0x23, 0xab, 0xbf, 0x49, 0x49, 0x79, 0x79, 0x01, 0xfb, 0x02, 0xfe, 0xae, 0x21, 0x22, 0x67, 0x05, 0x9e, 0xfe, 0xc2, 0x4e, 0xb5, 0x5b, 0x56, 0x99, 0x28, 0x28, 0x68, 0xfb, 0x29, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x31, 0x99, 0x14, 0x50, 0x4f, 0xd2, 0x02, 0x60, 0x8f, 0x01, 0x3e, 0xfa, 0xfc, 0x01, 0xa2, 0x01, 0x95, 0xfd, 0xa0, 0x89, 0x27, 0x27, 0x00, 0x03, 0x00, 0x31, 0xff, 0x70, 0x05, 0x35, 0x05, 0x9e, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x44, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x10, 0x1f, 0x01, 0x36, 0x33, 0x20, 0x17, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x06, 0x15, 0x07, 0x34, 0x37, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x05, 0x26, 0x35, 0x10, 0x37, 0x21, 0x11, 0x14, 0x17, 0x16, 0x33, 0x01, 0x52, 0x01, 0x55, 0x86, 0xe5, 0x4d, 0x49, 0x48, 0x45, 0x46, 0x47, 0x47, 0x48, 0xa1, 0x59, 0x59, 0x59, 0x07, 0x48, 0xb9, 0x01, 0x0d, 0x01, 0x5b, 0x44, 0x8d, 0x4b, 0x42, 0x02, 0x8a, 0x06, 0xfa, 0xbf, 0x49, 0x49, 0x79, 0x79, 0x02, 0xe8, 0x3c, 0x4a, 0x56, 0x13, 0x1c, 0x01, 0x01, 0x76, 0x67, 0x24, 0x04, 0xfe, 0xf4, 0x73, 0x7d, 0xfe, 0xbd, 0x21, 0x22, 0x67, 0x05, 0x9e, 0xfe, 0xc2, 0x7a, 0x95, 0x11, 0x12, 0x23, 0xac, 0x2b, 0x16, 0x15, 0x71, 0x72, 0xfe, 0x66, 0x72, 0x09, 0xab, 0xf6, 0x76, 0x29, 0x1e, 0x12, 0x32, 0x4c, 0x03, 0x4f, 0x41, 0x50, 0x4f, 0xd2, 0x02, 0x60, 0x8f, 0x01, 0x3e, 0xfa, 0xf9, 0x18, 0x07, 0x0b, 0x27, 0x4b, 0x56, 0x0a, 0x09, 0x9d, 0xf8, 0x01, 0x07, 0x9b, 0xfd, 0xa0, 0x89, 0x27, 0x27, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0xfe, 0x56, 0x05, 0xcb, 0x06, 0x14, 0x00, 0x35, 0x00, 0x00, 0x01, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x21, 0x3b, 0x01, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x05, 0xca, 0x4a, 0x48, 0xa3, 0xe5, 0xd2, 0x5e, 0x22, 0x23, 0x70, 0x6f, 0x87, 0x9a, 0xa7, 0xfe, 0xf1, 0xa6, 0x9f, 0x9f, 0x4e, 0x4e, 0xaa, 0x9d, 0x9e, 0x5a, 0x23, 0x22, 0x01, 0x0f, 0x02, 0xa5, 0x3b, 0x50, 0x51, 0x69, 0xae, 0x59, 0x59, 0x02, 0xa4, 0xfd, 0x48, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x31, 0x99, 0x02, 0xb2, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x03, 0xd1, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0x55, 0x56, 0x99, 0x28, 0x28, 0x68, 0x63, 0xae, 0x65, 0x32, 0x32, 0x77, 0x78, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x04, 0xbb, 0x06, 0x14, 0x00, 0x27, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23, 0x21, 0xae, 0xa5, 0x01, 0xca, 0x75, 0x3f, 0x3f, 0x54, 0xa0, 0x3a, 0x9a, 0x89, 0xca, 0xb9, 0x5c, 0xa2, 0x44, 0x46, 0x97, 0x51, 0x7b, 0x7b, 0x58, 0x85, 0x39, 0xb2, 0x92, 0x6f, 0x45, 0xec, 0xfd, 0x94, 0x06, 0x14, 0xfa, 0x86, 0x2d, 0x2c, 0x34, 0x49, 0x4d, 0x2a, 0x0f, 0x24, 0x95, 0x82, 0x9e, 0xac, 0x1e, 0x1e, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0e, 0x2c, 0x97, 0x89, 0x92, 0x65, 0x3e, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x04, 0x65, 0x06, 0x14, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x2b, 0x01, 0x13, 0x11, 0x01, 0xae, 0xa5, 0x03, 0x12, 0xfd, 0x91, 0x02, 0x6f, 0xfc, 0xee, 0x17, 0x8e, 0xa5, 0x02, 0x58, 0x06, 0x14, 0xfe, 0x4c, 0xa8, 0xfc, 0xdb, 0x93, 0x03, 0xcd, 0xfc, 0xf9, 0x03, 0x07, 0x00, 0x00, 0x02, 0x00, 0x30, 0xff, 0xe2, 0x03, 0x85, 0x05, 0x1f, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x00, 0x13, 0x33, 0x1b, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0x0b, 0x01, 0x23, 0x03, 0x33, 0x1b, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0x0b, 0x01, 0x23, 0x31, 0x68, 0x83, 0x81, 0x7b, 0x83, 0x81, 0x69, 0xa7, 0x7a, 0x89, 0x89, 0x7b, 0xa6, 0x68, 0x83, 0x81, 0x7b, 0x83, 0x81, 0x69, 0xa7, 0x7a, 0x89, 0x89, 0x7b, 0x02, 0x55, 0xfe, 0x17, 0x01, 0xe9, 0xfe, 0x17, 0x01, 0xe9, 0xfd, 0x8d, 0x02, 0x02, 0xfd, 0xfe, 0x05, 0x3d, 0xfe, 0x17, 0x01, 0xe9, 0xfe, 0x17, 0x01, 0xe9, 0xfd, 0x8d, 0x02, 0x02, 0xfd, 0xfe, 0x00, 0x02, 0x00, 0x30, 0x00, 0xad, 0x03, 0x85, 0x05, 0x1f, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x31, 0x03, 0x54, 0x81, 0xfd, 0xad, 0x80, 0x03, 0x54, 0x81, 0xfd, 0xad, 0x80, 0x02, 0x55, 0xfe, 0x58, 0x01, 0x05, 0xfe, 0xfb, 0x04, 0x72, 0xfe, 0x58, 0x01, 0x05, 0xfe, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x4a, 0x04, 0x1c, 0x06, 0x14, 0x00, 0x19, 0x00, 0x00, 0x25, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x15, 0x11, 0x10, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x03, 0x75, 0x77, 0xcf, 0xae, 0xb2, 0x44, 0x5f, 0x2c, 0x3f, 0xa3, 0x93, 0xdf, 0x86, 0x9b, 0xa6, 0xa6, 0xac, 0xc9, 0xef, 0xe8, 0x02, 0xc4, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0xfd, 0x42, 0xfe, 0xc3, 0xbe, 0xa4, 0x02, 0x79, 0xf9, 0xec, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x56, 0x04, 0xeb, 0x06, 0x14, 0x00, 0x21, 0x00, 0x00, 0x25, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x15, 0x11, 0x10, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x06, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x27, 0x03, 0x75, 0x77, 0xcf, 0xae, 0xb2, 0x44, 0x5f, 0x2c, 0x3f, 0xa3, 0x93, 0xdf, 0x86, 0x9b, 0xa6, 0x03, 0x48, 0x5d, 0x2d, 0x3f, 0xa4, 0x8e, 0x04, 0xac, 0xc9, 0xef, 0xe8, 0x02, 0xc4, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0xfd, 0x42, 0xfe, 0xc3, 0xbe, 0xa4, 0x02, 0x79, 0xfb, 0x8e, 0x94, 0x66, 0x9c, 0xb9, 0xdd, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x7e, 0x06, 0x03, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x02, 0x7d, 0x68, 0x46, 0x47, 0x54, 0x61, 0x6a, 0x6a, 0x25, 0x65, 0x43, 0x6d, 0x70, 0x04, 0x17, 0xfe, 0x85, 0x01, 0x77, 0x59, 0x59, 0x6b, 0x5c, 0xfe, 0x9e, 0x03, 0x67, 0xfe, 0xab, 0x38, 0x38, 0x86, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x7e, 0x06, 0x03, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x02, 0x7d, 0x68, 0x46, 0x47, 0x54, 0x61, 0x6a, 0x5d, 0x67, 0x90, 0x84, 0x3b, 0x2b, 0x25, 0x65, 0x43, 0x6d, 0x70, 0x04, 0x17, 0xfe, 0x85, 0x01, 0x77, 0x59, 0x59, 0x6b, 0x5c, 0xfe, 0x9e, 0x02, 0x84, 0x78, 0x6b, 0x57, 0x36, 0x56, 0x72, 0x38, 0x38, 0x86, 0x00, 0x02, 0xff, 0xeb, 0x01, 0xad, 0x00, 0xd7, 0x06, 0x03, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x15, 0x23, 0x6e, 0x68, 0x2f, 0x2d, 0x67, 0x28, 0x1c, 0x3c, 0x15, 0x16, 0x68, 0x68, 0x05, 0x0f, 0xfd, 0x82, 0x78, 0x36, 0x36, 0x58, 0x1b, 0x1b, 0x56, 0x03, 0x72, 0x82, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x01, 0xdd, 0x05, 0x1e, 0x00, 0x11, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x01, 0xdd, 0x11, 0x2a, 0x19, 0x58, 0x5e, 0x6a, 0x6a, 0x20, 0x69, 0x4c, 0x0b, 0x1a, 0x10, 0x04, 0xaf, 0x0a, 0x09, 0x71, 0x6b, 0xfe, 0xb6, 0x02, 0x73, 0x61, 0x39, 0x37, 0x02, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x02, 0x8d, 0x01, 0xb4, 0x05, 0x0f, 0x00, 0x11, 0x00, 0x00, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x41, 0x11, 0x29, 0x19, 0x59, 0x5e, 0x69, 0x69, 0x20, 0x69, 0x4c, 0x0b, 0x1a, 0x10, 0x02, 0xfc, 0x0a, 0x09, 0x71, 0x6b, 0x01, 0x4a, 0xfd, 0x8d, 0x61, 0x39, 0x37, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x01, 0xad, 0x02, 0x37, 0x05, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x02, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x41, 0x11, 0x29, 0x19, 0x59, 0x5e, 0x69, 0x2b, 0x3b, 0x1c, 0x28, 0x66, 0x5d, 0x20, 0x69, 0x4c, 0x0b, 0x1a, 0x10, 0x02, 0xfc, 0x0a, 0x09, 0x71, 0x6b, 0x01, 0x4a, 0xfd, 0x8d, 0x0b, 0x56, 0x36, 0x58, 0x6c, 0x78, 0x0b, 0x61, 0x39, 0x37, 0x02, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1c, 0x02, 0x9c, 0x02, 0x4e, 0x05, 0x0f, 0x00, 0x16, 0x00, 0x21, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x11, 0x33, 0x11, 0x33, 0x32, 0x37, 0x36, 0x3f, 0x01, 0x33, 0x07, 0x06, 0x07, 0x06, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x01, 0x72, 0x3c, 0x3f, 0x3c, 0x3d, 0x7c, 0xdb, 0x68, 0x61, 0x36, 0x22, 0x21, 0x24, 0x5c, 0x6f, 0x64, 0x1d, 0x1e, 0x1f, 0xfe, 0xf5, 0x71, 0x43, 0x23, 0x25, 0x25, 0x23, 0x43, 0x71, 0x03, 0xe9, 0x0f, 0x4e, 0x3b, 0x5b, 0x2d, 0x2d, 0x02, 0x73, 0xfe, 0xf7, 0x15, 0x14, 0x3f, 0xa1, 0xab, 0x35, 0x1e, 0x1e, 0xff, 0x00, 0x17, 0x18, 0x2f, 0x2e, 0x18, 0x19, 0x00, 0x01, 0x00, 0x30, 0x02, 0x9c, 0x03, 0x85, 0x05, 0x0f, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x1b, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0x0b, 0x01, 0x23, 0x31, 0x68, 0x83, 0x81, 0x7b, 0x83, 0x81, 0x69, 0xa7, 0x7a, 0x89, 0x89, 0x7b, 0x05, 0x0f, 0xfe, 0x17, 0x01, 0xe9, 0xfe, 0x17, 0x01, 0xe9, 0xfd, 0x8d, 0x02, 0x02, 0xfd, 0xfe, 0x00, 0x01, 0x00, 0x22, 0x01, 0xad, 0x02, 0x8d, 0x05, 0x0f, 0x00, 0x11, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3f, 0x01, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x01, 0x76, 0x2d, 0x2a, 0x29, 0x46, 0x54, 0x3d, 0x2b, 0x18, 0x18, 0x1d, 0x13, 0xfe, 0xfe, 0x6f, 0xc7, 0xc6, 0x6e, 0x02, 0x62, 0x70, 0x22, 0x23, 0x57, 0x14, 0x14, 0x4b, 0x2f, 0x02, 0x69, 0xfe, 0x16, 0x01, 0xea, 0x00, 0xff, 0xff, 0x00, 0x90, 0x04, 0x74, 0x01, 0x76, 0x06, 0x66, 0x10, 0x06, 0x03, 0x12, 0x00, 0x00, 0xff, 0xff, 0x00, 0x90, 0x04, 0x74, 0x02, 0xc5, 0x06, 0x66, 0x10, 0x26, 0x03, 0x12, 0x00, 0x00, 0x10, 0x07, 0x03, 0x12, 0x01, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0x03, 0xe9, 0x01, 0xa5, 0x05, 0xd5, 0x10, 0x06, 0x07, 0x4d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0x03, 0xfe, 0x01, 0xa8, 0x05, 0xd5, 0x10, 0x06, 0x07, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb0, 0x04, 0xee, 0x01, 0xb9, 0x06, 0xda, 0x00, 0x05, 0x00, 0x00, 0x01, 0x15, 0x13, 0x23, 0x03, 0x35, 0x01, 0x6e, 0x4a, 0x74, 0x94, 0x06, 0xda, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x03, 0xef, 0x01, 0x60, 0x06, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x69, 0x3a, 0x4f, 0x4f, 0x3a, 0x68, 0x48, 0x47, 0x47, 0x48, 0x03, 0xef, 0x7b, 0x58, 0x40, 0x3f, 0x58, 0x7b, 0x50, 0x4f, 0xe6, 0x50, 0x50, 0x00, 0x01, 0x00, 0x69, 0x03, 0xef, 0x01, 0x60, 0x06, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x33, 0x15, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x01, 0x60, 0x68, 0x48, 0x47, 0x47, 0x48, 0x68, 0x3a, 0x4f, 0x4f, 0x3a, 0x03, 0xef, 0x50, 0x50, 0xe6, 0x4f, 0x50, 0x7b, 0x58, 0x3f, 0x40, 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x49, 0x06, 0x02, 0x00, 0x1c, 0x00, 0x00, 0x13, 0x33, 0x32, 0x37, 0x36, 0x35, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x11, 0x23, 0xf8, 0x24, 0x6c, 0x32, 0x20, 0x01, 0x1f, 0x39, 0x65, 0x2e, 0x2c, 0x2d, 0x2c, 0x2b, 0x2e, 0x2e, 0x30, 0x9d, 0x4e, 0x3d, 0x3d, 0x3f, 0x60, 0x74, 0x04, 0x5b, 0x40, 0x2a, 0x37, 0x4b, 0x24, 0x40, 0x0c, 0x0c, 0x18, 0x60, 0x14, 0x09, 0x0a, 0x58, 0x46, 0x68, 0x5f, 0x40, 0x43, 0x11, 0xfe, 0x93, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x49, 0x06, 0x02, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x14, 0x17, 0x16, 0x33, 0x01, 0xb9, 0x72, 0x61, 0x40, 0x3d, 0x3e, 0x4f, 0x9b, 0x30, 0x2e, 0x2e, 0x2b, 0x2c, 0x2d, 0x2c, 0x2d, 0x66, 0x38, 0x20, 0x01, 0x21, 0x31, 0x6d, 0x04, 0x5b, 0xfe, 0x41, 0x01, 0x6d, 0x11, 0x43, 0x40, 0x5f, 0x68, 0x46, 0x58, 0x0a, 0x09, 0x14, 0x60, 0x18, 0x0c, 0x0c, 0x40, 0x24, 0x4b, 0x37, 0x2a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x04, 0x32, 0x02, 0xaa, 0x06, 0xb0, 0x00, 0x06, 0x00, 0x00, 0x13, 0x25, 0x15, 0x0d, 0x01, 0x15, 0x25, 0xf0, 0x01, 0xb9, 0xfe, 0xbd, 0x01, 0x43, 0xfe, 0x47, 0x05, 0xbb, 0xf5, 0x8b, 0xb4, 0xb4, 0x8b, 0xf5, 0x00, 0x00, 0x00, 0x01, 0x00, 0xf0, 0x04, 0x32, 0x02, 0xaa, 0x06, 0xb0, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x35, 0x2d, 0x01, 0x35, 0x05, 0x02, 0xa9, 0xfe, 0x47, 0x01, 0x43, 0xfe, 0xbd, 0x01, 0xb9, 0x05, 0x27, 0xf5, 0x8b, 0xb4, 0xb4, 0x8b, 0xf5, 0x00, 0x00, 0x01, 0x00, 0xad, 0x04, 0x7c, 0x02, 0xec, 0x06, 0x66, 0x00, 0x06, 0x00, 0x00, 0x01, 0x33, 0x13, 0x23, 0x0b, 0x01, 0x23, 0x01, 0x8a, 0x85, 0xdd, 0x7d, 0xa2, 0xa2, 0x7d, 0x06, 0x66, 0xfe, 0x16, 0x01, 0x67, 0xfe, 0x99, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x04, 0x7c, 0x02, 0xec, 0x06, 0x66, 0x00, 0x06, 0x00, 0x00, 0x01, 0x03, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x01, 0x8a, 0xdc, 0x7d, 0xa2, 0xa2, 0x7d, 0xdd, 0x04, 0x7c, 0x01, 0xea, 0xfe, 0x99, 0x01, 0x67, 0xfe, 0x16, 0x00, 0x00, 0x01, 0x00, 0xad, 0x04, 0xee, 0x02, 0xec, 0x06, 0x66, 0x00, 0x06, 0x00, 0x00, 0x01, 0x33, 0x13, 0x23, 0x27, 0x07, 0x23, 0x01, 0x8a, 0x85, 0xdd, 0x7d, 0xa2, 0xa2, 0x7d, 0x06, 0x66, 0xfe, 0x88, 0xf5, 0xf5, 0x00, 0x00, 0x01, 0x00, 0xad, 0x04, 0xee, 0x02, 0xec, 0x06, 0x66, 0x00, 0x06, 0x00, 0x00, 0x01, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x01, 0x8a, 0xdc, 0x7d, 0xa2, 0xa2, 0x7d, 0xdd, 0x04, 0xee, 0x01, 0x78, 0xf5, 0xf5, 0xfe, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x03, 0xe7, 0x01, 0x3b, 0x06, 0x12, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x3b, 0x7a, 0x06, 0x12, 0xfd, 0xd5, 0x02, 0x2b, 0x00, 0xff, 0xff, 0x00, 0xbf, 0x05, 0x62, 0x02, 0xda, 0x05, 0xf6, 0x10, 0x06, 0x00, 0x71, 0x00, 0x00, 0x00, 0x01, 0x01, 0x4d, 0x04, 0xee, 0x02, 0xfd, 0x06, 0x66, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x02, 0x4a, 0xb3, 0xfe, 0xdb, 0x8a, 0x06, 0x66, 0xfe, 0x88, 0x00, 0x01, 0x00, 0x99, 0x04, 0xf0, 0x02, 0x49, 0x06, 0x66, 0x00, 0x03, 0x00, 0x00, 0x01, 0x13, 0x23, 0x01, 0x01, 0x4a, 0xfe, 0x8a, 0xfe, 0xdb, 0x06, 0x66, 0xfe, 0x8a, 0x01, 0x76, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0xfe, 0xd1, 0x01, 0x3b, 0x00, 0xfc, 0x00, 0x03, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x01, 0x3b, 0x7a, 0xfc, 0xfd, 0xd5, 0x02, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xbf, 0xfe, 0xc0, 0x02, 0xda, 0xff, 0x54, 0x10, 0x07, 0x00, 0x71, 0x00, 0x00, 0xf9, 0x5e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0xfe, 0x1c, 0x02, 0x49, 0xff, 0x92, 0x00, 0x03, 0x00, 0x00, 0x05, 0x13, 0x23, 0x01, 0x01, 0x4a, 0xfe, 0x8a, 0xfe, 0xdb, 0x6e, 0xfe, 0x8a, 0x01, 0x76, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x4d, 0xfe, 0x1c, 0x02, 0xfd, 0xff, 0x94, 0x00, 0x03, 0x00, 0x00, 0x05, 0x33, 0x01, 0x23, 0x02, 0x4a, 0xb3, 0xfe, 0xdb, 0x8a, 0x6c, 0xfe, 0x88, 0x00, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, 0x01, 0xa6, 0x04, 0x23, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x01, 0x03, 0x21, 0x03, 0x13, 0x21, 0x01, 0x04, 0xa0, 0x01, 0x41, 0xa1, 0xa1, 0xfe, 0xbf, 0x02, 0xd9, 0x01, 0x4a, 0xfd, 0x27, 0xfe, 0xb6, 0x00, 0x00, 0x01, 0x00, 0x63, 0x02, 0xd9, 0x01, 0xa6, 0x04, 0x23, 0x00, 0x02, 0x00, 0x00, 0x01, 0x03, 0x21, 0x01, 0x04, 0xa0, 0x01, 0x41, 0x02, 0xd9, 0x01, 0x4a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x01, 0xfe, 0x01, 0x60, 0x04, 0x23, 0x10, 0x07, 0x02, 0x80, 0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x01, 0xfe, 0x01, 0x60, 0x04, 0x23, 0x10, 0x07, 0x02, 0x81, 0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x01, 0xd4, 0x02, 0x98, 0x03, 0x96, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x33, 0x11, 0x33, 0x11, 0x02, 0x97, 0xfe, 0x6b, 0x87, 0x87, 0x02, 0x6a, 0x96, 0x96, 0x01, 0x2c, 0xfe, 0xd4, 0x00, 0x01, 0x01, 0x02, 0x01, 0xd4, 0x02, 0x98, 0x03, 0x96, 0x00, 0x07, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x23, 0x11, 0x23, 0x11, 0x01, 0x02, 0x01, 0x95, 0x87, 0x87, 0x03, 0x00, 0x96, 0x96, 0xfe, 0xd4, 0x01, 0x2c, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xff, 0x02, 0x75, 0x03, 0x55, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x01, 0x24, 0x87, 0xc9, 0xc9, 0x87, 0xca, 0x02, 0x75, 0xe0, 0xe0, 0x96, 0xe0, 0xe0, 0x96, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xdf, 0x01, 0xef, 0x02, 0x75, 0x00, 0x03, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x01, 0xef, 0xfe, 0x6b, 0x01, 0x95, 0x01, 0xdf, 0x96, 0x00, 0x00, 0x01, 0x00, 0xb3, 0x05, 0x29, 0x02, 0xe7, 0x06, 0x48, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x26, 0xb3, 0x6a, 0x0a, 0x57, 0x4f, 0x4d, 0x57, 0x0b, 0x6a, 0x08, 0x8f, 0x82, 0x83, 0x8e, 0x06, 0x48, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x00, 0x00, 0x01, 0x01, 0x71, 0x05, 0x44, 0x02, 0x29, 0x06, 0x10, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x01, 0x71, 0xb8, 0xb8, 0x06, 0x10, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd6, 0x04, 0xe1, 0x02, 0xc4, 0x07, 0x06, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x02, 0x56, 0x50, 0x39, 0x3b, 0x4e, 0x4e, 0x3b, 0x39, 0x50, 0x6d, 0x8f, 0x67, 0x68, 0x8f, 0x8f, 0x68, 0x67, 0x8f, 0x05, 0xf4, 0x3f, 0x58, 0x57, 0x40, 0x41, 0x57, 0x58, 0x40, 0x73, 0xa0, 0xa0, 0x73, 0x73, 0x9f, 0x9f, 0x00, 0x01, 0x01, 0x2a, 0xfe, 0x75, 0x02, 0x7b, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x21, 0x33, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x8c, 0x6b, 0x28, 0x27, 0x31, 0x31, 0x1d, 0x38, 0x1b, 0x22, 0x3d, 0x1b, 0x6e, 0x67, 0x2f, 0x3d, 0x58, 0x1f, 0x2e, 0x2e, 0x0f, 0x0f, 0x85, 0x0a, 0x0a, 0x57, 0x5d, 0x30, 0x69, 0x00, 0x01, 0x00, 0xa3, 0x05, 0x1d, 0x02, 0xf6, 0x06, 0x37, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x01, 0xc9, 0x33, 0x14, 0x1e, 0x0b, 0x23, 0x20, 0x02, 0x70, 0x02, 0x5b, 0x52, 0x23, 0x39, 0x21, 0x34, 0x14, 0x1d, 0x0c, 0x22, 0x21, 0x01, 0x71, 0x02, 0x5c, 0x52, 0x22, 0x3a, 0x05, 0x5a, 0x37, 0x14, 0x13, 0x49, 0x52, 0x87, 0x93, 0x1c, 0x21, 0x37, 0x14, 0x13, 0x49, 0x52, 0x87, 0x93, 0x1c, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd8, 0x04, 0xee, 0x03, 0x50, 0x06, 0x66, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0x03, 0x33, 0x03, 0x23, 0x02, 0xb0, 0xa0, 0xdf, 0x7a, 0x74, 0x99, 0xc9, 0x7b, 0x06, 0x66, 0xfe, 0x88, 0x01, 0x78, 0xfe, 0x88, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x01, 0xde, 0x02, 0x69, 0x04, 0x08, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x37, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x07, 0x01, 0xfa, 0xa6, 0x22, 0x22, 0x5f, 0x26, 0x39, 0x9e, 0x4e, 0x4a, 0xf9, 0x03, 0x64, 0xa4, 0x94, 0x99, 0x31, 0x30, 0x9c, 0x60, 0x5a, 0xc8, 0xa2, 0x00, 0x00, 0x00, 0x01, 0x00, 0xd7, 0x04, 0xee, 0x02, 0xc2, 0x06, 0x66, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x27, 0x07, 0x23, 0x37, 0x27, 0x33, 0x17, 0x37, 0x33, 0x07, 0x17, 0x02, 0x20, 0x53, 0x54, 0xa2, 0xa3, 0xa3, 0xa2, 0x54, 0x53, 0xa2, 0xa4, 0xa4, 0x04, 0xee, 0x61, 0x61, 0xbb, 0xbd, 0x60, 0x60, 0xbd, 0xbb, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0x01, 0xab, 0x02, 0xb1, 0x05, 0x0f, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x00, 0x01, 0x16, 0x15, 0x14, 0x23, 0x22, 0x35, 0x34, 0x37, 0x03, 0x33, 0x17, 0x37, 0x33, 0x01, 0x06, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x01, 0xd1, 0xa1, 0xda, 0xf1, 0xa3, 0xe1, 0x7c, 0xab, 0xa5, 0x7b, 0xfe, 0xdd, 0x7b, 0x7a, 0x74, 0x03, 0xdc, 0xf9, 0xb4, 0x84, 0x84, 0xbf, 0xf2, 0x01, 0x2f, 0xe0, 0xe0, 0xfe, 0x8a, 0xae, 0x98, 0x4d, 0x4d, 0x89, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6d, 0x02, 0x9c, 0x00, 0xd7, 0x06, 0x03, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x6e, 0x68, 0x68, 0x06, 0x03, 0xfc, 0x99, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x4f, 0x05, 0x2f, 0x00, 0x32, 0x00, 0x00, 0x01, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x02, 0x2c, 0x2c, 0x30, 0x2e, 0x34, 0x4e, 0x27, 0x26, 0x1b, 0x1c, 0x54, 0x24, 0x71, 0x2d, 0x2e, 0x46, 0x45, 0x7b, 0x33, 0x38, 0x37, 0x3d, 0x3a, 0x39, 0x37, 0x37, 0x4a, 0x4f, 0x1d, 0x19, 0x64, 0x24, 0x61, 0x2b, 0x2b, 0x40, 0x3f, 0x75, 0x39, 0x34, 0x33, 0x05, 0x0d, 0x61, 0x16, 0x0b, 0x0b, 0x17, 0x18, 0x2f, 0x24, 0x14, 0x15, 0x12, 0x08, 0x18, 0x2a, 0x2b, 0x4d, 0x57, 0x33, 0x33, 0x0a, 0x0a, 0x13, 0x6b, 0x1e, 0x0f, 0x0f, 0x32, 0x2d, 0x2a, 0x17, 0x14, 0x17, 0x08, 0x15, 0x29, 0x2a, 0x49, 0x58, 0x30, 0x31, 0x09, 0x08, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0xd1, 0x05, 0x0f, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x03, 0x13, 0x23, 0x27, 0x07, 0x23, 0x13, 0x03, 0x33, 0x17, 0x37, 0x02, 0xc5, 0xe5, 0xf1, 0x7b, 0xb9, 0xb8, 0x7c, 0xf7, 0xe2, 0x7b, 0xa9, 0xa8, 0x05, 0x0f, 0xfe, 0xcf, 0xfe, 0xbe, 0xf6, 0xf6, 0x01, 0x48, 0x01, 0x2b, 0xdf, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x49, 0x06, 0x02, 0x10, 0x06, 0x02, 0x83, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x02, 0x53, 0xfe, 0x6e, 0x02, 0x0c, 0x04, 0xd0, 0x88, 0xfa, 0xa8, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x02, 0x53, 0xfe, 0x6e, 0x01, 0x92, 0x7a, 0x03, 0x9c, 0x88, 0x01, 0x34, 0xfa, 0xa8, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x02, 0x53, 0xfe, 0x6e, 0x01, 0x92, 0x7a, 0x02, 0x68, 0x88, 0x02, 0x68, 0xfa, 0xa8, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x02, 0x53, 0xfe, 0x6e, 0x01, 0x92, 0x7a, 0x01, 0x34, 0x88, 0x03, 0x9c, 0xfa, 0xa8, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x25, 0x11, 0x33, 0x11, 0x21, 0x35, 0x02, 0x53, 0x7a, 0xfd, 0xf4, 0x88, 0x04, 0xd0, 0xfa, 0xa8, 0x88, 0x00, 0xff, 0xff, 0x00, 0xad, 0xfd, 0xec, 0x02, 0xec, 0xff, 0xd6, 0x10, 0x07, 0x02, 0x87, 0x00, 0x00, 0xf9, 0x70, 0x00, 0x00, 0xff, 0xff, 0x00, 0xbf, 0x04, 0xe2, 0x02, 0xda, 0x06, 0x76, 0x12, 0x27, 0x00, 0x71, 0x00, 0x00, 0x00, 0x80, 0x12, 0x06, 0x00, 0x71, 0x00, 0x80, 0xff, 0xff, 0x00, 0x9c, 0x03, 0xe9, 0x03, 0x16, 0x05, 0xd5, 0x12, 0x06, 0x07, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0xd6, 0xfe, 0x14, 0x02, 0xc4, 0x00, 0x39, 0x10, 0x07, 0x02, 0x9c, 0x00, 0x00, 0xf9, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa3, 0xfe, 0x76, 0x02, 0xf6, 0xff, 0x90, 0x00, 0x21, 0x00, 0x00, 0x01, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x01, 0xc9, 0x33, 0x14, 0x0f, 0x0f, 0x0b, 0x23, 0x10, 0x10, 0x02, 0x70, 0x02, 0x2e, 0x2d, 0x52, 0x23, 0x39, 0x21, 0x34, 0x14, 0x0f, 0x0e, 0x0c, 0x22, 0x10, 0x11, 0x01, 0x71, 0x02, 0x2e, 0x2e, 0x52, 0x22, 0x3a, 0xfe, 0xb3, 0x37, 0x14, 0x0a, 0x09, 0x25, 0x24, 0x52, 0x87, 0x49, 0x4a, 0x1c, 0x21, 0x37, 0x14, 0x0a, 0x09, 0x25, 0x24, 0x52, 0x87, 0x49, 0x4a, 0x1c, 0x00, 0x02, 0xfc, 0xfd, 0x04, 0x7b, 0xfe, 0xad, 0x06, 0x66, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x01, 0x13, 0x23, 0x09, 0x01, 0xfd, 0xaf, 0xfe, 0x8a, 0xfe, 0xdb, 0x01, 0x35, 0x06, 0x66, 0xfe, 0x8a, 0x01, 0x76, 0xfe, 0x15, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0xb2, 0x04, 0x7b, 0xff, 0x62, 0x06, 0x66, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x17, 0xfe, 0xae, 0xb4, 0xfe, 0xda, 0x8a, 0x81, 0x06, 0x66, 0xfe, 0x88, 0x73, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x14, 0x04, 0x7b, 0xff, 0x53, 0x06, 0x66, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x13, 0x23, 0x27, 0x07, 0x23, 0x05, 0xfd, 0xf1, 0x85, 0xdc, 0x7d, 0xa2, 0xa2, 0x7d, 0x01, 0x1f, 0x06, 0x66, 0xfe, 0x88, 0xf5, 0xf5, 0x73, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x08, 0x05, 0x1d, 0xff, 0x5b, 0x06, 0x37, 0x10, 0x07, 0x02, 0x9e, 0xfc, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x29, 0x05, 0x62, 0xff, 0x44, 0x05, 0xf6, 0x10, 0x07, 0x00, 0x71, 0xfc, 0x6a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x54, 0x05, 0x7c, 0x00, 0x12, 0x06, 0x0b, 0x10, 0x07, 0x07, 0x73, 0xfc, 0x66, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x12, 0x05, 0x29, 0xff, 0x46, 0x06, 0x48, 0x10, 0x07, 0x02, 0x9a, 0xfc, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0xde, 0x04, 0x7b, 0xfe, 0x85, 0x06, 0x14, 0x00, 0x03, 0x00, 0x04, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x17, 0xfd, 0xdf, 0xa5, 0xa5, 0x54, 0x06, 0x14, 0xe9, 0xb0, 0x00, 0x00, 0x00, 0x03, 0xfd, 0x27, 0x04, 0x7b, 0xff, 0x3f, 0x06, 0x10, 0x00, 0x03, 0x00, 0x07, 0x00, 0x08, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x05, 0xfe, 0x88, 0xb6, 0xb6, 0xfe, 0xa0, 0xb7, 0xb7, 0x01, 0x0b, 0x06, 0x10, 0xca, 0xca, 0xca, 0xcb, 0x00, 0x00, 0x01, 0xfd, 0x7e, 0x04, 0xf2, 0xff, 0x12, 0x06, 0x7b, 0x00, 0x19, 0x00, 0x00, 0x01, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x15, 0x23, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0xfd, 0x7e, 0x65, 0x5e, 0x5e, 0x73, 0x50, 0x27, 0x20, 0x03, 0x07, 0x6b, 0x1c, 0x2d, 0x29, 0x29, 0x38, 0x40, 0x51, 0x5a, 0x06, 0x48, 0x33, 0x55, 0x43, 0x3d, 0x41, 0x20, 0x1a, 0x09, 0x10, 0x20, 0x0c, 0x28, 0x36, 0x25, 0x22, 0x22, 0x28, 0x15, 0x24, 0x34, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x3a, 0x04, 0xe1, 0xff, 0x28, 0x07, 0x06, 0x10, 0x07, 0x02, 0x9c, 0xfc, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x42, 0x04, 0xee, 0xff, 0xba, 0x06, 0x66, 0x10, 0x07, 0x02, 0x9f, 0xfc, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x17, 0x04, 0x7b, 0xff, 0x56, 0x06, 0x66, 0x00, 0x06, 0x00, 0x07, 0x00, 0x00, 0x01, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x07, 0xfd, 0xf4, 0xdc, 0x7d, 0xa2, 0xa2, 0x7d, 0xdd, 0x46, 0x04, 0xee, 0x01, 0x78, 0xf5, 0xf5, 0xfe, 0x88, 0x73, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xf6, 0x04, 0xec, 0xfe, 0x71, 0x06, 0xa8, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0xfe, 0x70, 0x7a, 0x06, 0xa8, 0xfe, 0x44, 0x01, 0xbc, 0x00, 0xff, 0xff, 0xfd, 0x3e, 0x04, 0xec, 0xff, 0x28, 0x06, 0xa8, 0x10, 0x27, 0x02, 0xbe, 0xff, 0x48, 0x00, 0x00, 0x10, 0x07, 0x02, 0xbe, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfc, 0xba, 0x04, 0xee, 0xff, 0x32, 0x06, 0x66, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x13, 0x23, 0x03, 0x21, 0x13, 0x23, 0x03, 0xfd, 0x5a, 0xb9, 0x7a, 0xdf, 0x01, 0xcd, 0xab, 0x7b, 0xc9, 0x06, 0x66, 0xfe, 0x88, 0x01, 0x78, 0xfe, 0x88, 0x01, 0x78, 0xff, 0xff, 0xfd, 0x12, 0x05, 0x29, 0xff, 0x46, 0x07, 0x56, 0x10, 0x27, 0x02, 0xb8, 0x00, 0x00, 0x01, 0x42, 0x10, 0x07, 0x02, 0x9a, 0xfc, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x12, 0x05, 0x29, 0xff, 0x46, 0x06, 0x48, 0x00, 0x0c, 0x00, 0x00, 0x03, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0xba, 0x6a, 0x0a, 0x58, 0x4e, 0x4d, 0x57, 0x0c, 0x6a, 0x09, 0x8f, 0x01, 0x04, 0x8f, 0x05, 0x29, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x00, 0x00, 0x00, 0x01, 0xfe, 0x4f, 0x03, 0xe9, 0xff, 0x57, 0x05, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x23, 0x13, 0x33, 0xf3, 0xbe, 0x94, 0x74, 0x03, 0xe9, 0x01, 0x3f, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xce, 0x04, 0xc2, 0xfe, 0xa8, 0x06, 0xc1, 0x00, 0x08, 0x00, 0x00, 0x01, 0x10, 0x23, 0x35, 0x16, 0x35, 0x23, 0x35, 0x33, 0xfe, 0xa8, 0xda, 0x65, 0x64, 0xd9, 0x05, 0xc3, 0xfe, 0xff, 0x7b, 0x03, 0x89, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xce, 0x04, 0xc2, 0xfe, 0xa8, 0x06, 0xc1, 0x00, 0x08, 0x00, 0x00, 0x01, 0x35, 0x33, 0x15, 0x23, 0x14, 0x37, 0x15, 0x22, 0xfd, 0xce, 0xd9, 0x64, 0x65, 0xda, 0x05, 0xc3, 0xfe, 0xfe, 0x89, 0x03, 0x7b, 0x00, 0x01, 0xff, 0x86, 0x04, 0x9a, 0x00, 0x7a, 0x06, 0x12, 0x00, 0x03, 0x00, 0x00, 0x03, 0x33, 0x03, 0x23, 0x3a, 0xb4, 0x6a, 0x8a, 0x06, 0x12, 0xfe, 0x88, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xfd, 0xfd, 0xdf, 0xfe, 0xad, 0xff, 0x55, 0x10, 0x07, 0x00, 0x43, 0xfc, 0x65, 0xf8, 0xef, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xb2, 0xfd, 0xdd, 0xff, 0x62, 0xff, 0x55, 0x10, 0x07, 0x00, 0x76, 0xfc, 0x65, 0xf8, 0xef, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x6d, 0xfe, 0x14, 0xfe, 0x6a, 0xff, 0xce, 0x00, 0x07, 0x00, 0x00, 0x01, 0x23, 0x35, 0x33, 0x35, 0x33, 0x11, 0x23, 0xfd, 0xfd, 0x90, 0x90, 0x6c, 0x6c, 0xfe, 0xb5, 0x78, 0xa1, 0xfe, 0x46, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xfd, 0xfe, 0x14, 0xfe, 0xfa, 0xff, 0xce, 0x00, 0x07, 0x00, 0x00, 0x05, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0xfd, 0xfd, 0x6c, 0x90, 0x90, 0x6c, 0x32, 0xa1, 0x78, 0xa1, 0x00, 0x01, 0xfe, 0x7f, 0x05, 0x86, 0x00, 0x39, 0x07, 0x70, 0x00, 0x05, 0x00, 0x00, 0x03, 0x21, 0x35, 0x21, 0x11, 0x23, 0x42, 0xfe, 0xc2, 0x01, 0xb9, 0x7b, 0x06, 0xe8, 0x88, 0xfe, 0x16, 0x00, 0x00, 0x01, 0xff, 0x0b, 0x03, 0x6b, 0x00, 0x6f, 0x04, 0xe0, 0x00, 0x13, 0x00, 0x00, 0x03, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x33, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0xf5, 0x37, 0x4f, 0x1c, 0x2a, 0x29, 0x0e, 0x0d, 0x78, 0x09, 0x09, 0x4f, 0x53, 0x2b, 0x5f, 0x03, 0xd7, 0x77, 0x2d, 0x2b, 0x37, 0x36, 0x20, 0x3e, 0x1f, 0x26, 0x44, 0x1e, 0x7a, 0x73, 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xc0, 0xfe, 0x12, 0xfe, 0x81, 0xff, 0xbe, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x15, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0xfe, 0x81, 0x51, 0x70, 0x70, 0x51, 0x24, 0x30, 0x30, 0x24, 0xfe, 0x12, 0x7d, 0x5a, 0x59, 0x7c, 0x78, 0x35, 0x27, 0x28, 0x35, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x56, 0xfe, 0x14, 0xff, 0x10, 0xff, 0x4d, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x21, 0x35, 0x33, 0x35, 0x33, 0xfe, 0x70, 0xa0, 0xfe, 0x47, 0x9f, 0x7a, 0xfe, 0x9c, 0x88, 0x88, 0xb1, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x56, 0xfe, 0x14, 0xff, 0x10, 0xff, 0x4d, 0x00, 0x07, 0x00, 0x00, 0x01, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, 0x23, 0xfd, 0xf6, 0x9f, 0x01, 0xb9, 0xa0, 0x7a, 0xfe, 0xc5, 0x88, 0x88, 0xb1, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x6d, 0xfe, 0x14, 0xfe, 0xfa, 0xff, 0xce, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0xfd, 0xfd, 0x90, 0x90, 0x6c, 0x90, 0x90, 0x6c, 0xfe, 0xb5, 0x78, 0xa1, 0xa1, 0x78, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x56, 0xfe, 0x88, 0xff, 0x10, 0xff, 0x10, 0x00, 0x03, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0xfd, 0x57, 0x01, 0xb9, 0xfe, 0x88, 0x88, 0x88, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xba, 0xfe, 0x56, 0xff, 0xd5, 0x00, 0x80, 0x00, 0x0d, 0x00, 0x00, 0x27, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x2b, 0x4a, 0x49, 0xa3, 0xe4, 0xd1, 0x5f, 0x22, 0x22, 0x80, 0x94, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x31, 0x99, 0x94, 0x00, 0x00, 0x01, 0xfd, 0xb7, 0xfe, 0x56, 0xff, 0xd3, 0x00, 0x80, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0xfd, 0xb8, 0xa6, 0x22, 0x22, 0x5e, 0xd2, 0xe4, 0xa3, 0x49, 0x4a, 0x80, 0x94, 0x99, 0x31, 0x30, 0x9c, 0x60, 0x60, 0xd6, 0x00, 0x01, 0xfd, 0xde, 0xfe, 0x89, 0xfe, 0x85, 0xff, 0x73, 0x00, 0x03, 0x00, 0x00, 0x05, 0x33, 0x15, 0x23, 0xfd, 0xdf, 0xa5, 0xa5, 0x8d, 0xea, 0xff, 0xff, 0xfd, 0x26, 0xfe, 0x89, 0xff, 0x3d, 0xff, 0x53, 0x10, 0x07, 0x00, 0x6a, 0xfc, 0x65, 0xf9, 0x43, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x70, 0xfe, 0x12, 0xfe, 0xf2, 0xff, 0xbe, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0xfe, 0x85, 0x31, 0x23, 0x24, 0x2f, 0x2f, 0x24, 0x23, 0x31, 0x6d, 0x70, 0x51, 0x51, 0x6f, 0x6f, 0x51, 0x51, 0x70, 0xfe, 0xea, 0x26, 0x36, 0x35, 0x27, 0x28, 0x35, 0x36, 0x26, 0x5a, 0x7d, 0x7d, 0x5a, 0x59, 0x7c, 0x7c, 0x00, 0x01, 0xfd, 0xac, 0xfe, 0x14, 0xfe, 0xb4, 0xff, 0x54, 0x00, 0x03, 0x00, 0x00, 0x05, 0x33, 0x03, 0x23, 0xfd, 0xf6, 0xbe, 0x94, 0x74, 0xac, 0xfe, 0xc0, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x6c, 0xfe, 0x75, 0xfe, 0xe1, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0xfc, 0x66, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x91, 0xfe, 0x75, 0xfe, 0xe1, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0xfc, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xf6, 0xfe, 0x14, 0xfe, 0x71, 0xff, 0xa0, 0x00, 0x03, 0x00, 0x00, 0x05, 0x11, 0x23, 0x11, 0xfe, 0x70, 0x7a, 0x60, 0xfe, 0x74, 0x01, 0x8c, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x3e, 0xfe, 0x50, 0xff, 0x2f, 0xff, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x07, 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0xd2, 0x7b, 0xf9, 0x7c, 0x66, 0xfe, 0xb6, 0xc2, 0xc2, 0x01, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xbf, 0xfe, 0x39, 0xff, 0xa3, 0xff, 0x58, 0x00, 0x14, 0x00, 0x00, 0x01, 0x06, 0x23, 0x22, 0x03, 0x34, 0x35, 0x33, 0x16, 0x33, 0x32, 0x37, 0x33, 0x16, 0x17, 0x32, 0x37, 0x33, 0x02, 0x07, 0x22, 0xfe, 0x31, 0x36, 0x68, 0xc4, 0x0f, 0x69, 0x0c, 0x5e, 0x5b, 0x0e, 0x6a, 0x0b, 0x5e, 0x5b, 0x0e, 0x6a, 0x0d, 0xc6, 0x68, 0xfe, 0x8b, 0x52, 0x01, 0x1a, 0x02, 0x03, 0x96, 0x96, 0x95, 0x01, 0x96, 0xfe, 0xe2, 0x01, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x17, 0xfe, 0x14, 0xff, 0x56, 0xff, 0x8c, 0x11, 0x07, 0x02, 0x89, 0xfc, 0x6a, 0xf9, 0x26, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x12, 0xfe, 0x14, 0xff, 0x51, 0xff, 0x8c, 0x11, 0x07, 0x02, 0x88, 0xfc, 0x65, 0xf9, 0x26, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x12, 0xfe, 0x39, 0xff, 0x46, 0xff, 0x58, 0x10, 0x07, 0x02, 0x9a, 0xfc, 0x5f, 0xf9, 0x10, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x12, 0xfe, 0x36, 0xff, 0x46, 0xff, 0x55, 0x00, 0x0c, 0x00, 0x00, 0x03, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0xba, 0x6a, 0x0a, 0x58, 0x4e, 0x4d, 0x57, 0x0c, 0x6a, 0x09, 0x8f, 0x01, 0x04, 0x8f, 0xfe, 0x36, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x08, 0xfe, 0x39, 0xff, 0x5b, 0xff, 0x53, 0x10, 0x07, 0x02, 0x9e, 0xfc, 0x65, 0xf9, 0x1c, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x29, 0xfe, 0xc0, 0xff, 0x44, 0xff, 0x54, 0x10, 0x07, 0x02, 0x8f, 0xfc, 0x6a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x54, 0xfe, 0x1d, 0x00, 0x12, 0xfe, 0xac, 0x10, 0x07, 0x00, 0x42, 0xfc, 0x66, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x54, 0xfe, 0x1d, 0x00, 0x12, 0xff, 0xee, 0x10, 0x07, 0x07, 0x4c, 0xfc, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfb, 0xfe, 0x01, 0xec, 0xff, 0xb6, 0x03, 0x0c, 0x00, 0x1b, 0x00, 0x00, 0x03, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x4b, 0x43, 0x81, 0x47, 0x51, 0x66, 0x13, 0x0a, 0x46, 0x5c, 0x2e, 0x47, 0x7f, 0x42, 0x46, 0x84, 0x4a, 0x30, 0x5a, 0x43, 0x0a, 0x13, 0x69, 0x53, 0x3f, 0x7c, 0x03, 0x0c, 0xae, 0x3b, 0x37, 0x33, 0x0a, 0x04, 0x21, 0x18, 0x3b, 0x3f, 0xae, 0x3c, 0x36, 0x16, 0x1f, 0x05, 0x0a, 0x37, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xb8, 0x01, 0xc4, 0xff, 0x94, 0x02, 0x68, 0x00, 0x03, 0x00, 0x00, 0x03, 0x15, 0x21, 0x35, 0x6c, 0xfe, 0x25, 0x02, 0x68, 0xa4, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfb, 0x6e, 0x01, 0xc4, 0x00, 0x00, 0x02, 0x68, 0x00, 0x03, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0xfb, 0x6f, 0x04, 0x90, 0x01, 0xc4, 0xa4, 0xa4, 0x00, 0x00, 0x00, 0x01, 0xfb, 0xdd, 0xff, 0xa2, 0xff, 0xc3, 0x04, 0xbc, 0x00, 0x03, 0x00, 0x00, 0x05, 0x27, 0x01, 0x17, 0xfc, 0x34, 0x56, 0x03, 0x8f, 0x56, 0x5e, 0x4e, 0x04, 0xcc, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfa, 0xa9, 0xff, 0xba, 0xff, 0x9d, 0x06, 0x17, 0x00, 0x03, 0x00, 0x00, 0x05, 0x27, 0x01, 0x17, 0xfb, 0x06, 0x5c, 0x04, 0x96, 0x5c, 0x46, 0x58, 0x06, 0x05, 0x59, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xe7, 0xfe, 0x12, 0xfe, 0xa9, 0xff, 0xbe, 0x00, 0x0d, 0x00, 0x00, 0x05, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x35, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0xfd, 0xe8, 0x51, 0x6f, 0x6f, 0x51, 0x24, 0x2f, 0x2f, 0x24, 0x42, 0x7d, 0x5a, 0x59, 0x7c, 0x78, 0x35, 0x27, 0x28, 0x35, 0x00, 0x01, 0xfd, 0x3f, 0xfe, 0x5b, 0xff, 0x30, 0xff, 0xa5, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x33, 0x15, 0x33, 0x35, 0x33, 0x11, 0xfd, 0x3f, 0x7c, 0xf9, 0x7b, 0xfe, 0x5b, 0x01, 0x4a, 0xc2, 0xc2, 0xfe, 0xb6, 0x00, 0x00, 0x02, 0xfd, 0x6a, 0xfe, 0x14, 0xff, 0x00, 0xff, 0xd6, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x05, 0x11, 0x21, 0x11, 0x01, 0x35, 0x23, 0x15, 0xff, 0x00, 0xfe, 0x6a, 0x01, 0x2a, 0xbe, 0x2a, 0xfe, 0x3e, 0x01, 0xc2, 0xfe, 0xb6, 0xd2, 0xd2, 0x00, 0x01, 0xfc, 0xbf, 0xfe, 0x39, 0xff, 0xa3, 0xff, 0x58, 0x00, 0x14, 0x00, 0x00, 0x05, 0x36, 0x33, 0x32, 0x13, 0x14, 0x15, 0x23, 0x26, 0x23, 0x22, 0x07, 0x23, 0x26, 0x27, 0x22, 0x07, 0x23, 0x12, 0x37, 0x32, 0xfe, 0x31, 0x36, 0x68, 0xc4, 0x0f, 0x69, 0x0c, 0x5e, 0x5b, 0x0e, 0x6a, 0x0b, 0x5e, 0x5b, 0x0e, 0x6a, 0x0d, 0xc6, 0x68, 0xfa, 0x52, 0xfe, 0xe6, 0x02, 0x03, 0x96, 0x96, 0x95, 0x01, 0x96, 0x01, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x73, 0x04, 0xf3, 0xff, 0x02, 0x06, 0xad, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x17, 0x07, 0xfe, 0x3a, 0x70, 0x56, 0x70, 0x70, 0x56, 0x70, 0x71, 0x56, 0x70, 0x70, 0x56, 0x05, 0x70, 0x7d, 0x60, 0x7d, 0x7d, 0x60, 0x7d, 0x7d, 0x60, 0x7d, 0x7d, 0x60, 0x00, 0x01, 0xfe, 0x38, 0x04, 0xc2, 0xff, 0x37, 0x06, 0xd2, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x26, 0x27, 0xfe, 0x70, 0x1e, 0x19, 0x84, 0x79, 0x49, 0x42, 0x08, 0x0b, 0x10, 0x32, 0x1d, 0x19, 0x84, 0x79, 0x49, 0x42, 0x08, 0x0b, 0x10, 0x05, 0xc7, 0x1c, 0x30, 0x1c, 0x50, 0x51, 0x02, 0x6e, 0x02, 0x1b, 0x1c, 0x0a, 0x0c, 0x0f, 0x0e, 0x2b, 0x1c, 0x30, 0x1c, 0x50, 0x51, 0x02, 0x6e, 0x02, 0x1b, 0x1c, 0x0a, 0x0c, 0x0f, 0x0e, 0xff, 0xff, 0xfc, 0x54, 0x04, 0x3a, 0x00, 0x12, 0x06, 0x0b, 0x10, 0x27, 0x07, 0x73, 0xfc, 0x66, 0x00, 0x00, 0x10, 0x07, 0x07, 0x73, 0xfc, 0x66, 0xfe, 0xbe, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xfd, 0x04, 0xf0, 0xfe, 0xad, 0x06, 0x66, 0x10, 0x07, 0x00, 0x43, 0xfc, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xb2, 0x04, 0xee, 0xff, 0x62, 0x06, 0x66, 0x10, 0x07, 0x00, 0x76, 0xfc, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x08, 0x05, 0x1d, 0xff, 0x5b, 0x06, 0x37, 0x10, 0x07, 0x02, 0x9e, 0xfc, 0x65, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xce, 0x04, 0xc2, 0xfe, 0xa8, 0x06, 0xc1, 0x10, 0x06, 0x02, 0xc4, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x36, 0x05, 0x46, 0xff, 0x72, 0x07, 0xd2, 0x10, 0x07, 0x03, 0x1c, 0xfc, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfd, 0xff, 0xfe, 0x56, 0xfe, 0xc5, 0xff, 0xa4, 0x10, 0x07, 0x03, 0x16, 0xfc, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x26, 0x05, 0x1d, 0xff, 0x41, 0x06, 0x49, 0x00, 0x07, 0x00, 0x00, 0x03, 0x23, 0x35, 0x21, 0x15, 0x23, 0x11, 0x21, 0xc0, 0x87, 0xfe, 0xf4, 0x87, 0x02, 0x1a, 0x05, 0x1d, 0x96, 0x96, 0x01, 0x2c, 0x00, 0x00, 0x02, 0xfd, 0x68, 0xfe, 0x32, 0xfe, 0xfe, 0xff, 0xb8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0xfe, 0xfe, 0xfe, 0x6b, 0x01, 0x95, 0xfe, 0x6b, 0x01, 0x95, 0xfe, 0x32, 0x78, 0x96, 0x78, 0x00, 0x00, 0x02, 0xfd, 0x5f, 0xfe, 0x14, 0xff, 0x07, 0xff, 0xa0, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x05, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0xfd, 0x60, 0x87, 0x87, 0x01, 0x20, 0x87, 0x87, 0x60, 0xfe, 0x74, 0x01, 0x8c, 0xfe, 0x74, 0x00, 0x00, 0x01, 0xfd, 0x68, 0xfe, 0x14, 0xfe, 0xfe, 0xff, 0xd6, 0x00, 0x05, 0x00, 0x00, 0x05, 0x21, 0x11, 0x23, 0x11, 0x21, 0xfd, 0x69, 0x01, 0x95, 0x87, 0xfe, 0xf2, 0x2a, 0xfe, 0x3e, 0x01, 0x2c, 0x00, 0x01, 0xfd, 0x0a, 0x04, 0xee, 0xff, 0x5d, 0x06, 0x66, 0x00, 0x27, 0x00, 0x00, 0x01, 0x37, 0x33, 0x07, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x07, 0x23, 0x37, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0xfe, 0x32, 0x3c, 0x62, 0x60, 0x09, 0x14, 0x0f, 0x0b, 0x23, 0x10, 0x10, 0x02, 0x70, 0x02, 0x2e, 0x2d, 0x52, 0x23, 0x1c, 0x1b, 0x1e, 0x3b, 0x63, 0x60, 0x0c, 0x12, 0x0e, 0x0c, 0x22, 0x10, 0x11, 0x01, 0x71, 0x02, 0x2e, 0x2e, 0x52, 0x22, 0x1d, 0x1b, 0x05, 0xff, 0x67, 0xa9, 0x09, 0x0e, 0x0a, 0x24, 0x25, 0x52, 0x87, 0x4a, 0x49, 0x0e, 0x0d, 0x1d, 0x67, 0xa8, 0x0b, 0x0d, 0x0a, 0x24, 0x25, 0x52, 0x87, 0x4a, 0x49, 0x0e, 0x0d, 0x00, 0x03, 0xfd, 0x0a, 0x04, 0x89, 0xff, 0x5d, 0x06, 0xcc, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x00, 0x01, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x07, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0xfe, 0x30, 0x34, 0x16, 0x1c, 0x0b, 0x20, 0x24, 0x71, 0x5d, 0x4d, 0x21, 0x37, 0x2b, 0x33, 0x15, 0x1e, 0x0e, 0x1d, 0x24, 0x70, 0x02, 0x5c, 0x4c, 0x1e, 0x36, 0xd0, 0x87, 0x87, 0xbd, 0x87, 0x87, 0x05, 0x68, 0x21, 0x0e, 0x0b, 0x32, 0x2d, 0x06, 0x65, 0x76, 0x10, 0x1b, 0x1e, 0x0d, 0x0c, 0x33, 0x29, 0x06, 0x64, 0x77, 0x10, 0x2e, 0x96, 0x02, 0x43, 0x96, 0x00, 0x00, 0xff, 0xff, 0xfd, 0x0a, 0x04, 0xc5, 0xff, 0x5d, 0x06, 0x90, 0x10, 0x22, 0x10, 0xed, 0x00, 0xb7, 0x10, 0x03, 0x10, 0xed, 0x00, 0x00, 0x00, 0xa7, 0x00, 0x01, 0xfc, 0xbf, 0xfe, 0x28, 0xff, 0xa7, 0xff, 0xc2, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x37, 0x21, 0x17, 0x23, 0x27, 0x37, 0x33, 0x07, 0x21, 0x27, 0x33, 0x17, 0x07, 0xfe, 0x98, 0x77, 0xfe, 0x49, 0x77, 0x72, 0x9d, 0x9d, 0x72, 0x77, 0x01, 0xb7, 0x77, 0x71, 0x9e, 0x9e, 0xfe, 0x28, 0x9b, 0x9b, 0xcd, 0xcd, 0x9b, 0x9b, 0xcd, 0xcd, 0x00, 0x00, 0x01, 0xfd, 0x7a, 0xfe, 0x14, 0xfe, 0xec, 0xff, 0xa4, 0x00, 0x08, 0x00, 0x00, 0x01, 0x23, 0x35, 0x07, 0x35, 0x37, 0x17, 0x15, 0x27, 0xfe, 0x60, 0x5a, 0x8b, 0xb8, 0xb9, 0x8c, 0xfe, 0x14, 0xe7, 0x84, 0x7e, 0xaf, 0xaf, 0x7e, 0x84, 0x00, 0x00, 0x01, 0xfd, 0xb8, 0x04, 0xe1, 0xfe, 0xae, 0x07, 0x06, 0x00, 0x10, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0xfe, 0xae, 0x3a, 0x26, 0x27, 0x27, 0x26, 0x3a, 0x67, 0x46, 0x48, 0x48, 0x46, 0x67, 0x06, 0x8b, 0x01, 0x2a, 0x2c, 0x40, 0x41, 0x2b, 0x2b, 0x01, 0x7b, 0x01, 0x4f, 0x50, 0xe6, 0x50, 0x4e, 0x01, 0x00, 0xff, 0xff, 0xfd, 0x12, 0x04, 0x60, 0xff, 0x46, 0x06, 0xd8, 0x10, 0x27, 0x02, 0xc2, 0x00, 0x00, 0x00, 0x90, 0x10, 0x06, 0x02, 0xb8, 0x00, 0xe5, 0xff, 0xff, 0xfd, 0x73, 0xfe, 0x14, 0xff, 0x02, 0xff, 0xce, 0x10, 0x07, 0x02, 0xee, 0x00, 0x00, 0xf9, 0x21, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xb8, 0x04, 0xe1, 0xfe, 0xae, 0x07, 0x06, 0x00, 0x12, 0x00, 0x00, 0x01, 0x30, 0x35, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x30, 0x35, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0xfd, 0xb9, 0x66, 0x47, 0x48, 0x48, 0x47, 0x66, 0x39, 0x26, 0x28, 0x28, 0x26, 0x06, 0x8b, 0x7b, 0x01, 0x4e, 0x50, 0xe6, 0x50, 0x4f, 0x01, 0x7b, 0x01, 0x2b, 0x2b, 0x41, 0x40, 0x2c, 0x2a, 0xff, 0xff, 0xff, 0x43, 0x05, 0x44, 0xff, 0xfb, 0x06, 0x10, 0x10, 0x07, 0x02, 0x9b, 0xfd, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xfc, 0xe8, 0xfe, 0x12, 0xff, 0x7e, 0xff, 0xbf, 0x00, 0x07, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x16, 0x32, 0x3e, 0x01, 0x26, 0x22, 0x06, 0x37, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x27, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x12, 0x36, 0x34, 0x26, 0x22, 0x06, 0x14, 0x16, 0xfd, 0x55, 0x30, 0x47, 0x2f, 0x02, 0x31, 0x47, 0x30, 0xde, 0x38, 0xa3, 0x70, 0x70, 0xa4, 0x37, 0x38, 0xa3, 0x70, 0x70, 0xa3, 0xe5, 0x31, 0x31, 0x47, 0x30, 0x30, 0xfe, 0xc3, 0x35, 0x35, 0x4d, 0x37, 0x35, 0x6d, 0x3f, 0x7c, 0xb3, 0x7d, 0x41, 0x40, 0x7d, 0xb3, 0x7c, 0xfe, 0xce, 0x36, 0x4d, 0x36, 0x35, 0x4f, 0x35, 0xff, 0xff, 0xfc, 0xcb, 0xfe, 0x1b, 0x03, 0x35, 0xff, 0x85, 0x10, 0x07, 0x07, 0x74, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xcb, 0x06, 0x6b, 0x03, 0x35, 0x07, 0xd5, 0x10, 0x07, 0x07, 0x74, 0xfd, 0x1b, 0x08, 0x50, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xcb, 0x06, 0xd7, 0x03, 0x35, 0x07, 0x6b, 0x00, 0x03, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0xfc, 0xcb, 0x06, 0x6a, 0xf9, 0x96, 0x07, 0x6b, 0x94, 0x00, 0x00, 0x01, 0xfc, 0xcb, 0xfe, 0xc0, 0x03, 0x35, 0xff, 0x54, 0x00, 0x03, 0x00, 0x00, 0x05, 0x21, 0x15, 0x21, 0xfc, 0xcb, 0x06, 0x6a, 0xf9, 0x96, 0xac, 0x94, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x72, 0x06, 0x0d, 0x02, 0x8e, 0x07, 0x27, 0x00, 0x23, 0x00, 0x00, 0x03, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x04, 0x81, 0x19, 0x48, 0x27, 0x21, 0x5a, 0x30, 0x3f, 0x05, 0x91, 0x03, 0x66, 0x65, 0xb4, 0x52, 0x38, 0x34, 0x51, 0x81, 0x19, 0x48, 0x27, 0x21, 0x57, 0x33, 0x40, 0x04, 0x91, 0x03, 0x66, 0x65, 0xb4, 0x52, 0x38, 0x34, 0x06, 0x4a, 0x37, 0x0b, 0x12, 0x0a, 0x24, 0x30, 0x47, 0x87, 0x4a, 0x49, 0x0e, 0x0d, 0x22, 0x37, 0x0b, 0x12, 0x0a, 0x24, 0x2c, 0x4b, 0x87, 0x4a, 0x49, 0x0e, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xcb, 0x06, 0x04, 0x03, 0x35, 0x07, 0x6e, 0x10, 0x07, 0x07, 0x75, 0xfd, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xd1, 0xfe, 0x28, 0x03, 0x38, 0xff, 0xc2, 0x00, 0x08, 0x00, 0x00, 0x01, 0x35, 0x21, 0x27, 0x33, 0x17, 0x07, 0x23, 0x37, 0xfc, 0xd2, 0x05, 0xcd, 0x76, 0x71, 0x9e, 0x9e, 0x71, 0x76, 0xfe, 0xc3, 0x64, 0x9b, 0xcd, 0xcd, 0x9b, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x00, 0x05, 0xd5, 0x10, 0x06, 0x0e, 0x40, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x03, 0x6f, 0x04, 0x60, 0x10, 0x06, 0x0e, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x80, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xb5, 0x04, 0xcb, 0xb6, 0xfe, 0xac, 0xb7, 0xfe, 0xac, 0xb6, 0x05, 0xd5, 0xfc, 0xf4, 0x02, 0x62, 0xfa, 0xd5, 0x05, 0x2b, 0xfd, 0x9e, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf5, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0xb5, 0x03, 0x3f, 0xa5, 0xa7, 0xa6, 0xa7, 0xa6, 0x05, 0xd5, 0xfc, 0xf4, 0x02, 0x62, 0xfa, 0xd5, 0x05, 0x2b, 0xfd, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0x04, 0x74, 0x01, 0x76, 0x06, 0x66, 0x00, 0x03, 0x00, 0x00, 0x1b, 0x01, 0x33, 0x03, 0x90, 0x3a, 0xac, 0x64, 0x04, 0x74, 0x01, 0xf2, 0xfe, 0x0e, 0x00, 0x01, 0x00, 0x90, 0xfe, 0x56, 0x01, 0x76, 0x00, 0x48, 0x00, 0x03, 0x00, 0x00, 0x25, 0x03, 0x23, 0x13, 0x01, 0x76, 0x3b, 0xab, 0x63, 0x48, 0xfe, 0x0e, 0x01, 0xf2, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x05, 0xd5, 0x10, 0x06, 0x03, 0xac, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x10, 0x06, 0x03, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x01, 0x8a, 0xfe, 0x56, 0x02, 0x51, 0xff, 0xa4, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x02, 0x50, 0x85, 0x17, 0x18, 0x12, 0x86, 0x09, 0x0b, 0x0d, 0x1f, 0xfe, 0x56, 0x21, 0x1a, 0x2e, 0xe5, 0xe5, 0x0e, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x72, 0xff, 0xe3, 0x03, 0x90, 0x04, 0x7b, 0x10, 0x06, 0x02, 0x16, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x10, 0x27, 0x00, 0x79, 0x01, 0x2e, 0xff, 0x84, 0x10, 0x06, 0x00, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x72, 0xff, 0xe3, 0x03, 0x90, 0x04, 0x7b, 0x10, 0x27, 0x00, 0x79, 0x00, 0x80, 0xff, 0x84, 0x10, 0x06, 0x02, 0x16, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8e, 0xff, 0x12, 0x01, 0x96, 0x04, 0x23, 0x12, 0x06, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x4d, 0x04, 0xee, 0x02, 0xfd, 0x06, 0x66, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x02, 0x4a, 0xb3, 0xfe, 0xdb, 0x8a, 0x06, 0x66, 0xfe, 0x88, 0xff, 0xff, 0x00, 0xc1, 0x05, 0x46, 0x02, 0xfd, 0x07, 0xd2, 0x12, 0x26, 0x00, 0x6a, 0x00, 0x00, 0x11, 0x07, 0x03, 0x1b, 0x00, 0x00, 0x01, 0x6c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0xf7, 0x00, 0x00, 0x10, 0x06, 0x03, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc5, 0x02, 0x48, 0x01, 0x83, 0x03, 0x46, 0x12, 0x06, 0x00, 0x79, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, 0x00, 0x00, 0x04, 0xea, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0x9c, 0x00, 0x00, 0x10, 0x07, 0x03, 0x2a, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x05, 0x83, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0xa6, 0x00, 0x00, 0x10, 0x07, 0x03, 0x2c, 0x00, 0xcd, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0x3e, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0xa1, 0x00, 0x00, 0x10, 0x07, 0x03, 0x2e, 0x00, 0xd3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xe3, 0x05, 0x68, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0xa6, 0x00, 0x00, 0x10, 0x06, 0x03, 0x34, 0x24, 0x00, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x05, 0xe9, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0x96, 0x00, 0x00, 0x10, 0x07, 0x03, 0x39, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0x00, 0x00, 0x05, 0x6b, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0x91, 0x00, 0x00, 0x10, 0x06, 0x03, 0x3d, 0x31, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0x40, 0x07, 0xd2, 0x10, 0x27, 0x03, 0x1c, 0xff, 0x43, 0x00, 0x00, 0x12, 0x06, 0x03, 0x4d, 0x0e, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0xb5, 0x03, 0x44, 0xfd, 0x72, 0x05, 0xd5, 0xaa, 0xfa, 0xd5, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x21, 0x05, 0x01, 0x33, 0x01, 0x02, 0x76, 0xfe, 0x8f, 0x02, 0xe3, 0xfc, 0x26, 0x02, 0x01, 0xcf, 0x02, 0x00, 0x05, 0x0e, 0xfb, 0x9a, 0xa8, 0x05, 0xd5, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x03, 0x00, 0x12, 0x00, 0x21, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x01, 0x22, 0x07, 0x06, 0x11, 0x10, 0x12, 0x33, 0x32, 0x37, 0x36, 0x11, 0x10, 0x27, 0x26, 0x27, 0x20, 0x00, 0x11, 0x10, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x01, 0x98, 0x02, 0x7b, 0xfd, 0x85, 0x01, 0x3e, 0xc6, 0x74, 0x75, 0xe9, 0xc6, 0xc6, 0x74, 0x74, 0x74, 0x74, 0xc6, 0x01, 0x1b, 0x01, 0x52, 0xa9, 0xa9, 0xfe, 0xe5, 0xfe, 0xe5, 0xaa, 0xa9, 0xa9, 0xaa, 0x03, 0x70, 0xaa, 0x02, 0x86, 0xa4, 0xa4, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0xa4, 0xa4, 0x01, 0x1a, 0x01, 0x1b, 0xa4, 0xa4, 0xa4, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0x9f, 0xd2, 0xd3, 0xd2, 0xd2, 0x01, 0x62, 0x01, 0x62, 0xd3, 0xd2, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6b, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x33, 0x23, 0x01, 0x33, 0x01, 0x23, 0x01, 0xce, 0xc0, 0x02, 0x01, 0xcf, 0x02, 0x00, 0xbd, 0xfe, 0x55, 0x05, 0xd5, 0xfa, 0x2b, 0x05, 0x0e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x31, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf2, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x01, 0x13, 0x02, 0x80, 0xfd, 0x80, 0x5e, 0x03, 0x3d, 0xfc, 0xc3, 0x03, 0x3d, 0xfc, 0xc3, 0x03, 0x71, 0xaa, 0x03, 0x0e, 0xaa, 0xfb, 0x7f, 0xaa, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x12, 0x06, 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x06, 0x03, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x33, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x21, 0x15, 0x21, 0x35, 0x09, 0x01, 0x35, 0x21, 0x15, 0x21, 0x01, 0x01, 0x86, 0x02, 0x91, 0xfc, 0x9e, 0x01, 0xaf, 0xfe, 0x51, 0x03, 0x51, 0xfd, 0x80, 0x01, 0xaf, 0xaa, 0xaa, 0xaa, 0x02, 0x70, 0x02, 0x11, 0xaa, 0xaa, 0xfd, 0xf3, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0x00, 0x00, 0x05, 0x44, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x11, 0x00, 0x27, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x03, 0x26, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x07, 0x15, 0x23, 0x02, 0x7b, 0x87, 0x58, 0x75, 0x75, 0x58, 0x87, 0xb6, 0x87, 0x58, 0x74, 0x74, 0x58, 0x87, 0xb6, 0xdb, 0x8e, 0xaa, 0xaa, 0x8d, 0xdc, 0xb6, 0xdc, 0x8d, 0xa9, 0xa9, 0x8d, 0xdc, 0xb6, 0x04, 0x8e, 0x15, 0x57, 0x73, 0xc6, 0xc5, 0x73, 0x57, 0x15, 0x15, 0x57, 0x73, 0xc5, 0xc6, 0x73, 0x57, 0x15, 0xfc, 0x10, 0x16, 0x86, 0xa0, 0x01, 0x0f, 0x01, 0x0f, 0xa1, 0x87, 0x16, 0x9f, 0x9f, 0x17, 0x86, 0xa1, 0xfe, 0xf1, 0xfe, 0xf2, 0xa1, 0x86, 0x17, 0x9d, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0x00, 0x00, 0x05, 0x46, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x36, 0x27, 0x22, 0x27, 0x26, 0x03, 0x11, 0x33, 0x11, 0x10, 0x17, 0x16, 0x17, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x02, 0x07, 0x06, 0x23, 0x06, 0x17, 0x02, 0x7b, 0x01, 0x01, 0xc0, 0xaa, 0xa5, 0x04, 0xbf, 0x75, 0x63, 0x7c, 0xb6, 0x7d, 0x63, 0x74, 0xc0, 0x05, 0xa5, 0xa9, 0xc1, 0x01, 0x01, 0x86, 0xb0, 0xd2, 0xcc, 0x01, 0x68, 0x01, 0x99, 0xfe, 0x67, 0xfe, 0xe6, 0xa4, 0x8c, 0x0e, 0x03, 0xf1, 0xfc, 0x0f, 0x0e, 0x8c, 0xa4, 0x01, 0x1a, 0x01, 0x99, 0xfe, 0x67, 0xfe, 0x98, 0xcc, 0xd2, 0x48, 0xee, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x46, 0x00, 0x00, 0x05, 0x3b, 0x05, 0xe7, 0x00, 0x26, 0x00, 0x00, 0x25, 0x15, 0x21, 0x35, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x02, 0x15, 0x14, 0x17, 0x16, 0x17, 0x15, 0x21, 0x35, 0x21, 0x26, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x21, 0x20, 0x17, 0x16, 0x11, 0x14, 0x07, 0x06, 0x07, 0x05, 0x3a, 0xfd, 0xe4, 0xa0, 0x59, 0x59, 0x77, 0x77, 0xc2, 0xc3, 0xee, 0x59, 0x5a, 0xa0, 0xfd, 0xe4, 0x01, 0x1f, 0x8e, 0x41, 0x41, 0xac, 0xac, 0x01, 0x13, 0x01, 0x11, 0xad, 0xad, 0x40, 0x40, 0x91, 0xb2, 0xb2, 0xb2, 0x61, 0xa6, 0xa6, 0xca, 0xf0, 0x91, 0x91, 0xfe, 0xdd, 0xef, 0xca, 0xa6, 0xa6, 0x61, 0xb2, 0xb2, 0x8b, 0x95, 0x95, 0xb8, 0x01, 0x3e, 0xc5, 0xc5, 0xc5, 0xc4, 0xfe, 0xcb, 0xc2, 0x94, 0x94, 0x8d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x02, 0x1c, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x02, 0xde, 0x01, 0x75, 0x13, 0x06, 0x03, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x03, 0xff, 0x01, 0x75, 0x13, 0x06, 0x03, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x12, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x03, 0x1b, 0x63, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x66, 0x10, 0x26, 0x03, 0x1b, 0x48, 0x00, 0x12, 0x06, 0x03, 0x49, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0x00, 0xb2, 0x00, 0x00, 0x12, 0x06, 0x03, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x95, 0x00, 0x00, 0x02, 0x56, 0x06, 0x66, 0x12, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x03, 0x1b, 0xff, 0x59, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x07, 0xd2, 0x12, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x03, 0x1c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x04, 0x79, 0x00, 0x0d, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x1b, 0x01, 0x33, 0x03, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x33, 0x20, 0x02, 0xf9, 0x27, 0x29, 0xa0, 0x78, 0x37, 0x46, 0x43, 0x45, 0x6d, 0x79, 0x40, 0x94, 0x59, 0x94, 0xb9, 0x24, 0x08, 0x20, 0x25, 0x1d, 0x4f, 0x63, 0x55, 0x4b, 0x25, 0x10, 0x29, 0x54, 0x29, 0x80, 0xd3, 0x67, 0x69, 0x72, 0x7f, 0xb2, 0x01, 0x18, 0x02, 0x09, 0xe7, 0xed, 0x6e, 0x8a, 0xb6, 0xdc, 0x69, 0x6b, 0xd5, 0x01, 0xe7, 0x01, 0x25, 0xfd, 0xa1, 0xdb, 0x31, 0x29, 0x30, 0x9c, 0x54, 0x2a, 0x58, 0x6f, 0x57, 0x29, 0x98, 0x9d, 0x01, 0x13, 0x01, 0x26, 0x8a, 0x9a, 0x00, 0x00, 0x02, 0x00, 0xac, 0xfe, 0x56, 0x04, 0x14, 0x06, 0x21, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x10, 0x21, 0x20, 0x11, 0x10, 0x07, 0x16, 0x11, 0x10, 0x21, 0x22, 0x03, 0x16, 0x33, 0x20, 0x11, 0x10, 0x05, 0x35, 0x20, 0x11, 0x34, 0x23, 0x22, 0x11, 0x01, 0x53, 0xa6, 0x01, 0x7f, 0x01, 0x87, 0x9b, 0xfc, 0xfe, 0x4e, 0xbf, 0x50, 0x64, 0xb1, 0x01, 0x04, 0xfe, 0x5e, 0x01, 0x47, 0xd3, 0xeb, 0x45, 0xfe, 0x11, 0x06, 0x03, 0x01, 0xc8, 0xfe, 0x7f, 0xfe, 0xee, 0x64, 0x5a, 0xfe, 0xf5, 0xfe, 0x26, 0x01, 0x4a, 0xad, 0x01, 0x3a, 0x01, 0x1a, 0x16, 0xaa, 0x01, 0x40, 0xdb, 0xfe, 0xc8, 0x00, 0x00, 0x01, 0x00, 0x1c, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x13, 0x01, 0x33, 0x01, 0x11, 0x23, 0x11, 0x01, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x01, 0x45, 0xdc, 0x01, 0x3b, 0xb0, 0xfe, 0x68, 0xa5, 0xfe, 0xf7, 0x27, 0x56, 0x2c, 0x3f, 0xb1, 0x03, 0xb0, 0xfd, 0x4c, 0x03, 0x64, 0xfb, 0xa0, 0xfe, 0x56, 0x01, 0xaa, 0x03, 0x44, 0x7e, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x05, 0xf0, 0x00, 0x1c, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x34, 0x37, 0x36, 0x37, 0x26, 0x35, 0x10, 0x21, 0x32, 0x17, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x03, 0x88, 0x5c, 0xd7, 0xe4, 0xee, 0xba, 0x6a, 0x80, 0x7b, 0x7c, 0xd8, 0xd7, 0x7c, 0x7b, 0x7b, 0x30, 0x43, 0x8c, 0x01, 0x8d, 0xc7, 0x6c, 0xfe, 0x48, 0x3d, 0x31, 0x4e, 0x4d, 0x4d, 0x86, 0x85, 0x9a, 0x51, 0x58, 0x71, 0x3a, 0x05, 0x11, 0x46, 0x75, 0x5c, 0x30, 0x25, 0x70, 0x87, 0xfe, 0xeb, 0xfe, 0xf7, 0x9c, 0x9d, 0x9d, 0x9c, 0x01, 0x13, 0xcc, 0xa5, 0x40, 0x24, 0x4f, 0x8d, 0x01, 0x10, 0x46, 0xfe, 0x28, 0x1d, 0x49, 0x71, 0xcc, 0xcb, 0x72, 0x73, 0xe8, 0xbe, 0xc7, 0x60, 0x67, 0x0b, 0x06, 0x00, 0x00, 0x01, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x04, 0x7c, 0x00, 0x32, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x01, 0x64, 0x65, 0x36, 0x36, 0x66, 0x66, 0xb0, 0x45, 0x99, 0x58, 0x57, 0x48, 0x49, 0x40, 0x6b, 0x3e, 0x3f, 0x3d, 0x3c, 0x69, 0x8b, 0x85, 0x7b, 0x41, 0x46, 0x4b, 0x4d, 0x88, 0x53, 0x4d, 0x4c, 0x40, 0x51, 0x4b, 0x4d, 0x48, 0xd6, 0x74, 0x74, 0x7c, 0x02, 0x5c, 0x18, 0x41, 0x40, 0x5d, 0x8d, 0x4f, 0x4e, 0x18, 0x18, 0xa7, 0x1d, 0x0d, 0x0d, 0x2e, 0x2e, 0x40, 0x46, 0x2d, 0x2c, 0x98, 0x33, 0x38, 0x58, 0x5a, 0x38, 0x38, 0x12, 0x13, 0x25, 0xab, 0x1c, 0x0e, 0x0e, 0x5b, 0x5b, 0xad, 0x6c, 0x92, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 0xfe, 0x52, 0x03, 0x93, 0x06, 0x14, 0x00, 0x1d, 0x00, 0x00, 0x25, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x34, 0x35, 0x16, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x20, 0x03, 0x10, 0x01, 0x21, 0x35, 0x21, 0x15, 0x00, 0x11, 0x10, 0x02, 0x83, 0x76, 0x47, 0x4c, 0x42, 0x49, 0x92, 0x3e, 0x26, 0x1d, 0x1d, 0x1d, 0x33, 0xfd, 0xde, 0x01, 0x02, 0x02, 0xfe, 0x21, 0x03, 0x0f, 0xfd, 0x75, 0x7f, 0x01, 0x4b, 0x4f, 0x78, 0x73, 0x50, 0x57, 0x4b, 0x4c, 0x05, 0x2c, 0x23, 0x25, 0x35, 0x2c, 0x2a, 0x02, 0x33, 0x01, 0xec, 0x01, 0x59, 0xb9, 0xb9, 0xfe, 0x94, 0xfe, 0x27, 0xfe, 0x69, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x04, 0x7b, 0x00, 0x15, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x03, 0xf4, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0x51, 0x50, 0x6a, 0xad, 0x59, 0x5a, 0x02, 0xa4, 0xfb, 0xb2, 0x04, 0x48, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x65, 0x32, 0x32, 0x77, 0x78, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe9, 0x04, 0x03, 0x06, 0x24, 0x00, 0x08, 0x00, 0x11, 0x00, 0x21, 0x00, 0x00, 0x01, 0x21, 0x12, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x02, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x03, 0x01, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x03, 0x52, 0xfd, 0xc3, 0x0e, 0x3e, 0x4d, 0x86, 0x87, 0x4b, 0x42, 0x08, 0x1a, 0x30, 0x4d, 0x85, 0x8a, 0x48, 0x3a, 0x11, 0x01, 0x1d, 0xd8, 0x7c, 0x7b, 0x7b, 0x7c, 0xd8, 0xd9, 0x7a, 0x7b, 0x7b, 0x7a, 0x02, 0xc6, 0xfe, 0xd5, 0x7f, 0x9c, 0x9d, 0x8a, 0x01, 0xc9, 0x01, 0x1c, 0x64, 0x9e, 0x9c, 0x7e, 0xfe, 0xfc, 0x02, 0xb4, 0xd4, 0xd3, 0xfe, 0x8a, 0xfe, 0x8b, 0xd4, 0xd5, 0xd5, 0xd4, 0x01, 0x75, 0x01, 0x76, 0xd3, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x95, 0x00, 0x00, 0x02, 0x30, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x03, 0x01, 0x40, 0x1e, 0x20, 0x62, 0x50, 0x64, 0xa2, 0x4a, 0x4a, 0x01, 0x04, 0x60, 0xfd, 0x2b, 0x91, 0x2e, 0x30, 0x9c, 0x60, 0x62, 0xd4, 0x02, 0xca, 0x00, 0x01, 0x00, 0xab, 0x00, 0x00, 0x04, 0x12, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0xac, 0xab, 0x01, 0xb3, 0xc9, 0xfe, 0x73, 0x01, 0xcb, 0xca, 0xfe, 0x8b, 0x7b, 0xab, 0x04, 0x60, 0xfe, 0x2f, 0x01, 0xd1, 0xfe, 0x5a, 0xfd, 0x46, 0x02, 0x42, 0x81, 0xfe, 0x3f, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x06, 0x14, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x17, 0x16, 0x02, 0x3b, 0x01, 0xd1, 0xb0, 0xfe, 0xe6, 0xfe, 0xa4, 0xaf, 0x01, 0xba, 0x43, 0x2a, 0x60, 0x57, 0x69, 0xcc, 0x05, 0x65, 0xfa, 0x9b, 0x03, 0x3c, 0xfc, 0xc4, 0x04, 0x32, 0xc6, 0x7e, 0x9e, 0x02, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xfe, 0x56, 0x04, 0x68, 0x04, 0x60, 0x10, 0x06, 0x00, 0x77, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0x00, 0x00, 0x03, 0xb0, 0x04, 0x60, 0x00, 0x15, 0x00, 0x00, 0x21, 0x01, 0x33, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x27, 0x33, 0x31, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x76, 0xfe, 0xcd, 0xb2, 0x01, 0x04, 0x6c, 0x5a, 0x45, 0x03, 0x02, 0x16, 0x19, 0x60, 0xa8, 0x3e, 0x29, 0x26, 0x7a, 0xa0, 0x6e, 0x04, 0x60, 0xfc, 0x54, 0x7c, 0xac, 0x81, 0x70, 0x35, 0x64, 0x77, 0x83, 0x59, 0x7c, 0x72, 0x4e, 0xc4, 0xaf, 0xe4, 0x74, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 0xfe, 0x52, 0x03, 0x9b, 0x06, 0x14, 0x00, 0x26, 0x00, 0x00, 0x25, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x34, 0x35, 0x16, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x20, 0x11, 0x10, 0x25, 0x26, 0x11, 0x34, 0x37, 0x23, 0x35, 0x21, 0x15, 0x20, 0x11, 0x14, 0x05, 0x15, 0x24, 0x13, 0x12, 0x02, 0x91, 0x77, 0x47, 0x4b, 0x42, 0x49, 0x92, 0x3e, 0x26, 0x1d, 0x1d, 0x1c, 0x34, 0xfd, 0xcf, 0x01, 0x2c, 0xfc, 0xc6, 0xbb, 0x02, 0xc6, 0xfd, 0xca, 0x01, 0xdb, 0xfd, 0xff, 0x02, 0x01, 0x7f, 0x01, 0x4b, 0x4f, 0x78, 0x73, 0x50, 0x57, 0x4b, 0x4c, 0x05, 0x2c, 0x23, 0x25, 0x35, 0x2c, 0x2a, 0x01, 0xb5, 0x01, 0x2c, 0x58, 0x24, 0x01, 0x04, 0xc5, 0x52, 0xb9, 0xb9, 0xfe, 0xdd, 0xbf, 0x09, 0xaa, 0x16, 0xfe, 0xbc, 0xfe, 0xf1, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x42, 0xff, 0xd9, 0x04, 0x23, 0x04, 0x60, 0x00, 0x17, 0x00, 0x00, 0x13, 0x21, 0x15, 0x23, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x43, 0x03, 0xc5, 0x7f, 0x2d, 0x31, 0x0d, 0x28, 0x06, 0x1f, 0x43, 0x21, 0x6c, 0x53, 0xfe, 0x8c, 0xa9, 0x80, 0x04, 0x60, 0xb8, 0xfd, 0x50, 0x48, 0x3f, 0x05, 0x01, 0x85, 0x0d, 0x0c, 0x83, 0xb0, 0x02, 0x9c, 0xfc, 0x58, 0x03, 0xa8, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x34, 0x05, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0xf8, 0x37, 0x88, 0x35, 0xa4, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xa7, 0x02, 0xda, 0x96, 0x83, 0x84, 0x96, 0x96, 0x84, 0x83, 0x96, 0x03, 0x98, 0x66, 0x5a, 0x23, 0xfe, 0xbc, 0xfe, 0xf8, 0xfe, 0xf8, 0xfe, 0xbc, 0x61, 0x64, 0xfd, 0xae, 0x03, 0xcf, 0xe7, 0xdd, 0xcb, 0xe7, 0xe7, 0xcb, 0xcb, 0xe7, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xfe, 0x52, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x24, 0x00, 0x00, 0x05, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x34, 0x35, 0x16, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x02, 0x64, 0xf2, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x4d, 0x92, 0x44, 0x46, 0x8d, 0x48, 0xa2, 0xb2, 0xb2, 0x9e, 0x76, 0x48, 0x4c, 0x43, 0x49, 0x92, 0x3e, 0x26, 0x1d, 0x1d, 0x1c, 0x1d, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x3a, 0x23, 0x23, 0xac, 0x2b, 0x2b, 0xe3, 0xcd, 0xcd, 0xe3, 0x4c, 0x4f, 0x78, 0x73, 0x50, 0x57, 0x4b, 0x4c, 0x05, 0x2c, 0x23, 0x25, 0x35, 0x2c, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x5b, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x21, 0x15, 0x23, 0x16, 0x15, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x02, 0x34, 0x89, 0x49, 0x4e, 0x9a, 0x86, 0x85, 0x9a, 0x4d, 0x47, 0x8b, 0x02, 0x26, 0xb9, 0x62, 0x7b, 0x7c, 0xd8, 0xd9, 0x7a, 0x7b, 0x7b, 0x66, 0x03, 0xce, 0x6e, 0x73, 0xbe, 0xc9, 0xe7, 0xe8, 0xc8, 0xb7, 0x7a, 0x6e, 0x92, 0xb8, 0x9c, 0xdd, 0xfe, 0xed, 0x9c, 0x9d, 0x9d, 0x9c, 0x01, 0x13, 0x01, 0x15, 0x9b, 0x81, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x03, 0xfc, 0x04, 0x60, 0x00, 0x11, 0x00, 0x00, 0x25, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x14, 0x02, 0x9c, 0x20, 0x62, 0x50, 0x64, 0xa2, 0x4a, 0x4a, 0xfe, 0x86, 0x03, 0xa2, 0xfe, 0x82, 0xcc, 0x30, 0x9c, 0x60, 0x62, 0xd4, 0x02, 0x12, 0xb8, 0xb8, 0xfd, 0xe3, 0x91, 0x00, 0x01, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x04, 0x60, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x27, 0x33, 0x31, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x27, 0x22, 0x27, 0x26, 0x35, 0x03, 0x01, 0x30, 0x2e, 0x31, 0x60, 0x87, 0x5e, 0x36, 0x0d, 0x07, 0x1b, 0x19, 0x5f, 0xa7, 0x3f, 0x29, 0x25, 0x73, 0x8c, 0xe5, 0xa1, 0x5a, 0x59, 0x01, 0x04, 0x60, 0xfd, 0x2b, 0x87, 0x40, 0x45, 0xd0, 0x76, 0xbb, 0x66, 0x80, 0x77, 0x83, 0x5a, 0x7b, 0x73, 0x9a, 0xfd, 0xbb, 0xe4, 0x01, 0x78, 0x76, 0xc5, 0x02, 0xca, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0xfe, 0x56, 0x04, 0x56, 0x04, 0x68, 0x00, 0x0a, 0x00, 0x29, 0x00, 0x00, 0x01, 0x22, 0x15, 0x11, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x11, 0x23, 0x11, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x11, 0x10, 0x02, 0xea, 0x3a, 0x55, 0x55, 0x4d, 0x4d, 0x40, 0x30, 0x7e, 0x73, 0x7b, 0x7b, 0x75, 0xb6, 0xa5, 0xb4, 0x77, 0x7b, 0x7b, 0x5b, 0x95, 0x3b, 0x34, 0x4e, 0x4d, 0x46, 0x65, 0x03, 0xcb, 0x91, 0xfd, 0x52, 0x68, 0x5d, 0xdf, 0xd0, 0x70, 0x5b, 0x9d, 0x84, 0x8d, 0xfe, 0xd9, 0xfe, 0xf1, 0xa1, 0x98, 0xfe, 0x6e, 0x01, 0x91, 0x99, 0x9c, 0x01, 0x13, 0x01, 0x1e, 0x92, 0x6d, 0x1c, 0xa3, 0x17, 0x4e, 0x73, 0xbe, 0xca, 0x73, 0x67, 0x02, 0xaf, 0x01, 0x2e, 0x00, 0x00, 0x01, 0x00, 0x35, 0xfe, 0x55, 0x03, 0xf4, 0x04, 0x61, 0x00, 0x17, 0x00, 0x00, 0x05, 0x03, 0x01, 0x23, 0x01, 0x03, 0x26, 0x2b, 0x01, 0x35, 0x17, 0x16, 0x17, 0x13, 0x01, 0x33, 0x01, 0x13, 0x16, 0x3b, 0x01, 0x15, 0x27, 0x26, 0x02, 0x92, 0x85, 0xfe, 0xeb, 0xc3, 0x01, 0x87, 0xa4, 0x2c, 0x8b, 0x2c, 0x3f, 0xe8, 0x3a, 0x86, 0x01, 0x14, 0xc4, 0xfe, 0x79, 0xa4, 0x2c, 0x8b, 0x2c, 0x3f, 0xe9, 0xfa, 0x01, 0x7f, 0xfd, 0xd0, 0x03, 0x18, 0x01, 0xd7, 0x7e, 0x9e, 0x02, 0x07, 0xa7, 0xfe, 0x81, 0x02, 0x30, 0xfc, 0xe8, 0xfe, 0x29, 0x7e, 0x9e, 0x02, 0x07, 0x00, 0x00, 0x01, 0x00, 0x64, 0xfe, 0x56, 0x04, 0x56, 0x04, 0x60, 0x00, 0x1b, 0x00, 0x00, 0x05, 0x26, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x17, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x07, 0x11, 0x23, 0x02, 0x0b, 0xd0, 0x60, 0x76, 0xa7, 0x4d, 0x43, 0x6f, 0xa5, 0x76, 0x3c, 0x4c, 0xa8, 0x76, 0x6a, 0xc6, 0xa5, 0x19, 0x25, 0x61, 0x77, 0xf3, 0x02, 0x89, 0xfd, 0x7e, 0xb7, 0x4c, 0x42, 0x0e, 0x03, 0xd5, 0xfc, 0x2c, 0x0e, 0x42, 0x54, 0xaf, 0x02, 0x81, 0xfd, 0x78, 0xfc, 0x6e, 0x63, 0x23, 0xfe, 0x6e, 0x00, 0x00, 0x01, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x04, 0x60, 0x00, 0x1a, 0x00, 0x00, 0x05, 0x20, 0x11, 0x34, 0x13, 0x33, 0x02, 0x15, 0x10, 0x33, 0x32, 0x11, 0x33, 0x10, 0x33, 0x32, 0x11, 0x34, 0x03, 0x33, 0x12, 0x15, 0x10, 0x21, 0x22, 0x03, 0x02, 0x01, 0xef, 0xfe, 0x8b, 0x8b, 0xb2, 0x81, 0xc8, 0xb7, 0x99, 0xb7, 0xc7, 0x80, 0xb2, 0x8c, 0xfe, 0x8a, 0xf5, 0x1d, 0x25, 0x1d, 0x02, 0x52, 0xeb, 0x01, 0x40, 0xfe, 0xc0, 0xf0, 0xfe, 0x4f, 0x02, 0x1a, 0xfd, 0xe6, 0x01, 0xb1, 0xf0, 0x01, 0x40, 0xfe, 0xc0, 0xeb, 0xfd, 0xae, 0x01, 0x2b, 0xfe, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0x3e, 0x06, 0x10, 0x12, 0x26, 0x03, 0x4d, 0x0e, 0x00, 0x10, 0x07, 0x00, 0x6a, 0xff, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x10, 0x10, 0x26, 0x00, 0x6a, 0x1a, 0x00, 0x12, 0x06, 0x03, 0x59, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x26, 0x03, 0x1b, 0x70, 0x00, 0x12, 0x06, 0x03, 0x53, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x26, 0x03, 0x1b, 0x1f, 0x00, 0x12, 0x06, 0x03, 0x59, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x12, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x03, 0x1b, 0x01, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0xe0, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x02, 0x23, 0x13, 0x01, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x5b, 0xea, 0xfd, 0x65, 0x02, 0xca, 0xfe, 0xb7, 0x79, 0xf5, 0xfd, 0x59, 0xb6, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x77, 0xfd, 0x48, 0xfc, 0xe3, 0xfe, 0x56, 0x01, 0x84, 0x02, 0xf5, 0xfd, 0x31, 0x00, 0x03, 0x00, 0x96, 0xff, 0xe9, 0x03, 0xdf, 0x06, 0x24, 0x00, 0x0a, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x00, 0x01, 0x32, 0x36, 0x37, 0x36, 0x37, 0x34, 0x23, 0x22, 0x07, 0x06, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x02, 0x37, 0x36, 0x17, 0x1e, 0x01, 0x12, 0x06, 0x07, 0x06, 0x23, 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x26, 0x01, 0x45, 0x48, 0xb7, 0x3d, 0x6c, 0x01, 0xb7, 0x6e, 0x53, 0x31, 0x01, 0xbd, 0xdd, 0x35, 0x72, 0xfe, 0x40, 0x7d, 0x64, 0x02, 0x6c, 0x79, 0xbd, 0x94, 0xc4, 0x02, 0x54, 0xe2, 0x50, 0xc9, 0x34, 0x48, 0x9d, 0x81, 0x4e, 0x16, 0x9b, 0x03, 0x70, 0x04, 0x3d, 0x6c, 0x93, 0xde, 0xba, 0x6c, 0xfe, 0xc7, 0xa7, 0xe9, 0x82, 0x5f, 0xd5, 0xd5, 0xa8, 0x03, 0x2c, 0xbe, 0xd5, 0x01, 0x01, 0xe2, 0xfe, 0xe5, 0xb6, 0x96, 0x14, 0xfe, 0xea, 0x80, 0xb0, 0x9c, 0x2d, 0xd1, 0x9e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe9, 0x04, 0x03, 0x06, 0x24, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x20, 0x27, 0x26, 0x11, 0x34, 0x36, 0x33, 0x32, 0x12, 0x10, 0x00, 0x20, 0x02, 0x11, 0x17, 0x15, 0x10, 0x12, 0x20, 0x12, 0x03, 0x50, 0x2c, 0x3c, 0x86, 0x4a, 0x6c, 0x6c, 0x43, 0xf7, 0xfe, 0xeb, 0x76, 0xbd, 0xbb, 0x9d, 0xc4, 0xdd, 0xff, 0x00, 0xfe, 0x53, 0xf0, 0xa9, 0x9e, 0x01, 0x11, 0x94, 0x03, 0x70, 0xf6, 0x7e, 0xaa, 0x89, 0x5a, 0xaa, 0x5a, 0x37, 0xaa, 0x41, 0x69, 0x01, 0x36, 0xa0, 0xde, 0xfe, 0x64, 0xfc, 0xfc, 0xfe, 0x65, 0x01, 0xb6, 0x01, 0xd2, 0x01, 0xa0, 0xfe, 0xf3, 0xfe, 0xbd, 0x01, 0x42, 0x00, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x00, 0x04, 0xc9, 0x05, 0xdf, 0x00, 0x20, 0x00, 0x00, 0x01, 0x06, 0x03, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x02, 0x27, 0x26, 0x22, 0x07, 0x35, 0x36, 0x32, 0x17, 0x04, 0x13, 0x12, 0x25, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x03, 0xd9, 0x90, 0x4a, 0x26, 0xb7, 0x26, 0x49, 0x90, 0x46, 0x6b, 0x24, 0x1c, 0x64, 0x4d, 0x01, 0x22, 0x41, 0x60, 0x01, 0x03, 0x22, 0x56, 0x25, 0x4b, 0x0f, 0x17, 0x44, 0x77, 0x05, 0x11, 0x48, 0xfe, 0xf3, 0x8d, 0xa5, 0xfd, 0x76, 0x02, 0x8a, 0xa5, 0x8d, 0x01, 0x0d, 0x48, 0x23, 0x09, 0xaa, 0x0a, 0x0d, 0x30, 0xfe, 0x72, 0x01, 0x7b, 0x43, 0x09, 0x20, 0x40, 0x5b, 0x29, 0x2f, 0x42, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x05, 0xf8, 0x06, 0x66, 0x10, 0x27, 0x03, 0x1b, 0xfe, 0x96, 0x00, 0x00, 0x10, 0x07, 0x03, 0x66, 0x01, 0x2e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4e, 0x00, 0x00, 0x04, 0xc9, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x4b, 0x01, 0x75, 0x12, 0x06, 0x03, 0x66, 0x00, 0x00, 0x00, 0x03, 0x00, 0x64, 0xfe, 0x56, 0x04, 0x56, 0x06, 0x14, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x00, 0x01, 0x11, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x11, 0x23, 0x11, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x33, 0x11, 0x13, 0x32, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x23, 0x03, 0x11, 0x22, 0x07, 0x06, 0x17, 0x16, 0x17, 0x16, 0x02, 0xb0, 0xb3, 0x78, 0x7b, 0x7b, 0x78, 0xb3, 0xa5, 0xb4, 0x77, 0x7b, 0x7b, 0x77, 0xb4, 0xa5, 0x65, 0x45, 0x4c, 0x01, 0x01, 0x4e, 0x45, 0x65, 0xa5, 0x66, 0x45, 0x4e, 0x01, 0x01, 0x4c, 0x45, 0x06, 0x14, 0xfe, 0x63, 0x99, 0x9c, 0xfe, 0xed, 0xfe, 0xed, 0x9c, 0x99, 0xfe, 0x6f, 0x01, 0x91, 0x99, 0x9c, 0x01, 0x13, 0x01, 0x13, 0x9c, 0x99, 0x01, 0x9d, 0xfa, 0x77, 0x67, 0x73, 0xca, 0xc8, 0x75, 0x67, 0xfc, 0xb8, 0x03, 0x48, 0x67, 0x75, 0xc8, 0xca, 0x73, 0x67, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3a, 0xff, 0xe3, 0x05, 0xc9, 0x04, 0x60, 0x00, 0x10, 0x00, 0x1e, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x23, 0x16, 0x15, 0x10, 0x25, 0x26, 0x03, 0x02, 0x23, 0x20, 0x11, 0x34, 0x37, 0x29, 0x01, 0x06, 0x15, 0x10, 0x33, 0x32, 0x03, 0x33, 0x02, 0x37, 0x36, 0x11, 0x34, 0x3a, 0x05, 0x8e, 0x84, 0x46, 0xfe, 0x8a, 0xf4, 0x1e, 0x25, 0xee, 0xfe, 0x8b, 0x45, 0x03, 0xce, 0xfc, 0xe9, 0x40, 0xc8, 0xbb, 0x04, 0x99, 0x04, 0xbb, 0xc7, 0x03, 0xa8, 0xb8, 0xb8, 0xcf, 0xa4, 0xfd, 0xad, 0x01, 0x01, 0x01, 0x2a, 0xfe, 0xd5, 0x02, 0x52, 0xa4, 0xcf, 0xd1, 0xa7, 0xfe, 0x4f, 0x02, 0x1a, 0xfd, 0xe3, 0x03, 0x03, 0x01, 0xae, 0xa7, 0x00, 0x01, 0x00, 0x64, 0xfe, 0x5b, 0x04, 0x53, 0x04, 0x67, 0x00, 0x39, 0x00, 0x00, 0x05, 0x26, 0x27, 0x26, 0x34, 0x37, 0x07, 0x02, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x01, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x32, 0x17, 0x04, 0x11, 0x14, 0x07, 0x37, 0x12, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x01, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x02, 0x07, 0x06, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x03, 0x93, 0xdd, 0x1e, 0x09, 0x0c, 0xaa, 0x57, 0xb4, 0x31, 0x1f, 0x31, 0x01, 0x07, 0x37, 0x0c, 0x18, 0x7f, 0x34, 0x52, 0x3a, 0x52, 0x17, 0x19, 0x01, 0x00, 0x1a, 0xaa, 0x56, 0xb4, 0x32, 0x1f, 0x31, 0xfe, 0xf9, 0x37, 0x0c, 0x18, 0x7f, 0x34, 0x51, 0x22, 0xb8, 0x3f, 0x92, 0x54, 0x56, 0x41, 0x94, 0x0a, 0x20, 0xf0, 0x49, 0x81, 0x35, 0x6c, 0xfe, 0xf7, 0x7c, 0x22, 0x4f, 0x9a, 0x01, 0x09, 0x8a, 0x7a, 0x3a, 0x36, 0x68, 0x6c, 0xe0, 0x30, 0x04, 0x27, 0xfe, 0xc3, 0x5b, 0x4d, 0x6c, 0x01, 0x09, 0x7c, 0x22, 0x4f, 0x9a, 0xfe, 0xf7, 0x8a, 0x7a, 0x3a, 0x36, 0x68, 0x6c, 0xfd, 0xe0, 0x66, 0x24, 0x31, 0xa0, 0x31, 0x00, 0x02, 0x00, 0x67, 0xfe, 0x58, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x00, 0x05, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x10, 0x37, 0x36, 0x21, 0x20, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x02, 0x20, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x11, 0x10, 0x27, 0x03, 0x2a, 0xa6, 0xe2, 0x90, 0xaa, 0xaa, 0xa9, 0x01, 0x1b, 0x01, 0x1b, 0xa9, 0xa9, 0xa9, 0x8f, 0x6f, 0xfe, 0x74, 0x74, 0x75, 0x75, 0x74, 0x01, 0x8c, 0x74, 0x74, 0x74, 0x18, 0xfe, 0x70, 0x01, 0x90, 0x1a, 0xb3, 0xd2, 0x02, 0xc4, 0xd3, 0xd2, 0xd2, 0xd3, 0xfe, 0x9e, 0xfe, 0x9f, 0xd2, 0xb3, 0x05, 0x49, 0xa4, 0xa4, 0xfe, 0xe5, 0xfe, 0xe6, 0xa4, 0xa4, 0xa4, 0xa4, 0x01, 0x1a, 0x01, 0x1b, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x03, 0x04, 0x7b, 0x00, 0x0d, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x10, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x03, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x33, 0x32, 0x12, 0x11, 0x10, 0x07, 0x06, 0x02, 0x34, 0x85, 0x4d, 0x4e, 0x4d, 0x4d, 0x86, 0x85, 0x9a, 0x4d, 0x4d, 0x34, 0x99, 0xab, 0x60, 0x7b, 0x7b, 0x7a, 0xd9, 0xd8, 0xf7, 0x7b, 0x60, 0x03, 0xdf, 0x73, 0x74, 0xfe, 0x6e, 0x74, 0x73, 0xe8, 0xc8, 0xc7, 0x74, 0x75, 0xfc, 0x09, 0xfe, 0x6e, 0x01, 0x92, 0x1b, 0x7d, 0x9c, 0x01, 0x13, 0x01, 0x14, 0x9c, 0x9c, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0x9c, 0x7b, 0x00, 0x01, 0x00, 0x7d, 0xfe, 0x52, 0x04, 0x34, 0x05, 0xd5, 0x00, 0x24, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x34, 0x35, 0x16, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x20, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x29, 0x01, 0x15, 0x02, 0xf2, 0xf2, 0x56, 0x6f, 0x52, 0x62, 0xb4, 0x6e, 0x50, 0x4b, 0x42, 0x48, 0x93, 0x3e, 0x26, 0x1d, 0x1d, 0x1c, 0x34, 0xfe, 0xe0, 0x80, 0x86, 0xa7, 0x7c, 0x01, 0x52, 0x01, 0x42, 0x05, 0x2b, 0x77, 0x98, 0xfe, 0xcd, 0xfe, 0xb5, 0x7f, 0x98, 0x54, 0x4f, 0x78, 0x73, 0x50, 0x57, 0x4b, 0x4c, 0x05, 0x2c, 0x23, 0x25, 0x35, 0x2c, 0x2a, 0xcb, 0xd6, 0x01, 0x65, 0x01, 0x4e, 0xed, 0xb1, 0xaa, 0x00, 0x00, 0x01, 0x00, 0x65, 0xfe, 0x52, 0x03, 0xe3, 0x04, 0x60, 0x00, 0x20, 0x00, 0x00, 0x05, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x21, 0x15, 0x21, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x34, 0x35, 0x16, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x02, 0x2a, 0xb8, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x01, 0x82, 0xfe, 0x86, 0xa2, 0xb2, 0xb2, 0x64, 0x75, 0x48, 0x4c, 0x43, 0x48, 0x92, 0x3e, 0x26, 0x1c, 0x1c, 0x1d, 0x1d, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x1f, 0x9c, 0xc7, 0xce, 0xcd, 0xe3, 0x4c, 0x4f, 0x78, 0x73, 0x50, 0x57, 0x4b, 0x4c, 0x05, 0x2c, 0x23, 0x25, 0x35, 0x2c, 0x2a, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xba, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x29, 0x00, 0x00, 0x00, 0x01, 0xff, 0x53, 0xfe, 0x56, 0x02, 0xf3, 0x06, 0x14, 0x00, 0x27, 0x00, 0x00, 0x33, 0x11, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0xd6, 0x7b, 0x56, 0x98, 0x2c, 0x2d, 0x2c, 0x2e, 0x20, 0x25, 0x25, 0x28, 0x6c, 0x34, 0x43, 0x01, 0x21, 0xfe, 0xdf, 0x7d, 0x59, 0x9b, 0x34, 0x2e, 0x2d, 0x2a, 0x2c, 0x2d, 0x2d, 0x2b, 0x4f, 0x39, 0x4a, 0x04, 0x82, 0xa0, 0x8e, 0x64, 0x09, 0x09, 0x12, 0xa4, 0x1c, 0x0e, 0x0f, 0x3e, 0x51, 0x6f, 0xfe, 0xc9, 0x8f, 0xfd, 0x3f, 0x92, 0xa5, 0x73, 0x0a, 0x0b, 0x16, 0xa4, 0x1f, 0x10, 0x11, 0x4b, 0x5f, 0x00, 0x00, 0x01, 0x00, 0xa1, 0xff, 0xfc, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x01, 0x03, 0x01, 0x03, 0x06, 0x17, 0x16, 0x37, 0x15, 0x22, 0x27, 0x26, 0x37, 0x13, 0x01, 0x13, 0x36, 0x27, 0x26, 0x07, 0x35, 0x32, 0x17, 0x16, 0x01, 0xfd, 0x63, 0x02, 0xbe, 0xd2, 0x23, 0x18, 0x3b, 0x76, 0xcf, 0x49, 0x55, 0x11, 0x8b, 0xfd, 0x52, 0x9b, 0x23, 0x19, 0x3b, 0x76, 0xcf, 0x49, 0x55, 0x04, 0x87, 0xfe, 0x5b, 0x01, 0x7e, 0xfd, 0x2c, 0x60, 0x2a, 0x6c, 0x23, 0xbd, 0x46, 0x52, 0xb6, 0x01, 0xda, 0xfe, 0x91, 0x02, 0x90, 0x60, 0x2a, 0x6c, 0x23, 0xbd, 0x46, 0x52, 0x00, 0x01, 0x00, 0xab, 0x00, 0x00, 0x04, 0x14, 0x06, 0x13, 0x00, 0x07, 0x00, 0x00, 0x01, 0x03, 0x23, 0x13, 0x21, 0x13, 0x33, 0x03, 0x04, 0x14, 0xfd, 0xa5, 0xcb, 0xfd, 0x6f, 0xfd, 0xa5, 0xcb, 0x03, 0x70, 0xfc, 0x90, 0x02, 0xc6, 0x03, 0x4d, 0xfd, 0x5d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x66, 0xfe, 0x56, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x21, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x06, 0x07, 0x35, 0x36, 0x21, 0x20, 0x13, 0x12, 0x11, 0x10, 0x03, 0x23, 0x12, 0x11, 0x10, 0x27, 0x06, 0x07, 0x06, 0x15, 0x11, 0x23, 0x36, 0x11, 0x34, 0x3f, 0x01, 0x02, 0x21, 0x22, 0x02, 0x16, 0x99, 0xb9, 0x5d, 0xbb, 0x01, 0x5b, 0x01, 0xaa, 0xd5, 0xc1, 0xde, 0xca, 0xea, 0x4a, 0x4a, 0x55, 0x3a, 0xb8, 0x02, 0xa3, 0xa9, 0xbb, 0xfe, 0xc6, 0x2b, 0x05, 0x3a, 0xfd, 0x8c, 0x02, 0x49, 0x4b, 0x69, 0xc6, 0xcf, 0xfe, 0xce, 0xfe, 0xec, 0xfd, 0xc2, 0xfe, 0x58, 0xfe, 0x92, 0x01, 0x4c, 0x01, 0xca, 0x01, 0xd1, 0x7d, 0x2f, 0x4d, 0x34, 0xd0, 0xfd, 0xc6, 0x21, 0x02, 0x14, 0xf7, 0x8f, 0x8d, 0x01, 0x04, 0x00, 0x01, 0x00, 0x6b, 0xfe, 0x90, 0x04, 0x21, 0x04, 0x78, 0x00, 0x16, 0x00, 0x00, 0x01, 0x03, 0x23, 0x01, 0x26, 0x27, 0x01, 0x23, 0x01, 0x26, 0x27, 0x26, 0x23, 0x35, 0x20, 0x17, 0x16, 0x13, 0x12, 0x11, 0x23, 0x10, 0x27, 0x03, 0x16, 0xd7, 0xa6, 0x01, 0x40, 0x0d, 0x2d, 0xfe, 0x73, 0xa7, 0x01, 0xe9, 0x58, 0x2a, 0xa9, 0xbe, 0x01, 0x0f, 0xda, 0xc9, 0x9b, 0x69, 0x98, 0x56, 0x01, 0x34, 0xfe, 0xcc, 0x01, 0xc0, 0x23, 0x4d, 0xfd, 0xd0, 0x02, 0xb0, 0x7f, 0x21, 0x84, 0xa4, 0xd8, 0xc8, 0xfe, 0x50, 0xfe, 0xdf, 0xfe, 0x89, 0x01, 0x5e, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xfe, 0x4b, 0x06, 0x52, 0x05, 0xd5, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x10, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x34, 0x13, 0x36, 0x37, 0x33, 0x06, 0x03, 0x06, 0x15, 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x11, 0x34, 0x27, 0x02, 0x27, 0x33, 0x16, 0x17, 0x12, 0x06, 0x51, 0x37, 0x3d, 0xc5, 0xa2, 0xf8, 0x6a, 0x7e, 0x58, 0x7c, 0x6d, 0xb9, 0x93, 0x5c, 0x3d, 0x5a, 0x24, 0x23, 0x5a, 0x5b, 0x83, 0xbe, 0x6d, 0x6e, 0x5a, 0x35, 0x53, 0xe0, 0x4b, 0x7a, 0x3c, 0x41, 0x42, 0x70, 0x67, 0x40, 0x40, 0xb3, 0x3f, 0x3f, 0x69, 0x78, 0x3b, 0x40, 0x3c, 0x7a, 0x4c, 0xe1, 0x56, 0x32, 0x5a, 0x02, 0xe0, 0xfe, 0xef, 0xcb, 0xe6, 0xa6, 0x88, 0x64, 0x2a, 0x17, 0x85, 0x18, 0x30, 0x51, 0x80, 0x17, 0x41, 0x5e, 0xad, 0xad, 0x5e, 0x5e, 0xb1, 0xb4, 0x01, 0x98, 0xc9, 0x01, 0x0e, 0x9f, 0x7f, 0x46, 0xfe, 0xbf, 0x9f, 0xb7, 0xfe, 0xcd, 0x6b, 0x6d, 0x69, 0x68, 0xc6, 0xf1, 0xf1, 0xc6, 0x68, 0x69, 0x6d, 0x77, 0x01, 0x27, 0xb7, 0x9f, 0x01, 0x41, 0x46, 0x82, 0x9c, 0xfe, 0xeb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x79, 0xfe, 0x55, 0x05, 0x8a, 0x04, 0x60, 0x00, 0x25, 0x00, 0x00, 0x21, 0x26, 0x03, 0x02, 0x23, 0x20, 0x11, 0x34, 0x13, 0x33, 0x02, 0x15, 0x10, 0x17, 0x16, 0x03, 0x33, 0x02, 0x37, 0x36, 0x11, 0x34, 0x03, 0x33, 0x12, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x36, 0x04, 0x14, 0xf8, 0x1a, 0x20, 0xf3, 0xfe, 0x8b, 0x79, 0xc4, 0x81, 0xc8, 0xbc, 0x05, 0x99, 0x03, 0xba, 0xc7, 0x80, 0xc4, 0x7a, 0x33, 0x5e, 0xb2, 0x8a, 0xbd, 0x61, 0x64, 0x52, 0x49, 0x7d, 0xb3, 0x01, 0x01, 0x0d, 0xfe, 0xed, 0x02, 0x3a, 0xeb, 0x01, 0x40, 0xfe, 0xc0, 0xf0, 0xfe, 0x97, 0x01, 0x01, 0x01, 0xd4, 0xfe, 0x2b, 0x02, 0x02, 0x01, 0x68, 0xf0, 0x01, 0x40, 0xfe, 0xc0, 0xeb, 0xd1, 0x84, 0xf4, 0x9e, 0x7b, 0x49, 0x25, 0x10, 0x6c, 0x0b, 0x2b, 0x3f, 0x00, 0x00, 0x01, 0x00, 0x67, 0xfe, 0x56, 0x04, 0xc1, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x10, 0x13, 0x36, 0x25, 0x02, 0xa1, 0xa2, 0x56, 0x78, 0x63, 0x58, 0xb0, 0xb0, 0x58, 0x5a, 0xc3, 0xc3, 0x3e, 0x5d, 0x5e, 0x99, 0xe6, 0x8d, 0x91, 0xa7, 0x88, 0x01, 0x0a, 0x05, 0x4a, 0x12, 0x84, 0xb9, 0xfe, 0xee, 0xf9, 0xab, 0x98, 0x98, 0x99, 0x01, 0x0b, 0x02, 0xec, 0xf8, 0x81, 0x02, 0x90, 0x84, 0x40, 0x3f, 0xd5, 0xdd, 0x01, 0x47, 0x01, 0x36, 0x01, 0x08, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x18, 0x04, 0x7b, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x02, 0x4a, 0x8b, 0x48, 0x66, 0x54, 0x4b, 0x01, 0x2b, 0x4b, 0x4c, 0xa6, 0xa6, 0x34, 0x4f, 0x51, 0x81, 0xc4, 0x78, 0x7b, 0x8e, 0x72, 0xe4, 0x03, 0xfd, 0x0e, 0x63, 0x8d, 0xd0, 0xbd, 0x81, 0x74, 0x73, 0x74, 0xcb, 0x02, 0x31, 0xf9, 0xf6, 0x02, 0x52, 0x64, 0x30, 0x31, 0xa2, 0xa8, 0xf8, 0xec, 0xc8, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x4b, 0x05, 0x4c, 0x05, 0xd5, 0x00, 0x25, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x11, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x02, 0xf8, 0x01, 0x09, 0x9f, 0xab, 0x36, 0x3c, 0x99, 0xaf, 0xd9, 0xa7, 0x41, 0x58, 0x79, 0x70, 0xc4, 0x88, 0x7b, 0x27, 0x31, 0x71, 0x68, 0xb8, 0xb7, 0x68, 0x65, 0xb6, 0xb6, 0x46, 0x5e, 0x5f, 0x04, 0x7b, 0xb3, 0xc2, 0xfe, 0xfd, 0xcc, 0xa1, 0xb2, 0x80, 0x93, 0x45, 0x35, 0x0c, 0x85, 0x16, 0x32, 0x57, 0x7a, 0x6d, 0x68, 0x7f, 0xc0, 0x9d, 0x96, 0x86, 0x81, 0x7e, 0xde, 0xfe, 0x27, 0x05, 0xd5, 0xfd, 0x9a, 0x87, 0x42, 0x43, 0x00, 0x00, 0x00, 0x02, 0x00, 0x28, 0xff, 0xe3, 0x04, 0x1d, 0x04, 0x9a, 0x00, 0x17, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x36, 0x37, 0x17, 0x06, 0x02, 0xdb, 0x73, 0x7e, 0x1c, 0x32, 0x1a, 0x21, 0x1a, 0x0f, 0x0c, 0x0a, 0x0e, 0x16, 0x17, 0x1f, 0x1d, 0x1b, 0x17, 0x40, 0x35, 0x42, 0x20, 0xf0, 0x61, 0x72, 0x64, 0xee, 0x7f, 0x59, 0x44, 0x2f, 0x3b, 0x49, 0x4c, 0x7a, 0x56, 0x74, 0x4a, 0x39, 0x52, 0x8d, 0x47, 0x44, 0x2c, 0x19, 0x1c, 0x3e, 0x6a, 0x5c, 0x40, 0x24, 0x41, 0x2d, 0x3a, 0x2b, 0x25, 0x1b, 0x1a, 0x1c, 0x29, 0x38, 0x48, 0x5b, 0x55, 0xbd, 0x81, 0x33, 0x26, 0x7a, 0x31, 0x03, 0x44, 0x98, 0x16, 0x0b, 0x21, 0x1a, 0x20, 0x1b, 0x21, 0x20, 0x15, 0x1c, 0x11, 0x14, 0x06, 0x05, 0x19, 0x14, 0x31, 0x18, 0x32, 0xc0, 0xd4, 0xb0, 0x9c, 0x88, 0x2e, 0x23, 0x41, 0x93, 0x4c, 0x2e, 0x23, 0x5e, 0x59, 0x7f, 0x8c, 0x71, 0x19, 0x17, 0x34, 0x2b, 0x26, 0x02, 0x01, 0x0a, 0x07, 0x22, 0x1a, 0x48, 0x34, 0x42, 0x3b, 0x3b, 0x3d, 0x2f, 0x3f, 0x22, 0x2b, 0x9f, 0x56, 0x68, 0x50, 0x92, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0xfe, 0x56, 0x04, 0x8a, 0x05, 0xf6, 0x00, 0x21, 0x00, 0x00, 0x05, 0x06, 0x23, 0x20, 0x01, 0x00, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x02, 0x01, 0x16, 0x33, 0x20, 0x37, 0x04, 0x7b, 0xe7, 0xf7, 0xfe, 0xd0, 0xfe, 0xda, 0x02, 0x74, 0xa1, 0x62, 0x62, 0x59, 0x93, 0xa2, 0x55, 0x1f, 0x16, 0xd8, 0x28, 0x4d, 0x93, 0xfc, 0xf7, 0x91, 0x92, 0x92, 0xee, 0xfe, 0x48, 0x8d, 0xbf, 0x01, 0x0c, 0xd1, 0xec, 0xbe, 0x01, 0xa3, 0x01, 0xf1, 0xdb, 0x84, 0x9c, 0x8d, 0x65, 0x5d, 0x92, 0x36, 0x3f, 0xa1, 0x66, 0xc2, 0x90, 0x91, 0xf1, 0xd8, 0xb6, 0xfe, 0xf2, 0xfe, 0x85, 0xb5, 0xb3, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0xfe, 0x56, 0x03, 0xf9, 0x04, 0x7b, 0x00, 0x20, 0x00, 0x00, 0x01, 0x06, 0x23, 0x22, 0x01, 0x00, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x16, 0x33, 0x32, 0x37, 0x03, 0xec, 0xc4, 0xd2, 0xf7, 0xfe, 0xfb, 0x02, 0x08, 0x96, 0x53, 0x53, 0x4b, 0x7d, 0x8a, 0x48, 0x1b, 0x12, 0xb7, 0x21, 0x41, 0x7e, 0xd6, 0xd1, 0xf8, 0x7c, 0x9e, 0xfe, 0x5e, 0x82, 0x98, 0xe4, 0xb1, 0xfe, 0xef, 0x99, 0x01, 0x79, 0x01, 0x59, 0xc2, 0x6b, 0x7d, 0x6f, 0x53, 0x4b, 0x75, 0x2c, 0x32, 0x81, 0x52, 0x9c, 0xe8, 0xc2, 0xa4, 0x9c, 0xc5, 0xfe, 0xe0, 0xba, 0x90, 0x00, 0x02, 0x00, 0x67, 0x00, 0x00, 0x05, 0x24, 0x05, 0xef, 0x00, 0x02, 0x00, 0x35, 0x00, 0x00, 0x25, 0x21, 0x09, 0x03, 0x26, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1b, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x09, 0x01, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x21, 0x35, 0x33, 0x32, 0x37, 0x36, 0x01, 0xab, 0x02, 0x2f, 0xfe, 0xec, 0xfe, 0x45, 0x01, 0x5a, 0xfe, 0xf9, 0x11, 0x17, 0x1f, 0x39, 0x16, 0x14, 0x3e, 0x1e, 0x1c, 0x1c, 0x1a, 0x66, 0x44, 0x27, 0x2b, 0xe8, 0xee, 0x2f, 0x23, 0x44, 0x66, 0x1a, 0x1b, 0x1d, 0x1e, 0x3d, 0x15, 0x16, 0x36, 0x22, 0x11, 0x17, 0xfe, 0xf0, 0x01, 0x4f, 0x05, 0x06, 0x1a, 0x3e, 0x40, 0xfb, 0x4a, 0x3f, 0x41, 0x18, 0x0a, 0xaa, 0x01, 0xca, 0xfe, 0x68, 0x02, 0x3d, 0x01, 0xbb, 0x1d, 0x1a, 0x22, 0x04, 0x0a, 0xbb, 0x0b, 0x05, 0x05, 0x43, 0x28, 0x46, 0xfe, 0x81, 0x01, 0x7f, 0x4b, 0x23, 0x43, 0x05, 0x05, 0x0b, 0xbb, 0x0a, 0x04, 0x22, 0x11, 0x26, 0xfe, 0x45, 0xfd, 0xc3, 0x09, 0x08, 0x21, 0xaa, 0xaa, 0x21, 0x0f, 0x00, 0x00, 0x02, 0x00, 0x30, 0x00, 0x00, 0x04, 0x51, 0x04, 0x7b, 0x00, 0x02, 0x00, 0x35, 0x00, 0x00, 0x25, 0x21, 0x03, 0x09, 0x01, 0x03, 0x26, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1b, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x01, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x21, 0x35, 0x33, 0x32, 0x37, 0x36, 0x01, 0x71, 0x01, 0x9e, 0xcd, 0xfe, 0x85, 0x01, 0x1a, 0xd7, 0x13, 0x10, 0x1a, 0x30, 0x13, 0x11, 0x35, 0x1a, 0x18, 0x17, 0x16, 0x76, 0x39, 0x22, 0x24, 0xb1, 0xb1, 0x24, 0x22, 0x39, 0x76, 0x16, 0x17, 0x18, 0x1a, 0x35, 0x11, 0x13, 0x30, 0x1a, 0x10, 0x13, 0xdd, 0x01, 0x0f, 0x05, 0x05, 0x16, 0x35, 0x41, 0xfb, 0xe1, 0x41, 0x34, 0x17, 0x05, 0x9e, 0x01, 0x38, 0xfe, 0xee, 0x01, 0xa4, 0x01, 0x3d, 0x1c, 0x0e, 0x19, 0x03, 0x07, 0x8d, 0x08, 0x04, 0x04, 0x33, 0x1e, 0x35, 0xfe, 0xfa, 0x01, 0x06, 0x35, 0x1e, 0x33, 0x04, 0x04, 0x08, 0x8d, 0x07, 0x03, 0x19, 0x0e, 0x1c, 0xfe, 0xb8, 0xfe, 0x67, 0x08, 0x05, 0x19, 0x9e, 0x9e, 0x19, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa2, 0x06, 0x10, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x24, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x00, 0x10, 0x00, 0x23, 0x20, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x21, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x12, 0x10, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x02, 0xd9, 0xfe, 0xf4, 0x4f, 0x32, 0x14, 0x49, 0x4d, 0x6e, 0x75, 0xdd, 0x01, 0x13, 0xfe, 0xed, 0xed, 0xfe, 0xed, 0x94, 0x92, 0x7d, 0x6f, 0x01, 0x85, 0x67, 0x87, 0x90, 0x43, 0x54, 0x88, 0x62, 0x80, 0xb4, 0xa7, 0xa9, 0x5e, 0x5e, 0x5e, 0x5b, 0xac, 0xa9, 0x58, 0x05, 0x2d, 0x02, 0x73, 0x4a, 0xa0, 0x56, 0x22, 0x31, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x9c, 0x9b, 0x01, 0x50, 0x01, 0xde, 0xd2, 0xbb, 0x0a, 0x0a, 0x27, 0xb1, 0x24, 0x08, 0x06, 0xfc, 0x41, 0x01, 0x82, 0xe6, 0x73, 0x74, 0xc0, 0xbd, 0x78, 0x73, 0x73, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xec, 0x06, 0x10, 0x00, 0x1f, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x26, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x21, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x13, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x02, 0x58, 0xcc, 0x42, 0x27, 0x12, 0x25, 0x5a, 0x52, 0x6c, 0xb8, 0x72, 0x74, 0x74, 0x72, 0xc5, 0xe6, 0x7b, 0x7a, 0x68, 0x5d, 0x01, 0x2d, 0x56, 0x53, 0x4a, 0x40, 0x53, 0x3f, 0x51, 0x98, 0x4b, 0x4c, 0x83, 0x86, 0x4e, 0x4f, 0x4f, 0x4c, 0x88, 0x85, 0x4a, 0x4b, 0x05, 0x37, 0x02, 0x78, 0x4a, 0xa9, 0x46, 0x36, 0x31, 0xa2, 0xa2, 0xfd, 0xf0, 0xa2, 0xa2, 0x9c, 0x9b, 0x01, 0x50, 0x01, 0xde, 0xd2, 0xbb, 0x0a, 0x0a, 0x27, 0xa7, 0x27, 0x05, 0x06, 0xfc, 0xf8, 0xcd, 0x72, 0x73, 0x73, 0x74, 0xcb, 0xc7, 0x78, 0x73, 0x73, 0x74, 0x00, 0x00, 0x00, 0x01, 0x00, 0x27, 0xfe, 0x56, 0x04, 0x3f, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x23, 0x35, 0x23, 0x11, 0x23, 0x11, 0x23, 0x15, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x04, 0x3e, 0xb6, 0xfa, 0xb6, 0xfa, 0xb6, 0x01, 0xb0, 0xb6, 0x04, 0x60, 0xfe, 0xf2, 0x64, 0xfa, 0xa0, 0x05, 0x60, 0x64, 0x01, 0x0e, 0x01, 0x75, 0xfe, 0x8b, 0x00, 0x01, 0x00, 0x31, 0xfe, 0x55, 0x03, 0xac, 0x05, 0xcf, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x23, 0x35, 0x23, 0x11, 0x23, 0x11, 0x23, 0x15, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x03, 0xac, 0x9c, 0xce, 0xa7, 0xce, 0x9b, 0x01, 0x69, 0xa7, 0x04, 0x5f, 0xff, 0x00, 0x70, 0xfa, 0x86, 0x05, 0x7a, 0x70, 0x01, 0x00, 0x01, 0x70, 0xfe, 0x90, 0x00, 0x01, 0x00, 0x64, 0xff, 0xf2, 0x04, 0x53, 0x04, 0x67, 0x00, 0x33, 0x00, 0x00, 0x01, 0x02, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x01, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x32, 0x17, 0x04, 0x11, 0x14, 0x07, 0x37, 0x12, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x01, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x01, 0xf1, 0x57, 0xb4, 0x31, 0x1f, 0x31, 0x01, 0x07, 0x37, 0x0c, 0x18, 0x7f, 0x34, 0x52, 0x3a, 0x52, 0x17, 0x19, 0x01, 0x00, 0x1a, 0xaa, 0x56, 0xb4, 0x32, 0x1f, 0x31, 0xfe, 0xf9, 0x37, 0x0c, 0x18, 0x7f, 0x34, 0x51, 0x39, 0x52, 0x17, 0x19, 0xff, 0x00, 0x1a, 0x01, 0x99, 0xfe, 0xf7, 0x7c, 0x22, 0x4f, 0x9a, 0x01, 0x09, 0x8a, 0x7a, 0x3a, 0x36, 0x68, 0x6c, 0xe0, 0x30, 0x04, 0x25, 0xfe, 0xc1, 0x5b, 0x4d, 0x6c, 0x01, 0x09, 0x7c, 0x22, 0x4f, 0x9a, 0xfe, 0xf7, 0x8a, 0x7a, 0x3a, 0x36, 0x68, 0x6c, 0xe0, 0x30, 0x04, 0x25, 0x01, 0x3f, 0x5b, 0x4d, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x24, 0x00, 0x00, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x12, 0x29, 0x01, 0x15, 0x21, 0x20, 0x11, 0x24, 0x10, 0x27, 0x26, 0x20, 0x07, 0x06, 0x10, 0x17, 0x16, 0x20, 0x37, 0xa7, 0x51, 0x31, 0x8e, 0x35, 0xa4, 0xb8, 0x72, 0x73, 0x73, 0x72, 0xb8, 0x6c, 0x52, 0x50, 0x34, 0x04, 0x01, 0x04, 0x01, 0xc2, 0xfe, 0x4c, 0xfe, 0x43, 0x02, 0xda, 0x4a, 0x4c, 0xfe, 0xf9, 0x4b, 0x4b, 0x4b, 0x4b, 0x01, 0x07, 0x4c, 0x02, 0x25, 0xd0, 0xa3, 0x62, 0x5e, 0x23, 0xa2, 0xa2, 0xfd, 0xf0, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0xfe, 0x58, 0xaa, 0x02, 0xda, 0x34, 0x01, 0x96, 0x74, 0x73, 0x73, 0x74, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x46, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0xfe, 0x56, 0x01, 0x54, 0x06, 0x14, 0x12, 0x06, 0x00, 0x4d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x12, 0x06, 0x01, 0x61, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x76, 0x04, 0x7b, 0x00, 0x21, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x15, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x03, 0x76, 0x22, 0x21, 0x59, 0x60, 0xa4, 0x5c, 0x56, 0x10, 0x02, 0x62, 0xfd, 0x9e, 0x10, 0x56, 0x5c, 0xa4, 0x74, 0x45, 0x43, 0x48, 0x5d, 0x60, 0xf2, 0x8c, 0x8d, 0x8d, 0x8c, 0xf2, 0x5b, 0x62, 0x24, 0x24, 0x03, 0xae, 0x0d, 0x0a, 0x1a, 0x63, 0x5c, 0xa9, 0x90, 0xa9, 0x5c, 0x63, 0x1a, 0x19, 0xa7, 0x12, 0x16, 0x9c, 0x9c, 0x02, 0x28, 0x9c, 0x9c, 0x16, 0x08, 0x0c, 0x00, 0x01, 0x00, 0xb0, 0xff, 0xe3, 0x03, 0xc1, 0x04, 0x7b, 0x00, 0x21, 0x00, 0x00, 0x13, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x21, 0x35, 0x21, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0xb0, 0x24, 0x24, 0x62, 0x5b, 0xf2, 0x8c, 0x8d, 0x8d, 0x8c, 0xf2, 0x60, 0x5d, 0x48, 0x43, 0x45, 0x74, 0xa4, 0x5c, 0x56, 0x10, 0xfd, 0x9e, 0x02, 0x62, 0x10, 0x56, 0x5c, 0xa4, 0x60, 0x59, 0x21, 0x03, 0xae, 0xa3, 0x0c, 0x08, 0x16, 0x9c, 0x9c, 0xfd, 0xd8, 0x9c, 0x9c, 0x16, 0x12, 0xa7, 0x19, 0x1a, 0x63, 0x5c, 0xa9, 0x90, 0xa9, 0x5c, 0x63, 0x1a, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x12, 0x06, 0x00, 0xa0, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x14, 0x12, 0x06, 0x00, 0xc0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x12, 0x06, 0x00, 0x26, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x21, 0x09, 0x01, 0x21, 0x11, 0x23, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0xb5, 0x01, 0x0f, 0x01, 0x57, 0x01, 0x58, 0x01, 0x0f, 0xb1, 0xfe, 0xa5, 0xb6, 0xfe, 0xa5, 0xb0, 0x05, 0xd5, 0xfe, 0x21, 0x01, 0xdf, 0xfa, 0x2b, 0x05, 0x1f, 0xfe, 0x19, 0x01, 0xe7, 0xfa, 0xe1, 0x00, 0x00, 0x01, 0x00, 0x72, 0xfe, 0x56, 0x04, 0x3b, 0x04, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x21, 0x1b, 0x01, 0x21, 0x11, 0x23, 0x11, 0x03, 0x23, 0x03, 0x11, 0x23, 0x72, 0x00, 0xff, 0xe5, 0xe6, 0x00, 0xff, 0xa7, 0xf8, 0x8a, 0xf9, 0xa7, 0x04, 0x60, 0xfe, 0x7b, 0x01, 0x85, 0xfb, 0xa0, 0x03, 0xb2, 0xfe, 0x60, 0x01, 0xa0, 0xfa, 0xa4, 0x00, 0x00, 0x02, 0x00, 0x4c, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x00, 0x17, 0x11, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x11, 0x21, 0x15, 0x21, 0x15, 0x23, 0x35, 0x23, 0x35, 0x00, 0x10, 0x27, 0x26, 0x20, 0x07, 0x06, 0x10, 0x17, 0x16, 0x20, 0x37, 0xa7, 0x51, 0x37, 0x88, 0x35, 0xa4, 0xb8, 0x72, 0x73, 0x73, 0x72, 0xb8, 0x6f, 0x4f, 0x50, 0x34, 0x01, 0xb4, 0xfe, 0x4c, 0xa7, 0x5b, 0x03, 0x35, 0x4a, 0x4c, 0xfe, 0xf9, 0x4b, 0x4b, 0x4b, 0x4b, 0x01, 0x07, 0x4c, 0x90, 0x02, 0xb5, 0xe7, 0x8c, 0x66, 0x5a, 0x23, 0xa2, 0xa2, 0xfd, 0xf0, 0xa2, 0xa2, 0x31, 0x30, 0x64, 0xfe, 0xc8, 0xaa, 0x70, 0x70, 0xaa, 0x01, 0xf4, 0x01, 0x96, 0x74, 0x73, 0x73, 0x74, 0xfe, 0x6a, 0x74, 0x73, 0x73, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x12, 0x06, 0x01, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x12, 0x26, 0x03, 0x8d, 0x00, 0x00, 0x10, 0x07, 0x00, 0x79, 0x01, 0xfb, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x10, 0x27, 0x00, 0x79, 0x00, 0xcd, 0x00, 0x00, 0x12, 0x06, 0x03, 0x91, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x6b, 0x12, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0x70, 0x01, 0x75, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x4e, 0x12, 0x26, 0x03, 0xa9, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0x27, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0x66, 0x05, 0x1b, 0x05, 0xd5, 0x00, 0x1b, 0x00, 0x00, 0x25, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x32, 0x16, 0x15, 0x05, 0x1b, 0xb8, 0xcd, 0x44, 0x37, 0x79, 0x64, 0x70, 0x6f, 0xfe, 0xad, 0xb6, 0xfe, 0x7d, 0x04, 0x16, 0xfe, 0x23, 0x01, 0x78, 0xa7, 0xc8, 0x68, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0x01, 0x22, 0x9f, 0x9e, 0xfd, 0x39, 0x05, 0x2b, 0xaa, 0xaa, 0xfe, 0x46, 0xe9, 0xee, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x07, 0x6b, 0x12, 0x26, 0x03, 0xa7, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0x36, 0x01, 0x75, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x00, 0x18, 0x00, 0x00, 0x01, 0x15, 0x06, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x02, 0x07, 0x21, 0x15, 0x21, 0x16, 0x12, 0x33, 0x32, 0x04, 0xa3, 0xbf, 0xf0, 0xfe, 0xd2, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x2e, 0xf4, 0xbb, 0xbe, 0xe6, 0xee, 0xd6, 0x14, 0x02, 0xce, 0xfd, 0x32, 0x14, 0xd6, 0xee, 0xe6, 0x01, 0x46, 0xd3, 0x90, 0x01, 0x9f, 0x01, 0x68, 0x01, 0x67, 0x01, 0x9f, 0x8e, 0xd5, 0xbd, 0xfe, 0xe3, 0xef, 0xaa, 0xef, 0xfe, 0xe4, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x05, 0xf0, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6b, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x02, 0x1c, 0x07, 0x4e, 0x10, 0x06, 0x00, 0x91, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa0, 0xfe, 0x66, 0x01, 0x6b, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4b, 0x00, 0x00, 0x07, 0x5e, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x21, 0x15, 0x10, 0x02, 0x05, 0x35, 0x36, 0x12, 0x11, 0x35, 0x21, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x25, 0x20, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x03, 0xfe, 0xfe, 0x4c, 0xb4, 0xfe, 0xb6, 0xc3, 0x86, 0x03, 0x1f, 0xd3, 0xe2, 0xf5, 0xf5, 0xe2, 0xfe, 0x77, 0x01, 0x80, 0x01, 0x20, 0x8e, 0x92, 0xca, 0x05, 0x2b, 0xb8, 0xfd, 0xca, 0xfd, 0xfb, 0x38, 0xaa, 0x2f, 0x01, 0xa6, 0x02, 0x58, 0xfe, 0xfd, 0x9a, 0xda, 0xdd, 0xde, 0xda, 0xa6, 0x01, 0x11, 0x8b, 0x87, 0xfd, 0xdd, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x07, 0x05, 0x05, 0xd5, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x36, 0x03, 0xa5, 0xfd, 0xc6, 0xb6, 0xb6, 0x02, 0x3a, 0xb6, 0xd3, 0xe2, 0xf4, 0xf4, 0xe2, 0x01, 0x17, 0x8e, 0x92, 0xca, 0xca, 0x90, 0x90, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfd, 0x9a, 0xda, 0xde, 0xdd, 0xda, 0x01, 0xb7, 0x8b, 0x87, 0xfd, 0xdd, 0x87, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0x00, 0x00, 0x05, 0x1b, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x03, 0xac, 0xa7, 0xc8, 0xb5, 0x70, 0x6f, 0xfe, 0xad, 0xb6, 0xfe, 0x7d, 0x04, 0x16, 0xfe, 0x23, 0x03, 0x71, 0xe9, 0xee, 0xfe, 0x66, 0x01, 0x8a, 0x9f, 0x9e, 0xfd, 0x39, 0x05, 0x2b, 0xaa, 0xaa, 0xfe, 0x46, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xf9, 0x07, 0x6b, 0x12, 0x26, 0x03, 0xae, 0x00, 0x00, 0x10, 0x07, 0x10, 0xec, 0x04, 0x70, 0x01, 0x75, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x6b, 0x12, 0x26, 0x03, 0xac, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0x68, 0x01, 0x75, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x44, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x00, 0x01, 0x75, 0x12, 0x06, 0x03, 0xb7, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x23, 0x02, 0x68, 0xfe, 0x4d, 0xb6, 0x02, 0x94, 0xb6, 0xfe, 0x4d, 0x9a, 0x05, 0xd5, 0xfa, 0xd5, 0x05, 0x2b, 0xfa, 0x2b, 0xfe, 0xbf, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x15, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x36, 0x13, 0x15, 0x21, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x03, 0xae, 0x8d, 0x93, 0xfe, 0xdd, 0x01, 0x23, 0x93, 0x8d, 0x62, 0xfd, 0x5b, 0x01, 0x2c, 0xe2, 0xf5, 0xed, 0xea, 0xfe, 0x1e, 0x01, 0xb7, 0x8b, 0x87, 0xfd, 0xdd, 0x87, 0x04, 0xa8, 0xa6, 0xfe, 0x40, 0xda, 0xde, 0xdd, 0xda, 0x05, 0xd5, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0xb5, 0x03, 0x44, 0xfd, 0x72, 0x05, 0xd5, 0xaa, 0xfa, 0xd5, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xfe, 0xbf, 0x05, 0x46, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x17, 0x00, 0x00, 0x25, 0x21, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x05, 0x36, 0x37, 0x12, 0x19, 0x01, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0xa4, 0x02, 0x52, 0xfe, 0x4c, 0x65, 0x15, 0xfe, 0xd3, 0x78, 0x23, 0x57, 0x03, 0x1f, 0x99, 0x99, 0xfc, 0x48, 0x99, 0xaa, 0x04, 0x81, 0xd4, 0xfe, 0x0d, 0xfe, 0xb5, 0x44, 0x2b, 0x3f, 0x78, 0x01, 0x34, 0x02, 0x26, 0x01, 0x1a, 0xfa, 0xd5, 0xfe, 0x15, 0x01, 0x41, 0xfe, 0xbf, 0x01, 0xeb, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x07, 0x9e, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x01, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x03, 0x11, 0x23, 0x11, 0x03, 0x01, 0x23, 0x09, 0x01, 0x33, 0x01, 0x03, 0x86, 0xb6, 0x02, 0x65, 0xdd, 0xfe, 0x15, 0x02, 0x0a, 0xbd, 0xfe, 0x44, 0xe8, 0xb6, 0xe8, 0xfe, 0x44, 0xbe, 0x02, 0x0a, 0xfe, 0x16, 0xdc, 0x02, 0x66, 0x05, 0xd5, 0xfd, 0x1e, 0x02, 0xe2, 0xfd, 0xb3, 0xfc, 0x78, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x01, 0xea, 0x01, 0x17, 0xfc, 0xff, 0x03, 0x88, 0x02, 0x4d, 0xfd, 0x1e, 0x00, 0x01, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x25, 0x05, 0xf0, 0x00, 0x28, 0x00, 0x00, 0x01, 0x32, 0x04, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x04, 0x23, 0x22, 0x24, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x02, 0x0e, 0xde, 0x01, 0x19, 0x80, 0x76, 0x83, 0x92, 0xfe, 0xc1, 0xd7, 0x6d, 0xff, 0x00, 0x27, 0x89, 0x98, 0x70, 0xa9, 0xbb, 0xa6, 0xb0, 0xb7, 0xbe, 0xa2, 0x8e, 0x93, 0xb2, 0x79, 0x52, 0xb9, 0x66, 0xd4, 0x05, 0xf0, 0xd1, 0xb2, 0x7c, 0xab, 0x21, 0x1f, 0xc4, 0x90, 0xe6, 0xe9, 0x42, 0x1c, 0xd0, 0x59, 0x2b, 0x90, 0x95, 0x84, 0x95, 0xa6, 0x77, 0x70, 0x73, 0x7b, 0x18, 0x4d, 0xc5, 0x28, 0x22, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x23, 0x11, 0x33, 0x11, 0x01, 0x04, 0xae, 0xb0, 0xfd, 0xac, 0xf5, 0xb0, 0x02, 0x54, 0x05, 0xd5, 0xfa, 0x2b, 0x04, 0xe1, 0xfb, 0x1f, 0x05, 0xd5, 0xfb, 0x1f, 0x04, 0xe1, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x6d, 0x12, 0x26, 0x03, 0xac, 0x00, 0x00, 0x11, 0x07, 0x10, 0xf2, 0x04, 0x76, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xf9, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x03, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x89, 0xea, 0xfd, 0xf8, 0x02, 0x23, 0xc6, 0xfe, 0x2d, 0xf5, 0xb6, 0x05, 0xd5, 0xfd, 0x1e, 0x02, 0xe2, 0xfd, 0xb2, 0xfc, 0x79, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x00, 0x01, 0x00, 0x4b, 0x00, 0x00, 0x04, 0xb5, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x12, 0x11, 0x35, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x4c, 0xc3, 0x38, 0x4e, 0x03, 0x1f, 0xb6, 0xfe, 0x4c, 0x5c, 0x58, 0xaa, 0x2f, 0xa4, 0x01, 0x02, 0x02, 0x58, 0xfe, 0xfa, 0x2b, 0x05, 0x2b, 0xb8, 0xfd, 0xca, 0xfe, 0xf8, 0xfd, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x12, 0x06, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x04, 0xb5, 0xb6, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfa, 0x2b, 0x05, 0x2b, 0xfa, 0xd5, 0x05, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x12, 0x06, 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x44, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3f, 0x01, 0x01, 0x33, 0x09, 0x01, 0x33, 0x02, 0x4e, 0x13, 0x1d, 0x47, 0xe2, 0x45, 0x38, 0x6b, 0x2a, 0x19, 0x10, 0x29, 0xfe, 0x51, 0xc3, 0x01, 0x4e, 0x01, 0x4f, 0xc4, 0xb5, 0x32, 0x26, 0x5d, 0xaa, 0x1b, 0x11, 0x2a, 0x6a, 0x04, 0x6b, 0xfc, 0x94, 0x03, 0x6c, 0x00, 0x03, 0x00, 0x6c, 0x00, 0x00, 0x05, 0xc6, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x33, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x03, 0x24, 0x00, 0x11, 0x10, 0x00, 0x25, 0x35, 0x33, 0x15, 0x04, 0x00, 0x11, 0x10, 0x00, 0x05, 0x15, 0x23, 0x02, 0xbf, 0xc3, 0xcf, 0xcf, 0xc3, 0xb7, 0xc3, 0xcd, 0xcd, 0xc3, 0xb7, 0xfe, 0xe3, 0xfe, 0xcb, 0x01, 0x35, 0x01, 0x1d, 0xb7, 0x01, 0x1d, 0x01, 0x33, 0xfe, 0xcd, 0xfe, 0xe3, 0xb7, 0x04, 0xa2, 0x14, 0xcc, 0xc5, 0xc5, 0xcb, 0x14, 0x14, 0xcb, 0xc5, 0xc5, 0xcc, 0x14, 0xfc, 0x10, 0x17, 0x01, 0x2b, 0x01, 0x09, 0x01, 0x09, 0x01, 0x2d, 0x17, 0x8b, 0x8b, 0x17, 0xfe, 0xd5, 0xfe, 0xf5, 0xfe, 0xf7, 0xfe, 0xd5, 0x17, 0xb2, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x05, 0x4f, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x04, 0xb5, 0xfc, 0x00, 0xb6, 0x02, 0x94, 0xb6, 0x99, 0x99, 0x05, 0xd5, 0xfa, 0xd5, 0x05, 0x2b, 0xfa, 0xd5, 0xfe, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x04, 0x3b, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x21, 0x11, 0x21, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x21, 0x11, 0x33, 0x11, 0x03, 0x84, 0xfe, 0x89, 0xa8, 0xc7, 0xb4, 0x70, 0x70, 0x01, 0x52, 0xb7, 0x02, 0x64, 0xe9, 0xee, 0x01, 0x9a, 0xfe, 0x76, 0x9f, 0x9e, 0x02, 0xc7, 0xfa, 0x2b, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x06, 0xff, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x04, 0x34, 0x02, 0x14, 0xb6, 0xf9, 0xb7, 0xb6, 0x02, 0x14, 0xb5, 0xaa, 0x05, 0x2b, 0xfa, 0x2b, 0x05, 0xd5, 0xfa, 0xd5, 0x05, 0x2b, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x07, 0x98, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x06, 0xfe, 0xf9, 0xb7, 0xb6, 0x02, 0x14, 0xb5, 0x02, 0x14, 0xb6, 0x99, 0x99, 0x05, 0xd5, 0xfa, 0xd5, 0x05, 0x2b, 0xfa, 0xd5, 0x05, 0x2b, 0xfa, 0xd5, 0xfe, 0x15, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x05, 0x7c, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x01, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x01, 0xc3, 0xfe, 0x73, 0x02, 0x43, 0x01, 0x2c, 0xe2, 0xf5, 0xf5, 0xe2, 0x01, 0x17, 0x47, 0x46, 0x93, 0xfe, 0xdd, 0x01, 0x23, 0x91, 0x48, 0x47, 0x05, 0x2b, 0xaa, 0xfd, 0x9a, 0xda, 0xde, 0xdd, 0xda, 0x01, 0xb7, 0x8b, 0x44, 0x43, 0xfd, 0xdd, 0x44, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xa6, 0x05, 0xd5, 0x10, 0x26, 0x03, 0xc0, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x04, 0x3b, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x01, 0x33, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x03, 0xae, 0x47, 0x46, 0x93, 0xfe, 0xdd, 0x01, 0x23, 0x93, 0x46, 0x47, 0xfd, 0x07, 0xb6, 0x01, 0x2c, 0xe2, 0xf5, 0xf5, 0xe2, 0xfe, 0x1e, 0x01, 0xb7, 0x8b, 0x44, 0x43, 0xfd, 0xdd, 0x44, 0x43, 0x04, 0xa8, 0xfd, 0x9a, 0xda, 0xde, 0xdd, 0xda, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe3, 0x04, 0xa0, 0x05, 0xf0, 0x00, 0x18, 0x00, 0x00, 0x13, 0x16, 0x33, 0x32, 0x12, 0x37, 0x21, 0x35, 0x21, 0x26, 0x02, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x22, 0x27, 0x64, 0xbe, 0xe6, 0xee, 0xd6, 0x14, 0xfd, 0x32, 0x02, 0xce, 0x14, 0xd6, 0xee, 0xe6, 0xbe, 0xbb, 0xf4, 0x01, 0x2d, 0x01, 0x60, 0xfe, 0xa0, 0xfe, 0xd3, 0xf0, 0xbf, 0x01, 0x46, 0xbd, 0x01, 0x1c, 0xef, 0xaa, 0xef, 0x01, 0x1d, 0xbd, 0xd5, 0x8e, 0xfe, 0x61, 0xfe, 0x99, 0xfe, 0x98, 0xfe, 0x61, 0x90, 0x00, 0x02, 0x00, 0xbd, 0xff, 0xe3, 0x07, 0x5f, 0x05, 0xf0, 0x00, 0x0f, 0x00, 0x26, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x11, 0x10, 0x27, 0x26, 0x01, 0x12, 0x37, 0x36, 0x21, 0x20, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x04, 0xf1, 0xc6, 0x74, 0x75, 0x75, 0x74, 0xc6, 0xc6, 0x74, 0x74, 0x74, 0x74, 0xfc, 0xce, 0x0d, 0xa2, 0xa2, 0x01, 0x1b, 0x01, 0x1b, 0xa9, 0xa9, 0xa9, 0xa9, 0xfe, 0xe5, 0xfe, 0xe5, 0xa2, 0xa2, 0x0d, 0xfe, 0xef, 0xb6, 0xb6, 0x05, 0x4c, 0xa4, 0xa4, 0xfe, 0xe5, 0xfe, 0xe6, 0xa4, 0xa4, 0xa4, 0xa4, 0x01, 0x1a, 0x01, 0x1b, 0xa4, 0xa4, 0xfd, 0xf3, 0x01, 0x18, 0xcd, 0xcc, 0xd2, 0xd3, 0xfe, 0x9e, 0xfe, 0x9f, 0xd2, 0xd3, 0xcd, 0xcd, 0x01, 0x18, 0xfd, 0x6b, 0x05, 0xd5, 0xfd, 0x6a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x00, 0x04, 0x4c, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x16, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x21, 0x11, 0x21, 0x22, 0x06, 0x03, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x23, 0x11, 0x23, 0x01, 0x01, 0x72, 0x86, 0x83, 0x01, 0x1b, 0xfe, 0xe5, 0x83, 0x86, 0xf8, 0x01, 0x70, 0x5a, 0xe7, 0xea, 0xe8, 0x01, 0xd1, 0xb6, 0xf3, 0xfe, 0x9d, 0x04, 0x27, 0x83, 0x87, 0x02, 0x12, 0x85, 0xfb, 0x56, 0x02, 0x8d, 0x1a, 0xa9, 0xd7, 0xce, 0xe0, 0xfa, 0x2b, 0x02, 0x77, 0xfd, 0x89, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x44, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x37, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x00, 0x01, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x03, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x24, 0x37, 0x36, 0x37, 0x17, 0x06, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x0f, 0x01, 0x36, 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x02, 0x3d, 0xd8, 0xf7, 0xf7, 0xd8, 0xd9, 0xef, 0x06, 0x06, 0x04, 0x34, 0x52, 0x01, 0x1b, 0xee, 0x6e, 0x30, 0x2e, 0x2c, 0x28, 0xe1, 0x72, 0x44, 0xb3, 0x11, 0x07, 0x75, 0xbe, 0x85, 0x9b, 0x9a, 0x86, 0x85, 0x9a, 0x9a, 0x04, 0x7b, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x01, 0x30, 0x01, 0x1c, 0xe5, 0x77, 0x29, 0xa0, 0x76, 0xb9, 0xa0, 0x02, 0x01, 0x11, 0x92, 0x14, 0x01, 0x11, 0x09, 0x2c, 0x75, 0x99, 0x38, 0x77, 0x9c, 0xe7, 0xc9, 0xc9, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xd2, 0x04, 0x60, 0x00, 0x08, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x01, 0x4d, 0xec, 0x71, 0x77, 0x77, 0x71, 0xec, 0xda, 0x5d, 0x77, 0x77, 0x5d, 0xfe, 0x80, 0x01, 0x8b, 0xb1, 0xbf, 0x62, 0x5f, 0x72, 0x7e, 0xcf, 0xc1, 0xfe, 0x66, 0x02, 0x04, 0xfe, 0x8f, 0x5f, 0x5a, 0x5a, 0x5e, 0x01, 0xc9, 0xfe, 0xca, 0x53, 0x4a, 0x4a, 0x4f, 0x93, 0x90, 0x85, 0x67, 0x79, 0x0f, 0x18, 0x98, 0x72, 0x96, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x6f, 0x04, 0x60, 0x00, 0x05, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0xa7, 0x02, 0xc7, 0xfd, 0xe0, 0x04, 0x60, 0x93, 0xfc, 0x33, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0xfe, 0xe5, 0x04, 0x9b, 0x04, 0x60, 0x00, 0x06, 0x00, 0x16, 0x00, 0x00, 0x25, 0x21, 0x11, 0x21, 0x15, 0x10, 0x07, 0x05, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0x8f, 0x01, 0xe0, 0xfe, 0xa4, 0x6a, 0xfe, 0xf5, 0x52, 0x24, 0x58, 0x02, 0xaa, 0x84, 0x84, 0xfc, 0xcf, 0x85, 0x93, 0x03, 0x3a, 0x8c, 0xfe, 0x64, 0xdc, 0x36, 0x28, 0x55, 0xd3, 0x01, 0xa9, 0xd4, 0xfc, 0x33, 0xfe, 0x52, 0x01, 0x1b, 0xfe, 0xe5, 0x01, 0xae, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x06, 0x3e, 0x04, 0x60, 0x00, 0x13, 0x00, 0x00, 0x01, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, 0x27, 0x01, 0x23, 0x09, 0x01, 0x33, 0x01, 0x02, 0xec, 0xa5, 0x01, 0xb8, 0xc0, 0xfe, 0x97, 0x01, 0x9e, 0xb2, 0xfe, 0xad, 0xa8, 0xa5, 0xa8, 0xfe, 0xac, 0xb1, 0x01, 0x9e, 0xfe, 0x96, 0xc1, 0x01, 0xb8, 0x04, 0x60, 0xfd, 0xf2, 0x02, 0x0e, 0xfe, 0x51, 0xfd, 0x4f, 0x02, 0x36, 0xc9, 0xfe, 0x93, 0x01, 0x6d, 0xc9, 0xfd, 0xca, 0x02, 0xb1, 0x01, 0xaf, 0xfd, 0xf2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x04, 0x7c, 0x00, 0x28, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x02, 0x7b, 0x70, 0x7c, 0xe8, 0xd6, 0x48, 0x98, 0x51, 0x40, 0x99, 0x53, 0x88, 0x98, 0x87, 0x7b, 0x85, 0x8b, 0x69, 0x79, 0x7d, 0x6b, 0x40, 0x91, 0x57, 0x58, 0x99, 0x45, 0xb0, 0xcc, 0x6c, 0x02, 0x5c, 0x18, 0x92, 0x6c, 0xad, 0xb6, 0x1c, 0x1c, 0xab, 0x25, 0x25, 0x70, 0x5a, 0x58, 0x6b, 0x98, 0x59, 0x46, 0x40, 0x5c, 0x1a, 0x1d, 0xa7, 0x18, 0x18, 0x9d, 0x8d, 0x5d, 0x81, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x23, 0x11, 0x33, 0x11, 0x01, 0x04, 0x06, 0xa4, 0xfe, 0x1a, 0xd5, 0xa5, 0x01, 0xe5, 0x04, 0x60, 0xfb, 0xa0, 0x03, 0x83, 0xfc, 0x7d, 0x04, 0x60, 0xfc, 0x7f, 0x03, 0x81, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x06, 0x14, 0x12, 0x26, 0x03, 0xcc, 0x00, 0x00, 0x11, 0x07, 0x02, 0x9a, 0x00, 0x8a, 0xff, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x1d, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0xa7, 0xa5, 0x01, 0xd3, 0xcc, 0xfe, 0x7e, 0x01, 0xb3, 0xb9, 0xfe, 0x9a, 0xb1, 0xa5, 0x04, 0x60, 0xfd, 0xf2, 0x02, 0x0e, 0xfe, 0x4f, 0xfd, 0x51, 0x02, 0x35, 0xc8, 0xfe, 0x93, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x00, 0x04, 0x02, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, 0x10, 0x07, 0x06, 0x44, 0xa4, 0x33, 0x3d, 0x02, 0xa9, 0xa5, 0xfe, 0xa1, 0x4f, 0x54, 0x99, 0x1c, 0x7e, 0xb1, 0x01, 0xc5, 0xb7, 0xfb, 0xa0, 0x03, 0xcd, 0x6f, 0xfe, 0x50, 0xc2, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc8, 0x04, 0x60, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0xa7, 0xf3, 0x01, 0x1e, 0x01, 0x1f, 0xf0, 0xa6, 0xfe, 0xe9, 0xa5, 0xfe, 0xe9, 0xa7, 0x04, 0x60, 0xfd, 0x12, 0x02, 0xee, 0xfb, 0xa0, 0x03, 0xb0, 0xfd, 0x27, 0x02, 0xd9, 0xfc, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x0e, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xa7, 0xa7, 0x02, 0x19, 0xa7, 0xa7, 0xfd, 0xe7, 0xa7, 0x04, 0x60, 0xfe, 0x37, 0x01, 0xc9, 0xfb, 0xa0, 0x02, 0x04, 0xfd, 0xfc, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x0e, 0x04, 0x60, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x04, 0x0e, 0xa7, 0xfd, 0xe7, 0xa7, 0x04, 0x60, 0xfb, 0xa0, 0x03, 0xcd, 0xfc, 0x33, 0x04, 0x60, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x46, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0xfc, 0x04, 0x60, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x36, 0x03, 0xc6, 0xfe, 0x6e, 0xa3, 0xfe, 0x6f, 0x04, 0x60, 0x93, 0xfc, 0x33, 0x03, 0xcd, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x12, 0x06, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x64, 0xfe, 0x56, 0x05, 0xc4, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x33, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x06, 0x01, 0x11, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x01, 0x34, 0x26, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, 0x36, 0x01, 0x11, 0x82, 0x6f, 0x58, 0x67, 0x67, 0x58, 0x6f, 0x82, 0x01, 0xb0, 0x34, 0x75, 0x4b, 0x97, 0xd1, 0xd1, 0x97, 0x4b, 0x75, 0x34, 0xa6, 0x33, 0x76, 0x4b, 0x96, 0xd2, 0xd2, 0x96, 0x4b, 0x76, 0x33, 0x01, 0xb0, 0x82, 0x6f, 0x58, 0x67, 0x67, 0x58, 0x6f, 0x82, 0x02, 0x2f, 0xeb, 0xc7, 0xa8, 0x02, 0x14, 0xa8, 0xc7, 0xfb, 0x3c, 0x02, 0x39, 0x5e, 0x4e, 0x01, 0x35, 0x01, 0x13, 0x01, 0x13, 0x01, 0x3d, 0x4c, 0x5e, 0x02, 0x04, 0xfd, 0xfc, 0x5e, 0x4c, 0xfe, 0xc3, 0xfe, 0xed, 0xfe, 0xed, 0xfe, 0xcb, 0x4e, 0x5e, 0xfd, 0xc7, 0x03, 0xd9, 0xeb, 0xc7, 0xa8, 0xfd, 0xec, 0xa8, 0xc7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x12, 0x06, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0x92, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x04, 0x0e, 0xfc, 0x99, 0xa7, 0x02, 0x19, 0xa7, 0x84, 0x84, 0x04, 0x60, 0xfc, 0x33, 0x03, 0xcd, 0xfc, 0x33, 0xfe, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x03, 0x9a, 0x04, 0x60, 0x00, 0x11, 0x00, 0x00, 0x21, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x21, 0x11, 0x33, 0x11, 0x02, 0xf4, 0xfe, 0xcb, 0x89, 0x5c, 0x53, 0xa6, 0x2e, 0x30, 0x5e, 0x01, 0x0b, 0xa6, 0x01, 0xd7, 0x5f, 0x56, 0xb8, 0x01, 0x1c, 0xfe, 0xf5, 0x75, 0x3b, 0x3b, 0x01, 0xf6, 0xfb, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x05, 0xf0, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x03, 0x9e, 0x01, 0xab, 0xa6, 0xfa, 0xb8, 0xa7, 0x01, 0xaa, 0xa6, 0x93, 0x03, 0xcd, 0xfb, 0xa0, 0x04, 0x60, 0xfc, 0x33, 0x03, 0xcd, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x06, 0x74, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x05, 0xef, 0xfa, 0xb8, 0xa7, 0x01, 0xaa, 0xa6, 0x01, 0xab, 0xa6, 0x85, 0x85, 0x04, 0x60, 0xfc, 0x33, 0x03, 0xcd, 0xfc, 0x33, 0x03, 0xcd, 0xfc, 0x33, 0xfe, 0x52, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x37, 0x00, 0x00, 0x04, 0xaa, 0x04, 0x60, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x17, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x03, 0x19, 0xc1, 0xcf, 0xcf, 0xc1, 0xfe, 0x65, 0xfe, 0xba, 0x01, 0xed, 0xed, 0xed, 0xed, 0x71, 0x76, 0x76, 0x02, 0x97, 0xa3, 0xa8, 0xa8, 0xa4, 0x03, 0xcd, 0x93, 0xfe, 0x37, 0x93, 0xfe, 0x8f, 0x5f, 0x5a, 0x5a, 0x5e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x05, 0x0c, 0x04, 0x7b, 0x10, 0x27, 0x00, 0xf3, 0x03, 0xb8, 0x00, 0x00, 0x10, 0x06, 0x03, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xd2, 0x04, 0x60, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x36, 0x01, 0x33, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x03, 0x21, 0x76, 0x71, 0xec, 0xec, 0x71, 0x76, 0xfd, 0x86, 0xa7, 0xf3, 0xc1, 0xcf, 0xcf, 0xc1, 0xfe, 0x66, 0x01, 0x4c, 0x5a, 0x5e, 0xfe, 0x8f, 0x5f, 0x03, 0x6e, 0xfe, 0x37, 0xa3, 0xa8, 0xa8, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x00, 0x37, 0x16, 0x33, 0x32, 0x36, 0x37, 0x21, 0x35, 0x21, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x32, 0x00, 0x11, 0x10, 0x00, 0x23, 0x22, 0x27, 0x66, 0x8e, 0x8d, 0x85, 0xbc, 0x12, 0xfe, 0x00, 0x01, 0xfa, 0x0b, 0x8f, 0xb3, 0x8a, 0x91, 0x8d, 0x95, 0xec, 0x01, 0x0f, 0xfe, 0xf8, 0xe7, 0xaa, 0x84, 0xd5, 0x56, 0xab, 0xda, 0x93, 0x69, 0xdf, 0x56, 0xac, 0x46, 0xfe, 0xc3, 0xfe, 0xf1, 0xfe, 0xf2, 0xfe, 0xc2, 0x48, 0x00, 0x00, 0x02, 0x00, 0xad, 0xff, 0xe3, 0x05, 0xab, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x01, 0x36, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x27, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x03, 0xdc, 0x85, 0x9b, 0x9a, 0x86, 0x84, 0x9b, 0x9b, 0xfd, 0xb3, 0x11, 0xe0, 0xd8, 0xd8, 0xf7, 0xf7, 0xd8, 0xd9, 0xec, 0x09, 0xbb, 0xa5, 0xa5, 0x03, 0xdf, 0xe7, 0xc9, 0xc9, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0xfe, 0xc2, 0xbe, 0x01, 0x1c, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x01, 0x2e, 0xf8, 0xfd, 0xf7, 0x04, 0x60, 0xfe, 0x41, 0x00, 0x00, 0x02, 0x00, 0x68, 0x00, 0x00, 0x03, 0xb9, 0x04, 0x60, 0x00, 0x08, 0x00, 0x16, 0x00, 0x00, 0x01, 0x14, 0x16, 0x3b, 0x01, 0x11, 0x23, 0x22, 0x06, 0x03, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x23, 0x11, 0x23, 0x01, 0x01, 0x54, 0x73, 0x6b, 0xe0, 0xe0, 0x6b, 0x73, 0xec, 0x01, 0x34, 0x68, 0x8b, 0xc2, 0xc3, 0x01, 0x8a, 0xa6, 0xce, 0xfe, 0xd7, 0x03, 0x1d, 0x53, 0x5e, 0x01, 0x61, 0x5c, 0xfc, 0x8f, 0x01, 0xeb, 0x1a, 0x89, 0x8f, 0xa2, 0xa1, 0xfb, 0xa0, 0x01, 0xd9, 0xfe, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x6b, 0x12, 0x26, 0x03, 0xc9, 0x00, 0x00, 0x10, 0x06, 0x00, 0x43, 0x51, 0x05, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x10, 0x12, 0x26, 0x03, 0xc9, 0x00, 0x00, 0x11, 0x07, 0x00, 0x6a, 0x00, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0xfe, 0x56, 0x04, 0x1c, 0x06, 0x14, 0x00, 0x1f, 0x00, 0x00, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x11, 0x14, 0x00, 0x07, 0x35, 0x36, 0x12, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0xc9, 0x9f, 0x9f, 0xa6, 0x01, 0xe7, 0xfe, 0x19, 0x3c, 0xa0, 0x6a, 0xa4, 0xc2, 0xfe, 0xcb, 0xc1, 0x6e, 0xdc, 0x6f, 0x70, 0x8a, 0x97, 0xa6, 0x03, 0xd1, 0x8f, 0x01, 0xb4, 0xfe, 0x4c, 0x8f, 0xfe, 0x6d, 0x65, 0x64, 0xe9, 0xfe, 0xea, 0xe2, 0xfe, 0x59, 0x29, 0x8c, 0x16, 0x01, 0x2e, 0xd2, 0xd0, 0x9f, 0xc4, 0x9e, 0xfe, 0xfb, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x76, 0x06, 0x6d, 0x12, 0x26, 0x03, 0xc7, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x78, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x00, 0x01, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x07, 0x21, 0x15, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x02, 0x60, 0x96, 0x8d, 0x91, 0x8a, 0xb4, 0x8f, 0x0a, 0x01, 0xf9, 0xfe, 0x01, 0x11, 0xbd, 0x85, 0x8d, 0x8e, 0x84, 0xaa, 0xe8, 0xfe, 0xf9, 0x01, 0x0f, 0x04, 0x7b, 0x46, 0xac, 0x56, 0xdf, 0x69, 0x93, 0xda, 0xab, 0x56, 0xaa, 0x48, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x3d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x04, 0x7b, 0x12, 0x06, 0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x12, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x02, 0x0c, 0x06, 0x10, 0x10, 0x06, 0x00, 0xb1, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0xfe, 0x56, 0x01, 0x54, 0x06, 0x14, 0x12, 0x06, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x44, 0x00, 0x00, 0x06, 0x13, 0x04, 0x60, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x21, 0x15, 0x10, 0x07, 0x06, 0x25, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x44, 0xa4, 0x33, 0x3d, 0x02, 0x8f, 0x9a, 0xc1, 0xd0, 0xd0, 0xc0, 0xfe, 0xbe, 0xfe, 0xbe, 0x4f, 0x55, 0x03, 0x20, 0x71, 0x77, 0x77, 0x71, 0x93, 0x99, 0x1c, 0x7e, 0xb1, 0x01, 0xc5, 0xb7, 0xfe, 0x37, 0xa3, 0xa8, 0xa8, 0xa4, 0x03, 0xcd, 0x6f, 0xfe, 0x50, 0xc2, 0xcf, 0x76, 0x5f, 0x5a, 0x5a, 0x5e, 0xfe, 0x8f, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x0c, 0x04, 0x60, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x03, 0xe0, 0x9a, 0xc0, 0xd1, 0xd0, 0xc0, 0xfe, 0xbe, 0xfe, 0x15, 0xa7, 0xa7, 0x01, 0xeb, 0x01, 0x39, 0x72, 0x77, 0x77, 0x72, 0x92, 0x04, 0x60, 0xfe, 0x37, 0xa3, 0xa8, 0xa8, 0xa4, 0x02, 0x04, 0xfd, 0xfc, 0x04, 0x60, 0xfe, 0x37, 0x01, 0xc9, 0xfc, 0x33, 0x5f, 0x5a, 0x5a, 0x5e, 0xfe, 0x8f, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x04, 0x15, 0x06, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0xc9, 0x9f, 0x9f, 0xa6, 0x01, 0xe7, 0xfe, 0x19, 0x3c, 0xa1, 0x69, 0xaa, 0xb6, 0xa6, 0x6f, 0x70, 0x89, 0x98, 0xa6, 0x03, 0xd1, 0x8f, 0x01, 0xb4, 0xfe, 0x4c, 0x8f, 0xfe, 0x6d, 0x65, 0x64, 0xea, 0xed, 0xfe, 0xd0, 0x01, 0x2a, 0x9f, 0x9e, 0xc1, 0xa1, 0xfe, 0xfb, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x1d, 0x06, 0x6d, 0x12, 0x26, 0x03, 0xce, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x64, 0x07, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x06, 0x6b, 0x12, 0x26, 0x03, 0xcc, 0x00, 0x00, 0x10, 0x06, 0x00, 0x43, 0x54, 0x05, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x14, 0x12, 0x26, 0x03, 0xd7, 0x00, 0x00, 0x10, 0x06, 0x02, 0x9a, 0x55, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0x0e, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x23, 0x02, 0x18, 0xfe, 0x8f, 0xa7, 0x02, 0x19, 0xa7, 0xfe, 0x8f, 0x85, 0x04, 0x60, 0xfc, 0x33, 0x03, 0xcd, 0xfb, 0xa0, 0xfe, 0xe5, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x06, 0x52, 0x05, 0xd5, 0x00, 0x34, 0x00, 0x00, 0x05, 0x22, 0x27, 0x26, 0x11, 0x34, 0x13, 0x36, 0x37, 0x33, 0x06, 0x03, 0x06, 0x15, 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x11, 0x34, 0x27, 0x02, 0x27, 0x33, 0x16, 0x17, 0x12, 0x15, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x02, 0x01, 0xbe, 0x6d, 0x6e, 0x5a, 0x35, 0x53, 0xe0, 0x4b, 0x7a, 0x3c, 0x41, 0x42, 0x70, 0x67, 0x40, 0x40, 0xb3, 0x3f, 0x3f, 0x69, 0x78, 0x3b, 0x40, 0x3c, 0x7a, 0x4c, 0xe1, 0x56, 0x32, 0x5a, 0x6e, 0x6f, 0xbc, 0x84, 0x5a, 0x5a, 0x24, 0x23, 0x5a, 0x5b, 0x1d, 0xb1, 0xb4, 0x01, 0x98, 0xc9, 0x01, 0x0e, 0x9f, 0x7f, 0x46, 0xfe, 0xbf, 0x9f, 0xb7, 0xfe, 0xcd, 0x6b, 0x6d, 0x69, 0x68, 0xc6, 0xf1, 0xf1, 0xc6, 0x68, 0x69, 0x6d, 0x77, 0x01, 0x27, 0xb7, 0x9f, 0x01, 0x41, 0x46, 0x82, 0x9c, 0xfe, 0xe7, 0xbe, 0xfe, 0x66, 0xb2, 0xb1, 0x5e, 0x5e, 0xad, 0xad, 0x5e, 0x5e, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x04, 0x60, 0x10, 0x06, 0x03, 0x5d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x00, 0x05, 0x20, 0x05, 0xd5, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x21, 0x35, 0x21, 0x35, 0x33, 0x15, 0x21, 0x15, 0x13, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x02, 0x1c, 0x01, 0x2d, 0xe1, 0xf5, 0xf5, 0xe1, 0xfe, 0x1d, 0xfe, 0xb5, 0x01, 0x4b, 0xb6, 0x01, 0x4c, 0xf8, 0x48, 0x46, 0x92, 0xfe, 0xdc, 0x01, 0x24, 0x92, 0x46, 0x48, 0x04, 0x51, 0xe2, 0xda, 0xde, 0xdd, 0xda, 0x04, 0x51, 0xa4, 0xe0, 0xe0, 0xa4, 0xfd, 0x66, 0x8b, 0x44, 0x43, 0xfd, 0xdd, 0x44, 0x43, 0x00, 0x02, 0x00, 0x1b, 0x00, 0x00, 0x04, 0x6a, 0x06, 0x14, 0x00, 0x07, 0x00, 0x19, 0x00, 0x00, 0x24, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x05, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x32, 0x16, 0x10, 0x06, 0x23, 0x03, 0xb9, 0x76, 0x71, 0xec, 0xec, 0x71, 0xfd, 0xfd, 0xfe, 0xdb, 0x01, 0x25, 0xa6, 0x01, 0x7e, 0xfe, 0x82, 0xf3, 0xc1, 0xd0, 0xd0, 0xc1, 0xf2, 0xb4, 0x5e, 0xfe, 0x8f, 0x93, 0x03, 0xcd, 0x93, 0x01, 0xb4, 0xfe, 0x4c, 0x93, 0xfe, 0xca, 0xa3, 0xfe, 0xb0, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xbd, 0xff, 0xe3, 0x06, 0x66, 0x05, 0xf0, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x12, 0x37, 0x36, 0x21, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x12, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x20, 0x27, 0x26, 0x03, 0x01, 0x74, 0xb6, 0xb6, 0xbd, 0x1b, 0x8d, 0xaf, 0x01, 0x32, 0x78, 0x6a, 0x6c, 0x5d, 0x5c, 0x67, 0x69, 0x75, 0xe6, 0x7a, 0x5d, 0x17, 0x02, 0x6d, 0xfd, 0x8c, 0x07, 0x74, 0x7b, 0xe5, 0x75, 0x69, 0x67, 0x5c, 0x5f, 0x6b, 0x6b, 0x76, 0xfe, 0xce, 0xaf, 0xa7, 0x08, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x01, 0x08, 0xa7, 0xd0, 0x24, 0x23, 0x47, 0xd5, 0x5f, 0x2f, 0x2f, 0x9c, 0x77, 0xc6, 0xaa, 0xfe, 0xf3, 0x94, 0x9d, 0x2f, 0x2f, 0x5f, 0xd3, 0x48, 0x24, 0x24, 0xcf, 0xc6, 0x01, 0x4f, 0x00, 0x00, 0x01, 0x00, 0xad, 0xff, 0xe3, 0x04, 0xf5, 0x04, 0x7b, 0x00, 0x23, 0x00, 0x00, 0x01, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x23, 0x11, 0x23, 0x11, 0x33, 0x11, 0x33, 0x36, 0x37, 0x36, 0x03, 0xd1, 0x96, 0x8d, 0x91, 0x8a, 0xcf, 0x53, 0x1f, 0x0b, 0x01, 0x9e, 0xfe, 0x5b, 0x0c, 0x8e, 0x4d, 0x6c, 0x8d, 0x8e, 0x84, 0xa9, 0xf3, 0x85, 0x6e, 0x09, 0x85, 0xa5, 0xa5, 0x89, 0x15, 0x6e, 0x87, 0x04, 0x7b, 0x46, 0xac, 0x56, 0xb4, 0x41, 0x57, 0x8f, 0xf4, 0x5e, 0x33, 0x56, 0xaa, 0x48, 0xad, 0x90, 0xe4, 0xfd, 0xfc, 0x04, 0x60, 0xfe, 0x33, 0xca, 0x80, 0x9e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x06, 0x46, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x00, 0x21, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x23, 0x01, 0x33, 0x13, 0x09, 0x01, 0x06, 0x46, 0xcb, 0xfa, 0xfb, 0xb6, 0xfd, 0xfa, 0xcb, 0x02, 0xb5, 0xcf, 0x9f, 0xfe, 0xf9, 0xfe, 0xf9, 0x02, 0x1b, 0xfd, 0xe5, 0x02, 0x1b, 0xfd, 0xe5, 0x05, 0xd5, 0xfc, 0xf3, 0x02, 0x37, 0xfd, 0xc9, 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x76, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x00, 0x21, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x23, 0x01, 0x33, 0x13, 0x0b, 0x01, 0x05, 0x76, 0xb0, 0xd4, 0xcc, 0xa6, 0xce, 0xd5, 0xaf, 0x02, 0x4c, 0xb0, 0x82, 0xda, 0xdb, 0x01, 0x95, 0xfe, 0x6b, 0x01, 0x95, 0xfe, 0x6b, 0x04, 0x60, 0xfd, 0xb9, 0x01, 0xa1, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x08, 0x2c, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x16, 0x00, 0x00, 0x21, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x23, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x01, 0x33, 0x13, 0x09, 0x01, 0x08, 0x2c, 0xcb, 0xfa, 0xfb, 0xb6, 0xfd, 0xfa, 0xcb, 0x01, 0x4b, 0xfe, 0x2c, 0xb6, 0xb6, 0x02, 0x22, 0x01, 0x1c, 0xcf, 0x9f, 0xfe, 0xf9, 0xfe, 0xf9, 0x02, 0x1b, 0xfd, 0xe5, 0x02, 0x1b, 0xfd, 0xe5, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfc, 0xf3, 0x02, 0x37, 0xfd, 0xc9, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x07, 0x08, 0x04, 0x60, 0x00, 0x13, 0x00, 0x16, 0x00, 0x00, 0x21, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x03, 0x23, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x01, 0x33, 0x13, 0x0b, 0x01, 0x07, 0x08, 0xb0, 0xd4, 0xcc, 0xa6, 0xce, 0xd4, 0xb0, 0x01, 0x00, 0xfe, 0x93, 0xa5, 0xa5, 0x01, 0xb8, 0x01, 0x02, 0xaf, 0x83, 0xdb, 0xdb, 0x01, 0x95, 0xfe, 0x6b, 0x01, 0x95, 0xfe, 0x6b, 0x01, 0xe7, 0xfe, 0x19, 0x04, 0x60, 0xfe, 0x17, 0x01, 0xe9, 0xfd, 0xb9, 0x01, 0xa1, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0x00, 0x00, 0x05, 0x44, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x11, 0x23, 0x10, 0x37, 0x36, 0x37, 0x01, 0x21, 0x01, 0x16, 0x17, 0x16, 0x11, 0x23, 0x10, 0x27, 0x26, 0x27, 0x01, 0x21, 0x03, 0x30, 0xb6, 0x84, 0x5a, 0x75, 0xbf, 0xaa, 0x6c, 0x99, 0xfe, 0x7c, 0x04, 0x90, 0xfe, 0x7b, 0x94, 0x68, 0xa9, 0xbf, 0x74, 0x56, 0xdf, 0x01, 0x1e, 0xfd, 0xc3, 0x02, 0x59, 0xfd, 0xa7, 0x02, 0x59, 0x1c, 0x7e, 0xa4, 0xfe, 0xe5, 0x01, 0x62, 0xd2, 0x86, 0x31, 0x02, 0xea, 0xfd, 0x13, 0x32, 0x82, 0xd2, 0xfe, 0x9e, 0x01, 0x1e, 0xa1, 0x7a, 0xca, 0x02, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0x00, 0x00, 0x04, 0x09, 0x04, 0x60, 0x00, 0x02, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x21, 0x13, 0x09, 0x01, 0x16, 0x17, 0x16, 0x11, 0x23, 0x34, 0x27, 0x26, 0x27, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x15, 0x23, 0x10, 0x37, 0x36, 0x37, 0x01, 0x02, 0xf1, 0xfe, 0x87, 0xbc, 0x01, 0xd4, 0xfe, 0xdc, 0x60, 0x44, 0x7b, 0xb0, 0x4d, 0x34, 0x4e, 0xa5, 0x4b, 0x32, 0x4e, 0xae, 0x7b, 0x43, 0x61, 0xfe, 0xdb, 0x03, 0xb6, 0xfe, 0x96, 0x02, 0x14, 0xfd, 0xcc, 0x26, 0x56, 0x9c, 0xfe, 0xec, 0xc7, 0x74, 0x4f, 0x1a, 0xfe, 0x5c, 0x01, 0xa2, 0x1a, 0x4b, 0x74, 0xc9, 0x01, 0x14, 0x9c, 0x55, 0x27, 0x02, 0x34, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x06, 0xfe, 0x05, 0xd5, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x00, 0x09, 0x01, 0x21, 0x01, 0x16, 0x17, 0x16, 0x11, 0x23, 0x10, 0x27, 0x26, 0x27, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x11, 0x23, 0x10, 0x37, 0x36, 0x37, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x05, 0x01, 0x21, 0x03, 0x8a, 0xfe, 0xc3, 0x04, 0x90, 0xfe, 0x7b, 0x94, 0x68, 0xa9, 0xbf, 0x74, 0x56, 0x8a, 0xb6, 0x84, 0x5a, 0x75, 0xc0, 0xab, 0x4c, 0x63, 0xfd, 0xf0, 0xb6, 0xb6, 0x03, 0x2a, 0x01, 0x1e, 0xfd, 0xc3, 0x03, 0x71, 0x02, 0x64, 0xfd, 0x13, 0x32, 0x82, 0xd2, 0xfe, 0x9e, 0x01, 0x1e, 0xa1, 0x7a, 0x20, 0xfd, 0xa7, 0x02, 0x59, 0x1c, 0x7e, 0xa4, 0xfe, 0xe5, 0x01, 0x62, 0xd2, 0x5f, 0x34, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x6e, 0x02, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x05, 0x90, 0x04, 0x60, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x00, 0x01, 0x03, 0x21, 0x01, 0x16, 0x17, 0x16, 0x11, 0x23, 0x34, 0x27, 0x26, 0x27, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x15, 0x23, 0x10, 0x37, 0x36, 0x37, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x21, 0x13, 0x02, 0xe5, 0xfd, 0x03, 0xa8, 0xfe, 0xdb, 0x61, 0x43, 0x7b, 0xaf, 0x4d, 0x35, 0x4d, 0xa6, 0x4a, 0x33, 0x4d, 0xaf, 0x7b, 0x19, 0x1c, 0xfe, 0xb6, 0xa5, 0xa5, 0x03, 0x26, 0xfe, 0x87, 0xbc, 0x02, 0x77, 0x01, 0xe9, 0xfd, 0xcc, 0x26, 0x56, 0x9c, 0xfe, 0xec, 0xc7, 0x74, 0x4f, 0x1a, 0xfe, 0x5c, 0x01, 0xa2, 0x1a, 0x4b, 0x74, 0xc9, 0x01, 0x14, 0x9c, 0x1f, 0x18, 0xfe, 0x19, 0x04, 0x60, 0xfe, 0x17, 0x01, 0x3f, 0xfe, 0x96, 0x00, 0x00, 0x01, 0x00, 0x67, 0xfe, 0x56, 0x04, 0x02, 0x07, 0x7a, 0x00, 0x53, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0x17, 0x16, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x35, 0x32, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x21, 0x22, 0x07, 0x35, 0x36, 0x37, 0x03, 0x33, 0x13, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x10, 0x07, 0x16, 0x17, 0x16, 0x04, 0x01, 0x67, 0x89, 0xb2, 0x3e, 0xa7, 0x20, 0x56, 0xc6, 0x3b, 0x73, 0x68, 0x1d, 0x58, 0x4c, 0x3d, 0x69, 0x35, 0xe3, 0x36, 0x70, 0x43, 0x92, 0x2f, 0x39, 0x69, 0x01, 0x3c, 0x5e, 0x3f, 0x3a, 0xa8, 0x4f, 0xe0, 0x10, 0x4d, 0x15, 0x93, 0x49, 0x6a, 0xfe, 0xe4, 0x94, 0xc8, 0x90, 0x74, 0x8f, 0x67, 0x90, 0x60, 0x1b, 0x0d, 0x15, 0x15, 0x1f, 0x3c, 0x17, 0x1f, 0x23, 0x09, 0x0e, 0x1f, 0x2d, 0x51, 0x96, 0x58, 0x67, 0xf6, 0x7f, 0x4a, 0x4c, 0x01, 0xbe, 0xcf, 0x67, 0x88, 0x08, 0x82, 0x72, 0x0c, 0x0b, 0x02, 0x07, 0x25, 0xa7, 0x27, 0x1b, 0x2c, 0x61, 0x92, 0x7a, 0x51, 0x5e, 0x58, 0x52, 0x6a, 0xbd, 0x37, 0x19, 0xa6, 0x02, 0x26, 0x36, 0x8d, 0xee, 0x4a, 0xb4, 0x2d, 0x0d, 0x01, 0x83, 0xfe, 0x83, 0xde, 0x40, 0x18, 0x27, 0x12, 0x1b, 0x0a, 0x57, 0x05, 0x02, 0x6f, 0xca, 0x18, 0x57, 0x64, 0xa7, 0xfe, 0xfd, 0x45, 0x1e, 0x5c, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x51, 0xfe, 0x74, 0x03, 0x68, 0x06, 0x06, 0x00, 0x4f, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x10, 0x33, 0x21, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x22, 0x23, 0x35, 0x32, 0x17, 0x32, 0x33, 0x20, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x35, 0x36, 0x37, 0x03, 0x33, 0x13, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x04, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x03, 0x67, 0x6a, 0x62, 0x92, 0x3d, 0x97, 0x17, 0x48, 0x58, 0x1e, 0x23, 0x28, 0xa0, 0x29, 0x59, 0x4f, 0x35, 0x59, 0x2c, 0xbd, 0x2d, 0x5e, 0x39, 0x7b, 0xb0, 0x01, 0x0e, 0x51, 0x63, 0x46, 0x36, 0x66, 0x05, 0xa0, 0x0a, 0x1d, 0x1d, 0x13, 0x01, 0x16, 0x54, 0x41, 0x53, 0x82, 0xa6, 0x71, 0x5c, 0x8f, 0x68, 0x90, 0x5f, 0x2a, 0x13, 0x27, 0x49, 0x17, 0x20, 0x2d, 0x0e, 0x1e, 0x2e, 0x51, 0x01, 0x11, 0xd1, 0x64, 0x40, 0x48, 0x01, 0x52, 0x9e, 0x5e, 0x56, 0x08, 0x81, 0x61, 0x1b, 0x09, 0x24, 0x27, 0x8b, 0x22, 0x17, 0x25, 0x52, 0x97, 0x01, 0x0c, 0x60, 0x59, 0x4c, 0x38, 0x2b, 0x08, 0x98, 0x01, 0xa0, 0x51, 0x2a, 0x21, 0x37, 0xa7, 0x1f, 0x0b, 0x01, 0x83, 0xfe, 0x83, 0xde, 0x63, 0x17, 0x32, 0x0a, 0x57, 0x07, 0x6f, 0xca, 0x2f, 0xf2, 0xc4, 0x32, 0x16, 0x40, 0x49, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x06, 0x15, 0x05, 0xd5, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x01, 0x33, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x06, 0x14, 0x34, 0x17, 0x1c, 0x22, 0x1a, 0x3b, 0x36, 0xff, 0x00, 0xe1, 0xb6, 0xe1, 0xfe, 0x86, 0xb0, 0x01, 0x3b, 0x70, 0xb6, 0x71, 0xd0, 0x47, 0x5d, 0x3c, 0x74, 0x2e, 0x32, 0x05, 0x14, 0x07, 0x03, 0x19, 0x38, 0xa1, 0xfd, 0x0a, 0xfe, 0xca, 0x01, 0x36, 0x04, 0x60, 0xfc, 0x54, 0x03, 0xeb, 0xfc, 0x13, 0x02, 0x72, 0xd4, 0x50, 0x33, 0x10, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xfe, 0x56, 0x06, 0x22, 0x06, 0x1e, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x01, 0x33, 0x01, 0x33, 0x11, 0x33, 0x11, 0x33, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x06, 0x22, 0x35, 0x16, 0x1d, 0x21, 0x1a, 0x3c, 0x36, 0xff, 0xe1, 0xa5, 0xe1, 0xfe, 0x86, 0xaf, 0x01, 0x3c, 0x70, 0xa5, 0x70, 0xd1, 0x46, 0x5e, 0x3b, 0x74, 0x2e, 0x33, 0x03, 0xde, 0x07, 0x03, 0x19, 0x38, 0xa1, 0xfd, 0x0a, 0xfe, 0x56, 0x01, 0xaa, 0x04, 0x60, 0xfc, 0x54, 0x05, 0x6a, 0xfa, 0x94, 0x02, 0x72, 0xd4, 0x50, 0x33, 0x10, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x12, 0x06, 0x01, 0x61, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x12, 0x06, 0x02, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x8a, 0x05, 0xf0, 0x00, 0x12, 0x00, 0x00, 0x01, 0x32, 0x17, 0x15, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x01, 0x23, 0x01, 0x33, 0x09, 0x01, 0x12, 0x36, 0x05, 0x18, 0x39, 0x39, 0x3e, 0x14, 0x16, 0x42, 0x1e, 0x40, 0x4c, 0xfe, 0xa8, 0xcf, 0xfd, 0xff, 0xbe, 0x01, 0xaa, 0x01, 0x19, 0x67, 0x9d, 0x05, 0xf0, 0x15, 0xbb, 0x0a, 0x04, 0x22, 0x43, 0xdd, 0xfc, 0x14, 0x05, 0xd5, 0xfb, 0x17, 0x03, 0x3d, 0x01, 0x32, 0x95, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x04, 0x9c, 0x04, 0x7b, 0x00, 0x13, 0x00, 0x00, 0x01, 0x32, 0x17, 0x15, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x01, 0x23, 0x01, 0x33, 0x01, 0x13, 0x36, 0x37, 0x36, 0x04, 0x3c, 0x2e, 0x32, 0x34, 0x11, 0x23, 0x21, 0x1a, 0x3b, 0x36, 0xff, 0x00, 0xe1, 0xfe, 0x86, 0xaf, 0x01, 0x3c, 0xd0, 0x48, 0x5c, 0x3c, 0x04, 0x7b, 0x10, 0x8d, 0x07, 0x03, 0x19, 0x37, 0xa2, 0xfd, 0x0a, 0x04, 0x60, 0xfc, 0x54, 0x02, 0x70, 0xd5, 0x4f, 0x33, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x8a, 0x07, 0x70, 0x10, 0x27, 0x10, 0xf5, 0x04, 0x67, 0x01, 0x7a, 0x12, 0x06, 0x04, 0x08, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2d, 0x00, 0x00, 0x04, 0x9c, 0x06, 0x66, 0x10, 0x27, 0x02, 0xc0, 0x04, 0x48, 0x00, 0x00, 0x12, 0x06, 0x04, 0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0xfe, 0x56, 0x06, 0xee, 0x05, 0xf0, 0x00, 0x11, 0x00, 0x1e, 0x00, 0x2c, 0x00, 0x00, 0x09, 0x01, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x01, 0x33, 0x1b, 0x01, 0x01, 0x10, 0x07, 0x02, 0x20, 0x03, 0x26, 0x10, 0x37, 0x12, 0x20, 0x13, 0x16, 0x03, 0x10, 0x27, 0x26, 0x20, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x20, 0x37, 0x36, 0x06, 0xee, 0xfe, 0x45, 0x4a, 0x3f, 0x42, 0x70, 0x84, 0x61, 0x44, 0x26, 0x22, 0x32, 0x6f, 0xfe, 0xc6, 0xaf, 0xe4, 0xe3, 0xfd, 0x86, 0x56, 0x71, 0xfe, 0x33, 0x72, 0x56, 0x56, 0x72, 0x01, 0xcd, 0x71, 0x56, 0xc0, 0x19, 0x32, 0xfe, 0xbc, 0x35, 0x19, 0x1a, 0x34, 0x01, 0x44, 0x33, 0x18, 0x04, 0x60, 0xfb, 0x38, 0xcb, 0x3a, 0x3d, 0x9a, 0x24, 0x21, 0x89, 0x01, 0x37, 0x03, 0x6b, 0xfd, 0x8a, 0x02, 0x76, 0xfe, 0x8a, 0xfe, 0xdd, 0xd0, 0xfe, 0xec, 0x01, 0x13, 0xd1, 0x02, 0x44, 0xd1, 0x01, 0x14, 0xfe, 0xed, 0xd1, 0xfe, 0xde, 0x01, 0x06, 0x72, 0xea, 0xea, 0x74, 0xfe, 0xfb, 0xfe, 0xfc, 0x74, 0xea, 0xea, 0x72, 0x00, 0x00, 0x03, 0x00, 0x65, 0xfe, 0x56, 0x06, 0x4c, 0x04, 0x7b, 0x00, 0x11, 0x00, 0x1f, 0x00, 0x25, 0x00, 0x00, 0x09, 0x01, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x01, 0x33, 0x1b, 0x01, 0x00, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x02, 0x10, 0x23, 0x22, 0x10, 0x33, 0x06, 0x4c, 0xfe, 0x45, 0x4a, 0x3f, 0x42, 0x70, 0x84, 0x61, 0x44, 0x26, 0x22, 0x32, 0x6f, 0xfe, 0xc6, 0xaf, 0xe4, 0xe3, 0xfd, 0xb6, 0x55, 0x67, 0xb8, 0xba, 0x68, 0x56, 0x56, 0x68, 0xba, 0xb8, 0x67, 0x5a, 0xc5, 0xca, 0xca, 0x04, 0x60, 0xfb, 0x38, 0xcb, 0x3a, 0x3d, 0x9a, 0x24, 0x21, 0x89, 0x01, 0x37, 0x03, 0x6b, 0xfd, 0x8a, 0x02, 0x76, 0xfe, 0xab, 0xfe, 0x48, 0xa7, 0xc9, 0xc8, 0xa6, 0x01, 0xbc, 0xa6, 0xc8, 0xc9, 0xfc, 0xcd, 0x03, 0x60, 0xfc, 0xa0, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x06, 0x76, 0x05, 0xf0, 0x00, 0x29, 0x00, 0x52, 0x00, 0x00, 0x25, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x07, 0x23, 0x20, 0x27, 0x26, 0x10, 0x37, 0x36, 0x21, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x20, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x21, 0x23, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0xed, 0x1b, 0xd4, 0x66, 0x74, 0x74, 0x66, 0xd4, 0x1b, 0x0a, 0x0d, 0x14, 0x18, 0x18, 0x37, 0x18, 0x18, 0x14, 0x0e, 0x09, 0x2a, 0xd3, 0x67, 0x75, 0x75, 0x67, 0xd3, 0x2a, 0x09, 0x0e, 0x14, 0x18, 0x18, 0x37, 0x18, 0x18, 0x14, 0x0e, 0xe4, 0x2a, 0xfe, 0xc4, 0x88, 0xaa, 0xaa, 0x88, 0x01, 0x3c, 0x29, 0x0a, 0x0e, 0x14, 0x18, 0x18, 0x37, 0x18, 0x1c, 0x10, 0x0e, 0x0a, 0x1a, 0x01, 0x3b, 0x89, 0xa9, 0xa9, 0x89, 0xfe, 0xc5, 0x1a, 0x09, 0x0f, 0x14, 0x18, 0x18, 0x37, 0x18, 0x1c, 0x10, 0x0e, 0xc2, 0x91, 0xa4, 0xf2, 0xf3, 0xa4, 0x91, 0x14, 0x0e, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x10, 0x12, 0x91, 0xa4, 0xf3, 0xf2, 0xa4, 0x91, 0x12, 0x10, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x10, 0xa1, 0xaa, 0xd2, 0x02, 0x74, 0xd3, 0xaa, 0x15, 0x0f, 0x15, 0x0c, 0x0b, 0x0b, 0x0e, 0x13, 0x11, 0x13, 0xaa, 0xd3, 0xfe, 0xc6, 0xfe, 0xc7, 0xd2, 0xab, 0x13, 0x11, 0x15, 0x0c, 0x0b, 0x0b, 0x0e, 0x13, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x05, 0x11, 0x04, 0x7b, 0x00, 0x26, 0x00, 0x50, 0x00, 0x00, 0x25, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x36, 0x37, 0x3e, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x07, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0x1a, 0x28, 0x91, 0x41, 0x4d, 0x4d, 0x39, 0x99, 0x28, 0x06, 0x0a, 0x10, 0x27, 0x2f, 0x28, 0x10, 0x09, 0x06, 0x29, 0x92, 0x40, 0x4e, 0x4d, 0x41, 0x92, 0x29, 0x06, 0x09, 0x10, 0x28, 0x2f, 0x13, 0x19, 0x0b, 0x09, 0xb5, 0x2a, 0xe7, 0x6c, 0x7b, 0x7b, 0x68, 0xeb, 0x2a, 0x06, 0x08, 0x0c, 0x18, 0x14, 0x2f, 0x13, 0x19, 0x0b, 0x09, 0x06, 0x29, 0xe8, 0x6c, 0x7b, 0x7b, 0x69, 0xeb, 0x29, 0x06, 0x09, 0x0b, 0x19, 0x13, 0x2f, 0x14, 0x18, 0x0c, 0x08, 0xa4, 0x60, 0x74, 0xb7, 0xa7, 0x83, 0x61, 0x0b, 0x0a, 0x11, 0x14, 0x14, 0x11, 0x0a, 0x0b, 0x5f, 0x74, 0xb8, 0xbc, 0x70, 0x5f, 0x0b, 0x0a, 0x11, 0x14, 0x0a, 0x0c, 0x0f, 0x0a, 0x93, 0x89, 0x9c, 0xee, 0xe9, 0xa2, 0x88, 0x0a, 0x0a, 0x0f, 0x0c, 0x0a, 0x0a, 0x0c, 0x0f, 0x0a, 0x0a, 0x88, 0x9c, 0xef, 0xe8, 0xa2, 0x89, 0x0a, 0x0a, 0x0f, 0x0c, 0x0a, 0x0a, 0x0c, 0x0f, 0x0a, 0x00, 0x03, 0x00, 0x6a, 0xff, 0xe3, 0x08, 0x15, 0x07, 0x74, 0x00, 0x34, 0x00, 0x3d, 0x00, 0x4b, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x15, 0x10, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x11, 0x34, 0x27, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x01, 0x10, 0x23, 0x35, 0x16, 0x35, 0x23, 0x35, 0x33, 0x17, 0x23, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x20, 0x08, 0x14, 0x5c, 0x68, 0xd3, 0x51, 0x64, 0x57, 0x56, 0x6e, 0x6c, 0x6e, 0x6f, 0xae, 0x63, 0x52, 0xd3, 0x68, 0x5c, 0x3c, 0x40, 0x64, 0xe0, 0x71, 0x52, 0x4c, 0xe6, 0x7c, 0x54, 0x44, 0x44, 0x5c, 0x8d, 0x8b, 0x5a, 0x44, 0x43, 0x53, 0x7c, 0xe7, 0x4d, 0x52, 0x71, 0xe1, 0x64, 0x3f, 0x3c, 0xfc, 0xa2, 0xda, 0x79, 0x78, 0xd9, 0xe4, 0x6a, 0x15, 0x92, 0x54, 0x52, 0x84, 0x7a, 0x7d, 0x42, 0x6c, 0x70, 0x01, 0x07, 0x01, 0xfe, 0xf2, 0x8b, 0x9e, 0x44, 0x40, 0x40, 0x44, 0x44, 0x80, 0x44, 0x9d, 0x8b, 0xf2, 0xc6, 0xe2, 0xec, 0x98, 0x6b, 0xf3, 0xe2, 0xb6, 0xfe, 0xba, 0x36, 0x33, 0x33, 0x36, 0x36, 0x33, 0x33, 0x36, 0x01, 0x46, 0xb6, 0xe2, 0xf3, 0x6b, 0x98, 0xec, 0xe2, 0x03, 0x0a, 0xfe, 0xf5, 0x67, 0x03, 0x9d, 0x9e, 0x11, 0x9b, 0x2f, 0x4b, 0x17, 0x86, 0x27, 0x2a, 0x43, 0x00, 0x03, 0x00, 0x88, 0xff, 0xe3, 0x06, 0xde, 0x06, 0x10, 0x00, 0x21, 0x00, 0x2a, 0x00, 0x38, 0x00, 0x00, 0x01, 0x12, 0x11, 0x10, 0x21, 0x22, 0x24, 0x22, 0x04, 0x23, 0x20, 0x11, 0x10, 0x13, 0x33, 0x02, 0x15, 0x10, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x11, 0x34, 0x03, 0x25, 0x10, 0x23, 0x35, 0x16, 0x35, 0x23, 0x35, 0x33, 0x17, 0x23, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x20, 0x06, 0x62, 0x7c, 0xfe, 0x9a, 0x4c, 0xfe, 0xf3, 0xd8, 0xfe, 0xf2, 0x4a, 0xfe, 0x9a, 0x7c, 0xb2, 0x83, 0xbb, 0x38, 0x41, 0x6c, 0x13, 0x5a, 0xe3, 0x5a, 0x12, 0x6d, 0x42, 0x39, 0xbb, 0x84, 0xfe, 0x7b, 0xd9, 0x78, 0x77, 0xd8, 0xe4, 0x6a, 0x15, 0x91, 0x54, 0x52, 0x84, 0x7b, 0x7d, 0x43, 0x6b, 0x70, 0x01, 0x07, 0x03, 0xc5, 0xfe, 0xe3, 0xfe, 0xeb, 0xfe, 0x50, 0xe2, 0xe2, 0x01, 0xb1, 0x01, 0x14, 0x01, 0x1d, 0xfe, 0xb9, 0xfa, 0xfe, 0xfb, 0x38, 0x5b, 0x0c, 0x37, 0x37, 0x0c, 0x5b, 0x38, 0x01, 0x07, 0xf8, 0x01, 0x47, 0xa4, 0xfe, 0xf5, 0x67, 0x03, 0x9d, 0x9e, 0x11, 0x9b, 0x2f, 0x4b, 0x17, 0x86, 0x27, 0x2a, 0x43, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x06, 0x52, 0x07, 0x33, 0x10, 0x27, 0x11, 0xb5, 0x00, 0x59, 0x01, 0x53, 0x10, 0x06, 0x03, 0xf4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x05, 0xe0, 0x10, 0x26, 0x11, 0xb5, 0x00, 0x00, 0x10, 0x06, 0x03, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xfe, 0x56, 0x04, 0xa4, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x23, 0x20, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x21, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x33, 0x21, 0x11, 0x23, 0x03, 0x94, 0x9c, 0xfe, 0xc7, 0xa8, 0xaf, 0xaf, 0xaf, 0x01, 0x32, 0x78, 0x6a, 0x6c, 0x5d, 0x5c, 0x67, 0x69, 0x75, 0xe6, 0x7a, 0x7b, 0x7b, 0x88, 0xd8, 0x01, 0x47, 0xb5, 0xc6, 0xd0, 0x01, 0x53, 0x01, 0x68, 0xcf, 0xd0, 0x24, 0x23, 0x47, 0xd5, 0x5f, 0x2f, 0x2f, 0x9c, 0x9d, 0xfe, 0xd8, 0xfe, 0xd3, 0x82, 0x94, 0xfd, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xfe, 0x56, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x22, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x11, 0x23, 0x11, 0x02, 0x56, 0xeb, 0x7f, 0x86, 0x88, 0x87, 0xeb, 0x4d, 0x49, 0x49, 0x44, 0x46, 0x47, 0x46, 0x48, 0xa2, 0x59, 0x59, 0x59, 0x59, 0xa2, 0xdc, 0xb5, 0x96, 0x9f, 0xfa, 0x01, 0x12, 0x9d, 0x9d, 0x11, 0x12, 0x23, 0xac, 0x2b, 0x16, 0x15, 0x71, 0x72, 0xcd, 0xb9, 0x72, 0x71, 0xfd, 0xc3, 0x01, 0xaa, 0x00, 0x01, 0x00, 0x35, 0xff, 0xa5, 0x03, 0x69, 0x03, 0xa7, 0x00, 0x13, 0x00, 0x00, 0x01, 0x07, 0x27, 0x07, 0x17, 0x07, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x03, 0x69, 0x5a, 0xc2, 0x5f, 0xc2, 0x5a, 0xc2, 0x70, 0x9d, 0x71, 0xc3, 0x5a, 0xc3, 0x5e, 0xc2, 0x5a, 0xc2, 0x5e, 0x9d, 0x5e, 0x02, 0x11, 0xae, 0x7d, 0xb5, 0x7d, 0xae, 0x7d, 0xd8, 0x64, 0xd8, 0x7d, 0xae, 0x7d, 0xb5, 0x7d, 0xae, 0x7d, 0xb5, 0x64, 0xb5, 0x00, 0x01, 0xfc, 0x44, 0x04, 0xde, 0xff, 0x55, 0x06, 0x7a, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x21, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x21, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0xfe, 0xda, 0xfe, 0x61, 0x09, 0x0a, 0x11, 0x12, 0x17, 0x15, 0x33, 0x15, 0x17, 0x12, 0x11, 0x0a, 0x09, 0x09, 0x0a, 0x11, 0x12, 0x17, 0x15, 0x1a, 0x01, 0x9e, 0x09, 0x0a, 0x11, 0x12, 0x17, 0x15, 0x33, 0x15, 0x17, 0x12, 0x12, 0x09, 0x09, 0x09, 0x0a, 0x11, 0x12, 0x17, 0x15, 0x05, 0x67, 0x1b, 0x19, 0x1b, 0x12, 0x13, 0x0b, 0x0a, 0x0a, 0x0b, 0x13, 0x12, 0x1b, 0x19, 0x1b, 0x1c, 0x19, 0x1b, 0x12, 0x13, 0x0b, 0x0a, 0x1b, 0x19, 0x1b, 0x12, 0x13, 0x0b, 0x0a, 0x0a, 0x0b, 0x13, 0x15, 0x18, 0x19, 0x1c, 0x1b, 0x19, 0x1b, 0x12, 0x13, 0x0b, 0x0a, 0x00, 0x00, 0x01, 0xfd, 0x53, 0x05, 0x29, 0x00, 0x09, 0x06, 0x4d, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x23, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x20, 0x08, 0x6a, 0x15, 0x92, 0x53, 0x52, 0x84, 0x7b, 0x7d, 0x43, 0x6b, 0x70, 0x01, 0x07, 0x05, 0x29, 0x9b, 0x2f, 0x4b, 0x17, 0x86, 0x27, 0x2a, 0x43, 0x00, 0x01, 0xfd, 0xed, 0x04, 0xc2, 0xfe, 0xc8, 0x06, 0x61, 0x00, 0x08, 0x00, 0x00, 0x01, 0x22, 0x11, 0x35, 0x33, 0x15, 0x23, 0x14, 0x37, 0xfe, 0xc8, 0xda, 0xd9, 0x78, 0x79, 0x04, 0xc2, 0x01, 0x0b, 0x94, 0x9e, 0x9d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xed, 0x04, 0xc2, 0xfe, 0xc8, 0x06, 0x61, 0x00, 0x08, 0x00, 0x00, 0x01, 0x10, 0x23, 0x35, 0x16, 0x35, 0x23, 0x35, 0x33, 0xfe, 0xc8, 0xda, 0x78, 0x77, 0xd9, 0x05, 0xcd, 0xfe, 0xf5, 0x67, 0x03, 0x9d, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfa, 0x69, 0x04, 0xd9, 0x00, 0x09, 0x06, 0x4d, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x12, 0x21, 0x32, 0x05, 0x04, 0x25, 0x15, 0x24, 0x27, 0x24, 0x27, 0x26, 0x07, 0xfa, 0x69, 0x79, 0x01, 0x84, 0x67, 0x01, 0x25, 0x01, 0x13, 0x01, 0x03, 0xfe, 0x89, 0xd7, 0xfe, 0xf6, 0x5c, 0xc6, 0x89, 0x05, 0x01, 0x01, 0x4c, 0x7b, 0x74, 0x01, 0x86, 0x17, 0x5c, 0x71, 0x07, 0x0c, 0xcf, 0x00, 0x00, 0x00, 0x08, 0xf8, 0xa7, 0xfe, 0x90, 0x02, 0xf3, 0x07, 0x60, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x26, 0x00, 0x33, 0x00, 0x40, 0x00, 0x4d, 0x00, 0x5a, 0x00, 0x67, 0x00, 0x00, 0x01, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x01, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x05, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x01, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x05, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x01, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x05, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0x01, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x20, 0x16, 0xfe, 0xe6, 0x6a, 0x0a, 0x57, 0x4e, 0x4e, 0x56, 0x0c, 0x6a, 0x09, 0x8e, 0x01, 0x05, 0x8e, 0x02, 0xe6, 0x6a, 0x0a, 0x57, 0x4f, 0x4d, 0x57, 0x0b, 0x6a, 0x08, 0x8f, 0x01, 0x05, 0x8e, 0xfa, 0x50, 0x6a, 0x0a, 0x58, 0x4e, 0x4d, 0x57, 0x0c, 0x6a, 0x09, 0x8f, 0x01, 0x04, 0x8f, 0x05, 0xc2, 0x6a, 0x0a, 0x57, 0x4f, 0x4d, 0x57, 0x0b, 0x6a, 0x08, 0x8f, 0x01, 0x05, 0x8e, 0xfa, 0x50, 0x6a, 0x0a, 0x58, 0x4e, 0x4d, 0x57, 0x0c, 0x6a, 0x09, 0x8f, 0x01, 0x04, 0x8f, 0x06, 0xf1, 0x6a, 0x0a, 0x57, 0x4f, 0x4d, 0x56, 0x0c, 0x6a, 0x09, 0x8e, 0x01, 0x05, 0x8e, 0xf7, 0xf1, 0x6a, 0x0a, 0x57, 0x4e, 0x4e, 0x56, 0x0c, 0x6a, 0x09, 0x8e, 0x01, 0x05, 0x8e, 0x04, 0x15, 0x6a, 0x0a, 0x57, 0x4e, 0x4e, 0x56, 0x0c, 0x6a, 0x09, 0x8e, 0x01, 0x05, 0x8e, 0x06, 0x41, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0xfe, 0x51, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x8f, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0xfa, 0x01, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x8f, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x02, 0x29, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x8f, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0xfb, 0x98, 0x4b, 0x4b, 0x4a, 0x4c, 0x8f, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf9, 0x1c, 0xfd, 0xc3, 0x02, 0x7c, 0x08, 0x2d, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x23, 0x00, 0x29, 0x00, 0x2f, 0x00, 0x00, 0x27, 0x37, 0x17, 0x13, 0x07, 0x03, 0x01, 0x07, 0x27, 0x03, 0x37, 0x13, 0x01, 0x27, 0x37, 0x25, 0x17, 0x05, 0x01, 0x17, 0x07, 0x05, 0x27, 0x25, 0x01, 0x35, 0x33, 0x05, 0x15, 0x2d, 0x01, 0x15, 0x23, 0x25, 0x35, 0x05, 0x01, 0x23, 0x35, 0x13, 0x33, 0x0b, 0x01, 0x33, 0x15, 0x03, 0x23, 0x13, 0x60, 0x87, 0x6d, 0x64, 0x53, 0x98, 0xfb, 0xeb, 0x87, 0x6d, 0x64, 0x53, 0x98, 0x04, 0x9c, 0x87, 0x6e, 0x01, 0x33, 0x53, 0xff, 0x00, 0xfa, 0xde, 0x86, 0x6d, 0xfe, 0xcb, 0x52, 0x01, 0x00, 0x05, 0xbd, 0x9a, 0x01, 0x20, 0xfe, 0xe0, 0xf9, 0x7c, 0x9b, 0xfe, 0xe0, 0x01, 0x20, 0x03, 0xef, 0xbe, 0x94, 0x74, 0x4a, 0xbe, 0xbe, 0x93, 0x75, 0x4a, 0x5a, 0x96, 0x79, 0xfe, 0xa9, 0x5c, 0x01, 0x1d, 0x05, 0xb5, 0x96, 0x79, 0x01, 0x57, 0x5c, 0xfe, 0xe3, 0xfe, 0xf1, 0x95, 0x7a, 0x6e, 0x5b, 0xa9, 0xfb, 0x77, 0x96, 0x79, 0x6f, 0x5c, 0xa8, 0x02, 0x18, 0xd4, 0xa4, 0x82, 0x52, 0xd4, 0xd4, 0xa4, 0x82, 0x52, 0x02, 0xdf, 0xac, 0x01, 0x40, 0xfe, 0xc0, 0xf8, 0xc2, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x56, 0x05, 0x63, 0x07, 0x6d, 0x10, 0x26, 0x11, 0xb6, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf2, 0x04, 0x76, 0x01, 0x75, 0xff, 0xff, 0x00, 0xad, 0xfe, 0x56, 0x04, 0xb3, 0x06, 0x14, 0x10, 0x26, 0x11, 0xb7, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9a, 0x00, 0x90, 0xff, 0xcc, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x01, 0x34, 0x27, 0x26, 0x23, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x01, 0x6b, 0x01, 0x2c, 0xe2, 0xf5, 0xf5, 0xe2, 0xfe, 0x1e, 0x97, 0x97, 0xb6, 0x97, 0x01, 0xac, 0x47, 0x46, 0x93, 0xfe, 0xdd, 0x01, 0x23, 0x93, 0x46, 0x47, 0x04, 0x51, 0xe2, 0xda, 0xde, 0xdd, 0xda, 0x04, 0x51, 0xa4, 0xe0, 0xe0, 0xa4, 0xfd, 0x66, 0x8b, 0x44, 0x43, 0xfd, 0xdd, 0x44, 0x43, 0x00, 0x00, 0x00, 0x02, 0x00, 0x22, 0x00, 0x00, 0x03, 0xd8, 0x05, 0x9e, 0x00, 0x0a, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x37, 0x36, 0x01, 0x11, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x03, 0x27, 0x37, 0x3d, 0x73, 0xed, 0xed, 0x74, 0x3c, 0x37, 0xfe, 0x2c, 0xf4, 0xbb, 0x6d, 0x69, 0x69, 0x67, 0xc1, 0xfe, 0x67, 0x8c, 0x8c, 0xa5, 0x8e, 0x01, 0x4c, 0x5e, 0x2a, 0x2e, 0xfe, 0x97, 0x2e, 0x2b, 0x02, 0xdf, 0xfe, 0xca, 0x55, 0x52, 0xfe, 0xb0, 0x52, 0x52, 0x03, 0xd1, 0x8f, 0x01, 0x3e, 0xfe, 0xc2, 0x8f, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x65, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x17, 0x07, 0x27, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x27, 0x36, 0x37, 0x34, 0x26, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x37, 0x27, 0x37, 0x03, 0xe6, 0x7e, 0x5f, 0x84, 0x71, 0xc1, 0xe4, 0xb6, 0x01, 0x9a, 0xe2, 0x73, 0x74, 0xcb, 0x0b, 0x01, 0x8b, 0x7f, 0xe4, 0xe4, 0x67, 0x40, 0xc2, 0x60, 0x03, 0x23, 0x75, 0x7e, 0x7b, 0x53, 0xfd, 0xa8, 0x05, 0xd5, 0x71, 0x72, 0xdb, 0x92, 0x2d, 0x2c, 0x39, 0x86, 0x92, 0xfd, 0xcf, 0x2f, 0xb4, 0x7e, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x10, 0x00, 0x29, 0x00, 0x00, 0x25, 0x27, 0x37, 0x17, 0x36, 0x35, 0x34, 0x27, 0x26, 0x20, 0x07, 0x06, 0x10, 0x17, 0x16, 0x33, 0x32, 0x1f, 0x01, 0x07, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x02, 0xd9, 0x7e, 0x63, 0x7c, 0x47, 0x4a, 0x4c, 0xfe, 0xf9, 0x4b, 0x4b, 0x4b, 0x4b, 0x84, 0x3f, 0xfe, 0x85, 0x64, 0x86, 0x4f, 0x61, 0x6f, 0x4f, 0x50, 0x34, 0xa7, 0xa7, 0x34, 0x50, 0x4f, 0x6f, 0xb8, 0x72, 0x73, 0x73, 0x0b, 0x98, 0xa7, 0x5d, 0xa5, 0x73, 0xc5, 0xcb, 0x74, 0x73, 0x74, 0x73, 0xfe, 0x6a, 0x74, 0x73, 0x14, 0xae, 0x5d, 0xb3, 0x2e, 0x30, 0x31, 0x64, 0xfd, 0xae, 0x06, 0x0a, 0xaa, 0x64, 0x30, 0x31, 0xa2, 0xa2, 0xfd, 0xf0, 0xa2, 0x0f, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x07, 0x07, 0x00, 0x07, 0x00, 0x00, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0xb5, 0x02, 0xab, 0x99, 0xfd, 0x72, 0x05, 0xd5, 0x01, 0x32, 0xfe, 0x24, 0xfa, 0xd5, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x6f, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0xa7, 0x02, 0x43, 0x84, 0xfd, 0xdf, 0x04, 0x60, 0x01, 0x3a, 0xfe, 0x33, 0xfc, 0x33, 0x00, 0x01, 0x00, 0x3f, 0x00, 0x00, 0x04, 0x71, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x2d, 0xed, 0xed, 0x03, 0x44, 0xfd, 0x71, 0x01, 0xed, 0xfe, 0x13, 0x02, 0x94, 0xaa, 0x02, 0x97, 0xaa, 0xfe, 0x13, 0xaa, 0xfd, 0x6c, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x00, 0x03, 0xe7, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x00, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x1f, 0xed, 0xed, 0x02, 0xc7, 0xfd, 0xdf, 0x01, 0x76, 0xfe, 0x8a, 0x01, 0xf4, 0xaa, 0x01, 0xc2, 0x9d, 0xfe, 0xdb, 0xaa, 0xfe, 0x0c, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x04, 0x52, 0x05, 0xd5, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x01, 0x6b, 0xb6, 0x03, 0x44, 0xfd, 0x72, 0x01, 0x77, 0xa7, 0x66, 0x62, 0xb7, 0xce, 0x44, 0x38, 0x78, 0x33, 0x31, 0x6f, 0x70, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0xd5, 0xaa, 0xfe, 0x46, 0x77, 0x72, 0xee, 0xfe, 0xce, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4b, 0xc2, 0x01, 0x22, 0x9f, 0x9e, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xa4, 0x04, 0x60, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x27, 0x26, 0x23, 0x01, 0x4d, 0xa6, 0x02, 0xc7, 0xfd, 0xdf, 0xe1, 0xed, 0x3f, 0x4a, 0x4a, 0x49, 0xa3, 0xae, 0x9b, 0x63, 0x1e, 0x22, 0x22, 0x2c, 0x79, 0x01, 0xe7, 0xfe, 0x19, 0x04, 0x60, 0xaa, 0xfe, 0xc1, 0x47, 0x51, 0xe5, 0xfe, 0xf2, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x37, 0x93, 0x01, 0x08, 0xaa, 0x20, 0x29, 0x00, 0x01, 0x00, 0x24, 0xfe, 0xbf, 0x07, 0xb6, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x01, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x03, 0x11, 0x23, 0x11, 0x03, 0x01, 0x23, 0x09, 0x01, 0x33, 0x01, 0x03, 0x86, 0xb6, 0x02, 0x65, 0xdd, 0xfe, 0x15, 0x01, 0xa8, 0x7b, 0xb2, 0x24, 0xfe, 0x44, 0xe8, 0xb6, 0xe8, 0xfe, 0x44, 0xbe, 0x02, 0x0a, 0xfe, 0x16, 0xdc, 0x02, 0x66, 0x05, 0xd5, 0xfd, 0x1e, 0x02, 0xe2, 0xfd, 0xb3, 0xfd, 0x22, 0xfe, 0x15, 0x01, 0x41, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x01, 0xea, 0x01, 0x17, 0xfc, 0xff, 0x03, 0x88, 0x02, 0x4d, 0xfd, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xfe, 0xe5, 0x06, 0x50, 0x04, 0x60, 0x00, 0x17, 0x00, 0x00, 0x01, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, 0x27, 0x01, 0x23, 0x09, 0x01, 0x33, 0x01, 0x02, 0xec, 0xa5, 0x01, 0xb8, 0xc0, 0xfe, 0x97, 0x01, 0x42, 0x6e, 0xa6, 0x1e, 0xfe, 0xad, 0xa8, 0xa5, 0xa8, 0xfe, 0xac, 0xb1, 0x01, 0x9e, 0xfe, 0x96, 0xc1, 0x01, 0xb8, 0x04, 0x60, 0xfd, 0xf2, 0x02, 0x0e, 0xfe, 0x51, 0xfd, 0xe8, 0xfe, 0x4c, 0x01, 0x1b, 0x02, 0x36, 0xc9, 0xfe, 0x93, 0x01, 0x6d, 0xc9, 0xfd, 0xca, 0x02, 0xb1, 0x01, 0xaf, 0xfd, 0xf2, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x75, 0x04, 0x25, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7a, 0x33, 0x00, 0x12, 0x06, 0x03, 0xab, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xfe, 0x75, 0x03, 0x68, 0x04, 0x7c, 0x10, 0x26, 0x00, 0x7a, 0xd3, 0x00, 0x12, 0x06, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x05, 0x22, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x03, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x89, 0xea, 0xfd, 0xf8, 0x01, 0xbc, 0x90, 0xb1, 0x3e, 0xfe, 0x2d, 0xf5, 0xb6, 0x05, 0xd5, 0xfd, 0x1e, 0x02, 0xe2, 0xfd, 0xb2, 0xfd, 0x23, 0xfe, 0x15, 0x01, 0x41, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0x3b, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x07, 0x11, 0x23, 0xa7, 0xa5, 0x01, 0xd3, 0xcc, 0xfe, 0x7e, 0x01, 0x52, 0x80, 0xa6, 0x32, 0xfe, 0x9a, 0xb1, 0xa5, 0x04, 0x60, 0xfd, 0xf2, 0x02, 0x0e, 0xfe, 0x4f, 0xfd, 0xea, 0xfe, 0x4c, 0x01, 0x1b, 0x02, 0x35, 0xc8, 0xfe, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xf9, 0x05, 0xd5, 0x00, 0x12, 0x00, 0x00, 0x13, 0x33, 0x11, 0x37, 0x11, 0x33, 0x15, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x07, 0x11, 0x23, 0xb5, 0xb6, 0x9b, 0x5a, 0x01, 0x94, 0xea, 0xfd, 0xf8, 0x02, 0x23, 0xc6, 0xfe, 0x2d, 0x5a, 0x9b, 0xb6, 0x05, 0xd5, 0xfd, 0x1e, 0xb1, 0x01, 0x54, 0xee, 0x01, 0xcb, 0xfd, 0xb2, 0xfc, 0x79, 0x03, 0x01, 0xfe, 0x25, 0x01, 0x75, 0xb1, 0xfe, 0x16, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x1d, 0x04, 0x60, 0x00, 0x12, 0x00, 0x00, 0x13, 0x33, 0x11, 0x37, 0x35, 0x33, 0x15, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x35, 0x07, 0x11, 0x23, 0xa7, 0xa5, 0x56, 0x5b, 0x01, 0x22, 0xcc, 0xfe, 0x7e, 0x01, 0xb3, 0xb9, 0xfe, 0x9a, 0x5b, 0x56, 0xa5, 0x04, 0x60, 0xfd, 0xf2, 0x61, 0xdd, 0x76, 0x01, 0x46, 0xfe, 0x4f, 0xfd, 0x51, 0x02, 0x35, 0xfe, 0xc5, 0xd4, 0x61, 0xfe, 0x93, 0x00, 0x00, 0x01, 0x00, 0x1d, 0x00, 0x00, 0x04, 0xf9, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x03, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xb5, 0xb6, 0x97, 0x97, 0x02, 0x89, 0xea, 0xfd, 0xf8, 0x02, 0x23, 0xc6, 0xfe, 0x2d, 0xf5, 0xb6, 0x97, 0x97, 0x05, 0xd5, 0xe0, 0x90, 0xfe, 0x8e, 0x02, 0xe2, 0xfd, 0xb2, 0xfc, 0x79, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x04, 0x65, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x1d, 0x06, 0x14, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xa7, 0xa5, 0x01, 0x40, 0xfe, 0xc0, 0x01, 0xd3, 0xcc, 0xfe, 0x7e, 0x01, 0xb3, 0xb9, 0xfe, 0x9a, 0xb1, 0xa5, 0x70, 0x70, 0x06, 0x14, 0x7a, 0x7d, 0xfd, 0x35, 0x02, 0x0e, 0xfe, 0x4f, 0xfd, 0x51, 0x02, 0x35, 0xc8, 0xfe, 0x93, 0x05, 0x1d, 0x7d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x06, 0x07, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x21, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x03, 0x11, 0x23, 0x11, 0x21, 0x2d, 0x02, 0x4c, 0x02, 0x89, 0xea, 0xfd, 0xf8, 0x02, 0x23, 0xc6, 0xfe, 0x2d, 0xf5, 0xb6, 0xfe, 0x6a, 0x05, 0xd5, 0xfd, 0x1e, 0x02, 0xe2, 0xfd, 0xb2, 0xfc, 0x79, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x05, 0x2b, 0x00, 0x00, 0x01, 0x00, 0x25, 0x00, 0x00, 0x04, 0xf5, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x21, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, 0x21, 0x26, 0x01, 0xff, 0x01, 0xd3, 0xcc, 0xfe, 0x7e, 0x01, 0xb3, 0xb9, 0xfe, 0x9a, 0xb1, 0xa5, 0xfe, 0xa6, 0x04, 0x60, 0xfd, 0xf2, 0x02, 0x0e, 0xfe, 0x4f, 0xfd, 0x51, 0x02, 0x35, 0xc8, 0xfe, 0x93, 0x03, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x05, 0x6a, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x94, 0xb6, 0xb5, 0xb5, 0xb6, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfa, 0xd5, 0xfe, 0x15, 0x01, 0x41, 0x02, 0xc7, 0xfd, 0x39, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0xe5, 0x04, 0xba, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xae, 0xa5, 0x02, 0x1b, 0xa6, 0xa6, 0xa6, 0xa6, 0xfd, 0xe5, 0xa5, 0x04, 0x60, 0xfe, 0x33, 0x01, 0xcd, 0xfc, 0x39, 0xfe, 0x4c, 0x01, 0x1b, 0x02, 0x04, 0xfd, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x07, 0x44, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x94, 0x03, 0x44, 0xfd, 0x72, 0xb6, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xaa, 0xfa, 0xd5, 0x02, 0xc7, 0xfd, 0x39, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x06, 0x36, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xae, 0xa5, 0x02, 0x1b, 0x02, 0xc7, 0xfd, 0xdf, 0xa6, 0xfd, 0xe5, 0xa5, 0x04, 0x60, 0xfe, 0x33, 0x01, 0xcd, 0xaa, 0xfc, 0x4a, 0x02, 0x04, 0xfd, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x07, 0x9c, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x04, 0xb5, 0xb6, 0xfd, 0x6c, 0xb6, 0x04, 0x00, 0x01, 0x77, 0xa8, 0x66, 0x62, 0xb8, 0xcd, 0x45, 0x38, 0x79, 0x32, 0x32, 0x70, 0x6f, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0x2b, 0xfa, 0xd5, 0x05, 0xd5, 0xfd, 0x9c, 0x77, 0x72, 0xee, 0xfe, 0xce, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4b, 0xc2, 0x01, 0x22, 0x9f, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x56, 0x06, 0x6b, 0x04, 0x60, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x27, 0x26, 0x07, 0x04, 0x14, 0xa6, 0xfd, 0xe5, 0xa5, 0x03, 0x66, 0xe1, 0xed, 0x3f, 0x49, 0x49, 0x49, 0xa3, 0xae, 0x9b, 0x63, 0x1e, 0x22, 0x22, 0x2c, 0x79, 0x01, 0xe7, 0xfe, 0x19, 0x03, 0xc6, 0xfc, 0x3a, 0x04, 0x60, 0xfe, 0x17, 0x47, 0x51, 0xe5, 0xfe, 0xf2, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x37, 0x93, 0x01, 0x08, 0xa4, 0x26, 0x2e, 0x05, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x06, 0x45, 0x05, 0xf1, 0x00, 0x41, 0x00, 0x59, 0x00, 0x00, 0x25, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x04, 0x33, 0x32, 0x1e, 0x04, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x02, 0x35, 0x34, 0x12, 0x3e, 0x01, 0x37, 0x15, 0x0e, 0x03, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x04, 0x23, 0x22, 0x0e, 0x04, 0x15, 0x14, 0x1e, 0x02, 0x03, 0xc0, 0x33, 0x61, 0x4a, 0x2d, 0x11, 0x26, 0x3d, 0x57, 0x74, 0x4b, 0x46, 0x71, 0x57, 0x3f, 0x29, 0x13, 0x18, 0x38, 0x60, 0x49, 0x22, 0x5e, 0x35, 0x38, 0x5b, 0x2e, 0x2a, 0x6c, 0x37, 0x22, 0x49, 0x4c, 0x4f, 0x26, 0x3c, 0xaf, 0x6d, 0x99, 0xf1, 0xa9, 0x59, 0x51, 0x9b, 0xde, 0x8e, 0x68, 0x9a, 0x64, 0x33, 0x36, 0x6f, 0xab, 0x74, 0x4a, 0x73, 0x9f, 0x39, 0x4b, 0x2b, 0x12, 0x0a, 0x15, 0x20, 0x2b, 0x38, 0x22, 0x2c, 0x41, 0x2e, 0x1e, 0x10, 0x06, 0x24, 0x3b, 0x4c, 0xae, 0x31, 0x89, 0xaa, 0xc4, 0x6b, 0x42, 0x8a, 0x83, 0x74, 0x57, 0x32, 0x32, 0x54, 0x70, 0x7b, 0x7f, 0x3a, 0x53, 0xb4, 0xb2, 0xaa, 0x4a, 0x1a, 0x15, 0x13, 0x1a, 0xa8, 0x17, 0x12, 0x08, 0x14, 0x23, 0x1b, 0x26, 0x34, 0x74, 0xcf, 0x01, 0x1d, 0xa8, 0xa0, 0x01, 0x10, 0xcb, 0x7d, 0x0e, 0xa7, 0x16, 0x66, 0x9a, 0xcd, 0x7c, 0x7d, 0xde, 0xa7, 0x62, 0x19, 0x6d, 0x3a, 0x86, 0x8e, 0x91, 0x45, 0x2f, 0x66, 0x63, 0x59, 0x43, 0x28, 0x2b, 0x47, 0x5b, 0x60, 0x5f, 0x26, 0x62, 0xab, 0x8e, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0xec, 0x04, 0x7a, 0x00, 0x3f, 0x00, 0x50, 0x00, 0x00, 0x13, 0x34, 0x3e, 0x02, 0x37, 0x15, 0x0e, 0x03, 0x15, 0x14, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x02, 0x37, 0x15, 0x0e, 0x03, 0x23, 0x22, 0x26, 0x27, 0x0e, 0x03, 0x23, 0x22, 0x2e, 0x02, 0x05, 0x3e, 0x03, 0x35, 0x34, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x02, 0x15, 0x14, 0x66, 0x43, 0x81, 0xbc, 0x79, 0x54, 0x7c, 0x52, 0x29, 0x2d, 0x57, 0x7c, 0x4f, 0x23, 0x4e, 0x19, 0x21, 0x38, 0x2b, 0x18, 0x24, 0x48, 0x69, 0x45, 0x3b, 0x65, 0x48, 0x29, 0x53, 0x56, 0x20, 0x3d, 0x1b, 0x18, 0x29, 0x25, 0x25, 0x16, 0x0f, 0x22, 0x28, 0x33, 0x21, 0x31, 0x75, 0x3d, 0x1b, 0x3f, 0x41, 0x40, 0x1c, 0x7a, 0xbe, 0x83, 0x44, 0x03, 0x00, 0x1f, 0x28, 0x18, 0x0a, 0x14, 0x1e, 0x24, 0x10, 0x17, 0x28, 0x1e, 0x11, 0x02, 0x28, 0x83, 0xd8, 0x9c, 0x58, 0x03, 0x9b, 0x06, 0x46, 0x72, 0x98, 0x58, 0x62, 0xa0, 0x72, 0x3e, 0x0b, 0x11, 0x25, 0x67, 0x78, 0x82, 0x40, 0x5d, 0x9f, 0x73, 0x41, 0x39, 0x68, 0x92, 0x59, 0x9b, 0xf1, 0x5e, 0x13, 0x0a, 0x04, 0x0a, 0x13, 0x0f, 0x9d, 0x0a, 0x11, 0x0c, 0x07, 0x1c, 0x2c, 0x12, 0x1b, 0x12, 0x09, 0x54, 0x99, 0xd6, 0xb8, 0x26, 0x5e, 0x64, 0x63, 0x2b, 0x4b, 0x69, 0x42, 0x1f, 0x26, 0x48, 0x69, 0x43, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x75, 0x04, 0xa4, 0x05, 0xf0, 0x10, 0x27, 0x00, 0x7a, 0x01, 0x0f, 0x00, 0x00, 0x12, 0x06, 0x03, 0xb5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x03, 0x84, 0x04, 0x7b, 0x10, 0x27, 0x00, 0x7a, 0x00, 0x81, 0x00, 0x00, 0x12, 0x06, 0x03, 0xd5, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0xbf, 0x04, 0x6c, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x02, 0x8e, 0xb5, 0xb5, 0xb6, 0xfe, 0x23, 0x04, 0x70, 0xfe, 0x23, 0xaa, 0xfe, 0x15, 0x01, 0x41, 0x05, 0x2b, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0xfe, 0xe5, 0x03, 0xfc, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x02, 0x6a, 0xa6, 0xa6, 0xa3, 0xfe, 0x6f, 0x03, 0xc6, 0xfe, 0x6e, 0x99, 0xfe, 0x4c, 0x01, 0x1b, 0x03, 0xb6, 0xaa, 0xaa, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x08, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x02, 0x7e, 0xaf, 0xfe, 0x68, 0xaf, 0x01, 0x3b, 0x01, 0x3b, 0xb0, 0x12, 0xfe, 0x44, 0x01, 0xbc, 0x04, 0x4e, 0xfc, 0x94, 0x03, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xd5, 0x00, 0x10, 0x00, 0x00, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x15, 0x33, 0x03, 0x7c, 0xee, 0xb6, 0xed, 0xed, 0xfe, 0x24, 0xc4, 0x01, 0x74, 0x01, 0x72, 0xc4, 0xfe, 0x24, 0xee, 0x01, 0x73, 0xfe, 0x8d, 0x01, 0x73, 0xaa, 0xaa, 0x03, 0x0e, 0xfd, 0x9a, 0x02, 0x66, 0xfc, 0xf2, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x10, 0x00, 0x00, 0x09, 0x01, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x01, 0x33, 0x09, 0x01, 0x04, 0x0c, 0xfe, 0x72, 0xec, 0xec, 0xaf, 0xf6, 0xf6, 0xfe, 0x68, 0xaf, 0x01, 0x3b, 0x01, 0x3b, 0x04, 0x60, 0xfb, 0xb2, 0x58, 0xaa, 0xba, 0xba, 0xaa, 0x58, 0x04, 0x4e, 0xfc, 0x94, 0x03, 0x6c, 0x00, 0x00, 0x01, 0x00, 0x36, 0xfe, 0xbf, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x04, 0x50, 0x65, 0xb1, 0x12, 0xfe, 0x86, 0xfe, 0x83, 0xc4, 0x01, 0xe0, 0xfe, 0x5d, 0xc3, 0x01, 0x4e, 0x01, 0x50, 0xc3, 0xfe, 0x50, 0xaa, 0xfe, 0x15, 0x01, 0x41, 0x02, 0x7b, 0xfd, 0x85, 0x03, 0x1d, 0x02, 0xb8, 0xfd, 0xd5, 0x02, 0x2b, 0xfd, 0x33, 0x00, 0x00, 0x01, 0x00, 0x35, 0xfe, 0xe5, 0x04, 0x07, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x03, 0xa1, 0x65, 0xa5, 0x1e, 0xfe, 0xdb, 0xfe, 0xda, 0xc3, 0x01, 0x88, 0xfe, 0x99, 0xc4, 0x01, 0x0b, 0x01, 0x0b, 0xc4, 0xfe, 0x93, 0x99, 0xfe, 0x4c, 0x01, 0x1b, 0x01, 0xb8, 0xfe, 0x48, 0x02, 0x4a, 0x02, 0x16, 0xfe, 0x71, 0x01, 0x8f, 0xfd, 0xdf, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0xbf, 0x06, 0x8d, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x02, 0x8d, 0x02, 0x95, 0xb6, 0xb5, 0xb5, 0xfc, 0x00, 0xfe, 0x23, 0x04, 0x70, 0xfe, 0x23, 0xaa, 0x05, 0x2b, 0xfa, 0xd5, 0xfe, 0x15, 0x01, 0x41, 0x05, 0x2b, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0xfe, 0xe5, 0x05, 0xa2, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x02, 0x39, 0x02, 0x1e, 0xa5, 0xa6, 0xa6, 0xfc, 0x9a, 0xfe, 0x6e, 0x03, 0xc6, 0xfe, 0x6f, 0x99, 0x03, 0xc7, 0xfc, 0x39, 0xfe, 0x4c, 0x01, 0x1b, 0x03, 0xb6, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xfe, 0xbf, 0x04, 0xf0, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x21, 0x11, 0x33, 0x04, 0x3b, 0xb5, 0xb5, 0xb7, 0xfe, 0x89, 0xa8, 0x65, 0x62, 0xb4, 0x70, 0x70, 0x01, 0x52, 0xb7, 0xaa, 0xfe, 0x15, 0x01, 0x41, 0x02, 0xc7, 0x77, 0x72, 0xee, 0x01, 0x37, 0xfe, 0xd9, 0x9f, 0x9e, 0x02, 0x64, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0xfe, 0xe5, 0x04, 0x40, 0x04, 0x60, 0x00, 0x15, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x21, 0x11, 0x33, 0x03, 0x9a, 0xa5, 0xa5, 0xa6, 0xfe, 0xcb, 0x89, 0x5c, 0x53, 0xa6, 0x2e, 0x30, 0x5e, 0x01, 0x0b, 0xa6, 0x99, 0xfe, 0x4c, 0x01, 0x1b, 0x02, 0x09, 0x5f, 0x56, 0xb8, 0xea, 0xd3, 0x75, 0x3b, 0x3b, 0x01, 0xbe, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x04, 0x3b, 0x05, 0xd5, 0x00, 0x18, 0x00, 0x00, 0x01, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x02, 0x42, 0x35, 0xa8, 0x65, 0x62, 0xb4, 0x70, 0x70, 0x10, 0x81, 0xc1, 0xb7, 0xb7, 0xc1, 0x81, 0x02, 0xc7, 0x77, 0x72, 0xee, 0x01, 0x37, 0xfe, 0xd9, 0x9f, 0x9e, 0x01, 0x39, 0xfe, 0xc7, 0x02, 0x64, 0xfa, 0x2b, 0x02, 0xc7, 0xfe, 0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x03, 0x9a, 0x04, 0x60, 0x00, 0x18, 0x00, 0x00, 0x01, 0x35, 0x33, 0x15, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x15, 0x23, 0x35, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x01, 0xc6, 0x90, 0x9e, 0xa6, 0xa6, 0x9e, 0x90, 0x07, 0x89, 0x5c, 0x53, 0xa6, 0x2e, 0x27, 0x02, 0xa4, 0xc2, 0xc4, 0x01, 0xbe, 0xfb, 0xa0, 0x02, 0x09, 0xc4, 0xc4, 0x5f, 0x56, 0xb8, 0xea, 0xd3, 0x75, 0x3b, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x04, 0x3b, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x21, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x01, 0x54, 0x01, 0x78, 0xa7, 0xc8, 0xb5, 0x70, 0x6f, 0xfe, 0xad, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0xe9, 0xee, 0xfe, 0x66, 0x01, 0x8a, 0x9f, 0x9e, 0xfd, 0x39, 0x05, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x14, 0x12, 0x06, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0xff, 0xe3, 0x06, 0x5f, 0x05, 0xf0, 0x00, 0x22, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x12, 0x37, 0x36, 0x21, 0x20, 0x17, 0x16, 0x13, 0x21, 0x10, 0x12, 0x33, 0x32, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x20, 0x27, 0x26, 0x03, 0x06, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x25, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x01, 0x87, 0x1e, 0x87, 0xa9, 0x01, 0x1b, 0x01, 0x23, 0xa3, 0xa8, 0x01, 0xfb, 0xe5, 0xf6, 0xf7, 0x7d, 0xe3, 0x65, 0x64, 0x76, 0x77, 0x83, 0xfe, 0xc4, 0xb1, 0xa9, 0x09, 0x99, 0x6a, 0x6e, 0x99, 0x43, 0x3c, 0x01, 0x20, 0x03, 0x4f, 0x16, 0x58, 0x75, 0xfe, 0x74, 0x73, 0x57, 0x03, 0x6d, 0x01, 0x0a, 0xa7, 0xd2, 0xd2, 0xdb, 0xfe, 0x84, 0xfe, 0xf4, 0xfe, 0xce, 0x60, 0x5f, 0xd7, 0x46, 0x24, 0x24, 0xcd, 0xc2, 0x01, 0x55, 0x01, 0x67, 0x6b, 0xdf, 0x4c, 0x3e, 0xa0, 0x41, 0x39, 0x02, 0xbf, 0x7c, 0xa4, 0xa4, 0x7c, 0x00, 0x00, 0x02, 0x00, 0x0d, 0xff, 0xe3, 0x04, 0xdc, 0x04, 0x7b, 0x00, 0x25, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x01, 0x36, 0x82, 0x50, 0x56, 0x8c, 0x2b, 0x33, 0x43, 0x17, 0x69, 0x83, 0xe6, 0xcb, 0x76, 0x77, 0xfd, 0x06, 0x0b, 0x5c, 0x5d, 0xa4, 0x60, 0x5a, 0x59, 0x58, 0x5d, 0x5a, 0x63, 0x5b, 0xf2, 0x8c, 0x85, 0x02, 0xf9, 0x02, 0x49, 0x4b, 0x7a, 0x8b, 0x54, 0x53, 0x0c, 0x02, 0x04, 0x52, 0x5a, 0xac, 0x46, 0x31, 0x97, 0x21, 0x26, 0xc5, 0x82, 0xa1, 0x91, 0x92, 0xfa, 0x5a, 0xbe, 0x64, 0x63, 0x1a, 0x1a, 0x34, 0xae, 0x2c, 0x14, 0x16, 0x9c, 0x94, 0x01, 0x81, 0x97, 0x5a, 0x5a, 0x57, 0x57, 0x9e, 0x00, 0x00, 0x02, 0x00, 0x12, 0xfe, 0x87, 0x06, 0x5f, 0x05, 0xf0, 0x00, 0x07, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x07, 0x12, 0x37, 0x36, 0x21, 0x20, 0x17, 0x16, 0x13, 0x21, 0x10, 0x12, 0x33, 0x32, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x07, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x03, 0x06, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x02, 0x4a, 0x03, 0x4f, 0x16, 0x58, 0x75, 0xfe, 0x74, 0x73, 0x57, 0xd9, 0x1e, 0x87, 0xa9, 0x01, 0x1b, 0x01, 0x23, 0xa3, 0xa8, 0x01, 0xfb, 0xe5, 0xf6, 0xf7, 0x7d, 0xe3, 0x65, 0x64, 0x76, 0x62, 0x6c, 0xa0, 0xe9, 0x90, 0xa9, 0x09, 0x99, 0x6a, 0x6e, 0x99, 0x43, 0x3c, 0x03, 0x6d, 0xbf, 0x7c, 0xa4, 0xa4, 0x7c, 0xbf, 0x01, 0x0a, 0xa7, 0xd2, 0xd2, 0xdb, 0xfe, 0x84, 0xfe, 0xf4, 0xfe, 0xce, 0x60, 0x5f, 0xd7, 0x46, 0x24, 0x1e, 0x05, 0xfe, 0xa3, 0x01, 0x63, 0x20, 0xa6, 0xc3, 0x01, 0x54, 0x01, 0x67, 0x6b, 0xdf, 0x4c, 0x3e, 0xa0, 0x41, 0x39, 0x00, 0x00, 0x02, 0x00, 0x0d, 0xfe, 0xb7, 0x04, 0xdc, 0x04, 0x7b, 0x00, 0x08, 0x00, 0x31, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x07, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x04, 0x36, 0x02, 0x49, 0x4b, 0x7a, 0x8b, 0x54, 0x53, 0x0c, 0xb2, 0x82, 0x50, 0x56, 0x8c, 0x2b, 0x33, 0x43, 0x17, 0x69, 0x83, 0xe6, 0xcb, 0x76, 0x77, 0xfd, 0x06, 0x0b, 0x5c, 0x5d, 0xa4, 0x60, 0x5a, 0x59, 0x58, 0x5d, 0x5a, 0x47, 0x42, 0x96, 0xae, 0x6f, 0x85, 0x02, 0x94, 0x97, 0x5a, 0x5a, 0x57, 0x57, 0x9e, 0x8f, 0x52, 0x5a, 0xac, 0x46, 0x31, 0x97, 0x21, 0x26, 0xc5, 0x82, 0xa1, 0x91, 0x92, 0xfa, 0x5a, 0xbe, 0x64, 0x63, 0x1a, 0x1a, 0x34, 0xae, 0x2c, 0x14, 0x10, 0x04, 0xfe, 0xd2, 0x01, 0x33, 0x1a, 0x7b, 0x94, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6b, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x07, 0x9e, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x05, 0xb8, 0x01, 0x75, 0x12, 0x06, 0x03, 0xaa, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x06, 0x3e, 0x06, 0x48, 0x10, 0x27, 0x02, 0x9a, 0x01, 0x7e, 0x00, 0x00, 0x12, 0x06, 0x03, 0xca, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x04, 0xb0, 0x05, 0xd5, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x02, 0x65, 0x7d, 0xa7, 0x66, 0x62, 0xb7, 0xce, 0x44, 0x38, 0x78, 0x33, 0x31, 0x6f, 0x70, 0xfe, 0xae, 0xb6, 0xb6, 0x02, 0x5b, 0xea, 0x03, 0x71, 0x77, 0x72, 0xee, 0xfe, 0xce, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4b, 0xc2, 0x01, 0x22, 0x9f, 0x9e, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x77, 0x00, 0x00, 0x01, 0x00, 0xab, 0xfe, 0x56, 0x04, 0x14, 0x04, 0x60, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x02, 0x21, 0x12, 0xeb, 0x41, 0x4a, 0x4a, 0x49, 0xa3, 0xad, 0x9a, 0x63, 0x1e, 0x22, 0x22, 0x27, 0x7e, 0xea, 0xa6, 0xa6, 0x01, 0xee, 0xd4, 0x02, 0x77, 0x47, 0x51, 0xe5, 0xfe, 0xf2, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x37, 0x93, 0x01, 0x08, 0xa6, 0x24, 0x29, 0xfe, 0x19, 0x04, 0x60, 0xfe, 0x1d, 0x01, 0xe3, 0x00, 0x00, 0x01, 0x00, 0x30, 0xfe, 0x56, 0x05, 0x6a, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x05, 0x35, 0x36, 0x37, 0x12, 0x19, 0x01, 0x21, 0x11, 0x33, 0x15, 0x01, 0x23, 0x04, 0xb4, 0xb6, 0xfe, 0x4c, 0x77, 0x58, 0xfe, 0xb6, 0xbe, 0x3d, 0x69, 0x03, 0x1f, 0xb5, 0xfe, 0xb7, 0x79, 0x05, 0x2b, 0xd4, 0xfe, 0x18, 0xfe, 0xaa, 0xfd, 0x38, 0xa7, 0x2e, 0xa8, 0x01, 0x25, 0x02, 0x35, 0x01, 0x1a, 0xfa, 0xd5, 0xaa, 0xfe, 0x56, 0x00, 0x01, 0x00, 0x29, 0xfe, 0x56, 0x04, 0xa7, 0x04, 0x60, 0x00, 0x14, 0x00, 0x00, 0x25, 0x33, 0x15, 0x01, 0x23, 0x13, 0x23, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x05, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x04, 0x01, 0xa6, 0xfe, 0xfb, 0x6f, 0xce, 0xa5, 0xfe, 0xa1, 0x6a, 0x54, 0xfe, 0xea, 0xa1, 0x36, 0x58, 0x02, 0xa9, 0x99, 0x99, 0xfe, 0x56, 0x01, 0xaa, 0x03, 0xc7, 0x86, 0xfe, 0x92, 0xfe, 0xfc, 0xcf, 0x1d, 0x99, 0x1b, 0x7f, 0xcf, 0x01, 0xa7, 0xd4, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x03, 0xff, 0xfd, 0x6c, 0xb6, 0xb6, 0x02, 0x94, 0xb6, 0xb9, 0xcd, 0x44, 0x38, 0x78, 0x33, 0x31, 0x68, 0x02, 0x5f, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfa, 0x93, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4b, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x56, 0x04, 0x14, 0x04, 0x60, 0x00, 0x15, 0x00, 0x00, 0x05, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x03, 0x6e, 0xfd, 0xe5, 0xa5, 0xa5, 0x02, 0x1b, 0xa6, 0x4a, 0x49, 0xa3, 0xad, 0x9b, 0x62, 0x1e, 0x22, 0x14, 0x02, 0x18, 0xfd, 0xfc, 0x04, 0x60, 0xfe, 0x33, 0x01, 0xcd, 0xfb, 0x8c, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x37, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x05, 0x6a, 0x05, 0xd5, 0x00, 0x10, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x01, 0x23, 0x04, 0xb5, 0xb6, 0xfd, 0x6c, 0xb6, 0xb6, 0x02, 0x94, 0xb6, 0xb5, 0xfe, 0xb7, 0x79, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfa, 0xd5, 0xaa, 0xfe, 0x56, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x56, 0x04, 0xba, 0x04, 0x60, 0x00, 0x10, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x01, 0x23, 0x04, 0x14, 0xa6, 0xfd, 0xe5, 0xa5, 0xa5, 0x02, 0x1b, 0xa6, 0xa6, 0xfe, 0xfb, 0x6f, 0x02, 0x04, 0xfd, 0xfc, 0x04, 0x60, 0xfe, 0x33, 0x01, 0xcd, 0xfc, 0x39, 0x99, 0xfe, 0x56, 0x00, 0x01, 0x00, 0x9d, 0xfe, 0xbf, 0x04, 0x3b, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x25, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x03, 0x84, 0xfe, 0x89, 0xa8, 0x65, 0x62, 0xb4, 0x70, 0x70, 0x01, 0x52, 0xb7, 0xb7, 0xb5, 0xaa, 0x02, 0x1d, 0x77, 0x72, 0xee, 0x01, 0x37, 0xfe, 0xd9, 0x9f, 0x9e, 0x02, 0x64, 0xfa, 0x2b, 0xfe, 0xbf, 0x01, 0xeb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0xfe, 0xe5, 0x03, 0x9a, 0x04, 0x60, 0x00, 0x15, 0x00, 0x00, 0x25, 0x11, 0x21, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x02, 0xf4, 0xfe, 0xcb, 0x89, 0x5c, 0x53, 0xa6, 0x2e, 0x30, 0x5e, 0x01, 0x0b, 0xa6, 0xa6, 0xa6, 0x99, 0x01, 0x70, 0x5f, 0x56, 0xb8, 0xea, 0xd3, 0x75, 0x3b, 0x3b, 0x01, 0xbe, 0xfb, 0xa0, 0xfe, 0xe5, 0x01, 0xb4, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x06, 0x38, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x25, 0x33, 0x15, 0x01, 0x23, 0x01, 0x23, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x21, 0x09, 0x01, 0x21, 0x05, 0x82, 0xb5, 0xfe, 0xb7, 0x79, 0x01, 0x0d, 0xb1, 0xfe, 0xa5, 0xb6, 0xfe, 0xa5, 0xb0, 0x01, 0x0f, 0x01, 0x57, 0x01, 0x58, 0x01, 0x0f, 0xaa, 0xaa, 0xfe, 0x56, 0x01, 0xaa, 0x05, 0x1f, 0xfc, 0x00, 0x04, 0x00, 0xfa, 0xe1, 0x05, 0xd5, 0xfc, 0x08, 0x03, 0xf8, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x56, 0x05, 0x67, 0x04, 0x60, 0x00, 0x11, 0x00, 0x00, 0x25, 0x33, 0x15, 0x01, 0x23, 0x13, 0x23, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x33, 0x09, 0x01, 0x33, 0x04, 0xc1, 0xa5, 0xfe, 0xfb, 0x6e, 0xce, 0xa0, 0xfe, 0xe9, 0xa5, 0xfe, 0xe9, 0xa0, 0xec, 0x01, 0x1e, 0x01, 0x1f, 0xea, 0x99, 0x99, 0xfe, 0x56, 0x01, 0xaa, 0x03, 0xb0, 0xfd, 0x27, 0x02, 0xd9, 0xfc, 0x50, 0x04, 0x60, 0xfd, 0x12, 0x02, 0xee, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x12, 0x06, 0x00, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x92, 0x10, 0x27, 0x02, 0x9a, 0x00, 0xb9, 0x01, 0x4a, 0x13, 0x06, 0x03, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x1f, 0x10, 0x26, 0x02, 0x9a, 0x47, 0xd7, 0x13, 0x06, 0x03, 0xc4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x4e, 0x12, 0x26, 0x03, 0xa4, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x10, 0x12, 0x26, 0x03, 0xc4, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x07, 0x00, 0x00, 0x06, 0x8e, 0x05, 0xd5, 0x12, 0x06, 0x00, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0xb1, 0x04, 0x7b, 0x12, 0x06, 0x00, 0xa8, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x2a, 0x01, 0x75, 0x13, 0x06, 0x03, 0xa9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x48, 0x10, 0x27, 0x02, 0x9a, 0x00, 0x87, 0x00, 0x00, 0x13, 0x06, 0x03, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x12, 0x06, 0x01, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x06, 0x02, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x9d, 0x01, 0x75, 0x12, 0x06, 0x04, 0x6c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x10, 0x10, 0x26, 0x00, 0x6a, 0x4c, 0x00, 0x12, 0x06, 0x04, 0x6d, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x00, 0x00, 0x07, 0x9e, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x05, 0xaf, 0x01, 0x75, 0x12, 0x06, 0x03, 0xaa, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0x00, 0x00, 0x06, 0x3e, 0x06, 0x10, 0x10, 0x27, 0x00, 0x6a, 0x01, 0x75, 0x00, 0x00, 0x12, 0x06, 0x03, 0xca, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x25, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x13, 0x01, 0x75, 0x12, 0x06, 0x03, 0xab, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x10, 0x10, 0x26, 0x00, 0x6a, 0x34, 0x00, 0x12, 0x06, 0x03, 0xcb, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x90, 0xff, 0xc1, 0x04, 0x79, 0x05, 0xd5, 0x12, 0x06, 0x01, 0x79, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0xfe, 0x4c, 0x03, 0xc4, 0x04, 0x60, 0x12, 0x06, 0x02, 0x54, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0xdc, 0x01, 0x3b, 0x12, 0x06, 0x03, 0xac, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x05, 0xf5, 0x10, 0x27, 0x00, 0x71, 0x00, 0x83, 0xff, 0xff, 0x12, 0x06, 0x03, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x76, 0x01, 0x75, 0x12, 0x06, 0x03, 0xac, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x06, 0x10, 0x10, 0x27, 0x00, 0x6a, 0x00, 0x83, 0x00, 0x00, 0x12, 0x06, 0x03, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x4e, 0x12, 0x26, 0x03, 0xb2, 0x00, 0x00, 0x11, 0x07, 0x10, 0xeb, 0x04, 0xa3, 0x01, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x10, 0x12, 0x26, 0x03, 0xd2, 0x00, 0x00, 0x11, 0x06, 0x00, 0x6a, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x12, 0x06, 0x01, 0x61, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x12, 0x06, 0x02, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0x4e, 0x12, 0x26, 0x04, 0x7c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xeb, 0x04, 0xa3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x10, 0x12, 0x26, 0x04, 0x7d, 0x00, 0x00, 0x10, 0x06, 0x00, 0x6a, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x04, 0xa0, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x03, 0xf6, 0x01, 0x75, 0x12, 0x06, 0x03, 0xc1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x06, 0x10, 0x10, 0x26, 0x00, 0x6a, 0xe5, 0x00, 0x12, 0x06, 0x03, 0xe1, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x44, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0x67, 0x01, 0x3b, 0x12, 0x06, 0x03, 0xb7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x05, 0xf5, 0x10, 0x26, 0x00, 0x71, 0x55, 0xff, 0x12, 0x06, 0x03, 0xd7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x44, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x00, 0x01, 0x75, 0x12, 0x06, 0x03, 0xb7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x10, 0x10, 0x26, 0x00, 0x6a, 0x55, 0x00, 0x12, 0x06, 0x03, 0xd7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, 0x04, 0x44, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xf4, 0x04, 0x00, 0x01, 0x75, 0x12, 0x06, 0x03, 0xb7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x66, 0x10, 0x26, 0x02, 0x9f, 0x55, 0x00, 0x12, 0x06, 0x03, 0xd7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9d, 0x00, 0x00, 0x04, 0x3b, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x51, 0x01, 0x75, 0x12, 0x06, 0x03, 0xbb, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0x00, 0x00, 0x03, 0x9a, 0x06, 0x10, 0x10, 0x26, 0x00, 0x6a, 0x55, 0x00, 0x12, 0x06, 0x03, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0xb5, 0x03, 0x44, 0xfd, 0x72, 0xb5, 0xb5, 0x05, 0xd5, 0xaa, 0xfb, 0x7f, 0xfe, 0x15, 0x01, 0x41, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x03, 0x6f, 0x04, 0x60, 0x00, 0x09, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0xa7, 0x02, 0xc7, 0xfd, 0xdf, 0xa6, 0xa6, 0x04, 0x60, 0xaa, 0xfc, 0xe3, 0xfe, 0x4c, 0x01, 0x1b, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xa6, 0x07, 0x4e, 0x12, 0x26, 0x03, 0xbf, 0x00, 0x00, 0x10, 0x07, 0x10, 0xeb, 0x05, 0x25, 0x01, 0x75, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x05, 0x0c, 0x06, 0x10, 0x12, 0x26, 0x03, 0xdf, 0x00, 0x00, 0x10, 0x07, 0x00, 0x6a, 0x00, 0xee, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xfe, 0x56, 0x04, 0x71, 0x05, 0xd5, 0x00, 0x19, 0x00, 0x00, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x01, 0x2d, 0xed, 0xed, 0x03, 0x44, 0xfd, 0x71, 0x01, 0xed, 0xfe, 0x13, 0x01, 0x45, 0x40, 0x49, 0xac, 0xe5, 0xd2, 0x5e, 0x45, 0x02, 0x94, 0xaa, 0x02, 0x97, 0xaa, 0xfe, 0x13, 0xaa, 0xfd, 0xec, 0x94, 0xc8, 0x60, 0x6e, 0x9c, 0x61, 0xad, 0x00, 0x00, 0x01, 0x00, 0x32, 0xfe, 0x56, 0x03, 0xe7, 0x04, 0x60, 0x00, 0x19, 0x00, 0x00, 0x21, 0x11, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x01, 0x1f, 0xed, 0xed, 0x02, 0xc7, 0xfd, 0xdf, 0x01, 0x76, 0xfe, 0x8a, 0x01, 0x49, 0x3f, 0x4a, 0xad, 0xe4, 0xd2, 0x5f, 0x43, 0x01, 0xf4, 0xaa, 0x01, 0xc2, 0x9d, 0xfe, 0xdb, 0xaa, 0xfe, 0x8c, 0x94, 0xc8, 0x60, 0x6e, 0x9c, 0x61, 0xad, 0x00, 0x00, 0x01, 0x00, 0x36, 0xfe, 0x66, 0x04, 0xa6, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x25, 0x16, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x04, 0xa6, 0x01, 0x02, 0x0e, 0x4a, 0x5c, 0xcd, 0x45, 0x38, 0x7a, 0x31, 0x24, 0x0a, 0xfe, 0x88, 0xfe, 0x83, 0xc4, 0x01, 0xe0, 0xfe, 0x5d, 0xc3, 0x01, 0x4e, 0x01, 0x50, 0xc3, 0xfe, 0x50, 0x1a, 0x02, 0x18, 0xbe, 0x62, 0x7a, 0xaa, 0x4b, 0x35, 0x73, 0x02, 0x78, 0xfd, 0x85, 0x03, 0x1d, 0x02, 0xb8, 0xfd, 0xd5, 0x02, 0x2b, 0xfd, 0x33, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, 0xfe, 0x56, 0x03, 0xf4, 0x04, 0x60, 0x00, 0x17, 0x00, 0x00, 0x09, 0x02, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x32, 0x37, 0x3e, 0x01, 0x35, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x03, 0xf4, 0xfe, 0x93, 0x01, 0x47, 0x18, 0x3c, 0x49, 0xb1, 0xad, 0xb0, 0x17, 0x47, 0x2f, 0xfe, 0xde, 0xfe, 0xda, 0xc3, 0x01, 0x88, 0xfe, 0x99, 0xc4, 0x01, 0x0b, 0x01, 0x0b, 0x04, 0x60, 0xfd, 0xdf, 0xfe, 0x17, 0x26, 0x39, 0xcd, 0x61, 0x73, 0x9c, 0x03, 0x0a, 0x6d, 0x98, 0x01, 0xb4, 0xfe, 0x48, 0x02, 0x4a, 0x02, 0x16, 0xfe, 0x71, 0x01, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x01, 0x21, 0x15, 0x21, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x21, 0x35, 0x21, 0x74, 0xc3, 0x01, 0x4e, 0x01, 0x50, 0xc3, 0xfe, 0x7a, 0x01, 0x4e, 0xfe, 0xb5, 0x01, 0xa0, 0xc3, 0xfe, 0x86, 0xfe, 0x83, 0xc4, 0x01, 0xa5, 0xfe, 0xb1, 0x01, 0x6e, 0x05, 0xd5, 0xfd, 0xd5, 0x02, 0x2b, 0xfd, 0x77, 0x90, 0xfd, 0x44, 0x02, 0x7b, 0xfd, 0x85, 0x02, 0xbc, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x00, 0x11, 0x00, 0x00, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x33, 0x15, 0x21, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x21, 0x35, 0x01, 0x8b, 0xfe, 0xcb, 0xc4, 0x01, 0x0b, 0x01, 0x0b, 0xc4, 0xfe, 0xcc, 0xf2, 0xfe, 0xfd, 0x01, 0x57, 0xc3, 0xfe, 0xdb, 0xfe, 0xda, 0xc3, 0x01, 0x59, 0xfe, 0xfc, 0x02, 0x94, 0x01, 0xcc, 0xfe, 0x71, 0x01, 0x8f, 0xfe, 0x34, 0x90, 0xfd, 0xfc, 0x01, 0xb8, 0xfe, 0x48, 0x02, 0x04, 0x90, 0x00, 0x00, 0x02, 0x00, 0x82, 0x00, 0x00, 0x04, 0x3c, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x01, 0x14, 0x17, 0x16, 0x33, 0x21, 0x11, 0x21, 0x22, 0x07, 0x06, 0x01, 0x11, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x01, 0x42, 0x47, 0x47, 0x92, 0x01, 0x24, 0xfe, 0xdc, 0x92, 0x47, 0x47, 0x02, 0xfa, 0xfe, 0x1d, 0xe2, 0xf5, 0xf5, 0xe2, 0x01, 0x2d, 0x01, 0xb7, 0x8a, 0x43, 0x44, 0x02, 0x23, 0x43, 0x44, 0x03, 0x93, 0xfa, 0x2b, 0xda, 0xdd, 0xde, 0xda, 0x02, 0x66, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x03, 0x90, 0x04, 0x60, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x00, 0x01, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x11, 0x23, 0x22, 0x07, 0x06, 0x01, 0x11, 0x21, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x3b, 0x01, 0x11, 0x01, 0x16, 0x38, 0x3b, 0x74, 0xed, 0xed, 0x73, 0x3c, 0x38, 0x02, 0x7a, 0xfe, 0x66, 0xc0, 0x68, 0x68, 0x68, 0x6d, 0xbb, 0xf4, 0x01, 0x4c, 0x5a, 0x2b, 0x2e, 0x01, 0x69, 0x2e, 0x2a, 0x02, 0xb6, 0xfb, 0xa0, 0x52, 0x52, 0x01, 0x50, 0x52, 0x55, 0x01, 0xc5, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x82, 0xff, 0xe3, 0x06, 0x8a, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x30, 0x00, 0x00, 0x01, 0x21, 0x22, 0x07, 0x06, 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x13, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x03, 0x86, 0xfe, 0xdc, 0x92, 0x47, 0x47, 0x47, 0x56, 0x74, 0xa2, 0x43, 0x4e, 0x1e, 0x0b, 0x0d, 0x2e, 0x5f, 0x55, 0x63, 0xd6, 0x74, 0x7b, 0xf5, 0xe2, 0x01, 0x2d, 0xb5, 0x38, 0x2f, 0x65, 0x5f, 0x35, 0x38, 0xb6, 0x63, 0x5e, 0xc1, 0xc3, 0x5c, 0x2c, 0x02, 0xc9, 0x43, 0x44, 0xfe, 0xea, 0x50, 0x5f, 0x6d, 0x7d, 0x9f, 0xfe, 0xdd, 0x1d, 0x1c, 0x60, 0x36, 0x31, 0x81, 0x89, 0xca, 0xde, 0xda, 0x02, 0x66, 0xfb, 0xec, 0x8f, 0x5b, 0x4a, 0x4a, 0x4f, 0x9b, 0x02, 0x9f, 0xfd, 0x5a, 0xe0, 0x7f, 0x78, 0x78, 0x39, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x05, 0xce, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x30, 0x00, 0x00, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x13, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x02, 0xea, 0xed, 0x73, 0x3c, 0x38, 0x3b, 0x39, 0x60, 0x85, 0x53, 0x28, 0x2c, 0x3c, 0x54, 0x54, 0x7b, 0x9b, 0x5b, 0x5b, 0x68, 0x6d, 0xbb, 0xf4, 0xa6, 0x38, 0x36, 0x5f, 0x5d, 0x36, 0x38, 0xa6, 0x5a, 0x5e, 0xb9, 0xbe, 0x5a, 0x1c, 0x02, 0x02, 0x2e, 0x2a, 0x5e, 0x5c, 0x3a, 0x39, 0x6d, 0x34, 0x9c, 0xfe, 0xf6, 0x6c, 0x30, 0x31, 0x61, 0x60, 0xa6, 0xaa, 0x52, 0x55, 0x01, 0xc5, 0xfd, 0x61, 0x9f, 0x50, 0x4f, 0x4f, 0x52, 0x9d, 0x01, 0x41, 0xfe, 0xb8, 0xec, 0x73, 0x78, 0x78, 0x25, 0x00, 0x01, 0x00, 0xb4, 0xff, 0xe3, 0x06, 0x50, 0x05, 0xf0, 0x00, 0x37, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0x4c, 0x53, 0x53, 0x95, 0x9c, 0xa3, 0x86, 0x48, 0x47, 0x49, 0x4a, 0x89, 0x4b, 0xaa, 0x67, 0x67, 0x5a, 0x5b, 0x50, 0xcf, 0x79, 0x79, 0x40, 0x40, 0x76, 0x82, 0x4a, 0x49, 0x39, 0x2f, 0x64, 0x5f, 0x35, 0x39, 0xb6, 0x64, 0x5d, 0xc2, 0xc3, 0x5c, 0x2b, 0x19, 0x1e, 0x01, 0xb2, 0x84, 0x4a, 0x4b, 0xa6, 0x3b, 0x3c, 0x70, 0x73, 0x3d, 0x3e, 0x24, 0x26, 0xb4, 0x20, 0x10, 0x10, 0x68, 0x69, 0xb2, 0x7c, 0x55, 0x56, 0x21, 0x1f, 0x62, 0x62, 0x90, 0x80, 0x5b, 0x4a, 0x4a, 0x4f, 0x9b, 0x02, 0x9f, 0xfd, 0x5a, 0xe0, 0x7f, 0x78, 0x78, 0x38, 0x50, 0x61, 0x00, 0x01, 0x00, 0x99, 0xff, 0xe3, 0x05, 0xa6, 0x04, 0x7c, 0x00, 0x35, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x02, 0xc4, 0x46, 0x41, 0x7b, 0x85, 0x8b, 0x69, 0x3c, 0x3d, 0x3f, 0x3e, 0x6b, 0x40, 0x49, 0x48, 0x57, 0x58, 0x99, 0x45, 0xb0, 0x66, 0x66, 0x36, 0x36, 0x65, 0x75, 0x39, 0x3e, 0x38, 0x37, 0x5e, 0x5e, 0x36, 0x38, 0xa5, 0x5a, 0x5d, 0xba, 0xb3, 0x65, 0x58, 0x01, 0x38, 0x66, 0x38, 0x33, 0x98, 0x2c, 0x2d, 0x46, 0x40, 0x2e, 0x2e, 0x0d, 0x0d, 0x1d, 0xa7, 0x18, 0x18, 0x4e, 0x4f, 0x8d, 0x5d, 0x40, 0x41, 0x18, 0x19, 0x48, 0x4f, 0x48, 0x58, 0x44, 0x45, 0x4f, 0x52, 0x9d, 0x01, 0x41, 0xfe, 0xb8, 0xec, 0x73, 0x78, 0x75, 0x65, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0xb6, 0x05, 0xf0, 0x00, 0x29, 0x00, 0x00, 0x21, 0x23, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x11, 0x33, 0x11, 0x23, 0x04, 0x01, 0xb5, 0x53, 0x53, 0x95, 0x9c, 0xa3, 0x86, 0x48, 0x47, 0x49, 0x4a, 0x89, 0x4b, 0xaa, 0x67, 0x67, 0x5a, 0x5b, 0x50, 0xcf, 0x79, 0x79, 0x40, 0x40, 0x76, 0x82, 0x4a, 0x49, 0xb5, 0xb5, 0x01, 0xb1, 0x85, 0x4a, 0x4b, 0xa6, 0x3b, 0x3c, 0x70, 0x73, 0x3d, 0x3e, 0x24, 0x26, 0xb4, 0x20, 0x10, 0x10, 0x68, 0x69, 0xb2, 0x7c, 0x55, 0x56, 0x21, 0x1f, 0x62, 0x61, 0x92, 0xfe, 0xf9, 0xfd, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0xfe, 0x56, 0x04, 0x10, 0x04, 0x7c, 0x00, 0x29, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x03, 0x67, 0xa9, 0xa6, 0xa6, 0x46, 0x41, 0x7b, 0x85, 0x8b, 0x69, 0x3c, 0x3d, 0x3f, 0x3e, 0x6b, 0x40, 0x49, 0x48, 0x57, 0x58, 0x99, 0x45, 0xb0, 0x66, 0x66, 0x36, 0x36, 0x65, 0x72, 0x3c, 0x3e, 0x99, 0xfd, 0xbd, 0x01, 0xaa, 0x01, 0x46, 0x58, 0x38, 0x33, 0x98, 0x2c, 0x2d, 0x46, 0x40, 0x2e, 0x2e, 0x0d, 0x0d, 0x1d, 0xa7, 0x18, 0x18, 0x4e, 0x4f, 0x8d, 0x5d, 0x40, 0x41, 0x18, 0x18, 0x49, 0x4b, 0x6a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x30, 0xff, 0xe3, 0x07, 0x03, 0x05, 0xd5, 0x00, 0x21, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x05, 0x35, 0x36, 0x37, 0x12, 0x19, 0x01, 0x04, 0xb4, 0x39, 0x2f, 0x64, 0x5f, 0x35, 0x39, 0xb6, 0x63, 0x5e, 0xc2, 0xc0, 0x5f, 0x63, 0xfe, 0x4c, 0x77, 0x58, 0xfe, 0xb6, 0xbe, 0x3d, 0x69, 0x05, 0xd5, 0xfb, 0xec, 0x8f, 0x5b, 0x4a, 0x4a, 0x4f, 0x9b, 0x02, 0x9f, 0xfd, 0x5a, 0xe0, 0x7f, 0x78, 0x78, 0x7d, 0xe2, 0x03, 0x71, 0xd4, 0xfe, 0x18, 0xfe, 0xaa, 0xfd, 0x38, 0xa7, 0x2e, 0xa8, 0x01, 0x25, 0x02, 0x35, 0x01, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x29, 0xff, 0xe3, 0x06, 0x3d, 0x04, 0x60, 0x00, 0x20, 0x00, 0x00, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x05, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x04, 0x01, 0x6e, 0x5d, 0x5d, 0x36, 0x38, 0xa6, 0x5a, 0x5e, 0xb9, 0xb4, 0x64, 0x58, 0xfe, 0xa1, 0x6a, 0x54, 0xfe, 0xea, 0xa1, 0x36, 0x58, 0x04, 0x60, 0xfd, 0x04, 0x57, 0x8a, 0x4f, 0x52, 0x9d, 0x01, 0x41, 0xfe, 0xb8, 0xec, 0x73, 0x78, 0x75, 0x65, 0x7b, 0x02, 0x8f, 0x86, 0xfe, 0x92, 0xfe, 0xfc, 0xcf, 0x1d, 0x99, 0x1b, 0x7f, 0xcf, 0x01, 0xa7, 0xd4, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xff, 0xe3, 0x07, 0x5c, 0x05, 0xd5, 0x12, 0x06, 0x01, 0xb8, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xff, 0xe3, 0x06, 0x50, 0x04, 0x60, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x04, 0x14, 0x6e, 0x5c, 0x5e, 0x36, 0x38, 0xa6, 0x5a, 0x5e, 0xba, 0xb3, 0x64, 0x59, 0xfd, 0xe5, 0xa5, 0xa5, 0x02, 0x1b, 0x04, 0x60, 0xfd, 0x04, 0x57, 0x8a, 0x4f, 0x52, 0x9d, 0x01, 0x41, 0xfe, 0xb8, 0xec, 0x73, 0x78, 0x75, 0x65, 0x7b, 0xcc, 0xfd, 0xfc, 0x04, 0x60, 0xfe, 0x33, 0x01, 0xcd, 0x00, 0x00, 0x01, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfc, 0x05, 0xf0, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x20, 0x27, 0x26, 0x10, 0x37, 0x36, 0x21, 0x20, 0x17, 0x15, 0x26, 0x23, 0x20, 0x11, 0x10, 0x21, 0x32, 0x36, 0x35, 0x11, 0x33, 0x04, 0xfb, 0x5a, 0x28, 0x7b, 0x70, 0x88, 0xfe, 0xbf, 0xb1, 0xac, 0xab, 0xb2, 0x01, 0x41, 0x01, 0x0a, 0xca, 0xca, 0xfb, 0xfe, 0x12, 0x01, 0xee, 0xc2, 0x6f, 0xb5, 0x01, 0xba, 0xe0, 0x7f, 0x39, 0x21, 0x1e, 0xd2, 0xcc, 0x02, 0xd0, 0xcd, 0xd2, 0x8e, 0xd7, 0xbf, 0xfd, 0x9f, 0xfd, 0xa0, 0x94, 0xa4, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xd9, 0x04, 0x7b, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x10, 0x17, 0x16, 0x33, 0x32, 0x11, 0x35, 0x33, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x26, 0x66, 0x83, 0x87, 0xf0, 0xbc, 0xa7, 0xab, 0xb0, 0xaa, 0x59, 0x51, 0x51, 0x59, 0xaa, 0xcb, 0xa6, 0xb5, 0xce, 0xea, 0x86, 0x80, 0x02, 0x2f, 0x01, 0x0e, 0x9d, 0xa1, 0x6e, 0xaa, 0x7c, 0x7c, 0x72, 0xfe, 0x7c, 0x72, 0x7c, 0x01, 0x3e, 0xbe, 0xc5, 0xec, 0xe7, 0xa6, 0x9e, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xff, 0xe3, 0x04, 0xdc, 0x05, 0xd5, 0x00, 0x19, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x35, 0x21, 0x15, 0x02, 0x8e, 0x39, 0x2f, 0x64, 0x5e, 0x35, 0x39, 0xb6, 0x63, 0x5e, 0xc1, 0xc1, 0x5e, 0x63, 0xfe, 0x23, 0x04, 0x70, 0x05, 0x2b, 0xfc, 0x96, 0x8f, 0x5b, 0x4a, 0x4a, 0x4f, 0x9b, 0x02, 0x9f, 0xfd, 0x5a, 0xe0, 0x7f, 0x78, 0x78, 0x7d, 0xe2, 0x03, 0x71, 0xaa, 0xaa, 0x00, 0x00, 0x01, 0x00, 0x04, 0xff, 0xe3, 0x04, 0x77, 0x04, 0x60, 0x00, 0x19, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x35, 0x21, 0x15, 0x02, 0x39, 0x38, 0x37, 0x5e, 0x5e, 0x36, 0x37, 0xa6, 0x5a, 0x5e, 0xb9, 0xb3, 0x65, 0x58, 0xfe, 0x6e, 0x03, 0xc6, 0x03, 0xb6, 0xfd, 0xae, 0x56, 0x46, 0x45, 0x4f, 0x52, 0x9d, 0x01, 0x41, 0xfe, 0xb8, 0xec, 0x73, 0x78, 0x75, 0x65, 0x7b, 0x02, 0x7e, 0xaa, 0xaa, 0x00, 0xff, 0xff, 0x00, 0x93, 0xff, 0xe3, 0x04, 0x09, 0x05, 0xf0, 0x12, 0x06, 0x01, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x04, 0x7c, 0x12, 0x06, 0x03, 0x49, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xfe, 0x66, 0x04, 0xb5, 0x05, 0xd5, 0x00, 0x18, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x4c, 0xc7, 0x34, 0x4e, 0x03, 0x1f, 0xb8, 0xcd, 0x45, 0x39, 0x78, 0x32, 0x31, 0xfe, 0x4c, 0x5c, 0x58, 0xaa, 0x30, 0xa3, 0xf6, 0x02, 0x64, 0xfe, 0xfa, 0x93, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4c, 0xc1, 0x04, 0xc3, 0xb8, 0xfd, 0xca, 0xfe, 0xf8, 0xfd, 0x00, 0x01, 0x00, 0x44, 0xfe, 0x56, 0x04, 0x02, 0x04, 0x60, 0x00, 0x18, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x21, 0x15, 0x10, 0x07, 0x06, 0x44, 0xa8, 0x2f, 0x3d, 0x02, 0xa9, 0x93, 0xa2, 0x40, 0x2d, 0x57, 0x29, 0x23, 0xfe, 0xa1, 0x4f, 0x54, 0x99, 0x1d, 0x7d, 0xa6, 0x01, 0xd0, 0xb7, 0xfb, 0x8c, 0xd6, 0xc0, 0x9c, 0x30, 0x29, 0xa1, 0x03, 0xe1, 0x6f, 0xfe, 0x50, 0xc2, 0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0x00, 0x00, 0x08, 0x33, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x12, 0x11, 0x35, 0x21, 0x09, 0x01, 0x33, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x21, 0x15, 0x10, 0x03, 0x06, 0x4c, 0xc3, 0x38, 0x4e, 0x03, 0x20, 0x01, 0x4e, 0x01, 0x50, 0xc3, 0xfe, 0x50, 0x01, 0xcd, 0xc3, 0xfe, 0x86, 0xfe, 0x83, 0xc4, 0x01, 0xdf, 0xfe, 0xc4, 0xfd, 0xf2, 0x5c, 0x58, 0xaa, 0x2f, 0xa4, 0x01, 0x02, 0x02, 0x58, 0xfe, 0xfd, 0xd5, 0x02, 0x2b, 0xfd, 0x33, 0xfc, 0xf8, 0x02, 0x7b, 0xfd, 0x85, 0x03, 0x1d, 0x02, 0x0e, 0xb8, 0xfd, 0xca, 0xfe, 0xf8, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x44, 0x00, 0x00, 0x06, 0xed, 0x04, 0x60, 0x00, 0x18, 0x00, 0x00, 0x09, 0x02, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x21, 0x15, 0x10, 0x07, 0x06, 0x05, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x17, 0x09, 0x01, 0x06, 0xda, 0xfe, 0x94, 0x01, 0x7f, 0xc3, 0xfe, 0xda, 0xfe, 0xdb, 0xc3, 0x01, 0x87, 0xfe, 0xfc, 0xfe, 0x5e, 0x4f, 0x54, 0xfe, 0xea, 0xa4, 0x33, 0x3d, 0x02, 0xa9, 0x01, 0x01, 0x0a, 0x01, 0x0b, 0x04, 0x60, 0xfd, 0xdf, 0xfd, 0xc1, 0x01, 0xb8, 0xfe, 0x48, 0x02, 0x4a, 0x01, 0x83, 0x6f, 0xfe, 0x50, 0xc2, 0xcf, 0x1d, 0x99, 0x1c, 0x7e, 0xb1, 0x01, 0xc5, 0xb7, 0x03, 0xfe, 0x74, 0x01, 0x8f, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x06, 0x38, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x6b, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0x01, 0x6d, 0x73, 0xfa, 0xe4, 0xb6, 0x01, 0x9a, 0xe2, 0xe7, 0x05, 0x01, 0x44, 0xc3, 0xfe, 0x50, 0x01, 0xcd, 0xc3, 0x05, 0x2f, 0xfd, 0xcf, 0x92, 0x87, 0x86, 0x92, 0xfd, 0xb3, 0x8a, 0xfd, 0xa8, 0x05, 0xd5, 0xe3, 0xdb, 0x30, 0x2a, 0x02, 0x18, 0xfd, 0x33, 0xfc, 0xf8, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x05, 0xfe, 0x04, 0x7b, 0x00, 0x18, 0x00, 0x20, 0x00, 0x00, 0x09, 0x02, 0x23, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x01, 0x00, 0x10, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x05, 0xeb, 0xfe, 0x93, 0x01, 0x80, 0xc4, 0xfe, 0xea, 0x17, 0x53, 0x72, 0xb8, 0x6f, 0x9f, 0x34, 0xa7, 0xa7, 0x34, 0x9f, 0x6f, 0xb8, 0x72, 0x4c, 0x1a, 0x01, 0x07, 0xfe, 0x5a, 0x96, 0xfe, 0xf9, 0x96, 0x96, 0x01, 0x07, 0x04, 0x60, 0xfd, 0xdf, 0xfd, 0xc1, 0x01, 0xa1, 0xa8, 0x74, 0xa2, 0x61, 0x64, 0xfd, 0xae, 0x06, 0x0a, 0xaa, 0x64, 0x61, 0xa2, 0x6b, 0x97, 0x01, 0x89, 0xfd, 0x04, 0x01, 0x96, 0xe7, 0xe7, 0xfe, 0x6a, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x00, 0x06, 0xf6, 0x05, 0xd5, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x00, 0x33, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x01, 0x12, 0x10, 0x16, 0x33, 0x21, 0x11, 0x21, 0x22, 0x7a, 0x01, 0x70, 0x5a, 0xe7, 0xea, 0xe8, 0x04, 0x6b, 0xfd, 0x66, 0x02, 0x7e, 0xfd, 0x82, 0x02, 0xaa, 0xfc, 0x9e, 0xf1, 0xfe, 0x9d, 0x32, 0x86, 0x83, 0x01, 0x19, 0xfe, 0xe7, 0x83, 0x02, 0x8d, 0x1a, 0xa9, 0xd7, 0xce, 0xe0, 0xaa, 0xfe, 0x46, 0xaa, 0xfd, 0xe3, 0xaa, 0x02, 0x77, 0xfd, 0x89, 0x04, 0xaa, 0xfe, 0xfa, 0x87, 0x02, 0x12, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x68, 0xff, 0xe3, 0x06, 0xb8, 0x04, 0x7b, 0x00, 0x1f, 0x00, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x15, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x23, 0x01, 0x23, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x21, 0x36, 0x33, 0x32, 0x12, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x25, 0x14, 0x16, 0x3b, 0x01, 0x11, 0x23, 0x22, 0x06, 0x06, 0xb8, 0xfd, 0x06, 0x0b, 0xb9, 0xa4, 0x60, 0xb3, 0x58, 0x59, 0xbb, 0x60, 0xf2, 0x8d, 0x89, 0x03, 0xce, 0xfe, 0xd7, 0xb3, 0x01, 0x34, 0x68, 0x8b, 0xc2, 0xc3, 0x02, 0x28, 0x4d, 0x5d, 0xcb, 0xed, 0xa6, 0x02, 0x94, 0x7a, 0x8b, 0xa7, 0x0c, 0xfd, 0x90, 0x73, 0x6b, 0xe0, 0xe0, 0x6b, 0x73, 0x02, 0x5e, 0x5a, 0xbe, 0xc7, 0x34, 0x34, 0xae, 0x2a, 0x2c, 0x9c, 0x98, 0xc2, 0xfe, 0x27, 0x01, 0xeb, 0x1a, 0x89, 0x8f, 0xa2, 0xa1, 0x1b, 0xfe, 0xdd, 0xc4, 0x97, 0xb4, 0xae, 0x9e, 0x8a, 0x53, 0x5e, 0x01, 0x61, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0xf8, 0x05, 0x44, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x54, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xf9, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x01, 0x33, 0x17, 0x37, 0x33, 0x01, 0x17, 0x23, 0x27, 0x07, 0x01, 0x23, 0x01, 0x03, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x27, 0x02, 0x2c, 0x7a, 0x88, 0xc6, 0xea, 0xfe, 0xc6, 0xb4, 0x80, 0x74, 0x8e, 0x02, 0x23, 0xc6, 0xfe, 0x2d, 0xf5, 0xb6, 0xb6, 0x01, 0x84, 0xc5, 0x05, 0x8a, 0x97, 0xe2, 0xfe, 0x9b, 0xc8, 0x80, 0xa1, 0xfc, 0x79, 0x03, 0x01, 0xfe, 0xe9, 0xfe, 0x16, 0x05, 0xd5, 0xfd, 0x1e, 0x01, 0xb8, 0xdc, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x1d, 0x04, 0x60, 0x00, 0x13, 0x00, 0x00, 0x01, 0x33, 0x17, 0x37, 0x33, 0x07, 0x17, 0x23, 0x27, 0x07, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x01, 0xfc, 0x7e, 0x3b, 0x6a, 0xcc, 0xcf, 0x84, 0x80, 0x44, 0x73, 0x01, 0xb3, 0xb9, 0xfe, 0x9a, 0xb1, 0xa5, 0xa5, 0x01, 0x2a, 0x04, 0x29, 0x40, 0x77, 0xe9, 0x93, 0x4c, 0x81, 0xfd, 0x51, 0x02, 0x35, 0xc8, 0xfe, 0x93, 0x04, 0x60, 0xfd, 0xf2, 0x01, 0x50, 0x00, 0x01, 0x00, 0x4b, 0xfe, 0x66, 0x07, 0x9b, 0x05, 0xd5, 0x00, 0x25, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x12, 0x11, 0x35, 0x21, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x21, 0x15, 0x10, 0x03, 0x06, 0x4c, 0xc3, 0x38, 0x4e, 0x03, 0x1f, 0x01, 0x78, 0xa7, 0x66, 0x62, 0xb8, 0xcd, 0x44, 0x37, 0x79, 0x32, 0x32, 0x70, 0x6f, 0xfe, 0xad, 0xb6, 0xfe, 0x4c, 0x5c, 0x58, 0xaa, 0x2f, 0xa4, 0x01, 0x02, 0x02, 0x58, 0xfe, 0xfd, 0x9c, 0x77, 0x72, 0xee, 0xfe, 0xce, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4b, 0xc2, 0x01, 0x22, 0x9f, 0x9e, 0xfd, 0x39, 0x05, 0x2b, 0xb8, 0xfd, 0xca, 0xfe, 0xf8, 0xfd, 0x00, 0x00, 0x01, 0x00, 0x44, 0xfe, 0x56, 0x06, 0x58, 0x04, 0x60, 0x00, 0x27, 0x00, 0x00, 0x33, 0x35, 0x36, 0x37, 0x36, 0x11, 0x35, 0x21, 0x11, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x15, 0x10, 0x07, 0x06, 0x44, 0xa4, 0x33, 0x3d, 0x02, 0xa9, 0xe1, 0xed, 0x3f, 0x4a, 0x4a, 0x49, 0xa3, 0xae, 0x9b, 0x63, 0x1e, 0x22, 0x22, 0x28, 0x7d, 0xea, 0xa5, 0xfe, 0xa1, 0x4f, 0x54, 0x99, 0x1c, 0x7e, 0xb1, 0x01, 0xc5, 0xb7, 0xfe, 0x17, 0x47, 0x51, 0xe5, 0xfe, 0xf2, 0xd5, 0x61, 0x60, 0x9c, 0x30, 0x37, 0x93, 0x01, 0x08, 0xa6, 0x24, 0x29, 0xfe, 0x19, 0x03, 0xcd, 0x6f, 0xfe, 0x50, 0xc2, 0xcf, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x07, 0x9c, 0x05, 0xd5, 0x00, 0x21, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x94, 0xb6, 0x01, 0x77, 0xa8, 0x66, 0x62, 0xb8, 0xcd, 0x45, 0x38, 0x79, 0x32, 0x32, 0x70, 0x6f, 0xfe, 0xad, 0xb6, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfd, 0x9c, 0x77, 0x72, 0xee, 0xfe, 0xce, 0xfe, 0xf2, 0xf4, 0xaa, 0x4b, 0x4b, 0xc2, 0x01, 0x22, 0x9f, 0x9e, 0xfd, 0x39, 0x02, 0xc7, 0xfd, 0x39, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x06, 0x65, 0x04, 0x60, 0x00, 0x23, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0xa7, 0xa7, 0x02, 0x19, 0xa7, 0xe1, 0xec, 0x3f, 0x4a, 0x4a, 0x49, 0xa2, 0xae, 0x9b, 0x63, 0x1d, 0x23, 0x23, 0x27, 0x7d, 0xea, 0xa7, 0xfd, 0xe7, 0xa7, 0x04, 0x60, 0xfe, 0x37, 0x01, 0xc9, 0xfe, 0x17, 0x47, 0x51, 0xe5, 0xfe, 0xf2, 0xd5, 0x61, 0x60, 0x9c, 0x30, 0x37, 0x93, 0x01, 0x08, 0xa6, 0x24, 0x29, 0xfe, 0x19, 0x02, 0x04, 0xfd, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x05, 0x6a, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x03, 0xff, 0xfd, 0x6c, 0xb6, 0x04, 0x00, 0xb5, 0xb5, 0x05, 0x2b, 0xfa, 0xd5, 0x05, 0xd5, 0xfa, 0xd5, 0xfe, 0x15, 0x01, 0x41, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0xb4, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x04, 0x0e, 0xa5, 0xa5, 0xa7, 0xfd, 0xe7, 0xa7, 0x04, 0x60, 0xfc, 0x39, 0xfe, 0x4c, 0x01, 0x1b, 0x03, 0xcd, 0xfc, 0x33, 0x04, 0x60, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x00, 0x21, 0x23, 0x03, 0x21, 0x03, 0x23, 0x01, 0x33, 0x01, 0x21, 0x03, 0x04, 0x0c, 0xb0, 0x5b, 0xfe, 0x41, 0x5c, 0xaf, 0x01, 0x7a, 0xe1, 0xfe, 0xe3, 0x01, 0x59, 0xad, 0x01, 0x13, 0xfe, 0xed, 0x04, 0x60, 0xfd, 0x47, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0xd2, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x33, 0x01, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x03, 0x01, 0x03, 0x33, 0x11, 0x0a, 0x01, 0xaa, 0x03, 0x12, 0xfe, 0x2a, 0x01, 0xc2, 0xfe, 0x3e, 0x01, 0xe2, 0xfd, 0x77, 0xfe, 0xde, 0x68, 0x01, 0x71, 0xd1, 0xea, 0x04, 0x60, 0x94, 0xfe, 0xd3, 0x94, 0xfe, 0x88, 0x93, 0x01, 0x13, 0xfe, 0xed, 0x03, 0xcd, 0xfd, 0xda, 0x02, 0x26, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0xb1, 0x04, 0x7b, 0x00, 0x34, 0x00, 0x3d, 0x00, 0x4a, 0x00, 0x00, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x21, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x25, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x03, 0xa0, 0x43, 0xbf, 0x76, 0xcc, 0x76, 0x77, 0x02, 0xf9, 0x0b, 0xb7, 0xa5, 0x5e, 0x5a, 0x5a, 0x5a, 0x5a, 0xbc, 0x5f, 0x96, 0x70, 0x70, 0x45, 0x41, 0xc3, 0x81, 0xaa, 0x5e, 0x5f, 0x73, 0x71, 0xe2, 0xe8, 0x4b, 0x4b, 0x88, 0x57, 0xa3, 0x4c, 0x5b, 0x56, 0x55, 0x51, 0x80, 0x5f, 0x61, 0xfd, 0x45, 0x01, 0x4b, 0x4a, 0x7b, 0x8a, 0x52, 0x54, 0x0d, 0x01, 0x45, 0xc8, 0x9b, 0x3a, 0x3a, 0x64, 0x8a, 0x52, 0x54, 0x9b, 0x5a, 0x5e, 0x91, 0x92, 0xfa, 0x5a, 0xbf, 0xc8, 0x1b, 0x1a, 0x35, 0xae, 0x2a, 0x2c, 0x3d, 0x3c, 0x77, 0x78, 0x78, 0x5d, 0x5e, 0xa8, 0xbd, 0x60, 0x60, 0x12, 0x7f, 0x46, 0x45, 0x2e, 0x2e, 0xaa, 0x27, 0x14, 0x13, 0x30, 0x30, 0x01, 0x87, 0x97, 0x5a, 0x5a, 0x57, 0x57, 0x9e, 0x60, 0x66, 0x7b, 0x62, 0x3a, 0x39, 0x6d, 0x6c, 0xb4, 0x29, 0x00, 0x03, 0x00, 0x37, 0x00, 0x00, 0x03, 0xd2, 0x04, 0x60, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x23, 0x00, 0x00, 0x25, 0x32, 0x35, 0x34, 0x2b, 0x01, 0x15, 0x33, 0x15, 0x23, 0x15, 0x01, 0x34, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x37, 0x14, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x35, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x16, 0x02, 0x39, 0xe8, 0xe8, 0xec, 0xc6, 0xc6, 0x01, 0xae, 0xd4, 0xda, 0xda, 0xd4, 0xa7, 0xc1, 0x72, 0x7e, 0xcf, 0xc1, 0xfe, 0x66, 0x6f, 0x6f, 0x01, 0x8b, 0xb1, 0xbf, 0x99, 0xb5, 0xb4, 0x66, 0xa4, 0x5f, 0x02, 0x9d, 0x91, 0xfe, 0xda, 0xaa, 0xd0, 0x1f, 0x18, 0x98, 0x72, 0x96, 0xa4, 0xf8, 0xa4, 0x02, 0xc4, 0x90, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x46, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf7, 0x04, 0x60, 0x00, 0x08, 0x00, 0x11, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x01, 0x4e, 0x7f, 0xc3, 0xb7, 0xb7, 0xc3, 0xfe, 0xda, 0x01, 0x18, 0x01, 0x26, 0x01, 0x11, 0xfe, 0xed, 0xfe, 0xdc, 0xfe, 0xe8, 0x03, 0xcd, 0xfc, 0xc7, 0xc7, 0xd6, 0xd5, 0xc7, 0x93, 0xfe, 0xf1, 0xfe, 0xe0, 0xfe, 0xdf, 0xfe, 0xf0, 0x00, 0x02, 0x00, 0x20, 0x00, 0x00, 0x03, 0xf7, 0x04, 0x60, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x00, 0x13, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x11, 0x23, 0x35, 0x33, 0x21, 0x15, 0x23, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x11, 0xa7, 0x01, 0x18, 0x01, 0x26, 0x01, 0x11, 0xfe, 0xed, 0xfe, 0xdc, 0xfe, 0xe8, 0x87, 0x87, 0x01, 0x55, 0xae, 0x7f, 0xc3, 0xb7, 0xb7, 0xc3, 0x7f, 0x04, 0x60, 0xfe, 0xf1, 0xfe, 0xe0, 0xfe, 0xdf, 0xfe, 0xf0, 0x01, 0xf5, 0xa4, 0xa4, 0xfe, 0x9f, 0xc7, 0xd6, 0xd5, 0xc7, 0xfe, 0xcc, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x31, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0xa7, 0x02, 0x7e, 0xfe, 0x2a, 0x01, 0xc1, 0xfe, 0x3f, 0x01, 0xe1, 0xfd, 0x77, 0x04, 0x60, 0x94, 0xfe, 0xd3, 0x94, 0xfe, 0x88, 0x93, 0x00, 0x01, 0x00, 0x75, 0xff, 0xe3, 0x03, 0x65, 0x04, 0x7c, 0x00, 0x31, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x02, 0x79, 0x65, 0x36, 0x36, 0x67, 0x66, 0xb0, 0x45, 0x99, 0x58, 0x57, 0x48, 0x49, 0x40, 0x6b, 0x3e, 0x40, 0x3e, 0x3c, 0x68, 0x8c, 0x85, 0x7c, 0x40, 0x47, 0x4c, 0x4c, 0x88, 0x54, 0x4d, 0x4c, 0x40, 0x51, 0x4c, 0x4c, 0x48, 0xd6, 0xe8, 0x7c, 0x02, 0x03, 0x18, 0x41, 0x40, 0x5d, 0x8d, 0x4f, 0x4e, 0x18, 0x18, 0xa7, 0x1d, 0x0d, 0x0d, 0x2e, 0x2e, 0x40, 0x46, 0x2d, 0x2c, 0x98, 0x33, 0x38, 0x58, 0x5a, 0x38, 0x38, 0x12, 0x13, 0x25, 0xab, 0x1c, 0x0e, 0x0e, 0xb6, 0xad, 0x6c, 0x92, 0x00, 0x00, 0x02, 0x00, 0xad, 0xfe, 0x4c, 0x01, 0x54, 0x04, 0x60, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x11, 0x35, 0x33, 0x15, 0xae, 0xa5, 0xa5, 0xa5, 0x04, 0x60, 0xfb, 0xa0, 0xfe, 0x4c, 0xe9, 0xe9, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe3, 0x02, 0x3c, 0x04, 0x60, 0x00, 0x10, 0x00, 0x00, 0x3d, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x06, 0x23, 0x22, 0x26, 0x3d, 0x84, 0x46, 0x5d, 0x29, 0x27, 0x88, 0x8f, 0xa7, 0x40, 0x81, 0x3d, 0xb9, 0x3c, 0x3d, 0x4d, 0x46, 0xd7, 0x02, 0x79, 0xfd, 0x87, 0xfe, 0xe6, 0xea, 0x2c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x26, 0x04, 0x60, 0x10, 0x06, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x03, 0x96, 0x04, 0x7b, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x11, 0x37, 0x17, 0x07, 0x11, 0x21, 0x15, 0x21, 0x11, 0x07, 0x27, 0x37, 0xa7, 0xa7, 0x7b, 0x45, 0xc0, 0x02, 0x48, 0xfd, 0x11, 0x63, 0x42, 0xa5, 0x04, 0x7b, 0xfe, 0x64, 0x61, 0x6a, 0x97, 0xfe, 0x6b, 0xaa, 0x01, 0xbc, 0x4e, 0x6a, 0x83, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc8, 0x04, 0x60, 0x10, 0x06, 0x03, 0xd0, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x10, 0x06, 0x03, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x72, 0xff, 0xe3, 0x03, 0x90, 0x04, 0x7b, 0x10, 0x06, 0x02, 0x16, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x2d, 0x04, 0x89, 0x04, 0x31, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x00, 0x01, 0x34, 0x26, 0x20, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x34, 0x00, 0x33, 0x32, 0x00, 0x03, 0xfc, 0xd0, 0xfe, 0x96, 0xd0, 0xd1, 0xb4, 0xb3, 0xd2, 0x8c, 0xfe, 0xe7, 0xf8, 0xf8, 0xfe, 0xe7, 0x01, 0x19, 0xf8, 0xf8, 0x01, 0x19, 0x02, 0x2f, 0x94, 0xac, 0xab, 0x95, 0x93, 0xac, 0xac, 0x93, 0xf0, 0xfe, 0xee, 0x01, 0x12, 0xf0, 0xf1, 0x01, 0x11, 0xfe, 0xef, 0x00, 0x00, 0x01, 0x00, 0x65, 0x00, 0x74, 0x04, 0x89, 0x03, 0xea, 0x00, 0x18, 0x00, 0x00, 0x25, 0x23, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x20, 0x06, 0x15, 0x14, 0x16, 0x17, 0x23, 0x2e, 0x01, 0x35, 0x34, 0x00, 0x33, 0x32, 0x00, 0x11, 0x14, 0x06, 0x04, 0x49, 0x9b, 0x27, 0x27, 0xcd, 0xfe, 0x8f, 0xcc, 0x27, 0x27, 0x9a, 0x20, 0x20, 0x01, 0x1e, 0xf3, 0xf7, 0x01, 0x1a, 0x1f, 0x74, 0x4e, 0x9d, 0x50, 0xb3, 0xc6, 0xc6, 0xb3, 0x50, 0x9d, 0x4e, 0x4d, 0xa5, 0x5d, 0xfd, 0x01, 0x2a, 0xfe, 0xd3, 0xfe, 0xfa, 0x55, 0xa2, 0x00, 0x00, 0x03, 0x00, 0x2d, 0x00, 0x05, 0x04, 0xc6, 0x04, 0x59, 0x00, 0x09, 0x00, 0x13, 0x00, 0x2b, 0x00, 0x00, 0x09, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x00, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x35, 0x34, 0x36, 0x37, 0x27, 0x37, 0x03, 0x53, 0xfd, 0xec, 0x26, 0x24, 0xd1, 0xb4, 0x47, 0x69, 0x8b, 0x25, 0x24, 0xd3, 0xbe, 0x41, 0x63, 0x29, 0x88, 0x45, 0xb1, 0x6c, 0xf8, 0x01, 0x19, 0x2e, 0x2f, 0x97, 0x47, 0xa1, 0x45, 0xb2, 0x6c, 0xf8, 0xfe, 0xe6, 0x2f, 0x2e, 0x97, 0x46, 0x01, 0x18, 0x01, 0xe7, 0x29, 0x67, 0x41, 0x93, 0xac, 0x14, 0x5c, 0x2a, 0x67, 0x3e, 0x97, 0xa9, 0x13, 0x14, 0x7d, 0x36, 0x36, 0xfe, 0xef, 0xf1, 0x5d, 0x9f, 0x43, 0x8b, 0x5f, 0x92, 0x35, 0x36, 0x01, 0x12, 0xf0, 0x60, 0xa1, 0x3f, 0x8b, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x06, 0xfd, 0x04, 0x7b, 0x00, 0x26, 0x00, 0x2f, 0x00, 0x3d, 0x00, 0x00, 0x13, 0x35, 0x21, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x37, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x01, 0x32, 0x37, 0x36, 0x10, 0x27, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x66, 0x02, 0xf9, 0x0b, 0x5c, 0x5b, 0xa5, 0x5f, 0xb4, 0x59, 0x5a, 0xbc, 0x5f, 0x90, 0xda, 0x49, 0x40, 0x5d, 0x5f, 0x7e, 0xd9, 0x7a, 0x7b, 0x7b, 0x7a, 0xd9, 0x7e, 0x5f, 0x5f, 0x3c, 0x46, 0xd1, 0x80, 0xcc, 0x77, 0x76, 0xa6, 0x02, 0x4a, 0x4a, 0x7b, 0x8a, 0x52, 0x54, 0x0d, 0x01, 0xd4, 0x85, 0x4d, 0x4e, 0x4d, 0x4d, 0x86, 0x85, 0x9a, 0x4d, 0x4d, 0x02, 0x00, 0x5a, 0xbe, 0x64, 0x63, 0x34, 0x34, 0xae, 0x2a, 0x2c, 0x6e, 0x6d, 0x6e, 0x36, 0x37, 0x9d, 0x9c, 0xfe, 0xed, 0xfe, 0xec, 0x9c, 0x9c, 0x37, 0x38, 0x6c, 0x6b, 0x70, 0x91, 0x92, 0xc4, 0x98, 0x5a, 0x59, 0x57, 0x57, 0x9e, 0xfe, 0xb4, 0x73, 0x74, 0x01, 0x92, 0x74, 0x73, 0xe8, 0xc8, 0xc7, 0x74, 0x75, 0x00, 0x01, 0x00, 0x65, 0x02, 0x2f, 0x04, 0x03, 0x04, 0x7b, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x23, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x03, 0x53, 0x9a, 0x85, 0x85, 0x9b, 0xae, 0xf5, 0xd9, 0xd8, 0xf7, 0x02, 0x2f, 0xc7, 0xe9, 0xe7, 0xc9, 0x01, 0x14, 0x01, 0x38, 0xfe, 0xc8, 0xfe, 0xec, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x02, 0x2f, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x33, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x01, 0x15, 0x9b, 0x84, 0x86, 0x9a, 0xaf, 0xf6, 0xd9, 0xd8, 0xf6, 0x02, 0x2f, 0xc7, 0xe9, 0xe7, 0xc9, 0xfe, 0xec, 0xfe, 0xc8, 0x01, 0x38, 0x01, 0x14, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x87, 0x00, 0x00, 0x03, 0x6b, 0x04, 0x60, 0x00, 0x07, 0x00, 0x11, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x10, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x01, 0x2d, 0xe7, 0x52, 0x59, 0x59, 0x52, 0xfe, 0x74, 0x01, 0x8c, 0xa9, 0xae, 0xae, 0xa9, 0xe7, 0xa5, 0x03, 0xc5, 0xfe, 0x98, 0x5e, 0xac, 0x5e, 0x9b, 0xaa, 0xfe, 0xb6, 0xaa, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x03, 0xa8, 0x04, 0x60, 0x00, 0x16, 0x00, 0x21, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x11, 0x23, 0x11, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x23, 0x13, 0x36, 0x37, 0x36, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x01, 0x89, 0x5f, 0x65, 0x60, 0x62, 0xc3, 0x01, 0x5d, 0xa6, 0x99, 0x57, 0x35, 0x35, 0x39, 0x92, 0xaf, 0x9d, 0x2f, 0x2f, 0x30, 0x01, 0xa9, 0xb3, 0x6b, 0x38, 0x3a, 0x3a, 0x38, 0x6b, 0xb3, 0x02, 0x0d, 0x1b, 0x8c, 0x69, 0xa2, 0x51, 0x50, 0xfb, 0xa0, 0x01, 0xd9, 0x25, 0x24, 0x71, 0xfe, 0xe1, 0x01, 0x32, 0x5e, 0x36, 0x36, 0x01, 0xc9, 0x2a, 0x2a, 0x54, 0x53, 0x2b, 0x2b, 0x00, 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x03, 0xa8, 0x04, 0x60, 0x00, 0x16, 0x00, 0x21, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x03, 0x33, 0x13, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x01, 0x11, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x01, 0x89, 0x31, 0x30, 0x2f, 0x2f, 0x9d, 0xaf, 0x92, 0x39, 0x35, 0x35, 0x57, 0x99, 0xa6, 0xfe, 0xa3, 0xc3, 0x62, 0x60, 0x65, 0x01, 0xd7, 0xb3, 0x6b, 0x38, 0x3a, 0x3a, 0x38, 0x6b, 0x02, 0x53, 0x11, 0x36, 0x36, 0x5e, 0x01, 0x32, 0xfe, 0xe1, 0x71, 0x24, 0x25, 0x01, 0xd9, 0xfb, 0xa0, 0x50, 0x51, 0xa2, 0x69, 0x8c, 0xfe, 0x63, 0x01, 0x51, 0x2b, 0x2b, 0x53, 0x54, 0x2a, 0x2a, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x03, 0xfc, 0x04, 0x60, 0x10, 0x06, 0x03, 0xd6, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0xe0, 0x03, 0xac, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x00, 0x24, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, 0x20, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x01, 0xb5, 0xe9, 0x67, 0xa7, 0xc4, 0xfe, 0x83, 0xc4, 0xa7, 0x7d, 0x8e, 0xa2, 0x02, 0xb3, 0xfd, 0x3b, 0xdb, 0xe0, 0xe0, 0xdb, 0x02, 0xc5, 0xfd, 0x4d, 0xa2, 0x00, 0x01, 0x00, 0x9c, 0x00, 0x4c, 0x04, 0xa7, 0x03, 0xf6, 0x00, 0x13, 0x00, 0x00, 0x25, 0x21, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x15, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x02, 0xff, 0xfd, 0x9e, 0x02, 0x5b, 0x90, 0x8f, 0xab, 0x94, 0xfd, 0xc5, 0x03, 0xf0, 0x9b, 0x5c, 0x59, 0xd8, 0x4c, 0xb8, 0x7c, 0x7c, 0x96, 0xac, 0xb8, 0xb8, 0x42, 0xb2, 0x74, 0xc2, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x9c, 0x00, 0x4e, 0x06, 0x2c, 0x03, 0xf8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x05, 0x21, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x15, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x9d, 0xb5, 0xb5, 0xb5, 0x03, 0x32, 0xfd, 0x9d, 0x02, 0x5c, 0x8f, 0x90, 0xac, 0x93, 0xfd, 0xc4, 0x03, 0xf0, 0x9a, 0x5b, 0x5a, 0xd8, 0x02, 0x78, 0xcc, 0xcc, 0xfe, 0x7a, 0xca, 0xca, 0xa4, 0xb8, 0x7c, 0x7c, 0x94, 0xae, 0xb8, 0xb8, 0x44, 0xb0, 0x76, 0xc0, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0xfe, 0x18, 0x04, 0x33, 0x04, 0x7b, 0x00, 0x26, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23, 0x21, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x21, 0x35, 0x21, 0x15, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x03, 0x59, 0x6f, 0x6b, 0x6e, 0x6f, 0xcb, 0xfd, 0x9f, 0x02, 0x5b, 0x91, 0x8d, 0xab, 0x94, 0xfd, 0xc6, 0x02, 0x5b, 0x92, 0x45, 0x47, 0x57, 0x55, 0x93, 0xfd, 0xc6, 0x03, 0xf0, 0x9c, 0x5c, 0x59, 0x38, 0x38, 0x01, 0x0c, 0x45, 0xc0, 0x82, 0xaf, 0x5f, 0x5f, 0xb9, 0x72, 0x75, 0x8f, 0xa6, 0xb9, 0x39, 0x39, 0x77, 0x8d, 0x53, 0x53, 0xb9, 0xb9, 0x3f, 0xb0, 0x79, 0x7a, 0x56, 0x55, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x06, 0x00, 0x59, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6c, 0xff, 0xe3, 0x03, 0x5b, 0x04, 0x60, 0x00, 0x17, 0x00, 0x00, 0x37, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x13, 0x25, 0x35, 0x21, 0x15, 0x03, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x20, 0x27, 0x7c, 0x91, 0xbe, 0x73, 0x77, 0x6f, 0x63, 0x72, 0xef, 0xfe, 0x0c, 0x02, 0xb3, 0xef, 0x3f, 0x88, 0x64, 0xce, 0xfe, 0xa4, 0xb5, 0xbd, 0x42, 0x64, 0xbb, 0x64, 0x90, 0x01, 0x3e, 0x01, 0x93, 0x93, 0xfe, 0xc2, 0x4a, 0x9f, 0x6d, 0xa0, 0xb6, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa1, 0x00, 0x00, 0x03, 0x96, 0x04, 0x7b, 0x00, 0x05, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0xa1, 0x02, 0xf5, 0xfd, 0xc1, 0x04, 0x7b, 0xaa, 0xfc, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x06, 0x02, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x03, 0x88, 0x04, 0x60, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x03, 0x88, 0xa4, 0xfe, 0x48, 0xa4, 0x04, 0x60, 0xfb, 0xa0, 0x03, 0xb7, 0xfc, 0x49, 0x04, 0x60, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0x00, 0x00, 0x03, 0x6b, 0x04, 0x60, 0x10, 0x06, 0x04, 0xd1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x51, 0x00, 0x00, 0x03, 0xef, 0x04, 0x60, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x33, 0x11, 0x36, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x07, 0x06, 0x07, 0x15, 0x23, 0x35, 0x26, 0x27, 0x26, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x17, 0x01, 0xcd, 0xa5, 0x4d, 0x33, 0x4e, 0xae, 0x7a, 0x62, 0xa0, 0xa5, 0x9e, 0x62, 0x7c, 0xb0, 0x4e, 0x33, 0x4b, 0x04, 0x60, 0xfd, 0x31, 0x1a, 0x4d, 0x73, 0xc9, 0x01, 0x2c, 0xfe, 0xd4, 0xfe, 0xec, 0x9c, 0x7d, 0x19, 0xee, 0xee, 0x19, 0x7d, 0x9c, 0x01, 0x14, 0x01, 0x2c, 0xfe, 0xd4, 0xc7, 0x75, 0x4d, 0x1a, 0xff, 0xff, 0x00, 0x44, 0x00, 0x00, 0x04, 0x02, 0x04, 0x60, 0x10, 0x06, 0x03, 0xcf, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x02, 0x9c, 0x03, 0x11, 0x05, 0xe0, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x03, 0x21, 0x03, 0x33, 0x01, 0x23, 0x27, 0x21, 0x07, 0x23, 0x01, 0x8d, 0x9c, 0x01, 0x38, 0xdd, 0x82, 0x01, 0x43, 0x77, 0x4d, 0xfe, 0x82, 0x4d, 0x79, 0x05, 0x71, 0xfe, 0x60, 0x02, 0x0f, 0xfc, 0xbc, 0xd6, 0xd6, 0x00, 0x02, 0x00, 0x04, 0x02, 0x9c, 0x04, 0x21, 0x05, 0xe0, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x35, 0x21, 0x07, 0x23, 0x01, 0x17, 0x03, 0x21, 0x11, 0x04, 0x16, 0xfe, 0x5c, 0x01, 0x93, 0xfe, 0x6d, 0x01, 0xaf, 0xfd, 0xde, 0xfe, 0xd5, 0x5b, 0x75, 0x01, 0x63, 0x4e, 0xbb, 0x01, 0x05, 0x05, 0xe0, 0x5f, 0xf8, 0x5f, 0xfe, 0xd1, 0x5f, 0xd6, 0xd6, 0x03, 0x44, 0x58, 0xfe, 0x49, 0x01, 0xb7, 0x00, 0x00, 0x03, 0x00, 0x72, 0x02, 0x9c, 0x02, 0xcb, 0x05, 0xe0, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x26, 0x00, 0x00, 0x13, 0x11, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x03, 0x15, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x25, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0xe5, 0xb7, 0x5d, 0x2c, 0x2d, 0x2d, 0x2c, 0x5d, 0xb7, 0xa9, 0x54, 0x29, 0x29, 0x29, 0x29, 0x54, 0xfe, 0xe4, 0x01, 0x25, 0x82, 0x47, 0x48, 0x25, 0x24, 0x47, 0x55, 0x5e, 0x9b, 0x8e, 0xfe, 0xd0, 0x04, 0x2b, 0xfe, 0xce, 0x26, 0x26, 0x4d, 0x4f, 0x25, 0x25, 0x01, 0x58, 0xfc, 0x1f, 0x1f, 0x40, 0x3f, 0x20, 0x1f, 0x5d, 0x36, 0x35, 0x64, 0x4c, 0x2e, 0x2d, 0x0b, 0x12, 0x72, 0x55, 0x70, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x72, 0x02, 0x9c, 0x03, 0x3a, 0x05, 0xe0, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x13, 0x11, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x27, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0xe5, 0x8a, 0xaf, 0x52, 0x51, 0x51, 0x52, 0xaf, 0xfd, 0xeb, 0xf7, 0x72, 0x73, 0x73, 0x74, 0xf5, 0xeb, 0x05, 0x83, 0xfd, 0x76, 0x4e, 0x4f, 0xa9, 0xa8, 0x4e, 0x4e, 0x5d, 0x65, 0x65, 0xd7, 0xd8, 0x66, 0x65, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x02, 0x94, 0x05, 0xe0, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x72, 0x02, 0x17, 0xfe, 0x5c, 0x01, 0x93, 0xfe, 0x6d, 0x01, 0xaf, 0xfd, 0xde, 0x05, 0xe0, 0x5f, 0xf8, 0x5f, 0xfe, 0xd1, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x4a, 0x02, 0x9c, 0x02, 0x6d, 0x05, 0xe0, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x02, 0x6c, 0xfd, 0xdf, 0x01, 0xae, 0xfe, 0x6d, 0x01, 0x93, 0xfe, 0x5c, 0x05, 0xe0, 0xfc, 0xbc, 0x5f, 0x01, 0x2f, 0x5f, 0xf8, 0x5f, 0x00, 0x01, 0x00, 0x40, 0x02, 0x8c, 0x03, 0x25, 0x05, 0xef, 0x00, 0x24, 0x00, 0x00, 0x01, 0x35, 0x23, 0x35, 0x21, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x02, 0xb3, 0xbb, 0x01, 0x2d, 0x43, 0x50, 0x4f, 0x5b, 0xc7, 0x70, 0x70, 0x70, 0x70, 0xc7, 0x53, 0x4a, 0x4a, 0x3f, 0x3f, 0x48, 0x47, 0x4e, 0x9c, 0x4e, 0x4e, 0x4e, 0x4e, 0x9c, 0x3c, 0x5f, 0x03, 0x13, 0xe1, 0x5d, 0xfe, 0x99, 0x2f, 0x17, 0x18, 0x72, 0x73, 0xcc, 0xcd, 0x73, 0x72, 0x14, 0x14, 0x27, 0x79, 0x35, 0x1b, 0x1b, 0x55, 0x56, 0xaa, 0xa9, 0x56, 0x55, 0x14, 0x00, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x02, 0xf8, 0x05, 0xe0, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x72, 0x73, 0x01, 0x9f, 0x74, 0x74, 0xfe, 0x61, 0x73, 0x05, 0xe0, 0xfe, 0xa9, 0x01, 0x57, 0xfc, 0xbc, 0x01, 0x8e, 0xfe, 0x72, 0x00, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x00, 0xe5, 0x05, 0xe0, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x72, 0x73, 0x73, 0x05, 0xe0, 0xfc, 0xbc, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc3, 0x01, 0xb6, 0x00, 0xe5, 0x05, 0xe0, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x72, 0x73, 0x3b, 0x3a, 0x80, 0x2c, 0x24, 0x4b, 0x3f, 0x05, 0xe0, 0xfc, 0xf6, 0x97, 0x44, 0x45, 0x60, 0x54, 0x6c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x03, 0x12, 0x05, 0xe0, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x72, 0x73, 0x01, 0x7b, 0x94, 0xfe, 0x5c, 0x01, 0xc2, 0x97, 0xfe, 0x6a, 0x73, 0x05, 0xe0, 0xfe, 0x9f, 0x01, 0x61, 0xfe, 0x7a, 0xfe, 0x42, 0x01, 0x93, 0xfe, 0x6d, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x02, 0x81, 0x05, 0xe0, 0x00, 0x05, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x15, 0x21, 0x72, 0x73, 0x01, 0x9c, 0xfd, 0xf1, 0x05, 0xe0, 0xfd, 0x1b, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x03, 0x79, 0x05, 0xe0, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x1b, 0x01, 0x33, 0x11, 0x23, 0x11, 0x03, 0x23, 0x03, 0x11, 0x23, 0x72, 0xaa, 0xd8, 0xda, 0xaa, 0x6f, 0xda, 0x73, 0xdb, 0x6f, 0x05, 0xe0, 0xfd, 0xc7, 0x02, 0x39, 0xfc, 0xbc, 0x02, 0xde, 0xfd, 0xc3, 0x02, 0x3d, 0xfd, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x02, 0xf4, 0x05, 0xe0, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x23, 0x01, 0x11, 0x23, 0x72, 0x9a, 0x01, 0x78, 0x6f, 0x9b, 0xfe, 0x89, 0x6f, 0x05, 0xe0, 0xfd, 0x45, 0x02, 0xbb, 0xfc, 0xbc, 0x02, 0xbb, 0xfd, 0x45, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x72, 0x02, 0x9c, 0x02, 0xf4, 0x05, 0xe0, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x23, 0x11, 0x33, 0x11, 0x01, 0x02, 0xf3, 0x6f, 0xfe, 0x88, 0x9a, 0x6f, 0x01, 0x77, 0x05, 0xe0, 0xfc, 0xbc, 0x02, 0xbb, 0xfd, 0x45, 0x03, 0x44, 0xfd, 0x45, 0x02, 0xbb, 0x00, 0x00, 0x02, 0x00, 0x40, 0x02, 0x8c, 0x03, 0x51, 0x05, 0xef, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x24, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x10, 0x01, 0xc9, 0x7c, 0x4a, 0x49, 0x49, 0x4a, 0x7c, 0x7d, 0x49, 0x49, 0x49, 0x49, 0xfe, 0xd1, 0x01, 0x64, 0x6b, 0x6b, 0x6b, 0x6b, 0xfe, 0x9c, 0x6b, 0x6b, 0x05, 0x93, 0x5b, 0x5c, 0x9f, 0x9e, 0x5c, 0x5b, 0x5b, 0x5c, 0x9e, 0x9f, 0x5c, 0x5b, 0x5c, 0x76, 0x76, 0xc6, 0xc5, 0x76, 0x76, 0x75, 0x76, 0x01, 0x8c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0xeb, 0x05, 0xef, 0x00, 0x0f, 0x00, 0x40, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x03, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x01, 0x95, 0x67, 0x3d, 0x3d, 0x3d, 0x3d, 0x67, 0x68, 0x3e, 0x3c, 0x3c, 0x3c, 0x8a, 0x4a, 0x31, 0x30, 0x36, 0x22, 0x73, 0x5f, 0x36, 0x37, 0x2b, 0x3e, 0x4a, 0x82, 0x54, 0x50, 0x31, 0x30, 0x56, 0x61, 0x36, 0x37, 0x59, 0x57, 0xa6, 0xa5, 0xb0, 0x37, 0x37, 0x61, 0x61, 0x26, 0x31, 0x4a, 0x42, 0x92, 0x04, 0x29, 0x2b, 0x2b, 0x4c, 0x4b, 0x2c, 0x2b, 0x2b, 0x2c, 0x4b, 0x4c, 0x2b, 0x2b, 0x01, 0x35, 0x02, 0x23, 0x23, 0x2c, 0x26, 0x29, 0x19, 0x24, 0x25, 0x4c, 0x59, 0x18, 0x2b, 0x04, 0x38, 0x3a, 0x36, 0x69, 0x47, 0x32, 0x32, 0x12, 0x13, 0x37, 0x38, 0x50, 0x79, 0x41, 0x41, 0x82, 0x79, 0x50, 0x38, 0x37, 0x13, 0x12, 0x27, 0x32, 0x31, 0x49, 0x2e, 0x2a, 0x00, 0x02, 0x00, 0x72, 0x02, 0x9c, 0x02, 0x95, 0x05, 0xe0, 0x00, 0x09, 0x00, 0x15, 0x00, 0x00, 0x13, 0x11, 0x33, 0x32, 0x37, 0x36, 0x34, 0x27, 0x26, 0x23, 0x25, 0x21, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x11, 0x23, 0xe5, 0x90, 0x50, 0x2b, 0x2c, 0x2c, 0x2b, 0x50, 0xfe, 0xfd, 0x01, 0x03, 0x8e, 0x49, 0x49, 0x49, 0x49, 0x8e, 0x90, 0x73, 0x05, 0x83, 0xfe, 0xc6, 0x29, 0x29, 0x96, 0x29, 0x29, 0x5d, 0x3f, 0x40, 0xf6, 0x40, 0x3f, 0xfe, 0xb0, 0x00, 0x00, 0x02, 0x00, 0x72, 0x02, 0x9c, 0x03, 0x06, 0x05, 0xe0, 0x00, 0x17, 0x00, 0x20, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x23, 0x27, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x02, 0x04, 0x25, 0x22, 0x23, 0x23, 0x74, 0x7a, 0x6d, 0x2a, 0x27, 0x28, 0x44, 0x7c, 0x73, 0x01, 0x03, 0x91, 0x48, 0x47, 0x25, 0x26, 0xfe, 0x9b, 0x90, 0x52, 0x55, 0x55, 0x52, 0x04, 0x24, 0x0c, 0x29, 0x28, 0x47, 0xe4, 0xd6, 0x54, 0x1c, 0x1b, 0xfe, 0x9f, 0x03, 0x44, 0x3c, 0x3c, 0x79, 0x4f, 0x34, 0x34, 0x01, 0x4b, 0xfe, 0xd7, 0x4c, 0x49, 0x4a, 0x4a, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x02, 0x9c, 0x02, 0xc9, 0x05, 0xe0, 0x00, 0x07, 0x00, 0x00, 0x03, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x04, 0x02, 0xcd, 0xfe, 0xd3, 0x73, 0xfe, 0xd3, 0x05, 0xe0, 0x5f, 0xfd, 0x1b, 0x02, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x02, 0x8c, 0x02, 0xed, 0x05, 0xe0, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x65, 0x73, 0x63, 0x6e, 0x6f, 0x31, 0x31, 0x73, 0x52, 0x52, 0xfe, 0xc0, 0x52, 0x52, 0x05, 0xe0, 0xfe, 0x04, 0x86, 0x76, 0x3b, 0x3b, 0x86, 0x01, 0xfc, 0xfd, 0xf6, 0xa3, 0x54, 0x53, 0x53, 0x54, 0xa3, 0x00, 0x00, 0x01, 0x00, 0x26, 0x02, 0x9c, 0x04, 0x57, 0x05, 0xe0, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x1b, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0x0b, 0x01, 0x23, 0x27, 0x73, 0xb2, 0xb1, 0x81, 0xb2, 0xb2, 0x75, 0xd6, 0x90, 0xb2, 0xb5, 0x90, 0x05, 0xe0, 0xfd, 0x3d, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0xc3, 0xfc, 0xbc, 0x02, 0xd6, 0xfd, 0x2a, 0x00, 0x02, 0x00, 0x45, 0x02, 0x8c, 0x02, 0x5e, 0x05, 0x1e, 0x00, 0x0c, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x37, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x8e, 0x7e, 0x31, 0x31, 0x4a, 0x3e, 0x57, 0x34, 0x35, 0x68, 0x68, 0x24, 0x35, 0x36, 0x4c, 0x63, 0x73, 0x90, 0x8f, 0x92, 0x5f, 0x56, 0x36, 0x34, 0x33, 0x30, 0x3a, 0x36, 0x35, 0x33, 0x8a, 0x44, 0x44, 0x03, 0xd7, 0x1c, 0x1d, 0x45, 0x37, 0x40, 0x3d, 0x3d, 0x64, 0x17, 0x2b, 0xfe, 0x9a, 0x5f, 0x39, 0x1b, 0x1b, 0x6c, 0x5b, 0x69, 0x6c, 0x0a, 0x47, 0x4e, 0x0d, 0x0d, 0x1a, 0x60, 0x15, 0x0b, 0x0b, 0x46, 0x47, 0x00, 0x02, 0x00, 0x45, 0x02, 0x8c, 0x02, 0x5e, 0x05, 0x1e, 0x00, 0x0c, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x07, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x16, 0x7e, 0x31, 0x31, 0x4a, 0x3f, 0x56, 0x34, 0x35, 0x69, 0x69, 0x24, 0x35, 0x36, 0x4c, 0x62, 0x3a, 0x39, 0x48, 0x47, 0x8f, 0x92, 0x5f, 0x56, 0x36, 0x34, 0x33, 0x30, 0x3a, 0x36, 0x36, 0x32, 0x8a, 0x44, 0x45, 0x03, 0xd3, 0x1c, 0x1d, 0x45, 0x37, 0x40, 0x3d, 0x3c, 0x65, 0x17, 0x2b, 0x01, 0x66, 0x5f, 0x39, 0x1b, 0x1b, 0x36, 0x36, 0x5a, 0x6a, 0x36, 0x36, 0x0a, 0x47, 0x4e, 0x0d, 0x0d, 0x1a, 0x60, 0x15, 0x0c, 0x0a, 0x46, 0x47, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x78, 0x05, 0x1e, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x35, 0x33, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x04, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x34, 0x27, 0x26, 0x22, 0x07, 0x02, 0x0f, 0x69, 0x69, 0x21, 0x31, 0x33, 0x46, 0x73, 0x49, 0x48, 0x48, 0x49, 0x73, 0x46, 0x33, 0x31, 0xfe, 0xbe, 0x2f, 0x2f, 0xa6, 0x30, 0x2f, 0x2f, 0x30, 0xa6, 0x2f, 0x04, 0xb0, 0x5f, 0xfd, 0x8d, 0x5e, 0x38, 0x1b, 0x1b, 0x5a, 0x5b, 0x01, 0x28, 0x5b, 0x5a, 0x1b, 0x1b, 0xa1, 0xe4, 0x41, 0x40, 0x40, 0x41, 0xe4, 0x41, 0x40, 0x40, 0x00, 0x00, 0x03, 0x00, 0x45, 0x02, 0x8c, 0x04, 0x38, 0x05, 0x1e, 0x00, 0x33, 0x00, 0x3c, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x21, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x25, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3f, 0x01, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x02, 0x49, 0x2a, 0x79, 0x4b, 0x7f, 0x4b, 0x4c, 0x01, 0xe0, 0x06, 0x3a, 0x3a, 0x68, 0x3a, 0x72, 0x39, 0x39, 0x3b, 0x3b, 0x3b, 0x60, 0x46, 0x46, 0x2c, 0x29, 0x3d, 0x3d, 0x52, 0x6b, 0x77, 0x48, 0x47, 0x8f, 0x92, 0x2f, 0x30, 0x55, 0x37, 0x67, 0x2f, 0x38, 0x6c, 0x34, 0x50, 0x78, 0xfe, 0x47, 0x01, 0x2e, 0x2f, 0x4d, 0x57, 0x35, 0x34, 0x08, 0xcd, 0x7f, 0x30, 0x31, 0x25, 0x24, 0x3f, 0x57, 0x35, 0x34, 0x02, 0xf3, 0x33, 0x34, 0x51, 0x52, 0x8c, 0x32, 0x6b, 0x38, 0x38, 0x1e, 0x1d, 0x61, 0x18, 0x0c, 0x0c, 0x22, 0x21, 0x43, 0x43, 0x22, 0x21, 0x68, 0x5e, 0x6a, 0x36, 0x36, 0x0a, 0x47, 0x27, 0x27, 0x1a, 0x1a, 0x60, 0x15, 0x16, 0x36, 0xda, 0x54, 0x32, 0x33, 0x31, 0x31, 0x58, 0x36, 0x1c, 0x1d, 0x45, 0x37, 0x20, 0x20, 0x3d, 0x3c, 0x65, 0x17, 0x00, 0x00, 0x02, 0x00, 0x69, 0x02, 0x8c, 0x02, 0xa2, 0x06, 0x03, 0x00, 0x0b, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x32, 0x37, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x33, 0x02, 0x35, 0x2f, 0x2f, 0xa6, 0x30, 0x2e, 0x2e, 0x30, 0xa6, 0x2f, 0xfe, 0xcd, 0x20, 0x65, 0x45, 0x74, 0x48, 0x48, 0x48, 0x48, 0x74, 0x45, 0x65, 0x20, 0x6a, 0x6a, 0x03, 0x63, 0xe4, 0x40, 0x41, 0x41, 0x40, 0xe4, 0x40, 0x41, 0x41, 0x01, 0x8d, 0x38, 0x36, 0x5a, 0x5b, 0xfe, 0xd8, 0x5b, 0x5a, 0x36, 0x38, 0x5e, 0x03, 0x67, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x78, 0x06, 0x03, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x04, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x34, 0x27, 0x26, 0x22, 0x07, 0x02, 0x0f, 0x69, 0x69, 0x21, 0x31, 0x33, 0x46, 0x73, 0x48, 0x49, 0x49, 0x48, 0x73, 0x46, 0x33, 0x31, 0xfe, 0xbe, 0x2f, 0x2f, 0xa6, 0x30, 0x2f, 0x2f, 0x30, 0xa6, 0x2f, 0x04, 0xb0, 0x01, 0x53, 0xfc, 0x99, 0x5e, 0x38, 0x1b, 0x1b, 0x5a, 0x5b, 0x01, 0x28, 0x5b, 0x5a, 0x1b, 0x1b, 0xa1, 0xe4, 0x40, 0x41, 0x41, 0x40, 0xe4, 0x40, 0x41, 0x41, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x8d, 0x05, 0x1e, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x00, 0x01, 0x15, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x07, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x02, 0x8c, 0xfe, 0x21, 0x07, 0x3a, 0x3a, 0x68, 0x3c, 0x39, 0x37, 0x38, 0x38, 0x3b, 0x3b, 0x3d, 0x98, 0x58, 0x59, 0x54, 0x54, 0x8f, 0x80, 0x4b, 0x4a, 0x68, 0x01, 0x2f, 0x2e, 0x4e, 0x57, 0x34, 0x35, 0x08, 0x03, 0xef, 0x32, 0x6a, 0x38, 0x38, 0x0f, 0x0e, 0x1d, 0x61, 0x18, 0x0c, 0x0c, 0x57, 0x57, 0x95, 0x9a, 0x5b, 0x5a, 0x51, 0x52, 0x6d, 0x54, 0x33, 0x32, 0x31, 0x30, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x8d, 0x05, 0x1e, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x35, 0x21, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x40, 0x01, 0xe0, 0x07, 0x75, 0x67, 0x3d, 0x70, 0x38, 0x39, 0x76, 0x3c, 0x98, 0xb1, 0xa8, 0x8f, 0x80, 0x95, 0x68, 0x01, 0x5e, 0x4d, 0x58, 0x69, 0x07, 0x03, 0xbb, 0x32, 0x6b, 0x6f, 0x1d, 0x1d, 0x61, 0x18, 0x18, 0xae, 0x95, 0x9a, 0xb5, 0xa3, 0x6d, 0x54, 0x65, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0x02, 0x8c, 0x02, 0x25, 0x05, 0x1f, 0x00, 0x32, 0x00, 0x00, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0xe0, 0x40, 0x22, 0x21, 0x41, 0x3f, 0x6f, 0x2b, 0x31, 0x30, 0x37, 0x37, 0x5b, 0x28, 0x43, 0x28, 0x28, 0x27, 0x26, 0x42, 0x58, 0x54, 0x4e, 0x29, 0x2c, 0x30, 0x30, 0x55, 0x35, 0x31, 0x2f, 0x29, 0x33, 0x30, 0x30, 0x2e, 0x87, 0x91, 0x26, 0x28, 0x03, 0xee, 0x0e, 0x24, 0x24, 0x34, 0x4f, 0x2c, 0x2c, 0x07, 0x07, 0x0d, 0x5e, 0x11, 0x0e, 0x19, 0x1a, 0x24, 0x27, 0x19, 0x19, 0x55, 0x1d, 0x1f, 0x31, 0x33, 0x1f, 0x20, 0x0b, 0x0a, 0x15, 0x60, 0x10, 0x07, 0x08, 0x66, 0x61, 0x3c, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x49, 0x02, 0x8c, 0x02, 0x24, 0x05, 0x1f, 0x00, 0x31, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x8f, 0x3f, 0x44, 0x41, 0x40, 0x6e, 0x2b, 0x31, 0x30, 0x38, 0x37, 0x2d, 0x2e, 0x29, 0x43, 0x4f, 0x26, 0x26, 0x42, 0x58, 0x54, 0x4d, 0x29, 0x2d, 0x30, 0x31, 0x55, 0x34, 0x31, 0x30, 0x28, 0x33, 0x5f, 0x2e, 0x86, 0x4a, 0x49, 0x27, 0x27, 0x03, 0xbc, 0x0d, 0x48, 0x34, 0x4f, 0x2d, 0x2b, 0x06, 0x07, 0x0e, 0x5d, 0x10, 0x07, 0x08, 0x34, 0x24, 0x27, 0x19, 0x19, 0x55, 0x1c, 0x20, 0x31, 0x32, 0x20, 0x1f, 0x0a, 0x0b, 0x14, 0x60, 0x0f, 0x10, 0x33, 0x33, 0x61, 0x3c, 0x29, 0x29, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x01, 0xad, 0x02, 0x78, 0x05, 0x1e, 0x00, 0x0d, 0x00, 0x31, 0x00, 0x00, 0x00, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x17, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x35, 0x33, 0x02, 0x0f, 0x2e, 0x2f, 0x55, 0x53, 0x2f, 0x2f, 0x2f, 0x2f, 0x53, 0x55, 0x2f, 0x97, 0x48, 0x48, 0x95, 0x37, 0x31, 0x31, 0x2e, 0x2e, 0x2d, 0x2d, 0x2e, 0x67, 0x33, 0x33, 0x20, 0x32, 0x33, 0x46, 0x75, 0x47, 0x48, 0x48, 0x47, 0x75, 0x46, 0x33, 0x32, 0x20, 0x69, 0x03, 0x6d, 0xe0, 0x3d, 0x3e, 0x3e, 0x3d, 0xe0, 0x3d, 0x3e, 0x3e, 0x46, 0xa0, 0x4e, 0x4f, 0x09, 0x08, 0x10, 0x65, 0x19, 0x0c, 0x0b, 0x34, 0x35, 0x6b, 0x33, 0x37, 0x1c, 0x1b, 0x58, 0x58, 0x01, 0x22, 0x58, 0x58, 0x1b, 0x1c, 0x37, 0x5f, 0x00, 0x02, 0x00, 0x6d, 0x01, 0xa8, 0x00, 0xd7, 0x05, 0x0f, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x15, 0x35, 0x33, 0x15, 0x6e, 0x68, 0x68, 0x68, 0x05, 0x0f, 0xfd, 0x8d, 0xf4, 0x82, 0x82, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x9d, 0x06, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x69, 0x6a, 0x01, 0x37, 0x85, 0xfe, 0xaf, 0x01, 0x5f, 0x88, 0xfe, 0xbe, 0x6a, 0x06, 0x03, 0xfd, 0xfe, 0x01, 0x0e, 0xfe, 0xdb, 0xfe, 0xb2, 0x01, 0x32, 0xfe, 0xce, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x04, 0x09, 0x05, 0x1e, 0x00, 0x22, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x02, 0x6d, 0x68, 0x41, 0x44, 0x50, 0x5d, 0x6a, 0x6a, 0x23, 0x64, 0x45, 0x44, 0x61, 0x18, 0x27, 0x6d, 0x49, 0x64, 0x6b, 0x68, 0x41, 0x43, 0x50, 0x5f, 0x03, 0xfe, 0xfe, 0x9e, 0x01, 0x77, 0x5b, 0x57, 0x6b, 0x5c, 0xfe, 0x9e, 0x02, 0x73, 0x61, 0x39, 0x37, 0x45, 0x42, 0x45, 0x42, 0x89, 0x7e, 0xfe, 0x85, 0x01, 0x77, 0x5a, 0x58, 0x6b, 0x00, 0x01, 0x00, 0x69, 0x01, 0xad, 0x02, 0x7e, 0x05, 0x1e, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x02, 0x7d, 0x2f, 0x2e, 0x66, 0x90, 0x84, 0x3c, 0x2b, 0x46, 0x47, 0x54, 0x61, 0x6a, 0x6a, 0x25, 0x32, 0x33, 0x43, 0x6d, 0x38, 0x38, 0x04, 0x17, 0xfe, 0x7a, 0x78, 0x36, 0x36, 0x58, 0x36, 0x56, 0x01, 0x82, 0x59, 0x59, 0x6b, 0x5c, 0xfe, 0x9e, 0x02, 0x73, 0x61, 0x38, 0x1c, 0x1c, 0x42, 0x44, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x88, 0x05, 0x1e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x64, 0x54, 0x62, 0x61, 0x55, 0x53, 0x61, 0x61, 0x53, 0x87, 0x9c, 0x9c, 0x87, 0x89, 0x9b, 0x9b, 0x04, 0xc7, 0x81, 0x71, 0x71, 0x81, 0x82, 0x70, 0x6f, 0x83, 0x57, 0xae, 0x9b, 0x9a, 0xaf, 0xaf, 0x9a, 0x9b, 0xae, 0x00, 0x01, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x37, 0x05, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x40, 0x2b, 0x2e, 0x2e, 0x31, 0x94, 0x55, 0x55, 0x54, 0x54, 0x90, 0x34, 0x30, 0x2e, 0x2c, 0x2c, 0x2d, 0x2c, 0x2e, 0x65, 0x38, 0x38, 0x38, 0x38, 0x65, 0x2e, 0x2c, 0x2d, 0x2c, 0x04, 0xf7, 0x14, 0x0a, 0x09, 0x58, 0x58, 0x99, 0x97, 0x59, 0x59, 0x0a, 0x0a, 0x14, 0x5f, 0x18, 0x0c, 0x0c, 0x3f, 0x40, 0xe6, 0x40, 0x3f, 0x0c, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x03, 0xd5, 0x02, 0x88, 0x05, 0x1e, 0x00, 0x10, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x15, 0x23, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x30, 0x02, 0x18, 0x30, 0x31, 0xa7, 0x31, 0x31, 0x6e, 0x9b, 0x89, 0x87, 0x4f, 0x4d, 0x03, 0xd5, 0x6f, 0x42, 0x41, 0x41, 0x40, 0x71, 0x9b, 0xae, 0x57, 0x57, 0x9b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x88, 0x03, 0xd5, 0x00, 0x10, 0x00, 0x00, 0x13, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x30, 0xaf, 0x30, 0x31, 0xa7, 0x31, 0x31, 0x6e, 0x9b, 0x88, 0x88, 0x4e, 0x4e, 0x03, 0xd5, 0x6f, 0x42, 0x41, 0x41, 0x40, 0x71, 0x9b, 0xae, 0x57, 0x57, 0x9b, 0x00, 0x02, 0x00, 0x69, 0x01, 0xad, 0x02, 0xa2, 0x05, 0x1e, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x26, 0x24, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x32, 0x37, 0xd3, 0x6a, 0x6a, 0x20, 0x65, 0x45, 0x74, 0x48, 0x48, 0x48, 0x48, 0x74, 0x45, 0x65, 0x01, 0x42, 0x2f, 0x2f, 0xa6, 0x30, 0x2e, 0x2e, 0x30, 0xa6, 0x2f, 0x02, 0xfa, 0xfe, 0xb3, 0x03, 0x62, 0x5f, 0x38, 0x36, 0x5a, 0x5b, 0xfe, 0xd8, 0x5b, 0x5a, 0x36, 0xa1, 0xe4, 0x40, 0x41, 0x41, 0x40, 0xe4, 0x40, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0x02, 0x9c, 0x01, 0xac, 0x05, 0xc1, 0x00, 0x14, 0x00, 0x00, 0x13, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0xd4, 0xd8, 0xd8, 0x2c, 0x40, 0x6c, 0x6c, 0x78, 0x2e, 0x2e, 0x4c, 0x4c, 0x05, 0xc1, 0xb2, 0x50, 0xfe, 0xac, 0x4d, 0x2c, 0x56, 0x2d, 0x2c, 0x76, 0x01, 0x54, 0x50, 0xb2, 0x00, 0x00, 0x01, 0x00, 0x63, 0x02, 0x8c, 0x02, 0x77, 0x05, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x63, 0x68, 0x23, 0x24, 0x46, 0x54, 0x31, 0x31, 0x69, 0x69, 0x26, 0x32, 0x32, 0x43, 0x6d, 0x71, 0x03, 0x94, 0x01, 0x7b, 0xfe, 0x88, 0x59, 0x2c, 0x2d, 0x36, 0x35, 0x5c, 0x01, 0x63, 0xfd, 0x8d, 0x60, 0x39, 0x1c, 0x1b, 0x86, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x02, 0xc7, 0x02, 0xee, 0x04, 0xd4, 0x00, 0x16, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x21, 0x35, 0x21, 0x15, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x01, 0xe3, 0xfe, 0x80, 0x01, 0x7c, 0x5b, 0x2d, 0x2d, 0x36, 0x36, 0x5d, 0xfe, 0x98, 0x02, 0x7b, 0x62, 0x3a, 0x38, 0x44, 0x44, 0x02, 0xc7, 0x67, 0x23, 0x22, 0x46, 0x53, 0x31, 0x30, 0x67, 0x67, 0x25, 0x64, 0x41, 0x6c, 0x38, 0x38, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x8d, 0x04, 0x09, 0x05, 0x10, 0x00, 0x28, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x02, 0x16, 0x27, 0x36, 0x37, 0x4a, 0x63, 0x6c, 0x6a, 0x20, 0x20, 0x42, 0x51, 0x30, 0x2f, 0x68, 0x20, 0x21, 0x43, 0x50, 0x2f, 0x30, 0x68, 0x68, 0x24, 0x32, 0x32, 0x44, 0x46, 0x61, 0x03, 0x15, 0x45, 0x21, 0x22, 0x8a, 0x7f, 0x01, 0x7a, 0xfe, 0x89, 0x5b, 0x2b, 0x2c, 0x36, 0x34, 0x5c, 0x01, 0x63, 0xfe, 0x89, 0x5b, 0x2b, 0x2c, 0x36, 0x36, 0x5a, 0x01, 0x63, 0xfd, 0x8d, 0x62, 0x3b, 0x1b, 0x1c, 0x46, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x02, 0x9c, 0x02, 0x8d, 0x05, 0x0f, 0x00, 0x06, 0x00, 0x00, 0x13, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0x22, 0x6f, 0xc7, 0xc6, 0x6e, 0xed, 0x8e, 0x05, 0x0f, 0xfd, 0xf2, 0x02, 0x0e, 0xfd, 0x8d, 0x00, 0x02, 0x00, 0x6c, 0x01, 0xad, 0x02, 0x92, 0x06, 0x0b, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x00, 0x13, 0x11, 0x23, 0x11, 0x10, 0x33, 0x32, 0x17, 0x16, 0x07, 0x16, 0x17, 0x12, 0x21, 0x26, 0x27, 0x16, 0x33, 0x32, 0x35, 0x34, 0x05, 0x35, 0x16, 0x35, 0x34, 0x23, 0x22, 0x15, 0xd5, 0x68, 0xf1, 0xf6, 0x01, 0x01, 0x63, 0x9e, 0x01, 0x01, 0xfe, 0xed, 0x77, 0x34, 0x3f, 0x71, 0xa3, 0xfe, 0xf8, 0xcf, 0x85, 0x95, 0x02, 0xc3, 0xfe, 0xea, 0x03, 0x5e, 0x01, 0x00, 0xd8, 0x99, 0x38, 0x33, 0x95, 0xfe, 0xf6, 0x01, 0xb8, 0x61, 0xb0, 0x9e, 0x0c, 0x5f, 0x04, 0xb7, 0x7b, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x01, 0xad, 0x02, 0x8d, 0x05, 0x0f, 0x00, 0x0e, 0x00, 0x00, 0x1b, 0x02, 0x33, 0x01, 0x15, 0x23, 0x35, 0x03, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0xcc, 0x8c, 0xc6, 0x6e, 0xff, 0x00, 0x68, 0xa7, 0x19, 0x36, 0x1c, 0x28, 0x6f, 0x04, 0xad, 0xfe, 0x7c, 0x01, 0xe6, 0xfd, 0x8d, 0xef, 0xef, 0x01, 0xd4, 0x47, 0x58, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x88, 0x05, 0xef, 0x00, 0x1b, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x35, 0x34, 0x33, 0x32, 0x17, 0x01, 0x06, 0x07, 0x06, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x02, 0x3a, 0x3b, 0x87, 0x90, 0x96, 0x76, 0x42, 0x51, 0x4d, 0x4f, 0xfe, 0xf1, 0x4e, 0x4e, 0x4e, 0x1e, 0x2a, 0x58, 0xfa, 0x7d, 0x45, 0xfe, 0xea, 0x26, 0x1f, 0x31, 0x30, 0x31, 0x55, 0x53, 0x61, 0x33, 0x37, 0x48, 0x24, 0x05, 0x72, 0x28, 0x42, 0x34, 0x1a, 0x15, 0x3f, 0x4b, 0x9c, 0x94, 0x57, 0x58, 0x58, 0x57, 0x9a, 0x72, 0x5d, 0x24, 0x14, 0x2c, 0x4f, 0x98, 0x27, 0xfe, 0xf8, 0x11, 0x28, 0x40, 0xe4, 0x3f, 0x41, 0x82, 0x6a, 0x70, 0x36, 0x39, 0x06, 0x04, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x01, 0xad, 0x02, 0xbc, 0x05, 0x14, 0x00, 0x0a, 0x00, 0x29, 0x00, 0x00, 0x01, 0x22, 0x15, 0x11, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x15, 0x23, 0x35, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x11, 0x34, 0x01, 0xd6, 0x25, 0x37, 0x35, 0x31, 0x32, 0x28, 0x1e, 0x4f, 0x49, 0x4d, 0x4d, 0x49, 0x74, 0x68, 0x71, 0x4b, 0x4d, 0x4d, 0x3a, 0x5d, 0x25, 0x21, 0x30, 0x30, 0x2c, 0x3f, 0x04, 0xbc, 0x51, 0xfe, 0x7f, 0x3a, 0x35, 0x7d, 0x74, 0x3f, 0x33, 0x58, 0x4a, 0x4f, 0xa5, 0x98, 0x5a, 0x55, 0xe2, 0xe1, 0x55, 0x58, 0x9a, 0xa0, 0x52, 0x3d, 0x10, 0x5c, 0x0c, 0x2c, 0x41, 0x6a, 0x71, 0x40, 0x3a, 0x01, 0x81, 0xa9, 0x00, 0x01, 0x00, 0x21, 0x01, 0xad, 0x02, 0x7e, 0x05, 0x10, 0x00, 0x17, 0x00, 0x00, 0x01, 0x27, 0x03, 0x23, 0x13, 0x03, 0x26, 0x2b, 0x01, 0x35, 0x17, 0x16, 0x1f, 0x01, 0x13, 0x33, 0x03, 0x13, 0x16, 0x3b, 0x01, 0x15, 0x27, 0x26, 0x01, 0x9f, 0x55, 0xad, 0x7c, 0xf7, 0x68, 0x1c, 0x57, 0x1c, 0x28, 0x93, 0x24, 0x54, 0xae, 0x7b, 0xf5, 0x66, 0x1c, 0x57, 0x1c, 0x27, 0x93, 0x02, 0x10, 0xd7, 0xfe, 0xc6, 0x01, 0xbc, 0x01, 0x07, 0x47, 0x58, 0x01, 0x04, 0x5d, 0xd7, 0x01, 0x3a, 0xfe, 0x44, 0xfe, 0xf8, 0x46, 0x59, 0x02, 0x04, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6d, 0x00, 0x00, 0x00, 0xd7, 0x03, 0x67, 0x12, 0x07, 0x07, 0xa1, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x01, 0xdd, 0x02, 0x82, 0x12, 0x07, 0x02, 0x75, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xf0, 0x02, 0x77, 0x02, 0x73, 0x12, 0x07, 0x05, 0x0e, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x22, 0x00, 0x00, 0x02, 0x8d, 0x02, 0x73, 0x12, 0x07, 0x05, 0x11, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, 0xff, 0x11, 0x02, 0x92, 0x03, 0x6f, 0x12, 0x07, 0x05, 0x12, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x12, 0xff, 0x11, 0x02, 0x8d, 0x02, 0x73, 0x12, 0x07, 0x05, 0x13, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6c, 0xff, 0x11, 0x02, 0xa4, 0x02, 0x82, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x10, 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x23, 0x11, 0x34, 0x05, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0xa0, 0x22, 0x56, 0x21, 0x68, 0x73, 0x90, 0x90, 0x73, 0x47, 0x63, 0x22, 0x68, 0x01, 0xcb, 0x5f, 0x52, 0x52, 0x60, 0x60, 0x52, 0x52, 0x5f, 0x02, 0x03, 0x39, 0x32, 0x14, 0xb5, 0xfe, 0xd8, 0xb6, 0x37, 0x38, 0xfe, 0xb3, 0x02, 0x22, 0x81, 0x7b, 0x71, 0x82, 0x82, 0x71, 0x72, 0x81, 0x81, 0xff, 0xff, 0x00, 0x3f, 0xff, 0x11, 0x02, 0xbc, 0x02, 0x78, 0x12, 0x07, 0x05, 0x15, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x21, 0xff, 0x11, 0x02, 0x7e, 0x02, 0x74, 0x12, 0x07, 0x05, 0x16, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2d, 0x04, 0x7b, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x00, 0x13, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0xa7, 0xe5, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0x33, 0xa0, 0x70, 0xba, 0xe2, 0xe3, 0xb9, 0x70, 0xa0, 0x33, 0xa6, 0xa6, 0x95, 0x86, 0x85, 0x94, 0x94, 0x85, 0x86, 0x95, 0x02, 0x46, 0x01, 0x1e, 0x01, 0x17, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0xbd, 0xbf, 0x5b, 0x63, 0x62, 0xfe, 0xc6, 0xfe, 0xfd, 0xfe, 0xfc, 0xfe, 0xc6, 0x62, 0x63, 0xaa, 0x02, 0x23, 0xc8, 0xdc, 0xdc, 0xc8, 0xc7, 0xdc, 0xdc, 0xff, 0xff, 0x00, 0x72, 0x02, 0x9c, 0x02, 0xf8, 0x05, 0xe0, 0x10, 0x06, 0x04, 0xea, 0x00, 0x00, 0x00, 0x01, 0x00, 0x68, 0x00, 0x00, 0x02, 0x44, 0x04, 0x60, 0x00, 0x13, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x11, 0x68, 0x01, 0xdc, 0x98, 0x98, 0x98, 0x98, 0xfe, 0x24, 0x9f, 0x9f, 0x9f, 0x03, 0xbc, 0xa4, 0xa4, 0xfe, 0xac, 0xa4, 0xfe, 0xe0, 0xa4, 0xa4, 0x01, 0x20, 0xa4, 0x01, 0x54, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2d, 0xfe, 0x56, 0x04, 0xa1, 0x04, 0x7b, 0x00, 0x19, 0x00, 0x22, 0x00, 0x2b, 0x00, 0x00, 0x25, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x01, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x21, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x01, 0x4e, 0xa7, 0x7a, 0x7a, 0xa7, 0x34, 0x9f, 0x6f, 0xb7, 0x73, 0x5c, 0x13, 0x77, 0x74, 0x0a, 0x68, 0x73, 0xb7, 0x6f, 0x9f, 0x01, 0xfe, 0xfd, 0xcf, 0x07, 0x43, 0x4b, 0x84, 0x83, 0x4c, 0x42, 0xfd, 0xda, 0x02, 0x29, 0x0e, 0x37, 0x4c, 0x83, 0x84, 0x4b, 0x38, 0xa8, 0xfd, 0xae, 0x03, 0xae, 0x90, 0x01, 0xcc, 0xaa, 0x64, 0x61, 0xa2, 0x82, 0xc3, 0x90, 0xea, 0x95, 0xa2, 0x61, 0x01, 0xc0, 0xae, 0x66, 0x74, 0x74, 0x66, 0x01, 0x3e, 0x84, 0x56, 0x74, 0x74, 0x56, 0x00, 0x00, 0x00, 0x01, 0x00, 0x82, 0xfe, 0x56, 0x01, 0xf8, 0x06, 0x14, 0x00, 0x10, 0x00, 0x00, 0x25, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x27, 0x37, 0x23, 0x11, 0x33, 0x11, 0x01, 0xf7, 0x93, 0xa2, 0x40, 0x2c, 0x5f, 0x22, 0x26, 0x03, 0x01, 0xa5, 0xa5, 0x9a, 0xae, 0xd6, 0xc0, 0x9c, 0x30, 0x36, 0x94, 0x14, 0x06, 0x14, 0xfa, 0x86, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x78, 0x05, 0x1e, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x00, 0x13, 0x15, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x24, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x32, 0x37, 0xa8, 0x68, 0x68, 0x22, 0x32, 0x32, 0x46, 0x73, 0x48, 0x49, 0x49, 0x48, 0x73, 0x46, 0x32, 0x32, 0x01, 0x42, 0x30, 0x2f, 0xa5, 0x30, 0x30, 0x30, 0x30, 0xa5, 0x2f, 0x02, 0xfa, 0x5f, 0x02, 0x73, 0x5e, 0x38, 0x1b, 0x1b, 0x5a, 0x5b, 0xfe, 0xd8, 0x5b, 0x5a, 0x1b, 0x1b, 0xa1, 0xe4, 0x41, 0x40, 0x40, 0x41, 0xe4, 0x41, 0x40, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x37, 0x05, 0x1e, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x02, 0x36, 0x2c, 0x2c, 0x2d, 0x2d, 0x66, 0x38, 0x38, 0x38, 0x38, 0x66, 0x2d, 0x2d, 0x2c, 0x2c, 0x2b, 0x5e, 0x35, 0x8f, 0xa9, 0xab, 0x94, 0x30, 0x2e, 0x2e, 0x04, 0xf7, 0x60, 0x18, 0x0c, 0x0c, 0x40, 0x3f, 0xe6, 0x3f, 0x40, 0x0c, 0x0c, 0x18, 0x5f, 0x14, 0x14, 0xb2, 0x97, 0x99, 0xb0, 0x09, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x4b, 0x02, 0x37, 0x05, 0x1e, 0x00, 0x07, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x35, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x07, 0x34, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x23, 0x22, 0x01, 0x37, 0x22, 0x2b, 0x53, 0x01, 0x4a, 0x3a, 0x2f, 0x04, 0x56, 0x07, 0x20, 0x1c, 0x54, 0xab, 0x94, 0x2f, 0x2f, 0x2c, 0x2d, 0x2a, 0x2f, 0x2c, 0x2d, 0x66, 0x38, 0x38, 0x38, 0x02, 0x06, 0x2f, 0x6f, 0xa9, 0x01, 0x01, 0xbd, 0x2e, 0x02, 0xee, 0x0b, 0x20, 0x2a, 0x9a, 0x20, 0x26, 0x02, 0x3b, 0x2f, 0x13, 0x1d, 0x5a, 0x96, 0x99, 0xb0, 0x09, 0x0a, 0x14, 0x60, 0x17, 0x0d, 0x0c, 0x3f, 0x40, 0xe6, 0x40, 0x02, 0x05, 0x62, 0x8a, 0x69, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x88, 0x06, 0x03, 0x00, 0x11, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x37, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x27, 0x07, 0x27, 0x37, 0x27, 0x33, 0x17, 0x37, 0x17, 0x07, 0x01, 0xdb, 0x1d, 0x18, 0x19, 0x17, 0x5f, 0x34, 0x35, 0x63, 0x53, 0x51, 0x63, 0x0f, 0x0f, 0x05, 0x47, 0x21, 0x20, 0x51, 0x50, 0x82, 0x84, 0xa0, 0x9c, 0x7e, 0x0a, 0x0f, 0x0e, 0x19, 0x5a, 0xb5, 0x13, 0x9f, 0x67, 0x82, 0x48, 0xbc, 0x13, 0xa7, 0x04, 0x9c, 0x0a, 0x04, 0x05, 0x3d, 0x3c, 0x6d, 0x6a, 0x7c, 0x7c, 0x6a, 0x44, 0x35, 0x34, 0xa5, 0x50, 0x51, 0x50, 0x61, 0x8f, 0x57, 0x57, 0xae, 0x8f, 0x8c, 0xae, 0x02, 0x01, 0x03, 0x65, 0x3c, 0x38, 0x33, 0x72, 0x51, 0x3e, 0x36, 0x37, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0x02, 0x8c, 0x02, 0x25, 0x05, 0x1f, 0x00, 0x31, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x06, 0x01, 0x90, 0x47, 0x26, 0x28, 0x49, 0x4a, 0x87, 0x2d, 0x30, 0x30, 0x32, 0x28, 0x30, 0x30, 0x35, 0x55, 0x31, 0x2f, 0x2c, 0x29, 0x4d, 0x54, 0x57, 0x42, 0x4d, 0x28, 0x27, 0x43, 0x29, 0x2e, 0x2d, 0x37, 0x37, 0x61, 0x2b, 0x6f, 0x40, 0x41, 0x44, 0x03, 0xee, 0x0d, 0x29, 0x29, 0x3c, 0x61, 0x33, 0x33, 0x08, 0x07, 0x10, 0x60, 0x15, 0x0a, 0x0b, 0x20, 0x1f, 0x33, 0x31, 0x1f, 0x1d, 0x55, 0x32, 0x27, 0x24, 0x1a, 0x19, 0x07, 0x07, 0x11, 0x5e, 0x0d, 0x0e, 0x2c, 0x2c, 0x4f, 0x34, 0x48, 0x00, 0x00, 0x01, 0x00, 0x1b, 0x02, 0x9c, 0x01, 0xb0, 0x06, 0x03, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, 0x33, 0x01, 0xaf, 0x64, 0x38, 0x16, 0x16, 0xac, 0xac, 0x69, 0x63, 0x63, 0x32, 0x31, 0x6b, 0x06, 0x03, 0x55, 0x17, 0x16, 0x3a, 0x38, 0x50, 0xfd, 0xdd, 0x02, 0x23, 0x50, 0x2c, 0x69, 0x2f, 0x30, 0x00, 0x00, 0x01, 0xff, 0xeb, 0x01, 0xad, 0x01, 0x3a, 0x05, 0x0f, 0x00, 0x15, 0x00, 0x00, 0x13, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0xd6, 0x2f, 0x2d, 0x67, 0x28, 0x1c, 0x3c, 0x15, 0x16, 0x67, 0x67, 0x68, 0x63, 0x02, 0x9c, 0x0b, 0x78, 0x36, 0x36, 0x58, 0x1b, 0x1c, 0x55, 0x0b, 0x50, 0x02, 0x23, 0xfd, 0xdd, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x01, 0xad, 0x02, 0x78, 0x05, 0x0f, 0x00, 0x0c, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x35, 0x23, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x02, 0x0f, 0xb2, 0x53, 0x2f, 0x2f, 0x2f, 0x2f, 0x53, 0x55, 0x2f, 0x2e, 0x69, 0x48, 0x48, 0x95, 0x37, 0x31, 0x31, 0x2e, 0x2e, 0x2d, 0x2d, 0x2e, 0x67, 0x33, 0x33, 0x20, 0x32, 0x33, 0x46, 0x75, 0x47, 0x48, 0x48, 0x47, 0x75, 0x03, 0xdd, 0xeb, 0x3e, 0x3d, 0xe0, 0x3d, 0x3e, 0x3e, 0x3d, 0x01, 0xa2, 0xfd, 0xdb, 0xa0, 0x4e, 0x4f, 0x08, 0x09, 0x10, 0x65, 0x19, 0x0c, 0x0b, 0x34, 0x35, 0x6b, 0x33, 0x37, 0x1c, 0x1b, 0x58, 0x58, 0x91, 0x82, 0x58, 0x58, 0x00, 0x00, 0x01, 0x00, 0x63, 0x01, 0xad, 0x02, 0x77, 0x05, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x63, 0x68, 0x23, 0x24, 0x46, 0x54, 0x31, 0x31, 0x69, 0x69, 0x26, 0x33, 0x31, 0x43, 0x6d, 0x71, 0x03, 0x94, 0x01, 0x7b, 0xfe, 0x88, 0x59, 0x2c, 0x2d, 0x36, 0x35, 0x5c, 0x01, 0x63, 0xfc, 0x9e, 0x01, 0x4f, 0x39, 0x1c, 0x1b, 0x86, 0x00, 0x00, 0x02, 0x00, 0x41, 0x02, 0x9c, 0x01, 0x6e, 0x06, 0x03, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x11, 0x33, 0x15, 0x23, 0x42, 0x66, 0x69, 0x5c, 0x5c, 0x69, 0x69, 0x69, 0x03, 0x99, 0x5c, 0x01, 0x1a, 0xfe, 0xe6, 0x5c, 0xfd, 0xfd, 0x02, 0x6a, 0x82, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6d, 0x02, 0x9c, 0x01, 0x58, 0x05, 0x0f, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0xd6, 0x15, 0x15, 0x3d, 0x1b, 0x28, 0x66, 0x5c, 0x05, 0x0f, 0xfe, 0x70, 0x55, 0x1c, 0x1b, 0x57, 0x6c, 0x77, 0x01, 0x90, 0x00, 0x00, 0x01, 0x00, 0x41, 0x02, 0x9c, 0x01, 0x6e, 0x05, 0x0f, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x42, 0x01, 0x2b, 0x5f, 0x5f, 0xfe, 0xd5, 0x64, 0x04, 0xb3, 0x5c, 0x5c, 0xfe, 0x45, 0x5c, 0x5c, 0x01, 0xbb, 0x00, 0x01, 0x00, 0x41, 0x02, 0x9c, 0x01, 0x6e, 0x05, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x21, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, 0x42, 0x01, 0x2b, 0x5f, 0x5f, 0x5f, 0x5f, 0xfe, 0xd5, 0x64, 0x64, 0x64, 0x04, 0xb3, 0x5c, 0x5c, 0xbe, 0x5c, 0xa1, 0x5c, 0x5c, 0xa1, 0x5c, 0xbe, 0x00, 0x00, 0x00, 0x03, 0xff, 0x67, 0x01, 0xad, 0x01, 0x3d, 0x06, 0x03, 0x00, 0x03, 0x00, 0x12, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x03, 0x22, 0x35, 0x34, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x27, 0x23, 0x22, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x6e, 0x68, 0x68, 0x5b, 0xac, 0x99, 0x6e, 0x68, 0x67, 0x6d, 0x0a, 0x1f, 0x2d, 0x12, 0x67, 0x44, 0x02, 0x02, 0x46, 0x3c, 0x15, 0x0a, 0x06, 0x03, 0x82, 0xfc, 0x2c, 0x7c, 0x73, 0x02, 0x73, 0xfd, 0x8d, 0x57, 0x3f, 0x23, 0x35, 0x98, 0x1d, 0x24, 0x1b, 0x0d, 0x00, 0x01, 0x00, 0x6d, 0x01, 0xad, 0x01, 0x58, 0x06, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x6e, 0x68, 0x15, 0x15, 0x3d, 0x1b, 0x28, 0x66, 0x5c, 0x02, 0xe4, 0x03, 0x1f, 0xfc, 0xe1, 0x53, 0x56, 0x1b, 0x1b, 0x58, 0x6c, 0x78, 0x00, 0x00, 0x01, 0x00, 0x51, 0x01, 0xad, 0x01, 0x3d, 0x06, 0x03, 0x00, 0x11, 0x00, 0x00, 0x01, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x27, 0x37, 0x23, 0x11, 0x33, 0x11, 0x01, 0x3d, 0x2e, 0x2f, 0x66, 0x28, 0x1c, 0x3b, 0x16, 0x18, 0x03, 0x02, 0x68, 0x68, 0x02, 0xf2, 0x61, 0x78, 0x36, 0x36, 0x58, 0x1b, 0x1e, 0x53, 0x0b, 0x03, 0x67, 0xfc, 0xef, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0x02, 0x9c, 0x02, 0x43, 0x05, 0x1e, 0x00, 0x05, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x15, 0x21, 0x66, 0x72, 0x01, 0x6b, 0xfe, 0x23, 0x05, 0x1e, 0xfd, 0xdd, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x69, 0x01, 0xad, 0x04, 0x09, 0x05, 0x1e, 0x00, 0x34, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x26, 0x37, 0x34, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x02, 0x5c, 0x27, 0x37, 0x36, 0x49, 0x64, 0x35, 0x36, 0x5c, 0x66, 0x91, 0x84, 0x3c, 0x2b, 0x01, 0x01, 0x41, 0x43, 0x50, 0x2f, 0x30, 0x68, 0x21, 0x20, 0x44, 0x50, 0x2f, 0x2e, 0x6a, 0x6a, 0x23, 0x32, 0x32, 0x45, 0x44, 0x31, 0x30, 0x04, 0x97, 0x45, 0x21, 0x21, 0x45, 0x44, 0x7e, 0xfe, 0x7a, 0x78, 0x6c, 0x58, 0x36, 0x56, 0x30, 0xe8, 0x3d, 0x2d, 0x5a, 0x58, 0x35, 0x36, 0x5c, 0xfe, 0x9e, 0x01, 0x77, 0x5b, 0x2c, 0x2b, 0x35, 0x36, 0x5c, 0xfe, 0x9e, 0x02, 0x73, 0x61, 0x39, 0x1c, 0x1b, 0x22, 0x23, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x01, 0xad, 0x04, 0x09, 0x05, 0x10, 0x00, 0x28, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x02, 0x16, 0x27, 0x36, 0x37, 0x4a, 0x63, 0x6c, 0x6a, 0x20, 0x20, 0x42, 0x51, 0x30, 0x2f, 0x68, 0x20, 0x21, 0x43, 0x50, 0x2f, 0x30, 0x68, 0x68, 0x24, 0x32, 0x32, 0x44, 0x46, 0x61, 0x03, 0x15, 0x45, 0x22, 0x21, 0x8a, 0x7e, 0x01, 0x7b, 0xfe, 0x89, 0x5b, 0x2b, 0x2c, 0x35, 0x35, 0x5c, 0x01, 0x63, 0xfe, 0x89, 0x5b, 0x2b, 0x2c, 0x36, 0x35, 0x5b, 0x01, 0x63, 0xfc, 0x9d, 0x01, 0x51, 0x3a, 0x1b, 0x1c, 0x46, 0x00, 0x00, 0x00, 0x01, 0xff, 0xeb, 0x01, 0xad, 0x02, 0x82, 0x05, 0x1e, 0x00, 0x1f, 0x00, 0x00, 0x13, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0xd6, 0x2f, 0x2d, 0x67, 0x28, 0x1c, 0x3c, 0x2b, 0x68, 0x26, 0x65, 0x42, 0x6e, 0x38, 0x39, 0x69, 0x23, 0x24, 0x46, 0x55, 0x30, 0x31, 0x02, 0x91, 0x78, 0x36, 0x36, 0x58, 0x36, 0x56, 0x02, 0x7e, 0x61, 0x38, 0x38, 0x42, 0x44, 0x81, 0xfe, 0x85, 0x01, 0x77, 0x59, 0x2c, 0x2d, 0x35, 0x36, 0x5c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x01, 0xad, 0x03, 0x00, 0x05, 0x1e, 0x00, 0x20, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x02, 0x15, 0x23, 0x23, 0x47, 0x54, 0x31, 0x30, 0x6a, 0x6a, 0x25, 0x32, 0x33, 0x43, 0x6d, 0x38, 0x38, 0x2b, 0x3c, 0x1c, 0x28, 0x66, 0x2e, 0x2f, 0x04, 0x13, 0x59, 0x2c, 0x2d, 0x35, 0x36, 0x5c, 0xfe, 0x9e, 0x02, 0x73, 0x61, 0x38, 0x1c, 0x1c, 0x42, 0x44, 0x81, 0xfe, 0x7a, 0x56, 0x36, 0x58, 0x36, 0x36, 0x78, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0x02, 0x9c, 0x02, 0x7e, 0x05, 0x1e, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x23, 0x01, 0x11, 0x23, 0x66, 0x9a, 0x01, 0x0e, 0x6f, 0x9a, 0xfe, 0xf1, 0x6e, 0x05, 0x1e, 0xfe, 0x07, 0x01, 0xf9, 0xfd, 0x7e, 0x01, 0xfa, 0xfe, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3f, 0x02, 0x8c, 0x02, 0x88, 0x05, 0x1e, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x20, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x16, 0x22, 0x07, 0x06, 0x07, 0x21, 0x26, 0x27, 0x17, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x64, 0x87, 0x4f, 0x4d, 0x4d, 0x4f, 0x87, 0x89, 0x4d, 0x4e, 0x4e, 0x4d, 0xdc, 0xa7, 0x31, 0x2a, 0x06, 0x01, 0x69, 0x06, 0x2a, 0x2c, 0xfe, 0x9e, 0x0a, 0x22, 0x31, 0x55, 0x53, 0x31, 0x22, 0x05, 0x1e, 0x57, 0x57, 0x9b, 0x9a, 0x57, 0x58, 0x58, 0x57, 0x9a, 0x9b, 0x57, 0x57, 0x57, 0x40, 0x39, 0x5c, 0x5b, 0x38, 0xef, 0x45, 0x2d, 0x41, 0x41, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x3f, 0x01, 0xae, 0x02, 0x88, 0x06, 0x03, 0x00, 0x1d, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x23, 0x35, 0x21, 0x15, 0x23, 0x15, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x15, 0x33, 0x15, 0x21, 0x35, 0x33, 0x35, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x17, 0x11, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x03, 0x11, 0x06, 0x07, 0x06, 0x14, 0x17, 0x16, 0x01, 0x2e, 0x88, 0x01, 0x78, 0x88, 0x65, 0x3f, 0x4d, 0x4d, 0x3f, 0x65, 0x88, 0xfe, 0x88, 0x88, 0x64, 0x3c, 0x4e, 0x4e, 0x3c, 0x64, 0x68, 0x30, 0x22, 0x30, 0x30, 0x22, 0x98, 0x2f, 0x20, 0x31, 0x30, 0x21, 0x05, 0xa7, 0x5c, 0x5c, 0x8c, 0x0e, 0x46, 0x57, 0x9b, 0x9a, 0x57, 0x47, 0x0e, 0x85, 0x5c, 0x5c, 0x86, 0x0e, 0x46, 0x57, 0x9a, 0x9b, 0x57, 0x45, 0x0f, 0x5b, 0xfe, 0x2a, 0x0e, 0x2c, 0x41, 0x70, 0x6f, 0x41, 0x2d, 0xfe, 0x39, 0x01, 0xd4, 0x0e, 0x2a, 0x41, 0xe2, 0x40, 0x2b, 0x00, 0x01, 0x00, 0x3f, 0x01, 0xad, 0x02, 0x25, 0x05, 0x1e, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x3d, 0x02, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x02, 0x02, 0x2c, 0x60, 0x32, 0x4e, 0x26, 0x28, 0x1c, 0x1c, 0x54, 0x24, 0x6e, 0x2f, 0x2f, 0x45, 0x46, 0x7b, 0x33, 0x38, 0x0c, 0x2c, 0x3b, 0x84, 0x90, 0x66, 0x2e, 0x2f, 0x3a, 0x38, 0x38, 0x37, 0x4a, 0x4f, 0x1c, 0x1d, 0x61, 0x25, 0x60, 0x56, 0x3f, 0x3f, 0x75, 0x3a, 0x67, 0x04, 0xfd, 0x62, 0x17, 0x16, 0x17, 0x18, 0x2f, 0x24, 0x15, 0x14, 0x12, 0x08, 0x18, 0x2b, 0x2a, 0x4d, 0x57, 0x33, 0x33, 0x09, 0x03, 0x07, 0x56, 0x36, 0x58, 0x36, 0x36, 0x78, 0x22, 0x6a, 0x1d, 0x0f, 0x0f, 0x32, 0x2d, 0x2a, 0x17, 0x16, 0x15, 0x08, 0x14, 0x54, 0x49, 0x58, 0x30, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xeb, 0x01, 0xad, 0x01, 0x9d, 0x06, 0x03, 0x00, 0x17, 0x00, 0x00, 0x13, 0x02, 0x03, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x13, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x6e, 0x01, 0x01, 0x32, 0x2d, 0x6e, 0x63, 0x64, 0x38, 0x15, 0x17, 0x02, 0x2f, 0x2d, 0x67, 0x28, 0x1c, 0x3c, 0x2b, 0x02, 0x91, 0x01, 0x5d, 0x01, 0x4d, 0x65, 0x33, 0x30, 0x55, 0x17, 0x16, 0x3a, 0xfd, 0x4a, 0x78, 0x36, 0x36, 0x58, 0x36, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1f, 0x01, 0xad, 0x01, 0xac, 0x05, 0xc1, 0x00, 0x1f, 0x00, 0x00, 0x13, 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0xd4, 0xd8, 0xd8, 0x2c, 0x40, 0x6c, 0x2f, 0x2e, 0x67, 0x27, 0x1b, 0x3c, 0x2b, 0x03, 0x78, 0x2e, 0x2e, 0x4c, 0x4c, 0x05, 0xc1, 0xb2, 0x50, 0xfe, 0xac, 0x4d, 0x2c, 0x61, 0x78, 0x36, 0x36, 0x58, 0x36, 0x56, 0x0b, 0x2d, 0x2c, 0x76, 0x01, 0x54, 0x50, 0xb2, 0x00, 0x02, 0x00, 0x54, 0x02, 0x8c, 0x03, 0x35, 0x05, 0x0f, 0x00, 0x17, 0x00, 0x21, 0x00, 0x00, 0x13, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x29, 0x01, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x55, 0x63, 0x68, 0x01, 0x43, 0x69, 0x69, 0x69, 0x69, 0x27, 0x32, 0x32, 0x42, 0x6d, 0x71, 0x01, 0xaa, 0xfe, 0xbe, 0x23, 0x23, 0x46, 0x55, 0x31, 0x2c, 0x03, 0x99, 0x5c, 0x01, 0x1a, 0xfe, 0xe6, 0x01, 0x1a, 0xfe, 0xe6, 0x5c, 0xfd, 0x60, 0x39, 0x1c, 0x1b, 0x86, 0x82, 0x05, 0x02, 0x59, 0x2c, 0x2d, 0x36, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3f, 0x02, 0x8b, 0x02, 0x90, 0x05, 0x0f, 0x00, 0x26, 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x33, 0x15, 0x23, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x40, 0xfb, 0x3e, 0x24, 0x25, 0x32, 0x32, 0x51, 0x52, 0x31, 0x33, 0x26, 0x28, 0x38, 0xf6, 0x85, 0x40, 0x20, 0x1f, 0x51, 0x50, 0xff, 0x00, 0x50, 0x51, 0x1e, 0x1e, 0x43, 0x04, 0xb3, 0x5c, 0x7b, 0x27, 0x3a, 0x3f, 0x4b, 0x59, 0x37, 0x36, 0x36, 0x37, 0x59, 0x52, 0x38, 0x3e, 0x23, 0x7b, 0x5c, 0x38, 0x3f, 0x3e, 0x4c, 0x83, 0x52, 0x52, 0x51, 0x52, 0x80, 0x52, 0x3c, 0x3d, 0x3a, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x8a, 0x02, 0x51, 0x05, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x01, 0x5d, 0x49, 0x41, 0x69, 0x3d, 0x3e, 0x78, 0x78, 0x3f, 0x3d, 0x6a, 0x40, 0x02, 0xe2, 0x50, 0x5a, 0x01, 0x83, 0xfe, 0x73, 0x7b, 0x3e, 0x3f, 0x3f, 0x3e, 0x7b, 0x01, 0x8d, 0xfe, 0x7d, 0x5a, 0x50, 0x00, 0x00, 0x01, 0x00, 0x6d, 0x02, 0x9c, 0x02, 0x79, 0x05, 0x0f, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3f, 0x01, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x01, 0x43, 0xb7, 0x41, 0x1f, 0x1f, 0x50, 0x51, 0x80, 0x28, 0x66, 0x5c, 0x68, 0x15, 0x17, 0x3b, 0x1d, 0x51, 0x32, 0x31, 0x24, 0x2d, 0x35, 0x2b, 0x04, 0xc4, 0x38, 0x3f, 0x3e, 0x4c, 0x83, 0x52, 0x52, 0x6c, 0x77, 0x01, 0x90, 0xfe, 0x70, 0x55, 0x1c, 0x1c, 0x01, 0x01, 0x36, 0x37, 0x59, 0x51, 0x38, 0x43, 0x1f, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x22, 0x02, 0x9c, 0x02, 0x8d, 0x05, 0x0f, 0x00, 0x06, 0x00, 0x00, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x13, 0x33, 0x02, 0x8c, 0x6e, 0xc6, 0xc7, 0x6f, 0xef, 0x8e, 0x02, 0x9c, 0x02, 0x0e, 0xfd, 0xf2, 0x02, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0x02, 0x9c, 0x02, 0x30, 0x05, 0x0f, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x40, 0x01, 0xf0, 0xfe, 0x77, 0x01, 0x89, 0xfe, 0x02, 0x01, 0x88, 0xfe, 0x86, 0x05, 0x0f, 0x5e, 0xfe, 0x3d, 0x52, 0x5e, 0x01, 0xc3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0x01, 0xad, 0x02, 0xb1, 0x05, 0x0f, 0x00, 0x16, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x15, 0x23, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x21, 0x35, 0x01, 0x21, 0x40, 0x01, 0xf0, 0xfe, 0x77, 0x01, 0x89, 0x01, 0x15, 0x15, 0x3d, 0x1a, 0x27, 0x67, 0x5c, 0xfe, 0x6c, 0x01, 0x88, 0xfe, 0x86, 0x05, 0x0f, 0x5e, 0xfe, 0x3d, 0x52, 0x0b, 0x56, 0x1b, 0x1b, 0x58, 0x6c, 0x78, 0x0b, 0x5e, 0x01, 0xc3, 0x00, 0x00, 0x02, 0x00, 0x31, 0x02, 0x5e, 0x02, 0x30, 0x05, 0x0f, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x06, 0x15, 0x23, 0x34, 0x37, 0x23, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x33, 0x36, 0x33, 0x32, 0x15, 0x14, 0x23, 0x27, 0x33, 0x32, 0x35, 0x34, 0x23, 0x06, 0x01, 0x56, 0x02, 0x56, 0x02, 0xce, 0x01, 0x88, 0xfe, 0x86, 0x01, 0xf0, 0xfe, 0x77, 0x63, 0x23, 0x7c, 0x81, 0xbd, 0x0b, 0x0b, 0x63, 0x28, 0x32, 0x02, 0x9c, 0x1d, 0x21, 0x21, 0x1d, 0x5e, 0x01, 0xc3, 0x52, 0x5e, 0xfe, 0x3d, 0xa2, 0x8a, 0x6a, 0x52, 0x1f, 0x33, 0x01, 0x00, 0x01, 0x00, 0x31, 0x01, 0xa8, 0x02, 0x60, 0x05, 0x0f, 0x00, 0x21, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x13, 0x21, 0x35, 0x21, 0x15, 0x01, 0x44, 0x3c, 0x49, 0x38, 0x31, 0x2e, 0x57, 0x56, 0x9f, 0x35, 0x39, 0x38, 0x3c, 0x2f, 0x72, 0x3e, 0x6c, 0x37, 0x39, 0x34, 0x34, 0x5e, 0x63, 0xf4, 0xfe, 0x86, 0x01, 0xef, 0x03, 0xa7, 0x20, 0x17, 0x3d, 0x3b, 0x4d, 0x7c, 0x43, 0x44, 0x0a, 0x0b, 0x14, 0x6d, 0x1b, 0x1c, 0x2a, 0x2a, 0x50, 0x4a, 0x2a, 0x29, 0x5d, 0x01, 0x18, 0x52, 0x5e, 0x00, 0x03, 0x00, 0x3f, 0x02, 0x8f, 0x02, 0x88, 0x06, 0x0c, 0x00, 0x08, 0x00, 0x10, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x13, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x26, 0x10, 0x37, 0x36, 0x02, 0x18, 0xfe, 0x97, 0x05, 0x2a, 0x31, 0x55, 0x53, 0x31, 0x2a, 0x05, 0x09, 0x26, 0x31, 0xa7, 0x31, 0x27, 0x08, 0xb4, 0x87, 0x4f, 0x4d, 0x4d, 0x4f, 0x87, 0x89, 0x9b, 0x4d, 0x4e, 0x04, 0x2a, 0x80, 0x4d, 0x57, 0x58, 0x4d, 0xde, 0x6d, 0x47, 0x59, 0x58, 0x46, 0x6f, 0x01, 0x83, 0x76, 0x77, 0xfe, 0x5e, 0x77, 0x77, 0xee, 0x01, 0xa2, 0x77, 0x76, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xb8, 0x04, 0xee, 0xff, 0xaf, 0x06, 0x66, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x37, 0x33, 0xfe, 0xd2, 0xfd, 0xe6, 0x01, 0xe2, 0x97, 0x7d, 0x04, 0xee, 0x94, 0xe4, 0x00, 0x01, 0xfc, 0xb8, 0x04, 0xee, 0xff, 0xaf, 0x06, 0x66, 0x00, 0x05, 0x00, 0x00, 0x01, 0x03, 0x33, 0x17, 0x21, 0x15, 0xfd, 0x95, 0xdd, 0x7d, 0x98, 0x01, 0xe1, 0x04, 0xee, 0x01, 0x78, 0xe4, 0x94, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xb8, 0x04, 0xee, 0xff, 0xaf, 0x06, 0x66, 0x00, 0x05, 0x00, 0x00, 0x01, 0x13, 0x23, 0x27, 0x21, 0x35, 0xfe, 0xd2, 0xdc, 0x7d, 0x97, 0xfe, 0x1e, 0x06, 0x66, 0xfe, 0x88, 0xe4, 0x94, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0xb8, 0x04, 0xee, 0xff, 0xaf, 0x06, 0x66, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x07, 0x23, 0xfd, 0x95, 0x02, 0x19, 0xfe, 0x1f, 0x98, 0x7d, 0x06, 0x66, 0x94, 0xe4, 0x00, 0x01, 0xfc, 0xa1, 0x04, 0xee, 0xff, 0xc5, 0x06, 0x66, 0x00, 0x09, 0x00, 0x00, 0x01, 0x33, 0x13, 0x23, 0x27, 0x07, 0x23, 0x03, 0x33, 0x17, 0xfe, 0x63, 0x85, 0xdd, 0x7d, 0xa2, 0xa2, 0x86, 0xdc, 0x7d, 0xa2, 0x06, 0x66, 0xfe, 0x88, 0xf5, 0xf5, 0x01, 0x78, 0xf5, 0x00, 0x01, 0xfc, 0xa1, 0x04, 0xee, 0xff, 0xc5, 0x06, 0x66, 0x00, 0x09, 0x00, 0x00, 0x01, 0x17, 0x37, 0x33, 0x03, 0x23, 0x27, 0x07, 0x23, 0x13, 0xfe, 0x04, 0xa2, 0xa2, 0x7d, 0xdd, 0x85, 0xa2, 0xa2, 0x7d, 0xdc, 0x06, 0x66, 0xf5, 0xf5, 0xfe, 0x88, 0xf5, 0xf5, 0x01, 0x78, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x13, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd6, 0x04, 0x43, 0x00, 0x01, 0x12, 0x06, 0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xfe, 0x13, 0x03, 0xc3, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd6, 0x03, 0xe5, 0x00, 0x01, 0x12, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x43, 0x01, 0x75, 0x12, 0x06, 0x00, 0x25, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa5, 0xff, 0xe3, 0x04, 0x2e, 0x07, 0x52, 0x10, 0x27, 0x02, 0xb8, 0x02, 0xc7, 0x01, 0x3e, 0x12, 0x06, 0x00, 0x45, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0x6e, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x25, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x04, 0x2e, 0x06, 0x14, 0x12, 0x26, 0x00, 0x45, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xc0, 0x04, 0x6e, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x25, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0x88, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0xc0, 0x04, 0x2e, 0x06, 0x14, 0x12, 0x26, 0x00, 0x45, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0x81, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x75, 0x04, 0xa4, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0xc4, 0x01, 0x76, 0x12, 0x06, 0x00, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x03, 0x84, 0x06, 0x66, 0x12, 0x26, 0x00, 0xa9, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x3c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x1f, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x6e, 0x01, 0x75, 0x12, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xeb, 0x07, 0x89, 0x10, 0x27, 0x02, 0xb8, 0x05, 0x65, 0x01, 0x75, 0x12, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x8a, 0x05, 0x1f, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x6e, 0x00, 0x01, 0x12, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x8a, 0x03, 0xeb, 0x06, 0x14, 0x10, 0x27, 0x02, 0xd4, 0x03, 0xf5, 0x00, 0x01, 0x12, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xc1, 0x05, 0x1f, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xe2, 0x04, 0x6e, 0x00, 0x01, 0x12, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0xc1, 0x03, 0xeb, 0x06, 0x14, 0x10, 0x27, 0x02, 0xe2, 0x03, 0xf5, 0x00, 0x01, 0x12, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x77, 0x05, 0x1f, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x27, 0x00, 0x00, 0x10, 0x06, 0x00, 0x7a, 0x52, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x03, 0xeb, 0x06, 0x14, 0x12, 0x26, 0x00, 0x47, 0x00, 0x00, 0x10, 0x06, 0x00, 0x7a, 0xf7, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x15, 0x05, 0x1f, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xde, 0x04, 0x6e, 0x00, 0x01, 0x12, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x15, 0x03, 0xeb, 0x06, 0x14, 0x10, 0x27, 0x02, 0xde, 0x03, 0xf5, 0x00, 0x01, 0x12, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x06, 0x11, 0x24, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x07, 0x5e, 0x10, 0x27, 0x11, 0x24, 0xff, 0xdd, 0xff, 0x04, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x06, 0x11, 0x23, 0xee, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x07, 0x5e, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x11, 0x23, 0xff, 0xdb, 0xff, 0x04, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x4b, 0x04, 0x17, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x02, 0xde, 0x04, 0x39, 0x00, 0x37, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x4b, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x02, 0xde, 0x04, 0x38, 0x00, 0x37, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x76, 0x04, 0x17, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x02, 0xb0, 0x00, 0xa1, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x76, 0x04, 0x0c, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x02, 0xb0, 0x00, 0x8c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x75, 0x04, 0x17, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x2a, 0x01, 0x75, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0x00, 0xab, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x75, 0x04, 0x0c, 0x06, 0x48, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x26, 0x02, 0x9a, 0x7a, 0x00, 0x10, 0x06, 0x00, 0x7a, 0x44, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xba, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x04, 0x01, 0x74, 0x12, 0x06, 0x00, 0x29, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2a, 0x00, 0x00, 0x02, 0xac, 0x07, 0x89, 0x10, 0x27, 0x02, 0xb8, 0x03, 0x7d, 0x01, 0x75, 0x12, 0x06, 0x00, 0x49, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x07, 0x18, 0x12, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8b, 0x01, 0x13, 0x01, 0x22, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x05, 0xf6, 0x12, 0x26, 0x00, 0x4a, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8b, 0x42, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x92, 0x01, 0x73, 0x12, 0x06, 0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa5, 0x00, 0x00, 0x03, 0xf4, 0x07, 0x52, 0x10, 0x27, 0x02, 0xb8, 0x02, 0xc7, 0x01, 0x3e, 0x12, 0x06, 0x00, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0xb6, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x82, 0x00, 0x00, 0x12, 0x06, 0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x03, 0xf4, 0x06, 0x14, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x1a, 0x00, 0x00, 0x12, 0x06, 0x00, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x07, 0x50, 0x12, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x6a, 0x00, 0xee, 0x01, 0x40, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x03, 0xf4, 0x07, 0x4e, 0x10, 0x27, 0x02, 0xb9, 0x02, 0xc7, 0x01, 0x3e, 0x12, 0x06, 0x00, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0f, 0xfe, 0x74, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0xff, 0x09, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xfe, 0x74, 0x03, 0xf4, 0x06, 0x14, 0x12, 0x26, 0x00, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x7a, 0xfe, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x39, 0x04, 0xb6, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x2b, 0x00, 0x00, 0x10, 0x07, 0x02, 0xdf, 0x04, 0x89, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x39, 0x03, 0xf4, 0x06, 0x14, 0x12, 0x26, 0x00, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x02, 0xdf, 0x04, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xfe, 0x76, 0x02, 0x52, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xb0, 0xff, 0x5c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd7, 0xfe, 0x76, 0x02, 0x2a, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb0, 0xff, 0x34, 0x00, 0x00, 0x12, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x02, 0x1d, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x11, 0x21, 0xfe, 0x9c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf5, 0x00, 0x00, 0x02, 0x0c, 0x07, 0x16, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x10, 0x07, 0x11, 0x21, 0xfe, 0x8a, 0xfe, 0xbc, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xe0, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x65, 0x01, 0x76, 0x12, 0x06, 0x00, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x26, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x03, 0x04, 0x01, 0x76, 0x12, 0x06, 0x00, 0x4e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0xe0, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x2e, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x60, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x04, 0x26, 0x06, 0x14, 0x12, 0x26, 0x00, 0x4e, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x1c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xc0, 0x04, 0xe0, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x2e, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0xf2, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0xc0, 0x04, 0x26, 0x06, 0x14, 0x12, 0x26, 0x00, 0x4e, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x6a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x24, 0x00, 0x00, 0x10, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x01, 0x5e, 0x06, 0x14, 0x10, 0x27, 0x02, 0xd4, 0x02, 0xd6, 0x00, 0x00, 0x10, 0x06, 0x00, 0x4f, 0x0a, 0x00, 0xff, 0xff, 0x00, 0x02, 0xfe, 0x8a, 0x03, 0xf9, 0x07, 0x6b, 0x10, 0x27, 0x02, 0xb5, 0x02, 0xd9, 0x01, 0x75, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x23, 0x00, 0x01, 0x12, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfd, 0xfe, 0x89, 0x02, 0x18, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0xff, 0x3e, 0x01, 0x3b, 0x10, 0x06, 0x05, 0x87, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xc0, 0x03, 0xf9, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0x80, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf5, 0xfe, 0xc0, 0x02, 0x10, 0x06, 0x14, 0x10, 0x27, 0x02, 0x8f, 0xff, 0x36, 0x00, 0x00, 0x12, 0x06, 0x00, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x14, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x27, 0x02, 0x88, 0x00, 0x88, 0xf9, 0x26, 0x12, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe1, 0xfe, 0x14, 0x02, 0x20, 0x06, 0x14, 0x10, 0x27, 0x02, 0x88, 0xff, 0x34, 0xf9, 0x26, 0x12, 0x06, 0x00, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0xe8, 0x01, 0x76, 0x12, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x67, 0x06, 0x66, 0x12, 0x26, 0x00, 0x50, 0x00, 0x00, 0x10, 0x07, 0x00, 0x76, 0x01, 0x6c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0xeb, 0x01, 0x74, 0x12, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x67, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x05, 0x52, 0x00, 0x00, 0x12, 0x06, 0x00, 0x50, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x05, 0x83, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0xe8, 0x00, 0x00, 0x10, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x06, 0x67, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd4, 0x05, 0x4f, 0x00, 0x00, 0x10, 0x06, 0x00, 0x50, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x76, 0x01, 0x75, 0x12, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x04, 0x15, 0x00, 0x00, 0x12, 0x06, 0x00, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0xae, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x7e, 0x00, 0x00, 0x10, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x03, 0xf4, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x1a, 0x00, 0x00, 0x10, 0x06, 0x00, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xc0, 0x04, 0xae, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x31, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0xde, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0xc0, 0x03, 0xf4, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x51, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x7e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x14, 0x04, 0xae, 0x05, 0xd5, 0x10, 0x27, 0x02, 0x88, 0x00, 0xe5, 0xf9, 0x26, 0x12, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x14, 0x03, 0xf4, 0x04, 0x7b, 0x10, 0x27, 0x02, 0x88, 0x00, 0x86, 0xf9, 0x26, 0x12, 0x06, 0x00, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x29, 0x5c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x0c, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x07, 0x11, 0x29, 0xff, 0xba, 0xfe, 0xb2, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x56, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x27, 0x61, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x0f, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x27, 0x00, 0x6a, 0x00, 0x64, 0x00, 0xff, 0x10, 0x07, 0x10, 0xed, 0x04, 0x00, 0x00, 0x12, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x24, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x5e, 0x10, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x07, 0x11, 0x24, 0xff, 0xbc, 0xff, 0x04, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x23, 0x5e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x5e, 0x10, 0x27, 0x11, 0x23, 0xff, 0xc0, 0xff, 0x04, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x07, 0x6c, 0x10, 0x27, 0x10, 0xec, 0x04, 0x28, 0x01, 0x76, 0x12, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x66, 0x12, 0x26, 0x00, 0x53, 0x00, 0x00, 0x10, 0x06, 0x00, 0x76, 0x2d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x10, 0x01, 0x74, 0x12, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x04, 0x2f, 0x00, 0x00, 0x12, 0x06, 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x10, 0x01, 0x73, 0x12, 0x06, 0x00, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x02, 0xf6, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xae, 0x00, 0x00, 0x12, 0x06, 0x00, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0xcc, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x0a, 0x00, 0x00, 0x10, 0x06, 0x00, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x02, 0xf6, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd4, 0x02, 0xd0, 0x00, 0x00, 0x10, 0x06, 0x00, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0xcc, 0x07, 0x31, 0x10, 0x27, 0x00, 0x71, 0x00, 0x70, 0x01, 0x3b, 0x10, 0x06, 0x05, 0xaa, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x89, 0x02, 0xf6, 0x05, 0xf5, 0x10, 0x26, 0x00, 0x71, 0x15, 0xff, 0x10, 0x06, 0x05, 0xab, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xc0, 0x04, 0xcc, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x35, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0xce, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4b, 0xfe, 0xc0, 0x02, 0xf6, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x55, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x8c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x3f, 0x01, 0x74, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xbd, 0x00, 0x00, 0x12, 0x06, 0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x89, 0x04, 0x2c, 0x05, 0xf0, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x16, 0x00, 0x00, 0x10, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xfe, 0x8a, 0x03, 0x67, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd4, 0x03, 0xbb, 0x00, 0x01, 0x12, 0x06, 0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xec, 0x04, 0x65, 0x01, 0x76, 0x10, 0x27, 0x10, 0xf3, 0x03, 0x47, 0x01, 0x92, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x7f, 0x06, 0x66, 0x12, 0x26, 0x00, 0x56, 0x00, 0x00, 0x10, 0x26, 0x02, 0x9b, 0x98, 0x56, 0x10, 0x07, 0x00, 0x76, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x08, 0x57, 0x10, 0x26, 0x11, 0x28, 0xe7, 0x00, 0x12, 0x06, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x07, 0xc9, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xc2, 0x01, 0xb5, 0x12, 0x06, 0x01, 0x23, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x89, 0x04, 0x2c, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x25, 0x01, 0x74, 0x12, 0x06, 0x05, 0xb2, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xfe, 0x8a, 0x03, 0x67, 0x05, 0xde, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xbd, 0xff, 0xca, 0x12, 0x06, 0x05, 0xb3, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x00, 0x01, 0x74, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0x00, 0x00, 0x02, 0xa7, 0x07, 0x89, 0x10, 0x27, 0x02, 0xb8, 0x02, 0xcb, 0x01, 0x75, 0x12, 0x06, 0x00, 0x57, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0xfe, 0x89, 0x04, 0x6c, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x03, 0xff, 0x00, 0x00, 0x10, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0xfe, 0x89, 0x02, 0xa7, 0x05, 0x9e, 0x10, 0x27, 0x02, 0xd4, 0x03, 0x84, 0x00, 0x00, 0x10, 0x06, 0x00, 0x57, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0xfe, 0xc0, 0x04, 0x6c, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x37, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x58, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0xfe, 0xc0, 0x02, 0xd0, 0x05, 0x9e, 0x10, 0x26, 0x02, 0x8f, 0xf5, 0x00, 0x12, 0x06, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0xfe, 0x14, 0x04, 0x6c, 0x05, 0xd5, 0x10, 0x27, 0x02, 0x88, 0x00, 0x67, 0xf9, 0x26, 0x12, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0xfe, 0x14, 0x02, 0xd6, 0x05, 0x9e, 0x10, 0x27, 0x02, 0x88, 0xff, 0xea, 0xf9, 0x26, 0x12, 0x06, 0x00, 0x57, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xfe, 0x89, 0x04, 0xa5, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd5, 0x04, 0x72, 0x00, 0x00, 0x12, 0x06, 0x00, 0x38, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xfe, 0x89, 0x03, 0xe9, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd5, 0x04, 0x08, 0x00, 0x00, 0x12, 0x06, 0x00, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xfe, 0x76, 0x04, 0xa5, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x02, 0xb0, 0x00, 0xda, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xfe, 0x76, 0x03, 0xe9, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x02, 0xb0, 0x00, 0x81, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xfe, 0x4b, 0x04, 0xa5, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x02, 0xde, 0x04, 0x63, 0x00, 0x37, 0xff, 0xff, 0x00, 0x9c, 0xfe, 0x4b, 0x03, 0xe9, 0x04, 0x7b, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x02, 0xde, 0x04, 0x03, 0x00, 0x37, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x08, 0x5a, 0x10, 0x26, 0x11, 0x29, 0x29, 0x00, 0x12, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x07, 0xec, 0x10, 0x26, 0x01, 0x2b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x76, 0x00, 0x87, 0x01, 0x86, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x08, 0x34, 0x10, 0x26, 0x11, 0x1f, 0x2d, 0x00, 0x12, 0x06, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0xf4, 0x10, 0x27, 0x11, 0x1f, 0xff, 0xce, 0xfe, 0xc0, 0x12, 0x06, 0x00, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x7d, 0x12, 0x26, 0x00, 0x39, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9e, 0x00, 0xd5, 0x01, 0x46, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x06, 0x37, 0x12, 0x26, 0x00, 0x59, 0x00, 0x00, 0x10, 0x06, 0x02, 0x9e, 0x62, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x89, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x39, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x89, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x26, 0x00, 0x59, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x03, 0xee, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x07, 0x72, 0x10, 0x27, 0x10, 0xee, 0x05, 0x5c, 0x01, 0x7c, 0x12, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x06, 0x6b, 0x10, 0x27, 0x00, 0x43, 0x00, 0xee, 0x00, 0x05, 0x12, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x07, 0x72, 0x10, 0x27, 0x10, 0xec, 0x05, 0x5c, 0x01, 0x7c, 0x12, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x06, 0x6d, 0x10, 0x27, 0x00, 0x76, 0x01, 0x5f, 0x00, 0x07, 0x12, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x07, 0x4e, 0x10, 0x27, 0x00, 0x6a, 0x01, 0xc3, 0x01, 0x3e, 0x12, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x06, 0x10, 0x10, 0x27, 0x00, 0x6a, 0x01, 0x24, 0x00, 0x00, 0x12, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x07, 0x4e, 0x10, 0x27, 0x10, 0xf3, 0x05, 0x5c, 0x01, 0x73, 0x12, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x04, 0xc0, 0x00, 0x00, 0x12, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0xfe, 0x89, 0x06, 0xe3, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x3a, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x05, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0xfe, 0x89, 0x05, 0x97, 0x04, 0x60, 0x12, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0xc3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x07, 0x4f, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x4f, 0x01, 0x73, 0x12, 0x06, 0x00, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xf2, 0x00, 0x00, 0x12, 0x06, 0x00, 0x5b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x6a, 0x00, 0xb6, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x06, 0x10, 0x12, 0x26, 0x00, 0x5b, 0x00, 0x00, 0x10, 0x06, 0x00, 0x6a, 0x5c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x50, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x00, 0x01, 0x75, 0x12, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x14, 0x10, 0x27, 0x02, 0xb8, 0x03, 0xf0, 0x00, 0x00, 0x12, 0x06, 0x00, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xef, 0x04, 0x45, 0x01, 0x75, 0x12, 0x06, 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x06, 0x66, 0x12, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x10, 0x06, 0x02, 0x88, 0x17, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0xfe, 0x89, 0x04, 0x9c, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x5d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0xfe, 0x89, 0x03, 0x79, 0x04, 0x60, 0x12, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x03, 0xc6, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0xfe, 0xc0, 0x04, 0x9c, 0x05, 0xd5, 0x12, 0x26, 0x00, 0x3d, 0x00, 0x00, 0x10, 0x07, 0x02, 0x8f, 0x00, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0xfe, 0xc0, 0x03, 0x79, 0x04, 0x60, 0x12, 0x26, 0x00, 0x5d, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0xc0, 0x03, 0xf4, 0x06, 0x14, 0x12, 0x26, 0x00, 0x4b, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x5c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x02, 0xa7, 0x07, 0x4e, 0x12, 0x26, 0x00, 0x57, 0x00, 0x00, 0x10, 0x07, 0x00, 0x6a, 0xff, 0x42, 0x01, 0x3e, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x07, 0x06, 0x12, 0x26, 0x00, 0x5a, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9c, 0x01, 0x22, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x07, 0x06, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x10, 0x06, 0x02, 0x9c, 0x74, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x04, 0xd8, 0x06, 0x14, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x10, 0x07, 0x02, 0x80, 0x03, 0x77, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2a, 0x00, 0x00, 0x02, 0xac, 0x07, 0x89, 0x10, 0x27, 0x02, 0xb8, 0x03, 0x7d, 0x01, 0x75, 0x12, 0x06, 0x01, 0x41, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0xac, 0x06, 0x14, 0x00, 0x18, 0x00, 0x00, 0x21, 0x23, 0x11, 0x07, 0x27, 0x37, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x37, 0x17, 0x05, 0x01, 0x6f, 0xa6, 0x85, 0x42, 0xc7, 0x9f, 0x9f, 0x9c, 0xaa, 0x9d, 0x9e, 0x5a, 0x23, 0x22, 0xc1, 0x43, 0xfe, 0xfc, 0x02, 0x14, 0x68, 0x6a, 0x9d, 0x01, 0x1e, 0x8f, 0x4e, 0xbb, 0xab, 0x99, 0x28, 0x29, 0x67, 0xfe, 0x74, 0x98, 0x69, 0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x02, 0xac, 0x06, 0x14, 0x00, 0x17, 0x00, 0x00, 0x21, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x07, 0x33, 0x15, 0x23, 0x01, 0x6f, 0xa6, 0x9f, 0x9f, 0x9f, 0xa1, 0x0c, 0x40, 0x4e, 0xaa, 0x9d, 0x9e, 0x5a, 0x23, 0x1b, 0x05, 0xe4, 0xe6, 0x03, 0x45, 0x8f, 0x8c, 0x8f, 0x89, 0x46, 0x56, 0x99, 0x28, 0x20, 0x44, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, 0xff, 0xe3, 0x05, 0x22, 0x05, 0xf2, 0x00, 0x37, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x0e, 0x03, 0x15, 0x11, 0x23, 0x11, 0x34, 0x3e, 0x03, 0x33, 0x32, 0x04, 0x17, 0x22, 0x06, 0x15, 0x14, 0x1e, 0x05, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x2e, 0x07, 0x35, 0x34, 0x36, 0x03, 0x9c, 0x62, 0x9c, 0x3a, 0x5c, 0x55, 0x3a, 0x22, 0xb7, 0x34, 0x5a, 0x81, 0x95, 0x5a, 0xc3, 0x01, 0x11, 0x32, 0xba, 0xe8, 0x3d, 0x5f, 0x74, 0x74, 0x60, 0x3c, 0xee, 0xbe, 0xa2, 0xb5, 0x62, 0x9f, 0x64, 0x58, 0x88, 0x25, 0x3f, 0x52, 0x5a, 0x5a, 0x52, 0x3f, 0x25, 0xc9, 0x04, 0xf4, 0x5a, 0x18, 0x40, 0x68, 0xa7, 0x6f, 0xfc, 0x88, 0x03, 0x91, 0x83, 0xcf, 0x8b, 0x5c, 0x28, 0xc5, 0xbd, 0x7d, 0x5f, 0x2d, 0x43, 0x2d, 0x2d, 0x3e, 0x54, 0x8c, 0x5c, 0xa4, 0xc9, 0x5f, 0xd0, 0x45, 0x46, 0x76, 0x58, 0x35, 0x50, 0x33, 0x29, 0x20, 0x24, 0x32, 0x42, 0x67, 0x43, 0x8f, 0xbb, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x05, 0xf0, 0x10, 0x06, 0x03, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x89, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x3e, 0x00, 0x00, 0x12, 0x06, 0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xfe, 0x89, 0x03, 0xc3, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xd4, 0x03, 0xb7, 0x00, 0x00, 0x12, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0xf0, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x43, 0x01, 0x75, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0x7b, 0x12, 0x26, 0x00, 0x44, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x03, 0xe5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x3a, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x04, 0x37, 0x06, 0xc5, 0x10, 0x27, 0x11, 0x2a, 0xff, 0xa1, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x3a, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2b, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x06, 0xc6, 0x10, 0x26, 0x00, 0x44, 0x00, 0x00, 0x10, 0x07, 0x11, 0x2b, 0xff, 0x9f, 0xfe, 0x8c, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x5b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x31, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x04, 0x27, 0x06, 0xe6, 0x10, 0x27, 0x11, 0x31, 0xff, 0xa1, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x75, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2c, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x00, 0x10, 0x27, 0x11, 0x2c, 0xff, 0xa1, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x89, 0x04, 0xde, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x84, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xfe, 0x89, 0x03, 0xc3, 0x06, 0x66, 0x12, 0x26, 0x00, 0xa4, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x03, 0xb8, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x04, 0x10, 0x27, 0x11, 0x2e, 0xff, 0x9c, 0xfe, 0xaa, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x5a, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x04, 0x10, 0x27, 0x11, 0x2f, 0xff, 0x9d, 0xfe, 0xaa, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x8b, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x30, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x35, 0x10, 0x27, 0x11, 0x30, 0xff, 0x9f, 0xfe, 0xaa, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x08, 0x59, 0x12, 0x26, 0x00, 0x24, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2d, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x07, 0x03, 0x10, 0x26, 0x00, 0x44, 0x00, 0x00, 0x10, 0x07, 0x11, 0x2d, 0xff, 0x9d, 0xfe, 0xaa, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x89, 0x04, 0xde, 0x07, 0x92, 0x12, 0x26, 0x00, 0xc4, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xfe, 0x89, 0x03, 0xc3, 0x06, 0x1f, 0x12, 0x26, 0x00, 0xc5, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x03, 0xc8, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0x17, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x89, 0x04, 0x0c, 0x04, 0x7b, 0x10, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x17, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0xf0, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x28, 0x01, 0x75, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x7b, 0x12, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x18, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x07, 0x5e, 0x10, 0x27, 0x10, 0xed, 0x04, 0x28, 0x01, 0x75, 0x12, 0x06, 0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0x37, 0x10, 0x27, 0x02, 0x9e, 0x00, 0x88, 0x00, 0x00, 0x12, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x96, 0x08, 0x3a, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2a, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x6b, 0x06, 0xc5, 0x10, 0x27, 0x11, 0x2a, 0xff, 0xd5, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x08, 0x3a, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2b, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x06, 0xc6, 0x10, 0x27, 0x11, 0x2b, 0xff, 0xd5, 0xfe, 0x8c, 0x10, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x77, 0x08, 0x5b, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x06, 0x11, 0x31, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x5c, 0x06, 0xe6, 0x10, 0x26, 0x00, 0x48, 0x00, 0x00, 0x10, 0x07, 0x11, 0x31, 0xff, 0xd5, 0xfe, 0x8b, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x08, 0x75, 0x12, 0x26, 0x00, 0x28, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2c, 0xec, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x07, 0x00, 0x10, 0x27, 0x11, 0x2c, 0xff, 0xd6, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x04, 0x17, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x8c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x89, 0x04, 0x0c, 0x06, 0x66, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x17, 0x00, 0x00, 0x10, 0x26, 0x06, 0x09, 0x00, 0x00, 0x10, 0x06, 0x02, 0x88, 0x7d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x51, 0x00, 0x00, 0x01, 0xe5, 0x07, 0xf0, 0x12, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x02, 0xd3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x01, 0xd1, 0x06, 0x7c, 0x12, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x02, 0xbf, 0x00, 0x01, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x89, 0x01, 0x6b, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x00, 0xab, 0xfe, 0x89, 0x01, 0x54, 0x06, 0x14, 0x10, 0x26, 0x00, 0x4c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x02, 0xcd, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x89, 0x05, 0x44, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0xa3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x89, 0x04, 0x03, 0x04, 0x7b, 0x10, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x07, 0xf0, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0xa3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x7b, 0x12, 0x26, 0x00, 0x52, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x3a, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2a, 0x61, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x53, 0x06, 0xc5, 0x10, 0x27, 0x11, 0x2a, 0xff, 0xbd, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x3a, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2b, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0xc6, 0x10, 0x27, 0x11, 0x2b, 0xff, 0xbc, 0xfe, 0x8c, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x5b, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x31, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x44, 0x06, 0xe6, 0x10, 0x27, 0x11, 0x31, 0xff, 0xbd, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x08, 0x75, 0x12, 0x26, 0x00, 0x32, 0x00, 0x00, 0x10, 0x06, 0x11, 0x2c, 0x5b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x07, 0x00, 0x10, 0x27, 0x11, 0x2c, 0xff, 0xbd, 0xfe, 0x8b, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0x89, 0x05, 0x44, 0x07, 0x6d, 0x12, 0x26, 0x00, 0x96, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0xa3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x89, 0x04, 0x03, 0x06, 0x66, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x01, 0x00, 0x00, 0x10, 0x26, 0x06, 0x1d, 0x00, 0x00, 0x10, 0x06, 0x02, 0x88, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xe3, 0x05, 0x81, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xec, 0x04, 0xa3, 0x01, 0x75, 0x12, 0x06, 0x01, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xe3, 0x04, 0x58, 0x06, 0x66, 0x10, 0x26, 0x00, 0x76, 0x68, 0x00, 0x12, 0x06, 0x01, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xe3, 0x05, 0x81, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xee, 0x04, 0xa3, 0x01, 0x75, 0x12, 0x06, 0x01, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xe3, 0x04, 0x58, 0x06, 0x66, 0x10, 0x26, 0x00, 0x43, 0x68, 0x00, 0x12, 0x06, 0x01, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xe3, 0x05, 0x81, 0x07, 0xf0, 0x12, 0x26, 0x01, 0x62, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0xa3, 0x01, 0x75, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xe3, 0x04, 0x58, 0x06, 0x7b, 0x12, 0x26, 0x01, 0x63, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0xe3, 0x05, 0x81, 0x07, 0x5e, 0x10, 0x27, 0x10, 0xed, 0x04, 0xa3, 0x01, 0x75, 0x12, 0x06, 0x01, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xff, 0xe3, 0x04, 0x58, 0x06, 0x37, 0x10, 0x26, 0x02, 0x9e, 0x68, 0x00, 0x12, 0x06, 0x01, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xfe, 0x89, 0x05, 0x81, 0x06, 0x14, 0x12, 0x26, 0x01, 0x62, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0xa3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6a, 0xfe, 0x89, 0x04, 0x58, 0x04, 0xeb, 0x12, 0x26, 0x01, 0x63, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x01, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xfe, 0x89, 0x04, 0xa5, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x76, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xfe, 0x89, 0x03, 0xe9, 0x04, 0x7b, 0x10, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x08, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x07, 0xf0, 0x12, 0x26, 0x00, 0x38, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x70, 0x01, 0x75, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x06, 0x7b, 0x12, 0x26, 0x00, 0x58, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9b, 0xff, 0xf7, 0x05, 0xbc, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xec, 0x04, 0x70, 0x01, 0x75, 0x12, 0x06, 0x01, 0x71, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xe3, 0x04, 0xdf, 0x06, 0x66, 0x10, 0x26, 0x00, 0x76, 0x6f, 0x00, 0x12, 0x06, 0x01, 0x72, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9b, 0xff, 0xf7, 0x05, 0xbc, 0x07, 0x6b, 0x10, 0x27, 0x10, 0xee, 0x04, 0x70, 0x01, 0x75, 0x12, 0x06, 0x01, 0x71, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xe3, 0x04, 0xdf, 0x06, 0x66, 0x10, 0x26, 0x00, 0x43, 0x6f, 0x00, 0x12, 0x06, 0x01, 0x72, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9b, 0xff, 0xf7, 0x05, 0xbc, 0x07, 0xf0, 0x12, 0x26, 0x01, 0x71, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x70, 0x01, 0x75, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xe3, 0x04, 0xdf, 0x06, 0x7b, 0x12, 0x26, 0x01, 0x72, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9b, 0xff, 0xf7, 0x05, 0xbc, 0x07, 0x5e, 0x10, 0x27, 0x10, 0xed, 0x04, 0x70, 0x01, 0x75, 0x12, 0x06, 0x01, 0x71, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xff, 0xe3, 0x04, 0xdf, 0x06, 0x37, 0x10, 0x26, 0x02, 0x9e, 0x73, 0x00, 0x12, 0x06, 0x01, 0x72, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9b, 0xfe, 0x89, 0x05, 0xbc, 0x06, 0x14, 0x12, 0x26, 0x01, 0x71, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x76, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9e, 0xfe, 0x89, 0x04, 0xdf, 0x04, 0xeb, 0x12, 0x26, 0x01, 0x72, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x04, 0x08, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x72, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x10, 0x07, 0x10, 0xee, 0x04, 0x00, 0x01, 0x7c, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x6b, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x10, 0x06, 0x00, 0x43, 0x1e, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0xfe, 0x89, 0x04, 0x6a, 0x05, 0xd5, 0x10, 0x27, 0x02, 0xd4, 0x04, 0x04, 0x00, 0x00, 0x12, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x27, 0x02, 0xd4, 0x04, 0xe8, 0x00, 0x00, 0x12, 0x06, 0x00, 0x5c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0xf7, 0x12, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x04, 0x00, 0x01, 0x7c, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x82, 0x12, 0x26, 0x00, 0x5c, 0x00, 0x00, 0x10, 0x07, 0x02, 0xba, 0x03, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x5e, 0x10, 0x27, 0x10, 0xed, 0x04, 0x00, 0x01, 0x75, 0x12, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x06, 0x37, 0x10, 0x26, 0x02, 0x9e, 0x6b, 0x00, 0x12, 0x06, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x80, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0xb5, 0xb6, 0xd1, 0xb5, 0x02, 0x8f, 0xfb, 0x35, 0x05, 0xd5, 0xfa, 0xd5, 0x05, 0x2b, 0xfa, 0xd5, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1c, 0x00, 0x00, 0x03, 0x54, 0x06, 0x14, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xae, 0xa5, 0xca, 0xa5, 0x91, 0x91, 0xa5, 0xca, 0xa5, 0x91, 0x91, 0x06, 0x14, 0x93, 0x93, 0x93, 0x7d, 0xfa, 0xfc, 0x05, 0x04, 0xfa, 0xfc, 0x05, 0x04, 0x7d, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x61, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfc, 0x65, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x61, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x07, 0x34, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x07, 0x07, 0x09, 0x00, 0x85, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0a, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0x00, 0x90, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0b, 0x6a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x07, 0x18, 0x3d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x06, 0x61, 0x10, 0x26, 0x03, 0x26, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xff, 0x39, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x06, 0x61, 0x10, 0x26, 0x03, 0x26, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x06, 0x42, 0x06, 0x66, 0x10, 0x27, 0x03, 0x26, 0x01, 0x64, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x89, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x06, 0x42, 0x06, 0x66, 0x10, 0x27, 0x03, 0x26, 0x01, 0x64, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0x7b, 0x06, 0x66, 0x10, 0x27, 0x03, 0x26, 0x00, 0x9d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x64, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x05, 0xb6, 0x06, 0x66, 0x10, 0x27, 0x03, 0x26, 0x00, 0xd8, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0x0a, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x26, 0x2c, 0x00, 0x10, 0x07, 0x07, 0x0b, 0xff, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x05, 0x4a, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x26, 0x6c, 0x00, 0x10, 0x07, 0x07, 0x18, 0xff, 0x60, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x61, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfc, 0x3d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x61, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x07, 0x34, 0x33, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x66, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x1d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x66, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x21, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x80, 0x06, 0x66, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0a, 0x47, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x9d, 0x06, 0x66, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x07, 0x17, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x04, 0xa9, 0x06, 0x61, 0x10, 0x27, 0x03, 0x2a, 0x00, 0x92, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x04, 0xa9, 0x06, 0x61, 0x10, 0x27, 0x03, 0x2a, 0x00, 0x92, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x06, 0x7f, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2a, 0x02, 0x68, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x89, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x06, 0x8f, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2a, 0x02, 0x78, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x06, 0x03, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2a, 0x01, 0xeb, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x64, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x06, 0x39, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2a, 0x02, 0x21, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x61, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0x00, 0x95, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x61, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0x00, 0x92, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x73, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x65, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0a, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0x00, 0x9d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0b, 0x00, 0x8c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x06, 0x07, 0x18, 0x7a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0x52, 0x06, 0x61, 0x10, 0x27, 0x03, 0x2c, 0x00, 0x9d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0x4f, 0x06, 0x61, 0x10, 0x27, 0x03, 0x2c, 0x00, 0x9a, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x07, 0x1d, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2c, 0x02, 0x68, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x89, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x07, 0x23, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2c, 0x02, 0x6d, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x06, 0xb0, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2c, 0x01, 0xfb, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x64, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x06, 0xdc, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2c, 0x02, 0x27, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x06, 0x04, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x2c, 0x01, 0x4f, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0b, 0xff, 0x62, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x06, 0x1d, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x2c, 0x01, 0x67, 0x00, 0x00, 0x10, 0x07, 0x07, 0x18, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8b, 0x00, 0x00, 0x02, 0x30, 0x06, 0x61, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xff, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, 0x00, 0x00, 0x02, 0x30, 0x06, 0x61, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xff, 0x24, 0x00, 0x00, 0xff, 0xff, 0xff, 0xb8, 0x00, 0x00, 0x02, 0x74, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x09, 0xff, 0x3d, 0x00, 0x00, 0xff, 0xff, 0xff, 0xc1, 0x00, 0x00, 0x02, 0x80, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x16, 0xff, 0x50, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0x9b, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x62, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd7, 0x00, 0x00, 0x02, 0xa3, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x50, 0x00, 0x00, 0xff, 0xff, 0xff, 0xd0, 0x00, 0x00, 0x02, 0x30, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0b, 0xff, 0x2c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xcb, 0x00, 0x00, 0x02, 0x30, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x18, 0xff, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x02, 0x08, 0x06, 0x61, 0x10, 0x27, 0x03, 0x2e, 0x00, 0x9d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x01, 0xfd, 0x06, 0x61, 0x10, 0x27, 0x03, 0x2e, 0x00, 0x92, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x03, 0xde, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2e, 0x02, 0x72, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x89, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x03, 0xde, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2e, 0x02, 0x72, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x03, 0x67, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2e, 0x01, 0xfc, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x64, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x03, 0x9d, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2e, 0x02, 0x32, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x02, 0xd2, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x2e, 0x01, 0x67, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0b, 0xff, 0x62, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x02, 0xd9, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x2e, 0x01, 0x6d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x18, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x61, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfc, 0x6c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x61, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x06, 0x07, 0x34, 0x63, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x5b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x4c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0a, 0x7a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0x00, 0x82, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xff, 0xe3, 0x05, 0x63, 0x06, 0x61, 0x10, 0x26, 0x03, 0x34, 0x20, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xfe, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xff, 0xe3, 0x05, 0xb4, 0x06, 0x61, 0x10, 0x26, 0x03, 0x34, 0x70, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xff, 0xe3, 0x07, 0x7b, 0x06, 0x66, 0x10, 0x27, 0x03, 0x34, 0x02, 0x37, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x89, 0x00, 0xff, 0xff, 0x00, 0x05, 0xff, 0xe3, 0x07, 0x84, 0x06, 0x66, 0x10, 0x27, 0x03, 0x34, 0x02, 0x40, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x06, 0xff, 0xe3, 0x06, 0x5b, 0x06, 0x66, 0x10, 0x27, 0x03, 0x34, 0x01, 0x17, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x64, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xff, 0xe3, 0x06, 0x95, 0x06, 0x66, 0x10, 0x27, 0x03, 0x34, 0x01, 0x52, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x61, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfc, 0x37, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x61, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x34, 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x23, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x1e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0a, 0x56, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x17, 0x4e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x0b, 0x32, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x18, 0x16, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0xa9, 0x06, 0x61, 0x10, 0x27, 0x03, 0x39, 0x01, 0x3f, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x07, 0x33, 0x06, 0x66, 0x10, 0x27, 0x03, 0x39, 0x02, 0xc9, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x07, 0x4e, 0x06, 0x66, 0x10, 0x27, 0x03, 0x39, 0x02, 0xe4, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x06, 0x7b, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x39, 0x02, 0x11, 0x00, 0x00, 0x10, 0x07, 0x07, 0x18, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x61, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0x01, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x61, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0x01, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x09, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x16, 0x01, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0x01, 0x7a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0x01, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0b, 0x01, 0x40, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x18, 0x01, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0x81, 0x06, 0x61, 0x10, 0x26, 0x03, 0x3d, 0x46, 0x00, 0x10, 0x07, 0x06, 0xfc, 0xfe, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x05, 0xcd, 0x06, 0x61, 0x10, 0x27, 0x03, 0x3d, 0x00, 0x92, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x07, 0x92, 0x06, 0x66, 0x10, 0x27, 0x03, 0x3d, 0x02, 0x57, 0x00, 0x00, 0x10, 0x06, 0x07, 0x09, 0x89, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x00, 0x07, 0x9d, 0x06, 0x66, 0x10, 0x27, 0x03, 0x3d, 0x02, 0x62, 0x00, 0x00, 0x10, 0x06, 0x07, 0x16, 0x94, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x06, 0x8a, 0x06, 0x66, 0x10, 0x27, 0x03, 0x3d, 0x01, 0x4f, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0a, 0xff, 0x64, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x06, 0xba, 0x06, 0x66, 0x10, 0x27, 0x03, 0x3d, 0x01, 0x7f, 0x00, 0x00, 0x10, 0x07, 0x07, 0x17, 0xff, 0x7e, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x06, 0x5d, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x3d, 0x01, 0x22, 0x00, 0x00, 0x10, 0x07, 0x07, 0x0b, 0xff, 0x62, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0x00, 0x00, 0x06, 0x95, 0x07, 0x6d, 0x10, 0x27, 0x03, 0x3d, 0x01, 0x5a, 0x00, 0x00, 0x10, 0x07, 0x07, 0x18, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x07, 0x28, 0x68, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x66, 0x10, 0x06, 0x03, 0x40, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x66, 0x10, 0x26, 0x03, 0x49, 0x00, 0x00, 0x10, 0x06, 0x07, 0x28, 0x4c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x77, 0xff, 0xe3, 0x03, 0x68, 0x06, 0x66, 0x10, 0x06, 0x03, 0x41, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0x00, 0xb2, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x06, 0x03, 0x42, 0x00, 0x00, 0xff, 0xff, 0xff, 0x98, 0x00, 0x00, 0x02, 0x30, 0x06, 0x66, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x95, 0x00, 0x00, 0x02, 0x56, 0x06, 0x66, 0x10, 0x06, 0x03, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x26, 0x03, 0x53, 0x00, 0x00, 0x10, 0x06, 0x07, 0x28, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x66, 0x10, 0x06, 0x03, 0x60, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x28, 0x2b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x66, 0x10, 0x06, 0x03, 0x61, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0x01, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x06, 0x03, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x61, 0x10, 0x26, 0x06, 0x4c, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x61, 0x10, 0x26, 0x06, 0x4d, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x06, 0x4e, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x06, 0x4f, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x06, 0x50, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x06, 0x51, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x52, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x53, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x56, 0x04, 0xde, 0x06, 0x61, 0x10, 0x26, 0x06, 0x54, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x56, 0x04, 0xde, 0x06, 0x61, 0x10, 0x26, 0x06, 0x55, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x56, 0x06, 0x42, 0x06, 0x66, 0x10, 0x26, 0x06, 0x56, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x56, 0x06, 0x42, 0x06, 0x66, 0x10, 0x26, 0x06, 0x57, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x05, 0x7b, 0x06, 0x66, 0x10, 0x26, 0x06, 0x58, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x56, 0x05, 0xb6, 0x06, 0x66, 0x10, 0x26, 0x06, 0x59, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x05, 0x0a, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x5a, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x00, 0xd4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x56, 0x05, 0x4a, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x5b, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x13, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x61, 0x10, 0x26, 0x06, 0x68, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x61, 0x10, 0x26, 0x06, 0x69, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x06, 0x6a, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x06, 0x6b, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x06, 0x6c, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x06, 0x6d, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x6e, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x6f, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x05, 0x52, 0x06, 0x61, 0x10, 0x26, 0x06, 0x70, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x75, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x05, 0x4f, 0x06, 0x61, 0x10, 0x26, 0x06, 0x71, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x72, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x56, 0x07, 0x1d, 0x06, 0x66, 0x10, 0x26, 0x06, 0x72, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x03, 0x40, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x56, 0x07, 0x23, 0x06, 0x66, 0x10, 0x26, 0x06, 0x73, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x03, 0x45, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x06, 0xb0, 0x06, 0x66, 0x10, 0x26, 0x06, 0x74, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0xd3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x56, 0x06, 0xdc, 0x06, 0x66, 0x10, 0x26, 0x06, 0x75, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x06, 0x04, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x76, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x56, 0x06, 0x1d, 0x07, 0x6d, 0x10, 0x26, 0x06, 0x77, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x61, 0x10, 0x26, 0x06, 0xa0, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x61, 0x10, 0x26, 0x06, 0xa1, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x06, 0xa2, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x06, 0xa3, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x06, 0xa4, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x06, 0xa5, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x07, 0x6d, 0x10, 0x26, 0x06, 0xa6, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x07, 0x6d, 0x10, 0x26, 0x06, 0xa7, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x05, 0x81, 0x06, 0x61, 0x10, 0x26, 0x06, 0xa8, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x39, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x05, 0xcd, 0x06, 0x61, 0x10, 0x26, 0x06, 0xa9, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x01, 0x85, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x56, 0x07, 0x92, 0x06, 0x66, 0x10, 0x26, 0x06, 0xaa, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x03, 0x4a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x56, 0x07, 0x9d, 0x06, 0x66, 0x10, 0x26, 0x06, 0xab, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x03, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x06, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x06, 0xac, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x42, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0xfe, 0x56, 0x06, 0xba, 0x06, 0x66, 0x10, 0x26, 0x06, 0xad, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x72, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0xfe, 0x56, 0x06, 0x5d, 0x07, 0x6d, 0x10, 0x26, 0x06, 0xae, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x15, 0x00, 0x00, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x56, 0x06, 0x95, 0x07, 0x6d, 0x10, 0x26, 0x06, 0xaf, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x02, 0x4e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x48, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x02, 0x9a, 0x6e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x05, 0xf6, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x00, 0x71, 0x6d, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x06, 0xb0, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x04, 0x79, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x66, 0x10, 0x26, 0x03, 0x40, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x06, 0x37, 0x10, 0x26, 0x03, 0x45, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfd, 0x63, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x67, 0x06, 0x37, 0x10, 0x26, 0x06, 0xf3, 0x00, 0x00, 0x10, 0x06, 0x03, 0x16, 0x41, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x26, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf2, 0x04, 0x41, 0x01, 0x75, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x31, 0x10, 0x26, 0x03, 0x26, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0x00, 0xaa, 0x01, 0x3b, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x05, 0x19, 0x06, 0x66, 0x10, 0x26, 0x03, 0x26, 0x3b, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x06, 0x66, 0x10, 0x06, 0x03, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0xfe, 0x56, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x26, 0x03, 0x26, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x5f, 0x04, 0xc2, 0x02, 0x39, 0x06, 0x61, 0x10, 0x06, 0x06, 0xfc, 0x00, 0x00, 0xff, 0xff, 0x01, 0x8a, 0xfe, 0x56, 0x02, 0x51, 0xff, 0xa4, 0x10, 0x06, 0x03, 0x16, 0x00, 0x00, 0x00, 0x01, 0x01, 0x5f, 0x04, 0xc2, 0x02, 0x39, 0x06, 0x61, 0x00, 0x08, 0x00, 0x00, 0x01, 0x10, 0x23, 0x35, 0x16, 0x35, 0x23, 0x35, 0x33, 0x02, 0x39, 0xda, 0x79, 0x78, 0xd9, 0x05, 0xcd, 0xfe, 0xf5, 0x67, 0x03, 0x9d, 0x9e, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa3, 0x05, 0x1d, 0x02, 0xf6, 0x06, 0x37, 0x10, 0x06, 0x02, 0x9e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa3, 0x05, 0x46, 0x02, 0xf6, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xed, 0x03, 0x9a, 0x01, 0x84, 0x12, 0x06, 0x00, 0x6a, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x06, 0xb4, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x04, 0x7b, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x66, 0x10, 0x26, 0x03, 0x42, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x37, 0x10, 0x26, 0x03, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfd, 0x00, 0x82, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x37, 0x10, 0x26, 0x07, 0x02, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0xff, 0x4c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x05, 0x56, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2a, 0x01, 0x3f, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe9, 0x00, 0x00, 0x04, 0xea, 0x06, 0x66, 0x10, 0x06, 0x03, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x05, 0xff, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2c, 0x01, 0x49, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x00, 0x05, 0x83, 0x06, 0x66, 0x10, 0x06, 0x03, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0xb6, 0x05, 0xd5, 0x10, 0x26, 0x03, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x00, 0xe6, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0x04, 0xc2, 0x03, 0x37, 0x06, 0x66, 0x10, 0x27, 0x06, 0xfc, 0xff, 0x1c, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0x00, 0xee, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa2, 0x04, 0xc2, 0x03, 0x39, 0x06, 0x66, 0x10, 0x27, 0x06, 0xfc, 0xff, 0x43, 0x00, 0x00, 0x10, 0x06, 0x07, 0x33, 0x3b, 0x00, 0xff, 0xff, 0x00, 0xa3, 0x04, 0xc2, 0x02, 0xf6, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xed, 0x03, 0x9a, 0x01, 0x84, 0x10, 0x06, 0x06, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xff, 0xed, 0x00, 0x00, 0x02, 0x30, 0x06, 0x48, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9a, 0xff, 0x3a, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe5, 0x00, 0x00, 0x02, 0x30, 0x05, 0xf6, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0xff, 0x26, 0x00, 0x00, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x00, 0x02, 0x30, 0x07, 0xd2, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x07, 0x26, 0xff, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x04, 0x00, 0x00, 0x02, 0x40, 0x07, 0xd2, 0x10, 0x06, 0x03, 0x25, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe6, 0x00, 0x00, 0x02, 0x39, 0x06, 0x37, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfd, 0xff, 0x43, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x02, 0x3b, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x4d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfe, 0xff, 0x45, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf6, 0x00, 0x00, 0x02, 0x2a, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x2e, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf2, 0x02, 0xdd, 0x01, 0x75, 0xff, 0xff, 0x00, 0x02, 0x00, 0x00, 0x02, 0x1d, 0x07, 0x31, 0x10, 0x26, 0x03, 0x2e, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0xff, 0x43, 0x01, 0x3b, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x02, 0xb7, 0x06, 0x66, 0x10, 0x27, 0x03, 0x2e, 0x01, 0x4c, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0x3e, 0x06, 0x66, 0x10, 0x06, 0x03, 0x21, 0x00, 0x00, 0xff, 0xff, 0x00, 0x71, 0x04, 0xc2, 0x03, 0x31, 0x06, 0x66, 0x10, 0x27, 0x07, 0x34, 0xff, 0x12, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0x00, 0xe8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0x04, 0xc2, 0x03, 0x53, 0x06, 0x66, 0x10, 0x27, 0x07, 0x34, 0xff, 0x27, 0x00, 0x00, 0x10, 0x06, 0x07, 0x33, 0x56, 0x00, 0xff, 0xff, 0x00, 0xa3, 0x04, 0xc2, 0x02, 0xf6, 0x07, 0x6d, 0x10, 0x27, 0x10, 0xed, 0x03, 0x9a, 0x01, 0x84, 0x10, 0x06, 0x07, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x48, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x02, 0x9a, 0x23, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x05, 0xf6, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x00, 0x71, 0x20, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x07, 0xd2, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x07, 0x26, 0x18, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x07, 0xd2, 0x10, 0x06, 0x03, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x61, 0x10, 0x26, 0x03, 0x55, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfc, 0x00, 0xa8, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x61, 0x10, 0x26, 0x03, 0x55, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0x00, 0x9f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x06, 0x37, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfd, 0x23, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x86, 0xff, 0xe3, 0x03, 0xc0, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x59, 0x00, 0x00, 0x10, 0x06, 0x06, 0xfe, 0x17, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x6d, 0x10, 0x26, 0x03, 0x39, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf2, 0x04, 0x04, 0x01, 0x75, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x07, 0x31, 0x10, 0x26, 0x03, 0x39, 0x00, 0x00, 0x10, 0x07, 0x00, 0x71, 0x00, 0x74, 0x01, 0x3b, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x06, 0x1a, 0x06, 0x66, 0x10, 0x27, 0x03, 0x39, 0x01, 0xb0, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe4, 0x00, 0x00, 0x05, 0xe9, 0x06, 0x66, 0x10, 0x06, 0x03, 0x23, 0x00, 0x00, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x04, 0xb0, 0x06, 0x61, 0x10, 0x27, 0x03, 0x36, 0x00, 0x97, 0x00, 0x00, 0x10, 0x07, 0x07, 0x34, 0xfe, 0xa7, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x05, 0x46, 0x02, 0xd9, 0x07, 0xd2, 0x12, 0x26, 0x00, 0x6a, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0x00, 0x00, 0x01, 0x6c, 0xff, 0xff, 0x00, 0xc1, 0x05, 0x46, 0x02, 0xfd, 0x07, 0xd2, 0x10, 0x06, 0x03, 0x1c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x04, 0xf0, 0x02, 0x49, 0x06, 0x66, 0x10, 0x06, 0x00, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x06, 0xbc, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x04, 0x60, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x66, 0x10, 0x26, 0x03, 0x62, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x06, 0x37, 0x10, 0x26, 0x03, 0x5d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfd, 0x01, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xfe, 0x56, 0x05, 0x8a, 0x06, 0x37, 0x10, 0x26, 0x07, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x03, 0x16, 0x01, 0x36, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xe3, 0x06, 0x5f, 0x06, 0x66, 0x10, 0x27, 0x03, 0x34, 0x01, 0x1c, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xe3, 0x05, 0x68, 0x06, 0x66, 0x10, 0x06, 0x03, 0x22, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x06, 0x5e, 0x06, 0x66, 0x10, 0x27, 0x03, 0x3d, 0x01, 0x24, 0x00, 0x00, 0x10, 0x07, 0x07, 0x28, 0xff, 0x63, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0x00, 0x00, 0x05, 0x6b, 0x06, 0x66, 0x10, 0x06, 0x03, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, 0xfe, 0x56, 0x05, 0x3b, 0x05, 0xe7, 0x10, 0x26, 0x03, 0x3d, 0x00, 0x00, 0x10, 0x07, 0x06, 0xfb, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x01, 0x4d, 0x04, 0xee, 0x02, 0xfd, 0x06, 0x66, 0x10, 0x06, 0x00, 0x76, 0x00, 0x00, 0x00, 0x01, 0x01, 0x5f, 0x04, 0xc2, 0x02, 0x39, 0x06, 0x61, 0x00, 0x08, 0x00, 0x00, 0x01, 0x35, 0x33, 0x15, 0x23, 0x14, 0x37, 0x15, 0x22, 0x01, 0x5f, 0xd9, 0x78, 0x79, 0xda, 0x05, 0xcd, 0x94, 0x9e, 0x9d, 0x03, 0x67, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xdf, 0x02, 0x40, 0x02, 0x83, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x5a, 0x01, 0xe5, 0xfe, 0x1b, 0x02, 0x83, 0xa4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5a, 0x01, 0xdf, 0x02, 0x40, 0x02, 0x83, 0x12, 0x06, 0x07, 0x45, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xe9, 0x04, 0x3b, 0x02, 0x79, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x5a, 0x03, 0xe1, 0xfc, 0x1f, 0x02, 0x79, 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xe9, 0x03, 0x40, 0x02, 0x79, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x5a, 0x02, 0xe6, 0xfd, 0x1a, 0x02, 0x79, 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xe9, 0x06, 0xda, 0x02, 0x79, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x5a, 0x06, 0x7f, 0xf9, 0x81, 0x02, 0x79, 0x90, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0xe9, 0x07, 0x34, 0x02, 0x79, 0x00, 0x03, 0x00, 0x00, 0x11, 0x21, 0x15, 0x21, 0x07, 0x33, 0xf8, 0xcd, 0x02, 0x79, 0x90, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xea, 0xfe, 0x1d, 0x02, 0xac, 0x06, 0x1d, 0x10, 0x26, 0x00, 0x5f, 0x00, 0x00, 0x10, 0x07, 0x00, 0x5f, 0x01, 0x29, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0xfe, 0x1d, 0x03, 0xac, 0xff, 0xee, 0x10, 0x26, 0x00, 0x42, 0x00, 0x00, 0x10, 0x07, 0x00, 0x42, 0x00, 0x00, 0x01, 0x42, 0x00, 0x01, 0x00, 0x9c, 0x03, 0xe9, 0x01, 0xa5, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x01, 0x23, 0x35, 0x13, 0x33, 0x03, 0x01, 0x5a, 0xbd, 0x93, 0x74, 0x4a, 0x03, 0xe9, 0xad, 0x01, 0x3f, 0xfe, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x03, 0xfe, 0x01, 0xa8, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x13, 0x33, 0x15, 0x03, 0x23, 0x13, 0xea, 0xbe, 0x94, 0x74, 0x4a, 0x05, 0xd5, 0x98, 0xfe, 0xc1, 0x01, 0x3f, 0x00, 0x01, 0x00, 0x9c, 0xff, 0x12, 0x01, 0xa5, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x00, 0x37, 0x33, 0x15, 0x03, 0x23, 0x13, 0xe6, 0xbe, 0x93, 0x74, 0x49, 0xfe, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0x00, 0x00, 0x01, 0x00, 0xa0, 0x03, 0xfe, 0x01, 0xa8, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x01, 0x15, 0x13, 0x23, 0x03, 0x35, 0x01, 0x5e, 0x4a, 0x74, 0x94, 0x05, 0xd5, 0x98, 0xfe, 0xc1, 0x01, 0x3f, 0x98, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9c, 0x03, 0xe9, 0x03, 0x16, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x23, 0x35, 0x13, 0x33, 0x03, 0x05, 0x23, 0x35, 0x13, 0x33, 0x03, 0x01, 0x5a, 0xbd, 0x93, 0x74, 0x4a, 0x01, 0x72, 0xbe, 0x93, 0x74, 0x49, 0x03, 0xe9, 0xad, 0x01, 0x3f, 0xfe, 0xc1, 0xad, 0xad, 0x01, 0x3f, 0xfe, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9c, 0x03, 0xe9, 0x03, 0x16, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x15, 0x03, 0x23, 0x13, 0x25, 0x33, 0x15, 0x03, 0x23, 0x13, 0xe6, 0xbe, 0x93, 0x74, 0x49, 0x01, 0x71, 0xbe, 0x93, 0x74, 0x49, 0x05, 0xd5, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0xac, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0x00, 0x02, 0x00, 0x9c, 0xff, 0x12, 0x03, 0x16, 0x00, 0xfe, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x33, 0x15, 0x03, 0x23, 0x13, 0x25, 0x33, 0x15, 0x03, 0x23, 0x13, 0x02, 0x57, 0xbe, 0x93, 0x74, 0x49, 0xfe, 0x8f, 0xbe, 0x93, 0x74, 0x49, 0xfe, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0xac, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0x00, 0x02, 0x00, 0x9c, 0x03, 0xe9, 0x03, 0x16, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x15, 0x13, 0x23, 0x03, 0x35, 0x21, 0x15, 0x13, 0x23, 0x03, 0x35, 0x01, 0x5a, 0x4a, 0x74, 0x93, 0x02, 0x2f, 0x49, 0x74, 0x93, 0x05, 0xd5, 0xad, 0xfe, 0xc1, 0x01, 0x3f, 0xad, 0xad, 0xfe, 0xc1, 0x01, 0x3f, 0xad, 0x00, 0x01, 0x00, 0x33, 0xff, 0x3b, 0x03, 0x67, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x01, 0x7e, 0x9e, 0x01, 0x4a, 0xfe, 0xb6, 0x9e, 0xfe, 0xb5, 0x01, 0x4b, 0x05, 0xd5, 0xfe, 0x5c, 0x99, 0xfb, 0xa3, 0x04, 0x5d, 0x99, 0x00, 0x01, 0x00, 0x33, 0xff, 0x3b, 0x03, 0x67, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x25, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x03, 0x66, 0xfe, 0xb6, 0x9e, 0xfe, 0xb5, 0x01, 0x4b, 0xfe, 0xb5, 0x01, 0x4b, 0x9e, 0x01, 0x4a, 0xfe, 0xb6, 0x01, 0x4a, 0xdf, 0xfe, 0x5c, 0x01, 0xa4, 0x9a, 0x02, 0x1f, 0x99, 0x01, 0xa4, 0xfe, 0x5c, 0x99, 0xfd, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x01, 0x14, 0x01, 0xd1, 0x03, 0x2b, 0x04, 0x21, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x14, 0x9c, 0x71, 0x70, 0x9a, 0x9b, 0x70, 0x71, 0x9b, 0x02, 0xfa, 0x7c, 0xab, 0xab, 0x7c, 0x7d, 0xac, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x14, 0x01, 0x81, 0x03, 0x73, 0x04, 0x71, 0x00, 0x02, 0x00, 0x00, 0x01, 0x11, 0x01, 0x01, 0x14, 0x02, 0x5f, 0x01, 0x81, 0x02, 0xf0, 0xfe, 0x88, 0x00, 0x00, 0x01, 0x00, 0xd4, 0x00, 0x00, 0x01, 0x95, 0x00, 0xfe, 0x00, 0x03, 0x00, 0x00, 0x37, 0x33, 0x15, 0x23, 0xd4, 0xc0, 0xc0, 0xfe, 0xfe, 0x00, 0x00, 0x02, 0x00, 0xd4, 0x00, 0x00, 0x03, 0xfa, 0x00, 0xfe, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x03, 0x3a, 0xc0, 0xc0, 0xfd, 0x9a, 0xc0, 0xc0, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x03, 0x00, 0xd4, 0x00, 0x00, 0x06, 0x5f, 0x00, 0xfe, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x03, 0x3a, 0xbf, 0xbf, 0x02, 0x65, 0xc0, 0xc0, 0xfb, 0x35, 0xc0, 0xc0, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0x00, 0x01, 0x00, 0xc6, 0x02, 0x6b, 0x01, 0x84, 0x03, 0x69, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0xc6, 0xbe, 0xbe, 0x03, 0x69, 0xfe, 0x00, 0x07, 0x00, 0x65, 0xff, 0xe3, 0x09, 0x45, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x27, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x4b, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x21, 0x33, 0x01, 0x23, 0x13, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x08, 0x0f, 0x4f, 0x5a, 0x5a, 0x4f, 0x4c, 0x59, 0x59, 0x4c, 0x8e, 0xa7, 0xa8, 0x8d, 0x90, 0xa8, 0xa9, 0xfa, 0x1b, 0x8f, 0xa9, 0xa9, 0x8f, 0x8f, 0xa6, 0xa7, 0x03, 0xbb, 0x90, 0xfc, 0xb7, 0x90, 0x1c, 0x4d, 0x59, 0x58, 0x4e, 0x4f, 0x59, 0x5a, 0x03, 0x53, 0x8e, 0xa8, 0xa9, 0x8d, 0x90, 0xa7, 0xa8, 0x8f, 0x4e, 0x59, 0x59, 0x4e, 0x4d, 0x59, 0x59, 0x02, 0x91, 0x94, 0x84, 0x82, 0x95, 0x95, 0x82, 0x83, 0x95, 0x7f, 0xdc, 0xbb, 0xbb, 0xdb, 0xdb, 0xbb, 0xbc, 0xdb, 0x02, 0xe0, 0xdb, 0xbb, 0xbd, 0xda, 0xdb, 0xbc, 0xba, 0xdc, 0xf9, 0xf3, 0x05, 0x8e, 0x95, 0x82, 0x84, 0x94, 0x94, 0x84, 0x81, 0x96, 0xfd, 0x9f, 0xdc, 0xbb, 0xbb, 0xdb, 0xdb, 0xbb, 0xbc, 0xdb, 0x7f, 0x94, 0x84, 0x82, 0x95, 0x95, 0x82, 0x83, 0x95, 0x00, 0x00, 0x09, 0x00, 0x65, 0xff, 0xe3, 0x0c, 0x1a, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x45, 0x00, 0x50, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x10, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x05, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x10, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x00, 0x20, 0x16, 0x15, 0x14, 0x06, 0x20, 0x26, 0x35, 0x34, 0x25, 0x33, 0x01, 0x23, 0x12, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x01, 0x32, 0x16, 0x10, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x0a, 0xe4, 0x4e, 0x5a, 0x5a, 0x4e, 0x4d, 0x59, 0x59, 0x4d, 0x8e, 0xa8, 0xa8, 0x8e, 0x90, 0xa7, 0xa8, 0xfd, 0xba, 0x4f, 0x5a, 0x5a, 0x4f, 0x4c, 0x59, 0x59, 0x4c, 0x8e, 0xa7, 0xa8, 0x8d, 0x90, 0xa8, 0xa9, 0xf9, 0x8d, 0x01, 0x1d, 0xa9, 0xa9, 0xfe, 0xe2, 0xa6, 0x04, 0x62, 0x90, 0xfc, 0xb7, 0x90, 0x6a, 0x9b, 0x59, 0x58, 0x9d, 0x59, 0x02, 0xf9, 0x8e, 0xa8, 0xa9, 0x8d, 0x90, 0xa7, 0xa8, 0x8f, 0x4e, 0x59, 0x59, 0x4e, 0x4d, 0x59, 0x59, 0x02, 0x91, 0x94, 0x84, 0x82, 0x95, 0x95, 0x82, 0x83, 0x95, 0x7f, 0xdc, 0xfe, 0x8a, 0xdb, 0xdb, 0xbb, 0xbc, 0xdb, 0x7f, 0x94, 0x84, 0x82, 0x95, 0x95, 0x82, 0x83, 0x95, 0x7f, 0xdc, 0xfe, 0x8a, 0xdb, 0xdb, 0xbb, 0xbc, 0xdb, 0x02, 0xe0, 0xdb, 0xbb, 0xbd, 0xda, 0xdb, 0xbc, 0xba, 0xdc, 0xf9, 0xf3, 0x05, 0x8e, 0x95, 0x82, 0x84, 0x94, 0x94, 0x84, 0x81, 0xfe, 0x35, 0xdc, 0xfe, 0x8a, 0xdb, 0xdb, 0xbb, 0xbc, 0xdb, 0x7f, 0x94, 0x84, 0x82, 0x95, 0x95, 0x82, 0x83, 0x95, 0x00, 0x01, 0x00, 0x24, 0x04, 0x60, 0x01, 0x77, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x1b, 0x01, 0x33, 0x01, 0x24, 0x9c, 0xb6, 0xfe, 0xfc, 0x04, 0x60, 0x01, 0x75, 0xfe, 0x8b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x04, 0x60, 0x02, 0x85, 0x05, 0xd5, 0x10, 0x26, 0x07, 0x67, 0x00, 0x00, 0x10, 0x07, 0x07, 0x67, 0x01, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x04, 0x60, 0x03, 0x93, 0x05, 0xd5, 0x10, 0x27, 0x07, 0x67, 0x01, 0x0e, 0x00, 0x00, 0x10, 0x26, 0x07, 0x67, 0x00, 0x00, 0x10, 0x07, 0x07, 0x67, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0x04, 0x60, 0x01, 0x77, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x01, 0x23, 0x01, 0x33, 0x01, 0x76, 0x4e, 0xfe, 0xfc, 0xb7, 0x04, 0x60, 0x01, 0x75, 0xff, 0xff, 0x00, 0x24, 0x04, 0x60, 0x02, 0x85, 0x05, 0xd5, 0x10, 0x26, 0x07, 0x6a, 0x00, 0x00, 0x10, 0x07, 0x07, 0x6a, 0x01, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x04, 0x60, 0x03, 0x93, 0x05, 0xd5, 0x10, 0x26, 0x07, 0x6a, 0x00, 0x00, 0x10, 0x27, 0x07, 0x6a, 0x02, 0x1c, 0x00, 0x00, 0x10, 0x07, 0x07, 0x6a, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0xfe, 0x1d, 0x02, 0x67, 0xff, 0xc3, 0x00, 0x05, 0x00, 0x00, 0x01, 0x23, 0x27, 0x07, 0x23, 0x01, 0x02, 0x67, 0x85, 0xa9, 0xa9, 0x86, 0x01, 0x30, 0xfe, 0x1d, 0xf9, 0xf9, 0x01, 0xa6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8e, 0x00, 0x8d, 0x02, 0x35, 0x04, 0x23, 0x00, 0x06, 0x00, 0x00, 0x01, 0x15, 0x09, 0x01, 0x15, 0x01, 0x35, 0x02, 0x34, 0xfe, 0xf1, 0x01, 0x0f, 0xfe, 0x5a, 0x04, 0x23, 0xbf, 0xfe, 0xf4, 0xfe, 0xf4, 0xbf, 0x01, 0xa2, 0x52, 0x00, 0x01, 0x00, 0xad, 0x00, 0x8d, 0x02, 0x54, 0x04, 0x23, 0x00, 0x06, 0x00, 0x00, 0x13, 0x01, 0x15, 0x01, 0x35, 0x09, 0x01, 0xae, 0x01, 0xa6, 0xfe, 0x5a, 0x01, 0x0f, 0xfe, 0xf1, 0x04, 0x23, 0xfe, 0x5e, 0x52, 0xfe, 0x5e, 0xbf, 0x01, 0x0c, 0x01, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xaf, 0x00, 0x04, 0x05, 0x54, 0x05, 0xcc, 0x12, 0x26, 0x00, 0x99, 0x00, 0x4b, 0x10, 0x27, 0x00, 0x11, 0xff, 0xea, 0x02, 0x4e, 0x10, 0x27, 0x00, 0x11, 0x01, 0xe1, 0x00, 0x04, 0x10, 0x27, 0x00, 0x11, 0x03, 0xd0, 0x02, 0x4e, 0x10, 0x07, 0x00, 0x11, 0x01, 0xe1, 0x04, 0xce, 0xff, 0xff, 0x00, 0x84, 0x00, 0x00, 0x02, 0xfb, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x04, 0xff, 0x6e, 0x00, 0x00, 0x10, 0x07, 0x00, 0x04, 0x01, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x84, 0x00, 0x00, 0x03, 0x52, 0x05, 0xf0, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x24, 0x00, 0x00, 0x01, 0x23, 0x11, 0x06, 0x07, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x07, 0x0e, 0x01, 0x15, 0x03, 0x33, 0x15, 0x23, 0x13, 0x11, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x26, 0x02, 0x11, 0xac, 0x1c, 0x1d, 0x50, 0x58, 0x55, 0xae, 0x5c, 0xa6, 0xc9, 0x41, 0x51, 0x4f, 0x2b, 0x23, 0x07, 0x05, 0x06, 0xb1, 0xb7, 0xb7, 0xb1, 0x29, 0x33, 0x2e, 0x3b, 0x21, 0x01, 0x91, 0x03, 0xad, 0x08, 0x0d, 0x23, 0x43, 0xbc, 0x39, 0x38, 0xc2, 0x9f, 0x4c, 0x89, 0x56, 0x56, 0x2f, 0x35, 0x19, 0x15, 0x3c, 0x34, 0xfe, 0xf2, 0xfe, 0x05, 0x42, 0xfe, 0x52, 0x2d, 0x35, 0x5e, 0x31, 0x59, 0x37, 0x1f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x05, 0x7c, 0x03, 0xac, 0x06, 0x0b, 0x10, 0x07, 0x00, 0x42, 0x00, 0x00, 0x07, 0x5f, 0x00, 0x00, 0x00, 0x01, 0xff, 0xaf, 0xfe, 0x1b, 0x06, 0x1a, 0xff, 0x85, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x32, 0x24, 0x37, 0x15, 0x06, 0x04, 0x23, 0x22, 0x24, 0x27, 0x35, 0x16, 0x04, 0x02, 0xe4, 0xd0, 0x01, 0x97, 0xcf, 0xd4, 0xfe, 0x67, 0xc9, 0xc9, 0xfe, 0x69, 0xd4, 0xcf, 0x01, 0x95, 0xfe, 0xb5, 0x68, 0x68, 0x7e, 0x76, 0x76, 0x75, 0x77, 0x7e, 0x69, 0x67, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xaf, 0x06, 0x04, 0x06, 0x1a, 0x07, 0x6e, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x32, 0x04, 0x17, 0x15, 0x26, 0x24, 0x23, 0x22, 0x04, 0x07, 0x35, 0x36, 0x24, 0x02, 0xe4, 0xc9, 0x01, 0x99, 0xd4, 0xcf, 0xfe, 0x69, 0xd0, 0xd0, 0xfe, 0x6b, 0xcf, 0xd4, 0x01, 0x97, 0x07, 0x6e, 0x76, 0x76, 0x7e, 0x68, 0x68, 0x67, 0x69, 0x7e, 0x77, 0x75, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xb2, 0xfe, 0x1d, 0x02, 0x0f, 0x01, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x09, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x01, 0xb6, 0x58, 0xfe, 0xff, 0x01, 0x01, 0x58, 0xd5, 0xd5, 0x59, 0x01, 0xd5, 0xfe, 0x24, 0xfe, 0x24, 0x01, 0x8a, 0xfe, 0x76, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xc5, 0x06, 0xfd, 0x06, 0x83, 0x10, 0x27, 0x00, 0x0d, 0x00, 0x00, 0xfd, 0x7b, 0x10, 0x27, 0x00, 0x0d, 0x03, 0x9a, 0xfd, 0x7b, 0x10, 0x07, 0x00, 0x0d, 0x01, 0xcd, 0x00, 0x93, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc6, 0x02, 0x81, 0x02, 0xe2, 0x03, 0x5f, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0xc7, 0x02, 0x1a, 0xfd, 0xe6, 0x03, 0x5f, 0xde, 0x00, 0x00, 0x00, 0x01, 0xfe, 0xae, 0xff, 0xe3, 0x02, 0x86, 0x05, 0xf0, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x01, 0x23, 0x01, 0xf5, 0x90, 0xfc, 0xb9, 0x90, 0x05, 0xf0, 0xf9, 0xf3, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0x1c, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x15, 0x21, 0x11, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x01, 0x44, 0xd8, 0xfe, 0x82, 0x01, 0x7e, 0xd8, 0xd8, 0x02, 0x5e, 0xfd, 0x23, 0x8f, 0x07, 0x22, 0x8f, 0xfd, 0x23, 0x4a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0x1c, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x11, 0x21, 0x35, 0x33, 0x11, 0x9e, 0xd8, 0xd8, 0x01, 0x7e, 0xfe, 0x82, 0xd8, 0x02, 0x5e, 0x4a, 0x02, 0xdd, 0x8f, 0xf8, 0xde, 0x8f, 0x02, 0xdd, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x42, 0x00, 0x00, 0x06, 0x62, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x22, 0xbe, 0x00, 0x10, 0x07, 0x00, 0x22, 0x03, 0x10, 0x00, 0x00, 0xff, 0xff, 0x00, 0x84, 0x00, 0x00, 0x04, 0xc3, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x22, 0x00, 0x00, 0x10, 0x07, 0x00, 0x04, 0x02, 0xf6, 0x00, 0x00, 0xff, 0xff, 0x00, 0x84, 0x00, 0x00, 0x04, 0xc3, 0x05, 0xf0, 0x10, 0x27, 0x00, 0x04, 0xff, 0x6e, 0x00, 0x00, 0x10, 0x07, 0x00, 0x22, 0x01, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0xff, 0x05, 0x03, 0x3b, 0x04, 0x5d, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x16, 0x33, 0x32, 0x37, 0x07, 0x01, 0x23, 0x13, 0x06, 0x20, 0x27, 0x5a, 0x8b, 0xd2, 0xe2, 0xa1, 0x07, 0xfe, 0xfd, 0x89, 0xee, 0x6a, 0xfe, 0xe3, 0xb4, 0x04, 0x5d, 0x10, 0x10, 0x80, 0xfb, 0x28, 0x04, 0xae, 0x0f, 0x0f, 0x00, 0x00, 0x01, 0x00, 0xd4, 0xff, 0x3b, 0x04, 0x14, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x02, 0x68, 0xc1, 0xea, 0xd3, 0xc2, 0x80, 0xab, 0x7f, 0x05, 0xd5, 0xe8, 0xbe, 0xb8, 0xdd, 0x11, 0xfc, 0xb2, 0x06, 0x1f, 0xf9, 0xe1, 0x06, 0x9a, 0x00, 0x02, 0x00, 0xc2, 0x01, 0xc2, 0x02, 0xd8, 0x04, 0x12, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x11, 0x07, 0x2b, 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x02, 0x3a, 0x9d, 0x9d, 0x6a, 0x02, 0x71, 0x9b, 0x9c, 0x72, 0x04, 0x12, 0xfd, 0xb1, 0x01, 0xac, 0x7d, 0x7c, 0xab, 0x00, 0x00, 0x02, 0x00, 0xc2, 0x01, 0xc2, 0x02, 0xd8, 0x04, 0x12, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x27, 0x11, 0x3b, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x01, 0x60, 0x9e, 0x9e, 0x6a, 0x72, 0x9b, 0x9b, 0x70, 0x02, 0x01, 0xc2, 0x01, 0x02, 0x4f, 0xab, 0x7c, 0x7d, 0xac, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xc5, 0x03, 0x63, 0x03, 0x6b, 0x12, 0x07, 0x00, 0x0d, 0x00, 0x00, 0xfd, 0x7b, 0x00, 0x00, 0x00, 0x02, 0x01, 0x00, 0xff, 0x12, 0x02, 0x09, 0x04, 0x23, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x01, 0x15, 0x23, 0x35, 0x13, 0x15, 0x13, 0x23, 0x03, 0x35, 0x01, 0xbe, 0xbe, 0xbe, 0x4a, 0x74, 0x94, 0x04, 0x23, 0xfe, 0xfe, 0xfc, 0xdb, 0xac, 0xfe, 0xc0, 0x01, 0x40, 0xac, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xaf, 0xfe, 0x1b, 0x06, 0x1a, 0x07, 0x6e, 0x10, 0x26, 0x07, 0x74, 0x00, 0x00, 0x10, 0x06, 0x07, 0x75, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xf2, 0x03, 0x63, 0x07, 0x6f, 0x12, 0x27, 0x00, 0x0d, 0x00, 0x00, 0xfd, 0xa8, 0x10, 0x07, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x7f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x82, 0xff, 0x42, 0x02, 0xf0, 0x05, 0xd5, 0x10, 0x27, 0x00, 0x12, 0x00, 0x82, 0x00, 0x00, 0x10, 0x27, 0x00, 0x11, 0x01, 0x66, 0x00, 0x00, 0x10, 0x07, 0x00, 0x11, 0xff, 0xdd, 0x04, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x01, 0xd3, 0x06, 0xda, 0x03, 0x31, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x06, 0xd9, 0x8e, 0xcf, 0x83, 0x86, 0xd4, 0x0e, 0x08, 0x09, 0x14, 0xd2, 0x7e, 0x77, 0xc6, 0x85, 0x8e, 0xcf, 0x84, 0x9e, 0xbd, 0x0d, 0x07, 0x0b, 0x13, 0xd1, 0x7e, 0x75, 0xc2, 0x03, 0x31, 0xb2, 0x4f, 0x44, 0x3b, 0x04, 0x02, 0x02, 0x06, 0x3e, 0x4d, 0x53, 0xb2, 0x4f, 0x45, 0x3c, 0x04, 0x02, 0x03, 0x05, 0x3e, 0x4c, 0xff, 0xff, 0xff, 0xaf, 0xfe, 0x14, 0x06, 0x1a, 0xff, 0x7e, 0x10, 0x07, 0x07, 0x75, 0x00, 0x00, 0xf8, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x18, 0x00, 0xc8, 0x04, 0xf0, 0x05, 0x0d, 0x00, 0x17, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x03, 0x4c, 0x90, 0xe0, 0x66, 0xe0, 0xfe, 0xc3, 0x01, 0x3d, 0xe0, 0x65, 0xe1, 0x90, 0xe1, 0x66, 0xe1, 0x01, 0x3e, 0xfe, 0xc2, 0xe1, 0x66, 0x02, 0x29, 0xfe, 0x9f, 0x01, 0x60, 0xf9, 0x72, 0xf9, 0xa0, 0xfa, 0x72, 0xfb, 0x01, 0x62, 0xfe, 0x9e, 0xfa, 0x71, 0xfa, 0xa0, 0xf9, 0x72, 0x00, 0x03, 0x00, 0xe1, 0x01, 0x32, 0x03, 0x57, 0x04, 0xb6, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x35, 0x33, 0x15, 0x01, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0xe1, 0xb4, 0x01, 0x0e, 0xb4, 0xb4, 0xb4, 0x02, 0x90, 0xc8, 0xc8, 0xfe, 0xa2, 0xc8, 0xc8, 0x02, 0xbc, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x24, 0x04, 0x60, 0x04, 0xa1, 0x05, 0xd5, 0x10, 0x27, 0x07, 0x67, 0x01, 0x0e, 0x00, 0x00, 0x10, 0x26, 0x07, 0x67, 0x00, 0x00, 0x10, 0x27, 0x07, 0x67, 0x03, 0x2a, 0x00, 0x00, 0x10, 0x07, 0x07, 0x67, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x04, 0x01, 0x42, 0x01, 0x00, 0x04, 0xc7, 0x04, 0xe8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x35, 0x33, 0x15, 0x21, 0x35, 0x33, 0x15, 0x01, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x01, 0x42, 0xb4, 0x02, 0x1c, 0xb4, 0xfd, 0xe4, 0xb4, 0xb4, 0xb4, 0x02, 0x90, 0xc8, 0xc8, 0xc8, 0xc8, 0xfe, 0x70, 0xc8, 0xc8, 0x03, 0x20, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0x42, 0x00, 0xf6, 0x04, 0xc7, 0x04, 0xde, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x35, 0x33, 0x15, 0x13, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x01, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x02, 0xaa, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xfc, 0x8e, 0xb4, 0xc6, 0xb4, 0x02, 0x86, 0xc8, 0xc8, 0xfe, 0x70, 0xc8, 0xc8, 0x03, 0x20, 0xc8, 0xc8, 0xfc, 0xf4, 0xc8, 0xc8, 0x03, 0x0c, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc5, 0x00, 0x00, 0x01, 0x83, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0xc5, 0xbe, 0xbe, 0xbe, 0xbe, 0x05, 0xd5, 0xfe, 0xfc, 0x27, 0xfe, 0x00, 0x00, 0x04, 0x00, 0x5a, 0xfe, 0xe5, 0x05, 0x64, 0x06, 0xef, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x01, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x5a, 0xbe, 0xbe, 0x04, 0x4c, 0xbe, 0xbe, 0xfd, 0xda, 0xbe, 0xbe, 0xbe, 0xbe, 0x03, 0x69, 0xfe, 0xfe, 0xfe, 0x04, 0x84, 0xfe, 0xf9, 0xf2, 0xfe, 0x00, 0x05, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x25, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x01, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x01, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x04, 0x12, 0xb4, 0xb4, 0xb4, 0xfc, 0x8e, 0xb4, 0xc6, 0xb4, 0x01, 0x56, 0x90, 0xfd, 0xa9, 0x02, 0x57, 0x90, 0x02, 0x58, 0xf6, 0xc8, 0xc8, 0x03, 0x20, 0xc8, 0xc8, 0xfc, 0xf4, 0xc8, 0xc8, 0x03, 0x0c, 0xc8, 0xc8, 0xfe, 0x84, 0xfd, 0x66, 0x02, 0x9a, 0xa0, 0x02, 0x9b, 0xfd, 0x65, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc5, 0x00, 0x50, 0x01, 0x83, 0x05, 0x3e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0xc5, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0x05, 0x3e, 0xfe, 0xfd, 0x0e, 0xfe, 0x02, 0xf6, 0xfe, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc5, 0x00, 0x11, 0x01, 0x83, 0x05, 0x77, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0xc5, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0xbe, 0x02, 0x89, 0xfe, 0x03, 0xec, 0xfe, 0xfc, 0x96, 0xfe, 0x03, 0xf0, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4e, 0x02, 0x8d, 0x02, 0xa3, 0x05, 0xf0, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0xd4, 0xb6, 0x2d, 0x2e, 0x2e, 0x2d, 0xb6, 0x2d, 0x2e, 0x2e, 0x88, 0x91, 0x99, 0x99, 0x91, 0x92, 0x99, 0x99, 0x05, 0x97, 0x56, 0x56, 0xac, 0xad, 0x56, 0x56, 0x56, 0x56, 0xad, 0xac, 0x56, 0xaf, 0xde, 0xd3, 0xd4, 0xde, 0xde, 0xd4, 0xd3, 0xde, 0x00, 0x00, 0x02, 0x00, 0x6d, 0x02, 0x9c, 0x00, 0xd7, 0x06, 0x03, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x11, 0x33, 0x15, 0x23, 0x6e, 0x68, 0x68, 0x68, 0x68, 0x05, 0x0f, 0xfd, 0x8d, 0x03, 0x67, 0x82, 0x00, 0x02, 0x00, 0x38, 0x02, 0x9c, 0x02, 0xa9, 0x05, 0xdf, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x01, 0xad, 0xfe, 0xea, 0x01, 0x16, 0x13, 0x95, 0x79, 0x79, 0x82, 0xfe, 0x8c, 0x05, 0x66, 0xfe, 0x5d, 0x02, 0x1c, 0xfd, 0xe4, 0x6d, 0xba, 0xba, 0x79, 0x00, 0x00, 0x01, 0x00, 0x5b, 0x02, 0x8d, 0x02, 0x8b, 0x05, 0xdf, 0x00, 0x20, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x80, 0x01, 0xcb, 0xfe, 0xa0, 0x19, 0x1a, 0x19, 0x1a, 0x90, 0x55, 0x55, 0x58, 0x56, 0x9e, 0x36, 0x72, 0x3b, 0x33, 0x38, 0x38, 0x3e, 0x64, 0x75, 0x75, 0x64, 0x2f, 0x5e, 0x30, 0x05, 0xdf, 0x5f, 0xcc, 0x09, 0x04, 0x04, 0x4d, 0x4c, 0x83, 0x87, 0x4b, 0x4a, 0x12, 0x12, 0x71, 0x1b, 0x0e, 0x0d, 0x66, 0xae, 0x66, 0x14, 0x15, 0x00, 0x02, 0x00, 0x52, 0x02, 0x8d, 0x02, 0xa8, 0x05, 0xf0, 0x00, 0x0f, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x88, 0x50, 0x2e, 0x2e, 0x2e, 0x2e, 0x50, 0x4e, 0x2e, 0x2e, 0x2e, 0x2e, 0x9a, 0x2c, 0x2d, 0x2d, 0x2c, 0x74, 0x3d, 0x3d, 0x09, 0x22, 0x33, 0x35, 0x3d, 0x82, 0x4c, 0x4c, 0x50, 0x4e, 0x82, 0x97, 0x9e, 0x61, 0x61, 0xa4, 0x2c, 0x2d, 0x2d, 0x04, 0x6d, 0x34, 0x35, 0x5b, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5b, 0x35, 0x34, 0x01, 0x62, 0x67, 0x14, 0x0a, 0x0b, 0x4b, 0x4c, 0x99, 0x31, 0x1a, 0x1a, 0x4c, 0x4d, 0x84, 0x7f, 0x4f, 0x4e, 0xde, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x00, 0x00, 0x01, 0x00, 0x61, 0x02, 0x9c, 0x02, 0x8d, 0x05, 0xdf, 0x00, 0x06, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x61, 0x02, 0x2b, 0xfe, 0xc7, 0x7a, 0x01, 0x27, 0xfe, 0x61, 0x05, 0xdf, 0x30, 0xfc, 0xed, 0x02, 0xe4, 0x00, 0x00, 0x00, 0x03, 0x00, 0x50, 0x02, 0x8d, 0x02, 0xa2, 0x05, 0xf0, 0x00, 0x0c, 0x00, 0x2a, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x01, 0xcd, 0xa8, 0x2f, 0x30, 0x5f, 0x54, 0x53, 0x30, 0x30, 0x30, 0xf8, 0x4c, 0x29, 0x2a, 0x93, 0x01, 0x02, 0x4a, 0x48, 0x29, 0x2a, 0x4b, 0x51, 0x33, 0x2f, 0x4c, 0x4e, 0x8e, 0x8f, 0x4c, 0x4e, 0x30, 0x31, 0x28, 0x2a, 0x2a, 0x4c, 0x49, 0x2c, 0x2b, 0x2b, 0x2a, 0x4b, 0x4a, 0x2c, 0x2a, 0x04, 0x2a, 0x2c, 0x2b, 0x4b, 0x4c, 0x56, 0x2c, 0x2b, 0x96, 0x2b, 0x5d, 0x12, 0x31, 0x32, 0x48, 0x64, 0x74, 0x3a, 0x3a, 0x64, 0x4a, 0x30, 0x31, 0x12, 0x12, 0x3a, 0x37, 0x50, 0x79, 0x41, 0x41, 0x41, 0x41, 0x79, 0x4e, 0x39, 0x38, 0xc6, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x41, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4a, 0x02, 0x8d, 0x02, 0x9f, 0x05, 0xf0, 0x00, 0x1f, 0x00, 0x2e, 0x00, 0x00, 0x13, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x82, 0x2d, 0x2d, 0x2d, 0x2b, 0x74, 0x3d, 0x3c, 0x09, 0x1f, 0x36, 0x33, 0x3e, 0x82, 0x97, 0x4e, 0x4f, 0x83, 0x96, 0x4e, 0x4f, 0x60, 0x61, 0xa4, 0x2c, 0x2d, 0x2d, 0xb8, 0x4f, 0x5c, 0x2e, 0x2e, 0x4f, 0x4d, 0x30, 0x2e, 0x2e, 0x2e, 0x02, 0xae, 0x67, 0x14, 0x0b, 0x0a, 0x4b, 0x4b, 0x9a, 0x2f, 0x1b, 0x1a, 0x98, 0x84, 0x81, 0x4d, 0x4e, 0x6f, 0x6f, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x01, 0x72, 0x68, 0x5c, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5c, 0x34, 0x34, 0x00, 0x00, 0x01, 0x00, 0x7b, 0x02, 0x9c, 0x03, 0x52, 0x05, 0x6b, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x02, 0x16, 0x01, 0x3c, 0xfe, 0xc4, 0x5f, 0xfe, 0xc4, 0x01, 0x3c, 0x05, 0x6b, 0xfe, 0xc8, 0x5f, 0xfe, 0xc8, 0x01, 0x38, 0x5f, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7b, 0x03, 0xd4, 0x03, 0x52, 0x04, 0x33, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x7b, 0x02, 0xd7, 0xfd, 0x29, 0x04, 0x33, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x7b, 0x03, 0x61, 0x03, 0x52, 0x04, 0xa5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x7b, 0x02, 0xd7, 0xfd, 0x29, 0x02, 0xd7, 0xfd, 0x29, 0x04, 0xa5, 0x5e, 0x87, 0x5f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x02, 0x05, 0x01, 0x68, 0x06, 0x02, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x10, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x68, 0x4c, 0x49, 0x49, 0x4c, 0x5b, 0x55, 0x2a, 0x2a, 0x2a, 0x2a, 0x55, 0x06, 0x02, 0x81, 0xfc, 0xfe, 0xfe, 0xfe, 0x80, 0x83, 0x80, 0x7f, 0xfa, 0x7f, 0x7e, 0x84, 0x00, 0x01, 0x00, 0x5c, 0x02, 0x05, 0x01, 0x61, 0x06, 0x02, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x33, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x5d, 0x5b, 0x55, 0x2a, 0x2a, 0x2a, 0x2a, 0x55, 0x5b, 0x4b, 0x25, 0x26, 0x26, 0x25, 0x06, 0x02, 0x84, 0x7e, 0x7f, 0xfa, 0x7f, 0x80, 0x83, 0x80, 0x7f, 0x7f, 0x01, 0x02, 0x7e, 0x7e, 0x00, 0x01, 0x00, 0x69, 0x02, 0x9c, 0x02, 0x7e, 0x05, 0x1e, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x02, 0x7d, 0x68, 0x46, 0x47, 0x54, 0x61, 0x6a, 0x6a, 0x25, 0x65, 0x43, 0x6d, 0x70, 0x04, 0x17, 0xfe, 0x85, 0x01, 0x77, 0x59, 0x59, 0x6b, 0x5c, 0xfe, 0x9e, 0x02, 0x73, 0x61, 0x38, 0x38, 0x86, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4e, 0xff, 0xf1, 0x02, 0xa3, 0x03, 0x54, 0x12, 0x07, 0x07, 0xa0, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0x00, 0x00, 0x02, 0x7f, 0x03, 0x43, 0x12, 0x07, 0x00, 0x7b, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x54, 0x00, 0x00, 0x02, 0x6f, 0x03, 0x54, 0x12, 0x07, 0x00, 0x74, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x58, 0xff, 0xf1, 0x02, 0x86, 0x03, 0x54, 0x12, 0x07, 0x00, 0x75, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x38, 0x00, 0x00, 0x02, 0xa9, 0x03, 0x43, 0x12, 0x07, 0x07, 0xa2, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xf1, 0x02, 0x8b, 0x03, 0x43, 0x12, 0x07, 0x07, 0xa3, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0xff, 0xf1, 0x02, 0xa8, 0x03, 0x54, 0x12, 0x07, 0x07, 0xa4, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x61, 0x00, 0x00, 0x02, 0x8d, 0x03, 0x43, 0x12, 0x07, 0x07, 0xa5, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x50, 0xff, 0xf1, 0x02, 0xa2, 0x03, 0x54, 0x12, 0x07, 0x07, 0xa6, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4a, 0xff, 0xf1, 0x02, 0x9f, 0x03, 0x54, 0x12, 0x07, 0x07, 0xa7, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0x00, 0x00, 0x03, 0x52, 0x02, 0xcf, 0x12, 0x07, 0x07, 0xa8, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0x01, 0x38, 0x03, 0x52, 0x01, 0x97, 0x12, 0x07, 0x07, 0xa9, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7b, 0x00, 0xc5, 0x03, 0x52, 0x02, 0x09, 0x12, 0x07, 0x07, 0xaa, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0x69, 0x01, 0x68, 0x03, 0x66, 0x12, 0x07, 0x07, 0xab, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5c, 0xff, 0x69, 0x01, 0x61, 0x03, 0x66, 0x12, 0x07, 0x07, 0xac, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x45, 0xff, 0xf0, 0x02, 0x5e, 0x02, 0x82, 0x12, 0x07, 0x04, 0xf9, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0xf0, 0x02, 0x8d, 0x02, 0x82, 0x12, 0x07, 0x04, 0xff, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0xf0, 0x02, 0x88, 0x02, 0x82, 0x12, 0x07, 0x05, 0x08, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x02, 0xd1, 0x02, 0x73, 0x12, 0x07, 0x02, 0xa5, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3f, 0xff, 0xf0, 0x02, 0x8d, 0x02, 0x82, 0x12, 0x07, 0x05, 0x00, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x02, 0x7e, 0x03, 0x67, 0x12, 0x07, 0x02, 0x72, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x02, 0x9d, 0x03, 0x67, 0x12, 0x07, 0x05, 0x05, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6d, 0x00, 0x00, 0x00, 0xd7, 0x03, 0x67, 0x12, 0x07, 0x02, 0xa3, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x04, 0x09, 0x02, 0x82, 0x12, 0x07, 0x05, 0x06, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x02, 0x7e, 0x02, 0x82, 0x12, 0x07, 0x07, 0xad, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0xff, 0x11, 0x02, 0xa2, 0x02, 0x82, 0x12, 0x07, 0x05, 0x0c, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0x00, 0x00, 0x02, 0x4f, 0x02, 0x93, 0x12, 0x07, 0x02, 0xa4, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x1f, 0x00, 0x00, 0x01, 0xac, 0x03, 0x25, 0x12, 0x07, 0x05, 0x0d, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x06, 0x03, 0x05, 0xd6, 0x00, 0x23, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x36, 0x37, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x03, 0x7a, 0x47, 0xa0, 0x59, 0xe5, 0xfe, 0xf8, 0x01, 0x08, 0xe5, 0x5b, 0x9f, 0x46, 0x44, 0x9c, 0x58, 0xad, 0xb8, 0xb8, 0xad, 0x58, 0x9c, 0x44, 0x02, 0x7d, 0xfe, 0x0b, 0x01, 0xe1, 0xfe, 0x1f, 0x02, 0x01, 0xfd, 0x77, 0x01, 0xb8, 0x36, 0x36, 0x01, 0x37, 0x02, 0x1c, 0x01, 0x37, 0x35, 0x36, 0x9f, 0x47, 0x46, 0xea, 0xfe, 0x44, 0xea, 0x46, 0x47, 0x02, 0x0a, 0x80, 0xfe, 0xb5, 0x80, 0xfe, 0x6b, 0x80, 0x00, 0x03, 0x00, 0x67, 0xff, 0xa6, 0x04, 0x45, 0x06, 0x39, 0x00, 0x27, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x00, 0x01, 0x16, 0x17, 0x37, 0x33, 0x07, 0x16, 0x17, 0x15, 0x26, 0x27, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x23, 0x37, 0x26, 0x27, 0x07, 0x23, 0x37, 0x26, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x3f, 0x01, 0x33, 0x07, 0x06, 0x07, 0x06, 0x11, 0x14, 0x17, 0x01, 0x26, 0x27, 0x01, 0x16, 0x17, 0x03, 0x11, 0x3a, 0x38, 0x1b, 0x8c, 0x2b, 0x24, 0x22, 0x35, 0x39, 0xfe, 0xe1, 0x10, 0x6b, 0xbe, 0x54, 0x58, 0xc2, 0x6d, 0x18, 0x18, 0x10, 0x8b, 0x16, 0x3a, 0x34, 0x22, 0x8b, 0x3a, 0x11, 0x0f, 0xa0, 0xa0, 0x90, 0xed, 0x13, 0x8d, 0xcd, 0x82, 0x4f, 0x71, 0x4a, 0x01, 0xfc, 0x38, 0x3d, 0xfe, 0xe1, 0x30, 0x3a, 0x05, 0xeb, 0x08, 0x13, 0x69, 0xa5, 0x16, 0x1c, 0xd5, 0x3c, 0x29, 0xfb, 0x97, 0x5e, 0x5f, 0xd3, 0x48, 0x48, 0x02, 0x3f, 0x57, 0x12, 0x1e, 0x87, 0xe6, 0x12, 0x15, 0xcf, 0x01, 0x67, 0x01, 0x68, 0xd0, 0xb9, 0x14, 0x4b, 0xfc, 0x1f, 0x70, 0x9d, 0xfe, 0xd8, 0xee, 0x94, 0x03, 0xcb, 0x13, 0x04, 0xfb, 0x95, 0x28, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x56, 0xff, 0xe4, 0x04, 0x3b, 0x05, 0xf0, 0x00, 0x2c, 0x00, 0x00, 0x25, 0x36, 0x37, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x17, 0x16, 0x17, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x02, 0xdd, 0x57, 0x4f, 0x5f, 0x54, 0x57, 0xc3, 0x6d, 0xfe, 0xe9, 0xfe, 0xbe, 0x01, 0x42, 0x01, 0x17, 0x6e, 0xc4, 0x55, 0x54, 0xbe, 0x6b, 0xd3, 0xe0, 0x70, 0x54, 0x8a, 0x89, 0x2b, 0x8a, 0x63, 0x0e, 0x22, 0x15, 0x01, 0x18, 0x36, 0x20, 0x73, 0x7d, 0x8a, 0x07, 0x27, 0x2f, 0x5f, 0xd3, 0x48, 0x47, 0x01, 0x9e, 0x01, 0x67, 0x01, 0x68, 0x01, 0x9f, 0x47, 0x47, 0xd5, 0x5f, 0x5e, 0xfe, 0xc7, 0xfe, 0xd8, 0xfe, 0xd9, 0x9c, 0x75, 0x1e, 0x03, 0x5d, 0x9d, 0x5c, 0x59, 0x04, 0x05, 0xaa, 0x10, 0x0f, 0xb6, 0xab, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0x00, 0x00, 0x04, 0x51, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x01, 0x4c, 0x03, 0x04, 0xfd, 0xb2, 0x02, 0x15, 0xfd, 0xeb, 0xe1, 0xe1, 0xb6, 0xd4, 0x01, 0x7e, 0x04, 0x57, 0xaa, 0xfe, 0x48, 0xaa, 0xfe, 0xb5, 0x45, 0xfe, 0xc7, 0x01, 0x39, 0x45, 0x00, 0x00, 0x00, 0x01, 0x00, 0x74, 0x00, 0x00, 0x03, 0xf2, 0x05, 0xf0, 0x00, 0x23, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x35, 0x10, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x01, 0xfc, 0x01, 0xf6, 0xfc, 0x82, 0xd4, 0xab, 0xab, 0xb3, 0xb3, 0xc1, 0xd1, 0x37, 0x88, 0x47, 0x45, 0x7a, 0x37, 0x85, 0x69, 0x01, 0x60, 0xfe, 0xa0, 0x01, 0x68, 0x01, 0xec, 0xfe, 0xbe, 0xaa, 0xaa, 0x01, 0x42, 0x8f, 0x8f, 0x8f, 0x5f, 0x01, 0x05, 0xf3, 0x1f, 0x1d, 0xb6, 0x29, 0x29, 0x9b, 0xd4, 0x48, 0x8f, 0x8f, 0x8f, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0x42, 0x06, 0x67, 0x05, 0x1e, 0x00, 0x2b, 0x00, 0x00, 0x05, 0x23, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x13, 0x33, 0x07, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x02, 0x84, 0x99, 0x01, 0x49, 0x05, 0x2e, 0x34, 0x6b, 0x7f, 0x4a, 0x4b, 0xa7, 0xa7, 0x38, 0x50, 0x4f, 0x6d, 0x6e, 0x4c, 0x31, 0x21, 0x78, 0x99, 0x4f, 0x52, 0x6c, 0x9e, 0xab, 0xa7, 0x66, 0x6a, 0x80, 0x96, 0xa6, 0xbe, 0x03, 0x78, 0x8d, 0x47, 0x4d, 0x5f, 0x61, 0xa2, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x66, 0x32, 0x31, 0x3e, 0x26, 0x3e, 0x01, 0x45, 0xd6, 0x33, 0xf6, 0xe1, 0xfd, 0x5c, 0x02, 0x9e, 0xa1, 0x9c, 0xbe, 0xa4, 0xfd, 0x87, 0x01, 0x1d, 0x00, 0x00, 0x05, 0x00, 0x69, 0x00, 0x00, 0x04, 0xfa, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x06, 0x00, 0x22, 0x00, 0x26, 0x00, 0x29, 0x00, 0x00, 0x01, 0x27, 0x15, 0x13, 0x27, 0x23, 0x15, 0x03, 0x33, 0x13, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x05, 0x17, 0x33, 0x35, 0x03, 0x17, 0x35, 0x02, 0x10, 0x47, 0xa4, 0x33, 0x71, 0xb1, 0xf5, 0xbe, 0xcf, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xf4, 0xbe, 0xcf, 0xb1, 0xaf, 0xaf, 0xaf, 0xaf, 0x01, 0xde, 0x32, 0x72, 0x47, 0x47, 0x03, 0xaf, 0xce, 0xce, 0xfe, 0xf2, 0x93, 0x93, 0x03, 0x34, 0xfd, 0xda, 0x02, 0x26, 0xfd, 0xda, 0x7b, 0x93, 0x7b, 0xfd, 0xda, 0x02, 0x26, 0xfd, 0xda, 0x02, 0x26, 0x7b, 0x93, 0x7b, 0x7b, 0x93, 0x93, 0xfe, 0xf2, 0xce, 0xce, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xff, 0xe3, 0x08, 0xd3, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x50, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x17, 0x16, 0x17, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x23, 0x22, 0x26, 0x35, 0x11, 0x01, 0x60, 0xd7, 0x78, 0x82, 0x82, 0x78, 0x01, 0xad, 0x05, 0x66, 0x6e, 0xd4, 0xd7, 0xab, 0x01, 0x82, 0xd4, 0x6e, 0x4f, 0x15, 0x49, 0x9d, 0x01, 0x41, 0xfe, 0xbf, 0x3f, 0x62, 0x9a, 0x56, 0xa8, 0x52, 0x6e, 0x77, 0x56, 0x91, 0x36, 0x90, 0x81, 0xbe, 0xae, 0x57, 0x98, 0x41, 0x43, 0x8e, 0x4d, 0x74, 0x74, 0x54, 0x7d, 0x35, 0xa7, 0x8b, 0xd2, 0xb6, 0x4d, 0xa5, 0x5b, 0x9a, 0xb5, 0x89, 0x05, 0x2f, 0xfd, 0xcf, 0x92, 0x87, 0x86, 0x92, 0xfe, 0xcc, 0xc8, 0x6a, 0x71, 0xfd, 0xa8, 0x05, 0xd5, 0x71, 0x52, 0x88, 0x01, 0x3e, 0xfe, 0xc2, 0x8f, 0xfd, 0xa0, 0x89, 0x4e, 0x23, 0x35, 0x35, 0x59, 0x51, 0x4b, 0x50, 0x25, 0x0f, 0x24, 0x95, 0x82, 0x9e, 0xac, 0x1e, 0x1e, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0e, 0x2a, 0x99, 0x89, 0x9c, 0xb6, 0x23, 0x23, 0x01, 0x9f, 0xd2, 0x02, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xff, 0xe3, 0x07, 0x62, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x45, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x01, 0x17, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x6b, 0xe4, 0x84, 0x86, 0x86, 0x84, 0x02, 0x79, 0x04, 0xc4, 0xac, 0x42, 0x7d, 0x6c, 0xc6, 0xb6, 0x01, 0x9a, 0xe7, 0xe2, 0x75, 0x71, 0x3b, 0x6e, 0x38, 0x52, 0x58, 0x57, 0x59, 0x57, 0x75, 0x7e, 0x5b, 0x9a, 0x39, 0x9a, 0x89, 0xca, 0xb9, 0x5c, 0xa2, 0x44, 0x46, 0x97, 0x51, 0x7c, 0x7b, 0x58, 0x86, 0x38, 0xb1, 0x94, 0xde, 0xc3, 0x51, 0x57, 0x28, 0x05, 0x2f, 0xfd, 0xee, 0x87, 0x01, 0x06, 0x85, 0xfa, 0xd8, 0x07, 0x01, 0x7f, 0x96, 0x62, 0xfd, 0x89, 0x05, 0xd5, 0xd6, 0xd8, 0x8d, 0xba, 0x24, 0x16, 0x90, 0x7e, 0xb4, 0x33, 0x19, 0x1b, 0x59, 0x51, 0x4b, 0x50, 0x25, 0x0f, 0x24, 0x95, 0x82, 0x9e, 0xac, 0x1e, 0x1e, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0e, 0x2a, 0x99, 0x89, 0x9c, 0xb6, 0x12, 0x08, 0x00, 0x06, 0x00, 0x35, 0x00, 0x00, 0x06, 0xea, 0x05, 0xd5, 0x00, 0x1f, 0x00, 0x22, 0x00, 0x26, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x00, 0x13, 0x27, 0x23, 0x35, 0x33, 0x27, 0x33, 0x17, 0x21, 0x37, 0x33, 0x17, 0x21, 0x37, 0x33, 0x07, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x03, 0x23, 0x03, 0x23, 0x03, 0x23, 0x03, 0x23, 0x35, 0x05, 0x1b, 0x01, 0x01, 0x17, 0x21, 0x37, 0x01, 0x1b, 0x02, 0x07, 0x33, 0x27, 0x21, 0x17, 0x21, 0x37, 0xa4, 0x1b, 0x54, 0x34, 0x2c, 0xb8, 0x2b, 0x01, 0xde, 0x2b, 0xcc, 0x2c, 0x01, 0xdd, 0x2c, 0xb8, 0x2c, 0x33, 0x53, 0x1a, 0x6d, 0x8e, 0xca, 0xe5, 0xc4, 0xb0, 0xc6, 0xe4, 0xca, 0x8f, 0x04, 0x47, 0x94, 0x94, 0xfe, 0x9d, 0x1a, 0x01, 0x69, 0x1a, 0xfb, 0x9d, 0x94, 0x95, 0xce, 0x1a, 0x70, 0x19, 0xfd, 0x91, 0x1a, 0x01, 0x69, 0x1b, 0x04, 0x0f, 0x75, 0x8f, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0x8f, 0x75, 0x8f, 0xfc, 0x80, 0x03, 0x80, 0xfc, 0x80, 0x03, 0x80, 0x8f, 0x8f, 0xfd, 0x67, 0x02, 0x99, 0x01, 0x04, 0x75, 0x75, 0xfe, 0xfc, 0xfd, 0x67, 0x02, 0x99, 0x01, 0x04, 0x75, 0x75, 0x75, 0x75, 0x00, 0x00, 0x00, 0x02, 0x00, 0x55, 0xff, 0xe3, 0x05, 0x59, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x25, 0x32, 0x12, 0x19, 0x01, 0x23, 0x11, 0x34, 0x26, 0x23, 0x21, 0x11, 0x23, 0x29, 0x01, 0x22, 0x02, 0x19, 0x01, 0x33, 0x11, 0x14, 0x16, 0x33, 0x21, 0x03, 0x33, 0x56, 0x01, 0xd3, 0xe5, 0xec, 0xa6, 0x8d, 0x9e, 0xfe, 0xd2, 0xa5, 0x04, 0xff, 0xfe, 0x31, 0xe6, 0xec, 0xa6, 0x8d, 0x9f, 0x01, 0x31, 0x04, 0xa6, 0x05, 0xd2, 0x03, 0xfe, 0xd6, 0xfe, 0xdc, 0xfe, 0x91, 0x01, 0x56, 0xf0, 0xd3, 0xfa, 0xb2, 0x01, 0x2a, 0x01, 0x24, 0x01, 0x6f, 0xfe, 0xaa, 0xf0, 0xd3, 0x05, 0x4e, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0xc0, 0x04, 0x76, 0x06, 0x14, 0x10, 0x26, 0x00, 0xd3, 0x00, 0x00, 0x10, 0x06, 0x02, 0x8f, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe3, 0x04, 0x1b, 0x05, 0xf0, 0x00, 0x31, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x21, 0x07, 0x21, 0x06, 0x14, 0x15, 0x1c, 0x01, 0x17, 0x21, 0x07, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x03, 0x23, 0x37, 0x33, 0x34, 0x26, 0x35, 0x34, 0x36, 0x35, 0x23, 0x37, 0x33, 0x12, 0x00, 0x33, 0x32, 0x16, 0x04, 0x1a, 0x52, 0x98, 0x5c, 0x8d, 0xb6, 0x1c, 0x02, 0x07, 0x32, 0xfe, 0x1c, 0x02, 0x02, 0x01, 0x92, 0x33, 0xfe, 0xb0, 0x1c, 0xb6, 0x8d, 0x5c, 0x98, 0x52, 0x50, 0xa6, 0x57, 0xd5, 0xfe, 0xea, 0x24, 0xbe, 0x32, 0x7d, 0x01, 0x01, 0xaf, 0x32, 0x8c, 0x24, 0x01, 0x17, 0xd4, 0x59, 0xa6, 0x05, 0x62, 0xd5, 0x69, 0x5a, 0xc8, 0xbb, 0x7b, 0x18, 0x2e, 0x23, 0x20, 0x2e, 0x18, 0x7b, 0xbb, 0xca, 0x5a, 0x69, 0xd3, 0x48, 0x48, 0x01, 0x22, 0x01, 0x03, 0x7b, 0x17, 0x2f, 0x20, 0x23, 0x2f, 0x17, 0x7b, 0x01, 0x01, 0x01, 0x22, 0x47, 0x00, 0x00, 0x00, 0x01, 0x00, 0x24, 0x00, 0x00, 0x04, 0x94, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x01, 0x33, 0x01, 0x21, 0x15, 0x21, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0xac, 0xaa, 0x02, 0x36, 0xdb, 0xfd, 0xc0, 0x01, 0x7f, 0xfe, 0x83, 0x02, 0x6b, 0xe0, 0xfd, 0xa2, 0xaa, 0x88, 0x03, 0x54, 0x02, 0x81, 0xfd, 0x89, 0x02, 0x77, 0xfd, 0x7f, 0x73, 0xfd, 0x1f, 0x02, 0xcf, 0xfd, 0x31, 0x02, 0xe1, 0x73, 0x00, 0x00, 0x00, 0x01, 0x00, 0x12, 0x00, 0x00, 0x04, 0x83, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x37, 0x17, 0x05, 0x15, 0x37, 0x17, 0x05, 0x11, 0x23, 0x11, 0x07, 0x27, 0x25, 0x35, 0x07, 0x27, 0x01, 0xef, 0xfe, 0x23, 0x04, 0x71, 0xfe, 0x23, 0xce, 0x48, 0xfe, 0xea, 0xcf, 0x48, 0xfe, 0xe9, 0xb7, 0xd0, 0x45, 0x01, 0x15, 0xd1, 0x45, 0x03, 0x8d, 0x01, 0x9e, 0xaa, 0xaa, 0xfe, 0xf1, 0xa1, 0x6f, 0xd8, 0x88, 0xa2, 0x6f, 0xd9, 0xfd, 0xb8, 0x01, 0xba, 0xa1, 0x6e, 0xd9, 0x88, 0xa2, 0x6e, 0x00, 0x00, 0x00, 0x05, 0x00, 0xbb, 0xfe, 0x39, 0x08, 0xae, 0x05, 0xf0, 0x00, 0x16, 0x00, 0x2d, 0x00, 0x62, 0x00, 0x77, 0x00, 0x83, 0x00, 0x00, 0x01, 0x27, 0x13, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x05, 0x36, 0x37, 0x13, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x04, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x01, 0x03, 0x06, 0x07, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x01, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x06, 0x54, 0xa6, 0x91, 0x1f, 0x38, 0x2c, 0x87, 0x57, 0x43, 0x6e, 0x22, 0x3a, 0x2b, 0x2c, 0x49, 0x52, 0x4e, 0x32, 0x37, 0x2b, 0x1b, 0xde, 0x4e, 0x2c, 0x0b, 0x0e, 0x09, 0x15, 0x1c, 0x38, 0x21, 0x36, 0x15, 0x12, 0x11, 0x10, 0x1a, 0x0b, 0x16, 0x12, 0xfa, 0x5a, 0x0b, 0x0a, 0xa2, 0x2a, 0x1d, 0x1f, 0x16, 0x13, 0x0f, 0x9d, 0x18, 0x5a, 0x3c, 0x6b, 0x9e, 0xb6, 0x01, 0x0f, 0x55, 0x4c, 0x4a, 0x19, 0x17, 0x3c, 0x20, 0x57, 0x37, 0x3e, 0x44, 0x56, 0x43, 0x38, 0x29, 0x2e, 0x58, 0x1d, 0x3a, 0x0d, 0x0e, 0x10, 0x13, 0x46, 0x53, 0x69, 0x45, 0x45, 0x77, 0x5e, 0x42, 0x01, 0xb4, 0xa0, 0x16, 0x13, 0x24, 0x4b, 0x2e, 0x33, 0x30, 0x61, 0x8a, 0x34, 0x27, 0x1a, 0x15, 0x1b, 0x1c, 0x32, 0x77, 0xfd, 0x8d, 0x24, 0x2b, 0x22, 0x0c, 0x0c, 0x15, 0x14, 0x1d, 0x29, 0xfe, 0x39, 0x29, 0x02, 0xd0, 0x97, 0x69, 0x52, 0x6d, 0x3a, 0x33, 0x58, 0x92, 0x77, 0x64, 0x67, 0x37, 0x3f, 0x20, 0x17, 0x32, 0x01, 0xf8, 0x6a, 0x1a, 0x37, 0x23, 0x3d, 0x35, 0x28, 0x36, 0x24, 0x20, 0x1b, 0x36, 0x32, 0x39, 0x54, 0x2f, 0x14, 0x0c, 0x0b, 0xb7, 0x28, 0x32, 0x03, 0x4d, 0x0a, 0x14, 0x16, 0x21, 0x1d, 0x3a, 0x35, 0x53, 0x7d, 0x24, 0x40, 0x7b, 0x6d, 0x62, 0xf5, 0x81, 0x71, 0x8c, 0x82, 0x7e, 0x45, 0x73, 0x2f, 0x34, 0x18, 0x1d, 0x09, 0x0a, 0x2d, 0x13, 0x26, 0x0a, 0x0a, 0x22, 0x17, 0x54, 0x41, 0x42, 0x60, 0x5d, 0x85, 0x03, 0x92, 0xfc, 0x9b, 0x7c, 0x40, 0x1b, 0x38, 0x16, 0x19, 0x86, 0x6e, 0x52, 0x80, 0x6b, 0x63, 0x64, 0x5d, 0x61, 0x43, 0x9c, 0xfb, 0xa0, 0x22, 0x0e, 0x0e, 0x0f, 0x18, 0x0f, 0x0e, 0x00, 0x00, 0x02, 0x00, 0x29, 0xff, 0xe3, 0x04, 0x1a, 0x05, 0xf0, 0x00, 0x29, 0x00, 0x35, 0x00, 0x00, 0x13, 0x27, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x35, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x25, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0xa6, 0x7d, 0x85, 0x64, 0x6f, 0x3a, 0x4f, 0x1f, 0x2b, 0x31, 0xcc, 0x48, 0x50, 0x7b, 0x68, 0x57, 0x4c, 0x61, 0xa3, 0x71, 0x5f, 0xe3, 0x78, 0x52, 0x42, 0x6b, 0x7b, 0x62, 0x66, 0x43, 0x2d, 0x30, 0x2d, 0x01, 0xf8, 0x3d, 0x18, 0x20, 0x2d, 0x2f, 0x1e, 0x16, 0x02, 0x04, 0x60, 0xf0, 0x4e, 0x6b, 0x42, 0xb1, 0xfe, 0xac, 0x58, 0x60, 0x60, 0x53, 0xb1, 0xe3, 0xab, 0xa3, 0xbf, 0xc2, 0x86, 0x71, 0xa2, 0x4a, 0x3c, 0x93, 0x58, 0x72, 0x7e, 0x68, 0x46, 0xd9, 0x6c, 0xaf, 0x56, 0x31, 0x3f, 0x3f, 0x30, 0x57, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3d, 0x00, 0x00, 0x04, 0x2c, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x31, 0x00, 0x00, 0x13, 0x35, 0x23, 0x35, 0x33, 0x11, 0x21, 0x32, 0x17, 0x16, 0x17, 0x33, 0x15, 0x23, 0x16, 0x14, 0x07, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x05, 0x21, 0x15, 0x33, 0x32, 0x37, 0x36, 0x01, 0x21, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x05, 0x21, 0x15, 0x21, 0x36, 0x34, 0x88, 0x4a, 0x4a, 0x01, 0x9a, 0xe2, 0x74, 0x45, 0x1c, 0x52, 0x40, 0x01, 0x01, 0x3f, 0x50, 0x1c, 0x46, 0x74, 0xe2, 0xe4, 0xb6, 0x4b, 0x02, 0xcd, 0xfe, 0x34, 0xe4, 0x7f, 0x45, 0x15, 0xfe, 0x43, 0x01, 0xcc, 0x0f, 0x15, 0x45, 0x7f, 0xe4, 0x01, 0xec, 0xfe, 0x14, 0x01, 0xec, 0x02, 0x03, 0xec, 0x56, 0x74, 0x01, 0x1f, 0x71, 0x44, 0x6a, 0x74, 0x15, 0x2c, 0x15, 0x74, 0x6b, 0x44, 0x71, 0xfd, 0xa8, 0x03, 0x78, 0x74, 0x74, 0x7a, 0x49, 0x16, 0x01, 0x59, 0x1b, 0x15, 0x49, 0xed, 0x56, 0x15, 0x2c, 0x00, 0x00, 0x02, 0x00, 0x53, 0xff, 0x5b, 0x04, 0x39, 0x06, 0x78, 0x00, 0x24, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x23, 0x35, 0x26, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x27, 0x11, 0x36, 0x37, 0x36, 0x37, 0x11, 0x23, 0x35, 0x21, 0x11, 0x06, 0x07, 0x06, 0x07, 0x27, 0x11, 0x06, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x02, 0xad, 0x7e, 0xc9, 0x7b, 0x97, 0x97, 0x7b, 0xc9, 0x7e, 0x5e, 0x57, 0x65, 0x54, 0x55, 0x61, 0x58, 0x60, 0x46, 0x39, 0x41, 0x33, 0x6c, 0x01, 0x05, 0x59, 0x6c, 0x5e, 0x69, 0x7e, 0x78, 0x47, 0x64, 0x64, 0x47, 0xa5, 0x8f, 0x1f, 0xa7, 0xcc, 0x01, 0x6d, 0x01, 0x6e, 0xcd, 0xa6, 0x1f, 0x8f, 0x89, 0x04, 0x1f, 0x24, 0x46, 0xd7, 0x5f, 0x30, 0x2c, 0x04, 0xfb, 0x3f, 0x02, 0x11, 0x12, 0x27, 0x01, 0x91, 0xa6, 0xfd, 0x7f, 0x53, 0x2a, 0x25, 0x05, 0xb2, 0x04, 0xa7, 0x20, 0x6c, 0x99, 0xfe, 0xd1, 0xfe, 0xd2, 0x99, 0x6c, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x04, 0x85, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1e, 0x00, 0x00, 0x13, 0x35, 0x21, 0x13, 0x33, 0x13, 0x21, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x13, 0x23, 0x03, 0x21, 0x03, 0x23, 0x13, 0x23, 0x35, 0x33, 0x37, 0x33, 0x07, 0x21, 0x2f, 0x01, 0x33, 0x03, 0x2e, 0x01, 0x12, 0xa3, 0xce, 0xa3, 0x01, 0x12, 0xeb, 0x40, 0xab, 0x84, 0xa2, 0xbc, 0x9a, 0xfe, 0x39, 0x99, 0xc0, 0xa3, 0x83, 0xaa, 0x42, 0xad, 0x3c, 0x01, 0x7f, 0x3e, 0xe1, 0xbd, 0x5e, 0x03, 0x52, 0x7b, 0x02, 0x08, 0xfd, 0xf8, 0x7b, 0xcf, 0x7b, 0xfd, 0xf8, 0x02, 0x08, 0xfd, 0xf8, 0x02, 0x08, 0x7b, 0xcf, 0xcf, 0xcf, 0x7b, 0x01, 0x41, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xff, 0xe3, 0x05, 0x2a, 0x05, 0xf0, 0x00, 0x36, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x37, 0x21, 0x35, 0x21, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x33, 0x15, 0x23, 0x06, 0x0f, 0x01, 0x21, 0x15, 0x21, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x24, 0x35, 0x34, 0x37, 0x23, 0x35, 0x01, 0x39, 0x04, 0x14, 0x42, 0x74, 0xfe, 0x62, 0x03, 0x37, 0x0b, 0x0b, 0x36, 0xa2, 0x94, 0x56, 0xb7, 0x68, 0x67, 0xc4, 0x5f, 0xdc, 0xfb, 0x16, 0x9d, 0xe9, 0x5c, 0xc3, 0x3c, 0x02, 0x44, 0xfc, 0xb2, 0x2d, 0xa9, 0x9c, 0x67, 0xd4, 0x6f, 0x73, 0xd8, 0x5f, 0xfd, 0xfe, 0xfa, 0x11, 0x98, 0x02, 0xa1, 0x07, 0x16, 0x4a, 0x2c, 0x7b, 0x08, 0x09, 0x2b, 0x6b, 0x76, 0x80, 0x36, 0x37, 0xc5, 0x26, 0x26, 0xe4, 0xc6, 0x55, 0x42, 0x7b, 0x5c, 0x2a, 0x0d, 0x7b, 0x3b, 0x5e, 0x7e, 0x88, 0x46, 0x45, 0xd0, 0x2f, 0x30, 0xe0, 0xd9, 0x4b, 0x3f, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x94, 0xfe, 0xd3, 0x04, 0x01, 0x06, 0x14, 0x00, 0x1f, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x11, 0x32, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x07, 0x11, 0x23, 0x11, 0x26, 0x27, 0x26, 0x11, 0x35, 0x10, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x01, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x17, 0x16, 0x17, 0x16, 0x04, 0x00, 0x53, 0x97, 0x5b, 0x5b, 0x97, 0x53, 0x51, 0x53, 0x4f, 0x52, 0x5a, 0xa6, 0x69, 0xbe, 0xbf, 0x6d, 0xa0, 0x5b, 0x54, 0x4f, 0x53, 0xfe, 0xb0, 0x01, 0x52, 0x3c, 0x6a, 0x0e, 0x0c, 0x0c, 0x17, 0x61, 0x3c, 0x04, 0xa4, 0xd5, 0x69, 0x5a, 0xfb, 0xf1, 0x5a, 0x69, 0xd3, 0x48, 0x24, 0x22, 0x02, 0xfe, 0xf0, 0x01, 0x15, 0x16, 0x76, 0xd6, 0x01, 0x39, 0x11, 0x01, 0x42, 0xcb, 0x74, 0x17, 0xe8, 0xe2, 0x02, 0x22, 0x24, 0xfb, 0xa4, 0x03, 0xf9, 0x16, 0x43, 0x75, 0xaa, 0xa1, 0x66, 0xb4, 0x6c, 0x43, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0x04, 0x83, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x12, 0x04, 0x71, 0xfb, 0x8f, 0x04, 0x71, 0xfe, 0x23, 0xb7, 0xfe, 0x23, 0x05, 0xd5, 0xaa, 0x78, 0xaa, 0xfb, 0xf7, 0x04, 0x09, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5f, 0x00, 0x00, 0x04, 0x38, 0x05, 0xd5, 0x00, 0x26, 0x00, 0x00, 0x13, 0x37, 0x21, 0x07, 0x21, 0x16, 0x17, 0x21, 0x07, 0x23, 0x06, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x17, 0x13, 0x23, 0x03, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x21, 0x37, 0x21, 0x26, 0x27, 0x26, 0x23, 0x5f, 0x32, 0x03, 0xa6, 0x31, 0xfe, 0xc1, 0x47, 0x13, 0x01, 0x16, 0x31, 0xde, 0x05, 0x36, 0x3b, 0x70, 0x3a, 0x38, 0x34, 0x3b, 0xb8, 0xc3, 0xac, 0x44, 0x3d, 0x3f, 0x6c, 0xc6, 0xe5, 0x83, 0x43, 0x3d, 0x06, 0xfd, 0xf7, 0x32, 0x01, 0xcc, 0x10, 0x28, 0x43, 0x83, 0x05, 0x5a, 0x7b, 0x7b, 0x4e, 0x81, 0x7b, 0x7e, 0x55, 0x5d, 0x24, 0x16, 0x48, 0x44, 0x82, 0xfe, 0x68, 0x01, 0x7f, 0x97, 0x30, 0x31, 0xa6, 0x43, 0x3e, 0x72, 0x7b, 0x43, 0x34, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x05, 0x04, 0xad, 0x05, 0xda, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x10, 0x07, 0x06, 0x21, 0x23, 0x11, 0x07, 0x27, 0x25, 0x35, 0x07, 0x27, 0x25, 0x11, 0x33, 0x11, 0x37, 0x17, 0x05, 0x15, 0x37, 0x17, 0x05, 0x11, 0x20, 0x00, 0x11, 0x04, 0xad, 0xb8, 0xb7, 0xfe, 0x7b, 0x9b, 0xcf, 0x46, 0x01, 0x15, 0xd1, 0x44, 0x01, 0x15, 0xb6, 0xcf, 0x48, 0xfe, 0xe9, 0xd1, 0x48, 0xfe, 0xe7, 0x01, 0x16, 0x01, 0x02, 0x02, 0xf1, 0xfe, 0x7e, 0xb5, 0xb5, 0x02, 0x1e, 0xa1, 0x6e, 0xd8, 0x89, 0xa2, 0x6e, 0xd9, 0x01, 0xe4, 0xfe, 0xaa, 0xa2, 0x6f, 0xd9, 0x88, 0xa3, 0x6f, 0xda, 0xfd, 0xfb, 0x01, 0x18, 0x01, 0x2e, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x76, 0x05, 0x15, 0xff, 0xd1, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x13, 0x33, 0x07, 0x21, 0x15, 0xfc, 0x77, 0xc4, 0x71, 0x77, 0x02, 0x9b, 0x05, 0x15, 0x00, 0xff, 0x9b, 0x64, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x9d, 0x05, 0x15, 0xff, 0xf7, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x03, 0x21, 0x35, 0x21, 0x27, 0x33, 0x09, 0xfc, 0xa6, 0x02, 0x9b, 0x77, 0x72, 0x05, 0x15, 0x64, 0x9b, 0x00, 0x00, 0x01, 0xfc, 0x9d, 0x04, 0x7a, 0xff, 0xd1, 0x06, 0x14, 0x00, 0x08, 0x00, 0x00, 0x03, 0x21, 0x17, 0x23, 0x27, 0x37, 0x33, 0x07, 0x21, 0x30, 0xfd, 0x65, 0x77, 0x71, 0x9e, 0x9e, 0x71, 0x77, 0x02, 0x9b, 0x05, 0x15, 0x9b, 0xcd, 0xcd, 0x9b, 0x00, 0x01, 0xfc, 0x9d, 0x04, 0x7a, 0xff, 0xd1, 0x06, 0x14, 0x00, 0x08, 0x00, 0x00, 0x01, 0x35, 0x21, 0x27, 0x33, 0x17, 0x07, 0x23, 0x37, 0xfc, 0x9d, 0x02, 0x9b, 0x77, 0x72, 0x9d, 0x9d, 0x72, 0x77, 0x05, 0x15, 0x64, 0x9b, 0xcd, 0xcd, 0x9b, 0x00, 0x04, 0xfc, 0x77, 0x04, 0x7b, 0xff, 0xee, 0x06, 0x10, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x17, 0xfc, 0x78, 0xb6, 0xb6, 0x02, 0xbf, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x5c, 0x06, 0x10, 0xca, 0xca, 0xca, 0xca, 0xca, 0xcb, 0x00, 0x00, 0x00, 0x05, 0xfb, 0xc8, 0x04, 0x7b, 0x00, 0x9f, 0x06, 0x10, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00, 0x03, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x05, 0x18, 0xb6, 0xb6, 0xfb, 0xe0, 0xb7, 0xb7, 0x02, 0xc0, 0xb6, 0xb6, 0xfe, 0xa0, 0xb7, 0xb7, 0x01, 0x0b, 0x06, 0x10, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xca, 0xcb, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x9d, 0x04, 0x7a, 0xff, 0xd1, 0x06, 0x14, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x17, 0x23, 0x27, 0x37, 0x33, 0x07, 0x21, 0x27, 0x33, 0x17, 0x07, 0x23, 0x37, 0xfd, 0x35, 0x77, 0x71, 0x9e, 0x9e, 0x71, 0x77, 0x02, 0x03, 0x77, 0x72, 0x9d, 0x9d, 0x72, 0x77, 0x05, 0x15, 0x9b, 0xcd, 0xcd, 0x9b, 0x9b, 0xcd, 0xcd, 0x9b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x3c, 0xff, 0xcf, 0x07, 0x10, 0x06, 0x04, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x28, 0x00, 0x42, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x37, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x17, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x25, 0x33, 0x01, 0x23, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0xda, 0x90, 0x64, 0x4a, 0x41, 0x5c, 0x72, 0xa9, 0xa9, 0x03, 0x89, 0x62, 0x7f, 0x96, 0xb9, 0xb2, 0x98, 0x64, 0x5d, 0x3d, 0x74, 0x59, 0x53, 0x85, 0x40, 0xaf, 0xad, 0x02, 0x6c, 0xc2, 0xfc, 0xa4, 0xc3, 0x05, 0x18, 0x54, 0x64, 0x33, 0x6d, 0x7b, 0x7b, 0x6d, 0x33, 0x64, 0x54, 0x41, 0x76, 0x41, 0xb6, 0xd4, 0xd6, 0xbc, 0x3c, 0x73, 0x03, 0xf6, 0x42, 0x52, 0x43, 0x49, 0x94, 0x82, 0x0a, 0x4d, 0xfe, 0x0d, 0x3e, 0x05, 0x4f, 0x9e, 0x81, 0x96, 0x9b, 0x06, 0x57, 0x5c, 0x20, 0x37, 0xb2, 0x24, 0x1e, 0xca, 0xfa, 0xf9, 0xcb, 0x03, 0x84, 0xb2, 0x34, 0x1e, 0x9c, 0x94, 0x93, 0x9d, 0x1f, 0x34, 0xb1, 0x22, 0x1b, 0xfa, 0xd1, 0xd4, 0xf9, 0x1b, 0x00, 0x04, 0x00, 0x3c, 0xff, 0xcf, 0x07, 0x32, 0x06, 0x04, 0x00, 0x20, 0x00, 0x2b, 0x00, 0x45, 0x00, 0x49, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x34, 0x36, 0x04, 0x17, 0x15, 0x27, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x14, 0x06, 0x23, 0x26, 0x27, 0x35, 0x17, 0x16, 0x33, 0x32, 0x35, 0x34, 0x26, 0x27, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x37, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x17, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x25, 0x33, 0x01, 0x23, 0x05, 0xb4, 0x7a, 0x72, 0xa6, 0x01, 0x2d, 0x6e, 0x21, 0x64, 0x74, 0xa2, 0x35, 0x5e, 0x2b, 0x8a, 0x7b, 0xb5, 0x99, 0x9e, 0x82, 0x21, 0x84, 0x7d, 0xa0, 0x37, 0x6f, 0xfb, 0xfb, 0x90, 0x64, 0x4a, 0x41, 0x5c, 0x72, 0xa9, 0xa9, 0x03, 0x89, 0x62, 0x7f, 0x96, 0xb9, 0xb2, 0x98, 0x64, 0x5d, 0x3d, 0x74, 0x59, 0x53, 0x85, 0x40, 0xaf, 0xad, 0x02, 0x6c, 0xc2, 0xfc, 0xa4, 0xc3, 0x01, 0x7d, 0x1c, 0x7c, 0xef, 0x8e, 0x01, 0x34, 0xbc, 0x12, 0x39, 0x64, 0x24, 0x2c, 0x18, 0x0a, 0x21, 0x7f, 0xf3, 0x95, 0x06, 0x35, 0xca, 0x13, 0x4c, 0x66, 0x2c, 0x31, 0x1b, 0x02, 0x84, 0x42, 0x52, 0x43, 0x49, 0x94, 0x82, 0x0a, 0x4d, 0xfe, 0x0d, 0x3e, 0x05, 0x4f, 0x9e, 0x81, 0x96, 0x9b, 0x06, 0x57, 0x5c, 0x20, 0x37, 0xb2, 0x24, 0x1e, 0xca, 0xfa, 0xf9, 0xcb, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x00, 0x18, 0x00, 0x21, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x01, 0x11, 0x06, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x04, 0xa3, 0x50, 0xd1, 0x88, 0x92, 0x6d, 0x6d, 0x92, 0x88, 0xd1, 0x50, 0x5f, 0xd6, 0x76, 0xfe, 0xce, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x32, 0x78, 0xd6, 0xfd, 0x56, 0x1f, 0x1c, 0x8d, 0x8d, 0x1c, 0x05, 0x62, 0x76, 0x41, 0x5a, 0x34, 0xfb, 0x2d, 0x34, 0x5a, 0x42, 0x75, 0x48, 0x48, 0x01, 0x9f, 0x01, 0x67, 0x01, 0x68, 0x01, 0x9f, 0x47, 0xfb, 0x13, 0x04, 0x5b, 0x1b, 0x21, 0xac, 0xfe, 0xba, 0xfe, 0xbb, 0xac, 0x21, 0x00, 0x00, 0xff, 0xff, 0x00, 0xaf, 0xff, 0xe3, 0x07, 0x96, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x72, 0x00, 0x00, 0x10, 0x07, 0x00, 0x26, 0x02, 0xf2, 0x00, 0x00, 0x00, 0x02, 0xff, 0xda, 0x00, 0x00, 0x04, 0x96, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x11, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x27, 0x11, 0x36, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x07, 0x15, 0x21, 0x15, 0x21, 0x35, 0x26, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x01, 0x52, 0x42, 0x2e, 0x59, 0x59, 0x2e, 0x42, 0xb5, 0x33, 0x30, 0x49, 0x45, 0x47, 0x46, 0x31, 0x33, 0x33, 0x31, 0x46, 0x47, 0x46, 0x4a, 0x2e, 0x33, 0x02, 0x8f, 0xfc, 0xbc, 0x91, 0x61, 0x86, 0x88, 0x5f, 0x04, 0xb3, 0x1d, 0x3a, 0x72, 0xcd, 0xcd, 0x71, 0x3b, 0x1d, 0x03, 0xd4, 0x7a, 0x6e, 0x04, 0x0b, 0x12, 0x23, 0xac, 0x2b, 0x16, 0x0f, 0x04, 0xfc, 0xa4, 0x04, 0x10, 0x15, 0x2b, 0xaa, 0x24, 0x12, 0x0b, 0x04, 0x2a, 0xaa, 0xde, 0x20, 0x72, 0x9f, 0x01, 0x0e, 0x01, 0x12, 0x9d, 0x6e, 0x00, 0x04, 0x00, 0x36, 0xff, 0xcf, 0x07, 0x1b, 0x06, 0x04, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x32, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x33, 0x01, 0x23, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x10, 0x26, 0x24, 0x20, 0x16, 0x15, 0x14, 0x06, 0x20, 0x26, 0x35, 0x34, 0x02, 0xb9, 0x55, 0x64, 0x32, 0x6d, 0x7b, 0x7b, 0x6d, 0x32, 0x64, 0x55, 0x42, 0x75, 0x42, 0xb6, 0xd4, 0xd6, 0xbc, 0x3d, 0x73, 0x02, 0x94, 0xc2, 0xfc, 0xa4, 0xc3, 0x03, 0xfa, 0x57, 0x6a, 0x6a, 0x57, 0x56, 0x6b, 0x6b, 0xfe, 0xfc, 0x01, 0x5c, 0xc4, 0xc4, 0xfe, 0xa4, 0xc3, 0x05, 0x97, 0xb2, 0x34, 0x1e, 0x9c, 0x94, 0x93, 0x9d, 0x1f, 0x34, 0xb1, 0x22, 0x1d, 0xfc, 0xd1, 0xd4, 0xf9, 0x1b, 0x4b, 0xf9, 0xcb, 0x03, 0x04, 0x9e, 0x92, 0x91, 0x9f, 0xa0, 0x01, 0x20, 0xa0, 0x9d, 0xf8, 0xd5, 0xd4, 0xf8, 0xf8, 0xd4, 0xd5, 0x00, 0x03, 0x00, 0x36, 0xff, 0xcf, 0x07, 0x79, 0x06, 0x04, 0x00, 0x13, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x25, 0x33, 0x01, 0x23, 0x04, 0xd3, 0xa9, 0x49, 0x48, 0x59, 0x69, 0xa9, 0xa9, 0x05, 0x82, 0x56, 0x8e, 0x91, 0xfd, 0xe6, 0x55, 0x64, 0x32, 0x6d, 0x7b, 0x7b, 0x6d, 0x32, 0x64, 0x55, 0x42, 0x75, 0x42, 0xb6, 0xd4, 0xd6, 0xbc, 0x3d, 0x73, 0x02, 0x94, 0xc2, 0xfc, 0xa4, 0xc3, 0x01, 0x4c, 0x02, 0x10, 0xfd, 0xf5, 0x72, 0x69, 0x81, 0x75, 0x01, 0xf0, 0xfc, 0x90, 0x44, 0x09, 0x50, 0xc1, 0x04, 0xff, 0xb2, 0x34, 0x1e, 0x9c, 0x94, 0x93, 0x9d, 0x1f, 0x34, 0xb1, 0x22, 0x1d, 0xfc, 0xd1, 0xd4, 0xf9, 0x1b, 0x4b, 0xf9, 0xcb, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x93, 0xff, 0xe3, 0x04, 0x09, 0x05, 0xf0, 0x10, 0x06, 0x01, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xfe, 0xd6, 0x04, 0xa0, 0x04, 0xe3, 0x10, 0x07, 0x03, 0xc1, 0x00, 0x00, 0xfe, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x00, 0xaf, 0x00, 0x00, 0x06, 0x6f, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x72, 0x00, 0x00, 0x10, 0x07, 0x00, 0x29, 0x02, 0xb6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x41, 0xff, 0xe3, 0x06, 0xcb, 0x05, 0xfb, 0x00, 0x6f, 0x00, 0x00, 0x01, 0x0f, 0x01, 0x11, 0x21, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x11, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x21, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x19, 0x01, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x03, 0x5f, 0x02, 0x61, 0x01, 0xc6, 0x24, 0x33, 0x3b, 0x44, 0x59, 0x6f, 0x37, 0x12, 0x22, 0x19, 0x21, 0x12, 0x14, 0x1a, 0x21, 0x2b, 0x2e, 0x1e, 0x24, 0x17, 0x14, 0x17, 0x24, 0x17, 0x1e, 0x27, 0x14, 0x32, 0x1a, 0x2e, 0x33, 0x1c, 0x21, 0x31, 0x1a, 0x57, 0x61, 0x40, 0x35, 0x32, 0x1a, 0x19, 0x0c, 0xfe, 0x44, 0x2d, 0x30, 0x53, 0x9c, 0xa6, 0x5e, 0x3c, 0x2e, 0x27, 0x23, 0x30, 0x0e, 0x10, 0x0a, 0x14, 0x08, 0x23, 0x3b, 0x52, 0x49, 0x3f, 0x20, 0x22, 0x7b, 0x53, 0x5a, 0x23, 0x40, 0x09, 0x01, 0x08, 0x09, 0x11, 0x21, 0x1e, 0x15, 0x1a, 0x12, 0x09, 0x07, 0x71, 0x43, 0x67, 0x71, 0x85, 0x27, 0x97, 0x05, 0xea, 0x1f, 0x31, 0xfd, 0xbc, 0xd1, 0x8c, 0x98, 0x49, 0x67, 0x14, 0x29, 0x1d, 0x2a, 0x1a, 0x21, 0x1c, 0x26, 0x21, 0x28, 0x44, 0x3b, 0x77, 0xd6, 0xfe, 0xbd, 0xa5, 0x82, 0x7d, 0x2c, 0x16, 0x37, 0x35, 0x3b, 0x21, 0x5f, 0x27, 0x5d, 0x37, 0x3a, 0x79, 0x7d, 0xa9, 0x5b, 0xb4, 0xcf, 0x9e, 0xa3, 0x5c, 0xae, 0x40, 0x34, 0x3e, 0x23, 0x2c, 0x0f, 0x12, 0x21, 0x2c, 0x0b, 0x27, 0x51, 0x46, 0xaa, 0xa7, 0x00, 0xff, 0x02, 0x6a, 0x16, 0x1a, 0x28, 0x4a, 0x47, 0x1f, 0x34, 0x10, 0x24, 0x24, 0x2c, 0x10, 0x2a, 0x1d, 0x12, 0x29, 0x2f, 0x39, 0x84, 0x79, 0x4b, 0x23, 0x25, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xfe, 0xf9, 0x04, 0xfe, 0x05, 0xd9, 0x00, 0x50, 0x00, 0x00, 0x05, 0x37, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x16, 0x17, 0x16, 0x07, 0x02, 0x07, 0x26, 0x27, 0x26, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, 0x17, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x16, 0x17, 0x16, 0x37, 0x36, 0x37, 0x15, 0x0e, 0x02, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x36, 0x37, 0x32, 0x17, 0x16, 0x15, 0x10, 0x07, 0x02, 0x23, 0x22, 0x02, 0xd9, 0x5f, 0x24, 0x4f, 0x21, 0x1c, 0x1f, 0x19, 0x17, 0x10, 0x0c, 0x18, 0x19, 0x2d, 0x3f, 0x75, 0x4a, 0x9f, 0x3e, 0x2a, 0x0a, 0x0c, 0x16, 0xb6, 0x47, 0x2a, 0x2f, 0x30, 0x3f, 0x69, 0x14, 0xaa, 0x48, 0x4c, 0x52, 0x49, 0x3f, 0x52, 0x2b, 0x2b, 0x66, 0x62, 0xbe, 0x71, 0x8c, 0x18, 0x1f, 0x05, 0x82, 0x43, 0x42, 0x70, 0x1e, 0x35, 0x42, 0x3f, 0x67, 0x35, 0x1c, 0x1c, 0x63, 0x91, 0xd5, 0xda, 0x8d, 0x35, 0x55, 0xfc, 0x4b, 0x55, 0xcd, 0x8c, 0x51, 0x1f, 0x1f, 0x37, 0x39, 0x7d, 0x77, 0xb2, 0x96, 0x5e, 0x6c, 0x2e, 0x47, 0x89, 0x79, 0x72, 0x5c, 0x5b, 0x34, 0xfe, 0xfa, 0x4f, 0x39, 0x25, 0x23, 0x69, 0x23, 0xde, 0x5e, 0x4d, 0x58, 0x3b, 0x80, 0xa5, 0x79, 0x76, 0x40, 0x63, 0x8d, 0x84, 0x93, 0x7d, 0x07, 0x01, 0x1a, 0x02, 0x65, 0x2e, 0x49, 0x44, 0x5c, 0x1a, 0x16, 0x37, 0x49, 0x3b, 0x3e, 0x32, 0x56, 0xe7, 0xa7, 0x89, 0x75, 0xd3, 0xb0, 0xfe, 0xa2, 0xd3, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x6a, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x25, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x04, 0x59, 0xb6, 0xfc, 0x00, 0xb6, 0xfe, 0xf0, 0x01, 0x6a, 0x01, 0xe0, 0x01, 0x6a, 0xfe, 0x96, 0xfe, 0x20, 0xfe, 0x96, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0xfd, 0x88, 0x02, 0x78, 0xfa, 0x2b, 0x02, 0xdb, 0xfd, 0x25, 0x00, 0x00, 0x01, 0x00, 0x40, 0x00, 0x00, 0x04, 0x14, 0x06, 0x14, 0x00, 0x19, 0x00, 0x00, 0x01, 0x03, 0x23, 0x13, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x03, 0x23, 0x01, 0x33, 0x03, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x04, 0x03, 0x76, 0xa7, 0x76, 0x08, 0x0a, 0x60, 0x55, 0x86, 0xc3, 0x1d, 0x6d, 0xa5, 0x01, 0x11, 0xa5, 0x6b, 0x3f, 0xc4, 0x6c, 0x85, 0x93, 0x08, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9d, 0x2f, 0x48, 0x15, 0x54, 0x5e, 0xc8, 0xa6, 0xfd, 0x93, 0x06, 0x14, 0xfd, 0x9c, 0x5e, 0x6d, 0xa0, 0x91, 0x24, 0x52, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x51, 0x00, 0x00, 0x04, 0x14, 0x06, 0x14, 0x00, 0x19, 0x00, 0x00, 0x01, 0x33, 0x07, 0x25, 0x17, 0x05, 0x03, 0x36, 0x33, 0x32, 0x16, 0x07, 0x03, 0x23, 0x13, 0x12, 0x23, 0x22, 0x06, 0x07, 0x03, 0x23, 0x13, 0x07, 0x27, 0x37, 0x01, 0x61, 0xa6, 0x28, 0x01, 0x65, 0x0d, 0xfe, 0x7b, 0x2f, 0x99, 0xd0, 0xae, 0x88, 0x29, 0x76, 0xa5, 0x75, 0x37, 0xdf, 0x86, 0xbc, 0x1d, 0x6e, 0xa7, 0xc9, 0xbc, 0x0d, 0xdd, 0x06, 0x14, 0xea, 0x7c, 0x61, 0x88, 0xfe, 0xf5, 0xc9, 0xef, 0xe8, 0xfd, 0x5c, 0x02, 0x9e, 0x01, 0x3d, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x7f, 0x42, 0x63, 0x4c, 0x00, 0x00, 0x01, 0x00, 0x35, 0xff, 0xe1, 0x03, 0x1c, 0x05, 0xf0, 0x00, 0x39, 0x00, 0x00, 0x01, 0x0f, 0x01, 0x11, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x11, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x14, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x03, 0x1c, 0x1b, 0x5e, 0xae, 0x75, 0x80, 0x63, 0x36, 0x32, 0x0f, 0x17, 0x1f, 0x19, 0x1c, 0x07, 0x0a, 0x0a, 0x18, 0x12, 0x35, 0x43, 0x49, 0x38, 0x1e, 0x1c, 0x70, 0x51, 0x57, 0x28, 0x2f, 0x06, 0x12, 0x1c, 0x14, 0x15, 0x18, 0x14, 0x24, 0x50, 0x45, 0x7d, 0x86, 0xa3, 0x1e, 0x70, 0x05, 0xe3, 0x2c, 0x16, 0xfc, 0xfe, 0xfe, 0x86, 0xc2, 0x82, 0x3c, 0x37, 0x44, 0x39, 0x0f, 0x1b, 0x23, 0x07, 0x37, 0x2e, 0x1b, 0x13, 0x4d, 0x3d, 0x86, 0x84, 0xbe, 0x03, 0x11, 0x1a, 0x1d, 0x2e, 0x31, 0x3f, 0x1b, 0x16, 0x04, 0x40, 0x09, 0x27, 0x1f, 0x12, 0x16, 0x28, 0x4d, 0x7f, 0x58, 0x49, 0x28, 0x27, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5f, 0xff, 0xe3, 0x04, 0xbf, 0x05, 0xf0, 0x00, 0x21, 0x00, 0x32, 0x00, 0x00, 0x3f, 0x01, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x06, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x13, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x07, 0x06, 0x23, 0x22, 0x26, 0x23, 0x22, 0x07, 0x5f, 0x7e, 0x64, 0x6a, 0x33, 0x77, 0x81, 0x1e, 0x6d, 0x5a, 0x40, 0x38, 0x48, 0x48, 0xc0, 0x48, 0x48, 0x2f, 0xb5, 0xa8, 0xda, 0x30, 0x74, 0x78, 0x32, 0x55, 0x63, 0x62, 0x7f, 0x6f, 0x72, 0x6e, 0x73, 0x70, 0x71, 0xb4, 0x7d, 0x64, 0x81, 0xc0, 0x81, 0x6e, 0x73, 0x5a, 0xa5, 0x27, 0x50, 0x56, 0x89, 0x61, 0x4b, 0x7e, 0x70, 0x92, 0x6d, 0x64, 0xa0, 0x8c, 0x8b, 0x79, 0x6b, 0x94, 0x62, 0xbc, 0x5e, 0xf2, 0xde, 0x4f, 0x50, 0x05, 0x36, 0x38, 0x31, 0x2f, 0x3a, 0xaa, 0x3a, 0x62, 0x3a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3d, 0xff, 0xe3, 0x04, 0xe3, 0x05, 0xf2, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x23, 0x35, 0x22, 0x07, 0x06, 0x07, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x13, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x17, 0x33, 0x32, 0x01, 0xac, 0xe8, 0x63, 0x51, 0x4a, 0x36, 0x5d, 0x4d, 0x3c, 0x08, 0x27, 0x16, 0x63, 0x6d, 0x6d, 0x2f, 0x5b, 0x50, 0x80, 0xeb, 0x4a, 0x3d, 0x32, 0x2f, 0x0c, 0x30, 0x42, 0x17, 0x2c, 0x22, 0x2b, 0x31, 0x0a, 0x05, 0x1f, 0x1e, 0x3a, 0x59, 0xbc, 0x66, 0x40, 0x3c, 0x0d, 0x25, 0x1c, 0x27, 0x1a, 0x0c, 0x0a, 0x06, 0x25, 0x2e, 0x33, 0x44, 0x29, 0x20, 0x20, 0x04, 0x03, 0x12, 0x14, 0x22, 0x32, 0x3b, 0x02, 0x0e, 0x38, 0x01, 0x5f, 0x6e, 0x30, 0x18, 0x19, 0x56, 0x42, 0x9a, 0x52, 0x1e, 0x0e, 0x84, 0x0e, 0xe4, 0x6e, 0x79, 0x23, 0x1f, 0x48, 0x89, 0x08, 0x42, 0x3f, 0x84, 0x18, 0xc1, 0x58, 0x21, 0x24, 0x18, 0x39, 0x42, 0x01, 0x7f, 0xa9, 0x84, 0x80, 0x4d, 0x77, 0x3e, 0x37, 0x6c, 0x1a, 0x10, 0x2e, 0x1b, 0x0b, 0x3b, 0x37, 0x25, 0x2c, 0x3b, 0x28, 0xd3, 0xa7, 0xbd, 0x75, 0x79, 0x2c, 0x44, 0x30, 0x03, 0x00, 0x02, 0xff, 0xe6, 0xff, 0xe3, 0x02, 0x8a, 0x05, 0xf0, 0x00, 0x1c, 0x00, 0x26, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x07, 0x23, 0x36, 0x37, 0x26, 0x35, 0x34, 0x37, 0x12, 0x37, 0x36, 0x33, 0x32, 0x15, 0x06, 0x07, 0x02, 0x01, 0x12, 0x13, 0x36, 0x35, 0x34, 0x23, 0x06, 0x03, 0x06, 0x01, 0x12, 0x24, 0x4f, 0x34, 0x43, 0x78, 0x36, 0x3f, 0x44, 0x3f, 0x8d, 0x38, 0x44, 0x8c, 0x61, 0x48, 0x09, 0x1c, 0x69, 0x5e, 0x41, 0x6e, 0x71, 0x01, 0x10, 0x41, 0xfe, 0xd9, 0xa8, 0x33, 0x1b, 0x16, 0x62, 0x58, 0x18, 0x01, 0x0c, 0xc8, 0x73, 0x66, 0x35, 0x39, 0x8b, 0x6e, 0x93, 0x89, 0x4e, 0x55, 0x98, 0x98, 0x02, 0x3b, 0x75, 0x51, 0xad, 0x4e, 0x5d, 0xfe, 0x83, 0xfe, 0xf7, 0x01, 0x5c, 0x01, 0x16, 0x93, 0x26, 0x45, 0x57, 0xfd, 0xfa, 0x91, 0x00, 0x02, 0x00, 0x1c, 0xff, 0xe3, 0x05, 0x7f, 0x06, 0x14, 0x00, 0x1f, 0x00, 0x27, 0x00, 0x00, 0x13, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x00, 0x10, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0xae, 0xa5, 0xa6, 0xa6, 0x02, 0x6d, 0xfd, 0x93, 0x35, 0x9f, 0x6f, 0xb7, 0xe6, 0xe6, 0xb7, 0x6f, 0x9f, 0x35, 0xa6, 0xa6, 0xa5, 0x91, 0x91, 0x04, 0x25, 0x97, 0xfe, 0xfa, 0x97, 0x97, 0x01, 0x06, 0x06, 0x14, 0x93, 0x93, 0x93, 0x7d, 0xfe, 0xb2, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x64, 0xa8, 0x05, 0x04, 0xfa, 0xfc, 0x05, 0x04, 0x7d, 0xfb, 0xe3, 0x01, 0x96, 0xe7, 0xe7, 0xfe, 0x6a, 0xe7, 0x00, 0x00, 0x02, 0x00, 0xb2, 0x00, 0x00, 0x05, 0x12, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x01, 0x23, 0x09, 0x01, 0x21, 0x01, 0x11, 0x33, 0x11, 0x21, 0x01, 0x11, 0x23, 0x04, 0x9c, 0xfd, 0x62, 0xd6, 0x02, 0x9e, 0xfc, 0xed, 0x01, 0x7c, 0x02, 0x88, 0x5a, 0xfe, 0x84, 0xfd, 0x78, 0x5a, 0x64, 0x05, 0x0d, 0xfa, 0xf3, 0x05, 0x71, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0x2b, 0x04, 0xe1, 0xfb, 0x1f, 0x00, 0x00, 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, 0x06, 0xfb, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x00, 0x33, 0x35, 0x32, 0x35, 0x11, 0x33, 0x01, 0x11, 0x34, 0x36, 0x33, 0x15, 0x22, 0x15, 0x11, 0x23, 0x01, 0x11, 0x14, 0x06, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0x35, 0x21, 0x15, 0x31, 0x84, 0xf5, 0x02, 0x54, 0x8d, 0xa7, 0x84, 0xf5, 0xfd, 0xac, 0x8d, 0x04, 0x66, 0x82, 0x5c, 0x5d, 0x81, 0x81, 0x5d, 0x5c, 0x82, 0x7e, 0x33, 0x2d, 0x2d, 0x33, 0x33, 0x2d, 0x2d, 0x33, 0x7e, 0x01, 0xbc, 0xaa, 0x6b, 0x04, 0xc0, 0xfb, 0x1f, 0x03, 0xcc, 0x80, 0x95, 0xaa, 0x6b, 0xfb, 0x40, 0x04, 0xe1, 0xfc, 0x34, 0x80, 0x95, 0x02, 0x6e, 0x8a, 0xbf, 0xbf, 0x8a, 0x8a, 0xbf, 0xbf, 0x8a, 0x4e, 0x67, 0x67, 0x4e, 0x4e, 0x67, 0x67, 0xfd, 0x44, 0x7b, 0x7b, 0x00, 0x00, 0x04, 0x00, 0xfe, 0x00, 0x00, 0x06, 0x35, 0x05, 0xca, 0x00, 0x0c, 0x00, 0x19, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x16, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x06, 0x23, 0x22, 0x00, 0x11, 0x12, 0x00, 0x33, 0x32, 0x00, 0x11, 0x10, 0x27, 0x05, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x05, 0x70, 0xc4, 0xfe, 0x76, 0xfe, 0xf0, 0xfe, 0xed, 0xfe, 0x7d, 0x05, 0x01, 0x88, 0x01, 0x13, 0x01, 0x13, 0x25, 0xee, 0xec, 0xfe, 0xac, 0x04, 0x01, 0x50, 0xec, 0xec, 0x01, 0x54, 0xa9, 0xfe, 0x0b, 0xa0, 0x59, 0x61, 0x61, 0x59, 0xfe, 0xe1, 0x01, 0x1f, 0x9f, 0xa2, 0xa2, 0x9f, 0xa0, 0x7f, 0x04, 0xf1, 0xdb, 0xfe, 0xce, 0xfe, 0xd0, 0xfe, 0x4c, 0x01, 0xb4, 0x01, 0x30, 0x01, 0x30, 0x01, 0xb6, 0x65, 0xfe, 0x85, 0xfe, 0xf9, 0xfe, 0xfb, 0xfe, 0x87, 0x01, 0x79, 0x01, 0x05, 0x01, 0x09, 0xbb, 0x77, 0xfe, 0xaf, 0x58, 0x51, 0x50, 0x58, 0x64, 0x89, 0x83, 0x85, 0x87, 0xfe, 0x98, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xfe, 0x3b, 0x04, 0xbd, 0x03, 0xf6, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x06, 0x15, 0x14, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x36, 0x37, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x01, 0x12, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x10, 0x37, 0x26, 0x35, 0x34, 0x37, 0x03, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x32, 0x37, 0x36, 0x35, 0x34, 0x01, 0xfc, 0x7a, 0x1c, 0x52, 0x9a, 0xc5, 0x77, 0x76, 0x3f, 0x41, 0x8c, 0x6d, 0x9d, 0x5a, 0x45, 0x10, 0x08, 0x25, 0x66, 0x6e, 0x54, 0x3e, 0x23, 0x1c, 0x43, 0xaa, 0xfe, 0xc2, 0x7a, 0x3e, 0x50, 0x76, 0x66, 0x34, 0x39, 0xc9, 0x2a, 0xd1, 0x85, 0x74, 0x1c, 0x2b, 0x29, 0x3b, 0x19, 0x1d, 0x03, 0xc6, 0x82, 0xbe, 0x4d, 0x6b, 0x65, 0x94, 0xbd, 0x4c, 0x50, 0xab, 0xda, 0xd7, 0xa7, 0x3c, 0x2b, 0x1d, 0x28, 0x8c, 0x68, 0xc3, 0x7c, 0x48, 0x3d, 0xfe, 0x79, 0xfe, 0xde, 0x7c, 0x9d, 0x6e, 0x8e, 0x3d, 0x42, 0x86, 0x01, 0x0b, 0xfc, 0x9e, 0x7f, 0xee, 0xa4, 0xfc, 0xef, 0xc6, 0x7b, 0x75, 0x2e, 0x46, 0x01, 0x2f, 0x34, 0x5f, 0x4e, 0x00, 0x00, 0x04, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x32, 0x37, 0x11, 0x26, 0x23, 0x25, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x21, 0x01, 0x11, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x01, 0x0e, 0xb6, 0x5a, 0x01, 0x10, 0x15, 0x15, 0x15, 0x15, 0xfd, 0x86, 0x02, 0x4f, 0xe1, 0xe8, 0xe8, 0xe2, 0xe4, 0xfe, 0x96, 0x03, 0x02, 0x36, 0x29, 0x54, 0x53, 0x28, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0xfd, 0x6a, 0x02, 0x02, 0x92, 0x02, 0x64, 0xdb, 0xd3, 0xd5, 0xda, 0xfd, 0x88, 0x05, 0x5a, 0xfd, 0x99, 0x16, 0x29, 0x56, 0x9f, 0x9e, 0x56, 0x29, 0x00, 0x00, 0x00, 0x04, 0x00, 0x67, 0xfe, 0xf8, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x11, 0x00, 0x19, 0x00, 0x21, 0x00, 0x29, 0x00, 0x00, 0x25, 0x13, 0x23, 0x27, 0x07, 0x06, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x02, 0x25, 0x16, 0x32, 0x37, 0x11, 0x26, 0x22, 0x07, 0x03, 0x11, 0x06, 0x07, 0x06, 0x10, 0x17, 0x16, 0x01, 0x11, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x03, 0xd5, 0xef, 0xdb, 0xc7, 0x2e, 0x0f, 0x0f, 0xfe, 0xe5, 0xfe, 0xad, 0x01, 0x53, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x52, 0xbc, 0xfd, 0x74, 0x61, 0xf5, 0x61, 0x61, 0xf5, 0x61, 0x5f, 0x20, 0x1d, 0x8b, 0x8b, 0x1d, 0x02, 0x94, 0x20, 0x1c, 0x8b, 0x8b, 0x1c, 0x1b, 0xfe, 0xdd, 0xef, 0x03, 0x01, 0x01, 0xa5, 0x01, 0x61, 0x01, 0x62, 0x01, 0xa5, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0xfc, 0xfe, 0x8e, 0x0b, 0x32, 0x32, 0x04, 0xd7, 0x32, 0x32, 0xfb, 0x6a, 0x04, 0x54, 0x1d, 0x25, 0xb6, 0xfd, 0x9c, 0xb5, 0x25, 0x04, 0x35, 0xfb, 0xaf, 0x1d, 0x24, 0xb6, 0x02, 0x63, 0xb6, 0x24, 0x00, 0x00, 0x02, 0x00, 0x3b, 0xff, 0xee, 0x05, 0x80, 0x06, 0x32, 0x00, 0x0c, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x11, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x13, 0x03, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x11, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x21, 0x36, 0x3f, 0x01, 0x15, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x02, 0xef, 0x1b, 0x37, 0x81, 0x54, 0x5e, 0x4a, 0x19, 0x53, 0x50, 0x87, 0xb9, 0x4d, 0x1c, 0x2e, 0x2b, 0x3f, 0x8f, 0xa7, 0x63, 0x32, 0x35, 0x18, 0x16, 0x20, 0x17, 0x14, 0x18, 0x10, 0x13, 0x0f, 0x17, 0x3f, 0x5c, 0x4b, 0x33, 0x1e, 0x1d, 0xcf, 0x75, 0x36, 0x09, 0x01, 0x0f, 0x1a, 0x20, 0x30, 0x1a, 0x27, 0x5d, 0xaa, 0x01, 0x05, 0x1b, 0x35, 0x36, 0xa3, 0x7c, 0x76, 0x2e, 0x4f, 0x63, 0x5d, 0x8b, 0x51, 0x4a, 0x6f, 0x17, 0x28, 0x1a, 0x1c, 0x1f, 0x10, 0x1c, 0x20, 0x33, 0x38, 0x35, 0x44, 0x1d, 0x49, 0x05, 0xa1, 0xfd, 0x49, 0x07, 0x61, 0x67, 0xc2, 0xa3, 0x53, 0x1b, 0x14, 0x0f, 0xfb, 0x16, 0x01, 0xe6, 0x09, 0xc0, 0x88, 0x89, 0x44, 0xa3, 0x35, 0x40, 0x37, 0x2a, 0x1a, 0x18, 0x16, 0x1a, 0x1f, 0x27, 0x10, 0x1a, 0x53, 0x3a, 0x79, 0x7d, 0x9e, 0x03, 0x2a, 0x82, 0x37, 0x48, 0x19, 0x30, 0x09, 0x35, 0x0f, 0x23, 0x21, 0x1f, 0x18, 0x2c, 0x49, 0x91, 0x6c, 0xbb, 0x0d, 0x1d, 0x1c, 0x40, 0x1c, 0x1f, 0x33, 0x58, 0xa7, 0xbf, 0x6e, 0x68, 0x30, 0xde, 0xcd, 0x7b, 0x1f, 0x1f, 0x28, 0x32, 0x18, 0x72, 0x3a, 0x3d, 0x1f, 0x4f, 0x00, 0x00, 0x02, 0x00, 0x4a, 0xff, 0xe3, 0x05, 0xc8, 0x05, 0xf1, 0x00, 0x49, 0x00, 0x58, 0x00, 0x00, 0x05, 0x26, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x16, 0x17, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x11, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x14, 0x17, 0x16, 0x33, 0x17, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x37, 0x17, 0x01, 0x16, 0x15, 0x11, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x04, 0x82, 0x4a, 0x14, 0x24, 0x47, 0x26, 0x53, 0x6c, 0x5c, 0x5d, 0x7e, 0x7f, 0x5c, 0x5c, 0x28, 0x2a, 0x39, 0x3a, 0x81, 0x39, 0x3a, 0x3a, 0x39, 0x52, 0x49, 0x3b, 0x39, 0x39, 0x3a, 0x4a, 0x31, 0x88, 0x5c, 0x5c, 0x5c, 0x5c, 0x88, 0x92, 0x5b, 0x1b, 0x0e, 0xbe, 0xa8, 0x65, 0x2a, 0x21, 0x71, 0x3a, 0x3c, 0x70, 0x34, 0x2c, 0x21, 0x18, 0x1d, 0x28, 0x82, 0x26, 0xfc, 0xfa, 0x12, 0x8b, 0x82, 0x45, 0x43, 0x43, 0x16, 0x1c, 0x39, 0x5c, 0x1d, 0xb7, 0x9f, 0x8c, 0x5b, 0xa6, 0x2b, 0x38, 0xc7, 0xce, 0x76, 0x75, 0x75, 0x76, 0xb0, 0x0c, 0x0c, 0x7a, 0x56, 0x57, 0x57, 0x57, 0x96, 0x02, 0x9b, 0x95, 0x58, 0x57, 0x57, 0x56, 0xca, 0x56, 0x57, 0x5c, 0x75, 0x76, 0x9c, 0x9d, 0x75, 0x75, 0x75, 0x23, 0x20, 0x62, 0x57, 0x0e, 0x31, 0xb1, 0x57, 0x7b, 0x7c, 0x5e, 0x31, 0x24, 0x68, 0x7b, 0x83, 0x80, 0x76, 0x43, 0x5b, 0x04, 0x53, 0x4b, 0x5c, 0xfe, 0x95, 0x47, 0x43, 0x68, 0x66, 0x79, 0x97, 0x20, 0x0a, 0x2f, 0x00, 0x05, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x94, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2e, 0x00, 0x32, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x16, 0x17, 0x13, 0x33, 0x03, 0x1e, 0x01, 0x17, 0x13, 0x21, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x21, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x11, 0x21, 0x32, 0x37, 0x11, 0x26, 0x23, 0x17, 0x11, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x25, 0x11, 0x33, 0x11, 0x04, 0x7c, 0x45, 0x3d, 0x3e, 0x6c, 0x29, 0x46, 0x5b, 0x80, 0xb3, 0xed, 0x2f, 0x66, 0x38, 0xb8, 0xfe, 0x74, 0xab, 0x43, 0x7d, 0x6c, 0x12, 0xfe, 0x96, 0x02, 0x63, 0xe7, 0xe2, 0x69, 0x2c, 0xfd, 0xd3, 0x01, 0x24, 0x16, 0x15, 0x15, 0x16, 0x89, 0x3b, 0x26, 0x51, 0x50, 0x26, 0xfd, 0x07, 0xb6, 0x01, 0x7f, 0x97, 0x30, 0x31, 0x2f, 0xc9, 0xfe, 0xe5, 0x02, 0x4f, 0x19, 0x84, 0x7e, 0xfe, 0x68, 0x01, 0x7f, 0x96, 0x62, 0xfd, 0x89, 0x05, 0xd5, 0xd6, 0xd8, 0xd0, 0x62, 0x29, 0x02, 0xa5, 0xfd, 0x6a, 0x02, 0x02, 0x92, 0x02, 0x17, 0xfd, 0x99, 0x16, 0x29, 0x56, 0x01, 0x3e, 0x55, 0x29, 0x2d, 0xfa, 0xf3, 0x05, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x98, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x17, 0x37, 0x33, 0x09, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x01, 0x01, 0x4e, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0x01, 0x04, 0x68, 0x9c, 0xe4, 0xb6, 0x01, 0x9a, 0xe2, 0xe8, 0x46, 0x9c, 0xab, 0xd1, 0xfe, 0xec, 0x01, 0x22, 0xd1, 0xbb, 0xbe, 0xd1, 0x01, 0x28, 0x05, 0x2f, 0xfd, 0xcf, 0x92, 0x87, 0x86, 0x92, 0xfd, 0x5f, 0x36, 0xfd, 0xa8, 0x05, 0xd5, 0xe3, 0xdb, 0xac, 0x6b, 0xdb, 0xea, 0xfe, 0x86, 0xfe, 0x6b, 0x01, 0x04, 0xfe, 0xfc, 0x01, 0x95, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xff, 0x25, 0x04, 0xcc, 0x06, 0xc7, 0x00, 0x05, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x11, 0x33, 0x13, 0x26, 0x23, 0x13, 0x16, 0x17, 0x16, 0x17, 0x13, 0x23, 0x03, 0x26, 0x27, 0x26, 0x27, 0x01, 0x27, 0x37, 0x23, 0x11, 0x21, 0x32, 0x17, 0x37, 0x25, 0x37, 0x05, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x0b, 0x01, 0x36, 0x37, 0x36, 0x35, 0x34, 0x01, 0x13, 0x23, 0x01, 0x6b, 0xbc, 0xb4, 0x39, 0x53, 0xe3, 0x3b, 0x37, 0x34, 0x3b, 0xb9, 0xc4, 0xac, 0x43, 0x3e, 0x30, 0x4d, 0xfe, 0xd0, 0x64, 0x3f, 0x54, 0x01, 0x9a, 0x72, 0x55, 0x0a, 0xfe, 0xdb, 0x27, 0x01, 0x8a, 0x32, 0x19, 0x14, 0x71, 0x75, 0x70, 0x96, 0x4b, 0x2e, 0x43, 0xfe, 0x12, 0x80, 0x80, 0x05, 0x2f, 0xfd, 0xee, 0x01, 0xf8, 0x1a, 0xfd, 0x8d, 0x16, 0x48, 0x44, 0x82, 0xfe, 0x68, 0x01, 0x7f, 0x97, 0x30, 0x26, 0x09, 0xfc, 0xb0, 0x2c, 0xaf, 0x05, 0xd5, 0x1a, 0x1b, 0x82, 0x6f, 0xae, 0x8c, 0x10, 0x13, 0x6b, 0xd8, 0x8d, 0xba, 0x01, 0xe7, 0xfe, 0x5d, 0x0f, 0x2d, 0x44, 0x83, 0x62, 0xfc, 0x87, 0x01, 0x67, 0x00, 0x00, 0x00, 0x02, 0x00, 0xe9, 0x03, 0x8b, 0x05, 0x8b, 0x05, 0xd8, 0x00, 0x27, 0x00, 0x34, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x37, 0x33, 0x1b, 0x01, 0x33, 0x11, 0x23, 0x11, 0x03, 0x23, 0x03, 0x11, 0x23, 0x02, 0x9c, 0x4d, 0x4e, 0x23, 0x3b, 0x3f, 0x2a, 0x3e, 0x32, 0x65, 0x5f, 0x82, 0x7e, 0x2f, 0x67, 0x40, 0x52, 0x5a, 0x2a, 0x3e, 0x44, 0x32, 0x39, 0x32, 0x65, 0x59, 0x7c, 0x70, 0x2e, 0x5e, 0xbb, 0xa6, 0x91, 0x92, 0xa5, 0x7c, 0x7e, 0x79, 0x7f, 0x7c, 0x05, 0xb7, 0x59, 0x22, 0x13, 0x2a, 0x2f, 0x28, 0x20, 0x0b, 0x09, 0x12, 0x56, 0x41, 0x4f, 0x5b, 0x13, 0x15, 0x60, 0x2a, 0x18, 0x2c, 0x32, 0x2c, 0x2a, 0x0a, 0x09, 0x12, 0x4d, 0x3d, 0x48, 0x5c, 0x0f, 0x05, 0xfe, 0xac, 0x01, 0x54, 0xfd, 0xc8, 0x01, 0x94, 0xfe, 0xd8, 0x01, 0x28, 0xfe, 0x6c, 0x00, 0x00, 0x00, 0x03, 0xff, 0xfc, 0x00, 0x00, 0x07, 0x5f, 0x04, 0x60, 0x00, 0x07, 0x00, 0x13, 0x00, 0x19, 0x00, 0x00, 0x03, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x05, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x01, 0x33, 0x11, 0x21, 0x15, 0x21, 0x04, 0x03, 0x55, 0xfe, 0x99, 0x88, 0xfe, 0x9a, 0x02, 0x97, 0x02, 0x31, 0xfe, 0x46, 0x01, 0xa7, 0xfe, 0x59, 0x01, 0xc4, 0xfd, 0xc5, 0x02, 0xa4, 0x77, 0x01, 0xb0, 0xfd, 0xd9, 0x04, 0x60, 0x80, 0xfc, 0x20, 0x03, 0xe0, 0x60, 0x66, 0xfe, 0xf7, 0x66, 0xfe, 0xbb, 0x66, 0x03, 0x80, 0xfc, 0xe6, 0x66, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x09, 0x03, 0x93, 0x05, 0xa6, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x00, 0x01, 0x1b, 0x01, 0x33, 0x11, 0x23, 0x11, 0x03, 0x23, 0x03, 0x11, 0x23, 0x11, 0x23, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x03, 0xdc, 0x9d, 0x93, 0x99, 0x65, 0xb0, 0x31, 0xb7, 0x67, 0x65, 0xb7, 0x67, 0xb4, 0x05, 0xd5, 0xff, 0x00, 0x01, 0x00, 0xfd, 0xbe, 0x01, 0xe4, 0xfe, 0xd1, 0x01, 0x2f, 0xfe, 0x1c, 0x02, 0x42, 0x5e, 0xfe, 0x1c, 0x01, 0xe4, 0x5e, 0x00, 0x00, 0x01, 0x00, 0x0e, 0xff, 0x22, 0x04, 0xde, 0x06, 0xc4, 0x00, 0x10, 0x00, 0x00, 0x01, 0x13, 0x25, 0x37, 0x05, 0x01, 0x13, 0x01, 0x33, 0x01, 0x23, 0x0b, 0x01, 0x27, 0x09, 0x01, 0x33, 0x01, 0xa8, 0xe7, 0xfe, 0xdb, 0x27, 0x01, 0x8b, 0xfe, 0xc4, 0x96, 0x01, 0xab, 0xbd, 0xfe, 0x00, 0xcf, 0x8e, 0xe3, 0x64, 0x01, 0x0f, 0xfe, 0xc5, 0xbe, 0x03, 0x4d, 0x02, 0x86, 0x82, 0x6f, 0xae, 0xfc, 0x90, 0xfe, 0x46, 0x04, 0xe9, 0xfa, 0x2b, 0x01, 0x9e, 0xfd, 0x84, 0x2c, 0x02, 0xf5, 0x03, 0x92, 0x00, 0x02, 0x00, 0x52, 0x00, 0x00, 0x05, 0x0a, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x01, 0x23, 0x01, 0x03, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x01, 0x9a, 0x02, 0xe6, 0xd3, 0xfd, 0x1b, 0x60, 0x04, 0x8d, 0xfd, 0x1a, 0x02, 0xfb, 0xfb, 0x49, 0x02, 0xe5, 0xfd, 0x30, 0x64, 0x05, 0x0d, 0xfa, 0xf3, 0x05, 0x71, 0x64, 0xfa, 0xf3, 0x64, 0x64, 0x05, 0x0d, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0x4c, 0x03, 0xc4, 0x06, 0x14, 0x00, 0x1f, 0x00, 0x00, 0x17, 0x16, 0x20, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x15, 0x01, 0x32, 0x1e, 0x01, 0x15, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x4f, 0x99, 0x01, 0x79, 0xae, 0xa7, 0x94, 0xf5, 0x01, 0xc5, 0xfe, 0x3b, 0x01, 0xc5, 0xfd, 0xfd, 0x02, 0xd4, 0xfe, 0x56, 0x01, 0xaa, 0xfe, 0x56, 0x9a, 0xc9, 0x96, 0x7f, 0xa7, 0xe8, 0xa8, 0xbf, 0xa7, 0x63, 0xa3, 0xcc, 0x86, 0x93, 0xa6, 0x01, 0x65, 0x93, 0x01, 0x65, 0x93, 0xa8, 0xfe, 0xb0, 0xa8, 0xfe, 0xb0, 0x61, 0xd4, 0x8a, 0xfe, 0xd3, 0x66, 0x86, 0x4a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, 0x00, 0x00, 0x05, 0x3b, 0x05, 0xe7, 0x10, 0x06, 0x03, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x46, 0xff, 0xe3, 0x05, 0x3b, 0x05, 0xca, 0x10, 0x06, 0x01, 0x73, 0x00, 0x00, 0x00, 0x01, 0x00, 0x15, 0xfe, 0xce, 0x04, 0x20, 0x06, 0x44, 0x00, 0x55, 0x00, 0x00, 0x01, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x37, 0x33, 0x06, 0x17, 0x16, 0x33, 0x32, 0x37, 0x32, 0x36, 0x33, 0x32, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x10, 0x03, 0x06, 0x21, 0x22, 0x27, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x01, 0x66, 0x56, 0x70, 0x6d, 0x5f, 0x1f, 0x2c, 0x49, 0x16, 0x73, 0x87, 0x17, 0x53, 0x20, 0x16, 0x89, 0x1f, 0x1f, 0x1f, 0x20, 0x75, 0x27, 0x4c, 0x0f, 0x40, 0x0f, 0x40, 0x53, 0x16, 0x36, 0x75, 0x77, 0x61, 0x02, 0x40, 0x2c, 0xe2, 0x5b, 0x21, 0x9f, 0xd9, 0xfe, 0xf4, 0x67, 0x58, 0x01, 0x04, 0x0e, 0x16, 0x20, 0x2b, 0x3e, 0x15, 0x43, 0x4f, 0x49, 0x36, 0x45, 0x10, 0x0a, 0x16, 0x1b, 0x3a, 0x89, 0x69, 0x43, 0x22, 0x23, 0x0f, 0x12, 0x1e, 0x5d, 0x9e, 0x61, 0x54, 0x02, 0xa8, 0x8a, 0x09, 0x79, 0x6a, 0x8d, 0x2e, 0x23, 0x2e, 0x0b, 0x0b, 0x23, 0x19, 0x21, 0xd3, 0x3c, 0x23, 0x21, 0x05, 0x06, 0x16, 0x18, 0x3b, 0x47, 0xa3, 0x81, 0x84, 0x42, 0x03, 0x0e, 0x98, 0x77, 0x80, 0xfe, 0xeb, 0xfe, 0xfa, 0xc8, 0x18, 0x87, 0x1c, 0x2c, 0x10, 0x18, 0x3c, 0x24, 0x3d, 0x2c, 0x23, 0x23, 0x16, 0x77, 0x55, 0x19, 0x1e, 0x74, 0x4b, 0x79, 0x79, 0x98, 0x56, 0x3f, 0x40, 0x21, 0x6a, 0x2e, 0x00, 0x00, 0x01, 0x00, 0x3d, 0x00, 0x00, 0x01, 0xd6, 0x04, 0x60, 0x00, 0x0d, 0x00, 0x00, 0x21, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x01, 0x2d, 0x1f, 0x20, 0x62, 0x4f, 0x63, 0xa4, 0x48, 0x4a, 0x02, 0xd5, 0x91, 0x2e, 0x30, 0x9c, 0x60, 0x62, 0xd4, 0xfd, 0x36, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x07, 0x6d, 0x10, 0x06, 0x00, 0x87, 0x00, 0x00, 0x00, 0x03, 0x00, 0x52, 0x00, 0x00, 0x05, 0x49, 0x06, 0x2e, 0x00, 0x32, 0x00, 0x3f, 0x00, 0x52, 0x00, 0x00, 0x01, 0x17, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x29, 0x01, 0x37, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x11, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x14, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x05, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x11, 0x14, 0x03, 0x05, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x03, 0xff, 0x07, 0x98, 0x55, 0x56, 0x6d, 0xc6, 0xfe, 0xd4, 0xfd, 0xb4, 0x36, 0x86, 0x79, 0x33, 0x1a, 0x1c, 0xa6, 0x75, 0x45, 0x0a, 0x0b, 0x11, 0x1e, 0x27, 0x17, 0x0f, 0x22, 0x65, 0x90, 0xee, 0x89, 0x08, 0xb2, 0x83, 0x80, 0x2c, 0x41, 0x5c, 0x44, 0xfe, 0xaf, 0xb8, 0x66, 0x4a, 0x3e, 0x26, 0x5b, 0x61, 0x79, 0xfc, 0x01, 0x39, 0x7b, 0x61, 0x5d, 0x2c, 0x4f, 0x4e, 0x29, 0x4c, 0x45, 0x6a, 0x44, 0x41, 0x1c, 0x2a, 0x4f, 0x03, 0x54, 0x10, 0x61, 0x5e, 0x80, 0xae, 0x7d, 0xda, 0x75, 0x86, 0x3b, 0x8b, 0x84, 0xd3, 0x02, 0x83, 0x82, 0x49, 0x4d, 0x0b, 0x3d, 0x05, 0x2c, 0x0d, 0x33, 0x13, 0x21, 0x16, 0x23, 0x56, 0x86, 0x74, 0x9f, 0x27, 0x49, 0x40, 0x1c, 0x1f, 0x33, 0x48, 0x6c, 0x9a, 0x68, 0x4a, 0x33, 0x70, 0x52, 0x81, 0x75, 0x46, 0x2a, 0x1b, 0x18, 0xfd, 0xc2, 0x1d, 0xfd, 0x28, 0x02, 0x1a, 0x1d, 0x30, 0x58, 0xb9, 0x72, 0x56, 0x2c, 0x18, 0x18, 0x06, 0xec, 0x6e, 0xce, 0x00, 0x01, 0x00, 0x75, 0xff, 0xe8, 0x04, 0xb2, 0x05, 0xf0, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x17, 0x36, 0x25, 0x1e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x37, 0x15, 0x06, 0x07, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x37, 0x22, 0x07, 0x06, 0x15, 0x10, 0x17, 0x16, 0x25, 0x37, 0x15, 0x06, 0x07, 0x06, 0x24, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x02, 0x10, 0x40, 0x89, 0x01, 0x11, 0x0a, 0x24, 0x0a, 0x0f, 0x0e, 0x14, 0x5f, 0x7e, 0x5e, 0x35, 0x69, 0x25, 0x1b, 0x15, 0x0a, 0x03, 0x0d, 0x0d, 0x0e, 0x3f, 0x67, 0xb3, 0x17, 0x51, 0x42, 0x1f, 0x29, 0x1e, 0x11, 0x70, 0x42, 0x5f, 0x9f, 0xc8, 0x01, 0x46, 0xe8, 0xc2, 0x5b, 0xad, 0xfe, 0xb4, 0x75, 0x53, 0x2a, 0x2b, 0x55, 0xac, 0x05, 0x35, 0x23, 0x6c, 0x72, 0x1c, 0x77, 0x1f, 0x28, 0x0f, 0x16, 0x21, 0x2e, 0x44, 0x0e, 0x24, 0xbb, 0x0d, 0x22, 0x1c, 0x39, 0x42, 0x47, 0x16, 0x33, 0x32, 0x4b, 0x25, 0x8d, 0x46, 0x6e, 0x1f, 0x23, 0x16, 0x49, 0x23, 0x74, 0x33, 0xb9, 0x74, 0x52, 0x5d, 0x86, 0xda, 0xfe, 0xb9, 0xb0, 0xe1, 0x26, 0x7f, 0x39, 0x88, 0x4b, 0x28, 0x56, 0x82, 0x5c, 0x8f, 0x91, 0xb5, 0xd1, 0xbd, 0x93, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x70, 0xff, 0xe7, 0x05, 0xb7, 0x05, 0x2d, 0x00, 0x1a, 0x00, 0x29, 0x00, 0x00, 0x25, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x20, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x15, 0x21, 0x22, 0x15, 0x35, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x01, 0x68, 0x3c, 0x54, 0x87, 0x01, 0x29, 0x89, 0x5f, 0x46, 0x63, 0x55, 0x80, 0xa1, 0xfe, 0xa1, 0xfe, 0xbf, 0xb3, 0xb5, 0x01, 0x43, 0xac, 0xaa, 0x01, 0x43, 0xb5, 0xfb, 0xc3, 0x11, 0x11, 0x03, 0x35, 0x12, 0x3f, 0x56, 0x88, 0x8f, 0x90, 0x89, 0x56, 0x3d, 0xe4, 0x4d, 0x33, 0x54, 0x54, 0x3c, 0x60, 0x78, 0x47, 0x5a, 0xb3, 0x01, 0x41, 0xaf, 0xb0, 0x01, 0x45, 0xae, 0xae, 0xfe, 0xbb, 0xb0, 0x13, 0x49, 0x13, 0x13, 0x01, 0x70, 0x50, 0x33, 0x52, 0x51, 0x34, 0x4f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4e, 0xff, 0xe3, 0x03, 0xf0, 0x04, 0x44, 0x00, 0x1c, 0x00, 0x25, 0x00, 0x00, 0x01, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x00, 0x33, 0x20, 0x11, 0x14, 0x07, 0x06, 0x37, 0x36, 0x35, 0x34, 0x23, 0x22, 0x06, 0x03, 0x20, 0x01, 0x0e, 0x04, 0x1f, 0x35, 0x8e, 0x69, 0x33, 0x5c, 0x15, 0x7a, 0x24, 0x86, 0x5e, 0xfe, 0x8d, 0x64, 0x46, 0x0e, 0x2c, 0x01, 0x30, 0xd8, 0x01, 0x60, 0xb8, 0xbd, 0x61, 0x64, 0xcc, 0x78, 0xa8, 0x33, 0x01, 0x21, 0x01, 0x98, 0x26, 0x22, 0x5e, 0x3e, 0x6e, 0x23, 0x3f, 0x51, 0x7f, 0x59, 0x3e, 0x99, 0x6b, 0x9b, 0x44, 0x4d, 0xfd, 0x01, 0x34, 0xfe, 0xeb, 0xc7, 0x67, 0x69, 0xe0, 0x4d, 0x71, 0xab, 0xcc, 0xfe, 0xed, 0x00, 0x00, 0x00, 0x01, 0x00, 0x91, 0xff, 0xe3, 0x04, 0x13, 0x05, 0xf0, 0x00, 0x45, 0x00, 0x00, 0x01, 0x17, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x15, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x03, 0xbd, 0x55, 0x1c, 0x0e, 0xa0, 0xe2, 0x81, 0x5e, 0x62, 0x3e, 0x55, 0x78, 0x62, 0xa1, 0x01, 0x61, 0x37, 0x47, 0x59, 0x6f, 0xd9, 0x7a, 0x4c, 0x2e, 0x29, 0x2d, 0x1e, 0x25, 0x15, 0x0c, 0x1a, 0x17, 0x21, 0x27, 0x5c, 0x57, 0x3a, 0x57, 0x48, 0x2a, 0x51, 0x56, 0x70, 0x9a, 0x6f, 0x6b, 0x34, 0x62, 0x57, 0x51, 0xae, 0x74, 0x6a, 0x38, 0x0b, 0x01, 0x49, 0x68, 0x41, 0x11, 0xac, 0x22, 0x25, 0x40, 0x5f, 0xa9, 0xae, 0x8a, 0x6c, 0x18, 0x15, 0x24, 0x3d, 0x50, 0x94, 0x8b, 0x63, 0x7a, 0x53, 0x32, 0x56, 0x4e, 0x2d, 0x32, 0x16, 0x0e, 0x21, 0x1c, 0x24, 0x2b, 0x1f, 0x25, 0x24, 0x2b, 0x40, 0x65, 0x97, 0x7d, 0x4e, 0x30, 0x17, 0x1a, 0x36, 0x1e, 0x1d, 0x39, 0x6e, 0x99, 0xa6, 0x61, 0x5b, 0x75, 0x3e, 0x5f, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xdf, 0x05, 0x76, 0x06, 0x0b, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x17, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x11, 0x21, 0x07, 0x23, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x21, 0x37, 0x21, 0x11, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x1f, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x21, 0x32, 0x17, 0x37, 0x15, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x05, 0x56, 0x20, 0x50, 0x23, 0x34, 0x23, 0x31, 0xcb, 0x39, 0x01, 0x1d, 0x37, 0xe6, 0x25, 0x26, 0x46, 0xb2, 0xf1, 0x73, 0x56, 0x2e, 0x1b, 0x18, 0x29, 0x1c, 0x0c, 0x10, 0x14, 0x11, 0x18, 0x3c, 0x54, 0x61, 0x6f, 0x38, 0x1a, 0x1e, 0xfe, 0xbb, 0x23, 0x01, 0x22, 0x57, 0x38, 0xae, 0x63, 0x40, 0x06, 0x12, 0x16, 0x20, 0x17, 0x22, 0x20, 0x1c, 0x6c, 0x96, 0x01, 0x15, 0x20, 0x3c, 0x8a, 0xa9, 0x80, 0x2c, 0x13, 0x2c, 0x1d, 0x05, 0xf2, 0x13, 0xa3, 0x4b, 0x14, 0x3d, 0x19, 0xfd, 0xdc, 0x44, 0x63, 0x98, 0x84, 0x80, 0x4b, 0xca, 0x5f, 0x34, 0x42, 0x28, 0x1f, 0x1a, 0x0b, 0x14, 0x30, 0x33, 0x1a, 0x42, 0x7b, 0x3e, 0x63, 0x65, 0x82, 0xb9, 0x44, 0x02, 0x49, 0x18, 0x6e, 0x46, 0x54, 0x3d, 0x1f, 0x49, 0x2c, 0x1a, 0x1f, 0x1f, 0x1f, 0x46, 0xb4, 0x77, 0xa7, 0x08, 0x37, 0x4b, 0x2e, 0x16, 0x09, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xba, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x03, 0xb9, 0xfc, 0xfc, 0x02, 0x4e, 0xfd, 0xeb, 0x02, 0x15, 0xb6, 0xaa, 0x01, 0xb8, 0xaa, 0x02, 0xc9, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x33, 0xff, 0xc7, 0x07, 0x6f, 0x06, 0x02, 0x00, 0x6b, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x11, 0x34, 0x02, 0x37, 0x06, 0x03, 0x02, 0x03, 0x07, 0x27, 0x02, 0x03, 0x26, 0x27, 0x26, 0x27, 0x11, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x35, 0x11, 0x26, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x33, 0x16, 0x13, 0x12, 0x13, 0x17, 0x12, 0x37, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x06, 0x28, 0x14, 0x14, 0x27, 0x18, 0x1a, 0x2f, 0x24, 0x2a, 0x23, 0x26, 0x23, 0x3f, 0x56, 0x8f, 0x33, 0x32, 0x10, 0x05, 0x07, 0x05, 0x9d, 0x6d, 0x6e, 0x32, 0x57, 0x12, 0x35, 0x5c, 0x32, 0x35, 0x38, 0x3f, 0x2e, 0x29, 0x55, 0x48, 0x5a, 0x46, 0x3d, 0x26, 0x1a, 0x16, 0x1f, 0x32, 0x1a, 0x19, 0x3a, 0x27, 0x60, 0x1e, 0x19, 0x41, 0x5e, 0x40, 0x36, 0x37, 0x12, 0x2a, 0x0e, 0x15, 0x19, 0x21, 0x56, 0x6c, 0x81, 0x5f, 0x06, 0x94, 0x65, 0x65, 0x2e, 0x0a, 0x4b, 0x71, 0x73, 0x8d, 0x88, 0xa0, 0x3c, 0x23, 0x1a, 0x10, 0x1b, 0x28, 0x20, 0x07, 0x14, 0x06, 0x0a, 0x04, 0x16, 0x18, 0x1a, 0x17, 0x26, 0x05, 0x1d, 0xfd, 0x35, 0xdc, 0x80, 0x81, 0x2f, 0x16, 0x2c, 0x2c, 0x40, 0x21, 0x3b, 0x44, 0x61, 0x39, 0x37, 0x9e, 0x54, 0x02, 0x01, 0x1e, 0x01, 0x91, 0x1f, 0xb3, 0xfe, 0xc4, 0xfe, 0xc9, 0xfe, 0x56, 0x4d, 0x0f, 0x01, 0xe6, 0x01, 0x3b, 0xa9, 0x6e, 0x77, 0x46, 0xfe, 0x0f, 0xed, 0xbb, 0xb3, 0x5e, 0x4f, 0x3f, 0x2f, 0x2c, 0x25, 0x21, 0x18, 0x3b, 0x3e, 0x6a, 0x79, 0x74, 0x9f, 0x02, 0xd6, 0x58, 0x3c, 0x3b, 0x7d, 0x03, 0x66, 0x3f, 0x45, 0x27, 0x5f, 0x6e, 0xa5, 0xfe, 0xfa, 0xfe, 0xf4, 0xfe, 0xb1, 0x0b, 0x01, 0x48, 0xf4, 0x01, 0x02, 0x97, 0x98, 0x27, 0x1d, 0x1d, 0x27, 0x10, 0x23, 0x09, 0x16, 0x0d, 0x1d, 0x04, 0x18, 0x16, 0x2e, 0x00, 0x00, 0x02, 0x00, 0x5d, 0xff, 0xe7, 0x02, 0xf6, 0x03, 0x29, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x12, 0x03, 0x32, 0x16, 0x15, 0x14, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x12, 0x02, 0x65, 0x4e, 0x47, 0x63, 0x7f, 0x4e, 0x48, 0x62, 0x7f, 0xaf, 0x89, 0xb7, 0xc7, 0x92, 0x89, 0xb6, 0xc6, 0x01, 0xf7, 0x74, 0x7d, 0xfe, 0xfe, 0xcf, 0x74, 0x7b, 0x01, 0x04, 0x01, 0xfd, 0xd8, 0xa3, 0xc6, 0xfe, 0xff, 0xd8, 0xa3, 0xc6, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5c, 0xff, 0xe3, 0x05, 0x21, 0x05, 0xf0, 0x00, 0x34, 0x00, 0x00, 0x09, 0x01, 0x16, 0x15, 0x14, 0x07, 0x34, 0x27, 0x01, 0x07, 0x06, 0x1f, 0x01, 0x16, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x26, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37, 0x14, 0x17, 0x01, 0x13, 0x27, 0x26, 0x35, 0x34, 0x37, 0x14, 0x1f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x34, 0x2f, 0x01, 0x03, 0x64, 0x01, 0x63, 0x59, 0x81, 0x2d, 0xfd, 0x48, 0x8c, 0x37, 0x3b, 0x9b, 0x5a, 0x37, 0x4e, 0x3e, 0xdc, 0xb0, 0x2a, 0x58, 0x30, 0x7e, 0x8b, 0xd9, 0x59, 0x81, 0x2d, 0x02, 0x2e, 0xfd, 0x68, 0x59, 0x81, 0x2d, 0xa4, 0x59, 0x81, 0x2d, 0x11, 0x02, 0xd0, 0xfe, 0x75, 0x63, 0x31, 0x82, 0x4c, 0x53, 0x32, 0x03, 0x05, 0x9c, 0x3f, 0x42, 0xac, 0x64, 0xd6, 0x2c, 0x3e, 0x38, 0x3f, 0x5d, 0x1d, 0x2f, 0x63, 0x36, 0xbc, 0x8d, 0x9b, 0xf1, 0x63, 0x31, 0x82, 0x4c, 0x53, 0x32, 0xfd, 0x96, 0x01, 0x19, 0x74, 0x63, 0x31, 0x82, 0x4c, 0x53, 0x32, 0xb6, 0x63, 0x31, 0x82, 0x4c, 0x53, 0x32, 0x12, 0x00, 0x00, 0x01, 0xff, 0xfb, 0xff, 0xe3, 0x04, 0xb4, 0x05, 0xf1, 0x00, 0x30, 0x00, 0x00, 0x01, 0x11, 0x33, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x0e, 0x01, 0x23, 0x21, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x3f, 0x01, 0x3e, 0x01, 0x33, 0x21, 0x11, 0x34, 0x27, 0x2e, 0x01, 0x23, 0x21, 0x22, 0x2e, 0x03, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x1e, 0x02, 0x33, 0x21, 0x32, 0x16, 0x04, 0x45, 0x47, 0x27, 0x1b, 0x79, 0x0f, 0x12, 0x1f, 0xfc, 0x5b, 0x13, 0x16, 0x15, 0x1e, 0x78, 0x0f, 0x12, 0x21, 0x03, 0x2a, 0x12, 0x12, 0x22, 0x39, 0xfd, 0xbf, 0x35, 0x30, 0x41, 0x1a, 0x14, 0x04, 0x0e, 0x12, 0x17, 0x0b, 0x0a, 0x26, 0x1c, 0x19, 0x02, 0x8e, 0x50, 0x52, 0x04, 0xb6, 0xfc, 0x23, 0x04, 0x24, 0x14, 0x1b, 0x87, 0x12, 0x06, 0x02, 0x14, 0x12, 0x10, 0x22, 0x86, 0x10, 0x06, 0x03, 0x78, 0x32, 0x0d, 0x10, 0x06, 0x04, 0x18, 0x31, 0x5b, 0x47, 0x28, 0x20, 0x14, 0x20, 0x1e, 0x1f, 0x04, 0x57, 0x00, 0x00, 0x01, 0x00, 0x18, 0xff, 0xb8, 0x02, 0xee, 0x05, 0xf0, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x21, 0x32, 0x17, 0x16, 0x14, 0x0e, 0x01, 0x07, 0x1e, 0x01, 0x12, 0x10, 0x07, 0x06, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x0e, 0x01, 0x23, 0x21, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x3e, 0x01, 0x33, 0x21, 0x11, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x01, 0x32, 0x01, 0x2e, 0x62, 0x1b, 0x11, 0x0b, 0x2b, 0x22, 0x02, 0x02, 0x37, 0x09, 0x16, 0x28, 0x14, 0x10, 0x06, 0x0c, 0x5a, 0x10, 0x28, 0xfe, 0x95, 0x3f, 0x1f, 0x78, 0x0f, 0x12, 0x20, 0x01, 0x5e, 0xfe, 0xdb, 0x62, 0x40, 0x12, 0x29, 0x0a, 0x15, 0x2a, 0x0e, 0x05, 0x8f, 0x37, 0x23, 0x2a, 0x28, 0x2f, 0x0a, 0x1a, 0x82, 0xfd, 0x24, 0xfe, 0xfb, 0x22, 0x53, 0x1e, 0x1f, 0x61, 0x65, 0x0e, 0x28, 0x10, 0x21, 0x87, 0x10, 0x06, 0x03, 0xcd, 0x71, 0x7e, 0x42, 0x19, 0x1e, 0x3b, 0x06, 0x02, 0x00, 0x00, 0x01, 0x00, 0x4d, 0xff, 0xb8, 0x04, 0x41, 0x05, 0xf0, 0x00, 0x26, 0x00, 0x00, 0x01, 0x21, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x1e, 0x02, 0x33, 0x21, 0x32, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x01, 0x07, 0x1e, 0x01, 0x17, 0x12, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x35, 0x03, 0xa3, 0xfd, 0x4c, 0x62, 0x40, 0x04, 0x0e, 0x12, 0x17, 0x0b, 0x0b, 0x25, 0x1c, 0x19, 0x02, 0xbd, 0x2f, 0x40, 0x18, 0x05, 0x0b, 0x2b, 0x21, 0x02, 0x01, 0x04, 0x33, 0x09, 0x15, 0x29, 0x15, 0x10, 0x0b, 0x0a, 0x04, 0xa6, 0x71, 0x7e, 0x28, 0x1f, 0x14, 0x1f, 0x1e, 0x20, 0x04, 0x1f, 0x30, 0x1a, 0x0b, 0x10, 0x28, 0x2f, 0x0a, 0x1a, 0x82, 0x26, 0xfd, 0x4a, 0x93, 0x73, 0x21, 0x53, 0x27, 0x44, 0x51, 0x49, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x00, 0x00, 0x02, 0x8f, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x15, 0x00, 0x00, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0xa9, 0x65, 0x49, 0x47, 0x64, 0x64, 0x47, 0x49, 0x65, 0x01, 0x5d, 0x88, 0xfd, 0xb1, 0x88, 0x88, 0x01, 0xc7, 0x05, 0x54, 0x51, 0x6f, 0x6f, 0x51, 0x4f, 0x6f, 0x6e, 0xfb, 0x75, 0x79, 0x79, 0x03, 0x35, 0x79, 0x00, 0x02, 0x00, 0x51, 0xff, 0xd5, 0x06, 0x97, 0x05, 0x3b, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x00, 0x12, 0x10, 0x00, 0x33, 0x32, 0x00, 0x10, 0x00, 0x23, 0x22, 0x05, 0x01, 0x15, 0x07, 0x1e, 0x01, 0x15, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x04, 0xe5, 0x01, 0x27, 0xfe, 0xfe, 0x01, 0x28, 0xfe, 0xd8, 0xfe, 0xfe, 0x03, 0x85, 0x01, 0x06, 0xd7, 0x01, 0x02, 0xfe, 0x85, 0xfe, 0xc2, 0xfe, 0xc2, 0xfe, 0x85, 0x01, 0x7b, 0x01, 0x3e, 0xea, 0x01, 0x4e, 0x03, 0x65, 0xfe, 0x48, 0xfe, 0xfd, 0x01, 0x03, 0x01, 0xb8, 0x01, 0x01, 0xc2, 0x01, 0x0a, 0xf4, 0xdd, 0x21, 0x23, 0x10, 0xfe, 0xc5, 0xfe, 0x87, 0x01, 0x79, 0x01, 0x3b, 0x01, 0x3a, 0x01, 0x78, 0xd1, 0x00, 0x00, 0x00, 0x04, 0x00, 0x87, 0x00, 0x00, 0x08, 0x5e, 0x04, 0x60, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x01, 0x03, 0x21, 0x03, 0x33, 0x01, 0x23, 0x27, 0x21, 0x07, 0x23, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x09, 0x01, 0x23, 0x0b, 0x01, 0x23, 0x01, 0x88, 0x02, 0x43, 0xfe, 0x45, 0x01, 0x8f, 0xfe, 0x71, 0x88, 0x03, 0x29, 0xa3, 0x01, 0x46, 0xe6, 0x87, 0x01, 0x52, 0x7c, 0x51, 0xfe, 0x70, 0x51, 0x7e, 0x03, 0x74, 0x81, 0xdc, 0xde, 0x81, 0xfe, 0xe3, 0x01, 0x30, 0x82, 0xf9, 0xfb, 0x82, 0x01, 0x3d, 0x04, 0x60, 0x80, 0xfe, 0xb6, 0x7f, 0xfd, 0xe9, 0x03, 0x08, 0xfe, 0x43, 0x02, 0x35, 0xfc, 0x80, 0xe6, 0xe6, 0x03, 0x80, 0xfe, 0xb3, 0x01, 0x4d, 0xfe, 0x52, 0xfe, 0x2e, 0x01, 0x7d, 0xfe, 0x83, 0x01, 0xde, 0x00, 0x03, 0x00, 0x20, 0xff, 0xf0, 0x04, 0xee, 0x04, 0x60, 0x00, 0x0f, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x00, 0x25, 0x35, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x11, 0x23, 0x11, 0x14, 0x16, 0x17, 0x16, 0x32, 0x03, 0x16, 0x33, 0x32, 0x37, 0x15, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x22, 0x06, 0x15, 0x23, 0x34, 0x36, 0x33, 0x21, 0x15, 0x23, 0x11, 0x14, 0x01, 0x33, 0x11, 0x23, 0x04, 0x94, 0x7c, 0x27, 0x17, 0x08, 0x0d, 0x79, 0x15, 0x12, 0x33, 0xcb, 0x50, 0x07, 0x61, 0x24, 0x41, 0x69, 0x76, 0xe4, 0x26, 0x13, 0x96, 0xfe, 0xd3, 0x37, 0x51, 0x2d, 0x5a, 0x67, 0x95, 0x03, 0xa7, 0xa4, 0xfd, 0x6a, 0x79, 0x79, 0x5a, 0x34, 0x40, 0x27, 0x21, 0x38, 0xa2, 0x02, 0x0c, 0xfd, 0xd6, 0xa6, 0x7a, 0x19, 0x45, 0x01, 0x42, 0xaf, 0x0a, 0xf1, 0x10, 0xca, 0x62, 0xfd, 0x01, 0xe3, 0xfc, 0x04, 0x03, 0xfc, 0x4c, 0x73, 0xa8, 0x7b, 0x64, 0xfe, 0x12, 0x59, 0xfe, 0xaf, 0x03, 0x98, 0x00, 0x02, 0x00, 0x00, 0xfe, 0x73, 0x04, 0xd1, 0x04, 0x7b, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x16, 0x13, 0x12, 0x11, 0x33, 0x10, 0x03, 0x02, 0x03, 0x10, 0x03, 0x02, 0x23, 0x22, 0x07, 0x23, 0x34, 0x37, 0x36, 0x33, 0x20, 0x13, 0x12, 0x13, 0x33, 0x02, 0x03, 0x02, 0x11, 0x01, 0xa8, 0x9c, 0x4d, 0x3e, 0x75, 0x3e, 0x61, 0x2f, 0x3f, 0x7e, 0xb1, 0x98, 0x16, 0x5a, 0x40, 0x49, 0xdc, 0x01, 0x89, 0x7b, 0x63, 0x90, 0x75, 0xb7, 0x3c, 0x3f, 0x04, 0x1d, 0xc1, 0xfe, 0x5c, 0xfe, 0xa7, 0xfe, 0x78, 0x01, 0x9f, 0x01, 0x42, 0x01, 0xfd, 0xfa, 0xbe, 0x02, 0x1b, 0x01, 0x2a, 0x02, 0x57, 0x9f, 0x62, 0x4f, 0x5a, 0xfd, 0x3d, 0x01, 0x9a, 0x01, 0x0e, 0xfe, 0x8f, 0xfe, 0xc9, 0xfe, 0xbe, 0xfd, 0xfd, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xac, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x25, 0x15, 0x21, 0x11, 0x21, 0x11, 0x01, 0x0e, 0xb6, 0x02, 0xe7, 0xfd, 0x73, 0xfe, 0x96, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0x64, 0xfa, 0x8f, 0x05, 0xd5, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x68, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x04, 0x58, 0xb5, 0xfc, 0x02, 0xb6, 0x03, 0xa2, 0xfe, 0x97, 0xfe, 0x21, 0xfe, 0x96, 0x04, 0xb2, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0xfa, 0xf3, 0x05, 0x0d, 0xfa, 0x8f, 0x05, 0x71, 0xfa, 0x8f, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x16, 0xfe, 0x77, 0x05, 0xb2, 0x05, 0xc1, 0x00, 0x05, 0x00, 0x11, 0x00, 0x00, 0x09, 0x02, 0x23, 0x09, 0x02, 0x15, 0x21, 0x09, 0x01, 0x21, 0x15, 0x21, 0x35, 0x09, 0x01, 0x35, 0x01, 0x7c, 0x02, 0xc1, 0xfd, 0x53, 0xea, 0x02, 0xad, 0xfd, 0x3f, 0x05, 0x08, 0xfc, 0x7d, 0x02, 0xad, 0xfd, 0x3f, 0x03, 0xae, 0xfa, 0x65, 0x02, 0xba, 0xfd, 0x62, 0xfe, 0xda, 0x03, 0x59, 0x03, 0x2a, 0xfc, 0xd6, 0xfc, 0xa7, 0x06, 0xe7, 0x64, 0xfc, 0xd6, 0xfc, 0xa7, 0x63, 0x63, 0x03, 0x53, 0x03, 0x15, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x92, 0xff, 0xe3, 0x05, 0x29, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x06, 0x01, 0x47, 0x01, 0x29, 0xfe, 0x23, 0x69, 0xfe, 0x90, 0x01, 0x3b, 0x01, 0x63, 0xfe, 0x9d, 0xfe, 0xc5, 0x84, 0xec, 0x64, 0x65, 0xe2, 0x7d, 0xf7, 0xf8, 0xf8, 0xf7, 0x60, 0x97, 0x04, 0xfe, 0xfe, 0x6f, 0xa6, 0x02, 0x81, 0x53, 0x55, 0xfe, 0x67, 0xfe, 0x93, 0xfe, 0x92, 0xfe, 0x67, 0x48, 0x46, 0xd7, 0x5f, 0x60, 0x01, 0x32, 0x01, 0x2f, 0x01, 0x2e, 0x01, 0x32, 0x25, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x03, 0x4c, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x03, 0x4b, 0xb5, 0xfd, 0x71, 0x03, 0x44, 0x05, 0x2b, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x03, 0x4b, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x03, 0x4a, 0xfc, 0xbc, 0x02, 0x8f, 0x05, 0xd5, 0xfa, 0x2b, 0xaa, 0x05, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x00, 0x21, 0x23, 0x09, 0x01, 0x23, 0x01, 0x11, 0x33, 0x11, 0x04, 0x6a, 0xc4, 0xfe, 0x8c, 0xfe, 0x8e, 0xc4, 0x01, 0xdc, 0xb6, 0x02, 0x66, 0xfd, 0x9a, 0x03, 0x0e, 0x02, 0xc7, 0xfd, 0x39, 0x00, 0x04, 0x00, 0x4e, 0x00, 0x00, 0x05, 0xa9, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x17, 0x00, 0x22, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x02, 0x00, 0x29, 0x01, 0x01, 0x05, 0x03, 0x33, 0x32, 0x37, 0x13, 0x26, 0x23, 0x21, 0x03, 0x33, 0x13, 0x05, 0x03, 0x36, 0x37, 0x36, 0x13, 0x36, 0x35, 0x34, 0x27, 0x26, 0x03, 0x23, 0x01, 0x86, 0x98, 0x68, 0x15, 0x43, 0xfe, 0x52, 0xfe, 0x7b, 0xfe, 0x30, 0x01, 0x05, 0x01, 0x59, 0xe2, 0x59, 0xdd, 0x9b, 0xcc, 0x85, 0xdd, 0xfe, 0x97, 0xe2, 0xb6, 0xe2, 0x02, 0x6a, 0xb8, 0x18, 0x17, 0xbb, 0x3a, 0x12, 0x5c, 0x10, 0x05, 0xd5, 0xb5, 0x7c, 0xdf, 0x63, 0x76, 0xfe, 0x7e, 0xfe, 0x96, 0x05, 0xd5, 0x64, 0xfa, 0xf3, 0x41, 0x04, 0x8b, 0x41, 0xfa, 0xf3, 0x05, 0x0d, 0x78, 0xfb, 0xe3, 0x10, 0x13, 0x9d, 0x01, 0x50, 0x66, 0x55, 0xc2, 0x6d, 0x13, 0x00, 0x04, 0x00, 0x51, 0xff, 0xe3, 0x05, 0x1c, 0x06, 0x14, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x32, 0x00, 0x00, 0x13, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x13, 0x06, 0x07, 0x06, 0x01, 0x21, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x02, 0x35, 0x34, 0x37, 0x36, 0x00, 0x33, 0x32, 0x17, 0x16, 0x17, 0x13, 0x21, 0x07, 0x03, 0x33, 0x13, 0x01, 0x03, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0xd0, 0x1c, 0x26, 0x1d, 0x30, 0x9e, 0x3c, 0x32, 0x6b, 0x03, 0x1f, 0xfe, 0xd3, 0x1e, 0x46, 0x58, 0x58, 0x70, 0xb7, 0x8e, 0x1f, 0x1f, 0x01, 0x1e, 0xb7, 0x70, 0x47, 0x47, 0x23, 0x6a, 0x01, 0x2d, 0xe5, 0xee, 0x78, 0xef, 0xfd, 0x7a, 0xab, 0x16, 0x17, 0x95, 0x6b, 0x6c, 0x1c, 0x1c, 0x33, 0x31, 0x95, 0x17, 0x02, 0x74, 0x9e, 0x4b, 0x73, 0x4f, 0x3d, 0x20, 0x03, 0x86, 0x20, 0x3d, 0x82, 0xfc, 0xed, 0xa8, 0x64, 0x30, 0x31, 0x01, 0x0c, 0x94, 0x50, 0xb2, 0xb2, 0x01, 0x44, 0x31, 0x30, 0x64, 0x02, 0x5e, 0x64, 0xfa, 0xac, 0x05, 0x54, 0xfe, 0x64, 0xfc, 0x36, 0x03, 0x82, 0x82, 0x9f, 0x9e, 0x4a, 0x74, 0x68, 0x69, 0x00, 0x00, 0x03, 0x00, 0x51, 0xff, 0xe3, 0x04, 0x1e, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x32, 0x00, 0x00, 0x13, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x13, 0x06, 0x07, 0x06, 0x13, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x21, 0x37, 0x21, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0xc4, 0x0b, 0x47, 0x13, 0x1b, 0x91, 0x22, 0x1f, 0x90, 0x97, 0x40, 0x55, 0x6d, 0x72, 0x51, 0x53, 0x15, 0x60, 0x61, 0x62, 0x60, 0xf2, 0x70, 0x51, 0x0d, 0x30, 0xa3, 0xa1, 0xe3, 0xcd, 0x5c, 0x3f, 0x0e, 0x11, 0xfd, 0xce, 0x12, 0x01, 0xcd, 0x0a, 0x34, 0x46, 0x98, 0x43, 0x3c, 0x02, 0x30, 0x3c, 0x37, 0x8d, 0x68, 0x1d, 0x16, 0x03, 0x3a, 0x15, 0x1c, 0x82, 0xfd, 0x4a, 0x15, 0x1f, 0x16, 0x28, 0x75, 0x2a, 0x16, 0x16, 0x9c, 0x6f, 0xa6, 0x44, 0x4d, 0x01, 0x13, 0xa2, 0xa1, 0x91, 0x63, 0x93, 0x46, 0x50, 0x5a, 0x64, 0x38, 0x32, 0x76, 0x52, 0x73, 0x11, 0x00, 0x00, 0x03, 0x00, 0x47, 0x00, 0x00, 0x02, 0x41, 0x06, 0x14, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x07, 0x23, 0x03, 0x33, 0x13, 0x23, 0x13, 0x21, 0x13, 0x21, 0x01, 0x9b, 0xa6, 0x29, 0xa6, 0xbf, 0x79, 0xa0, 0x79, 0x21, 0xfe, 0xd3, 0xc4, 0x01, 0x2d, 0x06, 0x14, 0xe9, 0xfb, 0x39, 0x03, 0x98, 0xfc, 0x04, 0x04, 0x60, 0x00, 0x03, 0xff, 0x2d, 0xfe, 0x56, 0x02, 0x41, 0x06, 0x14, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x33, 0x07, 0x23, 0x03, 0x13, 0x23, 0x03, 0x06, 0x07, 0x36, 0x37, 0x36, 0x05, 0x23, 0x37, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x21, 0x03, 0x06, 0x07, 0x06, 0x01, 0x9b, 0xa6, 0x29, 0xa6, 0x5c, 0xb6, 0x79, 0xbb, 0x1f, 0x30, 0x41, 0x2d, 0x43, 0xfe, 0xf9, 0xc6, 0x12, 0x2d, 0x5e, 0x2b, 0x2b, 0x1a, 0xd1, 0x01, 0x2d, 0xc8, 0x25, 0x5a, 0x5b, 0x06, 0x14, 0xe9, 0xfa, 0xbf, 0x04, 0x12, 0xfb, 0xd0, 0xb5, 0x54, 0x0f, 0x30, 0x48, 0xf4, 0x64, 0x30, 0x31, 0x99, 0x04, 0xac, 0xfb, 0x8c, 0xd6, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x35, 0xff, 0xe3, 0x05, 0x26, 0x05, 0xf0, 0x00, 0x26, 0x00, 0x30, 0x00, 0x00, 0x09, 0x01, 0x0e, 0x01, 0x15, 0x23, 0x34, 0x12, 0x37, 0x03, 0x33, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x00, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x03, 0x5b, 0xfe, 0x36, 0x35, 0x40, 0xa8, 0x68, 0x54, 0xfb, 0xe3, 0x81, 0x5d, 0xcd, 0x76, 0xd9, 0x01, 0x14, 0x79, 0x79, 0x2c, 0x2d, 0xc8, 0xa6, 0x4b, 0x94, 0x4c, 0x4e, 0x8e, 0x3d, 0x5f, 0x76, 0x36, 0x2e, 0x51, 0x4d, 0xbf, 0x90, 0x55, 0x96, 0x42, 0x02, 0x40, 0x02, 0x08, 0x59, 0xcb, 0x72, 0x84, 0x01, 0x02, 0x7e, 0x01, 0x1f, 0x95, 0x59, 0x57, 0xfe, 0xed, 0xd7, 0x80, 0xe1, 0x63, 0x3f, 0x7d, 0x3c, 0xa2, 0xc5, 0x24, 0x24, 0xb6, 0x2f, 0x31, 0x6f, 0x58, 0x33, 0x67, 0xce, 0x51, 0xa1, 0x58, 0x92, 0xc2, 0x3f, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0x03, 0x2e, 0x04, 0x60, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x03, 0x2e, 0xfd, 0x1b, 0x02, 0x3f, 0xfe, 0x3a, 0x01, 0xc6, 0x04, 0x60, 0xfb, 0xa0, 0x93, 0x01, 0x6f, 0x93, 0x01, 0xcb, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0xa4, 0x05, 0xf0, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa5, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0xb6, 0x05, 0xf0, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa7, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x09, 0x9d, 0x05, 0xf0, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x00, 0x7b, 0x04, 0x17, 0xfd, 0x64, 0x10, 0x07, 0x07, 0xa0, 0x06, 0xfa, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0x9c, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x00, 0x75, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x54, 0xff, 0xe3, 0x06, 0x9c, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x74, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x00, 0x75, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0xa2, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa3, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x54, 0xff, 0xe3, 0x06, 0xa2, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x74, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa3, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x58, 0xff, 0xe3, 0x06, 0xa2, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x75, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa3, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x38, 0xff, 0xe3, 0x06, 0xa2, 0x05, 0xf0, 0x10, 0x26, 0x07, 0xa2, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa3, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0xbf, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa4, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xe3, 0x06, 0xbf, 0x05, 0xf0, 0x10, 0x26, 0x07, 0xa3, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa4, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x06, 0xb8, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa6, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x58, 0xff, 0xe3, 0x06, 0xb8, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x75, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa6, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x5b, 0xff, 0xe3, 0x06, 0xb8, 0x05, 0xf0, 0x10, 0x26, 0x07, 0xa3, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa6, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x61, 0xff, 0xe3, 0x06, 0xb8, 0x05, 0xf0, 0x10, 0x26, 0x07, 0xa5, 0x00, 0x00, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa6, 0x04, 0x17, 0xfd, 0x64, 0xff, 0xff, 0x00, 0x7b, 0xff, 0xe3, 0x05, 0x69, 0x05, 0xf0, 0x10, 0x26, 0x00, 0x7b, 0x00, 0x00, 0x10, 0x07, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6b, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x02, 0xd7, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x01, 0x6c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x42, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x27, 0x00, 0x2c, 0x01, 0x6c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x02, 0xd7, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x06, 0x96, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x39, 0x01, 0xb8, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x39, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x05, 0xf0, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x39, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x04, 0x84, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x07, 0x5b, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x39, 0x00, 0x00, 0x10, 0x27, 0x00, 0x2c, 0x04, 0x84, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x05, 0xf0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x08, 0xc7, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x39, 0x00, 0x00, 0x10, 0x27, 0x00, 0x2c, 0x04, 0x84, 0x00, 0x00, 0x10, 0x27, 0x00, 0x2c, 0x05, 0xf0, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x07, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x06, 0x62, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3b, 0x01, 0xac, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x06, 0x03, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x04, 0x98, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x07, 0x6f, 0x05, 0xd5, 0x10, 0x26, 0x00, 0x3b, 0x00, 0x00, 0x10, 0x27, 0x00, 0x2c, 0x04, 0x98, 0x00, 0x00, 0x10, 0x07, 0x00, 0x2c, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x1f, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x10, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x02, 0x9f, 0x06, 0x14, 0x10, 0x26, 0x00, 0x4c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x01, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x03, 0xea, 0x06, 0x14, 0x10, 0x26, 0x00, 0x4c, 0x00, 0x00, 0x10, 0x27, 0x00, 0x4c, 0x01, 0x4b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x02, 0x96, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x05, 0xa1, 0x06, 0x14, 0x10, 0x26, 0x00, 0x4c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x59, 0x01, 0x95, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x06, 0x00, 0x59, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x05, 0x2b, 0x06, 0x14, 0x10, 0x26, 0x00, 0x59, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x03, 0xd7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x06, 0x76, 0x06, 0x14, 0x10, 0x26, 0x00, 0x59, 0x00, 0x00, 0x10, 0x27, 0x00, 0x4c, 0x03, 0xd7, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x05, 0x22, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x07, 0xc1, 0x06, 0x14, 0x10, 0x26, 0x00, 0x59, 0x00, 0x00, 0x10, 0x27, 0x00, 0x4c, 0x03, 0xd7, 0x00, 0x00, 0x10, 0x27, 0x00, 0x4c, 0x05, 0x22, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x06, 0x6d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x05, 0xa9, 0x06, 0x14, 0x10, 0x26, 0x00, 0x4c, 0x00, 0x00, 0x10, 0x07, 0x00, 0x5b, 0x01, 0xa2, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x05, 0x3f, 0x06, 0x14, 0x10, 0x26, 0x00, 0x5b, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x03, 0xec, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x06, 0x8a, 0x06, 0x14, 0x10, 0x26, 0x00, 0x5b, 0x00, 0x00, 0x10, 0x27, 0x00, 0x4c, 0x03, 0xec, 0x00, 0x00, 0x10, 0x07, 0x00, 0x4c, 0x05, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x10, 0x06, 0x00, 0x4f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xeb, 0x06, 0x14, 0x10, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x67, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x50, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6c, 0x00, 0x00, 0x08, 0x8b, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x01, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x23, 0x03, 0x11, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x05, 0x96, 0x01, 0x87, 0x01, 0x6d, 0xfe, 0x91, 0xfe, 0x7b, 0xfd, 0xcb, 0xfe, 0x7b, 0xfe, 0x91, 0x01, 0x6d, 0x01, 0x87, 0x01, 0x75, 0xdc, 0x01, 0x16, 0x01, 0x02, 0xfe, 0xfe, 0xfe, 0xea, 0xdc, 0xb5, 0xdc, 0xfe, 0xea, 0xfe, 0xfe, 0x01, 0x02, 0x01, 0x16, 0x05, 0xd5, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x01, 0x6a, 0x01, 0x82, 0x01, 0x80, 0x01, 0x69, 0xfa, 0xd1, 0x01, 0x18, 0x01, 0x2e, 0x01, 0x2c, 0x01, 0x17, 0xfb, 0x77, 0x04, 0x89, 0xfe, 0xe9, 0xfe, 0xd4, 0xfe, 0xd2, 0xfe, 0xe8, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x1f, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x00, 0x01, 0x15, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x23, 0x15, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x03, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x01, 0x6b, 0xdb, 0x01, 0x16, 0x01, 0x03, 0xfe, 0xfd, 0xfe, 0xea, 0xdb, 0x41, 0xe6, 0xd8, 0xd9, 0xe5, 0x41, 0x46, 0x8f, 0x84, 0x84, 0x8f, 0xfc, 0x01, 0x75, 0x01, 0x87, 0x01, 0x6d, 0xfe, 0x91, 0xfe, 0x7b, 0xfe, 0x8b, 0x01, 0x59, 0xb3, 0x01, 0x18, 0x01, 0x2e, 0x01, 0x2c, 0x01, 0x17, 0xb2, 0xc2, 0xcf, 0xd0, 0xc3, 0x02, 0x9e, 0xfd, 0xe8, 0x81, 0x8c, 0x8a, 0x81, 0x01, 0xde, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x00, 0x05, 0x00, 0x6c, 0x00, 0x00, 0x08, 0x8b, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x28, 0x00, 0x31, 0x00, 0x43, 0x00, 0x00, 0x01, 0x15, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x15, 0x33, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x03, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x13, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x20, 0x00, 0x11, 0x10, 0x00, 0x01, 0x11, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x13, 0x35, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x33, 0x35, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x04, 0xd6, 0x41, 0xe7, 0xd8, 0xd9, 0xe6, 0x41, 0xdc, 0x01, 0x16, 0x01, 0x02, 0xfe, 0xfe, 0xfe, 0xea, 0xdc, 0x47, 0x8f, 0x84, 0x84, 0x8f, 0x47, 0xc0, 0xfd, 0xcb, 0xfe, 0x7b, 0xfe, 0x91, 0x01, 0x6d, 0x01, 0x87, 0x02, 0x35, 0x01, 0x87, 0x01, 0x6d, 0xfe, 0x91, 0xfd, 0x06, 0x47, 0x8f, 0x84, 0x84, 0x8f, 0x47, 0xdc, 0xfe, 0xea, 0xfe, 0xfe, 0x01, 0x02, 0x01, 0x16, 0xdc, 0x41, 0xe6, 0xd9, 0xd8, 0xe7, 0x05, 0x2f, 0xb2, 0xc2, 0xcf, 0xd0, 0xc3, 0xb3, 0x01, 0x18, 0x01, 0x2e, 0x01, 0x2c, 0x01, 0x17, 0xfc, 0xb0, 0x81, 0x8c, 0x8a, 0x81, 0xfc, 0x09, 0x01, 0x6a, 0x01, 0x82, 0x01, 0x80, 0x01, 0x69, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x01, 0xdf, 0x02, 0x18, 0x81, 0x8a, 0x8c, 0x81, 0x02, 0x9e, 0xb2, 0xfe, 0xe9, 0xfe, 0xd4, 0xfe, 0xd2, 0xfe, 0xe8, 0xb3, 0xc3, 0xd0, 0xcf, 0xc2, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x10, 0x06, 0x01, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0x72, 0xff, 0xe3, 0x03, 0x90, 0x04, 0x7b, 0x10, 0x06, 0x02, 0x16, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0xfe, 0x56, 0x04, 0xa4, 0x05, 0xf0, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x37, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x04, 0xa3, 0x5c, 0xd0, 0x75, 0xe6, 0xf5, 0xf5, 0xe6, 0x75, 0xd0, 0x5c, 0xb5, 0x0a, 0x0b, 0x6b, 0x76, 0xfe, 0xce, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x32, 0x78, 0xd6, 0x05, 0x62, 0xd5, 0x5f, 0x5e, 0xfe, 0xc7, 0xfe, 0xd8, 0xfe, 0xd9, 0xfe, 0xc7, 0x5e, 0x5f, 0xfd, 0x10, 0x01, 0xb9, 0x04, 0x04, 0x24, 0x01, 0x9f, 0x01, 0x67, 0x01, 0x68, 0x01, 0x9f, 0x47, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4e, 0xff, 0xe3, 0x06, 0x9c, 0x05, 0xf0, 0x10, 0x27, 0x07, 0x79, 0x02, 0xe3, 0x00, 0x00, 0x10, 0x27, 0x00, 0x75, 0x04, 0x17, 0xfd, 0x64, 0x10, 0x06, 0x07, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x09, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x04, 0x49, 0xfb, 0xb7, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x79, 0x00, 0x00, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x09, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x07, 0x27, 0x02, 0xdc, 0x51, 0x01, 0x61, 0x6c, 0xd1, 0x99, 0xd3, 0x6c, 0x05, 0xdc, 0xfe, 0x76, 0x78, 0xea, 0xfb, 0x3c, 0x04, 0xc4, 0xea, 0x78, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x09, 0x00, 0x00, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfb, 0xb7, 0x04, 0x49, 0xd1, 0x6c, 0x02, 0xaf, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0x00, 0x00, 0x00, 0x01, 0x01, 0x79, 0xff, 0xf9, 0x04, 0x8e, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x05, 0x23, 0x01, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x03, 0x2d, 0x51, 0xfe, 0x9d, 0x6c, 0xd3, 0x99, 0xd1, 0x6c, 0x07, 0x01, 0x8a, 0x78, 0xea, 0x04, 0xc4, 0xfb, 0x3c, 0xea, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x03, 0x5c, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfc, 0xa4, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xe9, 0x78, 0x00, 0x00, 0x01, 0x01, 0x79, 0xff, 0xef, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x11, 0x07, 0x27, 0x02, 0xdc, 0x51, 0x01, 0x61, 0x6c, 0xd1, 0xd1, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9d, 0x6c, 0xd3, 0xd3, 0x6c, 0x05, 0xdc, 0xfe, 0x76, 0x78, 0xea, 0xfc, 0x43, 0xea, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0xea, 0x03, 0xbd, 0xea, 0x78, 0x00, 0x01, 0x01, 0x03, 0x00, 0x34, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x09, 0x00, 0x00, 0x01, 0x37, 0x21, 0x15, 0x21, 0x01, 0x07, 0x01, 0x11, 0x23, 0x01, 0x03, 0x39, 0x01, 0xf4, 0xfe, 0xd7, 0x03, 0x08, 0x6c, 0xfc, 0xf8, 0x98, 0x04, 0x74, 0x3f, 0xa9, 0xfc, 0xa2, 0x78, 0x03, 0x5e, 0xfe, 0xb6, 0x00, 0x01, 0x01, 0x03, 0x00, 0x34, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x09, 0x00, 0x00, 0x01, 0x17, 0x11, 0x23, 0x11, 0x01, 0x27, 0x01, 0x21, 0x35, 0x04, 0xd6, 0x39, 0x98, 0xfc, 0xf8, 0x6c, 0x03, 0x08, 0xfe, 0xd7, 0x04, 0xb3, 0x3f, 0xfd, 0xd4, 0x01, 0x4a, 0xfc, 0xa2, 0x78, 0x03, 0x5e, 0xa9, 0x00, 0x01, 0x01, 0x03, 0x00, 0x34, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x09, 0x00, 0x00, 0x25, 0x07, 0x21, 0x35, 0x21, 0x01, 0x37, 0x01, 0x11, 0x33, 0x05, 0x0f, 0x39, 0xfe, 0x0c, 0x01, 0x29, 0xfc, 0xf8, 0x6c, 0x03, 0x08, 0x98, 0x73, 0x3f, 0xa9, 0x03, 0x5e, 0x78, 0xfc, 0xa2, 0x01, 0x4a, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x34, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x09, 0x00, 0x00, 0x25, 0x27, 0x11, 0x33, 0x11, 0x01, 0x17, 0x01, 0x21, 0x15, 0x01, 0x3c, 0x39, 0x98, 0x03, 0x08, 0x6c, 0xfc, 0xf8, 0x01, 0x29, 0x34, 0x3f, 0x02, 0x2c, 0xfe, 0xb6, 0x03, 0x5e, 0x78, 0xfc, 0xa2, 0xa9, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x11, 0x00, 0x00, 0x01, 0x03, 0x27, 0x13, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x13, 0x17, 0x03, 0x21, 0x15, 0x03, 0xd5, 0xb4, 0x85, 0x88, 0xfe, 0x32, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x02, 0x27, 0xb4, 0x85, 0x88, 0x01, 0x71, 0x02, 0x2d, 0xfe, 0xa5, 0x55, 0x01, 0x06, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x5b, 0x55, 0xfe, 0xfa, 0xaa, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x11, 0x00, 0x00, 0x01, 0x13, 0x17, 0x03, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x03, 0x27, 0x13, 0x21, 0x35, 0x02, 0x33, 0xb4, 0x86, 0x88, 0x01, 0xcd, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfd, 0xda, 0xb4, 0x86, 0x88, 0xfe, 0x8f, 0x02, 0xd7, 0x01, 0x5b, 0x55, 0xfe, 0xfa, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0xa5, 0x55, 0x01, 0x06, 0xaa, 0x00, 0x01, 0x00, 0x27, 0x00, 0xd3, 0x05, 0xf5, 0x03, 0x50, 0x00, 0x34, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x11, 0x23, 0x11, 0x37, 0x21, 0x15, 0x05, 0x01, 0xbc, 0x1f, 0x2b, 0x24, 0x33, 0x2f, 0x28, 0x2b, 0x3f, 0x13, 0x1f, 0x36, 0x35, 0x46, 0x43, 0x4f, 0x52, 0x40, 0x49, 0x32, 0x36, 0x1f, 0x8e, 0x13, 0x1f, 0x1e, 0x2d, 0x25, 0x32, 0x30, 0x27, 0x2b, 0x20, 0x20, 0x13, 0x1b, 0x39, 0x2d, 0x4e, 0x40, 0x52, 0x4f, 0x43, 0x46, 0x35, 0x90, 0x98, 0x38, 0x01, 0xf5, 0xfe, 0xd7, 0x01, 0xf4, 0x21, 0x15, 0x13, 0x13, 0x15, 0x46, 0x30, 0x4f, 0x3c, 0x3a, 0x22, 0x20, 0x20, 0x25, 0x37, 0x3c, 0x4f, 0x41, 0x30, 0x23, 0x21, 0x17, 0x13, 0x13, 0x14, 0x24, 0x23, 0x30, 0x49, 0x42, 0x35, 0x27, 0x20, 0x20, 0x22, 0x3a, 0xa0, 0xfe, 0xb6, 0x02, 0x2c, 0x3f, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x13, 0x00, 0xd3, 0x05, 0xe1, 0x03, 0x50, 0x00, 0x34, 0x00, 0x00, 0x01, 0x37, 0x25, 0x35, 0x21, 0x17, 0x11, 0x23, 0x11, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x04, 0x4d, 0x90, 0xfe, 0xd7, 0x01, 0xf4, 0x39, 0x98, 0x90, 0x35, 0x47, 0x42, 0x4f, 0x52, 0x40, 0x4e, 0x2e, 0x38, 0x1c, 0x13, 0x1f, 0x21, 0x2a, 0x28, 0x2f, 0x33, 0x25, 0x2d, 0x1d, 0x20, 0x13, 0x8d, 0x1e, 0x36, 0x32, 0x4a, 0x40, 0x52, 0x4f, 0x42, 0x47, 0x35, 0x36, 0x1e, 0x13, 0x3f, 0x2b, 0x28, 0x30, 0x32, 0x25, 0x2a, 0x01, 0xf4, 0xa0, 0x01, 0xa9, 0x3f, 0xfd, 0xd4, 0x01, 0x4a, 0xa0, 0x3a, 0x22, 0x20, 0x20, 0x27, 0x35, 0x42, 0x49, 0x30, 0x23, 0x24, 0x14, 0x13, 0x13, 0x17, 0x21, 0x23, 0x30, 0x41, 0x4f, 0x3c, 0x37, 0x25, 0x20, 0x20, 0x22, 0x3a, 0x3c, 0x4f, 0x30, 0x46, 0x15, 0x13, 0x13, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x11, 0x00, 0x00, 0x13, 0x01, 0x17, 0x07, 0x33, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x01, 0x23, 0x17, 0x07, 0x01, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0xd8, 0x01, 0x3e, 0x6c, 0xd2, 0x02, 0x99, 0xfd, 0x67, 0xd2, 0x6c, 0xfe, 0xc2, 0xd8, 0xd2, 0x6c, 0xfe, 0x9e, 0x02, 0xaf, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x61, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0x01, 0x61, 0xe9, 0x78, 0x01, 0x89, 0x00, 0x00, 0x00, 0x01, 0x01, 0x7a, 0x00, 0x00, 0x04, 0x90, 0x05, 0xdc, 0x00, 0x11, 0x00, 0x00, 0x09, 0x01, 0x07, 0x27, 0x15, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x35, 0x07, 0x27, 0x01, 0x03, 0x2d, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0x3e, 0x6c, 0xd2, 0x99, 0xd1, 0x6c, 0x01, 0x3d, 0xd1, 0x6c, 0x01, 0x61, 0x05, 0xdc, 0xfe, 0x76, 0x78, 0xea, 0xf0, 0xfe, 0x9e, 0x78, 0xea, 0xfd, 0x1c, 0x02, 0xe4, 0xea, 0x78, 0x01, 0x62, 0xf0, 0xea, 0x78, 0x01, 0x8a, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x11, 0x00, 0x00, 0x09, 0x01, 0x27, 0x37, 0x23, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x33, 0x27, 0x37, 0x01, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xd8, 0xfe, 0xc3, 0x6c, 0xd1, 0xfd, 0x67, 0x02, 0x99, 0xd1, 0x6c, 0x01, 0x3d, 0xd8, 0xd1, 0x6c, 0x01, 0x61, 0x02, 0x55, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0x9f, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0xfe, 0x9f, 0xe9, 0x78, 0xfe, 0x77, 0x00, 0x00, 0x01, 0x01, 0x7a, 0xff, 0xf9, 0x04, 0x90, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x05, 0x01, 0x37, 0x17, 0x35, 0x01, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x15, 0x37, 0x17, 0x01, 0x02, 0xde, 0xfe, 0x9d, 0x6c, 0xd3, 0xfe, 0xc1, 0x6c, 0xd3, 0x98, 0xd1, 0x6c, 0xfe, 0xc3, 0xd1, 0x6c, 0xfe, 0x9f, 0x07, 0x01, 0x8a, 0x78, 0xea, 0xf0, 0x01, 0x62, 0x78, 0xea, 0x02, 0xe4, 0xfd, 0x1c, 0xea, 0x78, 0xfe, 0x9e, 0xf0, 0xea, 0x78, 0xfe, 0x76, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x01, 0x17, 0x09, 0x01, 0x07, 0x01, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x02, 0x9f, 0x01, 0x3e, 0x6c, 0xfe, 0xe2, 0x01, 0x1e, 0x6c, 0xfe, 0xc2, 0xfd, 0x61, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x61, 0x78, 0xfe, 0xc2, 0xfe, 0xc2, 0x78, 0x01, 0x61, 0xe9, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x09, 0x01, 0x27, 0x37, 0x21, 0x01, 0x27, 0x09, 0x01, 0x37, 0x01, 0x21, 0x27, 0x37, 0x01, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfd, 0x61, 0xfe, 0xc2, 0x6c, 0x01, 0x1f, 0xfe, 0xe1, 0x6c, 0x01, 0x3e, 0x02, 0x9f, 0xd1, 0x6c, 0x01, 0x61, 0x02, 0x55, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0x9f, 0x78, 0x01, 0x3e, 0x01, 0x3e, 0x78, 0xfe, 0x9f, 0xe9, 0x78, 0xfe, 0x77, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x11, 0x33, 0x11, 0x23, 0x05, 0x06, 0xfc, 0x50, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x03, 0xb0, 0x99, 0x99, 0x02, 0x2d, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x59, 0xfc, 0xa4, 0x00, 0x00, 0x01, 0x01, 0x7a, 0x00, 0x00, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x11, 0x07, 0x27, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x21, 0x15, 0x21, 0x35, 0x02, 0xb8, 0xd1, 0x6c, 0x01, 0x61, 0x51, 0x01, 0x61, 0x6c, 0xd1, 0x01, 0x37, 0xfc, 0xfa, 0xaa, 0x04, 0x1a, 0xea, 0x78, 0x01, 0x8a, 0xfe, 0x76, 0x78, 0xea, 0xfb, 0xe6, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x04, 0xb2, 0xfc, 0x50, 0x99, 0x99, 0x03, 0xb0, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x02, 0x2d, 0xfe, 0xa7, 0x03, 0x5c, 0xfe, 0xa7, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x00, 0x00, 0x01, 0x01, 0x7a, 0xff, 0xf9, 0x04, 0x8e, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x02, 0xb8, 0xfe, 0xca, 0x03, 0x06, 0xfe, 0xc9, 0xd1, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9f, 0x6c, 0xd1, 0x05, 0x2b, 0xaa, 0xaa, 0xfb, 0xe6, 0xea, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0xea, 0x00, 0x00, 0x01, 0x01, 0x7a, 0x00, 0x00, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x13, 0x00, 0x00, 0x01, 0x37, 0x17, 0x01, 0x21, 0x15, 0x21, 0x35, 0x21, 0x01, 0x37, 0x17, 0x11, 0x07, 0x27, 0x01, 0x33, 0x01, 0x07, 0x27, 0x03, 0x51, 0xd1, 0x6c, 0xfe, 0x9f, 0x01, 0x5b, 0xfc, 0xfa, 0x01, 0x5a, 0xfe, 0x9f, 0x6c, 0xd1, 0xd1, 0x6c, 0x01, 0x61, 0x51, 0x01, 0x61, 0x6c, 0xd1, 0x01, 0xc2, 0xea, 0x78, 0xfe, 0x76, 0xaa, 0xaa, 0x01, 0x8a, 0x78, 0xea, 0x03, 0x02, 0xea, 0x78, 0x01, 0x8a, 0xfe, 0x76, 0x78, 0xea, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0x9f, 0x04, 0x86, 0x00, 0x25, 0x00, 0x00, 0x01, 0x35, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x20, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x04, 0x91, 0x38, 0x2f, 0x2d, 0x2a, 0x27, 0x28, 0x26, 0x29, 0x23, 0x34, 0x2c, 0x1d, 0xfc, 0xa7, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0xaa, 0x01, 0xa9, 0x14, 0x16, 0x11, 0x10, 0x12, 0x11, 0x11, 0x11, 0x16, 0x14, 0x03, 0xdc, 0xaa, 0x16, 0x15, 0x2d, 0x29, 0x6f, 0x3d, 0x3c, 0x6a, 0x2e, 0x28, 0x1a, 0x16, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x0a, 0x0a, 0x12, 0x11, 0x31, 0x1a, 0x1b, 0x2e, 0x14, 0x12, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6a, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x86, 0x00, 0x29, 0x00, 0x00, 0x01, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x01, 0x77, 0x18, 0x14, 0x15, 0x12, 0x10, 0x09, 0x09, 0x09, 0x0b, 0x0e, 0x12, 0x15, 0x14, 0x18, 0x03, 0x3b, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfc, 0xc5, 0x3a, 0x2c, 0x35, 0x23, 0x28, 0x13, 0x14, 0x14, 0x15, 0x26, 0x2b, 0x2d, 0x2f, 0x37, 0x03, 0xdc, 0x0a, 0x0a, 0x12, 0x11, 0x1a, 0x17, 0x1b, 0x1a, 0x17, 0x1c, 0x0f, 0x12, 0x0a, 0x0a, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x16, 0x1a, 0x28, 0x2e, 0x34, 0x36, 0x3c, 0x3d, 0x36, 0x39, 0x29, 0x2d, 0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0x9f, 0x04, 0x86, 0x00, 0x18, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x07, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x15, 0x23, 0x35, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x04, 0x1c, 0x75, 0x18, 0x14, 0x16, 0x11, 0x10, 0x09, 0x09, 0x09, 0x09, 0x10, 0x11, 0x16, 0x14, 0x30, 0x14, 0x16, 0x11, 0x0e, 0x0b, 0x09, 0x98, 0x14, 0x14, 0x27, 0x2b, 0x2c, 0x2f, 0x38, 0x3b, 0x2c, 0x34, 0x23, 0x29, 0x12, 0x14, 0x14, 0x14, 0x27, 0x2a, 0x2d, 0x2f, 0x38, 0x75, 0x98, 0xfd, 0xd2, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x02, 0xd7, 0x0a, 0x0a, 0x12, 0x11, 0x1a, 0x17, 0x1a, 0x1b, 0x17, 0x1a, 0x11, 0x12, 0x0a, 0x0a, 0x0a, 0x0a, 0x12, 0x0f, 0x1c, 0x17, 0x1b, 0x82, 0x82, 0x3d, 0x36, 0x39, 0x29, 0x2d, 0x15, 0x16, 0x16, 0x1a, 0x28, 0x2e, 0x34, 0x36, 0x3d, 0x3c, 0x36, 0x39, 0x29, 0x2d, 0x15, 0x16, 0xdc, 0xdc, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6a, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x86, 0x00, 0x18, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x29, 0x01, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x15, 0x23, 0x35, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x01, 0xec, 0x09, 0x0b, 0x0e, 0x11, 0x16, 0x13, 0x31, 0x14, 0x15, 0x12, 0x10, 0x09, 0x09, 0x09, 0x09, 0x10, 0x12, 0x15, 0x14, 0x18, 0x01, 0x0d, 0x02, 0x2e, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfd, 0xd2, 0x98, 0x75, 0x37, 0x2f, 0x2d, 0x2b, 0x26, 0x15, 0x14, 0x14, 0x13, 0x28, 0x23, 0x35, 0x2c, 0x3a, 0x38, 0x2f, 0x2d, 0x2a, 0x27, 0x15, 0x13, 0x02, 0xd7, 0x82, 0x1b, 0x17, 0x1c, 0x0f, 0x12, 0x0a, 0x0a, 0x0a, 0x0a, 0x12, 0x11, 0x1a, 0x17, 0x1b, 0x1a, 0x17, 0x1a, 0x11, 0x12, 0x0a, 0x0a, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xdc, 0xdc, 0x16, 0x15, 0x2d, 0x29, 0x39, 0x36, 0x3c, 0x3d, 0x36, 0x34, 0x2e, 0x28, 0x1a, 0x16, 0x16, 0x15, 0x2d, 0x29, 0x39, 0x36, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x58, 0x00, 0x00, 0x01, 0x23, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x01, 0x5f, 0x09, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x09, 0x2b, 0x21, 0x1f, 0x20, 0x0a, 0x15, 0x18, 0x16, 0x09, 0x09, 0x05, 0x0e, 0x1d, 0x1e, 0x22, 0x23, 0x28, 0x2b, 0x21, 0x23, 0x1d, 0x1d, 0x0e, 0x04, 0x09, 0x09, 0x16, 0x18, 0x16, 0x09, 0x23, 0x1d, 0x23, 0x28, 0x09, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0x09, 0x0c, 0x0a, 0x0c, 0x09, 0x1c, 0x24, 0x23, 0x51, 0x22, 0x24, 0x1c, 0x1e, 0x0e, 0x04, 0x09, 0x09, 0x0b, 0x0a, 0x19, 0x0a, 0x0c, 0x09, 0x08, 0x05, 0x0d, 0x1f, 0x1c, 0x24, 0x22, 0x51, 0x23, 0x24, 0x1c, 0x09, 0x0b, 0x0a, 0x02, 0x2d, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x12, 0x12, 0x24, 0x0a, 0x0c, 0x0c, 0x0a, 0x0c, 0x0d, 0x2d, 0x23, 0x25, 0x11, 0x12, 0x12, 0x14, 0x22, 0x26, 0x2a, 0x0d, 0x0c, 0x0a, 0x0c, 0x0c, 0x0a, 0x27, 0x0f, 0x12, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x06, 0x06, 0x0a, 0x22, 0x14, 0x12, 0x12, 0x14, 0x22, 0x26, 0x2a, 0x0d, 0x0c, 0x0a, 0x06, 0x06, 0x06, 0x06, 0x0a, 0x09, 0x10, 0x2a, 0x26, 0x22, 0x14, 0x12, 0x12, 0x14, 0x22, 0x0a, 0x06, 0x06, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xbe, 0x05, 0xaf, 0x04, 0x46, 0x00, 0x17, 0x00, 0x00, 0x25, 0x27, 0x13, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x13, 0x17, 0x03, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x02, 0xc2, 0x90, 0x64, 0xfe, 0xc0, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0x78, 0x79, 0x90, 0x65, 0x01, 0x40, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0x88, 0xbe, 0x3a, 0x01, 0x35, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x6f, 0x3a, 0xfe, 0xcb, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x00, 0x01, 0x01, 0x0c, 0xff, 0xfc, 0x05, 0x0e, 0x05, 0xd8, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x01, 0x13, 0x17, 0x03, 0x01, 0x03, 0x37, 0x17, 0x01, 0x27, 0x01, 0x37, 0x13, 0x03, 0xa2, 0xfd, 0x6a, 0x8e, 0x96, 0x55, 0x02, 0x96, 0xae, 0xf2, 0x58, 0xfe, 0x67, 0x50, 0xfe, 0xe1, 0x7d, 0xab, 0x04, 0x08, 0xfe, 0x58, 0x03, 0x78, 0x1d, 0xfd, 0xee, 0x01, 0xa8, 0xfb, 0xb8, 0xbe, 0x8b, 0xfe, 0xc0, 0x10, 0x01, 0xc8, 0x62, 0xfe, 0xf1, 0x00, 0x00, 0x00, 0x01, 0x01, 0x37, 0x00, 0x00, 0x04, 0x89, 0x05, 0xf2, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x04, 0x88, 0x99, 0xfe, 0x44, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x04, 0x91, 0xfb, 0x6f, 0x03, 0xe7, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x00, 0x00, 0x00, 0x01, 0x01, 0x81, 0x00, 0x00, 0x04, 0xd2, 0x05, 0xf2, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x11, 0x23, 0x01, 0x81, 0x02, 0x55, 0xd2, 0x6c, 0x01, 0x62, 0xfe, 0x9e, 0x6c, 0xd2, 0xfe, 0x44, 0x99, 0x04, 0x91, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xfc, 0x19, 0x00, 0x00, 0x00, 0x01, 0x01, 0x37, 0xff, 0xe3, 0x04, 0x89, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x11, 0x33, 0x04, 0x88, 0xfd, 0xab, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0xbc, 0x99, 0x01, 0x44, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x03, 0xe7, 0x00, 0x00, 0x00, 0x01, 0x01, 0x81, 0xff, 0xe3, 0x04, 0xd2, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x01, 0x81, 0x99, 0x01, 0xbc, 0xd2, 0x6c, 0x01, 0x62, 0xfe, 0x9e, 0x6c, 0xd2, 0x01, 0x44, 0x04, 0x91, 0xfc, 0x19, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x00, 0x00, 0x00, 0x01, 0x01, 0xad, 0xff, 0xf9, 0x05, 0x79, 0x04, 0xd4, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x11, 0x21, 0x35, 0x04, 0x3b, 0xd1, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9e, 0x6c, 0xd2, 0xfe, 0x0b, 0x04, 0xd4, 0xfc, 0x3d, 0xe9, 0x78, 0xfe, 0x77, 0x01, 0x89, 0x78, 0xe9, 0x03, 0x19, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x04, 0xb9, 0x05, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x11, 0x33, 0x04, 0xb9, 0xfc, 0x9d, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x02, 0xca, 0x99, 0x02, 0x2d, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x02, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x28, 0x01, 0xa0, 0x05, 0xc2, 0x05, 0x58, 0x00, 0x26, 0x00, 0x00, 0x01, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x23, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x02, 0x00, 0xd1, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9d, 0x6c, 0xd3, 0x29, 0x29, 0x53, 0x51, 0x63, 0x61, 0xe6, 0x62, 0x63, 0x51, 0x52, 0x29, 0x29, 0x99, 0x3b, 0x3b, 0x36, 0x4e, 0x42, 0xac, 0x46, 0x4a, 0x39, 0x3a, 0x1f, 0x1e, 0x02, 0xb8, 0xea, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0xea, 0x32, 0x7f, 0x70, 0x6b, 0x5f, 0x56, 0x31, 0x2e, 0x2e, 0x31, 0x56, 0x5f, 0x6b, 0x70, 0x7f, 0x5d, 0xa2, 0x42, 0x3b, 0x27, 0x21, 0x21, 0x23, 0x3f, 0x40, 0x53, 0x51, 0x5d, 0x00, 0x01, 0x00, 0x47, 0x01, 0xa0, 0x05, 0xe0, 0x05, 0x58, 0x00, 0x26, 0x00, 0x00, 0x01, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x23, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x1d, 0x01, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x04, 0x08, 0x1d, 0x20, 0x39, 0x3a, 0x4a, 0x46, 0xab, 0x43, 0x4d, 0x36, 0x3b, 0x3c, 0x99, 0x29, 0x29, 0x53, 0x51, 0x63, 0x61, 0xe6, 0x62, 0x63, 0x51, 0x52, 0x29, 0x29, 0xd3, 0x6c, 0xfe, 0x9d, 0x51, 0xfe, 0xa0, 0x6c, 0x02, 0xb8, 0x32, 0x5d, 0x51, 0x53, 0x40, 0x3f, 0x23, 0x21, 0x21, 0x27, 0x3b, 0x42, 0xa2, 0x5d, 0x7f, 0x70, 0x6b, 0x5f, 0x56, 0x31, 0x2e, 0x2e, 0x31, 0x56, 0x5f, 0x6b, 0x70, 0x7f, 0x32, 0xea, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0x00, 0x00, 0x02, 0x00, 0xc7, 0x00, 0x34, 0x05, 0xac, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x05, 0x37, 0x21, 0x15, 0x21, 0x01, 0x07, 0x01, 0x11, 0x23, 0xc8, 0x04, 0xe4, 0xfb, 0x57, 0x39, 0x01, 0xf4, 0xfe, 0xd7, 0x03, 0x08, 0x6c, 0xfc, 0xf8, 0x98, 0x05, 0x72, 0x63, 0x63, 0xfe, 0x3f, 0xa9, 0xfc, 0xa2, 0x78, 0x03, 0x5e, 0xfe, 0xb6, 0x00, 0x02, 0x00, 0x64, 0xff, 0xa1, 0x05, 0xa4, 0x05, 0x63, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x35, 0x21, 0x27, 0x37, 0x01, 0x11, 0x33, 0x11, 0x23, 0x11, 0x01, 0x27, 0x37, 0x01, 0x21, 0x17, 0x07, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x17, 0x07, 0x21, 0x65, 0x03, 0xaa, 0xd3, 0x6c, 0x01, 0x63, 0x99, 0x99, 0xfe, 0x9d, 0x6c, 0xd3, 0x01, 0x95, 0xfc, 0x56, 0xd2, 0x6c, 0xfe, 0x9e, 0x99, 0x99, 0x01, 0x62, 0x6c, 0xd2, 0x03, 0xaa, 0x01, 0x01, 0xaa, 0xe8, 0x78, 0xfe, 0x78, 0x01, 0x4e, 0xfd, 0x08, 0x01, 0x50, 0xfe, 0x78, 0x78, 0xe8, 0x02, 0x58, 0xe8, 0x78, 0x01, 0x88, 0xfe, 0xb0, 0x02, 0xf8, 0xfe, 0xb2, 0x01, 0x88, 0x78, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x00, 0xbd, 0x00, 0x7f, 0x05, 0x7d, 0x05, 0x70, 0x00, 0x36, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x11, 0x23, 0x11, 0x37, 0x21, 0x15, 0x21, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0xcf, 0x3e, 0x1c, 0x1e, 0x3b, 0x3c, 0x36, 0x4d, 0x43, 0xab, 0x46, 0x4a, 0x39, 0x3c, 0x3b, 0x1e, 0x1e, 0x3c, 0x1f, 0x99, 0x39, 0x01, 0xf5, 0xfe, 0xd7, 0x1f, 0x51, 0x2b, 0x29, 0x29, 0x2b, 0x51, 0x4b, 0x69, 0x5c, 0x78, 0x73, 0x61, 0x65, 0x4f, 0x51, 0x2b, 0x29, 0x29, 0x29, 0x53, 0x04, 0x2b, 0x42, 0x51, 0x51, 0x5d, 0x5a, 0xa2, 0x42, 0x3b, 0x27, 0x21, 0x21, 0x23, 0x3f, 0x42, 0xa2, 0x5a, 0x5d, 0x51, 0x51, 0x42, 0x23, 0xfe, 0xb6, 0x02, 0x2c, 0x40, 0xaa, 0x23, 0x5a, 0x70, 0x70, 0x7f, 0x7c, 0x70, 0x71, 0x59, 0x53, 0x34, 0x2e, 0x2e, 0x30, 0x57, 0x59, 0x71, 0x70, 0x7c, 0x7f, 0x70, 0x6b, 0x5f, 0x00, 0x01, 0x00, 0x8d, 0x00, 0x7f, 0x05, 0x4d, 0x05, 0x70, 0x00, 0x36, 0x00, 0x00, 0x01, 0x37, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x21, 0x35, 0x21, 0x17, 0x11, 0x23, 0x11, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x26, 0x04, 0x3c, 0x6c, 0x52, 0x29, 0x29, 0x29, 0x2b, 0x50, 0x50, 0x64, 0x62, 0x73, 0x77, 0x5d, 0x69, 0x4b, 0x50, 0x2b, 0x2a, 0x2a, 0x2a, 0x51, 0x1f, 0xfe, 0xd7, 0x01, 0xf5, 0x39, 0x99, 0x1f, 0x3c, 0x1e, 0x1e, 0x3b, 0x3c, 0x3a, 0x49, 0x47, 0xaa, 0x43, 0x4d, 0x36, 0x3c, 0x3b, 0x1d, 0x1d, 0x04, 0x2b, 0x78, 0x5f, 0x6b, 0x70, 0x7f, 0x7c, 0x70, 0x71, 0x59, 0x57, 0x30, 0x2e, 0x2e, 0x34, 0x53, 0x59, 0x71, 0x70, 0x7c, 0x7f, 0x70, 0x70, 0x5a, 0x23, 0xaa, 0x40, 0xfd, 0xd4, 0x01, 0x4a, 0x23, 0x42, 0x51, 0x51, 0x5d, 0x5a, 0xa2, 0x42, 0x3f, 0x23, 0x21, 0x21, 0x27, 0x3b, 0x42, 0xa2, 0x5a, 0x5d, 0x51, 0x51, 0x00, 0x01, 0x00, 0x5a, 0x02, 0x2d, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x06, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x04, 0x49, 0x02, 0x2d, 0x82, 0x01, 0x89, 0x78, 0xe9, 0xaa, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x02, 0xd7, 0x00, 0x06, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x17, 0x07, 0x01, 0x5a, 0x05, 0x45, 0xfb, 0xb7, 0xd2, 0x6c, 0xfe, 0x9e, 0x02, 0xd7, 0xaa, 0xe9, 0x78, 0x01, 0x89, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb7, 0x00, 0x00, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x06, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x23, 0x02, 0xb8, 0x75, 0x01, 0x61, 0x6c, 0xd1, 0x99, 0x05, 0xdc, 0xfe, 0x76, 0x78, 0xea, 0xfb, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x79, 0x00, 0x00, 0x03, 0x51, 0x05, 0xdc, 0x00, 0x06, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x03, 0x51, 0x99, 0xd3, 0x6c, 0x01, 0x63, 0x05, 0xdc, 0xfa, 0x24, 0x04, 0xc4, 0xea, 0x78, 0x01, 0x8a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x2d, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x05, 0xae, 0xfa, 0xbb, 0x04, 0x49, 0xd1, 0x6c, 0x01, 0x61, 0x02, 0x2d, 0xaa, 0xe9, 0x78, 0xfe, 0x77, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x02, 0xd7, 0x00, 0x06, 0x00, 0x00, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfb, 0xb7, 0x02, 0xd7, 0x82, 0xfe, 0x77, 0x78, 0xe9, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb7, 0x00, 0x00, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x06, 0x00, 0x00, 0x21, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x02, 0xb8, 0x99, 0xd1, 0x6c, 0xfe, 0x9f, 0x05, 0xdc, 0xfb, 0x3c, 0xea, 0x78, 0xfe, 0x76, 0x00, 0x01, 0x01, 0x79, 0x00, 0x00, 0x03, 0x51, 0x05, 0xdc, 0x00, 0x06, 0x00, 0x00, 0x21, 0x23, 0x01, 0x37, 0x17, 0x11, 0x33, 0x03, 0x51, 0x75, 0xfe, 0x9d, 0x6c, 0xd3, 0x99, 0x01, 0x8a, 0x78, 0xea, 0x04, 0xc4, 0x00, 0xff, 0xff, 0x00, 0x5a, 0xff, 0xa0, 0x05, 0xaf, 0x05, 0x64, 0x10, 0x27, 0x08, 0x6c, 0x00, 0x00, 0xfe, 0xd4, 0x10, 0x07, 0x08, 0x6e, 0x00, 0x00, 0x01, 0x2c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6b, 0xff, 0xf9, 0x05, 0x9c, 0x05, 0xdc, 0x10, 0x27, 0x08, 0x6f, 0x01, 0x0e, 0x00, 0x00, 0x10, 0x07, 0x08, 0x6d, 0xfe, 0xf2, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5a, 0xff, 0xa0, 0x05, 0xaf, 0x05, 0x64, 0x10, 0x27, 0x08, 0x6e, 0x00, 0x00, 0xfe, 0xd4, 0x10, 0x07, 0x08, 0x6c, 0x00, 0x00, 0x01, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0xff, 0xa0, 0x05, 0xa0, 0x05, 0x64, 0x00, 0x11, 0x00, 0x00, 0x01, 0x03, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x40, 0xe6, 0x01, 0x62, 0x6c, 0xd2, 0x04, 0x49, 0xfb, 0xb7, 0xc2, 0xc2, 0x04, 0x49, 0xfb, 0xb7, 0xd2, 0x6c, 0xfe, 0x9e, 0x02, 0x82, 0x00, 0xff, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0xaa, 0xd7, 0xd7, 0xaa, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x00, 0x00, 0x01, 0x00, 0x6c, 0x00, 0x00, 0x05, 0x9d, 0x05, 0xdc, 0x00, 0x11, 0x00, 0x00, 0x01, 0x13, 0x33, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x07, 0x27, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x33, 0x03, 0x04, 0xe5, 0x51, 0x01, 0x62, 0x6c, 0xd2, 0x99, 0xc1, 0xc2, 0x99, 0xd1, 0x6c, 0x01, 0x61, 0x51, 0x04, 0xdc, 0x01, 0x00, 0xfe, 0x76, 0x78, 0xea, 0xfb, 0x3c, 0x04, 0xc4, 0xd8, 0xd8, 0xfb, 0x3c, 0x04, 0xc4, 0xea, 0x78, 0x01, 0x8a, 0x00, 0x00, 0x01, 0x00, 0x6a, 0xff, 0xa0, 0x05, 0xb0, 0x05, 0x64, 0x00, 0x11, 0x00, 0x00, 0x01, 0x17, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x15, 0x04, 0xca, 0xe5, 0xfe, 0x9f, 0x6c, 0xd1, 0xfb, 0xb7, 0x04, 0x49, 0xc1, 0xc1, 0xfb, 0xb7, 0x04, 0x49, 0xd1, 0x6c, 0x01, 0x61, 0x02, 0x82, 0xff, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xaa, 0xd7, 0xd7, 0xaa, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6c, 0xff, 0xf9, 0x05, 0x9d, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x25, 0x03, 0x23, 0x01, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x23, 0x03, 0x04, 0xe6, 0x51, 0xfe, 0x9f, 0x6c, 0xd1, 0x99, 0xc2, 0xc1, 0x99, 0xd2, 0x6c, 0xfe, 0x9e, 0x51, 0xf9, 0xff, 0x00, 0x01, 0x8a, 0x78, 0xea, 0x04, 0xc4, 0xfb, 0x3c, 0xd8, 0xd8, 0x04, 0xc4, 0xfb, 0x3c, 0xea, 0x78, 0xfe, 0x76, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5a, 0x00, 0x0e, 0x05, 0xaf, 0x04, 0xf6, 0x10, 0x27, 0x08, 0x9d, 0x00, 0x00, 0xff, 0x42, 0x10, 0x07, 0x08, 0x98, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5a, 0x00, 0x0e, 0x05, 0xaf, 0x04, 0xf6, 0x10, 0x27, 0x08, 0x99, 0x00, 0x00, 0xff, 0x42, 0x10, 0x07, 0x08, 0x9c, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x21, 0x07, 0x17, 0x21, 0x25, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x03, 0x92, 0xfd, 0xd6, 0x5e, 0x5e, 0x01, 0xbd, 0x01, 0x08, 0x6d, 0x01, 0xdf, 0xfd, 0xe3, 0x69, 0x75, 0x42, 0xfe, 0xee, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x01, 0xfc, 0x69, 0x75, 0x42, 0x01, 0x33, 0x02, 0xeb, 0x69, 0x69, 0xd2, 0xd2, 0x78, 0xca, 0x4b, 0x7f, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0xca, 0x4b, 0x7f, 0x78, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x5a, 0x00, 0xc1, 0x05, 0xaf, 0x04, 0x43, 0x00, 0x17, 0x00, 0x1c, 0x00, 0x21, 0x00, 0x00, 0x25, 0x27, 0x37, 0x23, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x37, 0x17, 0x07, 0x33, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x13, 0x07, 0x21, 0x37, 0x27, 0x29, 0x01, 0x07, 0x17, 0x21, 0x02, 0xba, 0x7f, 0x37, 0x9e, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x01, 0x32, 0x49, 0x7f, 0x38, 0x9e, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x53, 0xfe, 0xce, 0x6c, 0x44, 0x01, 0x76, 0x5f, 0x5f, 0xfe, 0x3e, 0xfe, 0x8a, 0x5e, 0x5e, 0x01, 0x32, 0xc1, 0x34, 0xac, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0xe0, 0x34, 0xac, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x5d, 0x01, 0x4a, 0xd2, 0x69, 0x69, 0x69, 0x69, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x21, 0x37, 0x27, 0x21, 0x05, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x02, 0x77, 0x02, 0x29, 0x5f, 0x5f, 0xfe, 0x44, 0xfe, 0xf7, 0x6d, 0xfe, 0x21, 0x02, 0x1d, 0x6a, 0x74, 0x41, 0x01, 0x11, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x53, 0xfe, 0x05, 0x69, 0x76, 0x42, 0xfe, 0xcd, 0x02, 0x19, 0x69, 0x69, 0xd2, 0xd2, 0x78, 0xca, 0x4b, 0x7f, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x5d, 0xca, 0x4b, 0x7f, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x01, 0x68, 0x04, 0x37, 0xfc, 0x35, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x03, 0xcb, 0xfb, 0xc9, 0x5e, 0x02, 0x19, 0x78, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0x78, 0x69, 0x00, 0x00, 0x00, 0x01, 0x01, 0x7a, 0x00, 0x00, 0x04, 0x90, 0x05, 0xdc, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x27, 0x02, 0xa6, 0x6c, 0x53, 0x6c, 0x01, 0x61, 0x51, 0x01, 0x62, 0x6c, 0x54, 0x6c, 0x5e, 0x04, 0xb0, 0xfb, 0x50, 0x04, 0x38, 0x5e, 0x78, 0x01, 0x8a, 0xfe, 0x76, 0x78, 0x5e, 0xfb, 0xc8, 0x04, 0xb0, 0x68, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x37, 0x27, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x04, 0xa0, 0x5f, 0x5f, 0xfb, 0xc9, 0x03, 0xcb, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x53, 0xfc, 0x35, 0x02, 0x19, 0x69, 0x69, 0x78, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x5d, 0x78, 0x00, 0x00, 0x00, 0x01, 0x01, 0x7a, 0xff, 0xf9, 0x04, 0x90, 0x05, 0xd5, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x17, 0x37, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x11, 0x33, 0x02, 0xa6, 0x5f, 0x5e, 0x6c, 0x54, 0x6c, 0xfe, 0x9e, 0x51, 0xfe, 0x9f, 0x6c, 0x53, 0x6c, 0x01, 0x25, 0x68, 0x68, 0x04, 0xb0, 0xfb, 0xc8, 0x5e, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0x5e, 0x04, 0x38, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x01, 0x21, 0x37, 0x27, 0x21, 0x07, 0x05, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x01, 0x68, 0x03, 0x38, 0x5f, 0x5f, 0xfc, 0xc8, 0x5e, 0x03, 0x2a, 0xfd, 0xa0, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x02, 0x60, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x02, 0x19, 0x69, 0x69, 0x69, 0xe1, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x00, 0x00, 0x02, 0x01, 0x7a, 0xff, 0xf0, 0x04, 0x8f, 0x05, 0xdc, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x01, 0x11, 0x17, 0x37, 0x11, 0x27, 0x03, 0x11, 0x07, 0x27, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x02, 0xa6, 0x5e, 0x5f, 0x5f, 0xca, 0x54, 0x6c, 0x01, 0x62, 0x51, 0x01, 0x61, 0x6c, 0x53, 0x53, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9e, 0x6c, 0x04, 0xb0, 0xfc, 0x6c, 0x69, 0x69, 0x03, 0x94, 0x69, 0xfc, 0x7b, 0x02, 0xa4, 0x5d, 0x78, 0x01, 0x89, 0xfe, 0x77, 0x78, 0x5d, 0xfd, 0x5c, 0x5d, 0x78, 0xfe, 0x77, 0x01, 0x89, 0x78, 0x00, 0x00, 0x01, 0x01, 0x03, 0xff, 0xd1, 0x05, 0x6a, 0x04, 0xb3, 0x00, 0x0e, 0x00, 0x00, 0x09, 0x01, 0x07, 0x01, 0x15, 0x23, 0x11, 0x37, 0x21, 0x15, 0x23, 0x01, 0x07, 0x01, 0x23, 0x01, 0x9b, 0x02, 0xfb, 0x4c, 0xfd, 0x51, 0x98, 0x39, 0x01, 0xf4, 0x76, 0x02, 0xaf, 0x4c, 0xfd, 0x04, 0x86, 0x03, 0x76, 0xfc, 0xb0, 0x55, 0x02, 0xfb, 0x84, 0x02, 0x2c, 0x3f, 0xa9, 0xfd, 0x05, 0x55, 0x03, 0x50, 0x00, 0x01, 0x00, 0xa9, 0xff, 0xd1, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x35, 0x23, 0x01, 0x27, 0x01, 0x23, 0x35, 0x21, 0x17, 0x11, 0x23, 0x35, 0x01, 0x27, 0x04, 0x77, 0x86, 0xfd, 0x05, 0x4d, 0x02, 0xaf, 0x76, 0x01, 0xf4, 0x39, 0x98, 0xfd, 0x51, 0x4c, 0x03, 0x76, 0x94, 0xfc, 0xb0, 0x55, 0x02, 0xfb, 0xa9, 0x3f, 0xfd, 0xd4, 0x84, 0xfd, 0x05, 0x55, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa9, 0x00, 0x34, 0x05, 0x10, 0x05, 0x16, 0x00, 0x0e, 0x00, 0x00, 0x09, 0x01, 0x37, 0x01, 0x35, 0x33, 0x11, 0x07, 0x21, 0x35, 0x33, 0x01, 0x37, 0x01, 0x33, 0x04, 0x77, 0xfd, 0x05, 0x4c, 0x02, 0xaf, 0x98, 0x39, 0xfe, 0x0c, 0x76, 0xfd, 0x51, 0x4d, 0x02, 0xfb, 0x86, 0x01, 0x71, 0x03, 0x50, 0x55, 0xfd, 0x05, 0x84, 0xfd, 0xd4, 0x3f, 0xa9, 0x02, 0xfb, 0x55, 0xfc, 0xb0, 0x00, 0x01, 0x01, 0x03, 0x00, 0x34, 0x05, 0x6a, 0x05, 0x16, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x15, 0x33, 0x01, 0x17, 0x01, 0x33, 0x15, 0x21, 0x27, 0x11, 0x33, 0x15, 0x01, 0x17, 0x01, 0x9b, 0x86, 0x02, 0xfc, 0x4c, 0xfd, 0x51, 0x76, 0xfe, 0x0c, 0x39, 0x98, 0x02, 0xaf, 0x4c, 0x01, 0x71, 0x94, 0x03, 0x50, 0x55, 0xfd, 0x05, 0xa9, 0x3f, 0x02, 0x2c, 0x84, 0x02, 0xfb, 0x55, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x17, 0x21, 0x15, 0x21, 0x07, 0x01, 0x35, 0x01, 0x17, 0x21, 0x15, 0x21, 0x01, 0x40, 0x04, 0x5f, 0xfb, 0xa1, 0x7c, 0x03, 0xe3, 0xfc, 0x89, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x03, 0x77, 0xfc, 0x1d, 0x02, 0xbe, 0x78, 0x8a, 0x78, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x78, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x27, 0x21, 0x35, 0x21, 0x37, 0x01, 0x15, 0x01, 0x27, 0x21, 0x35, 0x21, 0x04, 0xc9, 0xfb, 0xa0, 0x04, 0x60, 0x7c, 0xfc, 0x1c, 0x03, 0x78, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xfc, 0x88, 0x03, 0xe4, 0x02, 0x46, 0x78, 0x8a, 0x78, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x78, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x18, 0x00, 0x00, 0x01, 0x23, 0x27, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x23, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x33, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x17, 0x05, 0x9f, 0x24, 0x3f, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x63, 0x59, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x7d, 0x3f, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x63, 0x02, 0x2d, 0x46, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x6e, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x46, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x6e, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x18, 0x00, 0x00, 0x13, 0x35, 0x37, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x33, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x23, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x07, 0x69, 0x63, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x3f, 0x7d, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0x59, 0x63, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x3f, 0x02, 0x2d, 0xaa, 0x6e, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x46, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x6e, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x46, 0x00, 0x00, 0x00, 0x01, 0x01, 0x79, 0x00, 0x00, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x19, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x07, 0x27, 0x02, 0xdc, 0x51, 0x01, 0x61, 0x6c, 0xd1, 0x01, 0x0a, 0xfe, 0xf6, 0x01, 0x0a, 0xfe, 0xf6, 0x99, 0xfe, 0xf7, 0x01, 0x09, 0xfe, 0xf7, 0x01, 0x09, 0xd3, 0x6c, 0x05, 0xdc, 0xfe, 0x76, 0x78, 0xea, 0xfe, 0x8e, 0xaa, 0xaa, 0xaa, 0xfe, 0xac, 0x01, 0x54, 0xaa, 0xaa, 0xaa, 0x01, 0x72, 0xea, 0x78, 0x00, 0x01, 0x01, 0x79, 0xff, 0xf9, 0x04, 0x8e, 0x05, 0xd5, 0x00, 0x19, 0x00, 0x00, 0x05, 0x23, 0x01, 0x37, 0x17, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x37, 0x17, 0x03, 0x2b, 0x51, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0xf6, 0x01, 0x0a, 0xfe, 0xf6, 0x01, 0x0a, 0x99, 0x01, 0x09, 0xfe, 0xf7, 0x01, 0x09, 0xfe, 0xf7, 0xd3, 0x6c, 0x07, 0x01, 0x8a, 0x78, 0xea, 0x01, 0x72, 0xaa, 0xaa, 0xaa, 0x01, 0x54, 0xfe, 0xac, 0xaa, 0xaa, 0xaa, 0xfe, 0x8e, 0xea, 0x78, 0x00, 0x00, 0x03, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x01, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0x4c, 0xfe, 0xb4, 0xd2, 0x6c, 0x01, 0x7f, 0xe6, 0x99, 0xe5, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0x01, 0x61, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x03, 0x01, 0x79, 0x00, 0x00, 0x04, 0x90, 0x05, 0xdc, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x33, 0x15, 0x23, 0x15, 0x33, 0x11, 0x23, 0x02, 0xdc, 0x51, 0x01, 0x62, 0x6c, 0xd2, 0x99, 0xd3, 0x6c, 0x01, 0x3f, 0x99, 0x99, 0x99, 0x99, 0x05, 0xdc, 0xfe, 0x76, 0x78, 0xea, 0xfe, 0x8e, 0x01, 0x72, 0xea, 0x78, 0xfe, 0x56, 0xfe, 0xaa, 0xff, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x09, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x25, 0x33, 0x15, 0x23, 0x27, 0x15, 0x23, 0x35, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0xb4, 0x01, 0x4c, 0xd1, 0x6c, 0x01, 0x61, 0xfc, 0x3a, 0xe5, 0xe5, 0x99, 0xe6, 0x02, 0x55, 0xfe, 0x77, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0xfe, 0x77, 0x28, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x03, 0x01, 0x79, 0xff, 0xf9, 0x04, 0x90, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x05, 0x01, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x03, 0x35, 0x33, 0x15, 0x03, 0x11, 0x33, 0x11, 0x02, 0xdc, 0xfe, 0x9d, 0x6c, 0xd3, 0x99, 0xd2, 0x6c, 0xfe, 0x9e, 0x75, 0x99, 0x99, 0x99, 0x07, 0x01, 0x8a, 0x78, 0xea, 0x01, 0x72, 0xfe, 0x8e, 0xea, 0x78, 0xfe, 0x76, 0x03, 0x34, 0xfe, 0xfe, 0x01, 0xa8, 0x01, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 0x00, 0xcb, 0x05, 0xa0, 0x04, 0x39, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x15, 0x21, 0x17, 0x07, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x17, 0x07, 0x05, 0x9f, 0xfc, 0x56, 0xd3, 0x6c, 0xfe, 0x9d, 0x99, 0x99, 0x01, 0x63, 0x6c, 0xd3, 0x02, 0xd7, 0xaa, 0xea, 0x78, 0x01, 0x8a, 0xfe, 0x7e, 0x03, 0x5c, 0xfe, 0x80, 0x01, 0x8a, 0x78, 0xea, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcb, 0x05, 0xa9, 0x04, 0x39, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x21, 0x27, 0x37, 0x01, 0x11, 0x33, 0x11, 0x23, 0x11, 0x01, 0x27, 0x37, 0x21, 0x69, 0x03, 0xaa, 0xd3, 0x6c, 0x01, 0x63, 0x99, 0x99, 0xfe, 0x9d, 0x6c, 0xd3, 0xfc, 0x56, 0x02, 0xd7, 0xea, 0x78, 0xfe, 0x76, 0x01, 0x80, 0xfc, 0xa4, 0x01, 0x82, 0xfe, 0x76, 0x78, 0xea, 0x00, 0x00, 0x02, 0x00, 0x31, 0x00, 0x86, 0x05, 0xa0, 0x04, 0x7e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x03, 0x13, 0x35, 0x21, 0x11, 0x21, 0x13, 0x09, 0x01, 0x11, 0x21, 0x11, 0x21, 0x01, 0xa1, 0xf0, 0xf0, 0x03, 0xa4, 0xfc, 0x5c, 0x5a, 0xfe, 0x37, 0x01, 0xc9, 0x03, 0xa4, 0xfc, 0x5c, 0x03, 0x8c, 0xfe, 0xf6, 0xfe, 0xf6, 0x83, 0x01, 0x0e, 0xfd, 0x7d, 0x01, 0xfc, 0x01, 0xfc, 0xfe, 0xef, 0xfe, 0x2a, 0x00, 0x00, 0x00, 0x02, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x0b, 0x01, 0x33, 0x11, 0x33, 0x11, 0x05, 0x09, 0x01, 0x23, 0x11, 0x21, 0x11, 0x03, 0xf4, 0xf0, 0xef, 0x76, 0xf3, 0xfd, 0xbd, 0x01, 0xc9, 0x01, 0xc9, 0xf5, 0xfe, 0x59, 0x04, 0x70, 0x01, 0x0a, 0xfe, 0xf6, 0xfb, 0xf4, 0x04, 0x0c, 0x64, 0x01, 0xfc, 0xfe, 0x04, 0xfb, 0xf4, 0x04, 0x0c, 0x00, 0x02, 0x00, 0x40, 0x00, 0x86, 0x05, 0xaf, 0x04, 0x7e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x21, 0x15, 0x13, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x04, 0x3f, 0xfc, 0x5c, 0x03, 0xa4, 0xf0, 0xfe, 0xb6, 0xfc, 0x5c, 0x03, 0xa4, 0x01, 0xc9, 0x03, 0x8c, 0x83, 0xfe, 0xf2, 0x83, 0x01, 0x0a, 0xfe, 0x04, 0x01, 0x11, 0x01, 0xd6, 0x01, 0x11, 0xfe, 0x04, 0x00, 0x00, 0x02, 0x01, 0x3b, 0xff, 0xcd, 0x04, 0xce, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x13, 0x01, 0x33, 0x11, 0x21, 0x11, 0x33, 0x01, 0x03, 0xf4, 0x76, 0xf3, 0x76, 0xef, 0xfe, 0x37, 0xf6, 0x01, 0xa7, 0xf5, 0xfe, 0x37, 0x01, 0x65, 0x04, 0x0c, 0xfb, 0xf4, 0xfe, 0xf6, 0x01, 0x6e, 0x04, 0x0c, 0xfb, 0xf4, 0xfe, 0x04, 0x00, 0x04, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x09, 0x01, 0x23, 0x03, 0x11, 0x33, 0x0b, 0x01, 0x33, 0x11, 0x01, 0x11, 0x21, 0x11, 0x05, 0x23, 0x15, 0x33, 0x03, 0xd8, 0xfe, 0x59, 0xf6, 0x01, 0xc9, 0x01, 0xc9, 0xf5, 0x5a, 0x76, 0xf0, 0xef, 0x76, 0x01, 0x4d, 0xfe, 0x59, 0x01, 0x4d, 0xf3, 0xf3, 0x02, 0x24, 0x01, 0xe8, 0x01, 0xfc, 0xfe, 0x04, 0xfe, 0x7c, 0x01, 0xe8, 0x01, 0x0a, 0xfe, 0xf6, 0xfe, 0x18, 0xfe, 0xd4, 0xfe, 0xa4, 0x01, 0x5c, 0x64, 0x94, 0x00, 0x00, 0x02, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x23, 0x09, 0x01, 0x23, 0x11, 0x33, 0x05, 0x23, 0x15, 0x21, 0x35, 0x23, 0x11, 0x33, 0x0b, 0x01, 0x33, 0x04, 0x8c, 0xfc, 0xf1, 0xb4, 0xf6, 0x01, 0xc9, 0x01, 0xc9, 0xf5, 0xb4, 0xfd, 0xff, 0xb4, 0x02, 0x5b, 0xb4, 0x76, 0xf0, 0xef, 0x76, 0x01, 0x5c, 0x02, 0xb0, 0x01, 0xfc, 0xfe, 0x04, 0xfd, 0x50, 0x64, 0x94, 0x94, 0x03, 0x78, 0x01, 0x0a, 0xfe, 0xf6, 0x00, 0x00, 0x03, 0x01, 0x20, 0x00, 0x00, 0x04, 0xe9, 0x06, 0x08, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x19, 0x00, 0x00, 0x25, 0x23, 0x15, 0x21, 0x35, 0x23, 0x11, 0x33, 0x27, 0x21, 0x07, 0x33, 0x01, 0x21, 0x11, 0x33, 0x11, 0x21, 0x09, 0x01, 0x21, 0x11, 0x33, 0x01, 0x33, 0x27, 0x02, 0x8b, 0xb4, 0x02, 0x5b, 0xb4, 0x91, 0x5a, 0xfe, 0x9f, 0x5a, 0x91, 0x02, 0x01, 0xfc, 0xf1, 0xb4, 0xfe, 0xef, 0x01, 0xe4, 0x01, 0xe4, 0xfe, 0xf0, 0xb4, 0xfe, 0x10, 0xd1, 0x69, 0xf8, 0x94, 0x94, 0x03, 0x5a, 0x64, 0x64, 0xfb, 0xae, 0x01, 0x5c, 0x02, 0x92, 0x02, 0x1a, 0xfd, 0xe6, 0xfd, 0x6e, 0x03, 0xaa, 0x74, 0x00, 0x03, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x06, 0x00, 0x11, 0x00, 0x18, 0x00, 0x00, 0x25, 0x23, 0x15, 0x21, 0x11, 0x07, 0x33, 0x01, 0x21, 0x11, 0x33, 0x11, 0x23, 0x09, 0x01, 0x23, 0x11, 0x33, 0x01, 0x11, 0x21, 0x35, 0x23, 0x11, 0x33, 0x02, 0x7d, 0xa6, 0x01, 0x00, 0xc2, 0x68, 0x02, 0x0f, 0xfc, 0xf1, 0xa6, 0xe8, 0x01, 0xc9, 0x01, 0xc9, 0xe8, 0xa7, 0xfe, 0xa5, 0x01, 0x01, 0xa7, 0x69, 0xf8, 0x94, 0x04, 0xe4, 0xd8, 0xfb, 0x90, 0x01, 0x5c, 0x02, 0xb0, 0x01, 0xfc, 0xfe, 0x04, 0xfd, 0x50, 0x03, 0xec, 0xfb, 0x1c, 0x94, 0x03, 0x78, 0x00, 0x03, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x06, 0x00, 0x11, 0x00, 0x17, 0x00, 0x00, 0x25, 0x11, 0x33, 0x0b, 0x01, 0x33, 0x11, 0x05, 0x21, 0x11, 0x23, 0x13, 0x23, 0x09, 0x01, 0x23, 0x13, 0x23, 0x03, 0x33, 0x0b, 0x01, 0x33, 0x37, 0x03, 0x7e, 0x76, 0xf0, 0xef, 0x76, 0x01, 0x4d, 0xfe, 0x59, 0xf6, 0xfc, 0xfc, 0x01, 0xc9, 0x01, 0xc9, 0xfc, 0xfc, 0xf5, 0x61, 0x7d, 0xf0, 0xef, 0x7c, 0x73, 0x64, 0x02, 0xf4, 0x01, 0x0a, 0xfe, 0xf6, 0xfd, 0x0c, 0x64, 0x02, 0xf4, 0x01, 0x18, 0x01, 0xfc, 0xfe, 0x04, 0xfe, 0xe8, 0x01, 0x7c, 0x01, 0x0a, 0xfe, 0xf6, 0x80, 0x00, 0x00, 0x03, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x0a, 0x00, 0x19, 0x00, 0x1f, 0x00, 0x00, 0x25, 0x23, 0x15, 0x21, 0x35, 0x23, 0x11, 0x33, 0x0b, 0x01, 0x33, 0x01, 0x21, 0x11, 0x33, 0x11, 0x23, 0x13, 0x23, 0x09, 0x01, 0x23, 0x13, 0x23, 0x11, 0x33, 0x01, 0x33, 0x0b, 0x01, 0x33, 0x37, 0x02, 0x8b, 0xb4, 0x02, 0x5b, 0xb4, 0x76, 0xf0, 0xef, 0x76, 0x02, 0x01, 0xfc, 0xf1, 0xb4, 0xf6, 0xfc, 0xfc, 0x01, 0xc9, 0x01, 0xc9, 0xfc, 0xfc, 0xf5, 0xb4, 0xfe, 0xeb, 0x7d, 0xf0, 0xef, 0x7c, 0x73, 0xf8, 0x94, 0x94, 0x02, 0x60, 0x01, 0x0a, 0xfe, 0xf6, 0xfc, 0xa8, 0x01, 0x5c, 0x01, 0x98, 0x01, 0x18, 0x01, 0xfc, 0xfe, 0x04, 0xfe, 0xe8, 0xfe, 0x68, 0x03, 0x14, 0x01, 0x0a, 0xfe, 0xf6, 0x80, 0x00, 0x00, 0x02, 0x00, 0x69, 0x00, 0x86, 0x05, 0xd7, 0x04, 0x7e, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x37, 0x11, 0x21, 0x15, 0x21, 0x11, 0x09, 0x01, 0x11, 0x21, 0x15, 0x03, 0x35, 0x23, 0x11, 0x33, 0x35, 0x21, 0x15, 0x13, 0x03, 0x15, 0x69, 0x01, 0x39, 0x02, 0x6c, 0x01, 0xc9, 0xfe, 0x37, 0xfd, 0x94, 0x5a, 0x85, 0x85, 0x03, 0x20, 0xef, 0xef, 0xcf, 0x03, 0x66, 0xc8, 0x01, 0x11, 0xfe, 0x04, 0xfe, 0x04, 0x01, 0x11, 0xc8, 0x02, 0x3a, 0xc8, 0xfd, 0x62, 0xc8, 0x83, 0x01, 0x0a, 0x01, 0x0a, 0x83, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x00, 0x05, 0xac, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x23, 0x11, 0x01, 0x37, 0x21, 0x15, 0x21, 0x01, 0x07, 0x01, 0x11, 0x23, 0x05, 0xac, 0xfb, 0x1b, 0x59, 0x01, 0x05, 0x39, 0x01, 0xf4, 0xfe, 0xd7, 0x03, 0x08, 0x6c, 0xfc, 0xf8, 0x98, 0x05, 0xd5, 0x63, 0xfa, 0x8e, 0x05, 0xd5, 0xfe, 0x9f, 0x3f, 0xa9, 0xfc, 0xa2, 0x78, 0x03, 0x5e, 0xfe, 0xb6, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x00, 0x05, 0xac, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x00, 0x33, 0x35, 0x21, 0x11, 0x33, 0x11, 0x01, 0x07, 0x21, 0x35, 0x21, 0x01, 0x37, 0x01, 0x11, 0x33, 0x6e, 0x04, 0xe5, 0x59, 0xfe, 0xfb, 0x39, 0xfe, 0x0c, 0x01, 0x29, 0xfc, 0xf8, 0x6c, 0x03, 0x08, 0x98, 0x63, 0x05, 0x72, 0xfa, 0x2b, 0x01, 0x61, 0x3f, 0xa9, 0x03, 0x5e, 0x78, 0xfc, 0xa2, 0x01, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x3b, 0xff, 0xcd, 0x04, 0xce, 0x06, 0x08, 0x00, 0x09, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x33, 0x0b, 0x01, 0x33, 0x11, 0x23, 0x1b, 0x01, 0x27, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x09, 0x01, 0x23, 0x03, 0x7e, 0x76, 0xf0, 0xef, 0x76, 0x76, 0xef, 0xf0, 0x1c, 0xf5, 0xfe, 0x37, 0xfe, 0x37, 0xf6, 0xf6, 0x01, 0xc9, 0x01, 0xc9, 0xf5, 0x01, 0x65, 0x03, 0x0b, 0x01, 0x0a, 0xfe, 0xf6, 0xfc, 0xf5, 0xfe, 0xf6, 0x01, 0x0a, 0x64, 0xfe, 0x04, 0x01, 0xfc, 0x02, 0x43, 0x01, 0xfc, 0xfe, 0x04, 0x00, 0x00, 0x03, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x29, 0x00, 0x35, 0x00, 0x41, 0x00, 0x00, 0x09, 0x01, 0x27, 0x37, 0x21, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x23, 0x35, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x27, 0x37, 0x01, 0x24, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x26, 0x27, 0x26, 0x27, 0x13, 0x21, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0xc4, 0x05, 0x09, 0x18, 0x2d, 0x2c, 0x3a, 0x37, 0x84, 0x34, 0x3d, 0x29, 0x2d, 0x18, 0x09, 0x06, 0xab, 0xab, 0x06, 0x09, 0x18, 0x2d, 0x2c, 0x3a, 0x37, 0x84, 0x34, 0x3c, 0x2a, 0x2d, 0x18, 0x09, 0x05, 0x01, 0x3c, 0xd1, 0x6c, 0x01, 0x61, 0xfc, 0xbc, 0x4a, 0x1f, 0x25, 0x16, 0x17, 0x0d, 0x01, 0x47, 0x0f, 0x16, 0x1a, 0x20, 0x5d, 0xfe, 0xbc, 0x0d, 0x16, 0x1b, 0x20, 0x1f, 0x4a, 0x20, 0x20, 0x1a, 0x17, 0x02, 0x55, 0xfe, 0x77, 0x78, 0xe9, 0x18, 0x18, 0x40, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x32, 0x40, 0x18, 0x18, 0xaa, 0x1a, 0x19, 0x40, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x32, 0x40, 0x19, 0x1a, 0xe9, 0x78, 0xfe, 0x77, 0x9d, 0x0f, 0x12, 0x1a, 0x1c, 0x1e, 0x23, 0x17, 0x1c, 0x10, 0xfe, 0xf0, 0x1d, 0x1a, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6b, 0xff, 0xf9, 0x05, 0x9c, 0x05, 0xdc, 0x10, 0x27, 0x08, 0x6d, 0x01, 0x0e, 0x00, 0x00, 0x10, 0x07, 0x08, 0x6f, 0xfe, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x74, 0x05, 0xaf, 0x06, 0x90, 0x00, 0x19, 0x00, 0x00, 0x01, 0x07, 0x17, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x15, 0x07, 0x17, 0x05, 0xae, 0xe5, 0xe5, 0xfe, 0x9f, 0x6c, 0xd1, 0xfb, 0xb7, 0x04, 0x49, 0xc1, 0xc1, 0xfb, 0xb7, 0x04, 0x49, 0xc1, 0xc1, 0xfb, 0xb7, 0x04, 0x49, 0xd1, 0x6c, 0x01, 0x61, 0xe5, 0xe5, 0x02, 0x55, 0xff, 0xff, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xaa, 0xd7, 0xd7, 0xaa, 0xd7, 0xd7, 0xaa, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xc0, 0x05, 0xa0, 0x04, 0x44, 0x00, 0x11, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0xfb, 0x99, 0x01, 0xb5, 0xfe, 0x4b, 0x99, 0xfe, 0x05, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x6d, 0xfe, 0x93, 0xaa, 0xfe, 0x93, 0x01, 0x6d, 0xe9, 0x78, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xc0, 0x05, 0xaf, 0x04, 0x44, 0x00, 0x11, 0x00, 0x00, 0x09, 0x01, 0x27, 0x37, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0x06, 0x99, 0xfe, 0x4a, 0x01, 0xb6, 0x99, 0x01, 0xfa, 0xd1, 0x6c, 0x01, 0x61, 0x02, 0x55, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0x93, 0x01, 0x6d, 0xaa, 0x01, 0x6d, 0xfe, 0x93, 0xe9, 0x78, 0xfe, 0x77, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xc0, 0x05, 0xaf, 0x04, 0x44, 0x00, 0x17, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x11, 0x23, 0x11, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x02, 0xb8, 0x99, 0x01, 0x61, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0x9f, 0x99, 0xfe, 0x9e, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x02, 0xd7, 0x01, 0x6d, 0xfe, 0x93, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0x93, 0x01, 0x6d, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xc0, 0x05, 0xa0, 0x04, 0x44, 0x00, 0x19, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x01, 0x7d, 0x99, 0x99, 0x99, 0x01, 0x01, 0xfe, 0xff, 0x99, 0x99, 0x99, 0xfe, 0x83, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x6d, 0xfe, 0x93, 0x01, 0x6d, 0xfe, 0x93, 0xaa, 0xfe, 0x93, 0x01, 0x6d, 0xfe, 0x93, 0x01, 0x6d, 0xe9, 0x78, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xc0, 0x05, 0xaf, 0x04, 0x44, 0x00, 0x19, 0x00, 0x00, 0x09, 0x01, 0x27, 0x37, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x05, 0xae, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0x84, 0x99, 0x99, 0x99, 0xfe, 0xfe, 0x01, 0x02, 0x99, 0x99, 0x99, 0x01, 0x7c, 0xd1, 0x6c, 0x01, 0x61, 0x02, 0x55, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0x93, 0x01, 0x6d, 0xfe, 0x93, 0x01, 0x6d, 0xaa, 0x01, 0x6d, 0xfe, 0x93, 0x01, 0x6d, 0xfe, 0x93, 0xe9, 0x78, 0xfe, 0x77, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xc0, 0x05, 0xaf, 0x04, 0x44, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x02, 0x59, 0x7e, 0x5a, 0x7e, 0x01, 0x03, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0xfd, 0x7e, 0x5a, 0x7e, 0xfe, 0xfd, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x02, 0xd7, 0x01, 0x6d, 0xfe, 0x93, 0x01, 0x6d, 0xfe, 0x93, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xfe, 0x93, 0x01, 0x6d, 0xfe, 0x93, 0x01, 0x6d, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x00, 0x02, 0x00, 0x31, 0x00, 0xc4, 0x05, 0xa0, 0x04, 0x40, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x07, 0x05, 0x11, 0x09, 0x01, 0x11, 0x21, 0x15, 0x01, 0x7b, 0xe1, 0x01, 0x29, 0xfe, 0x6f, 0x01, 0x91, 0x03, 0xdc, 0x01, 0x88, 0x01, 0xf4, 0xfa, 0x41, 0xfe, 0x83, 0x01, 0xbe, 0x01, 0xbe, 0xfe, 0x83, 0x82, 0x00, 0x02, 0x00, 0x69, 0x00, 0xc4, 0x05, 0xd7, 0x04, 0x40, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x01, 0x37, 0x27, 0x03, 0x21, 0x35, 0x21, 0x11, 0x09, 0x01, 0x04, 0x8e, 0xe0, 0xe0, 0x48, 0xfc, 0x23, 0x03, 0xdd, 0x01, 0x91, 0xfe, 0x6f, 0x01, 0x88, 0xfa, 0xfa, 0xfe, 0xc5, 0x82, 0x01, 0x7d, 0xfe, 0x42, 0xfe, 0x42, 0x00, 0x03, 0x00, 0x31, 0x00, 0xc4, 0x05, 0xd7, 0x04, 0x40, 0x00, 0x02, 0x00, 0x05, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x37, 0x27, 0x01, 0x11, 0x07, 0x05, 0x21, 0x11, 0x09, 0x01, 0x11, 0x21, 0x11, 0x09, 0x01, 0x04, 0x8e, 0xe0, 0xe0, 0xfc, 0xed, 0xe1, 0x03, 0xac, 0xfd, 0x7d, 0xfe, 0x6f, 0x01, 0x91, 0x02, 0x83, 0x01, 0x91, 0xfe, 0x6f, 0x01, 0x88, 0xfa, 0xfa, 0xfe, 0x0c, 0x01, 0xf4, 0xfa, 0x41, 0xfe, 0x83, 0x01, 0xbe, 0x01, 0xbe, 0xfe, 0x83, 0x01, 0x7d, 0xfe, 0x42, 0xfe, 0x42, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x25, 0x13, 0x21, 0x13, 0x01, 0x33, 0x13, 0x21, 0x13, 0x33, 0x01, 0x02, 0x76, 0xf8, 0xfe, 0x11, 0x90, 0xfd, 0xff, 0xc0, 0x7a, 0x02, 0x5e, 0x7b, 0xbd, 0xfe, 0x00, 0xc7, 0x02, 0xe7, 0xfc, 0x52, 0x05, 0xd5, 0xfe, 0x81, 0x01, 0x7f, 0xfa, 0x2b, 0x00, 0x01, 0x00, 0x79, 0xff, 0xe3, 0x03, 0xfd, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x10, 0x12, 0x33, 0x32, 0x17, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x02, 0x7a, 0xee, 0xe2, 0xe2, 0x78, 0x3b, 0x1e, 0xb6, 0x10, 0x19, 0x47, 0x8d, 0x8c, 0x8e, 0x8e, 0x8c, 0x8d, 0x47, 0x19, 0x10, 0xb6, 0x1e, 0x3b, 0x78, 0xe2, 0xe2, 0xee, 0x02, 0xe9, 0x01, 0x7a, 0x01, 0x8d, 0xc6, 0x63, 0x90, 0x49, 0x37, 0x99, 0xfe, 0xcd, 0xfe, 0xcc, 0xfe, 0xcc, 0xfe, 0xcd, 0x99, 0x37, 0x49, 0x90, 0x63, 0xc5, 0x01, 0x8c, 0x00, 0x00, 0x02, 0x00, 0x55, 0xff, 0xe3, 0x03, 0x64, 0x05, 0x4c, 0x00, 0x20, 0x00, 0x30, 0x00, 0x00, 0x05, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x35, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x02, 0x07, 0x06, 0x01, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x23, 0x22, 0x07, 0x06, 0x01, 0x89, 0x7f, 0x52, 0x62, 0x56, 0x59, 0xa0, 0x69, 0x53, 0x31, 0x21, 0x0c, 0x1d, 0x40, 0xa9, 0x40, 0x63, 0x68, 0x5e, 0xf1, 0x67, 0x30, 0x17, 0x39, 0x92, 0x74, 0xfe, 0xe1, 0x28, 0x2a, 0x41, 0x3a, 0x2e, 0x40, 0x30, 0x28, 0x14, 0x51, 0x8a, 0x77, 0x34, 0x21, 0x1d, 0x55, 0x65, 0xb7, 0xbe, 0x94, 0x98, 0x49, 0x2b, 0x48, 0x51, 0x5c, 0x87, 0x4e, 0xad, 0x2c, 0xa8, 0x1f, 0xf6, 0x74, 0xad, 0x71, 0x83, 0xfe, 0xb8, 0x9c, 0x7a, 0x01, 0x53, 0x64, 0x36, 0x39, 0x2d, 0x3e, 0x65, 0x53, 0x59, 0xd7, 0xae, 0x6c, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x04, 0x17, 0xfc, 0x9e, 0x02, 0xac, 0xfd, 0x54, 0x02, 0xac, 0xfd, 0x54, 0x05, 0xd5, 0xfa, 0x2b, 0xaa, 0x01, 0xec, 0xaa, 0x01, 0xeb, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0xff, 0xa2, 0x04, 0x17, 0x06, 0x35, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x07, 0x23, 0x37, 0x23, 0x35, 0x33, 0x13, 0x21, 0x35, 0x21, 0x13, 0x21, 0x35, 0x21, 0x37, 0x33, 0x0f, 0x01, 0x03, 0x33, 0x11, 0x01, 0x03, 0x21, 0x11, 0x04, 0x17, 0xfd, 0x90, 0x1a, 0x99, 0x1a, 0x59, 0x89, 0x88, 0xfe, 0xef, 0x01, 0x40, 0x89, 0xfe, 0x37, 0x01, 0xf8, 0x1b, 0x99, 0x1b, 0x2f, 0x89, 0xd3, 0xfe, 0xff, 0x89, 0x01, 0x8a, 0x05, 0xd5, 0xfa, 0x2b, 0x5e, 0x5e, 0xaa, 0x01, 0xec, 0xaa, 0x01, 0xeb, 0xaa, 0x60, 0x60, 0xaa, 0xfe, 0x15, 0x01, 0xeb, 0xfd, 0x6b, 0xfe, 0x14, 0x01, 0xec, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8b, 0xff, 0xec, 0x05, 0xbb, 0x05, 0xae, 0x00, 0x1b, 0x00, 0x28, 0x00, 0x36, 0x00, 0x00, 0x01, 0x37, 0x33, 0x07, 0x16, 0x17, 0x16, 0x10, 0x02, 0x04, 0x23, 0x22, 0x27, 0x26, 0x27, 0x07, 0x23, 0x37, 0x26, 0x27, 0x26, 0x10, 0x12, 0x24, 0x33, 0x32, 0x17, 0x16, 0x09, 0x01, 0x27, 0x26, 0x23, 0x22, 0x04, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x09, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x24, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x04, 0x87, 0x50, 0x60, 0x73, 0x5e, 0x3e, 0x5a, 0xb4, 0xfe, 0xc3, 0xa6, 0xa9, 0x9e, 0x32, 0x2c, 0x71, 0x5e, 0x99, 0x39, 0x2a, 0x59, 0xb2, 0x01, 0x3c, 0xa9, 0xa6, 0x9f, 0x10, 0xfd, 0x1b, 0x02, 0xa9, 0x0d, 0x83, 0x89, 0x8b, 0xfe, 0xfa, 0x4a, 0x48, 0x01, 0x01, 0x48, 0x21, 0x03, 0x10, 0xfd, 0x51, 0x23, 0x29, 0x82, 0x8b, 0x89, 0x01, 0x06, 0x4a, 0x4a, 0x01, 0x01, 0x4a, 0x34, 0x05, 0x3b, 0x6e, 0x9d, 0x53, 0x7a, 0xb2, 0xfe, 0x80, 0xfe, 0x9d, 0xbe, 0x5f, 0x1e, 0x27, 0x9c, 0xd2, 0x42, 0x54, 0xb1, 0x01, 0x80, 0x01, 0x63, 0xbe, 0x5f, 0x0a, 0xfb, 0xe9, 0x03, 0xa5, 0x08, 0x4e, 0x9d, 0x93, 0x91, 0x9b, 0x9b, 0x91, 0x40, 0x03, 0x44, 0xfc, 0x52, 0x1f, 0x18, 0x4f, 0x9d, 0x93, 0x91, 0x9b, 0x9b, 0x91, 0x67, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfa, 0x00, 0x00, 0x04, 0xd7, 0x05, 0xc1, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x21, 0x01, 0x33, 0x01, 0x21, 0x02, 0x68, 0xfe, 0x87, 0x02, 0xf1, 0xfe, 0x24, 0xc9, 0x02, 0x09, 0xfb, 0x25, 0x04, 0xee, 0xfb, 0xc4, 0x05, 0x0f, 0xfa, 0x3f, 0x00, 0x02, 0xff, 0xfa, 0x00, 0x00, 0x04, 0xd7, 0x05, 0xc1, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x25, 0x01, 0x21, 0x09, 0x01, 0x21, 0x01, 0x02, 0x68, 0x01, 0x78, 0xfd, 0x0f, 0x01, 0x15, 0xfd, 0xf7, 0x04, 0xdb, 0xfd, 0xf7, 0xd3, 0x04, 0x3c, 0xfa, 0xf1, 0x05, 0xc1, 0xfa, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x05, 0xae, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x15, 0x21, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x21, 0x15, 0x21, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x01, 0x35, 0x06, 0x39, 0x43, 0x7d, 0x7c, 0x85, 0x02, 0x73, 0xfd, 0x8d, 0xad, 0xfe, 0xc0, 0xaa, 0xaa, 0x01, 0x40, 0xad, 0x02, 0x73, 0xfd, 0x8d, 0x85, 0x7c, 0x7d, 0x43, 0x3a, 0x08, 0x04, 0x76, 0x02, 0x73, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0x01, 0x60, 0xbb, 0xb9, 0x01, 0x60, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0x00, 0x03, 0x00, 0x9d, 0xfe, 0xe5, 0x05, 0xa9, 0x06, 0xaf, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x03, 0x16, 0x33, 0x21, 0x15, 0x21, 0x22, 0x27, 0x03, 0x27, 0x13, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x24, 0x3b, 0x01, 0x01, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x13, 0x37, 0x13, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x04, 0x5c, 0x87, 0x42, 0x01, 0x07, 0xfe, 0xc5, 0xa6, 0x01, 0xe1, 0xfd, 0xea, 0x9e, 0x20, 0x21, 0x02, 0x73, 0xfd, 0x8d, 0x3b, 0x38, 0x5a, 0x87, 0x56, 0x28, 0x27, 0xa0, 0xaa, 0xaa, 0x01, 0x40, 0xad, 0xd2, 0xfd, 0x2e, 0x3f, 0x4c, 0x74, 0x1a, 0x1a, 0x90, 0x36, 0xa5, 0x9e, 0x85, 0x7c, 0x70, 0x50, 0x42, 0x06, 0xaf, 0x37, 0xca, 0x9f, 0xfe, 0x04, 0xa0, 0xfe, 0x1d, 0x05, 0x9f, 0x0b, 0xfe, 0xee, 0x37, 0x01, 0x08, 0x13, 0x18, 0x63, 0x01, 0x60, 0xbb, 0xb9, 0x01, 0x60, 0xc8, 0xfc, 0xc5, 0x4a, 0x78, 0x91, 0x48, 0x10, 0x0d, 0x01, 0xb8, 0xa0, 0x01, 0xfc, 0x4e, 0x47, 0x92, 0x78, 0x5d, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x9b, 0x04, 0x68, 0x04, 0x67, 0x00, 0x16, 0x00, 0x00, 0x25, 0x20, 0x24, 0x35, 0x34, 0x24, 0x29, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x16, 0x17, 0x16, 0x33, 0x21, 0x15, 0x02, 0xda, 0xfe, 0xf6, 0xfe, 0xf3, 0x01, 0x0d, 0x01, 0x0a, 0x01, 0x8e, 0xfe, 0x72, 0xd1, 0x5e, 0x46, 0x1b, 0x03, 0x1e, 0xfc, 0xe2, 0x21, 0x40, 0x67, 0xc8, 0x01, 0x8e, 0x9b, 0xf6, 0xf0, 0xf0, 0xf6, 0x8e, 0x01, 0x01, 0x4f, 0x3a, 0x85, 0x8e, 0x91, 0x30, 0x51, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x05, 0xae, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x21, 0x35, 0x21, 0x32, 0x04, 0x12, 0x15, 0x14, 0x02, 0x04, 0x23, 0x21, 0x35, 0x21, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x21, 0x35, 0x05, 0x11, 0x06, 0x39, 0x43, 0x7e, 0x7b, 0x85, 0xfd, 0x8d, 0x02, 0x73, 0xad, 0x01, 0x3f, 0xab, 0xab, 0xfe, 0xc1, 0xad, 0xfd, 0x8d, 0x02, 0x73, 0x85, 0x7b, 0x7d, 0x44, 0x3a, 0x08, 0xfb, 0x8a, 0x03, 0x27, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0xfe, 0xa0, 0xbb, 0xb9, 0xfe, 0xa0, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0x00, 0x03, 0x00, 0x9d, 0xfe, 0xe5, 0x05, 0xa9, 0x06, 0xaf, 0x00, 0x1e, 0x00, 0x26, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x13, 0x21, 0x35, 0x21, 0x13, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x17, 0x13, 0x17, 0x03, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x04, 0x2b, 0x01, 0x01, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x03, 0x07, 0x03, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x01, 0xea, 0x87, 0x41, 0xfe, 0xfa, 0x01, 0x3a, 0xa7, 0xfe, 0x1f, 0x02, 0x15, 0x9f, 0x21, 0x20, 0xfd, 0x8d, 0x02, 0x73, 0x3a, 0x39, 0x5a, 0x87, 0x56, 0x27, 0x28, 0x9f, 0xab, 0xab, 0xfe, 0xc1, 0xad, 0xd3, 0x02, 0xd3, 0x3f, 0x4c, 0x75, 0x1a, 0x1a, 0x90, 0x35, 0xa6, 0x9f, 0x84, 0x7c, 0x71, 0x50, 0x42, 0xfe, 0xe5, 0x37, 0xca, 0x9f, 0x01, 0xfc, 0xa0, 0x01, 0xe3, 0x05, 0x9f, 0x0b, 0x01, 0x12, 0x37, 0xfe, 0xf8, 0x13, 0x18, 0x63, 0xfe, 0xa0, 0xbb, 0xb9, 0xfe, 0xa0, 0xc8, 0x03, 0x3b, 0x4a, 0x78, 0x91, 0x48, 0x10, 0x0d, 0xfe, 0x48, 0xa0, 0xfe, 0x04, 0x4e, 0x47, 0x92, 0x78, 0x5d, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x9b, 0x04, 0x68, 0x04, 0x67, 0x00, 0x16, 0x00, 0x00, 0x01, 0x20, 0x04, 0x15, 0x14, 0x04, 0x29, 0x01, 0x35, 0x25, 0x32, 0x37, 0x36, 0x37, 0x21, 0x35, 0x05, 0x26, 0x27, 0x26, 0x07, 0x21, 0x35, 0x02, 0x51, 0x01, 0x0a, 0x01, 0x0d, 0xfe, 0xf3, 0xfe, 0xf6, 0xfe, 0x72, 0x01, 0x8e, 0xd1, 0x5e, 0x46, 0x1b, 0xfc, 0xe2, 0x03, 0x1e, 0x22, 0x3f, 0x68, 0xc7, 0xfe, 0x72, 0x04, 0x67, 0xf6, 0xf1, 0xef, 0xf6, 0x8e, 0x01, 0x50, 0x3a, 0x85, 0x8e, 0x01, 0x91, 0x31, 0x52, 0x01, 0x8e, 0x00, 0x00, 0x01, 0x01, 0x0e, 0x00, 0x00, 0x03, 0x87, 0x03, 0xe2, 0x00, 0x03, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x02, 0x79, 0x03, 0xe2, 0xfc, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8c, 0xfe, 0x77, 0x04, 0xe6, 0x05, 0xc1, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x8c, 0x04, 0x5a, 0xd8, 0xfd, 0x56, 0xd8, 0x05, 0xc1, 0xf8, 0xb6, 0x06, 0x7d, 0xf9, 0x83, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8c, 0xfe, 0x77, 0x04, 0xe6, 0x05, 0xc1, 0x00, 0x07, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x8c, 0xd8, 0x02, 0xaa, 0xd8, 0xfe, 0x77, 0x07, 0x4a, 0xf9, 0x83, 0x06, 0x7d, 0xf8, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x16, 0xfe, 0x77, 0x04, 0xb6, 0x05, 0xc1, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x09, 0x01, 0x21, 0x15, 0x21, 0x35, 0x09, 0x01, 0x32, 0x04, 0x6c, 0xfc, 0xa1, 0x02, 0x5c, 0xfd, 0x90, 0x03, 0x8a, 0xfb, 0x61, 0x02, 0x8d, 0xfd, 0x8f, 0x05, 0xc1, 0xc1, 0xfd, 0x33, 0xfd, 0x04, 0xc0, 0x95, 0x03, 0x21, 0x02, 0xe3, 0x00, 0x01, 0x00, 0xc3, 0x02, 0x2d, 0x05, 0x46, 0x02, 0xd7, 0x00, 0x03, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0xd7, 0xaa, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0x04, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x01, 0x35, 0x21, 0x15, 0x03, 0x50, 0x97, 0xfe, 0x0a, 0x01, 0xf6, 0x97, 0x01, 0xf5, 0xfe, 0x0b, 0xfd, 0x73, 0x04, 0x82, 0x01, 0x83, 0xaa, 0x01, 0x83, 0xfe, 0x7d, 0xaa, 0x02, 0xd7, 0xaa, 0xaa, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x19, 0x01, 0x33, 0x15, 0x23, 0x03, 0x50, 0x01, 0xf5, 0xfe, 0x0b, 0x97, 0xfe, 0x0a, 0x01, 0xf6, 0x97, 0x97, 0x04, 0xa0, 0xfe, 0x05, 0xaa, 0xfe, 0x05, 0x01, 0xfb, 0xaa, 0x01, 0xfb, 0x01, 0x35, 0xcc, 0xff, 0xff, 0x00, 0x00, 0xff, 0x42, 0x02, 0x6d, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x12, 0x00, 0x00, 0xff, 0xff, 0x01, 0x62, 0xff, 0x92, 0x03, 0xd0, 0x06, 0x25, 0x10, 0x07, 0x00, 0x3f, 0x01, 0x63, 0x00, 0x50, 0x00, 0x00, 0x00, 0x01, 0x00, 0xeb, 0x00, 0x00, 0x05, 0x1e, 0x05, 0x04, 0x00, 0x11, 0x00, 0x00, 0x01, 0x25, 0x37, 0x05, 0x11, 0x33, 0x11, 0x25, 0x17, 0x0d, 0x01, 0x07, 0x25, 0x11, 0x23, 0x11, 0x05, 0x27, 0x02, 0x6c, 0xfe, 0x7f, 0x4d, 0x01, 0x81, 0x97, 0x01, 0x81, 0x4c, 0xfe, 0x7f, 0x01, 0x81, 0x4c, 0xfe, 0x7f, 0x97, 0xfe, 0x7f, 0x4d, 0x02, 0x82, 0xf7, 0x93, 0xf7, 0x01, 0xef, 0xfe, 0x11, 0xf7, 0x93, 0xf7, 0xf7, 0x93, 0xf7, 0xfe, 0x11, 0x01, 0xef, 0xf7, 0x93, 0x00, 0xff, 0xff, 0x01, 0x23, 0x01, 0x47, 0x03, 0x5f, 0x03, 0xc2, 0x10, 0x07, 0x00, 0x72, 0x00, 0x74, 0xfd, 0xd2, 0x00, 0x00, 0xff, 0xff, 0x01, 0x35, 0x01, 0x59, 0x03, 0x4d, 0x03, 0xa9, 0x10, 0x06, 0x07, 0x57, 0x21, 0x88, 0x00, 0x01, 0x00, 0x36, 0xff, 0xd7, 0x04, 0x97, 0x06, 0x7d, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x01, 0x23, 0x01, 0x07, 0x27, 0x25, 0x13, 0x03, 0xec, 0xaa, 0x67, 0xfd, 0xe9, 0x3b, 0xfe, 0xe1, 0x71, 0x16, 0x00, 0xff, 0xe6, 0x06, 0x7d, 0x60, 0xf9, 0xba, 0x03, 0x73, 0x2d, 0x50, 0x62, 0xfd, 0x3b, 0x00, 0xff, 0xff, 0x00, 0x36, 0xff, 0xd7, 0x04, 0x97, 0x07, 0x76, 0x12, 0x26, 0x08, 0xf6, 0x00, 0x00, 0x10, 0x07, 0x00, 0x75, 0x00, 0x68, 0x01, 0x86, 0xff, 0xff, 0x00, 0x36, 0xff, 0xd7, 0x04, 0x97, 0x07, 0x65, 0x12, 0x26, 0x08, 0xf6, 0x00, 0x00, 0x10, 0x07, 0x07, 0xa2, 0x00, 0x68, 0x01, 0x86, 0x00, 0x02, 0x00, 0xc6, 0x00, 0xe5, 0x04, 0x5f, 0x03, 0xe5, 0x00, 0x0b, 0x00, 0x31, 0x00, 0x00, 0x01, 0x32, 0x37, 0x02, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x05, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x12, 0x33, 0x01, 0xda, 0x95, 0x59, 0x72, 0x7c, 0x5a, 0x2e, 0x30, 0x30, 0x33, 0x02, 0xda, 0x46, 0x41, 0x31, 0x31, 0x2e, 0x1c, 0x2c, 0x3d, 0x35, 0x41, 0x69, 0x79, 0x50, 0x55, 0x55, 0x4a, 0x81, 0x42, 0x30, 0x39, 0x27, 0x24, 0x24, 0x3c, 0x35, 0x42, 0x68, 0x44, 0x3a, 0x85, 0x68, 0x72, 0x7b, 0x01, 0x6b, 0xf0, 0x01, 0x06, 0x48, 0x4d, 0x66, 0x70, 0x45, 0x46, 0x02, 0x84, 0x1e, 0x1b, 0x3f, 0x24, 0x54, 0x78, 0x35, 0x40, 0x65, 0x6a, 0xaf, 0xa8, 0x72, 0x65, 0x1e, 0x21, 0x39, 0x33, 0x45, 0x78, 0x35, 0x40, 0x83, 0xf0, 0xfe, 0xfa, 0x00, 0x00, 0x03, 0x00, 0xc6, 0x00, 0xe5, 0x05, 0x3a, 0x03, 0xe5, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x25, 0x32, 0x37, 0x02, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x22, 0x07, 0x12, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x03, 0x48, 0x1c, 0x2c, 0x3d, 0x35, 0x42, 0x68, 0x79, 0x50, 0x55, 0x55, 0x4b, 0x80, 0x42, 0x30, 0x39, 0x27, 0x24, 0x24, 0x3c, 0x35, 0x43, 0x67, 0x7a, 0x50, 0x54, 0x54, 0x4c, 0x80, 0x41, 0x31, 0x31, 0xfe, 0x64, 0x95, 0x59, 0x72, 0x7c, 0x5a, 0x2e, 0x31, 0x31, 0x33, 0x02, 0xa0, 0x86, 0x67, 0x71, 0x7c, 0x5a, 0x2e, 0x31, 0x31, 0x32, 0x01, 0x5d, 0x24, 0x54, 0x78, 0x35, 0x40, 0x65, 0x6a, 0xaf, 0xa8, 0x72, 0x65, 0x1e, 0x21, 0x39, 0x33, 0x45, 0x78, 0x35, 0x40, 0x65, 0x6a, 0xaf, 0xa8, 0x72, 0x65, 0x1e, 0x1b, 0x4d, 0xf0, 0x01, 0x06, 0x48, 0x4d, 0x66, 0x70, 0x45, 0x46, 0x01, 0xf4, 0xf0, 0xfe, 0xfa, 0x48, 0x4d, 0x66, 0x70, 0x45, 0x46, 0x00, 0x00, 0x01, 0x00, 0xfe, 0x00, 0xcb, 0x05, 0x0a, 0x05, 0x49, 0x00, 0x05, 0x00, 0x00, 0x25, 0x21, 0x11, 0x33, 0x11, 0x21, 0x05, 0x0a, 0xfb, 0xf5, 0x99, 0x03, 0x72, 0xcb, 0x04, 0x7e, 0xfc, 0x2c, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x25, 0x15, 0x21, 0x01, 0x33, 0x01, 0x05, 0xa8, 0xfa, 0xf6, 0x03, 0x59, 0xda, 0xfd, 0x1d, 0xca, 0xca, 0x05, 0xd5, 0xfa, 0xf5, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0x94, 0x05, 0xa9, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x1b, 0x00, 0x00, 0x25, 0x26, 0x27, 0x26, 0x27, 0x01, 0x13, 0x01, 0x33, 0x01, 0x16, 0x17, 0x16, 0x17, 0x21, 0x15, 0x21, 0x16, 0x15, 0x23, 0x34, 0x27, 0x21, 0x01, 0x26, 0x27, 0x37, 0x16, 0x03, 0xf0, 0x23, 0x43, 0x3a, 0x4e, 0xfe, 0xec, 0xcc, 0x01, 0x3d, 0xda, 0xfe, 0x78, 0x65, 0x4a, 0x54, 0x26, 0x01, 0x36, 0xfe, 0xe8, 0x04, 0x7e, 0x05, 0xfc, 0x8d, 0x01, 0xd8, 0x1b, 0x1c, 0x48, 0x1a, 0xca, 0x8b, 0x86, 0x73, 0x5e, 0xfe, 0x1e, 0x02, 0xe3, 0x02, 0x28, 0xfd, 0x52, 0x73, 0x93, 0xa7, 0xb0, 0xca, 0x35, 0x37, 0x37, 0x35, 0x03, 0x36, 0x15, 0x14, 0x75, 0x13, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd5, 0xff, 0xfa, 0x05, 0x46, 0x05, 0xd1, 0x00, 0x17, 0x00, 0x1d, 0x00, 0x00, 0x09, 0x01, 0x37, 0x01, 0x26, 0x27, 0x37, 0x16, 0x17, 0x25, 0x15, 0x05, 0x16, 0x07, 0x15, 0x06, 0x07, 0x05, 0x15, 0x25, 0x06, 0x07, 0x27, 0x36, 0x13, 0x09, 0x01, 0x36, 0x37, 0x36, 0x03, 0x1a, 0xfd, 0xbb, 0x02, 0x02, 0x4d, 0x17, 0x1a, 0x7d, 0x1a, 0x17, 0x01, 0xa5, 0xfe, 0xaf, 0x3f, 0x06, 0x06, 0x40, 0x01, 0x5e, 0xfe, 0x54, 0x19, 0x1b, 0x78, 0x1c, 0x6c, 0xfe, 0x14, 0x01, 0xe4, 0x2f, 0x04, 0x06, 0x01, 0x34, 0x01, 0x52, 0xc0, 0x01, 0x57, 0x21, 0x1e, 0x4c, 0x21, 0x24, 0xee, 0xd2, 0xbe, 0xb3, 0xc6, 0x09, 0xa1, 0x93, 0xbf, 0xd2, 0xf1, 0x26, 0x21, 0x4c, 0x20, 0x02, 0xe9, 0xfe, 0xe7, 0xfe, 0xf0, 0x7b, 0x81, 0x9e, 0x00, 0x00, 0x00, 0x01, 0x01, 0x84, 0xfe, 0x4a, 0x02, 0x15, 0x06, 0x2b, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x11, 0x23, 0x01, 0x85, 0x90, 0x90, 0x06, 0x2b, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5b, 0xfe, 0x4a, 0x03, 0x3f, 0x06, 0x2b, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x37, 0x17, 0x05, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x85, 0x90, 0xe2, 0x48, 0xfe, 0xd6, 0x90, 0xe4, 0x45, 0x02, 0x56, 0x03, 0xd5, 0xfc, 0x9c, 0xb0, 0x6f, 0xe7, 0xfc, 0x29, 0x03, 0x67, 0xb1, 0x6e, 0x00, 0x00, 0x02, 0x00, 0xf4, 0xfe, 0x4a, 0x02, 0xa5, 0x06, 0x2b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0xf5, 0x90, 0x90, 0x01, 0x20, 0x90, 0x90, 0x06, 0x2b, 0xf8, 0x1f, 0x07, 0xe1, 0xf8, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x5b, 0xfe, 0x4a, 0x03, 0x3f, 0x06, 0x2b, 0x00, 0x13, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x37, 0x11, 0x33, 0x11, 0x37, 0x17, 0x07, 0x11, 0x23, 0x11, 0x07, 0x11, 0x23, 0x11, 0x07, 0x27, 0xf5, 0x90, 0x90, 0x90, 0x52, 0x48, 0x9a, 0x90, 0x90, 0x90, 0x54, 0x45, 0x01, 0xe6, 0x04, 0x45, 0xfc, 0x2b, 0x71, 0x03, 0x64, 0xfd, 0x0c, 0x40, 0x6f, 0x78, 0xfb, 0xba, 0x03, 0xd7, 0x70, 0xfc, 0x99, 0x02, 0xf7, 0x41, 0x6e, 0x00, 0x00, 0x01, 0x00, 0xed, 0x00, 0x00, 0x04, 0x58, 0x04, 0xa2, 0x00, 0x06, 0x00, 0x00, 0x33, 0x01, 0x33, 0x01, 0x23, 0x09, 0x01, 0xee, 0x01, 0x44, 0xe2, 0x01, 0x44, 0xb0, 0xfe, 0xfb, 0xfe, 0xfa, 0x04, 0xa2, 0xfb, 0x5e, 0x03, 0xac, 0xfc, 0x54, 0x00, 0x01, 0x00, 0xed, 0x00, 0x00, 0x04, 0x58, 0x04, 0xa2, 0x00, 0x06, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0xee, 0xaf, 0x01, 0x06, 0x01, 0x05, 0xb0, 0xfe, 0xbc, 0xe2, 0x04, 0xa2, 0xfc, 0x54, 0x03, 0xac, 0xfb, 0x5e, 0x00, 0x00, 0x01, 0x00, 0xed, 0x00, 0x00, 0x04, 0x58, 0x04, 0xa2, 0x00, 0x11, 0x00, 0x00, 0x13, 0x10, 0x12, 0x33, 0x32, 0x12, 0x19, 0x01, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0xee, 0xdc, 0xd9, 0xd8, 0xdd, 0x9b, 0x85, 0x95, 0x95, 0x86, 0x9a, 0x02, 0x50, 0x01, 0x28, 0x01, 0x2a, 0xfe, 0xd6, 0xfe, 0xd8, 0xfd, 0xb0, 0x02, 0x37, 0xf4, 0xd3, 0xd3, 0xf4, 0xfd, 0xc9, 0x00, 0x00, 0x01, 0x00, 0xed, 0x00, 0x00, 0x04, 0x58, 0x04, 0xa2, 0x00, 0x11, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0xee, 0x9a, 0x86, 0x95, 0x95, 0x85, 0x9b, 0xdd, 0xd8, 0xd9, 0xdc, 0x02, 0x52, 0x02, 0x50, 0xfd, 0xc9, 0xf4, 0xd3, 0xd3, 0xf4, 0x02, 0x37, 0xfd, 0xb0, 0xfe, 0xd8, 0xfe, 0xd6, 0x01, 0x2a, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x15, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x01, 0xb3, 0x07, 0x92, 0x88, 0x71, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x3a, 0x08, 0x91, 0x88, 0x72, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x04, 0xe2, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0xfa, 0xb0, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0xfe, 0x4d, 0x05, 0x46, 0x06, 0x0e, 0x10, 0x26, 0x09, 0x07, 0x00, 0x00, 0x10, 0x07, 0x09, 0x07, 0x01, 0xee, 0x00, 0x00, 0xff, 0xff, 0x00, 0x69, 0xfe, 0x4d, 0x07, 0x34, 0x06, 0x0e, 0x10, 0x26, 0x09, 0x07, 0x00, 0x00, 0x10, 0x27, 0x09, 0x07, 0x01, 0xee, 0x00, 0x00, 0x10, 0x07, 0x09, 0x07, 0x03, 0xdc, 0x00, 0x00, 0x00, 0x03, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x2d, 0x00, 0x36, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x13, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x03, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0xb3, 0x07, 0x4b, 0x47, 0x42, 0x46, 0x40, 0x31, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0c, 0x59, 0x3b, 0x63, 0x63, 0x4d, 0x68, 0x0d, 0x08, 0x4a, 0x47, 0x43, 0x45, 0x40, 0x32, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x7c, 0x37, 0x28, 0x3e, 0x40, 0x21, 0x28, 0xaa, 0x14, 0x37, 0x28, 0x40, 0x43, 0x21, 0x04, 0xe2, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xd6, 0x18, 0x4b, 0x7c, 0x92, 0x9c, 0x6f, 0x55, 0x13, 0xfe, 0xbe, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0x31, 0x18, 0x49, 0x6f, 0x9b, 0x9c, 0x73, 0x56, 0x13, 0xfd, 0x9b, 0x10, 0x2f, 0x48, 0x67, 0x6a, 0x47, 0x24, 0x12, 0xfe, 0x34, 0x01, 0xd6, 0x11, 0x2e, 0x4a, 0x68, 0x67, 0x48, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x69, 0xfe, 0x4d, 0x05, 0x46, 0x06, 0x0e, 0x00, 0x4d, 0x00, 0x51, 0x00, 0x5a, 0x00, 0x63, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x21, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x21, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x13, 0x21, 0x13, 0x21, 0x03, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x03, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x01, 0xb3, 0x07, 0x4b, 0x47, 0x42, 0x46, 0x40, 0x31, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0c, 0x01, 0x57, 0x0e, 0x07, 0x4b, 0x47, 0x42, 0x46, 0x40, 0x31, 0x12, 0x85, 0x0f, 0x34, 0x40, 0x07, 0x0c, 0x59, 0x3b, 0x63, 0x63, 0x4d, 0x68, 0x0d, 0x08, 0x4a, 0x47, 0x43, 0x45, 0x40, 0x32, 0x12, 0x86, 0x0f, 0x33, 0x40, 0x07, 0x0d, 0xfe, 0xa8, 0x0d, 0x08, 0x4a, 0x47, 0x43, 0x45, 0x40, 0x32, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x7b, 0x01, 0x58, 0x16, 0xfe, 0xa8, 0xab, 0x14, 0x37, 0x28, 0x40, 0x43, 0x21, 0x02, 0xbf, 0x13, 0x36, 0x28, 0x3e, 0x40, 0x21, 0x04, 0xe2, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xe2, 0x01, 0x37, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xd6, 0x18, 0x4b, 0x7c, 0x92, 0x9c, 0x6f, 0x55, 0x13, 0xfe, 0xbe, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0x24, 0xfe, 0xc3, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0x30, 0x19, 0x49, 0x6f, 0x9b, 0x9c, 0x73, 0x56, 0x13, 0xfd, 0x92, 0x01, 0xf1, 0xfe, 0x21, 0x01, 0xd6, 0x11, 0x2e, 0x4a, 0x68, 0x67, 0x48, 0x24, 0x01, 0xba, 0xfe, 0x2b, 0x10, 0x2f, 0x48, 0x67, 0x6a, 0x47, 0x24, 0x00, 0x05, 0x00, 0x69, 0xfe, 0x4d, 0x07, 0x34, 0x06, 0x0e, 0x00, 0x6d, 0x00, 0x71, 0x00, 0x75, 0x00, 0x7e, 0x00, 0x87, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x21, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x21, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x21, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x21, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x13, 0x21, 0x03, 0x29, 0x01, 0x13, 0x21, 0x03, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x03, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x01, 0xb3, 0x07, 0x4b, 0x47, 0x42, 0x46, 0x40, 0x31, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0c, 0x01, 0x57, 0x0e, 0x07, 0x4b, 0x47, 0x42, 0x46, 0x40, 0x31, 0x12, 0x85, 0x0f, 0x34, 0x40, 0x07, 0x0c, 0x01, 0x57, 0x0e, 0x07, 0x4b, 0x47, 0x42, 0x46, 0x40, 0x32, 0x11, 0x85, 0x0f, 0x34, 0x3f, 0x08, 0x0c, 0x59, 0x3b, 0x63, 0x63, 0x4d, 0x68, 0x0d, 0x07, 0x4b, 0x47, 0x43, 0x45, 0x40, 0x32, 0x11, 0x85, 0x0f, 0x33, 0x40, 0x07, 0x0d, 0xfe, 0xa8, 0x0d, 0x08, 0x4a, 0x47, 0x43, 0x45, 0x40, 0x32, 0x12, 0x86, 0x0f, 0x33, 0x40, 0x07, 0x0d, 0xfe, 0xa8, 0x0d, 0x08, 0x4a, 0x47, 0x43, 0x45, 0x40, 0x32, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x03, 0xc1, 0x16, 0xfe, 0xa8, 0x15, 0xfe, 0x11, 0x01, 0x58, 0x16, 0xfe, 0xa8, 0xab, 0x14, 0x37, 0x28, 0x40, 0x43, 0x21, 0x04, 0xad, 0x13, 0x36, 0x28, 0x3e, 0x40, 0x21, 0x04, 0xe2, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xe2, 0x01, 0x37, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xe2, 0x01, 0x37, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xd6, 0x18, 0x4b, 0x7c, 0x92, 0x9c, 0x6f, 0x55, 0x13, 0xfe, 0xbe, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0x24, 0xfe, 0xc3, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0x24, 0xfe, 0xc3, 0xa7, 0x44, 0x41, 0x46, 0x37, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0x30, 0x19, 0x49, 0x6f, 0x9b, 0x9c, 0x73, 0x56, 0x13, 0xfd, 0x92, 0x01, 0xf1, 0xfe, 0x0f, 0x01, 0xf1, 0xfe, 0x21, 0x01, 0xd6, 0x11, 0x2e, 0x4a, 0x68, 0x67, 0x48, 0x24, 0x01, 0xba, 0xfe, 0x2b, 0x10, 0x2f, 0x48, 0x67, 0x6a, 0x47, 0x24, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4c, 0x03, 0xc3, 0x06, 0x0f, 0x00, 0x33, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x1d, 0x01, 0x37, 0x17, 0x07, 0x23, 0x27, 0x37, 0x17, 0x35, 0x34, 0x27, 0x26, 0x27, 0x03, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x06, 0x07, 0x06, 0x15, 0x23, 0x34, 0x37, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x02, 0xd2, 0x10, 0x34, 0x3f, 0x07, 0x0e, 0x50, 0x38, 0x6c, 0x54, 0x41, 0xab, 0x31, 0xa9, 0x41, 0x53, 0x47, 0x2e, 0x28, 0x27, 0x08, 0x8f, 0x41, 0x47, 0x74, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x27, 0x3a, 0x2a, 0x4d, 0x5c, 0x62, 0x4e, 0x61, 0x10, 0x07, 0x90, 0x40, 0x48, 0x73, 0x12, 0x04, 0xf6, 0x82, 0xaf, 0xfe, 0xb3, 0x18, 0x3f, 0x75, 0x9c, 0x1e, 0x5d, 0x48, 0xbd, 0xbd, 0x48, 0x5d, 0x1e, 0x73, 0x4d, 0x33, 0x0b, 0xfc, 0x67, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x03, 0x88, 0x10, 0x2e, 0x56, 0x72, 0x9b, 0x6d, 0x56, 0x11, 0x01, 0x5f, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x03, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0xb4, 0x06, 0x0e, 0x00, 0x08, 0x00, 0x11, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x25, 0x34, 0x27, 0x03, 0x3e, 0x01, 0x37, 0x27, 0x37, 0x13, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x15, 0x37, 0x17, 0x07, 0x06, 0x07, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x01, 0x8b, 0x14, 0x37, 0x28, 0x40, 0x43, 0x21, 0x01, 0x5a, 0x89, 0x14, 0x37, 0x49, 0x08, 0x79, 0x41, 0x61, 0x10, 0x35, 0x3e, 0x07, 0x0c, 0x50, 0x44, 0x62, 0x41, 0x41, 0x97, 0x17, 0x36, 0x4d, 0x68, 0x0d, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x0e, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x01, 0x4a, 0x01, 0xd6, 0x11, 0x2e, 0x4a, 0x67, 0x68, 0x48, 0x24, 0xe6, 0x99, 0x3b, 0xfe, 0x2b, 0x10, 0x65, 0x13, 0x88, 0x48, 0x02, 0x5d, 0x82, 0xaf, 0xfe, 0xd6, 0x16, 0x4d, 0x6f, 0x7c, 0x48, 0x48, 0xa7, 0x43, 0x3f, 0x5a, 0x13, 0xfe, 0xbe, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x01, 0x31, 0x18, 0x49, 0x6f, 0x9b, 0x9c, 0x73, 0x56, 0x13, 0x01, 0x3c, 0xa4, 0x88, 0x7a, 0x8f, 0x00, 0x00, 0x03, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0xb6, 0x06, 0x0e, 0x00, 0x08, 0x00, 0x12, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x2e, 0x01, 0x27, 0x03, 0x3e, 0x01, 0x37, 0x07, 0x27, 0x13, 0x26, 0x23, 0x22, 0x07, 0x03, 0x1e, 0x01, 0x1f, 0x01, 0x07, 0x27, 0x14, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x01, 0x8b, 0x14, 0x37, 0x28, 0x40, 0x43, 0x21, 0x01, 0x49, 0x20, 0x30, 0x28, 0x14, 0x37, 0x5f, 0x06, 0x4b, 0x40, 0xa0, 0x10, 0x35, 0x3e, 0x07, 0x0c, 0x59, 0x7d, 0x10, 0x94, 0x41, 0x44, 0xae, 0x68, 0x0d, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x0e, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x01, 0x4a, 0x01, 0xd6, 0x11, 0x2e, 0x4a, 0x67, 0x68, 0x48, 0x24, 0x01, 0x36, 0x42, 0x30, 0x12, 0xfe, 0x2b, 0x10, 0x82, 0x40, 0x54, 0x48, 0x02, 0xef, 0x82, 0xaf, 0xfe, 0xd6, 0x18, 0x9d, 0x3f, 0xa4, 0x48, 0x4b, 0x7c, 0xc0, 0x13, 0xfe, 0xbe, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x01, 0x31, 0x18, 0x49, 0x6f, 0x9b, 0x9c, 0x73, 0x56, 0x13, 0x01, 0x3c, 0xa4, 0x88, 0x7a, 0x8f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, 0x00, 0xcd, 0x04, 0x28, 0x04, 0xd5, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xa8, 0xfe, 0x85, 0x10, 0x27, 0x09, 0xa1, 0x02, 0xa5, 0xfe, 0x85, 0x10, 0x07, 0x09, 0xa1, 0x01, 0x26, 0x01, 0x8f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, 0x00, 0xcd, 0x04, 0x28, 0x04, 0xd5, 0x10, 0x27, 0x09, 0xa1, 0x01, 0x26, 0xfe, 0x85, 0x10, 0x27, 0x09, 0xa1, 0x02, 0xa5, 0x01, 0x8f, 0x10, 0x07, 0x09, 0xa1, 0xff, 0xa8, 0x01, 0x8f, 0x00, 0x00, 0xff, 0xff, 0x00, 0x90, 0x00, 0xcd, 0x01, 0x4f, 0x04, 0xd6, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xcc, 0x01, 0x90, 0x10, 0x07, 0x09, 0xa1, 0xff, 0xcc, 0xfe, 0x85, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, 0x00, 0xcd, 0x04, 0x28, 0x04, 0xd5, 0x10, 0x27, 0x09, 0xa1, 0x02, 0xa5, 0x01, 0x8f, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xa8, 0x01, 0x8f, 0x10, 0x27, 0x09, 0xa1, 0x02, 0xa5, 0xfe, 0x85, 0x10, 0x07, 0x09, 0xa1, 0xff, 0xa8, 0xfe, 0x85, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0x02, 0x2d, 0x05, 0x46, 0x04, 0x6a, 0x10, 0x27, 0x09, 0xa1, 0x01, 0xdf, 0x01, 0x24, 0x10, 0x06, 0x08, 0xee, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x9f, 0x05, 0x46, 0x04, 0x6a, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x05, 0x21, 0x15, 0x21, 0x04, 0x87, 0xbe, 0xbe, 0x01, 0xbe, 0xbe, 0xfc, 0x3b, 0x03, 0x03, 0xfc, 0xfd, 0x01, 0x9d, 0xfe, 0x03, 0xcb, 0xfe, 0x95, 0xaa, 0x00, 0xff, 0xff, 0x00, 0xc2, 0x00, 0x9f, 0x05, 0x46, 0x04, 0x6a, 0x10, 0x26, 0x08, 0xee, 0x00, 0x00, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xfd, 0xfe, 0x57, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xfe, 0x01, 0x24, 0x10, 0x27, 0x09, 0xa1, 0x03, 0xc2, 0xfe, 0x57, 0x10, 0x07, 0x09, 0xa1, 0x03, 0xc3, 0x01, 0x24, 0xff, 0xff, 0x00, 0xc3, 0x00, 0x9f, 0x05, 0x46, 0x04, 0x6a, 0x10, 0x26, 0x09, 0x18, 0x00, 0x00, 0x10, 0x27, 0x09, 0xa1, 0x01, 0xde, 0xfe, 0x57, 0x10, 0x07, 0x09, 0xa1, 0x01, 0xdf, 0x01, 0x24, 0x00, 0x01, 0x00, 0xc3, 0x01, 0xd3, 0x05, 0x46, 0x03, 0x32, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0x03, 0x32, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x00, 0x01, 0x00, 0xc3, 0x01, 0xd3, 0x05, 0x46, 0x03, 0x32, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0xc3, 0x5d, 0x98, 0x4e, 0x54, 0x8c, 0x0d, 0x05, 0x05, 0x0a, 0x84, 0x63, 0x58, 0xa1, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x05, 0x06, 0x09, 0x84, 0x63, 0x57, 0xa1, 0x5f, 0x03, 0x32, 0x55, 0x4b, 0x3d, 0x06, 0x02, 0x02, 0x05, 0x3b, 0x45, 0x4e, 0xb3, 0x54, 0x4c, 0x3d, 0x06, 0x02, 0x03, 0x04, 0x3b, 0x45, 0x4e, 0x00, 0x01, 0x00, 0x91, 0x01, 0x31, 0x05, 0x77, 0x03, 0xd4, 0x00, 0x29, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x1e, 0x01, 0x33, 0x15, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x2e, 0x01, 0x23, 0x37, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x02, 0xe7, 0x49, 0x8f, 0x40, 0x4a, 0x5a, 0x01, 0x5e, 0x46, 0x5f, 0x8c, 0x53, 0x5a, 0x80, 0x63, 0x6c, 0xaf, 0x37, 0x3a, 0x9e, 0x41, 0x4a, 0x5a, 0x02, 0x5e, 0x46, 0x01, 0x5e, 0x8d, 0x53, 0x5a, 0x80, 0x63, 0x6c, 0xb1, 0x02, 0x2e, 0x74, 0x74, 0x6c, 0x48, 0x3d, 0x59, 0x9b, 0x4f, 0x9a, 0x48, 0x4c, 0xa2, 0x5c, 0x7d, 0x58, 0x5b, 0x8d, 0x6c, 0x48, 0x3d, 0x59, 0x9b, 0x4f, 0x9a, 0x48, 0x4c, 0xa2, 0x5c, 0x7d, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x57, 0x05, 0x46, 0x04, 0xad, 0x00, 0x11, 0x00, 0x00, 0x01, 0x02, 0x23, 0x22, 0x03, 0x02, 0x27, 0x22, 0x03, 0x23, 0x12, 0x33, 0x32, 0x13, 0x12, 0x17, 0x32, 0x13, 0x05, 0x45, 0x6f, 0xe2, 0xcf, 0x59, 0x5c, 0x5c, 0x68, 0x50, 0x99, 0x6f, 0xe2, 0xcf, 0x5a, 0x5b, 0x5c, 0x68, 0x50, 0x02, 0xd7, 0xfd, 0x80, 0x01, 0xd6, 0x01, 0xdc, 0x01, 0xfe, 0x23, 0x02, 0x80, 0xfe, 0x2a, 0xfe, 0x24, 0x01, 0x01, 0xdd, 0x00, 0x00, 0x01, 0x00, 0xbb, 0x00, 0x00, 0x01, 0xf8, 0x05, 0x02, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x23, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x27, 0x33, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x01, 0xf8, 0xa2, 0x46, 0x3d, 0x34, 0x03, 0x04, 0x02, 0x05, 0x36, 0x44, 0x4c, 0xa2, 0x46, 0x3e, 0x35, 0x05, 0x02, 0x02, 0x05, 0x36, 0x43, 0x68, 0xb4, 0x60, 0x6e, 0x92, 0x0a, 0x08, 0x06, 0x0e, 0x9c, 0x5e, 0x58, 0xac, 0x62, 0x6a, 0xb2, 0x62, 0x6e, 0x92, 0x0c, 0x04, 0x06, 0x10, 0x9a, 0x5e, 0x56, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x9d, 0x05, 0x46, 0x04, 0x6c, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x13, 0x17, 0x03, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x03, 0x27, 0x02, 0x9c, 0x5a, 0x3c, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x54, 0x6c, 0x9c, 0x8b, 0x97, 0x5b, 0x3e, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x56, 0x6d, 0x9a, 0x8b, 0x02, 0x53, 0x20, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x2b, 0x01, 0x7e, 0x46, 0xfe, 0x8c, 0x20, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x2c, 0xfe, 0x85, 0x46, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x10, 0x05, 0x46, 0x03, 0xa2, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x01, 0x21, 0x15, 0x21, 0x05, 0x45, 0x5e, 0xa2, 0x57, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0xfb, 0xdb, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x6f, 0xb3, 0x4e, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x01, 0x88, 0xa8, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x03, 0xf4, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x21, 0x15, 0x21, 0x05, 0x45, 0x5e, 0xa2, 0x57, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0xfb, 0xdb, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xf4, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x09, 0x3d, 0x4b, 0xfe, 0x6b, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x62, 0x05, 0x46, 0x04, 0xd3, 0x00, 0x25, 0x00, 0x26, 0x00, 0x00, 0x01, 0x03, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x23, 0x35, 0x21, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x13, 0x01, 0x04, 0x83, 0xb7, 0x1c, 0x21, 0x41, 0x53, 0x9d, 0x0b, 0x5e, 0xa1, 0x58, 0x3b, 0x48, 0x82, 0x02, 0x5c, 0xfd, 0x3e, 0xa7, 0x7b, 0x61, 0xff, 0x01, 0x70, 0xa6, 0x83, 0x50, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x2d, 0xd7, 0xfd, 0xbe, 0x04, 0x6f, 0xfe, 0xe9, 0x0b, 0x2d, 0x58, 0x22, 0xb2, 0x4f, 0x45, 0x16, 0xba, 0xaa, 0xfe, 0x64, 0x9a, 0xaa, 0xf3, 0x38, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x16, 0x01, 0x49, 0xfc, 0x8d, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0xb8, 0x05, 0x46, 0x04, 0xc1, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x05, 0x45, 0x5e, 0xa2, 0x57, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0xfb, 0xdb, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0xc1, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0xfe, 0x6b, 0xaa, 0xcb, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x18, 0x05, 0x46, 0x04, 0xc1, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x23, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x33, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0xfc, 0xab, 0xd0, 0x01, 0x6d, 0xbc, 0xfd, 0xd7, 0x02, 0xca, 0x7e, 0x64, 0x11, 0xe7, 0xfe, 0x77, 0xbb, 0x02, 0x44, 0xfd, 0x1b, 0x95, 0x64, 0x04, 0xc1, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0xfc, 0x4c, 0xaa, 0xcb, 0xaa, 0x8a, 0x73, 0x17, 0xaa, 0xcb, 0xaa, 0xa0, 0x73, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xf6, 0x05, 0x46, 0x05, 0x42, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x23, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x37, 0x17, 0x03, 0xf2, 0x09, 0x08, 0x43, 0x57, 0x42, 0x66, 0x5e, 0xa1, 0x58, 0x23, 0x27, 0x52, 0x01, 0xf3, 0xfd, 0xbb, 0x62, 0x02, 0xa7, 0xfd, 0x08, 0x5e, 0x83, 0x37, 0xe0, 0x01, 0x32, 0x62, 0xfe, 0x6c, 0x01, 0xe6, 0x6a, 0x2d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x59, 0x78, 0x84, 0x04, 0x22, 0x01, 0x25, 0x1e, 0x5d, 0xb2, 0x4f, 0x45, 0x07, 0xab, 0xaa, 0xcb, 0xaa, 0xc2, 0x4e, 0x74, 0xaa, 0xcb, 0xaa, 0xda, 0x14, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x25, 0xfa, 0x4e, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x10, 0x05, 0x46, 0x03, 0xf4, 0x00, 0x1d, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x08, 0x05, 0x06, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0x02, 0x6f, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x01, 0xda, 0xb2, 0x4f, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x04, 0x02, 0x03, 0x06, 0x3d, 0x4b, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x05, 0x05, 0x46, 0x04, 0xff, 0x00, 0x34, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x03, 0x27, 0x13, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x32, 0x1f, 0x01, 0x13, 0x17, 0x03, 0xa9, 0x33, 0x27, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x39, 0x45, 0x42, 0x84, 0x51, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x76, 0x70, 0x11, 0x7f, 0x94, 0x7c, 0x33, 0x27, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x3a, 0x45, 0x41, 0x83, 0x51, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0xae, 0x91, 0x10, 0x7f, 0x93, 0x03, 0x61, 0x0d, 0x4b, 0x55, 0xb2, 0x4f, 0x45, 0x14, 0xbb, 0x38, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x3b, 0x09, 0xfe, 0x98, 0x40, 0x01, 0x5e, 0x0d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x14, 0xbb, 0x38, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x07, 0x01, 0x66, 0x40, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0xb8, 0x05, 0x46, 0x04, 0xc9, 0x00, 0x1a, 0x00, 0x35, 0x00, 0x39, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x21, 0x15, 0x21, 0x05, 0x45, 0x5e, 0xa2, 0x57, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0x5e, 0xa2, 0x57, 0x65, 0x81, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0xb2, 0x2e, 0x4d, 0x98, 0xfb, 0xdb, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x4c, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0x01, 0xd2, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0xfc, 0xee, 0xaa, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x79, 0x05, 0x46, 0x04, 0xd1, 0x00, 0x1a, 0x00, 0x35, 0x00, 0x50, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x05, 0x45, 0x5e, 0xa2, 0x57, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0x5e, 0xa2, 0x57, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0x5e, 0xa2, 0x57, 0x65, 0x81, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0xb2, 0x2e, 0x4d, 0x98, 0x01, 0xd7, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0x01, 0xd2, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0x01, 0xd2, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x07, 0x3f, 0x4b, 0x00, 0x03, 0x00, 0xc3, 0x00, 0xb8, 0x05, 0x46, 0x04, 0xc1, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x00, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x3f, 0x02, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x23, 0x22, 0x26, 0x27, 0x01, 0x15, 0x21, 0x35, 0x01, 0x15, 0x21, 0x35, 0xc3, 0x5d, 0x98, 0x4e, 0x54, 0x8c, 0x13, 0x0e, 0x84, 0x63, 0x58, 0xa1, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x05, 0x0f, 0x84, 0x63, 0x57, 0xa1, 0x5f, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0xc1, 0x55, 0x4b, 0x3f, 0x07, 0x06, 0x3b, 0x45, 0x4e, 0xb2, 0x53, 0x4c, 0x3d, 0x06, 0x02, 0x07, 0x3b, 0x45, 0x4f, 0xfe, 0xc8, 0xaa, 0xaa, 0xfe, 0x8b, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc2, 0x00, 0xd7, 0x05, 0x46, 0x04, 0x2b, 0x00, 0x09, 0x00, 0x13, 0x00, 0x00, 0x01, 0x20, 0x25, 0x35, 0x04, 0x05, 0x20, 0x25, 0x15, 0x04, 0x05, 0x20, 0x05, 0x15, 0x24, 0x25, 0x04, 0x05, 0x35, 0x24, 0x03, 0x05, 0xfe, 0xfe, 0xfe, 0xbf, 0x01, 0x43, 0x01, 0x00, 0x01, 0x09, 0x01, 0x36, 0xfe, 0xc5, 0xfe, 0xfd, 0x01, 0x07, 0x01, 0x38, 0xfe, 0xc6, 0xfe, 0xfb, 0xfe, 0xfd, 0xfe, 0xc0, 0x01, 0x44, 0x02, 0xd3, 0xa6, 0xb2, 0x95, 0x11, 0xa6, 0xb2, 0x97, 0xb3, 0xa6, 0xb2, 0x97, 0x0f, 0x02, 0xa4, 0xb2, 0x97, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x36, 0x05, 0x46, 0x04, 0xce, 0x00, 0x1c, 0x00, 0x39, 0x00, 0x00, 0x25, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x21, 0x15, 0x23, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x23, 0x35, 0x21, 0x16, 0x17, 0x16, 0x17, 0x16, 0x13, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x35, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x15, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x03, 0x05, 0x3c, 0x29, 0x32, 0x1b, 0x18, 0x04, 0x01, 0x72, 0xef, 0x0d, 0x1a, 0x31, 0x4d, 0x50, 0xb9, 0x51, 0x4d, 0x31, 0x1b, 0x0b, 0xf0, 0x01, 0x73, 0x04, 0x18, 0x1b, 0x32, 0x29, 0x3d, 0x3d, 0x29, 0x32, 0x1b, 0x18, 0x04, 0xfe, 0x8d, 0xf0, 0x0b, 0x1b, 0x31, 0x4d, 0x51, 0xb9, 0x50, 0x4d, 0x31, 0x1a, 0x0d, 0xef, 0xfe, 0x8e, 0x04, 0x18, 0x1b, 0x32, 0x29, 0xd9, 0x04, 0x1e, 0x2c, 0x43, 0x45, 0x5b, 0xa8, 0x3c, 0x30, 0x5b, 0x32, 0x33, 0x33, 0x32, 0x5b, 0x33, 0x39, 0xa8, 0x5c, 0x44, 0x44, 0x2b, 0x1e, 0x03, 0x4e, 0x04, 0x1e, 0x2b, 0x44, 0x44, 0x5c, 0xa8, 0x39, 0x33, 0x5b, 0x32, 0x33, 0x33, 0x32, 0x5b, 0x30, 0x3c, 0xa8, 0x5b, 0x45, 0x43, 0x2c, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x04, 0xce, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x35, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x15, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x15, 0x21, 0x03, 0x05, 0x3d, 0x29, 0x32, 0x1b, 0x18, 0x04, 0xfe, 0x8d, 0xf0, 0x0b, 0x1b, 0x31, 0x4d, 0x51, 0xb9, 0x50, 0x4d, 0x31, 0x1a, 0x0d, 0xef, 0xfe, 0x8e, 0x04, 0x18, 0x1b, 0x32, 0x29, 0xfd, 0x82, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x2b, 0x04, 0x1e, 0x2b, 0x44, 0x44, 0x5c, 0xa8, 0x39, 0x33, 0x5b, 0x32, 0x33, 0x33, 0x32, 0x5b, 0x30, 0x3c, 0xa8, 0x5b, 0x45, 0x43, 0x2c, 0x1e, 0xfd, 0xe3, 0xaa, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x04, 0xff, 0x10, 0x27, 0x09, 0xa1, 0x01, 0xe0, 0x01, 0xb9, 0x10, 0x06, 0x00, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0x00, 0x02, 0x05, 0x46, 0x04, 0xff, 0x10, 0x27, 0x09, 0xa1, 0x01, 0xde, 0xfd, 0xba, 0x10, 0x26, 0x00, 0x20, 0x00, 0x00, 0x10, 0x07, 0x09, 0xa1, 0x01, 0xdf, 0x01, 0xb9, 0xff, 0xff, 0x00, 0xc3, 0x00, 0x05, 0x05, 0x48, 0x04, 0xff, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xfe, 0x01, 0xb9, 0x10, 0x26, 0x00, 0x20, 0x00, 0x00, 0x10, 0x07, 0x09, 0xa1, 0x03, 0xc5, 0xfd, 0xbd, 0xff, 0xff, 0x00, 0xc3, 0x00, 0x05, 0x05, 0x47, 0x04, 0xff, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xfe, 0xfd, 0xbd, 0x10, 0x26, 0x00, 0x20, 0x02, 0x00, 0x10, 0x07, 0x09, 0xa1, 0x03, 0xc3, 0x01, 0xb9, 0xff, 0xff, 0x00, 0xba, 0x01, 0x36, 0x06, 0x7a, 0x03, 0xcf, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xf5, 0xfe, 0xee, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xf5, 0x00, 0x89, 0x10, 0x07, 0x00, 0x20, 0x01, 0x35, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb8, 0x01, 0x36, 0x06, 0x7b, 0x03, 0xcc, 0x10, 0x26, 0x00, 0x20, 0xf5, 0x00, 0x10, 0x27, 0x09, 0xa1, 0x04, 0xf8, 0x00, 0x86, 0x10, 0x07, 0x09, 0xa1, 0x04, 0xf8, 0xfe, 0xee, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x03, 0xa2, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x06, 0x15, 0x14, 0x17, 0x33, 0x36, 0x35, 0x26, 0x27, 0x17, 0x21, 0x15, 0x21, 0x35, 0x21, 0x26, 0x35, 0x34, 0x37, 0x21, 0x35, 0x21, 0x15, 0x21, 0x16, 0x17, 0x14, 0x02, 0x9c, 0x2f, 0x2e, 0xda, 0x2f, 0x01, 0x2e, 0x7e, 0x01, 0x52, 0xfb, 0x7e, 0x01, 0x58, 0x16, 0x18, 0xfe, 0xa6, 0x04, 0x82, 0xfe, 0xaf, 0x17, 0x01, 0x02, 0xfa, 0x30, 0x49, 0x47, 0x30, 0x30, 0x47, 0x47, 0x32, 0xf0, 0xaa, 0xaa, 0x3f, 0x38, 0x3e, 0x3b, 0xa8, 0xa8, 0x1a, 0x5f, 0x38, 0x00, 0x00, 0x04, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0x15, 0x00, 0x03, 0x00, 0x07, 0x00, 0x11, 0x00, 0x20, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x27, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x45, 0x41, 0x5a, 0x5a, 0x83, 0x5a, 0x5b, 0x41, 0x35, 0x60, 0x24, 0x25, 0x26, 0x98, 0x6d, 0x6f, 0x93, 0x96, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x04, 0x44, 0x62, 0x46, 0x45, 0x60, 0x60, 0x8b, 0x62, 0x71, 0x2b, 0x28, 0x28, 0x64, 0x3a, 0x73, 0xa1, 0x9e, 0x76, 0x76, 0xa3, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x05, 0x4b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x11, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x15, 0x26, 0x23, 0x06, 0x07, 0x35, 0x36, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x42, 0xe7, 0xca, 0xca, 0xe7, 0xe5, 0xce, 0xd2, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x03, 0xeb, 0x97, 0xb2, 0x97, 0x02, 0x95, 0xb2, 0x97, 0x00, 0x03, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0x7f, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x13, 0x33, 0x13, 0x23, 0x0b, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x01, 0x07, 0xea, 0xa2, 0xe9, 0x8f, 0xab, 0xa5, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x02, 0x82, 0x02, 0x9d, 0xfd, 0x63, 0x01, 0xd9, 0xfe, 0x27, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0x7f, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x23, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x01, 0x07, 0x96, 0xa5, 0xab, 0x8f, 0xe9, 0xa2, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x05, 0x1f, 0xfe, 0x27, 0x01, 0xd9, 0xfd, 0x63, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0xca, 0x00, 0x03, 0x00, 0x07, 0x00, 0x11, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x13, 0x21, 0x1b, 0x01, 0x21, 0x07, 0x13, 0x27, 0x07, 0x13, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0xe1, 0x01, 0x0d, 0x54, 0x55, 0x01, 0x0c, 0xda, 0x55, 0xdc, 0xdb, 0x54, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x04, 0x4e, 0x01, 0x1c, 0xfe, 0xe4, 0xb0, 0xfe, 0xe4, 0xb0, 0xb0, 0x01, 0x1c, 0x00, 0x00, 0x04, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0xd4, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x03, 0x21, 0x03, 0x33, 0x01, 0x21, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x42, 0x95, 0x01, 0x2c, 0xc8, 0x64, 0x01, 0x04, 0xfd, 0x94, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x04, 0xc0, 0xfe, 0x4e, 0x02, 0x66, 0xfd, 0x1f, 0x00, 0x07, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0x1c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1b, 0x00, 0x30, 0x00, 0x37, 0x00, 0x47, 0x00, 0x4f, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x03, 0x15, 0x21, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x07, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x27, 0x35, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x34, 0x36, 0x33, 0x32, 0x16, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x22, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x2d, 0x38, 0x21, 0x18, 0x62, 0x62, 0x3c, 0x39, 0x39, 0x39, 0x3d, 0xd6, 0xfe, 0xee, 0x46, 0x3b, 0x23, 0x41, 0x1f, 0x20, 0x43, 0x23, 0x57, 0x65, 0x60, 0x52, 0x49, 0x55, 0x3c, 0x36, 0x2c, 0x31, 0x41, 0xb3, 0x3c, 0x3c, 0x12, 0x3a, 0x28, 0x41, 0x53, 0x53, 0x41, 0x28, 0x3a, 0xb9, 0x36, 0x5f, 0x36, 0x36, 0x5f, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x04, 0xbc, 0x37, 0x1e, 0x24, 0x24, 0x33, 0xfe, 0xa0, 0x01, 0x60, 0x33, 0x1c, 0x44, 0x3d, 0xfe, 0xaa, 0x20, 0x44, 0x48, 0x13, 0x12, 0x3e, 0x0f, 0x10, 0x70, 0x60, 0x63, 0x74, 0x69, 0x47, 0x36, 0x42, 0x3f, 0x39, 0x69, 0xda, 0xfd, 0xd0, 0x3d, 0x24, 0x23, 0x74, 0xbe, 0x75, 0x23, 0x67, 0x93, 0x53, 0x53, 0x93, 0x53, 0x00, 0x03, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0x14, 0x00, 0x03, 0x00, 0x07, 0x00, 0x2a, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x5c, 0x1e, 0x54, 0x38, 0x4d, 0x52, 0x50, 0x32, 0x33, 0x3e, 0x49, 0x50, 0x32, 0x34, 0x3d, 0x48, 0x51, 0x51, 0x1b, 0x4d, 0x35, 0x35, 0x4a, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x04, 0x3d, 0x3d, 0x3a, 0x78, 0x6f, 0xfe, 0xb5, 0x01, 0x48, 0x4f, 0x4d, 0x5d, 0x51, 0xfe, 0xca, 0x01, 0x48, 0x50, 0x4c, 0x5e, 0x50, 0xfe, 0xca, 0x02, 0x25, 0x55, 0x32, 0x30, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x06, 0xda, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x33, 0x15, 0x23, 0x37, 0x23, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x07, 0x0e, 0x01, 0x15, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x01, 0xfc, 0x5b, 0x5b, 0x58, 0x56, 0x1a, 0x28, 0x29, 0x19, 0x17, 0x3b, 0x30, 0x24, 0x50, 0x2c, 0x2a, 0x57, 0x2e, 0x53, 0x65, 0x21, 0x28, 0x28, 0x15, 0x12, 0x03, 0x03, 0x03, 0x03, 0xa2, 0xa8, 0xf0, 0xaa, 0x03, 0x01, 0x7f, 0xc8, 0x4e, 0x32, 0x41, 0x2b, 0x2c, 0x1b, 0x2f, 0x18, 0x2d, 0x37, 0x23, 0x21, 0x5e, 0x1c, 0x1c, 0x61, 0x4f, 0x26, 0x45, 0x2b, 0x2b, 0x17, 0x1b, 0x0d, 0x0a, 0x1e, 0x1a, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x27, 0x05, 0x46, 0x04, 0xdd, 0x00, 0x13, 0x00, 0x00, 0x13, 0x21, 0x13, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x03, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0xc3, 0x02, 0xb7, 0xe6, 0x71, 0x9d, 0x01, 0x11, 0xfe, 0x74, 0xaf, 0x02, 0x3b, 0xfd, 0x47, 0xe8, 0x70, 0x9c, 0xfe, 0xf3, 0x01, 0x8b, 0xaf, 0xfd, 0xc6, 0x03, 0xa2, 0x01, 0x3b, 0x66, 0xd5, 0xa8, 0xf0, 0xaa, 0xfe, 0xc7, 0x66, 0xd3, 0xaa, 0xf0, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0xb8, 0x05, 0x46, 0x04, 0x4c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0xd7, 0xaa, 0x02, 0x1f, 0xaa, 0xfd, 0xc0, 0xaa, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xce, 0x05, 0x46, 0x05, 0x34, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x03, 0x39, 0xfd, 0x8a, 0x02, 0xc9, 0x73, 0x8a, 0x49, 0x01, 0x05, 0xfe, 0xa7, 0x66, 0x01, 0xbf, 0xfd, 0xf0, 0x63, 0x02, 0x73, 0xfd, 0x38, 0x74, 0x8a, 0x4a, 0xfe, 0xfa, 0x01, 0x5b, 0x64, 0xfe, 0x41, 0x02, 0x11, 0x03, 0xa2, 0xaa, 0xe8, 0x54, 0x94, 0xaa, 0xcb, 0xaa, 0xcb, 0xaa, 0xea, 0x54, 0x96, 0xaa, 0xcb, 0xaa, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0x09, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x94, 0xaa, 0x02, 0x1f, 0xaa, 0xfc, 0x4b, 0xaa, 0x02, 0x1f, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x09, 0x02, 0x15, 0x01, 0x35, 0x09, 0x01, 0x21, 0x15, 0x21, 0x05, 0x45, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xf8, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0xfc, 0x02, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x09, 0x01, 0x15, 0x21, 0x35, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x61, 0x01, 0x21, 0xfb, 0x7e, 0x03, 0xf8, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0xfd, 0xc7, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc4, 0xff, 0x56, 0x05, 0x46, 0x05, 0x1b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x33, 0x21, 0x15, 0x21, 0x09, 0x02, 0x15, 0x01, 0x35, 0x09, 0x01, 0x21, 0x15, 0x21, 0xc4, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0xaa, 0x05, 0x15, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0xfc, 0x02, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc4, 0xff, 0x56, 0x05, 0x46, 0x05, 0x1b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x21, 0x15, 0x21, 0x35, 0x11, 0x35, 0x01, 0x15, 0x01, 0x35, 0x09, 0x01, 0x15, 0x21, 0x35, 0x05, 0x46, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x01, 0x22, 0xfb, 0x7e, 0xaa, 0xaa, 0x04, 0x6b, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0xfd, 0xc7, 0xaa, 0xaa, 0x00, 0x02, 0x00, 0xc4, 0xfe, 0xb1, 0x05, 0x46, 0x05, 0x1b, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x00, 0x05, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x01, 0xf0, 0xfe, 0xd4, 0x01, 0xab, 0x56, 0xfd, 0xff, 0x02, 0x81, 0x7b, 0x7c, 0x24, 0x01, 0x2e, 0xfe, 0x52, 0x56, 0x02, 0x04, 0xfd, 0x7d, 0x7c, 0x7c, 0x03, 0x7b, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xaa, 0xaa, 0x73, 0xaa, 0xa4, 0x73, 0x31, 0xaa, 0x73, 0xaa, 0xa5, 0x74, 0x05, 0x46, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc4, 0xfe, 0xb1, 0x05, 0x46, 0x05, 0x1b, 0x00, 0x13, 0x00, 0x1a, 0x00, 0x00, 0x05, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x01, 0xf0, 0xfe, 0xd4, 0x01, 0xab, 0x56, 0xfd, 0xff, 0x02, 0x81, 0x7b, 0x7c, 0x24, 0x01, 0x2e, 0xfe, 0x52, 0x56, 0x02, 0x04, 0xfd, 0x7d, 0x7c, 0x7c, 0xfe, 0xf9, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0xaa, 0xaa, 0x73, 0xaa, 0xa4, 0x73, 0x31, 0xaa, 0x73, 0xaa, 0xa5, 0x74, 0x05, 0x46, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x02, 0x00, 0x85, 0x00, 0x2e, 0x07, 0x04, 0x04, 0xdf, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x05, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x07, 0x04, 0xfd, 0x19, 0x02, 0xe7, 0xfc, 0x36, 0x03, 0xca, 0xfd, 0x4c, 0xfd, 0x18, 0x02, 0xe8, 0xfc, 0x36, 0x03, 0xca, 0x04, 0x11, 0xfe, 0x70, 0xfe, 0x72, 0xc5, 0x02, 0x08, 0x9f, 0x02, 0x0a, 0xce, 0xfe, 0x70, 0xfe, 0x72, 0xc5, 0x02, 0x08, 0x9f, 0x02, 0x0a, 0x00, 0x02, 0x00, 0x85, 0x00, 0x2e, 0x07, 0x04, 0x04, 0xdf, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x03, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x86, 0x03, 0xca, 0xfc, 0x36, 0x02, 0xe7, 0x33, 0x03, 0xca, 0xfc, 0x36, 0x02, 0xe7, 0x04, 0x11, 0xce, 0xfd, 0xf6, 0x9f, 0xfd, 0xf8, 0xc5, 0x01, 0x8e, 0x01, 0x90, 0xce, 0xfd, 0xf6, 0x9f, 0xfd, 0xf8, 0xc5, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0xb9, 0x06, 0x12, 0x00, 0x19, 0x00, 0x27, 0x00, 0x00, 0x01, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x21, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x13, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x10, 0x17, 0x16, 0x02, 0x3c, 0x26, 0x1f, 0x50, 0x2f, 0x43, 0x43, 0x2f, 0x50, 0x1f, 0x26, 0xfe, 0xe0, 0x25, 0x1f, 0x50, 0x2f, 0x43, 0x43, 0x2f, 0x50, 0x1f, 0x25, 0x90, 0x13, 0x0f, 0x3b, 0x3a, 0x10, 0x13, 0x14, 0x10, 0x3a, 0x3b, 0x0f, 0x06, 0x12, 0x47, 0x46, 0xa3, 0x9e, 0xe2, 0xdf, 0xe0, 0xe3, 0x9e, 0xa2, 0x47, 0x47, 0x47, 0x47, 0xa2, 0x9e, 0xe3, 0xe0, 0xdf, 0xe2, 0x9e, 0xa3, 0x46, 0x47, 0xfa, 0x32, 0x3b, 0x3b, 0xe2, 0x01, 0xce, 0xe1, 0x3b, 0x3c, 0x3c, 0x3b, 0xe1, 0xfe, 0x32, 0xe2, 0x3b, 0x00, 0x00, 0x01, 0x00, 0xc2, 0x00, 0x1a, 0x05, 0x46, 0x04, 0xe8, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x06, 0x07, 0x35, 0x36, 0x3f, 0x01, 0x26, 0x25, 0x35, 0x04, 0x37, 0x13, 0x17, 0x07, 0x36, 0x37, 0x15, 0x06, 0x0f, 0x01, 0x16, 0x05, 0x15, 0x24, 0x07, 0x03, 0x27, 0x02, 0x1b, 0xa2, 0xb5, 0xee, 0xca, 0x5b, 0xf0, 0xfe, 0xdc, 0x01, 0x86, 0xe6, 0xb1, 0x85, 0x79, 0xa4, 0xb5, 0xec, 0xcd, 0x5a, 0xf5, 0x01, 0x1f, 0xfe, 0x79, 0xe6, 0xb0, 0x86, 0x01, 0x5d, 0x29, 0x5d, 0xb2, 0x6f, 0x26, 0xb6, 0x0e, 0x97, 0xb2, 0xaf, 0x0a, 0x01, 0x62, 0x52, 0xf4, 0x29, 0x60, 0xb2, 0x71, 0x25, 0xb5, 0x0d, 0x98, 0xb2, 0xaf, 0x0b, 0xfe, 0x9f, 0x52, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x05, 0x05, 0x46, 0x05, 0x64, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x00, 0x01, 0x05, 0x15, 0x25, 0x03, 0x27, 0x13, 0x25, 0x35, 0x01, 0x13, 0x17, 0x07, 0x25, 0x15, 0x05, 0x07, 0x0d, 0x01, 0x03, 0x40, 0x02, 0x05, 0xfd, 0xbb, 0x8a, 0x7a, 0x85, 0xfe, 0x42, 0x02, 0xcc, 0x9b, 0x7b, 0x62, 0x01, 0x02, 0xfe, 0xa1, 0xb4, 0xfe, 0x72, 0x01, 0x1d, 0x01, 0xdf, 0xcb, 0xb6, 0xea, 0xfe, 0xbd, 0x40, 0x01, 0x36, 0xb4, 0xa6, 0x01, 0x20, 0x01, 0x6f, 0x40, 0xe6, 0x68, 0xb6, 0x8b, 0x47, 0x9d, 0x70, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xa0, 0x05, 0x46, 0x04, 0xff, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x00, 0x01, 0x25, 0x35, 0x05, 0x13, 0x17, 0x03, 0x05, 0x15, 0x01, 0x03, 0x27, 0x37, 0x05, 0x35, 0x25, 0x37, 0x2d, 0x01, 0x02, 0xc8, 0xfd, 0xfb, 0x02, 0x46, 0x89, 0x7a, 0x84, 0x01, 0xbd, 0xfd, 0x35, 0x9c, 0x7a, 0x62, 0xfe, 0xfd, 0x01, 0x5f, 0xb4, 0x01, 0x8e, 0xfe, 0xe4, 0x03, 0x25, 0xcb, 0xb6, 0xea, 0x01, 0x43, 0x40, 0xfe, 0xca, 0xb4, 0xa6, 0xfe, 0xe0, 0xfe, 0x91, 0x40, 0xe6, 0x68, 0xb6, 0x8b, 0x47, 0x9d, 0x70, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x2f, 0x05, 0x46, 0x05, 0x56, 0x00, 0x02, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x0d, 0x01, 0x03, 0x21, 0x35, 0x21, 0x13, 0x25, 0x35, 0x25, 0x13, 0x17, 0x07, 0x25, 0x15, 0x05, 0x03, 0x05, 0x15, 0x25, 0x03, 0x21, 0x15, 0x21, 0x07, 0x27, 0x03, 0x37, 0xfe, 0xae, 0x01, 0x11, 0xdc, 0xfe, 0xa9, 0x01, 0x91, 0x6c, 0xfe, 0x03, 0x02, 0xb6, 0x6a, 0x94, 0x41, 0x01, 0x0f, 0xfe, 0xaf, 0x67, 0x01, 0xb8, 0xfe, 0x12, 0x5c, 0x02, 0x4a, 0xfd, 0x7d, 0x45, 0x93, 0x03, 0x4f, 0x6c, 0x55, 0xfd, 0x72, 0xaa, 0x01, 0x43, 0xa2, 0xaa, 0xdd, 0x01, 0x40, 0x3d, 0xc7, 0x56, 0xb0, 0x6c, 0xfe, 0xd1, 0x8c, 0xb2, 0x9e, 0xfe, 0xed, 0xaa, 0xd1, 0x3d, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x2f, 0x05, 0x46, 0x05, 0x56, 0x00, 0x02, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x37, 0x27, 0x01, 0x23, 0x35, 0x21, 0x37, 0x05, 0x35, 0x25, 0x37, 0x25, 0x35, 0x05, 0x13, 0x17, 0x03, 0x05, 0x15, 0x05, 0x03, 0x21, 0x15, 0x21, 0x07, 0x27, 0x03, 0x36, 0xee, 0xc0, 0xfe, 0x4d, 0xee, 0x01, 0x27, 0x4e, 0xfe, 0x8b, 0x01, 0xb7, 0x52, 0xfd, 0xf7, 0x02, 0x3f, 0x77, 0x94, 0x73, 0x01, 0xab, 0xfd, 0xaf, 0x62, 0x02, 0xb3, 0xfd, 0x14, 0x46, 0x94, 0x02, 0x97, 0x4c, 0x3e, 0xfc, 0xdf, 0xaa, 0xec, 0x77, 0xb2, 0x8b, 0xf5, 0xa7, 0xb0, 0xb7, 0x01, 0x65, 0x3d, 0xfe, 0xa8, 0x88, 0xaa, 0xbd, 0xfe, 0xd8, 0xaa, 0xd1, 0x3d, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x90, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x00, 0x25, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x57, 0x63, 0x84, 0x09, 0x06, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa1, 0x58, 0x63, 0x84, 0x0a, 0x04, 0x06, 0x0d, 0x8c, 0x54, 0x4e, 0x98, 0x5c, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xf0, 0xb4, 0x4e, 0x44, 0x3a, 0x04, 0x04, 0x02, 0x06, 0x3c, 0x4c, 0x54, 0xb4, 0x4e, 0x44, 0x3a, 0x06, 0x02, 0x02, 0x06, 0x3c, 0x4a, 0x03, 0x5e, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc4, 0xff, 0xb0, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x33, 0x32, 0x36, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x0b, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x09, 0x0b, 0x0d, 0x8c, 0x55, 0x4d, 0x97, 0xfb, 0xdc, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x61, 0x01, 0x0e, 0xb2, 0x4e, 0x46, 0x3c, 0x04, 0x04, 0x06, 0x3e, 0x4c, 0x54, 0xb2, 0x4e, 0x46, 0x3c, 0x04, 0x04, 0x06, 0x3e, 0x4c, 0x03, 0x3e, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x29, 0x05, 0x46, 0x05, 0x50, 0x00, 0x31, 0x00, 0x34, 0x00, 0x00, 0x25, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x13, 0x25, 0x35, 0x25, 0x13, 0x17, 0x07, 0x25, 0x15, 0x05, 0x03, 0x05, 0x15, 0x25, 0x03, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x07, 0x27, 0x01, 0x0d, 0x01, 0x02, 0x2d, 0x1b, 0x0c, 0x4f, 0x9b, 0x58, 0x5e, 0xa1, 0x58, 0x22, 0x27, 0x60, 0xfd, 0xff, 0x02, 0xbb, 0x69, 0x95, 0x3f, 0x01, 0x08, 0xfe, 0xb4, 0x67, 0x01, 0xb3, 0xfe, 0x17, 0x60, 0x06, 0x0a, 0x04, 0x06, 0x0d, 0x8c, 0x54, 0x4e, 0x98, 0x5d, 0x5f, 0xa1, 0x57, 0x63, 0x84, 0x09, 0x06, 0x05, 0x0e, 0x1f, 0x48, 0x95, 0x01, 0x51, 0xfe, 0xaa, 0x01, 0x13, 0x2d, 0x03, 0x4c, 0x54, 0xb4, 0x4e, 0x44, 0x07, 0x01, 0x1d, 0xa3, 0xaa, 0xde, 0x01, 0x39, 0x41, 0xbb, 0x54, 0xb0, 0x6a, 0xfe, 0xcd, 0x8a, 0xb2, 0x9c, 0xfe, 0xe3, 0x02, 0x06, 0x02, 0x02, 0x06, 0x3c, 0x4a, 0x56, 0xb4, 0x4e, 0x44, 0x3a, 0x04, 0x04, 0x02, 0x06, 0x0d, 0xd8, 0x3c, 0x03, 0xec, 0x6e, 0x57, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x2f, 0x05, 0x46, 0x05, 0x56, 0x00, 0x31, 0x00, 0x34, 0x00, 0x00, 0x01, 0x05, 0x15, 0x05, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x03, 0x27, 0x37, 0x06, 0x07, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x3f, 0x01, 0x05, 0x35, 0x25, 0x37, 0x25, 0x35, 0x05, 0x13, 0x17, 0x03, 0x37, 0x27, 0x03, 0xa1, 0x01, 0xa4, 0xfd, 0xb6, 0x54, 0x2b, 0x30, 0x0a, 0x04, 0x06, 0x0d, 0x8c, 0x54, 0x4e, 0x98, 0x5d, 0x5f, 0xa1, 0x57, 0x63, 0x84, 0x09, 0x06, 0x05, 0x0e, 0x41, 0x34, 0x5e, 0x94, 0x4e, 0x32, 0x32, 0x4d, 0x58, 0x5e, 0x51, 0x45, 0x4b, 0x36, 0xfe, 0x8a, 0x01, 0xb8, 0x55, 0xfd, 0xf3, 0x02, 0x43, 0x73, 0x94, 0xd1, 0xe8, 0xb9, 0x03, 0xbf, 0x86, 0xaa, 0xbb, 0xf7, 0x0d, 0x16, 0x04, 0x02, 0x02, 0x06, 0x3e, 0x4c, 0x54, 0xb2, 0x4e, 0x46, 0x3c, 0x04, 0x02, 0x02, 0x06, 0x1d, 0x0f, 0xfe, 0xf1, 0x3d, 0xdf, 0x09, 0x18, 0x26, 0x54, 0xb2, 0x4e, 0x23, 0x1e, 0x04, 0xa1, 0x77, 0xb2, 0x8b, 0xf4, 0xa8, 0xb0, 0xb8, 0x01, 0x66, 0x3d, 0xfd, 0x80, 0x4a, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xbb, 0xff, 0x4e, 0x05, 0x46, 0x05, 0x7d, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x09, 0x03, 0x15, 0x01, 0x35, 0x01, 0xc4, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x01, 0x19, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0x02, 0x27, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x03, 0xbb, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x02, 0x00, 0xbb, 0xff, 0x4e, 0x05, 0x46, 0x05, 0x7d, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x02, 0x15, 0x01, 0x35, 0x09, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x3d, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x87, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x02, 0x27, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x01, 0xf6, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x03, 0x00, 0xbb, 0xfe, 0x6d, 0x05, 0x46, 0x06, 0x60, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x00, 0x2d, 0x02, 0x03, 0x25, 0x35, 0x25, 0x13, 0x17, 0x03, 0x25, 0x15, 0x05, 0x03, 0x05, 0x15, 0x25, 0x07, 0x05, 0x15, 0x05, 0x03, 0x27, 0x13, 0x05, 0x35, 0x25, 0x13, 0x25, 0x35, 0x05, 0x13, 0x0d, 0x01, 0x02, 0xf8, 0x01, 0x2c, 0xfe, 0xfa, 0x57, 0xfd, 0xf4, 0x02, 0x7c, 0x51, 0x95, 0x3e, 0x01, 0x5e, 0xfe, 0x7a, 0x3a, 0x01, 0xc0, 0xfe, 0x1d, 0x1a, 0x02, 0x06, 0xfd, 0x8c, 0x51, 0x96, 0x3e, 0xfe, 0x9b, 0x01, 0x8d, 0x39, 0xfe, 0x3a, 0x01, 0xe9, 0x62, 0xfe, 0xce, 0x01, 0x0d, 0xb3, 0x5f, 0x54, 0x01, 0x57, 0xa7, 0xaa, 0xca, 0x01, 0x88, 0x26, 0xfe, 0xd4, 0x6f, 0xb0, 0x7d, 0xfe, 0xe4, 0x8e, 0xb2, 0x9a, 0x81, 0xa5, 0xaa, 0xc8, 0xfe, 0x77, 0x26, 0x01, 0x2d, 0x72, 0xb2, 0x7e, 0x01, 0x18, 0x91, 0xb0, 0x9b, 0x01, 0xde, 0x62, 0x55, 0x00, 0x00, 0x00, 0x03, 0x00, 0xbb, 0xfe, 0x6d, 0x05, 0x46, 0x06, 0x60, 0x00, 0x02, 0x00, 0x05, 0x00, 0x21, 0x00, 0x00, 0x01, 0x07, 0x17, 0x01, 0x37, 0x2f, 0x01, 0x25, 0x35, 0x05, 0x13, 0x17, 0x03, 0x05, 0x15, 0x05, 0x07, 0x25, 0x15, 0x05, 0x07, 0x05, 0x15, 0x25, 0x03, 0x27, 0x13, 0x25, 0x35, 0x25, 0x37, 0x05, 0x35, 0x25, 0x02, 0x7a, 0x9d, 0x89, 0x01, 0x29, 0x95, 0x83, 0x94, 0xfd, 0xb7, 0x02, 0x6c, 0x58, 0x95, 0x5a, 0x01, 0x83, 0xfe, 0x21, 0x1e, 0x01, 0xf4, 0xfd, 0xe5, 0x28, 0x02, 0x43, 0xfd, 0x9b, 0x57, 0x96, 0x59, 0xfe, 0x77, 0x01, 0xe6, 0x1e, 0xfe, 0x05, 0x02, 0x22, 0x01, 0x44, 0x32, 0x2c, 0x02, 0xa3, 0x2f, 0x2a, 0x2f, 0xbc, 0xb0, 0xc5, 0x01, 0xa8, 0x26, 0xfe, 0x4f, 0x7b, 0xaa, 0x98, 0x94, 0x9f, 0xb0, 0xad, 0xc2, 0xb8, 0xb2, 0xc4, 0xfe, 0x5b, 0x26, 0x01, 0xae, 0x7d, 0xaa, 0x9a, 0x94, 0xa2, 0xb2, 0xad, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xb2, 0x05, 0x46, 0x05, 0x50, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x00, 0x05, 0x04, 0x01, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x05, 0x45, 0xfe, 0x9a, 0xfe, 0x27, 0x01, 0xd5, 0x01, 0x6a, 0xfe, 0x97, 0xfc, 0xe7, 0x03, 0x1b, 0x01, 0x67, 0x04, 0x61, 0xfe, 0x81, 0x61, 0x5e, 0xfe, 0x7e, 0xef, 0x02, 0x00, 0x7c, 0xa6, 0x7c, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xb2, 0x05, 0x46, 0x05, 0x50, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x00, 0x25, 0x24, 0xc3, 0x01, 0x67, 0x03, 0x1b, 0xfc, 0xe7, 0xfe, 0x97, 0x01, 0x6a, 0x01, 0xd5, 0xfe, 0x27, 0x04, 0x61, 0xef, 0xfe, 0x00, 0x7c, 0xa6, 0x7c, 0xfe, 0x00, 0xef, 0x01, 0x82, 0x5e, 0x61, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x29, 0x05, 0x46, 0x05, 0x57, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x21, 0x15, 0x00, 0x25, 0x35, 0x04, 0x01, 0x00, 0x05, 0x04, 0x01, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x05, 0x45, 0xfe, 0x90, 0xfc, 0xee, 0x03, 0x01, 0x01, 0x81, 0xfe, 0xa7, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x59, 0xfe, 0xa7, 0xfc, 0xd7, 0x03, 0x29, 0x01, 0x59, 0xd7, 0x01, 0xbe, 0x91, 0xae, 0x85, 0x02, 0xdf, 0xfe, 0xe5, 0x5d, 0x5d, 0xfe, 0xe5, 0xd7, 0x01, 0x78, 0x84, 0xa6, 0x7c, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x29, 0x05, 0x46, 0x05, 0x57, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x33, 0x00, 0x25, 0x15, 0x04, 0x01, 0x11, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x00, 0x25, 0x24, 0xc3, 0x01, 0x81, 0x03, 0x01, 0xfc, 0xee, 0xfe, 0x90, 0x01, 0x59, 0x03, 0x29, 0xfc, 0xd7, 0xfe, 0xa7, 0x01, 0x59, 0x01, 0xac, 0xfe, 0x54, 0x01, 0xa1, 0x85, 0xae, 0x91, 0xfe, 0x42, 0x05, 0x57, 0xd7, 0xfe, 0x80, 0x7c, 0xa6, 0x84, 0xfe, 0x88, 0xd7, 0x01, 0x1b, 0x5d, 0x5d, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x52, 0x05, 0x46, 0x05, 0x57, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x00, 0x25, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x00, 0x05, 0x04, 0x01, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0xfe, 0xa7, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x59, 0xfe, 0xa7, 0xfc, 0xd7, 0x03, 0x29, 0x01, 0x59, 0xb1, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x04, 0x24, 0xfe, 0xe5, 0x5d, 0x5d, 0xfe, 0xe5, 0xd7, 0x01, 0x78, 0x84, 0xa6, 0x7c, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x52, 0x05, 0x46, 0x05, 0x57, 0x00, 0x1d, 0x00, 0x28, 0x00, 0x00, 0x25, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x00, 0x25, 0x24, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0xfb, 0xdb, 0x01, 0x59, 0x03, 0x29, 0xfc, 0xd7, 0xfe, 0xa7, 0x01, 0x59, 0x01, 0xac, 0xfe, 0x54, 0xb1, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x04, 0x24, 0xd7, 0xfe, 0x80, 0x7c, 0xa6, 0x84, 0xfe, 0x88, 0xd7, 0x01, 0x1b, 0x5d, 0x5d, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x83, 0x05, 0x46, 0x06, 0x1d, 0x00, 0x15, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x26, 0x25, 0x35, 0x24, 0x25, 0x01, 0x17, 0x03, 0x36, 0x37, 0x15, 0x06, 0x07, 0x03, 0x04, 0x17, 0x15, 0x02, 0x25, 0x03, 0x27, 0x01, 0x06, 0x07, 0x16, 0x17, 0x02, 0xa3, 0xd8, 0xfe, 0xf8, 0x01, 0x96, 0x01, 0x25, 0x01, 0x01, 0x76, 0xa7, 0x8e, 0x69, 0xa7, 0xc1, 0x7d, 0x01, 0x06, 0xdf, 0xcc, 0xfe, 0xa8, 0xd3, 0x76, 0x01, 0x47, 0x88, 0x91, 0x71, 0x6a, 0x01, 0xb0, 0x55, 0x29, 0xa6, 0x3f, 0xa5, 0x02, 0x65, 0x4b, 0xfe, 0x74, 0x75, 0x95, 0xef, 0xb3, 0x75, 0xfe, 0xd4, 0x7f, 0xed, 0xef, 0x01, 0x22, 0xa6, 0xfe, 0x09, 0x4b, 0x03, 0x0a, 0x39, 0x1e, 0x17, 0x27, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xe5, 0x05, 0x46, 0x05, 0x7f, 0x00, 0x15, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x16, 0x05, 0x15, 0x04, 0x05, 0x01, 0x27, 0x13, 0x06, 0x07, 0x35, 0x36, 0x37, 0x13, 0x24, 0x27, 0x35, 0x12, 0x05, 0x13, 0x17, 0x01, 0x36, 0x37, 0x26, 0x27, 0x03, 0x65, 0xd8, 0x01, 0x08, 0xfe, 0x6a, 0xfe, 0xdc, 0xfe, 0xfe, 0x76, 0xa7, 0x8e, 0x69, 0xa8, 0xc0, 0x7e, 0xfe, 0xf9, 0xdf, 0xcd, 0x01, 0x57, 0xd4, 0x75, 0xfe, 0xb9, 0x88, 0x91, 0x70, 0x6a, 0x03, 0x52, 0x55, 0x29, 0xa6, 0x3f, 0xa5, 0xfd, 0x9b, 0x4b, 0x01, 0x8c, 0x75, 0x95, 0xef, 0xb3, 0x75, 0x01, 0x2c, 0x7f, 0xed, 0xef, 0xfe, 0xde, 0xa6, 0x01, 0xf7, 0x4b, 0xfc, 0xf6, 0x39, 0x1e, 0x17, 0x27, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb7, 0x00, 0xa3, 0x05, 0x51, 0x04, 0x5f, 0x00, 0x13, 0x00, 0x00, 0x25, 0x21, 0x22, 0x02, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x15, 0x21, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x21, 0x05, 0x51, 0xfd, 0x15, 0xb6, 0xf8, 0x7c, 0x7c, 0xb4, 0x02, 0xed, 0xfd, 0x13, 0x7a, 0xab, 0x54, 0x57, 0x7a, 0x02, 0xed, 0xa3, 0x01, 0x16, 0xc8, 0xc6, 0x8d, 0x8b, 0x96, 0xc0, 0x88, 0x8a, 0x5e, 0x60, 0x00, 0x00, 0x01, 0x00, 0xb7, 0x00, 0xa3, 0x05, 0x51, 0x04, 0x5f, 0x00, 0x13, 0x00, 0x00, 0x37, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x02, 0x23, 0xb8, 0x02, 0xec, 0x7b, 0x56, 0x55, 0xab, 0x7b, 0xfd, 0x14, 0x02, 0xec, 0xb4, 0x7d, 0x7c, 0xf9, 0xb5, 0xa3, 0x96, 0x60, 0x5e, 0x8a, 0x88, 0xc0, 0x96, 0x8b, 0x8d, 0xc6, 0xc8, 0xfe, 0xea, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb7, 0xff, 0x3b, 0x05, 0x51, 0x05, 0xcf, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x1b, 0x01, 0x33, 0x03, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x03, 0x23, 0x13, 0x22, 0x02, 0x35, 0x34, 0x37, 0x36, 0x33, 0x03, 0x45, 0xe1, 0x7a, 0xab, 0x54, 0x57, 0x7a, 0x2b, 0xdf, 0x67, 0x99, 0x67, 0x01, 0x4a, 0xfe, 0x8d, 0xb6, 0x02, 0x29, 0xfd, 0xae, 0x65, 0x99, 0x65, 0xb4, 0xfa, 0x7c, 0x7c, 0xb4, 0x03, 0xc9, 0xc0, 0x88, 0x8a, 0x5e, 0x60, 0x03, 0x26, 0x01, 0x70, 0xfe, 0x90, 0x96, 0xfd, 0x70, 0x96, 0xfe, 0x98, 0x01, 0x68, 0x01, 0x16, 0xc8, 0xc6, 0x8d, 0x8b, 0x00, 0x02, 0x00, 0xb7, 0xff, 0x33, 0x05, 0x51, 0x05, 0xc7, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x0b, 0x01, 0x23, 0x13, 0x21, 0x35, 0x21, 0x13, 0x21, 0x35, 0x21, 0x13, 0x33, 0x03, 0x32, 0x12, 0x15, 0x14, 0x07, 0x06, 0x23, 0x02, 0xc3, 0xe1, 0x7b, 0xab, 0x55, 0x56, 0x7b, 0x2b, 0xdf, 0x67, 0x99, 0x67, 0xfe, 0xb7, 0x01, 0x72, 0xb6, 0xfd, 0xd8, 0x02, 0x52, 0x64, 0x99, 0x64, 0xb4, 0xfa, 0x7c, 0x7d, 0xb4, 0x01, 0x39, 0xc0, 0x88, 0x8a, 0x5e, 0x60, 0xfc, 0xda, 0xfe, 0x90, 0x01, 0x70, 0x96, 0x02, 0x90, 0x96, 0x01, 0x68, 0xfe, 0x98, 0xfe, 0xea, 0xc8, 0xc6, 0x8d, 0x8b, 0x00, 0x02, 0x00, 0xab, 0x00, 0x00, 0x05, 0x46, 0x04, 0xe8, 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0x37, 0x21, 0x15, 0x21, 0x01, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x15, 0x21, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x21, 0xda, 0x04, 0x6b, 0xfb, 0x95, 0x04, 0x6b, 0xfd, 0x14, 0xb5, 0x7c, 0x7d, 0x7d, 0x7c, 0xb4, 0x02, 0xed, 0xfd, 0x13, 0x7b, 0xab, 0x56, 0x56, 0x7a, 0x02, 0xed, 0x96, 0x96, 0x01, 0x2c, 0x8b, 0x8b, 0xc8, 0xc6, 0x8d, 0x8b, 0x96, 0xc0, 0x88, 0x8a, 0x5e, 0x60, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x5e, 0x04, 0xe8, 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0x37, 0x21, 0x15, 0x21, 0x11, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0xc3, 0x04, 0x6c, 0xfb, 0x94, 0x02, 0xed, 0x7a, 0x57, 0x55, 0xab, 0x7b, 0xfd, 0x13, 0x02, 0xed, 0xb4, 0x7c, 0x7d, 0x7d, 0x7c, 0xb5, 0x96, 0x96, 0x01, 0x2c, 0x96, 0x60, 0x5e, 0x8a, 0x88, 0xc0, 0x96, 0x8b, 0x8d, 0xc6, 0xc8, 0x8b, 0x8b, 0x00, 0x02, 0x00, 0xab, 0xff, 0x13, 0x05, 0x46, 0x05, 0xd7, 0x00, 0x09, 0x00, 0x27, 0x00, 0x00, 0x01, 0x21, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x02, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x23, 0x35, 0x21, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x03, 0x6f, 0xfe, 0xe9, 0x7b, 0xab, 0x56, 0x56, 0x7a, 0x23, 0x8d, 0x02, 0x3d, 0xfd, 0x8b, 0x37, 0x02, 0xac, 0xfd, 0x1c, 0x58, 0x79, 0x45, 0xfb, 0x01, 0x32, 0x38, 0xa7, 0x75, 0x7d, 0x7d, 0x7c, 0xb4, 0x01, 0x4f, 0x58, 0x79, 0x44, 0x01, 0x11, 0xfe, 0xb7, 0x04, 0x52, 0xc0, 0x88, 0x8a, 0x5e, 0x60, 0x96, 0x96, 0x96, 0xed, 0x35, 0xb8, 0x96, 0x96, 0x08, 0x83, 0x8b, 0xc8, 0xc6, 0x8d, 0x8b, 0xef, 0x37, 0xb8, 0x96, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x13, 0x05, 0x5e, 0x05, 0xd7, 0x00, 0x09, 0x00, 0x27, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x03, 0x08, 0xa8, 0x7a, 0x57, 0x55, 0x55, 0x3b, 0x4e, 0x89, 0xfd, 0x54, 0x02, 0xe4, 0x58, 0x79, 0x4c, 0x66, 0x4e, 0x7d, 0x7d, 0x7c, 0xb5, 0xde, 0x38, 0x02, 0x96, 0xfd, 0x32, 0x58, 0x79, 0x45, 0xfe, 0xee, 0x01, 0x49, 0x38, 0xfe, 0x7f, 0x01, 0xb8, 0x01, 0xc2, 0x60, 0x5e, 0x8a, 0x88, 0x60, 0x43, 0x14, 0x09, 0x96, 0xef, 0x37, 0xcb, 0x20, 0x58, 0x8d, 0xc6, 0xc8, 0x8b, 0x8b, 0x96, 0x96, 0xed, 0x35, 0xb8, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x02, 0x00, 0xab, 0xff, 0x6a, 0x05, 0x46, 0x04, 0xe9, 0x00, 0x0b, 0x00, 0x20, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x01, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x15, 0x21, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x21, 0x02, 0x7d, 0xfe, 0x5d, 0x02, 0x08, 0x66, 0x6c, 0x28, 0x01, 0xb9, 0xfd, 0xe1, 0x65, 0x6c, 0x02, 0xf0, 0xfd, 0x14, 0xb5, 0x7c, 0x7d, 0x7d, 0x7c, 0xb4, 0x02, 0xed, 0xfd, 0x13, 0x7b, 0xab, 0x56, 0x56, 0x7a, 0x02, 0xed, 0x96, 0x96, 0x5a, 0x3c, 0x96, 0x96, 0x5a, 0x01, 0x69, 0x8b, 0x8b, 0xc8, 0xc6, 0x8d, 0x8b, 0x96, 0xc0, 0x88, 0x8a, 0x5e, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0xab, 0xff, 0x6a, 0x05, 0x46, 0x04, 0xe9, 0x00, 0x0b, 0x00, 0x20, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x02, 0x7d, 0xfe, 0x5d, 0x02, 0x08, 0x66, 0x6c, 0x28, 0x01, 0xb9, 0xfd, 0xe1, 0x65, 0x6c, 0xfe, 0x56, 0x02, 0xed, 0x7a, 0x57, 0x55, 0xab, 0x7b, 0xfd, 0x13, 0x02, 0xed, 0xb4, 0x7c, 0x7d, 0x7d, 0x7c, 0xb5, 0x96, 0x96, 0x5a, 0x3c, 0x96, 0x96, 0x5a, 0x01, 0x69, 0x96, 0x60, 0x5e, 0x8a, 0x88, 0xc0, 0x96, 0x8b, 0x8d, 0xc6, 0xc8, 0x8b, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xed, 0x00, 0x00, 0x04, 0x58, 0x04, 0xa2, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x37, 0x35, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0xee, 0x9a, 0x86, 0x95, 0x95, 0x85, 0x9b, 0xdd, 0xd8, 0xd9, 0xdc, 0xd6, 0xb0, 0x36, 0x68, 0x01, 0x3f, 0xfe, 0xc1, 0x68, 0x36, 0x02, 0x52, 0x02, 0x50, 0xfd, 0xc9, 0xf4, 0xd3, 0xd3, 0xf4, 0x02, 0x37, 0xfd, 0xb0, 0xfe, 0xd8, 0xfe, 0xd6, 0x01, 0x2a, 0xca, 0x2d, 0xc5, 0x3c, 0x75, 0x55, 0x74, 0x3c, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xed, 0x00, 0x00, 0x04, 0x58, 0x04, 0xa2, 0x10, 0x26, 0x09, 0x06, 0x00, 0x00, 0x10, 0x07, 0x09, 0xa1, 0x01, 0x7e, 0xff, 0x33, 0x00, 0x02, 0x00, 0xed, 0x00, 0x05, 0x04, 0x58, 0x04, 0xa7, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x01, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0xee, 0x9a, 0x86, 0x95, 0x95, 0x85, 0x9b, 0xdd, 0xd8, 0xd9, 0xdc, 0x01, 0xe2, 0x99, 0x99, 0x5b, 0x99, 0x99, 0x02, 0x57, 0x02, 0x50, 0xfd, 0xc9, 0xf4, 0xd3, 0xd3, 0xf4, 0x02, 0x37, 0xfd, 0xb0, 0xfe, 0xd8, 0xfe, 0xd6, 0x01, 0x2a, 0x01, 0xe1, 0xab, 0x64, 0xab, 0xab, 0x64, 0xab, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x04, 0x8b, 0x00, 0x07, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfc, 0x17, 0x03, 0xe9, 0xfb, 0x7e, 0x04, 0x8b, 0xaa, 0xfc, 0xc9, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x04, 0x8b, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x05, 0x45, 0xfb, 0x7e, 0x03, 0xe9, 0xfc, 0x17, 0x04, 0x8b, 0xfb, 0x75, 0xaa, 0x03, 0x37, 0xaa, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x56, 0x05, 0x46, 0x05, 0x0b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfc, 0x17, 0x03, 0xe9, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x05, 0x0b, 0xaa, 0xfc, 0xc9, 0xaa, 0x80, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x56, 0x05, 0x46, 0x05, 0x0b, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x01, 0x15, 0x21, 0x35, 0x05, 0x45, 0xfb, 0x7e, 0x03, 0xe9, 0xfc, 0x17, 0x04, 0x82, 0xfb, 0x7e, 0x05, 0x0b, 0xfb, 0x75, 0xaa, 0x03, 0x37, 0xaa, 0xfa, 0xf5, 0xaa, 0xaa, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x04, 0xdb, 0x05, 0x02, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x04, 0xdb, 0x99, 0xfd, 0x1a, 0x99, 0x05, 0x02, 0xfa, 0xfe, 0x04, 0x58, 0xfb, 0xa8, 0x05, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x04, 0xdb, 0x05, 0x02, 0x00, 0x07, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0xc3, 0x99, 0x02, 0xe6, 0x99, 0x05, 0x02, 0xfb, 0xa8, 0x04, 0x58, 0xfa, 0xfe, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x19, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x05, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x03, 0x64, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x01, 0x9f, 0x01, 0x40, 0xfe, 0xc0, 0x99, 0xfe, 0xbf, 0x01, 0x41, 0x04, 0x8e, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x84, 0xfe, 0x9b, 0xaa, 0xfe, 0x9b, 0x01, 0x65, 0xaa, 0x01, 0x65, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x37, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x77, 0x03, 0x1a, 0xfc, 0xe6, 0x01, 0xed, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x02, 0xd7, 0xaa, 0x02, 0x61, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x19, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x07, 0x17, 0x07, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x03, 0x64, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x02, 0xa2, 0xe4, 0xe3, 0x6c, 0xe3, 0xe3, 0x6d, 0xe4, 0xe3, 0x6c, 0xe3, 0xe3, 0x04, 0x8e, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0xfe, 0xbe, 0xfc, 0xfc, 0x78, 0xfc, 0xfd, 0x79, 0xfc, 0xfc, 0x78, 0xfc, 0xfd, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x37, 0x00, 0x00, 0x09, 0x01, 0x17, 0x01, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0xb5, 0x02, 0x32, 0x6c, 0xfd, 0xce, 0x01, 0x43, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x01, 0x86, 0x02, 0x70, 0x78, 0xfd, 0x90, 0x03, 0x80, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x37, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x12, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x02, 0xa5, 0xbe, 0xbe, 0xbf, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x03, 0x01, 0xfe, 0x02, 0x8b, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x00, 0x00, 0x04, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x09, 0x00, 0x18, 0x00, 0x32, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x27, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x04, 0x48, 0x63, 0x63, 0x90, 0x63, 0x64, 0x47, 0x3a, 0x6a, 0x27, 0x29, 0x2a, 0xa7, 0x79, 0x79, 0xa2, 0xa5, 0xd8, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x03, 0x41, 0x6f, 0x50, 0x4f, 0x6d, 0x6d, 0x9e, 0x70, 0x81, 0x31, 0x2e, 0x2d, 0x72, 0x42, 0x84, 0xb7, 0xb4, 0x87, 0x86, 0xba, 0xcc, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x11, 0x00, 0x2b, 0x00, 0x45, 0x00, 0x00, 0x01, 0x0d, 0x01, 0x07, 0x25, 0x11, 0x23, 0x11, 0x05, 0x27, 0x2d, 0x01, 0x37, 0x05, 0x11, 0x33, 0x11, 0x25, 0x02, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x04, 0x72, 0xfe, 0xdd, 0x01, 0x23, 0x2f, 0xfe, 0xef, 0x5c, 0xfe, 0xf0, 0x2f, 0x01, 0x23, 0xfe, 0xdd, 0x2f, 0x01, 0x10, 0x5c, 0x01, 0x11, 0xdf, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x03, 0x31, 0xaf, 0xb0, 0x58, 0xb7, 0xfe, 0xad, 0x01, 0x53, 0xb7, 0x58, 0xb0, 0xaf, 0x59, 0xb7, 0x01, 0x53, 0xfe, 0xad, 0xb7, 0x01, 0x04, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x00, 0x00, 0x00, 0x04, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x21, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0xe4, 0x02, 0x40, 0xfd, 0xc0, 0x02, 0x40, 0xfd, 0xc0, 0x01, 0x80, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x03, 0x6a, 0x88, 0xc0, 0x88, 0x02, 0xf4, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x19, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x13, 0x21, 0x15, 0x21, 0x03, 0x64, 0xc0, 0x54, 0x53, 0x44, 0x45, 0x45, 0x45, 0x45, 0x44, 0x53, 0x54, 0xc0, 0x54, 0x53, 0x44, 0x46, 0x44, 0x44, 0x46, 0x44, 0x53, 0xfe, 0xd0, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x2c, 0x2c, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x5a, 0x2c, 0x2c, 0x2c, 0x2c, 0x5a, 0x58, 0x32, 0x02, 0x41, 0xfd, 0xbf, 0x04, 0x8e, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6d, 0x6a, 0xb8, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0xb8, 0x6a, 0x6d, 0xb8, 0x4d, 0x4c, 0x27, 0xbd, 0x64, 0x62, 0x63, 0x77, 0x76, 0x8c, 0x89, 0x77, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x77, 0x89, 0x8c, 0x76, 0x77, 0x63, 0x62, 0xfe, 0x17, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, 0x2f, 0x03, 0xaa, 0xfb, 0xcf, 0x04, 0xb8, 0xfb, 0x48, 0x02, 0xa9, 0x01, 0x40, 0xfe, 0xc0, 0x99, 0xfe, 0xbf, 0x01, 0x41, 0x04, 0x89, 0xfb, 0xf0, 0x04, 0x10, 0x9b, 0xfa, 0xbf, 0x04, 0x59, 0xfe, 0x9b, 0xaa, 0xfe, 0x9b, 0x01, 0x65, 0xaa, 0x01, 0x65, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x03, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x77, 0x03, 0x1a, 0xfc, 0xe6, 0x48, 0x03, 0xaa, 0xfb, 0xcf, 0x04, 0xb8, 0xfb, 0x48, 0x02, 0xd7, 0xaa, 0x02, 0x5c, 0xfb, 0xf0, 0x04, 0x10, 0x9b, 0xfa, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x09, 0x02, 0x07, 0x09, 0x01, 0x27, 0x09, 0x01, 0x37, 0x09, 0x01, 0x25, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x04, 0xb7, 0xfe, 0xb9, 0x01, 0x47, 0x6d, 0xfe, 0xba, 0xfe, 0xba, 0x6c, 0x01, 0x46, 0xfe, 0xba, 0x6c, 0x01, 0x46, 0x01, 0x46, 0xfc, 0xe5, 0x03, 0xaa, 0xfb, 0xcf, 0x04, 0xb8, 0xfb, 0x48, 0x03, 0xec, 0xfe, 0x96, 0xfe, 0x96, 0x78, 0x01, 0x6a, 0xfe, 0x95, 0x79, 0x01, 0x6a, 0x01, 0x6a, 0x79, 0xfe, 0x95, 0x01, 0x6b, 0x24, 0xfb, 0xf0, 0x04, 0x10, 0x9b, 0xfa, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x02, 0xa5, 0xbe, 0xbe, 0xfe, 0x8a, 0x03, 0xaa, 0xfb, 0xcf, 0x04, 0xb8, 0xfb, 0x48, 0x03, 0x01, 0xfe, 0x02, 0x86, 0xfb, 0xf0, 0x04, 0x10, 0x9b, 0xfa, 0xbf, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x9e, 0x72, 0x04, 0x99, 0xfb, 0x67, 0x05, 0x9a, 0xfd, 0x75, 0x7f, 0xfd, 0x70, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x05, 0xa9, 0x72, 0xfb, 0x67, 0x04, 0x99, 0x72, 0x02, 0x90, 0x7f, 0x02, 0x8b, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x05, 0xa8, 0xfd, 0xb4, 0x73, 0xfd, 0xb5, 0x05, 0x9a, 0x7f, 0xfa, 0xe5, 0x05, 0x1b, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x33, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x9e, 0x02, 0x4b, 0x73, 0x02, 0x4c, 0x7f, 0x05, 0x1b, 0xfa, 0xe5, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x03, 0x23, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x9e, 0x72, 0x02, 0x13, 0xfd, 0xed, 0x05, 0x9a, 0xfd, 0x75, 0x7f, 0xfd, 0x70, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x03, 0x23, 0x05, 0x9a, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x10, 0x72, 0x72, 0x02, 0x13, 0xfd, 0xed, 0x02, 0x13, 0xfd, 0xed, 0x05, 0x9a, 0xfe, 0x24, 0x7f, 0xe4, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x10, 0x72, 0x72, 0x04, 0x99, 0xfb, 0x67, 0x04, 0x99, 0xfb, 0x67, 0x05, 0x9a, 0xfe, 0x24, 0x7f, 0xe4, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x23, 0x11, 0x33, 0x01, 0xdd, 0x72, 0x03, 0x5a, 0xfc, 0xa6, 0xfe, 0xc1, 0x72, 0x72, 0x05, 0x9a, 0xfd, 0x75, 0x7f, 0xfd, 0x70, 0x05, 0x9a, 0x00, 0x03, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x23, 0x11, 0x33, 0x01, 0x10, 0x72, 0x72, 0x02, 0x0c, 0x73, 0x02, 0x1a, 0xfd, 0xe6, 0xfe, 0xc0, 0x72, 0x72, 0x05, 0x9a, 0xfa, 0x66, 0x05, 0x9a, 0xfd, 0x75, 0x7f, 0xfd, 0x70, 0x05, 0x9a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0x00, 0x00, 0x05, 0xa9, 0x05, 0x9a, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x01, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x01, 0x10, 0x72, 0x72, 0x01, 0x3f, 0x72, 0x72, 0x03, 0x5a, 0xfc, 0xa6, 0x03, 0x5a, 0xfc, 0xa6, 0x05, 0x9a, 0xfa, 0x66, 0x05, 0x9a, 0xfe, 0x24, 0x7f, 0xe4, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xff, 0xaf, 0x05, 0xa9, 0x05, 0xeb, 0x00, 0x0f, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x21, 0x01, 0x17, 0x01, 0x21, 0x15, 0x21, 0x01, 0x27, 0x01, 0x21, 0x11, 0x9e, 0x72, 0x01, 0xef, 0x01, 0x32, 0x67, 0xfe, 0xe5, 0x02, 0x2c, 0xfd, 0x9f, 0xfe, 0xcd, 0x68, 0x01, 0x1d, 0xfe, 0x46, 0x05, 0x9a, 0xfd, 0x75, 0x02, 0xdc, 0x35, 0xfd, 0x59, 0x7f, 0xfd, 0x1f, 0x36, 0x02, 0xab, 0xfd, 0x70, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0xaf, 0x05, 0xa9, 0x05, 0xeb, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x01, 0x17, 0x03, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x03, 0x27, 0x13, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x03, 0x37, 0x21, 0x15, 0x04, 0x31, 0x67, 0xd2, 0x01, 0xe3, 0xfd, 0xe8, 0x5f, 0x02, 0x77, 0xfd, 0x54, 0xe8, 0x68, 0xd2, 0xfe, 0x91, 0x72, 0x72, 0x02, 0x38, 0x94, 0x5f, 0xfd, 0xfd, 0x05, 0xeb, 0x35, 0xfe, 0x08, 0x7f, 0xe4, 0x7f, 0xfd, 0xd3, 0x36, 0x01, 0xf7, 0xfe, 0x24, 0x05, 0x9a, 0xfe, 0x24, 0xfe, 0x9d, 0xe4, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0xaf, 0x05, 0xa9, 0x05, 0xeb, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x17, 0x01, 0x21, 0x15, 0x21, 0x01, 0x27, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x01, 0x23, 0x11, 0x33, 0x04, 0xf5, 0x67, 0xfe, 0xe5, 0x01, 0x68, 0xfe, 0x63, 0xfe, 0xcd, 0x67, 0x01, 0x1d, 0xfe, 0xc0, 0x72, 0x72, 0x01, 0x75, 0xfd, 0x4c, 0x72, 0x72, 0x05, 0xeb, 0x35, 0xfd, 0x59, 0x7f, 0xfd, 0x1f, 0x36, 0x02, 0xab, 0xfd, 0x70, 0x05, 0x9a, 0xfd, 0x75, 0xfc, 0xf1, 0x05, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x9d, 0xff, 0xaf, 0x05, 0xa9, 0x05, 0xeb, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x21, 0x13, 0x17, 0x03, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x03, 0x27, 0x13, 0x23, 0x01, 0x23, 0x11, 0x33, 0x01, 0x37, 0x21, 0x15, 0x02, 0x4f, 0x72, 0x72, 0x01, 0xc2, 0xe9, 0x67, 0xd2, 0x01, 0x1a, 0xfe, 0xb1, 0x5f, 0x01, 0xae, 0xfe, 0x1d, 0xe8, 0x68, 0xd2, 0xf9, 0xfe, 0xc1, 0x72, 0x72, 0x02, 0x6d, 0x5f, 0xfe, 0x73, 0x05, 0x9a, 0xfe, 0x24, 0x02, 0x2d, 0x35, 0xfe, 0x08, 0x7f, 0xe4, 0x7f, 0xfd, 0xd3, 0x36, 0x01, 0xf7, 0xfe, 0x24, 0x05, 0x9a, 0xfc, 0xc1, 0xe4, 0xe4, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xa7, 0x05, 0x37, 0x05, 0x5d, 0x00, 0x2a, 0x00, 0x00, 0x13, 0x35, 0x24, 0x25, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x05, 0x04, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x24, 0xc3, 0x01, 0x72, 0x01, 0x20, 0xb4, 0x5b, 0x37, 0x45, 0x38, 0x48, 0x32, 0x67, 0x51, 0x90, 0x7a, 0x9f, 0x85, 0xcd, 0xfe, 0xaf, 0x01, 0x51, 0xcd, 0x85, 0x9f, 0x7a, 0x90, 0x51, 0x67, 0x32, 0x48, 0x38, 0x45, 0x37, 0x5b, 0xb4, 0xfe, 0xe0, 0x02, 0x2e, 0xa8, 0x28, 0x59, 0x37, 0x4f, 0x30, 0x3c, 0x30, 0x3a, 0x3e, 0x7e, 0x6a, 0xa0, 0x79, 0x9f, 0x5b, 0x8c, 0x3c, 0x3c, 0x8c, 0x5b, 0x9f, 0x79, 0xa0, 0x6a, 0x7e, 0x3e, 0x3a, 0x30, 0x3c, 0x30, 0x4f, 0x37, 0x59, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xa7, 0x05, 0x37, 0x05, 0x5d, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x04, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x25, 0x24, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x04, 0x05, 0x05, 0x37, 0xfe, 0x8e, 0xfe, 0xe0, 0xb4, 0x5b, 0x37, 0x45, 0x38, 0x48, 0x32, 0x67, 0x51, 0x90, 0x7a, 0x9f, 0x85, 0xcd, 0x01, 0x51, 0xfe, 0xaf, 0xcd, 0x85, 0x9f, 0x7a, 0x90, 0x51, 0x67, 0x32, 0x48, 0x38, 0x45, 0x37, 0x5b, 0xb4, 0x01, 0x20, 0x01, 0x72, 0x02, 0x2e, 0x28, 0x59, 0x37, 0x4f, 0x30, 0x3c, 0x30, 0x3a, 0x3e, 0x7e, 0x6a, 0xa0, 0x79, 0x9f, 0x5b, 0x8c, 0x3c, 0x3c, 0x8c, 0x5b, 0x9f, 0x79, 0xa0, 0x6a, 0x7e, 0x3e, 0x3a, 0x30, 0x3c, 0x30, 0x4f, 0x37, 0x59, 0x28, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x1e, 0x05, 0x46, 0x04, 0xe6, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x01, 0x11, 0x09, 0x02, 0x35, 0x01, 0x04, 0xac, 0xfc, 0xf8, 0x03, 0xa1, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0x20, 0x02, 0xc4, 0xfe, 0x9e, 0xfd, 0x9c, 0x02, 0x11, 0xa6, 0x02, 0x11, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x1e, 0x05, 0x46, 0x04, 0xe6, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x09, 0x02, 0x03, 0x11, 0x01, 0x15, 0x01, 0x5c, 0x03, 0x08, 0xfc, 0xf8, 0x99, 0x04, 0x82, 0x01, 0x20, 0x01, 0x62, 0x01, 0x62, 0xfc, 0x3a, 0x04, 0xc8, 0xfd, 0xef, 0xa6, 0x00, 0x03, 0x00, 0xc3, 0xff, 0x9e, 0x05, 0x46, 0x05, 0x64, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x17, 0x35, 0x21, 0x15, 0x03, 0x11, 0x09, 0x02, 0x35, 0x01, 0xc3, 0x04, 0x82, 0x99, 0xfc, 0xf8, 0x03, 0xa1, 0xfb, 0x7e, 0x04, 0x82, 0x62, 0xaa, 0xaa, 0x02, 0x00, 0x02, 0xc4, 0xfe, 0x9e, 0xfd, 0x9c, 0x02, 0x11, 0xa6, 0x02, 0x11, 0x00, 0x03, 0x00, 0xc3, 0xff, 0x9e, 0x05, 0x46, 0x05, 0x64, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x17, 0x35, 0x21, 0x15, 0x09, 0x02, 0x03, 0x11, 0x01, 0x15, 0xc3, 0x04, 0x82, 0xfc, 0x17, 0x03, 0x08, 0xfc, 0xf8, 0x99, 0x04, 0x82, 0x62, 0xaa, 0xaa, 0x02, 0x00, 0x01, 0x62, 0x01, 0x62, 0xfc, 0x3a, 0x04, 0xc8, 0xfd, 0xef, 0xa6, 0x00, 0x02, 0x00, 0x6c, 0x01, 0x67, 0x06, 0xc7, 0x03, 0xa2, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x27, 0x26, 0x27, 0x21, 0x06, 0x07, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x17, 0x16, 0x17, 0x21, 0x36, 0x04, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x05, 0x0f, 0x4b, 0xd3, 0x99, 0x96, 0xda, 0x49, 0x2e, 0x11, 0xfd, 0x96, 0x12, 0x2e, 0x4c, 0xd9, 0x92, 0x95, 0xd4, 0x4e, 0x2f, 0x11, 0x02, 0x6a, 0x12, 0xfc, 0xc1, 0x67, 0x47, 0x47, 0x68, 0x47, 0x03, 0x4f, 0x53, 0xa8, 0xef, 0xa4, 0x51, 0x33, 0x43, 0x42, 0x33, 0x52, 0xa2, 0xf2, 0xa7, 0x55, 0x34, 0x43, 0x44, 0x0e, 0x50, 0x72, 0x4f, 0x4f, 0x71, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6c, 0x01, 0x67, 0x06, 0xc7, 0x03, 0xa2, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x17, 0x16, 0x17, 0x21, 0x36, 0x37, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x27, 0x26, 0x27, 0x21, 0x06, 0x24, 0x32, 0x36, 0x34, 0x26, 0x22, 0x06, 0x14, 0x02, 0x24, 0x4b, 0xd3, 0x99, 0x96, 0xda, 0x49, 0x2e, 0x11, 0x02, 0x6a, 0x12, 0x2e, 0x4c, 0xd9, 0x92, 0x95, 0xd4, 0x4e, 0x2f, 0x11, 0xfd, 0x96, 0x12, 0x03, 0x3f, 0x67, 0x47, 0x47, 0x67, 0x48, 0x01, 0xba, 0x53, 0xa8, 0xef, 0xa4, 0x51, 0x33, 0x43, 0x42, 0x33, 0x52, 0xa2, 0xf2, 0xa7, 0x55, 0x34, 0x43, 0x44, 0x0e, 0x50, 0x72, 0x4f, 0x4f, 0x71, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x58, 0x01, 0x67, 0x05, 0xb1, 0x03, 0xa2, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x00, 0x13, 0x37, 0x21, 0x36, 0x37, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x26, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x58, 0x01, 0x03, 0x60, 0x11, 0x2c, 0x52, 0xd4, 0x94, 0x92, 0xd9, 0x4b, 0x2f, 0x11, 0x01, 0x71, 0x47, 0x68, 0x48, 0x48, 0x68, 0x47, 0x02, 0x2e, 0xa8, 0x44, 0x2f, 0x59, 0xa7, 0xf2, 0xa2, 0x52, 0x33, 0x42, 0x8e, 0x50, 0x51, 0x71, 0x4f, 0x4f, 0x00, 0x00, 0x00, 0x04, 0x00, 0x6c, 0xff, 0xa0, 0x05, 0x9c, 0x05, 0x64, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x33, 0x11, 0x23, 0x05, 0x21, 0x15, 0x21, 0x03, 0x23, 0x11, 0x33, 0x25, 0x21, 0x35, 0x21, 0x02, 0xb9, 0x97, 0x97, 0x01, 0x0a, 0x01, 0xd9, 0xfe, 0x27, 0x73, 0x97, 0x97, 0xfe, 0xf5, 0xfe, 0x28, 0x01, 0xd8, 0x05, 0x64, 0xfd, 0xf3, 0x80, 0xaa, 0xfd, 0x73, 0x02, 0x0d, 0x80, 0xaa, 0x00, 0x00, 0x01, 0x00, 0xd6, 0x00, 0x00, 0x02, 0xea, 0x05, 0x9b, 0x00, 0x07, 0x00, 0x00, 0x21, 0x23, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x02, 0x19, 0x72, 0xd1, 0x02, 0x13, 0xd0, 0x05, 0x1c, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x92, 0x05, 0xec, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x33, 0x35, 0x21, 0x15, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0xb4, 0x03, 0xdd, 0xfc, 0x5c, 0xb0, 0x01, 0x06, 0x01, 0x05, 0xb0, 0xfe, 0xbb, 0xe1, 0xaa, 0xaa, 0x05, 0xec, 0xfc, 0x54, 0x03, 0xac, 0xfb, 0x5e, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x92, 0x05, 0xec, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x13, 0x01, 0x33, 0x01, 0x23, 0x09, 0x01, 0xb4, 0x03, 0xdd, 0xfc, 0x23, 0x39, 0x01, 0x45, 0xe1, 0x01, 0x45, 0xb0, 0xfe, 0xfb, 0xfe, 0xfa, 0x05, 0xec, 0xaa, 0xfa, 0xbe, 0x04, 0xa2, 0xfb, 0x5e, 0x03, 0xac, 0xfc, 0x54, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x92, 0x05, 0xec, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x17, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0xb4, 0x03, 0xdd, 0xfc, 0x23, 0x39, 0xb0, 0x01, 0x06, 0x01, 0x05, 0xb0, 0xfe, 0xbb, 0xe1, 0x05, 0xec, 0xaa, 0xa0, 0xfc, 0x54, 0x03, 0xac, 0xfb, 0x5e, 0x00, 0x02, 0x00, 0xfe, 0x00, 0x00, 0x05, 0x0a, 0x04, 0x7e, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x17, 0x33, 0x01, 0x11, 0x21, 0x26, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x05, 0x0a, 0xfb, 0xf5, 0x99, 0x51, 0x4d, 0x95, 0xd6, 0x3f, 0x21, 0x10, 0xf9, 0xfc, 0x8e, 0x02, 0x0b, 0x0e, 0x18, 0x37, 0xba, 0x80, 0x39, 0x04, 0x7e, 0xfe, 0xeb, 0x12, 0x25, 0x46, 0xee, 0xa4, 0x56, 0x5a, 0x02, 0x44, 0xfd, 0xbc, 0x41, 0x3f, 0x8f, 0xce, 0x3d, 0x1b, 0x00, 0x00, 0x00, 0x02, 0x00, 0xfe, 0x00, 0x00, 0x05, 0x0a, 0x04, 0x7e, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x09, 0x01, 0x21, 0x05, 0x35, 0x01, 0x33, 0x11, 0x04, 0x71, 0xfd, 0x27, 0x02, 0xd9, 0xfc, 0x8e, 0x03, 0x72, 0x99, 0x03, 0xd4, 0xfc, 0xd6, 0xaa, 0xaa, 0x03, 0xd4, 0xfb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0x77, 0x05, 0xee, 0x05, 0xc1, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x03, 0x58, 0x02, 0x95, 0xb6, 0xfd, 0xbd, 0xfd, 0xbd, 0xb6, 0x02, 0x93, 0x05, 0xc1, 0xf8, 0xb6, 0x06, 0x77, 0xf9, 0x89, 0x07, 0x4a, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0x77, 0x05, 0xee, 0x05, 0xc1, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x02, 0x90, 0xfd, 0x6b, 0xb6, 0x02, 0x43, 0x02, 0x43, 0xb6, 0xfd, 0x6d, 0xfe, 0x77, 0x07, 0x4a, 0xf9, 0x89, 0x06, 0x77, 0xf8, 0xb6, 0x00, 0x00, 0x01, 0x00, 0x7e, 0xfe, 0x77, 0x05, 0x6a, 0x05, 0xc1, 0x00, 0x10, 0x00, 0x00, 0x01, 0x22, 0x04, 0x15, 0x11, 0x23, 0x11, 0x10, 0x00, 0x20, 0x00, 0x19, 0x01, 0x23, 0x11, 0x34, 0x24, 0x02, 0xf4, 0xc5, 0xfe, 0xea, 0x9b, 0x01, 0x90, 0x01, 0xcc, 0x01, 0x90, 0x9b, 0xfe, 0xec, 0x05, 0x1d, 0xe3, 0xfc, 0xfb, 0x39, 0x04, 0xe0, 0x01, 0x42, 0x01, 0x28, 0xfe, 0xd8, 0xfe, 0xbe, 0xfb, 0x20, 0x04, 0xc7, 0xfa, 0xe5, 0x00, 0x01, 0x00, 0x7e, 0xfe, 0x77, 0x05, 0x6a, 0x05, 0xc1, 0x00, 0x10, 0x00, 0x00, 0x05, 0x32, 0x24, 0x35, 0x11, 0x33, 0x11, 0x10, 0x00, 0x20, 0x00, 0x19, 0x01, 0x33, 0x11, 0x14, 0x04, 0x02, 0xf4, 0xc5, 0x01, 0x16, 0x9b, 0xfe, 0x70, 0xfe, 0x34, 0xfe, 0x70, 0x9b, 0x01, 0x14, 0xe5, 0xe3, 0xfc, 0x04, 0xc7, 0xfb, 0x20, 0xfe, 0xbe, 0xfe, 0xd8, 0x01, 0x28, 0x01, 0x42, 0x04, 0xe0, 0xfb, 0x39, 0xfa, 0xe5, 0x00, 0xff, 0xff, 0x00, 0x05, 0xfe, 0x23, 0x03, 0x8a, 0x06, 0x75, 0x12, 0x06, 0x0a, 0xf3, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc5, 0x02, 0x48, 0x01, 0x83, 0x03, 0x46, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0xc5, 0xbe, 0xbe, 0x03, 0x46, 0xfe, 0x00, 0x01, 0x00, 0xe0, 0x01, 0x31, 0x03, 0xa2, 0x04, 0x19, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x1b, 0x01, 0x21, 0x07, 0x13, 0x27, 0x07, 0x13, 0xe0, 0x01, 0x0d, 0x54, 0x55, 0x01, 0x0c, 0xda, 0x54, 0xdb, 0xdb, 0x54, 0x02, 0xfd, 0x01, 0x1c, 0xfe, 0xe4, 0xb0, 0xfe, 0xe4, 0xb0, 0xb0, 0x01, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x1e, 0x05, 0x46, 0x04, 0xe7, 0x00, 0x03, 0x00, 0x07, 0x00, 0x19, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x03, 0x21, 0x35, 0x21, 0x01, 0x37, 0x09, 0x01, 0x17, 0x01, 0x21, 0x15, 0x21, 0x01, 0x07, 0x09, 0x01, 0x27, 0x02, 0x96, 0xdd, 0xdd, 0xdd, 0xdd, 0x4a, 0xfe, 0x77, 0x01, 0x89, 0xfe, 0xb0, 0x6c, 0x01, 0x9c, 0x01, 0x9c, 0x6c, 0xfe, 0xb1, 0x01, 0x88, 0xfe, 0x78, 0x01, 0x4f, 0x6c, 0xfe, 0x64, 0xfe, 0x64, 0x6c, 0x01, 0x13, 0xf5, 0x04, 0xc9, 0xf6, 0xfe, 0x3c, 0xaa, 0x01, 0x75, 0x78, 0xfe, 0x36, 0x01, 0xca, 0x78, 0xfe, 0x8b, 0xaa, 0xfe, 0x8b, 0x78, 0x01, 0xca, 0xfe, 0x36, 0x78, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x05, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x00, 0x17, 0x11, 0x09, 0x01, 0x11, 0x01, 0x27, 0x01, 0x11, 0x09, 0x01, 0x11, 0xc3, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0x2a, 0x8c, 0xfe, 0x4e, 0x02, 0xc9, 0x01, 0xb2, 0x3e, 0x05, 0x80, 0xfd, 0xb0, 0x02, 0x50, 0xfa, 0x80, 0x02, 0x4e, 0x71, 0x01, 0x5e, 0xfd, 0x44, 0x01, 0x5e, 0xfe, 0xa2, 0x02, 0xc6, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x15, 0x09, 0x01, 0x11, 0x09, 0x01, 0x15, 0x01, 0x21, 0x01, 0x11, 0x06, 0x70, 0xfd, 0x2a, 0xfd, 0x29, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0xb5, 0xfe, 0xe9, 0xfe, 0x4e, 0xa2, 0xe0, 0x02, 0x4e, 0xfd, 0xb2, 0x05, 0x80, 0xfd, 0xb0, 0x02, 0x50, 0xdd, 0xfe, 0x1c, 0x01, 0x5e, 0xfd, 0x44, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x35, 0x09, 0x01, 0x11, 0x09, 0x01, 0x35, 0x01, 0x21, 0x01, 0x11, 0xc3, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0x2a, 0xfd, 0x29, 0x02, 0x4b, 0x01, 0x17, 0x01, 0xb2, 0x04, 0x62, 0xe0, 0xfd, 0xb2, 0x02, 0x4e, 0xfa, 0x80, 0x02, 0x50, 0xfd, 0xb0, 0xdd, 0x01, 0xe4, 0xfe, 0xa2, 0x02, 0xbc, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x07, 0x00, 0x00, 0x17, 0x35, 0x09, 0x01, 0x35, 0x01, 0x15, 0x01, 0xc3, 0x02, 0x4b, 0xfd, 0xb5, 0x05, 0xad, 0xfd, 0x2a, 0x3e, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0xdd, 0xfb, 0x5d, 0xdd, 0x02, 0x50, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x07, 0x00, 0x00, 0x05, 0x09, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x06, 0x70, 0xfd, 0x2a, 0xfd, 0x29, 0x05, 0xad, 0xfd, 0xb5, 0x02, 0x4b, 0x3e, 0x02, 0x50, 0xfd, 0xb0, 0xdd, 0x04, 0xa3, 0xdd, 0xfe, 0x1e, 0xfe, 0x1f, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x01, 0x60, 0x05, 0x46, 0x03, 0xf4, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x00, 0x13, 0x1e, 0x01, 0x33, 0x32, 0x3f, 0x02, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x23, 0x22, 0x26, 0x27, 0x01, 0x15, 0x21, 0x35, 0xc3, 0x5d, 0x98, 0x4e, 0x54, 0x8c, 0x13, 0x0e, 0x84, 0x63, 0x58, 0xa1, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x05, 0x0f, 0x84, 0x63, 0x57, 0xa1, 0x5f, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xf4, 0x55, 0x4b, 0x3d, 0x09, 0x06, 0x3b, 0x45, 0x4e, 0xb2, 0x53, 0x4c, 0x3d, 0x06, 0x02, 0x07, 0x3b, 0x45, 0x4f, 0xfe, 0xc8, 0xaa, 0xaa, 0x00, 0x01, 0x00, 0x59, 0x00, 0x00, 0x04, 0xed, 0x04, 0xa2, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x33, 0x00, 0x13, 0x12, 0x01, 0x33, 0x00, 0x03, 0x23, 0x02, 0x59, 0xc2, 0x01, 0x4f, 0x39, 0x42, 0x01, 0x46, 0xc2, 0xfe, 0x65, 0x5b, 0xa8, 0x5b, 0x04, 0xa2, 0xfe, 0x90, 0xfe, 0x25, 0x01, 0xda, 0x01, 0x71, 0xfe, 0x81, 0xfc, 0xdd, 0x03, 0x23, 0x00, 0x00, 0x01, 0x00, 0x59, 0x00, 0x00, 0x04, 0xed, 0x04, 0xa2, 0x00, 0x0a, 0x00, 0x00, 0x33, 0x00, 0x13, 0x33, 0x12, 0x01, 0x23, 0x00, 0x03, 0x02, 0x01, 0x59, 0x01, 0x9b, 0x5b, 0xa8, 0x5b, 0x01, 0x9b, 0xc2, 0xfe, 0xba, 0x42, 0x39, 0xfe, 0xb1, 0x01, 0x7f, 0x03, 0x23, 0xfc, 0xdd, 0xfe, 0x81, 0x01, 0x71, 0x01, 0xda, 0xfe, 0x25, 0xfe, 0x90, 0x00, 0x02, 0x00, 0xab, 0xff, 0xfa, 0x05, 0x46, 0x05, 0x0a, 0x00, 0x13, 0x00, 0x29, 0x00, 0x00, 0x01, 0x21, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x21, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x33, 0x21, 0x15, 0x21, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x21, 0x05, 0x45, 0xfd, 0xad, 0x34, 0x24, 0x24, 0x48, 0x34, 0x02, 0x53, 0xfd, 0xac, 0x73, 0x51, 0x50, 0xa0, 0x74, 0x02, 0x54, 0xfd, 0xad, 0xf4, 0xa9, 0xaa, 0xaa, 0xa7, 0xf4, 0x02, 0x55, 0xfd, 0xac, 0xb4, 0x7c, 0x7d, 0x7d, 0x7c, 0xb5, 0x02, 0x53, 0x03, 0x0c, 0x28, 0x29, 0x39, 0x3a, 0x50, 0xaa, 0x5a, 0x58, 0x82, 0x80, 0xb4, 0xfc, 0x44, 0xbd, 0xbe, 0x01, 0x0d, 0x01, 0x0c, 0xbf, 0xbd, 0xaa, 0x8b, 0x8d, 0xc6, 0xc8, 0x8b, 0x8b, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xfa, 0x05, 0x5e, 0x05, 0x0a, 0x00, 0x13, 0x00, 0x29, 0x00, 0x00, 0x13, 0x35, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x21, 0x35, 0x21, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0xc3, 0x02, 0x54, 0x74, 0xa0, 0x50, 0x51, 0x73, 0xfd, 0xac, 0x02, 0x53, 0x34, 0x48, 0x24, 0x24, 0x34, 0xfd, 0xad, 0x02, 0x53, 0xb5, 0x7c, 0x7d, 0x7d, 0x7c, 0xb4, 0xfd, 0xac, 0x02, 0x55, 0xf4, 0xa7, 0xaa, 0xaa, 0xa9, 0xf4, 0x03, 0x0c, 0xaa, 0xb4, 0x80, 0x82, 0x58, 0x5a, 0xaa, 0x50, 0x3a, 0x39, 0x29, 0x28, 0xfc, 0xee, 0xaa, 0x8b, 0x8b, 0xc8, 0xc6, 0x8d, 0x8b, 0xaa, 0xbd, 0xbf, 0xfe, 0xf4, 0xfe, 0xf3, 0xbe, 0xbd, 0x00, 0x00, 0x02, 0x00, 0xbd, 0x00, 0x00, 0x05, 0x4c, 0x05, 0x4e, 0x00, 0x11, 0x00, 0x24, 0x00, 0x00, 0x21, 0x11, 0x34, 0x26, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x10, 0x00, 0x20, 0x17, 0x16, 0x19, 0x01, 0x23, 0x11, 0x34, 0x27, 0x26, 0x20, 0x07, 0x06, 0x15, 0x11, 0x03, 0x80, 0x48, 0x68, 0x48, 0x99, 0x51, 0x4f, 0x75, 0x73, 0xa2, 0xfc, 0xa4, 0x01, 0x56, 0x01, 0xe2, 0xad, 0xa9, 0x99, 0x7c, 0x7e, 0xfe, 0x98, 0x7c, 0x7e, 0x02, 0xc6, 0x3a, 0x50, 0x50, 0x3a, 0xfd, 0x3a, 0x02, 0xc8, 0x80, 0x5a, 0x58, 0xb2, 0x80, 0xfd, 0x38, 0x02, 0xc6, 0x01, 0x10, 0x01, 0x78, 0xbc, 0xba, 0xfe, 0xf0, 0xfd, 0x38, 0x02, 0xc8, 0xc8, 0x8a, 0x8a, 0x8a, 0x8a, 0xca, 0xfd, 0x3a, 0x00, 0x00, 0x00, 0x02, 0x00, 0xbd, 0xff, 0xe3, 0x05, 0x4c, 0x05, 0x31, 0x00, 0x11, 0x00, 0x24, 0x00, 0x00, 0x01, 0x11, 0x14, 0x16, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x11, 0x10, 0x00, 0x20, 0x27, 0x26, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x11, 0x02, 0x88, 0x48, 0x68, 0x48, 0x99, 0x51, 0x4f, 0x75, 0x73, 0xa2, 0x03, 0x5c, 0xfe, 0xaa, 0xfe, 0x1e, 0xad, 0xa9, 0x99, 0x7c, 0x7e, 0x01, 0x68, 0x7c, 0x7e, 0x05, 0x31, 0xfd, 0x3a, 0x3a, 0x50, 0x50, 0x3a, 0x02, 0xc6, 0xfd, 0x38, 0x80, 0x5a, 0x58, 0xb2, 0x80, 0x02, 0xc8, 0xfd, 0x3a, 0xfe, 0xf0, 0xfe, 0x88, 0xbc, 0xba, 0x01, 0x10, 0x02, 0xc8, 0xfd, 0x38, 0xc8, 0x8a, 0x8a, 0x8a, 0x8a, 0xca, 0x02, 0xc6, 0x00, 0x01, 0x01, 0x56, 0x00, 0x00, 0x04, 0xb3, 0x05, 0xd5, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x34, 0x27, 0x26, 0x27, 0x11, 0x23, 0x11, 0x06, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x37, 0x36, 0x37, 0x11, 0x33, 0x11, 0x16, 0x17, 0x16, 0x15, 0x11, 0x23, 0x04, 0x19, 0x51, 0x34, 0x43, 0x99, 0x44, 0x34, 0x51, 0x99, 0x7e, 0x61, 0x83, 0x99, 0x84, 0x61, 0x7c, 0x99, 0x02, 0x9f, 0x80, 0x59, 0x3a, 0x14, 0xfc, 0x3a, 0x03, 0xc6, 0x13, 0x3a, 0x5a, 0x80, 0xfd, 0x61, 0x02, 0x9d, 0xc8, 0x8c, 0x6c, 0x17, 0x01, 0x61, 0xfe, 0x9f, 0x17, 0x6c, 0x8a, 0xc8, 0xfd, 0x61, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x34, 0x05, 0x46, 0x05, 0xd5, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x00, 0x05, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x27, 0x35, 0x23, 0x15, 0x03, 0xea, 0x99, 0x99, 0x99, 0xfe, 0xa4, 0x01, 0x5c, 0xfe, 0xa4, 0x01, 0x5c, 0x99, 0x99, 0x99, 0x01, 0x5b, 0xfe, 0xa5, 0x01, 0x5b, 0xfe, 0xa5, 0x99, 0x99, 0xcc, 0x02, 0x2c, 0xfd, 0xd4, 0x02, 0x2c, 0xaa, 0xf0, 0xa8, 0x02, 0x33, 0xfd, 0xcd, 0x02, 0x33, 0xfd, 0xcd, 0xa8, 0xf0, 0xaa, 0xaa, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x5e, 0x05, 0x46, 0x04, 0xa6, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x04, 0x2d, 0xbe, 0xbe, 0x01, 0x18, 0xfc, 0x5f, 0x03, 0xa1, 0xfb, 0x7e, 0x04, 0x82, 0x03, 0x00, 0xfe, 0x01, 0xee, 0xfe, 0x91, 0xfe, 0x93, 0xb6, 0x01, 0xd1, 0xa6, 0x01, 0xd1, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x5e, 0x05, 0x46, 0x04, 0xa6, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x03, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x01, 0x1d, 0xbe, 0xbe, 0x5a, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x9f, 0x03, 0x00, 0xfe, 0x01, 0xee, 0xb6, 0xfe, 0x2f, 0xa6, 0xfe, 0x2f, 0xb6, 0x01, 0x6d, 0x00, 0x03, 0x00, 0x85, 0x00, 0x2e, 0x09, 0xb8, 0x04, 0xdf, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x00, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x05, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x09, 0xb8, 0xfd, 0x18, 0x02, 0xe8, 0xfc, 0x35, 0x03, 0xcb, 0xfd, 0x4c, 0xfd, 0x19, 0x02, 0xe7, 0xfc, 0x36, 0x03, 0xca, 0xfd, 0x4b, 0xfd, 0x19, 0x02, 0xe7, 0xfc, 0x36, 0x03, 0xca, 0x04, 0x11, 0xfe, 0x70, 0xfe, 0x72, 0xc5, 0x02, 0x08, 0x9f, 0x02, 0x0a, 0xce, 0xfe, 0x70, 0xfe, 0x72, 0xc5, 0x02, 0x08, 0x9f, 0x02, 0x0a, 0xce, 0xfe, 0x70, 0xfe, 0x72, 0xc5, 0x02, 0x08, 0x9f, 0x02, 0x0a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x85, 0x00, 0x2e, 0x09, 0xb8, 0x04, 0xdf, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x03, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x03, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x85, 0x03, 0xca, 0xfc, 0x36, 0x02, 0xe8, 0x33, 0x03, 0xca, 0xfc, 0x36, 0x02, 0xe8, 0x35, 0x03, 0xcb, 0xfc, 0x35, 0x02, 0xe8, 0x04, 0x11, 0xce, 0xfd, 0xf6, 0x9f, 0xfd, 0xf8, 0xc5, 0x01, 0x8e, 0x01, 0x90, 0xce, 0xfd, 0xf6, 0x9f, 0xfd, 0xf8, 0xc5, 0x01, 0x8e, 0x01, 0x90, 0xce, 0xfd, 0xf6, 0x9f, 0xfd, 0xf8, 0xc5, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x2e, 0x05, 0x46, 0x06, 0xd4, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x00, 0x13, 0x09, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x21, 0x35, 0x21, 0x11, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0xc3, 0x03, 0x61, 0xfc, 0x9f, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xfe, 0xde, 0x01, 0x15, 0x01, 0x12, 0xb2, 0xfe, 0x90, 0xaa, 0xfe, 0x91, 0x03, 0xfe, 0xaa, 0x03, 0x4e, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x2e, 0x05, 0x46, 0x06, 0xd4, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x00, 0x01, 0x15, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0x9f, 0xfe, 0xdf, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0xfe, 0xde, 0xb0, 0x01, 0x6f, 0xaa, 0x01, 0x70, 0xb2, 0xfe, 0xee, 0x02, 0x39, 0xaa, 0xaa, 0x03, 0xf8, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x25, 0x15, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x35, 0x21, 0x15, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0xfe, 0xde, 0x04, 0x82, 0xb0, 0xb0, 0x01, 0x6f, 0xaa, 0x01, 0x70, 0xb2, 0xfe, 0xee, 0x02, 0x39, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x37, 0x09, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x21, 0x35, 0x21, 0xc3, 0x03, 0x61, 0xfc, 0x9f, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xb0, 0x01, 0x15, 0x01, 0x12, 0xb2, 0xfe, 0x90, 0xaa, 0xfe, 0x91, 0x03, 0xfe, 0xaa, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x29, 0x05, 0x46, 0x05, 0x57, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x05, 0x35, 0x24, 0x01, 0x11, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x15, 0x00, 0x05, 0x04, 0x05, 0x45, 0xfe, 0x7f, 0xfc, 0xff, 0x03, 0x12, 0x01, 0x70, 0xfe, 0xa7, 0xfc, 0xd7, 0x03, 0x29, 0x01, 0x59, 0xfe, 0xa7, 0xfe, 0x54, 0x01, 0xac, 0x04, 0x80, 0xfe, 0x5f, 0x85, 0xae, 0x91, 0x01, 0xbe, 0xfa, 0xa9, 0xd7, 0x01, 0x80, 0x7c, 0xa6, 0x84, 0x01, 0x78, 0xd7, 0xfe, 0xe5, 0x5d, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x29, 0x05, 0x46, 0x05, 0x57, 0x00, 0x05, 0x00, 0x10, 0x00, 0x00, 0x13, 0x35, 0x00, 0x05, 0x15, 0x24, 0x01, 0x00, 0x25, 0x24, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0xc3, 0x01, 0x70, 0x03, 0x12, 0xfc, 0xff, 0xfe, 0x7f, 0x01, 0x59, 0x01, 0xac, 0xfe, 0x54, 0xfe, 0xa7, 0x01, 0x59, 0x03, 0x29, 0xfc, 0xd7, 0xfe, 0xa7, 0x04, 0x80, 0xd7, 0xfe, 0x42, 0x91, 0xae, 0x85, 0xfd, 0x21, 0x01, 0x1b, 0x5d, 0x5d, 0x01, 0x1b, 0xd7, 0xfe, 0x88, 0x84, 0xa6, 0x7c, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0x93, 0x05, 0x46, 0x06, 0x1d, 0x00, 0x21, 0x00, 0x26, 0x00, 0x00, 0x21, 0x15, 0x02, 0x25, 0x01, 0x27, 0x13, 0x26, 0x27, 0x35, 0x16, 0x17, 0x37, 0x26, 0x25, 0x35, 0x24, 0x25, 0x13, 0x17, 0x03, 0x36, 0x37, 0x15, 0x06, 0x0f, 0x01, 0x04, 0x17, 0x15, 0x26, 0x25, 0x07, 0x04, 0x01, 0x37, 0x06, 0x07, 0x16, 0x05, 0x45, 0xf2, 0xfe, 0x59, 0xff, 0x00, 0x76, 0xf4, 0xa7, 0xc0, 0xe6, 0xc4, 0x39, 0xd8, 0xfe, 0xf5, 0x01, 0x8a, 0x01, 0x1b, 0xde, 0x75, 0x95, 0xaa, 0x75, 0xb4, 0xcc, 0x5e, 0x01, 0x01, 0xdd, 0xc4, 0xfe, 0xa6, 0x39, 0x01, 0x70, 0xfe, 0x88, 0x2b, 0x66, 0x6b, 0x55, 0xd7, 0x01, 0x25, 0xa4, 0xfd, 0xa1, 0x4b, 0x02, 0x41, 0x36, 0x23, 0xae, 0x28, 0x41, 0x87, 0x46, 0x2b, 0xa6, 0x3c, 0x7a, 0x02, 0x0c, 0x4b, 0xfe, 0x9f, 0x64, 0x82, 0xd7, 0x94, 0x60, 0xdf, 0x67, 0xb6, 0xd7, 0xd6, 0x87, 0x88, 0x94, 0x01, 0xe2, 0x66, 0x23, 0x17, 0x12, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0x93, 0x05, 0x46, 0x06, 0x1d, 0x00, 0x21, 0x00, 0x26, 0x00, 0x00, 0x13, 0x35, 0x16, 0x05, 0x13, 0x17, 0x03, 0x16, 0x17, 0x15, 0x04, 0x0f, 0x01, 0x24, 0x25, 0x15, 0x04, 0x05, 0x03, 0x27, 0x13, 0x06, 0x07, 0x35, 0x36, 0x3f, 0x01, 0x04, 0x07, 0x35, 0x36, 0x25, 0x37, 0x24, 0x05, 0x07, 0x36, 0x37, 0x26, 0xc3, 0xe2, 0x01, 0xa8, 0xf9, 0x75, 0xea, 0xac, 0xc8, 0xfe, 0xd9, 0xea, 0x50, 0x01, 0x0b, 0x01, 0x56, 0xfe, 0x65, 0xfe, 0xd8, 0xd6, 0x76, 0x81, 0x8b, 0x69, 0x96, 0xce, 0x5a, 0xfe, 0xea, 0xa8, 0xf7, 0x01, 0x22, 0x32, 0xfe, 0xc1, 0x01, 0xc4, 0x0c, 0x21, 0x20, 0x1b, 0x04, 0x80, 0xd7, 0xfb, 0x8c, 0x02, 0x4d, 0x4b, 0xfd, 0xd6, 0x2e, 0x1f, 0xa6, 0x30, 0x51, 0xbd, 0x74, 0x3b, 0xae, 0x4c, 0x9e, 0xfe, 0x05, 0x4b, 0x01, 0x31, 0x67, 0x7f, 0xd7, 0xa2, 0x76, 0xd5, 0x7d, 0xb7, 0xd7, 0xcb, 0x69, 0x77, 0x69, 0x90, 0x1b, 0x08, 0x07, 0x06, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xdf, 0x05, 0x46, 0x06, 0x23, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x03, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x03, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0x11, 0x21, 0x03, 0x13, 0x21, 0x11, 0x03, 0xdf, 0x90, 0x4f, 0x01, 0x25, 0xfe, 0xa4, 0xc7, 0x02, 0x23, 0xfd, 0xa6, 0x2a, 0x02, 0x84, 0xfd, 0x46, 0x62, 0x90, 0x4f, 0xfe, 0xdb, 0x01, 0x5c, 0x29, 0xfe, 0x7b, 0x02, 0xba, 0xfe, 0xc7, 0xfe, 0x16, 0x06, 0x23, 0x3a, 0xf5, 0xaa, 0xfd, 0x98, 0xaa, 0x80, 0xaa, 0xfe, 0xd1, 0x3a, 0xf5, 0xaa, 0x80, 0x03, 0xbc, 0xfc, 0xee, 0x02, 0x68, 0xfd, 0x98, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xdf, 0x05, 0x46, 0x06, 0x23, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x11, 0x21, 0x07, 0x21, 0x15, 0x21, 0x03, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x13, 0x21, 0x35, 0x21, 0x17, 0x03, 0x21, 0x11, 0x03, 0xdf, 0x90, 0x4f, 0x01, 0x25, 0xfd, 0xa6, 0x2a, 0x02, 0x84, 0xfd, 0x46, 0x62, 0x90, 0x4f, 0xfe, 0xdb, 0x01, 0x5c, 0x29, 0xfe, 0x7b, 0x01, 0xbc, 0xc7, 0xfd, 0x7d, 0x02, 0xba, 0x6c, 0xc7, 0x01, 0x8a, 0x06, 0x23, 0x3a, 0xf5, 0xfc, 0x44, 0x80, 0xaa, 0xfe, 0xd1, 0x3a, 0xf5, 0xaa, 0x80, 0xaa, 0x02, 0x68, 0xaa, 0xaa, 0xfd, 0x98, 0x02, 0x68, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0x3f, 0x05, 0x46, 0x04, 0xf4, 0x00, 0x14, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0xc3, 0x04, 0x82, 0xfc, 0x17, 0x03, 0xe9, 0xfe, 0x80, 0x18, 0x45, 0x01, 0xad, 0xfd, 0xe7, 0x84, 0x7d, 0x46, 0xfe, 0x52, 0x02, 0x1a, 0x51, 0xfd, 0x95, 0x04, 0xf4, 0xaa, 0xfd, 0x98, 0xaa, 0x13, 0x6d, 0xaa, 0xcf, 0x62, 0x6d, 0xaa, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0x3f, 0x05, 0x46, 0x04, 0xf4, 0x00, 0x14, 0x00, 0x00, 0x25, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x17, 0x07, 0x05, 0x45, 0xfd, 0xe7, 0x84, 0x7d, 0x46, 0xfe, 0x52, 0x02, 0x1a, 0x51, 0xfd, 0x95, 0x03, 0xe9, 0xfc, 0x17, 0x04, 0x82, 0xfe, 0x80, 0x18, 0x45, 0xb8, 0xaa, 0xcf, 0x62, 0x6d, 0xaa, 0x80, 0xaa, 0x02, 0x68, 0xaa, 0xfc, 0x44, 0x13, 0x6d, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xe5, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x00, 0x25, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x02, 0x9c, 0x59, 0x3d, 0x4f, 0x9b, 0x58, 0x5e, 0xa1, 0x58, 0x54, 0x6c, 0x63, 0x8b, 0x5e, 0x5b, 0x3d, 0x4e, 0x98, 0x5d, 0x5f, 0xa1, 0x57, 0x57, 0x6d, 0x61, 0x8c, 0x03, 0x07, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0x11, 0x1f, 0x4c, 0x54, 0xb4, 0x4e, 0x44, 0x2a, 0xf3, 0x46, 0xe9, 0x20, 0x4a, 0x56, 0xb4, 0x4e, 0x44, 0x2b, 0xf0, 0x46, 0x04, 0xcd, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xe5, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x00, 0x25, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x02, 0x9c, 0x59, 0x3d, 0x4f, 0x9b, 0x58, 0x5e, 0xa1, 0x58, 0x54, 0x6c, 0x63, 0x8b, 0x5e, 0x5b, 0x3d, 0x4e, 0x98, 0x5d, 0x5f, 0xa1, 0x57, 0x57, 0x6d, 0x61, 0x8c, 0xfe, 0x85, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x11, 0x1f, 0x4c, 0x54, 0xb4, 0x4e, 0x44, 0x2a, 0xf3, 0x46, 0xe9, 0x20, 0x4a, 0x56, 0xb4, 0x4e, 0x44, 0x2b, 0xf0, 0x46, 0x04, 0xcd, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xa6, 0x05, 0x46, 0x05, 0x57, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x00, 0x05, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x01, 0x00, 0x05, 0x04, 0x01, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x02, 0x9c, 0x5a, 0x3c, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x54, 0x6c, 0x63, 0x8c, 0x5f, 0x5b, 0x3e, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x56, 0x6d, 0x62, 0x8b, 0x03, 0x07, 0xfe, 0xa7, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x59, 0xfe, 0xa7, 0xfc, 0xd7, 0x03, 0x29, 0x01, 0x59, 0x2e, 0x20, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x2b, 0xf3, 0x46, 0xe9, 0x20, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x2c, 0xf1, 0x46, 0x05, 0x94, 0xfe, 0xe5, 0x5d, 0x5d, 0xfe, 0xe5, 0xd7, 0x01, 0x78, 0x84, 0xa6, 0x7c, 0x01, 0x80, 0x00, 0x02, 0x00, 0xca, 0xfe, 0xa2, 0x05, 0x4d, 0x05, 0x57, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x00, 0x05, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x00, 0x25, 0x24, 0x02, 0xa3, 0x59, 0x3d, 0x4f, 0x9b, 0x59, 0x5f, 0xa1, 0x57, 0x54, 0x6d, 0x62, 0x8c, 0x5f, 0x5b, 0x3e, 0x4e, 0x98, 0x5c, 0x5e, 0xa1, 0x58, 0x56, 0x6d, 0x61, 0x8c, 0xfe, 0x85, 0x01, 0x59, 0x03, 0x29, 0xfc, 0xd7, 0xfe, 0xa7, 0x01, 0x59, 0x01, 0xad, 0xfe, 0x53, 0x33, 0x20, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x2b, 0xf4, 0x46, 0xea, 0x20, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x2c, 0xf0, 0x46, 0x05, 0x98, 0xd7, 0xfe, 0x80, 0x7c, 0xa6, 0x84, 0xfe, 0x88, 0xd7, 0x01, 0x1b, 0x5d, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0xf6, 0x05, 0x46, 0x06, 0x0c, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x00, 0x01, 0x17, 0x03, 0x37, 0x11, 0x25, 0x03, 0x27, 0x13, 0x25, 0x35, 0x01, 0x13, 0x11, 0x07, 0x03, 0x27, 0x13, 0x05, 0x04, 0x6a, 0x8e, 0x76, 0xc3, 0xfd, 0xf4, 0xc6, 0x8e, 0xc6, 0xfe, 0x18, 0x02, 0xf8, 0xf1, 0x7d, 0xbb, 0x8e, 0x82, 0xfe, 0x3c, 0x06, 0x0c, 0x40, 0xfe, 0xc1, 0x59, 0xfb, 0x38, 0xf0, 0xfd, 0xe8, 0x40, 0x02, 0x19, 0xe0, 0xa6, 0x01, 0x5c, 0xfc, 0xef, 0x02, 0xc4, 0x39, 0xfe, 0x04, 0x40, 0x01, 0x61, 0xce, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0xf6, 0x05, 0x46, 0x06, 0x0c, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x00, 0x01, 0x27, 0x13, 0x07, 0x11, 0x05, 0x13, 0x17, 0x03, 0x05, 0x15, 0x01, 0x03, 0x11, 0x37, 0x13, 0x17, 0x03, 0x25, 0x01, 0x9f, 0x8e, 0x75, 0xc3, 0x02, 0x0d, 0xc5, 0x8e, 0xc6, 0x01, 0xe8, 0xfd, 0x09, 0xf2, 0x7d, 0xbc, 0x8e, 0x82, 0x01, 0xc3, 0xfe, 0xf6, 0x40, 0x01, 0x3f, 0x59, 0x04, 0xc8, 0xf0, 0x02, 0x18, 0x40, 0xfd, 0xe7, 0xe0, 0xa6, 0xfe, 0xa4, 0x03, 0x11, 0xfd, 0x3c, 0x39, 0x01, 0xfc, 0x40, 0xfe, 0x9f, 0xce, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x7d, 0x05, 0x46, 0x06, 0x85, 0x00, 0x03, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x11, 0x07, 0x03, 0x01, 0x35, 0x21, 0x13, 0x25, 0x35, 0x01, 0x13, 0x17, 0x03, 0x37, 0x11, 0x25, 0x03, 0x21, 0x15, 0x21, 0x03, 0x27, 0x37, 0x01, 0x13, 0x05, 0x04, 0xac, 0x7f, 0xbb, 0xfd, 0x51, 0x01, 0x56, 0x90, 0xfe, 0x1a, 0x02, 0xf5, 0xae, 0x8e, 0x74, 0xc5, 0xfd, 0xf2, 0x78, 0x02, 0x86, 0xfd, 0x3b, 0x6a, 0x8e, 0x52, 0x01, 0x0a, 0x81, 0xfe, 0x3f, 0x01, 0x9e, 0x02, 0xc4, 0x3a, 0xfe, 0x05, 0xfd, 0x71, 0xaa, 0x01, 0x86, 0xdf, 0xa6, 0x01, 0x5b, 0x01, 0xd7, 0x40, 0xfe, 0xc5, 0x5a, 0xfb, 0x38, 0xf1, 0xfe, 0xbb, 0xaa, 0xfe, 0xdf, 0x40, 0xe1, 0x02, 0xd0, 0x01, 0x5f, 0xcd, 0x00, 0x00, 0x00, 0x03, 0x00, 0xbf, 0xfe, 0x7d, 0x05, 0x42, 0x06, 0x85, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x00, 0x37, 0x11, 0x01, 0x13, 0x17, 0x03, 0x05, 0x15, 0x01, 0x03, 0x21, 0x15, 0x21, 0x03, 0x27, 0x37, 0x23, 0x35, 0x33, 0x37, 0x13, 0x25, 0x11, 0x37, 0x01, 0x03, 0x25, 0xc0, 0x02, 0x61, 0xd2, 0x8e, 0xd2, 0x01, 0x93, 0xfd, 0x80, 0x76, 0x02, 0xf6, 0xfc, 0xcb, 0x6b, 0x8e, 0x53, 0xa7, 0xe6, 0x54, 0xec, 0xfe, 0x73, 0xf4, 0x01, 0x27, 0x60, 0x01, 0x4c, 0x9c, 0x04, 0xc8, 0xfe, 0xe9, 0x02, 0x38, 0x40, 0xfd, 0xc7, 0xb9, 0xa6, 0xfe, 0xdb, 0xfe, 0xc0, 0xaa, 0xfe, 0xdf, 0x40, 0xe1, 0xaa, 0xe4, 0x02, 0x81, 0xb5, 0xfd, 0x3c, 0x70, 0x01, 0x5e, 0xfe, 0xfc, 0x98, 0x00, 0x00, 0x00, 0xff, 0xff, 0x03, 0x3a, 0xff, 0x42, 0x03, 0xf9, 0x05, 0xb8, 0x10, 0x27, 0x09, 0xa1, 0x02, 0x75, 0xfc, 0xfa, 0x10, 0x27, 0x09, 0xa1, 0x02, 0x75, 0x02, 0x72, 0x10, 0x07, 0x09, 0xa1, 0x02, 0x75, 0xff, 0xb6, 0x00, 0x00, 0xff, 0xff, 0x00, 0xd4, 0x01, 0xfe, 0x06, 0x5e, 0x02, 0xfc, 0x10, 0x26, 0x09, 0xa1, 0x0f, 0xb6, 0x10, 0x27, 0x09, 0xa1, 0x02, 0x75, 0xff, 0xb6, 0x10, 0x07, 0x09, 0xa1, 0x04, 0xdb, 0xff, 0xb6, 0xff, 0xff, 0x00, 0xd4, 0xff, 0x42, 0x06, 0x5e, 0x05, 0xb8, 0x10, 0x27, 0x09, 0xa1, 0x00, 0x0f, 0xfc, 0xfa, 0x10, 0x27, 0x09, 0xa1, 0x04, 0xdb, 0x02, 0x72, 0x10, 0x07, 0x09, 0xa1, 0x02, 0x75, 0xff, 0xb6, 0x00, 0x00, 0xff, 0xff, 0x00, 0xd4, 0xff, 0x42, 0x06, 0x5e, 0x05, 0xb8, 0x10, 0x27, 0x09, 0xa1, 0x04, 0xdb, 0xfc, 0xfa, 0x10, 0x27, 0x09, 0xa1, 0x00, 0x0f, 0x02, 0x72, 0x10, 0x07, 0x09, 0xa1, 0x02, 0x75, 0xff, 0xb6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4f, 0xff, 0xec, 0x06, 0xe4, 0x05, 0xae, 0x00, 0x21, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x36, 0x37, 0x36, 0x24, 0x33, 0x21, 0x15, 0x21, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x15, 0x21, 0x22, 0x24, 0x27, 0x26, 0x01, 0xdf, 0xfe, 0x70, 0x01, 0x8e, 0x0d, 0x46, 0x54, 0x01, 0x41, 0xad, 0x02, 0x72, 0xfd, 0x8d, 0x85, 0x7c, 0x7c, 0x44, 0x3a, 0x07, 0x04, 0x75, 0xfb, 0x8d, 0x06, 0x39, 0x43, 0x7d, 0x7c, 0x85, 0x02, 0x73, 0xfd, 0x8e, 0xad, 0xfe, 0xbf, 0x54, 0x41, 0x02, 0x73, 0xa0, 0x94, 0x8f, 0xb0, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0xb0, 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x05, 0xae, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x16, 0x12, 0x16, 0x17, 0x21, 0x15, 0x21, 0x22, 0x24, 0x02, 0x10, 0x12, 0x24, 0x33, 0x21, 0x15, 0x21, 0x0e, 0x01, 0x02, 0x07, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x01, 0x35, 0x06, 0x7b, 0xfa, 0x85, 0x02, 0x73, 0xfd, 0x8d, 0xad, 0xfe, 0xc0, 0xaa, 0xaa, 0x01, 0x40, 0xad, 0x02, 0x73, 0xfd, 0x8d, 0x85, 0xf9, 0x7d, 0x08, 0x03, 0xe6, 0x90, 0x90, 0x02, 0x73, 0x4a, 0xfe, 0xfd, 0x9a, 0x01, 0x9f, 0xc6, 0x01, 0x60, 0x01, 0x74, 0x01, 0x60, 0xc8, 0x9f, 0x01, 0x9c, 0xfe, 0xfe, 0x5d, 0x01, 0x10, 0xfd, 0x40, 0x01, 0x10, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x9b, 0x04, 0x68, 0x04, 0x67, 0x00, 0x19, 0x00, 0x00, 0x25, 0x20, 0x24, 0x10, 0x24, 0x29, 0x01, 0x15, 0x21, 0x22, 0x07, 0x06, 0x07, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x16, 0x17, 0x16, 0x33, 0x21, 0x15, 0x02, 0xda, 0xfe, 0xf6, 0xfe, 0xf3, 0x01, 0x0d, 0x01, 0x0a, 0x01, 0x8e, 0xfe, 0x72, 0xcf, 0x60, 0x47, 0x1a, 0x02, 0x9e, 0x80, 0x80, 0xfd, 0x62, 0x22, 0x3f, 0x66, 0xc9, 0x01, 0x8e, 0x9b, 0xf6, 0x01, 0xe0, 0xf6, 0x8e, 0x51, 0x3b, 0x84, 0xac, 0xfe, 0x1a, 0xac, 0x91, 0x30, 0x51, 0x8e, 0x00, 0xff, 0xff, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x07, 0x48, 0x10, 0x26, 0x08, 0xe4, 0x00, 0x00, 0x10, 0x07, 0x09, 0xa1, 0x01, 0xff, 0x04, 0x02, 0x00, 0x02, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x06, 0xd2, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x15, 0x21, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x21, 0x15, 0x21, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x11, 0x21, 0x35, 0x21, 0x01, 0x35, 0x06, 0x39, 0x43, 0x7d, 0x7c, 0x85, 0x02, 0x73, 0xfd, 0x8d, 0xad, 0xfe, 0xc0, 0xaa, 0xaa, 0x01, 0x40, 0xad, 0x02, 0x73, 0xfd, 0x8d, 0x85, 0x7c, 0x7d, 0x43, 0x3a, 0x08, 0x04, 0x76, 0xfb, 0x2e, 0x04, 0xd2, 0x02, 0x73, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0x01, 0x60, 0xbb, 0xb9, 0x01, 0x60, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0x03, 0xbf, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x9b, 0x04, 0x68, 0x05, 0x7d, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x00, 0x25, 0x20, 0x24, 0x35, 0x34, 0x24, 0x29, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x16, 0x17, 0x16, 0x33, 0x21, 0x15, 0x11, 0x21, 0x35, 0x21, 0x02, 0xda, 0xfe, 0xf6, 0xfe, 0xf3, 0x01, 0x0d, 0x01, 0x0a, 0x01, 0x8e, 0xfe, 0x72, 0xd1, 0x5e, 0x46, 0x1b, 0x03, 0x1e, 0xfc, 0xe2, 0x21, 0x40, 0x67, 0xc8, 0x01, 0x8e, 0xfc, 0x7e, 0x03, 0x82, 0x9b, 0xf6, 0xf0, 0xf0, 0xf6, 0x8e, 0x01, 0x01, 0x4f, 0x3a, 0x85, 0x8e, 0x91, 0x30, 0x51, 0x8e, 0x04, 0x56, 0x8c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xfe, 0xda, 0x05, 0xa9, 0x05, 0xae, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x15, 0x21, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x21, 0x15, 0x21, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x11, 0x21, 0x35, 0x21, 0x01, 0x35, 0x06, 0x39, 0x43, 0x7d, 0x7c, 0x85, 0x02, 0x73, 0xfd, 0x8d, 0xad, 0xfe, 0xc0, 0xaa, 0xaa, 0x01, 0x40, 0xad, 0x02, 0x73, 0xfd, 0x8d, 0x85, 0x7c, 0x7d, 0x43, 0x3a, 0x08, 0x04, 0x76, 0xfb, 0x2e, 0x04, 0xd2, 0x02, 0x73, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0x01, 0x60, 0xbb, 0xb9, 0x01, 0x60, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0xfc, 0x67, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x05, 0xae, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x15, 0x21, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x21, 0x15, 0x21, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x15, 0x21, 0x01, 0x35, 0x04, 0x73, 0xfb, 0xbc, 0x10, 0x43, 0x7d, 0x7c, 0x85, 0x02, 0x73, 0xfd, 0x8d, 0xad, 0xfe, 0xc0, 0xaa, 0xaa, 0x01, 0x40, 0xad, 0x02, 0x73, 0xfd, 0x8d, 0x85, 0x7c, 0x7d, 0x43, 0x0d, 0x0b, 0x04, 0x4c, 0xfb, 0x8d, 0x02, 0x73, 0xa0, 0x22, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0x01, 0x60, 0xbb, 0xb9, 0x01, 0x60, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x1b, 0x1a, 0xa0, 0x00, 0x01, 0x00, 0x4f, 0xff, 0xec, 0x06, 0xe4, 0x05, 0xae, 0x00, 0x21, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x06, 0x07, 0x06, 0x04, 0x23, 0x21, 0x35, 0x21, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x21, 0x35, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x21, 0x35, 0x21, 0x32, 0x04, 0x17, 0x16, 0x05, 0x54, 0x01, 0x90, 0xfe, 0x72, 0x0d, 0x46, 0x54, 0xfe, 0xbf, 0xac, 0xfd, 0x8d, 0x02, 0x73, 0x85, 0x7c, 0x7c, 0x44, 0x3a, 0x07, 0xfb, 0x8b, 0x04, 0x74, 0x07, 0x39, 0x43, 0x7d, 0x7c, 0x85, 0xfd, 0x8d, 0x02, 0x73, 0xac, 0x01, 0x41, 0x54, 0x41, 0x03, 0x27, 0xa0, 0x94, 0x8f, 0xb0, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0xb0, 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x05, 0xae, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x26, 0x02, 0x26, 0x27, 0x21, 0x35, 0x21, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x21, 0x35, 0x21, 0x3e, 0x01, 0x12, 0x37, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x05, 0x11, 0x06, 0x7c, 0xf9, 0x85, 0xfd, 0x8d, 0x02, 0x73, 0xad, 0x01, 0x3f, 0xab, 0xab, 0xfe, 0xc1, 0xad, 0xfd, 0x8d, 0x02, 0x73, 0x85, 0xf8, 0x7e, 0x08, 0xfc, 0x1a, 0x90, 0x90, 0x03, 0x27, 0x4a, 0x01, 0x03, 0x9a, 0x01, 0x9f, 0xc6, 0xfe, 0xa0, 0xfe, 0x8c, 0xfe, 0xa0, 0xc8, 0x9f, 0x01, 0x9c, 0x01, 0x02, 0x5d, 0xfe, 0xf0, 0x02, 0xc0, 0xfe, 0xf0, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x9b, 0x04, 0x68, 0x04, 0x67, 0x00, 0x19, 0x00, 0x00, 0x01, 0x20, 0x04, 0x10, 0x04, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x37, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x26, 0x27, 0x26, 0x23, 0x25, 0x35, 0x02, 0x51, 0x01, 0x0a, 0x01, 0x0d, 0xfe, 0xf3, 0xfe, 0xf6, 0xfe, 0x72, 0x01, 0x8e, 0xcf, 0x60, 0x46, 0x1b, 0xfd, 0x62, 0x80, 0x80, 0x02, 0x9e, 0x21, 0x40, 0x67, 0xc8, 0xfe, 0x72, 0x04, 0x67, 0xf6, 0xfe, 0x20, 0xf6, 0x8e, 0x51, 0x3a, 0x85, 0xac, 0x01, 0xe6, 0xac, 0x91, 0x30, 0x50, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0xec, 0x05, 0xa9, 0x06, 0xd2, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x21, 0x35, 0x21, 0x32, 0x04, 0x12, 0x15, 0x14, 0x02, 0x04, 0x23, 0x21, 0x35, 0x21, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x05, 0x11, 0x06, 0x39, 0x43, 0x7e, 0x7b, 0x85, 0xfd, 0x8d, 0x02, 0x73, 0xad, 0x01, 0x3f, 0xab, 0xab, 0xfe, 0xc1, 0xad, 0xfd, 0x8d, 0x02, 0x73, 0x85, 0x7b, 0x7d, 0x44, 0x3a, 0x08, 0xfb, 0x8a, 0x04, 0xd1, 0xfb, 0x2f, 0x04, 0xd1, 0x03, 0x27, 0x4a, 0x78, 0x8b, 0x4e, 0x4c, 0x01, 0x9f, 0xc6, 0xfe, 0xa0, 0xbb, 0xb9, 0xfe, 0xa0, 0xc8, 0x9f, 0x01, 0x4d, 0x4f, 0x8a, 0x78, 0x5d, 0xa0, 0x03, 0x0b, 0xa0, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x9b, 0x04, 0x68, 0x05, 0x7d, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x20, 0x04, 0x15, 0x14, 0x04, 0x29, 0x01, 0x35, 0x25, 0x32, 0x37, 0x36, 0x37, 0x21, 0x35, 0x05, 0x26, 0x27, 0x26, 0x07, 0x21, 0x35, 0x25, 0x21, 0x35, 0x21, 0x02, 0x51, 0x01, 0x0a, 0x01, 0x0d, 0xfe, 0xf3, 0xfe, 0xf6, 0xfe, 0x72, 0x01, 0x8e, 0xd1, 0x5e, 0x46, 0x1b, 0xfc, 0xe2, 0x03, 0x1e, 0x22, 0x3f, 0x68, 0xc7, 0xfe, 0x72, 0x03, 0x82, 0xfc, 0x7e, 0x03, 0x82, 0x04, 0x67, 0xf6, 0xf1, 0xef, 0xf6, 0x8e, 0x01, 0x50, 0x3a, 0x85, 0x8e, 0x01, 0x91, 0x31, 0x52, 0x01, 0x8e, 0x8a, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x83, 0x05, 0xc2, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x05, 0x82, 0xfb, 0xda, 0x04, 0x26, 0xfb, 0x41, 0x04, 0xbf, 0xfb, 0xda, 0x04, 0x26, 0x02, 0x82, 0xfe, 0x28, 0xaa, 0x05, 0xc2, 0xaa, 0xfe, 0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x42, 0xff, 0xdc, 0x04, 0x15, 0x04, 0x1c, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x23, 0x00, 0x00, 0x01, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x15, 0x14, 0x00, 0x23, 0x22, 0x27, 0x07, 0x27, 0x37, 0x26, 0x35, 0x34, 0x00, 0x05, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x1f, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x02, 0x2a, 0xa8, 0x80, 0x6a, 0x59, 0x6a, 0x63, 0xfe, 0xe3, 0xc7, 0xa5, 0x7f, 0x6a, 0x59, 0x69, 0x64, 0x01, 0x1c, 0x01, 0x94, 0x5a, 0x74, 0x91, 0xd2, 0x40, 0x59, 0x59, 0x71, 0x93, 0xd2, 0x3e, 0x04, 0x17, 0x71, 0x76, 0x63, 0x76, 0x8d, 0xba, 0xdd, 0xfe, 0xc4, 0x6f, 0x76, 0x63, 0x76, 0x8d, 0xba, 0xdf, 0x01, 0x3c, 0xd5, 0x48, 0xe9, 0xa5, 0x80, 0x63, 0x62, 0x47, 0xe9, 0xa3, 0x80, 0x62, 0x00, 0x00, 0x00, 0x01, 0x00, 0x66, 0x01, 0x4c, 0x03, 0xe4, 0x03, 0x8c, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x01, 0x35, 0x05, 0x11, 0x01, 0x15, 0x02, 0x5f, 0xfe, 0x08, 0x01, 0x84, 0x01, 0xf8, 0x02, 0x7a, 0xfe, 0xd2, 0x01, 0x4a, 0xc2, 0xfa, 0x01, 0x2e, 0xfe, 0xb6, 0xc2, 0x00, 0x00, 0x02, 0x00, 0x83, 0x00, 0x00, 0x04, 0x0f, 0x04, 0xc4, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x33, 0x11, 0x09, 0x01, 0x11, 0x25, 0x21, 0x11, 0x09, 0x01, 0x83, 0x01, 0xc6, 0x01, 0xc6, 0xfd, 0x0a, 0x02, 0x60, 0xfe, 0xd0, 0xfe, 0xd0, 0x02, 0xa0, 0x02, 0x24, 0xfd, 0xdc, 0xfd, 0x60, 0xaa, 0x01, 0xd5, 0x01, 0x79, 0xfe, 0x87, 0x00, 0x00, 0x00, 0x01, 0x01, 0x79, 0x03, 0xda, 0x04, 0x8e, 0x05, 0xdc, 0x00, 0x07, 0x00, 0x00, 0x01, 0x03, 0x27, 0x01, 0x33, 0x01, 0x07, 0x03, 0x02, 0xdc, 0xf7, 0x6c, 0x01, 0x63, 0x51, 0x01, 0x61, 0x6c, 0xf5, 0x04, 0xea, 0xfe, 0xf0, 0x78, 0x01, 0x8a, 0xfe, 0x76, 0x78, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x79, 0x00, 0x00, 0x04, 0x8e, 0x02, 0x02, 0x00, 0x07, 0x00, 0x00, 0x25, 0x33, 0x13, 0x17, 0x01, 0x23, 0x01, 0x37, 0x02, 0xdc, 0x51, 0xf5, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9d, 0x6c, 0xf2, 0x01, 0x10, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0x00, 0x00, 0xff, 0xff, 0x01, 0x79, 0x00, 0x00, 0x04, 0x8e, 0x03, 0x3f, 0x10, 0x26, 0x11, 0x49, 0x00, 0x00, 0x10, 0x07, 0x09, 0xdf, 0x00, 0x00, 0xfc, 0x26, 0xff, 0xff, 0x01, 0x79, 0x00, 0x00, 0x04, 0x8e, 0x04, 0x1b, 0x10, 0x27, 0x11, 0x49, 0x00, 0x00, 0x00, 0xdc, 0x10, 0x26, 0x11, 0x49, 0x00, 0xd7, 0x10, 0x07, 0x09, 0xdf, 0x00, 0x00, 0xfc, 0x26, 0x00, 0x01, 0x01, 0x1b, 0xff, 0xc5, 0x02, 0x69, 0x06, 0x4e, 0x00, 0x19, 0x00, 0x00, 0x01, 0x17, 0x06, 0x14, 0x17, 0x16, 0x14, 0x07, 0x06, 0x14, 0x17, 0x16, 0x14, 0x07, 0x27, 0x36, 0x34, 0x27, 0x26, 0x34, 0x37, 0x36, 0x34, 0x27, 0x26, 0x34, 0x01, 0x8b, 0x6e, 0x45, 0x45, 0x6f, 0x6f, 0x45, 0x45, 0x6f, 0x6f, 0x6e, 0x45, 0x45, 0x6f, 0x6f, 0x45, 0x45, 0x6f, 0x06, 0x4e, 0x76, 0x4f, 0x70, 0x50, 0x81, 0xf8, 0x81, 0x50, 0x6f, 0x50, 0x81, 0xf9, 0x81, 0x76, 0x4f, 0x70, 0x50, 0x81, 0xf8, 0x81, 0x50, 0x70, 0x50, 0x81, 0xf8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0x1c, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x13, 0x21, 0x15, 0x23, 0x11, 0x23, 0x9e, 0x01, 0x7e, 0xd8, 0xa6, 0x06, 0x14, 0x8f, 0xf9, 0x6d, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb3, 0xfe, 0xf2, 0x02, 0x31, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x02, 0x31, 0xa6, 0xd8, 0x06, 0x14, 0xf8, 0xde, 0x06, 0x93, 0x8f, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0x1c, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x33, 0x15, 0x9e, 0xa6, 0xd8, 0xfe, 0xf2, 0x07, 0x22, 0xf9, 0x6d, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb3, 0xfe, 0xf2, 0x02, 0x31, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x35, 0x33, 0x11, 0x33, 0x02, 0x31, 0xfe, 0x82, 0xd8, 0xa6, 0xfe, 0xf2, 0x8f, 0x06, 0x93, 0x00, 0x00, 0x02, 0x02, 0xa8, 0xff, 0x62, 0x05, 0x78, 0x02, 0x82, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x11, 0x23, 0x13, 0x35, 0x21, 0x15, 0x02, 0xa8, 0x82, 0x82, 0xb4, 0x02, 0x1c, 0x01, 0xba, 0xfd, 0xa8, 0x02, 0x90, 0x90, 0x90, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xff, 0x62, 0x03, 0x2a, 0x02, 0x82, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x05, 0x33, 0x11, 0x23, 0x02, 0x76, 0xfd, 0xe4, 0x02, 0x4e, 0x82, 0x82, 0x02, 0x82, 0x90, 0x90, 0xc8, 0xfd, 0xa8, 0x00, 0x00, 0x02, 0x02, 0xa8, 0x01, 0xf2, 0x05, 0x78, 0x05, 0x12, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x25, 0x23, 0x11, 0x33, 0x03, 0x5c, 0x02, 0x1c, 0xfd, 0xb2, 0x82, 0x82, 0x01, 0xf2, 0x90, 0x90, 0xc8, 0x02, 0x58, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x01, 0xf2, 0x03, 0x2a, 0x05, 0x12, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x25, 0x23, 0x11, 0x33, 0x02, 0x76, 0xfd, 0xe4, 0x02, 0xd0, 0x82, 0x82, 0x02, 0x82, 0x90, 0x90, 0x38, 0x02, 0x58, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x01, 0x1f, 0x05, 0x46, 0x03, 0x5e, 0x00, 0x05, 0x00, 0x00, 0x01, 0x15, 0x21, 0x11, 0x23, 0x11, 0x05, 0x45, 0xfc, 0x15, 0x97, 0x03, 0x5e, 0xaa, 0xfe, 0x6b, 0x02, 0x3f, 0x00, 0x02, 0x00, 0x05, 0x01, 0x02, 0x03, 0xad, 0x05, 0x12, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x24, 0x05, 0x02, 0x13, 0x04, 0x25, 0x12, 0x03, 0x12, 0x03, 0x04, 0x25, 0x02, 0x13, 0x24, 0x7e, 0x01, 0x5a, 0x01, 0x5b, 0x7c, 0x7c, 0xfe, 0xa5, 0xfe, 0xa6, 0x7c, 0xf5, 0xa6, 0xa6, 0x01, 0xd4, 0x01, 0xd3, 0xa5, 0xa5, 0xfe, 0x2c, 0x01, 0x8a, 0x89, 0x89, 0x01, 0x80, 0x01, 0x82, 0x8a, 0x8a, 0xfe, 0x7e, 0xfd, 0xf8, 0x01, 0xf4, 0x02, 0x1c, 0xb1, 0xb1, 0xfe, 0x0c, 0xfd, 0xe5, 0xb1, 0x00, 0x06, 0x00, 0xde, 0x00, 0x01, 0x06, 0x55, 0x06, 0x13, 0x00, 0x03, 0x00, 0x31, 0x00, 0x3b, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x59, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x11, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x11, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x32, 0x16, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x14, 0x16, 0x33, 0x13, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x01, 0x33, 0x32, 0x36, 0x34, 0x26, 0x22, 0x06, 0x15, 0x11, 0x15, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x14, 0x01, 0x0b, 0xfe, 0xf5, 0xa6, 0xea, 0xa6, 0xa6, 0x72, 0x99, 0x99, 0x72, 0xa6, 0xa6, 0xea, 0xa6, 0x01, 0x0b, 0xa6, 0x75, 0x76, 0xa5, 0xa5, 0x73, 0x99, 0x99, 0x73, 0xa5, 0xa5, 0x76, 0x75, 0xa6, 0xfe, 0x70, 0x58, 0x3e, 0x3d, 0x58, 0x58, 0x3e, 0x95, 0x95, 0x3e, 0x58, 0x58, 0x3e, 0x3d, 0x58, 0x02, 0x15, 0x96, 0x3e, 0x58, 0x58, 0x7c, 0x58, 0x58, 0x7c, 0x58, 0x58, 0x3e, 0x02, 0x76, 0x01, 0x28, 0xfe, 0x44, 0xaa, 0x80, 0xb7, 0xb8, 0x83, 0x80, 0xba, 0x01, 0x28, 0xba, 0x81, 0x82, 0xb8, 0xb7, 0x80, 0xaa, 0xaa, 0x80, 0xb7, 0xb8, 0x82, 0x81, 0xba, 0xfe, 0xd8, 0xba, 0x80, 0x83, 0xb8, 0xb7, 0x80, 0xaa, 0x02, 0x50, 0xa7, 0x45, 0x61, 0x61, 0x8a, 0x62, 0xfd, 0xb0, 0x62, 0x44, 0x45, 0x62, 0x62, 0x44, 0x02, 0xf7, 0x62, 0x8a, 0x61, 0x61, 0x45, 0xfd, 0x09, 0xa7, 0x44, 0x62, 0x62, 0x45, 0x44, 0x62, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x01, 0x1f, 0x05, 0x46, 0x03, 0x5e, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x11, 0x33, 0x11, 0x21, 0x05, 0x45, 0xfb, 0x7e, 0x97, 0x03, 0xeb, 0x01, 0x1f, 0x02, 0x3f, 0xfe, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0x03, 0x67, 0x02, 0xe8, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x02, 0xe7, 0xfe, 0x39, 0x82, 0x02, 0x49, 0x05, 0x84, 0xfd, 0xe3, 0x02, 0xad, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x78, 0x03, 0x67, 0x02, 0xc2, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x13, 0x35, 0x21, 0x11, 0x23, 0x11, 0x79, 0x02, 0x49, 0x82, 0x05, 0x84, 0x90, 0xfd, 0x53, 0x02, 0x1d, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xff, 0x70, 0x02, 0xe8, 0x02, 0x1d, 0x00, 0x05, 0x00, 0x00, 0x21, 0x15, 0x21, 0x11, 0x33, 0x11, 0x02, 0xe7, 0xfd, 0xb7, 0x82, 0x90, 0x02, 0xad, 0xfd, 0xe3, 0x00, 0x00, 0x00, 0x01, 0x00, 0x78, 0xff, 0x70, 0x02, 0xc2, 0x02, 0x1d, 0x00, 0x05, 0x00, 0x00, 0x33, 0x21, 0x11, 0x33, 0x11, 0x21, 0x79, 0x01, 0xc7, 0x82, 0xfd, 0xb7, 0x02, 0x1d, 0xfd, 0x53, 0x00, 0x00, 0x00, 0x01, 0x01, 0x83, 0xfe, 0x00, 0x03, 0x95, 0x07, 0x6c, 0x00, 0x19, 0x00, 0x00, 0x01, 0x11, 0x34, 0x37, 0x1a, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x03, 0x02, 0x15, 0x30, 0x11, 0x01, 0x84, 0x03, 0x0a, 0xab, 0xb6, 0x48, 0x5a, 0x39, 0x32, 0x27, 0x19, 0x15, 0x0e, 0x05, 0x08, 0x0f, 0x5d, 0x10, 0x07, 0xfe, 0x00, 0x05, 0x08, 0x24, 0x81, 0x02, 0x03, 0x01, 0xbc, 0x54, 0x41, 0x36, 0x3f, 0x13, 0x10, 0x26, 0x0f, 0x48, 0xfd, 0x95, 0xfe, 0xd3, 0x02, 0xfa, 0x98, 0x00, 0x00, 0x00, 0x01, 0x00, 0x25, 0xfe, 0x1a, 0x02, 0x37, 0x07, 0x89, 0x00, 0x19, 0x00, 0x00, 0x01, 0x11, 0x14, 0x07, 0x0a, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x13, 0x12, 0x35, 0x30, 0x11, 0x02, 0x36, 0x03, 0x0a, 0xab, 0xb6, 0x48, 0x5a, 0x39, 0x32, 0x27, 0x19, 0x15, 0x0e, 0x05, 0x08, 0x0f, 0x5d, 0x10, 0x07, 0x07, 0x89, 0xfa, 0xf5, 0x24, 0x81, 0xfd, 0xfd, 0xfe, 0x44, 0x54, 0x41, 0x36, 0x3f, 0x13, 0x10, 0x26, 0x0f, 0x48, 0x02, 0x6b, 0x01, 0x2d, 0x02, 0x05, 0x6b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8c, 0x01, 0xd0, 0x07, 0xc0, 0x04, 0x9a, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x09, 0x01, 0x27, 0x01, 0x33, 0x01, 0x07, 0x01, 0x25, 0x21, 0x35, 0x29, 0x02, 0x15, 0x21, 0x03, 0xfe, 0xfe, 0x55, 0x6c, 0x02, 0x17, 0x50, 0x02, 0x15, 0x6c, 0xfe, 0x57, 0xfe, 0xb3, 0xfd, 0x8b, 0x02, 0x75, 0x02, 0x49, 0x02, 0x76, 0xfd, 0x8a, 0x03, 0xa8, 0xfe, 0x28, 0x78, 0x02, 0x52, 0xfd, 0xae, 0x78, 0x01, 0xd8, 0x48, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x8c, 0x00, 0x00, 0x07, 0xc0, 0x04, 0x9a, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x01, 0x21, 0x15, 0x21, 0x01, 0x21, 0x25, 0x21, 0x15, 0x21, 0x8c, 0x02, 0x75, 0x02, 0x9a, 0x02, 0x25, 0xfd, 0x8b, 0xfd, 0x66, 0xfd, 0xdb, 0x04, 0xbe, 0x02, 0x76, 0xfd, 0x8a, 0x04, 0x9a, 0xfc, 0x10, 0xaa, 0x03, 0xf0, 0xaa, 0xaa, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x00, 0x0a, 0x2e, 0x06, 0x14, 0x00, 0x04, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x00, 0x33, 0x11, 0x21, 0x09, 0x02, 0x11, 0x33, 0x09, 0x01, 0x29, 0x01, 0x09, 0x01, 0x21, 0x09, 0x03, 0x33, 0x09, 0x01, 0x8c, 0x06, 0xe5, 0x02, 0xbd, 0xfd, 0x43, 0xf9, 0xa1, 0x7e, 0x02, 0x38, 0xfd, 0xc8, 0x04, 0x6f, 0xfc, 0x4f, 0x01, 0xd9, 0xfe, 0x27, 0x03, 0xb1, 0xfe, 0x28, 0x02, 0x94, 0xfd, 0xc9, 0x02, 0x37, 0x7f, 0x02, 0x37, 0xfd, 0xc9, 0x06, 0x14, 0xfc, 0xf6, 0xfc, 0xf6, 0x05, 0x80, 0xfb, 0x14, 0x02, 0x76, 0x02, 0x76, 0xfd, 0xf3, 0xfd, 0x21, 0x02, 0x0d, 0x02, 0xdf, 0xfd, 0x8a, 0xfd, 0x8a, 0x02, 0x74, 0x02, 0x78, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x00, 0x07, 0xc0, 0x06, 0x14, 0x00, 0x03, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x13, 0x00, 0x00, 0x33, 0x11, 0x21, 0x11, 0x01, 0x11, 0x33, 0x09, 0x01, 0x29, 0x01, 0x09, 0x01, 0x21, 0x09, 0x03, 0x33, 0x11, 0x8c, 0x07, 0x34, 0xf9, 0x52, 0x7e, 0x02, 0x38, 0xfd, 0xc8, 0x04, 0x6f, 0xfc, 0x4f, 0x01, 0xd9, 0xfe, 0x27, 0x03, 0xb1, 0xfe, 0x28, 0x02, 0x94, 0xfd, 0xc9, 0x02, 0x37, 0x7f, 0x06, 0x14, 0xf9, 0xec, 0x05, 0x80, 0xfb, 0x14, 0x02, 0x76, 0x02, 0x76, 0xfd, 0xf3, 0xfd, 0x21, 0x02, 0x0d, 0x02, 0xdf, 0xfd, 0x8a, 0xfd, 0x8a, 0x04, 0xec, 0x00, 0x00, 0x2b, 0x00, 0x6c, 0x00, 0x00, 0x09, 0xf9, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x47, 0x00, 0x53, 0x00, 0x5f, 0x00, 0x6b, 0x00, 0x77, 0x00, 0x83, 0x00, 0x8f, 0x00, 0x9b, 0x00, 0xa7, 0x00, 0xb3, 0x00, 0xbf, 0x00, 0xcb, 0x00, 0xd7, 0x00, 0xe3, 0x00, 0xef, 0x00, 0xfb, 0x01, 0x07, 0x01, 0x13, 0x01, 0x1f, 0x01, 0x2b, 0x01, 0x37, 0x01, 0x43, 0x01, 0x4f, 0x01, 0x5b, 0x01, 0x67, 0x01, 0x73, 0x01, 0x7f, 0x01, 0x8b, 0x01, 0x97, 0x01, 0xa3, 0x01, 0xaf, 0x01, 0xbb, 0x01, 0xc7, 0x01, 0xd3, 0x01, 0xe4, 0x01, 0xf0, 0x01, 0xfc, 0x02, 0x08, 0x00, 0x00, 0x01, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x21, 0x22, 0x13, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x25, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x05, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x05, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x05, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x25, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x27, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x27, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x05, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x07, 0x32, 0x15, 0x11, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x23, 0x22, 0x3d, 0x01, 0x34, 0x33, 0x13, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x32, 0x05, 0x22, 0x3d, 0x01, 0x34, 0x33, 0x21, 0x32, 0x1d, 0x01, 0x14, 0x23, 0x01, 0x33, 0x07, 0xff, 0xc6, 0xc6, 0xf8, 0x01, 0xc7, 0x84, 0x43, 0x07, 0xff, 0x41, 0x41, 0xf8, 0x01, 0x43, 0xe9, 0x21, 0x42, 0x22, 0x22, 0x42, 0x21, 0xc9, 0x21, 0x44, 0x20, 0x20, 0x44, 0x21, 0x01, 0x29, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xfe, 0x72, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0x01, 0x8d, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x22, 0x42, 0x21, 0x21, 0x42, 0x22, 0xc7, 0x22, 0x42, 0x21, 0x21, 0x42, 0x22, 0x01, 0x66, 0x21, 0xe2, 0x22, 0x22, 0xe2, 0x21, 0xf9, 0x09, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x22, 0x42, 0x21, 0x21, 0x42, 0x22, 0xc6, 0x22, 0x42, 0x21, 0x21, 0x42, 0x22, 0xc7, 0x22, 0x42, 0x21, 0x21, 0x42, 0x22, 0xc7, 0x22, 0x42, 0x22, 0x22, 0x42, 0x22, 0xc6, 0x21, 0x42, 0x22, 0x22, 0x42, 0x21, 0xc7, 0x21, 0x42, 0x22, 0x22, 0x42, 0x21, 0x20, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc6, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x42, 0x22, 0x22, 0x42, 0x21, 0xc7, 0x21, 0x42, 0x22, 0x22, 0x42, 0x21, 0xc6, 0x22, 0x42, 0x22, 0x22, 0x42, 0x22, 0x21, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc6, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc7, 0x22, 0x42, 0x22, 0x22, 0x42, 0x22, 0xc7, 0x22, 0x42, 0x22, 0x22, 0x42, 0x22, 0xc7, 0x22, 0x42, 0x22, 0x22, 0x42, 0x22, 0x01, 0x01, 0x21, 0x7e, 0x21, 0x21, 0x7e, 0x21, 0x21, 0x21, 0x21, 0xde, 0x26, 0x20, 0x21, 0x21, 0x85, 0x21, 0x43, 0x21, 0x21, 0x43, 0x21, 0xc9, 0x21, 0x44, 0x20, 0x20, 0x44, 0x21, 0xfa, 0x48, 0x22, 0x22, 0x03, 0x9d, 0x21, 0x21, 0x05, 0xd5, 0xdd, 0xfb, 0xe5, 0xdd, 0xdd, 0x04, 0x1b, 0xdd, 0xdd, 0xfb, 0xe5, 0x4a, 0x4a, 0x04, 0x1b, 0x4a, 0xfc, 0x1c, 0x49, 0x25, 0x25, 0x49, 0x26, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0xb7, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0xb7, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0xb7, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0xb4, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0xdb, 0x25, 0xfe, 0xde, 0x25, 0x25, 0x95, 0x20, 0x25, 0x49, 0x25, 0xfd, 0x48, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x94, 0x25, 0x4a, 0x25, 0x25, 0x4a, 0x25, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x09, 0xa2, 0x06, 0x14, 0x00, 0x04, 0x00, 0x09, 0x00, 0x0c, 0x00, 0x0f, 0x00, 0x15, 0x00, 0x00, 0x29, 0x01, 0x09, 0x01, 0x21, 0x07, 0x23, 0x09, 0x01, 0x33, 0x09, 0x02, 0x11, 0x09, 0x01, 0x03, 0x23, 0x09, 0x01, 0x33, 0x01, 0x09, 0xa2, 0xf9, 0x1b, 0xfd, 0x44, 0x02, 0xbc, 0x06, 0xe5, 0x85, 0x7f, 0xfd, 0xc9, 0x02, 0x37, 0x7f, 0xfb, 0x12, 0x01, 0xd9, 0x01, 0xd8, 0xfe, 0x28, 0xfe, 0x27, 0xbb, 0x80, 0xfd, 0xc9, 0x02, 0x37, 0x80, 0x02, 0x37, 0x03, 0x0a, 0x03, 0x0a, 0x94, 0xfd, 0x8a, 0xfd, 0x8a, 0x04, 0xec, 0xfd, 0xf3, 0x02, 0x0d, 0xfb, 0x14, 0x02, 0x0d, 0xfd, 0xf3, 0x04, 0xec, 0xfd, 0x88, 0xfd, 0x8c, 0x02, 0x76, 0x00, 0x05, 0x00, 0x87, 0xff, 0x46, 0x05, 0xc3, 0x05, 0xfc, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x13, 0x09, 0x01, 0x11, 0x09, 0x01, 0x03, 0x11, 0x09, 0x01, 0x11, 0x01, 0x03, 0x37, 0x01, 0x07, 0x11, 0x17, 0x01, 0x27, 0x01, 0x33, 0x11, 0x23, 0xee, 0x02, 0x37, 0x02, 0x37, 0xfd, 0xc9, 0xfd, 0xc9, 0x67, 0x02, 0x9e, 0x02, 0x9d, 0xfd, 0x63, 0x23, 0x34, 0x01, 0xae, 0x33, 0x33, 0xfe, 0x52, 0x34, 0xfe, 0x52, 0x67, 0x67, 0x01, 0x35, 0xfe, 0x95, 0x01, 0x6b, 0x02, 0xd8, 0x01, 0x6b, 0xfe, 0x95, 0xfc, 0xe6, 0x03, 0x5c, 0x01, 0xad, 0xfe, 0x53, 0xfc, 0xa4, 0xfe, 0x53, 0x05, 0x41, 0x63, 0xfe, 0xec, 0x63, 0xfe, 0x5c, 0x63, 0xfe, 0xec, 0x63, 0x02, 0xfa, 0xfd, 0xd8, 0x00, 0xff, 0xff, 0x00, 0x95, 0x00, 0x00, 0x02, 0x30, 0x04, 0x60, 0x10, 0x06, 0x03, 0x4d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x10, 0x06, 0x03, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x05, 0x8a, 0x04, 0x60, 0x10, 0x06, 0x03, 0x5d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe7, 0x04, 0x67, 0x04, 0x79, 0x10, 0x06, 0x03, 0x45, 0x00, 0x00, 0x00, 0x01, 0x00, 0x17, 0xfe, 0x2e, 0x05, 0x5d, 0x00, 0xd0, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x15, 0x23, 0x11, 0x21, 0x11, 0x23, 0x35, 0x21, 0x01, 0x8c, 0x02, 0x5c, 0x01, 0x74, 0xdc, 0xfc, 0x74, 0xdd, 0x01, 0x75, 0xfe, 0xd8, 0x01, 0xf8, 0xaa, 0xfe, 0x08, 0x01, 0xf8, 0xaa, 0x00, 0x02, 0x00, 0x8c, 0x00, 0x00, 0x07, 0xe5, 0x05, 0xfb, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x01, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x01, 0x21, 0x35, 0x21, 0x05, 0x35, 0x21, 0x15, 0x05, 0x4b, 0x01, 0x9d, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xfe, 0xb3, 0xfd, 0x66, 0xfd, 0x8b, 0x02, 0x25, 0x02, 0x99, 0x02, 0x76, 0x04, 0x9a, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xfc, 0x10, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x02, 0x00, 0x1f, 0x00, 0x00, 0x06, 0x2a, 0x05, 0xd0, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x21, 0x09, 0x01, 0x21, 0x09, 0x03, 0x21, 0x09, 0x01, 0x01, 0xdd, 0x02, 0x8f, 0x01, 0x48, 0xfe, 0xb8, 0xfd, 0x71, 0xfe, 0xb8, 0x01, 0x0d, 0xfe, 0x7e, 0x01, 0x82, 0x03, 0x05, 0x01, 0x83, 0xfe, 0x7e, 0x72, 0x02, 0x76, 0x02, 0x76, 0xfd, 0x8a, 0xfd, 0x18, 0x02, 0xe8, 0x02, 0xe8, 0xfd, 0x18, 0xfd, 0x18, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfd, 0xfc, 0x02, 0xfc, 0x07, 0x92, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x23, 0x35, 0x10, 0x13, 0x12, 0x13, 0x33, 0x02, 0x03, 0x02, 0x11, 0x01, 0x4e, 0xb0, 0x90, 0xa8, 0x95, 0x90, 0xea, 0x51, 0x72, 0xfd, 0xfc, 0xea, 0x03, 0x97, 0x01, 0xe2, 0x02, 0x30, 0x01, 0x03, 0xfd, 0xf3, 0xfe, 0x86, 0xfd, 0xee, 0xfc, 0xed, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfd, 0xfc, 0x01, 0x4e, 0x07, 0x89, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x9e, 0xb0, 0xb0, 0x07, 0x89, 0xf6, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0x14, 0x02, 0xfc, 0x07, 0x89, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x15, 0x10, 0x13, 0x12, 0x13, 0x23, 0x02, 0x03, 0x02, 0x11, 0x35, 0x01, 0x4e, 0x72, 0x84, 0xb7, 0x90, 0xbb, 0x82, 0x90, 0x07, 0x89, 0xea, 0xfc, 0xa5, 0xfe, 0x57, 0xfe, 0x14, 0xfe, 0x65, 0x01, 0x45, 0x01, 0xee, 0x02, 0x26, 0x03, 0x32, 0xea, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfd, 0xfc, 0x02, 0xfc, 0x07, 0x92, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x35, 0x10, 0x03, 0x02, 0x03, 0x33, 0x12, 0x13, 0x12, 0x11, 0x15, 0x02, 0x4c, 0x73, 0x51, 0xea, 0x90, 0x96, 0xa7, 0x90, 0xfd, 0xfc, 0xea, 0x03, 0x13, 0x02, 0x12, 0x01, 0x79, 0x02, 0x0e, 0xfe, 0xfd, 0xfd, 0xd0, 0xfe, 0x1e, 0xfc, 0x69, 0xea, 0x00, 0x00, 0x01, 0x02, 0x4b, 0xfd, 0xfc, 0x02, 0xfc, 0x07, 0x89, 0x00, 0x04, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x30, 0x02, 0xfb, 0xaf, 0x07, 0x89, 0xf6, 0x73, 0x09, 0x8d, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0x14, 0x02, 0xfc, 0x07, 0x89, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x15, 0x10, 0x03, 0x02, 0x03, 0x23, 0x12, 0x13, 0x12, 0x11, 0x02, 0x4c, 0xaf, 0x90, 0x81, 0xbc, 0x90, 0xb7, 0x84, 0x73, 0x07, 0x89, 0xea, 0xfc, 0xcd, 0xfd, 0xdb, 0xfe, 0x12, 0xfe, 0xbb, 0x01, 0x9b, 0x01, 0xec, 0x01, 0xa9, 0x03, 0x5b, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfd, 0xfc, 0x02, 0xfc, 0x07, 0x6d, 0x00, 0x05, 0x00, 0x00, 0x01, 0x23, 0x11, 0x21, 0x15, 0x21, 0x01, 0x4e, 0xb0, 0x02, 0x5d, 0xfe, 0x53, 0xfd, 0xfc, 0x09, 0x71, 0xc3, 0x00, 0x01, 0x00, 0x9e, 0xfd, 0xfc, 0x01, 0x4e, 0x07, 0x89, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0x9e, 0xb0, 0xb0, 0x07, 0x89, 0xf6, 0x73, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0x14, 0x02, 0xfc, 0x07, 0x89, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x4e, 0x01, 0xad, 0xfd, 0xa3, 0x07, 0x89, 0xf7, 0x4e, 0xc3, 0x09, 0x75, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfd, 0xfc, 0x02, 0xfc, 0x07, 0x6d, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x02, 0x4c, 0xfe, 0x52, 0x02, 0x5d, 0xfd, 0xfc, 0x08, 0xae, 0xc3, 0xf6, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x4b, 0xfd, 0xfc, 0x02, 0xfc, 0x07, 0x7a, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x11, 0x23, 0x02, 0x4c, 0xaf, 0xaf, 0x07, 0x7a, 0xf6, 0x82, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0x14, 0x02, 0xfc, 0x07, 0x7a, 0x00, 0x05, 0x00, 0x00, 0x01, 0x33, 0x11, 0x21, 0x35, 0x21, 0x02, 0x4c, 0xaf, 0xfd, 0xa3, 0x01, 0xae, 0x07, 0x7a, 0xf6, 0x9a, 0xc3, 0x00, 0x01, 0x02, 0x5f, 0xfd, 0xea, 0x04, 0xd0, 0x07, 0x6d, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x23, 0x11, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x03, 0x07, 0xa7, 0x63, 0x6d, 0xa8, 0xf7, 0xfd, 0x5b, 0x3d, 0x33, 0xfd, 0xea, 0x07, 0x75, 0xdf, 0x91, 0x9e, 0xb0, 0x66, 0x57, 0x99, 0x00, 0x00, 0x00, 0x01, 0x00, 0x97, 0xfd, 0xfc, 0x03, 0x07, 0x07, 0x86, 0x00, 0x18, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x19, 0x01, 0x23, 0x11, 0x10, 0x27, 0x26, 0x2f, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x10, 0x07, 0x06, 0x02, 0x52, 0x34, 0x26, 0x5b, 0xa7, 0x64, 0x43, 0xeb, 0x37, 0x37, 0xe9, 0x45, 0x64, 0xa7, 0x5b, 0x24, 0x02, 0xc1, 0x20, 0x3d, 0x93, 0xfe, 0x43, 0xfd, 0xe8, 0x02, 0x0c, 0x01, 0xb7, 0x5f, 0x41, 0x04, 0x01, 0xbb, 0x45, 0x63, 0x01, 0xb3, 0x02, 0x0c, 0xfd, 0xe8, 0xfe, 0x48, 0x98, 0x3c, 0x00, 0x00, 0x00, 0x01, 0x02, 0x5f, 0xfe, 0x14, 0x04, 0xd0, 0x07, 0x86, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x03, 0x07, 0x33, 0x3d, 0x5b, 0xfd, 0xf7, 0xa6, 0x6f, 0x63, 0x07, 0x86, 0xf8, 0x94, 0x9a, 0x56, 0x66, 0xb0, 0x9e, 0x8f, 0xe1, 0x07, 0x64, 0x00, 0x00, 0x01, 0x02, 0x5f, 0xfd, 0xf4, 0x03, 0x07, 0x07, 0x8c, 0x00, 0x03, 0x00, 0x00, 0x01, 0x23, 0x11, 0x33, 0x03, 0x07, 0xa7, 0xa7, 0xfd, 0xf4, 0x09, 0x98, 0x00, 0x00, 0x00, 0x01, 0x00, 0x97, 0xfd, 0xea, 0x03, 0x07, 0x07, 0x6d, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x02, 0x60, 0x34, 0x3d, 0x5b, 0xfd, 0xf8, 0xa7, 0x6d, 0x64, 0xfd, 0xea, 0x07, 0x7d, 0x99, 0x57, 0x66, 0xb0, 0x9e, 0x91, 0xdf, 0xf8, 0x8b, 0x00, 0x00, 0x01, 0x02, 0x5f, 0xfd, 0xfc, 0x04, 0xd0, 0x07, 0x86, 0x00, 0x18, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x19, 0x01, 0x33, 0x11, 0x10, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x07, 0x06, 0x07, 0x06, 0x19, 0x01, 0x23, 0x11, 0x10, 0x37, 0x36, 0x03, 0x14, 0x36, 0x24, 0x5a, 0xa7, 0x63, 0x45, 0xe9, 0x37, 0x37, 0xeb, 0x43, 0x63, 0xa7, 0x5a, 0x26, 0x02, 0xc1, 0x21, 0x3c, 0x98, 0x01, 0xb8, 0x02, 0x18, 0xfd, 0xf4, 0xfe, 0x4d, 0x63, 0x45, 0xbb, 0x01, 0x04, 0x41, 0x5f, 0xfe, 0x49, 0xfd, 0xf4, 0x02, 0x18, 0x01, 0xbd, 0x93, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x97, 0xfe, 0x14, 0x03, 0x07, 0x07, 0x86, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x02, 0x60, 0xa7, 0x64, 0x6f, 0xa5, 0xf8, 0xfd, 0x5b, 0x3d, 0x34, 0x07, 0x86, 0xf8, 0x9c, 0xe1, 0x8f, 0x9e, 0xb0, 0x66, 0x56, 0x9a, 0x00, 0x00, 0x00, 0x01, 0x01, 0x83, 0xfe, 0x00, 0x02, 0x37, 0x07, 0x89, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x01, 0x84, 0xb2, 0xfe, 0x00, 0x09, 0x89, 0xf6, 0x77, 0x00, 0x00, 0x02, 0x00, 0x31, 0x00, 0x86, 0x05, 0xa0, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x11, 0x00, 0x00, 0x25, 0x09, 0x01, 0x11, 0x21, 0x11, 0x21, 0x03, 0x21, 0x03, 0x35, 0x03, 0x13, 0x35, 0x21, 0x13, 0x23, 0x03, 0x01, 0xfb, 0xfe, 0x37, 0x01, 0xc9, 0x01, 0xfe, 0x01, 0xa7, 0x01, 0xfc, 0x5c, 0x5a, 0xf0, 0xf0, 0x03, 0xa4, 0x01, 0xf3, 0x01, 0x86, 0x01, 0xfc, 0x01, 0xfc, 0xfe, 0xef, 0x02, 0x68, 0xfb, 0xc2, 0x01, 0x72, 0x83, 0xfe, 0xf6, 0xfe, 0xf6, 0x83, 0x03, 0x76, 0xfd, 0x98, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x27, 0x04, 0xc4, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x09, 0x01, 0x21, 0x11, 0x21, 0x06, 0x26, 0xfa, 0x81, 0x02, 0xbf, 0x02, 0xc0, 0xfa, 0x81, 0x05, 0x7f, 0x02, 0xa0, 0x02, 0x24, 0xfb, 0x3c, 0x01, 0xf8, 0x00, 0x00, 0x04, 0x00, 0x87, 0xff, 0x46, 0x05, 0xc3, 0x05, 0xfc, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x00, 0x13, 0x09, 0x01, 0x11, 0x09, 0x01, 0x03, 0x11, 0x09, 0x01, 0x11, 0x01, 0x00, 0x14, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x02, 0x10, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x10, 0x0e, 0x01, 0x22, 0x26, 0xee, 0x02, 0x37, 0x02, 0x37, 0xfd, 0xc9, 0xfd, 0xc9, 0x67, 0x02, 0x9e, 0x02, 0x9d, 0xfd, 0x63, 0xfe, 0x96, 0x30, 0x31, 0x53, 0x53, 0xc5, 0x53, 0x53, 0x31, 0x30, 0x30, 0x31, 0x53, 0x53, 0xc5, 0x53, 0x53, 0x31, 0x97, 0x7c, 0xd7, 0xfc, 0xd6, 0x7c, 0x7c, 0xd6, 0xfc, 0xd7, 0x01, 0x35, 0xfe, 0x95, 0x01, 0x6b, 0x02, 0xd8, 0x01, 0x6b, 0xfe, 0x95, 0xfc, 0xe6, 0x03, 0x5c, 0x01, 0xad, 0xfe, 0x53, 0xfc, 0xa4, 0xfe, 0x53, 0x03, 0xc8, 0xda, 0x5d, 0x5c, 0x36, 0x36, 0x36, 0x36, 0x5c, 0x5d, 0xda, 0x5d, 0x5c, 0x36, 0x36, 0x36, 0x36, 0x5c, 0xfe, 0xaa, 0x01, 0x18, 0xee, 0x8a, 0x8a, 0xee, 0xfe, 0xe8, 0xee, 0x8a, 0x8a, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x05, 0x00, 0x9a, 0x05, 0x85, 0x03, 0x8e, 0x10, 0x06, 0x0a, 0xda, 0x00, 0x00, 0x00, 0x03, 0x00, 0x50, 0xfe, 0xf7, 0x04, 0x54, 0x02, 0x5a, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x20, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x03, 0x85, 0xb6, 0x2d, 0x2e, 0x2e, 0x2d, 0xb6, 0x2d, 0x2e, 0x2e, 0x88, 0x91, 0x99, 0x99, 0x91, 0x92, 0x99, 0x99, 0xfe, 0x81, 0xc9, 0xcf, 0x7b, 0x02, 0x01, 0x56, 0x56, 0xac, 0xad, 0x56, 0x56, 0x56, 0x56, 0xad, 0xac, 0x56, 0xaf, 0xde, 0xd3, 0xd4, 0xde, 0xde, 0xd4, 0xd3, 0xde, 0xfc, 0xac, 0x02, 0xd1, 0x29, 0x74, 0x27, 0xfc, 0xbd, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8e, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x07, 0x27, 0x25, 0x35, 0x33, 0x15, 0x25, 0x17, 0x05, 0x00, 0x10, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x01, 0x4e, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xa7, 0xfa, 0x1e, 0x01, 0x18, 0xa7, 0x01, 0x06, 0x1e, 0xfe, 0xdc, 0x02, 0x33, 0x96, 0xfe, 0xf9, 0x96, 0x96, 0x01, 0x07, 0x03, 0xb6, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x64, 0xa8, 0x04, 0xe6, 0x5d, 0x63, 0x68, 0xc0, 0x83, 0x61, 0x61, 0x6d, 0xfc, 0x40, 0x01, 0x96, 0xe7, 0xe7, 0xfe, 0x6a, 0xe7, 0x00, 0x01, 0x00, 0x83, 0xfe, 0x2e, 0x04, 0x0f, 0x00, 0xd0, 0x00, 0x07, 0x00, 0x00, 0x01, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x01, 0x1b, 0x02, 0x5c, 0x98, 0xfc, 0x74, 0x98, 0xfe, 0xd8, 0x01, 0xf8, 0xfd, 0x5e, 0x02, 0xa2, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x01, 0x33, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x01, 0x56, 0xc3, 0xd5, 0xe8, 0x91, 0xc4, 0xfd, 0xd5, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0xfd, 0xff, 0x02, 0x7e, 0x2b, 0x98, 0x2f, 0xfc, 0xe6, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x38, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x01, 0x21, 0x15, 0x21, 0x35, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x01, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x02, 0x13, 0x01, 0x89, 0xfd, 0x9f, 0x4a, 0xec, 0x1e, 0x37, 0x2b, 0x56, 0x46, 0x35, 0x77, 0x67, 0x57, 0x83, 0x36, 0x93, 0xb1, 0x2b, 0x38, 0x0f, 0xa0, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0xfd, 0xff, 0x8e, 0x81, 0x4d, 0xf1, 0x22, 0x3f, 0x55, 0x28, 0x3f, 0x4e, 0x26, 0x3a, 0xab, 0x24, 0x1f, 0x97, 0x7d, 0x3a, 0x69, 0x46, 0x12, 0xa7, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x44, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x05, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x03, 0x59, 0x0c, 0x6a, 0xc2, 0xb0, 0x39, 0x7b, 0x4f, 0x52, 0x70, 0x3e, 0x69, 0x67, 0x60, 0x59, 0x7e, 0x83, 0x50, 0x50, 0x53, 0x52, 0x2f, 0x6d, 0x60, 0x55, 0x7b, 0x37, 0x91, 0xad, 0x5d, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0x96, 0x03, 0x81, 0x5d, 0x8d, 0x9c, 0x17, 0x1b, 0xa8, 0x30, 0x1c, 0x4f, 0x4c, 0x47, 0x4e, 0x8c, 0x3c, 0x3a, 0x3c, 0x3f, 0x15, 0x20, 0x97, 0x18, 0x14, 0x89, 0x73, 0x51, 0x72, 0x00, 0x04, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x1e, 0x00, 0x29, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x25, 0x03, 0x33, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x02, 0x78, 0xf2, 0xf2, 0x15, 0xb9, 0x7f, 0x7f, 0xa4, 0xfe, 0x70, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0x4f, 0xfe, 0x82, 0x02, 0x48, 0xfd, 0xb8, 0x8d, 0xd3, 0xd3, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x39, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x01, 0x21, 0x15, 0x21, 0x15, 0x06, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x01, 0x6f, 0x02, 0x03, 0xfe, 0x98, 0x03, 0x39, 0x1b, 0x9f, 0xba, 0xc0, 0xab, 0x39, 0x78, 0x4f, 0x55, 0x6c, 0x3d, 0x5d, 0x6a, 0x6a, 0x5d, 0x2d, 0x5b, 0x50, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0x01, 0x19, 0x8e, 0xab, 0x01, 0x0a, 0xb0, 0x95, 0x98, 0xac, 0x14, 0x18, 0xac, 0x2f, 0x1b, 0x61, 0x55, 0x56, 0x61, 0x14, 0x25, 0x00, 0x04, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x40, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x05, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x13, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x12, 0x33, 0x32, 0x16, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x02, 0x5d, 0x46, 0x53, 0x53, 0x46, 0x46, 0x53, 0x53, 0xbf, 0x4b, 0x58, 0x2a, 0x6b, 0x72, 0x05, 0x08, 0x73, 0x46, 0x90, 0xa8, 0xaf, 0x90, 0xa6, 0xad, 0xd2, 0xb4, 0x30, 0x60, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0x9f, 0x62, 0x5b, 0x5a, 0x62, 0x62, 0x5a, 0x5b, 0x62, 0x01, 0x9d, 0x9c, 0x23, 0x16, 0x94, 0x50, 0x0b, 0x3d, 0xb1, 0x94, 0x91, 0xb3, 0xfd, 0xe7, 0xda, 0x01, 0x0b, 0x13, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x01, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x01, 0x46, 0x02, 0x67, 0xfe, 0xb8, 0xad, 0x01, 0x2f, 0xfe, 0x5f, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0x01, 0x19, 0x4b, 0xfc, 0xa3, 0x03, 0x1a, 0x00, 0x05, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x3f, 0x00, 0x4b, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x05, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x25, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x02, 0x6a, 0x4c, 0x55, 0x55, 0x4c, 0x4b, 0x56, 0x56, 0xfe, 0xe6, 0x04, 0x5f, 0xa4, 0x8e, 0x8d, 0xa4, 0x5f, 0x03, 0x0d, 0x6a, 0xaa, 0x9c, 0x9c, 0xab, 0x6a, 0x4f, 0x48, 0x46, 0x43, 0x4a, 0x4a, 0x43, 0x46, 0x48, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0xe6, 0x50, 0x49, 0x49, 0x50, 0x51, 0x48, 0x49, 0x50, 0x49, 0x01, 0x76, 0x53, 0x74, 0x88, 0x88, 0x74, 0x53, 0x76, 0x01, 0x03, 0x83, 0x5c, 0x8a, 0x97, 0x97, 0x8a, 0x5c, 0x83, 0xc1, 0x3d, 0x42, 0x42, 0x3d, 0x3e, 0x42, 0x42, 0x00, 0x00, 0x04, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x34, 0x00, 0x40, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x01, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x36, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x02, 0x23, 0x22, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0x01, 0x68, 0x4c, 0x57, 0x2a, 0x6b, 0x72, 0x05, 0x09, 0x74, 0x47, 0x8f, 0xa7, 0xae, 0x90, 0xa7, 0xac, 0xd2, 0xb4, 0x30, 0x60, 0xc3, 0x47, 0x52, 0x52, 0x47, 0x46, 0x53, 0x53, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0xfd, 0x8b, 0x9c, 0x24, 0x15, 0x93, 0x4f, 0x0d, 0x3c, 0xaf, 0x94, 0x91, 0xb4, 0xfd, 0xe8, 0xda, 0xfe, 0xf6, 0x13, 0x01, 0xb4, 0x62, 0x5b, 0x5b, 0x62, 0x62, 0x5b, 0x5b, 0x62, 0x00, 0x05, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x32, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x13, 0x33, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfa, 0xe8, 0x01, 0x67, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9c, 0xfe, 0xd9, 0xa3, 0xb8, 0x8e, 0x9b, 0xaa, 0x69, 0x8f, 0xfe, 0x6b, 0x02, 0xb7, 0x3a, 0x3e, 0x3e, 0x3a, 0x39, 0x3e, 0x3e, 0x39, 0x75, 0x7a, 0x7a, 0x75, 0x76, 0x7b, 0x7b, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0xfe, 0x3e, 0x02, 0x3e, 0x27, 0x89, 0x2a, 0xfd, 0x36, 0x80, 0x02, 0xde, 0x97, 0xa3, 0xa2, 0x97, 0x97, 0xa2, 0xa3, 0x97, 0x7b, 0xe4, 0xd1, 0xd0, 0xe4, 0xe4, 0xd0, 0xd1, 0xe4, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x03, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x12, 0x04, 0x7a, 0x01, 0xf0, 0xac, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x04, 0x7a, 0x01, 0x9a, 0x01, 0x58, 0xfe, 0xa8, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x01, 0xe2, 0x90, 0xfd, 0x96, 0x0a, 0x32, 0xf5, 0xce, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0xfd, 0x96, 0x0a, 0x32, 0xf5, 0xce, 0x00, 0x03, 0xff, 0xee, 0x01, 0xf0, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, 0x03, 0x52, 0x01, 0x16, 0xfd, 0x3d, 0x01, 0x0b, 0xfd, 0x3e, 0x01, 0x15, 0x01, 0xf0, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x03, 0x52, 0x01, 0x16, 0xfd, 0x3d, 0x01, 0x0b, 0xfd, 0x3e, 0x01, 0x15, 0x01, 0x9a, 0x01, 0x58, 0xfe, 0xa8, 0x01, 0x58, 0xfe, 0xa8, 0x01, 0x58, 0xfe, 0xa8, 0x00, 0x03, 0x01, 0xe2, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0xe2, 0x90, 0x90, 0x90, 0x90, 0x90, 0xfd, 0x96, 0x03, 0x0c, 0xfc, 0xf4, 0x03, 0xc0, 0x02, 0xb2, 0xfd, 0x4e, 0x03, 0x66, 0x03, 0x0c, 0xfc, 0xf4, 0x00, 0x00, 0x03, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0xfe, 0xe0, 0x01, 0x20, 0xfe, 0xe0, 0x01, 0x20, 0xfd, 0x96, 0x03, 0x0c, 0xfc, 0xf4, 0x03, 0xc0, 0x02, 0xb2, 0xfd, 0x4e, 0x03, 0x66, 0x03, 0x0c, 0xfc, 0xf4, 0x00, 0x04, 0xff, 0xed, 0x01, 0xf0, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x13, 0xa9, 0xa2, 0xa1, 0xa2, 0xa1, 0xa2, 0xaa, 0x01, 0xf0, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0xac, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x69, 0x02, 0xf2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0xa9, 0xa2, 0xa1, 0xa2, 0xa0, 0xa2, 0xab, 0x01, 0x9a, 0x01, 0x58, 0xfe, 0xa8, 0x01, 0x58, 0xfe, 0xa8, 0x01, 0x58, 0xfe, 0xa8, 0x01, 0x58, 0xfe, 0xa8, 0x00, 0x00, 0x00, 0x04, 0x01, 0xe2, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0xe2, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x05, 0x96, 0x02, 0x32, 0xfd, 0xce, 0xf8, 0x00, 0x02, 0x32, 0xfd, 0xce, 0x05, 0x73, 0x01, 0xd9, 0xfe, 0x27, 0xfd, 0x73, 0x01, 0xd9, 0xfe, 0x27, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0xfe, 0xe0, 0x01, 0x20, 0xfe, 0xe0, 0x01, 0x20, 0xfe, 0xe0, 0x01, 0x20, 0x05, 0x96, 0x02, 0x32, 0xfd, 0xce, 0xf8, 0x00, 0x02, 0x32, 0xfd, 0xce, 0x05, 0x73, 0x01, 0xd9, 0xfe, 0x27, 0xfd, 0x73, 0x01, 0xd9, 0xfe, 0x27, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0x02, 0x86, 0xfe, 0x0a, 0xfd, 0x96, 0x05, 0x06, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0x02, 0x86, 0xfe, 0x0a, 0xfd, 0x96, 0x05, 0x5c, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0x02, 0xce, 0xfe, 0x52, 0xfd, 0x96, 0x05, 0x06, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x02, 0xce, 0xfe, 0x52, 0xfd, 0x96, 0x05, 0x5c, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x02, 0x9c, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x02, 0x84, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0xfa, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x02, 0xf2, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x02, 0x84, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0xfa, 0xa4, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x02, 0x9c, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x02, 0xcc, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0xfa, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x02, 0xf2, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x02, 0xcc, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0xfa, 0xa4, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0xe2, 0x90, 0x01, 0xf6, 0x01, 0xf0, 0x05, 0xd8, 0xfa, 0xd4, 0xac, 0x00, 0x01, 0x01, 0xe2, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x01, 0xe2, 0x90, 0x01, 0xf6, 0x01, 0x9a, 0x06, 0x2e, 0xfb, 0x2a, 0xfe, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9a, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x15, 0x01, 0x9a, 0x01, 0x20, 0x01, 0xae, 0x01, 0xf0, 0x05, 0xd8, 0xfa, 0xd4, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9a, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0x01, 0xae, 0x01, 0x9a, 0x06, 0x2e, 0xfb, 0x2a, 0xfe, 0xa8, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x12, 0x01, 0xf4, 0x90, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0x28, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x33, 0x11, 0x12, 0x01, 0xf4, 0x90, 0x01, 0x9a, 0x01, 0x58, 0x04, 0xd6, 0xf9, 0xd2, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x21, 0x11, 0x12, 0x01, 0xac, 0x01, 0x20, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0x28, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x21, 0x11, 0x12, 0x01, 0xac, 0x01, 0x20, 0x01, 0x9a, 0x01, 0x58, 0x04, 0xd6, 0xf9, 0xd2, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x0a, 0x32, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x0a, 0x32, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0x48, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x5a, 0x05, 0xd8, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0x48, 0x90, 0x01, 0xf6, 0xfe, 0x52, 0xfd, 0x96, 0x05, 0x06, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x0a, 0x32, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0x48, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x06, 0x2e, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x48, 0x90, 0x01, 0xf6, 0xfe, 0x52, 0xfd, 0x96, 0x05, 0x5c, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x0a, 0x32, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xf5, 0xce, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xf5, 0xce, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xac, 0x01, 0x20, 0x48, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfa, 0x28, 0xfb, 0xa6, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xf4, 0x90, 0x48, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xfa, 0xfa, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xf5, 0xce, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xac, 0x01, 0x20, 0x48, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xf9, 0xd2, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xf4, 0x90, 0x48, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfa, 0xa4, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xf5, 0xce, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x04, 0x7a, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x02, 0x84, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x56, 0xac, 0xfb, 0xa6, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0x02, 0x86, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x56, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x04, 0x7a, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x04, 0x7a, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x02, 0xcc, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x56, 0xac, 0xfb, 0xa6, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x02, 0xce, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x56, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x04, 0x7a, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x12, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x12, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0x01, 0x9a, 0x01, 0x58, 0x04, 0xd6, 0xfa, 0xd4, 0xac, 0x56, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x35, 0x12, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfd, 0x7a, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfb, 0x2a, 0xfe, 0xa8, 0x56, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x12, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0x01, 0x9a, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x12, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x12, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0x01, 0x9a, 0x01, 0x58, 0x04, 0xd6, 0xfa, 0xd4, 0xac, 0x56, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x12, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfd, 0x32, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfb, 0x2a, 0xfe, 0xa8, 0x56, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x12, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0x01, 0x9a, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x02, 0x72, 0x90, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0x01, 0xf0, 0xfb, 0xa6, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, 0x23, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0x48, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfa, 0xd4, 0xac, 0x56, 0xfb, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x23, 0x35, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0x48, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x56, 0xac, 0x05, 0x2c, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xf4, 0x90, 0x48, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0x56, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x48, 0x90, 0x01, 0xf6, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x56, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x0a, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x01, 0x9a, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x20, 0x01, 0xae, 0xfe, 0x52, 0xfd, 0x96, 0x04, 0x04, 0x01, 0x58, 0x04, 0xd6, 0xfb, 0x2a, 0xfe, 0xa8, 0xfb, 0xfc, 0x00, 0x02, 0xff, 0xee, 0x01, 0xf0, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x33, 0x35, 0x21, 0x15, 0x12, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0x01, 0xf0, 0xac, 0xac, 0xac, 0xac, 0x00, 0x02, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x02, 0x72, 0x01, 0xf6, 0xfb, 0x86, 0x01, 0xf4, 0x01, 0x9a, 0x01, 0x58, 0xfe, 0xa8, 0x01, 0x58, 0xfe, 0xa8, 0x00, 0x00, 0x00, 0x02, 0x01, 0xe2, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0xe2, 0x90, 0x90, 0x90, 0x02, 0xf2, 0x04, 0xd6, 0xfb, 0x2a, 0xfa, 0xa4, 0x04, 0x04, 0xfb, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0xfe, 0xe0, 0x01, 0x20, 0x02, 0xf2, 0x04, 0xd6, 0xfb, 0x2a, 0xfa, 0xa4, 0x04, 0x04, 0xfb, 0xfc, 0x00, 0x02, 0xff, 0xee, 0x01, 0x44, 0x04, 0x68, 0x03, 0x48, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x12, 0x04, 0x7a, 0xfb, 0x86, 0x04, 0x7a, 0x02, 0x9c, 0xac, 0xac, 0xfe, 0xa8, 0xac, 0xac, 0x00, 0x00, 0x02, 0x01, 0x52, 0xfd, 0x96, 0x03, 0x03, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, 0x52, 0x90, 0x90, 0x90, 0xfd, 0x96, 0x0a, 0x32, 0xf5, 0xce, 0x0a, 0x32, 0xf5, 0xce, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x03, 0x48, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0x02, 0x86, 0xfe, 0x0a, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x05, 0xb2, 0xac, 0xac, 0xac, 0xfc, 0x52, 0x00, 0x00, 0x01, 0x01, 0x52, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x01, 0x52, 0x03, 0x16, 0xfe, 0x9a, 0x90, 0x90, 0xfd, 0x96, 0x05, 0x06, 0xac, 0xfb, 0xa6, 0x04, 0x5a, 0xfb, 0xa6, 0x00, 0x00, 0x02, 0x01, 0x52, 0xfd, 0x96, 0x04, 0x68, 0x03, 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x52, 0x03, 0x16, 0xfd, 0x7a, 0x90, 0x01, 0xf6, 0xfe, 0x9a, 0xfd, 0x96, 0x05, 0xb2, 0xac, 0xfa, 0xfa, 0x04, 0x5a, 0xac, 0xfc, 0x52, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x03, 0x48, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0xfe, 0x0c, 0x02, 0x84, 0xfd, 0x96, 0x03, 0xae, 0xac, 0xac, 0xac, 0xfa, 0x4e, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x03, 0x03, 0x02, 0x9c, 0x00, 0x09, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x12, 0x03, 0x14, 0x90, 0x90, 0x90, 0x01, 0xf0, 0xac, 0xfa, 0xfa, 0x04, 0x5a, 0xfb, 0xa6, 0x04, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0xfd, 0x96, 0x03, 0x03, 0x03, 0x48, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x02, 0x72, 0xfd, 0x7c, 0x03, 0x14, 0xfe, 0x50, 0xfe, 0x9c, 0x01, 0xf4, 0xfd, 0x96, 0x05, 0x06, 0xac, 0xfa, 0x4e, 0x03, 0xae, 0xac, 0xfb, 0xa6, 0x00, 0x01, 0x01, 0xe2, 0x01, 0x44, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x01, 0xe2, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0x01, 0xf6, 0x01, 0x44, 0x06, 0x84, 0xfb, 0x80, 0xac, 0xac, 0xac, 0x00, 0x00, 0x00, 0x01, 0x01, 0x52, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x52, 0x90, 0x90, 0x90, 0x01, 0x66, 0x01, 0xf0, 0x05, 0xd8, 0xfa, 0xd4, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0x00, 0x00, 0x00, 0x02, 0x01, 0x52, 0x01, 0x44, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x02, 0x72, 0x90, 0x01, 0x66, 0xfc, 0xea, 0x90, 0x02, 0x86, 0x02, 0x9c, 0x05, 0x2c, 0xfb, 0x80, 0xac, 0xfe, 0xa8, 0x06, 0x84, 0xfa, 0x28, 0xac, 0x00, 0x01, 0xff, 0xee, 0x01, 0x44, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x03, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x12, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0x01, 0x44, 0xac, 0xac, 0xac, 0x04, 0x80, 0xf9, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x03, 0x03, 0x07, 0xc8, 0x00, 0x09, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x64, 0x90, 0x90, 0x90, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0x05, 0x2c, 0xfa, 0x28, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x01, 0x44, 0x03, 0x03, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x11, 0x33, 0x11, 0x12, 0x01, 0x64, 0x90, 0xfe, 0x0c, 0x02, 0x84, 0x90, 0x02, 0x9c, 0xac, 0x04, 0x80, 0xfa, 0xd4, 0xfe, 0xa8, 0xac, 0x05, 0xd8, 0xf9, 0x7c, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x0a, 0x32, 0xfb, 0x80, 0xac, 0xac, 0xac, 0xfc, 0x52, 0x00, 0x02, 0x01, 0x52, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0x52, 0x90, 0x90, 0x90, 0x01, 0x66, 0xfe, 0x9a, 0xfd, 0x96, 0x0a, 0x32, 0xf5, 0xce, 0x0a, 0x32, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x00, 0x00, 0x00, 0x03, 0x01, 0x52, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x02, 0x72, 0x90, 0x01, 0x66, 0xfc, 0xea, 0x90, 0x90, 0x01, 0xf6, 0xfe, 0x9a, 0x02, 0x9c, 0x05, 0x2c, 0xfb, 0x80, 0xac, 0xfa, 0xfa, 0x0a, 0x32, 0xf5, 0xce, 0x04, 0x5a, 0xac, 0xfc, 0x52, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0xfd, 0x96, 0x03, 0xae, 0xac, 0xac, 0xac, 0x04, 0x80, 0xf5, 0xce, 0x00, 0x02, 0xff, 0xee, 0xfd, 0x96, 0x03, 0x03, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, 0x52, 0xfe, 0x9c, 0x01, 0x64, 0x90, 0x90, 0x90, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0x05, 0x2c, 0xf5, 0xce, 0x0a, 0x32, 0xf5, 0xce, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0xfd, 0x96, 0x03, 0x03, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x03, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x12, 0x01, 0x64, 0x90, 0x90, 0xfe, 0x9c, 0x01, 0xf4, 0x90, 0x90, 0x02, 0x9c, 0xac, 0x04, 0x80, 0xfa, 0xd4, 0xfa, 0xfa, 0x03, 0xae, 0xac, 0xfb, 0xa6, 0x0a, 0x32, 0xf5, 0xce, 0x00, 0x00, 0x02, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x03, 0x48, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0xe2, 0xfe, 0x0c, 0x04, 0x7a, 0xfe, 0x0a, 0xfd, 0x7c, 0x04, 0x7a, 0xfd, 0x96, 0x03, 0xae, 0xac, 0xac, 0xfc, 0x52, 0x05, 0x06, 0xac, 0xac, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x0b, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x12, 0x04, 0x7a, 0xfe, 0x9a, 0x90, 0x90, 0x90, 0x01, 0xf0, 0xac, 0xac, 0xfb, 0xa6, 0x04, 0x5a, 0xfb, 0xa6, 0x04, 0x5a, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x03, 0x48, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x12, 0x04, 0x7a, 0xfc, 0xea, 0xfe, 0x9c, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x9a, 0x02, 0x9c, 0xac, 0xac, 0xfa, 0xfa, 0x03, 0xae, 0xac, 0xfb, 0xa6, 0x04, 0x5a, 0xac, 0xfc, 0x52, 0x00, 0x02, 0xff, 0xee, 0x01, 0x44, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x12, 0x04, 0x7a, 0xfb, 0x86, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0x01, 0x44, 0xac, 0xac, 0x01, 0x58, 0xac, 0x04, 0x80, 0xfb, 0x80, 0xac, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x12, 0x01, 0x64, 0x90, 0x90, 0x90, 0x01, 0x66, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0x01, 0x44, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x12, 0x04, 0x7a, 0xfb, 0x86, 0x01, 0x64, 0x90, 0x90, 0x90, 0x01, 0x66, 0x01, 0x44, 0xac, 0xac, 0x01, 0x58, 0xac, 0x04, 0x80, 0xfa, 0xd4, 0x05, 0x2c, 0xfb, 0x80, 0xac, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0xe2, 0xfe, 0x0c, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0xf4, 0x90, 0x01, 0xf6, 0xfe, 0x0a, 0x01, 0xf6, 0xfe, 0x0a, 0xfd, 0x96, 0x03, 0xae, 0xac, 0xac, 0xac, 0x04, 0x80, 0xfb, 0x80, 0xac, 0xac, 0xac, 0xfc, 0x52, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x13, 0x00, 0x00, 0x03, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x12, 0x01, 0x64, 0x90, 0x90, 0x90, 0x01, 0x66, 0xfe, 0x9a, 0x90, 0x90, 0x90, 0x01, 0xf0, 0xac, 0x05, 0x2c, 0xfa, 0xd4, 0x05, 0x2c, 0xfa, 0xd4, 0xac, 0xfb, 0xa6, 0x04, 0x5a, 0xfb, 0xa6, 0x04, 0x5a, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfd, 0x96, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x17, 0x00, 0x00, 0x01, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, 0x35, 0x21, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x02, 0x72, 0x01, 0xf6, 0xfe, 0x9a, 0xfe, 0x50, 0xfe, 0x9c, 0x01, 0xf4, 0xfe, 0x0c, 0x01, 0x64, 0x90, 0x90, 0x90, 0x01, 0x66, 0xfd, 0x96, 0x04, 0x5a, 0xac, 0xfc, 0x52, 0x03, 0xae, 0xac, 0xfb, 0xa6, 0x05, 0x06, 0xac, 0x04, 0x80, 0xfa, 0xd4, 0x05, 0x2c, 0xfb, 0x80, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x11, 0x34, 0x37, 0x36, 0x33, 0x21, 0x15, 0x21, 0x22, 0x06, 0x15, 0x11, 0x01, 0xe2, 0x49, 0x52, 0x97, 0x01, 0x54, 0xfe, 0xac, 0x50, 0x52, 0xfd, 0x96, 0x03, 0x60, 0xa1, 0x7f, 0x86, 0xac, 0x7e, 0x7c, 0xfc, 0xa0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfd, 0x96, 0x02, 0x73, 0x02, 0x9c, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x34, 0x27, 0x26, 0x23, 0x21, 0x35, 0x21, 0x32, 0x17, 0x16, 0x15, 0x11, 0x01, 0xe2, 0x29, 0x29, 0x50, 0xfe, 0xae, 0x01, 0x52, 0x98, 0x51, 0x49, 0xfd, 0x96, 0x03, 0x60, 0x7e, 0x3d, 0x3f, 0xac, 0x86, 0x78, 0xa8, 0xfc, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x0c, 0x00, 0x00, 0x03, 0x35, 0x21, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x12, 0x01, 0x52, 0x50, 0x52, 0x90, 0x49, 0x51, 0x98, 0x01, 0xf0, 0xac, 0x7e, 0x7c, 0x04, 0x32, 0xfb, 0xce, 0xa8, 0x78, 0x86, 0x00, 0x01, 0x01, 0xe2, 0x01, 0xf0, 0x04, 0x68, 0x07, 0xc8, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x21, 0x22, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x21, 0x04, 0x68, 0xfe, 0xac, 0x97, 0x52, 0x49, 0x90, 0x52, 0x50, 0x01, 0x54, 0x01, 0xf0, 0x86, 0x78, 0xa8, 0x04, 0x32, 0xfb, 0xce, 0x7c, 0x7e, 0x00, 0x00, 0x00, 0x01, 0xff, 0x9d, 0xfd, 0x96, 0x04, 0xb8, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x03, 0x01, 0x33, 0x01, 0x62, 0x04, 0x7a, 0xa0, 0xfb, 0x86, 0xfd, 0x96, 0x0a, 0x32, 0xf5, 0xce, 0x00, 0x00, 0x00, 0x01, 0xff, 0x9d, 0xfd, 0x96, 0x04, 0xb8, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x01, 0x23, 0x01, 0x33, 0x04, 0xb8, 0xa0, 0xfb, 0x86, 0xa0, 0xfd, 0x96, 0x0a, 0x32, 0x00, 0x01, 0xff, 0x9d, 0xfd, 0x96, 0x04, 0xb8, 0x07, 0xc8, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x04, 0xb8, 0xa0, 0xfe, 0x12, 0xfe, 0x14, 0xa0, 0x02, 0x3d, 0xfd, 0xc3, 0xa0, 0x01, 0xec, 0x01, 0xee, 0xa0, 0xfd, 0xc3, 0xfd, 0x96, 0x04, 0x63, 0xfb, 0x9d, 0x05, 0x19, 0x05, 0x19, 0xfb, 0x9d, 0x04, 0x63, 0xfa, 0xe7, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0xf0, 0x02, 0x3d, 0x02, 0x9c, 0x00, 0x03, 0x00, 0x00, 0x03, 0x35, 0x21, 0x15, 0x12, 0x02, 0x4e, 0x01, 0xf0, 0xac, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0x02, 0x46, 0x02, 0x73, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x01, 0xe2, 0x90, 0x02, 0x46, 0x05, 0x82, 0xfa, 0x7e, 0x00, 0x00, 0x01, 0x02, 0x3c, 0x01, 0xf0, 0x04, 0x68, 0x02, 0x9c, 0x00, 0x03, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x02, 0x3c, 0x02, 0x2c, 0x01, 0xf0, 0xac, 0xac, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe2, 0xfd, 0x96, 0x02, 0x73, 0x02, 0x46, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x01, 0xe2, 0x90, 0xfd, 0x96, 0x04, 0xb0, 0xfb, 0x50, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x02, 0x3d, 0x02, 0xf2, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x02, 0x4e, 0x01, 0x9a, 0x01, 0x58, 0xfe, 0xa8, 0x00, 0x00, 0x01, 0x01, 0x9a, 0x02, 0x46, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0x02, 0x46, 0x05, 0x82, 0xfa, 0x7e, 0x00, 0x01, 0x02, 0x3c, 0x01, 0x9a, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x02, 0x3c, 0x02, 0x2c, 0x01, 0x9a, 0x01, 0x58, 0xfe, 0xa8, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x02, 0x46, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x9a, 0x01, 0x20, 0xfd, 0x96, 0x04, 0xb0, 0xfb, 0x50, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x07, 0x00, 0x00, 0x03, 0x35, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x12, 0x02, 0x4e, 0x02, 0x2c, 0xfd, 0xd4, 0x01, 0xf0, 0xac, 0x56, 0xfe, 0xa8, 0x56, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x01, 0x9a, 0x48, 0x90, 0x48, 0xfd, 0x96, 0x04, 0xb0, 0x05, 0x82, 0xfa, 0x7e, 0xfb, 0x50, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x01, 0x9a, 0x04, 0x68, 0x02, 0xf2, 0x00, 0x07, 0x00, 0x00, 0x03, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x12, 0x02, 0x4e, 0x02, 0x2c, 0xfd, 0xd4, 0x01, 0x9a, 0x01, 0x58, 0x56, 0xac, 0x56, 0x00, 0x01, 0x01, 0x9a, 0xfd, 0x96, 0x02, 0xbb, 0x07, 0xc8, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x01, 0xe2, 0x48, 0x01, 0x20, 0x48, 0xfd, 0x96, 0x04, 0xb0, 0x05, 0x82, 0xfa, 0x7e, 0xfb, 0x50, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x02, 0x14, 0x05, 0x9c, 0x06, 0x28, 0x10, 0x07, 0x0a, 0xad, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0xff, 0x05, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x01, 0x05, 0xfe, 0xfb, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0xff, 0xf6, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x01, 0xf6, 0xfe, 0x0a, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x01, 0x0f, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x03, 0x0f, 0xfc, 0xf1, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x02, 0x14, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x04, 0x14, 0xfb, 0xec, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x03, 0x19, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x05, 0x19, 0xfa, 0xe7, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x04, 0x1e, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x06, 0x1e, 0xf9, 0xe2, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x05, 0x23, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x07, 0x23, 0xf8, 0xdd, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x05, 0xae, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x04, 0xe6, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x04, 0xf8, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x04, 0x30, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x04, 0x42, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x03, 0x7b, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x03, 0x8c, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x02, 0xc5, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x02, 0xd6, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x02, 0x0f, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x02, 0x20, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x01, 0x59, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x01, 0x6b, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x00, 0xa3, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x33, 0x11, 0x12, 0xb5, 0xfe, 0x00, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0xff, 0xff, 0x02, 0xc4, 0xfe, 0x00, 0x05, 0x9b, 0x06, 0x28, 0x10, 0x07, 0x0a, 0xb5, 0x02, 0xd6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0xff, 0xee, 0xfe, 0x00, 0x04, 0xe6, 0x06, 0x28, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x13, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x13, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x13, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x04, 0x30, 0xb6, 0xfc, 0x73, 0xb5, 0xb6, 0xb6, 0xfc, 0x74, 0xb5, 0x03, 0x8d, 0xb6, 0xfc, 0x73, 0xb5, 0xb6, 0xb6, 0xfc, 0x74, 0xb5, 0x03, 0x8d, 0xb6, 0xfc, 0x73, 0xb5, 0xb6, 0xb6, 0xfc, 0x74, 0xb5, 0xfe, 0x00, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x6d, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x6e, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x6d, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x6e, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x6d, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x00, 0x00, 0x00, 0x00, 0x20, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x96, 0x06, 0x28, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x27, 0x00, 0x2f, 0x00, 0x37, 0x00, 0x3f, 0x00, 0x47, 0x00, 0x4f, 0x00, 0x57, 0x00, 0x5f, 0x00, 0x67, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x7f, 0x00, 0x87, 0x00, 0x8f, 0x00, 0x97, 0x00, 0x9f, 0x00, 0xa7, 0x00, 0xaf, 0x00, 0xb7, 0x00, 0xbf, 0x00, 0xc7, 0x00, 0xcf, 0x00, 0xd7, 0x00, 0xdf, 0x00, 0xe7, 0x00, 0xef, 0x00, 0xf7, 0x00, 0xff, 0x00, 0x00, 0x13, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x01, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0x05, 0x07, 0x23, 0x27, 0x35, 0x37, 0x33, 0x17, 0xa3, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x04, 0x04, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfc, 0x78, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfb, 0x0e, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x04, 0x04, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfc, 0x78, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfb, 0x0e, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x04, 0x04, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfc, 0x78, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfb, 0x0e, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x04, 0x04, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0xfc, 0x78, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x6a, 0x05, 0xac, 0x04, 0x04, 0xac, 0x05, 0x01, 0x69, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0x01, 0x6a, 0x04, 0xac, 0x05, 0x05, 0xac, 0x04, 0x05, 0x28, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfe, 0x00, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0xfb, 0x05, 0x05, 0x00, 0x00, 0x07, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x00, 0x03, 0x11, 0x33, 0x11, 0x23, 0x11, 0x33, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x19, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x12, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0x02, 0x21, 0xb6, 0x02, 0x22, 0xb6, 0xb6, 0xfd, 0xde, 0xb5, 0xb5, 0xb5, 0x02, 0xd7, 0xb6, 0xb6, 0xfe, 0x94, 0xb6, 0xb6, 0xfe, 0x95, 0xb5, 0xb5, 0x02, 0xd7, 0xb6, 0xb6, 0xfe, 0x94, 0xb6, 0xb6, 0xfe, 0x00, 0x01, 0x6d, 0x01, 0x05, 0x01, 0xd6, 0x01, 0x05, 0x01, 0xd6, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xf7, 0xd8, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfe, 0xfb, 0x05, 0xb6, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfd, 0x8d, 0x01, 0x05, 0xfd, 0x8e, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0x05, 0xfd, 0x8d, 0x01, 0x05, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x05, 0x23, 0x05, 0x9c, 0x06, 0x28, 0x10, 0x07, 0x0a, 0xaa, 0x00, 0x00, 0x07, 0x23, 0x00, 0x00, 0xff, 0xff, 0x04, 0xe5, 0xfe, 0x00, 0x05, 0x9b, 0x06, 0x28, 0x10, 0x07, 0x0a, 0xb8, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x02, 0xc6, 0x02, 0x14, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x02, 0xd7, 0xfe, 0x00, 0x04, 0x14, 0xfb, 0xec, 0x00, 0x00, 0x01, 0x02, 0xc4, 0xfe, 0x00, 0x05, 0x9c, 0x02, 0x14, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x02, 0xc4, 0x02, 0xd8, 0xfe, 0x00, 0x04, 0x14, 0xfb, 0xec, 0x00, 0x01, 0xff, 0xee, 0x02, 0x14, 0x02, 0xc6, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x12, 0x02, 0xd7, 0x02, 0x14, 0x04, 0x14, 0xfb, 0xec, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x05, 0x9c, 0xfa, 0x52, 0x02, 0xd7, 0x02, 0xd7, 0xfe, 0x00, 0x08, 0x28, 0xfb, 0xec, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x07, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x12, 0x02, 0xd7, 0x02, 0xd7, 0xfd, 0x28, 0x02, 0x14, 0x04, 0x14, 0xfb, 0xec, 0xfb, 0xec, 0x04, 0x14, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x05, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x05, 0x9c, 0xfd, 0x29, 0xfd, 0x29, 0x06, 0x28, 0xfb, 0xec, 0xfb, 0xec, 0x08, 0x28, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x05, 0x00, 0x00, 0x03, 0x21, 0x11, 0x21, 0x11, 0x21, 0x12, 0x05, 0xae, 0xfd, 0x28, 0xfd, 0x2a, 0x06, 0x28, 0xf7, 0xd8, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xc4, 0x02, 0x14, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x02, 0xc4, 0x02, 0xd8, 0x02, 0x14, 0x04, 0x14, 0xfb, 0xec, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x07, 0x00, 0x00, 0x03, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x12, 0x02, 0xd6, 0x02, 0xd8, 0xfd, 0x29, 0xfd, 0x29, 0x02, 0x14, 0x04, 0x14, 0xfb, 0xec, 0xfb, 0xec, 0x00, 0x00, 0x01, 0xff, 0xee, 0xfe, 0x00, 0x05, 0x9c, 0x06, 0x28, 0x00, 0x05, 0x00, 0x00, 0x03, 0x11, 0x21, 0x11, 0x21, 0x11, 0x12, 0x02, 0xd6, 0x02, 0xd8, 0xfe, 0x00, 0x04, 0x14, 0x04, 0x14, 0xf7, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0xa7, 0x05, 0x7f, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x05, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x04, 0xb2, 0xfb, 0x4e, 0x67, 0x05, 0x7f, 0x8a, 0x05, 0x3c, 0xfa, 0x52, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x25, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x21, 0x22, 0x15, 0x03, 0x11, 0x10, 0x29, 0x01, 0x20, 0x19, 0x01, 0x10, 0x29, 0x01, 0x20, 0x01, 0x0e, 0xcd, 0x03, 0x17, 0xce, 0xce, 0xfc, 0xe9, 0xcd, 0x67, 0x01, 0x34, 0x03, 0x17, 0x01, 0x34, 0xfe, 0xcc, 0xfc, 0xe9, 0xfe, 0xcc, 0x5a, 0xe4, 0xe4, 0x03, 0x74, 0xe4, 0xe4, 0xfc, 0x8c, 0x03, 0x74, 0x01, 0x56, 0xfe, 0xaa, 0xfc, 0x8c, 0xfe, 0xaa, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x10, 0x27, 0x0a, 0xd3, 0x00, 0xf6, 0x00, 0x00, 0x10, 0x06, 0x0a, 0xca, 0x00, 0x00, 0x00, 0x06, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0x04, 0xb2, 0xfb, 0x4e, 0x04, 0xb2, 0xfb, 0x4e, 0x04, 0xb2, 0xfb, 0x4e, 0x04, 0xb2, 0xfb, 0x4e, 0x04, 0xb2, 0xfb, 0x4e, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0xb0, 0x72, 0xb2, 0x72, 0xb0, 0x72, 0xb2, 0x72, 0xb0, 0x00, 0x06, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0x01, 0x33, 0x11, 0x23, 0xa7, 0x05, 0x7f, 0xfe, 0xfe, 0x9e, 0x9e, 0xfe, 0xf9, 0xa0, 0xa0, 0xfe, 0xfb, 0x9e, 0x9e, 0xfe, 0xf9, 0xa0, 0xa0, 0xfe, 0xfb, 0x9f, 0x9f, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x74, 0x05, 0x38, 0xfa, 0xc8, 0x05, 0x38, 0xfa, 0xc8, 0x05, 0x38, 0xfa, 0xc8, 0x05, 0x38, 0xfa, 0xc8, 0x05, 0x38, 0x00, 0x00, 0x1a, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x3f, 0x00, 0x43, 0x00, 0x47, 0x00, 0x4b, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x67, 0x00, 0x00, 0x05, 0x33, 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x05, 0x33, 0x35, 0x23, 0x01, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x01, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x01, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x01, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x01, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x11, 0x33, 0x35, 0x23, 0x01, 0x11, 0x21, 0x11, 0x02, 0x11, 0xa0, 0xa0, 0x01, 0x07, 0x9e, 0x9e, 0x01, 0x05, 0xa0, 0xa0, 0xfc, 0xf1, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x9d, 0x01, 0x03, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x01, 0x07, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x01, 0x05, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0x01, 0x07, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0x9c, 0xfb, 0x83, 0x05, 0x7f, 0x88, 0xae, 0xae, 0xae, 0xae, 0xae, 0x03, 0xdc, 0xae, 0xfe, 0x2e, 0xb2, 0xfe, 0x2c, 0xb0, 0xfe, 0x2c, 0xb2, 0xfe, 0x2e, 0xae, 0x03, 0xdc, 0xae, 0xfe, 0x2e, 0xb2, 0xfe, 0x2c, 0xb0, 0xfe, 0x2c, 0xb2, 0x02, 0xb8, 0xae, 0xfe, 0x2e, 0xb2, 0xfe, 0x2c, 0xb0, 0xfe, 0x2c, 0xb2, 0x02, 0xb8, 0xae, 0xfe, 0x2e, 0xb2, 0xfe, 0x2c, 0xb0, 0xfe, 0x2c, 0xb2, 0x02, 0xb8, 0xae, 0xfe, 0x2e, 0xb2, 0xfe, 0x2c, 0xb0, 0xfe, 0x2c, 0xb2, 0xfe, 0x2e, 0xae, 0xfe, 0xde, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x08, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x01, 0x15, 0x33, 0x03, 0x15, 0x01, 0x33, 0x01, 0x15, 0x01, 0x37, 0x01, 0x15, 0x01, 0x37, 0x35, 0x01, 0x33, 0x01, 0x35, 0x01, 0x33, 0x01, 0x35, 0x01, 0x33, 0x17, 0x35, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0xcb, 0xcb, 0x01, 0x5d, 0xe2, 0xfd, 0xc1, 0x02, 0xd1, 0xe2, 0xfc, 0x4d, 0x04, 0x45, 0x6d, 0xfb, 0xbb, 0x92, 0x03, 0xb3, 0xfd, 0x2f, 0x91, 0x02, 0x40, 0xfe, 0xa2, 0x92, 0xcc, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x01, 0x54, 0xe2, 0x02, 0x7f, 0xfc, 0xfe, 0x7d, 0x04, 0x1c, 0xfc, 0xfc, 0xdf, 0x01, 0x05, 0x3c, 0x7f, 0xfb, 0x42, 0x01, 0x7f, 0x04, 0xbd, 0xfb, 0xe4, 0xfc, 0x03, 0x20, 0xfd, 0x81, 0xfc, 0x01, 0x83, 0xe2, 0xe2, 0x00, 0x00, 0x00, 0x08, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x1f, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x33, 0x35, 0x05, 0x33, 0x01, 0x35, 0x01, 0x17, 0x01, 0x35, 0x01, 0x17, 0x01, 0x35, 0x23, 0x01, 0x35, 0x01, 0x23, 0x01, 0x35, 0x01, 0x23, 0x01, 0x35, 0x37, 0x23, 0xa7, 0x05, 0x7f, 0xfe, 0xce, 0xcc, 0xfd, 0xc0, 0xe2, 0x01, 0x5e, 0xfc, 0x4d, 0xe2, 0x02, 0xd1, 0xfb, 0x4e, 0x6d, 0x04, 0x45, 0x6d, 0xfb, 0xbb, 0x03, 0xb3, 0xe2, 0xfd, 0x2f, 0x02, 0x3f, 0xe2, 0xfe, 0xa3, 0xcb, 0xcb, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0xe2, 0xe2, 0x01, 0x83, 0xfc, 0xfd, 0x81, 0x01, 0x03, 0x21, 0xfc, 0xfb, 0xe4, 0x01, 0x04, 0xbe, 0x7f, 0xfb, 0x43, 0xa1, 0x04, 0x1c, 0xfc, 0xe0, 0xa1, 0x02, 0x7f, 0xfe, 0x7d, 0xa1, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x04, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x12, 0x00, 0x17, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x39, 0x00, 0x3d, 0x00, 0x41, 0x00, 0x46, 0x00, 0x4b, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5c, 0x00, 0x61, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x00, 0x01, 0x17, 0x37, 0x27, 0x23, 0x11, 0x17, 0x37, 0x27, 0x07, 0x01, 0x17, 0x37, 0x27, 0x23, 0x03, 0x17, 0x37, 0x27, 0x03, 0x17, 0x37, 0x27, 0x07, 0x01, 0x17, 0x37, 0x27, 0x23, 0x03, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x35, 0x23, 0x03, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x03, 0x33, 0x37, 0x27, 0x07, 0x01, 0x17, 0x37, 0x35, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x33, 0x37, 0x27, 0x01, 0x17, 0x37, 0x35, 0x27, 0x01, 0x17, 0x37, 0x27, 0x01, 0x17, 0x33, 0x37, 0x27, 0x05, 0x17, 0x33, 0x35, 0x27, 0x01, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x2d, 0x70, 0x30, 0x6d, 0x2d, 0x71, 0x71, 0x2d, 0x01, 0x2e, 0x71, 0x71, 0x2f, 0x84, 0xe8, 0x71, 0x70, 0x71, 0xe5, 0x2d, 0x71, 0x71, 0x2d, 0x02, 0xa1, 0x72, 0x71, 0x30, 0x83, 0xe9, 0x71, 0x71, 0x71, 0xfe, 0xd6, 0x71, 0x70, 0x71, 0xfe, 0xd6, 0x71, 0x72, 0x72, 0x03, 0x2f, 0x70, 0x2d, 0x6d, 0xe9, 0x6f, 0x71, 0x6f, 0xfe, 0xd4, 0x70, 0x71, 0x6f, 0xfe, 0xd6, 0x70, 0x70, 0x70, 0xfe, 0xd6, 0x70, 0x71, 0x6f, 0xfe, 0xd4, 0x71, 0x70, 0x70, 0xe6, 0x6e, 0x2f, 0x70, 0x2d, 0x04, 0x14, 0x71, 0x2d, 0x2e, 0xfe, 0xd6, 0x71, 0x71, 0x71, 0xfe, 0xd6, 0x72, 0x6f, 0x71, 0xfe, 0xd7, 0x71, 0x72, 0x72, 0xfe, 0xd5, 0x2f, 0x85, 0x2e, 0x71, 0x02, 0x75, 0x70, 0x2e, 0x2e, 0xfe, 0xd7, 0x71, 0x70, 0x71, 0xfe, 0xd6, 0x2f, 0x84, 0x30, 0x71, 0x01, 0x02, 0x2f, 0x6e, 0x2e, 0xfb, 0x15, 0x05, 0x7f, 0x04, 0x33, 0x31, 0x7c, 0x34, 0xfd, 0xe4, 0x32, 0x7e, 0x7e, 0x31, 0x01, 0x4f, 0x7e, 0x7e, 0x34, 0xfe, 0xff, 0x7e, 0x7c, 0x7e, 0xfc, 0xcc, 0x31, 0x7e, 0x7d, 0x31, 0x02, 0xec, 0x7e, 0x7e, 0x34, 0xfe, 0xfd, 0x7d, 0x7d, 0x7e, 0xfe, 0xb5, 0x7e, 0x7d, 0x7d, 0xfe, 0xb6, 0x7e, 0x7e, 0x7e, 0x01, 0xec, 0x7c, 0x31, 0x7f, 0xfe, 0xfd, 0x7c, 0x7e, 0x7c, 0xfe, 0xb4, 0x7d, 0x7e, 0x7c, 0xfe, 0xb6, 0x7c, 0x7c, 0x7c, 0xfe, 0xb5, 0x7c, 0x7e, 0x7c, 0xfe, 0xb4, 0x7c, 0x7d, 0x7d, 0xfe, 0x81, 0x34, 0x7c, 0x31, 0x02, 0xed, 0x7e, 0x32, 0x99, 0x31, 0xfe, 0xb4, 0x7e, 0x7e, 0x7e, 0xfe, 0xb5, 0x7e, 0x7c, 0x7e, 0xfe, 0xb5, 0x7e, 0x7e, 0x7e, 0xfe, 0xb4, 0x34, 0x34, 0x7e, 0x01, 0x1e, 0x7e, 0x31, 0x99, 0x31, 0xfe, 0xb5, 0x7d, 0x7c, 0x7e, 0xfe, 0xb5, 0x34, 0x34, 0x7e, 0x7e, 0x34, 0x7f, 0x31, 0xfe, 0xde, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x16, 0x04, 0x3a, 0x04, 0x12, 0x00, 0x03, 0x00, 0x00, 0x37, 0x11, 0x21, 0x11, 0xa7, 0x03, 0x93, 0x16, 0x03, 0xfc, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x16, 0x04, 0x3a, 0x04, 0x12, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x25, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x02, 0xc5, 0xfd, 0x3b, 0x67, 0x03, 0x93, 0x88, 0x03, 0x18, 0xfc, 0x76, 0x03, 0xfc, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x9a, 0x06, 0x27, 0x03, 0x8e, 0x00, 0x03, 0x00, 0x00, 0x25, 0x21, 0x11, 0x21, 0x06, 0x26, 0xfa, 0x81, 0x05, 0x7f, 0x9a, 0x02, 0xf4, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x9a, 0x06, 0x27, 0x03, 0x8e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x05, 0x21, 0x11, 0x21, 0x05, 0xc0, 0xfb, 0x4e, 0x05, 0x18, 0xfa, 0x81, 0x05, 0x7f, 0x01, 0x0c, 0x02, 0x10, 0xfd, 0xf0, 0x72, 0x02, 0xf4, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0x06, 0x03, 0x4f, 0x05, 0x22, 0x00, 0x03, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0xa7, 0x02, 0xa8, 0xfa, 0x06, 0x1c, 0xf9, 0xe4, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x06, 0x03, 0x4f, 0x05, 0x22, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x05, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x01, 0xda, 0xfe, 0x26, 0x67, 0x02, 0xa8, 0x88, 0x05, 0x38, 0xfa, 0x56, 0x06, 0x1c, 0xf9, 0xe4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x9a, 0x05, 0x85, 0x03, 0x8e, 0x00, 0x03, 0x00, 0x00, 0x25, 0x21, 0x01, 0x21, 0x04, 0x22, 0xfb, 0xe3, 0x01, 0x63, 0x04, 0x1c, 0x9a, 0x02, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x9a, 0x05, 0x85, 0x03, 0x8e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x13, 0x21, 0x03, 0x05, 0x21, 0x01, 0x21, 0x03, 0xf2, 0xf5, 0xfc, 0xb1, 0xf6, 0x03, 0x80, 0xfb, 0xe3, 0x01, 0x63, 0x04, 0x1c, 0x01, 0x0c, 0x02, 0x10, 0xfd, 0xf0, 0x72, 0x02, 0xf4, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x17, 0x09, 0x01, 0x05, 0x02, 0xbf, 0x02, 0xc0, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x17, 0x21, 0x09, 0x03, 0x9f, 0x04, 0x4b, 0xfd, 0xda, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0x8a, 0x04, 0xca, 0xfa, 0xc4, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x00, 0x37, 0x09, 0x01, 0x05, 0x01, 0xca, 0x01, 0xc9, 0x16, 0x03, 0xfc, 0xfc, 0x04, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x37, 0x21, 0x09, 0x03, 0x9f, 0x02, 0x5f, 0xfe, 0xd1, 0xfe, 0x36, 0x01, 0xca, 0x01, 0xc9, 0x88, 0x02, 0xa6, 0xfc, 0xe8, 0x03, 0xfc, 0xfc, 0x04, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x17, 0x11, 0x01, 0x05, 0x05, 0x7f, 0xfc, 0x06, 0x20, 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x17, 0x09, 0x01, 0x03, 0x11, 0x01, 0x6c, 0x04, 0x4b, 0xfb, 0xb5, 0x67, 0x05, 0x7f, 0x52, 0x02, 0x66, 0x02, 0x66, 0xfa, 0x8a, 0x06, 0x20, 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x00, 0x37, 0x11, 0x01, 0x05, 0x03, 0x93, 0x16, 0x03, 0xfc, 0xfe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x37, 0x09, 0x01, 0x03, 0x11, 0x01, 0x6c, 0x02, 0x5f, 0xfd, 0xa1, 0x67, 0x03, 0x93, 0xc1, 0x01, 0x53, 0x01, 0x53, 0xfc, 0xaf, 0x03, 0xfc, 0xfe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x05, 0x85, 0x04, 0x12, 0x00, 0x02, 0x00, 0x00, 0x37, 0x11, 0x01, 0x05, 0x05, 0x7f, 0x16, 0x03, 0xfc, 0xfe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x16, 0x05, 0x85, 0x04, 0x12, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x37, 0x09, 0x01, 0x03, 0x11, 0x01, 0x6c, 0x04, 0x18, 0xfb, 0xe8, 0x67, 0x05, 0x7f, 0xc1, 0x01, 0x53, 0x01, 0x53, 0xfc, 0xaf, 0x03, 0xfc, 0xfe, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x13, 0x21, 0x01, 0x05, 0x05, 0x7f, 0xfd, 0x40, 0x05, 0x24, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x13, 0x09, 0x01, 0x25, 0x21, 0x01, 0x9f, 0x02, 0x25, 0x02, 0x26, 0xfb, 0x1b, 0x05, 0x7f, 0xfd, 0x40, 0x04, 0xb2, 0xfb, 0x36, 0x04, 0xca, 0x72, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x00, 0x13, 0x21, 0x01, 0x05, 0x03, 0x93, 0xfe, 0x37, 0x04, 0x12, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x13, 0x09, 0x01, 0x25, 0x21, 0x01, 0x9f, 0x01, 0x30, 0x01, 0x2f, 0xfd, 0x07, 0x03, 0x93, 0xfe, 0x37, 0x03, 0xa0, 0xfd, 0x5a, 0x02, 0xa6, 0x72, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x13, 0x01, 0x11, 0x05, 0x05, 0x7f, 0x02, 0x14, 0x03, 0x10, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x13, 0x01, 0x11, 0x09, 0x01, 0x11, 0xd3, 0x04, 0x4b, 0xfa, 0xe7, 0x05, 0x7f, 0x02, 0x14, 0xfd, 0x9a, 0x04, 0xcc, 0xfd, 0x9a, 0x03, 0x10, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x00, 0x13, 0x01, 0x11, 0x05, 0x03, 0x93, 0x02, 0x14, 0x01, 0xfe, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x16, 0x03, 0x98, 0x04, 0x12, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x13, 0x01, 0x11, 0x09, 0x01, 0x11, 0xd3, 0x02, 0x5e, 0xfc, 0xd4, 0x03, 0x93, 0x02, 0x14, 0xfe, 0xad, 0x02, 0xa6, 0xfe, 0xad, 0x01, 0xfe, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x16, 0x05, 0x85, 0x04, 0x12, 0x00, 0x02, 0x00, 0x00, 0x13, 0x01, 0x11, 0x05, 0x05, 0x7f, 0x02, 0x14, 0x01, 0xfe, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0x00, 0x16, 0x05, 0x85, 0x04, 0x12, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x09, 0x01, 0x11, 0x09, 0x01, 0x11, 0x01, 0x06, 0x04, 0x18, 0xfa, 0xe7, 0x05, 0x7f, 0x02, 0x14, 0xfe, 0xad, 0x02, 0xa6, 0xfe, 0xad, 0x01, 0xfe, 0xfc, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x03, 0x00, 0x00, 0x13, 0x09, 0x02, 0x05, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x02, 0x14, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x09, 0x06, 0x8e, 0x02, 0x36, 0x02, 0x37, 0xfd, 0xc9, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x02, 0x14, 0xfd, 0x88, 0x02, 0x78, 0x02, 0x78, 0xfd, 0x88, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x0b, 0x01, 0x1e, 0x01, 0xa6, 0x01, 0xa6, 0xfe, 0x5a, 0xfd, 0xca, 0x02, 0x36, 0x02, 0x37, 0xfd, 0xc9, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x02, 0x14, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0x29, 0x01, 0xd7, 0xfd, 0x88, 0x02, 0x78, 0x02, 0x78, 0xfd, 0x88, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x03, 0x00, 0x64, 0xfe, 0xff, 0x05, 0xe4, 0x05, 0x29, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x29, 0x00, 0x00, 0x24, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x00, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x00, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x01, 0x5b, 0xe5, 0x71, 0x73, 0x73, 0x71, 0xe5, 0xe5, 0x71, 0x73, 0x73, 0x71, 0xfe, 0x8e, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0xfe, 0xd4, 0x94, 0x96, 0x96, 0x94, 0xfe, 0x6b, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0xef, 0x02, 0x4a, 0x92, 0x4a, 0x4a, 0x92, 0xfd, 0xb6, 0x92, 0x4a, 0x4a, 0x03, 0x36, 0xfd, 0x02, 0xc0, 0x60, 0x60, 0xc0, 0x02, 0xfe, 0xc0, 0x60, 0x60, 0xfb, 0xff, 0x03, 0x84, 0xe2, 0x71, 0x71, 0xe2, 0xfc, 0x7c, 0xe2, 0x71, 0x71, 0x00, 0x00, 0x02, 0x00, 0x05, 0xfe, 0x23, 0x03, 0x8a, 0x06, 0x75, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x09, 0x07, 0x01, 0xc7, 0xfe, 0xa6, 0x01, 0x5a, 0x01, 0x5b, 0xfe, 0xa5, 0x01, 0xc2, 0xfe, 0x3e, 0xfe, 0x3e, 0x05, 0x81, 0xfc, 0xcf, 0xfc, 0xc7, 0x03, 0x39, 0x04, 0x25, 0xfb, 0xdb, 0xfb, 0xd3, 0x04, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0xfe, 0xff, 0x05, 0xe4, 0x05, 0x29, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x00, 0x12, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x00, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0xce, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0xfe, 0xd4, 0x94, 0x96, 0x96, 0x94, 0xfe, 0x6b, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0x03, 0x93, 0xfd, 0x02, 0xc0, 0x60, 0x60, 0xc0, 0x02, 0xfe, 0xc0, 0x60, 0x60, 0xfb, 0xff, 0x03, 0x84, 0xe2, 0x71, 0x71, 0xe2, 0xfc, 0x7c, 0xe2, 0x71, 0x71, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x66, 0xff, 0x01, 0x05, 0xe2, 0x05, 0x27, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x27, 0x00, 0x2f, 0x00, 0x37, 0x00, 0x3f, 0x00, 0x47, 0x00, 0x00, 0x25, 0x16, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x27, 0x05, 0x36, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x07, 0x13, 0x26, 0x27, 0x26, 0x27, 0x37, 0x16, 0x17, 0x16, 0x17, 0x25, 0x06, 0x07, 0x06, 0x07, 0x27, 0x36, 0x37, 0x36, 0x37, 0x13, 0x16, 0x32, 0x37, 0x17, 0x06, 0x22, 0x27, 0x01, 0x36, 0x34, 0x27, 0x37, 0x16, 0x14, 0x07, 0x01, 0x26, 0x22, 0x07, 0x27, 0x36, 0x32, 0x17, 0x01, 0x06, 0x14, 0x17, 0x07, 0x26, 0x34, 0x37, 0x01, 0x39, 0x27, 0x35, 0x29, 0x33, 0x2c, 0x3f, 0x34, 0x43, 0x30, 0x03, 0x78, 0x32, 0x29, 0x2f, 0x2d, 0x5a, 0x35, 0x3e, 0x33, 0x40, 0x8c, 0x27, 0x35, 0x29, 0x32, 0x2b, 0x40, 0x33, 0x43, 0x30, 0xfc, 0x89, 0x33, 0x29, 0x35, 0x27, 0x5a, 0x2c, 0x47, 0x34, 0x3f, 0xd5, 0x44, 0x8b, 0x44, 0x23, 0x56, 0xad, 0x56, 0x02, 0xf6, 0x0e, 0x0e, 0x63, 0x12, 0x12, 0xfd, 0xdd, 0x44, 0x8b, 0x44, 0x23, 0x56, 0xad, 0x56, 0xfd, 0x0c, 0x0f, 0x0f, 0x63, 0x12, 0x12, 0x8f, 0x3c, 0x31, 0x26, 0x20, 0x6a, 0x28, 0x30, 0x3d, 0x4a, 0x75, 0x20, 0x26, 0x2c, 0x41, 0x3d, 0x4e, 0x3a, 0x30, 0x28, 0x04, 0x27, 0x3c, 0x31, 0x26, 0x20, 0x6a, 0x28, 0x30, 0x3d, 0x4a, 0x75, 0x20, 0x26, 0x31, 0x3c, 0x3e, 0x45, 0x42, 0x30, 0x28, 0xfa, 0xd4, 0x16, 0x16, 0x6e, 0x1b, 0x1b, 0x02, 0x5f, 0x49, 0xa0, 0x49, 0x27, 0x5b, 0xca, 0x5b, 0x03, 0x4a, 0x16, 0x16, 0x6e, 0x1b, 0x1b, 0xfd, 0xa1, 0x49, 0xa0, 0x49, 0x27, 0x5b, 0xca, 0x5b, 0x00, 0x00, 0x06, 0x00, 0x64, 0xfe, 0xff, 0x05, 0xe4, 0x05, 0x29, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x25, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x00, 0x36, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x13, 0x11, 0x16, 0x17, 0x16, 0x17, 0x11, 0x06, 0x07, 0x06, 0x07, 0x06, 0x10, 0x17, 0x01, 0x11, 0x16, 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x17, 0x11, 0x36, 0x37, 0x36, 0x37, 0x11, 0x26, 0x27, 0x26, 0x17, 0x11, 0x36, 0x10, 0x65, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0x0a, 0x14, 0x17, 0x3a, 0x3b, 0x3b, 0x3a, 0x17, 0x7b, 0x9a, 0x9a, 0x01, 0x6d, 0x28, 0x27, 0x28, 0x28, 0x28, 0x28, 0x27, 0xdd, 0x3b, 0x39, 0x18, 0x15, 0x15, 0x18, 0x39, 0xcc, 0x99, 0x52, 0x03, 0x84, 0xe2, 0x71, 0x71, 0xe2, 0xfc, 0x7c, 0xe2, 0x71, 0x71, 0x04, 0xc5, 0xfb, 0xbe, 0x0f, 0x0f, 0x25, 0x17, 0x04, 0xf6, 0x17, 0x25, 0x0f, 0x6d, 0xb1, 0xfd, 0xdc, 0xb1, 0x04, 0x5b, 0xfa, 0xd0, 0x07, 0x07, 0x05, 0x30, 0x07, 0x24, 0xfb, 0x0a, 0x17, 0x25, 0x0f, 0x10, 0x04, 0x40, 0x10, 0x0f, 0x25, 0xa2, 0xfc, 0x7c, 0xb1, 0x02, 0x22, 0x00, 0x00, 0x00, 0x04, 0x00, 0x64, 0xfe, 0xff, 0x05, 0xe4, 0x05, 0x29, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x29, 0x00, 0x37, 0x00, 0x00, 0x00, 0x10, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x10, 0x27, 0x26, 0x23, 0x22, 0x07, 0x02, 0x10, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x10, 0x07, 0x06, 0x23, 0x22, 0x27, 0x00, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x00, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x02, 0x56, 0x67, 0x33, 0x34, 0x34, 0x33, 0x67, 0x67, 0x33, 0x34, 0x34, 0x33, 0xd5, 0x9e, 0x4f, 0x4f, 0x4f, 0x4f, 0x9e, 0x9e, 0x4f, 0x4f, 0x4f, 0x4f, 0xfe, 0x48, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0xfe, 0xd4, 0x94, 0x96, 0x96, 0x94, 0xfe, 0x6b, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0x02, 0x98, 0xfe, 0xf8, 0x42, 0x21, 0x21, 0x42, 0x01, 0x08, 0x42, 0x21, 0x21, 0xfe, 0x6f, 0x01, 0x96, 0x65, 0x33, 0x33, 0x65, 0xfe, 0x6a, 0x65, 0x33, 0x33, 0x02, 0xaf, 0xfd, 0x02, 0xc0, 0x60, 0x60, 0xc0, 0x02, 0xfe, 0xc0, 0x60, 0x60, 0xfb, 0xff, 0x03, 0x84, 0xe2, 0x71, 0x71, 0xe2, 0xfc, 0x7c, 0xe2, 0x71, 0x71, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x17, 0x00, 0x00, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x65, 0x5e, 0x5e, 0xa4, 0xa3, 0xbd, 0xbc, 0xa3, 0xa3, 0x5e, 0x5f, 0x5f, 0x5e, 0xa3, 0xa3, 0xbc, 0xbd, 0xa3, 0xa4, 0x5e, 0x5e, 0x02, 0x12, 0xd1, 0xb6, 0xb5, 0x69, 0x69, 0x69, 0x69, 0xb5, 0xb6, 0xd1, 0xd1, 0xb6, 0xb5, 0x69, 0x69, 0x69, 0x69, 0xb5, 0xb6, 0x00, 0x02, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x05, 0x32, 0x37, 0x24, 0x10, 0x25, 0x26, 0x23, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x02, 0x03, 0x96, 0x94, 0x01, 0x2c, 0xfe, 0xd4, 0x94, 0x96, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x61, 0x60, 0xc0, 0x02, 0xfe, 0xc0, 0x60, 0x00, 0x00, 0x02, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x01, 0x22, 0x07, 0x04, 0x10, 0x05, 0x16, 0x33, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x02, 0x03, 0x96, 0x94, 0xfe, 0xd4, 0x01, 0x2c, 0x94, 0x96, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x04, 0xdd, 0x60, 0xc0, 0xfd, 0x02, 0xc0, 0x60, 0x00, 0x02, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x01, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x04, 0x11, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x04, 0x59, 0xfe, 0xd4, 0x94, 0x96, 0x96, 0x94, 0xfe, 0xd4, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x02, 0x3e, 0x01, 0x7f, 0xc0, 0x60, 0x60, 0xc0, 0xfe, 0x81, 0x00, 0x00, 0x02, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x16, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x03, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x11, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x53, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x02, 0x3e, 0xfe, 0x81, 0xc0, 0x60, 0x60, 0xc0, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0b, 0x00, 0x18, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x20, 0x04, 0x12, 0x10, 0x02, 0x04, 0x20, 0x24, 0x01, 0x22, 0x07, 0x04, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x11, 0x21, 0x65, 0xbc, 0x01, 0x47, 0x01, 0x79, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xfe, 0x87, 0xfe, 0xb9, 0x02, 0x03, 0x96, 0x94, 0xfe, 0xd4, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0xfd, 0xaa, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x04, 0xdd, 0x60, 0xc0, 0xfd, 0x02, 0xc0, 0x60, 0x60, 0xc0, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x20, 0x04, 0x12, 0x10, 0x02, 0x04, 0x20, 0x24, 0x01, 0x22, 0x07, 0x04, 0x11, 0x21, 0x65, 0xbc, 0x01, 0x47, 0x01, 0x79, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xfe, 0x87, 0xfe, 0xb9, 0x02, 0x03, 0x96, 0x94, 0xfe, 0xd4, 0x02, 0x56, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x04, 0xdd, 0x60, 0xc0, 0xfe, 0x81, 0x00, 0x01, 0x00, 0x64, 0xfe, 0xff, 0x03, 0x24, 0x05, 0x29, 0x00, 0x07, 0x00, 0x00, 0x36, 0x10, 0x25, 0x36, 0x33, 0x11, 0x22, 0x27, 0x65, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xaf, 0x52, 0x03, 0x84, 0xe2, 0x71, 0xf9, 0xd6, 0x71, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xff, 0x03, 0x67, 0x05, 0x29, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10, 0x05, 0x06, 0x23, 0x11, 0x32, 0x17, 0x03, 0x66, 0xfe, 0xa0, 0xaf, 0xb0, 0xb0, 0xaf, 0x03, 0xd6, 0xfc, 0x7c, 0xe2, 0x71, 0x06, 0x2a, 0x71, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xec, 0x05, 0x0b, 0x06, 0x28, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x11, 0x21, 0x11, 0x01, 0xce, 0x9a, 0xe2, 0x9a, 0x9a, 0x6f, 0x72, 0x9b, 0xfe, 0xd9, 0x04, 0x64, 0x02, 0xfa, 0x7d, 0xac, 0xac, 0x7d, 0x7c, 0xab, 0xab, 0xfc, 0x76, 0x06, 0x3c, 0xf9, 0xc4, 0x00, 0x00, 0x03, 0x00, 0xa7, 0xfe, 0x00, 0x06, 0x55, 0x06, 0x28, 0x00, 0x0d, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x00, 0x24, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x00, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x01, 0x11, 0x21, 0x11, 0x01, 0x28, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0xfe, 0xd4, 0x94, 0x96, 0x96, 0x94, 0xfe, 0x6b, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0xfe, 0x88, 0x05, 0xae, 0x95, 0x02, 0xfe, 0xc0, 0x60, 0x60, 0xc0, 0xfd, 0x02, 0xc0, 0x60, 0x60, 0x04, 0x01, 0xfc, 0x7c, 0xe2, 0x71, 0x71, 0xe2, 0x03, 0x84, 0xe2, 0x71, 0x71, 0xf9, 0x48, 0x08, 0x28, 0xf7, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x02, 0x14, 0x06, 0x55, 0x06, 0x28, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x13, 0x11, 0x21, 0x11, 0x23, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x04, 0x11, 0x29, 0x01, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0xa7, 0x05, 0xae, 0x17, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0xfe, 0xa0, 0x05, 0x15, 0xfb, 0x54, 0x01, 0x2c, 0x95, 0x95, 0x95, 0x95, 0x01, 0x2c, 0x02, 0x14, 0x04, 0x14, 0xfb, 0xec, 0x01, 0xc2, 0xe2, 0x71, 0x71, 0xe2, 0xfe, 0x3e, 0x01, 0x7e, 0xc1, 0x60, 0x60, 0xc1, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xfe, 0x00, 0x06, 0x55, 0x02, 0x14, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x13, 0x11, 0x33, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x11, 0x33, 0x11, 0x01, 0x21, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x24, 0xa7, 0x18, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0x17, 0xfa, 0xd3, 0x04, 0xac, 0xfe, 0xd4, 0x95, 0x95, 0x95, 0x95, 0xfe, 0xd4, 0xfe, 0x00, 0x04, 0x14, 0xfe, 0x3e, 0xe2, 0x71, 0x71, 0xe2, 0x01, 0xc2, 0xfb, 0xec, 0x04, 0x14, 0xfe, 0x82, 0xc1, 0x60, 0x60, 0xc1, 0x00, 0x00, 0x01, 0x00, 0x05, 0x02, 0x14, 0x02, 0xc5, 0x05, 0x29, 0x00, 0x09, 0x00, 0x00, 0x13, 0x10, 0x25, 0x36, 0x33, 0x15, 0x22, 0x07, 0x04, 0x11, 0x05, 0x01, 0x60, 0xb0, 0xaf, 0x95, 0x95, 0xfe, 0xd5, 0x02, 0x14, 0x01, 0xc2, 0xe2, 0x71, 0x76, 0x60, 0xc0, 0xfe, 0x81, 0x00, 0x01, 0x00, 0x05, 0x02, 0x14, 0x02, 0xc5, 0x05, 0x29, 0x00, 0x09, 0x00, 0x00, 0x13, 0x32, 0x17, 0x04, 0x11, 0x23, 0x10, 0x25, 0x26, 0x23, 0x05, 0xb0, 0xaf, 0x01, 0x60, 0x69, 0xfe, 0xd4, 0x94, 0x96, 0x05, 0x29, 0x71, 0xe2, 0xfe, 0x3e, 0x01, 0x7f, 0xc0, 0x60, 0x00, 0x01, 0x00, 0x05, 0xfe, 0xff, 0x02, 0xc5, 0x02, 0x14, 0x00, 0x09, 0x00, 0x00, 0x13, 0x35, 0x32, 0x37, 0x24, 0x11, 0x33, 0x10, 0x05, 0x06, 0x05, 0x96, 0x94, 0x01, 0x2c, 0x69, 0xfe, 0xa0, 0xaf, 0xfe, 0xff, 0x76, 0x60, 0xc0, 0x01, 0x7f, 0xfe, 0x3e, 0xe2, 0x71, 0x00, 0x01, 0x00, 0x05, 0xfe, 0xff, 0x02, 0xc5, 0x02, 0x14, 0x00, 0x09, 0x00, 0x00, 0x01, 0x22, 0x27, 0x24, 0x11, 0x33, 0x10, 0x05, 0x16, 0x33, 0x02, 0xc4, 0xaf, 0xb0, 0xfe, 0xa0, 0x6a, 0x01, 0x2b, 0x95, 0x95, 0xfe, 0xff, 0x71, 0xe2, 0x01, 0xc2, 0xfe, 0x81, 0xc0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x02, 0x14, 0x05, 0xe4, 0x05, 0x29, 0x00, 0x11, 0x00, 0x00, 0x13, 0x10, 0x25, 0x36, 0x33, 0x32, 0x17, 0x04, 0x11, 0x23, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x04, 0x11, 0x65, 0x01, 0x60, 0xaf, 0xb0, 0xb0, 0xb0, 0x01, 0x60, 0x6a, 0xfe, 0xd4, 0x94, 0x96, 0x96, 0x94, 0xfe, 0xd4, 0x02, 0x14, 0x01, 0xc2, 0xe2, 0x71, 0x71, 0xe2, 0xfe, 0x3e, 0x01, 0x7f, 0xc0, 0x60, 0x60, 0xc0, 0xfe, 0x81, 0x00, 0x01, 0x00, 0x64, 0xfe, 0xff, 0x05, 0xe4, 0x02, 0x14, 0x00, 0x12, 0x00, 0x00, 0x13, 0x30, 0x33, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x11, 0x33, 0x10, 0x05, 0x06, 0x23, 0x22, 0x27, 0x24, 0x65, 0x69, 0x01, 0x2c, 0x94, 0x96, 0x96, 0x94, 0x01, 0x2c, 0x6a, 0xfe, 0xa0, 0xb0, 0xb0, 0xb0, 0xaf, 0xfe, 0xa0, 0x02, 0x14, 0xfe, 0x81, 0xc0, 0x60, 0x60, 0xc0, 0x01, 0x7f, 0xfe, 0x3e, 0xe2, 0x71, 0x71, 0xe2, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x17, 0x01, 0x11, 0x05, 0x05, 0x7f, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x17, 0x11, 0x01, 0x05, 0x05, 0x7f, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x17, 0x11, 0x21, 0x05, 0x05, 0x7f, 0xfc, 0x06, 0x20, 0x00, 0x00, 0x01, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x00, 0x13, 0x21, 0x11, 0x05, 0x05, 0x7f, 0x05, 0x24, 0xf9, 0xe0, 0x00, 0x02, 0x01, 0x14, 0x01, 0xd1, 0x03, 0x2b, 0x04, 0x21, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x01, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x01, 0x49, 0x7d, 0xb4, 0x7c, 0x7c, 0x59, 0x5b, 0x7d, 0x35, 0x9c, 0x71, 0x70, 0x9a, 0x9b, 0xe1, 0x9b, 0x02, 0xfa, 0x64, 0x8a, 0x8a, 0x64, 0x63, 0x89, 0x89, 0x63, 0x7c, 0xab, 0xab, 0x7c, 0x7d, 0xac, 0xac, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0xa7, 0x05, 0x7f, 0xfd, 0x40, 0x02, 0x5a, 0xfd, 0xa6, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x05, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0x02, 0x58, 0xfd, 0xa8, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x05, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0x04, 0xb2, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x05, 0x3c, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x06, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x01, 0x21, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0x04, 0xb2, 0xfb, 0x4e, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x05, 0x3c, 0x00, 0x03, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x21, 0x11, 0x21, 0xa7, 0x05, 0x7f, 0xfd, 0x74, 0x02, 0x26, 0xfd, 0xda, 0xfd, 0x74, 0x02, 0x25, 0xfd, 0xdb, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x05, 0x3c, 0xfa, 0xc4, 0x05, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x21, 0x09, 0x03, 0x02, 0x3f, 0x4e, 0x70, 0x4d, 0x4d, 0x71, 0xfe, 0x13, 0x04, 0x4b, 0xfd, 0xda, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0x01, 0x2c, 0x7c, 0x56, 0x56, 0x7c, 0x56, 0xfe, 0xa0, 0x04, 0xca, 0xfa, 0xc4, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x05, 0x21, 0x09, 0x03, 0x02, 0xc4, 0x02, 0x26, 0xfd, 0xda, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0x8a, 0x04, 0xca, 0xfa, 0xc4, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x17, 0x21, 0x11, 0x09, 0x02, 0x9f, 0x02, 0x25, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0x8a, 0x04, 0xca, 0xfa, 0xc4, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x02, 0x00, 0x64, 0xfe, 0x00, 0x07, 0xaa, 0x06, 0x28, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x12, 0x10, 0x01, 0x16, 0x20, 0x37, 0x00, 0x10, 0x01, 0x26, 0x20, 0x07, 0x00, 0x10, 0x01, 0x36, 0x20, 0x17, 0x00, 0x10, 0x01, 0x06, 0x20, 0x27, 0xd9, 0x01, 0x98, 0xcb, 0x01, 0x97, 0xcb, 0x01, 0x98, 0xfe, 0x68, 0xcb, 0xfe, 0x69, 0xcb, 0xfd, 0xf4, 0x01, 0xd1, 0xe9, 0x01, 0xd1, 0xe9, 0x01, 0xd1, 0xfe, 0x2f, 0xe9, 0xfe, 0x2f, 0xe9, 0x04, 0x1e, 0xfb, 0xec, 0xfe, 0xfb, 0x83, 0x83, 0x01, 0x05, 0x04, 0x14, 0x01, 0x05, 0x83, 0x83, 0xfa, 0x9d, 0x04, 0xa8, 0x01, 0x2a, 0x96, 0x96, 0xfe, 0xd6, 0xfb, 0x58, 0xfe, 0xd6, 0x96, 0x96, 0x00, 0x00, 0x03, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0x05, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x21, 0x11, 0x21, 0x01, 0x0e, 0x04, 0xb2, 0xfd, 0xda, 0xfd, 0x74, 0x67, 0x05, 0x7f, 0xfa, 0xe8, 0x02, 0x25, 0xfd, 0xdb, 0x8a, 0x05, 0x3c, 0xfd, 0x29, 0xfd, 0x29, 0x06, 0x20, 0xf9, 0xe0, 0x03, 0x49, 0x02, 0x65, 0x00, 0x03, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x0e, 0x02, 0x8c, 0x02, 0x26, 0xfb, 0x4e, 0x67, 0x05, 0x7f, 0xfa, 0xe8, 0x02, 0x25, 0xfd, 0xdb, 0x02, 0x4d, 0xfd, 0x29, 0x05, 0x3c, 0xfa, 0x52, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x02, 0x65, 0x00, 0x03, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0x05, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x0e, 0x02, 0x25, 0x02, 0x8d, 0xfb, 0x4e, 0x67, 0x05, 0x7f, 0xfd, 0x74, 0x02, 0x26, 0xfd, 0xda, 0x8a, 0x02, 0xd7, 0x02, 0x65, 0xfa, 0x52, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x02, 0x65, 0x00, 0x00, 0x03, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0x05, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x21, 0x11, 0x21, 0x01, 0x0e, 0x04, 0xb2, 0xfd, 0x73, 0xfd, 0xdb, 0x67, 0x05, 0x7f, 0xfd, 0x74, 0x02, 0x26, 0xfd, 0xda, 0x8a, 0x02, 0x65, 0x02, 0xd7, 0xfa, 0x52, 0x06, 0x20, 0xf9, 0xe0, 0x03, 0x49, 0x02, 0x65, 0x00, 0x03, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x20, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x01, 0x06, 0x07, 0x04, 0x03, 0x21, 0x05, 0x12, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x10, 0x25, 0x26, 0x27, 0x11, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x01, 0xcf, 0x7b, 0x7b, 0xfe, 0xeb, 0x15, 0x02, 0x20, 0xfd, 0xe0, 0x15, 0x01, 0x15, 0x95, 0x95, 0x95, 0x95, 0x01, 0x2c, 0xfe, 0xd4, 0x7b, 0x7c, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x04, 0xda, 0x0e, 0x4f, 0xb2, 0xfe, 0xac, 0x72, 0xfe, 0xac, 0xb2, 0x60, 0x60, 0xc1, 0x02, 0xfc, 0xc1, 0x4f, 0x0e, 0xfd, 0x2b, 0x00, 0x03, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x05, 0x36, 0x37, 0x24, 0x10, 0x25, 0x26, 0x23, 0x22, 0x07, 0x04, 0x03, 0x21, 0x05, 0x12, 0x05, 0x16, 0x17, 0x11, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x02, 0x36, 0x7c, 0x7b, 0x01, 0x2c, 0xfe, 0xd4, 0x95, 0x95, 0x95, 0x95, 0xfe, 0xeb, 0x15, 0x02, 0x87, 0xfd, 0x79, 0x15, 0x01, 0x15, 0x7b, 0x7b, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x5e, 0x0e, 0x4f, 0xc1, 0x02, 0xfc, 0xc1, 0x60, 0x60, 0xb2, 0xfe, 0xac, 0x72, 0xfe, 0xac, 0xb2, 0x4f, 0x0e, 0x02, 0x63, 0x00, 0x00, 0x03, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x02, 0x10, 0x05, 0x16, 0x17, 0x11, 0x21, 0x02, 0x25, 0x26, 0x23, 0x22, 0x07, 0x01, 0x36, 0x37, 0x24, 0x13, 0x21, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x53, 0x01, 0x2c, 0x7b, 0x7b, 0x02, 0x88, 0x14, 0xfe, 0xea, 0x95, 0x95, 0x95, 0x95, 0x01, 0x5d, 0x7c, 0x7b, 0x01, 0x16, 0x14, 0xfd, 0xdf, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x03, 0xbc, 0xfd, 0x04, 0xc1, 0x4f, 0x0e, 0x02, 0xd5, 0x01, 0x54, 0xb2, 0x60, 0x60, 0xfb, 0x25, 0x0e, 0x4f, 0xb2, 0x01, 0x54, 0x00, 0x00, 0x03, 0x00, 0x64, 0xff, 0x04, 0x05, 0xe4, 0x05, 0x20, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x20, 0x00, 0x00, 0x12, 0x10, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x23, 0x22, 0x24, 0x02, 0x10, 0x05, 0x16, 0x33, 0x32, 0x37, 0x24, 0x13, 0x21, 0x11, 0x06, 0x07, 0x01, 0x02, 0x25, 0x26, 0x27, 0x11, 0x65, 0xbc, 0x01, 0x47, 0xbd, 0xbc, 0x01, 0x46, 0xbd, 0xbd, 0xfe, 0xba, 0xbc, 0xbd, 0xfe, 0xb9, 0x53, 0x01, 0x2c, 0x95, 0x95, 0x95, 0x95, 0x01, 0x16, 0x14, 0xfd, 0x78, 0x7b, 0x7b, 0x03, 0x7e, 0x14, 0xfe, 0xea, 0x7b, 0x7c, 0x01, 0x41, 0x01, 0xa2, 0x01, 0x6b, 0xd2, 0xd2, 0xfe, 0x95, 0xfe, 0x5e, 0xfe, 0x95, 0xd2, 0xd2, 0x03, 0xbc, 0xfd, 0x04, 0xc1, 0x60, 0x60, 0xb2, 0x01, 0x54, 0x02, 0xd5, 0x0e, 0x4f, 0xfd, 0xfa, 0x01, 0x54, 0xb2, 0x4f, 0x0e, 0xfd, 0x9d, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x37, 0x01, 0x21, 0x03, 0x11, 0x21, 0x6c, 0x04, 0x18, 0xfb, 0xe8, 0x67, 0x05, 0x7f, 0x20, 0x04, 0x92, 0xfa, 0x52, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x09, 0x01, 0x11, 0x25, 0x21, 0x11, 0x01, 0x06, 0x04, 0x18, 0xfa, 0xe7, 0x05, 0x7f, 0x04, 0xb2, 0xfb, 0x6e, 0x04, 0x92, 0x72, 0xf9, 0xe0, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x17, 0x21, 0x01, 0x03, 0x11, 0x01, 0x6c, 0x04, 0x18, 0xfb, 0xe8, 0x67, 0x05, 0x7f, 0x8a, 0x04, 0x92, 0xfa, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x79, 0x05, 0x53, 0x04, 0xaf, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x05, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x03, 0xde, 0xfc, 0x22, 0x67, 0x04, 0xac, 0x15, 0x04, 0x52, 0xfb, 0x3c, 0x05, 0x36, 0xfa, 0xca, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0x79, 0x05, 0x53, 0x04, 0xaf, 0x00, 0x03, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0xa7, 0x04, 0xac, 0x87, 0x05, 0x36, 0xfa, 0xca, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0xdd, 0x04, 0x9f, 0x04, 0x4b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x25, 0x21, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x03, 0x2a, 0xfc, 0xd6, 0x67, 0x03, 0xf8, 0x4f, 0x03, 0x8a, 0xfc, 0x04, 0x04, 0x6e, 0xfb, 0x92, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xff, 0xdd, 0x04, 0x9f, 0x04, 0x4b, 0x00, 0x03, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0xa7, 0x03, 0xf8, 0x23, 0x04, 0x6e, 0xfb, 0x92, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x05, 0x00, 0x00, 0x05, 0x21, 0x11, 0x09, 0x01, 0x11, 0x01, 0x06, 0x04, 0x18, 0xfa, 0xe7, 0x05, 0x7f, 0x8a, 0x04, 0x92, 0xfa, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x09, 0x00, 0x99, 0x00, 0x00, 0x05, 0xda, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x22, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x41, 0x00, 0x49, 0x00, 0x00, 0x01, 0x33, 0x17, 0x11, 0x07, 0x23, 0x27, 0x11, 0x05, 0x17, 0x15, 0x07, 0x27, 0x25, 0x17, 0x07, 0x23, 0x26, 0x27, 0x35, 0x05, 0x32, 0x1f, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x01, 0x21, 0x17, 0x15, 0x07, 0x21, 0x27, 0x35, 0x25, 0x21, 0x17, 0x15, 0x07, 0x21, 0x27, 0x35, 0x03, 0x33, 0x16, 0x17, 0x15, 0x07, 0x27, 0x35, 0x25, 0x33, 0x17, 0x15, 0x07, 0x27, 0x35, 0x25, 0x33, 0x17, 0x11, 0x07, 0x23, 0x27, 0x11, 0x03, 0x1b, 0x45, 0x05, 0x05, 0x45, 0x06, 0x01, 0xff, 0x34, 0xdf, 0x37, 0xfd, 0x4a, 0xe3, 0x37, 0x03, 0xb4, 0x29, 0x01, 0xf8, 0xbc, 0x50, 0x0c, 0xac, 0x3f, 0x2a, 0x9d, 0x58, 0x20, 0xa5, 0x3c, 0xfd, 0x90, 0x01, 0x31, 0x06, 0x06, 0xfe, 0xcf, 0x05, 0x04, 0x03, 0x01, 0x36, 0x07, 0x07, 0xfe, 0xca, 0x06, 0x3f, 0x02, 0x79, 0x66, 0x37, 0xdf, 0xfd, 0xf0, 0x03, 0x35, 0xde, 0x37, 0x01, 0xe5, 0x45, 0x05, 0x05, 0x45, 0x06, 0x05, 0xd5, 0x06, 0xfe, 0xa2, 0x06, 0x06, 0x01, 0x5e, 0x9b, 0x3f, 0x03, 0xfe, 0x3f, 0xee, 0xfe, 0x40, 0xc7, 0x37, 0x04, 0xb5, 0xe1, 0x60, 0xbd, 0x64, 0x17, 0xa7, 0x3f, 0x5c, 0xb5, 0x67, 0x1b, 0xfe, 0xed, 0x06, 0x4f, 0x06, 0x06, 0x4f, 0x06, 0x06, 0x4f, 0x06, 0x06, 0x4f, 0xfe, 0xe8, 0x82, 0x79, 0x03, 0x3e, 0xfd, 0x04, 0x2a, 0x3c, 0x03, 0xfe, 0x3f, 0x04, 0x76, 0x06, 0xfe, 0xa2, 0x06, 0x06, 0x01, 0x5e, 0x00, 0x01, 0x00, 0x5d, 0xff, 0xfb, 0x06, 0xd5, 0x02, 0xe1, 0x00, 0x22, 0x00, 0x00, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x36, 0x33, 0x16, 0x15, 0x14, 0x07, 0x16, 0x1d, 0x01, 0x06, 0x23, 0x21, 0x35, 0x32, 0x37, 0x36, 0x3b, 0x01, 0x27, 0x34, 0x3f, 0x01, 0x17, 0x27, 0x34, 0x3f, 0x01, 0x32, 0x17, 0x36, 0x04, 0x76, 0x14, 0xc3, 0x69, 0x13, 0x23, 0x31, 0x7a, 0x1f, 0x5d, 0x11, 0x48, 0xf9, 0xe2, 0x33, 0x79, 0x29, 0x2f, 0x1d, 0x0a, 0x90, 0x23, 0x26, 0x05, 0xb8, 0x3c, 0x2b, 0x2a, 0x6c, 0x02, 0xe1, 0xe8, 0x56, 0x23, 0x1b, 0x6d, 0x31, 0x34, 0x17, 0x48, 0x1a, 0x65, 0x09, 0xae, 0x27, 0x31, 0x6c, 0x31, 0x04, 0x04, 0x0c, 0x93, 0x5a, 0x08, 0x2b, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x06, 0x1b, 0x05, 0xd5, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x33, 0x17, 0x15, 0x33, 0x20, 0x13, 0x16, 0x1d, 0x01, 0x23, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x15, 0x14, 0x07, 0x27, 0x26, 0x23, 0x11, 0x14, 0x0f, 0x01, 0x22, 0x2f, 0x01, 0x35, 0x37, 0x33, 0x17, 0x15, 0x16, 0x3b, 0x01, 0x32, 0x3f, 0x01, 0x11, 0x22, 0x07, 0x06, 0x23, 0x27, 0x35, 0x37, 0x23, 0x26, 0x27, 0x23, 0x22, 0x0f, 0x01, 0x23, 0x35, 0x36, 0x37, 0x36, 0x21, 0x35, 0x03, 0x30, 0x34, 0x06, 0x02, 0x01, 0x8c, 0xfc, 0x26, 0x01, 0x14, 0x11, 0x20, 0x33, 0x28, 0x87, 0x64, 0x08, 0x1d, 0x88, 0x7b, 0x5f, 0x1b, 0x52, 0x21, 0x02, 0x05, 0x27, 0x05, 0x09, 0x38, 0x09, 0x32, 0x12, 0x05, 0xbe, 0x4d, 0x10, 0x0c, 0x06, 0x06, 0x04, 0x3c, 0xb1, 0x3d, 0x59, 0x1e, 0x12, 0x03, 0x34, 0xad, 0xd7, 0x01, 0x19, 0x05, 0xd5, 0x06, 0x7d, 0xfe, 0x1a, 0x56, 0x0d, 0x08, 0x0f, 0x2e, 0x18, 0x65, 0x33, 0x0f, 0x02, 0x42, 0x3d, 0xfd, 0x53, 0x65, 0x18, 0x02, 0x60, 0x1c, 0x1a, 0x06, 0x06, 0x0c, 0x65, 0x39, 0x2a, 0x02, 0xa4, 0x3d, 0x39, 0x06, 0x0c, 0x33, 0x40, 0x1b, 0x3d, 0x12, 0x02, 0x90, 0xda, 0xdf, 0x7d, 0x00, 0x1a, 0x00, 0x99, 0xff, 0xff, 0x05, 0xdc, 0x07, 0x6b, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x43, 0x00, 0x60, 0x00, 0x8c, 0x00, 0xb7, 0x00, 0xe3, 0x01, 0x0e, 0x01, 0x3a, 0x01, 0x64, 0x01, 0x90, 0x01, 0xbb, 0x01, 0xe6, 0x02, 0x0f, 0x02, 0x3b, 0x02, 0x65, 0x02, 0x6d, 0x02, 0x75, 0x02, 0x7d, 0x02, 0xa9, 0x02, 0xd3, 0x02, 0xfd, 0x03, 0x27, 0x03, 0x53, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x37, 0x33, 0x06, 0x07, 0x26, 0x27, 0x33, 0x16, 0x33, 0x32, 0x37, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x07, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x03, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x27, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x32, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x06, 0x13, 0x36, 0x37, 0x32, 0x1f, 0x01, 0x16, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x20, 0x24, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x34, 0x37, 0x01, 0x17, 0x27, 0x26, 0x33, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x01, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x05, 0x17, 0x27, 0x26, 0x33, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x13, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x01, 0x17, 0x27, 0x26, 0x33, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x14, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x01, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x14, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x05, 0x17, 0x27, 0x34, 0x33, 0x32, 0x15, 0x07, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x03, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x05, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x1f, 0x01, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x14, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x37, 0x17, 0x27, 0x34, 0x33, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x37, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x13, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x05, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x17, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x01, 0x17, 0x27, 0x26, 0x33, 0x32, 0x15, 0x07, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x01, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x14, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x05, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x01, 0x17, 0x27, 0x26, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x01, 0x17, 0x27, 0x26, 0x33, 0x32, 0x0f, 0x01, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x2f, 0x01, 0x17, 0x16, 0x23, 0x22, 0x35, 0x37, 0x07, 0x06, 0x23, 0x22, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x03, 0x96, 0x07, 0x07, 0x3c, 0x16, 0x17, 0x05, 0x73, 0x71, 0x08, 0x15, 0x21, 0x36, 0x07, 0x6e, 0x26, 0x01, 0x03, 0x26, 0x23, 0x03, 0x03, 0xf9, 0x25, 0x02, 0x02, 0x27, 0x24, 0x03, 0x03, 0x3a, 0x22, 0x02, 0x03, 0x23, 0x21, 0x01, 0x01, 0xb6, 0x70, 0xde, 0x9e, 0x9c, 0xe0, 0x70, 0x5b, 0x7d, 0x02, 0x03, 0x36, 0x28, 0x3b, 0x71, 0x54, 0x52, 0x7d, 0x3c, 0x28, 0x32, 0x82, 0x13, 0x17, 0x85, 0x77, 0x2c, 0x02, 0x4a, 0x44, 0x12, 0x16, 0x64, 0x4e, 0x80, 0xff, 0xfe, 0x92, 0xff, 0x00, 0x80, 0x53, 0x6a, 0x12, 0x12, 0x44, 0x44, 0xfd, 0xe5, 0x25, 0x05, 0x01, 0x0d, 0x10, 0x02, 0x05, 0x24, 0x03, 0x04, 0x0e, 0x07, 0x2b, 0x2a, 0x08, 0x0e, 0x04, 0x03, 0x24, 0x05, 0x01, 0x0f, 0x0c, 0x04, 0x24, 0x02, 0x05, 0x0c, 0x08, 0x29, 0x2c, 0x06, 0x0d, 0x05, 0x01, 0x0a, 0x21, 0x05, 0x02, 0x1b, 0x02, 0x05, 0x21, 0x04, 0x03, 0x0d, 0x06, 0x28, 0x26, 0x06, 0x0b, 0x04, 0x03, 0x1f, 0x03, 0x01, 0x0c, 0x0c, 0x04, 0x20, 0x03, 0x03, 0x0c, 0x07, 0x25, 0x26, 0x07, 0x0d, 0x03, 0x03, 0x0f, 0x21, 0x05, 0x02, 0x0d, 0x0e, 0x01, 0x06, 0x21, 0x03, 0x05, 0x0b, 0x06, 0x27, 0x25, 0x07, 0x0a, 0x06, 0x02, 0x20, 0x05, 0x01, 0x0e, 0x0b, 0x04, 0x20, 0x03, 0x03, 0x0d, 0x08, 0x25, 0x26, 0x07, 0x0d, 0x03, 0x5c, 0x21, 0x06, 0x01, 0x1b, 0x02, 0x06, 0x22, 0x03, 0x04, 0x0c, 0x06, 0x27, 0x25, 0x07, 0x0b, 0x06, 0x01, 0x21, 0x05, 0x01, 0x0d, 0x0c, 0x05, 0x20, 0x03, 0x04, 0x0b, 0x07, 0x25, 0x26, 0x07, 0x0c, 0x04, 0xfc, 0x37, 0x11, 0x02, 0x01, 0x06, 0x07, 0x01, 0x02, 0x12, 0x01, 0x01, 0x08, 0x03, 0x16, 0x15, 0x04, 0x08, 0x01, 0x01, 0x11, 0x01, 0x06, 0x05, 0x02, 0x11, 0x02, 0x03, 0x05, 0x03, 0x15, 0x16, 0x02, 0x07, 0x01, 0x02, 0xc8, 0x12, 0x02, 0x01, 0x10, 0x01, 0x03, 0x13, 0x02, 0x02, 0x08, 0x04, 0x17, 0x16, 0x04, 0x07, 0x02, 0x02, 0x13, 0x03, 0x0e, 0x02, 0x12, 0x02, 0x02, 0x07, 0x03, 0x17, 0x17, 0x04, 0x08, 0x02, 0xfd, 0x0e, 0x12, 0x04, 0x06, 0x08, 0x04, 0x11, 0x03, 0x02, 0x07, 0x05, 0x14, 0x14, 0x04, 0x06, 0x02, 0x03, 0x11, 0x03, 0x01, 0x08, 0x06, 0x04, 0x12, 0x02, 0x02, 0x06, 0x03, 0x14, 0x14, 0x04, 0x07, 0x02, 0x53, 0x12, 0x04, 0x01, 0x0f, 0x01, 0x03, 0x11, 0x03, 0x02, 0x06, 0x03, 0x15, 0x14, 0x04, 0x06, 0x02, 0x03, 0x11, 0x03, 0x01, 0x07, 0x07, 0x03, 0x11, 0x02, 0x02, 0x07, 0x05, 0x13, 0x13, 0x05, 0x07, 0x02, 0x01, 0x00, 0x11, 0x02, 0x01, 0x0f, 0x01, 0x03, 0x11, 0x01, 0x03, 0x07, 0x04, 0x14, 0x13, 0x05, 0x07, 0x03, 0x01, 0x11, 0x03, 0x01, 0x08, 0x06, 0x02, 0x11, 0x02, 0x01, 0x07, 0x04, 0x14, 0x15, 0x03, 0x07, 0x01, 0x64, 0x11, 0x02, 0x02, 0x0f, 0x01, 0x03, 0x12, 0x01, 0x02, 0x07, 0x03, 0x15, 0x15, 0x03, 0x07, 0x02, 0x01, 0x11, 0x02, 0x06, 0x06, 0x02, 0x11, 0x02, 0x03, 0x05, 0x04, 0x13, 0x14, 0x03, 0x05, 0x03, 0xde, 0x13, 0x02, 0x06, 0x08, 0x01, 0x03, 0x14, 0x01, 0x04, 0x07, 0x05, 0x17, 0x16, 0x06, 0x07, 0x04, 0x02, 0x12, 0x02, 0x01, 0x08, 0x06, 0x02, 0x13, 0x02, 0x02, 0x07, 0x04, 0x16, 0x17, 0x03, 0x07, 0x02, 0x52, 0x13, 0x02, 0x01, 0x10, 0x01, 0x04, 0x14, 0x02, 0x02, 0x07, 0x03, 0x17, 0x16, 0x04, 0x07, 0x02, 0x02, 0x14, 0x03, 0x01, 0x0e, 0x02, 0x13, 0x01, 0x03, 0x07, 0x04, 0x17, 0x18, 0x03, 0x08, 0x02, 0x9c, 0x21, 0x02, 0x02, 0x25, 0x1f, 0x03, 0x03, 0xfe, 0xd8, 0x22, 0x02, 0x03, 0x23, 0x21, 0x01, 0x01, 0xe3, 0x22, 0x02, 0x02, 0x25, 0x1f, 0x03, 0x03, 0x01, 0x3d, 0x20, 0x05, 0x01, 0x0d, 0x0d, 0x06, 0x20, 0x03, 0x05, 0x0b, 0x06, 0x26, 0x25, 0x07, 0x0b, 0x05, 0x03, 0x20, 0x04, 0x02, 0x0d, 0x0c, 0x05, 0x20, 0x03, 0x04, 0x0d, 0x08, 0x26, 0x27, 0x07, 0x0d, 0x04, 0xfc, 0xb3, 0x12, 0x02, 0x01, 0x10, 0x01, 0x04, 0x13, 0x03, 0x02, 0x08, 0x04, 0x17, 0x16, 0x04, 0x07, 0x02, 0x03, 0x13, 0x04, 0x0e, 0x02, 0x12, 0x02, 0x02, 0x07, 0x03, 0x17, 0x18, 0x03, 0x08, 0x02, 0xfe, 0x7c, 0x14, 0x03, 0x01, 0x10, 0x01, 0x02, 0x13, 0x01, 0x02, 0x07, 0x02, 0x18, 0x17, 0x03, 0x07, 0x02, 0x01, 0x13, 0x01, 0x01, 0x0e, 0x03, 0x14, 0x01, 0x02, 0x08, 0x05, 0x16, 0x17, 0x04, 0x08, 0x02, 0x03, 0xc5, 0x14, 0x03, 0x01, 0x10, 0x01, 0x03, 0x13, 0x02, 0x02, 0x07, 0x02, 0x18, 0x17, 0x03, 0x07, 0x02, 0x02, 0x13, 0x02, 0x01, 0x0e, 0x03, 0x14, 0x01, 0x03, 0x07, 0x05, 0x16, 0x17, 0x04, 0x08, 0x02, 0xfc, 0xa4, 0x22, 0x05, 0x02, 0x0d, 0x0e, 0x02, 0x05, 0x21, 0x03, 0x05, 0x0b, 0x06, 0x27, 0x25, 0x07, 0x0a, 0x06, 0x02, 0x20, 0x04, 0x01, 0x0d, 0x0b, 0x04, 0x21, 0x02, 0x03, 0x0d, 0x07, 0x26, 0x26, 0x08, 0x0e, 0x03, 0x03, 0x89, 0x01, 0x26, 0x45, 0x05, 0x07, 0x43, 0x26, 0x56, 0x02, 0x2a, 0x2c, 0x03, 0x03, 0x29, 0x2d, 0x04, 0x02, 0x29, 0x2d, 0x03, 0x03, 0x2a, 0x2c, 0xfe, 0x12, 0x02, 0x25, 0x26, 0x02, 0x02, 0x25, 0x26, 0x9e, 0x66, 0x93, 0x91, 0xd0, 0xd0, 0x91, 0x93, 0x66, 0x55, 0x20, 0x33, 0x48, 0x68, 0x66, 0x65, 0x65, 0x66, 0x68, 0x48, 0x32, 0x1e, 0x01, 0xd9, 0x70, 0x18, 0x75, 0x13, 0x5e, 0xe8, 0x51, 0x18, 0x10, 0x1c, 0x46, 0x73, 0xa5, 0xa3, 0xe6, 0xe6, 0xa3, 0xa5, 0x73, 0x4b, 0x1a, 0x0f, 0x16, 0x51, 0xe8, 0x47, 0xfd, 0x68, 0x21, 0x39, 0x0f, 0x0f, 0x39, 0x21, 0x04, 0x11, 0x0b, 0x03, 0x15, 0x16, 0x03, 0x0c, 0x0f, 0x02, 0x21, 0x37, 0x10, 0x10, 0x37, 0x21, 0x02, 0x0f, 0x0c, 0x03, 0x16, 0x15, 0x03, 0x0b, 0x11, 0x01, 0xd1, 0x1f, 0x34, 0x0d, 0x0d, 0x34, 0x1f, 0x03, 0x10, 0x07, 0x05, 0x14, 0x13, 0x03, 0x09, 0x0e, 0x02, 0x1e, 0x32, 0x0f, 0x0f, 0x32, 0x1e, 0x02, 0x0e, 0x09, 0x03, 0x13, 0x14, 0x05, 0x07, 0x10, 0x4b, 0x1f, 0x34, 0x0e, 0x0e, 0x34, 0x1f, 0x03, 0x10, 0x07, 0x03, 0x15, 0x13, 0x04, 0x09, 0x0e, 0x02, 0x1e, 0x32, 0x0e, 0x0e, 0x32, 0x1e, 0x02, 0x0e, 0x09, 0x04, 0x13, 0x15, 0x03, 0x07, 0x10, 0x01, 0x1b, 0x1e, 0x32, 0x0e, 0x0e, 0x32, 0x1e, 0x02, 0x0e, 0x09, 0x04, 0x13, 0x14, 0x03, 0x09, 0x0f, 0x03, 0x1d, 0x31, 0x0e, 0x0e, 0x31, 0x1d, 0x03, 0x0f, 0x09, 0x03, 0x14, 0x13, 0x04, 0x09, 0x0e, 0x02, 0x9a, 0x10, 0x1c, 0x06, 0x06, 0x1c, 0x10, 0x01, 0x07, 0x06, 0x02, 0x09, 0x0b, 0x02, 0x04, 0x08, 0x02, 0x0e, 0x19, 0x07, 0x07, 0x19, 0x0e, 0x02, 0x08, 0x04, 0x02, 0x0b, 0x09, 0x02, 0x06, 0x07, 0xfe, 0xe3, 0x11, 0x1d, 0x0a, 0x0a, 0x1d, 0x11, 0x03, 0x0a, 0x05, 0x01, 0x0d, 0x0a, 0x03, 0x06, 0x07, 0x01, 0x11, 0x1e, 0x07, 0x07, 0x1e, 0x11, 0x01, 0x07, 0x06, 0x03, 0x0a, 0x0d, 0x01, 0x05, 0x0a, 0xa8, 0x10, 0x1c, 0x07, 0x07, 0x1c, 0x10, 0x02, 0x07, 0x06, 0x02, 0x09, 0x0b, 0x02, 0x05, 0x08, 0x02, 0x0f, 0x1a, 0x08, 0x08, 0x1a, 0x0f, 0x02, 0x08, 0x05, 0x02, 0x0b, 0x09, 0x02, 0x06, 0x07, 0x01, 0x18, 0x10, 0x1c, 0x06, 0x06, 0x1c, 0x10, 0x02, 0x08, 0x04, 0x03, 0x0a, 0x0a, 0x02, 0x05, 0x07, 0x01, 0x0f, 0x19, 0x08, 0x08, 0x19, 0x0f, 0x01, 0x07, 0x05, 0x02, 0x0a, 0x0a, 0x03, 0x04, 0x08, 0x18, 0x0f, 0x1b, 0x07, 0x07, 0x1b, 0x0f, 0x02, 0x08, 0x05, 0x01, 0x0a, 0x0b, 0x01, 0x06, 0x07, 0x01, 0x10, 0x1b, 0x08, 0x08, 0x1b, 0x10, 0x01, 0x07, 0x06, 0x01, 0x0b, 0x0a, 0x01, 0x06, 0x07, 0xa1, 0x0f, 0x1b, 0x07, 0x07, 0x1b, 0x0f, 0x01, 0x07, 0x04, 0x01, 0x0c, 0x0a, 0x01, 0x0c, 0x01, 0x0f, 0x1b, 0x07, 0x07, 0x1b, 0x0f, 0x01, 0x0c, 0x01, 0x0a, 0x0c, 0x01, 0x04, 0x07, 0x37, 0x12, 0x1f, 0x07, 0x07, 0x1f, 0x12, 0x01, 0x08, 0x05, 0x02, 0x0c, 0x0c, 0x02, 0x05, 0x08, 0x01, 0x12, 0x1d, 0x0a, 0x0a, 0x1d, 0x12, 0x01, 0x08, 0x05, 0x02, 0x0c, 0x0c, 0x02, 0x05, 0x08, 0xd9, 0x12, 0x1f, 0x07, 0x07, 0x1f, 0x12, 0x01, 0x08, 0x05, 0x02, 0x0b, 0x0c, 0x02, 0x05, 0x0a, 0x03, 0x10, 0x1c, 0x09, 0x09, 0x1c, 0x10, 0x03, 0x0a, 0x05, 0x02, 0x0c, 0x0b, 0x02, 0x06, 0x07, 0xfa, 0xe0, 0x02, 0x25, 0x26, 0x02, 0x02, 0x25, 0x26, 0xe2, 0x02, 0x25, 0x27, 0x02, 0x03, 0x25, 0x26, 0x02, 0x02, 0x25, 0x27, 0x02, 0x03, 0x25, 0x26, 0x01, 0x81, 0x1d, 0x32, 0x0e, 0x0e, 0x32, 0x1d, 0x03, 0x0f, 0x09, 0x03, 0x13, 0x14, 0x03, 0x0a, 0x0e, 0x04, 0x1b, 0x2f, 0x0f, 0x0f, 0x2f, 0x1b, 0x04, 0x0e, 0x0a, 0x03, 0x14, 0x13, 0x03, 0x09, 0x0f, 0x02, 0x67, 0x12, 0x1e, 0x08, 0x08, 0x1e, 0x12, 0x01, 0x0a, 0x04, 0x02, 0x0b, 0x0c, 0x02, 0x06, 0x08, 0x02, 0x11, 0x1d, 0x09, 0x09, 0x1d, 0x11, 0x02, 0x08, 0x06, 0x02, 0x0c, 0x0b, 0x02, 0x04, 0x0a, 0xfb, 0x12, 0x1f, 0x07, 0x07, 0x1f, 0x12, 0x01, 0x08, 0x05, 0x03, 0x0b, 0x0c, 0x02, 0x05, 0x09, 0x01, 0x12, 0x1c, 0x0a, 0x0a, 0x1c, 0x12, 0x01, 0x09, 0x05, 0x02, 0x0c, 0x0b, 0x03, 0x05, 0x08, 0x01, 0x82, 0x11, 0x1e, 0x08, 0x08, 0x1e, 0x11, 0x02, 0x08, 0x07, 0x01, 0x0b, 0x0c, 0x02, 0x05, 0x09, 0x01, 0x11, 0x1c, 0x09, 0x09, 0x1c, 0x11, 0x01, 0x09, 0x05, 0x02, 0x0c, 0x0b, 0x01, 0x07, 0x08, 0xfd, 0x7f, 0x1f, 0x34, 0x0e, 0x0e, 0x34, 0x1f, 0x03, 0x10, 0x07, 0x04, 0x14, 0x13, 0x03, 0x0a, 0x0e, 0x03, 0x1d, 0x32, 0x0e, 0x0e, 0x32, 0x1d, 0x03, 0x0e, 0x0a, 0x03, 0x13, 0x14, 0x04, 0x07, 0x10, 0x00, 0x0f, 0x00, 0x75, 0x00, 0x00, 0x05, 0xff, 0x07, 0x0b, 0x00, 0x17, 0x00, 0x2d, 0x00, 0x3e, 0x00, 0x4f, 0x00, 0x60, 0x00, 0x71, 0x00, 0x82, 0x00, 0x93, 0x00, 0xa4, 0x00, 0xb5, 0x00, 0xc6, 0x00, 0xd7, 0x00, 0xe8, 0x00, 0xf9, 0x01, 0x0a, 0x00, 0x00, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x2b, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x3f, 0x02, 0x36, 0x33, 0x32, 0x33, 0x16, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x26, 0x23, 0x22, 0x07, 0x13, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x3d, 0x01, 0x34, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x01, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x01, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x25, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x36, 0x02, 0x0a, 0x29, 0x17, 0x12, 0x2d, 0x13, 0x56, 0x6f, 0x14, 0x2f, 0x22, 0x2a, 0x36, 0x25, 0x0b, 0x5a, 0x7b, 0x03, 0x03, 0x38, 0xec, 0x47, 0x08, 0x05, 0x0c, 0x0d, 0x1b, 0x27, 0x2f, 0x41, 0x2e, 0x4a, 0x04, 0x1d, 0x1c, 0x2c, 0x31, 0x44, 0xdf, 0x1a, 0x0d, 0x07, 0x18, 0x0a, 0x0b, 0x21, 0x0b, 0x01, 0x17, 0x0c, 0x97, 0x1a, 0x0d, 0x07, 0x18, 0x09, 0x0c, 0x21, 0x0b, 0x01, 0x17, 0x0c, 0x7c, 0x19, 0x0e, 0x06, 0x17, 0x09, 0x0d, 0x1f, 0x0d, 0x01, 0x17, 0x0c, 0x8c, 0x19, 0x0d, 0x07, 0x18, 0x09, 0x0c, 0x20, 0x0c, 0x01, 0x17, 0x0c, 0x02, 0x1a, 0x0d, 0x07, 0x18, 0x09, 0x0d, 0x1f, 0x0d, 0x17, 0x0c, 0xab, 0x1b, 0x0d, 0x06, 0x17, 0x0a, 0x0c, 0x20, 0x0c, 0x01, 0x18, 0x0c, 0x01, 0x62, 0x19, 0x0e, 0x06, 0x17, 0x09, 0x0d, 0x1f, 0x0d, 0x01, 0x17, 0x0c, 0xaf, 0x1a, 0x0d, 0x07, 0x18, 0x0a, 0x0b, 0x21, 0x0b, 0x01, 0x17, 0x0c, 0xae, 0x1a, 0x0e, 0x06, 0x17, 0x0a, 0x0c, 0x20, 0x0c, 0x01, 0x18, 0x0b, 0xfd, 0x9a, 0x1a, 0x0d, 0x07, 0x18, 0x0a, 0x0b, 0x21, 0x0b, 0x01, 0x17, 0x0c, 0xf6, 0x1a, 0x0d, 0x06, 0x17, 0x09, 0x0d, 0x1f, 0x0d, 0x01, 0x18, 0x0b, 0x01, 0x05, 0x1b, 0x0d, 0x06, 0x17, 0x0a, 0x0c, 0x20, 0x0c, 0x01, 0x18, 0x0b, 0xea, 0x19, 0x0d, 0x06, 0x17, 0x09, 0x0c, 0x20, 0x0d, 0x01, 0x18, 0x0c, 0x02, 0x20, 0x37, 0x51, 0x3d, 0x4b, 0x47, 0x3c, 0x1a, 0x73, 0x07, 0x2d, 0x38, 0x50, 0x5a, 0x79, 0x39, 0x0e, 0x7a, 0x0c, 0x80, 0x5f, 0x65, 0x22, 0x22, 0x16, 0x10, 0x12, 0x23, 0x2f, 0x32, 0x64, 0x74, 0x1a, 0x1b, 0x30, 0x26, 0x32, 0x01, 0x6a, 0x1f, 0x0c, 0x0f, 0x06, 0x1f, 0x12, 0x07, 0x2c, 0x0e, 0x03, 0x1f, 0x14, 0x08, 0x01, 0x3a, 0x1e, 0x0c, 0x0f, 0x07, 0x1e, 0x13, 0x08, 0x2e, 0x0c, 0x05, 0x1e, 0x14, 0x08, 0x01, 0x34, 0x1f, 0x0c, 0x0e, 0x07, 0x1e, 0x14, 0x07, 0x2e, 0x0c, 0x05, 0x1e, 0x14, 0x08, 0x01, 0x3d, 0x1f, 0x0c, 0x0f, 0x06, 0x1f, 0x12, 0x07, 0x2c, 0x0d, 0x04, 0x1f, 0x14, 0x08, 0xfd, 0x02, 0x1f, 0x0c, 0x0f, 0x06, 0x1f, 0x12, 0x07, 0x2c, 0x0e, 0x03, 0x20, 0x13, 0x08, 0xfe, 0xfc, 0x1f, 0x0c, 0x0e, 0x06, 0x20, 0x12, 0x07, 0x2d, 0x0d, 0x04, 0x1f, 0x13, 0x08, 0x02, 0x07, 0x1e, 0x0c, 0x0f, 0x07, 0x1e, 0x13, 0x07, 0x2d, 0x0c, 0x05, 0x1e, 0x15, 0x07, 0xfa, 0x1e, 0x0c, 0x0f, 0x07, 0x1e, 0x13, 0x07, 0x2d, 0x0c, 0x05, 0x1e, 0x15, 0x07, 0x01, 0x04, 0x20, 0x0c, 0x0e, 0x06, 0x1f, 0x12, 0x08, 0x2d, 0x0d, 0x04, 0x1f, 0x13, 0x09, 0xfb, 0x0c, 0x1e, 0x0c, 0x0f, 0x07, 0x1e, 0x13, 0x08, 0x2e, 0x0c, 0x05, 0x1e, 0x14, 0x08, 0xd3, 0x1e, 0x0c, 0x0e, 0x07, 0x1e, 0x14, 0x07, 0x2e, 0x0c, 0x05, 0x1e, 0x14, 0x07, 0xe7, 0x1f, 0x0c, 0x0e, 0x06, 0x20, 0x12, 0x07, 0x2c, 0x0e, 0x03, 0x20, 0x13, 0x08, 0xca, 0x1f, 0x0c, 0x0e, 0x06, 0x20, 0x12, 0x07, 0x2d, 0x0d, 0x03, 0x20, 0x13, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0xff, 0xf7, 0x05, 0xfd, 0x05, 0xc9, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x1b, 0x01, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x78, 0x02, 0x1b, 0xa7, 0xa8, 0x02, 0x1b, 0xfe, 0x4c, 0xa7, 0xfe, 0x4a, 0xfe, 0x4b, 0xa6, 0x03, 0x90, 0x02, 0x39, 0xfd, 0xc7, 0xfe, 0x9f, 0xfd, 0xc8, 0x01, 0x60, 0xfe, 0xa0, 0x02, 0x38, 0x00, 0x00, 0x02, 0x00, 0x77, 0xff, 0xf7, 0x05, 0xfd, 0x05, 0xc9, 0x00, 0x09, 0x00, 0x13, 0x00, 0x00, 0x13, 0x21, 0x1b, 0x01, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x37, 0x03, 0x09, 0x01, 0x03, 0x01, 0x21, 0x0b, 0x01, 0x21, 0x78, 0x02, 0x1b, 0xa7, 0xa8, 0x02, 0x1b, 0xfe, 0x4c, 0xa7, 0xfe, 0x4a, 0xfe, 0x4b, 0xa6, 0x3d, 0x7e, 0x01, 0x50, 0x01, 0x5a, 0x89, 0x01, 0x67, 0xfe, 0x4b, 0x83, 0x80, 0xfe, 0x49, 0x03, 0x90, 0x02, 0x39, 0xfd, 0xc7, 0xfe, 0x9f, 0xfd, 0xc8, 0x01, 0x60, 0xfe, 0xa0, 0x02, 0x38, 0x15, 0xfe, 0x4e, 0x01, 0x0c, 0xfe, 0xe6, 0x01, 0xc2, 0x01, 0x18, 0x01, 0xb7, 0xfe, 0x49, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x04, 0x03, 0x87, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x01, 0x16, 0x17, 0x14, 0x07, 0x09, 0x01, 0x37, 0x13, 0x25, 0x37, 0x01, 0x26, 0x35, 0x34, 0x37, 0x01, 0x36, 0x03, 0x52, 0x33, 0x02, 0x08, 0xfd, 0xbd, 0x01, 0xbc, 0x4e, 0x22, 0xfe, 0x65, 0xc9, 0xfe, 0x14, 0x11, 0x3b, 0x02, 0x51, 0x09, 0x05, 0xd5, 0x02, 0x36, 0x24, 0x0c, 0xfd, 0x85, 0xfd, 0xf4, 0xe6, 0xfe, 0x38, 0x27, 0x5e, 0x02, 0x34, 0x17, 0x17, 0x1b, 0x3f, 0x02, 0x86, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdb, 0x05, 0xd9, 0x00, 0x19, 0x00, 0x00, 0x13, 0x21, 0x32, 0x15, 0x14, 0x07, 0x09, 0x01, 0x37, 0x13, 0x25, 0x37, 0x01, 0x26, 0x35, 0x34, 0x37, 0x01, 0x21, 0x11, 0x06, 0x07, 0x26, 0x27, 0x11, 0x36, 0xd5, 0x04, 0xc2, 0x3a, 0x19, 0xfd, 0xfb, 0x01, 0xb6, 0x50, 0x21, 0xfe, 0x60, 0xd0, 0xfe, 0x24, 0x0e, 0x2f, 0x01, 0xb4, 0xfc, 0x18, 0x01, 0x41, 0x3f, 0x01, 0x01, 0x05, 0xd9, 0x53, 0x22, 0x1b, 0xfd, 0xc5, 0xfe, 0x1b, 0xd5, 0xfe, 0x3d, 0x22, 0x6c, 0x02, 0x16, 0x10, 0x2d, 0x1c, 0x32, 0x01, 0xdf, 0xfa, 0xfc, 0x44, 0x01, 0x01, 0x43, 0x05, 0x5b, 0x39, 0x00, 0x00, 0x00, 0x03, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd8, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x26, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x10, 0x00, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x20, 0x04, 0x02, 0x05, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x05, 0xdb, 0xfe, 0x76, 0xfe, 0xe8, 0xfe, 0xea, 0xfe, 0x76, 0xb5, 0x01, 0x44, 0xa7, 0xaa, 0x01, 0x44, 0xb4, 0xfb, 0x00, 0x01, 0x62, 0x01, 0xf8, 0x01, 0x63, 0xa2, 0xfe, 0xdc, 0xfe, 0xce, 0xfe, 0xdd, 0xa2, 0x03, 0x07, 0x62, 0x46, 0x45, 0x63, 0x2d, 0x51, 0x54, 0x52, 0x2c, 0x02, 0xec, 0xfe, 0xc9, 0xfe, 0x4b, 0x01, 0xb5, 0x01, 0x37, 0xc2, 0x01, 0x69, 0xc1, 0xc1, 0xfe, 0x99, 0xc4, 0xfe, 0xe8, 0xfe, 0x77, 0x01, 0x89, 0x01, 0x18, 0xb1, 0x01, 0x42, 0xae, 0xae, 0xfe, 0xbe, 0xb1, 0x4e, 0x6d, 0x6d, 0x4e, 0x31, 0x5a, 0x30, 0x30, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x00, 0x00, 0x05, 0xf6, 0x05, 0xd1, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x43, 0x00, 0x00, 0x00, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x25, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x25, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x24, 0x20, 0x04, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x10, 0x06, 0x23, 0x22, 0x26, 0x10, 0x37, 0x36, 0x37, 0x26, 0x35, 0x34, 0x00, 0x21, 0x20, 0x00, 0x15, 0x14, 0x05, 0x1f, 0x85, 0x5d, 0x5d, 0x43, 0x41, 0x5e, 0xfc, 0x0c, 0x41, 0x5e, 0x5e, 0x41, 0x43, 0x5d, 0x5d, 0x03, 0xae, 0x17, 0x14, 0x52, 0xa4, 0x75, 0x74, 0xa4, 0x51, 0x49, 0x64, 0x6d, 0xfe, 0xd2, 0xfe, 0x50, 0xfe, 0xd2, 0x6d, 0x71, 0x4e, 0x51, 0xa4, 0x75, 0x73, 0xa5, 0x52, 0x11, 0x11, 0x6e, 0x01, 0x93, 0x01, 0x21, 0x01, 0x24, 0x01, 0x93, 0x01, 0xe9, 0x67, 0x4a, 0x49, 0x67, 0x67, 0x49, 0x4a, 0x67, 0x67, 0x4a, 0x49, 0x68, 0x68, 0x49, 0x4a, 0x67, 0x55, 0x11, 0x16, 0x5c, 0x82, 0x81, 0xb7, 0xb7, 0x81, 0x82, 0x5c, 0x51, 0x09, 0x73, 0x99, 0xb4, 0xfd, 0xfd, 0xb4, 0x99, 0x72, 0x04, 0x57, 0x5c, 0xfe, 0xfc, 0xb7, 0xb7, 0x01, 0x04, 0x5c, 0x11, 0x0f, 0x8e, 0xb6, 0xf8, 0x01, 0x5e, 0xfe, 0xa2, 0xf8, 0xb1, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x00, 0x00, 0x05, 0xf6, 0x05, 0xc9, 0x00, 0x0a, 0x00, 0x16, 0x00, 0x41, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x01, 0x14, 0x00, 0x21, 0x20, 0x00, 0x35, 0x34, 0x37, 0x26, 0x27, 0x26, 0x10, 0x36, 0x33, 0x32, 0x16, 0x10, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x04, 0x20, 0x24, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x10, 0x36, 0x33, 0x32, 0x16, 0x10, 0x07, 0x06, 0x07, 0x16, 0x05, 0x7c, 0x5e, 0x41, 0x43, 0x5d, 0x5d, 0x85, 0x5d, 0xfc, 0xac, 0x5d, 0x43, 0x41, 0x5e, 0x5e, 0x41, 0x43, 0x5d, 0x03, 0xb9, 0xfe, 0x6d, 0xfe, 0xdc, 0xfe, 0xdf, 0xfe, 0x6d, 0x6e, 0x11, 0x11, 0x52, 0xa5, 0x73, 0x75, 0xa4, 0x51, 0x4e, 0x71, 0x6d, 0x01, 0x2e, 0x01, 0xb0, 0x01, 0x2e, 0x6d, 0x64, 0x49, 0x51, 0xa4, 0x74, 0x75, 0xa4, 0x52, 0x14, 0x17, 0x68, 0x04, 0x91, 0x49, 0x68, 0x68, 0x49, 0x4a, 0x67, 0x67, 0x4a, 0x4a, 0x67, 0x67, 0x4a, 0x49, 0x67, 0x67, 0xfe, 0x0c, 0xf7, 0xfe, 0xa3, 0x01, 0x5d, 0xf7, 0xb4, 0x8d, 0x0f, 0x12, 0x5b, 0x01, 0x02, 0xb6, 0xb6, 0xfe, 0xfe, 0x5b, 0x58, 0x03, 0x72, 0x97, 0xb4, 0xfb, 0xfb, 0xb4, 0x98, 0x71, 0x09, 0x51, 0x5c, 0x01, 0x02, 0xb6, 0xb6, 0xfe, 0xfe, 0x5c, 0x16, 0x11, 0x8b, 0x00, 0x00, 0x02, 0x00, 0x70, 0xff, 0xfd, 0x04, 0x65, 0x05, 0xc6, 0x00, 0x0b, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x37, 0x16, 0x17, 0x16, 0x10, 0x00, 0x23, 0x22, 0x00, 0x10, 0x00, 0x33, 0x32, 0x17, 0x13, 0x17, 0x02, 0x45, 0x80, 0xb5, 0xb5, 0x80, 0x80, 0xb5, 0xb3, 0xab, 0x11, 0x10, 0x89, 0xfe, 0xed, 0xc4, 0xc1, 0xfe, 0xec, 0x01, 0x11, 0xc4, 0x57, 0x4b, 0xf3, 0x8b, 0x03, 0x5f, 0xc8, 0x90, 0x8e, 0xc9, 0xc9, 0x8e, 0x90, 0xc8, 0x3b, 0x10, 0x13, 0x99, 0xfe, 0x50, 0xfe, 0xcf, 0x01, 0x31, 0x01, 0xb0, 0x01, 0x32, 0x1d, 0x01, 0xd3, 0x59, 0x00, 0x00, 0x00, 0x03, 0x00, 0x70, 0x00, 0x01, 0x06, 0xdb, 0x05, 0xc9, 0x00, 0x08, 0x00, 0x11, 0x00, 0x31, 0x00, 0x00, 0x01, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x00, 0x22, 0x06, 0x14, 0x16, 0x33, 0x32, 0x36, 0x34, 0x01, 0x16, 0x15, 0x14, 0x02, 0x23, 0x22, 0x02, 0x35, 0x34, 0x12, 0x33, 0x32, 0x17, 0x16, 0x17, 0x37, 0x26, 0x35, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0xfb, 0x6c, 0x98, 0x98, 0xd8, 0x98, 0x97, 0x03, 0x54, 0xda, 0x97, 0x97, 0x6d, 0x6c, 0x98, 0xfd, 0x11, 0x23, 0xe8, 0xa4, 0xa3, 0xe8, 0xe6, 0xa5, 0xa6, 0x73, 0x02, 0x02, 0xc6, 0x19, 0xe5, 0xa5, 0xa6, 0xe6, 0xe7, 0xa5, 0xa3, 0x74, 0x0a, 0x0a, 0x02, 0xda, 0xa9, 0xf0, 0xa9, 0xa9, 0xf0, 0xa9, 0x02, 0x5a, 0xa9, 0xf0, 0xa9, 0xa9, 0xf0, 0xfd, 0xe4, 0x54, 0x64, 0xb5, 0xfe, 0xff, 0x01, 0x01, 0xb5, 0xb7, 0x01, 0x01, 0x80, 0x03, 0x02, 0x89, 0x49, 0x55, 0xb7, 0x01, 0x01, 0xfe, 0xff, 0xb7, 0xb5, 0xfe, 0xff, 0x81, 0x0b, 0x0c, 0x00, 0x00, 0x0e, 0x00, 0x7e, 0x00, 0x00, 0x08, 0x7a, 0x05, 0xd5, 0x00, 0x23, 0x00, 0x35, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x59, 0x00, 0x65, 0x00, 0x72, 0x00, 0x80, 0x00, 0x8d, 0x00, 0x9a, 0x00, 0xa7, 0x00, 0xb5, 0x00, 0xc5, 0x00, 0xd9, 0x00, 0x00, 0x01, 0x33, 0x04, 0x17, 0x16, 0x15, 0x06, 0x23, 0x22, 0x27, 0x25, 0x26, 0x35, 0x34, 0x37, 0x36, 0x35, 0x34, 0x27, 0x21, 0x06, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x05, 0x06, 0x23, 0x22, 0x27, 0x34, 0x37, 0x36, 0x01, 0x35, 0x33, 0x15, 0x14, 0x17, 0x16, 0x19, 0x01, 0x21, 0x11, 0x10, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x03, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x05, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x27, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x02, 0x16, 0x06, 0x07, 0x06, 0x26, 0x27, 0x26, 0x36, 0x37, 0x36, 0x33, 0x32, 0x01, 0x16, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x36, 0x37, 0x36, 0x16, 0x01, 0x1e, 0x01, 0x0e, 0x01, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x3e, 0x01, 0x04, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x24, 0x36, 0x16, 0x17, 0x16, 0x06, 0x07, 0x06, 0x26, 0x27, 0x26, 0x35, 0x34, 0x25, 0x36, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x26, 0x27, 0x26, 0x36, 0x01, 0x3e, 0x01, 0x17, 0x1e, 0x01, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x04, 0x78, 0x08, 0x02, 0x1f, 0xe7, 0xf4, 0x20, 0x5d, 0x06, 0x06, 0xfe, 0x92, 0x36, 0x0b, 0x3d, 0x1f, 0xfc, 0x0d, 0x1f, 0x3d, 0x0b, 0x37, 0xfe, 0x92, 0x07, 0x05, 0x5c, 0x21, 0xf5, 0xe6, 0x02, 0xf8, 0x81, 0xd9, 0xd0, 0xfa, 0x02, 0xd1, 0xd8, 0x82, 0x9a, 0xd4, 0x95, 0x97, 0xd3, 0xd2, 0x98, 0x96, 0xd3, 0x02, 0x34, 0x76, 0x55, 0x54, 0x76, 0x76, 0x54, 0x55, 0x76, 0x90, 0x1c, 0x16, 0x15, 0x1d, 0x1d, 0x15, 0x16, 0x1c, 0x1c, 0x16, 0x15, 0x1d, 0x1d, 0x15, 0x16, 0x1c, 0xbc, 0x18, 0x06, 0x11, 0x11, 0x29, 0x0d, 0x0c, 0x07, 0x11, 0x0d, 0x10, 0x04, 0x01, 0x72, 0x0d, 0x06, 0x12, 0x0d, 0x10, 0x04, 0x18, 0x0e, 0x0c, 0x07, 0x11, 0x11, 0x29, 0xfe, 0x3e, 0x16, 0x12, 0x0d, 0x26, 0x13, 0x14, 0x10, 0x02, 0x08, 0x25, 0x02, 0x1c, 0x27, 0x0f, 0x02, 0x08, 0x24, 0x14, 0x14, 0x13, 0x06, 0x08, 0xfd, 0xea, 0x27, 0x26, 0x07, 0x06, 0x12, 0x14, 0x15, 0x25, 0x08, 0x02, 0x02, 0x3f, 0x14, 0x24, 0x08, 0x02, 0x0f, 0x14, 0x13, 0x27, 0x06, 0x06, 0x13, 0xfe, 0x46, 0x0d, 0x29, 0x11, 0x11, 0x08, 0x0e, 0x0c, 0x19, 0x04, 0x10, 0x0d, 0x11, 0x05, 0x01, 0x57, 0x0e, 0x18, 0x04, 0x10, 0x0d, 0x12, 0x04, 0x0b, 0x0c, 0x18, 0x05, 0x10, 0x0d, 0x11, 0x04, 0x05, 0xd5, 0x11, 0x9b, 0xa4, 0xaa, 0x99, 0x01, 0x8c, 0x12, 0x2b, 0x13, 0x19, 0x47, 0x20, 0x17, 0x03, 0x03, 0x17, 0x20, 0x47, 0x18, 0x14, 0x2b, 0x12, 0x8c, 0x01, 0x99, 0xaa, 0xa4, 0x99, 0xfe, 0x76, 0x4b, 0x98, 0x4b, 0x39, 0x5f, 0xfe, 0xe2, 0xfe, 0x16, 0x01, 0xea, 0x01, 0x1e, 0x5f, 0x39, 0x4b, 0x98, 0x4b, 0xfd, 0xdd, 0xa7, 0xea, 0xea, 0xa7, 0xa6, 0xec, 0xec, 0xa5, 0x5d, 0x84, 0x84, 0x5d, 0x5f, 0x83, 0x83, 0xde, 0x16, 0x22, 0x22, 0x16, 0x18, 0x22, 0x22, 0xfd, 0x73, 0x18, 0x21, 0x21, 0x18, 0x17, 0x22, 0x22, 0x02, 0x57, 0x26, 0x2e, 0x0d, 0x0f, 0x07, 0x13, 0x14, 0x2d, 0x0f, 0x0a, 0xfd, 0xec, 0x13, 0x2e, 0x0f, 0x0a, 0x04, 0x14, 0x13, 0x2d, 0x0e, 0x0d, 0x06, 0x01, 0x61, 0x08, 0x29, 0x2c, 0x15, 0x06, 0x07, 0x22, 0x0d, 0x09, 0x09, 0x16, 0x15, 0xc3, 0x0e, 0x22, 0x0d, 0x08, 0x09, 0x16, 0x15, 0x08, 0x07, 0x29, 0x17, 0x16, 0x06, 0x0e, 0x14, 0x16, 0x18, 0x29, 0x08, 0x06, 0x15, 0x16, 0x09, 0x08, 0x0d, 0xec, 0x07, 0x15, 0x16, 0x09, 0x08, 0x0d, 0x21, 0x08, 0x07, 0x15, 0x16, 0x16, 0x29, 0xfe, 0x94, 0x12, 0x07, 0x0d, 0x0e, 0x2f, 0x11, 0x14, 0x04, 0x0a, 0x0f, 0x1c, 0x05, 0x11, 0x02, 0x0c, 0x13, 0x04, 0x0a, 0x0f, 0x1b, 0x04, 0x12, 0x10, 0x13, 0x04, 0x0c, 0x0d, 0x1c, 0x05, 0x11, 0x00, 0x10, 0x00, 0x82, 0x00, 0x00, 0x08, 0x7f, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x2d, 0x00, 0x35, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x59, 0x00, 0x64, 0x00, 0x70, 0x00, 0x7c, 0x00, 0x88, 0x00, 0x94, 0x00, 0xa6, 0x00, 0xca, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x35, 0x23, 0x15, 0x06, 0x07, 0x06, 0x15, 0x11, 0x21, 0x11, 0x34, 0x27, 0x26, 0x27, 0x35, 0x23, 0x15, 0x07, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x16, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x02, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x02, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x34, 0x03, 0x0e, 0x01, 0x17, 0x1e, 0x01, 0x37, 0x3e, 0x01, 0x27, 0x2e, 0x01, 0x01, 0x0e, 0x01, 0x17, 0x1e, 0x01, 0x37, 0x3e, 0x01, 0x27, 0x2e, 0x01, 0x01, 0x06, 0x16, 0x17, 0x16, 0x36, 0x37, 0x36, 0x26, 0x27, 0x26, 0x06, 0x05, 0x06, 0x16, 0x17, 0x16, 0x3e, 0x01, 0x26, 0x27, 0x26, 0x06, 0x05, 0x1e, 0x01, 0x37, 0x3e, 0x01, 0x27, 0x2e, 0x01, 0x07, 0x0e, 0x01, 0x25, 0x1e, 0x01, 0x37, 0x3e, 0x01, 0x27, 0x2e, 0x01, 0x07, 0x0e, 0x01, 0x01, 0x16, 0x36, 0x37, 0x36, 0x26, 0x27, 0x26, 0x06, 0x07, 0x06, 0x16, 0x01, 0x16, 0x36, 0x37, 0x36, 0x26, 0x27, 0x26, 0x06, 0x07, 0x06, 0x16, 0x13, 0x35, 0x33, 0x15, 0x14, 0x17, 0x16, 0x19, 0x01, 0x21, 0x11, 0x10, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x25, 0x06, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x05, 0x23, 0x22, 0x27, 0x36, 0x37, 0x36, 0x25, 0x16, 0x32, 0x37, 0x04, 0x17, 0x16, 0x17, 0x06, 0x2b, 0x01, 0x25, 0x26, 0x35, 0x34, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x16, 0x15, 0x14, 0x07, 0x06, 0x15, 0x14, 0x17, 0x05, 0x16, 0x33, 0x32, 0x37, 0x26, 0x27, 0x24, 0x25, 0x27, 0x15, 0x23, 0x04, 0x05, 0x06, 0x07, 0x16, 0x33, 0x32, 0x37, 0x25, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x03, 0x88, 0x2c, 0x0e, 0xb7, 0xaf, 0x05, 0x0d, 0xb0, 0xb6, 0x07, 0x33, 0xeb, 0x95, 0xce, 0xcf, 0x94, 0x93, 0xd0, 0xcf, 0xe6, 0xa5, 0x74, 0x74, 0xa5, 0x74, 0xa9, 0x29, 0x1d, 0x1d, 0x29, 0x1d, 0x1d, 0x29, 0x1d, 0x1d, 0x29, 0x1d, 0xf3, 0x10, 0x07, 0x0b, 0x0e, 0x28, 0x11, 0x11, 0x05, 0x0c, 0x0b, 0x29, 0x01, 0x37, 0x11, 0x07, 0x0c, 0x0d, 0x28, 0x11, 0x11, 0x06, 0x0c, 0x0c, 0x28, 0xfe, 0x2f, 0x06, 0x14, 0x13, 0x14, 0x24, 0x07, 0x06, 0x12, 0x15, 0x14, 0x24, 0x02, 0x0c, 0x06, 0x12, 0x14, 0x13, 0x25, 0x0c, 0x12, 0x14, 0x12, 0x25, 0xfd, 0xe6, 0x07, 0x24, 0x15, 0x14, 0x12, 0x06, 0x07, 0x24, 0x14, 0x13, 0x14, 0x02, 0x19, 0x06, 0x26, 0x12, 0x14, 0x12, 0x06, 0x06, 0x25, 0x13, 0x14, 0x12, 0xfe, 0x6b, 0x11, 0x29, 0x0b, 0x0e, 0x07, 0x11, 0x11, 0x28, 0x0e, 0x0b, 0x07, 0x01, 0x58, 0x11, 0x28, 0x0c, 0x0c, 0x06, 0x11, 0x11, 0x28, 0x0d, 0x0c, 0x07, 0x4d, 0x79, 0xca, 0xc2, 0xfa, 0x68, 0xc3, 0xca, 0x79, 0xfe, 0xcb, 0x17, 0x43, 0x1a, 0x35, 0xfe, 0xaf, 0x09, 0x6d, 0x3b, 0x0c, 0xdf, 0xe0, 0x02, 0x09, 0x15, 0x2b, 0x16, 0x02, 0x08, 0xe0, 0xdf, 0x0b, 0x3a, 0x6c, 0x09, 0xfe, 0xae, 0x35, 0x1a, 0x43, 0x17, 0x17, 0x23, 0x30, 0x1c, 0x1c, 0x01, 0x25, 0x0d, 0x0e, 0x42, 0x38, 0x09, 0xd4, 0xfe, 0xe6, 0xfe, 0x54, 0x2b, 0x31, 0xfe, 0x53, 0xfe, 0xe6, 0xd4, 0x08, 0x37, 0x43, 0x0d, 0x0e, 0x01, 0x25, 0x1c, 0x1c, 0x30, 0x22, 0x03, 0xc2, 0x40, 0x8e, 0x40, 0x31, 0x41, 0xf1, 0xfe, 0x65, 0x01, 0x9b, 0xf1, 0x41, 0x31, 0x40, 0x8e, 0x40, 0x48, 0xe7, 0xa3, 0xa4, 0xe6, 0xe6, 0xa4, 0xa3, 0xe7, 0xad, 0x81, 0xb8, 0x80, 0x80, 0xb8, 0x01, 0x14, 0x20, 0x2e, 0x20, 0x20, 0x2e, 0xfd, 0xb5, 0x20, 0x2e, 0x20, 0x20, 0x2e, 0x02, 0x45, 0x0d, 0x2d, 0x13, 0x12, 0x08, 0x0d, 0x0f, 0x2d, 0x13, 0x11, 0x07, 0xfd, 0xff, 0x0e, 0x2d, 0x13, 0x13, 0x07, 0x0f, 0x0d, 0x2c, 0x13, 0x13, 0x07, 0x01, 0x31, 0x16, 0x29, 0x07, 0x07, 0x14, 0x17, 0x16, 0x29, 0x07, 0x07, 0x16, 0xd5, 0x15, 0x29, 0x07, 0x07, 0x15, 0x2c, 0x28, 0x08, 0x07, 0x14, 0x39, 0x17, 0x14, 0x07, 0x07, 0x29, 0x15, 0x16, 0x16, 0x07, 0x08, 0x28, 0xa9, 0x15, 0x16, 0x07, 0x07, 0x29, 0x16, 0x15, 0x16, 0x07, 0x07, 0x29, 0xfe, 0x75, 0x0f, 0x07, 0x13, 0x13, 0x2d, 0x0d, 0x0e, 0x07, 0x13, 0x13, 0x2c, 0x01, 0xe6, 0x0d, 0x08, 0x12, 0x13, 0x2d, 0x0d, 0x0f, 0x08, 0x12, 0x13, 0x2d, 0x01, 0x20, 0x47, 0x9c, 0x37, 0x37, 0x57, 0xfe, 0xf5, 0xfe, 0x36, 0x01, 0xca, 0x01, 0x0b, 0x57, 0x37, 0x37, 0x9c, 0x47, 0xe5, 0x06, 0x12, 0x20, 0x44, 0x26, 0x1a, 0x26, 0x0b, 0xa5, 0xcb, 0xc7, 0x65, 0x8b, 0x11, 0x01, 0x01, 0x11, 0x8b, 0x65, 0xc7, 0xcb, 0xa5, 0x0b, 0x26, 0x1a, 0x26, 0x44, 0x20, 0x12, 0x06, 0x1c, 0x12, 0x22, 0x28, 0x3d, 0x16, 0x15, 0x14, 0x13, 0x88, 0x06, 0x97, 0x9d, 0x70, 0x81, 0x19, 0x01, 0x01, 0x19, 0x81, 0x70, 0x9d, 0x97, 0x06, 0x88, 0x13, 0x14, 0x15, 0x16, 0x3d, 0x28, 0x22, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa5, 0x00, 0x00, 0x05, 0xd0, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x17, 0x11, 0x07, 0x21, 0x27, 0x11, 0x17, 0x11, 0x21, 0x11, 0xab, 0x05, 0x1e, 0x07, 0x07, 0xfa, 0xe2, 0x05, 0x63, 0x04, 0x63, 0x05, 0xd5, 0x07, 0xfa, 0x38, 0x06, 0x06, 0x05, 0xc8, 0x68, 0xfb, 0x08, 0x04, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa4, 0x00, 0x00, 0x05, 0xd1, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x00, 0x13, 0x21, 0x17, 0x11, 0x07, 0x21, 0x27, 0x11, 0x17, 0x11, 0x21, 0x11, 0x07, 0x15, 0x06, 0x07, 0x00, 0x03, 0x06, 0x23, 0x06, 0x23, 0x02, 0x2b, 0x01, 0x35, 0x37, 0x32, 0x17, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0xaa, 0x05, 0x21, 0x06, 0x06, 0xfa, 0xdf, 0x05, 0x64, 0x04, 0x63, 0x7a, 0x44, 0x25, 0xfe, 0xda, 0x38, 0x05, 0x0f, 0x69, 0x0c, 0x5b, 0xb8, 0x15, 0x92, 0x88, 0x41, 0x06, 0x2e, 0x38, 0x59, 0x8b, 0x57, 0x05, 0xd5, 0x06, 0xfa, 0x38, 0x07, 0x07, 0x05, 0xc8, 0x68, 0xfb, 0x08, 0x04, 0xf8, 0x9e, 0x06, 0x41, 0x3a, 0xfe, 0x46, 0xfe, 0xbd, 0x3b, 0x2f, 0x01, 0x02, 0x07, 0x49, 0x83, 0xa6, 0x74, 0xb3, 0xbb, 0x78, 0x00, 0x03, 0x00, 0xa4, 0x00, 0x00, 0x05, 0xd1, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x1a, 0x00, 0x00, 0x13, 0x21, 0x17, 0x11, 0x07, 0x21, 0x27, 0x11, 0x17, 0x11, 0x21, 0x11, 0x05, 0x09, 0x01, 0x17, 0x09, 0x01, 0x15, 0x07, 0x01, 0x23, 0x01, 0x23, 0x27, 0x09, 0x01, 0xaa, 0x05, 0x21, 0x06, 0x06, 0xfa, 0xdf, 0x05, 0x64, 0x04, 0x63, 0xfc, 0x5e, 0x01, 0x72, 0x01, 0x6e, 0x56, 0xfe, 0x91, 0x01, 0x6f, 0x52, 0xfe, 0x8e, 0x04, 0xfe, 0x92, 0x04, 0x51, 0x01, 0x6e, 0xfe, 0x92, 0x05, 0xd5, 0x06, 0xfa, 0x38, 0x07, 0x07, 0x05, 0xc8, 0x68, 0xfb, 0x08, 0x04, 0xf8, 0x86, 0xfe, 0x69, 0x01, 0x97, 0x5b, 0xfe, 0x65, 0xfe, 0x66, 0x03, 0x5b, 0x01, 0x97, 0xfe, 0x6c, 0x5b, 0x01, 0x9a, 0x01, 0x9b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8a, 0x00, 0xa0, 0x03, 0x4a, 0x05, 0x40, 0x00, 0x14, 0x00, 0x00, 0x13, 0x33, 0x01, 0x36, 0x13, 0x32, 0x37, 0x33, 0x17, 0x09, 0x01, 0x15, 0x07, 0x01, 0x23, 0x01, 0x23, 0x27, 0x01, 0x00, 0x35, 0xd9, 0x04, 0x01, 0x0c, 0x0a, 0xfd, 0x04, 0x05, 0x04, 0x4d, 0xfe, 0xf0, 0x01, 0x10, 0x4f, 0xfe, 0xf2, 0x02, 0xfe, 0xf1, 0x03, 0x4e, 0x01, 0x12, 0xfe, 0xee, 0x05, 0x40, 0xfe, 0x0b, 0x08, 0x01, 0xde, 0x0f, 0x55, 0xfe, 0x04, 0xfe, 0x07, 0x03, 0x53, 0x01, 0xf7, 0xfe, 0x0b, 0x56, 0x01, 0xf9, 0x01, 0xf5, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x5a, 0x00, 0x00, 0x06, 0x43, 0x07, 0x76, 0x00, 0x08, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x2c, 0x00, 0x35, 0x00, 0x3e, 0x00, 0x7e, 0x00, 0x00, 0x01, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x01, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x25, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x17, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x01, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x05, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x17, 0x33, 0x06, 0x2b, 0x01, 0x26, 0x3d, 0x01, 0x34, 0x25, 0x33, 0x17, 0x15, 0x33, 0x20, 0x13, 0x16, 0x1d, 0x01, 0x23, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x15, 0x14, 0x07, 0x27, 0x26, 0x23, 0x11, 0x14, 0x0f, 0x01, 0x22, 0x2f, 0x01, 0x35, 0x37, 0x33, 0x17, 0x15, 0x16, 0x3b, 0x01, 0x32, 0x3f, 0x01, 0x11, 0x22, 0x07, 0x06, 0x23, 0x27, 0x35, 0x37, 0x23, 0x26, 0x27, 0x23, 0x22, 0x0f, 0x01, 0x23, 0x35, 0x36, 0x37, 0x36, 0x21, 0x35, 0x01, 0xa7, 0x03, 0x1b, 0x53, 0x06, 0x34, 0x02, 0x1a, 0x02, 0x1a, 0x53, 0x06, 0x33, 0x01, 0xe8, 0x02, 0x1b, 0x53, 0x05, 0x34, 0xde, 0x04, 0x1b, 0x53, 0x05, 0x35, 0x01, 0xe8, 0x03, 0x1a, 0x54, 0x05, 0x35, 0x01, 0x09, 0x02, 0x19, 0x54, 0x06, 0x34, 0x52, 0x03, 0x1b, 0x53, 0x05, 0x34, 0xfd, 0xe6, 0x34, 0x06, 0x02, 0x01, 0x8c, 0xfc, 0x26, 0x01, 0x14, 0x11, 0x20, 0x33, 0x28, 0x87, 0x64, 0x08, 0x1d, 0x88, 0x7b, 0x5f, 0x1b, 0x52, 0x21, 0x02, 0x05, 0x27, 0x05, 0x09, 0x38, 0x09, 0x32, 0x12, 0x05, 0xbe, 0x4d, 0x10, 0x0c, 0x06, 0x06, 0x04, 0x3c, 0xb1, 0x3d, 0x59, 0x1e, 0x12, 0x03, 0x34, 0xad, 0xd7, 0x01, 0x19, 0x06, 0x01, 0xcf, 0x0a, 0x23, 0x02, 0x38, 0x01, 0x64, 0xcf, 0x08, 0x23, 0x03, 0x37, 0xe3, 0xcf, 0x08, 0x24, 0x03, 0x36, 0xb9, 0xcf, 0x08, 0x24, 0x02, 0x38, 0x01, 0x3b, 0xce, 0x07, 0x24, 0x03, 0x37, 0x69, 0xcf, 0x07, 0x24, 0x03, 0x37, 0xeb, 0xcf, 0x09, 0x23, 0x02, 0x39, 0x9a, 0x05, 0x70, 0xfe, 0x50, 0x4c, 0x0c, 0x07, 0x0d, 0x29, 0x16, 0x5a, 0x2e, 0x0d, 0x02, 0x3b, 0x36, 0xfd, 0x9f, 0x5a, 0x15, 0x02, 0x56, 0x18, 0x17, 0x06, 0x06, 0x0a, 0x5a, 0x33, 0x25, 0x02, 0x59, 0x36, 0x33, 0x05, 0x0b, 0x2e, 0x38, 0x19, 0x37, 0x10, 0x02, 0x80, 0xc2, 0xc6, 0x70, 0x00, 0x09, 0x00, 0x88, 0x00, 0x00, 0x05, 0xeb, 0x05, 0xd9, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x1c, 0x00, 0x33, 0x00, 0x44, 0x00, 0x4d, 0x00, 0x79, 0x00, 0x7f, 0x00, 0x8f, 0x00, 0x00, 0x01, 0x14, 0x15, 0x14, 0x17, 0x21, 0x36, 0x37, 0x34, 0x23, 0x21, 0x06, 0x13, 0x16, 0x17, 0x21, 0x36, 0x3f, 0x01, 0x06, 0x07, 0x36, 0x37, 0x36, 0x35, 0x34, 0x35, 0x26, 0x23, 0x27, 0x06, 0x07, 0x33, 0x32, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x23, 0x01, 0x33, 0x14, 0x06, 0x07, 0x14, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x27, 0x34, 0x35, 0x34, 0x36, 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x21, 0x16, 0x05, 0x36, 0x37, 0x32, 0x17, 0x15, 0x14, 0x05, 0x07, 0x17, 0x14, 0x07, 0x21, 0x26, 0x3d, 0x01, 0x37, 0x35, 0x24, 0x2f, 0x01, 0x35, 0x36, 0x33, 0x16, 0x17, 0x26, 0x11, 0x34, 0x33, 0x21, 0x16, 0x15, 0x33, 0x32, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x27, 0x01, 0x16, 0x17, 0x21, 0x36, 0x37, 0x01, 0x06, 0x07, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x35, 0x33, 0x1e, 0x01, 0x15, 0x01, 0x06, 0x0d, 0x04, 0x0e, 0x0a, 0x03, 0x1b, 0xfc, 0x10, 0x19, 0x38, 0x05, 0x0e, 0x03, 0x8f, 0x0c, 0x08, 0x41, 0x08, 0x34, 0x4e, 0x2c, 0x1a, 0x01, 0x1d, 0x33, 0x02, 0x01, 0x31, 0x35, 0x3e, 0x28, 0x49, 0x1d, 0x2d, 0x07, 0x34, 0x22, 0x11, 0x61, 0x31, 0x1a, 0x16, 0x6c, 0xfd, 0x78, 0x08, 0x58, 0x01, 0x7a, 0x04, 0x08, 0x11, 0x62, 0x1e, 0x08, 0x63, 0xfe, 0xf9, 0xa5, 0xaa, 0x9d, 0x9f, 0x1f, 0x53, 0xfc, 0x9e, 0x21, 0x02, 0xf2, 0xe4, 0x5c, 0x10, 0x06, 0xfe, 0xbc, 0x71, 0x02, 0x0f, 0xfe, 0x26, 0x0f, 0x03, 0xfe, 0x8e, 0x2c, 0x03, 0x03, 0x11, 0x4c, 0xc1, 0xb5, 0x30, 0x03, 0xf7, 0x1d, 0x31, 0x81, 0x4e, 0x1f, 0x65, 0x30, 0x3c, 0x06, 0x10, 0xfc, 0x8d, 0x06, 0x09, 0x03, 0xd6, 0x0a, 0x03, 0xfe, 0xbc, 0x05, 0x11, 0x39, 0x0a, 0x05, 0x02, 0x48, 0x33, 0x05, 0x09, 0x39, 0x02, 0xb4, 0x06, 0x07, 0x37, 0x48, 0x34, 0x58, 0x16, 0x04, 0xfe, 0xcd, 0x1a, 0x12, 0x16, 0x16, 0xc7, 0x6d, 0x86, 0x01, 0x4d, 0x37, 0x52, 0x06, 0x05, 0x11, 0x56, 0x1c, 0x20, 0x2f, 0x82, 0x4d, 0x28, 0x01, 0x3d, 0x48, 0x3a, 0x0d, 0x1f, 0x2c, 0x71, 0x4c, 0x55, 0x44, 0x03, 0x29, 0x38, 0x88, 0x57, 0x71, 0x6b, 0xb1, 0x92, 0x65, 0x2d, 0x50, 0x05, 0x06, 0x65, 0x78, 0xfa, 0xf3, 0x0d, 0x0b, 0x10, 0x97, 0x4e, 0x57, 0x18, 0x0a, 0x0a, 0x0a, 0x10, 0x3d, 0x24, 0x0a, 0x0f, 0x08, 0x07, 0x10, 0x06, 0x02, 0x02, 0x55, 0x12, 0x0d, 0x04, 0x0b, 0x09, 0x14, 0xfe, 0x01, 0x2f, 0x30, 0x02, 0x18, 0x63, 0x9b, 0x99, 0x29, 0x16, 0x48, 0x04, 0x01, 0x3f, 0x1a, 0x12, 0x13, 0x19, 0x01, 0xf5, 0x32, 0x1c, 0x40, 0x5b, 0x6e, 0x44, 0x46, 0x38, 0x54, 0x24, 0x2e, 0x4a, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9a, 0x00, 0x01, 0x05, 0xdb, 0x05, 0xd9, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x00, 0x09, 0x01, 0x13, 0x07, 0x21, 0x27, 0x13, 0x09, 0x01, 0x03, 0x21, 0x03, 0x01, 0x03, 0x41, 0x02, 0x4e, 0x4b, 0x02, 0xfa, 0xc8, 0x05, 0x4f, 0x02, 0x55, 0xfe, 0x05, 0x44, 0x04, 0x75, 0x40, 0xfe, 0x07, 0x05, 0xd9, 0xfe, 0x77, 0xfb, 0xb4, 0x03, 0x06, 0x04, 0x4c, 0x01, 0x86, 0xfe, 0x35, 0xfc, 0x5f, 0x03, 0xa1, 0x01, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9a, 0x00, 0x00, 0x05, 0xdb, 0x05, 0xd0, 0x00, 0x09, 0x00, 0x00, 0x09, 0x01, 0x13, 0x17, 0x07, 0x21, 0x27, 0x13, 0x00, 0x37, 0x03, 0x3f, 0x02, 0x4b, 0x4e, 0x02, 0x02, 0xfa, 0xc8, 0x05, 0x51, 0x02, 0x3e, 0x12, 0x05, 0xd0, 0xfe, 0x77, 0xfb, 0xbf, 0x03, 0x03, 0x06, 0x04, 0x44, 0x01, 0x80, 0x06, 0x00, 0x01, 0x00, 0x8f, 0x00, 0x00, 0x05, 0xe6, 0x05, 0xd4, 0x00, 0x53, 0x00, 0x00, 0x01, 0x03, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x32, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x03, 0x25, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x03, 0x16, 0x15, 0x10, 0x07, 0x23, 0x36, 0x11, 0x34, 0x27, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x03, 0x1f, 0xc2, 0x43, 0x4f, 0x22, 0x22, 0x4f, 0x3b, 0x27, 0x3c, 0x34, 0x53, 0x32, 0x0c, 0x52, 0xb3, 0x01, 0x24, 0x46, 0x40, 0x34, 0x2f, 0x20, 0x1f, 0x3f, 0x06, 0x10, 0x61, 0x21, 0x0b, 0x0a, 0x1e, 0x33, 0x39, 0x1e, 0x20, 0x5f, 0x44, 0xbb, 0x08, 0x64, 0x56, 0x84, 0x07, 0xb9, 0x46, 0x5e, 0x20, 0x1e, 0x39, 0x32, 0x1f, 0x0b, 0x09, 0x21, 0x61, 0x11, 0x06, 0x3f, 0x20, 0x1f, 0x30, 0x32, 0x41, 0x46, 0x03, 0x08, 0x01, 0x34, 0x68, 0x6f, 0x6b, 0x40, 0x16, 0x52, 0x52, 0x72, 0x2a, 0x25, 0x7f, 0x74, 0xfe, 0xeb, 0x65, 0x1c, 0x11, 0x0c, 0x1b, 0x42, 0x42, 0x15, 0x15, 0x39, 0x27, 0x1d, 0x11, 0x37, 0x2a, 0x1f, 0x24, 0x25, 0x1b, 0x29, 0x0c, 0x22, 0x66, 0x01, 0x16, 0x58, 0x53, 0xfe, 0xdd, 0xe7, 0xf2, 0x01, 0x35, 0x45, 0x49, 0xfe, 0xea, 0x66, 0x22, 0x0c, 0x29, 0x1b, 0x25, 0x23, 0x1e, 0x2c, 0x37, 0x11, 0x1d, 0x27, 0x39, 0x15, 0x14, 0x43, 0x42, 0x1b, 0x0c, 0x11, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x99, 0x01, 0x1e, 0x05, 0xdb, 0x04, 0x98, 0x00, 0x3e, 0x00, 0x45, 0x00, 0x00, 0x01, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x16, 0x13, 0x33, 0x17, 0x07, 0x23, 0x06, 0x07, 0x22, 0x27, 0x34, 0x33, 0x16, 0x33, 0x32, 0x33, 0x32, 0x37, 0x26, 0x27, 0x23, 0x22, 0x07, 0x16, 0x15, 0x06, 0x05, 0x24, 0x03, 0x34, 0x37, 0x16, 0x17, 0x15, 0x07, 0x14, 0x17, 0x32, 0x37, 0x12, 0x25, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x36, 0x37, 0x32, 0x35, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x03, 0x06, 0x15, 0x14, 0x17, 0x35, 0x26, 0x05, 0x16, 0x64, 0x12, 0x42, 0x9f, 0x12, 0xe7, 0x31, 0x18, 0x11, 0x29, 0x03, 0x0f, 0x89, 0x58, 0x16, 0x12, 0x0e, 0x33, 0x02, 0x01, 0x45, 0x0c, 0xec, 0x06, 0x03, 0x76, 0x3d, 0x79, 0x08, 0xfe, 0xd3, 0xfd, 0xd7, 0x28, 0x3b, 0x2e, 0x07, 0x0b, 0x65, 0x50, 0x0c, 0x30, 0x01, 0x0c, 0xb0, 0x25, 0x53, 0x5a, 0x37, 0x41, 0x46, 0x34, 0x22, 0x79, 0x01, 0xce, 0x1d, 0x04, 0x98, 0x05, 0x73, 0x57, 0x19, 0x24, 0x2c, 0x1b, 0xfe, 0xf0, 0x4a, 0x0d, 0xae, 0x09, 0x5d, 0x54, 0x2d, 0x4d, 0x4d, 0xf1, 0x6d, 0x40, 0x65, 0xf6, 0x10, 0x03, 0x01, 0x64, 0x3a, 0x09, 0x03, 0x2c, 0x17, 0x27, 0x5a, 0x0c, 0x4d, 0x01, 0xde, 0x14, 0x06, 0xa0, 0x08, 0x27, 0x63, 0x4d, 0x14, 0x26, 0x54, 0x29, 0x24, 0x24, 0x0d, 0x3c, 0xfe, 0xa5, 0x08, 0x09, 0x84, 0x49, 0x03, 0xb5, 0x00, 0x01, 0x00, 0x9a, 0x00, 0xe7, 0x05, 0xdb, 0x04, 0x8d, 0x00, 0x32, 0x00, 0x00, 0x25, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x33, 0x37, 0x23, 0x26, 0x27, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x3b, 0x01, 0x37, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x21, 0x37, 0x21, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x21, 0x36, 0x37, 0x36, 0x33, 0x21, 0x32, 0x16, 0x15, 0x05, 0x97, 0xfd, 0x95, 0x27, 0x37, 0x19, 0x17, 0x10, 0x11, 0x31, 0x03, 0x7a, 0x2a, 0x17, 0x1c, 0x1a, 0x2d, 0x18, 0xa2, 0x01, 0xe8, 0x3d, 0x38, 0x1b, 0x16, 0x12, 0x14, 0x01, 0x30, 0x02, 0xfd, 0x4f, 0x26, 0x38, 0x1a, 0x2d, 0x17, 0x02, 0xdb, 0x07, 0x0f, 0x1c, 0x26, 0x01, 0x51, 0x26, 0x37, 0xe7, 0x3e, 0x2b, 0x1b, 0x32, 0x0d, 0x0a, 0x03, 0x0c, 0x02, 0x1a, 0x1e, 0x2c, 0x1b, 0x32, 0x1c, 0x0a, 0x3d, 0x2c, 0x1a, 0x32, 0x0e, 0x0b, 0x02, 0x0a, 0x3d, 0x2c, 0x1b, 0x33, 0x1a, 0x16, 0x11, 0x1f, 0x3e, 0x2c, 0x00, 0x01, 0x00, 0x9a, 0x00, 0xe7, 0x05, 0xdb, 0x04, 0x8d, 0x00, 0x32, 0x00, 0x00, 0x13, 0x34, 0x36, 0x33, 0x21, 0x32, 0x17, 0x16, 0x17, 0x21, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x17, 0x21, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x15, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x23, 0x17, 0x33, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x21, 0x9b, 0x38, 0x25, 0x01, 0x51, 0x27, 0x1b, 0x0f, 0x07, 0x02, 0xdb, 0x17, 0x2d, 0x1a, 0x37, 0x27, 0xfd, 0x50, 0x01, 0x01, 0x31, 0x13, 0x12, 0x17, 0x19, 0x37, 0x3d, 0xe7, 0xa2, 0x18, 0x2d, 0x19, 0x1b, 0x16, 0x2c, 0x79, 0x04, 0x30, 0x11, 0x10, 0x16, 0x1a, 0x37, 0x26, 0xfd, 0x94, 0x04, 0x23, 0x2c, 0x3e, 0x1f, 0x11, 0x16, 0x1a, 0x33, 0x1b, 0x2c, 0x3d, 0x0a, 0x02, 0x0b, 0x0e, 0x32, 0x1a, 0x2c, 0x3d, 0x0a, 0x1c, 0x32, 0x1b, 0x2c, 0x1e, 0x1a, 0x02, 0x0c, 0x03, 0x0a, 0x0d, 0x32, 0x1b, 0x2b, 0x3e, 0x00, 0x00, 0x02, 0x00, 0xa0, 0x00, 0xd4, 0x05, 0xd6, 0x04, 0x8d, 0x00, 0x22, 0x00, 0x44, 0x00, 0x00, 0x25, 0x13, 0x34, 0x26, 0x23, 0x21, 0x22, 0x07, 0x21, 0x30, 0x23, 0x22, 0x14, 0x33, 0x21, 0x07, 0x21, 0x22, 0x15, 0x14, 0x33, 0x21, 0x07, 0x23, 0x22, 0x15, 0x14, 0x3b, 0x01, 0x07, 0x23, 0x22, 0x15, 0x14, 0x33, 0x07, 0x26, 0x27, 0x36, 0x37, 0x33, 0x37, 0x23, 0x26, 0x27, 0x36, 0x37, 0x33, 0x37, 0x21, 0x22, 0x27, 0x36, 0x37, 0x21, 0x37, 0x21, 0x26, 0x27, 0x36, 0x33, 0x21, 0x36, 0x37, 0x21, 0x32, 0x16, 0x15, 0x03, 0x05, 0x6e, 0x41, 0x2b, 0x1e, 0xfe, 0xc3, 0x31, 0x15, 0xfd, 0x2a, 0x03, 0x48, 0x4b, 0x02, 0xb2, 0x0b, 0xfe, 0xc1, 0x4b, 0x4b, 0x01, 0x1b, 0x08, 0xc7, 0x4b, 0x4b, 0x9c, 0x11, 0x38, 0x4a, 0x4a, 0x19, 0x53, 0x01, 0x01, 0x53, 0x43, 0x03, 0x99, 0x54, 0x01, 0x01, 0x54, 0xcd, 0x01, 0xfe, 0xe6, 0x54, 0x01, 0x01, 0x54, 0x01, 0x44, 0x04, 0xfd, 0x50, 0x53, 0x01, 0x01, 0x53, 0x02, 0xdb, 0x1d, 0x3b, 0x01, 0x51, 0x25, 0x38, 0x43, 0xf1, 0x03, 0x15, 0x25, 0x33, 0x39, 0x92, 0x4c, 0x4b, 0x49, 0x4f, 0x4b, 0x48, 0x4c, 0x4b, 0x49, 0x1d, 0x01, 0x68, 0x67, 0x01, 0x0e, 0x01, 0x68, 0x67, 0x01, 0x13, 0x68, 0x67, 0x01, 0x0f, 0x01, 0x68, 0x67, 0x45, 0x02, 0x3f, 0x2d, 0xfc, 0xb3, 0x00, 0x00, 0x02, 0x00, 0x84, 0x00, 0x00, 0x03, 0xde, 0x05, 0xca, 0x00, 0x21, 0x00, 0x44, 0x00, 0x00, 0x37, 0x05, 0x32, 0x36, 0x35, 0x11, 0x34, 0x27, 0x11, 0x36, 0x23, 0x22, 0x15, 0x11, 0x27, 0x11, 0x34, 0x23, 0x22, 0x15, 0x11, 0x27, 0x35, 0x34, 0x23, 0x22, 0x1d, 0x01, 0x27, 0x35, 0x34, 0x23, 0x22, 0x15, 0x27, 0x36, 0x37, 0x16, 0x17, 0x15, 0x17, 0x35, 0x36, 0x37, 0x16, 0x17, 0x15, 0x17, 0x11, 0x34, 0x37, 0x16, 0x17, 0x11, 0x17, 0x11, 0x36, 0x37, 0x16, 0x15, 0x11, 0x16, 0x17, 0x11, 0x14, 0x06, 0x23, 0x25, 0x13, 0x9f, 0x02, 0xc6, 0x21, 0x2f, 0x35, 0x02, 0x42, 0x42, 0x44, 0x45, 0x41, 0x47, 0x43, 0x41, 0x45, 0x43, 0x42, 0x1a, 0x01, 0x5e, 0x5c, 0x01, 0x0d, 0x01, 0x5d, 0x5d, 0x01, 0x10, 0x5f, 0x5c, 0x01, 0x0e, 0x01, 0x5d, 0x5d, 0x3d, 0x02, 0x38, 0x28, 0xfd, 0x06, 0x01, 0x73, 0x4a, 0x31, 0x20, 0x01, 0x62, 0x36, 0x16, 0x03, 0x27, 0x53, 0x53, 0xfd, 0x02, 0x0d, 0x01, 0x63, 0x52, 0x52, 0xfe, 0xc4, 0x09, 0xdf, 0x53, 0x53, 0xae, 0x12, 0x3f, 0x53, 0x53, 0x1c, 0x5c, 0x01, 0x01, 0x5c, 0x4b, 0x04, 0xac, 0x5c, 0x01, 0x01, 0x5c, 0xe4, 0x03, 0x01, 0x3b, 0x5c, 0x01, 0x01, 0x5c, 0xfe, 0x96, 0x04, 0x02, 0xfd, 0x5d, 0x01, 0x01, 0x5d, 0xfc, 0xd4, 0x21, 0x41, 0xfe, 0x8a, 0x2a, 0x3e, 0x4b, 0x02, 0x9b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9f, 0x00, 0xd3, 0x05, 0xd6, 0x04, 0x8d, 0x00, 0x21, 0x00, 0x43, 0x00, 0x00, 0x25, 0x32, 0x35, 0x34, 0x2b, 0x01, 0x27, 0x33, 0x32, 0x35, 0x34, 0x2b, 0x01, 0x27, 0x21, 0x32, 0x35, 0x34, 0x23, 0x21, 0x27, 0x21, 0x32, 0x34, 0x2b, 0x01, 0x21, 0x26, 0x23, 0x21, 0x22, 0x06, 0x15, 0x13, 0x07, 0x03, 0x34, 0x36, 0x33, 0x21, 0x16, 0x17, 0x21, 0x32, 0x17, 0x06, 0x07, 0x21, 0x17, 0x21, 0x16, 0x17, 0x06, 0x23, 0x21, 0x17, 0x33, 0x16, 0x17, 0x06, 0x07, 0x23, 0x17, 0x33, 0x16, 0x17, 0x06, 0x07, 0x03, 0x61, 0x4b, 0x4b, 0x39, 0x10, 0x9d, 0x4a, 0x4a, 0xc9, 0x08, 0x01, 0x1c, 0x4a, 0x4a, 0xfe, 0xc1, 0x0c, 0x02, 0xb1, 0x4b, 0x47, 0x04, 0xfd, 0x2a, 0x14, 0x30, 0xfe, 0xc1, 0x1d, 0x2c, 0x43, 0x24, 0x44, 0x38, 0x26, 0x01, 0x51, 0x3a, 0x1e, 0x02, 0xda, 0x54, 0x01, 0x01, 0x54, 0xfd, 0x50, 0x04, 0x01, 0x45, 0x53, 0x01, 0x01, 0x53, 0xfe, 0xe5, 0x03, 0xcd, 0x53, 0x01, 0x01, 0x53, 0x9b, 0x04, 0x43, 0x53, 0x01, 0x01, 0x53, 0xf1, 0x49, 0x4b, 0x4c, 0x48, 0x4b, 0x4f, 0x49, 0x4b, 0x4c, 0x92, 0x39, 0x33, 0x25, 0xfc, 0xeb, 0x1e, 0x03, 0x4e, 0x2d, 0x3f, 0x02, 0x45, 0x67, 0x68, 0x01, 0x0f, 0x01, 0x67, 0x68, 0x13, 0x01, 0x67, 0x68, 0x01, 0x0e, 0x01, 0x67, 0x69, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x84, 0xff, 0xf9, 0x03, 0xde, 0x05, 0xc2, 0x00, 0x21, 0x00, 0x43, 0x00, 0x00, 0x13, 0x14, 0x33, 0x32, 0x3d, 0x01, 0x37, 0x15, 0x14, 0x33, 0x32, 0x3d, 0x01, 0x37, 0x11, 0x14, 0x33, 0x32, 0x35, 0x11, 0x37, 0x11, 0x14, 0x33, 0x32, 0x27, 0x11, 0x36, 0x35, 0x11, 0x34, 0x26, 0x23, 0x05, 0x27, 0x25, 0x32, 0x16, 0x15, 0x11, 0x06, 0x07, 0x11, 0x14, 0x07, 0x26, 0x27, 0x11, 0x07, 0x11, 0x06, 0x07, 0x26, 0x35, 0x11, 0x07, 0x15, 0x06, 0x07, 0x26, 0x27, 0x35, 0x07, 0x15, 0x06, 0x07, 0x26, 0x27, 0x9f, 0x42, 0x43, 0x45, 0x41, 0x43, 0x47, 0x41, 0x45, 0x44, 0x42, 0x42, 0x02, 0x35, 0x2f, 0x21, 0xfd, 0x3a, 0x1b, 0x02, 0xfa, 0x28, 0x38, 0x02, 0x3d, 0x5d, 0x5d, 0x01, 0x0e, 0x01, 0x5c, 0x5f, 0x10, 0x01, 0x5d, 0x5d, 0x01, 0x0d, 0x01, 0x5c, 0x5e, 0x01, 0x02, 0xb3, 0x53, 0x53, 0x3d, 0x14, 0xae, 0x53, 0x53, 0xdd, 0x09, 0xfe, 0xc6, 0x53, 0x53, 0x01, 0x62, 0x0d, 0xfd, 0x01, 0x53, 0x53, 0x03, 0x27, 0x17, 0x36, 0x01, 0x61, 0x21, 0x30, 0x4a, 0x29, 0x4b, 0x3e, 0x2a, 0xfe, 0x8a, 0x42, 0x20, 0xfc, 0xd4, 0x5c, 0x01, 0x01, 0x5c, 0x02, 0xfc, 0x04, 0xfe, 0x98, 0x5d, 0x01, 0x01, 0x5d, 0x01, 0x3a, 0x02, 0xe4, 0x5d, 0x01, 0x01, 0x5d, 0xab, 0x04, 0x4a, 0x5d, 0x01, 0x01, 0x5d, 0x00, 0x00, 0x1d, 0x00, 0x70, 0x00, 0x00, 0x06, 0x04, 0x05, 0xd8, 0x00, 0x4f, 0x00, 0x80, 0x00, 0x8b, 0x00, 0x95, 0x00, 0xa4, 0x00, 0xb3, 0x00, 0xba, 0x00, 0xc1, 0x00, 0xd6, 0x00, 0xdc, 0x00, 0xe3, 0x00, 0xe7, 0x00, 0xeb, 0x00, 0xef, 0x00, 0xf3, 0x00, 0xf7, 0x00, 0xfb, 0x00, 0xff, 0x01, 0x03, 0x01, 0x07, 0x01, 0x0b, 0x01, 0x1a, 0x01, 0x26, 0x01, 0x2a, 0x01, 0x2e, 0x01, 0x32, 0x01, 0x36, 0x01, 0x3a, 0x01, 0x3e, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x17, 0x15, 0x14, 0x07, 0x33, 0x36, 0x35, 0x36, 0x3b, 0x01, 0x32, 0x15, 0x16, 0x1d, 0x01, 0x06, 0x23, 0x27, 0x06, 0x07, 0x15, 0x17, 0x37, 0x16, 0x15, 0x14, 0x07, 0x14, 0x2b, 0x01, 0x22, 0x2f, 0x01, 0x06, 0x23, 0x22, 0x27, 0x06, 0x15, 0x06, 0x2b, 0x01, 0x22, 0x35, 0x26, 0x35, 0x34, 0x37, 0x17, 0x37, 0x35, 0x25, 0x07, 0x22, 0x27, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x1f, 0x01, 0x35, 0x27, 0x37, 0x26, 0x35, 0x36, 0x37, 0x36, 0x01, 0x14, 0x17, 0x33, 0x35, 0x26, 0x35, 0x36, 0x3b, 0x01, 0x17, 0x07, 0x17, 0x15, 0x07, 0x15, 0x14, 0x17, 0x16, 0x1d, 0x01, 0x17, 0x33, 0x37, 0x34, 0x37, 0x36, 0x35, 0x27, 0x37, 0x35, 0x27, 0x37, 0x16, 0x1d, 0x01, 0x07, 0x17, 0x36, 0x3d, 0x01, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x20, 0x07, 0x06, 0x05, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x34, 0x21, 0x16, 0x17, 0x06, 0x23, 0x22, 0x27, 0x34, 0x35, 0x34, 0x13, 0x33, 0x36, 0x33, 0x17, 0x36, 0x35, 0x26, 0x35, 0x26, 0x23, 0x06, 0x07, 0x06, 0x15, 0x25, 0x06, 0x23, 0x06, 0x15, 0x17, 0x37, 0x16, 0x17, 0x35, 0x34, 0x27, 0x26, 0x35, 0x26, 0x05, 0x17, 0x15, 0x07, 0x26, 0x35, 0x34, 0x37, 0x16, 0x15, 0x14, 0x07, 0x27, 0x35, 0x03, 0x16, 0x33, 0x36, 0x37, 0x26, 0x35, 0x34, 0x37, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x26, 0x27, 0x26, 0x27, 0x16, 0x15, 0x14, 0x37, 0x16, 0x17, 0x33, 0x35, 0x26, 0x05, 0x15, 0x32, 0x3f, 0x01, 0x22, 0x07, 0x05, 0x15, 0x17, 0x35, 0x25, 0x15, 0x37, 0x35, 0x05, 0x15, 0x17, 0x35, 0x33, 0x15, 0x37, 0x27, 0x07, 0x15, 0x37, 0x27, 0x07, 0x15, 0x33, 0x35, 0x33, 0x15, 0x33, 0x35, 0x07, 0x15, 0x17, 0x35, 0x17, 0x15, 0x33, 0x35, 0x07, 0x15, 0x33, 0x35, 0x05, 0x27, 0x07, 0x15, 0x16, 0x15, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x26, 0x35, 0x06, 0x25, 0x07, 0x16, 0x15, 0x14, 0x17, 0x32, 0x3f, 0x01, 0x26, 0x23, 0x07, 0x25, 0x07, 0x17, 0x35, 0x07, 0x15, 0x17, 0x35, 0x27, 0x15, 0x17, 0x35, 0x17, 0x15, 0x37, 0x35, 0x37, 0x15, 0x37, 0x35, 0x37, 0x15, 0x37, 0x35, 0x03, 0x4a, 0x01, 0x12, 0x83, 0x35, 0x5b, 0x05, 0x16, 0x05, 0x90, 0x28, 0x20, 0x07, 0x39, 0x3f, 0x18, 0x38, 0x50, 0xe0, 0x37, 0xd2, 0x3f, 0x56, 0x45, 0x3a, 0x05, 0x2e, 0x3e, 0xac, 0x44, 0x9b, 0x9d, 0x41, 0xbc, 0x2e, 0x28, 0x0c, 0x33, 0x44, 0x50, 0x44, 0xce, 0xfe, 0xee, 0x61, 0x3e, 0x07, 0x40, 0x03, 0x23, 0x1e, 0x2b, 0x36, 0x78, 0x17, 0x0b, 0x60, 0x1f, 0xed, 0x5d, 0xfe, 0xbe, 0x3e, 0x07, 0x1c, 0x0a, 0x0b, 0x0c, 0x11, 0x0b, 0x1c, 0x11, 0x8a, 0x3e, 0x5b, 0x50, 0x72, 0xb1, 0x1d, 0x17, 0x1e, 0x0c, 0x1c, 0x17, 0x1c, 0x05, 0x40, 0xca, 0x73, 0x65, 0x22, 0xfe, 0xcf, 0x5e, 0x12, 0x01, 0x4c, 0x29, 0x02, 0x32, 0x51, 0x06, 0x46, 0x20, 0x01, 0xa0, 0xb7, 0x06, 0x22, 0x56, 0x3b, 0x3d, 0xd4, 0x05, 0xfc, 0x16, 0x5c, 0x1c, 0x3f, 0x06, 0x12, 0x19, 0x2f, 0xe0, 0xfc, 0x85, 0x0f, 0x0d, 0x2f, 0x2a, 0x55, 0x39, 0xd9, 0x5b, 0xb7, 0x16, 0x02, 0x27, 0x0d, 0x2e, 0x22, 0x6e, 0x3f, 0x24, 0x2d, 0xf0, 0x29, 0xc0, 0xc4, 0x26, 0x01, 0x1a, 0x21, 0x19, 0x44, 0x68, 0x32, 0xac, 0x0b, 0x06, 0x29, 0x14, 0x0e, 0x12, 0x17, 0x05, 0x08, 0x01, 0x60, 0x0e, 0x02, 0x17, 0x0c, 0x15, 0xfe, 0xba, 0x10, 0x01, 0x07, 0x17, 0xfe, 0xf4, 0x16, 0xb8, 0x18, 0x02, 0x3f, 0x14, 0x02, 0x68, 0x1d, 0x12, 0x16, 0x94, 0x16, 0x68, 0x16, 0x45, 0x1d, 0xfe, 0x2d, 0x67, 0x06, 0x3e, 0x05, 0x0d, 0x11, 0x3f, 0x8c, 0x1e, 0x11, 0xa7, 0x02, 0xc0, 0x10, 0xcc, 0x2e, 0x12, 0x0b, 0x38, 0x05, 0x1c, 0x56, 0xfd, 0xe0, 0x03, 0x1a, 0x16, 0x16, 0x65, 0x17, 0xb7, 0x19, 0x0d, 0x17, 0x12, 0x17, 0x05, 0xd8, 0xc1, 0x6c, 0x54, 0x45, 0x72, 0x66, 0x5e, 0x06, 0x35, 0x2e, 0x3e, 0x3d, 0x39, 0x7c, 0x35, 0x22, 0x18, 0x2d, 0x07, 0x6c, 0x29, 0x12, 0x64, 0x0d, 0x12, 0x2c, 0x26, 0x3e, 0x76, 0x76, 0x5d, 0x63, 0x63, 0x63, 0x19, 0x57, 0x70, 0x43, 0x2d, 0x2b, 0x0d, 0x0d, 0x64, 0x12, 0x95, 0x07, 0x38, 0x0d, 0x1b, 0x42, 0x70, 0x70, 0x3e, 0x06, 0x57, 0x5d, 0x6f, 0xd8, 0xe6, 0x61, 0x1d, 0xfe, 0x78, 0x76, 0x75, 0x50, 0x70, 0x38, 0x32, 0x13, 0x2c, 0x8e, 0x44, 0xa8, 0x0c, 0x5e, 0x1e, 0x38, 0x2c, 0x18, 0x0d, 0x1a, 0x5e, 0x42, 0x24, 0x4b, 0xbb, 0x9c, 0x12, 0x2b, 0x14, 0x0b, 0x22, 0x31, 0xae, 0x18, 0x52, 0x5b, 0x2b, 0xd2, 0x65, 0x2a, 0xf1, 0x3b, 0xd0, 0x0d, 0x32, 0x0b, 0x0d, 0x9b, 0x9b, 0x57, 0x0a, 0x51, 0x97, 0x9b, 0x03, 0x02, 0x50, 0xfe, 0x12, 0x82, 0x05, 0x08, 0x0a, 0x49, 0x26, 0x3f, 0x09, 0x67, 0x70, 0x13, 0xeb, 0x6f, 0x25, 0x19, 0x0b, 0x05, 0x12, 0x77, 0x0d, 0x5e, 0x19, 0x53, 0x41, 0x24, 0x0d, 0x07, 0x9f, 0x32, 0x0c, 0x39, 0x69, 0x2d, 0x35, 0x6e, 0x30, 0x08, 0x32, 0xa2, 0xfe, 0x86, 0xc7, 0x0e, 0xbf, 0x0a, 0x0c, 0x41, 0x69, 0x26, 0xae, 0x49, 0x16, 0x59, 0x5e, 0x50, 0x5d, 0x44, 0x13, 0x9b, 0x25, 0x88, 0x5c, 0x3f, 0x3f, 0x5c, 0x4f, 0x57, 0x43, 0x0d, 0x2c, 0x05, 0x2c, 0x05, 0x31, 0x0a, 0x2f, 0x0f, 0x32, 0x05, 0x31, 0x31, 0x08, 0x2f, 0x06, 0x3d, 0x02, 0x3b, 0x06, 0x37, 0x37, 0x37, 0x37, 0x3d, 0x33, 0x05, 0x32, 0x0e, 0x31, 0x38, 0x07, 0x31, 0x31, 0x7b, 0x05, 0x05, 0x13, 0x39, 0x30, 0x38, 0x68, 0x4e, 0x1d, 0x25, 0x1e, 0x62, 0x5c, 0x44, 0x68, 0x2c, 0x0f, 0x29, 0x68, 0x3f, 0x12, 0x05, 0xcc, 0x31, 0x06, 0x37, 0x49, 0x32, 0x06, 0x31, 0x21, 0x31, 0x07, 0x32, 0x18, 0x32, 0x06, 0x32, 0x04, 0x32, 0x05, 0x33, 0x0a, 0x32, 0x07, 0x31, 0x00, 0x00, 0x01, 0x00, 0x9a, 0x00, 0x00, 0x05, 0xdb, 0x05, 0xd8, 0x00, 0x26, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x01, 0x07, 0x14, 0x17, 0x25, 0x32, 0x17, 0x15, 0x14, 0x23, 0x05, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x34, 0x37, 0x00, 0x37, 0x36, 0x35, 0x34, 0x27, 0x23, 0x05, 0x22, 0x27, 0x35, 0x34, 0x37, 0x33, 0x03, 0xd5, 0x81, 0x65, 0x2f, 0x6f, 0xfd, 0xae, 0x0a, 0x57, 0x03, 0x16, 0x46, 0x08, 0x5e, 0xfc, 0xf7, 0x91, 0x61, 0x18, 0x7d, 0x02, 0x2f, 0x12, 0x0a, 0x58, 0x0a, 0xfd, 0x09, 0x33, 0x0a, 0x58, 0x0d, 0x05, 0xd8, 0x8d, 0x4d, 0x4f, 0x8a, 0x62, 0xfd, 0xa0, 0x3e, 0x59, 0x1a, 0xd1, 0x61, 0x03, 0x59, 0xc6, 0xae, 0x35, 0x38, 0x18, 0x8a, 0x6c, 0x02, 0x37, 0x1b, 0x1b, 0x16, 0x50, 0x20, 0xcc, 0x50, 0x1e, 0x40, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd8, 0x00, 0x11, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x46, 0x00, 0x58, 0x00, 0x00, 0x01, 0x20, 0x13, 0x16, 0x15, 0x10, 0x05, 0x06, 0x2b, 0x01, 0x20, 0x03, 0x26, 0x3d, 0x01, 0x10, 0x01, 0x36, 0x05, 0x26, 0x23, 0x20, 0x03, 0x06, 0x15, 0x10, 0x17, 0x16, 0x33, 0x20, 0x13, 0x36, 0x3d, 0x01, 0x10, 0x25, 0x26, 0x01, 0x23, 0x22, 0x27, 0x13, 0x16, 0x3b, 0x01, 0x32, 0x37, 0x13, 0x06, 0x01, 0x06, 0x1d, 0x01, 0x21, 0x35, 0x10, 0x25, 0x36, 0x37, 0x13, 0x06, 0x25, 0x16, 0x17, 0x21, 0x26, 0x27, 0x26, 0x27, 0x13, 0x16, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x34, 0x37, 0x36, 0x03, 0x2e, 0x01, 0x59, 0xee, 0x66, 0xfe, 0xe3, 0xae, 0xbf, 0x1d, 0xfe, 0xaa, 0xec, 0x59, 0x01, 0x30, 0xa7, 0x01, 0xe8, 0x96, 0x96, 0xfe, 0xf2, 0xd4, 0x71, 0xfb, 0xa0, 0xc9, 0x01, 0x33, 0xd2, 0x50, 0xfe, 0xce, 0x04, 0xfe, 0xf2, 0x19, 0x97, 0x7f, 0xbc, 0x2b, 0x32, 0x08, 0x2d, 0x29, 0xbf, 0x7f, 0xfe, 0xfd, 0x56, 0xfe, 0x82, 0x01, 0x02, 0x10, 0x11, 0xbd, 0x06, 0x02, 0x45, 0x56, 0x03, 0xfe, 0x80, 0x01, 0x1c, 0x1e, 0x27, 0xbd, 0x71, 0xfe, 0x75, 0x49, 0x33, 0x16, 0x3d, 0x25, 0x29, 0x07, 0x48, 0x33, 0x12, 0x41, 0x23, 0x05, 0xd8, 0xfe, 0x8d, 0xaf, 0xd6, 0xfe, 0xb0, 0xfd, 0x93, 0x01, 0x83, 0xae, 0xb2, 0x1c, 0x01, 0x53, 0x01, 0x02, 0x84, 0xac, 0x5d, 0xfe, 0xd9, 0xb1, 0xc2, 0xfe, 0xc4, 0xe2, 0x8a, 0x01, 0x5a, 0x96, 0xa6, 0x0f, 0x01, 0x59, 0xe0, 0x04, 0xfb, 0x48, 0x59, 0x01, 0x6f, 0x1f, 0x1d, 0xfe, 0x92, 0x58, 0x03, 0x28, 0x49, 0x5f, 0x05, 0x10, 0x01, 0x20, 0xdb, 0x0d, 0x0c, 0xfe, 0x92, 0x04, 0x8f, 0x91, 0xb0, 0x3b, 0x2e, 0x32, 0x19, 0x01, 0x6c, 0x4f, 0xfe, 0xcf, 0x50, 0x25, 0x2e, 0x47, 0x36, 0x1f, 0x52, 0x25, 0x26, 0x05, 0x49, 0x38, 0x1c, 0x00, 0x00, 0x06, 0x00, 0x5a, 0x00, 0x00, 0x06, 0x1b, 0x05, 0xd8, 0x00, 0x0f, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x4e, 0x00, 0x6c, 0x00, 0x8d, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x36, 0x37, 0x16, 0x15, 0x14, 0x06, 0x07, 0x26, 0x35, 0x34, 0x03, 0x26, 0x23, 0x22, 0x06, 0x07, 0x26, 0x27, 0x36, 0x33, 0x32, 0x16, 0x17, 0x06, 0x01, 0x14, 0x16, 0x17, 0x06, 0x07, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x16, 0x01, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x15, 0x14, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x33, 0x16, 0x17, 0x16, 0x11, 0x15, 0x2e, 0x01, 0x23, 0x06, 0x07, 0x27, 0x36, 0x35, 0x34, 0x27, 0x35, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x27, 0x26, 0x27, 0x12, 0x37, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x06, 0x15, 0x14, 0x17, 0x07, 0x26, 0x2b, 0x01, 0x22, 0x23, 0x22, 0x06, 0x03, 0xcc, 0x3d, 0x41, 0x01, 0x21, 0x20, 0x02, 0x6d, 0x4d, 0x09, 0x0c, 0x39, 0x44, 0x07, 0x52, 0x37, 0x1e, 0x13, 0x4e, 0x69, 0x06, 0x78, 0x42, 0x16, 0xfe, 0x57, 0x52, 0x3f, 0x03, 0x0e, 0x5e, 0x64, 0x02, 0x26, 0x03, 0x61, 0x62, 0x96, 0x29, 0x2d, 0x94, 0x52, 0x01, 0x37, 0x6b, 0x53, 0x57, 0x6f, 0x73, 0x4c, 0x48, 0x32, 0xa5, 0x34, 0x2b, 0x19, 0x3e, 0x1f, 0x1d, 0x1c, 0x1a, 0x3a, 0x18, 0x32, 0x38, 0x90, 0x3e, 0x48, 0xfe, 0xc9, 0x92, 0x53, 0x0f, 0x3e, 0x03, 0x5f, 0x6c, 0xaf, 0x0b, 0xbd, 0x65, 0xa5, 0x75, 0x3f, 0x01, 0x39, 0xa3, 0x4c, 0x30, 0x16, 0xfb, 0xf9, 0x04, 0x6d, 0x62, 0xa2, 0x10, 0x02, 0x27, 0x02, 0x0f, 0xf9, 0xa0, 0x1e, 0x22, 0x5b, 0xac, 0x01, 0x3c, 0x02, 0x3a, 0x65, 0x96, 0x0c, 0x03, 0x04, 0x73, 0xa0, 0x01, 0x91, 0x28, 0x8b, 0x41, 0x0c, 0x0c, 0x0e, 0x05, 0x13, 0x12, 0x5f, 0xc3, 0x25, 0x18, 0x19, 0x0e, 0x02, 0x0d, 0x23, 0x04, 0x2b, 0x16, 0x1c, 0x42, 0x05, 0x37, 0x21, 0xfe, 0xea, 0x4e, 0x8f, 0x20, 0x26, 0x22, 0x2e, 0xcb, 0x4f, 0x10, 0x0f, 0x06, 0xfd, 0xb2, 0x53, 0x06, 0x24, 0xaa, 0x02, 0x58, 0x45, 0x2f, 0x4b, 0x28, 0x41, 0x61, 0x5d, 0x64, 0x4c, 0x50, 0x2a, 0x18, 0x17, 0x27, 0x46, 0x43, 0x61, 0x59, 0x72, 0x3d, 0x05, 0xa0, 0x43, 0xd9, 0x34, 0x34, 0x6d, 0x6f, 0x0a, 0x43, 0x82, 0xfe, 0xff, 0x0a, 0x9d, 0xb6, 0x0a, 0x93, 0x28, 0x07, 0x07, 0x46, 0x19, 0x4b, 0x1f, 0x9c, 0x57, 0x59, 0x1a, 0x8e, 0xfc, 0x46, 0x18, 0x19, 0x95, 0xa1, 0x76, 0x02, 0x62, 0x89, 0x01, 0x0e, 0x70, 0x68, 0xb4, 0x27, 0x55, 0x44, 0x98, 0x27, 0x52, 0x1d, 0x3c, 0x09, 0x0a, 0x24, 0x88, 0x93, 0x00, 0x17, 0x00, 0x5a, 0xff, 0xfc, 0x04, 0x77, 0x05, 0xd1, 0x00, 0x07, 0x00, 0x1d, 0x00, 0x23, 0x00, 0x2b, 0x00, 0x3f, 0x00, 0x56, 0x00, 0x6d, 0x00, 0x83, 0x00, 0xa2, 0x00, 0xad, 0x00, 0xb2, 0x00, 0xb7, 0x00, 0xbc, 0x00, 0xc1, 0x00, 0xc9, 0x00, 0xd0, 0x00, 0xd5, 0x00, 0xda, 0x00, 0xdf, 0x00, 0xe5, 0x00, 0xed, 0x00, 0xf4, 0x01, 0x23, 0x00, 0x00, 0x01, 0x06, 0x15, 0x14, 0x33, 0x32, 0x37, 0x26, 0x17, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x37, 0x27, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x06, 0x07, 0x26, 0x27, 0x36, 0x35, 0x34, 0x01, 0x06, 0x07, 0x23, 0x26, 0x37, 0x03, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x06, 0x23, 0x22, 0x27, 0x35, 0x26, 0x35, 0x36, 0x37, 0x16, 0x17, 0x06, 0x15, 0x14, 0x04, 0x07, 0x23, 0x26, 0x27, 0x15, 0x27, 0x35, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x15, 0x14, 0x04, 0x15, 0x14, 0x07, 0x27, 0x36, 0x35, 0x34, 0x27, 0x34, 0x03, 0x15, 0x27, 0x35, 0x24, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x15, 0x14, 0x17, 0x06, 0x04, 0x17, 0x06, 0x07, 0x27, 0x36, 0x35, 0x34, 0x07, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x06, 0x15, 0x14, 0x04, 0x17, 0x06, 0x07, 0x26, 0x27, 0x36, 0x35, 0x34, 0x27, 0x15, 0x27, 0x13, 0x15, 0x27, 0x35, 0x24, 0x35, 0x36, 0x37, 0x33, 0x32, 0x17, 0x07, 0x17, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x15, 0x14, 0x04, 0x17, 0x06, 0x07, 0x26, 0x27, 0x36, 0x27, 0x36, 0x01, 0x14, 0x1e, 0x01, 0x33, 0x26, 0x34, 0x37, 0x22, 0x0e, 0x01, 0x05, 0x16, 0x17, 0x37, 0x26, 0x27, 0x16, 0x17, 0x37, 0x26, 0x27, 0x16, 0x17, 0x37, 0x26, 0x27, 0x16, 0x07, 0x37, 0x26, 0x27, 0x14, 0x15, 0x14, 0x07, 0x17, 0x35, 0x34, 0x27, 0x06, 0x07, 0x17, 0x36, 0x35, 0x34, 0x05, 0x17, 0x36, 0x37, 0x06, 0x07, 0x17, 0x36, 0x37, 0x06, 0x07, 0x17, 0x36, 0x37, 0x06, 0x1f, 0x01, 0x35, 0x34, 0x37, 0x06, 0x17, 0x37, 0x26, 0x35, 0x34, 0x35, 0x06, 0x15, 0x3f, 0x01, 0x26, 0x27, 0x14, 0x15, 0x14, 0x17, 0x15, 0x27, 0x35, 0x26, 0x23, 0x22, 0x07, 0x22, 0x27, 0x36, 0x25, 0x16, 0x17, 0x16, 0x33, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x31, 0x14, 0x31, 0x15, 0x36, 0x37, 0x04, 0x17, 0x06, 0x23, 0x26, 0x23, 0x22, 0x03, 0x02, 0x04, 0x0a, 0x0b, 0x16, 0x09, 0x47, 0x06, 0x07, 0x3c, 0x31, 0x17, 0x14, 0x52, 0x61, 0x20, 0x37, 0x0a, 0x0c, 0xb8, 0x0b, 0x01, 0x7f, 0x3f, 0x8e, 0xf7, 0xfe, 0xae, 0x56, 0x1c, 0x0d, 0x01, 0x4d, 0x5d, 0x18, 0x0c, 0x09, 0x05, 0x1f, 0xd8, 0x0a, 0x18, 0x1e, 0x03, 0x9d, 0x04, 0x3a, 0x29, 0x28, 0x37, 0x01, 0x17, 0x02, 0x0e, 0x17, 0x68, 0x43, 0xfc, 0x04, 0x02, 0x73, 0x2f, 0x4e, 0x9d, 0x01, 0x8a, 0x65, 0x2c, 0x3e, 0x01, 0x48, 0x43, 0xfe, 0xb7, 0x02, 0x04, 0x66, 0x45, 0x5f, 0xba, 0x01, 0x09, 0x02, 0x37, 0x02, 0x04, 0x87, 0x5e, 0x93, 0xe4, 0xf2, 0x05, 0x01, 0x65, 0x41, 0x42, 0x93, 0x01, 0xe0, 0x02, 0x03, 0x9d, 0x1e, 0x34, 0x9e, 0xaa, 0x43, 0x43, 0x43, 0xfe, 0xa7, 0x0c, 0xb8, 0x08, 0x37, 0x2e, 0x62, 0x53, 0x15, 0x15, 0x33, 0x3b, 0x07, 0x07, 0x25, 0x02, 0x89, 0x06, 0x06, 0x9d, 0x39, 0x64, 0xed, 0x02, 0x0b, 0xfe, 0x9e, 0x10, 0x1d, 0x11, 0x0e, 0x0e, 0x10, 0x1e, 0x10, 0x01, 0x8d, 0x69, 0x27, 0x19, 0x57, 0x88, 0x68, 0x22, 0x26, 0x56, 0x71, 0x48, 0x0f, 0x2c, 0x37, 0x75, 0x30, 0x01, 0x37, 0x23, 0x5d, 0x13, 0x36, 0x37, 0x2d, 0x2f, 0x36, 0x27, 0xfd, 0x5d, 0x19, 0x28, 0x68, 0x52, 0x28, 0x26, 0x22, 0x68, 0x5a, 0x12, 0x2c, 0x0f, 0x48, 0x4b, 0x0e, 0x38, 0x2e, 0x43, 0x3a, 0x37, 0x14, 0x23, 0x5d, 0x36, 0x2f, 0x2d, 0xce, 0x43, 0x29, 0x40, 0x20, 0x26, 0xf0, 0x50, 0x4c, 0x01, 0x3c, 0x14, 0x50, 0x02, 0x01, 0x03, 0x02, 0x12, 0x14, 0x14, 0x25, 0x26, 0x25, 0x15, 0x14, 0x12, 0x03, 0x02, 0x4f, 0x15, 0x01, 0x3b, 0x4c, 0x50, 0xf0, 0x26, 0x21, 0x3d, 0x04, 0x20, 0x08, 0x04, 0x09, 0x0a, 0x14, 0x3f, 0x02, 0x18, 0x05, 0x17, 0x19, 0x3e, 0x02, 0x04, 0x7d, 0x3e, 0x20, 0x11, 0x09, 0x14, 0x2a, 0x30, 0xfc, 0x74, 0x22, 0x3c, 0x48, 0x23, 0x03, 0xa6, 0x0b, 0x08, 0x05, 0x09, 0x09, 0xfc, 0x2d, 0x38, 0x1a, 0x38, 0x29, 0x1e, 0x36, 0x31, 0x18, 0x0d, 0x06, 0x15, 0x15, 0x29, 0x36, 0x66, 0x38, 0xad, 0x5a, 0x0d, 0x5c, 0x2b, 0x48, 0x44, 0x20, 0x13, 0x09, 0x1a, 0x27, 0x2a, 0x3e, 0x4a, 0x2e, 0x0e, 0x0b, 0x11, 0x1d, 0x05, 0x05, 0x17, 0x01, 0x99, 0x8c, 0x0d, 0x89, 0x26, 0x62, 0x35, 0x16, 0x14, 0x07, 0x0f, 0x1d, 0x02, 0x02, 0x34, 0x43, 0x55, 0x45, 0x20, 0x1b, 0x27, 0x1a, 0x27, 0xa4, 0x21, 0x60, 0x39, 0x1e, 0x0c, 0x07, 0x21, 0x2c, 0x28, 0x4d, 0x54, 0x45, 0x15, 0x0f, 0x0b, 0x1e, 0x2a, 0x21, 0x1d, 0x85, 0x0c, 0x02, 0x04, 0x7f, 0x08, 0x7d, 0x15, 0x71, 0x7e, 0x04, 0x3d, 0x18, 0x17, 0x05, 0x18, 0x02, 0x2f, 0x2b, 0x29, 0x66, 0x5b, 0x14, 0x10, 0x0f, 0x1c, 0x34, 0x1f, 0x02, 0x66, 0x12, 0x20, 0x11, 0x21, 0x42, 0x22, 0x11, 0x20, 0x3c, 0x40, 0x30, 0x26, 0x39, 0x15, 0x63, 0x3f, 0x22, 0x56, 0x2b, 0x80, 0x47, 0x13, 0x6f, 0x4d, 0x93, 0x4b, 0x08, 0x7e, 0x61, 0x11, 0x0f, 0x84, 0x3f, 0x0b, 0x0c, 0x7d, 0x62, 0x89, 0x39, 0x19, 0x65, 0x5c, 0x0d, 0x50, 0x26, 0x30, 0x40, 0x11, 0x6b, 0x22, 0x3f, 0x63, 0x2a, 0x89, 0x13, 0x47, 0x80, 0x45, 0x89, 0x08, 0x06, 0x4a, 0x8e, 0x58, 0x8d, 0x0b, 0x3f, 0x84, 0x0f, 0x11, 0x65, 0x7d, 0x04, 0x19, 0x39, 0x89, 0x0d, 0x0d, 0x5c, 0xab, 0xce, 0x06, 0xc2, 0x34, 0x0c, 0xa5, 0x5c, 0x06, 0x36, 0x1e, 0x01, 0x18, 0x01, 0x02, 0x0a, 0x27, 0x16, 0x15, 0x27, 0x16, 0x16, 0x27, 0x15, 0x16, 0x27, 0x0a, 0x02, 0x01, 0x01, 0x16, 0x1e, 0x36, 0x06, 0x5c, 0xa5, 0x0d, 0x00, 0x00, 0x02, 0x00, 0x99, 0x00, 0x00, 0x04, 0xc7, 0x05, 0xd9, 0x00, 0x08, 0x00, 0x28, 0x00, 0x00, 0x01, 0x26, 0x27, 0x06, 0x07, 0x16, 0x17, 0x36, 0x35, 0x03, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x15, 0x14, 0x07, 0x33, 0x32, 0x37, 0x11, 0x26, 0x2b, 0x02, 0x11, 0x14, 0x17, 0x21, 0x36, 0x35, 0x11, 0x2b, 0x01, 0x22, 0x07, 0x11, 0x16, 0x33, 0x03, 0x20, 0x02, 0x6d, 0x6d, 0x01, 0x07, 0x67, 0x6f, 0xb1, 0x6b, 0x0b, 0x03, 0xb5, 0xb6, 0x03, 0x76, 0x93, 0xa3, 0x9c, 0x98, 0xa1, 0x05, 0x94, 0x59, 0xfe, 0xc9, 0x59, 0x97, 0x06, 0xa1, 0x98, 0x9d, 0xa2, 0x04, 0xde, 0xb1, 0x02, 0x02, 0xb1, 0x8e, 0x71, 0x58, 0x9f, 0xfe, 0xf1, 0x65, 0xb8, 0xf3, 0x02, 0x02, 0xf3, 0x0e, 0xb7, 0x58, 0x63, 0xfe, 0xf7, 0x36, 0xfe, 0x0c, 0xb5, 0xae, 0xae, 0xb5, 0x01, 0xf4, 0x36, 0x01, 0x09, 0x63, 0x00, 0x00, 0x03, 0x00, 0x99, 0xff, 0xfd, 0x04, 0x14, 0x05, 0xd9, 0x00, 0x03, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x15, 0x33, 0x35, 0x27, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x05, 0x15, 0x21, 0x11, 0x17, 0x15, 0x27, 0x03, 0x23, 0x11, 0x27, 0x35, 0x17, 0x11, 0x21, 0x35, 0x21, 0x35, 0x23, 0x35, 0x13, 0x33, 0x11, 0x33, 0x35, 0x23, 0x35, 0x23, 0x15, 0x23, 0x15, 0x33, 0x01, 0xf5, 0xb6, 0xa5, 0x9a, 0x71, 0x71, 0x08, 0x01, 0x6c, 0xfe, 0x8c, 0x81, 0x7a, 0x01, 0xa0, 0x79, 0x79, 0xfe, 0x93, 0x01, 0x6d, 0x6a, 0x94, 0x40, 0xf1, 0xf1, 0x40, 0xf0, 0xf0, 0x05, 0x40, 0x3c, 0x3c, 0x33, 0x66, 0x66, 0xa2, 0x58, 0x01, 0xaf, 0xfd, 0xe8, 0x8b, 0x9c, 0x85, 0xfe, 0xee, 0x01, 0xbc, 0x86, 0x9b, 0x82, 0x01, 0x71, 0xb0, 0x58, 0xa2, 0xfc, 0xcf, 0x01, 0xbb, 0x47, 0x63, 0x63, 0x47, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x99, 0x00, 0x00, 0x05, 0x0c, 0x07, 0x4a, 0x00, 0x07, 0x00, 0x20, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x01, 0x11, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x37, 0x33, 0x09, 0x01, 0x23, 0x03, 0x11, 0x23, 0x11, 0x03, 0x23, 0x09, 0x01, 0x33, 0x02, 0xd7, 0xbc, 0x69, 0x72, 0x72, 0x69, 0xfe, 0xb0, 0x01, 0x50, 0xba, 0xbf, 0xbf, 0xba, 0xbc, 0xc4, 0xc6, 0xfe, 0x90, 0x01, 0x83, 0xc5, 0xd7, 0x95, 0xe5, 0xc5, 0x01, 0x8b, 0xfe, 0x96, 0xc6, 0x06, 0xa7, 0xfd, 0xd8, 0x90, 0x01, 0x08, 0x90, 0xfc, 0x04, 0x04, 0x9f, 0xdf, 0xd8, 0xd9, 0xde, 0xfe, 0xcd, 0xed, 0xfe, 0x42, 0xfe, 0x28, 0x01, 0x06, 0xfe, 0xfa, 0x01, 0x17, 0xfe, 0xe9, 0x01, 0xe1, 0x01, 0xb5, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x03, 0x54, 0x05, 0xd7, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x33, 0x17, 0x15, 0x33, 0x17, 0x15, 0x07, 0x23, 0x15, 0x21, 0x17, 0x15, 0x07, 0x21, 0x11, 0x07, 0x23, 0x27, 0x11, 0x21, 0x27, 0x35, 0x37, 0x21, 0x35, 0x23, 0x27, 0x35, 0x37, 0x33, 0x35, 0x01, 0xa8, 0x9a, 0x05, 0x95, 0x04, 0x04, 0x95, 0x01, 0x07, 0x05, 0x05, 0xfe, 0xf9, 0x05, 0x9a, 0x06, 0xfe, 0xfc, 0x05, 0x05, 0x01, 0x04, 0x92, 0x05, 0x05, 0x92, 0x05, 0xd7, 0x05, 0x9b, 0x06, 0x94, 0x06, 0x71, 0x06, 0x98, 0x05, 0xfc, 0x82, 0x05, 0x05, 0x03, 0x7e, 0x05, 0x98, 0x06, 0x71, 0x06, 0x94, 0x06, 0x9b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0xff, 0xfd, 0x05, 0xdc, 0x05, 0xd5, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x21, 0x17, 0x15, 0x07, 0x23, 0x11, 0x21, 0x35, 0x37, 0x33, 0x17, 0x11, 0x07, 0x23, 0x27, 0x35, 0x21, 0x11, 0x33, 0x17, 0x15, 0x07, 0x21, 0x27, 0x35, 0x37, 0x33, 0x11, 0x21, 0x15, 0x07, 0x23, 0x27, 0x11, 0x37, 0x33, 0x17, 0x15, 0x21, 0x11, 0x23, 0x27, 0x35, 0x02, 0x75, 0x01, 0x8a, 0x06, 0x06, 0x90, 0x02, 0x02, 0x06, 0x5f, 0x05, 0x05, 0x5f, 0x06, 0xfd, 0xfe, 0x90, 0x06, 0x06, 0xfe, 0x76, 0x05, 0x05, 0x99, 0xfd, 0xfd, 0x05, 0x68, 0x05, 0x05, 0x68, 0x05, 0x02, 0x03, 0x99, 0x05, 0x05, 0xd5, 0x06, 0x77, 0x06, 0xfd, 0xd1, 0xa1, 0x06, 0x06, 0xfe, 0x49, 0x06, 0x06, 0x9e, 0xfd, 0xc8, 0x06, 0x6a, 0x06, 0x06, 0x6a, 0x06, 0x02, 0x38, 0x9e, 0x06, 0x06, 0x01, 0xb7, 0x06, 0x06, 0xa1, 0x02, 0x2f, 0x06, 0x77, 0x00, 0x02, 0x00, 0xa0, 0x00, 0x00, 0x05, 0xd6, 0x05, 0xd8, 0x00, 0x1b, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x33, 0x32, 0x17, 0x23, 0x27, 0x20, 0x03, 0x06, 0x15, 0x10, 0x05, 0x16, 0x33, 0x37, 0x15, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x20, 0x03, 0x26, 0x35, 0x10, 0x25, 0x36, 0x01, 0x33, 0x32, 0x17, 0x33, 0x15, 0x07, 0x16, 0x15, 0x27, 0x07, 0x23, 0x35, 0x37, 0x27, 0x35, 0x33, 0x03, 0x40, 0x12, 0xc7, 0xbd, 0x05, 0xd7, 0xfe, 0xcb, 0xbc, 0x55, 0x01, 0x34, 0x7b, 0x8c, 0xe7, 0x90, 0x7c, 0x49, 0x30, 0x19, 0xfe, 0xb5, 0xd6, 0x77, 0x01, 0x5f, 0x9b, 0x02, 0x3f, 0x03, 0x05, 0x38, 0xbc, 0x97, 0x3a, 0x9f, 0x98, 0x03, 0x3c, 0x9b, 0xc0, 0x05, 0xd8, 0x92, 0x36, 0xfe, 0xca, 0x9e, 0xb9, 0xfe, 0x92, 0xd6, 0x47, 0x32, 0x06, 0x6b, 0x1a, 0x0b, 0x01, 0x3e, 0xc0, 0xe9, 0x01, 0xaa, 0xee, 0x59, 0xfe, 0x33, 0xc9, 0x03, 0x7e, 0xbb, 0x11, 0x7c, 0x7c, 0x03, 0xc9, 0x7e, 0x03, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd9, 0x00, 0x16, 0x00, 0x4f, 0x00, 0x62, 0x00, 0x73, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x37, 0x16, 0x33, 0x32, 0x37, 0x35, 0x33, 0x17, 0x15, 0x14, 0x0f, 0x01, 0x22, 0x27, 0x06, 0x23, 0x22, 0x27, 0x34, 0x17, 0x33, 0x16, 0x17, 0x32, 0x15, 0x03, 0x33, 0x24, 0x11, 0x34, 0x27, 0x35, 0x16, 0x11, 0x15, 0x10, 0x07, 0x06, 0x07, 0x15, 0x16, 0x3b, 0x01, 0x15, 0x06, 0x2b, 0x01, 0x22, 0x07, 0x27, 0x23, 0x22, 0x27, 0x35, 0x33, 0x32, 0x37, 0x35, 0x27, 0x26, 0x27, 0x26, 0x35, 0x10, 0x3f, 0x01, 0x15, 0x06, 0x15, 0x10, 0x05, 0x35, 0x03, 0x35, 0x37, 0x32, 0x27, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x15, 0x23, 0x26, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x33, 0x34, 0x25, 0x16, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x07, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x10, 0x25, 0x02, 0x9f, 0x19, 0x39, 0x2a, 0x1d, 0x22, 0x27, 0x3c, 0x13, 0x04, 0x02, 0x3e, 0x1b, 0x28, 0x1f, 0x1e, 0x28, 0x49, 0x0f, 0xa0, 0x02, 0x2d, 0x1f, 0x07, 0x09, 0x02, 0x01, 0x07, 0x63, 0xc7, 0xc9, 0x45, 0x2a, 0x48, 0x95, 0x17, 0x69, 0x41, 0x74, 0x14, 0x3e, 0x3d, 0x82, 0x32, 0x7b, 0x36, 0x6d, 0x4e, 0x50, 0x70, 0x20, 0x5a, 0xb4, 0x1d, 0x69, 0x01, 0x08, 0x10, 0x03, 0x1f, 0xe6, 0x55, 0x3b, 0x78, 0x83, 0x02, 0x8e, 0x54, 0x22, 0xf1, 0x6d, 0x20, 0x02, 0x3b, 0x77, 0x75, 0x9e, 0x95, 0x50, 0x1c, 0x31, 0x52, 0xfe, 0xf4, 0x05, 0xd9, 0x4b, 0x30, 0x30, 0x44, 0x07, 0x28, 0x05, 0x3b, 0x1b, 0x04, 0x2c, 0x2c, 0x65, 0x22, 0x87, 0x40, 0x0b, 0x05, 0xfc, 0x20, 0xe4, 0x01, 0x70, 0xc2, 0xcf, 0x03, 0xd7, 0xfe, 0xeb, 0x24, 0xfe, 0xf1, 0xdd, 0x42, 0x16, 0x05, 0x28, 0x05, 0x21, 0x63, 0x63, 0x1c, 0x05, 0x2a, 0x03, 0x40, 0x72, 0x4a, 0xb1, 0xb1, 0x01, 0x01, 0xe6, 0x1f, 0x05, 0xc0, 0xe2, 0xfe, 0xa7, 0xf5, 0x02, 0x03, 0x26, 0x16, 0xa9, 0x2a, 0x06, 0x45, 0x63, 0xcc, 0xef, 0xe9, 0xd6, 0x02, 0x4a, 0xe9, 0x6b, 0x67, 0x01, 0x0c, 0xcd, 0x46, 0x04, 0x02, 0x1e, 0x70, 0xb7, 0xd8, 0x2f, 0xd4, 0xb6, 0x51, 0x06, 0x07, 0x52, 0xaf, 0xbf, 0x02, 0x01, 0x6d, 0xf4, 0x00, 0x03, 0x00, 0x99, 0x00, 0x00, 0x04, 0x85, 0x05, 0xd9, 0x00, 0x5b, 0x00, 0x66, 0x00, 0x6e, 0x00, 0x00, 0x01, 0x32, 0x17, 0x0f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x17, 0x23, 0x15, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x33, 0x16, 0x11, 0x10, 0x03, 0x26, 0x23, 0x22, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x15, 0x06, 0x23, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x15, 0x14, 0x15, 0x14, 0x17, 0x14, 0x23, 0x22, 0x35, 0x36, 0x3d, 0x01, 0x06, 0x15, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x34, 0x36, 0x35, 0x34, 0x23, 0x22, 0x07, 0x02, 0x11, 0x34, 0x37, 0x33, 0x17, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x35, 0x23, 0x35, 0x26, 0x35, 0x34, 0x37, 0x2f, 0x01, 0x36, 0x03, 0x14, 0x17, 0x33, 0x36, 0x35, 0x34, 0x27, 0x06, 0x07, 0x06, 0x25, 0x06, 0x15, 0x14, 0x17, 0x36, 0x35, 0x34, 0x02, 0x8f, 0x3c, 0x49, 0x11, 0x0d, 0x72, 0x2e, 0x32, 0xb8, 0x01, 0x6c, 0x6d, 0x80, 0x79, 0x71, 0x13, 0x05, 0xd2, 0x86, 0x6c, 0x47, 0x32, 0x6c, 0x1b, 0x0c, 0x26, 0x0a, 0x08, 0x28, 0x06, 0x35, 0x54, 0x48, 0x5e, 0x64, 0x48, 0x8a, 0x07, 0x33, 0x05, 0x25, 0x0d, 0x87, 0x29, 0x4a, 0x68, 0x8b, 0xcd, 0x05, 0x13, 0x71, 0xc1, 0x38, 0x6d, 0x6b, 0xb7, 0xd6, 0x16, 0x0e, 0x4e, 0xb9, 0x79, 0x04, 0x3f, 0x1a, 0x50, 0x2e, 0x24, 0x01, 0x4b, 0x1f, 0x3b, 0x81, 0x05, 0xd9, 0x4b, 0x0f, 0x7c, 0x2e, 0x50, 0x51, 0x55, 0xc7, 0x62, 0x4b, 0x78, 0x81, 0x9d, 0xc6, 0xb0, 0x72, 0x13, 0xa5, 0xfe, 0xfe, 0xfe, 0xe0, 0xfe, 0xc9, 0xae, 0x2d, 0x1c, 0x93, 0x26, 0x2a, 0x02, 0x03, 0x3b, 0x02, 0x22, 0xee, 0x31, 0x96, 0x03, 0x04, 0x46, 0x71, 0x3b, 0x3c, 0x74, 0x4d, 0x92, 0x5d, 0xbf, 0x23, 0x3b, 0x40, 0xa4, 0x22, 0x2b, 0xad, 0x01, 0x21, 0x01, 0x4d, 0xe9, 0xa6, 0x13, 0x79, 0xae, 0xfb, 0xa3, 0x2f, 0x12, 0x78, 0x4b, 0x5c, 0xcc, 0xbe, 0x67, 0x7c, 0x12, 0x48, 0xfd, 0xff, 0x92, 0x4a, 0x69, 0x8b, 0x53, 0x7e, 0x19, 0x4a, 0x3f, 0xa2, 0x73, 0x63, 0x89, 0x66, 0x3d, 0xa8, 0x98, 0x00, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdb, 0x05, 0xd7, 0x00, 0x32, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x17, 0x07, 0x23, 0x27, 0x06, 0x23, 0x22, 0x27, 0x15, 0x03, 0x23, 0x26, 0x27, 0x36, 0x01, 0x36, 0x33, 0x16, 0x33, 0x32, 0x37, 0x27, 0x07, 0x23, 0x26, 0x27, 0x13, 0x04, 0x15, 0x07, 0x16, 0x17, 0x35, 0x36, 0x3d, 0x01, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x36, 0x03, 0x84, 0xd5, 0xbc, 0x87, 0x70, 0xae, 0x7e, 0x02, 0xa7, 0x94, 0xc3, 0x9a, 0x80, 0xea, 0x03, 0xb7, 0x04, 0x17, 0x01, 0x37, 0x15, 0x07, 0x65, 0x8f, 0xac, 0x87, 0xc3, 0x61, 0x05, 0xa9, 0x08, 0xd2, 0x00, 0xff, 0x72, 0xcf, 0x1a, 0x3c, 0xe2, 0x7c, 0x6b, 0x21, 0x58, 0x6c, 0x99, 0x05, 0xd7, 0xbd, 0x9b, 0xd7, 0xc9, 0x8a, 0x94, 0x83, 0xaa, 0x6e, 0x58, 0x03, 0xfe, 0x31, 0x8d, 0x07, 0x19, 0x01, 0x98, 0x1d, 0x55, 0x68, 0xc6, 0x73, 0x74, 0x0c, 0x01, 0x02, 0x0e, 0x05, 0x9f, 0xaf, 0x0e, 0x02, 0x5a, 0x7c, 0x24, 0xfe, 0x65, 0x45, 0x37, 0x8f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd8, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x21, 0x00, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x14, 0x17, 0x01, 0x03, 0x06, 0x00, 0x13, 0x16, 0x17, 0x1b, 0x01, 0x36, 0x37, 0x09, 0x01, 0x36, 0x35, 0x34, 0x00, 0x27, 0x11, 0x99, 0x01, 0x8a, 0x01, 0x17, 0x01, 0x18, 0x01, 0x89, 0xfe, 0x77, 0xfe, 0xe8, 0xfe, 0xe9, 0xfe, 0x76, 0x89, 0x6d, 0x01, 0x7f, 0x02, 0xb0, 0xfe, 0xc6, 0x9c, 0x9e, 0xad, 0x01, 0x56, 0xb8, 0x9a, 0xfe, 0xae, 0x01, 0x8f, 0x65, 0xfe, 0xc4, 0xbd, 0x02, 0xea, 0x01, 0x37, 0x01, 0xb7, 0xfe, 0x49, 0xfe, 0xc9, 0xfe, 0xca, 0xfe, 0x4c, 0x01, 0xb4, 0x01, 0x36, 0xe5, 0x78, 0x01, 0xf5, 0x01, 0xc2, 0x04, 0xfe, 0xa3, 0xfd, 0x62, 0xb1, 0x06, 0x02, 0x68, 0xfd, 0x96, 0x08, 0xa4, 0x01, 0xb6, 0xfe, 0x97, 0x70, 0xf5, 0xf9, 0x01, 0x5d, 0x04, 0xfe, 0x42, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd8, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x28, 0x00, 0x34, 0x00, 0x00, 0x01, 0x15, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x05, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x05, 0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0x16, 0x32, 0x36, 0x25, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x3a, 0x09, 0xb1, 0x82, 0x84, 0xb4, 0xfe, 0x8c, 0xff, 0x00, 0xfe, 0xfb, 0xfe, 0xa2, 0x12, 0x16, 0x9f, 0x86, 0x81, 0xb2, 0x01, 0x9c, 0x37, 0x22, 0x26, 0x36, 0x36, 0x26, 0x24, 0x35, 0xfd, 0x8b, 0x35, 0x4a, 0x34, 0x34, 0x4a, 0x35, 0x03, 0x81, 0xfe, 0x77, 0xfe, 0xe8, 0xfe, 0xe9, 0xfe, 0x76, 0x01, 0x8a, 0x01, 0x17, 0x01, 0x18, 0x01, 0x89, 0x02, 0xf8, 0x1a, 0x8e, 0xc1, 0xcf, 0x9a, 0x01, 0x16, 0x01, 0x98, 0xfe, 0x7b, 0xfe, 0xc9, 0xac, 0xb2, 0xc0, 0x9e, 0x29, 0x3a, 0x3a, 0x29, 0x2a, 0x3c, 0x3c, 0x2a, 0x2a, 0x3c, 0x3c, 0x2a, 0x29, 0x3a, 0x3c, 0x27, 0xfe, 0xca, 0xfe, 0x4c, 0x01, 0xb4, 0x01, 0x36, 0x01, 0x37, 0x01, 0xb7, 0xfe, 0x49, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x86, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd4, 0x12, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x01, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0c, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x85, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x0a, 0x00, 0x79, 0xff, 0xea, 0x05, 0xfb, 0x05, 0xe1, 0x00, 0x0c, 0x00, 0x40, 0x00, 0x46, 0x00, 0x4c, 0x00, 0x52, 0x00, 0x58, 0x00, 0x5e, 0x00, 0x64, 0x00, 0x6a, 0x00, 0x70, 0x00, 0x00, 0x00, 0x14, 0x17, 0x16, 0x33, 0x32, 0x36, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x05, 0x26, 0x34, 0x37, 0x33, 0x36, 0x37, 0x27, 0x36, 0x37, 0x17, 0x36, 0x37, 0x35, 0x36, 0x32, 0x17, 0x15, 0x16, 0x17, 0x37, 0x16, 0x17, 0x07, 0x16, 0x17, 0x33, 0x16, 0x14, 0x07, 0x23, 0x06, 0x07, 0x17, 0x06, 0x07, 0x27, 0x06, 0x07, 0x15, 0x06, 0x23, 0x27, 0x35, 0x26, 0x27, 0x07, 0x26, 0x27, 0x37, 0x26, 0x27, 0x01, 0x36, 0x37, 0x03, 0x06, 0x07, 0x05, 0x16, 0x17, 0x37, 0x26, 0x27, 0x01, 0x36, 0x37, 0x27, 0x06, 0x07, 0x25, 0x16, 0x17, 0x37, 0x26, 0x27, 0x01, 0x26, 0x27, 0x07, 0x16, 0x17, 0x25, 0x06, 0x07, 0x17, 0x36, 0x37, 0x05, 0x06, 0x07, 0x13, 0x36, 0x37, 0x25, 0x26, 0x27, 0x07, 0x16, 0x17, 0x02, 0xa8, 0x2c, 0x2a, 0x3c, 0x3c, 0x54, 0x2b, 0x2a, 0x3b, 0x3c, 0x2a, 0xfd, 0xbf, 0x19, 0x19, 0x65, 0x18, 0x60, 0x4c, 0x0e, 0x59, 0x4a, 0x6f, 0xaf, 0x23, 0x46, 0x24, 0xa4, 0x7c, 0x47, 0x5b, 0x10, 0x4d, 0x5f, 0x19, 0x65, 0x19, 0x19, 0x65, 0x12, 0x66, 0x4d, 0x10, 0x5b, 0x47, 0x7d, 0xa3, 0x24, 0x23, 0x46, 0xa3, 0x7c, 0x49, 0x57, 0x10, 0x49, 0x5d, 0x18, 0x01, 0xc8, 0x1e, 0x20, 0x0b, 0x80, 0x58, 0x01, 0x5a, 0x25, 0x1a, 0xa4, 0x5a, 0x7e, 0xfe, 0xd1, 0x07, 0x14, 0xb7, 0x44, 0x15, 0x02, 0xab, 0x16, 0x05, 0xf7, 0x11, 0x49, 0xfd, 0xad, 0x12, 0x09, 0xf5, 0x14, 0x44, 0x02, 0x6e, 0x07, 0x14, 0xb8, 0x4a, 0x0f, 0xfe, 0x9c, 0x1e, 0x21, 0x0b, 0x7e, 0x5a, 0xfe, 0xa5, 0x1a, 0x23, 0xa6, 0x5a, 0x7f, 0x03, 0x26, 0x84, 0x2f, 0x2f, 0x5e, 0x84, 0x30, 0x30, 0x30, 0xc3, 0x27, 0x4e, 0x27, 0xb7, 0x7c, 0x50, 0x5f, 0x10, 0x50, 0x66, 0x1e, 0x70, 0x1c, 0x1c, 0x70, 0x16, 0x6f, 0x51, 0x0f, 0x60, 0x51, 0x79, 0xb9, 0x27, 0x4e, 0x27, 0xb0, 0x83, 0x50, 0x5c, 0x0b, 0x51, 0x67, 0x1d, 0x70, 0x1c, 0x1c, 0x70, 0x17, 0x6d, 0x51, 0x0b, 0x5c, 0x50, 0x79, 0xba, 0x01, 0x2c, 0x13, 0x0a, 0x01, 0x0d, 0x16, 0x4d, 0xaa, 0x0a, 0x13, 0xc6, 0x4e, 0x15, 0xfe, 0x3e, 0x26, 0x1a, 0xab, 0x60, 0x82, 0x37, 0x1e, 0x22, 0x0a, 0x7f, 0x62, 0xfe, 0x4b, 0x1e, 0x2a, 0x11, 0x8c, 0x56, 0xf4, 0x26, 0x22, 0xac, 0x67, 0x7b, 0x89, 0x12, 0x0b, 0xfe, 0xf0, 0x1e, 0x4d, 0xa5, 0x09, 0x14, 0xc2, 0x4d, 0x1e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x07, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xd5, 0x20, 0x2e, 0xa4, 0x01, 0xd0, 0xa4, 0x2d, 0x21, 0x67, 0x1a, 0x23, 0x80, 0xfe, 0x94, 0x80, 0x23, 0x1a, 0x03, 0xfd, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xd9, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfd, 0x25, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x8d, 0x28, 0x2b, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x37, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xd5, 0x67, 0x1a, 0x23, 0x80, 0x01, 0x6c, 0x80, 0x23, 0x1a, 0x67, 0x21, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2e, 0x03, 0xfd, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xd9, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfd, 0xaa, 0x47, 0x2b, 0x27, 0x8e, 0x8e, 0x27, 0x2c, 0x48, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x00, 0x00, 0x00, 0x04, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x21, 0x00, 0x31, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x25, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x27, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x49, 0x35, 0x34, 0x4b, 0x4b, 0x68, 0x4a, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0x4e, 0x20, 0x2e, 0xa4, 0x01, 0xd0, 0xa4, 0x2d, 0x21, 0x67, 0x1a, 0x23, 0x80, 0xfe, 0x94, 0x80, 0x23, 0x1a, 0x03, 0xfd, 0x3a, 0x53, 0x52, 0x76, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0xfe, 0xb2, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x5b, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x8e, 0x27, 0x2b, 0x00, 0x0a, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0xd8, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x22, 0x00, 0x2a, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x41, 0x00, 0x49, 0x00, 0x58, 0x00, 0x00, 0x01, 0x33, 0x17, 0x11, 0x07, 0x23, 0x27, 0x11, 0x05, 0x17, 0x15, 0x07, 0x27, 0x25, 0x17, 0x07, 0x23, 0x26, 0x27, 0x35, 0x05, 0x32, 0x1f, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x01, 0x21, 0x17, 0x15, 0x07, 0x21, 0x27, 0x35, 0x25, 0x21, 0x17, 0x15, 0x07, 0x21, 0x27, 0x35, 0x03, 0x33, 0x16, 0x17, 0x15, 0x07, 0x27, 0x35, 0x25, 0x33, 0x17, 0x15, 0x07, 0x27, 0x35, 0x25, 0x33, 0x17, 0x11, 0x07, 0x23, 0x27, 0x11, 0x03, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x27, 0x26, 0x23, 0x22, 0x03, 0x1b, 0x46, 0x05, 0x05, 0x46, 0x06, 0x02, 0x00, 0x34, 0xdf, 0x37, 0xfd, 0x48, 0xe4, 0x38, 0x03, 0xb4, 0x28, 0x01, 0xf8, 0xc2, 0x53, 0x0b, 0xb0, 0x41, 0x2b, 0xa3, 0x5b, 0x21, 0xaa, 0x3f, 0xfd, 0x90, 0x01, 0x32, 0x05, 0x05, 0xfe, 0xce, 0x05, 0x04, 0x05, 0x01, 0x37, 0x06, 0x06, 0xfe, 0xc9, 0x06, 0x40, 0x03, 0x79, 0x66, 0x37, 0xdf, 0xfd, 0xef, 0x03, 0x35, 0xdf, 0x36, 0x01, 0xe5, 0x46, 0x05, 0x05, 0x46, 0x06, 0x20, 0x75, 0x16, 0x3e, 0x70, 0x1d, 0x2c, 0x79, 0x08, 0x39, 0x84, 0x23, 0x05, 0xd8, 0x06, 0xfe, 0xa1, 0x06, 0x06, 0x01, 0x5f, 0x9c, 0x3e, 0x03, 0xff, 0x3f, 0xee, 0xfe, 0x40, 0xc7, 0x37, 0x04, 0xb5, 0xe2, 0x60, 0xbd, 0x64, 0x18, 0xa8, 0x40, 0x5c, 0xb4, 0x68, 0x1b, 0xfe, 0xed, 0x06, 0x50, 0x06, 0x06, 0x50, 0x06, 0x06, 0x50, 0x06, 0x06, 0x50, 0xfe, 0xe7, 0x82, 0x79, 0x03, 0x3f, 0xfd, 0x04, 0x2b, 0x3c, 0x03, 0xfe, 0x3e, 0x04, 0x77, 0x06, 0xfe, 0xa1, 0x06, 0x06, 0x01, 0x5f, 0x02, 0x56, 0x47, 0x7b, 0x3f, 0x2c, 0x72, 0x11, 0x43, 0x82, 0x41, 0x9a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x93, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd7, 0x00, 0x17, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x20, 0x13, 0x16, 0x15, 0x10, 0x01, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x35, 0x36, 0x37, 0x36, 0x11, 0x10, 0x25, 0x26, 0x27, 0x35, 0x34, 0x37, 0x17, 0x15, 0x04, 0x11, 0x10, 0x05, 0x07, 0x15, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x10, 0x01, 0x26, 0x23, 0x03, 0x25, 0x01, 0x63, 0xf5, 0x5f, 0xfe, 0x9c, 0xa1, 0x9f, 0x2c, 0x2a, 0x49, 0xf9, 0x71, 0x8b, 0xfe, 0xd4, 0x7b, 0x53, 0x86, 0x24, 0x01, 0x9b, 0xfe, 0xd1, 0x27, 0x05, 0x4e, 0x8e, 0xd2, 0x4a, 0x1a, 0xfe, 0xc7, 0x92, 0x8f, 0x05, 0xd7, 0xfe, 0x87, 0xad, 0xc6, 0xfe, 0x78, 0xfe, 0xff, 0x62, 0x0f, 0x06, 0x4f, 0xb1, 0xca, 0x01, 0x0c, 0x01, 0x90, 0xe0, 0x50, 0x10, 0x03, 0x0b, 0x0e, 0x3e, 0x03, 0xc5, 0xfe, 0x14, 0xfe, 0x6e, 0xe8, 0x18, 0x04, 0x53, 0x98, 0xf4, 0x5d, 0x5d, 0x09, 0x01, 0x3d, 0x01, 0x05, 0x66, 0x00, 0x02, 0x00, 0x99, 0x00, 0x00, 0x03, 0xe2, 0x05, 0xd8, 0x00, 0x17, 0x00, 0x2b, 0x00, 0x00, 0x21, 0x20, 0x03, 0x26, 0x35, 0x10, 0x01, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x15, 0x06, 0x07, 0x06, 0x11, 0x10, 0x05, 0x16, 0x17, 0x15, 0x14, 0x07, 0x27, 0x35, 0x24, 0x11, 0x10, 0x25, 0x37, 0x35, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x1d, 0x01, 0x10, 0x01, 0x16, 0x33, 0x03, 0x51, 0xfe, 0x9c, 0xf5, 0x5f, 0x01, 0x64, 0xa1, 0xa0, 0x2c, 0x29, 0x48, 0xf8, 0x71, 0x8b, 0x01, 0x2d, 0x7a, 0x54, 0x86, 0x24, 0xfe, 0x64, 0x01, 0x2f, 0x27, 0x05, 0x4e, 0x8f, 0xd0, 0x4b, 0x19, 0x01, 0x37, 0x94, 0x8e, 0x01, 0x79, 0xad, 0xc6, 0x01, 0x88, 0x01, 0x01, 0x63, 0x0f, 0x07, 0x4f, 0xb1, 0xcb, 0xfe, 0xf5, 0xfe, 0x70, 0xe1, 0x4f, 0x10, 0x04, 0x0a, 0x0e, 0x3e, 0x03, 0xc5, 0x01, 0xed, 0x01, 0x91, 0xe8, 0x18, 0x03, 0x53, 0x96, 0xf5, 0x5c, 0x5e, 0x09, 0xfe, 0xc2, 0xfe, 0xfc, 0x66, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0x30, 0x03, 0xce, 0x05, 0xdb, 0x00, 0x31, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x15, 0x37, 0x15, 0x07, 0x15, 0x23, 0x27, 0x23, 0x35, 0x33, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x17, 0x33, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x07, 0x06, 0x07, 0x23, 0x06, 0x07, 0x06, 0x10, 0x16, 0x33, 0x32, 0x36, 0x10, 0x27, 0x26, 0x03, 0x12, 0x24, 0x20, 0x78, 0x77, 0x61, 0x81, 0xc3, 0xc6, 0x74, 0x01, 0xb5, 0xb5, 0x01, 0x85, 0x62, 0x77, 0x77, 0x21, 0x24, 0x24, 0x21, 0x77, 0x7f, 0x52, 0x4d, 0x69, 0x22, 0x69, 0x4c, 0x52, 0x80, 0x78, 0x20, 0xef, 0x22, 0x69, 0x4d, 0x52, 0xa5, 0x75, 0x72, 0xa5, 0x52, 0x4c, 0x04, 0x56, 0x1a, 0x24, 0x83, 0xbd, 0xbc, 0x7c, 0x64, 0x0e, 0xd1, 0x02, 0x64, 0x01, 0xca, 0xcb, 0x62, 0xd1, 0x0d, 0x65, 0x7c, 0xbc, 0xbd, 0x83, 0x24, 0x1a, 0x19, 0x25, 0x83, 0xbc, 0x08, 0x0a, 0x82, 0x5a, 0x53, 0x07, 0x07, 0x53, 0x5a, 0x82, 0x0a, 0x08, 0xbc, 0x83, 0x25, 0x5f, 0x06, 0x54, 0x59, 0xfe, 0xfc, 0xaa, 0xaa, 0x01, 0x04, 0x59, 0x54, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xfe, 0xff, 0x04, 0xa9, 0x05, 0xda, 0x00, 0x0b, 0x00, 0x23, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x01, 0x26, 0x35, 0x34, 0x00, 0x33, 0x32, 0x00, 0x10, 0x07, 0x06, 0x07, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x26, 0x02, 0xa3, 0x94, 0xcf, 0xcf, 0x94, 0x91, 0xd2, 0xd2, 0xfe, 0x02, 0x98, 0x01, 0x2e, 0xd7, 0xd4, 0x01, 0x31, 0x98, 0x7a, 0xa2, 0xf5, 0xf5, 0xa2, 0xf5, 0xf5, 0xa3, 0x05, 0x27, 0xe4, 0xa4, 0xa3, 0xd8, 0xd8, 0xa3, 0xa4, 0xe4, 0xfc, 0xed, 0x9d, 0xee, 0xef, 0x01, 0x4c, 0xfe, 0xb4, 0xfe, 0x22, 0x9c, 0x7e, 0x12, 0xfe, 0xf8, 0x7c, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0x09, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xff, 0xe3, 0x04, 0xa9, 0x06, 0xbe, 0x00, 0x0b, 0x00, 0x23, 0x00, 0x00, 0x25, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x01, 0x16, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x10, 0x37, 0x36, 0x37, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x16, 0x02, 0xa3, 0x94, 0xcf, 0xcf, 0x94, 0x91, 0xd2, 0xd2, 0x01, 0xfe, 0x98, 0xfe, 0xd2, 0xd7, 0xd4, 0xfe, 0xcf, 0x98, 0x7a, 0xa2, 0xf4, 0xf4, 0xa2, 0xf5, 0xf5, 0xa3, 0x96, 0xe4, 0xa4, 0xa3, 0xd8, 0xd8, 0xa3, 0xa4, 0xe4, 0x03, 0x13, 0x9d, 0xee, 0xef, 0xfe, 0xb4, 0x01, 0x4c, 0x01, 0xde, 0x9c, 0x7e, 0x12, 0x01, 0x08, 0x7c, 0x01, 0x01, 0xfe, 0xff, 0x7c, 0xfe, 0xf7, 0x11, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x91, 0xff, 0xe3, 0x05, 0xfb, 0x05, 0xc3, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x36, 0x10, 0x26, 0x13, 0x06, 0x23, 0x22, 0x00, 0x10, 0x00, 0x17, 0x16, 0x17, 0x01, 0x21, 0x37, 0x21, 0x11, 0x07, 0x11, 0x01, 0x16, 0x15, 0x14, 0x02, 0x97, 0x93, 0xd0, 0xd0, 0x93, 0x91, 0xd3, 0xd3, 0xe2, 0x97, 0xdc, 0xd3, 0xfe, 0xce, 0x01, 0x36, 0xcf, 0xcd, 0x65, 0x01, 0x45, 0xfe, 0xb2, 0x7e, 0x01, 0xbd, 0x81, 0xfe, 0xbe, 0x65, 0x03, 0x96, 0xe4, 0xfe, 0xb8, 0xd8, 0xd8, 0x01, 0x48, 0xe4, 0xfc, 0xf1, 0xa4, 0x01, 0x3d, 0x01, 0xdc, 0x01, 0x55, 0x09, 0x08, 0x67, 0x01, 0x5c, 0x8e, 0xfe, 0x14, 0x8f, 0x01, 0x75, 0xfe, 0xa4, 0x92, 0xc1, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x31, 0x00, 0x00, 0x05, 0x42, 0x05, 0xd8, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x35, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x14, 0x07, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x35, 0x02, 0xbf, 0x6e, 0x99, 0x98, 0x6f, 0x6d, 0x9a, 0x87, 0xe8, 0xa6, 0xa8, 0xe8, 0x62, 0xcd, 0x88, 0x88, 0xfc, 0x77, 0x02, 0x13, 0x01, 0xab, 0xf2, 0xab, 0xab, 0x79, 0x02, 0xb9, 0x01, 0x04, 0xfe, 0xfc, 0xb9, 0xa8, 0x7b, 0x03, 0xc5, 0xfa, 0x28, 0x01, 0x7c, 0x97, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x93, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd8, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x36, 0x33, 0x32, 0x12, 0x15, 0x14, 0x06, 0x1d, 0x01, 0x23, 0x34, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x01, 0xf3, 0x60, 0x60, 0x88, 0xa1, 0xa1, 0x64, 0x89, 0xa0, 0xd7, 0x7e, 0x87, 0x7e, 0x8b, 0x64, 0x63, 0x8b, 0x88, 0x04, 0x8d, 0x97, 0xb4, 0xb4, 0x97, 0xfe, 0x7d, 0x6d, 0xfe, 0xfe, 0xbb, 0x5a, 0xe5, 0x79, 0x02, 0x84, 0xee, 0x48, 0x7b, 0xa9, 0xaa, 0x7a, 0xfe, 0x46, 0x00, 0x00, 0x00, 0x02, 0x00, 0xdf, 0x00, 0x00, 0x05, 0x94, 0x05, 0xd8, 0x00, 0x0a, 0x00, 0x31, 0x00, 0x00, 0x00, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x16, 0x17, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x34, 0x37, 0x36, 0x37, 0x11, 0x21, 0x11, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x11, 0x21, 0x03, 0x6c, 0x65, 0x47, 0x47, 0x32, 0x32, 0x47, 0x34, 0x37, 0x2b, 0x44, 0x89, 0x62, 0x60, 0x8a, 0x45, 0x2a, 0x38, 0xfe, 0xfd, 0xfe, 0xec, 0x8c, 0x8c, 0x01, 0x14, 0x01, 0x03, 0x88, 0x01, 0x03, 0x01, 0x12, 0x89, 0x89, 0xfe, 0xee, 0xfe, 0xfd, 0x01, 0x8c, 0x4f, 0x37, 0x39, 0x4e, 0x4e, 0x39, 0x37, 0xc2, 0x12, 0x30, 0x4c, 0xd8, 0x99, 0x99, 0xd8, 0x4c, 0x31, 0x11, 0x01, 0x8c, 0xfe, 0x4b, 0x97, 0x02, 0xd3, 0x98, 0xfe, 0x4a, 0x01, 0xb6, 0xfe, 0x4a, 0x01, 0xb6, 0x98, 0xfd, 0x2d, 0x97, 0x01, 0xb5, 0x00, 0x01, 0x00, 0xea, 0x00, 0x00, 0x05, 0x8a, 0x05, 0xd8, 0x00, 0x3c, 0x00, 0x00, 0x25, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x26, 0x27, 0x26, 0x27, 0x35, 0x07, 0x27, 0x37, 0x33, 0x17, 0x15, 0x27, 0x15, 0x33, 0x15, 0x23, 0x16, 0x17, 0x16, 0x17, 0x11, 0x07, 0x27, 0x37, 0x33, 0x17, 0x15, 0x27, 0x11, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x35, 0x07, 0x27, 0x37, 0x33, 0x17, 0x15, 0x27, 0x15, 0x33, 0x15, 0x06, 0x07, 0x06, 0x07, 0x15, 0x33, 0x15, 0x03, 0x7f, 0x88, 0x9f, 0x9f, 0x95, 0x6e, 0x87, 0x01, 0x81, 0x01, 0x82, 0x89, 0x82, 0x82, 0x02, 0x02, 0x01, 0x5e, 0x46, 0x5d, 0x83, 0x01, 0x84, 0x88, 0x82, 0x82, 0x5b, 0x45, 0x5f, 0x01, 0x81, 0x01, 0x82, 0x89, 0x82, 0x82, 0x01, 0x01, 0x87, 0x6e, 0x94, 0x9d, 0xbb, 0xbb, 0xbb, 0x97, 0x8b, 0x16, 0x7a, 0x96, 0xd7, 0x54, 0x8e, 0x8c, 0x99, 0x99, 0x8c, 0x8e, 0x54, 0x02, 0x97, 0x68, 0x4f, 0x14, 0x02, 0xca, 0x8d, 0x8b, 0x9a, 0x9a, 0x8b, 0x8d, 0xfd, 0x37, 0x14, 0x4e, 0x6a, 0x96, 0x01, 0x59, 0x8e, 0x8c, 0x99, 0x99, 0x8c, 0x8e, 0x59, 0x04, 0xd3, 0x96, 0x79, 0x17, 0x8b, 0x97, 0x00, 0x00, 0x00, 0x02, 0x01, 0xba, 0x00, 0x00, 0x04, 0xb9, 0x05, 0xd8, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x21, 0x20, 0x17, 0x16, 0x15, 0x10, 0x07, 0x06, 0x23, 0x21, 0x11, 0x21, 0x17, 0x15, 0x07, 0x21, 0x27, 0x11, 0x17, 0x11, 0x21, 0x32, 0x37, 0x36, 0x37, 0x34, 0x27, 0x26, 0x23, 0x01, 0xc2, 0x01, 0x70, 0x01, 0x10, 0x5a, 0x1d, 0xe2, 0x35, 0x31, 0xfe, 0xcc, 0x02, 0x3b, 0x07, 0x07, 0xfd, 0x4a, 0x07, 0x82, 0x01, 0x26, 0x75, 0x40, 0x0f, 0x07, 0x92, 0x21, 0x49, 0x05, 0xd8, 0xd0, 0x4d, 0x5f, 0xfe, 0xf6, 0x5c, 0x11, 0xfd, 0xad, 0x08, 0x82, 0x08, 0x08, 0x05, 0xc7, 0x83, 0xfe, 0x24, 0x82, 0x1a, 0x50, 0xa4, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x53, 0x00, 0x00, 0x06, 0x20, 0x05, 0xda, 0x00, 0x24, 0x00, 0x00, 0x21, 0x10, 0x00, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x23, 0x26, 0x35, 0x34, 0x36, 0x33, 0x20, 0x13, 0x16, 0x17, 0x36, 0x37, 0x12, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x23, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x00, 0x11, 0x03, 0x01, 0xfe, 0xfe, 0x98, 0x74, 0x1f, 0x4c, 0x79, 0x53, 0x92, 0x84, 0x01, 0x4f, 0x75, 0x08, 0x04, 0x04, 0x07, 0x77, 0x01, 0x4e, 0x84, 0x92, 0x54, 0x78, 0x4c, 0x1f, 0x75, 0x97, 0xfe, 0xff, 0x02, 0x58, 0x03, 0x05, 0xc5, 0x22, 0x80, 0x80, 0x84, 0xa1, 0x84, 0xbb, 0xfc, 0xfb, 0x31, 0x28, 0x28, 0x31, 0x03, 0x05, 0xbb, 0x84, 0xa1, 0x84, 0x80, 0x81, 0x22, 0xc4, 0xfc, 0xfb, 0xfd, 0xa8, 0x00, 0x00, 0x02, 0x00, 0xa4, 0x00, 0x00, 0x05, 0xd0, 0x05, 0xd8, 0x00, 0x08, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x22, 0x06, 0x10, 0x16, 0x20, 0x36, 0x10, 0x26, 0x27, 0x36, 0x37, 0x3e, 0x02, 0x33, 0x15, 0x22, 0x02, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x02, 0x23, 0x35, 0x32, 0x1e, 0x01, 0x17, 0x16, 0x03, 0x39, 0x84, 0xb9, 0xb9, 0x01, 0x09, 0xba, 0xb9, 0x86, 0x76, 0x45, 0x4d, 0x57, 0x91, 0xa7, 0x6f, 0x96, 0x76, 0x13, 0x15, 0x2a, 0x26, 0x84, 0xfe, 0xf6, 0xbe, 0xbb, 0xfe, 0xf6, 0x85, 0x25, 0x2b, 0x16, 0x13, 0x74, 0x9a, 0x6d, 0xa6, 0xa8, 0x40, 0x4d, 0x45, 0x03, 0x5c, 0xcf, 0xfe, 0xda, 0xce, 0xce, 0x01, 0x26, 0xcf, 0x96, 0x05, 0x3d, 0x42, 0xb4, 0xae, 0x6c, 0xfe, 0xc8, 0x6c, 0x13, 0x0f, 0x1e, 0x29, 0x95, 0xd2, 0xd1, 0xfe, 0xd9, 0x01, 0x27, 0xd1, 0xd2, 0x95, 0x2a, 0x1e, 0x0e, 0x13, 0x6c, 0x01, 0x38, 0x6c, 0xae, 0xb4, 0x42, 0x3d, 0x00, 0x00, 0x02, 0x00, 0xac, 0x00, 0x00, 0x05, 0xc6, 0x05, 0xda, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x26, 0x27, 0x35, 0x04, 0x20, 0x25, 0x15, 0x06, 0x07, 0x11, 0x16, 0x17, 0x15, 0x24, 0x20, 0x05, 0x35, 0x36, 0x3f, 0x01, 0x36, 0x33, 0x17, 0x11, 0x06, 0x23, 0x27, 0x01, 0xdd, 0x97, 0x99, 0x01, 0x38, 0x02, 0xac, 0x01, 0x35, 0x9f, 0x95, 0x95, 0x9f, 0xfe, 0xcb, 0xfd, 0x54, 0xfe, 0xc8, 0x99, 0x97, 0x89, 0x68, 0x6a, 0xd1, 0x68, 0x69, 0xd2, 0x04, 0xfc, 0x16, 0x34, 0x94, 0x5a, 0x5a, 0x97, 0x2f, 0x18, 0xfb, 0xe2, 0x17, 0x2f, 0x98, 0x5b, 0x5b, 0x94, 0x35, 0x15, 0x0c, 0x0d, 0x0d, 0x04, 0x07, 0x0d, 0x0d, 0x00, 0x04, 0x00, 0xcf, 0x00, 0x40, 0x05, 0xa5, 0x05, 0x6f, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x26, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x22, 0x06, 0x14, 0x16, 0x33, 0x32, 0x36, 0x34, 0x01, 0x2c, 0x01, 0x27, 0x35, 0x16, 0x04, 0x33, 0x32, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x10, 0x07, 0x0e, 0x01, 0x01, 0x32, 0x36, 0x34, 0x26, 0x22, 0x06, 0x14, 0x16, 0x01, 0x0c, 0x01, 0x17, 0x15, 0x26, 0x24, 0x23, 0x22, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x3e, 0x01, 0x04, 0xbb, 0xab, 0x76, 0x76, 0x56, 0x54, 0x78, 0xfe, 0x88, 0xfe, 0xe7, 0xfe, 0xb9, 0x8a, 0xe4, 0x01, 0x47, 0x35, 0x75, 0x07, 0x76, 0xb9, 0x84, 0x86, 0xb9, 0x5d, 0x42, 0xdd, 0xfd, 0xe6, 0x55, 0x78, 0x78, 0xa9, 0x79, 0x78, 0x01, 0x01, 0x01, 0x19, 0x01, 0x48, 0x89, 0xe3, 0xfe, 0xba, 0x34, 0x78, 0x07, 0x76, 0xb8, 0x85, 0x86, 0xb9, 0x5e, 0x41, 0xdd, 0x02, 0xb8, 0x84, 0xbe, 0x85, 0x85, 0xbe, 0xfe, 0x0c, 0x02, 0x28, 0x2b, 0x7c, 0x54, 0x16, 0x1a, 0x6c, 0xa7, 0x93, 0xcf, 0xcf, 0xfe, 0xda, 0x67, 0x4d, 0x4c, 0x02, 0xb6, 0x84, 0xbe, 0x84, 0x84, 0xbe, 0x84, 0x02, 0x78, 0x02, 0x29, 0x2b, 0x7b, 0x54, 0x15, 0x1a, 0x6c, 0xa6, 0x94, 0xcf, 0xcf, 0x94, 0x92, 0x67, 0x4d, 0x4d, 0x00, 0x02, 0x01, 0x01, 0x00, 0x00, 0x05, 0x73, 0x05, 0xd8, 0x00, 0x13, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x00, 0x15, 0x16, 0x17, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x00, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x32, 0x35, 0x34, 0x26, 0x02, 0x52, 0x44, 0x2c, 0x0c, 0x1a, 0x66, 0x23, 0x20, 0x20, 0x43, 0x2c, 0x0c, 0x1b, 0x64, 0x23, 0x20, 0x2b, 0xc9, 0xa2, 0x9a, 0xc4, 0xfe, 0xfc, 0x03, 0x79, 0x40, 0x5a, 0x3a, 0x72, 0x64, 0x59, 0x82, 0x01, 0x03, 0x94, 0x77, 0x72, 0x87, 0x29, 0x17, 0x21, 0x08, 0x1d, 0x2e, 0x68, 0x32, 0x33, 0x36, 0x9b, 0x2b, 0x14, 0x19, 0x2e, 0x69, 0x31, 0x32, 0x44, 0x43, 0x07, 0x45, 0x01, 0x8c, 0x1d, 0x71, 0x27, 0x23, 0x23, 0x4b, 0x32, 0x0e, 0x1e, 0x6f, 0x27, 0x23, 0x24, 0x4c, 0x31, 0x02, 0xf0, 0xa1, 0xc9, 0xdd, 0xb0, 0xbb, 0xfe, 0x0a, 0xb4, 0x7c, 0x03, 0x58, 0x48, 0x77, 0x79, 0x6f, 0xc7, 0x01, 0xe1, 0xc2, 0x86, 0xa5, 0x9b, 0x81, 0x3c, 0x91, 0x3e, 0x62, 0x80, 0x11, 0x57, 0x44, 0x73, 0x2d, 0x16, 0x4b, 0x78, 0x36, 0x38, 0x3c, 0x3c, 0x72, 0x2e, 0x15, 0x29, 0x0d, 0x1a, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x62, 0xfe, 0x8f, 0x06, 0x12, 0x05, 0xd8, 0x00, 0x3a, 0x00, 0x44, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x11, 0x10, 0x01, 0x16, 0x17, 0x23, 0x26, 0x27, 0x06, 0x07, 0x35, 0x36, 0x37, 0x27, 0x11, 0x34, 0x35, 0x10, 0x27, 0x0e, 0x01, 0x07, 0x11, 0x23, 0x11, 0x10, 0x26, 0x2b, 0x02, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x16, 0x17, 0x3e, 0x01, 0x01, 0x11, 0x36, 0x13, 0x34, 0x26, 0x2b, 0x01, 0x22, 0x06, 0x02, 0x64, 0x39, 0x6b, 0x24, 0xb2, 0x44, 0x37, 0x4a, 0x2b, 0x76, 0x3d, 0x36, 0x5a, 0xfe, 0xa9, 0x01, 0x84, 0x97, 0x2a, 0x42, 0x97, 0x9d, 0xac, 0x6f, 0x08, 0x29, 0x34, 0x78, 0x39, 0x88, 0x1c, 0x1f, 0x01, 0x01, 0x25, 0xa1, 0x11, 0x86, 0x89, 0x80, 0x6a, 0x20, 0x15, 0xa5, 0x02, 0x7d, 0xe8, 0x16, 0x29, 0x19, 0x03, 0x1b, 0x81, 0x05, 0xd8, 0xc6, 0x80, 0x77, 0xcf, 0xa7, 0xdb, 0xca, 0x7d, 0x77, 0xe8, 0xfe, 0xef, 0xfe, 0x68, 0xfe, 0xbf, 0x5e, 0xc1, 0x29, 0xa1, 0x65, 0x07, 0x74, 0x1c, 0x57, 0xd9, 0x03, 0x57, 0x12, 0x11, 0x01, 0x19, 0x01, 0x01, 0xd9, 0xc8, 0xfc, 0x61, 0x03, 0x9a, 0x01, 0x41, 0x6a, 0xe2, 0xd7, 0xfc, 0x74, 0x04, 0x41, 0xbe, 0xbf, 0x4f, 0xb0, 0x5d, 0xbc, 0xfc, 0x92, 0xfd, 0xd0, 0xfa, 0x01, 0x52, 0xc1, 0x8b, 0xce, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x99, 0x00, 0x6b, 0x05, 0xdb, 0x05, 0x39, 0x00, 0x03, 0x00, 0x23, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x21, 0x35, 0x21, 0x26, 0x35, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x14, 0x07, 0x21, 0x15, 0x21, 0x35, 0x23, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x9a, 0x05, 0x40, 0xfa, 0xc0, 0x01, 0xf5, 0xfe, 0x0b, 0x01, 0x3e, 0x3c, 0xe8, 0xa6, 0xa7, 0xe9, 0x3d, 0x01, 0x5d, 0xfd, 0xeb, 0x01, 0x10, 0x0f, 0x4e, 0x99, 0xdc, 0x99, 0x4d, 0x0e, 0x11, 0x01, 0x03, 0x98, 0x01, 0x8f, 0x98, 0x68, 0x83, 0xb9, 0x01, 0x03, 0xfe, 0xfd, 0xb9, 0x83, 0x68, 0x98, 0x98, 0x0d, 0x11, 0x55, 0x79, 0x7a, 0xaa, 0xaa, 0x7a, 0x79, 0x55, 0x11, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3e, 0xff, 0x3c, 0x06, 0x38, 0x05, 0xd8, 0x00, 0x38, 0x00, 0x00, 0x01, 0x14, 0x16, 0x17, 0x33, 0x35, 0x33, 0x17, 0x07, 0x27, 0x35, 0x23, 0x22, 0x27, 0x26, 0x27, 0x03, 0x34, 0x35, 0x10, 0x27, 0x0e, 0x01, 0x07, 0x11, 0x23, 0x11, 0x10, 0x26, 0x2b, 0x02, 0x22, 0x06, 0x07, 0x11, 0x23, 0x11, 0x34, 0x27, 0x33, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x13, 0x04, 0x80, 0x5d, 0x50, 0x50, 0x03, 0xb7, 0xb7, 0x03, 0x50, 0xb7, 0x3d, 0x28, 0x07, 0x13, 0x29, 0x34, 0x78, 0x39, 0x88, 0x1c, 0x1f, 0x01, 0x01, 0x25, 0xa1, 0x11, 0x86, 0x89, 0x80, 0x6a, 0x20, 0x15, 0xa5, 0x3e, 0x39, 0x6b, 0x24, 0xb2, 0x44, 0x37, 0x4a, 0x01, 0x01, 0x0f, 0x6f, 0x7d, 0x01, 0x76, 0xad, 0xaf, 0x04, 0x76, 0x78, 0x4a, 0x76, 0x03, 0x16, 0x12, 0x11, 0x01, 0x19, 0x01, 0x01, 0xd9, 0xc8, 0xfc, 0x61, 0x03, 0x9a, 0x01, 0x41, 0x6a, 0xe2, 0xd7, 0xfc, 0x74, 0x04, 0x41, 0xbe, 0xbf, 0x4f, 0xb0, 0x5d, 0xbc, 0xc6, 0x80, 0x77, 0xcf, 0xa7, 0xdb, 0xca, 0xfd, 0x84, 0x00, 0x01, 0x00, 0x98, 0xff, 0xff, 0x05, 0xdc, 0x05, 0xd8, 0x00, 0x14, 0x00, 0x00, 0x01, 0x11, 0x09, 0x01, 0x07, 0x09, 0x01, 0x2f, 0x02, 0x09, 0x01, 0x3f, 0x02, 0x09, 0x01, 0x21, 0x35, 0x21, 0x11, 0x05, 0x53, 0xfd, 0x85, 0x01, 0x1d, 0x61, 0xfe, 0xe3, 0xfe, 0x82, 0x01, 0x5f, 0x01, 0x01, 0x7e, 0xfe, 0xe2, 0x01, 0x60, 0x01, 0x01, 0x1d, 0x02, 0x7a, 0xfe, 0x37, 0x02, 0xb3, 0x02, 0xd8, 0x01, 0xfc, 0xfd, 0x3f, 0xfe, 0xc3, 0x6c, 0x01, 0x3d, 0xfe, 0x58, 0x01, 0x6a, 0x01, 0x01, 0xa8, 0x01, 0x3d, 0x01, 0x6a, 0x01, 0xfe, 0xc3, 0x02, 0xc1, 0x98, 0xfd, 0x00, 0x00, 0x02, 0x00, 0xac, 0x00, 0x00, 0x05, 0xc6, 0x05, 0xd8, 0x00, 0x29, 0x00, 0x31, 0x00, 0x00, 0x01, 0x32, 0x12, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x0e, 0x01, 0x07, 0x23, 0x35, 0x37, 0x36, 0x13, 0x26, 0x02, 0x23, 0x22, 0x02, 0x15, 0x14, 0x15, 0x07, 0x34, 0x02, 0x27, 0x35, 0x32, 0x16, 0x13, 0x36, 0x37, 0x3e, 0x01, 0x01, 0x16, 0x33, 0x32, 0x37, 0x26, 0x27, 0x22, 0x02, 0xfe, 0x60, 0x49, 0x17, 0x62, 0xaf, 0x6d, 0x8a, 0x81, 0x80, 0x8b, 0x6e, 0x28, 0x71, 0x7c, 0x97, 0x8a, 0x6e, 0x5e, 0x2c, 0x3a, 0x34, 0x21, 0x8a, 0x8f, 0x7e, 0x77, 0x84, 0x91, 0x24, 0x29, 0x29, 0x25, 0x6e, 0x01, 0x34, 0x54, 0x75, 0x91, 0x08, 0x06, 0x8f, 0x89, 0x05, 0xd8, 0xfc, 0x9e, 0x04, 0xdd, 0xbe, 0x67, 0x91, 0xab, 0x85, 0xa0, 0xd7, 0x04, 0x76, 0x01, 0x04, 0x01, 0x78, 0x10, 0x03, 0x15, 0xfe, 0x2d, 0xc3, 0x0f, 0x0e, 0x02, 0xfd, 0x01, 0xf0, 0x06, 0x61, 0xde, 0xfe, 0xed, 0xc9, 0x58, 0x5b, 0x96, 0xfc, 0x26, 0x91, 0xc5, 0x9d, 0x13, 0x00, 0x02, 0x00, 0x9e, 0x01, 0x39, 0x05, 0xd6, 0x04, 0xa2, 0x00, 0x27, 0x00, 0x51, 0x00, 0x00, 0x13, 0x00, 0x33, 0x32, 0x17, 0x16, 0x32, 0x36, 0x33, 0x32, 0x17, 0x16, 0x32, 0x37, 0x36, 0x33, 0x32, 0x13, 0x07, 0x26, 0x23, 0x22, 0x07, 0x06, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x06, 0x23, 0x27, 0x11, 0x00, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x13, 0x07, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x22, 0x06, 0x23, 0x27, 0x9e, 0x01, 0x25, 0x67, 0x29, 0x0c, 0x15, 0x65, 0x9b, 0x32, 0x31, 0x15, 0x18, 0x66, 0x4e, 0x26, 0x25, 0x70, 0x62, 0x55, 0x38, 0x56, 0x2e, 0x36, 0x4d, 0x65, 0x16, 0x1a, 0x35, 0x31, 0x4b, 0x4e, 0x32, 0x32, 0x17, 0x15, 0x31, 0x31, 0xe8, 0x05, 0x30, 0x01, 0x24, 0x68, 0x28, 0x0d, 0x15, 0x33, 0x31, 0x4e, 0x4e, 0x63, 0x15, 0x18, 0x32, 0x34, 0x4d, 0x27, 0x24, 0x71, 0x62, 0x55, 0x38, 0x56, 0x2e, 0x36, 0x4e, 0x31, 0x33, 0x17, 0x19, 0x35, 0x31, 0x4c, 0x4d, 0x33, 0x31, 0x17, 0x15, 0x63, 0xe7, 0x05, 0x30, 0x01, 0x9d, 0x01, 0x0f, 0x28, 0x47, 0x8e, 0x47, 0x47, 0x47, 0x24, 0xfe, 0xc4, 0x33, 0xb9, 0x35, 0x4c, 0x4b, 0x4e, 0x43, 0x47, 0x48, 0x46, 0xd5, 0x62, 0x01, 0xd9, 0x01, 0x0d, 0x27, 0x46, 0x46, 0x48, 0x48, 0x46, 0x46, 0x23, 0xfe, 0xc5, 0x32, 0xb9, 0x36, 0x4d, 0x4c, 0x4e, 0x44, 0x47, 0x48, 0x48, 0xd5, 0x61, 0x00, 0x01, 0x01, 0x20, 0x00, 0x00, 0x05, 0x53, 0x05, 0xd8, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x07, 0x02, 0x03, 0x07, 0x00, 0x13, 0x21, 0x35, 0x21, 0x02, 0x01, 0x17, 0x12, 0x13, 0x33, 0x12, 0x13, 0x37, 0x00, 0x03, 0x21, 0x07, 0x21, 0x12, 0x01, 0x27, 0x02, 0x03, 0x03, 0xa6, 0xd9, 0x1d, 0xfa, 0x94, 0x01, 0x14, 0x18, 0xfe, 0xf6, 0x01, 0x0a, 0x19, 0xfe, 0xec, 0x95, 0xfa, 0x1d, 0xda, 0x1c, 0xfb, 0x95, 0xfe, 0xeb, 0x18, 0x01, 0x0a, 0x01, 0xfe, 0xf5, 0x1a, 0x01, 0x15, 0x96, 0xfb, 0x1c, 0x02, 0x99, 0x03, 0xfe, 0xae, 0xfe, 0xbf, 0x03, 0x01, 0x5f, 0x01, 0x37, 0xac, 0x01, 0x36, 0x01, 0x60, 0x03, 0xfe, 0xc0, 0xfe, 0xad, 0x01, 0x53, 0x01, 0x40, 0x03, 0xfe, 0xa0, 0xfe, 0xca, 0xac, 0xfe, 0xc9, 0xfe, 0xa1, 0x03, 0x01, 0x41, 0x01, 0x52, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xc0, 0x05, 0xd8, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x24, 0x00, 0x54, 0x00, 0x64, 0x00, 0x00, 0x01, 0x36, 0x37, 0x26, 0x27, 0x26, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x21, 0x33, 0x21, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x07, 0x16, 0x17, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x16, 0x17, 0x1e, 0x01, 0x1d, 0x01, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x01, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x02, 0xfb, 0x01, 0x02, 0x20, 0x2e, 0x42, 0x8c, 0x85, 0x4b, 0x49, 0x43, 0x14, 0x14, 0x01, 0x35, 0x7f, 0x01, 0x34, 0x16, 0x13, 0x43, 0x49, 0x4b, 0x84, 0x47, 0x46, 0x42, 0x2f, 0x1f, 0x02, 0x01, 0xfe, 0x6c, 0x02, 0xa9, 0xfd, 0x0d, 0x26, 0x22, 0x3e, 0x61, 0x63, 0xb2, 0x5e, 0x48, 0x44, 0x20, 0x1d, 0x0c, 0x0e, 0x61, 0x61, 0x5f, 0x61, 0x61, 0x0e, 0x0c, 0x1c, 0x21, 0x45, 0x47, 0x5d, 0xb2, 0x64, 0x62, 0x3d, 0x23, 0x25, 0xfe, 0x0d, 0x17, 0x29, 0x14, 0x16, 0x28, 0x16, 0x16, 0x28, 0x16, 0x14, 0x29, 0x17, 0x03, 0xc7, 0x03, 0x03, 0x2b, 0x1c, 0x29, 0x51, 0x95, 0x50, 0x51, 0x92, 0x28, 0x0e, 0x08, 0x08, 0x0e, 0x28, 0x92, 0x51, 0x50, 0x95, 0x51, 0x29, 0x1c, 0x2b, 0x03, 0x03, 0xfd, 0xb8, 0xfe, 0xd1, 0x01, 0x2f, 0xfe, 0x81, 0x01, 0x7f, 0x0d, 0x16, 0x36, 0xc4, 0x6b, 0x6c, 0xc5, 0x6a, 0x1f, 0x02, 0x24, 0x3f, 0x12, 0x07, 0x04, 0x36, 0x46, 0x57, 0x57, 0x46, 0x36, 0x04, 0x07, 0x12, 0x3f, 0x24, 0x02, 0x1f, 0x6a, 0xc5, 0x6c, 0x6b, 0xc4, 0x36, 0x16, 0x0d, 0xfe, 0x81, 0x04, 0x7d, 0x19, 0x2b, 0x19, 0x19, 0x2b, 0x19, 0x18, 0x2d, 0x17, 0x17, 0x2d, 0x00, 0x00, 0x08, 0x00, 0xcb, 0x00, 0x00, 0x05, 0xa9, 0x05, 0xd8, 0x00, 0x48, 0x00, 0x4e, 0x00, 0x52, 0x00, 0x68, 0x00, 0x7c, 0x00, 0x90, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0x00, 0x01, 0x26, 0x27, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x13, 0x03, 0x22, 0x27, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x1b, 0x01, 0x26, 0x27, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x1b, 0x01, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x03, 0x13, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x23, 0x03, 0x11, 0x21, 0x11, 0x01, 0x35, 0x07, 0x21, 0x27, 0x1d, 0x02, 0x21, 0x35, 0x01, 0x17, 0x03, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x01, 0x17, 0x03, 0x36, 0x37, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x01, 0x37, 0x13, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x14, 0x16, 0x17, 0x16, 0x17, 0x01, 0x33, 0x03, 0x32, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x01, 0x37, 0x13, 0x16, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x01, 0x2c, 0x56, 0x0b, 0x1b, 0x30, 0x1a, 0x19, 0x31, 0x19, 0x03, 0x34, 0xd7, 0x2e, 0x4b, 0x10, 0x1a, 0x30, 0x1b, 0x1a, 0x2f, 0x1a, 0x01, 0x2a, 0xaa, 0x27, 0x3c, 0x02, 0x1b, 0x30, 0x18, 0x1a, 0x30, 0x1b, 0x03, 0x3c, 0x22, 0xa6, 0x29, 0x1a, 0x31, 0x18, 0x1b, 0x31, 0x1a, 0x0a, 0x4e, 0x52, 0xe7, 0x27, 0x1a, 0x30, 0x19, 0x1b, 0x30, 0x1a, 0x0c, 0x59, 0x90, 0xfc, 0xf9, 0x02, 0xd4, 0xa3, 0xfe, 0xb9, 0xa4, 0x02, 0x8e, 0xfd, 0x4c, 0x45, 0xd0, 0x06, 0x07, 0x10, 0x12, 0x12, 0x1f, 0x12, 0x11, 0x1f, 0x13, 0x12, 0x20, 0x11, 0x06, 0x08, 0x01, 0x17, 0x7a, 0xa8, 0x05, 0x05, 0x0f, 0x11, 0x11, 0x20, 0x10, 0x12, 0x1f, 0x12, 0x11, 0x20, 0x12, 0x06, 0x07, 0x01, 0x82, 0x68, 0x56, 0x05, 0x04, 0x11, 0x21, 0x12, 0x13, 0x20, 0x11, 0x10, 0x20, 0x12, 0x12, 0x10, 0x07, 0x06, 0xfe, 0xbe, 0x5a, 0x2b, 0x11, 0x0e, 0x10, 0x13, 0x14, 0x1f, 0x11, 0x10, 0x22, 0x11, 0x11, 0x12, 0x0c, 0x0e, 0x01, 0x0b, 0x5e, 0x95, 0x0a, 0x0a, 0x11, 0x1f, 0x12, 0x12, 0x1f, 0x11, 0x12, 0x20, 0x11, 0x11, 0x10, 0x04, 0x03, 0x03, 0xfb, 0x02, 0x5f, 0x1c, 0x33, 0x1c, 0x1c, 0x33, 0x1c, 0x40, 0x16, 0xfe, 0x06, 0x02, 0xbe, 0x5d, 0x1c, 0x32, 0x1c, 0x1c, 0x32, 0x1c, 0x2d, 0x22, 0xfd, 0x14, 0x03, 0x34, 0x1e, 0x30, 0x1c, 0x34, 0x1a, 0x1a, 0x34, 0x1c, 0x36, 0x18, 0xfc, 0xca, 0x02, 0xe4, 0x2f, 0x2a, 0x1b, 0x33, 0x1c, 0x1c, 0x33, 0x1b, 0x55, 0x10, 0xfd, 0x4a, 0x02, 0x03, 0x22, 0x2b, 0x1c, 0x33, 0x1b, 0x1b, 0x33, 0x1c, 0x5e, 0xfe, 0x31, 0xfd, 0xd1, 0x02, 0x2f, 0xfe, 0xdf, 0xe1, 0x4b, 0x3d, 0xd3, 0x30, 0xa4, 0xa4, 0x01, 0x54, 0x2a, 0x02, 0x0e, 0x03, 0x04, 0x0a, 0x23, 0x13, 0x14, 0x23, 0x14, 0x14, 0x23, 0x14, 0x13, 0x23, 0x14, 0x01, 0xfd, 0xf8, 0x20, 0x02, 0xf9, 0x02, 0x03, 0x0a, 0x23, 0x26, 0x24, 0x13, 0x13, 0x24, 0x26, 0x23, 0x14, 0x01, 0xfd, 0x13, 0x1b, 0x02, 0xd1, 0x01, 0x14, 0x23, 0x26, 0x24, 0x13, 0x13, 0x24, 0x26, 0x23, 0x0a, 0x05, 0x02, 0xfd, 0x0a, 0x03, 0x42, 0x0a, 0x0a, 0x23, 0x14, 0x13, 0x23, 0x14, 0x14, 0x23, 0x13, 0x14, 0x23, 0x0a, 0x08, 0x02, 0xfc, 0xda, 0x2a, 0x01, 0xea, 0x03, 0x15, 0x22, 0x14, 0x13, 0x24, 0x13, 0x13, 0x24, 0x13, 0x14, 0x22, 0x0b, 0x02, 0x02, 0x00, 0x00, 0x00, 0x05, 0x01, 0x32, 0xff, 0xfe, 0x05, 0x41, 0x05, 0xd6, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x27, 0x00, 0x2d, 0x00, 0x32, 0x00, 0x00, 0x01, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x23, 0x15, 0x07, 0x11, 0x17, 0x15, 0x33, 0x15, 0x21, 0x35, 0x33, 0x35, 0x37, 0x33, 0x11, 0x23, 0x27, 0x35, 0x23, 0x35, 0x33, 0x15, 0x33, 0x01, 0x35, 0x21, 0x15, 0x01, 0x37, 0x35, 0x21, 0x15, 0x17, 0x11, 0x07, 0x15, 0x21, 0x35, 0x27, 0x35, 0x11, 0x37, 0x21, 0x11, 0x02, 0xba, 0xfa, 0x9a, 0xf3, 0x68, 0x53, 0x53, 0x68, 0xfb, 0xf2, 0x67, 0x54, 0x01, 0x01, 0x54, 0x67, 0xee, 0x99, 0x02, 0x55, 0xfc, 0x56, 0x02, 0xf6, 0x4a, 0xfd, 0x2b, 0x49, 0x41, 0x02, 0xc5, 0x43, 0x01, 0xfd, 0xbe, 0x05, 0xd6, 0x9b, 0x9b, 0xa2, 0x90, 0x96, 0xfd, 0xb7, 0x95, 0x8f, 0xa3, 0xa3, 0x8f, 0x98, 0x02, 0x45, 0x97, 0x90, 0xa2, 0x9b, 0xfa, 0xfb, 0x37, 0x37, 0x03, 0xea, 0x83, 0x5f, 0x5f, 0x83, 0xfd, 0x76, 0x74, 0x80, 0x80, 0x74, 0x34, 0x02, 0x21, 0x02, 0xfd, 0xdd, 0x00, 0x04, 0x01, 0x8a, 0x00, 0x00, 0x04, 0xeb, 0x05, 0xd8, 0x00, 0x37, 0x00, 0x43, 0x00, 0x51, 0x00, 0x5e, 0x00, 0x00, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x35, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x13, 0x21, 0x1b, 0x01, 0x35, 0x33, 0x35, 0x23, 0x35, 0x23, 0x15, 0x23, 0x15, 0x33, 0x15, 0x13, 0x36, 0x35, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x03, 0x21, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x02, 0x84, 0x1c, 0x1c, 0x08, 0x0a, 0x36, 0x21, 0x25, 0x01, 0x01, 0x25, 0x27, 0x46, 0x19, 0x1b, 0x17, 0x0f, 0x14, 0x28, 0x46, 0x26, 0x25, 0x46, 0x29, 0x13, 0x0f, 0x17, 0x19, 0x1a, 0x46, 0x27, 0x26, 0x01, 0x01, 0x26, 0x21, 0x34, 0x0a, 0x07, 0x1c, 0x1d, 0x02, 0x02, 0xfe, 0xfc, 0xa0, 0xf4, 0xf1, 0x9b, 0x9b, 0x6a, 0x9b, 0x9b, 0x92, 0x36, 0x29, 0x45, 0x4b, 0x46, 0x28, 0x38, 0xc7, 0x02, 0x49, 0xfe, 0x76, 0x1a, 0x30, 0x34, 0x31, 0x1a, 0x1b, 0x31, 0x19, 0x1a, 0x2f, 0x01, 0x94, 0x35, 0x39, 0x3c, 0x35, 0x11, 0x0e, 0x26, 0x3f, 0x48, 0x50, 0x04, 0x50, 0x49, 0x4b, 0x2a, 0x0e, 0x0a, 0x12, 0x1d, 0x27, 0x29, 0x2b, 0x4b, 0x2a, 0x2a, 0x4b, 0x2b, 0x29, 0x27, 0x1d, 0x13, 0x09, 0x0e, 0x2a, 0x4b, 0x49, 0x50, 0x04, 0x50, 0x48, 0x3e, 0x26, 0x0f, 0x11, 0x35, 0x3c, 0x3a, 0x36, 0x03, 0x04, 0xfe, 0x75, 0x01, 0x94, 0x01, 0x4e, 0x7c, 0x6c, 0x7c, 0x7c, 0x6c, 0x7c, 0xfe, 0xb2, 0x2d, 0x49, 0x2b, 0x4e, 0x29, 0x29, 0x4e, 0x2b, 0x40, 0x36, 0xfe, 0xac, 0x05, 0x19, 0x3a, 0x35, 0x1c, 0x1c, 0x35, 0x3a, 0x35, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x2f, 0x00, 0x00, 0x05, 0x46, 0x05, 0xd8, 0x00, 0x29, 0x00, 0x35, 0x00, 0x3e, 0x00, 0x6f, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x26, 0x35, 0x34, 0x37, 0x16, 0x15, 0x14, 0x07, 0x00, 0x13, 0x21, 0x26, 0x35, 0x34, 0x00, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x07, 0x27, 0x07, 0x26, 0x27, 0x36, 0x35, 0x34, 0x27, 0x36, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x16, 0x17, 0x03, 0x36, 0x3b, 0x01, 0x06, 0x15, 0x14, 0x2b, 0x01, 0x22, 0x27, 0x35, 0x03, 0x17, 0x14, 0x07, 0x23, 0x22, 0x3d, 0x01, 0x36, 0x13, 0x26, 0x27, 0x06, 0x15, 0x14, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x37, 0x07, 0x36, 0x37, 0x36, 0x37, 0x16, 0x15, 0x14, 0x00, 0x15, 0x14, 0x17, 0x25, 0x02, 0x01, 0x32, 0x35, 0x23, 0x36, 0x35, 0x34, 0x26, 0x27, 0x06, 0x15, 0x14, 0x16, 0x15, 0x14, 0x07, 0x02, 0xce, 0x04, 0x14, 0x3f, 0x6e, 0x07, 0x01, 0xb9, 0x28, 0xfc, 0x97, 0x0c, 0x01, 0x63, 0x51, 0x32, 0x2a, 0x8e, 0x08, 0x28, 0x7d, 0x1c, 0x47, 0x02, 0x2b, 0x41, 0x13, 0x07, 0x1e, 0x5e, 0x30, 0x91, 0x21, 0x56, 0x06, 0x27, 0x3e, 0x13, 0x07, 0x04, 0x05, 0x06, 0x41, 0x09, 0x19, 0x25, 0xc2, 0x1f, 0x45, 0x17, 0x1a, 0x0a, 0x35, 0x27, 0x03, 0x42, 0x16, 0x5d, 0x57, 0x1f, 0x79, 0x1a, 0x5f, 0x49, 0x0a, 0xfe, 0xa9, 0x0a, 0x03, 0x14, 0x23, 0xfe, 0x43, 0x01, 0x04, 0x1c, 0x0b, 0x46, 0x1b, 0x10, 0x08, 0x04, 0xe8, 0x08, 0x0b, 0x15, 0x2b, 0x0e, 0x31, 0x5e, 0x68, 0x67, 0x1a, 0x1b, 0xfe, 0xbd, 0xfc, 0x6f, 0x38, 0x3a, 0xa0, 0x01, 0x28, 0x40, 0x06, 0x73, 0x03, 0x8e, 0x12, 0x16, 0x1e, 0x2e, 0x50, 0xf9, 0xc0, 0x1e, 0x1c, 0x6d, 0x7a, 0x20, 0x13, 0x05, 0x1b, 0x6e, 0x1b, 0x78, 0xfe, 0xeb, 0x3f, 0x2e, 0x23, 0x31, 0x1e, 0x0f, 0xfe, 0x70, 0x23, 0x34, 0x0f, 0x1e, 0x17, 0x31, 0x02, 0xa7, 0x60, 0x26, 0x3e, 0x25, 0x1b, 0x21, 0x12, 0x10, 0x0f, 0x61, 0x63, 0x2c, 0x2c, 0xc5, 0xc0, 0x4c, 0x18, 0x48, 0x4a, 0x0a, 0x90, 0x04, 0xad, 0x1e, 0x1e, 0x78, 0xfe, 0xec, 0x7d, 0x36, 0x34, 0x01, 0x03, 0x37, 0x01, 0x7c, 0x01, 0x0a, 0x2b, 0x0c, 0x4f, 0x4a, 0x4a, 0x29, 0x13, 0x21, 0x13, 0x11, 0x0f, 0x00, 0x00, 0x00, 0x04, 0x01, 0x11, 0xff, 0xff, 0x05, 0x62, 0x05, 0xd7, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x50, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x13, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x01, 0x15, 0x21, 0x35, 0x07, 0x26, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x07, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x07, 0x02, 0x79, 0x34, 0x5b, 0x31, 0x34, 0x5b, 0x32, 0x33, 0x5c, 0x32, 0x30, 0x5b, 0x56, 0x0f, 0x19, 0x0d, 0x0f, 0x19, 0x0e, 0x0e, 0x1a, 0x0e, 0x0c, 0x1a, 0x0f, 0x02, 0x1f, 0xfc, 0x43, 0x4a, 0x0a, 0x94, 0x84, 0x22, 0x24, 0x1b, 0x13, 0x26, 0x4c, 0x46, 0x18, 0x1a, 0x17, 0x0e, 0x14, 0x27, 0x46, 0x25, 0x24, 0x47, 0x28, 0x13, 0x0f, 0x17, 0x19, 0x1b, 0x43, 0x4e, 0x25, 0x14, 0x1b, 0x22, 0x22, 0x84, 0x96, 0x0b, 0x53, 0x03, 0x3a, 0x3e, 0xdd, 0x73, 0x74, 0xdc, 0x3d, 0x3a, 0x04, 0x03, 0xc1, 0x70, 0x64, 0x38, 0x38, 0x64, 0x70, 0x67, 0x36, 0x36, 0x01, 0x0e, 0x10, 0x1b, 0x0f, 0x0f, 0x1b, 0x10, 0x0f, 0x1c, 0x10, 0x10, 0x1c, 0xfa, 0xbb, 0x01, 0x01, 0x01, 0x39, 0x3a, 0xa0, 0x01, 0x25, 0x4e, 0x15, 0x0f, 0x1d, 0x26, 0x4b, 0x52, 0x53, 0x97, 0x2a, 0x0e, 0x0a, 0x13, 0x1d, 0x27, 0x54, 0x4d, 0x2a, 0x2a, 0x4d, 0x54, 0x27, 0x1d, 0x14, 0x09, 0x0e, 0x2a, 0x97, 0x53, 0x52, 0x4b, 0x26, 0x1d, 0x10, 0x14, 0x4e, 0xfe, 0xdb, 0xa0, 0x3a, 0x39, 0x84, 0x7d, 0x71, 0x79, 0x83, 0x83, 0x79, 0x71, 0x7d, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xc0, 0x05, 0xd8, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x24, 0x00, 0x54, 0x00, 0x64, 0x00, 0x68, 0x00, 0x79, 0x00, 0x8a, 0x00, 0x00, 0x01, 0x36, 0x37, 0x26, 0x27, 0x26, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x21, 0x33, 0x21, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x07, 0x16, 0x17, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x16, 0x17, 0x1e, 0x01, 0x1d, 0x01, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x01, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x01, 0x15, 0x21, 0x35, 0x37, 0x23, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x06, 0x15, 0x33, 0x34, 0x27, 0x36, 0x37, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x23, 0x02, 0xfb, 0x01, 0x02, 0x20, 0x2e, 0x42, 0x8c, 0x85, 0x4b, 0x49, 0x43, 0x14, 0x14, 0x01, 0x35, 0x7f, 0x01, 0x34, 0x16, 0x13, 0x43, 0x49, 0x4b, 0x84, 0x47, 0x46, 0x42, 0x2f, 0x1f, 0x02, 0x01, 0xfe, 0x6c, 0x02, 0xa9, 0xfd, 0x0d, 0x26, 0x22, 0x3e, 0x61, 0x63, 0xb2, 0x5e, 0x48, 0x44, 0x20, 0x1d, 0x0c, 0x0e, 0x61, 0x61, 0x5f, 0x61, 0x61, 0x0e, 0x0c, 0x1c, 0x21, 0x45, 0x47, 0x5d, 0xb2, 0x64, 0x62, 0x3d, 0x23, 0x25, 0xfe, 0x0d, 0x17, 0x29, 0x14, 0x16, 0x28, 0x16, 0x16, 0x28, 0x16, 0x14, 0x29, 0x17, 0x01, 0x7a, 0xfd, 0xb5, 0xb9, 0xfc, 0x10, 0x0f, 0x37, 0x3c, 0x3e, 0x6b, 0x39, 0x38, 0x37, 0x25, 0x1a, 0x02, 0xd9, 0x02, 0x1a, 0x25, 0x37, 0x37, 0x3b, 0x6b, 0x3d, 0x3b, 0x37, 0x11, 0x10, 0xfb, 0x03, 0xc7, 0x03, 0x03, 0x2b, 0x1c, 0x29, 0x51, 0x95, 0x50, 0x51, 0x92, 0x28, 0x0e, 0x08, 0x08, 0x0e, 0x28, 0x92, 0x51, 0x50, 0x95, 0x51, 0x29, 0x1c, 0x2b, 0x03, 0x03, 0xfd, 0xb8, 0xfe, 0xd1, 0x01, 0x2f, 0xfe, 0x81, 0x01, 0x7f, 0x0d, 0x16, 0x36, 0xc4, 0x6b, 0x6c, 0xc5, 0x6a, 0x1f, 0x02, 0x24, 0x3f, 0x12, 0x07, 0x04, 0x36, 0x46, 0x57, 0x57, 0x46, 0x36, 0x04, 0x07, 0x12, 0x3f, 0x24, 0x02, 0x1f, 0x6a, 0xc5, 0x6c, 0x6b, 0xc4, 0x36, 0x16, 0x0d, 0xfe, 0x81, 0x04, 0x7d, 0x19, 0x2b, 0x19, 0x19, 0x2b, 0x19, 0x18, 0x2d, 0x17, 0x17, 0x2d, 0xfc, 0xb6, 0xc8, 0xc8, 0xce, 0x07, 0x0c, 0x21, 0x79, 0x43, 0x42, 0x7b, 0x43, 0x21, 0x17, 0x24, 0x03, 0x02, 0x02, 0x03, 0x24, 0x17, 0x21, 0x43, 0x7b, 0x42, 0x43, 0x79, 0x21, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0xcb, 0x00, 0x00, 0x05, 0xa9, 0x05, 0xd8, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x50, 0x00, 0x00, 0x01, 0x26, 0x27, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x13, 0x03, 0x22, 0x27, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x1b, 0x01, 0x26, 0x27, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x1b, 0x01, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x07, 0x03, 0x13, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x06, 0x23, 0x03, 0x11, 0x21, 0x11, 0x05, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x2c, 0x56, 0x0b, 0x1b, 0x30, 0x1a, 0x19, 0x31, 0x19, 0x03, 0x34, 0xd7, 0x2e, 0x4b, 0x10, 0x1a, 0x30, 0x1b, 0x1a, 0x2f, 0x1a, 0x01, 0x2a, 0xaa, 0x27, 0x3c, 0x02, 0x1b, 0x30, 0x18, 0x1a, 0x30, 0x1b, 0x03, 0x3c, 0x22, 0xa6, 0x29, 0x1a, 0x31, 0x18, 0x1b, 0x31, 0x1a, 0x0a, 0x4e, 0x52, 0xe7, 0x27, 0x1a, 0x30, 0x19, 0x1b, 0x30, 0x1a, 0x0c, 0x59, 0x90, 0xfc, 0xf9, 0x02, 0xd4, 0xfd, 0x72, 0x02, 0x8e, 0xfd, 0x72, 0x03, 0xfb, 0x02, 0x5f, 0x1c, 0x33, 0x1c, 0x1c, 0x33, 0x1c, 0x40, 0x16, 0xfe, 0x06, 0x02, 0xbe, 0x5d, 0x1c, 0x32, 0x1c, 0x1c, 0x32, 0x1c, 0x2d, 0x22, 0xfd, 0x14, 0x03, 0x34, 0x1e, 0x30, 0x1c, 0x34, 0x1a, 0x1a, 0x34, 0x1c, 0x36, 0x18, 0xfc, 0xca, 0x02, 0xe4, 0x2f, 0x2a, 0x1b, 0x33, 0x1c, 0x1c, 0x33, 0x1b, 0x55, 0x10, 0xfd, 0x4a, 0x02, 0x03, 0x22, 0x2b, 0x1c, 0x33, 0x1b, 0x1b, 0x33, 0x1c, 0x5e, 0xfe, 0x31, 0xfd, 0xd1, 0x02, 0x2f, 0xcb, 0x4e, 0x4e, 0xfe, 0xd6, 0x4f, 0x4f, 0x00, 0x00, 0x04, 0x01, 0x32, 0xff, 0xfe, 0x05, 0x41, 0x05, 0xd6, 0x00, 0x03, 0x00, 0x07, 0x00, 0x25, 0x00, 0x29, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x13, 0x33, 0x15, 0x33, 0x35, 0x33, 0x15, 0x23, 0x15, 0x07, 0x11, 0x17, 0x15, 0x33, 0x15, 0x21, 0x35, 0x33, 0x35, 0x37, 0x33, 0x11, 0x23, 0x27, 0x35, 0x23, 0x35, 0x33, 0x15, 0x33, 0x01, 0x35, 0x21, 0x15, 0x04, 0x5a, 0xfd, 0xc0, 0x02, 0x83, 0xfd, 0x3b, 0xe2, 0xfa, 0x9a, 0xf3, 0x68, 0x53, 0x53, 0x68, 0xfb, 0xf2, 0x67, 0x54, 0x01, 0x01, 0x54, 0x67, 0xee, 0x99, 0x02, 0x55, 0xfc, 0x56, 0x04, 0x84, 0x5e, 0x5e, 0xfc, 0x2f, 0x6f, 0x6f, 0x05, 0x23, 0x9b, 0x9b, 0xa2, 0x90, 0x96, 0xfd, 0xb7, 0x95, 0x8f, 0xa3, 0xa3, 0x8f, 0x98, 0x02, 0x45, 0x97, 0x90, 0xa2, 0x9b, 0xfa, 0xfb, 0x37, 0x37, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x8a, 0x00, 0x00, 0x04, 0xeb, 0x05, 0xd8, 0x00, 0x34, 0x00, 0x40, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x35, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x13, 0x21, 0x13, 0x26, 0x01, 0x35, 0x33, 0x35, 0x23, 0x35, 0x23, 0x15, 0x23, 0x15, 0x33, 0x15, 0x02, 0x68, 0x1c, 0x08, 0x0a, 0x36, 0x21, 0x25, 0x01, 0x01, 0x25, 0x27, 0x46, 0x19, 0x1b, 0x17, 0x0f, 0x14, 0x28, 0x46, 0x26, 0x25, 0x46, 0x29, 0x13, 0x0f, 0x17, 0x19, 0x1a, 0x46, 0x27, 0x26, 0x01, 0x01, 0x26, 0x21, 0x34, 0x0a, 0x07, 0x1c, 0x1d, 0xfa, 0xfc, 0xa0, 0xf4, 0x16, 0x01, 0x07, 0x9b, 0x9b, 0x6a, 0x9b, 0x9b, 0x02, 0x02, 0x3c, 0x35, 0x11, 0x0e, 0x26, 0x3f, 0x48, 0x50, 0x04, 0x50, 0x49, 0x4b, 0x2a, 0x0e, 0x0a, 0x12, 0x1d, 0x27, 0x29, 0x2b, 0x4b, 0x2a, 0x2a, 0x4b, 0x2b, 0x29, 0x27, 0x1d, 0x13, 0x09, 0x0e, 0x2a, 0x4b, 0x49, 0x50, 0x04, 0x50, 0x48, 0x3e, 0x26, 0x0f, 0x11, 0x35, 0x3c, 0x3a, 0x36, 0xfe, 0x6e, 0x01, 0x94, 0x35, 0x01, 0x19, 0x7c, 0x6c, 0x7c, 0x7c, 0x6c, 0x7c, 0x00, 0x00, 0x04, 0x01, 0x2a, 0x00, 0x00, 0x05, 0x4a, 0x05, 0xd8, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x48, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x26, 0x35, 0x34, 0x37, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x33, 0x14, 0x23, 0x00, 0x13, 0x21, 0x26, 0x35, 0x34, 0x00, 0x35, 0x34, 0x27, 0x06, 0x2b, 0x01, 0x06, 0x23, 0x22, 0x23, 0x37, 0x07, 0x26, 0x27, 0x36, 0x35, 0x34, 0x27, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x35, 0x34, 0x37, 0x16, 0x17, 0x07, 0x15, 0x16, 0x3b, 0x01, 0x32, 0x35, 0x34, 0x37, 0x23, 0x22, 0x07, 0x03, 0x15, 0x14, 0x3b, 0x01, 0x36, 0x35, 0x27, 0x22, 0x01, 0x17, 0x00, 0x13, 0x33, 0x02, 0x02, 0xc7, 0x21, 0x1b, 0x35, 0x4c, 0x0e, 0x1f, 0x03, 0x01, 0x01, 0xe2, 0x29, 0xfc, 0x97, 0x0c, 0x01, 0x6c, 0x01, 0x3b, 0x69, 0x09, 0x51, 0x5d, 0x03, 0x03, 0x2b, 0x60, 0x67, 0x18, 0x4f, 0x02, 0x2b, 0x59, 0x03, 0x28, 0x12, 0x5d, 0x33, 0x99, 0x03, 0x07, 0x13, 0x3f, 0x26, 0x05, 0x57, 0x21, 0x67, 0x19, 0x09, 0x41, 0x07, 0x38, 0x01, 0x9c, 0x2f, 0x01, 0x51, 0x06, 0x45, 0x29, 0x04, 0xe6, 0x17, 0x27, 0x19, 0x39, 0x16, 0x2e, 0x1e, 0x51, 0x59, 0x0d, 0x2f, 0x0c, 0x01, 0xfe, 0xac, 0xfc, 0x6f, 0x38, 0x3a, 0xa0, 0x01, 0x1b, 0x71, 0x08, 0x07, 0xa7, 0x92, 0x68, 0x50, 0x1c, 0x53, 0xe5, 0xbe, 0x1b, 0x1a, 0x6d, 0x68, 0x0a, 0x09, 0x1c, 0x1a, 0x23, 0x25, 0x42, 0x1b, 0x7a, 0xff, 0x10, 0x1e, 0x31, 0x22, 0x30, 0x40, 0xfe, 0x29, 0x18, 0x1d, 0x0f, 0x35, 0x22, 0x02, 0x40, 0x59, 0xfe, 0xf3, 0xfd, 0x04, 0x03, 0x52, 0x00, 0x01, 0x01, 0x11, 0xff, 0xff, 0x05, 0x62, 0x05, 0xd7, 0x00, 0x2e, 0x00, 0x00, 0x05, 0x26, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x07, 0x01, 0x1c, 0x0a, 0x94, 0x84, 0x22, 0x24, 0x1b, 0x13, 0x26, 0x4c, 0x46, 0x18, 0x1a, 0x17, 0x0e, 0x14, 0x27, 0x46, 0x25, 0x24, 0x47, 0x28, 0x13, 0x0f, 0x17, 0x19, 0x1b, 0x43, 0x4e, 0x25, 0x14, 0x1b, 0x22, 0x22, 0x84, 0x96, 0x0b, 0x01, 0x39, 0x3a, 0xa0, 0x01, 0x25, 0x4e, 0x15, 0x0f, 0x1d, 0x26, 0x4b, 0x52, 0x53, 0x97, 0x2a, 0x0e, 0x0a, 0x13, 0x1d, 0x27, 0x54, 0x4d, 0x2a, 0x2a, 0x4d, 0x54, 0x27, 0x1d, 0x14, 0x09, 0x0e, 0x2a, 0x97, 0x53, 0x52, 0x4b, 0x26, 0x1d, 0x10, 0x14, 0x4e, 0xfe, 0xdb, 0xa0, 0x3a, 0x39, 0x00, 0x00, 0x00, 0x01, 0x01, 0x22, 0x00, 0x00, 0x05, 0x51, 0x05, 0xd4, 0x00, 0x23, 0x00, 0x00, 0x01, 0x16, 0x13, 0x12, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x23, 0x15, 0x10, 0x17, 0x23, 0x35, 0x36, 0x11, 0x27, 0x23, 0x07, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x00, 0x3f, 0x01, 0x03, 0x3c, 0x55, 0xc2, 0xd5, 0x06, 0x23, 0x92, 0x30, 0x39, 0x8b, 0x55, 0x26, 0x4a, 0xc1, 0x4d, 0x03, 0x22, 0x2b, 0x4c, 0x72, 0xa9, 0x44, 0x08, 0xa8, 0x01, 0x1b, 0x51, 0x02, 0x05, 0xd4, 0xa7, 0xfe, 0xec, 0xfe, 0xea, 0x39, 0x55, 0x50, 0x28, 0xa7, 0x60, 0x16, 0xdd, 0x0c, 0xfe, 0xe5, 0x96, 0x06, 0x97, 0x01, 0x1d, 0x03, 0x58, 0x85, 0xd1, 0x49, 0x2e, 0xb7, 0xcb, 0x01, 0x82, 0xa5, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa6, 0x00, 0x01, 0x05, 0xce, 0x05, 0xd1, 0x00, 0x18, 0x00, 0x32, 0x00, 0x00, 0x01, 0x32, 0x13, 0x16, 0x15, 0x32, 0x37, 0x12, 0x33, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x10, 0x07, 0x00, 0x07, 0x23, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x03, 0x15, 0x14, 0x17, 0x01, 0x33, 0x01, 0x36, 0x3d, 0x01, 0x34, 0x27, 0x26, 0x23, 0x22, 0x03, 0x06, 0x15, 0x23, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x01, 0xf3, 0xc4, 0x68, 0x19, 0x06, 0x0c, 0x64, 0xd4, 0xbc, 0x6e, 0x22, 0xc7, 0xfe, 0x6a, 0x36, 0x05, 0xfd, 0xdc, 0x6c, 0xb4, 0x48, 0xce, 0xbc, 0x01, 0xab, 0x03, 0x02, 0x04, 0x5e, 0xaa, 0x40, 0x34, 0xee, 0x4d, 0x09, 0x06, 0x40, 0x5b, 0xaa, 0x9d, 0x60, 0x22, 0x05, 0xd1, 0xfe, 0xed, 0x50, 0x18, 0x46, 0x01, 0x35, 0xd3, 0x4e, 0x50, 0x0d, 0xfe, 0xfe, 0xe7, 0xfd, 0xd9, 0x42, 0x02, 0xed, 0xb2, 0xb6, 0xd2, 0x7c, 0x2d, 0xfe, 0x8f, 0x10, 0xdb, 0xe4, 0xfd, 0xbc, 0x02, 0xbb, 0xa1, 0x97, 0x26, 0xac, 0x70, 0x1c, 0xfe, 0x41, 0x26, 0x1a, 0x4e, 0xd1, 0xe0, 0xb1, 0x46, 0x00, 0x02, 0x01, 0x35, 0x00, 0x00, 0x05, 0x3d, 0x05, 0xd4, 0x00, 0x08, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x01, 0x15, 0x00, 0x07, 0x26, 0x01, 0x26, 0x35, 0x09, 0x04, 0x03, 0x3a, 0x02, 0x03, 0xfe, 0x19, 0x1c, 0x0d, 0xfe, 0x48, 0x3f, 0x02, 0x01, 0xfe, 0x35, 0x01, 0xce, 0x01, 0xce, 0xfe, 0x88, 0x05, 0xd4, 0xfd, 0x1a, 0x07, 0xfd, 0x3b, 0x22, 0x0b, 0x02, 0x80, 0x56, 0x0d, 0x02, 0x96, 0xfd, 0x67, 0xfd, 0x64, 0x02, 0x9c, 0x02, 0x1e, 0x00, 0x00, 0x01, 0x00, 0xcd, 0x00, 0x00, 0x05, 0xa7, 0x05, 0xd4, 0x00, 0x37, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x14, 0x0f, 0x01, 0x33, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x22, 0x03, 0x23, 0x15, 0x10, 0x17, 0x15, 0x23, 0x27, 0x36, 0x11, 0x35, 0x23, 0x02, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x33, 0x35, 0x26, 0x27, 0x26, 0x3d, 0x01, 0x34, 0x37, 0x36, 0x03, 0x3b, 0xc1, 0x5b, 0x0b, 0x03, 0x6c, 0x36, 0x03, 0x42, 0x4c, 0x11, 0xd6, 0x57, 0x14, 0xbc, 0x24, 0x40, 0xda, 0x5a, 0x03, 0x4a, 0xbb, 0x06, 0x4d, 0x03, 0x5a, 0xdd, 0xab, 0x5c, 0x17, 0xde, 0x3b, 0x2e, 0x08, 0x4d, 0x47, 0x02, 0x4b, 0x1a, 0x36, 0xc1, 0x40, 0x05, 0xd4, 0xe3, 0x34, 0x38, 0x75, 0xa0, 0x3c, 0x1c, 0xca, 0x42, 0x3c, 0xcd, 0x68, 0x0c, 0x06, 0x01, 0x12, 0x09, 0xfe, 0xa9, 0x6d, 0x06, 0x06, 0x80, 0x01, 0x4d, 0x03, 0xfe, 0xeb, 0xc9, 0x44, 0x3a, 0xe9, 0x53, 0x0c, 0x1c, 0x03, 0x47, 0x45, 0x6e, 0x51, 0x0e, 0xc9, 0x68, 0x13, 0x00, 0x00, 0x03, 0x01, 0x21, 0x00, 0x01, 0x05, 0x53, 0x05, 0xd5, 0x00, 0x22, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x00, 0x01, 0x16, 0x01, 0x16, 0x1d, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x23, 0x15, 0x10, 0x17, 0x23, 0x35, 0x36, 0x11, 0x23, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x35, 0x37, 0x35, 0x34, 0x37, 0x00, 0x37, 0x06, 0x01, 0x06, 0x15, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x32, 0x37, 0x33, 0x32, 0x17, 0x16, 0x3b, 0x01, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x34, 0x27, 0x02, 0x03, 0x33, 0x26, 0x27, 0x22, 0x07, 0x03, 0x3b, 0x71, 0x01, 0x59, 0x4e, 0xa3, 0x1f, 0x2b, 0x14, 0x82, 0x59, 0x25, 0x4a, 0xc1, 0x4d, 0x26, 0x32, 0x4c, 0x5f, 0x14, 0x90, 0x49, 0x16, 0x02, 0xba, 0x01, 0x05, 0x55, 0x6f, 0xfe, 0xd0, 0x49, 0x09, 0x85, 0x14, 0x25, 0x0e, 0x6b, 0x56, 0xa5, 0x07, 0x1b, 0x4b, 0x5d, 0x11, 0x7b, 0x3b, 0x09, 0xb7, 0xcf, 0x80, 0x39, 0x0c, 0x0d, 0x06, 0x0e, 0x05, 0xd5, 0xe1, 0xfe, 0x36, 0x8b, 0x86, 0x03, 0xd1, 0x4e, 0x10, 0xda, 0x0d, 0xfe, 0xe8, 0x9b, 0x06, 0x97, 0x01, 0x23, 0x65, 0x75, 0xae, 0x42, 0x3f, 0x0d, 0x03, 0xc8, 0xd4, 0x01, 0x67, 0x49, 0xc7, 0xfe, 0x6f, 0x82, 0x85, 0xbb, 0x35, 0x09, 0xda, 0x46, 0x94, 0xa7, 0x28, 0x1e, 0x1f, 0xb0, 0xcf, 0x01, 0x1f, 0xfb, 0x70, 0x17, 0x5a, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa3, 0x00, 0x00, 0x05, 0xd2, 0x05, 0xd4, 0x00, 0x17, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x33, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x01, 0x23, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x01, 0xf1, 0xb7, 0x68, 0x26, 0x02, 0x02, 0x20, 0x52, 0x62, 0x79, 0xbc, 0x72, 0x1d, 0xbc, 0xfe, 0x24, 0x05, 0xfe, 0x06, 0x97, 0xb3, 0x4b, 0x05, 0xd4, 0xeb, 0x5d, 0x31, 0xa2, 0x6b, 0x6c, 0xe0, 0x53, 0x49, 0xfa, 0xe3, 0xfd, 0x85, 0x02, 0xb1, 0xcd, 0xda, 0xd3, 0x7c, 0x2d, 0x00, 0x00, 0x01, 0x01, 0x35, 0x00, 0x00, 0x05, 0x3d, 0x05, 0xd4, 0x00, 0x08, 0x00, 0x00, 0x09, 0x01, 0x16, 0x15, 0x01, 0x26, 0x01, 0x34, 0x37, 0x03, 0x3a, 0x01, 0xc5, 0x3e, 0xfd, 0xfd, 0x0b, 0xfe, 0x07, 0x64, 0x05, 0xd4, 0xfd, 0x73, 0x55, 0x0d, 0xfd, 0x1b, 0x08, 0x02, 0xdd, 0x0e, 0x8a, 0x00, 0x00, 0x03, 0x00, 0xcd, 0x00, 0x00, 0x05, 0xa8, 0x05, 0xdc, 0x00, 0x32, 0x00, 0x60, 0x00, 0x67, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x22, 0x03, 0x23, 0x15, 0x10, 0x17, 0x15, 0x23, 0x27, 0x36, 0x11, 0x35, 0x23, 0x02, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x26, 0x27, 0x35, 0x34, 0x37, 0x36, 0x03, 0x14, 0x1f, 0x01, 0x15, 0x26, 0x2b, 0x01, 0x22, 0x0f, 0x01, 0x14, 0x17, 0x16, 0x33, 0x32, 0x13, 0x36, 0x37, 0x33, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x34, 0x2f, 0x01, 0x23, 0x22, 0x07, 0x35, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x13, 0x14, 0x07, 0x33, 0x35, 0x26, 0x35, 0x03, 0x3f, 0xb6, 0x5e, 0x17, 0x67, 0x14, 0x1c, 0x37, 0x25, 0xdf, 0x53, 0x0e, 0xbd, 0x1e, 0x42, 0xd9, 0x5c, 0x03, 0x4a, 0xbc, 0x05, 0x4c, 0x02, 0x5a, 0xde, 0xad, 0x5c, 0x17, 0xdf, 0x3c, 0x2e, 0x22, 0x37, 0x1c, 0x59, 0x1a, 0xc3, 0x40, 0xd8, 0x98, 0x0b, 0x61, 0x6a, 0x08, 0xdb, 0x37, 0x06, 0x7b, 0x36, 0x47, 0xbd, 0x66, 0x0f, 0x13, 0x07, 0x21, 0x4b, 0x51, 0x8e, 0x97, 0x4d, 0x0a, 0xe3, 0x31, 0x05, 0x6b, 0x60, 0x74, 0x1d, 0x17, 0xa8, 0x30, 0x25, 0xa6, 0x4b, 0xed, 0x19, 0x36, 0x19, 0x05, 0xdc, 0xce, 0x46, 0x39, 0x84, 0xa6, 0x17, 0x06, 0xd7, 0x38, 0x3a, 0xd3, 0x64, 0x0c, 0x07, 0x01, 0x14, 0x09, 0xfe, 0xa7, 0x6d, 0x06, 0x06, 0x80, 0x01, 0x4f, 0x04, 0xfe, 0xe8, 0xcb, 0x45, 0x3a, 0xeb, 0x52, 0x0c, 0x06, 0x70, 0xb1, 0x26, 0xcb, 0x69, 0x13, 0xfe, 0xb3, 0x9b, 0xcc, 0x0c, 0x03, 0x09, 0xd4, 0x43, 0x94, 0x5d, 0x26, 0x01, 0x27, 0x1b, 0x41, 0x78, 0x86, 0x85, 0xbe, 0x2e, 0x2b, 0x06, 0xde, 0x30, 0x03, 0x09, 0x03, 0x89, 0x6e, 0x4d, 0x2c, 0xb6, 0x57, 0x10, 0xc8, 0xfb, 0xce, 0x1c, 0x60, 0x03, 0x63, 0x16, 0x00, 0x04, 0x00, 0xc2, 0xff, 0xfe, 0x05, 0xb2, 0x05, 0xd4, 0x00, 0x10, 0x00, 0x21, 0x00, 0x31, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x33, 0x14, 0x06, 0x07, 0x14, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x27, 0x30, 0x35, 0x34, 0x36, 0x25, 0x33, 0x14, 0x06, 0x07, 0x14, 0x16, 0x13, 0x23, 0x26, 0x27, 0x26, 0x27, 0x34, 0x35, 0x34, 0x36, 0x05, 0x33, 0x14, 0x06, 0x07, 0x14, 0x16, 0x17, 0x23, 0x26, 0x27, 0x26, 0x27, 0x35, 0x34, 0x36, 0x13, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x04, 0x20, 0x24, 0x26, 0x35, 0x34, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x14, 0x16, 0x04, 0x20, 0x24, 0x36, 0x34, 0x27, 0x26, 0x27, 0x02, 0x37, 0x0c, 0x83, 0x02, 0xb8, 0x06, 0x0b, 0x1b, 0x92, 0x2b, 0x0e, 0x95, 0x01, 0x20, 0x0c, 0x83, 0x02, 0xb9, 0x05, 0x0c, 0x1a, 0x92, 0x2c, 0x0d, 0x95, 0x01, 0x37, 0x0b, 0x83, 0x02, 0xb9, 0x05, 0x0c, 0x19, 0x93, 0x2c, 0x0d, 0x95, 0x28, 0x97, 0xab, 0xa6, 0xfe, 0xd2, 0xfe, 0xb8, 0xfe, 0xd3, 0xa7, 0xaa, 0x98, 0x02, 0x76, 0x43, 0x4d, 0x96, 0x01, 0x10, 0x01, 0x29, 0x01, 0x10, 0x96, 0x4e, 0x44, 0x76, 0x05, 0x39, 0x3f, 0x9b, 0x63, 0x82, 0x79, 0xc9, 0xa6, 0x74, 0x33, 0x5a, 0x0e, 0x72, 0x88, 0xed, 0x60, 0xed, 0x97, 0xc5, 0xbb, 0xfe, 0xce, 0xfb, 0xb2, 0x4e, 0x8b, 0x08, 0x09, 0xb1, 0xd1, 0x5b, 0x4f, 0xc4, 0x7d, 0xa1, 0x9a, 0xfd, 0xd0, 0x91, 0x42, 0x72, 0x0e, 0x91, 0xad, 0xfe, 0x1e, 0x31, 0xb1, 0x61, 0x60, 0xb0, 0x62, 0x62, 0xb0, 0x60, 0x61, 0xb1, 0x31, 0x29, 0x45, 0x4d, 0xa8, 0x98, 0x55, 0x55, 0x98, 0xa8, 0x4d, 0x45, 0x29, 0x00, 0x01, 0x00, 0x9a, 0xff, 0xf6, 0x02, 0x72, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x01, 0x33, 0x17, 0x11, 0x14, 0x0f, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x34, 0x3f, 0x01, 0x32, 0x17, 0x33, 0x11, 0x02, 0x2a, 0x41, 0x07, 0xb1, 0x2b, 0x20, 0xbe, 0x1a, 0x03, 0xbe, 0x1d, 0x5a, 0x50, 0x04, 0x05, 0xd5, 0x08, 0xfa, 0xfd, 0xa3, 0x2d, 0x04, 0x85, 0x1f, 0x82, 0x18, 0x05, 0x40, 0x04, 0xd4, 0x00, 0x00, 0x01, 0x00, 0x9a, 0xff, 0xf6, 0x03, 0xfe, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x33, 0x17, 0x15, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x23, 0x27, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x11, 0x14, 0x07, 0x23, 0x22, 0x35, 0x34, 0x37, 0x33, 0x32, 0x17, 0x11, 0x02, 0x1c, 0x4e, 0x08, 0x18, 0x9c, 0xd8, 0x6e, 0x04, 0x1b, 0x37, 0xcd, 0x53, 0x16, 0xca, 0x33, 0xda, 0xbf, 0x14, 0x57, 0x50, 0x05, 0xd5, 0x07, 0x27, 0x36, 0x3f, 0x46, 0x8a, 0x92, 0x60, 0x20, 0x31, 0x54, 0x46, 0x47, 0x2a, 0x1a, 0xfb, 0xd6, 0x99, 0x2d, 0xa8, 0x83, 0x17, 0x40, 0x04, 0xd6, 0x00, 0x01, 0x01, 0x52, 0xff, 0x2f, 0x05, 0x22, 0x05, 0xd5, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x05, 0x17, 0x11, 0x14, 0x07, 0x23, 0x22, 0x3d, 0x01, 0x34, 0x3f, 0x01, 0x32, 0x17, 0x11, 0x25, 0x11, 0x14, 0x0f, 0x01, 0x23, 0x22, 0x3d, 0x01, 0x34, 0x3f, 0x01, 0x32, 0x17, 0x11, 0x02, 0xb0, 0x02, 0x6e, 0x03, 0xad, 0x30, 0xc0, 0x9f, 0x23, 0x4e, 0x49, 0xfe, 0x13, 0x88, 0x3c, 0x17, 0xc3, 0x99, 0x27, 0x50, 0x48, 0x05, 0xd5, 0xca, 0x04, 0xfa, 0xed, 0x9b, 0x2a, 0xa4, 0x04, 0x7e, 0x16, 0x03, 0x3a, 0x04, 0x0b, 0xa9, 0xfb, 0xdb, 0x89, 0x38, 0x08, 0x9b, 0x07, 0x7a, 0x22, 0x04, 0x43, 0x04, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa9, 0xff, 0xf6, 0x05, 0xcb, 0x05, 0xd5, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x17, 0x11, 0x14, 0x07, 0x22, 0x27, 0x34, 0x37, 0x32, 0x17, 0x33, 0x11, 0x21, 0x11, 0x06, 0x07, 0x23, 0x22, 0x35, 0x34, 0x37, 0x32, 0x17, 0x11, 0x17, 0x15, 0x21, 0x35, 0x05, 0xc7, 0x03, 0xeb, 0xd1, 0x10, 0xd1, 0x62, 0x47, 0x03, 0xfc, 0xfb, 0x07, 0xda, 0x04, 0xe8, 0xd5, 0x5a, 0x4f, 0x4f, 0x03, 0x05, 0x05, 0xd5, 0x04, 0xfb, 0x12, 0xd5, 0x15, 0xa4, 0x8a, 0x0e, 0x3b, 0x02, 0x95, 0xfd, 0x5a, 0xcf, 0x24, 0xb1, 0x7d, 0x10, 0x40, 0x04, 0xe1, 0xcf, 0x9c, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa2, 0xff, 0xfa, 0x02, 0xd2, 0x05, 0xd9, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x13, 0x33, 0x17, 0x11, 0x33, 0x36, 0x33, 0x16, 0x13, 0x02, 0x05, 0x27, 0x11, 0x13, 0x11, 0x24, 0x11, 0x34, 0x35, 0x34, 0x27, 0x22, 0xa8, 0x29, 0x04, 0x03, 0x99, 0x83, 0xcc, 0x12, 0x1a, 0xfd, 0xee, 0x03, 0x32, 0x01, 0x79, 0x86, 0x6b, 0x05, 0xd9, 0x06, 0xfc, 0x3f, 0xed, 0x03, 0xfe, 0xff, 0xfe, 0x57, 0x58, 0x03, 0x05, 0xd6, 0xfb, 0xd4, 0xfe, 0x9d, 0x63, 0x01, 0x31, 0x0d, 0x0c, 0x94, 0x08, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9a, 0x00, 0x00, 0x01, 0xf8, 0x05, 0xd9, 0x00, 0x0d, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x17, 0x11, 0x25, 0x17, 0x11, 0x07, 0x23, 0x27, 0x11, 0x05, 0x23, 0x11, 0x13, 0x11, 0x33, 0x25, 0x11, 0x23, 0x9f, 0x25, 0x06, 0x01, 0x2c, 0x02, 0x04, 0x24, 0x04, 0xfe, 0xd1, 0x02, 0x2f, 0x01, 0x01, 0x01, 0x02, 0x05, 0xd9, 0x05, 0xfe, 0x2f, 0xa1, 0x02, 0xfb, 0x63, 0x05, 0x05, 0x01, 0xe5, 0xa0, 0x04, 0x8a, 0xfd, 0x99, 0xfe, 0x7d, 0x90, 0x01, 0x7f, 0x00, 0x02, 0x00, 0x9b, 0x00, 0x00, 0x02, 0xe2, 0x05, 0xd9, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x33, 0x17, 0x11, 0x37, 0x17, 0x15, 0x06, 0x07, 0x11, 0x37, 0x15, 0x06, 0x07, 0x11, 0x07, 0x23, 0x27, 0x11, 0x05, 0x11, 0x07, 0x23, 0x27, 0x11, 0x07, 0x35, 0x34, 0x37, 0x11, 0x23, 0x07, 0x35, 0x37, 0x11, 0x37, 0x33, 0x17, 0x11, 0x25, 0x11, 0x01, 0x11, 0x25, 0x11, 0x02, 0x46, 0x2a, 0x04, 0x6b, 0x03, 0x03, 0x6b, 0x6e, 0x01, 0x6d, 0x04, 0x2a, 0x04, 0xfe, 0xfd, 0x05, 0x26, 0x04, 0x74, 0x74, 0x02, 0x72, 0x74, 0x04, 0x26, 0x05, 0x01, 0x03, 0xfe, 0xfd, 0x01, 0x03, 0x05, 0xd9, 0x05, 0xfe, 0xd0, 0x3c, 0x02, 0x8d, 0x07, 0x3c, 0xfe, 0x8b, 0x37, 0x87, 0x04, 0x43, 0xfe, 0xd7, 0x04, 0x04, 0x01, 0x11, 0x8c, 0xfe, 0xa6, 0x04, 0x04, 0x01, 0x41, 0x3c, 0x8e, 0x06, 0x3c, 0x01, 0x7b, 0x38, 0x8b, 0x41, 0x01, 0x1f, 0x04, 0x04, 0xfe, 0xfa, 0x86, 0x01, 0x4d, 0xfd, 0x96, 0xfe, 0x87, 0x8b, 0x01, 0x74, 0x00, 0x01, 0x00, 0x9a, 0x00, 0x00, 0x04, 0xc8, 0x05, 0xd9, 0x00, 0x48, 0x00, 0x00, 0x01, 0x23, 0x30, 0x23, 0x22, 0x07, 0x23, 0x22, 0x27, 0x35, 0x36, 0x35, 0x34, 0x27, 0x35, 0x36, 0x37, 0x33, 0x16, 0x3b, 0x01, 0x35, 0x34, 0x27, 0x35, 0x36, 0x37, 0x33, 0x16, 0x32, 0x37, 0x33, 0x16, 0x17, 0x15, 0x06, 0x1d, 0x01, 0x33, 0x32, 0x37, 0x33, 0x16, 0x17, 0x15, 0x06, 0x15, 0x14, 0x17, 0x15, 0x06, 0x2b, 0x01, 0x26, 0x2b, 0x02, 0x11, 0x14, 0x17, 0x15, 0x06, 0x07, 0x23, 0x26, 0x22, 0x07, 0x23, 0x26, 0x27, 0x35, 0x36, 0x35, 0x02, 0x71, 0x98, 0x03, 0xa1, 0x48, 0x33, 0x15, 0x0a, 0x59, 0x59, 0x02, 0x1c, 0x34, 0x4a, 0xa3, 0x97, 0x76, 0x02, 0x1b, 0x34, 0x28, 0x7e, 0x29, 0x34, 0x1a, 0x03, 0x76, 0x92, 0xa3, 0x4b, 0x32, 0x1e, 0x02, 0x59, 0x59, 0x0a, 0x16, 0x32, 0x48, 0xa1, 0x04, 0x93, 0x76, 0x03, 0x1a, 0x34, 0x29, 0x7e, 0x28, 0x34, 0x1b, 0x02, 0x76, 0x03, 0x11, 0x5a, 0x23, 0x3b, 0x31, 0x37, 0x46, 0x2d, 0x3a, 0x1d, 0x03, 0x83, 0xaf, 0xb5, 0x53, 0x38, 0x21, 0x02, 0x63, 0x63, 0x02, 0x21, 0x38, 0x53, 0xb5, 0xaf, 0x83, 0x03, 0x1d, 0x3a, 0x2d, 0x46, 0x37, 0x31, 0x3b, 0x23, 0x5a, 0xfe, 0x52, 0xb5, 0x53, 0x39, 0x20, 0x02, 0x63, 0x63, 0x02, 0x20, 0x39, 0x53, 0xb5, 0x00, 0x06, 0x00, 0x76, 0x00, 0x00, 0x05, 0x0d, 0x05, 0xd9, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x3b, 0x00, 0x47, 0x00, 0x00, 0x01, 0x06, 0x07, 0x16, 0x17, 0x37, 0x35, 0x05, 0x15, 0x17, 0x36, 0x37, 0x26, 0x27, 0x01, 0x26, 0x27, 0x06, 0x07, 0x17, 0x33, 0x03, 0x23, 0x07, 0x16, 0x17, 0x36, 0x37, 0x03, 0x33, 0x37, 0x16, 0x17, 0x06, 0x07, 0x27, 0x23, 0x11, 0x17, 0x06, 0x07, 0x26, 0x27, 0x37, 0x11, 0x23, 0x07, 0x26, 0x27, 0x36, 0x37, 0x17, 0x33, 0x35, 0x27, 0x36, 0x37, 0x16, 0x17, 0x0f, 0x01, 0x15, 0x23, 0x15, 0x33, 0x11, 0x33, 0x11, 0x33, 0x35, 0x23, 0x35, 0x01, 0x1c, 0x14, 0x2c, 0x2b, 0x15, 0x55, 0x02, 0xa2, 0x55, 0x14, 0x2b, 0x2b, 0x14, 0xfe, 0xac, 0x28, 0x2a, 0x28, 0x28, 0x3d, 0x28, 0x01, 0x28, 0x3c, 0x28, 0x28, 0x29, 0x29, 0x07, 0xcd, 0xbc, 0x09, 0x6d, 0x6d, 0x09, 0xbc, 0xcd, 0x72, 0x60, 0x5e, 0x5e, 0x5d, 0x71, 0xcd, 0xbc, 0x09, 0x6e, 0x6e, 0x09, 0xbc, 0xcd, 0x71, 0x5d, 0x5f, 0x5d, 0x60, 0x72, 0x63, 0x68, 0x68, 0x31, 0x68, 0x68, 0x03, 0xb4, 0x2d, 0x2e, 0x2c, 0x2d, 0x43, 0x2e, 0x01, 0x2e, 0x43, 0x2e, 0x2c, 0x2e, 0x2d, 0x01, 0x6e, 0x17, 0x2f, 0x2f, 0x17, 0x5f, 0xfc, 0x52, 0x5f, 0x17, 0x2f, 0x2f, 0x17, 0x02, 0xf7, 0x7e, 0x69, 0x6a, 0x68, 0x68, 0x7e, 0xfe, 0x4e, 0xd0, 0x0b, 0x79, 0x79, 0x0b, 0xd0, 0x01, 0xb2, 0x7e, 0x68, 0x69, 0x69, 0x69, 0x7e, 0xd6, 0xd1, 0x0b, 0x7a, 0x7a, 0x0b, 0xd1, 0x73, 0x9f, 0x2e, 0xfe, 0x80, 0x01, 0x80, 0x2e, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x9a, 0x00, 0x00, 0x05, 0xdb, 0x05, 0xac, 0x00, 0x14, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x36, 0x00, 0x43, 0x00, 0x4d, 0x00, 0x68, 0x00, 0x77, 0x00, 0x8c, 0x00, 0x97, 0x00, 0xa6, 0x00, 0xaf, 0x00, 0x00, 0x01, 0x21, 0x32, 0x1f, 0x01, 0x37, 0x33, 0x32, 0x15, 0x03, 0x21, 0x27, 0x35, 0x36, 0x37, 0x35, 0x02, 0x27, 0x26, 0x3d, 0x01, 0x07, 0x33, 0x32, 0x17, 0x16, 0x15, 0x02, 0x07, 0x23, 0x24, 0x27, 0x35, 0x12, 0x37, 0x36, 0x17, 0x15, 0x13, 0x07, 0x15, 0x33, 0x37, 0x07, 0x26, 0x2f, 0x01, 0x01, 0x17, 0x13, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x01, 0x16, 0x13, 0x17, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x26, 0x03, 0x35, 0x17, 0x13, 0x33, 0x32, 0x3f, 0x01, 0x34, 0x2f, 0x01, 0x06, 0x25, 0x33, 0x32, 0x17, 0x16, 0x15, 0x07, 0x23, 0x27, 0x02, 0x0f, 0x01, 0x17, 0x07, 0x23, 0x26, 0x03, 0x26, 0x3d, 0x01, 0x34, 0x3f, 0x01, 0x23, 0x27, 0x35, 0x37, 0x17, 0x15, 0x17, 0x33, 0x15, 0x14, 0x07, 0x15, 0x16, 0x17, 0x13, 0x33, 0x17, 0x35, 0x27, 0x01, 0x33, 0x17, 0x15, 0x21, 0x32, 0x37, 0x33, 0x17, 0x15, 0x06, 0x03, 0x06, 0x2b, 0x01, 0x15, 0x07, 0x23, 0x02, 0x3d, 0x01, 0x27, 0x17, 0x11, 0x07, 0x21, 0x22, 0x2f, 0x01, 0x35, 0x34, 0x37, 0x05, 0x07, 0x17, 0x33, 0x35, 0x34, 0x3b, 0x01, 0x32, 0x3f, 0x01, 0x21, 0x26, 0x3d, 0x01, 0x05, 0x06, 0x07, 0x15, 0x14, 0x1f, 0x01, 0x33, 0x11, 0x02, 0xd7, 0x01, 0x64, 0x34, 0x1a, 0x45, 0x58, 0x08, 0x04, 0x9c, 0xfe, 0xc7, 0x04, 0x10, 0x4a, 0xa9, 0x0e, 0x29, 0x66, 0x15, 0x64, 0x32, 0x1b, 0x9e, 0x0f, 0x02, 0xfe, 0xf1, 0x04, 0x8e, 0x0f, 0x28, 0xf7, 0xb5, 0x13, 0xb5, 0x56, 0x19, 0x66, 0x0e, 0x12, 0xfd, 0x67, 0xd8, 0x90, 0x37, 0x46, 0x19, 0x4b, 0x28, 0x03, 0x3f, 0x10, 0x86, 0x04, 0x48, 0x14, 0x21, 0x83, 0x0b, 0xa2, 0x31, 0x8c, 0x78, 0x30, 0x21, 0x02, 0x2b, 0x56, 0xcd, 0xfd, 0x5e, 0x12, 0x08, 0x69, 0x2e, 0x04, 0x05, 0x5a, 0xa2, 0x0d, 0x03, 0x04, 0x06, 0x03, 0x14, 0x9b, 0x12, 0x4c, 0x12, 0x01, 0x5a, 0x04, 0x73, 0x10, 0x03, 0x68, 0x01, 0x8c, 0xb4, 0x02, 0x19, 0x56, 0x02, 0x3e, 0x04, 0x05, 0x01, 0x4e, 0x25, 0x21, 0x02, 0x04, 0x05, 0xb1, 0x16, 0x1f, 0xaf, 0x05, 0x07, 0x9b, 0x4a, 0x08, 0x05, 0xfe, 0xf4, 0x68, 0x2c, 0x05, 0x4f, 0x02, 0x1c, 0x55, 0x55, 0x05, 0x07, 0xd0, 0x14, 0x2a, 0x5e, 0xfe, 0x94, 0x07, 0xfd, 0xf2, 0x37, 0x05, 0x51, 0x1b, 0xf3, 0x05, 0xac, 0x47, 0x86, 0x38, 0x07, 0xfe, 0xd4, 0x05, 0x05, 0x11, 0x2a, 0x05, 0x01, 0x46, 0x14, 0x16, 0x04, 0x05, 0x0d, 0x80, 0x31, 0x0a, 0xfe, 0xc6, 0x11, 0xac, 0x08, 0x02, 0x01, 0x1a, 0x08, 0x2e, 0x17, 0x02, 0xfe, 0x9d, 0x0f, 0x03, 0xad, 0x0d, 0xc5, 0x0d, 0x05, 0xfe, 0xd1, 0x8a, 0x01, 0x17, 0x90, 0x66, 0xfe, 0xf5, 0x11, 0xfe, 0xef, 0x29, 0x14, 0x4d, 0x43, 0x12, 0x0b, 0x01, 0x3d, 0x05, 0x0f, 0xfe, 0xea, 0x67, 0x1a, 0x39, 0x45, 0xa2, 0x81, 0x6b, 0xd7, 0x4f, 0x0d, 0x05, 0x39, 0xfe, 0xcb, 0x21, 0x15, 0x28, 0x05, 0x1b, 0x01, 0x2d, 0x1a, 0x1f, 0x07, 0x1c, 0x83, 0x29, 0x3b, 0x05, 0x05, 0x26, 0x05, 0x0d, 0x02, 0x08, 0xc6, 0x0a, 0x1a, 0xfe, 0x01, 0x5d, 0x08, 0x03, 0xac, 0xfe, 0xd4, 0x05, 0x74, 0x21, 0x05, 0x02, 0x15, 0xfe, 0xb1, 0x1d, 0x79, 0x05, 0x01, 0x22, 0x0d, 0x03, 0xb3, 0x07, 0xfe, 0xa5, 0x05, 0x86, 0x26, 0x0d, 0x32, 0x7c, 0x0c, 0xac, 0xaa, 0x08, 0x1c, 0x62, 0xb3, 0x01, 0x14, 0x08, 0x1d, 0x61, 0x24, 0x0a, 0x55, 0x2b, 0x06, 0x01, 0x15, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x0a, 0x00, 0x23, 0x00, 0x38, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x33, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x05, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x02, 0x8c, 0x9a, 0xa7, 0xb6, 0x72, 0x9a, 0xfe, 0x4b, 0xfe, 0x28, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x01, 0xea, 0x01, 0x9a, 0x1a, 0x61, 0x1e, 0xfe, 0x01, 0x5c, 0xb8, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x1c, 0x00, 0x35, 0x00, 0x4a, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x35, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x01, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x03, 0x07, 0x01, 0x32, 0xfe, 0x26, 0x39, 0xb9, 0x16, 0x2c, 0x21, 0x43, 0x36, 0x2a, 0x5d, 0x50, 0x44, 0x65, 0x2b, 0x73, 0x8a, 0x22, 0x2b, 0x0d, 0x7d, 0xfd, 0x56, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x01, 0xd2, 0x5d, 0x55, 0x31, 0x9e, 0x15, 0x29, 0x38, 0x1a, 0x28, 0x33, 0x18, 0x26, 0x6e, 0x19, 0x14, 0x63, 0x51, 0x26, 0x44, 0x2d, 0x0d, 0x6d, 0xfe, 0xba, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x28, 0x00, 0x41, 0x00, 0x56, 0x00, 0x6b, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x03, 0xeb, 0x09, 0x56, 0x9c, 0x8d, 0x2e, 0x61, 0x3f, 0x41, 0x5b, 0x2f, 0x55, 0x53, 0x4e, 0x47, 0x64, 0x68, 0x41, 0x40, 0x43, 0x42, 0x25, 0x56, 0x4e, 0x44, 0x62, 0x2c, 0x74, 0x8b, 0x4b, 0xfc, 0xc6, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x02, 0xbe, 0x02, 0x53, 0x3c, 0x5c, 0x65, 0x0e, 0x12, 0x6c, 0x1e, 0x12, 0x32, 0x33, 0x2d, 0x32, 0x5b, 0x27, 0x26, 0x27, 0x29, 0x0e, 0x14, 0x62, 0x0f, 0x0d, 0x59, 0x4b, 0x34, 0x4a, 0xfe, 0x18, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x26, 0x00, 0x3b, 0x00, 0x50, 0x00, 0x00, 0x01, 0x03, 0x33, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x03, 0x57, 0xcf, 0xcf, 0x12, 0x9f, 0x6d, 0x6d, 0x8d, 0xfe, 0xa8, 0xfe, 0xb5, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x03, 0x52, 0xfe, 0xff, 0x01, 0x8a, 0xfe, 0x76, 0x5f, 0x8e, 0x8e, 0x60, 0xfe, 0x84, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x1d, 0x00, 0x36, 0x00, 0x4b, 0x00, 0x60, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x15, 0x06, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x02, 0x75, 0x01, 0x96, 0xfe, 0xe5, 0x02, 0x2c, 0x15, 0x7d, 0x92, 0x96, 0x87, 0x2d, 0x5e, 0x3f, 0x45, 0x54, 0x2f, 0x4a, 0x54, 0x54, 0x4a, 0x23, 0x48, 0x3f, 0xfe, 0x3f, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x03, 0xd0, 0x5f, 0x70, 0x01, 0x07, 0x74, 0x63, 0x64, 0x72, 0x0e, 0x0f, 0x72, 0x1f, 0x12, 0x40, 0x38, 0x39, 0x40, 0x0d, 0x19, 0xfe, 0x53, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x00, 0x05, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x09, 0x00, 0x22, 0x00, 0x3b, 0x00, 0x50, 0x00, 0x65, 0x00, 0x00, 0x01, 0x22, 0x06, 0x14, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x13, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x03, 0x2c, 0x32, 0x3d, 0x3d, 0x32, 0x34, 0x3b, 0x3b, 0x8a, 0x37, 0x3f, 0x1f, 0x4e, 0x53, 0x03, 0x06, 0x54, 0x32, 0x69, 0x7a, 0x7f, 0x69, 0x78, 0x7e, 0x98, 0x84, 0x22, 0x45, 0xfc, 0xfb, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x02, 0xbc, 0x41, 0x76, 0x40, 0x40, 0x76, 0x41, 0x01, 0x0e, 0x66, 0x16, 0x0e, 0x60, 0x35, 0x07, 0x28, 0x73, 0x61, 0x5f, 0x74, 0xa5, 0x96, 0x8f, 0xae, 0x0c, 0xfc, 0xfd, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x34, 0x00, 0x49, 0x00, 0x00, 0x01, 0x21, 0x15, 0x03, 0x23, 0x13, 0x21, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0x02, 0x5f, 0x01, 0xce, 0xf5, 0x84, 0xe5, 0xfe, 0xc6, 0xfe, 0x55, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0x03, 0xba, 0x32, 0xfd, 0xb9, 0x02, 0x1a, 0xfd, 0x7b, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8c, 0x00, 0x20, 0x05, 0xe8, 0x05, 0xd9, 0x00, 0x18, 0x00, 0x2d, 0x00, 0x42, 0x00, 0x00, 0x37, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x37, 0x13, 0x27, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x21, 0x15, 0x21, 0x22, 0x27, 0x26, 0x25, 0x06, 0x07, 0x23, 0x15, 0x27, 0x37, 0x15, 0x33, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x03, 0x37, 0x13, 0x16, 0x15, 0x14, 0x01, 0x16, 0x1f, 0x01, 0x37, 0x03, 0x27, 0x37, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x03, 0x27, 0x13, 0x36, 0x37, 0x36, 0xb4, 0x28, 0x23, 0x4b, 0x38, 0xd4, 0x16, 0x37, 0x59, 0x07, 0x15, 0x1f, 0x54, 0x0e, 0x0e, 0x01, 0x6d, 0xfe, 0x4d, 0x44, 0x33, 0x29, 0x04, 0xfd, 0x4d, 0x9d, 0x97, 0xbd, 0xbd, 0xb3, 0x34, 0x16, 0x07, 0x2d, 0xb5, 0x7a, 0xdb, 0x21, 0xfd, 0x35, 0x99, 0x56, 0x4c, 0x38, 0x16, 0xd3, 0x36, 0x59, 0x1f, 0x2e, 0x07, 0x06, 0x39, 0x2f, 0xb8, 0x7a, 0xd9, 0x23, 0x32, 0x2a, 0xd6, 0x4d, 0x4f, 0x48, 0x4b, 0x92, 0x24, 0x6b, 0xfe, 0xff, 0x24, 0xac, 0x14, 0x13, 0x23, 0x20, 0x2c, 0x01, 0x9f, 0x21, 0x1b, 0x61, 0x93, 0x0a, 0x49, 0x97, 0x95, 0x46, 0x0b, 0x37, 0x11, 0x13, 0x34, 0x48, 0x01, 0x60, 0x4f, 0xfe, 0x5d, 0x42, 0x41, 0x36, 0x04, 0x9e, 0x01, 0x92, 0x91, 0x24, 0xfe, 0xff, 0x6b, 0x23, 0xac, 0x28, 0x01, 0x09, 0x6b, 0xfe, 0xa1, 0x4e, 0x01, 0xa4, 0x41, 0x21, 0x1b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x9a, 0x00, 0x00, 0x05, 0xd9, 0x05, 0xa1, 0x00, 0x10, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x39, 0x00, 0x48, 0x00, 0x52, 0x00, 0x00, 0x01, 0x21, 0x32, 0x1f, 0x01, 0x37, 0x33, 0x15, 0x02, 0x07, 0x21, 0x35, 0x36, 0x37, 0x03, 0x26, 0x23, 0x07, 0x32, 0x1f, 0x01, 0x03, 0x26, 0x27, 0x12, 0x37, 0x36, 0x01, 0x12, 0x15, 0x17, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x26, 0x03, 0x36, 0x37, 0x05, 0x12, 0x17, 0x27, 0x02, 0x0f, 0x01, 0x17, 0x23, 0x03, 0x27, 0x36, 0x37, 0x36, 0x35, 0x27, 0x35, 0x33, 0x01, 0x33, 0x15, 0x21, 0x32, 0x37, 0x33, 0x14, 0x03, 0x06, 0x2b, 0x01, 0x15, 0x23, 0x03, 0x27, 0x17, 0x11, 0x07, 0x21, 0x22, 0x2f, 0x01, 0x34, 0x37, 0x02, 0xd9, 0x01, 0x5f, 0x34, 0x1e, 0x42, 0x5a, 0x05, 0x8d, 0x0f, 0xfe, 0xcc, 0x57, 0x04, 0xb2, 0x1f, 0x0c, 0x5c, 0x5f, 0x26, 0x2c, 0xae, 0xf0, 0x19, 0x86, 0x14, 0x2c, 0x03, 0x05, 0x95, 0x02, 0x58, 0x0d, 0x24, 0x71, 0x0c, 0x9e, 0x16, 0xb5, 0xfc, 0xd3, 0x9a, 0x02, 0x65, 0xad, 0x03, 0x03, 0x04, 0x04, 0xb5, 0x07, 0x03, 0x48, 0x18, 0x5a, 0xcd, 0x02, 0x8f, 0x02, 0x01, 0x63, 0x1d, 0x1b, 0x03, 0xb5, 0x15, 0x1c, 0xb8, 0x04, 0x98, 0x54, 0x04, 0x04, 0xfe, 0xfb, 0x69, 0x2a, 0x04, 0x4b, 0x05, 0xa1, 0x54, 0x7d, 0x37, 0x02, 0xfe, 0xed, 0x15, 0x05, 0x35, 0x09, 0x01, 0x62, 0x1a, 0x05, 0x5c, 0x56, 0xfe, 0xb6, 0x9a, 0x13, 0x01, 0x04, 0x1c, 0x2f, 0xfe, 0x56, 0xfe, 0xea, 0x17, 0x27, 0x66, 0x3a, 0x08, 0x0f, 0x01, 0x3a, 0x17, 0x70, 0x1b, 0xfe, 0xe0, 0x0d, 0x3f, 0xfe, 0xb6, 0x10, 0x29, 0x1d, 0x01, 0x5c, 0x20, 0x1f, 0x80, 0x29, 0x0b, 0x39, 0x03, 0xfe, 0xa5, 0x73, 0x1a, 0x09, 0xfe, 0xa4, 0x17, 0x73, 0x01, 0x25, 0xb0, 0x06, 0xfe, 0xa9, 0x05, 0x80, 0x30, 0x30, 0x82, 0x00, 0x00, 0x00, 0x07, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd9, 0x00, 0x13, 0x00, 0x25, 0x00, 0x32, 0x00, 0x3c, 0x00, 0x4a, 0x00, 0x5c, 0x00, 0x65, 0x00, 0x00, 0x01, 0x33, 0x20, 0x13, 0x16, 0x1d, 0x01, 0x10, 0x05, 0x06, 0x2b, 0x01, 0x20, 0x03, 0x26, 0x3d, 0x01, 0x10, 0x25, 0x36, 0x17, 0x15, 0x32, 0x1f, 0x01, 0x15, 0x06, 0x07, 0x15, 0x33, 0x36, 0x37, 0x23, 0x07, 0x26, 0x27, 0x26, 0x23, 0x01, 0x16, 0x33, 0x36, 0x13, 0x26, 0x23, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x05, 0x15, 0x13, 0x33, 0x32, 0x37, 0x34, 0x2f, 0x01, 0x22, 0x05, 0x17, 0x06, 0x07, 0x14, 0x1f, 0x01, 0x33, 0x34, 0x3f, 0x01, 0x33, 0x17, 0x27, 0x01, 0x07, 0x16, 0x17, 0x33, 0x35, 0x37, 0x33, 0x32, 0x3f, 0x01, 0x35, 0x23, 0x06, 0x23, 0x21, 0x27, 0x35, 0x05, 0x06, 0x1d, 0x01, 0x14, 0x1f, 0x01, 0x33, 0x11, 0x03, 0x2e, 0x19, 0x01, 0x63, 0xdb, 0x57, 0xfe, 0x97, 0x92, 0xa5, 0x03, 0xfe, 0x7b, 0xd0, 0x4b, 0x01, 0x1c, 0xab, 0x7c, 0x22, 0x2e, 0x6d, 0x19, 0x34, 0xfc, 0x09, 0x77, 0x03, 0x4a, 0x47, 0x11, 0x13, 0x17, 0xfd, 0xc7, 0xda, 0x08, 0x04, 0x86, 0x3c, 0x14, 0x1a, 0x2d, 0x56, 0x30, 0x46, 0x0b, 0x02, 0x40, 0x8a, 0x6a, 0x58, 0x18, 0x5b, 0x25, 0x0c, 0xfc, 0x38, 0x48, 0x44, 0x09, 0x7d, 0x1a, 0x02, 0x19, 0x80, 0x08, 0x44, 0x7d, 0x01, 0xc6, 0x79, 0x05, 0x74, 0x03, 0x06, 0x9a, 0x21, 0x37, 0x5f, 0x03, 0x13, 0x1f, 0xfe, 0xe4, 0x06, 0xfe, 0x20, 0x3b, 0x60, 0x17, 0xe3, 0x05, 0xd9, 0xfe, 0x92, 0xae, 0xcf, 0x06, 0xfe, 0x4f, 0xeb, 0x4c, 0x01, 0x86, 0xa8, 0xa3, 0x35, 0x01, 0x5f, 0xf1, 0x83, 0x93, 0x03, 0x6b, 0xce, 0x03, 0x16, 0x1f, 0x03, 0x08, 0xf0, 0x2c, 0x89, 0x16, 0x0c, 0xfe, 0xdf, 0x8b, 0x0f, 0x01, 0x01, 0x7e, 0x12, 0x79, 0x7d, 0x1f, 0xde, 0x03, 0xfe, 0xf4, 0x8a, 0x2f, 0x9d, 0x4d, 0x3c, 0x34, 0x7b, 0x31, 0x16, 0xe8, 0x3b, 0x43, 0x19, 0xf8, 0x2c, 0xf1, 0xfe, 0xe5, 0xfb, 0x03, 0xec, 0x5b, 0x06, 0x80, 0xb1, 0x03, 0x10, 0x06, 0x5f, 0x65, 0x69, 0x27, 0x0c, 0x5b, 0x29, 0x04, 0x01, 0x24, 0x00, 0x08, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd9, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x2f, 0x00, 0x3a, 0x00, 0x42, 0x00, 0x52, 0x00, 0x60, 0x00, 0x6a, 0x00, 0x00, 0x01, 0x20, 0x13, 0x16, 0x15, 0x10, 0x05, 0x06, 0x23, 0x20, 0x03, 0x26, 0x35, 0x10, 0x25, 0x36, 0x01, 0x10, 0x05, 0x16, 0x3b, 0x01, 0x20, 0x13, 0x36, 0x35, 0x10, 0x25, 0x26, 0x23, 0x20, 0x03, 0x06, 0x01, 0x21, 0x32, 0x1f, 0x01, 0x37, 0x15, 0x06, 0x07, 0x23, 0x35, 0x37, 0x26, 0x2f, 0x01, 0x23, 0x32, 0x1f, 0x01, 0x03, 0x23, 0x26, 0x27, 0x36, 0x37, 0x36, 0x01, 0x16, 0x1d, 0x01, 0x06, 0x2b, 0x01, 0x03, 0x25, 0x33, 0x17, 0x07, 0x23, 0x27, 0x23, 0x02, 0x07, 0x15, 0x26, 0x03, 0x27, 0x34, 0x37, 0x27, 0x01, 0x33, 0x15, 0x21, 0x32, 0x37, 0x15, 0x03, 0x07, 0x23, 0x07, 0x15, 0x23, 0x27, 0x25, 0x21, 0x17, 0x11, 0x07, 0x23, 0x22, 0x2f, 0x01, 0x36, 0x03, 0x3c, 0x01, 0x6e, 0xd6, 0x5c, 0xfe, 0xaa, 0x93, 0xbc, 0xfe, 0x87, 0xd0, 0x55, 0x01, 0x61, 0x99, 0xfe, 0x2d, 0x01, 0x3e, 0x8e, 0x99, 0x2b, 0x01, 0x44, 0xce, 0x53, 0xfe, 0xba, 0x90, 0xa6, 0xfe, 0xa2, 0xc9, 0x52, 0x02, 0x1e, 0x01, 0x1b, 0x30, 0x15, 0x34, 0x49, 0x62, 0x18, 0xf5, 0x46, 0x84, 0x17, 0x19, 0x45, 0x52, 0x1b, 0x28, 0x8a, 0x03, 0xcc, 0x10, 0x6b, 0x19, 0x28, 0x02, 0x5f, 0x7b, 0x13, 0x61, 0x5a, 0x8c, 0xfd, 0x29, 0xf8, 0x83, 0x03, 0x03, 0x46, 0x03, 0x95, 0x05, 0x0b, 0x8d, 0x02, 0x4e, 0x46, 0x02, 0xb0, 0x06, 0x01, 0x26, 0x12, 0x16, 0x9c, 0x15, 0x98, 0x05, 0x06, 0x79, 0xfe, 0xaf, 0x01, 0x0d, 0x06, 0x06, 0xdc, 0x49, 0x23, 0x06, 0x01, 0x05, 0xd9, 0xfe, 0x97, 0xb2, 0xd4, 0xfe, 0x58, 0xe9, 0x59, 0x01, 0x74, 0xa2, 0xdb, 0x01, 0xa9, 0xeb, 0x54, 0xfd, 0x12, 0xfe, 0x70, 0xd8, 0x58, 0x01, 0x59, 0xa5, 0xc5, 0x01, 0x8c, 0xe0, 0x53, 0xfe, 0xa6, 0x9f, 0x01, 0x6d, 0x45, 0x62, 0x2c, 0x03, 0xcc, 0x23, 0x03, 0x34, 0xfe, 0x27, 0x0c, 0x46, 0x56, 0xfe, 0xfe, 0x7f, 0x10, 0xd5, 0x1a, 0x20, 0xfe, 0xa7, 0xe2, 0x21, 0x17, 0x82, 0x01, 0x09, 0x59, 0xf4, 0x03, 0x31, 0xfe, 0xea, 0x15, 0x1a, 0x0b, 0x01, 0x12, 0x11, 0x1c, 0x8d, 0x31, 0xfe, 0xec, 0x5f, 0x14, 0x06, 0xfe, 0xdc, 0x09, 0x06, 0x55, 0xee, 0x8c, 0x05, 0xfe, 0xeb, 0x05, 0x67, 0x2c, 0x31, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdd, 0x05, 0xd9, 0x00, 0x07, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x41, 0x00, 0x52, 0x00, 0x00, 0x01, 0x16, 0x17, 0x32, 0x37, 0x26, 0x27, 0x06, 0x01, 0x20, 0x13, 0x16, 0x15, 0x10, 0x05, 0x06, 0x23, 0x20, 0x03, 0x26, 0x35, 0x10, 0x25, 0x36, 0x01, 0x06, 0x07, 0x16, 0x33, 0x36, 0x37, 0x26, 0x01, 0x15, 0x23, 0x06, 0x2b, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x35, 0x34, 0x35, 0x34, 0x36, 0x37, 0x32, 0x17, 0x36, 0x33, 0x1e, 0x01, 0x15, 0x14, 0x15, 0x14, 0x15, 0x14, 0x06, 0x07, 0x23, 0x22, 0x27, 0x23, 0x25, 0x10, 0x05, 0x16, 0x3b, 0x01, 0x20, 0x13, 0x36, 0x35, 0x10, 0x25, 0x26, 0x23, 0x20, 0x03, 0x06, 0x01, 0x95, 0x02, 0xa5, 0x81, 0x57, 0x4e, 0x92, 0x9d, 0x01, 0xa5, 0x01, 0x6e, 0xd6, 0x5c, 0xfe, 0xaa, 0x93, 0xbc, 0xfe, 0x87, 0xd0, 0x55, 0x01, 0x61, 0x99, 0x01, 0xb1, 0x92, 0x4e, 0x57, 0x81, 0xa5, 0x02, 0x02, 0xfe, 0x5a, 0x03, 0x6a, 0xa0, 0x0d, 0x7e, 0x6d, 0x8c, 0x7a, 0x8d, 0x72, 0x73, 0x8e, 0x7a, 0x8c, 0x6d, 0x7e, 0x0d, 0xa0, 0x6b, 0x02, 0xfd, 0x83, 0x01, 0x3e, 0x8e, 0x99, 0x2b, 0x01, 0x44, 0xce, 0x53, 0xfe, 0xba, 0x90, 0xa6, 0xfe, 0xa2, 0xc9, 0x52, 0x02, 0xf4, 0xcd, 0x02, 0xcb, 0xc2, 0x04, 0x03, 0x02, 0x26, 0xfe, 0x97, 0xb2, 0xd4, 0xfe, 0x58, 0xe9, 0x59, 0x01, 0x74, 0xa2, 0xdb, 0x01, 0xa9, 0xeb, 0x54, 0xfd, 0xdd, 0x04, 0xc2, 0xcb, 0x02, 0xcd, 0xbf, 0xfe, 0xf3, 0x1c, 0xbd, 0x0f, 0xb9, 0x50, 0x07, 0x08, 0x04, 0x05, 0x74, 0x99, 0x01, 0xaa, 0xaa, 0x01, 0x99, 0x74, 0x05, 0x04, 0x08, 0x07, 0x50, 0xb9, 0x0f, 0xbd, 0x61, 0xfe, 0x70, 0xd8, 0x58, 0x01, 0x59, 0xa5, 0xc5, 0x01, 0x8c, 0xe0, 0x53, 0xfe, 0xa6, 0x9f, 0x00, 0x00, 0x00, 0x02, 0x01, 0x12, 0x00, 0x02, 0x05, 0x61, 0x05, 0xd9, 0x00, 0x18, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x32, 0x15, 0x06, 0x07, 0x17, 0x33, 0x32, 0x17, 0x07, 0x23, 0x17, 0x21, 0x16, 0x13, 0x37, 0x17, 0x06, 0x07, 0x26, 0x03, 0x21, 0x22, 0x03, 0x34, 0x01, 0x06, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x14, 0x1e, 0x01, 0x32, 0x36, 0x37, 0x17, 0x06, 0x02, 0x57, 0x8a, 0x01, 0x73, 0x16, 0xf7, 0x0b, 0x0e, 0x03, 0xf8, 0x0b, 0x01, 0x91, 0x0a, 0x7f, 0x79, 0x2b, 0x05, 0xf6, 0x0e, 0x87, 0xfe, 0x53, 0x0b, 0x4c, 0x01, 0xc5, 0x65, 0x6f, 0x70, 0xcb, 0x71, 0x3a, 0x1e, 0x2a, 0x24, 0x16, 0x02, 0x4a, 0x89, 0x96, 0x88, 0x25, 0x3e, 0x29, 0x05, 0xd9, 0x8e, 0xa3, 0x02, 0xe6, 0x92, 0x04, 0x65, 0x06, 0xfe, 0x72, 0x28, 0x8d, 0x08, 0x59, 0x18, 0x01, 0xad, 0x03, 0x24, 0x85, 0xfa, 0x68, 0x3f, 0x7d, 0xe1, 0x7d, 0x7c, 0x72, 0x3c, 0x2e, 0xd9, 0x3c, 0x43, 0x53, 0x98, 0x53, 0x53, 0x4c, 0xa9, 0x32, 0x00, 0x00, 0x03, 0x00, 0x87, 0x00, 0x00, 0x05, 0xbd, 0x05, 0xcd, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x02, 0xa4, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfd, 0xe3, 0x05, 0x36, 0xfb, 0x5f, 0x04, 0x0c, 0xfb, 0xf4, 0x02, 0xe9, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfd, 0x42, 0x05, 0xcd, 0xfa, 0x33, 0xa5, 0x04, 0x83, 0x00, 0x00, 0x00, 0x04, 0x00, 0x87, 0x00, 0x00, 0x05, 0xbd, 0x05, 0xcd, 0x00, 0x16, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x8d, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfc, 0xcc, 0x05, 0x36, 0xfb, 0x5f, 0x04, 0x0c, 0xfb, 0xf4, 0x01, 0xae, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x02, 0x9c, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfc, 0x0c, 0x05, 0xcd, 0xfa, 0x33, 0xa5, 0x04, 0x83, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x87, 0x00, 0x00, 0x05, 0xbd, 0x05, 0xcd, 0x00, 0x16, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x8d, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x01, 0x17, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x01, 0x17, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfc, 0xcc, 0x05, 0x36, 0xfb, 0x5f, 0x04, 0x0c, 0xfb, 0xf4, 0x01, 0xae, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x01, 0x66, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x01, 0x61, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfc, 0x0c, 0x05, 0xcd, 0xfa, 0x33, 0xa5, 0x04, 0x83, 0x00, 0x06, 0x00, 0x87, 0x00, 0x00, 0x05, 0xbd, 0x05, 0xcd, 0x00, 0x16, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x8d, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfd, 0xd2, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfc, 0xcc, 0x05, 0x36, 0xfb, 0x5f, 0x04, 0x0c, 0xfb, 0xf4, 0x04, 0x1f, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfd, 0xba, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x02, 0x9c, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfc, 0x0c, 0x05, 0xcd, 0xfa, 0x33, 0xa5, 0x04, 0x83, 0x00, 0x00, 0x00, 0x07, 0x00, 0x87, 0x00, 0x00, 0x05, 0xbd, 0x05, 0xcd, 0x00, 0x16, 0x00, 0x2d, 0x00, 0x44, 0x00, 0x5b, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x8d, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfd, 0xd2, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfe, 0xe9, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfd, 0xe3, 0x05, 0x36, 0xfb, 0x5f, 0x04, 0x0c, 0xfb, 0xf4, 0x04, 0x1f, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfd, 0xba, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x02, 0x9c, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfe, 0xf5, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfd, 0x42, 0x05, 0xcd, 0xfa, 0x33, 0xa5, 0x04, 0x83, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x87, 0x00, 0x00, 0x05, 0xbd, 0x05, 0xcd, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x46, 0x00, 0x5d, 0x00, 0x74, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x93, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x03, 0xba, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0xfd, 0xd3, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfd, 0xd2, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x02, 0x2e, 0x11, 0x12, 0x1c, 0x18, 0x27, 0x26, 0x19, 0x1b, 0x13, 0x11, 0x11, 0x12, 0x1c, 0x19, 0x4c, 0x19, 0x1b, 0x13, 0x11, 0xfc, 0xcc, 0x05, 0x36, 0xfb, 0x5f, 0x04, 0x0c, 0xfb, 0xf4, 0x02, 0xe9, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x01, 0x93, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfd, 0x56, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x03, 0x00, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0x2b, 0x2a, 0x1c, 0x1e, 0x15, 0x13, 0x13, 0x14, 0x1f, 0x1b, 0xfb, 0xda, 0x05, 0xcd, 0xfa, 0x33, 0xa5, 0x04, 0x83, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x99, 0x00, 0x01, 0x05, 0xdc, 0x05, 0xd9, 0x00, 0x0c, 0x00, 0x1b, 0x00, 0x29, 0x00, 0x00, 0x01, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x20, 0x24, 0x02, 0x10, 0x12, 0x24, 0x01, 0x14, 0x12, 0x04, 0x20, 0x24, 0x12, 0x35, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x04, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x03, 0x3a, 0xa9, 0x01, 0x42, 0xb6, 0xb1, 0xfe, 0xbf, 0xfe, 0xa3, 0xfe, 0xbe, 0xb1, 0xb5, 0x01, 0x41, 0xfe, 0x57, 0x9d, 0x01, 0x1c, 0x01, 0x36, 0x01, 0x1c, 0x9d, 0xa1, 0xfe, 0xe3, 0x96, 0x97, 0xfe, 0xe3, 0xa0, 0x03, 0x38, 0x1e, 0x36, 0x1e, 0x1d, 0x36, 0x1f, 0x20, 0x36, 0x1c, 0x1e, 0x35, 0x05, 0xd9, 0xc1, 0xfe, 0x98, 0xfe, 0x7a, 0xfe, 0x9d, 0xc6, 0xc6, 0x01, 0x63, 0x01, 0x86, 0x01, 0x68, 0xc1, 0xfd, 0x14, 0xad, 0xfe, 0xc5, 0xae, 0xae, 0x01, 0x3b, 0xad, 0xac, 0x01, 0x3f, 0xab, 0xab, 0xfe, 0xc1, 0xcd, 0x42, 0x3c, 0x21, 0x21, 0x3c, 0x42, 0x3d, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x99, 0x00, 0x01, 0x05, 0xdc, 0x05, 0xd9, 0x00, 0x0c, 0x00, 0x1b, 0x00, 0x29, 0x00, 0x36, 0x00, 0x00, 0x01, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x20, 0x24, 0x02, 0x10, 0x12, 0x24, 0x01, 0x14, 0x12, 0x04, 0x20, 0x24, 0x12, 0x35, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x04, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x24, 0x32, 0x1e, 0x01, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x34, 0x36, 0x03, 0x3a, 0xa9, 0x01, 0x42, 0xb6, 0xb1, 0xfe, 0xbf, 0xfe, 0xa3, 0xfe, 0xbe, 0xb1, 0xb5, 0x01, 0x41, 0xfe, 0x57, 0x9d, 0x01, 0x1c, 0x01, 0x36, 0x01, 0x1c, 0x9d, 0xa1, 0xfe, 0xe3, 0x96, 0x97, 0xfe, 0xe3, 0xa0, 0x03, 0x38, 0x1e, 0x36, 0x1e, 0x1d, 0x36, 0x1f, 0x20, 0x36, 0x1c, 0x1e, 0x35, 0xfd, 0x85, 0x3a, 0x36, 0x1f, 0x1f, 0x36, 0x1d, 0x1d, 0x36, 0x1f, 0x20, 0x05, 0xd9, 0xc1, 0xfe, 0x98, 0xfe, 0x7a, 0xfe, 0x9d, 0xc6, 0xc6, 0x01, 0x63, 0x01, 0x86, 0x01, 0x68, 0xc1, 0xfd, 0x14, 0xad, 0xfe, 0xc5, 0xae, 0xae, 0x01, 0x3b, 0xad, 0xac, 0x01, 0x3f, 0xab, 0xab, 0xfe, 0xc1, 0xcd, 0x42, 0x3c, 0x21, 0x21, 0x3c, 0x42, 0x3d, 0x20, 0x20, 0xdc, 0x20, 0x3d, 0x42, 0x3c, 0x21, 0x21, 0x3c, 0x42, 0x3d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x99, 0x00, 0x01, 0x05, 0xdc, 0x05, 0xd9, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x20, 0x24, 0x02, 0x10, 0x12, 0x24, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x14, 0x1e, 0x01, 0x03, 0x3a, 0xa9, 0x01, 0x42, 0xb6, 0xb1, 0xfe, 0xbf, 0xfe, 0xa3, 0xfe, 0xbe, 0xb1, 0xb5, 0x01, 0x41, 0x02, 0x01, 0x1c, 0x36, 0x20, 0x1f, 0x36, 0x1d, 0x1e, 0x36, 0x1e, 0x1f, 0x35, 0x05, 0xd9, 0xc1, 0xfe, 0x98, 0xfe, 0x7a, 0xfe, 0x9d, 0xc6, 0xc6, 0x01, 0x63, 0x01, 0x86, 0x01, 0x68, 0xc1, 0xfc, 0x96, 0x20, 0x3d, 0x42, 0x3c, 0x21, 0x21, 0x3c, 0x42, 0x3d, 0x20, 0x00, 0x00, 0x03, 0x00, 0x99, 0x00, 0x01, 0x05, 0xdc, 0x05, 0xd9, 0x00, 0x0c, 0x00, 0x1a, 0x00, 0x27, 0x00, 0x00, 0x01, 0x32, 0x04, 0x12, 0x10, 0x02, 0x04, 0x20, 0x24, 0x02, 0x10, 0x12, 0x24, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x14, 0x1e, 0x01, 0x24, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x03, 0x3a, 0xa9, 0x01, 0x42, 0xb6, 0xb1, 0xfe, 0xbf, 0xfe, 0xa3, 0xfe, 0xbe, 0xb1, 0xb5, 0x01, 0x41, 0x02, 0x01, 0x1c, 0x36, 0x20, 0x1f, 0x36, 0x1d, 0x1e, 0x36, 0x1e, 0x1f, 0x35, 0xfc, 0xfb, 0x1f, 0x36, 0x1d, 0x1d, 0x36, 0x1f, 0x1f, 0x36, 0x3a, 0x35, 0x05, 0xd9, 0xc1, 0xfe, 0x98, 0xfe, 0x7a, 0xfe, 0x9d, 0xc6, 0xc6, 0x01, 0x63, 0x01, 0x86, 0x01, 0x68, 0xc1, 0xfc, 0x96, 0x20, 0x3d, 0x42, 0x3c, 0x21, 0x21, 0x3c, 0x42, 0x3d, 0x20, 0x9f, 0x42, 0x3c, 0x21, 0x21, 0x3c, 0x42, 0x3d, 0x20, 0x20, 0x00, 0x01, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x00, 0xc8, 0x00, 0x03, 0x00, 0x00, 0x37, 0x21, 0x15, 0x21, 0x99, 0x05, 0x42, 0xfa, 0xbe, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x00, 0xc8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x37, 0x21, 0x15, 0x21, 0x25, 0x21, 0x15, 0x21, 0x99, 0x02, 0x23, 0xfd, 0xdd, 0x03, 0x1f, 0x02, 0x23, 0xfd, 0xdd, 0xc8, 0xc8, 0xc8, 0xc8, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x03, 0x4d, 0x12, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x85, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x03, 0x4d, 0x12, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x85, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x03, 0x4e, 0x12, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x86, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x03, 0x4e, 0x12, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x86, 0x00, 0x02, 0x01, 0x35, 0x00, 0x06, 0x05, 0x3d, 0x05, 0xd9, 0x00, 0x11, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x36, 0x33, 0x32, 0x04, 0x33, 0x32, 0x37, 0x11, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x2f, 0x01, 0x23, 0x35, 0x33, 0x15, 0x23, 0x15, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x06, 0x23, 0x22, 0x24, 0x23, 0x22, 0x07, 0x11, 0x23, 0x01, 0xd3, 0x2f, 0x36, 0x73, 0x01, 0x2d, 0xa8, 0x3f, 0x41, 0x2f, 0x30, 0x96, 0x9f, 0x7d, 0xac, 0x2d, 0x31, 0x12, 0x59, 0x44, 0xf3, 0x45, 0x30, 0x2e, 0xae, 0x9a, 0x98, 0x91, 0x47, 0x43, 0x5f, 0x5c, 0x9a, 0xfe, 0xe3, 0x74, 0x48, 0x3f, 0x56, 0x02, 0x9f, 0x11, 0xa3, 0x0c, 0x02, 0x62, 0x0a, 0x5f, 0x7e, 0x09, 0x02, 0x5d, 0x35, 0x35, 0x1a, 0x08, 0x78, 0x5c, 0x15, 0xfd, 0x0d, 0x1c, 0x9a, 0x1e, 0xfd, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x01, 0x35, 0x00, 0x06, 0x05, 0x3d, 0x05, 0xd9, 0x00, 0x18, 0x00, 0x00, 0x01, 0x23, 0x35, 0x33, 0x15, 0x23, 0x15, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x06, 0x23, 0x22, 0x24, 0x23, 0x22, 0x07, 0x11, 0x23, 0x01, 0x7a, 0x44, 0xf3, 0x45, 0x30, 0x2e, 0xae, 0x9a, 0x98, 0x91, 0x47, 0x43, 0x5f, 0x5c, 0x9a, 0xfe, 0xe3, 0x74, 0x48, 0x3f, 0x56, 0x05, 0xa4, 0x35, 0x35, 0x1a, 0x08, 0x78, 0x5c, 0x15, 0xfd, 0x0d, 0x1c, 0x9a, 0x1e, 0xfd, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5f, 0x00, 0x01, 0x06, 0x15, 0x05, 0xda, 0x00, 0x1f, 0x00, 0x00, 0x09, 0x01, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x09, 0x01, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x16, 0x13, 0x09, 0x01, 0x17, 0x01, 0x07, 0x03, 0x27, 0x07, 0x03, 0x27, 0x01, 0x02, 0xe4, 0xfe, 0xd4, 0xa6, 0xb3, 0xa8, 0x2a, 0x7d, 0x26, 0xa7, 0xb1, 0xa6, 0x01, 0x2c, 0x01, 0x2c, 0xa6, 0xb2, 0xa6, 0x28, 0x7a, 0x28, 0x3f, 0x1f, 0xfe, 0xf1, 0xfe, 0xd5, 0xa0, 0x01, 0x1f, 0xa7, 0xf3, 0xa1, 0xa0, 0xf3, 0xa6, 0x01, 0x1e, 0x02, 0x7e, 0x01, 0x51, 0xbb, 0xc7, 0xbb, 0x2c, 0x8a, 0x2c, 0xba, 0xc8, 0xba, 0xfe, 0xb0, 0x01, 0x4f, 0xbb, 0xc8, 0xbb, 0x2d, 0x8a, 0x2c, 0x71, 0xfe, 0x74, 0x01, 0x35, 0xfe, 0xaf, 0xb3, 0xfe, 0xf0, 0xb9, 0x01, 0x40, 0xb4, 0xb4, 0xfe, 0xc0, 0xb9, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb2, 0xff, 0xec, 0x05, 0xc2, 0x05, 0xdb, 0x00, 0x0f, 0x00, 0x52, 0x00, 0x00, 0x01, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x0e, 0x01, 0x13, 0x15, 0x23, 0x06, 0x23, 0x22, 0x27, 0x35, 0x23, 0x15, 0x23, 0x22, 0x24, 0x27, 0x26, 0x27, 0x07, 0x03, 0x05, 0x07, 0x30, 0x17, 0x16, 0x17, 0x16, 0x17, 0x11, 0x21, 0x35, 0x21, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0x21, 0x15, 0x21, 0x11, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x27, 0x25, 0x03, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x02, 0xc2, 0x23, 0x41, 0x22, 0x24, 0x40, 0x24, 0x25, 0x40, 0x23, 0x22, 0x40, 0x24, 0xcc, 0x07, 0x22, 0x23, 0x02, 0x03, 0x06, 0x07, 0x98, 0xfe, 0xea, 0x4d, 0x0f, 0x0b, 0x4f, 0x1a, 0x01, 0x14, 0x4e, 0x06, 0x41, 0x77, 0x62, 0x6a, 0xfe, 0xae, 0x01, 0x52, 0x18, 0x16, 0x38, 0x3d, 0x3e, 0x70, 0x3b, 0x3b, 0x70, 0x40, 0x3f, 0x36, 0x19, 0x17, 0x01, 0x48, 0xfe, 0xb8, 0x5a, 0x54, 0x77, 0x43, 0x02, 0x02, 0x4e, 0x01, 0x15, 0x1b, 0x4e, 0x0b, 0x0f, 0x4e, 0x8b, 0x67, 0x04, 0xd6, 0x27, 0x48, 0x27, 0x27, 0x48, 0x27, 0x28, 0x48, 0x27, 0x27, 0x48, 0xfa, 0xf2, 0x01, 0x03, 0x01, 0x02, 0x02, 0x60, 0x58, 0x11, 0x10, 0x41, 0x01, 0x4b, 0x7c, 0x40, 0x06, 0x58, 0x31, 0x28, 0x07, 0x02, 0xd4, 0x81, 0x33, 0x08, 0x0e, 0x22, 0x7c, 0x88, 0x7d, 0x44, 0x44, 0x7d, 0x88, 0x7c, 0x22, 0x0e, 0x09, 0x32, 0x81, 0xfd, 0x2f, 0x0a, 0x22, 0x31, 0x58, 0x03, 0x03, 0x40, 0x7c, 0xfe, 0xb5, 0x41, 0x10, 0x11, 0x58, 0x31, 0x23, 0x00, 0x00, 0x01, 0x00, 0xf2, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd6, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x13, 0x36, 0x37, 0x33, 0x06, 0x07, 0x17, 0x16, 0x17, 0x0e, 0x01, 0x07, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x27, 0x36, 0x37, 0x0b, 0x01, 0x16, 0x17, 0x07, 0x26, 0x27, 0x07, 0x06, 0x07, 0x22, 0x26, 0x27, 0x36, 0x3f, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x13, 0x01, 0x27, 0x09, 0x01, 0x07, 0x03, 0x7f, 0xfa, 0x43, 0x19, 0x51, 0x16, 0x54, 0x8d, 0x37, 0x02, 0x05, 0x36, 0x27, 0x40, 0x03, 0x8e, 0x5c, 0x52, 0x23, 0x5c, 0x3b, 0xdc, 0xd9, 0x3b, 0x5b, 0x22, 0x53, 0x5e, 0x8c, 0x01, 0x39, 0x24, 0x43, 0x04, 0x01, 0x39, 0x8c, 0x54, 0x17, 0x53, 0x18, 0x44, 0xfa, 0xfe, 0x19, 0x1d, 0x02, 0x47, 0x02, 0x49, 0x1d, 0x02, 0xbd, 0xfe, 0xd0, 0x3b, 0x3c, 0x75, 0x49, 0xb6, 0x03, 0x40, 0x2a, 0x22, 0x01, 0x04, 0x4f, 0xa8, 0x38, 0x08, 0x42, 0x11, 0x31, 0x01, 0x22, 0xfe, 0xde, 0x31, 0x11, 0x42, 0x08, 0x38, 0xa8, 0x48, 0x0b, 0x1d, 0x24, 0x4c, 0x03, 0xb6, 0x49, 0x75, 0x3c, 0x3b, 0x01, 0x30, 0x02, 0x84, 0x95, 0xfd, 0x3a, 0x02, 0xc6, 0x95, 0x00, 0x00, 0x05, 0x00, 0x70, 0xff, 0xec, 0x03, 0x73, 0x05, 0xdb, 0x00, 0x07, 0x00, 0x1a, 0x00, 0x2e, 0x00, 0x4f, 0x00, 0x60, 0x00, 0x00, 0x01, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x06, 0x23, 0x22, 0x27, 0x35, 0x26, 0x35, 0x34, 0x37, 0x17, 0x06, 0x15, 0x14, 0x04, 0x07, 0x23, 0x26, 0x03, 0x24, 0x35, 0x34, 0x37, 0x15, 0x06, 0x15, 0x14, 0x04, 0x17, 0x06, 0x07, 0x35, 0x36, 0x35, 0x34, 0x27, 0x11, 0x27, 0x13, 0x11, 0x27, 0x11, 0x24, 0x27, 0x36, 0x37, 0x32, 0x33, 0x32, 0x17, 0x07, 0x17, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x15, 0x14, 0x04, 0x17, 0x06, 0x05, 0x35, 0x36, 0x27, 0x34, 0x35, 0x34, 0x25, 0x27, 0x03, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x01, 0x32, 0x19, 0x0c, 0x0a, 0x05, 0x20, 0xe0, 0x0b, 0x18, 0x20, 0x02, 0xa3, 0x93, 0x01, 0x3a, 0x01, 0x22, 0x01, 0x0e, 0x19, 0xb1, 0xfe, 0xfe, 0xf3, 0x9a, 0x01, 0xf5, 0x03, 0x04, 0xf8, 0xa3, 0xb1, 0x45, 0x45, 0x45, 0xfe, 0x9d, 0x04, 0x0c, 0xc0, 0x04, 0x02, 0x3b, 0x2f, 0x64, 0x55, 0x15, 0x18, 0x33, 0x3d, 0x08, 0x06, 0x28, 0x02, 0xa4, 0x05, 0x06, 0xfe, 0xba, 0xf6, 0x01, 0xff, 0x00, 0x45, 0x05, 0x13, 0x15, 0x15, 0x26, 0x14, 0x15, 0x25, 0x16, 0x15, 0x13, 0x04, 0xa4, 0x0c, 0x09, 0x06, 0x0a, 0x0b, 0xfb, 0x94, 0x42, 0x1d, 0x40, 0x30, 0x22, 0x40, 0x52, 0x1a, 0x2f, 0x18, 0x18, 0x2f, 0x3e, 0x77, 0x41, 0x01, 0xb7, 0x26, 0x6f, 0x63, 0x2f, 0x44, 0x26, 0x33, 0x2e, 0x59, 0x61, 0x51, 0x2f, 0x35, 0x22, 0x31, 0x27, 0x22, 0xfe, 0xb4, 0x13, 0x03, 0x01, 0xfe, 0x81, 0x10, 0x01, 0x75, 0x13, 0x8a, 0x90, 0x05, 0x45, 0x1e, 0x19, 0x06, 0x1b, 0x02, 0x36, 0x32, 0x2f, 0x75, 0x8a, 0x10, 0x3d, 0x20, 0x3d, 0x01, 0x02, 0x21, 0x6d, 0x07, 0x01, 0x2d, 0x0b, 0x2e, 0x18, 0x19, 0x2e, 0x18, 0x18, 0x2e, 0x19, 0x18, 0x2e, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6c, 0xff, 0xec, 0x06, 0x07, 0x05, 0xdb, 0x00, 0x04, 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0x25, 0x0b, 0x01, 0x16, 0x32, 0x25, 0x0b, 0x01, 0x16, 0x32, 0x01, 0x33, 0x32, 0x1d, 0x01, 0x14, 0x2b, 0x01, 0x13, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x3d, 0x01, 0x13, 0x21, 0x13, 0x15, 0x14, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x13, 0x23, 0x26, 0x3d, 0x01, 0x34, 0x3b, 0x01, 0x37, 0x17, 0x33, 0x1b, 0x01, 0x33, 0x37, 0x05, 0xbc, 0xf8, 0xf9, 0x7d, 0xf9, 0xfd, 0x6e, 0xf8, 0xf8, 0x7c, 0xf8, 0x02, 0xbc, 0xc0, 0x33, 0x25, 0xaf, 0xf9, 0x02, 0x2b, 0x2b, 0x9b, 0x56, 0x54, 0x9a, 0x55, 0xf5, 0xfd, 0x92, 0xf6, 0x54, 0x9b, 0xa9, 0x9c, 0x2c, 0x2a, 0x01, 0xf7, 0xb7, 0x1d, 0x33, 0xc2, 0x2f, 0x2e, 0xe3, 0x74, 0x74, 0xe3, 0x2f, 0xed, 0x03, 0x3c, 0xfc, 0xc4, 0x26, 0x26, 0x03, 0x3c, 0xfc, 0xc4, 0x26, 0x03, 0xd1, 0x2a, 0x19, 0x28, 0xfc, 0xc7, 0x44, 0x3e, 0x3f, 0x47, 0x47, 0x7a, 0x42, 0x08, 0x03, 0x36, 0xfc, 0xca, 0x06, 0x43, 0x7b, 0x47, 0x47, 0x3f, 0x3e, 0x44, 0x03, 0x39, 0x11, 0x1c, 0x0f, 0x2f, 0x9b, 0x9b, 0x01, 0x43, 0xfe, 0xbd, 0x9b, 0x00, 0x02, 0x00, 0x70, 0x00, 0x00, 0x06, 0x03, 0x05, 0xdb, 0x00, 0x1a, 0x00, 0x26, 0x00, 0x00, 0x01, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x03, 0x27, 0x12, 0x01, 0x13, 0x23, 0x03, 0x21, 0x11, 0x23, 0x03, 0x21, 0x03, 0x23, 0x13, 0x02, 0x8a, 0xa5, 0x8f, 0x30, 0x2d, 0xb5, 0x44, 0x1f, 0x0f, 0x27, 0x71, 0x44, 0x3f, 0x2b, 0x8d, 0x4a, 0x1e, 0x33, 0x23, 0x2b, 0x46, 0x92, 0xb4, 0x6c, 0xcf, 0x04, 0x6f, 0x55, 0x72, 0x4c, 0xfe, 0xff, 0x7c, 0x01, 0xfe, 0xff, 0x4d, 0x73, 0x56, 0x05, 0x87, 0x54, 0x09, 0x27, 0xa6, 0x4e, 0x51, 0x39, 0x3b, 0x8d, 0x3a, 0x23, 0x38, 0xb3, 0x48, 0x4c, 0x22, 0x43, 0xfe, 0xdf, 0x44, 0x01, 0x99, 0xfd, 0x7c, 0xfd, 0xa6, 0x01, 0xd7, 0xfe, 0x29, 0x01, 0xd7, 0xfe, 0x29, 0x02, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x0b, 0x00, 0x00, 0x05, 0x68, 0x05, 0xdb, 0x00, 0x0d, 0x00, 0x35, 0x00, 0x00, 0x00, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x13, 0x15, 0x3b, 0x01, 0x32, 0x36, 0x37, 0x14, 0x04, 0x07, 0x06, 0x07, 0x23, 0x26, 0x3d, 0x01, 0x26, 0x24, 0x03, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x33, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x02, 0x9c, 0x2d, 0x52, 0x2b, 0x2d, 0x52, 0x2d, 0x2f, 0x51, 0x2c, 0x2a, 0x52, 0xa8, 0x05, 0x03, 0x87, 0xcb, 0x9b, 0xfe, 0x58, 0x23, 0x2f, 0x02, 0x26, 0x27, 0x04, 0xfe, 0x40, 0x4f, 0xb3, 0xd4, 0x74, 0x0c, 0x0c, 0x06, 0x3b, 0x36, 0x46, 0x4e, 0x4f, 0x8d, 0x96, 0x8e, 0x51, 0x4f, 0x47, 0x33, 0x04, 0xc4, 0x64, 0x59, 0x32, 0x32, 0x59, 0x64, 0x5b, 0x30, 0x30, 0xfe, 0x2d, 0x9c, 0xbf, 0x26, 0xe7, 0x9a, 0x97, 0x88, 0xf5, 0xa8, 0x9a, 0x14, 0x84, 0x8f, 0x01, 0x31, 0x02, 0xe9, 0x01, 0x9b, 0x07, 0x23, 0x2b, 0x9c, 0xac, 0x9e, 0x55, 0x55, 0x9e, 0xac, 0x9c, 0x2b, 0x20, 0x00, 0x00, 0x03, 0x00, 0xae, 0xff, 0xdd, 0x05, 0xc6, 0x05, 0xd0, 0x00, 0x3f, 0x00, 0x47, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x32, 0x1f, 0x01, 0x16, 0x17, 0x37, 0x16, 0x17, 0x07, 0x16, 0x17, 0x37, 0x16, 0x17, 0x07, 0x16, 0x14, 0x07, 0x17, 0x06, 0x07, 0x27, 0x06, 0x07, 0x17, 0x06, 0x07, 0x27, 0x06, 0x0f, 0x01, 0x06, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x07, 0x26, 0x27, 0x37, 0x26, 0x27, 0x07, 0x26, 0x27, 0x37, 0x26, 0x34, 0x37, 0x27, 0x36, 0x37, 0x17, 0x36, 0x37, 0x27, 0x36, 0x37, 0x17, 0x36, 0x3f, 0x01, 0x12, 0x20, 0x02, 0x10, 0x12, 0x20, 0x12, 0x10, 0x04, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x03, 0x13, 0x4f, 0x26, 0x18, 0x3c, 0x3a, 0x71, 0x45, 0x39, 0x4b, 0x2a, 0x1e, 0x94, 0x21, 0x0f, 0x85, 0x03, 0x03, 0x85, 0x0f, 0x21, 0x94, 0x1e, 0x2a, 0x4b, 0x39, 0x45, 0x71, 0x3a, 0x3c, 0x18, 0x26, 0x4f, 0x27, 0x18, 0x3c, 0x39, 0x72, 0x44, 0x3a, 0x4c, 0x2b, 0x1d, 0x95, 0x21, 0x0e, 0x85, 0x04, 0x04, 0x85, 0x0e, 0x21, 0x95, 0x1d, 0x2b, 0x4c, 0x3a, 0x44, 0x72, 0x39, 0x3c, 0x18, 0xf2, 0xfe, 0xb8, 0xe8, 0xe8, 0x01, 0x48, 0xe8, 0xff, 0x00, 0x52, 0x73, 0x52, 0x52, 0x73, 0x05, 0xd0, 0x05, 0xbb, 0x0d, 0x1e, 0x84, 0x2d, 0x40, 0x9c, 0x32, 0x3c, 0x1f, 0x54, 0x5c, 0x45, 0x23, 0x44, 0x23, 0x46, 0x5b, 0x54, 0x1f, 0x3c, 0x33, 0x9b, 0x40, 0x2e, 0x84, 0x1d, 0x0e, 0xba, 0x06, 0x06, 0xba, 0x0e, 0x1d, 0x84, 0x2e, 0x40, 0x9b, 0x32, 0x3d, 0x1f, 0x54, 0x5b, 0x46, 0x23, 0x44, 0x23, 0x45, 0x5c, 0x54, 0x1f, 0x3c, 0x33, 0x9b, 0x40, 0x2d, 0x83, 0x1d, 0x0d, 0xbb, 0xfe, 0xc4, 0xfe, 0xfd, 0xfe, 0x95, 0xfe, 0xfe, 0x01, 0x02, 0x01, 0x6b, 0x75, 0x80, 0x5b, 0x5b, 0x80, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xeb, 0xff, 0xed, 0x05, 0x88, 0x05, 0xdd, 0x00, 0x09, 0x00, 0x0e, 0x00, 0x13, 0x00, 0x18, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x2c, 0x00, 0x31, 0x00, 0x36, 0x00, 0x3b, 0x00, 0x40, 0x00, 0x48, 0x00, 0x4f, 0x00, 0x5b, 0x00, 0x9f, 0x00, 0x00, 0x00, 0x14, 0x1e, 0x01, 0x33, 0x26, 0x34, 0x37, 0x22, 0x06, 0x05, 0x16, 0x17, 0x37, 0x26, 0x27, 0x16, 0x17, 0x37, 0x26, 0x27, 0x16, 0x17, 0x37, 0x26, 0x27, 0x16, 0x07, 0x37, 0x26, 0x27, 0x14, 0x15, 0x14, 0x07, 0x17, 0x35, 0x34, 0x27, 0x06, 0x07, 0x17, 0x36, 0x35, 0x34, 0x05, 0x17, 0x36, 0x37, 0x06, 0x07, 0x17, 0x36, 0x37, 0x06, 0x07, 0x17, 0x36, 0x37, 0x06, 0x1f, 0x01, 0x26, 0x37, 0x06, 0x17, 0x37, 0x26, 0x35, 0x34, 0x37, 0x06, 0x15, 0x3f, 0x01, 0x26, 0x27, 0x06, 0x15, 0x14, 0x05, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x33, 0x14, 0x23, 0x15, 0x16, 0x17, 0x16, 0x17, 0x36, 0x37, 0x04, 0x17, 0x06, 0x23, 0x26, 0x22, 0x07, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x03, 0x15, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x03, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x26, 0x23, 0x22, 0x07, 0x22, 0x27, 0x36, 0x25, 0x16, 0x17, 0x36, 0x37, 0x36, 0x03, 0x01, 0x0f, 0x1c, 0x10, 0x0d, 0x0d, 0x0f, 0x1d, 0x01, 0xc1, 0x63, 0x26, 0x17, 0x52, 0x82, 0x63, 0x21, 0x23, 0x51, 0x6c, 0x45, 0x0e, 0x2b, 0x36, 0x6f, 0x2e, 0x01, 0x35, 0x22, 0x59, 0x13, 0x36, 0x36, 0x2b, 0x2d, 0x34, 0x24, 0xfc, 0xce, 0x18, 0x26, 0x62, 0x4e, 0x25, 0x23, 0x21, 0x64, 0x57, 0x12, 0x2c, 0x0e, 0x44, 0x48, 0x0e, 0x35, 0x01, 0x2d, 0x3f, 0x36, 0x35, 0x14, 0x01, 0x22, 0x59, 0x34, 0x2d, 0x2a, 0x01, 0x01, 0x00, 0x32, 0x44, 0x44, 0x32, 0x2f, 0x46, 0x45, 0x51, 0x02, 0x02, 0x11, 0x13, 0x13, 0x23, 0x13, 0x12, 0x22, 0x14, 0x13, 0x11, 0x02, 0x03, 0x01, 0x01, 0x2f, 0x25, 0x03, 0x02, 0x48, 0x14, 0x01, 0x2d, 0x48, 0x4d, 0xe4, 0x24, 0x3e, 0x19, 0x04, 0x2f, 0x24, 0x2f, 0x01, 0x0a, 0x14, 0x17, 0x07, 0x01, 0x02, 0x2e, 0x24, 0x2e, 0x02, 0x1c, 0x24, 0x1f, 0x24, 0xe5, 0x4c, 0x48, 0x01, 0x2c, 0x13, 0x4a, 0x06, 0x09, 0x24, 0x05, 0xa0, 0x22, 0x1f, 0x12, 0x20, 0x42, 0x22, 0x11, 0x76, 0x3e, 0x30, 0x26, 0x38, 0x14, 0x61, 0x3e, 0x21, 0x55, 0x2a, 0x7e, 0x45, 0x13, 0x6d, 0x4c, 0x91, 0x4b, 0x08, 0x7d, 0x60, 0x11, 0x10, 0x81, 0x3f, 0x0a, 0x0c, 0x7b, 0x61, 0x88, 0x37, 0x1a, 0x63, 0x5b, 0x0d, 0x4f, 0x26, 0x30, 0x3e, 0x10, 0x6a, 0x21, 0x3e, 0x61, 0x29, 0x86, 0x13, 0x45, 0x7e, 0x43, 0x88, 0x08, 0x4b, 0x91, 0x57, 0x8b, 0x0a, 0x3d, 0x7b, 0x14, 0x15, 0x64, 0x7b, 0x03, 0x1a, 0x37, 0x88, 0x0e, 0x0d, 0x5b, 0x2b, 0x4d, 0x35, 0x37, 0x4c, 0x4c, 0x37, 0x35, 0x4d, 0x2d, 0x5a, 0x01, 0x02, 0x0a, 0x27, 0x2a, 0x27, 0x15, 0x15, 0x27, 0x2a, 0x27, 0x0a, 0x02, 0x01, 0x01, 0x59, 0x09, 0x28, 0x03, 0x04, 0x80, 0x35, 0x06, 0x5b, 0xa3, 0x0c, 0x0c, 0x14, 0x15, 0x4a, 0x35, 0x28, 0x09, 0xfc, 0xd6, 0x5c, 0x16, 0x1c, 0x64, 0x03, 0x1c, 0x09, 0x28, 0x35, 0x4a, 0x12, 0x11, 0x11, 0x0c, 0xa3, 0x5b, 0x06, 0x34, 0x8c, 0x0a, 0x09, 0x27, 0x00, 0x00, 0x0f, 0x00, 0xea, 0x00, 0x00, 0x05, 0x8a, 0x05, 0xd3, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x2f, 0x00, 0x37, 0x00, 0x4f, 0x00, 0x5f, 0x00, 0x9f, 0x00, 0xab, 0x00, 0xb3, 0x00, 0xbb, 0x00, 0xcb, 0x00, 0xd3, 0x00, 0xdb, 0x00, 0xe3, 0x00, 0xef, 0x00, 0x00, 0x01, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x07, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x33, 0x36, 0x37, 0x26, 0x25, 0x06, 0x07, 0x16, 0x17, 0x32, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x06, 0x27, 0x16, 0x15, 0x14, 0x07, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x13, 0x16, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x05, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x15, 0x36, 0x33, 0x32, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x23, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x32, 0x33, 0x32, 0x05, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x16, 0x17, 0x36, 0x17, 0x06, 0x07, 0x16, 0x17, 0x16, 0x17, 0x26, 0x25, 0x06, 0x07, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x07, 0x06, 0x07, 0x16, 0x17, 0x26, 0x35, 0x34, 0x17, 0x16, 0x17, 0x36, 0x37, 0x26, 0x27, 0x26, 0x17, 0x16, 0x17, 0x36, 0x37, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x26, 0x03, 0x3a, 0x11, 0x21, 0x12, 0x12, 0x21, 0x11, 0x12, 0x20, 0x12, 0x12, 0x20, 0xca, 0x47, 0x40, 0x73, 0x2e, 0x21, 0x07, 0x15, 0x4d, 0x08, 0x08, 0x59, 0x89, 0x0d, 0x01, 0xb2, 0x05, 0x0d, 0x8a, 0x59, 0x08, 0x07, 0x4d, 0x15, 0x07, 0x21, 0x2f, 0x72, 0x40, 0x44, 0x01, 0x01, 0x33, 0x2f, 0x2f, 0x62, 0x2b, 0x2c, 0x2d, 0x2d, 0x2c, 0x2b, 0x2d, 0x2a, 0x02, 0x02, 0x29, 0x2e, 0x2b, 0x2e, 0x2c, 0x2c, 0x2d, 0x2a, 0x03, 0x16, 0x0e, 0x05, 0x47, 0x3f, 0x71, 0x30, 0x22, 0x07, 0x15, 0x4d, 0x08, 0x0a, 0x5b, 0xfd, 0xef, 0x01, 0x1e, 0x6c, 0x38, 0x38, 0x6a, 0x1f, 0x93, 0x65, 0x03, 0x04, 0x68, 0x1d, 0x0b, 0x20, 0x32, 0x7b, 0x01, 0x7c, 0x32, 0x1e, 0x0b, 0x1c, 0x6a, 0x06, 0x63, 0x93, 0x01, 0x1f, 0x34, 0x35, 0x3a, 0x3a, 0x36, 0x34, 0x1f, 0x92, 0x63, 0x05, 0x6c, 0x1c, 0x0a, 0x1e, 0x30, 0x7c, 0x7a, 0x31, 0x1f, 0x0a, 0x1d, 0x67, 0x04, 0x02, 0x65, 0x01, 0xee, 0x18, 0x29, 0x2b, 0x2c, 0x2e, 0x2a, 0x29, 0x19, 0x4d, 0x4d, 0x4c, 0x53, 0x36, 0x38, 0x1e, 0x21, 0x1e, 0x1d, 0x04, 0xfe, 0xb9, 0x08, 0x05, 0x1e, 0x1f, 0x1f, 0x1f, 0x38, 0x60, 0x86, 0x5a, 0x09, 0x09, 0x4d, 0x14, 0x08, 0x22, 0x31, 0x70, 0x3f, 0x47, 0x05, 0x08, 0x33, 0x2e, 0x2e, 0x33, 0x01, 0x33, 0x05, 0x08, 0x36, 0x38, 0x20, 0x1e, 0x20, 0xc1, 0x38, 0x36, 0x08, 0x04, 0x1d, 0x1e, 0x21, 0x51, 0x4b, 0x4d, 0x18, 0x29, 0x2a, 0x2f, 0x2e, 0x2a, 0x29, 0x17, 0x4d, 0x03, 0x35, 0x13, 0x24, 0x15, 0x14, 0x23, 0x14, 0x14, 0x23, 0x14, 0x15, 0x24, 0x13, 0xd9, 0x35, 0x39, 0x67, 0x54, 0x3b, 0x26, 0x12, 0x0e, 0x27, 0x04, 0x39, 0x5a, 0x5e, 0x5e, 0x5a, 0x39, 0x04, 0x27, 0x0e, 0x12, 0x27, 0x3a, 0x54, 0x67, 0x39, 0xa7, 0x27, 0x28, 0x27, 0x27, 0x26, 0x28, 0x29, 0x49, 0x1e, 0x1c, 0x1c, 0x1a, 0x1a, 0x1c, 0x1c, 0x1e, 0x38, 0x3a, 0x39, 0x38, 0x1e, 0x1c, 0x1d, 0x1a, 0x1a, 0x1d, 0x1c, 0x1e, 0x38, 0x39, 0x3a, 0x01, 0x0c, 0x5a, 0x5f, 0x35, 0x39, 0x65, 0x55, 0x3b, 0x27, 0x13, 0x0e, 0x28, 0x01, 0x05, 0x09, 0x02, 0xb3, 0xc0, 0xc0, 0xb3, 0x02, 0x3a, 0x02, 0x38, 0x14, 0x1b, 0x2e, 0x3e, 0x65, 0x75, 0x01, 0x76, 0x63, 0x3e, 0x2d, 0x1b, 0x14, 0x37, 0x03, 0x3a, 0xb0, 0x62, 0x63, 0x63, 0x62, 0xb0, 0x3b, 0x04, 0x37, 0x14, 0x1a, 0x2d, 0x3f, 0x63, 0x77, 0x75, 0x64, 0x3f, 0x2f, 0x1a, 0x14, 0x38, 0x02, 0x4b, 0xa2, 0x57, 0x5a, 0x5a, 0x57, 0xa2, 0x20, 0x2a, 0x2a, 0x10, 0x19, 0x1d, 0x12, 0x14, 0x15, 0x14, 0x44, 0x40, 0x40, 0x44, 0x14, 0x15, 0x14, 0x12, 0x1d, 0x2b, 0x38, 0x05, 0x01, 0x28, 0x0f, 0x13, 0x27, 0x3a, 0x54, 0x65, 0x39, 0x35, 0x5e, 0x9d, 0x26, 0x29, 0x28, 0x26, 0x27, 0x27, 0x28, 0xd6, 0x44, 0x41, 0x19, 0x1d, 0x12, 0x14, 0x14, 0x3a, 0x1d, 0x19, 0x41, 0x44, 0x15, 0x14, 0x14, 0x2e, 0x2a, 0x21, 0x9e, 0x59, 0x5b, 0x5b, 0x59, 0x9e, 0x21, 0x00, 0x07, 0x00, 0xea, 0x00, 0x00, 0x05, 0x89, 0x05, 0xd6, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x78, 0x00, 0x86, 0x00, 0x94, 0x00, 0x00, 0x01, 0x14, 0x17, 0x36, 0x37, 0x26, 0x27, 0x36, 0x37, 0x26, 0x27, 0x06, 0x05, 0x34, 0x26, 0x15, 0x06, 0x15, 0x16, 0x17, 0x36, 0x25, 0x06, 0x15, 0x14, 0x17, 0x36, 0x37, 0x2e, 0x01, 0x27, 0x06, 0x15, 0x14, 0x25, 0x34, 0x27, 0x06, 0x07, 0x16, 0x17, 0x06, 0x07, 0x16, 0x17, 0x36, 0x03, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x26, 0x27, 0x36, 0x37, 0x16, 0x17, 0x36, 0x37, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x15, 0x16, 0x15, 0x14, 0x07, 0x1e, 0x01, 0x17, 0x36, 0x37, 0x16, 0x17, 0x06, 0x07, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x06, 0x23, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x23, 0x26, 0x27, 0x35, 0x26, 0x27, 0x06, 0x07, 0x22, 0x27, 0x36, 0x37, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x06, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x25, 0x32, 0x1e, 0x01, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x03, 0x6d, 0x23, 0x31, 0x28, 0x2e, 0x08, 0x03, 0x2d, 0x21, 0x2a, 0x2b, 0xfe, 0xf9, 0x25, 0x28, 0x07, 0x32, 0x13, 0x01, 0xaf, 0x01, 0x0f, 0x37, 0x03, 0x03, 0x25, 0x01, 0x20, 0xfe, 0xf5, 0x2b, 0x26, 0x27, 0x2e, 0x03, 0x0d, 0x29, 0x2d, 0x2d, 0x23, 0xef, 0x32, 0x1d, 0x0c, 0x09, 0x1c, 0x51, 0x5b, 0x02, 0x02, 0xa4, 0x99, 0x4b, 0x28, 0x2c, 0x23, 0x94, 0x01, 0x94, 0x23, 0x24, 0x2a, 0x04, 0x4d, 0x97, 0xa6, 0x01, 0x02, 0x5c, 0x50, 0x1d, 0x05, 0x0d, 0x1a, 0x38, 0x18, 0x12, 0x33, 0x33, 0x15, 0x1d, 0x1f, 0x2d, 0x01, 0x0c, 0x3b, 0x2d, 0x35, 0x3f, 0x56, 0x16, 0x1d, 0x1d, 0x4f, 0x3c, 0x38, 0x2d, 0x3d, 0x0b, 0x01, 0x2e, 0x1e, 0x1c, 0x15, 0x33, 0x34, 0x12, 0x2f, 0x5e, 0xaa, 0x5d, 0x5d, 0xa9, 0x5f, 0x61, 0xab, 0x59, 0x5b, 0xaa, 0x01, 0x05, 0x4b, 0x8f, 0x52, 0x4f, 0x8f, 0x4e, 0x4e, 0x8f, 0x4f, 0x51, 0x8f, 0x02, 0x84, 0xa3, 0xa7, 0x0f, 0x23, 0x65, 0x8d, 0xaa, 0x6a, 0x1c, 0x0f, 0x70, 0xcd, 0x4d, 0x63, 0x01, 0x4e, 0x54, 0x76, 0x4a, 0x4b, 0x72, 0x1b, 0x19, 0x5a, 0x31, 0x56, 0x6c, 0x4c, 0x57, 0x02, 0x4d, 0x49, 0x09, 0x11, 0xa9, 0x70, 0x0d, 0x1e, 0x6a, 0xaa, 0x85, 0x6b, 0x25, 0x0f, 0xa7, 0x01, 0x6e, 0x41, 0x0d, 0x56, 0x02, 0x02, 0x7b, 0x77, 0x02, 0x06, 0x77, 0x19, 0x11, 0x5b, 0x31, 0x87, 0xf4, 0x01, 0x01, 0xf4, 0x87, 0x31, 0x5b, 0x0d, 0x1a, 0x03, 0x77, 0x06, 0x02, 0x77, 0x7b, 0x02, 0x02, 0x56, 0x0d, 0x40, 0x1e, 0x23, 0x66, 0xdc, 0x64, 0x2d, 0x23, 0x4a, 0x4d, 0x0c, 0x37, 0x42, 0x2f, 0x15, 0x22, 0x89, 0x89, 0x22, 0x01, 0x14, 0x30, 0x43, 0x37, 0x0c, 0x4e, 0x4b, 0x22, 0x2c, 0x64, 0xdc, 0x66, 0x23, 0x88, 0xce, 0xbd, 0x68, 0x68, 0xbd, 0xce, 0xbf, 0x67, 0x67, 0x51, 0x55, 0xa0, 0xae, 0x9d, 0x58, 0x58, 0x9d, 0xae, 0xa0, 0x55, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x5a, 0x00, 0x00, 0x06, 0x1b, 0x05, 0xd4, 0x00, 0x07, 0x00, 0x0d, 0x00, 0x15, 0x00, 0x25, 0x00, 0x00, 0x01, 0x33, 0x01, 0x15, 0x21, 0x27, 0x23, 0x00, 0x17, 0x01, 0x15, 0x21, 0x35, 0x00, 0x07, 0x32, 0x15, 0x02, 0x23, 0x22, 0x03, 0x36, 0x13, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x03, 0x42, 0x07, 0x02, 0xd1, 0xfa, 0x4f, 0x07, 0x08, 0x02, 0xcc, 0x14, 0xfd, 0xab, 0x04, 0xb3, 0xfd, 0xbc, 0x12, 0x46, 0x2f, 0x17, 0x14, 0x31, 0x17, 0x2d, 0x11, 0x22, 0x13, 0x12, 0x23, 0x11, 0x12, 0x20, 0x13, 0x13, 0x20, 0x05, 0xd4, 0xfa, 0x35, 0x09, 0x09, 0x05, 0xaa, 0x9b, 0xfb, 0x4f, 0x11, 0x09, 0x04, 0x9d, 0xc2, 0x44, 0xfd, 0x9b, 0x02, 0x6e, 0x3b, 0xfd, 0x0d, 0x14, 0x24, 0x15, 0x14, 0x24, 0x14, 0x14, 0x24, 0x14, 0x15, 0x24, 0x14, 0x00, 0x00, 0x01, 0x00, 0x99, 0x00, 0x04, 0x04, 0x76, 0x05, 0xd8, 0x00, 0x13, 0x00, 0x00, 0x01, 0x33, 0x17, 0x15, 0x01, 0x14, 0x33, 0x04, 0x15, 0x17, 0x01, 0x27, 0x35, 0x00, 0x35, 0x34, 0x23, 0x24, 0x2f, 0x01, 0x04, 0x56, 0x0c, 0x13, 0xfd, 0xcd, 0x52, 0x01, 0x5c, 0x06, 0xfc, 0xb0, 0x0d, 0x02, 0x46, 0x6b, 0xfe, 0xb8, 0x0f, 0x06, 0x05, 0xd8, 0x15, 0x07, 0xfd, 0xe2, 0x47, 0x53, 0x0e, 0x47, 0xfd, 0x55, 0x15, 0x07, 0x02, 0x57, 0x0d, 0x47, 0x4a, 0x11, 0x47, 0x00, 0x00, 0x05, 0x00, 0x9d, 0xfe, 0xff, 0x06, 0x9e, 0x05, 0xda, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x43, 0x00, 0x00, 0x01, 0x26, 0x10, 0x00, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x00, 0x10, 0x07, 0x06, 0x07, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x26, 0x13, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x37, 0x26, 0x10, 0x37, 0x26, 0x13, 0x06, 0x07, 0x11, 0x21, 0x11, 0x26, 0x37, 0x16, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x22, 0x07, 0x16, 0x10, 0x05, 0x36, 0x10, 0x27, 0x06, 0x10, 0x01, 0x36, 0x98, 0x01, 0x2e, 0xd7, 0x8a, 0x70, 0x71, 0x8b, 0xd5, 0x01, 0x30, 0x97, 0x7b, 0xa2, 0xf5, 0xf5, 0xa2, 0xfe, 0xac, 0xa2, 0xf5, 0xf5, 0xa3, 0xf4, 0x94, 0xcf, 0xcf, 0x94, 0x39, 0x33, 0x7c, 0x7d, 0x33, 0xc1, 0x4f, 0x5b, 0x01, 0x54, 0x5c, 0x41, 0x33, 0x39, 0x90, 0xd3, 0xd3, 0x90, 0x3a, 0x35, 0x7e, 0xfe, 0xf5, 0x69, 0x69, 0x68, 0x02, 0x14, 0x9d, 0x01, 0xdd, 0x01, 0x4c, 0x46, 0x46, 0xfe, 0xb4, 0xfe, 0x22, 0x9c, 0x7e, 0x12, 0xfe, 0xf8, 0x7c, 0xfe, 0xff, 0x01, 0x01, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0x09, 0x11, 0x03, 0x91, 0xe4, 0xfe, 0xb9, 0xd8, 0x11, 0x95, 0x01, 0xae, 0x9d, 0x12, 0xfc, 0x94, 0x2d, 0x0a, 0xfe, 0xf8, 0x01, 0x09, 0x0a, 0xa5, 0x10, 0xd8, 0x01, 0x47, 0xe4, 0x12, 0x9d, 0xfe, 0x50, 0x38, 0x6c, 0x01, 0x47, 0x72, 0x72, 0xfe, 0xb9, 0x00, 0x05, 0x00, 0x91, 0xfe, 0x5b, 0x07, 0x5f, 0x05, 0xc3, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x26, 0x20, 0x06, 0x10, 0x17, 0x16, 0x17, 0x36, 0x00, 0x37, 0x26, 0x01, 0x14, 0x00, 0x20, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x10, 0x00, 0x04, 0x17, 0x01, 0x21, 0x37, 0x21, 0x11, 0x21, 0x11, 0x07, 0x11, 0x01, 0x16, 0x03, 0x01, 0x16, 0x17, 0x16, 0x17, 0x01, 0x23, 0x03, 0x06, 0x00, 0x07, 0x16, 0x17, 0x16, 0x20, 0x36, 0x10, 0x27, 0x26, 0x01, 0x32, 0x36, 0x35, 0x22, 0x06, 0x03, 0x92, 0x6a, 0xfe, 0xdc, 0xd0, 0x68, 0x2a, 0x31, 0x0f, 0x01, 0x17, 0xb8, 0x19, 0x02, 0x44, 0xfe, 0xd6, 0xfe, 0x51, 0x99, 0x69, 0x20, 0x79, 0x61, 0x99, 0x01, 0x36, 0x01, 0x9d, 0x64, 0x01, 0x45, 0xfe, 0xb2, 0x7e, 0x01, 0xbd, 0x01, 0x63, 0x80, 0xfe, 0xbe, 0x64, 0x86, 0xfe, 0xbe, 0x3a, 0x18, 0x66, 0x3d, 0x01, 0x45, 0xf8, 0xde, 0x0d, 0xfe, 0xef, 0xc8, 0x1a, 0x2f, 0x68, 0x01, 0x25, 0xd2, 0x69, 0x29, 0xfd, 0xcb, 0x91, 0xd3, 0x94, 0xcc, 0x03, 0x24, 0x72, 0xe4, 0xfe, 0xb8, 0x6c, 0x2c, 0x1a, 0xce, 0x01, 0x33, 0x07, 0x36, 0xfd, 0x90, 0xe8, 0xfe, 0xbd, 0x9f, 0x6c, 0x92, 0x25, 0x65, 0x9e, 0x01, 0xdc, 0x01, 0x55, 0x11, 0x67, 0x01, 0x5c, 0x8e, 0xfe, 0x78, 0xfe, 0x14, 0x8f, 0x01, 0x75, 0xfe, 0xa4, 0x92, 0x03, 0x76, 0xfe, 0xa4, 0x53, 0x63, 0x1b, 0x3f, 0x01, 0x5c, 0xfe, 0x37, 0xcc, 0xfe, 0xd7, 0x0b, 0x3d, 0x31, 0x6c, 0xd8, 0x01, 0x48, 0x72, 0x2d, 0xfe, 0xc9, 0xd8, 0xa4, 0xe0, 0x00, 0x00, 0x04, 0x00, 0x9d, 0xfe, 0x83, 0x07, 0xfc, 0x06, 0xd9, 0x00, 0x05, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x45, 0x00, 0x00, 0x00, 0x02, 0x17, 0x36, 0x10, 0x27, 0x01, 0x14, 0x00, 0x23, 0x22, 0x27, 0x06, 0x07, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x26, 0x27, 0x26, 0x10, 0x00, 0x33, 0x32, 0x17, 0x36, 0x17, 0x16, 0x17, 0x01, 0x21, 0x37, 0x21, 0x11, 0x07, 0x11, 0x01, 0x16, 0x25, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x37, 0x26, 0x10, 0x37, 0x26, 0x01, 0x16, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x22, 0x07, 0x16, 0x10, 0x03, 0x37, 0x01, 0x67, 0x69, 0x69, 0x03, 0x02, 0xfe, 0xd4, 0xdb, 0x8a, 0x72, 0x4e, 0x5a, 0xf5, 0xf5, 0xa2, 0xf5, 0xf5, 0xa3, 0x79, 0x98, 0x01, 0x2e, 0xd7, 0x88, 0x6f, 0x74, 0x8a, 0xce, 0x64, 0x01, 0x46, 0xfe, 0xb1, 0x7e, 0x01, 0xbd, 0x80, 0xfe, 0xbe, 0x65, 0xfc, 0x04, 0x94, 0xcf, 0xcf, 0x94, 0x39, 0x33, 0x7b, 0x7d, 0x34, 0x01, 0x50, 0x33, 0x38, 0x92, 0xd3, 0xd3, 0x92, 0x3a, 0x34, 0x7e, 0x03, 0xc8, 0xfe, 0xb8, 0x6c, 0x6c, 0x01, 0x47, 0x72, 0xfe, 0xeb, 0xe7, 0xfe, 0xbc, 0x45, 0x2c, 0x0a, 0xfe, 0xf8, 0x7c, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0x09, 0x11, 0x7e, 0x9d, 0x01, 0xdd, 0x01, 0x4c, 0x44, 0x4a, 0x06, 0x08, 0x67, 0x01, 0x5c, 0x8e, 0xfe, 0x14, 0x8f, 0x01, 0x75, 0xfe, 0xa4, 0x92, 0xc6, 0xe4, 0xfe, 0xb9, 0xd8, 0x11, 0x95, 0x01, 0xac, 0x9f, 0x12, 0xfd, 0x0d, 0x10, 0xd8, 0x01, 0x48, 0xe4, 0x12, 0x9d, 0xfe, 0x4f, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xfe, 0xff, 0x06, 0x07, 0x07, 0x55, 0x00, 0x07, 0x00, 0x28, 0x00, 0x00, 0x00, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x36, 0x05, 0x26, 0x10, 0x00, 0x33, 0x32, 0x17, 0x01, 0x21, 0x37, 0x21, 0x11, 0x07, 0x11, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x26, 0x04, 0x06, 0xd2, 0xfe, 0xdb, 0xcf, 0xcf, 0x01, 0x25, 0xd2, 0xfd, 0x30, 0x98, 0x01, 0x2e, 0xd7, 0xad, 0x86, 0x01, 0x44, 0xfe, 0xb2, 0x7e, 0x01, 0xbd, 0x81, 0xfe, 0xbe, 0x64, 0x98, 0x7a, 0xa2, 0xf5, 0xf5, 0xa2, 0xf5, 0xf5, 0xa3, 0x04, 0x43, 0xe4, 0xe4, 0xfe, 0xb9, 0xd8, 0xd8, 0xe8, 0x9d, 0x01, 0xdd, 0x01, 0x4c, 0x6e, 0x01, 0x5b, 0x8e, 0xfe, 0x14, 0x8f, 0x01, 0x75, 0xfe, 0xa4, 0x92, 0xc2, 0xef, 0x9c, 0x7e, 0x12, 0xfe, 0xf8, 0x7c, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0x09, 0x11, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf2, 0xff, 0xe3, 0x05, 0x3c, 0x06, 0xf4, 0x00, 0x2b, 0x00, 0x44, 0x00, 0x00, 0x01, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x17, 0x37, 0x27, 0x37, 0x17, 0x13, 0x07, 0x27, 0x25, 0x13, 0x07, 0x27, 0x03, 0x17, 0x07, 0x01, 0x16, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x14, 0x17, 0x16, 0x17, 0x16, 0x03, 0xbe, 0x3f, 0x2d, 0x1f, 0x3d, 0x1f, 0x22, 0x21, 0x20, 0x70, 0x58, 0x4e, 0x56, 0x51, 0x51, 0x55, 0x35, 0x3d, 0x1f, 0x22, 0x22, 0x21, 0x76, 0x51, 0x50, 0x53, 0x35, 0x2e, 0x3f, 0xe4, 0x33, 0xe5, 0x78, 0xca, 0x34, 0x01, 0x9f, 0xad, 0x7d, 0x54, 0x78, 0xe4, 0x34, 0xfd, 0x8c, 0x37, 0x71, 0x37, 0x36, 0x51, 0x18, 0x16, 0x16, 0x15, 0x2a, 0x26, 0x72, 0x6d, 0x39, 0x36, 0x50, 0x19, 0x16, 0x16, 0x15, 0x2a, 0x24, 0x04, 0x00, 0xaa, 0x21, 0x24, 0x48, 0x53, 0x5c, 0xb4, 0x5b, 0x56, 0x83, 0x2a, 0x25, 0x25, 0x27, 0x3e, 0x48, 0x53, 0x5d, 0xb3, 0x5e, 0x58, 0x82, 0x26, 0x25, 0x0c, 0xab, 0x69, 0x8a, 0x69, 0x01, 0x44, 0x5e, 0x8b, 0xbf, 0xfe, 0x32, 0x39, 0xe1, 0xfe, 0xbd, 0x69, 0x8b, 0xfc, 0xfc, 0x1a, 0x19, 0x19, 0x5c, 0x3d, 0x3c, 0x80, 0x3c, 0x39, 0x32, 0x2d, 0x31, 0x19, 0x19, 0x58, 0x3f, 0x3a, 0x84, 0x3c, 0x39, 0x31, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xba, 0xfe, 0xa3, 0x05, 0x57, 0x07, 0x12, 0x00, 0x3d, 0x00, 0x58, 0x00, 0x00, 0x01, 0x36, 0x32, 0x17, 0x13, 0x07, 0x27, 0x25, 0x13, 0x07, 0x27, 0x03, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x27, 0x07, 0x27, 0x37, 0x27, 0x07, 0x27, 0x13, 0x05, 0x07, 0x27, 0x17, 0x37, 0x17, 0x07, 0x17, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x02, 0xa3, 0x2f, 0x65, 0x30, 0xa1, 0xcb, 0x33, 0x01, 0x9f, 0xad, 0x7e, 0x54, 0xa1, 0x2a, 0x24, 0x3e, 0x40, 0x40, 0x3e, 0x3a, 0x51, 0x28, 0x36, 0xf7, 0xf7, 0x87, 0xf8, 0xf8, 0x33, 0x2c, 0x4d, 0x3d, 0x3e, 0x40, 0x3f, 0x3f, 0x23, 0x2c, 0x1c, 0xe5, 0x33, 0xe5, 0x4c, 0x54, 0x7e, 0xad, 0x01, 0xa0, 0x33, 0xcc, 0x4c, 0xe4, 0x35, 0xe5, 0x7c, 0x40, 0x2f, 0x38, 0x27, 0x29, 0x2c, 0x2c, 0x29, 0x2a, 0x35, 0x33, 0x7c, 0x30, 0x38, 0x26, 0x2a, 0x2c, 0x2c, 0x2a, 0x2a, 0x34, 0x34, 0x04, 0x87, 0x0c, 0x0c, 0x01, 0x9e, 0x5c, 0x8a, 0xbf, 0xfe, 0x32, 0x3a, 0xe2, 0xfe, 0x61, 0x1d, 0x28, 0x45, 0xab, 0x62, 0x5f, 0xab, 0x45, 0x40, 0x28, 0x14, 0x0a, 0xb8, 0x96, 0xf0, 0xf0, 0x96, 0xb8, 0x09, 0x15, 0x25, 0x43, 0x45, 0xab, 0x5f, 0x62, 0xa9, 0x47, 0x28, 0x1e, 0x48, 0x69, 0x8a, 0x6a, 0xcb, 0xe2, 0x3a, 0x01, 0xce, 0xbf, 0x8a, 0x5c, 0xcb, 0x69, 0x8a, 0x6a, 0xd3, 0x18, 0x1c, 0x2b, 0x2e, 0x77, 0x42, 0x41, 0x77, 0x2e, 0x2f, 0x18, 0x18, 0x18, 0x1c, 0x2b, 0x2e, 0x77, 0x41, 0x42, 0x77, 0x2e, 0x2f, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x59, 0xff, 0xe3, 0x04, 0xaf, 0x06, 0xf4, 0x00, 0x2b, 0x00, 0x46, 0x00, 0x00, 0x01, 0x11, 0x33, 0x15, 0x23, 0x15, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x23, 0x35, 0x33, 0x11, 0x07, 0x27, 0x09, 0x01, 0x07, 0x03, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x03, 0x48, 0xf7, 0xf7, 0x36, 0x28, 0x51, 0x3a, 0x3e, 0x40, 0x40, 0x3e, 0x3d, 0x4e, 0x4a, 0x58, 0x5c, 0x46, 0x51, 0x39, 0x3e, 0x40, 0x40, 0x3e, 0x3d, 0x4d, 0x2c, 0x33, 0xf8, 0xf8, 0x9b, 0x60, 0x01, 0x3e, 0x01, 0x3f, 0x60, 0xdf, 0x3c, 0x34, 0x34, 0x2a, 0x2a, 0x2c, 0x2c, 0x2a, 0x26, 0x38, 0x30, 0x7c, 0x33, 0x35, 0x2a, 0x29, 0x2c, 0x2c, 0x29, 0x27, 0x38, 0x2f, 0x05, 0xd5, 0xfe, 0xe7, 0x96, 0x91, 0x0a, 0x14, 0x28, 0x40, 0x45, 0xab, 0x5f, 0x62, 0xab, 0x45, 0x43, 0x25, 0x23, 0x23, 0x28, 0x40, 0x45, 0xab, 0x62, 0x5f, 0xab, 0x45, 0x43, 0x25, 0x15, 0x09, 0x91, 0x96, 0x01, 0x19, 0xad, 0x6b, 0x01, 0x61, 0xfe, 0x9f, 0x6a, 0xfb, 0x50, 0x18, 0x18, 0x2f, 0x2e, 0x77, 0x42, 0x41, 0x77, 0x2e, 0x2b, 0x1c, 0x18, 0x18, 0x18, 0x2f, 0x2e, 0x77, 0x41, 0x42, 0x77, 0x2e, 0x2b, 0x1c, 0x18, 0x00, 0x02, 0x00, 0x08, 0x01, 0x10, 0x05, 0xf8, 0x04, 0xc4, 0x00, 0x2b, 0x00, 0x46, 0x00, 0x00, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x11, 0x33, 0x11, 0x33, 0x27, 0x37, 0x09, 0x01, 0x27, 0x25, 0x14, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x04, 0xf5, 0xc6, 0x87, 0x4c, 0x0a, 0x12, 0x24, 0x39, 0x3e, 0x9a, 0x56, 0x58, 0x9a, 0x3e, 0x3c, 0x21, 0x20, 0x20, 0x24, 0x39, 0x3e, 0x9a, 0x58, 0x56, 0x9a, 0x3e, 0x3c, 0x21, 0x13, 0x09, 0x4c, 0x87, 0xc6, 0x9c, 0x61, 0x01, 0x3d, 0xfe, 0xc3, 0x60, 0xfc, 0x35, 0x16, 0x15, 0x2b, 0x29, 0x6b, 0x3b, 0x3b, 0x6b, 0x2a, 0x26, 0x19, 0x16, 0x16, 0x15, 0x2a, 0x2a, 0x6b, 0x3b, 0x3b, 0x6b, 0x29, 0x27, 0x19, 0x16, 0x02, 0x9f, 0xfe, 0xed, 0x01, 0x13, 0x3c, 0x2d, 0x5a, 0x40, 0x45, 0x47, 0x47, 0x45, 0x44, 0x56, 0x52, 0x62, 0x66, 0x4e, 0x5a, 0x40, 0x45, 0x47, 0x47, 0x45, 0x44, 0x56, 0x31, 0x38, 0x01, 0x13, 0xfe, 0xed, 0xac, 0x6b, 0xfe, 0x9e, 0xfe, 0x9e, 0x6a, 0xf8, 0x43, 0x39, 0x3a, 0x2f, 0x2e, 0x31, 0x31, 0x2e, 0x2b, 0x3e, 0x35, 0x8a, 0x39, 0x3a, 0x2f, 0x2e, 0x31, 0x31, 0x2e, 0x2b, 0x3e, 0x35, 0x00, 0x00, 0x00, 0x02, 0x01, 0x58, 0x01, 0x10, 0x04, 0xb0, 0x04, 0xc5, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x02, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x59, 0xfb, 0xb0, 0xb1, 0xfb, 0xfb, 0xb1, 0xb0, 0xfb, 0x89, 0xaa, 0x78, 0x78, 0xaa, 0xaa, 0x78, 0x78, 0xaa, 0x02, 0xeb, 0xc4, 0x01, 0x16, 0xfe, 0xea, 0xc4, 0xc5, 0xfe, 0xea, 0x01, 0x16, 0xc2, 0x85, 0xbd, 0xbd, 0x85, 0x86, 0xbd, 0xbd, 0x00, 0x01, 0x01, 0x58, 0x01, 0x10, 0x04, 0xb0, 0x04, 0xc5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x34, 0x12, 0x33, 0x32, 0x12, 0x15, 0x14, 0x02, 0x23, 0x22, 0x02, 0x01, 0x59, 0xfb, 0xb0, 0xb1, 0xfb, 0xfb, 0xb1, 0xb0, 0xfb, 0x02, 0xeb, 0xc4, 0x01, 0x16, 0xfe, 0xea, 0xc4, 0xc5, 0xfe, 0xea, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0xc7, 0x01, 0x8d, 0x04, 0x41, 0x04, 0x4b, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0xc7, 0xbb, 0x82, 0x83, 0xba, 0xba, 0x83, 0x82, 0xbb, 0x89, 0x6a, 0x4a, 0x4b, 0x69, 0x69, 0x4b, 0x4a, 0x6a, 0x02, 0xec, 0x92, 0xcd, 0xcd, 0x92, 0x91, 0xce, 0xce, 0x90, 0x53, 0x75, 0x75, 0x53, 0x53, 0x76, 0x76, 0x00, 0x04, 0x01, 0x40, 0x01, 0x8d, 0x04, 0xc8, 0x04, 0x4b, 0x00, 0x13, 0x00, 0x21, 0x00, 0x29, 0x00, 0x37, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x33, 0x26, 0x35, 0x34, 0x37, 0x26, 0x23, 0x22, 0x06, 0x25, 0x06, 0x15, 0x14, 0x17, 0x36, 0x35, 0x34, 0x37, 0x16, 0x15, 0x14, 0x07, 0x32, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x01, 0x40, 0xbb, 0x82, 0x4a, 0x3d, 0x3d, 0x4a, 0x83, 0xba, 0xba, 0x83, 0x4a, 0x3d, 0x3d, 0x4a, 0x82, 0xbb, 0x89, 0x69, 0x4b, 0x06, 0x04, 0x39, 0x38, 0x04, 0x05, 0x4b, 0x69, 0x01, 0x3b, 0x2d, 0x2d, 0x2d, 0x51, 0x38, 0x39, 0x05, 0x05, 0x4b, 0x69, 0x69, 0x4b, 0x04, 0x02, 0xec, 0x92, 0xcd, 0x20, 0x20, 0xcd, 0x92, 0x91, 0xce, 0x21, 0x21, 0xce, 0x90, 0x53, 0x75, 0x58, 0x71, 0x70, 0x57, 0x01, 0x76, 0x32, 0x38, 0x4d, 0x4c, 0x38, 0x38, 0x4c, 0x4d, 0x7b, 0x57, 0x70, 0x71, 0x58, 0x75, 0x53, 0x53, 0x76, 0x00, 0x00, 0x05, 0x00, 0x4b, 0x01, 0x5a, 0x05, 0xbd, 0x04, 0x7a, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x38, 0x00, 0x52, 0x00, 0x6d, 0x00, 0x00, 0x01, 0x33, 0x11, 0x23, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x04, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x02, 0xc1, 0x87, 0x87, 0x01, 0xe7, 0x4a, 0x20, 0x25, 0x15, 0x1a, 0x1b, 0x1c, 0x19, 0x1a, 0x20, 0x20, 0x4a, 0x1f, 0x21, 0x1a, 0x1a, 0x1b, 0x1d, 0x18, 0x1a, 0x21, 0x44, 0x43, 0x34, 0x3d, 0x29, 0x2d, 0x30, 0x30, 0x2d, 0x2c, 0x3a, 0x36, 0x85, 0x34, 0x3c, 0x2a, 0x2d, 0x2f, 0x2f, 0x2d, 0x2c, 0x3a, 0x37, 0xfd, 0x69, 0x4a, 0x20, 0x25, 0x15, 0x1a, 0x1b, 0x1c, 0x19, 0x1a, 0x20, 0x20, 0x4a, 0x1f, 0x20, 0x1b, 0x1a, 0x1b, 0x1d, 0x18, 0x1b, 0x20, 0x44, 0x43, 0x34, 0x3d, 0x29, 0x2d, 0x30, 0x30, 0x2d, 0x2c, 0x3a, 0x37, 0x84, 0x34, 0x3c, 0x2a, 0x2d, 0x2f, 0x2f, 0x2d, 0x2c, 0x3a, 0x37, 0x04, 0x7a, 0xfc, 0xe0, 0x02, 0x5a, 0x0f, 0x12, 0x1a, 0x1f, 0x46, 0x29, 0x28, 0x4a, 0x1b, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1e, 0x47, 0x28, 0x29, 0x4b, 0x1a, 0x1c, 0x10, 0xa5, 0x1a, 0x1e, 0x2e, 0x32, 0x7f, 0x49, 0x46, 0x7f, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x32, 0x7f, 0x46, 0x49, 0x7f, 0x32, 0x31, 0x1b, 0x1a, 0x96, 0x0f, 0x12, 0x1a, 0x1f, 0x46, 0x29, 0x28, 0x4a, 0x1b, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1e, 0x47, 0x28, 0x29, 0x4b, 0x1a, 0x1c, 0x10, 0xa5, 0x1a, 0x1e, 0x2e, 0x32, 0x7f, 0x49, 0x46, 0x7f, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x32, 0x7f, 0x46, 0x49, 0x7f, 0x32, 0x31, 0x1b, 0x1a, 0x00, 0x00, 0x03, 0x00, 0x09, 0x01, 0x8d, 0x06, 0x00, 0x04, 0x4a, 0x00, 0x37, 0x00, 0x51, 0x00, 0x6b, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x27, 0x21, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x17, 0x24, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x24, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x03, 0x92, 0x06, 0x1f, 0x31, 0x2c, 0x3a, 0x36, 0x41, 0x44, 0x34, 0x3c, 0x2a, 0x2d, 0x2f, 0x2f, 0x2d, 0x2c, 0x3a, 0x37, 0x84, 0x34, 0x3d, 0x29, 0x30, 0x21, 0x05, 0xfe, 0xe4, 0x05, 0x23, 0x2e, 0x2c, 0x39, 0x37, 0x84, 0x35, 0x3c, 0x29, 0x2d, 0x30, 0x30, 0x2d, 0x2c, 0x39, 0x37, 0x41, 0x44, 0x34, 0x3c, 0x29, 0x31, 0x20, 0x06, 0x02, 0x73, 0x4a, 0x1f, 0x21, 0x1a, 0x1a, 0x1b, 0x1b, 0x1a, 0x1a, 0x21, 0x1f, 0x4a, 0x20, 0x20, 0x1a, 0x1a, 0x1b, 0x1b, 0x1a, 0x1a, 0x20, 0xfc, 0x5e, 0x4a, 0x1f, 0x25, 0x16, 0x1a, 0x1b, 0x1c, 0x19, 0x1a, 0x21, 0x1f, 0x4a, 0x20, 0x20, 0x1a, 0x1a, 0x1b, 0x1d, 0x18, 0x1a, 0x20, 0x03, 0x35, 0x1f, 0x5b, 0x35, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x32, 0x7f, 0x49, 0x46, 0x7f, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x34, 0x60, 0x18, 0x1d, 0x5d, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x32, 0x7f, 0x46, 0x49, 0x7f, 0x32, 0x31, 0x1b, 0x1a, 0x1a, 0x1e, 0x2e, 0x35, 0x5b, 0x1f, 0x7f, 0x0f, 0x10, 0x1c, 0x1f, 0x46, 0x29, 0x28, 0x47, 0x1e, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1e, 0x47, 0x28, 0x29, 0x46, 0x1f, 0x1c, 0x10, 0x0f, 0x0f, 0x12, 0x1a, 0x1f, 0x46, 0x29, 0x28, 0x4a, 0x1b, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1e, 0x47, 0x28, 0x29, 0x4b, 0x1a, 0x1c, 0x10, 0x00, 0x02, 0x00, 0xbd, 0x01, 0xe6, 0x05, 0x73, 0x04, 0x52, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x35, 0x25, 0x07, 0x15, 0x17, 0x01, 0x25, 0x05, 0x11, 0x05, 0x25, 0x04, 0xec, 0xfd, 0x1e, 0xc6, 0xc6, 0xfe, 0xb3, 0x01, 0x4d, 0x03, 0x69, 0xfc, 0x97, 0xfe, 0xb3, 0x02, 0xd7, 0x8a, 0x65, 0x4d, 0xba, 0x4d, 0x01, 0x5e, 0x82, 0x78, 0xfe, 0x84, 0x78, 0x82, 0x00, 0x00, 0x02, 0x01, 0x85, 0x00, 0x56, 0x04, 0x83, 0x05, 0x96, 0x00, 0x15, 0x00, 0x29, 0x00, 0x00, 0x01, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x35, 0x37, 0x35, 0x23, 0x15, 0x17, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x1f, 0x02, 0x23, 0x03, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x27, 0x35, 0x21, 0x15, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x03, 0x1b, 0x55, 0x6a, 0x49, 0x21, 0x46, 0x34, 0xb4, 0x34, 0x46, 0x20, 0x4a, 0x6a, 0x56, 0x92, 0xf8, 0x94, 0x6e, 0x57, 0x4c, 0x27, 0x4f, 0x02, 0x06, 0x4f, 0x28, 0x4b, 0x58, 0x6f, 0x01, 0x11, 0xb4, 0xdf, 0x34, 0x62, 0x5c, 0x29, 0x31, 0xa2, 0x25, 0x3d, 0x3d, 0x25, 0xa2, 0x31, 0x29, 0x5c, 0x62, 0x34, 0xdf, 0xb4, 0xbb, 0x01, 0x3a, 0xea, 0x60, 0xbe, 0x5c, 0x4b, 0x19, 0x44, 0xfa, 0xfa, 0x44, 0x19, 0x4b, 0x5c, 0xbe, 0x60, 0xea, 0x00, 0x02, 0x00, 0x9d, 0xfe, 0xff, 0x04, 0xa9, 0x05, 0xda, 0x00, 0x07, 0x00, 0x15, 0x00, 0x00, 0x00, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x36, 0x05, 0x26, 0x10, 0x00, 0x20, 0x00, 0x10, 0x07, 0x06, 0x07, 0x11, 0x23, 0x11, 0x26, 0x04, 0x06, 0xd2, 0xfe, 0xdb, 0xcf, 0xcf, 0x01, 0x25, 0xd2, 0xfd, 0x30, 0x98, 0x01, 0x2e, 0x01, 0xab, 0x01, 0x31, 0x98, 0x7a, 0xa2, 0xa2, 0xa3, 0x04, 0x43, 0xe4, 0xe4, 0xfe, 0xb9, 0xd8, 0xd8, 0xe8, 0x9d, 0x01, 0xdd, 0x01, 0x4c, 0xfe, 0xb4, 0xfe, 0x22, 0x9c, 0x7e, 0x12, 0xfd, 0x7b, 0x02, 0x86, 0x11, 0x00, 0x01, 0x01, 0x36, 0xfe, 0xff, 0x04, 0xa8, 0x05, 0xda, 0x00, 0x1a, 0x00, 0x00, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x16, 0x33, 0x32, 0x36, 0x10, 0x26, 0x20, 0x07, 0x27, 0x36, 0x20, 0x00, 0x10, 0x07, 0x06, 0x07, 0x11, 0x33, 0x15, 0x02, 0xf5, 0xa3, 0xf5, 0xf5, 0x24, 0x2f, 0x91, 0xd0, 0xd0, 0xfe, 0xdb, 0x71, 0x6a, 0x98, 0x01, 0xab, 0x01, 0x2f, 0x97, 0x7b, 0xa1, 0xf4, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0xb2, 0x07, 0xd8, 0x01, 0x47, 0xe4, 0x6a, 0x74, 0xa6, 0xfe, 0xb4, 0xfe, 0x20, 0x9a, 0x7e, 0x12, 0xfe, 0xf8, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9e, 0xfe, 0xff, 0x04, 0xa8, 0x05, 0xda, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x13, 0x09, 0x02, 0x11, 0x32, 0x33, 0x15, 0x22, 0x23, 0x11, 0x22, 0x23, 0x11, 0x22, 0x23, 0x35, 0x32, 0x33, 0x11, 0x37, 0x09, 0x02, 0x9e, 0x02, 0x05, 0x02, 0x05, 0xfe, 0x50, 0x7a, 0x7a, 0x7a, 0x7a, 0x51, 0x51, 0x7b, 0x7a, 0x7a, 0x7b, 0x4d, 0x01, 0x2b, 0xfe, 0xd5, 0xfe, 0xd5, 0x03, 0x9f, 0x02, 0x3b, 0xfd, 0xc5, 0xfd, 0xe9, 0xfe, 0xf4, 0x7c, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0x0c, 0xa8, 0x01, 0x6f, 0x01, 0x4a, 0xfe, 0xb6, 0x00, 0x00, 0x01, 0x00, 0x9e, 0xfe, 0xff, 0x04, 0xa8, 0x05, 0xda, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x21, 0x15, 0x21, 0x13, 0x07, 0x27, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x07, 0x27, 0x13, 0x21, 0x35, 0x21, 0x01, 0x00, 0x6f, 0xe4, 0xa1, 0xe3, 0x6f, 0xff, 0x00, 0x01, 0x62, 0xfe, 0xa4, 0xfa, 0x6e, 0xe4, 0xf5, 0xf5, 0xa2, 0xf5, 0xf5, 0xe4, 0x6e, 0xfa, 0xfe, 0xa4, 0x01, 0x62, 0x04, 0xf9, 0x7a, 0xfd, 0x01, 0x64, 0xfe, 0x9d, 0xfc, 0x7a, 0xfe, 0xe4, 0x7c, 0xfe, 0xeb, 0x7b, 0xfd, 0xfd, 0xae, 0x7c, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x02, 0x52, 0xfd, 0x7b, 0x01, 0x15, 0x7c, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6c, 0xff, 0x0f, 0x05, 0xb2, 0x05, 0x25, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x00, 0x01, 0x15, 0x21, 0x09, 0x01, 0x21, 0x35, 0x21, 0x09, 0x01, 0x03, 0x11, 0x23, 0x11, 0x01, 0x33, 0x17, 0x37, 0x33, 0x15, 0x23, 0x09, 0x01, 0x23, 0x05, 0xb2, 0xfe, 0xf1, 0xfe, 0x6c, 0xfe, 0x6c, 0xfe, 0xf1, 0x01, 0x78, 0x01, 0x2b, 0x01, 0x2b, 0xd9, 0x9b, 0xfe, 0x9e, 0xea, 0xc1, 0xc1, 0xea, 0x80, 0xfe, 0xd5, 0xfe, 0xd5, 0x80, 0x01, 0x4a, 0x7c, 0xfe, 0x41, 0x01, 0xbf, 0x7c, 0xfe, 0xb6, 0x01, 0x4a, 0x03, 0xdb, 0xfd, 0xa6, 0x02, 0x5a, 0xfd, 0x74, 0xd5, 0xd5, 0x7c, 0xfe, 0xb6, 0x01, 0x4a, 0x00, 0x00, 0x02, 0x01, 0x66, 0xff, 0x2c, 0x04, 0x49, 0x05, 0xaf, 0x00, 0x07, 0x00, 0x1c, 0x00, 0x00, 0x24, 0x14, 0x16, 0x32, 0x36, 0x34, 0x26, 0x22, 0x02, 0x26, 0x10, 0x37, 0x36, 0x37, 0x11, 0x33, 0x11, 0x25, 0x17, 0x0d, 0x01, 0x07, 0x25, 0x11, 0x16, 0x17, 0x16, 0x10, 0x06, 0x01, 0xef, 0x69, 0x96, 0x69, 0x69, 0x96, 0x38, 0xba, 0x5e, 0x41, 0x53, 0x9b, 0x01, 0x08, 0x4d, 0xfe, 0xbd, 0x01, 0x43, 0x4d, 0xfe, 0xf8, 0x50, 0x3f, 0x5e, 0xba, 0xdd, 0xa6, 0x75, 0x75, 0xa6, 0x76, 0xfd, 0xd9, 0xce, 0x01, 0x23, 0x67, 0x47, 0x16, 0x03, 0xce, 0xfe, 0xce, 0xad, 0x94, 0xd1, 0xd2, 0x94, 0xae, 0xfe, 0xd2, 0x16, 0x45, 0x67, 0xfe, 0xdd, 0xce, 0x00, 0x01, 0x01, 0x23, 0xfe, 0xff, 0x03, 0xe9, 0x05, 0xda, 0x00, 0x1e, 0x00, 0x00, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x26, 0x27, 0x26, 0x35, 0x10, 0x25, 0x36, 0x37, 0x36, 0x17, 0x06, 0x07, 0x06, 0x15, 0x10, 0x17, 0x16, 0x17, 0x06, 0x27, 0x15, 0x33, 0x15, 0x02, 0xf4, 0xa2, 0xf5, 0xf5, 0x8c, 0x5c, 0x46, 0x01, 0x0b, 0x54, 0x9c, 0x41, 0x35, 0xb7, 0x58, 0x68, 0xe1, 0x4e, 0x4d, 0x43, 0x63, 0xf5, 0xfe, 0xff, 0x01, 0x01, 0x7c, 0x01, 0x33, 0x4c, 0x98, 0x75, 0xa1, 0x01, 0x2e, 0xb9, 0x3a, 0x10, 0x07, 0x17, 0x3b, 0x85, 0x9d, 0xc4, 0xfe, 0xcd, 0xa2, 0x38, 0x0f, 0x25, 0x13, 0xff, 0x7c, 0x00, 0x00, 0x03, 0x00, 0x4d, 0x00, 0x08, 0x05, 0xbb, 0x04, 0x6d, 0x00, 0x0f, 0x00, 0x1d, 0x00, 0x33, 0x00, 0x00, 0x13, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x00, 0x20, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x1e, 0x01, 0x15, 0x11, 0x14, 0x06, 0x07, 0x06, 0x21, 0x20, 0x27, 0x2e, 0x01, 0x35, 0x11, 0x34, 0x36, 0x37, 0x36, 0x21, 0x20, 0xa7, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x29, 0x33, 0xd8, 0xfd, 0xae, 0xd5, 0x39, 0x03, 0x41, 0xfd, 0xed, 0xba, 0x9a, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x9a, 0x28, 0x67, 0x65, 0x65, 0x65, 0xcf, 0xfe, 0xe2, 0xfe, 0xe6, 0xd0, 0x68, 0x65, 0x65, 0x65, 0xcf, 0x01, 0x1e, 0x01, 0x1a, 0x02, 0x1d, 0x93, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x92, 0x22, 0x1c, 0x78, 0x78, 0x20, 0x02, 0x0b, 0x68, 0x56, 0x63, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x63, 0x56, 0x59, 0x39, 0x88, 0x51, 0xfe, 0xa2, 0x4e, 0x88, 0x39, 0x73, 0x73, 0x39, 0x88, 0x4e, 0x01, 0x5e, 0x51, 0x88, 0x39, 0x73, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x4d, 0x00, 0x08, 0x05, 0xbb, 0x05, 0xcb, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x2d, 0x00, 0x45, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x01, 0x1e, 0x01, 0x15, 0x19, 0x01, 0x14, 0x06, 0x07, 0x06, 0x21, 0x20, 0x27, 0x2e, 0x01, 0x35, 0x19, 0x01, 0x34, 0x36, 0x37, 0x36, 0x21, 0x20, 0x04, 0x0e, 0xfd, 0xed, 0xba, 0x9a, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x9a, 0xfb, 0xe0, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x29, 0x33, 0xd8, 0xfd, 0xae, 0xd5, 0x39, 0x26, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x29, 0x33, 0xd8, 0xfd, 0xae, 0xd5, 0x39, 0x04, 0x22, 0x67, 0x65, 0x65, 0x65, 0xcf, 0xfe, 0xe2, 0xfe, 0xe6, 0xd0, 0x68, 0x65, 0x65, 0x65, 0xcf, 0x01, 0x1e, 0x01, 0x1a, 0x05, 0x67, 0x68, 0x56, 0x63, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x63, 0x56, 0xfe, 0x7c, 0x93, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x92, 0x22, 0x1c, 0x78, 0x78, 0x20, 0xfe, 0xc1, 0x93, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x92, 0x22, 0x1c, 0x78, 0x78, 0x20, 0x03, 0x5a, 0x39, 0x88, 0x51, 0xfe, 0xa2, 0xfe, 0xa2, 0x4e, 0x88, 0x39, 0x73, 0x73, 0x39, 0x88, 0x4e, 0x01, 0x5e, 0x01, 0x5e, 0x51, 0x88, 0x39, 0x73, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x4d, 0x00, 0x08, 0x05, 0xbb, 0x04, 0x6d, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x31, 0x00, 0x3f, 0x00, 0x55, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x16, 0x21, 0x20, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x15, 0x06, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x37, 0x03, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x00, 0x20, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x37, 0x1e, 0x01, 0x15, 0x11, 0x14, 0x06, 0x07, 0x06, 0x21, 0x20, 0x27, 0x2e, 0x01, 0x35, 0x11, 0x34, 0x36, 0x37, 0x36, 0x21, 0x20, 0x04, 0xec, 0x1c, 0x32, 0xa6, 0xf4, 0xf6, 0xa3, 0x35, 0x1b, 0xd4, 0x01, 0x15, 0x01, 0x13, 0xfd, 0xf9, 0x01, 0xea, 0xa4, 0x34, 0x1c, 0x19, 0x02, 0x17, 0x1c, 0x34, 0xa6, 0xfe, 0x16, 0xa3, 0x35, 0x1b, 0x1b, 0x01, 0x01, 0x19, 0x1c, 0x34, 0xc4, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x29, 0x33, 0xd8, 0xfd, 0xae, 0xd5, 0x39, 0x03, 0x41, 0xfd, 0xed, 0xba, 0x9a, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x9a, 0x28, 0x67, 0x65, 0x65, 0x65, 0xcf, 0xfe, 0xe2, 0xfe, 0xe6, 0xd0, 0x68, 0x65, 0x65, 0x65, 0xcf, 0x01, 0x1e, 0x01, 0x1a, 0x01, 0x64, 0x1b, 0x1c, 0x5d, 0x5d, 0x1e, 0x1a, 0x63, 0x02, 0xa3, 0x5d, 0x1d, 0x1c, 0x19, 0x0e, 0x0e, 0x16, 0x1c, 0x1d, 0x5d, 0x5d, 0x1e, 0x1b, 0x18, 0x0c, 0x0f, 0x18, 0x1c, 0x1d, 0xfe, 0xd5, 0x93, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x92, 0x22, 0x1c, 0x78, 0x78, 0x20, 0x02, 0x0b, 0x68, 0x56, 0x63, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x63, 0x56, 0x59, 0x39, 0x88, 0x51, 0xfe, 0xa2, 0x4e, 0x88, 0x39, 0x73, 0x73, 0x39, 0x88, 0x4e, 0x01, 0x5e, 0x51, 0x88, 0x39, 0x73, 0x00, 0x07, 0x00, 0x4d, 0x00, 0x08, 0x05, 0xbb, 0x05, 0xcb, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3b, 0x00, 0x4b, 0x00, 0x5b, 0x00, 0x73, 0x00, 0x00, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x15, 0x06, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x37, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x16, 0x21, 0x20, 0x17, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x16, 0x21, 0x20, 0x02, 0x20, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x15, 0x14, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3d, 0x01, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x01, 0x1e, 0x01, 0x15, 0x19, 0x01, 0x14, 0x06, 0x07, 0x06, 0x21, 0x20, 0x27, 0x2e, 0x01, 0x35, 0x19, 0x01, 0x34, 0x36, 0x37, 0x36, 0x21, 0x20, 0x02, 0x10, 0x01, 0xea, 0xa4, 0x34, 0x1c, 0x19, 0x02, 0x17, 0x1c, 0x34, 0xa6, 0xfe, 0x16, 0xa3, 0x35, 0x1b, 0x1b, 0x01, 0x01, 0x19, 0x1c, 0x34, 0x03, 0x81, 0x1c, 0x32, 0xa6, 0xf4, 0xf6, 0xa3, 0x35, 0x1b, 0xd4, 0x01, 0x15, 0x01, 0x13, 0xd5, 0x1c, 0x32, 0xa6, 0xf4, 0xf6, 0xa3, 0x35, 0x1b, 0xd4, 0x01, 0x15, 0x01, 0x13, 0x09, 0xfd, 0xed, 0xba, 0x9a, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x9a, 0xfb, 0xe0, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x29, 0x33, 0xd8, 0xfd, 0xae, 0xd5, 0x39, 0x26, 0x9a, 0xba, 0x02, 0x13, 0xb9, 0x9a, 0x29, 0x33, 0xd8, 0xfd, 0xae, 0xd5, 0x39, 0x04, 0x22, 0x67, 0x65, 0x65, 0x65, 0xcf, 0xfe, 0xe2, 0xfe, 0xe6, 0xd0, 0x68, 0x65, 0x65, 0x65, 0xcf, 0x01, 0x1e, 0x01, 0x1a, 0x05, 0x03, 0x5d, 0x1d, 0x1c, 0x19, 0x0e, 0x0e, 0x16, 0x1c, 0x1d, 0x5d, 0x5d, 0x1e, 0x1b, 0x18, 0x0c, 0x0f, 0x18, 0x1c, 0x1d, 0xfe, 0x1c, 0x1b, 0x1c, 0x5d, 0x5d, 0x1e, 0x1a, 0x63, 0xfc, 0x1b, 0x1c, 0x5d, 0x5d, 0x1e, 0x1a, 0x63, 0x04, 0x65, 0x68, 0x56, 0x63, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x63, 0x56, 0xfe, 0x7c, 0x93, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x92, 0x22, 0x1c, 0x78, 0x78, 0x20, 0xfe, 0xc1, 0x93, 0x60, 0x56, 0x68, 0x68, 0x56, 0x60, 0x92, 0x22, 0x1c, 0x78, 0x78, 0x20, 0x03, 0x5a, 0x39, 0x88, 0x51, 0xfe, 0xa2, 0xfe, 0xa2, 0x4e, 0x88, 0x39, 0x73, 0x73, 0x39, 0x88, 0x4e, 0x01, 0x5e, 0x01, 0x5e, 0x51, 0x88, 0x39, 0x73, 0x00, 0x00, 0x03, 0x00, 0x9d, 0xff, 0xe3, 0x04, 0xa9, 0x06, 0xbe, 0x00, 0x0b, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x13, 0x16, 0x17, 0x16, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00, 0x10, 0x37, 0x36, 0x37, 0x0b, 0x01, 0x35, 0x09, 0x01, 0x15, 0x0b, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x02, 0xa3, 0x3a, 0x57, 0x55, 0x3c, 0x3f, 0x52, 0x55, 0x15, 0xa3, 0x79, 0x98, 0xfe, 0xd2, 0xd7, 0xd4, 0xfe, 0xcf, 0x98, 0x7a, 0xa2, 0x01, 0xed, 0x01, 0x3f, 0x01, 0x3f, 0xee, 0x51, 0x94, 0xcf, 0xcf, 0x94, 0x91, 0xd2, 0xd2, 0x01, 0x7d, 0x5b, 0x44, 0x3e, 0x58, 0x55, 0x41, 0x42, 0x5d, 0x02, 0xbb, 0x11, 0x7e, 0x9d, 0xee, 0xef, 0xfe, 0xb4, 0x01, 0x4c, 0x01, 0xde, 0x9c, 0x7e, 0x12, 0x01, 0x67, 0xfe, 0xfa, 0xc7, 0x01, 0x5d, 0xfe, 0xa3, 0xc7, 0x01, 0x05, 0xfa, 0xf7, 0xe4, 0xa4, 0xa3, 0xd8, 0xd8, 0xa3, 0xa4, 0xe4, 0x00, 0x03, 0x00, 0x13, 0x01, 0x85, 0x05, 0xc8, 0x05, 0x14, 0x00, 0x50, 0x00, 0x6a, 0x00, 0x85, 0x00, 0x00, 0x01, 0x27, 0x23, 0x22, 0x27, 0x26, 0x07, 0x06, 0x14, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x1f, 0x01, 0x16, 0x33, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x26, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x17, 0x16, 0x1f, 0x01, 0x21, 0x32, 0x17, 0x16, 0x17, 0x21, 0x17, 0x25, 0x16, 0x33, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x14, 0x17, 0x1e, 0x01, 0x01, 0x26, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x14, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x26, 0x03, 0x6c, 0xc1, 0x67, 0x9d, 0x19, 0x26, 0x03, 0x01, 0x09, 0x0b, 0x2c, 0x20, 0x19, 0x27, 0x20, 0x21, 0x20, 0x17, 0x13, 0x15, 0x10, 0x0b, 0x0b, 0x2c, 0x20, 0x1a, 0x26, 0x1f, 0x09, 0x50, 0x58, 0x51, 0x21, 0x0d, 0x13, 0x22, 0x02, 0x03, 0x06, 0x0c, 0x0b, 0x14, 0x46, 0x4b, 0x2d, 0x2c, 0x17, 0x19, 0x0e, 0x11, 0x0b, 0x0c, 0x2f, 0x1c, 0x20, 0x41, 0x40, 0x18, 0x1c, 0x0c, 0x10, 0x0b, 0x08, 0x1b, 0x03, 0x04, 0x1e, 0x25, 0x62, 0x4a, 0x01, 0x64, 0xd0, 0x47, 0x5b, 0x10, 0xfd, 0xa5, 0xbf, 0xfc, 0x72, 0x13, 0x12, 0x16, 0x0e, 0x13, 0x1a, 0x05, 0x04, 0x0b, 0x08, 0x0e, 0x0f, 0x28, 0x0f, 0x12, 0x12, 0x13, 0x17, 0x07, 0x05, 0x0c, 0x08, 0x1c, 0x01, 0x11, 0x10, 0x15, 0x19, 0x0b, 0x13, 0x1b, 0x03, 0x05, 0x0b, 0x09, 0x0e, 0x0d, 0x27, 0x12, 0x14, 0x10, 0x13, 0x19, 0x04, 0x06, 0x0c, 0x09, 0x0d, 0x0a, 0x01, 0x85, 0xcd, 0x06, 0x08, 0x0d, 0x08, 0x29, 0x17, 0x20, 0x2e, 0x0d, 0x0b, 0x0f, 0x0e, 0x19, 0x15, 0x24, 0x1d, 0x4a, 0x1e, 0x20, 0x2e, 0x0d, 0x0b, 0x03, 0x25, 0x27, 0x03, 0x05, 0x1c, 0x07, 0x08, 0x2e, 0x13, 0x13, 0x13, 0x44, 0x22, 0x14, 0x14, 0x18, 0x1b, 0x1e, 0x26, 0x42, 0x1d, 0x20, 0x31, 0x0a, 0x0b, 0x1e, 0x18, 0x1e, 0x1c, 0x24, 0x43, 0x1e, 0x17, 0x1d, 0x07, 0x0d, 0x16, 0x1a, 0x6d, 0x52, 0x20, 0x29, 0x4b, 0xcf, 0x79, 0x09, 0x05, 0x07, 0x18, 0x10, 0x11, 0x1f, 0x17, 0x12, 0x0d, 0x10, 0x10, 0x06, 0x06, 0x17, 0x11, 0x11, 0x20, 0x16, 0x12, 0x1c, 0x02, 0xb5, 0x09, 0x05, 0x07, 0x19, 0x0f, 0x11, 0x21, 0x15, 0x12, 0x0e, 0x0d, 0x12, 0x05, 0x07, 0x19, 0x0e, 0x12, 0x20, 0x16, 0x12, 0x0e, 0x09, 0x00, 0x00, 0x03, 0x00, 0x4d, 0x01, 0x21, 0x05, 0xa5, 0x04, 0xb5, 0x00, 0x15, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x00, 0x12, 0x32, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x22, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x01, 0x05, 0x06, 0x23, 0x22, 0x27, 0x25, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x37, 0x3e, 0x02, 0x34, 0x2e, 0x01, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x25, 0x36, 0x33, 0x32, 0x17, 0x24, 0x22, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x01, 0x32, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0xe4, 0x29, 0x22, 0x0f, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f, 0x22, 0x29, 0x22, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x02, 0xb4, 0x02, 0x2e, 0x27, 0x62, 0x49, 0xc5, 0xfe, 0xb5, 0x5f, 0x87, 0x48, 0x0f, 0x19, 0x19, 0x14, 0x24, 0x1d, 0x47, 0x1d, 0x1f, 0x19, 0x18, 0x1b, 0x1a, 0x19, 0x14, 0x24, 0x1d, 0x09, 0x57, 0x4d, 0x5c, 0x18, 0x22, 0x16, 0x16, 0x22, 0x18, 0x58, 0x51, 0x30, 0x30, 0x1d, 0x24, 0x14, 0x19, 0x1a, 0x1b, 0x18, 0x19, 0x1f, 0x1d, 0x47, 0x1d, 0x24, 0x14, 0x19, 0x19, 0x0f, 0x48, 0x87, 0x5f, 0x01, 0x4b, 0xc5, 0x49, 0x62, 0x27, 0xfb, 0x69, 0x29, 0x22, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x22, 0x29, 0x22, 0x0f, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f, 0x01, 0x71, 0x0e, 0x0d, 0x0e, 0x1f, 0x13, 0x12, 0x1f, 0x0e, 0x0d, 0x0e, 0x0e, 0x0d, 0x0e, 0x1f, 0x12, 0x13, 0x1f, 0x0e, 0x0d, 0x01, 0x6c, 0xfc, 0x3f, 0x57, 0x92, 0x2c, 0x3e, 0x0e, 0x0e, 0x08, 0x26, 0x19, 0x23, 0x3c, 0x1a, 0x15, 0x10, 0x0d, 0x0d, 0x0e, 0x17, 0x15, 0x41, 0x23, 0x22, 0x3c, 0x1a, 0x15, 0x10, 0x0d, 0x22, 0x09, 0x1a, 0x28, 0x10, 0x28, 0x1a, 0x09, 0x22, 0x0d, 0x10, 0x15, 0x1a, 0x3c, 0x22, 0x23, 0x41, 0x15, 0x17, 0x0e, 0x0d, 0x0d, 0x10, 0x15, 0x1a, 0x3c, 0x23, 0x19, 0x26, 0x08, 0x0e, 0x0e, 0x3e, 0x2c, 0x92, 0x57, 0x3f, 0x7e, 0x0e, 0x0d, 0x0e, 0x1f, 0x13, 0x12, 0x1f, 0x0e, 0x0d, 0x0e, 0x0e, 0x0d, 0x0e, 0x1f, 0x12, 0x13, 0x1f, 0x0e, 0x0d, 0x00, 0x03, 0x00, 0x13, 0x00, 0xc0, 0x05, 0xc8, 0x04, 0x4f, 0x00, 0x4f, 0x00, 0x6a, 0x00, 0x85, 0x00, 0x00, 0x01, 0x33, 0x07, 0x21, 0x06, 0x07, 0x06, 0x23, 0x21, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x3f, 0x01, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x06, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x34, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x14, 0x17, 0x16, 0x37, 0x36, 0x3b, 0x01, 0x25, 0x06, 0x07, 0x06, 0x07, 0x06, 0x14, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x23, 0x22, 0x13, 0x36, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x14, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x33, 0x32, 0x03, 0x6c, 0xc0, 0xbf, 0x02, 0x5b, 0x10, 0x5b, 0x47, 0xd0, 0xfe, 0x9c, 0x4a, 0x5a, 0x2d, 0x1a, 0x1e, 0x08, 0x0b, 0x10, 0x0c, 0x1c, 0x18, 0x40, 0x41, 0x20, 0x1c, 0x32, 0x09, 0x0b, 0x11, 0x0b, 0x1c, 0x17, 0x08, 0x51, 0x4b, 0x46, 0x14, 0x0b, 0x0c, 0x06, 0x03, 0x02, 0x1a, 0x1b, 0x08, 0x26, 0x51, 0x58, 0x2c, 0x2d, 0x1f, 0x27, 0x19, 0x20, 0x2c, 0x0b, 0x0b, 0x10, 0x10, 0x2f, 0x20, 0x21, 0x20, 0x27, 0x19, 0x20, 0x2c, 0x0b, 0x09, 0x01, 0x06, 0x23, 0x16, 0xa0, 0x67, 0xfd, 0xf3, 0x12, 0x0e, 0x08, 0x0e, 0x0c, 0x05, 0x07, 0x14, 0x16, 0x0f, 0x15, 0x13, 0x25, 0x0e, 0x0e, 0x08, 0x0c, 0x05, 0x07, 0x13, 0x18, 0x0f, 0x15, 0x12, 0xec, 0x13, 0x0e, 0x08, 0x0e, 0x0c, 0x06, 0x06, 0x19, 0x11, 0x10, 0x14, 0x13, 0x26, 0x0d, 0x0e, 0x09, 0x0b, 0x05, 0x06, 0x1b, 0x10, 0x12, 0x12, 0x0d, 0x04, 0x4f, 0xcf, 0x4b, 0x29, 0x20, 0x52, 0x64, 0x23, 0x14, 0x0f, 0x06, 0x1e, 0x17, 0x21, 0x3e, 0x26, 0x1c, 0x1e, 0x18, 0x1e, 0x0b, 0x0a, 0x33, 0x1e, 0x22, 0x39, 0x2a, 0x1b, 0x1e, 0x18, 0x04, 0x24, 0x22, 0x44, 0x13, 0x13, 0x13, 0x2e, 0x08, 0x07, 0x16, 0x0b, 0x03, 0x27, 0x14, 0x14, 0x0b, 0x0e, 0x2d, 0x20, 0x20, 0x44, 0x21, 0x20, 0x32, 0x0e, 0x0f, 0x0b, 0x0d, 0x2e, 0x20, 0x17, 0x2c, 0x05, 0x0e, 0x09, 0x06, 0x54, 0x08, 0x0e, 0x08, 0x18, 0x13, 0x25, 0x0f, 0x11, 0x15, 0x08, 0x06, 0x12, 0x0e, 0x0d, 0x12, 0x16, 0x23, 0x0e, 0x12, 0x15, 0x08, 0x05, 0xfd, 0x3a, 0x09, 0x0d, 0x08, 0x18, 0x13, 0x26, 0x0f, 0x10, 0x19, 0x05, 0x05, 0x12, 0x0d, 0x0e, 0x12, 0x13, 0x28, 0x0c, 0x11, 0x19, 0x05, 0x05, 0x00, 0x00, 0x09, 0x00, 0x41, 0x00, 0xf4, 0x05, 0xf0, 0x04, 0xe8, 0x00, 0x5a, 0x00, 0x78, 0x00, 0x96, 0x00, 0xb4, 0x00, 0xd2, 0x00, 0xfe, 0x01, 0x2d, 0x01, 0x34, 0x01, 0x48, 0x00, 0x00, 0x01, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x1f, 0x01, 0x25, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x0d, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x25, 0x07, 0x06, 0x07, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x37, 0x36, 0x02, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x12, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x12, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x05, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x37, 0x36, 0x03, 0x2d, 0x01, 0x26, 0x23, 0x22, 0x07, 0x05, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x25, 0x05, 0x16, 0x33, 0x32, 0x37, 0x25, 0x26, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x02, 0x0e, 0x0a, 0x07, 0x07, 0x0a, 0x08, 0x16, 0x49, 0x53, 0x3c, 0x29, 0x28, 0x21, 0x24, 0x1f, 0x11, 0x10, 0x10, 0x0e, 0x24, 0x19, 0x2a, 0x26, 0x2b, 0x29, 0x28, 0x27, 0x1e, 0x24, 0x0c, 0x10, 0x05, 0x2a, 0x80, 0x4f, 0x01, 0x3a, 0xcc, 0x52, 0x7b, 0x33, 0x07, 0x1b, 0xfe, 0x35, 0x01, 0xcb, 0x1b, 0x07, 0x36, 0x78, 0x52, 0xcc, 0xfe, 0xc6, 0x4f, 0x80, 0x2a, 0x05, 0x10, 0x11, 0x1f, 0x20, 0x25, 0x2b, 0x26, 0x2e, 0x23, 0x25, 0x1f, 0x25, 0x0c, 0x10, 0x10, 0x0e, 0x22, 0x19, 0x2c, 0x26, 0x2b, 0x3c, 0x4a, 0x52, 0x15, 0xfa, 0x19, 0x0a, 0x0b, 0x08, 0x09, 0x03, 0x03, 0x03, 0x03, 0x09, 0x08, 0x0b, 0x0a, 0x19, 0x0a, 0x0a, 0x09, 0x08, 0x03, 0x03, 0x03, 0x03, 0x08, 0x09, 0x0a, 0x0a, 0x19, 0x0a, 0x0b, 0x08, 0x09, 0x03, 0x03, 0x03, 0x03, 0x09, 0x08, 0x0b, 0x0a, 0x19, 0x0a, 0x0a, 0x09, 0x08, 0x03, 0x03, 0x03, 0x03, 0x08, 0x09, 0x0a, 0x2d, 0x2d, 0x13, 0x12, 0x10, 0x11, 0x08, 0x08, 0x08, 0x08, 0x11, 0x10, 0x12, 0x13, 0x2d, 0x13, 0x13, 0x10, 0x11, 0x08, 0x08, 0x08, 0x08, 0x11, 0x10, 0x13, 0x13, 0x2d, 0x13, 0x12, 0x10, 0x11, 0x08, 0x08, 0x08, 0x08, 0x11, 0x10, 0x12, 0x13, 0x2d, 0x13, 0x13, 0x10, 0x11, 0x08, 0x08, 0x08, 0x08, 0x11, 0x10, 0x13, 0x01, 0x5f, 0x21, 0x86, 0x23, 0x14, 0x0a, 0x0e, 0x0a, 0x05, 0x0c, 0x0b, 0x19, 0x12, 0x22, 0x1c, 0x42, 0x1c, 0x1d, 0x18, 0x16, 0x0e, 0x0b, 0x0b, 0x0c, 0x18, 0x12, 0x23, 0x1c, 0x21, 0x3c, 0x53, 0x5a, 0x1b, 0x10, 0x15, 0x06, 0x20, 0x19, 0xaa, 0x01, 0xbc, 0x02, 0x22, 0x26, 0x54, 0x47, 0xc3, 0xfe, 0xb6, 0x86, 0x10, 0x0f, 0x15, 0x12, 0x19, 0x5e, 0x4f, 0x3c, 0x21, 0x1c, 0x23, 0x12, 0x18, 0x0c, 0x0b, 0x0b, 0x0e, 0x16, 0x18, 0x1d, 0x1c, 0x42, 0x1c, 0x22, 0x12, 0x19, 0x0b, 0x0c, 0x05, 0x0a, 0x0e, 0x0b, 0x01, 0x6b, 0x01, 0x02, 0xc3, 0x47, 0x54, 0x26, 0xfe, 0x14, 0xc4, 0x04, 0x06, 0x08, 0x08, 0x14, 0x08, 0x08, 0x05, 0x05, 0x05, 0x05, 0x08, 0x08, 0x14, 0x08, 0x08, 0x06, 0x02, 0xd9, 0x08, 0x0d, 0x0e, 0x07, 0x06, 0x0a, 0x20, 0x10, 0x0d, 0x22, 0x1c, 0x29, 0x26, 0x60, 0x26, 0x22, 0x27, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1f, 0x24, 0x22, 0x2f, 0x27, 0x1d, 0x12, 0x09, 0x3c, 0x25, 0x8b, 0x5a, 0x53, 0x0d, 0x11, 0x1f, 0x0c, 0xcf, 0xcf, 0x0c, 0x25, 0x0d, 0x0b, 0x53, 0x5a, 0x8b, 0x25, 0x3c, 0x09, 0x18, 0x17, 0x2f, 0x27, 0x2a, 0x1d, 0x20, 0x0e, 0x10, 0x10, 0x11, 0x1c, 0x22, 0x25, 0x35, 0x22, 0x2d, 0x28, 0x24, 0x23, 0x1b, 0x13, 0x10, 0x20, 0x09, 0xfe, 0xd2, 0x04, 0x05, 0x08, 0x07, 0x07, 0x04, 0x08, 0x07, 0x05, 0x06, 0x08, 0x07, 0x05, 0x04, 0x04, 0x05, 0x08, 0x07, 0x07, 0x04, 0x07, 0x08, 0x05, 0x06, 0x08, 0x07, 0x05, 0x02, 0x3b, 0x04, 0x05, 0x08, 0x07, 0x07, 0x04, 0x07, 0x08, 0x05, 0x06, 0x08, 0x07, 0x05, 0x04, 0x04, 0x05, 0x08, 0x07, 0x07, 0x04, 0x08, 0x07, 0x05, 0x06, 0x08, 0x07, 0x05, 0xfd, 0x82, 0x07, 0x08, 0x0e, 0x10, 0x11, 0x12, 0x16, 0x15, 0x12, 0x11, 0x10, 0x0e, 0x08, 0x07, 0x07, 0x08, 0x0e, 0x10, 0x11, 0x12, 0x15, 0x16, 0x12, 0x11, 0x10, 0x0e, 0x08, 0x02, 0x38, 0x07, 0x08, 0x0e, 0x10, 0x11, 0x12, 0x15, 0x16, 0x12, 0x11, 0x10, 0x0e, 0x08, 0x07, 0x07, 0x08, 0x0e, 0x10, 0x11, 0x12, 0x16, 0x15, 0x12, 0x11, 0x10, 0x0e, 0x08, 0x5c, 0x0f, 0x3d, 0x07, 0x04, 0x06, 0x08, 0x0e, 0x0a, 0x18, 0x0e, 0x17, 0x21, 0x1c, 0x1b, 0x19, 0x13, 0x10, 0x0c, 0x0c, 0x0e, 0x16, 0x13, 0x20, 0x1c, 0x21, 0x20, 0x1c, 0x1b, 0x19, 0x13, 0x10, 0x0c, 0x22, 0x0a, 0x0e, 0x11, 0x08, 0x18, 0x11, 0xfe, 0xf2, 0xc2, 0xf7, 0x2f, 0x56, 0x92, 0x43, 0x1e, 0x1e, 0x0f, 0x0e, 0x0a, 0x22, 0x0c, 0x10, 0x13, 0x19, 0x1b, 0x1c, 0x20, 0x21, 0x1c, 0x20, 0x13, 0x16, 0x0e, 0x0c, 0x0c, 0x10, 0x13, 0x19, 0x1b, 0x1c, 0x21, 0x17, 0x0d, 0x19, 0x0a, 0x14, 0x02, 0x02, 0x5b, 0x75, 0x56, 0x2f, 0xe1, 0x2b, 0x16, 0x09, 0x09, 0x06, 0x05, 0x05, 0x06, 0x09, 0x09, 0x16, 0x09, 0x09, 0x06, 0x05, 0x05, 0x06, 0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4d, 0xff, 0xe3, 0x05, 0xbb, 0x05, 0xf0, 0x00, 0x61, 0x00, 0x75, 0x00, 0x87, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x15, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, 0x26, 0x35, 0x34, 0x37, 0x12, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x16, 0x17, 0x16, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x36, 0x37, 0x36, 0x35, 0x34, 0x01, 0xde, 0x03, 0x0b, 0x13, 0x11, 0x12, 0x16, 0x64, 0x00, 0xff, 0x6d, 0x6c, 0x58, 0x5a, 0x57, 0x55, 0x5c, 0x56, 0x6e, 0x6c, 0x7c, 0x78, 0x70, 0x6b, 0x58, 0x5a, 0x58, 0x46, 0x27, 0x60, 0x67, 0x63, 0x6a, 0x61, 0x7f, 0x7e, 0x8c, 0x8b, 0x80, 0x78, 0x68, 0x65, 0x67, 0x63, 0x69, 0x63, 0x7d, 0x7f, 0xfe, 0xe6, 0x7c, 0x26, 0x3d, 0x21, 0x1d, 0x19, 0x03, 0x61, 0xa3, 0x98, 0x49, 0x05, 0x0f, 0x21, 0x1e, 0x08, 0x31, 0x26, 0x1c, 0x3d, 0x39, 0x0f, 0x10, 0x14, 0x1e, 0x30, 0x23, 0x10, 0x0f, 0x44, 0x15, 0x24, 0x2d, 0x17, 0x14, 0x03, 0x29, 0x05, 0x10, 0x01, 0x0a, 0x11, 0x18, 0x1f, 0x1d, 0x11, 0x03, 0x03, 0x18, 0x01, 0x75, 0x37, 0x14, 0x0f, 0x13, 0x0c, 0x1b, 0x09, 0x19, 0x09, 0x34, 0x0f, 0x1a, 0x1b, 0x01, 0x37, 0x06, 0x1e, 0x1b, 0x1c, 0x32, 0x12, 0x13, 0x0b, 0x33, 0x33, 0x31, 0x63, 0x64, 0xed, 0x88, 0x8d, 0xe8, 0x69, 0x60, 0x34, 0x33, 0x33, 0x31, 0x63, 0x64, 0xed, 0x8d, 0x87, 0xbc, 0x3e, 0x98, 0x6d, 0x01, 0x10, 0x9c, 0x9d, 0x01, 0x10, 0x77, 0x6e, 0x3c, 0x3b, 0x3b, 0x38, 0x72, 0x6f, 0xfe, 0xec, 0xa1, 0x98, 0xfe, 0xf0, 0x77, 0x70, 0x3a, 0x3b, 0x3b, 0x12, 0x42, 0x56, 0x30, 0x2f, 0x4d, 0x1f, 0x10, 0x0f, 0xcd, 0xef, 0x01, 0x90, 0x08, 0x14, 0x38, 0x3a, 0x44, 0x40, 0x2a, 0x1f, 0x7c, 0x73, 0x61, 0x20, 0x16, 0x1b, 0x1e, 0x09, 0x2d, 0x46, 0x28, 0x1c, 0x37, 0x0c, 0x22, 0x2a, 0x3d, 0x38, 0x19, 0x26, 0x08, 0x15, 0x0f, 0x30, 0x21, 0x32, 0x1d, 0x1c, 0x01, 0x06, 0x04, 0x20, 0x16, 0x11, 0x0c, 0x31, 0x2d, 0x35, 0x24, 0x26, 0x0c, 0x0a, 0x12, 0x36, 0x3a, 0x42, 0x34, 0x00, 0x00, 0x06, 0x00, 0x4d, 0xff, 0xe3, 0x05, 0xbb, 0x05, 0xf0, 0x00, 0x0d, 0x00, 0x1a, 0x00, 0x28, 0x00, 0x42, 0x00, 0x5c, 0x00, 0x77, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x27, 0x25, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x13, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x13, 0x36, 0x33, 0x32, 0x17, 0x13, 0x05, 0x0e, 0x01, 0x07, 0x25, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x13, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x01, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x32, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x36, 0x01, 0x7e, 0x38, 0x23, 0x05, 0x01, 0x0c, 0x07, 0x22, 0x21, 0x1d, 0x2c, 0x12, 0x07, 0xdb, 0x21, 0x28, 0x27, 0x5e, 0x26, 0x29, 0x20, 0x3f, 0x2e, 0x31, 0x33, 0x2d, 0x7a, 0x01, 0x0c, 0x02, 0x25, 0x39, 0xfe, 0xb6, 0x0d, 0x0d, 0x2c, 0x1d, 0x20, 0x22, 0xfd, 0x38, 0x18, 0x18, 0x14, 0x13, 0x14, 0x14, 0x13, 0x14, 0x18, 0x18, 0x38, 0x17, 0x18, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x18, 0x33, 0x78, 0x70, 0x6b, 0x58, 0x5a, 0x58, 0x59, 0x59, 0x56, 0xda, 0xf6, 0x6d, 0x6c, 0x58, 0x5a, 0x57, 0x55, 0x5c, 0x56, 0x6e, 0x6c, 0x7c, 0x8b, 0x80, 0x78, 0x68, 0x65, 0x67, 0x63, 0x69, 0x63, 0x7d, 0x7f, 0xfe, 0xea, 0x80, 0x79, 0x67, 0x65, 0x68, 0x63, 0x6a, 0x61, 0x7f, 0x7e, 0x01, 0x77, 0x49, 0x5f, 0x0f, 0xfd, 0x1e, 0x22, 0x32, 0x5b, 0x24, 0x20, 0x16, 0x09, 0x01, 0x01, 0xa3, 0x22, 0x14, 0x13, 0x13, 0x14, 0x22, 0x01, 0x83, 0x09, 0x09, 0xfe, 0x0b, 0xfd, 0x07, 0x67, 0x49, 0x83, 0x04, 0x06, 0x16, 0x20, 0x24, 0x5b, 0x32, 0x21, 0x76, 0x0b, 0x0c, 0x15, 0x17, 0x35, 0x1f, 0x1e, 0x35, 0x17, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x17, 0x35, 0x1e, 0x1f, 0x35, 0x17, 0x15, 0x0c, 0x02, 0x15, 0x33, 0x31, 0x63, 0x64, 0xed, 0x8d, 0x85, 0xf1, 0x63, 0x61, 0x66, 0x33, 0x31, 0x63, 0x64, 0xed, 0x88, 0x8d, 0xe8, 0x69, 0x60, 0x34, 0x33, 0x64, 0x3b, 0x38, 0x72, 0x6f, 0xfe, 0xec, 0xa1, 0x98, 0xfe, 0xf0, 0x77, 0x70, 0x3a, 0x3b, 0x3b, 0x38, 0x72, 0x6f, 0x01, 0x14, 0x9c, 0x9d, 0x01, 0x10, 0x77, 0x6e, 0x3c, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6c, 0x00, 0x2c, 0x05, 0xa1, 0x05, 0xaa, 0x00, 0x2d, 0x00, 0x00, 0x13, 0x35, 0x37, 0x27, 0x33, 0x17, 0x36, 0x25, 0x02, 0x03, 0x33, 0x17, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x17, 0x33, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x07, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x07, 0x23, 0x12, 0x13, 0x24, 0x27, 0x07, 0x23, 0x37, 0x85, 0x21, 0x3a, 0x5a, 0x83, 0x84, 0x01, 0x01, 0x30, 0x99, 0x6e, 0x68, 0x85, 0x4d, 0x5a, 0x8a, 0x53, 0x88, 0xee, 0x3f, 0x2b, 0x1d, 0x1d, 0x2b, 0x3f, 0xee, 0x88, 0x53, 0x8a, 0x5a, 0x4d, 0x85, 0x68, 0x6e, 0x99, 0x30, 0xfe, 0xff, 0x84, 0x83, 0x5a, 0x3a, 0x02, 0xd7, 0x28, 0x05, 0xda, 0xc9, 0x0d, 0x0a, 0x01, 0x14, 0x01, 0x6a, 0x96, 0x50, 0x82, 0x50, 0xc6, 0x1a, 0x11, 0x2c, 0x11, 0x1a, 0xc6, 0x50, 0x82, 0x50, 0x96, 0x01, 0x60, 0x01, 0x1e, 0x0b, 0x0c, 0xc9, 0xda, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x76, 0x00, 0xdc, 0x05, 0x92, 0x04, 0xf9, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x22, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x00, 0x09, 0x01, 0x21, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x01, 0x11, 0x01, 0x16, 0x15, 0x14, 0x05, 0x01, 0x21, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x01, 0x11, 0x01, 0x26, 0x35, 0x34, 0x01, 0x11, 0x21, 0x11, 0x03, 0x91, 0x01, 0x8c, 0xfb, 0xcf, 0x01, 0x8c, 0x06, 0x07, 0x1a, 0x21, 0x1f, 0x4a, 0x20, 0x26, 0x14, 0x07, 0x2b, 0x01, 0x83, 0xfe, 0x7d, 0x02, 0xfe, 0xc3, 0xfe, 0x72, 0x04, 0x31, 0xfe, 0x72, 0x06, 0x06, 0x1a, 0x20, 0x20, 0x4a, 0x1f, 0x21, 0x1a, 0x06, 0x2c, 0xfe, 0x7e, 0x01, 0x82, 0x03, 0xfe, 0x27, 0x05, 0x1b, 0x03, 0x68, 0x01, 0x2c, 0xfe, 0xd4, 0x09, 0x08, 0x1c, 0x10, 0x0f, 0x0f, 0x13, 0x19, 0x09, 0xaa, 0xfe, 0xde, 0x02, 0x8d, 0xfe, 0xdd, 0x11, 0x12, 0x13, 0x6b, 0xfe, 0xd3, 0x01, 0x2d, 0x08, 0x07, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x07, 0xaa, 0x01, 0x22, 0xfd, 0x73, 0x01, 0x21, 0x13, 0x13, 0x12, 0xfd, 0xdf, 0x04, 0x1d, 0xfb, 0xe3, 0x00, 0x00, 0x04, 0x01, 0x87, 0x00, 0x00, 0x04, 0x0a, 0x05, 0xef, 0x00, 0x50, 0x00, 0xd0, 0x00, 0xe3, 0x00, 0xf3, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x36, 0x37, 0x36, 0x33, 0x17, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x03, 0x14, 0x15, 0x14, 0x1f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x17, 0x16, 0x07, 0x06, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x27, 0x26, 0x01, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x14, 0x0f, 0x01, 0x06, 0x0f, 0x01, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x02, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x26, 0x27, 0x26, 0x27, 0x26, 0x3f, 0x01, 0x36, 0x27, 0x26, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x15, 0x07, 0x21, 0x27, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x27, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x35, 0x13, 0x34, 0x35, 0x34, 0x27, 0x01, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x01, 0x88, 0x21, 0x15, 0x0f, 0x2f, 0x0c, 0x29, 0x01, 0x02, 0x04, 0x18, 0x24, 0x1b, 0x12, 0x1f, 0x15, 0x18, 0x20, 0x0f, 0x10, 0x2b, 0x0f, 0x43, 0x44, 0x22, 0x0d, 0x0d, 0x10, 0x06, 0x05, 0x09, 0x04, 0x0b, 0x05, 0x01, 0x01, 0x1c, 0x18, 0x25, 0x32, 0x1a, 0x0b, 0x01, 0x09, 0x01, 0x08, 0x02, 0x02, 0x03, 0x01, 0x03, 0x01, 0x14, 0x02, 0xfe, 0x15, 0x04, 0x09, 0x21, 0x2b, 0x18, 0x10, 0x02, 0x46, 0x03, 0x23, 0x20, 0x03, 0x05, 0x0a, 0x1f, 0x05, 0x13, 0x31, 0x16, 0x08, 0x27, 0x0f, 0x29, 0x44, 0x18, 0x12, 0x0f, 0x0d, 0x0f, 0x07, 0x07, 0x1b, 0x0b, 0x11, 0x56, 0x7a, 0x56, 0x54, 0x04, 0x12, 0x05, 0x03, 0x14, 0x10, 0x05, 0x03, 0x2b, 0x67, 0x2f, 0x06, 0x26, 0x1b, 0x11, 0x0b, 0x06, 0x05, 0x02, 0x07, 0x2c, 0x24, 0x0c, 0x07, 0x29, 0x2d, 0x01, 0x13, 0x0d, 0x01, 0x30, 0x15, 0x16, 0x30, 0x09, 0x02, 0x19, 0x70, 0x2a, 0x05, 0x07, 0x0c, 0x02, 0x06, 0x02, 0x07, 0x06, 0x0d, 0x1a, 0x24, 0x0c, 0x0e, 0x15, 0x10, 0x2c, 0x08, 0x03, 0x01, 0x09, 0x07, 0x03, 0x09, 0x53, 0x01, 0x01, 0x01, 0x80, 0x01, 0x0b, 0x0c, 0x02, 0x03, 0x08, 0x05, 0x0b, 0x02, 0xfe, 0x32, 0x10, 0x20, 0x34, 0x32, 0x0f, 0x03, 0x01, 0x10, 0x09, 0x0a, 0x03, 0x02, 0x0b, 0x04, 0x06, 0x61, 0x73, 0x0e, 0x02, 0x4a, 0x23, 0x0d, 0x0a, 0x0e, 0x08, 0x03, 0x0b, 0x07, 0x0a, 0x6c, 0x02, 0xeb, 0x37, 0x31, 0x07, 0x1f, 0x5d, 0x18, 0x17, 0x01, 0x01, 0x2f, 0x7e, 0x5b, 0x23, 0x3c, 0x24, 0x1c, 0x1b, 0x20, 0x05, 0x0c, 0x1a, 0x6f, 0xbb, 0x5f, 0x25, 0x15, 0x10, 0x40, 0x2c, 0x1f, 0x10, 0x86, 0x3a, 0x06, 0x0b, 0x0a, 0x06, 0x06, 0x24, 0x22, 0x1e, 0x3b, 0x1a, 0x12, 0x76, 0x52, 0x15, 0x12, 0xfe, 0xd4, 0x07, 0x09, 0x18, 0x1d, 0x16, 0x24, 0x58, 0x24, 0x2b, 0x7c, 0x19, 0x89, 0x13, 0x8d, 0x89, 0xb6, 0x12, 0x21, 0x35, 0x44, 0x58, 0x26, 0x50, 0x59, 0x3b, 0x02, 0xb6, 0x39, 0x44, 0x6f, 0x1e, 0x36, 0xc2, 0x1d, 0x06, 0x0f, 0x0b, 0x0d, 0x62, 0x27, 0x6e, 0x95, 0x32, 0x0f, 0x0c, 0x0b, 0x06, 0x0b, 0x1f, 0x38, 0x1a, 0x33, 0xfe, 0x65, 0x46, 0x5d, 0x0c, 0x08, 0x13, 0x04, 0x01, 0x14, 0x06, 0x07, 0x34, 0x54, 0x26, 0x03, 0x1f, 0x16, 0x0a, 0x07, 0x0c, 0x16, 0x26, 0x20, 0x12, 0x0c, 0x2f, 0x35, 0x30, 0x24, 0x3f, 0x2d, 0x20, 0x02, 0x31, 0x40, 0x1b, 0x11, 0x26, 0x11, 0x06, 0x05, 0x10, 0x09, 0x33, 0x6c, 0x0f, 0x0a, 0x17, 0x17, 0x4b, 0x0f, 0x0b, 0x0a, 0x05, 0x19, 0x03, 0x05, 0x0d, 0x43, 0x04, 0x22, 0x50, 0x31, 0x16, 0xd6, 0x09, 0x0b, 0x9f, 0xb7, 0x3a, 0x30, 0x33, 0x3c, 0x08, 0x44, 0x3a, 0x35, 0x58, 0x49, 0x2e, 0x29, 0x06, 0x07, 0x01, 0x44, 0x04, 0x07, 0x13, 0x26, 0xfe, 0x5b, 0x14, 0x2b, 0x2d, 0x31, 0x3a, 0x0d, 0x0c, 0x11, 0x10, 0x09, 0x09, 0x15, 0x17, 0x09, 0x05, 0x71, 0x12, 0x14, 0x2f, 0x41, 0x38, 0x09, 0x12, 0x0a, 0x0a, 0x12, 0x11, 0x0b, 0x06, 0x67, 0x00, 0x08, 0x00, 0x26, 0x00, 0xa9, 0x05, 0xc6, 0x05, 0x6c, 0x00, 0x06, 0x00, 0x39, 0x00, 0x4c, 0x00, 0x70, 0x00, 0x7b, 0x00, 0x7f, 0x00, 0x89, 0x00, 0x8d, 0x00, 0x00, 0x13, 0x16, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x0f, 0x01, 0x13, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x07, 0x17, 0x16, 0x33, 0x32, 0x37, 0x33, 0x16, 0x15, 0x14, 0x07, 0x23, 0x35, 0x06, 0x25, 0x36, 0x37, 0x36, 0x37, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x36, 0x01, 0x22, 0x2f, 0x01, 0x07, 0x14, 0x07, 0x36, 0x37, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x07, 0x16, 0x15, 0x14, 0x07, 0x32, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x06, 0x37, 0x16, 0x15, 0x14, 0x07, 0x15, 0x33, 0x36, 0x35, 0x34, 0x27, 0x05, 0x36, 0x37, 0x0f, 0x01, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x36, 0x35, 0x34, 0x05, 0x07, 0x37, 0x26, 0xc2, 0x19, 0x12, 0x0d, 0x0e, 0x03, 0x18, 0x2a, 0x62, 0x2b, 0x1a, 0x22, 0x87, 0x43, 0x1d, 0x5a, 0x4a, 0x22, 0x50, 0xed, 0x74, 0x06, 0x0d, 0x3e, 0x19, 0x17, 0x54, 0x6e, 0x3a, 0x3c, 0x1f, 0x20, 0x2f, 0x38, 0x89, 0x29, 0x35, 0x21, 0x1b, 0x0c, 0xab, 0xb8, 0x27, 0x24, 0x31, 0x05, 0xcb, 0x50, 0x38, 0xdf, 0x62, 0xfd, 0x0f, 0x1e, 0x1b, 0x07, 0x05, 0x01, 0x2c, 0x20, 0x0f, 0x1c, 0x50, 0xd4, 0x30, 0x1f, 0x12, 0x2a, 0x27, 0x24, 0x03, 0x4d, 0x2f, 0x17, 0xd9, 0x68, 0x4b, 0x39, 0x4f, 0x0e, 0x21, 0x4c, 0x74, 0x38, 0x16, 0x1f, 0x12, 0x67, 0x43, 0x39, 0x43, 0x24, 0x57, 0x29, 0x2a, 0x2f, 0x7c, 0x26, 0x2d, 0x16, 0x43, 0x2d, 0x29, 0x8e, 0x2b, 0x38, 0xfd, 0x05, 0x4b, 0x0c, 0x92, 0x51, 0x65, 0x2b, 0x1c, 0x27, 0x15, 0xfe, 0xc3, 0x2c, 0x54, 0x06, 0x01, 0xf0, 0x03, 0x27, 0x1f, 0x1f, 0x20, 0x10, 0xfe, 0xc7, 0x0e, 0x05, 0x10, 0x08, 0x3b, 0x63, 0x73, 0x01, 0x0c, 0x12, 0x20, 0x1a, 0x2f, 0xe8, 0x5e, 0x22, 0x7c, 0x59, 0x2f, 0x1a, 0x0d, 0x34, 0xab, 0x32, 0x38, 0x19, 0x1d, 0xdb, 0x87, 0x1d, 0x1e, 0x83, 0xb4, 0xcf, 0x95, 0x6c, 0x25, 0xe9, 0x25, 0x6f, 0x1d, 0x0f, 0x01, 0x74, 0x1e, 0x0e, 0xe9, 0x35, 0x6f, 0x41, 0x3d, 0x27, 0x59, 0x24, 0x09, 0x01, 0x61, 0x10, 0x9d, 0x85, 0xa3, 0x54, 0x02, 0x2a, 0x0d, 0x16, 0x12, 0x10, 0x27, 0x01, 0x27, 0x47, 0x2b, 0x2d, 0x0d, 0x0b, 0x0c, 0x06, 0x25, 0x5f, 0x6b, 0x6a, 0x7e, 0x07, 0x1d, 0x72, 0x8d, 0x7d, 0x6a, 0x4c, 0x60, 0xd0, 0x86, 0x7c, 0xef, 0x5c, 0x67, 0xc3, 0x4b, 0x1a, 0x40, 0x2f, 0x1e, 0x14, 0x03, 0x2e, 0x38, 0x35, 0x96, 0x63, 0x28, 0x24, 0x00, 0x00, 0x00, 0x07, 0x00, 0xa3, 0x00, 0x9a, 0x05, 0x37, 0x05, 0xaf, 0x00, 0x13, 0x00, 0x19, 0x00, 0x20, 0x00, 0x28, 0x00, 0x32, 0x00, 0x4c, 0x00, 0x53, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x2f, 0x01, 0x06, 0x23, 0x14, 0x07, 0x06, 0x23, 0x14, 0x07, 0x17, 0x16, 0x33, 0x32, 0x36, 0x01, 0x3f, 0x01, 0x0f, 0x02, 0x13, 0x37, 0x01, 0x13, 0x25, 0x01, 0x13, 0x05, 0x01, 0x33, 0x32, 0x35, 0x34, 0x27, 0x01, 0x00, 0x36, 0x35, 0x34, 0x27, 0x01, 0x07, 0x01, 0x16, 0x33, 0x01, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x3e, 0x01, 0x17, 0x07, 0x01, 0x16, 0x33, 0x32, 0x27, 0x04, 0xa1, 0x07, 0x0b, 0x01, 0x36, 0x14, 0x1b, 0x31, 0x30, 0x42, 0x14, 0xd5, 0x07, 0x07, 0x09, 0x17, 0xfc, 0xda, 0x89, 0x0c, 0x83, 0x8a, 0x0c, 0x76, 0xef, 0x02, 0x3d, 0xa6, 0xfd, 0xa9, 0xfd, 0xc4, 0x0f, 0x01, 0x91, 0x01, 0xd8, 0x02, 0x39, 0x02, 0xfd, 0xfb, 0x01, 0x7a, 0x31, 0x06, 0xfe, 0x2f, 0x66, 0x01, 0xd2, 0x0f, 0x0d, 0xfd, 0xb0, 0x0c, 0x1c, 0x0e, 0x0c, 0x09, 0x0d, 0x0f, 0x05, 0x05, 0x11, 0x0d, 0x0c, 0x1a, 0x10, 0x0c, 0x08, 0x0d, 0x0e, 0x03, 0x05, 0x12, 0x28, 0x72, 0x02, 0x04, 0x0a, 0x09, 0x34, 0x01, 0x01, 0x40, 0x08, 0x1c, 0x0a, 0x05, 0x08, 0xee, 0x17, 0x48, 0x36, 0x37, 0x1c, 0x18, 0x3b, 0x02, 0x0b, 0x02, 0xf9, 0x98, 0x92, 0x0d, 0x98, 0x92, 0x01, 0x7a, 0x12, 0xfd, 0x83, 0xfd, 0x68, 0xb8, 0x02, 0x7c, 0x01, 0x09, 0x14, 0xfd, 0xf3, 0x38, 0x0a, 0x0c, 0x02, 0x3e, 0xfc, 0xb6, 0x36, 0x21, 0x0f, 0x11, 0x02, 0x06, 0x71, 0xfd, 0xfa, 0x06, 0x02, 0xea, 0x0d, 0x15, 0x05, 0x04, 0x11, 0x0d, 0x0a, 0x0e, 0x10, 0x1f, 0x0d, 0x0e, 0x14, 0x05, 0x04, 0x0e, 0x10, 0x0b, 0x0d, 0x10, 0x1e, 0xf4, 0x0e, 0xfd, 0xc2, 0x02, 0x42, 0x00, 0x00, 0x07, 0x00, 0x2f, 0x01, 0x96, 0x05, 0xe7, 0x04, 0x3e, 0x00, 0x11, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x3f, 0x00, 0x46, 0x00, 0x00, 0x00, 0x34, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x14, 0x07, 0x16, 0x14, 0x07, 0x16, 0x15, 0x37, 0x36, 0x37, 0x36, 0x05, 0x35, 0x27, 0x07, 0x15, 0x17, 0x03, 0x37, 0x21, 0x09, 0x01, 0x21, 0x27, 0x01, 0x21, 0x36, 0x35, 0x34, 0x27, 0x21, 0x00, 0x34, 0x27, 0x21, 0x15, 0x21, 0x24, 0x34, 0x36, 0x37, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x17, 0x07, 0x21, 0x36, 0x35, 0x34, 0x27, 0x05, 0x13, 0x07, 0x06, 0x04, 0x09, 0xbd, 0x13, 0x2e, 0x2e, 0x13, 0xbd, 0x09, 0x04, 0x06, 0xfc, 0x16, 0x55, 0x54, 0x54, 0x9d, 0x9d, 0x02, 0xfd, 0x02, 0x1c, 0xfd, 0xe4, 0xfd, 0x03, 0x9d, 0x01, 0x28, 0x02, 0x6f, 0x16, 0x1f, 0xfd, 0x52, 0x02, 0xf6, 0x2d, 0xfd, 0x9a, 0x02, 0x66, 0xfc, 0xc7, 0x06, 0x08, 0x06, 0x10, 0x12, 0x10, 0x07, 0x07, 0x06, 0x06, 0x07, 0x07, 0x10, 0x12, 0x10, 0x06, 0x08, 0xb2, 0x48, 0x02, 0xae, 0x1f, 0x16, 0x02, 0xde, 0x18, 0x15, 0x09, 0x07, 0x06, 0x7e, 0x21, 0x14, 0x38, 0x90, 0x38, 0x14, 0x21, 0x7e, 0x06, 0x07, 0x09, 0x4b, 0xd8, 0x70, 0x70, 0xd8, 0x70, 0x01, 0x68, 0xc8, 0xfe, 0xac, 0xfe, 0xac, 0xc8, 0x01, 0x2c, 0x19, 0x17, 0x1b, 0x19, 0xfe, 0xc4, 0x70, 0x18, 0xa0, 0x3c, 0x28, 0x23, 0x0f, 0x0e, 0x10, 0x10, 0x0e, 0x0f, 0x23, 0x28, 0x23, 0x0f, 0x0e, 0x10, 0x10, 0x0e, 0x0f, 0x69, 0x64, 0x19, 0x1b, 0x17, 0x19, 0x00, 0x07, 0x00, 0xa3, 0x00, 0x9a, 0x05, 0x37, 0x05, 0xaf, 0x00, 0x13, 0x00, 0x19, 0x00, 0x20, 0x00, 0x28, 0x00, 0x32, 0x00, 0x4c, 0x00, 0x53, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x0f, 0x01, 0x16, 0x15, 0x32, 0x17, 0x16, 0x15, 0x32, 0x17, 0x37, 0x36, 0x35, 0x34, 0x26, 0x01, 0x27, 0x1f, 0x02, 0x27, 0x07, 0x27, 0x03, 0x01, 0x25, 0x03, 0x01, 0x27, 0x17, 0x01, 0x36, 0x35, 0x34, 0x2b, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x01, 0x17, 0x01, 0x36, 0x35, 0x01, 0x2e, 0x01, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x13, 0x01, 0x36, 0x23, 0x22, 0x07, 0x01, 0x04, 0xa1, 0x08, 0x17, 0x09, 0x07, 0x07, 0xd5, 0x14, 0x42, 0x30, 0x31, 0x1b, 0x14, 0x36, 0x01, 0x0b, 0xfc, 0xcb, 0x84, 0x0c, 0x8a, 0x83, 0x0c, 0x97, 0xb2, 0x0f, 0x02, 0x3c, 0x02, 0x57, 0xa6, 0xfd, 0xc3, 0x10, 0x0c, 0x02, 0x05, 0x02, 0x39, 0x02, 0x21, 0x31, 0x1e, 0x0d, 0x0f, 0xfe, 0x2e, 0x66, 0x01, 0xd1, 0x06, 0xfd, 0x61, 0x0c, 0x12, 0x05, 0x03, 0x0e, 0x0d, 0x08, 0x0c, 0x10, 0x1a, 0x0c, 0x0d, 0x11, 0x05, 0x05, 0x0f, 0x0d, 0x09, 0x0c, 0x0e, 0x1c, 0x10, 0x01, 0xd8, 0x01, 0x34, 0x09, 0x0a, 0xfd, 0xfc, 0x05, 0x09, 0x09, 0x0b, 0x02, 0x3b, 0x18, 0x1c, 0x37, 0x36, 0x48, 0x17, 0xee, 0x08, 0x05, 0x0a, 0x1c, 0xfd, 0x18, 0x0d, 0x92, 0x98, 0x0d, 0x92, 0xd5, 0xc6, 0x01, 0x09, 0x02, 0x7c, 0xb8, 0xfd, 0x68, 0xfd, 0x83, 0xec, 0x7f, 0x02, 0x3e, 0x0c, 0x0a, 0x38, 0x88, 0x36, 0x06, 0xfd, 0xfa, 0x71, 0x02, 0x06, 0x11, 0x0f, 0xfd, 0x6d, 0x0e, 0x1e, 0x10, 0x0d, 0x0b, 0x10, 0x0e, 0x04, 0x05, 0x14, 0x0e, 0x0d, 0x1f, 0x10, 0x0e, 0x0a, 0x0d, 0x11, 0x04, 0x05, 0x15, 0x01, 0x0f, 0x02, 0x0c, 0x42, 0x02, 0xfd, 0xc2, 0x00, 0x02, 0x00, 0x4f, 0x01, 0x7b, 0x05, 0x73, 0x04, 0x5b, 0x00, 0x25, 0x00, 0x47, 0x00, 0x00, 0x12, 0x10, 0x27, 0x32, 0x33, 0x20, 0x25, 0x01, 0x15, 0x25, 0x2e, 0x01, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x25, 0x15, 0x01, 0x24, 0x21, 0x22, 0x23, 0x12, 0x14, 0x07, 0x32, 0x33, 0x32, 0x05, 0x25, 0x05, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x05, 0x25, 0x04, 0x23, 0x22, 0x23, 0x7c, 0x2d, 0x07, 0x07, 0x01, 0x07, 0x01, 0xe2, 0x02, 0x2d, 0xfd, 0xf9, 0x05, 0x0c, 0x11, 0x0b, 0x1b, 0x0c, 0x0d, 0x09, 0x0a, 0x0a, 0x0c, 0x08, 0x09, 0x0d, 0x0c, 0x1b, 0x0b, 0x11, 0x0c, 0x05, 0x02, 0x07, 0xfd, 0xd3, 0xfe, 0x1e, 0xfe, 0xf9, 0x07, 0x07, 0x8a, 0x15, 0x04, 0x04, 0xa0, 0x01, 0xda, 0x01, 0x8b, 0xfe, 0xc0, 0x14, 0x19, 0x17, 0x38, 0x17, 0x18, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x18, 0x17, 0x38, 0x17, 0x19, 0x14, 0x01, 0x40, 0xfe, 0x75, 0xfe, 0x26, 0xa0, 0x04, 0x04, 0x02, 0x49, 0x01, 0x44, 0x60, 0x6e, 0xfe, 0xed, 0x53, 0x1c, 0x08, 0x10, 0x08, 0x06, 0x06, 0x06, 0x0a, 0x09, 0x1d, 0x20, 0x1f, 0x07, 0x0a, 0x06, 0x06, 0x06, 0x08, 0x10, 0x08, 0x1c, 0x53, 0xfe, 0xed, 0x6e, 0x01, 0x47, 0x8a, 0x59, 0x6e, 0xb9, 0x18, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x17, 0x35, 0x3e, 0x35, 0x17, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x18, 0xb9, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7c, 0x01, 0xad, 0x05, 0x73, 0x04, 0x29, 0x00, 0x28, 0x00, 0x00, 0x01, 0x25, 0x15, 0x01, 0x24, 0x23, 0x22, 0x23, 0x36, 0x34, 0x27, 0x32, 0x33, 0x32, 0x25, 0x01, 0x15, 0x25, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x03, 0x84, 0x01, 0xef, 0xfd, 0xd3, 0xfe, 0x21, 0xdf, 0x06, 0x06, 0x2d, 0x2d, 0x06, 0x06, 0xdf, 0x01, 0xdf, 0x02, 0x2d, 0xfe, 0x11, 0x06, 0x0e, 0x0c, 0x11, 0x0f, 0x26, 0x0f, 0x10, 0x0d, 0x0d, 0x0e, 0x0e, 0x0d, 0x0d, 0x10, 0x0f, 0x26, 0x0f, 0x11, 0x0c, 0x0e, 0x02, 0xc5, 0x1c, 0x21, 0xfe, 0xed, 0x6e, 0x60, 0xe0, 0x60, 0x6e, 0xfe, 0xed, 0x21, 0x1d, 0x11, 0x0f, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x0e, 0x0f, 0x23, 0x15, 0x14, 0x23, 0x0f, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x01, 0x14, 0x00, 0xc6, 0x04, 0xcf, 0x05, 0x0a, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x12, 0x13, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x00, 0x01, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x01, 0x98, 0x23, 0x12, 0x24, 0x0f, 0x0c, 0x0c, 0xfd, 0xd7, 0x38, 0x7a, 0x1c, 0x14, 0x1d, 0xfe, 0xa4, 0xfe, 0xd7, 0x14, 0x40, 0x41, 0x0c, 0x1f, 0x29, 0x2f, 0x3f, 0x27, 0x02, 0x8e, 0x40, 0x78, 0x14, 0x01, 0xc2, 0x01, 0x16, 0x48, 0x0c, 0x09, 0x0e, 0x29, 0xfe, 0x30, 0xfd, 0xfc, 0x24, 0x06, 0x0f, 0x8a, 0x99, 0x27, 0x2a, 0x27, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0xd5, 0x00, 0xb2, 0x05, 0x32, 0x05, 0x0c, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x33, 0x32, 0x37, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x00, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x01, 0x98, 0x23, 0x12, 0x24, 0x0f, 0x0c, 0x0c, 0xfd, 0xd7, 0x5b, 0x57, 0x72, 0x17, 0x0a, 0x14, 0xfd, 0xbd, 0x6f, 0x26, 0x88, 0x2d, 0x32, 0x15, 0x33, 0x41, 0x3f, 0x57, 0x2b, 0x03, 0x1a, 0x40, 0x78, 0x14, 0x01, 0x9d, 0xaf, 0x4a, 0x08, 0x03, 0x16, 0x12, 0x1b, 0xfd, 0x1e, 0xde, 0x4c, 0x1a, 0x0c, 0x8d, 0xb2, 0x86, 0x31, 0x20, 0x2c, 0x00, 0x01, 0x00, 0xe9, 0x00, 0x94, 0x05, 0x20, 0x05, 0x41, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x07, 0x09, 0x01, 0x27, 0x09, 0x01, 0x37, 0x09, 0x01, 0x17, 0x03, 0x83, 0x01, 0x9b, 0x7f, 0xfe, 0x65, 0xfe, 0x65, 0x80, 0x01, 0x9b, 0xfe, 0x65, 0x80, 0x01, 0x9b, 0x01, 0x9c, 0x7f, 0x02, 0xea, 0xfe, 0x37, 0x8d, 0x01, 0xc9, 0xfe, 0x37, 0x8d, 0x01, 0xc9, 0x01, 0xc9, 0x8d, 0xfe, 0x38, 0x01, 0xc9, 0x8d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x9d, 0x00, 0x3f, 0x05, 0x6b, 0x05, 0x96, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x0b, 0x04, 0x1c, 0x01, 0x4f, 0xfe, 0xe8, 0xfe, 0xb1, 0xfe, 0xb1, 0xfe, 0xe9, 0x01, 0x4e, 0xfe, 0xb2, 0x01, 0x17, 0x01, 0x4f, 0x01, 0x4f, 0x01, 0x18, 0x02, 0xea, 0xfe, 0x8c, 0xfe, 0xc9, 0x01, 0x74, 0xfe, 0x8c, 0x01, 0x37, 0x01, 0x74, 0x01, 0x74, 0x01, 0x37, 0xfe, 0x8c, 0x01, 0x75, 0xfe, 0xc9, 0x00, 0x01, 0x00, 0xd8, 0xff, 0xee, 0x05, 0x0d, 0x05, 0xdc, 0x00, 0x42, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x03, 0x16, 0x17, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x03, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x12, 0x13, 0x02, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x04, 0x79, 0x09, 0x0e, 0x10, 0x10, 0x1a, 0x0f, 0x0e, 0x17, 0x0e, 0x13, 0xbc, 0xb0, 0x49, 0x81, 0x0a, 0x1b, 0x1c, 0x03, 0x14, 0x17, 0x0b, 0x17, 0x12, 0x6c, 0x73, 0x9b, 0xc8, 0x1d, 0x44, 0x21, 0x03, 0x2e, 0x0a, 0x04, 0x19, 0xb7, 0xcd, 0x6d, 0x24, 0x09, 0x11, 0x11, 0x0e, 0x0e, 0x14, 0x08, 0x0c, 0x10, 0x1a, 0x1c, 0x09, 0x31, 0x4f, 0x80, 0xb8, 0x15, 0x05, 0xdc, 0x10, 0x10, 0x1a, 0x33, 0x1b, 0x11, 0x15, 0x1b, 0x17, 0xe2, 0xfe, 0xf1, 0xc6, 0xef, 0x14, 0x0c, 0x17, 0x19, 0x16, 0x0c, 0x14, 0x1e, 0x10, 0x12, 0x1a, 0x9a, 0xd0, 0xe0, 0xfe, 0x8a, 0x36, 0x2a, 0x1c, 0x3d, 0x50, 0x1f, 0x0e, 0x2a, 0x01, 0x3e, 0x01, 0x0a, 0x01, 0x22, 0x9d, 0x23, 0x0a, 0x0e, 0x1a, 0x1a, 0x1d, 0x11, 0x0c, 0x10, 0x1e, 0xa8, 0x98, 0xb8, 0xcc, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe2, 0x00, 0x00, 0x05, 0x6e, 0x05, 0xea, 0x00, 0x52, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x36, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x03, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x02, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x26, 0x03, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x12, 0x37, 0x36, 0x04, 0xcc, 0x1a, 0x18, 0x12, 0x07, 0x18, 0x09, 0x1c, 0x0d, 0x0d, 0x0f, 0xd9, 0xd3, 0x85, 0x85, 0x0f, 0x1a, 0x12, 0x22, 0x02, 0x0c, 0x16, 0x1d, 0x20, 0x1b, 0x07, 0x0d, 0x20, 0x18, 0x15, 0x18, 0x50, 0x6d, 0xcf, 0x4f, 0x0f, 0x13, 0x02, 0x10, 0x0f, 0x0e, 0x02, 0x12, 0x10, 0x16, 0x1a, 0x21, 0x1b, 0x08, 0x08, 0x10, 0x15, 0x75, 0xb1, 0x6e, 0x59, 0x14, 0x15, 0x0e, 0x14, 0x17, 0x2c, 0x01, 0x09, 0x15, 0x0f, 0x27, 0x0c, 0x5f, 0x87, 0xd0, 0xe0, 0x0b, 0x05, 0xea, 0x1e, 0x16, 0x3a, 0x01, 0x05, 0x0c, 0x0e, 0x0d, 0x15, 0x28, 0x10, 0xdb, 0xfe, 0xc7, 0xcc, 0xa2, 0x12, 0x18, 0x31, 0x1a, 0x11, 0x02, 0x11, 0x23, 0x3a, 0x18, 0x12, 0x0b, 0x1b, 0x1c, 0x5f, 0xbf, 0xfe, 0xfb, 0x87, 0x1a, 0x24, 0x1f, 0x0d, 0x0c, 0x1e, 0x23, 0x11, 0x1b, 0x2d, 0x03, 0x0d, 0x18, 0x18, 0x15, 0x1f, 0xb0, 0xd4, 0xbd, 0x01, 0x0b, 0x3d, 0x1c, 0x1a, 0x31, 0x20, 0x27, 0x0e, 0x19, 0x32, 0x1a, 0xc4, 0xba, 0x01, 0x08, 0xda, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x03, 0xca, 0xfe, 0x74, 0xfe, 0x81, 0x01, 0x7f, 0x01, 0x8c, 0x01, 0x80, 0xfe, 0xc8, 0x01, 0x92, 0xfe, 0x6e, 0xfd, 0xe4, 0xfe, 0x6f, 0x01, 0x91, 0x02, 0x1c, 0xb4, 0x01, 0x92, 0xfe, 0x6e, 0xb4, 0xfe, 0x6f, 0x01, 0x91, 0xb4, 0x03, 0xc6, 0x01, 0xab, 0xfe, 0x55, 0xfe, 0x48, 0xfe, 0x56, 0x01, 0xaa, 0x01, 0xb8, 0x50, 0xfd, 0xa8, 0xfe, 0x42, 0x01, 0xbe, 0x02, 0x58, 0x01, 0xbf, 0xfd, 0x79, 0xc8, 0xfe, 0x42, 0x01, 0xbe, 0xc8, 0x01, 0xbf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x03, 0xb8, 0x01, 0xec, 0xfe, 0x14, 0xfe, 0x98, 0xfe, 0x15, 0x01, 0xeb, 0x01, 0x68, 0x03, 0xb2, 0xfe, 0x70, 0xfd, 0xde, 0x02, 0x22, 0x01, 0x90, 0x02, 0x23, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x33, 0x35, 0x23, 0x37, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x02, 0x99, 0xd6, 0xd6, 0xd7, 0x02, 0x34, 0xfd, 0xcc, 0xd8, 0xfd, 0xcd, 0x02, 0x33, 0xd8, 0x02, 0x73, 0xee, 0x01, 0xf0, 0xfd, 0x8e, 0x02, 0x72, 0xf0, 0x02, 0x73, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x25, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x02, 0x51, 0x01, 0x66, 0xfe, 0x9a, 0x01, 0x67, 0x01, 0xec, 0xfe, 0x14, 0xfe, 0x98, 0xfe, 0x15, 0x01, 0xeb, 0x01, 0x68, 0x02, 0x23, 0x01, 0x8e, 0x01, 0xfe, 0x70, 0xfd, 0xde, 0x02, 0x22, 0x01, 0x90, 0x02, 0x23, 0x00, 0x00, 0x01, 0x01, 0x30, 0x00, 0x00, 0x04, 0xd9, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x03, 0x70, 0x01, 0x68, 0xfe, 0x98, 0xd8, 0xfe, 0x98, 0x01, 0x68, 0xd8, 0x04, 0x45, 0xf0, 0xfc, 0xab, 0x03, 0x55, 0xf0, 0x01, 0x90, 0x00, 0x02, 0x00, 0xf1, 0x00, 0x00, 0x04, 0xe2, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x33, 0x17, 0x11, 0x21, 0x11, 0x21, 0x27, 0x11, 0x23, 0x27, 0x11, 0x21, 0x11, 0x21, 0x17, 0x07, 0x11, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x33, 0x11, 0x21, 0x35, 0x03, 0xd3, 0x87, 0x87, 0xfe, 0xf2, 0xfe, 0xb3, 0x87, 0x87, 0x87, 0x01, 0x0e, 0x01, 0x4d, 0x87, 0xb4, 0xc6, 0xfe, 0xf2, 0x01, 0x0e, 0xc6, 0x01, 0x0e, 0x04, 0xa9, 0x96, 0xfe, 0x8e, 0xfd, 0x5f, 0x96, 0x02, 0x0b, 0x96, 0x01, 0x72, 0x01, 0x2c, 0x96, 0xfa, 0x01, 0x2c, 0xfe, 0xd4, 0xdc, 0xfd, 0x5f, 0x02, 0xa1, 0xdc, 0x00, 0x03, 0x01, 0x1e, 0x00, 0x00, 0x04, 0xeb, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x27, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x03, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x03, 0xa6, 0xfe, 0xbc, 0xfc, 0xfc, 0x01, 0x44, 0xfc, 0xb4, 0xfc, 0xfc, 0xfe, 0x2c, 0xfc, 0xfc, 0x01, 0xd4, 0x90, 0xfc, 0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0x04, 0x6d, 0x01, 0x18, 0xfe, 0xe8, 0xfe, 0x84, 0xfd, 0x5f, 0x02, 0xa1, 0x01, 0x7c, 0x50, 0xfd, 0xe4, 0xfd, 0x5f, 0x02, 0xa1, 0x02, 0x1c, 0x01, 0x18, 0xfe, 0x48, 0xdc, 0xfd, 0x5f, 0x02, 0xa1, 0xdc, 0x01, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x4b, 0x00, 0x00, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x07, 0x11, 0x17, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x27, 0x21, 0x07, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x1d, 0x01, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x37, 0x11, 0x27, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x2b, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x17, 0x21, 0x37, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x02, 0xc1, 0x6f, 0x5a, 0xa1, 0x42, 0x3b, 0x28, 0x20, 0x2d, 0x16, 0x17, 0x20, 0x26, 0x3d, 0x3e, 0xa1, 0x5e, 0x6f, 0x45, 0x40, 0x3c, 0x55, 0x4a, 0x19, 0x48, 0x04, 0x09, 0x31, 0x30, 0x4a, 0x56, 0x3c, 0x42, 0x42, 0x6e, 0x5e, 0xa1, 0x3e, 0x3d, 0x26, 0x21, 0x2d, 0x17, 0x16, 0x21, 0x27, 0x3c, 0x3f, 0xa4, 0x5a, 0x6e, 0x44, 0x40, 0x3c, 0x56, 0x4a, 0x18, 0x49, 0xfb, 0xf7, 0x30, 0x31, 0x4a, 0x55, 0x3c, 0x42, 0x43, 0x02, 0xa0, 0x4b, 0x49, 0x42, 0x60, 0x4f, 0x1b, 0x54, 0x04, 0x7c, 0x38, 0x37, 0x4f, 0x5c, 0x46, 0x47, 0x4b, 0x7a, 0x64, 0xb6, 0x47, 0x42, 0x2b, 0x25, 0x32, 0x19, 0x19, 0x25, 0x2b, 0x42, 0x49, 0xb4, 0x64, 0x7a, 0x4b, 0x47, 0x46, 0x5c, 0x4f, 0x1b, 0x54, 0xfb, 0x84, 0x38, 0x37, 0x4f, 0x60, 0x42, 0x48, 0x4c, 0x7b, 0x64, 0xb6, 0x47, 0x42, 0x2b, 0x25, 0x32, 0x19, 0x19, 0x25, 0x2b, 0x42, 0x49, 0xb4, 0x64, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xa8, 0xff, 0xe5, 0x05, 0x61, 0x05, 0xf3, 0x00, 0x0b, 0x00, 0x11, 0x00, 0x14, 0x00, 0x17, 0x00, 0x1a, 0x00, 0x1d, 0x00, 0x20, 0x00, 0x23, 0x00, 0x00, 0x01, 0x13, 0x21, 0x03, 0x13, 0x21, 0x0b, 0x01, 0x21, 0x13, 0x03, 0x21, 0x17, 0x03, 0x13, 0x21, 0x13, 0x0b, 0x01, 0x07, 0x33, 0x1f, 0x01, 0x37, 0x03, 0x07, 0x33, 0x05, 0x23, 0x17, 0x03, 0x27, 0x07, 0x13, 0x37, 0x23, 0x03, 0x04, 0xca, 0x01, 0x92, 0xca, 0xca, 0xfe, 0x6e, 0xca, 0xc9, 0xfe, 0x6d, 0xca, 0xca, 0x01, 0x93, 0x34, 0x96, 0x96, 0x01, 0x2b, 0x95, 0x95, 0x96, 0x61, 0xc2, 0x9c, 0x62, 0x61, 0x61, 0x62, 0xc3, 0xfe, 0xa1, 0xc2, 0x61, 0xfd, 0x62, 0x61, 0x61, 0x62, 0xc3, 0x05, 0xf3, 0xfe, 0x7c, 0xfe, 0x7d, 0xfe, 0x7d, 0xfe, 0x7c, 0x01, 0x84, 0x01, 0x83, 0x01, 0x83, 0x64, 0xfe, 0xe1, 0xfe, 0xe0, 0x01, 0x20, 0x01, 0x1f, 0x01, 0x1f, 0xbb, 0x64, 0xbb, 0xbb, 0xfe, 0x7d, 0xbc, 0x63, 0xbc, 0x01, 0x1f, 0xbc, 0xbc, 0x01, 0x84, 0xbb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xe3, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x43, 0x00, 0x00, 0x01, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x1d, 0x01, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x2b, 0x01, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x02, 0xd7, 0x44, 0x28, 0x31, 0x32, 0x6c, 0x33, 0x30, 0x27, 0x45, 0x1d, 0xa7, 0x6e, 0x3f, 0x6a, 0x5a, 0x2c, 0x2b, 0x2b, 0x2c, 0x5a, 0x6a, 0x3f, 0x6e, 0xa7, 0x1d, 0x45, 0x27, 0x30, 0x33, 0x6c, 0x32, 0x31, 0x28, 0x44, 0x1d, 0xa7, 0x6e, 0x3f, 0x6a, 0x5a, 0x2b, 0x2b, 0x2b, 0x2b, 0x5a, 0x6a, 0x3f, 0x6e, 0xa7, 0x03, 0x1c, 0x20, 0xba, 0x7a, 0x46, 0x76, 0x64, 0x30, 0x30, 0x30, 0x30, 0x64, 0x76, 0x46, 0x7a, 0xba, 0x20, 0x4c, 0x2c, 0x36, 0x38, 0x78, 0x38, 0x36, 0x2c, 0x4c, 0x20, 0xbb, 0x79, 0x46, 0x76, 0x64, 0x30, 0x31, 0x31, 0x30, 0x64, 0x76, 0x46, 0x79, 0xbb, 0x20, 0x4c, 0x2c, 0x36, 0x38, 0x78, 0x38, 0x36, 0x2c, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4d, 0xff, 0xe7, 0x05, 0xbb, 0x05, 0xf0, 0x00, 0x83, 0x00, 0x00, 0x01, 0x26, 0x27, 0x23, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x36, 0x37, 0x36, 0x37, 0x35, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x15, 0x16, 0x17, 0x16, 0x17, 0x33, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x23, 0x06, 0x07, 0x06, 0x07, 0x15, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x26, 0x02, 0xb5, 0x0e, 0x09, 0xbf, 0x02, 0x09, 0x12, 0x1a, 0x1d, 0x4a, 0x29, 0x29, 0x49, 0x1d, 0x1c, 0x10, 0x10, 0x10, 0x10, 0x1c, 0x1d, 0x49, 0x29, 0x29, 0x4a, 0x1d, 0x1e, 0x0e, 0x08, 0x03, 0xbf, 0x09, 0x0e, 0x0f, 0x13, 0x0e, 0x12, 0x26, 0x1b, 0x1e, 0x1e, 0x1e, 0x1e, 0x1d, 0x24, 0x24, 0x53, 0x24, 0x24, 0x1c, 0x1e, 0x1f, 0x1f, 0x1e, 0x1f, 0x21, 0x15, 0x0c, 0x13, 0x0f, 0x0f, 0x09, 0xbf, 0x02, 0x08, 0x0e, 0x1e, 0x1d, 0x4a, 0x29, 0x29, 0x4a, 0x1d, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1d, 0x4a, 0x29, 0x29, 0x4a, 0x1d, 0x1a, 0x12, 0x09, 0x01, 0xbf, 0x09, 0x0f, 0x0f, 0x13, 0x0c, 0x15, 0x21, 0x1f, 0x1e, 0x1f, 0x1f, 0x1e, 0x1c, 0x24, 0x24, 0x53, 0x24, 0x24, 0x1d, 0x1e, 0x1e, 0x1e, 0x1e, 0x1b, 0x26, 0x12, 0x0e, 0x13, 0x02, 0x93, 0x11, 0x15, 0x10, 0x14, 0x2a, 0x1e, 0x21, 0x22, 0x22, 0x21, 0x20, 0x28, 0x28, 0x5c, 0x28, 0x28, 0x20, 0x21, 0x22, 0x22, 0x21, 0x23, 0x25, 0x17, 0x0d, 0x15, 0x11, 0x10, 0x0a, 0xd5, 0x02, 0x0a, 0x14, 0x1d, 0x20, 0x52, 0x2e, 0x2d, 0x52, 0x20, 0x1f, 0x12, 0x11, 0x11, 0x12, 0x1f, 0x20, 0x52, 0x2d, 0x2e, 0x52, 0x20, 0x22, 0x0f, 0x09, 0x03, 0xd5, 0x0a, 0x10, 0x11, 0x15, 0x0d, 0x17, 0x25, 0x23, 0x21, 0x22, 0x22, 0x21, 0x20, 0x28, 0x28, 0x5c, 0x28, 0x28, 0x20, 0x21, 0x22, 0x22, 0x21, 0x1e, 0x2a, 0x14, 0x10, 0x15, 0x11, 0x10, 0x0a, 0xd4, 0x03, 0x09, 0x0f, 0x22, 0x20, 0x52, 0x2e, 0x2d, 0x52, 0x20, 0x1f, 0x12, 0x11, 0x11, 0x12, 0x1f, 0x20, 0x52, 0x2d, 0x2e, 0x52, 0x20, 0x1d, 0x14, 0x0a, 0x02, 0xd4, 0x0a, 0x00, 0x01, 0x00, 0x4a, 0xff, 0xe3, 0x05, 0xbe, 0x05, 0xf0, 0x00, 0x83, 0x00, 0x00, 0x01, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x02, 0xd7, 0x27, 0x21, 0x0c, 0x0f, 0x15, 0x09, 0x24, 0x24, 0x25, 0x23, 0x1c, 0x35, 0x29, 0x67, 0x2b, 0x30, 0x21, 0x22, 0x26, 0x26, 0x22, 0x09, 0x18, 0x07, 0x12, 0x25, 0x23, 0x3d, 0x5b, 0x1e, 0x0c, 0x0b, 0x10, 0x09, 0x23, 0x5a, 0x32, 0x34, 0x59, 0x22, 0x20, 0x16, 0x13, 0x13, 0x16, 0x20, 0x22, 0x59, 0x34, 0x32, 0x5a, 0x23, 0x09, 0x10, 0x0b, 0x0c, 0x25, 0x57, 0x3a, 0x2b, 0x1d, 0x0c, 0x0e, 0x17, 0x09, 0x23, 0x25, 0x26, 0x22, 0x21, 0x30, 0x2a, 0x67, 0x2a, 0x31, 0x20, 0x23, 0x25, 0x24, 0x24, 0x09, 0x16, 0x0f, 0x0b, 0x23, 0x25, 0x39, 0x59, 0x23, 0x0c, 0x0b, 0x10, 0x09, 0x22, 0x5a, 0x33, 0x34, 0x58, 0x23, 0x1d, 0x19, 0x13, 0x13, 0x16, 0x20, 0x23, 0x58, 0x34, 0x37, 0x56, 0x22, 0x09, 0x10, 0x05, 0x12, 0x24, 0x58, 0x03, 0x1c, 0x43, 0x63, 0x22, 0x0e, 0x0c, 0x12, 0x0a, 0x26, 0x64, 0x38, 0x3a, 0x62, 0x26, 0x20, 0x1c, 0x16, 0x16, 0x18, 0x24, 0x26, 0x62, 0x3a, 0x3d, 0x5f, 0x26, 0x0a, 0x12, 0x06, 0x14, 0x28, 0x61, 0x3f, 0x2f, 0x21, 0x0d, 0x10, 0x19, 0x0a, 0x27, 0x29, 0x2a, 0x26, 0x24, 0x36, 0x2f, 0x72, 0x2f, 0x36, 0x24, 0x26, 0x2a, 0x29, 0x27, 0x0a, 0x19, 0x10, 0x0d, 0x27, 0x29, 0x44, 0x65, 0x21, 0x0d, 0x0c, 0x12, 0x0a, 0x27, 0x64, 0x38, 0x3a, 0x62, 0x26, 0x24, 0x18, 0x15, 0x15, 0x18, 0x24, 0x26, 0x62, 0x3a, 0x38, 0x64, 0x27, 0x0a, 0x12, 0x0c, 0x0d, 0x29, 0x61, 0x40, 0x29, 0x27, 0x0e, 0x10, 0x18, 0x0a, 0x28, 0x28, 0x2a, 0x26, 0x20, 0x3a, 0x2e, 0x72, 0x30, 0x36, 0x24, 0x26, 0x2a, 0x2a, 0x26, 0x0a, 0x1a, 0x08, 0x14, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xe5, 0x05, 0xbd, 0x05, 0xf2, 0x01, 0x30, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x11, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x21, 0x11, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x11, 0x21, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x11, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x03, 0x04, 0x1b, 0x15, 0x18, 0x10, 0x12, 0x0a, 0x09, 0x09, 0x0a, 0x12, 0x0a, 0x12, 0x17, 0x19, 0x1b, 0x16, 0x17, 0x11, 0x12, 0x0a, 0x09, 0x09, 0x0a, 0x24, 0x16, 0x17, 0x1a, 0x1b, 0x15, 0x16, 0x12, 0x0d, 0x09, 0x01, 0x09, 0x0f, 0x0d, 0x11, 0x0a, 0x0a, 0x14, 0x11, 0x12, 0x17, 0x17, 0x19, 0x1a, 0x17, 0x17, 0x12, 0x11, 0x0a, 0x0a, 0x0a, 0x07, 0x08, 0x12, 0x16, 0x17, 0x19, 0x1d, 0x14, 0x17, 0x12, 0x11, 0x0b, 0x09, 0x09, 0x0b, 0x11, 0x14, 0x15, 0x17, 0x1a, 0x19, 0x17, 0x16, 0x12, 0x08, 0x07, 0x0a, 0x14, 0x11, 0x0f, 0x1a, 0x17, 0x1a, 0x16, 0x1a, 0x17, 0x12, 0x11, 0x0a, 0x0a, 0x0a, 0x0a, 0x11, 0x0d, 0x0f, 0xfe, 0xf8, 0x08, 0x0d, 0x0f, 0x1a, 0x15, 0x1b, 0x1a, 0x16, 0x17, 0x11, 0x12, 0x0a, 0x09, 0x09, 0x0a, 0x12, 0x10, 0x18, 0x15, 0x1b, 0x17, 0x19, 0x12, 0x0a, 0x11, 0x0a, 0x0a, 0x0a, 0x0a, 0x12, 0x10, 0x18, 0x15, 0x36, 0x15, 0x18, 0x10, 0x12, 0x0a, 0x0a, 0x0a, 0x0a, 0x11, 0x0a, 0x12, 0x15, 0x1a, 0x1c, 0x14, 0x18, 0x11, 0x12, 0x0a, 0x09, 0x09, 0x0a, 0x12, 0x11, 0x18, 0x15, 0x1b, 0x18, 0x2f, 0x12, 0x0c, 0x08, 0xfe, 0xf9, 0x0f, 0x0c, 0x13, 0x08, 0x0a, 0x0a, 0x09, 0x12, 0x14, 0x15, 0x17, 0x19, 0x1b, 0x16, 0x17, 0x12, 0x11, 0x0b, 0x08, 0x08, 0x08, 0x09, 0x14, 0x15, 0x17, 0x19, 0x1a, 0x17, 0x17, 0x12, 0x11, 0x0a, 0x09, 0x09, 0x0a, 0x11, 0x0f, 0x1a, 0x17, 0x1a, 0x19, 0x17, 0x17, 0x12, 0x09, 0x08, 0x08, 0x08, 0x0b, 0x11, 0x12, 0x17, 0x16, 0x1b, 0x19, 0x17, 0x17, 0x12, 0x12, 0x09, 0x0a, 0x0a, 0x0a, 0x11, 0x0c, 0x0f, 0x01, 0x07, 0x09, 0x0c, 0x12, 0x17, 0x15, 0x1a, 0x1b, 0x15, 0x18, 0x24, 0x09, 0x09, 0x09, 0x09, 0x12, 0x12, 0x18, 0x14, 0x1c, 0x1a, 0x15, 0x12, 0x0a, 0x12, 0x0a, 0x09, 0x09, 0x0a, 0x12, 0x11, 0x18, 0x14, 0x05, 0xf2, 0x0b, 0x0c, 0x12, 0x14, 0x1a, 0x19, 0x1d, 0x1c, 0x19, 0x1a, 0x14, 0x0a, 0x08, 0x0a, 0x0a, 0x0c, 0x12, 0x14, 0x1a, 0x19, 0x1d, 0x1f, 0x17, 0x19, 0x28, 0x0b, 0x0a, 0x0a, 0x0c, 0x13, 0x0d, 0x11, 0xfe, 0xdb, 0x0a, 0x0e, 0x14, 0x19, 0x17, 0x1e, 0x1d, 0x32, 0x14, 0x14, 0x0b, 0x0a, 0x0a, 0x0b, 0x14, 0x13, 0x1a, 0x18, 0x1e, 0x1c, 0x19, 0x14, 0x0b, 0x14, 0x0b, 0x0a, 0x0a, 0x0b, 0x14, 0x12, 0x1b, 0x18, 0x1d, 0x1e, 0x18, 0x1b, 0x12, 0x16, 0x09, 0x0a, 0x0a, 0x0b, 0x14, 0x0b, 0x14, 0x19, 0x1c, 0x1a, 0x36, 0x13, 0x11, 0x0d, 0x0b, 0x0b, 0x0a, 0x14, 0x14, 0x1a, 0x18, 0x1d, 0x1e, 0x17, 0x19, 0x14, 0x0e, 0x0a, 0xfe, 0xda, 0x12, 0x0d, 0x10, 0x0e, 0x0b, 0x0b, 0x0b, 0x13, 0x14, 0x1a, 0x19, 0x1c, 0x1d, 0x19, 0x1a, 0x14, 0x12, 0x0c, 0x0b, 0x0b, 0x08, 0x09, 0x13, 0x1a, 0x19, 0x1c, 0x1d, 0x1a, 0x19, 0x14, 0x13, 0x0c, 0x0a, 0x0a, 0x0c, 0x13, 0x14, 0x19, 0x1a, 0x1d, 0x1c, 0x19, 0x1a, 0x13, 0x09, 0x08, 0x0b, 0x0b, 0x0c, 0x12, 0x14, 0x1a, 0x19, 0x1d, 0x1c, 0x19, 0x1a, 0x14, 0x13, 0x0b, 0x0b, 0x16, 0x13, 0x0d, 0x12, 0x01, 0x25, 0x09, 0x0e, 0x17, 0x16, 0x18, 0x1e, 0x1c, 0x19, 0x1a, 0x13, 0x16, 0x09, 0x0a, 0x0a, 0x0b, 0x14, 0x12, 0x1b, 0x17, 0x1e, 0x1d, 0x19, 0x13, 0x0c, 0x16, 0x09, 0x0a, 0x0a, 0x0b, 0x14, 0x12, 0x1b, 0x17, 0x3c, 0x17, 0x1b, 0x13, 0x11, 0x0d, 0x0b, 0x0b, 0x0a, 0x14, 0x0b, 0x14, 0x18, 0x1d, 0x1e, 0x17, 0x1b, 0x12, 0x14, 0x0b, 0x0b, 0x0b, 0x0b, 0x14, 0x13, 0x1a, 0x18, 0x1d, 0x1e, 0x17, 0x1a, 0x13, 0x0e, 0x0a, 0x01, 0x25, 0x11, 0x0d, 0x13, 0x0c, 0x0a, 0x0a, 0x0b, 0x28, 0x19, 0x1a, 0x1c, 0x19, 0x1d, 0x1a, 0x14, 0x12, 0x0c, 0x0a, 0x0a, 0x08, 0x0a, 0x14, 0x1a, 0x19, 0x1c, 0x1d, 0x19, 0x1a, 0x14, 0x12, 0x0c, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4e, 0xff, 0xe3, 0x05, 0xbc, 0x05, 0xf5, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x32, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x33, 0x22, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x34, 0x02, 0x27, 0x26, 0x27, 0x26, 0x4e, 0x8c, 0x7f, 0x78, 0x68, 0x65, 0x67, 0x63, 0x69, 0x62, 0x7f, 0x7e, 0x8c, 0x8c, 0x7e, 0x7f, 0x62, 0x69, 0x63, 0x67, 0x65, 0x68, 0x78, 0x7f, 0x02, 0xec, 0x3b, 0x38, 0x72, 0x6f, 0x01, 0x14, 0xa1, 0x9d, 0xfe, 0xf0, 0x77, 0x6e, 0x3c, 0x3b, 0x3b, 0x3c, 0x6e, 0x77, 0xfe, 0xf0, 0x9d, 0xa1, 0x01, 0x14, 0x6f, 0x72, 0x38, 0x3b, 0x00, 0x02, 0x00, 0x4e, 0xff, 0xe3, 0x05, 0xbc, 0x05, 0xf5, 0x00, 0x1b, 0x00, 0x37, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x21, 0x32, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x33, 0x22, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x34, 0x02, 0x27, 0x26, 0x27, 0x26, 0x01, 0x41, 0x5b, 0x53, 0x4e, 0x43, 0x42, 0x43, 0x40, 0x45, 0x3f, 0x52, 0x52, 0x5c, 0x5c, 0x52, 0x52, 0x3f, 0x45, 0x40, 0x43, 0x42, 0x43, 0x4e, 0x53, 0xfe, 0xb2, 0x8c, 0x7f, 0x78, 0x68, 0x65, 0x67, 0x63, 0x69, 0x62, 0x7f, 0x7e, 0x8c, 0x8c, 0x7e, 0x7f, 0x62, 0x69, 0x63, 0x67, 0x65, 0x68, 0x78, 0x7f, 0x02, 0xec, 0x26, 0x25, 0x4a, 0x48, 0xb3, 0x69, 0x66, 0xb1, 0x4d, 0x48, 0x27, 0x26, 0x26, 0x27, 0x48, 0x4d, 0xb1, 0x66, 0x69, 0xb3, 0x48, 0x4a, 0x25, 0x26, 0x3b, 0x38, 0x72, 0x6f, 0x01, 0x14, 0xa1, 0x9d, 0xfe, 0xf0, 0x77, 0x6e, 0x3c, 0x3b, 0x3b, 0x3c, 0x6e, 0x77, 0xfe, 0xf0, 0x9d, 0xa1, 0x01, 0x14, 0x6f, 0x72, 0x38, 0x3b, 0x00, 0x02, 0x00, 0x2a, 0xff, 0xec, 0x05, 0xdf, 0x05, 0xf3, 0x00, 0x09, 0x00, 0x13, 0x00, 0x00, 0x13, 0x25, 0x09, 0x01, 0x05, 0x01, 0x13, 0x25, 0x05, 0x13, 0x01, 0x03, 0x21, 0x01, 0x03, 0x09, 0x01, 0x03, 0x01, 0x21, 0x2a, 0x01, 0xd9, 0x01, 0x01, 0x01, 0x02, 0x01, 0xd8, 0xfe, 0xc9, 0x21, 0xfe, 0x3c, 0xfe, 0x3c, 0x22, 0x01, 0xa2, 0xac, 0xfd, 0xd3, 0x01, 0xc2, 0xac, 0x01, 0xc3, 0x01, 0xc3, 0xac, 0x01, 0xc2, 0xfd, 0xd3, 0x03, 0xa5, 0x83, 0x01, 0xcb, 0xfe, 0x35, 0x83, 0xfe, 0x61, 0xfd, 0xe6, 0xca, 0xca, 0x02, 0x1a, 0x03, 0xec, 0xfd, 0xb3, 0xfe, 0x94, 0xfd, 0xb4, 0x01, 0x6c, 0xfe, 0x94, 0x02, 0x4c, 0x01, 0x6c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4d, 0xff, 0xe3, 0x05, 0xbb, 0x05, 0xf0, 0x00, 0x09, 0x00, 0x24, 0x00, 0x00, 0x01, 0x03, 0x21, 0x01, 0x03, 0x09, 0x01, 0x03, 0x01, 0x21, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x36, 0x03, 0x04, 0x9b, 0xfe, 0x0b, 0x01, 0x95, 0x9b, 0x01, 0x96, 0x01, 0x96, 0x9b, 0x01, 0x95, 0xfe, 0x0b, 0x9b, 0x8b, 0x80, 0x78, 0x68, 0x65, 0x67, 0x63, 0x69, 0x63, 0x7d, 0x7f, 0xfe, 0xea, 0x80, 0x79, 0x67, 0x65, 0x68, 0x63, 0x6a, 0x61, 0x7f, 0x7e, 0x05, 0xea, 0xfd, 0xee, 0xfe, 0xb8, 0xfd, 0xef, 0x01, 0x48, 0xfe, 0xb8, 0x02, 0x11, 0x01, 0x48, 0x02, 0x18, 0x3b, 0x38, 0x72, 0x6f, 0xfe, 0xec, 0xa1, 0x98, 0xfe, 0xf0, 0x77, 0x70, 0x3a, 0x3b, 0x3b, 0x38, 0x72, 0x6f, 0x01, 0x14, 0x9c, 0x9d, 0x01, 0x10, 0x77, 0x6e, 0x3c, 0x3b, 0x00, 0x02, 0x00, 0x2b, 0xff, 0xed, 0x05, 0xde, 0x05, 0xf2, 0x00, 0x1d, 0x00, 0x27, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x03, 0x13, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x01, 0x21, 0x03, 0x40, 0x78, 0x33, 0x34, 0x2b, 0x2b, 0x15, 0x15, 0x15, 0x15, 0x2b, 0x2b, 0x34, 0x33, 0x78, 0x34, 0x33, 0x2b, 0x2c, 0x14, 0x16, 0x16, 0x14, 0x2c, 0x2b, 0x33, 0x70, 0xac, 0x02, 0x2d, 0xfe, 0x3e, 0xac, 0xfe, 0x3d, 0xfe, 0x3d, 0xac, 0xfe, 0x3e, 0x02, 0x2d, 0x03, 0xe4, 0x18, 0x1a, 0x2d, 0x32, 0x38, 0x3b, 0x42, 0x41, 0x3b, 0x38, 0x32, 0x2d, 0x1a, 0x18, 0x18, 0x1a, 0x2d, 0x32, 0x38, 0x3b, 0x41, 0x42, 0x3b, 0x38, 0x32, 0x2d, 0x1a, 0x02, 0x26, 0xfd, 0xb3, 0xfe, 0x94, 0xfd, 0xb4, 0x01, 0x6b, 0xfe, 0x95, 0x02, 0x4c, 0x01, 0x6c, 0x00, 0x03, 0x00, 0x2a, 0xff, 0xec, 0x05, 0xdf, 0x05, 0xf3, 0x00, 0x09, 0x00, 0x27, 0x00, 0x31, 0x00, 0x00, 0x13, 0x25, 0x09, 0x01, 0x05, 0x01, 0x13, 0x25, 0x05, 0x13, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x13, 0x03, 0x21, 0x01, 0x03, 0x09, 0x01, 0x03, 0x01, 0x21, 0x2a, 0x01, 0xd9, 0x01, 0x01, 0x01, 0x02, 0x01, 0xd8, 0xfe, 0xc9, 0x21, 0xfe, 0x3c, 0xfe, 0x3c, 0x22, 0x01, 0x66, 0x78, 0x34, 0x33, 0x2b, 0x2c, 0x14, 0x16, 0x16, 0x14, 0x2c, 0x2b, 0x33, 0x34, 0x78, 0x33, 0x34, 0x2b, 0x2b, 0x15, 0x15, 0x15, 0x15, 0x2b, 0x2b, 0x34, 0x6f, 0xac, 0xfd, 0xd3, 0x01, 0xc2, 0xac, 0x01, 0xc3, 0x01, 0xc3, 0xac, 0x01, 0xc2, 0xfd, 0xd3, 0x03, 0xa5, 0x83, 0x01, 0xcb, 0xfe, 0x35, 0x83, 0xfe, 0x61, 0xfd, 0xe6, 0xca, 0xca, 0x02, 0x1a, 0x01, 0xde, 0x18, 0x1a, 0x2d, 0x32, 0x38, 0x3b, 0x42, 0x41, 0x3b, 0x38, 0x32, 0x2d, 0x1a, 0x18, 0x18, 0x1a, 0x2d, 0x32, 0x38, 0x3b, 0x41, 0x42, 0x3b, 0x38, 0x32, 0x2d, 0x1a, 0x02, 0x26, 0xfd, 0xb3, 0xfe, 0x94, 0xfd, 0xb4, 0x01, 0x6b, 0xfe, 0x95, 0x02, 0x4c, 0x01, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2b, 0xff, 0xed, 0x05, 0xde, 0x05, 0xf2, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x13, 0x21, 0x07, 0x13, 0x27, 0x07, 0x13, 0x27, 0x21, 0x13, 0x03, 0x21, 0x01, 0x03, 0x09, 0x01, 0x03, 0x01, 0x21, 0x03, 0x13, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x01, 0x21, 0x03, 0x04, 0x57, 0x01, 0x16, 0xe1, 0x55, 0xe1, 0xe1, 0x56, 0xe1, 0x01, 0x16, 0x56, 0x80, 0xfe, 0x5d, 0x01, 0x52, 0x81, 0x01, 0x52, 0x01, 0x53, 0x82, 0x01, 0x52, 0xfe, 0x5e, 0x81, 0xac, 0x02, 0x2d, 0xfe, 0x3e, 0xac, 0xfe, 0x3d, 0xfe, 0x3d, 0xac, 0xfe, 0x3e, 0x02, 0x2d, 0x04, 0x49, 0xfe, 0xd9, 0xb6, 0xfe, 0xda, 0xb6, 0xb6, 0x01, 0x26, 0xb6, 0x01, 0xfb, 0xfe, 0x47, 0xfe, 0xef, 0xfe, 0x47, 0x01, 0x11, 0xfe, 0xef, 0x01, 0xb9, 0x01, 0x11, 0x02, 0x8e, 0xfd, 0xb3, 0xfe, 0x94, 0xfd, 0xb4, 0x01, 0x6c, 0xfe, 0x94, 0x02, 0x4c, 0x01, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x2b, 0xff, 0xed, 0x05, 0xde, 0x05, 0xf2, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x17, 0x33, 0x07, 0x17, 0x27, 0x07, 0x37, 0x27, 0x33, 0x1b, 0x01, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x01, 0x21, 0x37, 0x03, 0x21, 0x05, 0x03, 0x25, 0x05, 0x03, 0x25, 0x21, 0x03, 0x04, 0x22, 0x70, 0x5a, 0x22, 0x5a, 0x5a, 0x22, 0x5a, 0x70, 0x22, 0xac, 0x02, 0x2d, 0xfe, 0x3e, 0xac, 0xfe, 0x3d, 0xfe, 0x3d, 0xac, 0xfe, 0x3e, 0x02, 0x2d, 0xac, 0x67, 0xfe, 0xaf, 0x01, 0x11, 0x69, 0x01, 0x10, 0x01, 0x11, 0x69, 0x01, 0x10, 0xfe, 0xb0, 0x03, 0x49, 0x76, 0x49, 0x76, 0x49, 0x49, 0x76, 0x49, 0x03, 0x1f, 0xfd, 0xb3, 0xfe, 0x94, 0xfd, 0xb4, 0x01, 0x6c, 0xfe, 0x94, 0x02, 0x4c, 0x01, 0x6c, 0xfb, 0xfe, 0x9d, 0xdb, 0xfe, 0x9d, 0xdb, 0xdb, 0x01, 0x63, 0xdb, 0x00, 0x00, 0x06, 0x00, 0x2b, 0xff, 0xed, 0x05, 0xde, 0x05, 0xf2, 0x00, 0x02, 0x00, 0x05, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x00, 0x25, 0x01, 0x35, 0x25, 0x01, 0x37, 0x01, 0x03, 0x27, 0x25, 0x21, 0x07, 0x0b, 0x01, 0x17, 0x11, 0x13, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x01, 0x21, 0x01, 0xb1, 0x01, 0x52, 0xfd, 0xdd, 0x01, 0x52, 0xd1, 0x01, 0x55, 0x82, 0xd1, 0x02, 0x23, 0xfe, 0x5e, 0x81, 0x01, 0x80, 0x80, 0xac, 0x02, 0x2d, 0xfe, 0x3e, 0xac, 0xfe, 0x3d, 0xfe, 0x3d, 0xac, 0xfe, 0x3e, 0x02, 0x2d, 0x99, 0x01, 0x11, 0xf3, 0xc7, 0xfe, 0xef, 0x4b, 0xfd, 0xfb, 0x01, 0xb9, 0x4b, 0xc7, 0xc6, 0x02, 0x80, 0xfe, 0x47, 0xc6, 0x03, 0x53, 0xfd, 0xb3, 0xfe, 0x94, 0xfd, 0xb4, 0x01, 0x6c, 0xfe, 0x94, 0x02, 0x4c, 0x01, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x2d, 0x00, 0x18, 0x05, 0xdf, 0x05, 0xb7, 0x00, 0x0d, 0x00, 0x17, 0x00, 0x00, 0x09, 0x01, 0x13, 0x27, 0x25, 0x01, 0x27, 0x13, 0x01, 0x21, 0x13, 0x17, 0x13, 0x21, 0x01, 0x03, 0x21, 0x05, 0x03, 0x01, 0x05, 0x03, 0x01, 0x21, 0x05, 0xdf, 0xfe, 0x6b, 0x9b, 0x92, 0xfe, 0xd3, 0xfe, 0x93, 0x92, 0x9b, 0xfe, 0x6b, 0x01, 0xf5, 0x9b, 0x92, 0x8b, 0x01, 0x73, 0xfd, 0x70, 0x79, 0xfe, 0x7b, 0x01, 0x3b, 0x79, 0x01, 0x3c, 0x01, 0x3c, 0x79, 0x01, 0x3b, 0xfe, 0x7b, 0x03, 0x71, 0xfe, 0xb8, 0xfd, 0xef, 0x34, 0xf3, 0xfe, 0xd9, 0x34, 0x02, 0x11, 0x01, 0x48, 0x02, 0x12, 0x34, 0xfe, 0x22, 0x01, 0x68, 0xfe, 0x64, 0xff, 0xfe, 0x64, 0x00, 0xff, 0xff, 0x01, 0x9c, 0x00, 0xff, 0x00, 0x01, 0x00, 0x76, 0x00, 0x00, 0x05, 0x92, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x25, 0x13, 0x0d, 0x01, 0x03, 0x25, 0x11, 0x21, 0x11, 0x05, 0x03, 0x2d, 0x01, 0x13, 0x02, 0x74, 0x01, 0x20, 0x01, 0x6e, 0x90, 0xfe, 0x92, 0x01, 0x6e, 0x90, 0xfe, 0x92, 0xfe, 0xe0, 0xfe, 0x93, 0x90, 0x01, 0x6c, 0xfe, 0x94, 0x90, 0x04, 0x00, 0x01, 0xd5, 0xfe, 0x2a, 0xeb, 0xfe, 0xeb, 0xea, 0xeb, 0xfe, 0xeb, 0xeb, 0xfe, 0x2a, 0x01, 0xd6, 0xeb, 0x01, 0x15, 0xeb, 0xea, 0x01, 0x15, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x88, 0x00, 0x00, 0x05, 0x80, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x17, 0x00, 0x00, 0x01, 0x07, 0x17, 0x33, 0x37, 0x27, 0x05, 0x01, 0x37, 0x01, 0x11, 0x33, 0x11, 0x01, 0x17, 0x09, 0x01, 0x07, 0x01, 0x11, 0x23, 0x11, 0x01, 0x27, 0x02, 0x99, 0x6c, 0x6c, 0xd6, 0x6c, 0x6c, 0xfe, 0xbd, 0xfe, 0x5d, 0x6c, 0x01, 0xa3, 0xd8, 0x01, 0xa4, 0x6c, 0xfe, 0x5c, 0x01, 0xa4, 0x6c, 0xfe, 0x5c, 0xd8, 0xfe, 0x5d, 0x6c, 0x03, 0xb9, 0xce, 0xd0, 0xd0, 0xce, 0xce, 0x01, 0x0d, 0xd0, 0xfe, 0xf2, 0x02, 0x1b, 0xfd, 0xe5, 0x01, 0x0e, 0xd0, 0xfe, 0xf3, 0xfe, 0xf2, 0xd0, 0x01, 0x0d, 0xfd, 0xe6, 0x02, 0x1a, 0xfe, 0xf3, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x17, 0x00, 0x00, 0x09, 0x01, 0x07, 0x01, 0x11, 0x23, 0x11, 0x01, 0x27, 0x01, 0x21, 0x35, 0x21, 0x01, 0x37, 0x01, 0x11, 0x33, 0x11, 0x01, 0x17, 0x01, 0x21, 0x15, 0x03, 0x72, 0x01, 0x8d, 0x40, 0xfe, 0x72, 0x5a, 0xfe, 0x72, 0x3f, 0x01, 0x8d, 0xfd, 0xce, 0x02, 0x33, 0xfe, 0x72, 0x3f, 0x01, 0x8e, 0x5a, 0x01, 0x8e, 0x40, 0xfe, 0x71, 0x02, 0x34, 0x02, 0xb8, 0xfe, 0x46, 0x47, 0x01, 0xbb, 0xfd, 0x8e, 0x02, 0x71, 0xfe, 0x46, 0x47, 0x01, 0xba, 0x64, 0x01, 0xbb, 0x47, 0xfe, 0x46, 0x02, 0x71, 0xfd, 0x8f, 0x01, 0xba, 0x47, 0xfe, 0x45, 0x64, 0x00, 0x01, 0x00, 0x39, 0xff, 0xe3, 0x05, 0xab, 0x05, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x13, 0x09, 0x01, 0x0d, 0x01, 0x09, 0x01, 0x0b, 0x01, 0x09, 0x01, 0x2d, 0x01, 0x09, 0x01, 0x02, 0xf2, 0x47, 0x01, 0xa5, 0xfe, 0xc1, 0x02, 0x0c, 0xfd, 0xf4, 0x01, 0x3f, 0xfe, 0x5b, 0x47, 0x47, 0xfe, 0x5b, 0x01, 0x3f, 0xfd, 0xf5, 0x02, 0x0b, 0xfe, 0xc1, 0x01, 0xa5, 0x05, 0xf0, 0xfd, 0xb9, 0x01, 0x64, 0xfe, 0x2c, 0x50, 0x4f, 0xfe, 0x2c, 0x01, 0x64, 0xfd, 0xb9, 0x02, 0x47, 0xfe, 0x9c, 0x01, 0xd4, 0x4f, 0x50, 0x01, 0xd4, 0xfe, 0x9c, 0x00, 0x00, 0x09, 0x00, 0x4b, 0xff, 0xe3, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x02, 0x00, 0x05, 0x00, 0x08, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x11, 0x00, 0x14, 0x00, 0x17, 0x00, 0x27, 0x00, 0x00, 0x01, 0x05, 0x03, 0x05, 0x25, 0x05, 0x01, 0x03, 0x25, 0x03, 0x13, 0x03, 0x01, 0x25, 0x13, 0x25, 0x05, 0x25, 0x01, 0x13, 0x05, 0x13, 0x03, 0x13, 0x11, 0x13, 0x25, 0x03, 0x0d, 0x01, 0x13, 0x25, 0x0b, 0x01, 0x05, 0x13, 0x2d, 0x01, 0x03, 0x05, 0x04, 0x76, 0xfe, 0xfa, 0x6b, 0x02, 0x0a, 0xfe, 0xf8, 0xfe, 0xfe, 0x01, 0x71, 0x6f, 0xfe, 0xfe, 0x01, 0x6b, 0x6b, 0xfe, 0x8e, 0x01, 0x06, 0x6b, 0xfd, 0xf6, 0x01, 0x08, 0x01, 0x02, 0xfe, 0x8f, 0x6f, 0x01, 0x02, 0x01, 0x6b, 0x6b, 0x8f, 0x01, 0x5d, 0x93, 0x01, 0x60, 0xfe, 0xa0, 0x93, 0xfe, 0xa3, 0x8f, 0x8f, 0xfe, 0xa3, 0x94, 0xfe, 0xa0, 0x01, 0x60, 0x94, 0x01, 0x5d, 0x04, 0x85, 0x7b, 0xfe, 0xe0, 0x01, 0x78, 0x78, 0xfe, 0x65, 0x01, 0x23, 0x77, 0xfd, 0xbc, 0x01, 0x25, 0x01, 0x1f, 0xfe, 0x66, 0x7b, 0x01, 0x1f, 0x01, 0x77, 0x77, 0x01, 0x9c, 0xfe, 0xdd, 0x78, 0x02, 0x45, 0xfe, 0xdb, 0xfe, 0xe0, 0x03, 0x06, 0xfe, 0x79, 0xa4, 0xfe, 0x7c, 0xa0, 0x9f, 0xfe, 0x7c, 0xa4, 0xfe, 0x79, 0x01, 0x87, 0xa4, 0x01, 0x84, 0x9f, 0xa0, 0x01, 0x84, 0xa4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa8, 0xff, 0xe3, 0x05, 0x61, 0x05, 0xf0, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x13, 0x25, 0x09, 0x01, 0x25, 0x0b, 0x01, 0x05, 0x09, 0x01, 0x05, 0x03, 0x04, 0x65, 0x01, 0xf7, 0xfe, 0x6e, 0x01, 0x92, 0xfe, 0x09, 0x65, 0x65, 0xfe, 0x09, 0x01, 0x93, 0xfe, 0x6d, 0x01, 0xf7, 0x05, 0xf0, 0xfd, 0xbc, 0xc1, 0xfe, 0x7d, 0xfe, 0x7d, 0xc1, 0xfd, 0xbb, 0x02, 0x45, 0xc1, 0x01, 0x83, 0x01, 0x83, 0xc1, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xe3, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x13, 0x01, 0x03, 0x0d, 0x01, 0x13, 0x01, 0x0b, 0x01, 0x01, 0x13, 0x2d, 0x01, 0x03, 0x01, 0x03, 0x04, 0x66, 0x01, 0x86, 0xf5, 0x01, 0xc2, 0xfe, 0x3e, 0xf5, 0xfe, 0x7a, 0x66, 0x66, 0xfe, 0x7a, 0xf6, 0xfe, 0x3e, 0x01, 0xc2, 0xf6, 0x01, 0x86, 0x05, 0xf0, 0xfe, 0x0b, 0x01, 0x12, 0xfe, 0x4e, 0x72, 0x71, 0xfe, 0x4e, 0x01, 0x12, 0xfe, 0x0b, 0x01, 0xf5, 0xfe, 0xee, 0x01, 0xb2, 0x71, 0x72, 0x01, 0xb2, 0xfe, 0xee, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xe3, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x13, 0x25, 0x03, 0x0d, 0x01, 0x13, 0x25, 0x0b, 0x01, 0x05, 0x13, 0x2d, 0x01, 0x03, 0x05, 0x03, 0x04, 0x99, 0x01, 0x53, 0x7b, 0x01, 0x48, 0xfe, 0xb8, 0x7b, 0xfe, 0xad, 0x99, 0x99, 0xfe, 0xad, 0x7b, 0xfe, 0xb9, 0x01, 0x47, 0x7b, 0x01, 0x53, 0x05, 0xf0, 0xfe, 0x94, 0x89, 0xfe, 0x87, 0xab, 0xaa, 0xfe, 0x87, 0x89, 0xfe, 0x94, 0x01, 0x6c, 0x89, 0x01, 0x79, 0xaa, 0xab, 0x01, 0x79, 0x89, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xe3, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x17, 0x00, 0x00, 0x01, 0x13, 0x37, 0x03, 0x25, 0x03, 0x0d, 0x01, 0x13, 0x25, 0x13, 0x27, 0x0b, 0x01, 0x07, 0x13, 0x05, 0x13, 0x2d, 0x01, 0x03, 0x05, 0x03, 0x17, 0x03, 0x04, 0x69, 0xf3, 0x3f, 0x01, 0x3f, 0xd7, 0x01, 0x34, 0xfe, 0xcc, 0xd7, 0xfe, 0xc1, 0x3f, 0xf3, 0x69, 0x68, 0xf4, 0x40, 0xfe, 0xc0, 0xd7, 0xfe, 0xcd, 0x01, 0x33, 0xd7, 0x01, 0x40, 0x40, 0xf4, 0x05, 0xf0, 0xfe, 0xa9, 0xef, 0xfe, 0x9d, 0x47, 0xfe, 0xf1, 0x73, 0x74, 0xfe, 0xf1, 0x47, 0xfe, 0x9d, 0xef, 0xfe, 0xa9, 0x01, 0x57, 0xef, 0x01, 0x63, 0x47, 0x01, 0x0f, 0x74, 0x73, 0x01, 0x0f, 0x47, 0x01, 0x63, 0xef, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x00, 0x05, 0xa4, 0x05, 0xd5, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x13, 0x17, 0x03, 0x01, 0x17, 0x01, 0x25, 0x17, 0x05, 0x21, 0x15, 0x21, 0x05, 0x07, 0x25, 0x01, 0x07, 0x01, 0x13, 0x07, 0x03, 0x11, 0x23, 0x11, 0x03, 0x27, 0x13, 0x01, 0x27, 0x01, 0x05, 0x27, 0x25, 0x21, 0x35, 0x21, 0x25, 0x37, 0x05, 0x01, 0x37, 0x01, 0x03, 0x37, 0x02, 0xce, 0x6c, 0x99, 0x64, 0x99, 0x01, 0x1b, 0x4c, 0xfe, 0xe5, 0x01, 0x72, 0x2a, 0xfe, 0x8c, 0x01, 0x92, 0xfe, 0x72, 0x01, 0x70, 0x2a, 0xfe, 0x8e, 0x01, 0x1b, 0x4c, 0xfe, 0xe6, 0x98, 0x64, 0x99, 0x6c, 0x99, 0x64, 0x99, 0xfe, 0xe6, 0x4d, 0x01, 0x1b, 0xfe, 0x8e, 0x2a, 0x01, 0x72, 0xfe, 0x71, 0x01, 0x91, 0xfe, 0x8c, 0x2a, 0x01, 0x70, 0xfe, 0xe7, 0x4d, 0x01, 0x19, 0x98, 0x64, 0x04, 0x17, 0x01, 0xbe, 0xfe, 0x45, 0x01, 0x99, 0x2e, 0xfe, 0x66, 0x01, 0x3a, 0x55, 0xfe, 0xc5, 0xab, 0x6f, 0xab, 0x78, 0xaa, 0x6f, 0xac, 0xfe, 0xc4, 0x55, 0x01, 0x39, 0xfe, 0x67, 0x2e, 0x01, 0x98, 0xfe, 0x46, 0x01, 0xbc, 0xfe, 0x66, 0x2e, 0x01, 0x9b, 0xfe, 0xc5, 0x55, 0x01, 0x3a, 0xaa, 0x6f, 0xaa, 0x78, 0xab, 0x6f, 0xa9, 0x01, 0x39, 0x55, 0xfe, 0xc7, 0x01, 0x99, 0x2e, 0x00, 0x00, 0x01, 0x00, 0x96, 0xff, 0xe3, 0x05, 0x73, 0x05, 0xf0, 0x00, 0x9b, 0x00, 0x00, 0x01, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x1d, 0x01, 0x17, 0x16, 0x17, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x23, 0x22, 0x0f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x17, 0x16, 0x33, 0x32, 0x3b, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x0f, 0x01, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x26, 0x27, 0x26, 0x27, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x33, 0x32, 0x3f, 0x01, 0x26, 0x35, 0x34, 0x37, 0x27, 0x26, 0x23, 0x22, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x36, 0x37, 0x36, 0x02, 0xd6, 0x43, 0x28, 0x31, 0x32, 0x6c, 0x33, 0x30, 0x27, 0x45, 0x0f, 0x1c, 0x15, 0x09, 0x66, 0x3a, 0x23, 0x3d, 0x36, 0x2e, 0x14, 0x13, 0x40, 0x1b, 0x12, 0x04, 0x0d, 0x4e, 0x38, 0x45, 0x0a, 0x0a, 0x09, 0x76, 0x5a, 0x0b, 0x04, 0x05, 0x0b, 0x5c, 0x75, 0x0a, 0x09, 0x0a, 0x45, 0x38, 0x4e, 0x0d, 0x04, 0x12, 0x1b, 0x40, 0x13, 0x14, 0x2e, 0x36, 0x3d, 0x23, 0x3c, 0x63, 0x0d, 0x18, 0x16, 0x0f, 0x45, 0x27, 0x30, 0x33, 0x6c, 0x32, 0x31, 0x28, 0x45, 0x08, 0x07, 0x1a, 0x15, 0x0d, 0x63, 0x3c, 0x23, 0x3c, 0x36, 0x2f, 0x14, 0x13, 0x40, 0x1b, 0x12, 0x05, 0x0c, 0x4f, 0x38, 0x44, 0x0b, 0x0a, 0x09, 0x76, 0x5a, 0x0b, 0x04, 0x03, 0x0a, 0x5a, 0x76, 0x09, 0x0a, 0x0b, 0x44, 0x38, 0x4f, 0x0c, 0x05, 0x12, 0x1b, 0x40, 0x13, 0x14, 0x2f, 0x36, 0x3c, 0x23, 0x3e, 0x61, 0x0a, 0x18, 0x1a, 0x07, 0x03, 0x94, 0x0c, 0x80, 0x77, 0x46, 0x4e, 0x64, 0x30, 0x31, 0x31, 0x30, 0x64, 0x4e, 0x46, 0x79, 0x7e, 0x0c, 0x06, 0x0e, 0x17, 0x06, 0x44, 0x7a, 0x49, 0x27, 0x23, 0x07, 0x18, 0x34, 0x23, 0x2c, 0x16, 0x18, 0x47, 0x32, 0x24, 0x3a, 0x07, 0x13, 0x14, 0x15, 0x14, 0x07, 0x3b, 0x24, 0x32, 0x47, 0x18, 0x16, 0x2c, 0x23, 0x34, 0x18, 0x07, 0x23, 0x27, 0x49, 0x7e, 0x3f, 0x08, 0x19, 0x09, 0x06, 0x0f, 0x7f, 0x79, 0x46, 0x4e, 0x64, 0x30, 0x31, 0x31, 0x30, 0x64, 0x4e, 0x46, 0x79, 0x7f, 0x0f, 0x03, 0x03, 0x0d, 0x15, 0x08, 0x3f, 0x7e, 0x49, 0x27, 0x23, 0x07, 0x18, 0x34, 0x23, 0x2c, 0x16, 0x18, 0x47, 0x32, 0x24, 0x3a, 0x07, 0x14, 0x16, 0x14, 0x13, 0x07, 0x3a, 0x24, 0x32, 0x47, 0x18, 0x16, 0x2c, 0x23, 0x34, 0x18, 0x07, 0x23, 0x27, 0x49, 0x82, 0x3b, 0x06, 0x19, 0x0b, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x96, 0xff, 0xe3, 0x05, 0x73, 0x05, 0xf0, 0x00, 0x19, 0x00, 0xb5, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x1d, 0x01, 0x17, 0x16, 0x17, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x22, 0x23, 0x22, 0x0f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x17, 0x16, 0x33, 0x32, 0x3b, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x0f, 0x01, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x26, 0x27, 0x26, 0x27, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x33, 0x32, 0x3f, 0x01, 0x26, 0x35, 0x34, 0x37, 0x27, 0x26, 0x23, 0x22, 0x2b, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x36, 0x37, 0x36, 0x03, 0x17, 0x26, 0x0f, 0x10, 0x0d, 0x0d, 0x0e, 0x0e, 0x0d, 0x0d, 0x10, 0x0f, 0x26, 0x0f, 0x11, 0x0c, 0x0e, 0x0d, 0x0d, 0x0e, 0x0c, 0x11, 0x50, 0x43, 0x28, 0x31, 0x32, 0x6c, 0x33, 0x30, 0x27, 0x45, 0x0f, 0x1c, 0x15, 0x09, 0x66, 0x3a, 0x23, 0x3d, 0x36, 0x2e, 0x14, 0x13, 0x40, 0x1b, 0x12, 0x04, 0x0d, 0x4e, 0x38, 0x45, 0x0a, 0x0a, 0x09, 0x76, 0x5a, 0x0b, 0x04, 0x05, 0x0b, 0x5c, 0x75, 0x0a, 0x09, 0x0a, 0x45, 0x38, 0x4e, 0x0d, 0x04, 0x12, 0x1b, 0x40, 0x13, 0x14, 0x2e, 0x36, 0x3d, 0x23, 0x3c, 0x63, 0x0d, 0x18, 0x16, 0x0f, 0x45, 0x27, 0x30, 0x33, 0x6c, 0x32, 0x31, 0x28, 0x45, 0x08, 0x07, 0x1a, 0x15, 0x0d, 0x63, 0x3c, 0x23, 0x3c, 0x36, 0x2f, 0x14, 0x13, 0x40, 0x1b, 0x12, 0x05, 0x0c, 0x4f, 0x38, 0x44, 0x0b, 0x0a, 0x09, 0x76, 0x5a, 0x0b, 0x04, 0x03, 0x0a, 0x5a, 0x76, 0x09, 0x0a, 0x0b, 0x44, 0x38, 0x4f, 0x0c, 0x05, 0x12, 0x1b, 0x40, 0x13, 0x14, 0x2f, 0x36, 0x3c, 0x23, 0x3e, 0x61, 0x0a, 0x18, 0x1a, 0x07, 0x03, 0x50, 0x08, 0x08, 0x0e, 0x0f, 0x23, 0x15, 0x14, 0x23, 0x0f, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x0e, 0x0f, 0x23, 0x14, 0x15, 0x23, 0x0f, 0x0e, 0x08, 0x4c, 0x0c, 0x80, 0x77, 0x46, 0x4e, 0x64, 0x30, 0x31, 0x31, 0x30, 0x64, 0x4e, 0x46, 0x79, 0x7e, 0x0c, 0x06, 0x0e, 0x17, 0x06, 0x44, 0x7a, 0x49, 0x27, 0x23, 0x07, 0x18, 0x34, 0x23, 0x2c, 0x16, 0x18, 0x47, 0x32, 0x24, 0x3a, 0x07, 0x13, 0x14, 0x15, 0x14, 0x07, 0x3b, 0x24, 0x32, 0x47, 0x18, 0x16, 0x2c, 0x23, 0x34, 0x18, 0x07, 0x23, 0x27, 0x49, 0x7e, 0x3f, 0x08, 0x19, 0x09, 0x06, 0x0f, 0x7f, 0x79, 0x46, 0x4e, 0x64, 0x30, 0x31, 0x31, 0x30, 0x64, 0x4e, 0x46, 0x79, 0x7f, 0x0f, 0x03, 0x03, 0x0d, 0x15, 0x08, 0x3f, 0x7e, 0x49, 0x27, 0x23, 0x07, 0x18, 0x34, 0x23, 0x2c, 0x16, 0x18, 0x47, 0x32, 0x24, 0x3a, 0x07, 0x14, 0x16, 0x14, 0x13, 0x07, 0x3a, 0x24, 0x32, 0x47, 0x18, 0x16, 0x2c, 0x23, 0x34, 0x18, 0x07, 0x23, 0x27, 0x49, 0x82, 0x3b, 0x06, 0x19, 0x0b, 0x03, 0x00, 0x01, 0x00, 0x90, 0xff, 0xe3, 0x05, 0x77, 0x05, 0xf0, 0x00, 0x68, 0x00, 0x00, 0x01, 0x17, 0x32, 0x3f, 0x01, 0x27, 0x26, 0x23, 0x07, 0x22, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x35, 0x34, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x1d, 0x01, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x23, 0x27, 0x22, 0x0f, 0x01, 0x17, 0x16, 0x33, 0x37, 0x32, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x15, 0x14, 0x17, 0x16, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x3e, 0x01, 0x01, 0x89, 0x8f, 0x49, 0x1e, 0x2a, 0x2a, 0x1c, 0x4d, 0x87, 0x51, 0x92, 0x10, 0x0a, 0x16, 0x26, 0x63, 0x12, 0x46, 0x8a, 0x27, 0x40, 0x32, 0x2b, 0x5f, 0x3a, 0x31, 0x4a, 0x97, 0x4a, 0x30, 0x39, 0x60, 0x2b, 0x2b, 0x48, 0x2c, 0x84, 0x46, 0x12, 0xa0, 0x0a, 0x11, 0x91, 0x4c, 0x8e, 0x48, 0x20, 0x2b, 0x2b, 0x1c, 0x4e, 0x87, 0x51, 0x91, 0x11, 0x0a, 0x17, 0x28, 0x61, 0x13, 0x47, 0x39, 0x4f, 0x26, 0x40, 0x33, 0x2b, 0x60, 0x39, 0x30, 0x4a, 0x9b, 0x46, 0x31, 0x3a, 0x5f, 0x2b, 0x2e, 0x44, 0x2b, 0x86, 0x46, 0x12, 0xa0, 0x0b, 0x11, 0x91, 0x02, 0xc4, 0x0a, 0x14, 0x1c, 0x1b, 0x12, 0x07, 0x5d, 0x48, 0x2c, 0x60, 0x2c, 0x48, 0x20, 0x06, 0x59, 0x63, 0xa2, 0x21, 0x1c, 0x37, 0x37, 0x99, 0x5c, 0xca, 0x34, 0x4f, 0x4f, 0x34, 0xd0, 0x56, 0x8f, 0x41, 0x37, 0x1c, 0x1c, 0xa7, 0x67, 0x55, 0x06, 0x33, 0x9a, 0x27, 0x2c, 0x48, 0x5e, 0x0a, 0x14, 0x1b, 0x1c, 0x12, 0x07, 0x5d, 0x48, 0x2c, 0x60, 0x2c, 0x4c, 0x1c, 0x06, 0x26, 0x33, 0x63, 0xa2, 0x21, 0x1c, 0x37, 0x37, 0x99, 0x5c, 0xca, 0x34, 0x4f, 0x4f, 0x37, 0xcd, 0x56, 0x8f, 0x41, 0x37, 0x1c, 0x1e, 0xa5, 0x66, 0x56, 0x06, 0x34, 0x9a, 0x26, 0x2c, 0x48, 0x5e, 0x00, 0x04, 0x00, 0x90, 0xff, 0xe3, 0x05, 0x77, 0x05, 0xf0, 0x00, 0x0e, 0x00, 0x99, 0x00, 0xb1, 0x00, 0xc9, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x13, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x1d, 0x01, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x05, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x25, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x03, 0x04, 0x19, 0x33, 0x21, 0x1b, 0x2c, 0x4c, 0x2c, 0x1b, 0x22, 0x32, 0x97, 0x10, 0x30, 0x5b, 0x1d, 0x21, 0x10, 0x0f, 0x51, 0x3f, 0x52, 0x11, 0x0a, 0x17, 0x27, 0x62, 0x12, 0x13, 0x33, 0x3b, 0x4b, 0x2a, 0x39, 0x43, 0x10, 0x4e, 0x39, 0x30, 0x4a, 0x4c, 0x4f, 0x46, 0x31, 0x3a, 0x4d, 0x10, 0x40, 0x3b, 0x2c, 0x49, 0x3c, 0x32, 0x14, 0x12, 0x63, 0x26, 0x16, 0x0a, 0x10, 0x53, 0x3f, 0x51, 0x0e, 0x10, 0x22, 0x1c, 0x5b, 0x30, 0x10, 0x10, 0x2e, 0x5b, 0x1d, 0x23, 0x10, 0x0e, 0x51, 0x3f, 0x51, 0x12, 0x0b, 0x17, 0x26, 0x63, 0x12, 0x14, 0x32, 0x3c, 0x4a, 0x2b, 0x38, 0x43, 0x10, 0x4d, 0x3a, 0x31, 0x4a, 0x97, 0x4a, 0x30, 0x39, 0x4e, 0x10, 0x40, 0x3c, 0x2c, 0x49, 0x3b, 0x33, 0x13, 0x12, 0x62, 0x27, 0x17, 0x0a, 0x11, 0x52, 0x3f, 0x51, 0x0f, 0x10, 0x22, 0x1e, 0x5b, 0x2e, 0xfe, 0xbc, 0x3d, 0x3a, 0x1b, 0x1a, 0x08, 0x0a, 0x2f, 0x36, 0x35, 0x07, 0x04, 0x0c, 0x13, 0x37, 0x09, 0x0b, 0x1c, 0x27, 0x3f, 0x16, 0x21, 0x01, 0xac, 0x41, 0x20, 0x17, 0x3f, 0x26, 0x1c, 0x0b, 0x09, 0x38, 0x13, 0x0c, 0x05, 0x06, 0x35, 0x36, 0x30, 0x09, 0x08, 0x1a, 0x1b, 0x3b, 0x03, 0xd3, 0x63, 0x4a, 0x32, 0x51, 0x44, 0x1a, 0x2b, 0x2b, 0x1a, 0x44, 0x51, 0x32, 0x4a, 0xfe, 0xb4, 0x0b, 0x20, 0x03, 0x01, 0x28, 0x35, 0x48, 0x2c, 0x27, 0x39, 0x2c, 0x4a, 0x1e, 0x06, 0x26, 0x30, 0x66, 0x89, 0x29, 0x0a, 0x14, 0x54, 0x7c, 0x5c, 0x60, 0x6a, 0x34, 0x4f, 0x4f, 0x37, 0x67, 0x60, 0x5c, 0x7c, 0x54, 0x14, 0x0a, 0x27, 0x8b, 0x67, 0x2f, 0x26, 0x06, 0x20, 0x48, 0x2c, 0x39, 0x27, 0x2c, 0x49, 0x34, 0x28, 0x01, 0x03, 0x20, 0x0b, 0x0b, 0x1f, 0x03, 0x01, 0x28, 0x33, 0x4a, 0x2c, 0x26, 0x39, 0x2d, 0x48, 0x20, 0x06, 0x26, 0x30, 0x66, 0x89, 0x29, 0x0a, 0x14, 0x54, 0x7c, 0x5c, 0x60, 0x6a, 0x34, 0x4f, 0x4f, 0x34, 0x6a, 0x60, 0x5c, 0x7c, 0x54, 0x14, 0x0a, 0x27, 0x8b, 0x67, 0x2f, 0x26, 0x06, 0x1e, 0x4a, 0x2c, 0x39, 0x27, 0x2c, 0x48, 0x35, 0x28, 0x01, 0x03, 0x1f, 0x80, 0x12, 0x04, 0x01, 0x22, 0x22, 0x27, 0x18, 0x15, 0x21, 0x17, 0x24, 0x15, 0x04, 0x19, 0x28, 0x3a, 0x55, 0x4a, 0x4a, 0x55, 0x3a, 0x28, 0x19, 0x04, 0x15, 0x24, 0x17, 0x21, 0x15, 0x18, 0x27, 0x22, 0x22, 0x01, 0x04, 0x00, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, 0x05, 0xa6, 0x05, 0xad, 0x00, 0x19, 0x00, 0x77, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x27, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x03, 0x45, 0x82, 0x37, 0x37, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x2e, 0x37, 0x37, 0x82, 0x37, 0x38, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x38, 0x6c, 0x38, 0x21, 0x32, 0x30, 0x31, 0x31, 0x2b, 0x29, 0x25, 0x27, 0x24, 0x28, 0x21, 0x33, 0x2a, 0x52, 0x18, 0x2b, 0x1e, 0x28, 0x24, 0x28, 0x24, 0x29, 0x2b, 0x2d, 0x6d, 0x2a, 0x33, 0x21, 0x2b, 0x1a, 0x05, 0x04, 0x22, 0x24, 0x29, 0x2b, 0x2d, 0x6d, 0x2a, 0x33, 0x21, 0x29, 0x24, 0x2a, 0x23, 0x22, 0x20, 0x14, 0x4e, 0x2b, 0x34, 0x1f, 0x29, 0x24, 0x28, 0x25, 0x28, 0x2b, 0x2d, 0x35, 0x38, 0x2a, 0x35, 0x25, 0x07, 0x18, 0x28, 0x24, 0x29, 0x2b, 0x2d, 0x35, 0x38, 0x2a, 0x33, 0x21, 0x28, 0x24, 0x18, 0x04, 0x0b, 0x1a, 0x1c, 0x30, 0x36, 0x7b, 0x49, 0x46, 0x7b, 0x36, 0x30, 0x1c, 0x1a, 0x1a, 0x1c, 0x30, 0x36, 0x7b, 0x46, 0x49, 0x7b, 0x36, 0x30, 0x1c, 0x13, 0x35, 0x10, 0x17, 0x17, 0x14, 0x2b, 0x27, 0x67, 0x3e, 0x3a, 0x63, 0x2e, 0x26, 0x19, 0x15, 0x05, 0x17, 0x22, 0x2e, 0x63, 0x3b, 0x3d, 0x67, 0x27, 0x2b, 0x14, 0x15, 0x15, 0x19, 0x26, 0x31, 0x4e, 0x25, 0x26, 0x57, 0x27, 0x2b, 0x14, 0x15, 0x15, 0x19, 0x26, 0x2e, 0x63, 0x3a, 0x3e, 0x6b, 0x23, 0x22, 0x15, 0x04, 0x15, 0x1b, 0x24, 0x2e, 0x63, 0x3a, 0x3e, 0x67, 0x27, 0x2b, 0x14, 0x15, 0x15, 0x19, 0x2c, 0x0e, 0x42, 0x3a, 0x3e, 0x67, 0x27, 0x2b, 0x14, 0x15, 0x15, 0x19, 0x26, 0x2e, 0x63, 0x3b, 0x3d, 0x3f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x63, 0x00, 0x00, 0x05, 0xa6, 0x05, 0xad, 0x00, 0x5c, 0x00, 0x76, 0x00, 0x8d, 0x00, 0xa6, 0x00, 0xbd, 0x00, 0xd6, 0x00, 0x00, 0x25, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x02, 0x32, 0x17, 0x16, 0x17, 0x37, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x1f, 0x01, 0x36, 0x37, 0x13, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x03, 0x26, 0x35, 0x34, 0x36, 0x37, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x01, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x13, 0x37, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x0f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x03, 0x04, 0x04, 0x1a, 0x2c, 0x21, 0x32, 0x2b, 0x6c, 0x2e, 0x2b, 0x28, 0x25, 0x28, 0x24, 0x29, 0x1d, 0x2c, 0x19, 0x51, 0x2b, 0x32, 0x21, 0x29, 0x24, 0x28, 0x25, 0x2b, 0x28, 0x36, 0x2c, 0x35, 0x2d, 0x22, 0x37, 0x06, 0x18, 0x24, 0x28, 0x22, 0x32, 0x2a, 0x70, 0x2a, 0x33, 0x21, 0x28, 0x24, 0x18, 0x06, 0x38, 0x21, 0x32, 0x30, 0x31, 0x31, 0x2b, 0x29, 0x25, 0x27, 0x24, 0x28, 0x21, 0x33, 0x2a, 0x52, 0x18, 0x2b, 0x1e, 0x28, 0x24, 0x28, 0x24, 0x29, 0x2b, 0x2d, 0x6d, 0x2a, 0x33, 0x21, 0x2b, 0x1a, 0x46, 0x82, 0x37, 0x07, 0x06, 0x0d, 0x0c, 0x17, 0x18, 0x17, 0x1c, 0x1b, 0x41, 0x1b, 0x1d, 0x16, 0x19, 0x16, 0x02, 0x16, 0x06, 0x07, 0x3d, 0x20, 0x1d, 0x3b, 0x2a, 0x1b, 0x18, 0x5d, 0x16, 0x19, 0x16, 0x19, 0x16, 0x1d, 0x1b, 0x41, 0x1b, 0x1d, 0x16, 0x16, 0x03, 0xc0, 0x03, 0x2a, 0x26, 0x6c, 0x07, 0x06, 0x20, 0x1c, 0x20, 0x1b, 0x1d, 0x16, 0x16, 0x19, 0x16, 0x19, 0x16, 0x1d, 0x13, 0x03, 0x02, 0x00, 0x1f, 0x20, 0x15, 0x17, 0x1d, 0x1a, 0x41, 0x1b, 0x1d, 0x17, 0x18, 0x16, 0x19, 0x15, 0x5d, 0x18, 0x1b, 0x2b, 0x3b, 0x1d, 0xdd, 0x48, 0x48, 0x12, 0x1d, 0x17, 0x18, 0x17, 0x1a, 0x15, 0x17, 0x1d, 0x1a, 0x21, 0x1c, 0x1f, 0x07, 0x07, 0x6c, 0x26, 0x2a, 0xf8, 0x25, 0x4e, 0x31, 0x26, 0x19, 0x15, 0x15, 0x14, 0x2b, 0x27, 0x67, 0x3d, 0x3b, 0x63, 0x2e, 0x22, 0x17, 0x05, 0x15, 0x19, 0x26, 0x2e, 0x63, 0x3a, 0x3e, 0x67, 0x27, 0x2e, 0x11, 0x17, 0x17, 0x10, 0x35, 0x0d, 0x3f, 0x3d, 0x3b, 0x63, 0x2e, 0x26, 0x19, 0x15, 0x15, 0x19, 0x26, 0x2e, 0x63, 0x3b, 0x3d, 0x3f, 0x0d, 0x35, 0x10, 0x17, 0x17, 0x14, 0x2b, 0x27, 0x67, 0x3e, 0x3a, 0x63, 0x2e, 0x26, 0x19, 0x15, 0x05, 0x17, 0x22, 0x2e, 0x63, 0x3b, 0x3d, 0x67, 0x27, 0x2b, 0x14, 0x15, 0x15, 0x19, 0x26, 0x31, 0x4e, 0x03, 0x38, 0x1a, 0x03, 0x04, 0x47, 0x47, 0x14, 0x24, 0x3e, 0x1b, 0x18, 0x0e, 0x0d, 0x0d, 0x0e, 0x18, 0x1b, 0x3e, 0x24, 0x14, 0x0c, 0x82, 0x04, 0x03, 0xfd, 0x63, 0x06, 0x0e, 0x1e, 0x2e, 0x1e, 0x2c, 0x62, 0x17, 0x42, 0x24, 0x23, 0x3e, 0x1b, 0x18, 0x0e, 0x0d, 0x0d, 0x0e, 0x18, 0x18, 0x09, 0x01, 0xba, 0x16, 0x17, 0x49, 0x72, 0x30, 0x43, 0x04, 0x03, 0x0d, 0x0d, 0x0e, 0x18, 0x18, 0x3e, 0x27, 0x23, 0x3e, 0x1b, 0x18, 0x0e, 0x09, 0xfe, 0xc2, 0x4c, 0x4d, 0x18, 0x18, 0x0e, 0x0d, 0x0d, 0x0e, 0x18, 0x1b, 0x3e, 0x23, 0x24, 0x42, 0x17, 0x62, 0x2c, 0x1e, 0x2e, 0x1e, 0x0e, 0x01, 0x24, 0x0a, 0x0a, 0x09, 0x0e, 0x18, 0x1b, 0x3e, 0x23, 0x27, 0x3e, 0x18, 0x18, 0x0e, 0x0d, 0x0d, 0x03, 0x04, 0x43, 0x30, 0x72, 0x49, 0x17, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x4b, 0xff, 0xe3, 0x05, 0xbd, 0x05, 0xf0, 0x00, 0x29, 0x00, 0x54, 0x00, 0xbd, 0x00, 0xe6, 0x01, 0x11, 0x01, 0x3a, 0x01, 0x65, 0x01, 0x7f, 0x01, 0xa9, 0x01, 0xd3, 0x00, 0x00, 0x01, 0x26, 0x27, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x36, 0x37, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x14, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x25, 0x06, 0x07, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x0f, 0x01, 0x16, 0x17, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x23, 0x01, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x34, 0x36, 0x37, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x01, 0x26, 0x27, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x07, 0x26, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x3f, 0x01, 0x26, 0x27, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x16, 0x17, 0x1e, 0x02, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x01, 0x16, 0x17, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x0f, 0x01, 0x16, 0x17, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x37, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x03, 0x06, 0x07, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x17, 0x06, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x07, 0x2e, 0x01, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x37, 0x36, 0x37, 0x34, 0x26, 0x27, 0x26, 0x27, 0x01, 0x36, 0x37, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x14, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x36, 0x37, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x1e, 0x01, 0x17, 0x16, 0x17, 0x04, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x13, 0x06, 0x07, 0x17, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3f, 0x01, 0x26, 0x27, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x03, 0x16, 0x17, 0x37, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x1f, 0x01, 0x36, 0x37, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x02, 0x01, 0x05, 0x02, 0xcd, 0x10, 0x08, 0x09, 0x17, 0x09, 0x07, 0x06, 0x03, 0x03, 0x06, 0x07, 0x09, 0x15, 0x0b, 0x08, 0x10, 0xcd, 0x02, 0x05, 0xb9, 0x21, 0x12, 0x19, 0x2f, 0x14, 0x12, 0x0a, 0x09, 0x09, 0x0a, 0x12, 0x14, 0x2f, 0x19, 0x12, 0x21, 0x02, 0xca, 0x02, 0x05, 0x6b, 0x6b, 0x10, 0x1b, 0x2f, 0x14, 0x12, 0x0b, 0x09, 0x09, 0x0b, 0x12, 0x14, 0x2f, 0x1b, 0x10, 0x08, 0xce, 0x05, 0x02, 0x6d, 0x6c, 0x06, 0x0f, 0x14, 0x09, 0x07, 0x05, 0x04, 0x04, 0x05, 0x07, 0x0b, 0x16, 0x0b, 0x06, 0x04, 0xfc, 0x35, 0x21, 0x1f, 0x10, 0x0e, 0x1d, 0x1e, 0x24, 0x25, 0x28, 0x27, 0x4c, 0x21, 0x1e, 0x1e, 0x1d, 0x24, 0x24, 0x53, 0x24, 0x24, 0x1c, 0x1e, 0x1f, 0x22, 0x4b, 0x26, 0x29, 0x25, 0x24, 0x1d, 0x1a, 0x12, 0x0f, 0x1d, 0x23, 0x32, 0x45, 0x1e, 0x20, 0x0d, 0x0f, 0x0f, 0x10, 0x1d, 0x19, 0x4d, 0x2d, 0x21, 0x1d, 0x0f, 0x0f, 0x3a, 0x24, 0x25, 0x29, 0x29, 0x4a, 0x20, 0x1f, 0x1e, 0x1c, 0x24, 0x24, 0x53, 0x24, 0x24, 0x1d, 0x1e, 0x1e, 0x24, 0x47, 0x29, 0x28, 0x25, 0x24, 0x3b, 0x0e, 0x10, 0x1f, 0x20, 0x2d, 0x48, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, 0x10, 0x1d, 0x1f, 0x45, 0x01, 0x94, 0x12, 0x0e, 0x80, 0x0a, 0x05, 0x07, 0x16, 0x0d, 0x0c, 0x0a, 0x0a, 0x11, 0x05, 0x04, 0x09, 0x08, 0x05, 0x0d, 0xa2, 0x0d, 0x0a, 0xa5, 0x1e, 0x0d, 0x13, 0x13, 0x01, 0x09, 0x09, 0x26, 0x2f, 0x1a, 0x1d, 0x2d, 0x13, 0x0c, 0x11, 0x01, 0xba, 0x0e, 0x09, 0x60, 0x61, 0x0b, 0x14, 0x13, 0x01, 0x09, 0x09, 0x13, 0x13, 0x2f, 0x1a, 0x1c, 0x2e, 0x13, 0x0c, 0x05, 0x69, 0x12, 0x0f, 0x44, 0x44, 0x04, 0x09, 0x15, 0x0c, 0x0c, 0x0a, 0x0b, 0x09, 0x08, 0x04, 0x04, 0x01, 0x01, 0x0a, 0x07, 0x05, 0x03, 0x95, 0x0a, 0x0c, 0xa2, 0x0c, 0x06, 0x06, 0x0a, 0x01, 0x01, 0x04, 0x04, 0x11, 0x0b, 0x0a, 0x0c, 0x0c, 0x15, 0x08, 0x05, 0x0a, 0x80, 0x10, 0x11, 0x5f, 0x11, 0x0d, 0x12, 0x2e, 0x1c, 0x1a, 0x2f, 0x26, 0x09, 0x09, 0x01, 0x13, 0x13, 0x0c, 0x1e, 0xfd, 0xc8, 0x10, 0x11, 0x37, 0x37, 0x0b, 0x14, 0x2d, 0x1d, 0x1a, 0x2f, 0x13, 0x13, 0x09, 0x09, 0x01, 0x13, 0x14, 0x0c, 0x08, 0xb9, 0x09, 0x0d, 0x56, 0x56, 0x04, 0x09, 0x09, 0x04, 0x05, 0x08, 0x09, 0x0a, 0x0a, 0x0c, 0x0f, 0x14, 0x07, 0x05, 0x02, 0x01, 0x52, 0x4a, 0x1f, 0x21, 0x1a, 0x1a, 0x1b, 0x1b, 0x1a, 0x1a, 0x21, 0x1f, 0x4a, 0x20, 0x20, 0x1a, 0x1a, 0x1b, 0x1b, 0x1a, 0x1a, 0x20, 0x02, 0x13, 0x13, 0x18, 0x02, 0x09, 0x08, 0x09, 0x0a, 0x0b, 0x18, 0x0a, 0x0a, 0x09, 0x08, 0x09, 0x02, 0x18, 0x14, 0x13, 0x32, 0x09, 0x13, 0x13, 0x13, 0x18, 0x16, 0x36, 0x17, 0x17, 0x13, 0x14, 0x13, 0x09, 0x59, 0x14, 0x13, 0x1d, 0x1e, 0x13, 0x14, 0x13, 0x17, 0x17, 0x36, 0x16, 0x18, 0x13, 0x13, 0x13, 0x02, 0x38, 0x14, 0x14, 0x0d, 0x0d, 0x09, 0x08, 0x09, 0x0a, 0x0a, 0x18, 0x0b, 0x0a, 0x09, 0x0a, 0x07, 0x01, 0x02, 0x9a, 0x16, 0x16, 0x1c, 0x02, 0x0a, 0x0a, 0x0a, 0x0a, 0x0c, 0x1a, 0x0c, 0x0c, 0x0a, 0x08, 0x0a, 0x02, 0x1a, 0x16, 0x14, 0x38, 0x0a, 0x14, 0x16, 0x16, 0x1a, 0x18, 0x3c, 0x1a, 0x1a, 0x14, 0x16, 0x16, 0x0a, 0x64, 0x18, 0x14, 0x21, 0x21, 0x16, 0x16, 0x14, 0x1a, 0x1a, 0x3c, 0x18, 0x1a, 0x16, 0x16, 0x14, 0x02, 0x3e, 0x17, 0x15, 0x0e, 0x0e, 0x0a, 0x08, 0x0a, 0x0c, 0x0c, 0x0c, 0x0e, 0x0c, 0x0a, 0x0a, 0x0c, 0x08, 0x01, 0x22, 0x25, 0x55, 0x56, 0x2a, 0x29, 0x20, 0x21, 0x10, 0x10, 0x21, 0x24, 0x33, 0x52, 0x20, 0x1f, 0x12, 0x11, 0x11, 0x12, 0x1f, 0x20, 0x52, 0x33, 0x26, 0x1f, 0x10, 0x10, 0x21, 0x1c, 0x2d, 0x28, 0x2d, 0x25, 0x5a, 0x26, 0x20, 0x22, 0x23, 0x25, 0x28, 0x2e, 0x32, 0x24, 0x28, 0x20, 0x1e, 0x26, 0x26, 0x53, 0x2b, 0x2c, 0x29, 0x29, 0x41, 0x10, 0x10, 0x21, 0x24, 0x33, 0x52, 0x20, 0x1f, 0x12, 0x11, 0x11, 0x12, 0x1f, 0x20, 0x52, 0x33, 0x27, 0x1e, 0x10, 0x10, 0x41, 0x29, 0x29, 0x58, 0x54, 0x24, 0x22, 0x22, 0x23, 0x25, 0x28, 0x60, 0x24, 0x28, 0x20, 0x22, 0x20, 0xfe, 0x1c, 0x0b, 0x0d, 0xb4, 0x0d, 0x06, 0x08, 0x0a, 0x01, 0x01, 0x04, 0x05, 0x12, 0x0c, 0x0c, 0x0d, 0x0d, 0x18, 0x09, 0x06, 0x0a, 0x8e, 0x11, 0x13, 0x69, 0x13, 0x0e, 0x14, 0x33, 0x1f, 0x1d, 0x1b, 0x19, 0x2b, 0x14, 0x15, 0x14, 0x0e, 0x21, 0x02, 0x78, 0x12, 0x13, 0x3d, 0x3d, 0x0d, 0x15, 0x33, 0x1f, 0x1d, 0x1b, 0x19, 0x16, 0x15, 0x14, 0x15, 0x15, 0x0d, 0x09, 0xcd, 0x0c, 0x0e, 0x5f, 0x60, 0x05, 0x0b, 0x08, 0x01, 0x01, 0x04, 0x05, 0x09, 0x09, 0x0c, 0x0c, 0x0d, 0x10, 0x16, 0x09, 0x05, 0x02, 0xfe, 0x1d, 0x13, 0x11, 0x8e, 0x0a, 0x06, 0x08, 0x19, 0x0d, 0x0d, 0x0c, 0x0c, 0x12, 0x05, 0x04, 0x01, 0x01, 0x09, 0x09, 0x06, 0x0d, 0xb4, 0x0e, 0x0a, 0xb9, 0x21, 0x0e, 0x14, 0x15, 0x14, 0x2b, 0x19, 0x1b, 0x1d, 0x1f, 0x33, 0x14, 0x0e, 0x13, 0x01, 0xeb, 0x0f, 0x0b, 0x6b, 0x6b, 0x0d, 0x15, 0x15, 0x14, 0x15, 0x16, 0x19, 0x1b, 0x1d, 0x1f, 0x33, 0x15, 0x0d, 0x05, 0x75, 0x13, 0x12, 0x4b, 0x4a, 0x05, 0x0b, 0x17, 0x0d, 0x0d, 0x0c, 0x0c, 0x09, 0x09, 0x05, 0x04, 0x01, 0x01, 0x0a, 0x09, 0x05, 0x03, 0xdf, 0x0f, 0x10, 0x1c, 0x1f, 0x46, 0x29, 0x28, 0x47, 0x1e, 0x1c, 0x10, 0x0f, 0x0f, 0x10, 0x1c, 0x1e, 0x47, 0x28, 0x29, 0x46, 0x1f, 0x1c, 0x10, 0xfe, 0x24, 0x06, 0x02, 0xe4, 0x11, 0x08, 0x0b, 0x19, 0x0a, 0x09, 0x05, 0x05, 0x05, 0x05, 0x09, 0x0a, 0x17, 0x0d, 0x08, 0x11, 0xe4, 0x02, 0x06, 0xcd, 0x25, 0x13, 0x1d, 0x33, 0x16, 0x14, 0x0c, 0x0b, 0x0b, 0x0c, 0x14, 0x16, 0x33, 0x1d, 0x13, 0x25, 0x03, 0x1a, 0x02, 0x06, 0x77, 0x77, 0x12, 0x1e, 0x33, 0x16, 0x14, 0x0c, 0x0b, 0x0b, 0x0c, 0x14, 0x16, 0x33, 0x1e, 0x12, 0x09, 0xe5, 0x06, 0x02, 0x78, 0x79, 0x07, 0x0f, 0x16, 0x0a, 0x09, 0x05, 0x05, 0x05, 0x05, 0x09, 0x0c, 0x17, 0x0c, 0x07, 0x05, 0x00, 0x04, 0x00, 0x4d, 0xff, 0xe3, 0x05, 0xbb, 0x05, 0xf0, 0x00, 0x19, 0x00, 0x33, 0x00, 0x4e, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x36, 0x17, 0x03, 0x25, 0x13, 0x0d, 0x01, 0x03, 0x25, 0x1b, 0x01, 0x05, 0x03, 0x2d, 0x01, 0x13, 0x05, 0x03, 0x3b, 0x6e, 0x2e, 0x2f, 0x27, 0x27, 0x26, 0x26, 0x27, 0x27, 0x2f, 0x2e, 0x6e, 0x2e, 0x30, 0x26, 0x27, 0x27, 0x27, 0x27, 0x26, 0x30, 0x65, 0x4e, 0x3e, 0x45, 0x31, 0x33, 0x39, 0x37, 0x35, 0x34, 0x42, 0x41, 0x99, 0x3d, 0x46, 0x30, 0x33, 0x39, 0x37, 0x35, 0x33, 0x43, 0x41, 0x4a, 0x8b, 0x80, 0x78, 0x68, 0x65, 0x67, 0x63, 0x69, 0x63, 0x7d, 0x7f, 0xfe, 0xea, 0x80, 0x79, 0x67, 0x65, 0x68, 0x63, 0x6a, 0x61, 0x7f, 0x7e, 0x8c, 0x8d, 0xfe, 0xa5, 0x93, 0xfe, 0xa4, 0x01, 0x5c, 0x93, 0x01, 0x5b, 0x8d, 0x8e, 0x01, 0x5a, 0x93, 0x01, 0x5d, 0xfe, 0xa3, 0x93, 0xfe, 0xa6, 0x04, 0x13, 0x16, 0x18, 0x28, 0x2e, 0x68, 0x3c, 0x3b, 0x68, 0x2e, 0x28, 0x18, 0x16, 0x16, 0x18, 0x28, 0x2e, 0x68, 0x3b, 0x3c, 0x68, 0x2e, 0x28, 0x18, 0x86, 0x1f, 0x22, 0x36, 0x38, 0x96, 0x54, 0x4e, 0x96, 0x3b, 0x39, 0x1f, 0x1f, 0x1f, 0x22, 0x36, 0x38, 0x96, 0xa2, 0x96, 0x3b, 0x39, 0x1f, 0x1f, 0x01, 0x6d, 0x3b, 0x38, 0x72, 0x6f, 0xfe, 0xec, 0xa1, 0x98, 0xfe, 0xf0, 0x77, 0x70, 0x3a, 0x3b, 0x3b, 0x38, 0x72, 0x6f, 0x01, 0x14, 0x9c, 0x9d, 0x01, 0x10, 0x77, 0x6e, 0x3c, 0x3b, 0x08, 0xfe, 0x7d, 0xa3, 0xfe, 0x7f, 0x9e, 0x9d, 0xfe, 0x7f, 0xa3, 0xfe, 0x7d, 0x01, 0x83, 0xa3, 0x01, 0x81, 0x9d, 0x9e, 0x01, 0x81, 0xa3, 0x00, 0x00, 0x07, 0x00, 0x90, 0xff, 0xe3, 0x05, 0x77, 0x05, 0xf0, 0x00, 0x08, 0x00, 0x93, 0x00, 0x9c, 0x00, 0xa7, 0x00, 0xb2, 0x00, 0xc1, 0x00, 0xd0, 0x00, 0x00, 0x01, 0x11, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x13, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x15, 0x14, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3d, 0x01, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x1d, 0x01, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x11, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x25, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x01, 0x05, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x13, 0x25, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x0d, 0x01, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x23, 0x22, 0x03, 0x04, 0x26, 0x2c, 0x1b, 0x22, 0x32, 0x97, 0x10, 0x30, 0x5b, 0x1d, 0x21, 0x10, 0x0f, 0x51, 0x3f, 0x52, 0x11, 0x0a, 0x17, 0x27, 0x62, 0x12, 0x13, 0x33, 0x3b, 0x4b, 0x2a, 0x39, 0x43, 0x10, 0x4e, 0x39, 0x30, 0x4a, 0x4c, 0x4f, 0x46, 0x31, 0x3a, 0x4d, 0x10, 0x40, 0x3b, 0x2c, 0x49, 0x3c, 0x32, 0x14, 0x12, 0x63, 0x26, 0x16, 0x0a, 0x10, 0x53, 0x3f, 0x51, 0x0e, 0x10, 0x22, 0x1c, 0x5b, 0x30, 0x10, 0x10, 0x2e, 0x5b, 0x1d, 0x23, 0x10, 0x0e, 0x51, 0x3f, 0x51, 0x12, 0x0b, 0x17, 0x26, 0x63, 0x12, 0x14, 0x32, 0x3c, 0x4a, 0x2b, 0x38, 0x43, 0x10, 0x4d, 0x3a, 0x31, 0x4a, 0x97, 0x4a, 0x30, 0x39, 0x4e, 0x10, 0x40, 0x3c, 0x2c, 0x49, 0x3b, 0x33, 0x13, 0x12, 0x62, 0x27, 0x17, 0x0a, 0x11, 0x52, 0x3f, 0x51, 0x0f, 0x10, 0x22, 0x1e, 0x5b, 0x2e, 0x8e, 0x26, 0x2c, 0x1b, 0x21, 0x33, 0x9d, 0x01, 0x58, 0x13, 0x38, 0x09, 0x0b, 0x1c, 0x26, 0x3f, 0x17, 0x20, 0xfe, 0x53, 0xfe, 0xa9, 0x13, 0x37, 0x09, 0x0b, 0x1c, 0x27, 0x3f, 0x16, 0x21, 0x40, 0xfe, 0xa9, 0x0c, 0x04, 0x07, 0x35, 0x36, 0x2f, 0x0a, 0x08, 0x1a, 0x1b, 0x3a, 0x01, 0xa9, 0x01, 0x58, 0x0c, 0x05, 0x06, 0x35, 0x36, 0x30, 0x09, 0x08, 0x1a, 0x1b, 0x3b, 0x03, 0xd3, 0x01, 0xb9, 0x2b, 0x1a, 0x44, 0x51, 0x32, 0x4a, 0xfe, 0xb4, 0x0b, 0x20, 0x03, 0x01, 0x28, 0x35, 0x48, 0x2c, 0x27, 0x39, 0x2c, 0x4a, 0x1e, 0x06, 0x26, 0x30, 0x66, 0x89, 0x29, 0x0a, 0x14, 0x54, 0x7c, 0x5c, 0x60, 0x6a, 0x34, 0x4f, 0x4f, 0x37, 0x67, 0x60, 0x5c, 0x7c, 0x54, 0x14, 0x0a, 0x27, 0x8b, 0x67, 0x2f, 0x26, 0x06, 0x20, 0x48, 0x2c, 0x39, 0x27, 0x2c, 0x49, 0x34, 0x28, 0x01, 0x03, 0x20, 0x0b, 0x0b, 0x1f, 0x03, 0x01, 0x28, 0x33, 0x4a, 0x2c, 0x26, 0x39, 0x2d, 0x48, 0x20, 0x06, 0x26, 0x30, 0x66, 0x89, 0x29, 0x0a, 0x14, 0x54, 0x7c, 0x5c, 0x60, 0x6a, 0x34, 0x4f, 0x4f, 0x34, 0x6a, 0x60, 0x5c, 0x7c, 0x54, 0x14, 0x0a, 0x27, 0x8b, 0x67, 0x2f, 0x26, 0x06, 0x1e, 0x4a, 0x2c, 0x39, 0x27, 0x2c, 0x48, 0x35, 0x28, 0x01, 0x03, 0x1f, 0xf5, 0xfe, 0x47, 0x2b, 0x1a, 0x44, 0x51, 0x32, 0x4a, 0x01, 0xc1, 0xdd, 0x24, 0x15, 0x04, 0x19, 0x28, 0x3a, 0x55, 0xfe, 0xcd, 0xdd, 0x24, 0x15, 0x04, 0x19, 0x28, 0x3a, 0x55, 0x01, 0x33, 0xdd, 0x17, 0x21, 0x15, 0x18, 0x27, 0x22, 0x22, 0x01, 0x04, 0xfb, 0xdd, 0x17, 0x21, 0x15, 0x18, 0x27, 0x22, 0x22, 0x01, 0x04, 0x00, 0x01, 0x00, 0xa3, 0x00, 0x00, 0x05, 0x65, 0x05, 0xd5, 0x00, 0x41, 0x00, 0x00, 0x01, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x35, 0x33, 0x15, 0x17, 0x11, 0x27, 0x37, 0x17, 0x35, 0x33, 0x15, 0x37, 0x17, 0x07, 0x11, 0x37, 0x35, 0x33, 0x15, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x07, 0x17, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x15, 0x23, 0x35, 0x27, 0x11, 0x17, 0x07, 0x27, 0x15, 0x23, 0x35, 0x07, 0x27, 0x37, 0x11, 0x07, 0x15, 0x23, 0x35, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x02, 0x98, 0xd8, 0xae, 0x36, 0x78, 0xb0, 0x36, 0xb0, 0x6c, 0xd8, 0xae, 0x36, 0x78, 0x6c, 0x79, 0x36, 0xaf, 0xd8, 0x6c, 0xb1, 0x36, 0xb1, 0x79, 0x36, 0xaf, 0xd8, 0xd8, 0xaf, 0x36, 0x79, 0xb1, 0x36, 0xb1, 0x6c, 0xd8, 0xaf, 0x36, 0x79, 0x6c, 0x78, 0x36, 0xae, 0xd8, 0x6c, 0xb0, 0x36, 0xb0, 0x78, 0x36, 0xae, 0x02, 0xeb, 0x8a, 0x70, 0x68, 0x4d, 0x72, 0x68, 0x72, 0x9b, 0xe0, 0x8b, 0x01, 0x16, 0x6f, 0x68, 0x4d, 0xe3, 0xe3, 0x4d, 0x68, 0x6f, 0xfe, 0xeb, 0x8a, 0xe0, 0x9b, 0x72, 0x68, 0x72, 0x4d, 0x68, 0x70, 0x8a, 0x8b, 0x70, 0x68, 0x4d, 0x72, 0x68, 0x72, 0x9b, 0xe0, 0x8b, 0xfe, 0xea, 0x6f, 0x68, 0x4d, 0xe3, 0xe3, 0x4d, 0x68, 0x6f, 0x01, 0x16, 0x8b, 0xe0, 0x9b, 0x72, 0x68, 0x72, 0x4d, 0x68, 0x70, 0x00, 0x07, 0x00, 0x8c, 0x00, 0x00, 0x05, 0x7c, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x01, 0x33, 0x11, 0x25, 0x11, 0x37, 0x17, 0x07, 0x0d, 0x01, 0x17, 0x07, 0x27, 0x11, 0x25, 0x11, 0x23, 0x11, 0x05, 0x11, 0x07, 0x27, 0x37, 0x2d, 0x01, 0x27, 0x37, 0x17, 0x11, 0x05, 0x07, 0x15, 0x17, 0x35, 0x25, 0x07, 0x15, 0x37, 0x05, 0x07, 0x17, 0x37, 0x25, 0x07, 0x17, 0x37, 0x05, 0x07, 0x15, 0x3f, 0x01, 0x15, 0x17, 0x35, 0x02, 0xce, 0x6c, 0x01, 0x06, 0xef, 0x36, 0xf0, 0x01, 0x07, 0xfe, 0xfa, 0xef, 0x36, 0xef, 0xfe, 0xfa, 0x6c, 0xfe, 0xfa, 0xee, 0x36, 0xee, 0xfe, 0xfa, 0x01, 0x07, 0xef, 0x36, 0xee, 0x01, 0x06, 0x9a, 0x9a, 0x01, 0x06, 0x9a, 0x9a, 0xfe, 0x2b, 0x9b, 0x9a, 0x9a, 0x01, 0x71, 0x99, 0x9a, 0x9a, 0xfe, 0x2a, 0x9a, 0x9a, 0x6c, 0x9a, 0x05, 0xd5, 0xfe, 0xcc, 0xa9, 0xfe, 0xb0, 0x9a, 0x68, 0x9a, 0xa8, 0xa8, 0x99, 0x68, 0x9a, 0xfe, 0xaf, 0xa9, 0xfe, 0xcd, 0x01, 0x33, 0xa9, 0x01, 0x51, 0x9a, 0x68, 0x99, 0xa8, 0xa8, 0x9a, 0x68, 0x9a, 0x01, 0x50, 0xa9, 0x27, 0xc5, 0x63, 0xc5, 0x63, 0x63, 0xc5, 0x63, 0x68, 0x63, 0x62, 0x62, 0x63, 0x63, 0x62, 0x62, 0x67, 0x63, 0xc6, 0x63, 0xc6, 0xc6, 0x63, 0xc6, 0x00, 0x00, 0x00, 0x01, 0x00, 0x75, 0x00, 0x04, 0x05, 0x92, 0x05, 0xd5, 0x00, 0x41, 0x00, 0x00, 0x01, 0x33, 0x15, 0x37, 0x17, 0x07, 0x11, 0x37, 0x11, 0x33, 0x15, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x07, 0x17, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x15, 0x23, 0x11, 0x27, 0x11, 0x17, 0x07, 0x27, 0x15, 0x23, 0x35, 0x07, 0x27, 0x37, 0x11, 0x07, 0x11, 0x23, 0x35, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x27, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x35, 0x33, 0x11, 0x17, 0x11, 0x27, 0x37, 0x17, 0x02, 0xce, 0x6c, 0x7e, 0x5a, 0xd8, 0xf1, 0xb4, 0x50, 0x36, 0x52, 0x7e, 0x5a, 0xd8, 0xf0, 0xf1, 0xd8, 0x5a, 0x7e, 0x50, 0x36, 0x53, 0xb4, 0xed, 0xd8, 0x5a, 0x7e, 0x6c, 0x7e, 0x5a, 0xd8, 0xee, 0xb4, 0x52, 0x36, 0x4f, 0x7e, 0x5a, 0xd8, 0xf0, 0xee, 0xd8, 0x5a, 0x7e, 0x53, 0x36, 0x50, 0xb4, 0xf2, 0xd8, 0x5a, 0x7e, 0x05, 0xd5, 0x68, 0x51, 0xad, 0x8b, 0xfe, 0xce, 0x9b, 0x01, 0x15, 0xa2, 0x34, 0x68, 0x35, 0x51, 0xad, 0x8a, 0x99, 0x9b, 0x8b, 0xad, 0x51, 0x34, 0x68, 0x35, 0xa1, 0x01, 0x15, 0x98, 0xfe, 0xd0, 0x8b, 0xad, 0x51, 0x68, 0x65, 0x51, 0xad, 0x8b, 0x01, 0x35, 0x99, 0xfe, 0xeb, 0xa1, 0x35, 0x68, 0x33, 0x51, 0xae, 0x8b, 0x9a, 0x99, 0x8b, 0xad, 0x51, 0x35, 0x68, 0x33, 0xa1, 0xfe, 0xeb, 0x9b, 0x01, 0x36, 0x8b, 0xad, 0x51, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x90, 0xff, 0xe5, 0x05, 0x78, 0x05, 0xf0, 0x00, 0x87, 0x00, 0x00, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x07, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x27, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x0e, 0x01, 0x22, 0x2e, 0x01, 0x34, 0x36, 0x37, 0x36, 0x37, 0x11, 0x07, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x37, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x17, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x36, 0x37, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x37, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x05, 0x5f, 0x19, 0x19, 0x18, 0x29, 0x2b, 0x2f, 0x31, 0x29, 0x12, 0x0f, 0xd9, 0xd9, 0x0f, 0x12, 0x29, 0x31, 0x2f, 0x2b, 0x29, 0x18, 0x19, 0x19, 0x19, 0x28, 0x2b, 0x2f, 0x2e, 0x2c, 0x2b, 0x18, 0x17, 0x03, 0xd9, 0x13, 0x11, 0x2a, 0x30, 0x30, 0x53, 0x61, 0x53, 0x31, 0x31, 0x29, 0x11, 0x13, 0xd9, 0x04, 0x17, 0x19, 0x2a, 0x2a, 0x30, 0x31, 0x29, 0x29, 0x19, 0x18, 0x18, 0x19, 0x29, 0x2a, 0x60, 0x2a, 0x11, 0x0f, 0xd9, 0xd9, 0x0e, 0x12, 0x2c, 0x2e, 0x31, 0x52, 0x31, 0x18, 0x19, 0x29, 0x2a, 0x30, 0x2e, 0x2c, 0x2a, 0x19, 0x17, 0x04, 0xd9, 0x13, 0x11, 0x29, 0x31, 0x31, 0x29, 0x2a, 0x30, 0x31, 0x53, 0x30, 0x30, 0x2a, 0x11, 0x13, 0xd9, 0x03, 0x17, 0x17, 0x2c, 0x29, 0x31, 0x2f, 0x2b, 0x2d, 0x04, 0x6d, 0x36, 0x2e, 0x35, 0x2f, 0x2e, 0x1b, 0x1b, 0x1b, 0x0b, 0x0f, 0x8b, 0x8c, 0x0f, 0x0b, 0x1b, 0x1b, 0x1b, 0x2e, 0x2f, 0x35, 0x34, 0x2f, 0x2f, 0x1b, 0x1b, 0x1b, 0x1a, 0x2f, 0x2e, 0x36, 0x16, 0x15, 0x8c, 0xfe, 0xe9, 0x07, 0x0b, 0x1b, 0x5c, 0x6c, 0x5c, 0x36, 0x36, 0x5c, 0x6c, 0x5c, 0x1b, 0x0b, 0x07, 0x01, 0x17, 0x8c, 0x15, 0x16, 0x36, 0x2e, 0x2f, 0x1a, 0x1b, 0x1b, 0x1a, 0x2f, 0x2e, 0x36, 0x35, 0x2f, 0x2e, 0x1b, 0x1b, 0x1b, 0x0b, 0x0f, 0x8c, 0x8b, 0x0f, 0x0b, 0x1b, 0x36, 0x5c, 0x6c, 0x2e, 0x2f, 0x1a, 0x1b, 0x1b, 0x1a, 0x2f, 0x2e, 0x36, 0x16, 0x15, 0x8c, 0x01, 0x17, 0x07, 0x0b, 0x1b, 0x5c, 0x6c, 0x5c, 0x1b, 0x1b, 0x36, 0x5c, 0x6c, 0x5c, 0x1b, 0x0b, 0x07, 0xfe, 0xe9, 0x8c, 0x15, 0x16, 0x36, 0x2e, 0x2d, 0x1c, 0x1b, 0x1b, 0x1e, 0x00, 0x00, 0x09, 0x00, 0x57, 0xff, 0xe5, 0x05, 0xb2, 0x05, 0xd7, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x2e, 0x00, 0x45, 0x00, 0x5c, 0x00, 0x73, 0x00, 0x00, 0x00, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x09, 0x01, 0x37, 0x09, 0x02, 0x37, 0x09, 0x02, 0x27, 0x09, 0x02, 0x27, 0x01, 0x13, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x05, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0x8b, 0x4f, 0x70, 0x4f, 0x4f, 0x70, 0x01, 0x7d, 0xfe, 0xa3, 0x4d, 0x01, 0x5c, 0xfd, 0x59, 0xfe, 0xa5, 0x4d, 0x01, 0x5a, 0x02, 0x5b, 0xfe, 0xa4, 0x4d, 0x01, 0x5d, 0xfd, 0xf1, 0xfe, 0xa6, 0x4d, 0x01, 0x5b, 0xa6, 0x33, 0x0e, 0x14, 0x04, 0x01, 0x02, 0x03, 0x0d, 0x15, 0x67, 0x14, 0x0e, 0x02, 0x02, 0x01, 0x03, 0x15, 0x0d, 0x34, 0x34, 0x0d, 0x15, 0x03, 0x01, 0x02, 0x02, 0x0e, 0x14, 0x67, 0x15, 0x0d, 0x03, 0x02, 0x01, 0x04, 0x14, 0x0e, 0x8f, 0x36, 0x16, 0x21, 0x3d, 0x1a, 0x4a, 0x3e, 0x1b, 0x3b, 0x1d, 0x2c, 0x2c, 0x1d, 0x3b, 0x1b, 0x3e, 0x4a, 0x1a, 0x3d, 0x21, 0x16, 0x01, 0xbb, 0x36, 0x15, 0x22, 0x3d, 0x1a, 0x4a, 0x3e, 0x1b, 0x3a, 0x1d, 0x2c, 0x2c, 0x1d, 0x3a, 0x1b, 0x3e, 0x4a, 0x1a, 0x3d, 0x22, 0x15, 0x03, 0x2c, 0x7c, 0x58, 0x58, 0x7c, 0x58, 0xfd, 0x2e, 0x01, 0x84, 0x55, 0xfe, 0x7c, 0x02, 0x4a, 0x01, 0x81, 0x55, 0xfe, 0x7e, 0x01, 0x2d, 0xfe, 0x7c, 0x55, 0x01, 0x84, 0xfd, 0x0d, 0xfe, 0x7e, 0x55, 0x01, 0x81, 0x01, 0x2e, 0x3c, 0x18, 0x25, 0x44, 0x1d, 0x52, 0x45, 0x1e, 0x41, 0x20, 0x31, 0x31, 0x20, 0x41, 0x1e, 0x45, 0x52, 0x1d, 0x44, 0x25, 0x18, 0xfe, 0x14, 0x3c, 0x18, 0x25, 0x44, 0x1d, 0x52, 0x45, 0x1e, 0x41, 0x20, 0x31, 0x31, 0x20, 0x41, 0x1e, 0x45, 0x52, 0x1d, 0x44, 0x25, 0x18, 0x01, 0x14, 0x39, 0x0f, 0x17, 0x04, 0x01, 0x02, 0x03, 0x0f, 0x17, 0x72, 0x17, 0x0f, 0x03, 0x02, 0x01, 0x04, 0x17, 0x0f, 0x39, 0x39, 0x0f, 0x17, 0x04, 0x01, 0x02, 0x03, 0x0f, 0x17, 0x72, 0x17, 0x0f, 0x03, 0x02, 0x01, 0x04, 0x17, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x57, 0xff, 0xe5, 0x05, 0xb2, 0x05, 0xd7, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x2b, 0x00, 0x3f, 0x00, 0x53, 0x00, 0x67, 0x00, 0x00, 0x00, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x09, 0x01, 0x17, 0x09, 0x02, 0x17, 0x09, 0x02, 0x07, 0x09, 0x02, 0x07, 0x01, 0x02, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x12, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x24, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x03, 0xcf, 0x77, 0xa8, 0x76, 0x76, 0xa8, 0xfd, 0xab, 0x01, 0x0b, 0x4d, 0xfe, 0xf5, 0x02, 0x5d, 0x01, 0x0c, 0x4c, 0xfe, 0xf5, 0xfd, 0x56, 0x01, 0x0b, 0x4d, 0xfe, 0xf5, 0x02, 0xf7, 0x01, 0x0b, 0x4c, 0xfe, 0xf4, 0x07, 0x11, 0x13, 0x23, 0x29, 0x63, 0x2a, 0x23, 0x13, 0x11, 0x11, 0x13, 0x23, 0x2a, 0x63, 0x29, 0x23, 0x13, 0x11, 0x11, 0x13, 0x23, 0x29, 0x63, 0x2a, 0x23, 0x13, 0x11, 0x11, 0x13, 0x23, 0x2a, 0x63, 0x29, 0x23, 0x13, 0xfd, 0x63, 0x65, 0x2c, 0x32, 0x1f, 0x24, 0x24, 0x1f, 0x32, 0x2c, 0x65, 0x2c, 0x31, 0x20, 0x24, 0x24, 0x20, 0x31, 0x03, 0xdf, 0x65, 0x2c, 0x32, 0x1f, 0x24, 0x24, 0x1f, 0x32, 0x2c, 0x65, 0x2c, 0x31, 0x20, 0x24, 0x24, 0x20, 0x31, 0x03, 0x4b, 0xba, 0x84, 0x84, 0xba, 0x84, 0xfd, 0x38, 0x01, 0x29, 0x55, 0xfe, 0xd7, 0x03, 0x4c, 0x01, 0x29, 0x55, 0xfe, 0xd7, 0x01, 0x7e, 0xfe, 0xd7, 0x55, 0x01, 0x29, 0xfd, 0x5e, 0xfe, 0xd7, 0x55, 0x01, 0x29, 0x03, 0x49, 0x70, 0x31, 0x37, 0x23, 0x28, 0x28, 0x23, 0x37, 0x31, 0x70, 0x31, 0x37, 0x23, 0x28, 0x28, 0x23, 0x37, 0xfb, 0xb3, 0x70, 0x31, 0x37, 0x23, 0x28, 0x28, 0x23, 0x37, 0x31, 0x70, 0x31, 0x37, 0x23, 0x28, 0x28, 0x23, 0x37, 0x02, 0x59, 0x13, 0x15, 0x27, 0x2e, 0x6e, 0x2e, 0x27, 0x15, 0x13, 0x13, 0x15, 0x27, 0x2e, 0x6e, 0x2e, 0x27, 0x15, 0x13, 0x13, 0x15, 0x27, 0x2e, 0x6e, 0x2e, 0x27, 0x15, 0x13, 0x13, 0x15, 0x27, 0x2e, 0x6e, 0x2e, 0x27, 0x15, 0x00, 0x00, 0x00, 0x09, 0x00, 0x4b, 0xff, 0xe5, 0x05, 0xbd, 0x05, 0xf2, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x25, 0x00, 0x32, 0x00, 0x3f, 0x00, 0x4b, 0x00, 0x57, 0x00, 0x5f, 0x00, 0x6b, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x25, 0x35, 0x25, 0x33, 0x32, 0x17, 0x16, 0x05, 0x34, 0x36, 0x3b, 0x01, 0x05, 0x15, 0x05, 0x23, 0x22, 0x27, 0x26, 0x01, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x01, 0x27, 0x13, 0x37, 0x36, 0x33, 0x32, 0x01, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x01, 0x17, 0x03, 0x07, 0x06, 0x23, 0x22, 0x03, 0x36, 0x33, 0x32, 0x1f, 0x01, 0x13, 0x07, 0x01, 0x27, 0x26, 0x35, 0x34, 0x01, 0x06, 0x22, 0x2f, 0x01, 0x03, 0x37, 0x01, 0x17, 0x16, 0x15, 0x14, 0x00, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x03, 0x23, 0x03, 0x35, 0x34, 0x37, 0x12, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x02, 0x22, 0x27, 0x26, 0x3d, 0x01, 0x13, 0x33, 0x13, 0x15, 0x14, 0x07, 0x05, 0xbd, 0x19, 0x1a, 0x24, 0x09, 0xfe, 0x8a, 0x01, 0x76, 0x09, 0x23, 0x1b, 0x19, 0xfa, 0x8f, 0x32, 0x24, 0x09, 0x01, 0x76, 0xfe, 0x8a, 0x09, 0x22, 0x1b, 0x19, 0x04, 0xa5, 0x1b, 0x19, 0x06, 0xfe, 0xd8, 0x40, 0xe8, 0x06, 0x1a, 0x25, 0x25, 0xfc, 0x40, 0x1a, 0x18, 0x07, 0x01, 0x28, 0x40, 0xe9, 0x06, 0x19, 0x25, 0x24, 0x1c, 0x1a, 0x26, 0x24, 0x1a, 0x06, 0xe9, 0x40, 0xfe, 0xd8, 0x07, 0x18, 0x03, 0xf4, 0x1b, 0x49, 0x1a, 0x06, 0xe8, 0x40, 0x01, 0x28, 0x06, 0x19, 0xfd, 0xd3, 0x4a, 0x1b, 0x1a, 0x2d, 0x5a, 0x2d, 0x1a, 0xc7, 0x4f, 0x70, 0x4f, 0x4f, 0x70, 0x13, 0x4a, 0x1b, 0x1a, 0x2d, 0x5a, 0x2d, 0x1a, 0x02, 0xec, 0x2a, 0x1e, 0x1c, 0x32, 0x64, 0x32, 0x1e, 0x1e, 0x28, 0x28, 0x3c, 0x32, 0x64, 0x32, 0x1c, 0x1e, 0x02, 0x4d, 0x1d, 0x2a, 0x27, 0x1d, 0x07, 0xfe, 0xfe, 0x46, 0x01, 0x49, 0x07, 0x1c, 0xfb, 0x9b, 0x1d, 0x2a, 0x27, 0x1d, 0x07, 0x01, 0x02, 0x46, 0xfe, 0xb7, 0x07, 0x1c, 0x04, 0x65, 0x1e, 0x1c, 0x07, 0xfe, 0xb7, 0x46, 0x01, 0x02, 0x07, 0x1b, 0x29, 0x2a, 0xfb, 0xd6, 0x1e, 0x1c, 0x07, 0x01, 0x49, 0x46, 0xfe, 0xfe, 0x07, 0x1b, 0x29, 0x2a, 0x05, 0x0d, 0x1d, 0x1c, 0x28, 0x0a, 0xfe, 0x61, 0x01, 0x9f, 0x0a, 0x27, 0x1d, 0xfd, 0x55, 0x7c, 0x58, 0x58, 0x7c, 0x58, 0xfc, 0x63, 0x1d, 0x1c, 0x28, 0x0a, 0x01, 0x9f, 0xfe, 0x61, 0x0a, 0x27, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4b, 0xff, 0xe5, 0x05, 0xbd, 0x05, 0xf2, 0x00, 0x6c, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x03, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x25, 0x36, 0x33, 0x32, 0x17, 0x16, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x25, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x03, 0x13, 0x16, 0x15, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x13, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x05, 0x06, 0x23, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x05, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x16, 0x17, 0x16, 0x17, 0x01, 0x03, 0x26, 0x35, 0x34, 0x37, 0x36, 0x03, 0x04, 0x27, 0x2a, 0x20, 0x05, 0x46, 0x01, 0x00, 0x12, 0x02, 0x2f, 0x2d, 0x3c, 0x1b, 0x1b, 0x2e, 0x09, 0x17, 0xfe, 0xa2, 0x01, 0xaf, 0x17, 0x0a, 0x45, 0x1e, 0x2a, 0x2a, 0x20, 0x43, 0x06, 0x21, 0xfe, 0x57, 0x01, 0x63, 0x19, 0x02, 0x2e, 0x1b, 0x1b, 0x3c, 0x27, 0x35, 0x09, 0x10, 0xfb, 0x46, 0x05, 0x20, 0x2a, 0x4d, 0x2b, 0x1f, 0x04, 0x46, 0xfb, 0x10, 0x09, 0x2f, 0x2d, 0x3b, 0x1c, 0x1b, 0x2f, 0x02, 0x19, 0x01, 0x62, 0xfe, 0x58, 0x22, 0x06, 0x43, 0x20, 0x29, 0x29, 0x1f, 0x44, 0x0b, 0x16, 0x01, 0xaf, 0xfe, 0xa2, 0x16, 0x09, 0x2f, 0x1b, 0x1c, 0x3b, 0x21, 0x3b, 0x02, 0x13, 0x00, 0xff, 0x46, 0x04, 0x1f, 0x2a, 0x05, 0xf2, 0x2f, 0x23, 0x4a, 0x07, 0x1f, 0xfe, 0x22, 0x01, 0x89, 0x1d, 0x01, 0x35, 0x1f, 0x1e, 0x43, 0x37, 0x2f, 0x09, 0x12, 0xfe, 0xe9, 0x4e, 0x04, 0x22, 0x2e, 0x58, 0x2e, 0x24, 0x06, 0x4d, 0xfe, 0xe5, 0x16, 0x01, 0x35, 0x31, 0x43, 0x1e, 0x1f, 0x35, 0x09, 0x19, 0x01, 0x85, 0xfe, 0x22, 0x1f, 0x07, 0x4a, 0x23, 0x2f, 0x2f, 0x23, 0x4a, 0x0e, 0x1e, 0x01, 0xd8, 0xfe, 0x7b, 0x19, 0x09, 0x35, 0x1f, 0x1e, 0x43, 0x4c, 0x1a, 0x01, 0x16, 0x01, 0x1b, 0x4d, 0x06, 0x24, 0x2e, 0x58, 0x2e, 0x22, 0x04, 0x4e, 0x01, 0x17, 0x12, 0x09, 0x35, 0x31, 0x43, 0x1e, 0x1f, 0x14, 0x21, 0x01, 0x1d, 0xfe, 0x77, 0x01, 0xd8, 0x1e, 0x0e, 0x4a, 0x23, 0x2f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5b, 0xff, 0xec, 0x06, 0x19, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x23, 0x00, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x01, 0x06, 0x23, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x17, 0x36, 0x33, 0x32, 0x04, 0x12, 0x15, 0x10, 0x00, 0x21, 0x22, 0xa6, 0x01, 0x68, 0x00, 0xff, 0x01, 0x00, 0x01, 0x67, 0xa4, 0xfe, 0xd9, 0x9c, 0x9b, 0xfe, 0xd8, 0xa4, 0x02, 0x93, 0x16, 0x17, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0x17, 0x16, 0x17, 0x16, 0xae, 0x01, 0x4c, 0xb9, 0xfe, 0x6b, 0xfe, 0xe2, 0x16, 0x02, 0xea, 0xfe, 0xe4, 0xfe, 0x70, 0x01, 0x90, 0x01, 0x1c, 0xb3, 0x01, 0x47, 0xb1, 0xb1, 0xfe, 0xb9, 0xfc, 0x51, 0x02, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0x02, 0x02, 0xc6, 0xfe, 0x90, 0xc8, 0xfe, 0xc1, 0xfe, 0x41, 0x00, 0x02, 0x00, 0x6d, 0xff, 0x9c, 0x06, 0x07, 0x05, 0xd4, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x17, 0x23, 0x11, 0x21, 0x15, 0x33, 0x11, 0x21, 0x05, 0x62, 0xfb, 0x56, 0x10, 0x5a, 0x05, 0x3f, 0x5a, 0xfa, 0xc1, 0x53, 0x05, 0x2e, 0xfa, 0xd2, 0x53, 0x05, 0xd4, 0x64, 0xfa, 0x2c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x00, 0x06, 0x07, 0x06, 0x38, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x25, 0x15, 0x21, 0x11, 0x33, 0x35, 0x21, 0x11, 0x05, 0x62, 0xfb, 0x56, 0x04, 0xf5, 0xfa, 0xc1, 0x5a, 0x05, 0x3f, 0x53, 0x05, 0x2e, 0xfa, 0xd2, 0x11, 0x64, 0x05, 0xd4, 0x64, 0xfa, 0x2c, 0x00, 0x00, 0x02, 0x00, 0x6d, 0xff, 0x9c, 0x06, 0x07, 0x05, 0xd4, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x07, 0x11, 0x21, 0x17, 0x11, 0x21, 0x05, 0x62, 0xfb, 0x56, 0x4a, 0x05, 0x3f, 0x5a, 0xfa, 0xdc, 0x53, 0x05, 0x2e, 0xfa, 0xd2, 0x53, 0x05, 0xd4, 0x82, 0xfa, 0x4a, 0x00, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x00, 0x06, 0x07, 0x06, 0x38, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x05, 0x21, 0x11, 0x37, 0x21, 0x11, 0x05, 0x62, 0xfb, 0x56, 0x04, 0xf5, 0xfa, 0xc1, 0x75, 0x05, 0x24, 0x53, 0x05, 0x2e, 0xfa, 0xd2, 0x53, 0x05, 0xd4, 0x64, 0xfa, 0x4a, 0x00, 0x04, 0x00, 0x99, 0xff, 0xfb, 0x05, 0xdc, 0x05, 0xd3, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x09, 0x0e, 0x99, 0x01, 0x31, 0x01, 0x31, 0xfe, 0xcf, 0x01, 0xaf, 0x01, 0x32, 0x01, 0x30, 0xfe, 0xd0, 0xfd, 0x60, 0x01, 0x31, 0x01, 0x31, 0xfe, 0xcf, 0xfe, 0xcf, 0x01, 0x31, 0x01, 0x31, 0xfe, 0xcf, 0x02, 0xe9, 0x01, 0x53, 0xfe, 0xad, 0xfe, 0xad, 0x01, 0x53, 0x01, 0x52, 0xfe, 0xae, 0xfe, 0xab, 0x02, 0xea, 0x01, 0x55, 0xfe, 0xab, 0xfe, 0xae, 0xfe, 0x22, 0x01, 0x53, 0xfe, 0xad, 0xfe, 0xad, 0x00, 0x00, 0x00, 0x01, 0x02, 0xb7, 0xfe, 0x14, 0x03, 0x51, 0x06, 0x14, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x03, 0x51, 0x99, 0x06, 0x14, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x02, 0x6b, 0xfe, 0x14, 0x03, 0x9e, 0x06, 0x14, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x03, 0x9d, 0xfe, 0xce, 0x06, 0x14, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x01, 0x01, 0xd2, 0xfe, 0x14, 0x04, 0x37, 0x06, 0x14, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x04, 0x36, 0xfd, 0x9c, 0x06, 0x14, 0xf8, 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x9c, 0x03, 0x28, 0x01, 0xe6, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x11, 0x13, 0x33, 0x03, 0x33, 0x01, 0xe6, 0xfe, 0xb7, 0x93, 0x74, 0x4a, 0x8c, 0x03, 0x28, 0x01, 0x6e, 0x01, 0x3f, 0xfe, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6c, 0x03, 0x28, 0x01, 0xb6, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x13, 0x21, 0x11, 0x03, 0x23, 0x13, 0x23, 0x6c, 0x01, 0x49, 0x93, 0x74, 0x4a, 0x8c, 0x05, 0xd5, 0xfe, 0x92, 0xfe, 0xc1, 0x01, 0x3f, 0xff, 0xff, 0x00, 0x9c, 0x03, 0x28, 0x03, 0x74, 0x05, 0xd5, 0x10, 0x26, 0x0c, 0x34, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x34, 0x01, 0x8e, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6c, 0x03, 0x28, 0x03, 0x44, 0x05, 0xd5, 0x10, 0x26, 0x0c, 0x35, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x35, 0x01, 0x8e, 0x00, 0x00, 0x00, 0x02, 0x01, 0x1e, 0xff, 0x42, 0x05, 0x8f, 0x06, 0xcf, 0x00, 0x44, 0x00, 0x48, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x11, 0x21, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x21, 0x35, 0x37, 0x15, 0x21, 0x07, 0x23, 0x11, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x01, 0x11, 0x23, 0x11, 0x02, 0x94, 0x1c, 0x17, 0x18, 0x14, 0x13, 0x15, 0x15, 0x13, 0x14, 0x18, 0x17, 0x18, 0x19, 0x11, 0x11, 0x0f, 0x0f, 0x0e, 0x11, 0x0e, 0x12, 0x0f, 0x15, 0x56, 0x38, 0x41, 0x29, 0x31, 0x2f, 0xfe, 0xec, 0xc8, 0xe4, 0xea, 0xc2, 0x01, 0x14, 0x7f, 0x01, 0x32, 0x7e, 0xb4, 0x48, 0x38, 0x3c, 0x48, 0x46, 0xa0, 0x3d, 0x40, 0x28, 0x2d, 0x2a, 0x2c, 0x2b, 0x22, 0x3d, 0x33, 0x01, 0x7e, 0xab, 0x01, 0xd0, 0x0b, 0x0c, 0x15, 0x14, 0x38, 0x1f, 0x1e, 0x38, 0x14, 0x15, 0x0c, 0x0b, 0x09, 0x08, 0x10, 0x10, 0x27, 0x2e, 0x2a, 0x0e, 0x12, 0x06, 0x09, 0x1b, 0x21, 0x2d, 0x38, 0x81, 0x44, 0x01, 0x5f, 0xee, 0xb8, 0xbe, 0xe8, 0xc8, 0x32, 0xfa, 0x7b, 0xfb, 0xdb, 0x6a, 0xb7, 0x40, 0x46, 0x27, 0x25, 0x19, 0x1a, 0x2e, 0x33, 0x72, 0x40, 0x4d, 0x64, 0x37, 0x2b, 0x1d, 0x18, 0x01, 0x34, 0x02, 0x56, 0xfd, 0xaa, 0x00, 0x00, 0x02, 0x01, 0x74, 0xff, 0xdd, 0x04, 0x94, 0x05, 0xf0, 0x00, 0x15, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x07, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x12, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x03, 0x04, 0x90, 0x6d, 0x26, 0x27, 0x23, 0x23, 0x7b, 0xa0, 0x75, 0x78, 0x9d, 0x7a, 0x23, 0x22, 0x21, 0x2c, 0x54, 0x71, 0x70, 0x2f, 0x2f, 0x28, 0x29, 0x26, 0x26, 0x29, 0x28, 0x2f, 0x2f, 0x70, 0x2e, 0x30, 0x28, 0x28, 0x27, 0x27, 0x28, 0x28, 0x30, 0x05, 0xf0, 0x28, 0x0e, 0x2b, 0x26, 0x61, 0x34, 0x7c, 0x64, 0x83, 0xce, 0xce, 0x83, 0x66, 0x7a, 0x34, 0x61, 0x26, 0x24, 0x15, 0x28, 0xfc, 0x46, 0x16, 0x18, 0x2a, 0x2e, 0x6a, 0x3d, 0x3c, 0x6a, 0x2e, 0x2a, 0x18, 0x16, 0x16, 0x18, 0x2a, 0x2e, 0x6a, 0x3c, 0x3d, 0x6a, 0x2e, 0x2a, 0x18, 0x00, 0x02, 0x01, 0x2c, 0xff, 0xdd, 0x04, 0xdc, 0x05, 0xf0, 0x00, 0x21, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x02, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x03, 0x04, 0x6e, 0xef, 0x7a, 0x23, 0x22, 0x21, 0x2c, 0x29, 0x61, 0x29, 0x2b, 0x22, 0x21, 0x24, 0x24, 0x22, 0x22, 0x2a, 0x29, 0x62, 0x28, 0x2c, 0x21, 0x23, 0x23, 0x7b, 0xef, 0xa6, 0x70, 0x2f, 0x2f, 0x28, 0x29, 0x26, 0x26, 0x29, 0x28, 0x2f, 0x2f, 0x70, 0x2e, 0x30, 0x28, 0x28, 0x27, 0x27, 0x28, 0x28, 0x30, 0x02, 0xad, 0xc4, 0xa1, 0x53, 0x83, 0x34, 0x61, 0x26, 0x24, 0x15, 0x14, 0x14, 0x14, 0x25, 0x25, 0x60, 0x36, 0x36, 0x60, 0x25, 0x25, 0x14, 0x14, 0x14, 0x15, 0x24, 0x26, 0x61, 0x34, 0x84, 0x52, 0xa1, 0xfe, 0xc5, 0x16, 0x18, 0x2a, 0x2e, 0x6a, 0x3d, 0x3c, 0x6a, 0x2e, 0x2a, 0x18, 0x16, 0x16, 0x18, 0x2a, 0x2e, 0x6a, 0x3c, 0x3d, 0x6a, 0x2e, 0x2a, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x00, 0xab, 0x05, 0xa6, 0x05, 0x28, 0x00, 0x21, 0x00, 0x00, 0x25, 0x26, 0x25, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x04, 0x03, 0x04, 0x7b, 0xfe, 0x89, 0xaf, 0x31, 0x32, 0x30, 0x3e, 0x3a, 0x8b, 0x3a, 0x3e, 0x30, 0x30, 0x33, 0x34, 0x2f, 0x31, 0x3d, 0x3b, 0x8a, 0x3b, 0x3e, 0x2f, 0x32, 0x31, 0xae, 0xfe, 0x89, 0xab, 0xef, 0xf2, 0x71, 0xb2, 0x4b, 0x8a, 0x36, 0x34, 0x1e, 0x1c, 0x1c, 0x1d, 0x35, 0x34, 0x89, 0x4e, 0x4e, 0x89, 0x34, 0x35, 0x1d, 0x1c, 0x1c, 0x1e, 0x34, 0x36, 0x8a, 0x4b, 0xb4, 0x6f, 0xf2, 0x00, 0x00, 0x01, 0x01, 0x35, 0xff, 0xfe, 0x05, 0x3f, 0x05, 0xd6, 0x00, 0x23, 0x00, 0x00, 0x01, 0x06, 0x03, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x12, 0x05, 0x3f, 0xd6, 0xda, 0x67, 0xa0, 0x43, 0x7c, 0x30, 0x2f, 0x1b, 0x19, 0x19, 0x19, 0x31, 0x2e, 0x7b, 0x46, 0x46, 0x7b, 0x2e, 0x31, 0x19, 0x19, 0x19, 0x1b, 0x2f, 0x30, 0x7c, 0x43, 0xa2, 0x65, 0xda, 0x02, 0xea, 0x8a, 0xfe, 0x60, 0xc2, 0x36, 0x38, 0x34, 0x46, 0x40, 0x4e, 0x4c, 0x42, 0x44, 0x36, 0x34, 0x3a, 0x38, 0x36, 0x36, 0x44, 0x40, 0x4e, 0x4c, 0x42, 0x44, 0x36, 0x36, 0x38, 0xc2, 0xfe, 0x5e, 0x00, 0x02, 0x00, 0x71, 0x00, 0x2a, 0x05, 0x37, 0x05, 0x9e, 0x00, 0x0d, 0x00, 0x69, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x06, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x05, 0x06, 0x15, 0x14, 0x33, 0x32, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x21, 0x22, 0x27, 0x26, 0x35, 0x10, 0x33, 0x32, 0x17, 0x36, 0x37, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x1f, 0x01, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x03, 0x3b, 0x09, 0x1a, 0x16, 0x30, 0x1b, 0x14, 0x11, 0x27, 0x42, 0x64, 0x13, 0x29, 0x54, 0x4e, 0x6f, 0x36, 0x28, 0xfe, 0xea, 0x8a, 0x5f, 0x68, 0x0f, 0x2d, 0x31, 0x39, 0xfe, 0xe4, 0xb7, 0xa8, 0xb2, 0xeb, 0x5c, 0x49, 0x45, 0x0e, 0x5b, 0xcf, 0x3e, 0x42, 0x4b, 0x39, 0x24, 0x26, 0x17, 0x21, 0x12, 0x1d, 0x16, 0x0d, 0x68, 0x54, 0x6a, 0x5d, 0x2d, 0x44, 0x25, 0x26, 0x46, 0x44, 0x2c, 0x2e, 0x0e, 0x36, 0x4d, 0x45, 0x25, 0x29, 0x13, 0x26, 0x13, 0x1c, 0x32, 0x3b, 0x26, 0x12, 0x81, 0x56, 0x6c, 0x3a, 0x04, 0x67, 0x30, 0x2c, 0x3f, 0x29, 0x21, 0x12, 0x0f, 0x1b, 0x3a, 0x22, 0x39, 0x8c, 0x4a, 0x4f, 0x43, 0x51, 0x3e, 0x5e, 0xda, 0x76, 0x3a, 0x4d, 0x63, 0x2a, 0x84, 0x5a, 0x9c, 0x99, 0xa3, 0xfe, 0x01, 0x65, 0x8d, 0x97, 0x43, 0x30, 0xaa, 0x33, 0x4e, 0x33, 0x35, 0x25, 0x26, 0x1d, 0x17, 0x14, 0x1c, 0x2d, 0x19, 0x4b, 0x74, 0x5c, 0x4b, 0x25, 0x39, 0x53, 0x1f, 0x20, 0x3e, 0x42, 0x57, 0x4e, 0x3d, 0x11, 0x21, 0x24, 0x1f, 0x3f, 0x12, 0x24, 0x15, 0x38, 0x1c, 0x28, 0x46, 0x21, 0x35, 0x7b, 0x5e, 0x3f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x90, 0x01, 0x5a, 0x05, 0x78, 0x04, 0x84, 0x00, 0x09, 0x00, 0x51, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x35, 0x34, 0x01, 0x20, 0x35, 0x34, 0x37, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x16, 0x07, 0x06, 0x07, 0x16, 0x33, 0x32, 0x37, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x35, 0x33, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x32, 0x17, 0x16, 0x17, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x13, 0x16, 0x33, 0x32, 0x35, 0x34, 0x27, 0x26, 0x35, 0x34, 0x33, 0x32, 0x15, 0x14, 0x07, 0x06, 0x01, 0xaf, 0x39, 0x28, 0x3c, 0x18, 0x47, 0x38, 0x37, 0x01, 0xcb, 0xfe, 0xb0, 0x6b, 0x2c, 0x30, 0x22, 0x22, 0x03, 0x01, 0x43, 0x57, 0x5a, 0x17, 0x3c, 0x27, 0x24, 0x07, 0x82, 0x61, 0x12, 0x20, 0x23, 0x1b, 0x5b, 0x45, 0x39, 0x0d, 0x21, 0x1f, 0x37, 0x41, 0x58, 0x0b, 0x81, 0x3b, 0x04, 0x37, 0x25, 0x27, 0x32, 0x1c, 0x37, 0x29, 0x62, 0xc3, 0x33, 0x16, 0x5b, 0x58, 0x0b, 0x0a, 0x48, 0x3c, 0xdf, 0x9e, 0x03, 0x3e, 0x0e, 0x24, 0x33, 0x67, 0x1d, 0x3a, 0x38, 0x34, 0x04, 0xfe, 0x21, 0xfe, 0x45, 0x42, 0x37, 0x1c, 0x14, 0x57, 0x50, 0x66, 0x0f, 0x47, 0x2b, 0x1e, 0x31, 0x4b, 0xab, 0x48, 0x8e, 0x50, 0x3c, 0x02, 0x12, 0x12, 0x12, 0x0e, 0x11, 0x46, 0x66, 0x1d, 0x23, 0x26, 0x54, 0x27, 0x19, 0x13, 0x14, 0x30, 0x50, 0x2b, 0x41, 0x27, 0x1d, 0xfe, 0x93, 0x9a, 0x3c, 0x1e, 0x12, 0x11, 0x1b, 0x3c, 0x51, 0xad, 0x62, 0x46, 0x00, 0x01, 0x01, 0x68, 0xfe, 0xe4, 0x04, 0xab, 0x06, 0x27, 0x00, 0x20, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x15, 0x22, 0x07, 0x06, 0x02, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x04, 0xaa, 0xa7, 0x98, 0x91, 0x7c, 0x79, 0x3f, 0x3d, 0x3d, 0x3a, 0x7e, 0x76, 0x97, 0x98, 0xa7, 0x62, 0x5d, 0x57, 0x95, 0x24, 0x24, 0x24, 0x24, 0x4b, 0x46, 0x5b, 0x59, 0x66, 0xfe, 0xe4, 0x47, 0x43, 0x89, 0x85, 0xa7, 0xa4, 0xbb, 0xbd, 0xa9, 0x9d, 0x8f, 0x86, 0x46, 0x47, 0x2f, 0x43, 0x3e, 0xfe, 0xfa, 0x9b, 0x9c, 0xb8, 0xb1, 0x9c, 0x9b, 0x83, 0x7d, 0x44, 0x43, 0x00, 0x00, 0x01, 0x01, 0x68, 0xfe, 0xe4, 0x04, 0xab, 0x06, 0x27, 0x00, 0x22, 0x00, 0x00, 0x01, 0x30, 0x35, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x02, 0x27, 0x26, 0x23, 0x30, 0x35, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x69, 0x67, 0x59, 0x5b, 0x46, 0x4a, 0x24, 0x24, 0x24, 0x24, 0x95, 0x56, 0x5e, 0x62, 0xa7, 0x98, 0x97, 0x77, 0x7e, 0x39, 0x3d, 0x3d, 0x3f, 0x78, 0x7d, 0x91, 0x98, 0xfe, 0xe4, 0x2f, 0x43, 0x44, 0x7d, 0x83, 0x9b, 0x9c, 0xb1, 0xb8, 0x9c, 0x9b, 0x01, 0x06, 0x3e, 0x43, 0x2f, 0x47, 0x46, 0x86, 0x8f, 0x9d, 0xa9, 0xbd, 0xbb, 0xa4, 0xa7, 0x85, 0x89, 0x43, 0x47, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe6, 0xfe, 0xf1, 0x04, 0x23, 0x06, 0x11, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x06, 0x02, 0x10, 0x12, 0x17, 0x21, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x04, 0x22, 0x78, 0x75, 0x76, 0x77, 0xfe, 0xd2, 0x87, 0x86, 0x85, 0x88, 0x06, 0x11, 0xe6, 0xfe, 0x3e, 0xfe, 0x32, 0xfe, 0x3b, 0xe5, 0xeb, 0x01, 0xc6, 0xe0, 0xdf, 0x01, 0xc4, 0xec, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xe6, 0xfe, 0xf1, 0x04, 0x23, 0x06, 0x11, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x30, 0x21, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x21, 0x36, 0x12, 0x10, 0x02, 0x01, 0xe7, 0x01, 0x2e, 0x88, 0x85, 0x86, 0x87, 0xfe, 0xd2, 0x78, 0x75, 0x74, 0x06, 0x11, 0xec, 0xfe, 0x3c, 0xdf, 0xe0, 0xfe, 0x3a, 0xeb, 0xe5, 0x01, 0xc5, 0x01, 0xce, 0x01, 0xc2, 0x00, 0x00, 0x00, 0x01, 0x01, 0x8c, 0xfe, 0x14, 0x04, 0x5f, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x09, 0x01, 0x21, 0x01, 0x04, 0x5f, 0xfe, 0xf9, 0xfe, 0x35, 0x01, 0xcb, 0x01, 0x07, 0xfe, 0x33, 0xfe, 0x14, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x00, 0x00, 0x01, 0x01, 0xab, 0xfe, 0x14, 0x04, 0x7d, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x09, 0x02, 0x21, 0x09, 0x01, 0x01, 0xac, 0x01, 0xcb, 0xfe, 0x35, 0x01, 0x05, 0x01, 0xcb, 0xfe, 0x35, 0xfe, 0x14, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x05, 0xfe, 0x14, 0x04, 0xef, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x09, 0x01, 0x21, 0x01, 0x04, 0xef, 0xfe, 0x69, 0xfd, 0xae, 0x02, 0x52, 0x01, 0x97, 0xfd, 0xa3, 0xfe, 0x14, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x00, 0x00, 0x01, 0x01, 0x19, 0xfe, 0x14, 0x05, 0x03, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x09, 0x02, 0x21, 0x09, 0x01, 0x01, 0x1a, 0x02, 0x5c, 0xfd, 0xa4, 0x01, 0x96, 0x02, 0x52, 0xfd, 0xae, 0xfe, 0x14, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x32, 0xfe, 0x14, 0x04, 0xb9, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x01, 0x21, 0x09, 0x01, 0x21, 0x01, 0x04, 0xb9, 0xfe, 0x45, 0xfe, 0x35, 0x01, 0xcb, 0x01, 0xbb, 0xfe, 0x33, 0xfe, 0x14, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x00, 0x00, 0x01, 0x01, 0x51, 0xfe, 0x14, 0x04, 0xd7, 0x06, 0x14, 0x00, 0x05, 0x00, 0x00, 0x09, 0x02, 0x21, 0x09, 0x01, 0x01, 0x52, 0x01, 0xcb, 0xfe, 0x35, 0x01, 0xb9, 0x01, 0xcb, 0xfe, 0x35, 0xfe, 0x14, 0x04, 0x00, 0x04, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x7d, 0xfe, 0x13, 0x03, 0xdb, 0x06, 0x14, 0x00, 0x07, 0x00, 0x00, 0x05, 0x17, 0x07, 0x03, 0x11, 0x13, 0x17, 0x07, 0x03, 0x04, 0xd6, 0x5f, 0xfe, 0xfe, 0x5f, 0xd6, 0x95, 0xee, 0x6a, 0x01, 0x1a, 0x05, 0xcd, 0x01, 0x1a, 0x6a, 0xee, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x2e, 0xfe, 0x13, 0x03, 0x8c, 0x06, 0x14, 0x00, 0x07, 0x00, 0x00, 0x01, 0x27, 0x37, 0x13, 0x11, 0x03, 0x27, 0x37, 0x03, 0x04, 0xd6, 0x5f, 0xfe, 0xfe, 0x5f, 0xd6, 0x04, 0xbc, 0xee, 0x6a, 0xfe, 0xe6, 0xfa, 0x33, 0xfe, 0xe6, 0x6a, 0xee, 0x00, 0x00, 0x00, 0x01, 0x01, 0x42, 0xfe, 0xb2, 0x04, 0x92, 0x06, 0x14, 0x00, 0x24, 0x00, 0x00, 0x05, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x1d, 0x01, 0x14, 0x16, 0x33, 0x04, 0x91, 0xbf, 0xe0, 0x98, 0x61, 0x80, 0x37, 0x37, 0x81, 0x60, 0x98, 0xe0, 0xbf, 0x3d, 0x7f, 0x4d, 0x52, 0x63, 0x64, 0x51, 0x4d, 0x7f, 0xbe, 0x90, 0x94, 0xdd, 0xef, 0x97, 0x74, 0x8f, 0x73, 0x95, 0xf0, 0xdd, 0x93, 0x8f, 0x58, 0x8d, 0xf8, 0x9d, 0x8e, 0x19, 0x1b, 0x8e, 0x9c, 0xf8, 0x8d, 0x58, 0x00, 0x01, 0x01, 0x77, 0xfe, 0xb2, 0x04, 0xc7, 0x06, 0x14, 0x00, 0x24, 0x00, 0x00, 0x05, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x3d, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x14, 0x06, 0x2b, 0x01, 0x01, 0x77, 0x3d, 0x7f, 0x4e, 0x51, 0x64, 0x63, 0x52, 0x4e, 0x7f, 0x3d, 0xbf, 0xe0, 0x98, 0x61, 0x80, 0x37, 0x37, 0x7f, 0x62, 0x98, 0xe0, 0xbf, 0xbe, 0x58, 0x8d, 0xf8, 0x9c, 0x8e, 0x1b, 0x19, 0x8e, 0x9d, 0xf8, 0x8d, 0x58, 0x8f, 0x93, 0xdd, 0xf0, 0x95, 0x73, 0x8f, 0x74, 0x97, 0xef, 0xdd, 0x94, 0x00, 0x02, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x18, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x21, 0x35, 0x23, 0x11, 0x23, 0x07, 0x15, 0x37, 0x11, 0x23, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfc, 0x3e, 0x02, 0x2b, 0xc4, 0x91, 0xe8, 0xd5, 0xc3, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xfd, 0x5c, 0x8e, 0x03, 0x1a, 0x2f, 0x98, 0x2b, 0xfd, 0x82, 0x00, 0x00, 0x02, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x01, 0x07, 0x15, 0x21, 0x35, 0x21, 0x3e, 0x01, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfe, 0x1b, 0x38, 0x2b, 0xb1, 0x93, 0x36, 0x83, 0x57, 0x67, 0x77, 0x35, 0x46, 0x56, 0x2b, 0x37, 0x1e, 0xec, 0x4a, 0x02, 0x61, 0xfe, 0x77, 0x71, 0xa0, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xe9, 0x46, 0x69, 0x3a, 0x7d, 0x97, 0x1f, 0x24, 0xab, 0x3a, 0x26, 0x4e, 0x3f, 0x28, 0x55, 0x3f, 0x22, 0xf1, 0x4d, 0x81, 0x8e, 0x74, 0xa7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x36, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x15, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x36, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfe, 0xa2, 0xad, 0x91, 0x37, 0x7b, 0x55, 0x60, 0x6d, 0x2f, 0x52, 0x53, 0x50, 0x50, 0x83, 0x7e, 0x59, 0x60, 0x67, 0x69, 0x3e, 0x70, 0x52, 0x4f, 0x7b, 0x39, 0xb0, 0xc2, 0x6a, 0x0c, 0x04, 0x5d, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0x18, 0x73, 0x89, 0x14, 0x18, 0x97, 0x20, 0x15, 0x3f, 0x3c, 0x3a, 0x3c, 0x8c, 0x4e, 0x47, 0x4c, 0x4f, 0x1c, 0x30, 0xa8, 0x1b, 0x17, 0x9c, 0x8d, 0x5d, 0x81, 0x03, 0x72, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x23, 0x13, 0x01, 0x15, 0x21, 0x15, 0x33, 0x35, 0x33, 0x35, 0x23, 0x11, 0x23, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfd, 0x60, 0xf2, 0xf2, 0xfe, 0x70, 0x01, 0x90, 0xa4, 0x7f, 0x7f, 0xb9, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xfe, 0xbc, 0x01, 0x7e, 0xfe, 0x83, 0x8e, 0xd3, 0xd3, 0x8d, 0x02, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x05, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x37, 0x35, 0x21, 0x35, 0x21, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfc, 0x57, 0x50, 0x5b, 0x2d, 0x5d, 0x6a, 0x6a, 0x5d, 0x3d, 0x6c, 0x55, 0x4f, 0x78, 0x39, 0xab, 0xc0, 0xba, 0x9f, 0x1b, 0x39, 0x03, 0x01, 0x68, 0xfd, 0xfd, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xf3, 0x25, 0x14, 0x61, 0x56, 0x55, 0x61, 0x1b, 0x2f, 0xac, 0x18, 0x14, 0xac, 0x98, 0x95, 0xb0, 0x0a, 0x01, 0xab, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x32, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0x22, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x35, 0x2e, 0x01, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfd, 0xde, 0x53, 0x46, 0x46, 0x53, 0x53, 0x46, 0x46, 0x53, 0x66, 0xb4, 0xd2, 0xad, 0xa6, 0x90, 0xaf, 0xa8, 0x90, 0x46, 0x73, 0x08, 0x05, 0x72, 0x6b, 0x2a, 0x58, 0x4b, 0x42, 0x60, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xfe, 0x8f, 0x5a, 0x62, 0x62, 0x5a, 0x5b, 0x62, 0x62, 0x02, 0x2a, 0xfe, 0xf5, 0xda, 0xe7, 0xfd, 0xb3, 0x91, 0x94, 0xb1, 0x3d, 0x0b, 0x50, 0x94, 0x16, 0x23, 0x9c, 0x18, 0x13, 0x00, 0x00, 0x02, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x25, 0x21, 0x01, 0x33, 0x01, 0x35, 0x21, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfc, 0x2e, 0x01, 0xa1, 0xfe, 0xd1, 0xad, 0x01, 0x48, 0xfd, 0x99, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0x76, 0xfc, 0xe6, 0x03, 0x5d, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x0e, 0x01, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfd, 0xf3, 0x56, 0x4b, 0x4c, 0x55, 0x55, 0x4c, 0x4b, 0x56, 0xfe, 0x18, 0xab, 0x9c, 0x9c, 0xaa, 0x6a, 0x0d, 0x03, 0x5f, 0xa4, 0x8d, 0x8e, 0xa4, 0x5f, 0x04, 0x0e, 0x6a, 0x01, 0x47, 0x43, 0x4a, 0x4a, 0x43, 0x46, 0x48, 0x48, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xfe, 0x6c, 0x48, 0x51, 0x50, 0x49, 0x49, 0x50, 0x50, 0x49, 0x8a, 0x97, 0x97, 0x8a, 0x5c, 0x83, 0x03, 0x01, 0x76, 0x53, 0x74, 0x88, 0x88, 0x74, 0x53, 0x76, 0x01, 0x03, 0x83, 0x01, 0xc4, 0x42, 0x3e, 0x3d, 0x42, 0x42, 0x3d, 0x3e, 0x42, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x26, 0x00, 0x32, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x32, 0x12, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x15, 0x1e, 0x01, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfd, 0x22, 0xb4, 0xd2, 0xac, 0xa7, 0x90, 0xae, 0xa7, 0x8f, 0x47, 0x74, 0x09, 0x05, 0x72, 0x6b, 0x2a, 0x57, 0x4c, 0x42, 0x60, 0x36, 0x53, 0x46, 0x47, 0x52, 0x52, 0x47, 0x46, 0x53, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xfd, 0x4b, 0x01, 0x0a, 0xda, 0xe8, 0xfd, 0xb4, 0x91, 0x94, 0xaf, 0x3c, 0x0d, 0x4f, 0x93, 0x15, 0x24, 0x9c, 0x18, 0x13, 0x02, 0x84, 0x5b, 0x62, 0x62, 0x5b, 0x5b, 0x62, 0x62, 0x00, 0x00, 0x04, 0x00, 0x88, 0xff, 0xec, 0x05, 0xec, 0x05, 0xe8, 0x00, 0x0d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x01, 0x21, 0x35, 0x23, 0x11, 0x23, 0x07, 0x15, 0x37, 0x11, 0x23, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x05, 0xec, 0xfe, 0x6c, 0xfe, 0xe1, 0xfe, 0xe4, 0xfe, 0x6c, 0xb9, 0x01, 0x4c, 0xab, 0xae, 0x01, 0x4c, 0xb9, 0xfb, 0xa0, 0x01, 0x95, 0x8f, 0x69, 0xaa, 0x9b, 0x8e, 0x03, 0x2e, 0x3e, 0x39, 0x3a, 0x3e, 0x3e, 0x3a, 0x39, 0x3e, 0xfe, 0x98, 0x7b, 0x76, 0x75, 0x7a, 0x7a, 0x75, 0x76, 0x7b, 0x02, 0xea, 0xfe, 0xc1, 0xfe, 0x41, 0x01, 0xbf, 0x01, 0x3f, 0xc6, 0x01, 0x72, 0xc6, 0xc6, 0xfe, 0x90, 0xfd, 0xa9, 0x80, 0x02, 0xca, 0x2a, 0x89, 0x27, 0xfd, 0xc2, 0x01, 0x24, 0xa2, 0x97, 0x97, 0xa2, 0xa3, 0x97, 0x97, 0xa3, 0xd0, 0xe4, 0xe4, 0xd0, 0xd1, 0xe4, 0xe4, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x24, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x01, 0x33, 0x11, 0x05, 0x35, 0x25, 0x33, 0x11, 0x33, 0x15, 0x21, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfd, 0xe2, 0xed, 0xfe, 0xfe, 0x01, 0x01, 0x91, 0xee, 0xfd, 0x95, 0x7f, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xfb, 0x7d, 0x03, 0x8f, 0x39, 0x93, 0x3a, 0xfb, 0xdd, 0x88, 0x05, 0xa8, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x36, 0x00, 0x50, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x01, 0x21, 0x15, 0x21, 0x35, 0x36, 0x00, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x01, 0x02, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfe, 0x59, 0x01, 0xfb, 0xfd, 0x56, 0x53, 0x01, 0x1d, 0x25, 0x46, 0x37, 0x78, 0x60, 0x48, 0x95, 0x56, 0x57, 0x99, 0x3f, 0xa8, 0xc7, 0x32, 0x42, 0x12, 0xc1, 0xa7, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xfb, 0x80, 0x88, 0x88, 0x5f, 0x01, 0x41, 0x2e, 0x58, 0x78, 0x3b, 0x5f, 0x78, 0x35, 0x35, 0xa3, 0x27, 0x28, 0xba, 0x9b, 0x49, 0x84, 0x5a, 0x17, 0xde, 0x04, 0x56, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x42, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x03, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x68, 0x68, 0x76, 0xda, 0xca, 0x44, 0x8f, 0x4d, 0x3d, 0x90, 0x4e, 0x89, 0x8f, 0x85, 0x77, 0x7d, 0x83, 0x6c, 0x71, 0x75, 0x6e, 0x3b, 0x89, 0x53, 0x4a, 0x9a, 0x40, 0xa7, 0xc0, 0x66, 0xfe, 0x6a, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xfd, 0x79, 0x19, 0x9c, 0x74, 0xb0, 0xc2, 0x1e, 0x1d, 0x9c, 0x27, 0x28, 0x78, 0x72, 0x6a, 0x77, 0x85, 0x5f, 0x5a, 0x5c, 0x62, 0x1d, 0x1e, 0x90, 0x17, 0x1c, 0xa7, 0x8e, 0x64, 0x88, 0x03, 0x09, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x04, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x1c, 0x00, 0x27, 0x00, 0x41, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x07, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x21, 0x35, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xc7, 0xfe, 0x90, 0x01, 0x70, 0x26, 0xb6, 0x9a, 0x9a, 0x90, 0xfe, 0x1a, 0x01, 0x0e, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xed, 0xfd, 0x82, 0x03, 0x0b, 0xfc, 0xf5, 0x86, 0xfe, 0xe6, 0x01, 0x1a, 0x9c, 0x03, 0xf2, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x37, 0x00, 0x51, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x05, 0x21, 0x15, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfd, 0xe0, 0x02, 0x3b, 0xfe, 0x4a, 0x20, 0x40, 0x1f, 0xb4, 0xd2, 0xd8, 0xc5, 0x43, 0x8c, 0x4b, 0x44, 0x86, 0x4e, 0x7c, 0x92, 0x92, 0x7c, 0x3b, 0x74, 0x3c, 0x81, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0x63, 0x88, 0xfe, 0xdb, 0x0c, 0x0c, 0xdb, 0xbb, 0xc1, 0xd6, 0x1a, 0x19, 0xa3, 0x29, 0x25, 0x92, 0x7d, 0x7c, 0x92, 0x1d, 0x1e, 0x03, 0x58, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x25, 0x00, 0x3e, 0x00, 0x58, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x13, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x16, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfe, 0xf4, 0x61, 0x73, 0x73, 0x61, 0x62, 0x73, 0x73, 0xbf, 0x37, 0x6f, 0x36, 0x90, 0x98, 0x0b, 0x2a, 0x80, 0x4d, 0xa2, 0xbc, 0xc4, 0xa3, 0xba, 0xc5, 0xf2, 0xcb, 0x37, 0x70, 0xfe, 0x88, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xfd, 0x8b, 0x95, 0x82, 0x80, 0x96, 0x96, 0x80, 0x82, 0x95, 0x01, 0xfa, 0x93, 0x1d, 0x1e, 0xd8, 0xda, 0x45, 0x4b, 0xdb, 0xbc, 0xb8, 0xde, 0x01, 0x3e, 0x01, 0x2d, 0x01, 0x1d, 0x01, 0x4f, 0x18, 0x01, 0x00, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x20, 0x00, 0x3a, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x05, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfd, 0xa0, 0x02, 0xb3, 0xfe, 0x7a, 0x98, 0x01, 0x70, 0xfd, 0xfb, 0xc1, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0x60, 0x45, 0xfb, 0x9a, 0x04, 0x23, 0x01, 0x85, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x23, 0x00, 0x39, 0x00, 0x45, 0x00, 0x5f, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x01, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x20, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x20, 0x26, 0x35, 0x34, 0x36, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfe, 0xfc, 0x67, 0x77, 0x77, 0xcf, 0x77, 0x76, 0xfa, 0x5e, 0x68, 0xb7, 0x01, 0x41, 0xb7, 0x68, 0x5e, 0x69, 0x76, 0xbe, 0xfe, 0x9b, 0xbf, 0x77, 0x33, 0x69, 0x5e, 0x5e, 0x6a, 0x6a, 0x5e, 0x5e, 0x69, 0x2c, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xfd, 0x2c, 0x7b, 0xd8, 0x7b, 0x7c, 0x6b, 0x6c, 0x7b, 0x45, 0x1a, 0x8e, 0x67, 0x8f, 0xa6, 0xa6, 0x8f, 0x67, 0x8e, 0x1a, 0x1b, 0x9e, 0x73, 0xad, 0xba, 0xba, 0xad, 0x73, 0x9e, 0x01, 0x1a, 0x5c, 0x68, 0x68, 0x5c, 0x5d, 0x68, 0x68, 0x01, 0xd0, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x04, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x19, 0x00, 0x32, 0x00, 0x3e, 0x00, 0x58, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x01, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x02, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x62, 0x62, 0x64, 0x62, 0x77, 0xfd, 0xe3, 0x37, 0x70, 0x36, 0x90, 0x98, 0x0b, 0x2a, 0x80, 0x4e, 0xa2, 0xbb, 0xc4, 0xa2, 0xbc, 0xc4, 0xf1, 0xcc, 0x37, 0x70, 0xe4, 0x63, 0x72, 0x72, 0x63, 0x61, 0x73, 0x73, 0x42, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0xfe, 0xf7, 0x9c, 0x97, 0xfe, 0xf7, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x01, 0x09, 0x97, 0x9c, 0x01, 0x09, 0x6f, 0x6f, 0x36, 0xfb, 0x0e, 0x93, 0x1d, 0x1e, 0xd7, 0xdb, 0x44, 0x4a, 0xd9, 0xbc, 0xb8, 0xde, 0xfe, 0xc3, 0xfe, 0xd1, 0xfe, 0xe6, 0xfe, 0xaf, 0x18, 0x02, 0x12, 0x95, 0x82, 0x81, 0x95, 0x95, 0x81, 0x82, 0x95, 0x03, 0x95, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x1d, 0x00, 0x2b, 0x00, 0x38, 0x00, 0x43, 0x00, 0x61, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x07, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x2e, 0x01, 0x20, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x20, 0x02, 0x11, 0x10, 0x37, 0x01, 0x33, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x33, 0x15, 0x21, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x03, 0x8f, 0xfe, 0xeb, 0x79, 0x77, 0x62, 0x64, 0x30, 0x32, 0x32, 0x30, 0x64, 0x62, 0x77, 0x79, 0x01, 0x15, 0x78, 0x77, 0x62, 0x64, 0x30, 0x32, 0x32, 0x30, 0x64, 0x62, 0x77, 0x1a, 0x4b, 0x28, 0x27, 0x4e, 0x4c, 0x4e, 0x4d, 0x27, 0x26, 0xd7, 0x01, 0x13, 0x49, 0x48, 0x48, 0x49, 0xfe, 0xed, 0x90, 0x48, 0xfe, 0x61, 0x7f, 0x87, 0x86, 0x74, 0x76, 0xfe, 0x98, 0xeb, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x36, 0x38, 0x38, 0x36, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x36, 0x39, 0x39, 0x36, 0x71, 0x70, 0x87, 0x05, 0xd9, 0x39, 0x36, 0x6f, 0x6f, 0x83, 0x86, 0x9c, 0x97, 0x86, 0x83, 0x6f, 0x6f, 0x36, 0x39, 0x39, 0x36, 0x6f, 0x6f, 0x83, 0x86, 0x97, 0x9c, 0x86, 0x83, 0x6f, 0x6f, 0x36, 0xcb, 0x7b, 0x7a, 0xf7, 0xf5, 0xf6, 0xf6, 0xf5, 0xf3, 0x7e, 0x7b, 0x80, 0x9f, 0x9e, 0xfe, 0xd1, 0xfe, 0xd3, 0x9f, 0x9f, 0x01, 0x3e, 0x01, 0x2d, 0x01, 0x2c, 0xa1, 0xfc, 0x67, 0x03, 0x8f, 0x25, 0x93, 0x26, 0xfb, 0xdd, 0x88, 0x05, 0xa8, 0x40, 0x3e, 0x7d, 0x7e, 0x95, 0x97, 0xb1, 0xac, 0x97, 0x95, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x95, 0x97, 0xac, 0xb1, 0x97, 0x95, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x23, 0x11, 0x23, 0x05, 0x15, 0x25, 0x11, 0x02, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x01, 0xe9, 0x02, 0x6b, 0xee, 0x91, 0xfe, 0xff, 0x01, 0x02, 0x6e, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x01, 0x1d, 0x88, 0x88, 0x04, 0x23, 0x3a, 0x93, 0x39, 0xfc, 0x71, 0x05, 0x20, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x02, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x1c, 0x00, 0x36, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x06, 0x00, 0x07, 0x15, 0x21, 0x35, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x02, 0x60, 0xaf, 0xc1, 0x12, 0x42, 0x32, 0xc7, 0xa8, 0x3f, 0x99, 0x57, 0x56, 0x99, 0x44, 0x60, 0x78, 0x37, 0x46, 0x25, 0xfe, 0xe3, 0x53, 0x02, 0xaa, 0xfe, 0x0d, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x01, 0x20, 0xc7, 0xde, 0x17, 0x5a, 0x84, 0x49, 0x9b, 0xba, 0x28, 0x27, 0xa3, 0x35, 0x35, 0x78, 0x5f, 0x3b, 0x78, 0x58, 0x2e, 0xfe, 0xbf, 0x5f, 0x88, 0x88, 0x05, 0x1d, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x02, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x28, 0x00, 0x42, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x15, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x9f, 0x5f, 0x66, 0xc1, 0xa6, 0x40, 0x91, 0x53, 0x53, 0x89, 0x3b, 0x6e, 0x75, 0x71, 0x6c, 0x83, 0x7d, 0x77, 0x85, 0x8f, 0x89, 0x4e, 0x90, 0x3d, 0x4d, 0x8f, 0x44, 0xca, 0xda, 0x76, 0xfe, 0x61, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x03, 0x19, 0x1b, 0x88, 0x64, 0x8e, 0xa7, 0x19, 0x1a, 0x90, 0x1e, 0x1d, 0x62, 0x5c, 0x5a, 0x5f, 0x85, 0x77, 0x6a, 0x72, 0x78, 0x28, 0x27, 0x9c, 0x1d, 0x1e, 0xc2, 0xb0, 0x74, 0x9c, 0x03, 0x3d, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x27, 0x00, 0x00, 0x01, 0x11, 0x21, 0x09, 0x01, 0x15, 0x21, 0x11, 0x33, 0x11, 0x33, 0x35, 0x23, 0x11, 0x24, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x40, 0xfe, 0x90, 0x01, 0x4a, 0xfe, 0x40, 0x01, 0xe6, 0x90, 0x9a, 0x9a, 0xfe, 0x98, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x04, 0xb3, 0xfd, 0x82, 0x03, 0x0b, 0xfd, 0x0b, 0x9c, 0xfe, 0xe6, 0x01, 0x1a, 0x86, 0x03, 0x0b, 0xfd, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x02, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x1d, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x15, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x11, 0x21, 0x35, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x01, 0xe7, 0x3c, 0x74, 0x3b, 0x7c, 0x92, 0x92, 0x7c, 0x4e, 0x89, 0x41, 0x4b, 0x8c, 0x43, 0xc5, 0xd8, 0xd2, 0xb4, 0x1f, 0x40, 0x20, 0x01, 0xb6, 0xfe, 0x46, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0x3d, 0xfd, 0xa8, 0x1e, 0x1d, 0x92, 0x7c, 0x7d, 0x92, 0x27, 0x27, 0xa3, 0x19, 0x1a, 0xd6, 0xc1, 0xbb, 0xdb, 0x0c, 0x0c, 0x01, 0x25, 0x88, 0x01, 0x00, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x0b, 0x00, 0x24, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x02, 0xfb, 0x62, 0x73, 0x73, 0x62, 0x61, 0x73, 0x73, 0x01, 0x82, 0x3c, 0x70, 0x37, 0xcb, 0xf2, 0xc5, 0xba, 0xa3, 0xc4, 0xbc, 0xa2, 0x4d, 0x80, 0x2a, 0x0b, 0x98, 0x90, 0x36, 0x6f, 0x37, 0xfe, 0x4c, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x03, 0x2b, 0x95, 0x82, 0x80, 0x96, 0x96, 0x80, 0x82, 0x95, 0x01, 0xfa, 0x18, 0x18, 0xfe, 0xaf, 0xfe, 0xe5, 0xfe, 0xd3, 0xfe, 0xc2, 0xde, 0xb8, 0xbc, 0xdb, 0x4b, 0x45, 0xda, 0xd8, 0x1e, 0x1d, 0x01, 0xab, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x06, 0x00, 0x20, 0x00, 0x00, 0x01, 0x15, 0x21, 0x01, 0x33, 0x01, 0x35, 0x24, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x01, 0xa7, 0x02, 0x05, 0xfe, 0x90, 0x98, 0x01, 0x86, 0xfe, 0x0e, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x05, 0x40, 0x88, 0xfb, 0xdd, 0x04, 0x66, 0x45, 0xfd, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x04, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x09, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x45, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x27, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x20, 0x36, 0x35, 0x34, 0x26, 0x27, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x20, 0x06, 0x15, 0x14, 0x16, 0x37, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x03, 0x03, 0x69, 0x76, 0x77, 0xcf, 0x77, 0x77, 0x2a, 0x69, 0x77, 0xbf, 0x01, 0x65, 0xbe, 0x76, 0x69, 0x5e, 0x68, 0xb7, 0xfe, 0xbf, 0xb7, 0x68, 0x28, 0x69, 0x5e, 0x5e, 0x6a, 0x6a, 0x5e, 0x5e, 0x69, 0x2c, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x02, 0xcc, 0x7b, 0x6c, 0x6b, 0x7c, 0x7b, 0xd8, 0x7b, 0x45, 0x1b, 0x9e, 0x73, 0xad, 0xba, 0xba, 0xad, 0x73, 0x9e, 0x1b, 0x1a, 0x8e, 0x67, 0x8f, 0xa6, 0xa6, 0x8f, 0x67, 0x8e, 0xe5, 0x5d, 0x68, 0x68, 0x5d, 0x5c, 0x68, 0x68, 0x02, 0x89, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x3e, 0x00, 0x00, 0x25, 0x1e, 0x01, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x01, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x00, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x01, 0xea, 0x3d, 0x70, 0x37, 0xcc, 0xf1, 0xc4, 0xbc, 0xa2, 0xc4, 0xbc, 0xa1, 0x4e, 0x80, 0x2a, 0x0b, 0x98, 0x90, 0x36, 0x70, 0x37, 0x01, 0x21, 0x61, 0x73, 0x73, 0x61, 0x63, 0x72, 0x72, 0xfe, 0xfa, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0xae, 0x18, 0x18, 0x01, 0x51, 0x01, 0x1a, 0x01, 0x2f, 0x01, 0x3d, 0xde, 0xb8, 0xbc, 0xd9, 0x4a, 0x44, 0xdb, 0xd7, 0x1e, 0x1d, 0x01, 0x67, 0x95, 0x82, 0x81, 0x95, 0x95, 0x81, 0x82, 0x95, 0x03, 0x95, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0xff, 0x96, 0x06, 0x01, 0x06, 0x3d, 0x00, 0x0b, 0x00, 0x15, 0x00, 0x20, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x20, 0x02, 0x11, 0x10, 0x12, 0x20, 0x12, 0x11, 0x10, 0x01, 0x15, 0x21, 0x35, 0x23, 0x11, 0x23, 0x07, 0x15, 0x37, 0x11, 0x12, 0x20, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15, 0x14, 0x02, 0x07, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x27, 0x26, 0x02, 0x35, 0x34, 0x12, 0x37, 0x36, 0x37, 0x04, 0x23, 0x5b, 0x5a, 0x5a, 0x5b, 0x5a, 0x5a, 0x5a, 0xeb, 0xfe, 0xde, 0x98, 0x98, 0x01, 0x22, 0x99, 0xfc, 0x03, 0x01, 0x95, 0x91, 0x74, 0xa1, 0xa2, 0x87, 0x01, 0x39, 0x89, 0x87, 0x6f, 0x72, 0x6e, 0x6e, 0x72, 0x6f, 0x87, 0x89, 0xfe, 0xc7, 0x89, 0x87, 0x70, 0x71, 0x6f, 0x6f, 0x71, 0x70, 0x87, 0x04, 0xd5, 0xf5, 0xf7, 0xf5, 0xf6, 0xf6, 0xf5, 0xf7, 0xf5, 0x80, 0xfe, 0xc3, 0xfe, 0xd1, 0xfe, 0xd3, 0xfe, 0xc2, 0x01, 0x3e, 0x01, 0x2d, 0x01, 0x2f, 0xfd, 0x05, 0x88, 0x88, 0x04, 0x23, 0x26, 0x93, 0x25, 0xfc, 0x71, 0x05, 0x20, 0x40, 0x3e, 0x7d, 0x7e, 0xfe, 0xd4, 0xb1, 0xac, 0xfe, 0xd4, 0x7e, 0x7d, 0x3e, 0x40, 0x40, 0x3e, 0x7d, 0x7e, 0x01, 0x2c, 0xac, 0xb1, 0x01, 0x2c, 0x7e, 0x7d, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0x9a, 0x05, 0xaf, 0x04, 0x6a, 0x00, 0x08, 0x00, 0x00, 0x09, 0x01, 0x21, 0x01, 0x21, 0x35, 0x21, 0x01, 0x21, 0x05, 0xae, 0xfe, 0x49, 0xfe, 0xe0, 0x01, 0x4b, 0xfc, 0x47, 0x03, 0xb9, 0xfe, 0xb5, 0x01, 0x20, 0x02, 0x82, 0xfe, 0x18, 0x01, 0x70, 0xf0, 0x01, 0x70, 0x00, 0x01, 0x00, 0xe2, 0x00, 0x70, 0x04, 0xe9, 0x04, 0xe9, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x37, 0x01, 0x1b, 0x01, 0x25, 0x03, 0x92, 0xfd, 0x51, 0x98, 0x02, 0x70, 0xbe, 0x3f, 0xfd, 0x93, 0x01, 0x8b, 0x02, 0xb4, 0xaa, 0xfd, 0x05, 0x01, 0x34, 0xfd, 0x4e, 0x47, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x06, 0x00, 0x00, 0x01, 0x05, 0x35, 0x05, 0x03, 0x09, 0x01, 0x04, 0x07, 0xfc, 0x62, 0x03, 0x9e, 0x3d, 0x01, 0xe4, 0xfe, 0x1c, 0x02, 0x3c, 0x32, 0xf0, 0x32, 0x01, 0x70, 0xfe, 0x4a, 0xfe, 0x4a, 0x00, 0x00, 0x01, 0x00, 0xe2, 0x00, 0x1b, 0x04, 0xe9, 0x04, 0x94, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x27, 0x01, 0x2d, 0x01, 0x03, 0x03, 0xeb, 0xfd, 0x90, 0x98, 0x02, 0xaf, 0xfe, 0xe9, 0x02, 0x6d, 0x3f, 0x03, 0x16, 0xfd, 0x05, 0xaa, 0x02, 0xb4, 0xd4, 0x47, 0xfd, 0x4e, 0x00, 0x01, 0x00, 0x69, 0x01, 0x08, 0x05, 0xaf, 0x03, 0xfc, 0x00, 0x08, 0x00, 0x00, 0x13, 0x21, 0x03, 0x04, 0x05, 0x04, 0x05, 0x13, 0x21, 0x69, 0x02, 0x75, 0x97, 0x01, 0x39, 0x02, 0x2e, 0xfd, 0xd2, 0xfe, 0xc7, 0x97, 0xfd, 0x8b, 0x02, 0xbe, 0x01, 0x3e, 0xfc, 0x7e, 0x7e, 0xfc, 0x01, 0x3e, 0x00, 0x01, 0x00, 0x69, 0x00, 0x75, 0x05, 0x81, 0x04, 0x8f, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x14, 0x06, 0x07, 0x01, 0x06, 0x07, 0x06, 0x22, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x21, 0x22, 0x2e, 0x02, 0x34, 0x3e, 0x02, 0x33, 0x21, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x3e, 0x01, 0x32, 0x17, 0x16, 0x17, 0x01, 0x16, 0x05, 0x80, 0x12, 0x0f, 0xfe, 0x98, 0x0e, 0x16, 0x14, 0x2e, 0x28, 0x10, 0x10, 0x11, 0x12, 0x0f, 0xa7, 0xfc, 0xda, 0x18, 0x27, 0x21, 0x11, 0x11, 0x21, 0x27, 0x18, 0x03, 0x26, 0xa7, 0x0f, 0x12, 0x11, 0x10, 0x10, 0x28, 0x2e, 0x14, 0x16, 0x0e, 0x01, 0x68, 0x11, 0x02, 0x9b, 0x32, 0x2e, 0x11, 0xfe, 0x70, 0x10, 0x0b, 0x0a, 0x14, 0x11, 0x13, 0x2c, 0x19, 0x1a, 0x2e, 0x11, 0xba, 0x14, 0x22, 0x2e, 0x32, 0x2e, 0x22, 0x14, 0xba, 0x11, 0x2e, 0x1a, 0x19, 0x2c, 0x13, 0x11, 0x14, 0x0a, 0x0b, 0x10, 0xfe, 0x70, 0x13, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x11, 0x09, 0x01, 0x04, 0x24, 0xfc, 0x45, 0x03, 0xbb, 0x01, 0x8a, 0xfe, 0x76, 0x02, 0x5a, 0x50, 0x01, 0x8e, 0xfe, 0x4a, 0xfe, 0x4a, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x11, 0x09, 0x01, 0x04, 0x24, 0xfc, 0x45, 0x03, 0xbb, 0x01, 0x8a, 0xfe, 0x76, 0x02, 0x14, 0xdc, 0x01, 0x48, 0xfe, 0x4a, 0xfe, 0x4a, 0x00, 0x04, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x00, 0x01, 0x23, 0x11, 0x33, 0x01, 0x23, 0x11, 0x33, 0x03, 0x23, 0x11, 0x33, 0x01, 0x21, 0x11, 0x21, 0x35, 0x09, 0x01, 0x02, 0x73, 0xd8, 0xd8, 0xfe, 0xe0, 0x6c, 0x6c, 0xb4, 0x36, 0x36, 0x03, 0x85, 0xfe, 0x97, 0x01, 0x69, 0x01, 0x8a, 0xfe, 0x76, 0x01, 0xba, 0x01, 0x90, 0xfe, 0x70, 0x01, 0x90, 0xfe, 0x70, 0x01, 0x90, 0xfe, 0x70, 0x01, 0x90, 0xee, 0xfe, 0x4a, 0xfe, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x01, 0x35, 0x12, 0x17, 0x06, 0x03, 0x35, 0x21, 0x11, 0x03, 0x23, 0x11, 0x33, 0x01, 0x23, 0x11, 0x33, 0x03, 0x23, 0x11, 0x33, 0x04, 0x24, 0xa6, 0xe4, 0xe4, 0xa6, 0xfe, 0x97, 0x48, 0xd8, 0xd8, 0xfe, 0xe0, 0x6c, 0x6c, 0xb4, 0x36, 0x36, 0x03, 0xae, 0x8a, 0xfe, 0xce, 0x84, 0x84, 0xfe, 0xce, 0x8a, 0x02, 0x58, 0xfd, 0xa8, 0x02, 0x58, 0xfd, 0xa8, 0x02, 0x58, 0xfd, 0xa8, 0x02, 0x58, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0x86, 0x05, 0xd7, 0x04, 0x7e, 0x00, 0x06, 0x00, 0x00, 0x09, 0x02, 0x11, 0x21, 0x11, 0x21, 0x04, 0x0e, 0x01, 0xc9, 0xfe, 0x37, 0xfc, 0x5b, 0x03, 0xa5, 0x04, 0x7e, 0xfe, 0x04, 0xfe, 0x04, 0x01, 0x11, 0x01, 0xd6, 0x00, 0x02, 0x00, 0xcd, 0x00, 0xc0, 0x05, 0xaf, 0x04, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x01, 0x13, 0x09, 0x02, 0x02, 0xce, 0x01, 0xfe, 0xfd, 0x0f, 0x87, 0xfe, 0x6b, 0x04, 0xe1, 0xfb, 0x1f, 0x02, 0x82, 0x01, 0x0f, 0xfe, 0xf1, 0x01, 0xc2, 0xfe, 0x3e, 0xfe, 0x3e, 0x00, 0x00, 0x02, 0x00, 0xcd, 0x00, 0xc0, 0x05, 0xaf, 0x04, 0x44, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x01, 0x03, 0x01, 0x21, 0x09, 0x02, 0x02, 0xce, 0xf3, 0x02, 0xf1, 0xfd, 0x96, 0xfe, 0x6b, 0x04, 0xe1, 0xfb, 0x1f, 0x02, 0x82, 0xfe, 0xf1, 0x01, 0x0f, 0x01, 0xc2, 0xfe, 0x3e, 0xfe, 0x3e, 0x00, 0x00, 0x01, 0x00, 0xcd, 0xff, 0xf8, 0x05, 0xaf, 0x05, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x09, 0x03, 0x02, 0x08, 0xfe, 0xc5, 0x04, 0xe1, 0xfb, 0x1f, 0x02, 0x82, 0x02, 0x8a, 0xfd, 0x76, 0xfd, 0x76, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x62, 0x00, 0x14, 0x00, 0x00, 0x13, 0x11, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x21, 0x35, 0x09, 0x01, 0x35, 0x21, 0x20, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x69, 0x21, 0x1f, 0x20, 0x26, 0x26, 0x0b, 0x03, 0x04, 0x01, 0x8a, 0xfe, 0x76, 0xfe, 0x79, 0xfe, 0x78, 0x26, 0x26, 0x20, 0x1f, 0x21, 0x02, 0x82, 0x01, 0xe0, 0x30, 0x55, 0x25, 0x21, 0x13, 0x12, 0xc6, 0xfe, 0x4a, 0xfe, 0x4a, 0xc6, 0x12, 0x13, 0x21, 0x25, 0x55, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xa2, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x14, 0x00, 0x00, 0x13, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x21, 0x35, 0x09, 0x01, 0x35, 0x21, 0x20, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x69, 0x21, 0x1f, 0x20, 0x26, 0x26, 0x0b, 0x03, 0x04, 0x01, 0x8a, 0xfe, 0x76, 0xfe, 0x79, 0xfe, 0x78, 0x26, 0x26, 0x20, 0x1f, 0x21, 0x02, 0x82, 0x30, 0x55, 0x25, 0x21, 0x13, 0x12, 0xc6, 0xfe, 0x4a, 0xfe, 0x4a, 0xc6, 0x12, 0x13, 0x21, 0x25, 0x55, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0xba, 0xff, 0xf1, 0x04, 0x5d, 0x05, 0x13, 0x00, 0x06, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x11, 0x09, 0x01, 0x03, 0x08, 0xfe, 0xb3, 0x01, 0x4d, 0x01, 0x55, 0xfe, 0xab, 0x01, 0x56, 0x02, 0x58, 0x01, 0x65, 0xfd, 0x6f, 0xfd, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x08, 0x00, 0x00, 0x01, 0x35, 0x12, 0x05, 0x04, 0x03, 0x35, 0x21, 0x11, 0x03, 0x9d, 0x82, 0x01, 0x8f, 0xfe, 0x71, 0x82, 0xfc, 0xcc, 0x03, 0x9a, 0x9e, 0xfe, 0xce, 0x84, 0x84, 0xfe, 0xce, 0x9e, 0x02, 0x30, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0x00, 0x9a, 0x05, 0x82, 0x04, 0x6a, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x35, 0x21, 0x11, 0x21, 0x35, 0x33, 0x09, 0x01, 0x03, 0x15, 0x09, 0x01, 0x15, 0x21, 0x11, 0x02, 0xe9, 0xfd, 0x80, 0x02, 0x80, 0xe1, 0x01, 0xb7, 0xfe, 0x49, 0x99, 0x01, 0x6f, 0xfe, 0x91, 0xfd, 0x80, 0x9a, 0xee, 0x01, 0xf4, 0xee, 0xfe, 0x18, 0xfe, 0x18, 0x01, 0x3e, 0xee, 0x01, 0x98, 0x01, 0x98, 0xee, 0xfe, 0xac, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0x00, 0x9a, 0x05, 0x82, 0x04, 0x6a, 0x00, 0x08, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x35, 0x21, 0x11, 0x21, 0x35, 0x33, 0x09, 0x01, 0x03, 0x15, 0x09, 0x01, 0x15, 0x21, 0x11, 0x02, 0xe9, 0xfd, 0x80, 0x02, 0x80, 0xe1, 0x01, 0xb7, 0xfe, 0x49, 0x12, 0x01, 0x6f, 0xfe, 0x91, 0xfd, 0x80, 0x9a, 0xee, 0x01, 0xf4, 0xee, 0xfe, 0x18, 0xfe, 0x18, 0x01, 0x3e, 0xee, 0x01, 0x98, 0x01, 0x98, 0xee, 0xfe, 0xac, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x26, 0x00, 0x18, 0x05, 0xb8, 0x04, 0xb0, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x00, 0x13, 0x01, 0x21, 0x37, 0x33, 0x13, 0x15, 0x01, 0x23, 0x35, 0x37, 0x21, 0x01, 0x07, 0x01, 0x03, 0x07, 0x21, 0x03, 0x27, 0x01, 0x03, 0x02, 0xf5, 0x7c, 0x5a, 0xc2, 0xfd, 0x6f, 0x87, 0x14, 0xfd, 0x74, 0x03, 0x6f, 0x7c, 0x02, 0x43, 0x9a, 0x7d, 0xfd, 0x0c, 0xb1, 0x01, 0xce, 0x01, 0xf4, 0xee, 0xfd, 0xfe, 0xc8, 0xfe, 0x32, 0xc8, 0x26, 0x01, 0x18, 0xee, 0x01, 0x98, 0x01, 0x98, 0xee, 0xfe, 0xac, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x26, 0x00, 0x18, 0x05, 0xb8, 0x04, 0xb0, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x00, 0x13, 0x35, 0x21, 0x27, 0x35, 0x33, 0x01, 0x15, 0x03, 0x23, 0x27, 0x21, 0x01, 0x21, 0x13, 0x21, 0x17, 0x13, 0x01, 0x27, 0x02, 0x8c, 0x14, 0x87, 0x02, 0x91, 0xc2, 0x5a, 0x7c, 0xfd, 0x0b, 0x02, 0x6c, 0xfd, 0x0b, 0xb1, 0x02, 0xf4, 0x7d, 0x9a, 0xfd, 0xbd, 0x02, 0xfa, 0xc8, 0x26, 0xc8, 0xfe, 0x32, 0xc8, 0xfd, 0xfe, 0xee, 0x01, 0xa4, 0xfe, 0xac, 0xee, 0x01, 0x98, 0x01, 0x98, 0x00, 0x00, 0x00, 0x02, 0x00, 0xf9, 0x00, 0x00, 0x05, 0x94, 0x04, 0x98, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x00, 0x21, 0x27, 0x21, 0x27, 0x11, 0x21, 0x35, 0x33, 0x01, 0x17, 0x01, 0x03, 0x15, 0x09, 0x01, 0x15, 0x21, 0x11, 0x03, 0x79, 0x47, 0xfe, 0x21, 0x5a, 0x02, 0x26, 0x63, 0x01, 0xb7, 0x5a, 0xfe, 0x49, 0x75, 0x01, 0x6f, 0xfe, 0x91, 0xfd, 0xda, 0x9e, 0xc8, 0x02, 0x94, 0x9e, 0xfe, 0x18, 0xc8, 0xfe, 0x18, 0x01, 0xb6, 0x9e, 0x01, 0x98, 0x01, 0x98, 0x9e, 0xfe, 0x0c, 0x00, 0x00, 0x02, 0x00, 0xf9, 0x00, 0x00, 0x05, 0x94, 0x04, 0x98, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x01, 0x23, 0x35, 0x21, 0x11, 0x37, 0x21, 0x13, 0x21, 0x11, 0x21, 0x15, 0x09, 0x01, 0x03, 0x79, 0x63, 0x01, 0xb7, 0x5a, 0xfe, 0x49, 0x63, 0xfd, 0xda, 0x5a, 0x01, 0xdf, 0x35, 0xfd, 0xda, 0x02, 0x26, 0x01, 0x6f, 0xfe, 0x91, 0x04, 0x98, 0xfe, 0x18, 0xc8, 0xfe, 0x18, 0x9e, 0x02, 0x94, 0xc8, 0xfe, 0xe8, 0xfe, 0x0c, 0x9e, 0x01, 0x98, 0x01, 0x98, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x72, 0x00, 0x64, 0x05, 0xc1, 0x04, 0x98, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x00, 0x13, 0x03, 0x21, 0x35, 0x33, 0x01, 0x17, 0x01, 0x23, 0x27, 0x35, 0x21, 0x27, 0x13, 0x07, 0x21, 0x15, 0x09, 0x01, 0x15, 0x21, 0xf9, 0x87, 0x03, 0x07, 0x63, 0x01, 0xb7, 0x2d, 0xfe, 0x49, 0x63, 0x2d, 0xfd, 0x26, 0x2d, 0xda, 0x66, 0x02, 0xdb, 0x01, 0x6f, 0xfe, 0x91, 0xfd, 0x25, 0x02, 0xb0, 0x01, 0x4a, 0x9e, 0xfe, 0x18, 0x64, 0xfe, 0x18, 0x63, 0x3b, 0x64, 0x01, 0x4a, 0xfa, 0x9e, 0x01, 0x98, 0x01, 0x98, 0x9e, 0x00, 0x02, 0x00, 0x72, 0x00, 0x64, 0x05, 0xc1, 0x04, 0x98, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x00, 0x13, 0x03, 0x37, 0x21, 0x35, 0x37, 0x33, 0x01, 0x07, 0x01, 0x23, 0x35, 0x21, 0x13, 0x07, 0x21, 0x15, 0x09, 0x01, 0x15, 0x21, 0xf9, 0x87, 0x2d, 0x02, 0xda, 0x2d, 0x63, 0x01, 0xb7, 0x2d, 0xfe, 0x49, 0x63, 0xfc, 0xf9, 0xda, 0x66, 0x02, 0xdb, 0x01, 0x6f, 0xfe, 0x91, 0xfd, 0x25, 0x02, 0x4c, 0x01, 0x4a, 0x64, 0x3b, 0x63, 0xfe, 0x18, 0x64, 0xfe, 0x18, 0x9e, 0x01, 0x4a, 0xfa, 0x9e, 0x01, 0x98, 0x01, 0x98, 0x9e, 0x00, 0x01, 0x01, 0x1c, 0xff, 0xd8, 0x05, 0x31, 0x04, 0xaf, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x21, 0x15, 0x09, 0x01, 0x15, 0x01, 0x1c, 0x24, 0x3c, 0x51, 0x62, 0x64, 0x71, 0x6d, 0x69, 0x5e, 0x55, 0x51, 0x52, 0x4f, 0x54, 0x4e, 0x65, 0x64, 0xdf, 0x68, 0x5f, 0x54, 0x39, 0x25, 0x02, 0x1c, 0x01, 0x9c, 0xfe, 0x64, 0x03, 0x6e, 0x47, 0x43, 0x5a, 0x2e, 0x2f, 0x2f, 0x2b, 0x5d, 0x59, 0xdd, 0x80, 0x7a, 0xda, 0x5f, 0x58, 0x30, 0x2f, 0x2f, 0x2b, 0x5d, 0x3e, 0x49, 0x9e, 0x01, 0xca, 0x01, 0xca, 0x9e, 0x00, 0x00, 0x00, 0x09, 0x00, 0x75, 0x01, 0x42, 0x05, 0xaf, 0x03, 0xc2, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x07, 0x33, 0x37, 0x23, 0x07, 0x33, 0x37, 0x23, 0x07, 0x33, 0x37, 0x23, 0x07, 0x33, 0x37, 0x23, 0x35, 0x03, 0x21, 0x13, 0x21, 0x11, 0x16, 0x17, 0x06, 0x07, 0x11, 0x21, 0x03, 0x21, 0x01, 0x33, 0x27, 0x23, 0x17, 0x33, 0x27, 0x23, 0x17, 0x33, 0x27, 0x23, 0x17, 0x33, 0x27, 0x23, 0x02, 0x97, 0x90, 0x36, 0x90, 0xa2, 0x90, 0x36, 0x90, 0xa2, 0x90, 0x36, 0x90, 0xa2, 0x90, 0x36, 0x90, 0x6c, 0xa8, 0x01, 0xe6, 0xa8, 0x01, 0x60, 0x9c, 0xaf, 0xaf, 0x9c, 0xfe, 0xa0, 0xa8, 0xfe, 0x1a, 0x02, 0x22, 0x36, 0x90, 0x36, 0x24, 0x36, 0x90, 0x36, 0x24, 0x36, 0x90, 0x36, 0x24, 0x36, 0x90, 0x36, 0x02, 0x5a, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x50, 0x01, 0x18, 0xfe, 0xe8, 0x01, 0x16, 0xbc, 0x82, 0x82, 0xbc, 0x01, 0x16, 0xfe, 0xe8, 0x01, 0x68, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x94, 0x00, 0x70, 0x04, 0xe9, 0x05, 0x3e, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x01, 0x37, 0x06, 0x15, 0x14, 0x17, 0x26, 0x23, 0x22, 0x07, 0x37, 0x27, 0x37, 0x09, 0x01, 0x23, 0x01, 0x25, 0x11, 0x01, 0x11, 0x04, 0x2b, 0x9e, 0x06, 0x25, 0x7f, 0x94, 0x3b, 0x3f, 0x9d, 0xe4, 0x32, 0xfe, 0x4d, 0x01, 0x7f, 0xff, 0xfe, 0x81, 0x01, 0x33, 0x01, 0x7e, 0x01, 0x7b, 0xb0, 0x46, 0x43, 0xa3, 0x8f, 0x2a, 0x07, 0xb0, 0xfe, 0x39, 0x01, 0x6f, 0xfe, 0x58, 0x01, 0xa8, 0x3a, 0x01, 0x1b, 0xfe, 0x57, 0xfe, 0xe6, 0x00, 0x00, 0x03, 0x00, 0x69, 0x01, 0x62, 0x05, 0xaf, 0x03, 0xa2, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x00, 0x01, 0x35, 0x16, 0x17, 0x06, 0x07, 0x35, 0x21, 0x35, 0x05, 0x21, 0x07, 0x21, 0x13, 0x27, 0x21, 0x17, 0x04, 0x7e, 0x8b, 0xa5, 0xa5, 0x8b, 0xfe, 0xbc, 0xfd, 0xe3, 0x02, 0x1c, 0xb4, 0xfd, 0xe4, 0xb4, 0xb4, 0x02, 0x1c, 0xb4, 0x02, 0xaa, 0xf8, 0xbc, 0x64, 0x64, 0xbc, 0xf8, 0x50, 0x52, 0xc8, 0x01, 0x1a, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0x03, 0x00, 0x96, 0xff, 0xc5, 0x04, 0xe9, 0x04, 0x94, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x01, 0x27, 0x16, 0x33, 0x32, 0x37, 0x06, 0x15, 0x14, 0x17, 0x27, 0x07, 0x27, 0x09, 0x01, 0x11, 0x01, 0x03, 0x23, 0x01, 0x21, 0x03, 0xf8, 0x9d, 0x3f, 0x3b, 0x94, 0x7f, 0x25, 0x06, 0x9e, 0xe5, 0x32, 0xfe, 0xb5, 0x01, 0x7e, 0xfe, 0x82, 0x34, 0xff, 0x01, 0x7e, 0x00, 0xff, 0x03, 0xc1, 0xb0, 0x07, 0x2a, 0x90, 0xa2, 0x43, 0x46, 0xb0, 0xff, 0x39, 0xfe, 0x1d, 0x01, 0xa8, 0xfe, 0xe5, 0xfe, 0x58, 0x01, 0x55, 0x01, 0xa8, 0x00, 0x00, 0x01, 0x00, 0x96, 0x00, 0x70, 0x04, 0xe9, 0x05, 0x3e, 0x00, 0x2a, 0x00, 0x00, 0x25, 0x26, 0x23, 0x22, 0x07, 0x3e, 0x01, 0x37, 0x27, 0x26, 0x27, 0x26, 0x22, 0x06, 0x07, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x37, 0x26, 0x35, 0x34, 0x36, 0x37, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x16, 0x17, 0x01, 0x3e, 0x01, 0x37, 0x06, 0x15, 0x14, 0x04, 0xe8, 0x80, 0x95, 0x3b, 0x3e, 0x40, 0x74, 0x15, 0x95, 0x96, 0x1f, 0x22, 0x46, 0x44, 0x19, 0xfe, 0x82, 0x21, 0x4e, 0x2a, 0x28, 0x2b, 0x13, 0x05, 0x12, 0x21, 0x1e, 0x01, 0x7e, 0x1d, 0x16, 0x0c, 0x0e, 0x06, 0x01, 0x24, 0x03, 0x30, 0x41, 0x06, 0x70, 0x2a, 0x07, 0x47, 0x36, 0x03, 0xa6, 0xa6, 0x0e, 0x0f, 0x1e, 0x1c, 0x01, 0xa8, 0x24, 0x22, 0x12, 0x08, 0x21, 0x30, 0x2c, 0x30, 0x59, 0x22, 0xfe, 0x57, 0x21, 0x46, 0x26, 0x27, 0x26, 0x23, 0x07, 0xfe, 0xbb, 0x17, 0x81, 0x47, 0x47, 0x43, 0xa3, 0x00, 0x00, 0x01, 0x00, 0x69, 0x01, 0x61, 0x05, 0xaf, 0x03, 0xa3, 0x00, 0x27, 0x00, 0x00, 0x01, 0x06, 0x07, 0x34, 0x36, 0x37, 0x23, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x21, 0x34, 0x36, 0x37, 0x36, 0x3f, 0x01, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x21, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x21, 0x2e, 0x01, 0x35, 0x16, 0x05, 0xae, 0xa4, 0x8c, 0x30, 0x0c, 0xd3, 0xd3, 0x1f, 0x21, 0x1a, 0x19, 0x1c, 0xfd, 0xe4, 0x22, 0x1e, 0x1c, 0x2a, 0x13, 0x13, 0x2a, 0x1c, 0x1e, 0x22, 0x02, 0x1c, 0x1c, 0x19, 0x1a, 0x21, 0x1f, 0x09, 0x01, 0x9d, 0x0c, 0x30, 0x8c, 0x02, 0x82, 0x65, 0xbc, 0x65, 0x81, 0x13, 0x0f, 0x10, 0x1c, 0x1b, 0x4a, 0x28, 0x30, 0x59, 0x21, 0x1f, 0x15, 0x09, 0x1b, 0x15, 0x1f, 0x22, 0x58, 0x30, 0x28, 0x4a, 0x1b, 0x1c, 0x10, 0x0f, 0x13, 0x81, 0x65, 0xbc, 0x00, 0x00, 0x01, 0x00, 0x96, 0xff, 0xc6, 0x04, 0xe9, 0x04, 0x94, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x06, 0x15, 0x14, 0x17, 0x2e, 0x01, 0x27, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x3f, 0x01, 0x27, 0x06, 0x23, 0x22, 0x26, 0x27, 0x01, 0x1e, 0x01, 0x32, 0x37, 0x36, 0x37, 0x01, 0x2e, 0x01, 0x27, 0x16, 0x33, 0x32, 0x04, 0xe8, 0x24, 0x06, 0x41, 0x30, 0x03, 0x97, 0x96, 0x0b, 0x0c, 0x1a, 0x19, 0xfe, 0x82, 0x1e, 0x21, 0x12, 0x07, 0x1f, 0x2b, 0x28, 0x2b, 0x4f, 0x1f, 0x01, 0x7e, 0x19, 0x44, 0x46, 0x22, 0x1f, 0x07, 0x01, 0x24, 0x15, 0x74, 0x40, 0x3e, 0x3b, 0x95, 0x04, 0x94, 0x8e, 0xa3, 0x43, 0x47, 0x47, 0x81, 0x17, 0xa8, 0xa8, 0x1f, 0x26, 0x27, 0x26, 0x4b, 0x1c, 0xfe, 0x57, 0x22, 0x59, 0x30, 0x2c, 0x30, 0x15, 0x04, 0x12, 0x24, 0x22, 0x01, 0xa8, 0x1c, 0x1e, 0x0f, 0x0e, 0x07, 0x01, 0x45, 0x03, 0x36, 0x47, 0x07, 0x00, 0x03, 0x00, 0x67, 0x00, 0xac, 0x05, 0xaf, 0x04, 0x58, 0x00, 0x14, 0x00, 0x27, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x36, 0x25, 0x06, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x24, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x04, 0x05, 0x04, 0x05, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x12, 0x17, 0x24, 0x03, 0xc4, 0xdd, 0x01, 0x0d, 0xcc, 0x6e, 0x0a, 0x13, 0x14, 0x19, 0x17, 0x38, 0x17, 0x18, 0x14, 0x13, 0x15, 0x15, 0x13, 0x14, 0xfc, 0xbc, 0x1c, 0x19, 0x1a, 0x20, 0x20, 0x49, 0x20, 0x01, 0x3e, 0x03, 0x0f, 0xfc, 0xdb, 0xfe, 0xd8, 0x20, 0x49, 0x20, 0x25, 0x15, 0x1b, 0x03, 0x42, 0x18, 0x14, 0x13, 0x15, 0x15, 0x13, 0x14, 0x18, 0x17, 0x38, 0x17, 0x19, 0x14, 0x10, 0x0d, 0x6c, 0xce, 0xfe, 0xb9, 0x01, 0xce, 0x62, 0x51, 0x75, 0xfe, 0xfd, 0x1d, 0x14, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x14, 0x38, 0x1f, 0x1e, 0x38, 0x14, 0x15, 0x97, 0x52, 0x4b, 0x1a, 0x1c, 0x10, 0x0f, 0x0e, 0x85, 0x36, 0x38, 0x83, 0x0e, 0x0f, 0x12, 0x1a, 0x1f, 0x01, 0x23, 0x0c, 0x15, 0x14, 0x38, 0x1e, 0x1f, 0x38, 0x14, 0x15, 0x0c, 0x0b, 0x0b, 0x0c, 0x15, 0x11, 0x20, 0xfe, 0xfe, 0x76, 0x63, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x87, 0x01, 0x1f, 0x05, 0x9d, 0x03, 0xe5, 0x00, 0x1a, 0x00, 0x2a, 0x00, 0x00, 0x13, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x05, 0x04, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x25, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x37, 0x16, 0x17, 0x06, 0x07, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x87, 0x3b, 0x1a, 0x1d, 0x12, 0x23, 0x24, 0x26, 0x2a, 0x30, 0x2f, 0x36, 0x2e, 0x92, 0x01, 0x69, 0xfe, 0x97, 0x92, 0x33, 0x62, 0x2e, 0x2d, 0x23, 0x34, 0x13, 0x1a, 0x15, 0x1a, 0x03, 0x9f, 0x21, 0x21, 0x21, 0x21, 0x59, 0xe2, 0xe2, 0x59, 0x21, 0x21, 0x21, 0x02, 0x82, 0x26, 0x3a, 0x3f, 0x13, 0x24, 0x12, 0x13, 0x13, 0x16, 0x20, 0x66, 0x4c, 0x4c, 0x66, 0x23, 0x26, 0x13, 0x1d, 0x19, 0x23, 0x2f, 0x3a, 0x26, 0x27, 0x58, 0x32, 0x33, 0x58, 0x27, 0xf1, 0x72, 0x72, 0xf1, 0x27, 0x58, 0x33, 0x32, 0x58, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x91, 0x01, 0x56, 0x05, 0x94, 0x03, 0xae, 0x00, 0x63, 0x00, 0x00, 0x00, 0x14, 0x06, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3f, 0x01, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x06, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x21, 0x22, 0x2e, 0x02, 0x34, 0x3f, 0x01, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x21, 0x32, 0x17, 0x16, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2f, 0x01, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x05, 0x93, 0x05, 0x05, 0xd8, 0x04, 0x08, 0x06, 0x0f, 0x06, 0x06, 0x06, 0x05, 0x06, 0x03, 0x18, 0x03, 0x05, 0x06, 0x04, 0x07, 0x08, 0x06, 0xfe, 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, 0x51, 0x05, 0x02, 0x06, 0x07, 0x05, 0x07, 0xfd, 0xd9, 0x07, 0x0d, 0x0b, 0x05, 0x02, 0x35, 0x35, 0x01, 0x69, 0x02, 0x05, 0x06, 0x05, 0x06, 0x07, 0x07, 0x02, 0x27, 0x07, 0x05, 0x08, 0x05, 0x02, 0x05, 0x51, 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, 0xfe, 0x06, 0x08, 0x07, 0x04, 0x06, 0x05, 0x03, 0x18, 0x03, 0x06, 0x05, 0x06, 0x06, 0x06, 0x0f, 0x06, 0x08, 0x04, 0xd8, 0x05, 0x02, 0x8b, 0x12, 0x0e, 0x06, 0xf0, 0x04, 0x05, 0x03, 0x03, 0x04, 0x05, 0x06, 0x0e, 0x09, 0x04, 0x0b, 0x63, 0x0b, 0x05, 0x07, 0x0f, 0x06, 0x05, 0x03, 0x04, 0x03, 0x04, 0x05, 0x05, 0x08, 0xb4, 0x0a, 0x03, 0x05, 0x04, 0x03, 0x06, 0x0c, 0x0e, 0x12, 0x06, 0x75, 0x75, 0x14, 0x02, 0xe8, 0x06, 0x12, 0x0e, 0x06, 0x05, 0x04, 0x03, 0x03, 0x03, 0x06, 0x03, 0x0a, 0xb4, 0x08, 0x05, 0x05, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x0f, 0x07, 0x05, 0x0b, 0x63, 0x0b, 0x04, 0x09, 0x0e, 0x06, 0x05, 0x04, 0x03, 0x03, 0x05, 0x04, 0xf0, 0x06, 0x00, 0x00, 0x01, 0x00, 0x91, 0x00, 0xf1, 0x05, 0x94, 0x04, 0x13, 0x00, 0x63, 0x00, 0x00, 0x00, 0x14, 0x06, 0x07, 0x01, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3f, 0x01, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x06, 0x07, 0x06, 0x0f, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x21, 0x22, 0x2e, 0x02, 0x34, 0x3f, 0x01, 0x36, 0x34, 0x27, 0x03, 0x26, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x21, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x13, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2f, 0x01, 0x26, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x01, 0x16, 0x05, 0x93, 0x05, 0x05, 0xfe, 0x98, 0x05, 0x07, 0x06, 0x0f, 0x06, 0x06, 0x06, 0x05, 0x06, 0x03, 0x4e, 0x03, 0x05, 0x06, 0x04, 0x07, 0x08, 0x06, 0x53, 0x07, 0x06, 0x07, 0x05, 0x04, 0x04, 0x6c, 0x05, 0x02, 0x06, 0x07, 0x05, 0x07, 0xfd, 0xac, 0x07, 0x0d, 0x0b, 0x05, 0x03, 0x42, 0x42, 0x01, 0x8d, 0x02, 0x05, 0x06, 0x05, 0x06, 0x07, 0x07, 0x02, 0x54, 0x07, 0x05, 0x08, 0x05, 0x03, 0x04, 0x75, 0x04, 0x04, 0x05, 0x07, 0x06, 0x07, 0x53, 0x06, 0x08, 0x07, 0x04, 0x06, 0x05, 0x03, 0x4e, 0x03, 0x06, 0x05, 0x06, 0x06, 0x06, 0x0f, 0x06, 0x07, 0x05, 0x01, 0x68, 0x05, 0x02, 0x8b, 0x12, 0x0f, 0x05, 0xfe, 0x98, 0x05, 0x04, 0x03, 0x03, 0x04, 0x05, 0x06, 0x0e, 0x09, 0x07, 0x08, 0xdb, 0x08, 0x08, 0x07, 0x0f, 0x06, 0x05, 0x03, 0x04, 0x03, 0x04, 0x05, 0x05, 0x08, 0xf0, 0x0a, 0x03, 0x05, 0x04, 0x03, 0x06, 0x0c, 0x0e, 0x12, 0x06, 0x93, 0x93, 0x14, 0x02, 0x01, 0x38, 0x06, 0x12, 0x0e, 0x06, 0x05, 0x04, 0x03, 0x03, 0x03, 0x06, 0x03, 0x0a, 0xfe, 0xfc, 0x08, 0x05, 0x05, 0x04, 0x03, 0x04, 0x03, 0x05, 0x06, 0x0f, 0x07, 0x08, 0x08, 0xdb, 0x08, 0x07, 0x09, 0x0e, 0x06, 0x05, 0x04, 0x03, 0x03, 0x04, 0x05, 0xfe, 0x98, 0x05, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x69, 0x00, 0xa6, 0x05, 0xaf, 0x04, 0x5e, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x27, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x07, 0x23, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x2f, 0x01, 0x33, 0x16, 0x17, 0x16, 0x01, 0x23, 0x3e, 0x01, 0x37, 0x21, 0x35, 0x21, 0x0e, 0x01, 0x03, 0x1e, 0x01, 0x17, 0x21, 0x35, 0x21, 0x2e, 0x01, 0x27, 0x05, 0xae, 0x7a, 0x4b, 0x7e, 0x42, 0x61, 0x29, 0x29, 0x90, 0x22, 0x40, 0x40, 0x22, 0x90, 0x12, 0x40, 0x61, 0x41, 0x7f, 0x4b, 0xfe, 0x04, 0x5e, 0x11, 0x31, 0x26, 0xfd, 0x27, 0x03, 0x82, 0x63, 0x44, 0x0c, 0x0c, 0x44, 0x63, 0xfc, 0x7e, 0x02, 0xd9, 0x26, 0x31, 0x11, 0x02, 0x82, 0x4f, 0x55, 0x8f, 0xa9, 0x6e, 0x6d, 0xa4, 0x27, 0x36, 0x36, 0x27, 0xa4, 0x31, 0xaa, 0xa4, 0x94, 0x55, 0xfd, 0xd5, 0x3d, 0x85, 0x48, 0x64, 0x8e, 0xb7, 0x03, 0x8f, 0x29, 0xb7, 0x8e, 0x64, 0x48, 0x85, 0x3d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xfe, 0xb2, 0x02, 0x88, 0x06, 0x26, 0x00, 0x19, 0x00, 0x00, 0x01, 0x2a, 0x01, 0x27, 0x24, 0x03, 0x26, 0x00, 0x27, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x37, 0x36, 0x15, 0x14, 0x00, 0x07, 0x06, 0x05, 0x16, 0x36, 0x37, 0x02, 0x88, 0x08, 0x5e, 0x31, 0xfe, 0x74, 0x02, 0x01, 0x01, 0x49, 0x04, 0x03, 0x54, 0x34, 0x29, 0x7a, 0x2d, 0xc0, 0xc8, 0xfe, 0xd2, 0x07, 0x0b, 0x01, 0x00, 0x4a, 0x3e, 0x12, 0xfe, 0xb2, 0x0b, 0x53, 0x01, 0x52, 0xae, 0x03, 0xf5, 0x51, 0x4f, 0x89, 0x31, 0xd8, 0x01, 0x01, 0xcc, 0xa1, 0xfc, 0x4c, 0x8f, 0xdc, 0x48, 0x15, 0x01, 0x02, 0x00, 0x00, 0x01, 0x00, 0x47, 0xfe, 0xb2, 0x02, 0x6d, 0x06, 0x26, 0x00, 0x19, 0x00, 0x00, 0x13, 0x35, 0x1e, 0x01, 0x37, 0x24, 0x27, 0x26, 0x00, 0x35, 0x34, 0x17, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x06, 0x00, 0x07, 0x02, 0x05, 0x06, 0x22, 0x47, 0x12, 0x3e, 0x4a, 0x01, 0x00, 0x0b, 0x06, 0xfe, 0xd1, 0xc8, 0xc0, 0x2d, 0x7a, 0x28, 0x35, 0x54, 0x03, 0x04, 0x01, 0x49, 0x01, 0x02, 0xfe, 0x74, 0x31, 0x5e, 0xfe, 0xb2, 0x8f, 0x02, 0x01, 0x15, 0x48, 0xdc, 0x8f, 0x03, 0xb4, 0xa1, 0xcc, 0x01, 0x01, 0xd8, 0x31, 0x89, 0x4f, 0x51, 0xfc, 0x0b, 0xae, 0xfe, 0xae, 0x53, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x05, 0xfe, 0x23, 0x03, 0x8a, 0x06, 0x75, 0x00, 0x03, 0x00, 0x06, 0x00, 0x09, 0x00, 0x00, 0x09, 0x05, 0x21, 0x09, 0x01, 0x21, 0x01, 0xc6, 0x01, 0xc3, 0xfe, 0x3d, 0xfe, 0x3f, 0x01, 0xc1, 0xfe, 0xbc, 0x02, 0x8a, 0xfe, 0xba, 0x01, 0x46, 0xfd, 0x76, 0x06, 0x75, 0xfb, 0xdb, 0xfb, 0xd3, 0x04, 0x2d, 0x03, 0x31, 0xfd, 0x08, 0xfc, 0x8e, 0x03, 0x00, 0x00, 0x02, 0x00, 0x9e, 0xfe, 0xf2, 0x02, 0xdf, 0x06, 0x14, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x25, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0xf8, 0xb4, 0xfe, 0xf2, 0x02, 0x40, 0xd8, 0xd8, 0xfd, 0xc0, 0x05, 0xb0, 0xf9, 0xa6, 0x06, 0x5a, 0x64, 0x64, 0xf9, 0xa6, 0x64, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9d, 0xfe, 0xf2, 0x02, 0xde, 0x06, 0x14, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x23, 0x11, 0x33, 0x13, 0x11, 0x21, 0x35, 0x33, 0x11, 0x23, 0x35, 0x02, 0x84, 0xb4, 0xb4, 0x5a, 0xfd, 0xc0, 0xd8, 0xd8, 0x05, 0xb0, 0xf9, 0xa6, 0x06, 0xbe, 0xf8, 0xde, 0x64, 0x06, 0x5a, 0x64, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa4, 0xfe, 0xf2, 0x02, 0x3c, 0x06, 0x12, 0x00, 0x05, 0x00, 0x00, 0x1b, 0x01, 0x33, 0x03, 0x13, 0x23, 0xa5, 0xfd, 0x9a, 0xfe, 0xfe, 0x9a, 0x02, 0x82, 0x03, 0x90, 0xfc, 0x70, 0xfc, 0x70, 0x00, 0x00, 0x00, 0x01, 0x00, 0x93, 0xfe, 0xf2, 0x02, 0x2b, 0x06, 0x12, 0x00, 0x05, 0x00, 0x00, 0x01, 0x03, 0x23, 0x13, 0x03, 0x33, 0x02, 0x2a, 0xfd, 0x99, 0xfd, 0xfd, 0x99, 0x02, 0x82, 0xfc, 0x70, 0x03, 0x90, 0x03, 0x90, 0x00, 0xff, 0xff, 0x00, 0xa4, 0xfe, 0xf2, 0x03, 0x6e, 0x06, 0x12, 0x10, 0x26, 0x0c, 0x97, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x97, 0x01, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0x93, 0xfe, 0xf2, 0x03, 0x5d, 0x06, 0x12, 0x10, 0x26, 0x0c, 0x98, 0x00, 0x00, 0x10, 0x07, 0x0c, 0x98, 0x01, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x51, 0x00, 0x00, 0x05, 0xb9, 0x05, 0xdc, 0x00, 0x16, 0x00, 0x00, 0x09, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x27, 0x11, 0x23, 0x11, 0x27, 0x07, 0x11, 0x23, 0x11, 0x07, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x03, 0x2e, 0x02, 0x8a, 0x6c, 0x52, 0x6c, 0xbe, 0x6c, 0x5f, 0x5f, 0x6c, 0xbd, 0x6c, 0x53, 0x6c, 0x02, 0x8a, 0x05, 0xdc, 0xfd, 0x2c, 0x78, 0x5c, 0xfd, 0x14, 0x03, 0x65, 0xd3, 0xfb, 0xc8, 0x04, 0xb0, 0x68, 0x68, 0xfb, 0x50, 0x04, 0x38, 0xd3, 0xfc, 0x9b, 0x02, 0xec, 0x5c, 0x78, 0x02, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x50, 0xff, 0xf9, 0x05, 0xb7, 0x05, 0xd5, 0x00, 0x16, 0x00, 0x00, 0x05, 0x01, 0x37, 0x17, 0x11, 0x33, 0x11, 0x17, 0x11, 0x33, 0x11, 0x17, 0x37, 0x11, 0x33, 0x11, 0x37, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x02, 0xda, 0xfd, 0x76, 0x6c, 0x53, 0x6c, 0xbd, 0x6c, 0x5f, 0x60, 0x6c, 0xbd, 0x6c, 0x52, 0x6c, 0xfd, 0x77, 0x07, 0x02, 0xd4, 0x78, 0x5c, 0x02, 0xec, 0xfc, 0x9b, 0xd3, 0x04, 0x38, 0xfb, 0x50, 0x68, 0x68, 0x04, 0xb0, 0xfb, 0xc8, 0xd3, 0x03, 0x65, 0xfd, 0x14, 0x5c, 0x78, 0xfd, 0x2c, 0x00, 0x01, 0x00, 0x47, 0x00, 0x6c, 0x05, 0xde, 0x05, 0x44, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x30, 0x37, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x02, 0x28, 0x6b, 0x39, 0x4a, 0x46, 0xab, 0x43, 0x4d, 0x36, 0x3c, 0x3b, 0x1e, 0x1f, 0x3a, 0x39, 0x4a, 0x46, 0xab, 0x43, 0x4d, 0x36, 0x3c, 0x1d, 0x15, 0x06, 0xd1, 0x6c, 0xfe, 0x9f, 0x51, 0xfe, 0x9d, 0x6c, 0xd2, 0x07, 0x20, 0x2c, 0x50, 0x4b, 0x69, 0x5c, 0x78, 0x73, 0x61, 0x66, 0x4e, 0x52, 0x2a, 0x29, 0x29, 0x2a, 0x52, 0x4a, 0x6a, 0x5c, 0x78, 0x73, 0x61, 0x60, 0x01, 0x21, 0x78, 0x3f, 0x23, 0x21, 0x21, 0x27, 0x3b, 0x42, 0xa2, 0x5d, 0x59, 0x51, 0x53, 0x40, 0x3f, 0x23, 0x21, 0x21, 0x27, 0x3b, 0x42, 0x51, 0x39, 0x3f, 0xea, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0xe9, 0x60, 0x58, 0x71, 0x59, 0x53, 0x34, 0x2e, 0x2e, 0x30, 0x57, 0x59, 0x71, 0x70, 0x7b, 0x7f, 0x70, 0x71, 0x59, 0x53, 0x34, 0x2e, 0x2e, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x00, 0x7c, 0x05, 0xde, 0x05, 0x54, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x37, 0x17, 0x01, 0x23, 0x01, 0x37, 0x17, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x03, 0xfd, 0x55, 0x5f, 0x62, 0x73, 0x78, 0x5c, 0x69, 0x4b, 0x50, 0x2c, 0x29, 0x29, 0x2c, 0x50, 0x4f, 0x65, 0x61, 0x73, 0x78, 0x5d, 0x68, 0x4c, 0x50, 0x2b, 0x20, 0x08, 0xd1, 0x6c, 0xfe, 0x9e, 0x51, 0xfe, 0x9f, 0x6c, 0xd1, 0x07, 0x14, 0x1e, 0x3b, 0x36, 0x4e, 0x42, 0xac, 0x46, 0x4a, 0x39, 0x3a, 0x1f, 0x1e, 0x3c, 0x3b, 0x36, 0x4d, 0x43, 0xab, 0x46, 0x4a, 0x3a, 0x01, 0x31, 0x5a, 0x2d, 0x2e, 0x2e, 0x34, 0x53, 0x59, 0x71, 0x70, 0x7f, 0x7b, 0x70, 0x71, 0x59, 0x57, 0x30, 0x2e, 0x2e, 0x34, 0x53, 0x59, 0x71, 0x58, 0x60, 0xe9, 0x78, 0xfe, 0x76, 0x01, 0x8a, 0x78, 0xea, 0x3f, 0x39, 0x51, 0x42, 0x3b, 0x27, 0x21, 0x21, 0x23, 0x3f, 0x40, 0x53, 0x51, 0x59, 0x5d, 0xa2, 0x42, 0x3b, 0x27, 0x21, 0x21, 0x23, 0x3f, 0x00, 0x03, 0x00, 0x69, 0xff, 0xe3, 0x07, 0xfb, 0x05, 0x24, 0x00, 0x25, 0x00, 0x39, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x23, 0x35, 0x33, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x21, 0x27, 0x37, 0x24, 0x22, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x11, 0x33, 0x11, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x07, 0xfb, 0xfe, 0x9e, 0x6c, 0xd2, 0xfe, 0xc3, 0x0a, 0x1d, 0x2d, 0x59, 0x58, 0xd6, 0xf8, 0xd7, 0x58, 0x59, 0x2c, 0x1e, 0x0a, 0xaa, 0xaa, 0x09, 0x1f, 0x2c, 0x59, 0x58, 0xd7, 0xf8, 0xd6, 0x58, 0x59, 0x2d, 0x1e, 0x09, 0x01, 0x3d, 0xd2, 0x6c, 0xfd, 0x32, 0xc1, 0x53, 0x53, 0x44, 0x46, 0x22, 0x15, 0x08, 0x01, 0x83, 0x99, 0x01, 0x83, 0x08, 0x14, 0x23, 0x45, 0x44, 0x53, 0x01, 0x1b, 0xfe, 0x7d, 0x99, 0xfe, 0x7d, 0x09, 0x14, 0x22, 0x46, 0x44, 0x53, 0x53, 0xc1, 0x54, 0x53, 0x44, 0x45, 0x23, 0x13, 0x02, 0xaf, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x5a, 0x51, 0x76, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x76, 0x51, 0x5a, 0xaa, 0x5b, 0x52, 0x77, 0x63, 0x62, 0x64, 0x64, 0x62, 0x63, 0x77, 0x52, 0x5b, 0xe9, 0x78, 0x56, 0x27, 0x27, 0x4c, 0x4d, 0x5c, 0x37, 0x3d, 0x01, 0x65, 0xfe, 0x9b, 0x3d, 0x37, 0x5c, 0x4d, 0x4c, 0x27, 0xfd, 0xc6, 0xfe, 0x9b, 0x01, 0x65, 0x3b, 0x36, 0x5c, 0x4d, 0x4c, 0x27, 0x27, 0x27, 0x27, 0x4c, 0x4d, 0x5c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x09, 0xea, 0x04, 0x38, 0x00, 0x09, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x08, 0x93, 0xf7, 0x6d, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x09, 0x00, 0x00, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x21, 0x27, 0x37, 0x09, 0xf8, 0xfe, 0x9f, 0x6c, 0xd1, 0xf7, 0x6d, 0x08, 0x93, 0xd1, 0x6c, 0x02, 0xaf, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xaa, 0xe9, 0x78, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x35, 0x01, 0x17, 0x07, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x17, 0x07, 0x5a, 0x01, 0x62, 0x6c, 0xd2, 0x07, 0xa6, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0xf8, 0x5a, 0xd2, 0x6c, 0x02, 0x55, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0xe9, 0x78, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x09, 0xea, 0x04, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x21, 0x15, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x01, 0x68, 0x08, 0x81, 0xf7, 0xeb, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x08, 0x15, 0xf7, 0x7f, 0x5e, 0x02, 0x19, 0x78, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0x78, 0x69, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x37, 0x27, 0x21, 0x35, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x35, 0x08, 0xea, 0x5f, 0x5f, 0xf7, 0x7f, 0x08, 0x15, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x53, 0xf7, 0xeb, 0x02, 0x19, 0x69, 0x69, 0x78, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x5d, 0x78, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x05, 0x00, 0x15, 0x00, 0x00, 0x01, 0x21, 0x37, 0x27, 0x21, 0x07, 0x05, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x01, 0x68, 0x07, 0x82, 0x5f, 0x5f, 0xf8, 0x7e, 0x5e, 0x07, 0x74, 0xf9, 0x56, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x06, 0xaa, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x02, 0x19, 0x69, 0x69, 0x69, 0xe1, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0xcc, 0x09, 0xea, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x11, 0x33, 0x11, 0x23, 0x09, 0x50, 0xf8, 0x06, 0xd2, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0xd2, 0x07, 0xfa, 0x99, 0x99, 0x02, 0x2d, 0xe9, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0xe9, 0x01, 0x59, 0xfc, 0xa4, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x01, 0x02, 0x99, 0x99, 0x07, 0xfa, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0x02, 0x2d, 0xfe, 0xa7, 0x03, 0x5c, 0xfe, 0xa7, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xcc, 0x09, 0xea, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x00, 0x01, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x35, 0x33, 0x11, 0x23, 0x11, 0x35, 0x21, 0x07, 0x17, 0x09, 0x50, 0xf8, 0x84, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x07, 0x7c, 0x99, 0x99, 0xf8, 0x18, 0x5e, 0x5e, 0x01, 0xa1, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0xcd, 0xfc, 0xa4, 0x01, 0x45, 0xd2, 0x69, 0x69, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x00, 0x01, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x15, 0x23, 0x11, 0x33, 0x11, 0x15, 0x21, 0x37, 0x27, 0x01, 0x02, 0x07, 0x7c, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x53, 0xf8, 0x84, 0x99, 0x99, 0x07, 0xe8, 0x5f, 0x5f, 0x03, 0x63, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x5d, 0xcd, 0x03, 0x5c, 0xfe, 0xbb, 0xd2, 0x69, 0x69, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0x00, 0xcc, 0x09, 0xf9, 0x04, 0x38, 0x00, 0x25, 0x00, 0x00, 0x13, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x17, 0x37, 0x33, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x23, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x07, 0x27, 0x69, 0x3f, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x3f, 0x7d, 0xd1, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0xd1, 0x59, 0x63, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0xa2, 0x3f, 0x02, 0xd7, 0x46, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x46, 0xe9, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0xe9, 0x6e, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0xb4, 0x46, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x05, 0x14, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x02, 0x1c, 0x04, 0x09, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x02, 0x1c, 0x01, 0xd3, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x02, 0x1c, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x05, 0x14, 0x04, 0x38, 0x06, 0x40, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x05, 0x14, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x02, 0xdd, 0x04, 0x38, 0x04, 0x09, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x02, 0xdd, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x00, 0xa7, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0x00, 0xa7, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0xff, 0x9c, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x02, 0x1c, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0xff, 0x9c, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x03, 0x2a, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0xff, 0x9c, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x01, 0xd3, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x04, 0x09, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x0e, 0xfe, 0x70, 0x04, 0x38, 0x06, 0x40, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x05, 0x14, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x02, 0xdd, 0x10, 0x27, 0x11, 0x33, 0x03, 0x2a, 0x00, 0xa7, 0x10, 0x27, 0x11, 0x33, 0x01, 0x0e, 0xfe, 0x70, 0x10, 0x07, 0x11, 0x33, 0x03, 0x2a, 0xfe, 0x70, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0xcc, 0x05, 0xa0, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x00, 0x01, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x35, 0x33, 0x11, 0x23, 0x11, 0x35, 0x21, 0x07, 0x17, 0x05, 0x06, 0xfc, 0xce, 0x54, 0x6c, 0xfe, 0x9e, 0x01, 0x62, 0x6c, 0x54, 0x03, 0x32, 0x99, 0x99, 0xfc, 0x62, 0x5e, 0x5e, 0x01, 0xa1, 0x5d, 0x78, 0x01, 0x89, 0x5a, 0x01, 0x89, 0x78, 0x5d, 0xcd, 0xfc, 0xa4, 0x01, 0x45, 0xd2, 0x69, 0x69, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0x00, 0xcc, 0x05, 0xaf, 0x04, 0x38, 0x00, 0x0d, 0x00, 0x12, 0x00, 0x00, 0x01, 0x21, 0x27, 0x37, 0x01, 0x15, 0x01, 0x27, 0x37, 0x21, 0x15, 0x23, 0x11, 0x33, 0x11, 0x15, 0x21, 0x37, 0x27, 0x01, 0x02, 0x03, 0x32, 0x53, 0x6c, 0x01, 0x61, 0xfe, 0x9f, 0x6c, 0x53, 0xfc, 0xce, 0x99, 0x99, 0x03, 0x9e, 0x5f, 0x5f, 0x03, 0x63, 0x5d, 0x78, 0xfe, 0x77, 0x5a, 0xfe, 0x77, 0x78, 0x5d, 0xcd, 0x03, 0x5c, 0xfe, 0xbb, 0xd2, 0x69, 0x69, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe6, 0x00, 0x00, 0x05, 0x22, 0x05, 0xdc, 0x00, 0x11, 0x00, 0x00, 0x13, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x23, 0x11, 0x27, 0x11, 0x23, 0x11, 0x07, 0x11, 0x23, 0x11, 0x07, 0xe6, 0x01, 0xf6, 0x51, 0x01, 0xf5, 0x6c, 0x53, 0x6c, 0xbd, 0x6c, 0xbd, 0x6c, 0x53, 0x03, 0xae, 0x02, 0x2e, 0xfd, 0xd2, 0x78, 0x5c, 0xfc, 0x6e, 0x04, 0x0a, 0xd3, 0xfb, 0x23, 0x04, 0xdd, 0xd3, 0xfb, 0xf6, 0x03, 0x92, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xe6, 0xff, 0xf9, 0x05, 0x22, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x00, 0x13, 0x37, 0x17, 0x11, 0x33, 0x11, 0x17, 0x11, 0x33, 0x11, 0x37, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x23, 0xe6, 0x6c, 0x53, 0x6c, 0xbd, 0x6c, 0xbd, 0x6c, 0x53, 0x6c, 0xfe, 0x0b, 0x51, 0x02, 0x27, 0x78, 0x5c, 0x03, 0x92, 0xfb, 0xf6, 0xd3, 0x04, 0xdd, 0xfb, 0x23, 0xd3, 0x04, 0x0a, 0xfc, 0x6e, 0x5c, 0x78, 0xfd, 0xd2, 0x00, 0x00, 0x02, 0x00, 0x47, 0x00, 0x80, 0x04, 0xa4, 0x06, 0xb5, 0x00, 0x1e, 0x00, 0x3d, 0x00, 0x00, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x10, 0x37, 0x36, 0x37, 0x36, 0x37, 0x01, 0x17, 0x07, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x10, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x03, 0x30, 0x17, 0x07, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x14, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x02, 0x77, 0x72, 0x65, 0x60, 0x56, 0x4d, 0x2d, 0x29, 0x29, 0x2d, 0x4d, 0x58, 0x67, 0x01, 0x61, 0x6c, 0xd1, 0x56, 0x4f, 0x61, 0x55, 0x4e, 0x2c, 0x29, 0x29, 0x2c, 0x4e, 0x55, 0x61, 0x64, 0x42, 0xd2, 0x6c, 0xfe, 0xda, 0x50, 0x3e, 0x39, 0x1f, 0x1e, 0x1e, 0x23, 0x35, 0x3b, 0x92, 0x54, 0x50, 0x49, 0x4b, 0x39, 0x39, 0x1f, 0x1e, 0x1e, 0x23, 0x35, 0x3b, 0x49, 0x34, 0x80, 0x2e, 0x2d, 0x5c, 0x5a, 0x6e, 0x6c, 0x01, 0x00, 0x6c, 0x6e, 0x5a, 0x5f, 0x2e, 0x01, 0x89, 0x78, 0xe9, 0x08, 0x24, 0x2d, 0x5c, 0x5a, 0x6e, 0x6c, 0xff, 0x00, 0x6c, 0x6e, 0x5a, 0x5c, 0x2d, 0x2e, 0x04, 0x29, 0xe8, 0x78, 0x01, 0x46, 0x21, 0x46, 0x40, 0x52, 0x4e, 0xbe, 0x4a, 0x56, 0x3c, 0x42, 0x42, 0x21, 0x23, 0x40, 0x40, 0x52, 0x4e, 0xbe, 0x4a, 0x56, 0x3c, 0x42, 0x21, 0x17, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x00, 0x80, 0x04, 0xa4, 0x06, 0xb5, 0x00, 0x1e, 0x00, 0x3c, 0x00, 0x00, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x10, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x27, 0x37, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x10, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x03, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x01, 0x27, 0x02, 0x73, 0x6e, 0x65, 0x60, 0x56, 0x4d, 0x2d, 0x29, 0x29, 0x2d, 0x4d, 0x56, 0x60, 0x4f, 0x57, 0xd2, 0x6c, 0x01, 0x61, 0x67, 0x58, 0x4e, 0x2c, 0x29, 0x29, 0x2c, 0x4e, 0x55, 0x61, 0x64, 0xa0, 0x38, 0x34, 0x49, 0x3b, 0x35, 0x23, 0x1e, 0x1e, 0x1f, 0x39, 0x3a, 0x4a, 0x49, 0x50, 0x54, 0x92, 0x3b, 0x35, 0x23, 0x1e, 0x1e, 0x1f, 0x39, 0x3e, 0x4f, 0xfe, 0xd9, 0x6c, 0x80, 0x2e, 0x2d, 0x5c, 0x5a, 0x6e, 0x6c, 0x01, 0x00, 0x6c, 0x6e, 0x5a, 0x5c, 0x2d, 0x24, 0x08, 0xe9, 0x78, 0xfe, 0x77, 0x2e, 0x5f, 0x5a, 0x6e, 0x6c, 0xff, 0x00, 0x6c, 0x6e, 0x5a, 0x5c, 0x2d, 0x2e, 0x04, 0x29, 0x07, 0x17, 0x21, 0x42, 0x3c, 0x56, 0x4a, 0xbe, 0x4e, 0x52, 0x40, 0x40, 0x23, 0x21, 0x42, 0x42, 0x3c, 0x56, 0x4a, 0xbe, 0x4e, 0x52, 0x40, 0x46, 0x21, 0xfe, 0xba, 0x78, 0x00, 0x02, 0x00, 0xe6, 0xfe, 0xb2, 0x04, 0x63, 0x06, 0x14, 0x00, 0x10, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x15, 0x14, 0x16, 0x17, 0x26, 0x35, 0x11, 0x34, 0x37, 0x0e, 0x01, 0x1d, 0x01, 0x10, 0x07, 0x16, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x3d, 0x01, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x34, 0x36, 0x33, 0x02, 0x59, 0x44, 0x9e, 0x2d, 0x2b, 0x9e, 0x42, 0x9b, 0x9b, 0x02, 0x09, 0x2f, 0x7e, 0x4d, 0x4d, 0x7e, 0x2f, 0xec, 0xe0, 0x97, 0x61, 0x80, 0x38, 0x38, 0x80, 0x61, 0x97, 0xe0, 0x01, 0x12, 0xef, 0x98, 0x6d, 0x07, 0x47, 0x9d, 0x04, 0xd0, 0xa1, 0x42, 0x07, 0x6b, 0x98, 0xf0, 0xfe, 0xee, 0x3e, 0x44, 0x03, 0xf4, 0x64, 0x57, 0x8e, 0xfb, 0x30, 0x8d, 0x58, 0x64, 0x94, 0xdd, 0xef, 0x97, 0x74, 0x8f, 0x73, 0x95, 0xf0, 0xdd, 0x93, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xe6, 0xfe, 0xb2, 0x04, 0x63, 0x06, 0x14, 0x00, 0x10, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x10, 0x37, 0x26, 0x11, 0x35, 0x34, 0x26, 0x27, 0x16, 0x15, 0x11, 0x14, 0x07, 0x3e, 0x01, 0x35, 0x01, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x02, 0xf0, 0x9b, 0x9b, 0x42, 0x9f, 0x2c, 0x2d, 0x9e, 0x44, 0xfd, 0xf6, 0xed, 0xe0, 0x97, 0x61, 0x7f, 0x38, 0x38, 0x7f, 0x61, 0x97, 0xe0, 0xed, 0x30, 0x7e, 0x4d, 0x4d, 0x7e, 0x30, 0x01, 0x12, 0x01, 0x0e, 0x44, 0x3e, 0x01, 0x12, 0xf0, 0x98, 0x6b, 0x07, 0x42, 0xa1, 0xfb, 0x30, 0x9d, 0x47, 0x07, 0x6d, 0x98, 0x05, 0xf1, 0x93, 0xdd, 0xf0, 0x95, 0x73, 0x8f, 0x74, 0x97, 0xef, 0xdd, 0x94, 0x64, 0x58, 0x8d, 0x04, 0xd0, 0x8e, 0x57, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x32, 0x05, 0x46, 0x05, 0xf9, 0x00, 0x02, 0x00, 0x06, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0x05, 0x11, 0x09, 0x02, 0x35, 0x01, 0x05, 0x09, 0x01, 0x03, 0x11, 0x01, 0x15, 0x04, 0xac, 0xfd, 0x00, 0x03, 0x99, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0x17, 0x03, 0x01, 0xfc, 0xff, 0x99, 0x04, 0x82, 0xcc, 0x02, 0x64, 0xfe, 0xce, 0xfd, 0xcc, 0x01, 0xe1, 0xa6, 0x01, 0xe1, 0x07, 0x01, 0x32, 0x01, 0x32, 0xfc, 0x9a, 0x04, 0x68, 0xfe, 0x1f, 0xa6, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x1e, 0x06, 0x70, 0x04, 0xe6, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x25, 0x23, 0x11, 0x33, 0x01, 0x11, 0x09, 0x02, 0x35, 0x01, 0x06, 0x70, 0x99, 0x99, 0xfe, 0x3c, 0xfc, 0xf8, 0x03, 0xa1, 0xfb, 0x7e, 0x04, 0x82, 0x1e, 0x04, 0xc8, 0xfc, 0x3a, 0x02, 0xc4, 0xfe, 0x9e, 0xfd, 0x9c, 0x02, 0x11, 0xa6, 0x02, 0x11, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x1e, 0x06, 0x70, 0x04, 0xe6, 0x00, 0x03, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x37, 0x11, 0x33, 0x11, 0x09, 0x02, 0x03, 0x11, 0x01, 0x15, 0xc3, 0x99, 0x01, 0x2b, 0x03, 0x08, 0xfc, 0xf8, 0x99, 0x04, 0x82, 0x1e, 0x04, 0xc8, 0xfb, 0x38, 0x01, 0x02, 0x01, 0x62, 0x01, 0x62, 0xfc, 0x3a, 0x04, 0xc8, 0xfd, 0xef, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x05, 0x00, 0x08, 0x00, 0x00, 0x17, 0x11, 0x09, 0x01, 0x11, 0x01, 0x37, 0x01, 0x11, 0xc3, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0x2a, 0x8b, 0x01, 0xb2, 0x3e, 0x05, 0x80, 0xfd, 0xb0, 0x02, 0x50, 0xfa, 0x80, 0x02, 0x4e, 0x71, 0xfe, 0xa2, 0x02, 0xc6, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x05, 0x00, 0x08, 0x00, 0x00, 0x17, 0x11, 0x09, 0x01, 0x11, 0x01, 0x27, 0x01, 0x11, 0xc3, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0x2a, 0x8c, 0xfe, 0x4e, 0x3e, 0x05, 0x80, 0xfd, 0xb0, 0x02, 0x50, 0xfa, 0x80, 0x02, 0x4e, 0x71, 0x01, 0x5e, 0xfd, 0x44, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x05, 0x00, 0x00, 0x17, 0x11, 0x09, 0x01, 0x11, 0x01, 0xc3, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0x2a, 0x3e, 0x05, 0x80, 0xfd, 0xb0, 0x02, 0x50, 0xfa, 0x80, 0x02, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x08, 0x00, 0x00, 0x25, 0x15, 0x09, 0x01, 0x11, 0x09, 0x01, 0x15, 0x01, 0x06, 0x70, 0xfd, 0x2a, 0xfd, 0x29, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0xb5, 0xa2, 0xe0, 0x02, 0x4e, 0xfd, 0xb2, 0x05, 0x80, 0xfd, 0xb0, 0x02, 0x50, 0xdd, 0xfe, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0xff, 0xc2, 0x06, 0x70, 0x05, 0x42, 0x00, 0x08, 0x00, 0x00, 0x13, 0x35, 0x09, 0x01, 0x11, 0x09, 0x01, 0x35, 0x01, 0xc3, 0x02, 0xd7, 0x02, 0xd6, 0xfd, 0x2a, 0xfd, 0x29, 0x02, 0x4b, 0x04, 0x62, 0xe0, 0xfd, 0xb2, 0x02, 0x4e, 0xfa, 0x80, 0x02, 0x50, 0xfd, 0xb0, 0xdd, 0x01, 0xe4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0xfe, 0x23, 0x03, 0x8a, 0x06, 0x75, 0x00, 0x03, 0x00, 0x00, 0x09, 0x03, 0x01, 0xc7, 0x01, 0xc2, 0xfe, 0x3e, 0xfe, 0x3e, 0x06, 0x75, 0xfb, 0xdb, 0xfb, 0xd3, 0x04, 0x2d, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0x04, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x01, 0xd8, 0x97, 0x01, 0x2b, 0x97, 0x01, 0x14, 0xfe, 0xec, 0x97, 0xfe, 0xd5, 0x97, 0xfe, 0xeb, 0x02, 0xd7, 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0x2d, 0xfd, 0xd3, 0xaa, 0xfd, 0xd3, 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0x2d, 0xaa, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc3, 0x00, 0x00, 0x05, 0x46, 0x05, 0x04, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x01, 0x7e, 0x97, 0xa4, 0x97, 0xa4, 0x97, 0xba, 0xba, 0x97, 0xa4, 0x97, 0xa4, 0x97, 0xbb, 0x02, 0xd7, 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0x2d, 0xfd, 0xd3, 0xaa, 0xfd, 0xd3, 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0x2d, 0xfd, 0xd3, 0x02, 0x2d, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x34, 0xfe, 0x6b, 0x06, 0xff, 0x05, 0xfb, 0x00, 0x03, 0x00, 0x1d, 0x00, 0x37, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x24, 0x20, 0x04, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x04, 0x20, 0x24, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x11, 0x01, 0x11, 0xfe, 0xef, 0x01, 0x19, 0xfe, 0xe0, 0x7e, 0x7c, 0x66, 0x69, 0x66, 0x66, 0x69, 0x66, 0x7c, 0x7e, 0x01, 0x20, 0x7e, 0x7b, 0x67, 0x68, 0x66, 0x66, 0x68, 0x67, 0x7b, 0xfe, 0x3e, 0x01, 0x67, 0x01, 0x33, 0x80, 0x80, 0x40, 0x3f, 0x3f, 0x40, 0x80, 0x80, 0xfe, 0xcd, 0xfe, 0x99, 0xfe, 0xcd, 0x80, 0x80, 0x40, 0x3f, 0x3f, 0x40, 0x80, 0x80, 0x02, 0xe8, 0xfe, 0x92, 0x03, 0xc8, 0x3b, 0x3a, 0x72, 0x73, 0xfe, 0xec, 0xa3, 0x9f, 0xfe, 0xec, 0x73, 0x72, 0x3a, 0x3b, 0x3b, 0x3a, 0x72, 0x73, 0x01, 0x14, 0x9f, 0xa3, 0x01, 0x14, 0x73, 0x72, 0x3a, 0xf4, 0x90, 0x8d, 0x8e, 0xac, 0xaa, 0xc9, 0xc5, 0xac, 0xaa, 0x8e, 0x8d, 0x90, 0x90, 0x8d, 0x8e, 0xaa, 0xac, 0xc5, 0xc9, 0xaa, 0xac, 0x8e, 0x8d, 0x00, 0x00, 0x00, 0x03, 0x00, 0x34, 0xfe, 0x6b, 0x06, 0xff, 0x05, 0xfb, 0x00, 0x19, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x24, 0x20, 0x04, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x04, 0x20, 0x24, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x05, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x04, 0x2a, 0xfe, 0xe0, 0x7e, 0x7c, 0x66, 0x69, 0x66, 0x66, 0x69, 0x66, 0x7c, 0x7e, 0x01, 0x20, 0x7e, 0x7b, 0x67, 0x68, 0x66, 0x66, 0x68, 0x67, 0x7b, 0xfe, 0x3e, 0x01, 0x67, 0x01, 0x33, 0x80, 0x80, 0x40, 0x3f, 0x3f, 0x40, 0x80, 0x80, 0xfe, 0xcd, 0xfe, 0x99, 0xfe, 0xcd, 0x80, 0x80, 0x40, 0x3f, 0x3f, 0x40, 0x80, 0x73, 0x02, 0x3f, 0x02, 0x4c, 0xfd, 0xb4, 0x97, 0xfd, 0xb4, 0x02, 0x4c, 0x05, 0x42, 0x3b, 0x3a, 0x72, 0x73, 0xfe, 0xec, 0xa3, 0x9f, 0xfe, 0xec, 0x73, 0x72, 0x3a, 0x3b, 0x3b, 0x3a, 0x72, 0x73, 0x01, 0x14, 0x9f, 0xa3, 0x01, 0x14, 0x73, 0x72, 0x3a, 0xf4, 0x90, 0x8d, 0x8e, 0xac, 0xaa, 0xc9, 0xc5, 0xac, 0xaa, 0x8e, 0x8d, 0x90, 0x90, 0x8d, 0x8e, 0xaa, 0xac, 0xc5, 0xc9, 0xaa, 0xac, 0x8e, 0x80, 0x4b, 0xfd, 0x73, 0xaa, 0xfd, 0x73, 0x02, 0x8d, 0xaa, 0x02, 0x8d, 0x00, 0x00, 0x00, 0x03, 0x00, 0x34, 0xfe, 0x6b, 0x06, 0xff, 0x05, 0xfb, 0x00, 0x19, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x20, 0x07, 0x06, 0x07, 0x06, 0x02, 0x15, 0x14, 0x12, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x12, 0x35, 0x34, 0x02, 0x27, 0x26, 0x27, 0x24, 0x20, 0x04, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x04, 0x20, 0x24, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x17, 0x09, 0x01, 0x17, 0x09, 0x01, 0x07, 0x09, 0x01, 0x27, 0x09, 0x01, 0x04, 0x2a, 0xfe, 0xe0, 0x7e, 0x7c, 0x66, 0x69, 0x66, 0x66, 0x69, 0x66, 0x7c, 0x7e, 0x01, 0x20, 0x7e, 0x7b, 0x67, 0x68, 0x66, 0x66, 0x68, 0x67, 0x7b, 0xfe, 0x3e, 0x01, 0x67, 0x01, 0x33, 0x80, 0x80, 0x40, 0x3f, 0x3f, 0x40, 0x80, 0x80, 0xfe, 0xcd, 0xfe, 0x99, 0xfe, 0xcd, 0x80, 0x80, 0x40, 0x3f, 0x3f, 0x40, 0x80, 0x73, 0x53, 0x01, 0xa0, 0x01, 0xa0, 0x6c, 0xfe, 0x60, 0x01, 0xa0, 0x6b, 0xfe, 0x60, 0xfe, 0x61, 0x6d, 0x01, 0xa0, 0xfe, 0x60, 0x05, 0x42, 0x3b, 0x3a, 0x72, 0x73, 0xfe, 0xec, 0xa3, 0x9f, 0xfe, 0xec, 0x73, 0x72, 0x3a, 0x3b, 0x3b, 0x3a, 0x72, 0x73, 0x01, 0x14, 0x9f, 0xa3, 0x01, 0x14, 0x73, 0x72, 0x3a, 0xf4, 0x90, 0x8d, 0x8e, 0xac, 0xaa, 0xc9, 0xc5, 0xac, 0xaa, 0x8e, 0x8d, 0x90, 0x90, 0x8d, 0x8e, 0xaa, 0xac, 0xc5, 0xc9, 0xaa, 0xac, 0x8e, 0x80, 0xe8, 0xfe, 0x33, 0x01, 0xcd, 0x78, 0xfe, 0x32, 0xfe, 0x33, 0x77, 0x01, 0xcd, 0xfe, 0x33, 0x78, 0x01, 0xce, 0x01, 0xcd, 0xff, 0xff, 0x00, 0x69, 0xfe, 0x4d, 0x09, 0x22, 0x06, 0x0e, 0x10, 0x27, 0x09, 0x07, 0x05, 0xca, 0x00, 0x00, 0x10, 0x26, 0x09, 0x07, 0x00, 0x00, 0x10, 0x27, 0x09, 0x07, 0x01, 0xee, 0x00, 0x00, 0x10, 0x07, 0x09, 0x07, 0x03, 0xdc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x1d, 0x00, 0x00, 0x17, 0x16, 0x33, 0x32, 0x37, 0x13, 0x23, 0x35, 0x33, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x33, 0x15, 0x23, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0xee, 0x10, 0x35, 0x3e, 0x07, 0x1d, 0xf7, 0xfe, 0x17, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x0f, 0x36, 0x3e, 0x07, 0x16, 0xf7, 0xfe, 0x1d, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x9b, 0x82, 0xaf, 0x02, 0x9a, 0xaa, 0x02, 0x0c, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0xfe, 0x0d, 0xaa, 0xfd, 0x4d, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x25, 0x00, 0x00, 0x17, 0x16, 0x33, 0x32, 0x37, 0x13, 0x23, 0x35, 0x33, 0x37, 0x21, 0x35, 0x21, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x33, 0x15, 0x23, 0x07, 0x21, 0x15, 0x21, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0xee, 0x10, 0x35, 0x3e, 0x07, 0x14, 0xee, 0xf5, 0x0b, 0xff, 0x00, 0x01, 0x07, 0x0e, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0c, 0xed, 0xf5, 0x0a, 0x00, 0xff, 0xfe, 0xf9, 0x14, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x9b, 0x82, 0xaf, 0x01, 0xce, 0xaa, 0xf0, 0xa8, 0x01, 0x40, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0xfe, 0xd9, 0xa8, 0xf0, 0xaa, 0xfe, 0x19, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x25, 0x15, 0x05, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x05, 0x35, 0x25, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x02, 0xd2, 0x10, 0x35, 0x3e, 0x07, 0x17, 0x01, 0x22, 0xfe, 0xd7, 0x1c, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x18, 0xfe, 0xde, 0x01, 0x29, 0x1c, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x04, 0xf6, 0x82, 0xaf, 0xfd, 0xe7, 0xb6, 0xa0, 0xba, 0xfd, 0x6d, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x02, 0x19, 0xb6, 0xa0, 0xba, 0x02, 0x93, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x2a, 0x00, 0x33, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x07, 0x26, 0x27, 0x03, 0x36, 0x37, 0x17, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x01, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x02, 0xd2, 0x10, 0x35, 0x3e, 0x07, 0x0c, 0x89, 0x42, 0x66, 0x24, 0x48, 0x14, 0x1d, 0x13, 0x38, 0x31, 0x3d, 0x0d, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x0e, 0x07, 0x8f, 0x89, 0x73, 0x12, 0xfe, 0x34, 0x14, 0x37, 0x28, 0x40, 0x43, 0x21, 0x04, 0xf6, 0x82, 0xaf, 0xfe, 0xd6, 0x29, 0x88, 0x41, 0x48, 0x21, 0xfe, 0x2b, 0x06, 0x11, 0x70, 0x24, 0x09, 0xfe, 0xbe, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x01, 0x31, 0x18, 0x49, 0x6f, 0x9b, 0x9c, 0x73, 0x56, 0x13, 0x01, 0x3c, 0xa4, 0x88, 0x7a, 0x8f, 0xfc, 0x45, 0x01, 0xd6, 0x11, 0x2e, 0x4a, 0x67, 0x68, 0x48, 0x24, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0xc3, 0x06, 0x0e, 0x00, 0x32, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x36, 0x37, 0x36, 0x3d, 0x01, 0x07, 0x27, 0x37, 0x33, 0x17, 0x07, 0x27, 0x15, 0x14, 0x07, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x33, 0x14, 0x17, 0x16, 0x17, 0x13, 0x3e, 0x01, 0x32, 0x17, 0x16, 0x17, 0x02, 0xd2, 0x10, 0x35, 0x3e, 0x07, 0x27, 0x3a, 0x2a, 0x4e, 0x54, 0x41, 0xaa, 0x31, 0xa9, 0x41, 0x53, 0x62, 0x4d, 0x62, 0x0f, 0x08, 0x90, 0x88, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3d, 0x08, 0x0f, 0x52, 0x38, 0x6b, 0x5c, 0x48, 0x2e, 0x27, 0x28, 0x07, 0x90, 0x88, 0x42, 0x30, 0x13, 0x04, 0xf6, 0x82, 0xaf, 0xfc, 0x78, 0x10, 0x2f, 0x55, 0x72, 0x1e, 0x5d, 0x48, 0xbd, 0xbd, 0x48, 0x5d, 0x1e, 0x9c, 0x6c, 0x56, 0x11, 0xfe, 0xa1, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x01, 0x4d, 0x19, 0x3e, 0x77, 0x9a, 0x72, 0x4e, 0x33, 0x0b, 0x03, 0x99, 0xa5, 0x87, 0x46, 0x34, 0x8f, 0x00, 0x00, 0x02, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x03, 0x00, 0x21, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x03, 0x13, 0x21, 0x11, 0x21, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x21, 0x11, 0x21, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x01, 0x87, 0xbd, 0xbd, 0x0f, 0x10, 0x01, 0x51, 0xfe, 0xc8, 0x12, 0x07, 0x92, 0x88, 0x71, 0x12, 0x85, 0x10, 0x33, 0x3f, 0x08, 0x0c, 0x01, 0x19, 0xfe, 0xc4, 0x0b, 0x08, 0x98, 0x82, 0x71, 0x12, 0x85, 0x10, 0x33, 0x40, 0x02, 0xa6, 0xfe, 0xfd, 0xea, 0x01, 0x72, 0x02, 0x30, 0x01, 0xae, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xf5, 0xfc, 0xbc, 0xfe, 0xff, 0xad, 0x7f, 0x7d, 0x8c, 0x0f, 0x82, 0x00, 0x02, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x03, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x13, 0x06, 0x07, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x10, 0x07, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x01, 0x87, 0xbd, 0xbd, 0x59, 0x25, 0x1c, 0x14, 0x07, 0x92, 0x88, 0x71, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0c, 0x59, 0x3b, 0x63, 0x63, 0x4d, 0x68, 0x0d, 0x08, 0x91, 0x88, 0x72, 0x12, 0x85, 0x10, 0x33, 0x3f, 0x08, 0x14, 0x24, 0x31, 0x63, 0x7a, 0x85, 0x02, 0xa6, 0xfe, 0x01, 0x7e, 0x02, 0x05, 0x01, 0xc3, 0xa7, 0x85, 0x7c, 0x8d, 0x0f, 0x82, 0xaf, 0xfe, 0xd6, 0x18, 0x4b, 0x7c, 0xfe, 0xd2, 0x6f, 0x55, 0x13, 0xfe, 0xbe, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0x01, 0xb6, 0x10, 0x93, 0xd8, 0x7f, 0x00, 0x00, 0x02, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0xff, 0x06, 0x0e, 0x00, 0x03, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x01, 0x16, 0x33, 0x32, 0x37, 0x13, 0x16, 0x17, 0x16, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x07, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x36, 0x33, 0x32, 0x16, 0x10, 0x06, 0x23, 0x22, 0x27, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x02, 0x4e, 0xbd, 0xbd, 0xfe, 0xa0, 0x10, 0x35, 0x3e, 0x07, 0x18, 0x29, 0x32, 0x65, 0xb2, 0x87, 0x7c, 0x65, 0xc0, 0x4b, 0x16, 0x05, 0x92, 0x88, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0d, 0x35, 0x3d, 0x98, 0xb9, 0xc6, 0x8b, 0x4e, 0x42, 0x0f, 0x08, 0x90, 0x88, 0x73, 0x12, 0x02, 0xae, 0xfe, 0xfd, 0xb5, 0x82, 0xaf, 0x02, 0x33, 0x3e, 0x1c, 0x36, 0x91, 0xd1, 0x8f, 0xa1, 0x02, 0x5d, 0xa4, 0x88, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0xfe, 0xcb, 0x13, 0xe9, 0xfe, 0xd2, 0xdb, 0x21, 0xfe, 0xa3, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x03, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x31, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x16, 0x36, 0x34, 0x26, 0x22, 0x06, 0x14, 0x16, 0x03, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x10, 0x37, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x10, 0x07, 0x06, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x01, 0x82, 0xbe, 0xbe, 0xb7, 0x85, 0x7c, 0xc1, 0x81, 0x80, 0x92, 0x10, 0x35, 0x3e, 0x07, 0x0e, 0x54, 0x42, 0x63, 0x64, 0x4b, 0x69, 0x0e, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0c, 0x59, 0x3b, 0x63, 0x63, 0x4d, 0x68, 0x0d, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x02, 0xb0, 0xfe, 0x7a, 0x90, 0xd1, 0x8f, 0x91, 0xcf, 0x90, 0xfe, 0x2d, 0x82, 0xaf, 0x01, 0x31, 0x18, 0x49, 0x6f, 0x01, 0x37, 0x73, 0x56, 0x13, 0x01, 0x3c, 0xa4, 0x88, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0xfe, 0xd6, 0x18, 0x4b, 0x7c, 0xfe, 0xd2, 0x6f, 0x55, 0x13, 0xfe, 0xbe, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x00, 0x03, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x25, 0x00, 0x00, 0x37, 0x11, 0x21, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x33, 0x11, 0x21, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x1b, 0x01, 0x03, 0x33, 0x11, 0x21, 0x23, 0x11, 0x33, 0x89, 0x01, 0x1b, 0x0f, 0x07, 0x92, 0x88, 0x71, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0d, 0xfc, 0xfe, 0xe3, 0x0c, 0x08, 0x98, 0x80, 0x73, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x0c, 0xb1, 0x15, 0x9a, 0xfe, 0xe5, 0x9a, 0x84, 0x9b, 0x02, 0xfe, 0x01, 0x49, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0xfe, 0xd0, 0xfd, 0x02, 0xfe, 0xde, 0xad, 0x7f, 0x7b, 0x8e, 0x0f, 0x82, 0xaf, 0x01, 0x09, 0x02, 0x74, 0xfe, 0x16, 0x01, 0xea, 0xfe, 0x16, 0x00, 0x01, 0xff, 0xc4, 0xfe, 0x4d, 0x03, 0xfc, 0x06, 0x0e, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x35, 0x36, 0x37, 0x26, 0x27, 0x23, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x21, 0x17, 0x07, 0x01, 0x35, 0x01, 0x17, 0x07, 0x21, 0x13, 0x3e, 0x01, 0x32, 0x17, 0x16, 0x17, 0x02, 0xd2, 0x10, 0x35, 0x3e, 0x07, 0x16, 0xf3, 0x5a, 0x7d, 0x82, 0x55, 0x56, 0x07, 0x07, 0x56, 0xfa, 0x1d, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3d, 0x08, 0x1d, 0xfe, 0xf9, 0xa8, 0x56, 0xfe, 0xe5, 0x01, 0x1b, 0x56, 0xa8, 0x01, 0x0c, 0x19, 0x07, 0x8f, 0x89, 0x42, 0x30, 0x13, 0x04, 0xf6, 0x82, 0xaf, 0xfd, 0xef, 0x8f, 0xc6, 0x8c, 0x88, 0x04, 0x65, 0x62, 0x06, 0xfd, 0x49, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x02, 0x9e, 0xba, 0x60, 0x01, 0x3a, 0x48, 0x01, 0x3a, 0x60, 0xba, 0x02, 0x2a, 0xa5, 0x87, 0x46, 0x34, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x23, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x07, 0x27, 0x37, 0x27, 0x37, 0x17, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x02, 0xd2, 0x10, 0x35, 0x3e, 0x07, 0x12, 0x8d, 0x6c, 0xe2, 0xe2, 0x6c, 0x9f, 0x16, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x15, 0x8f, 0x6e, 0xe5, 0xe3, 0x6c, 0xa0, 0x15, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x04, 0xf6, 0x82, 0xaf, 0xfe, 0x58, 0x9d, 0x79, 0xfc, 0xfc, 0x78, 0xb0, 0xfd, 0xf4, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x01, 0xe2, 0xa0, 0x79, 0xfc, 0xfc, 0x78, 0xb3, 0x01, 0xd8, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x2a, 0x00, 0x00, 0x17, 0x16, 0x33, 0x32, 0x37, 0x13, 0x06, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x36, 0x37, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x16, 0x17, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x27, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0xee, 0x10, 0x35, 0x3e, 0x07, 0x29, 0x3b, 0x1d, 0x2e, 0x6d, 0x8b, 0x6d, 0x0d, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0c, 0x51, 0x38, 0x4e, 0x6d, 0x70, 0x28, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x9b, 0x82, 0xaf, 0x03, 0xa6, 0x10, 0x32, 0x50, 0x9c, 0xfe, 0xc8, 0x01, 0x49, 0xcf, 0xbc, 0x11, 0x01, 0x2b, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0xfe, 0xe6, 0x18, 0x45, 0x61, 0xd6, 0xfe, 0xb7, 0x01, 0x38, 0xf3, 0x32, 0xfc, 0x4a, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x00, 0x01, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x27, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x03, 0x36, 0x19, 0x01, 0x33, 0x11, 0x10, 0x07, 0x03, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x13, 0x26, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x13, 0x3e, 0x01, 0x32, 0x16, 0x17, 0x02, 0xd2, 0x10, 0x35, 0x3e, 0x07, 0x26, 0x84, 0x6d, 0xf6, 0x0f, 0x08, 0x8f, 0x89, 0x73, 0x12, 0x85, 0x10, 0x35, 0x3e, 0x07, 0x0f, 0x53, 0x39, 0x4d, 0x6d, 0x71, 0x27, 0x07, 0x8f, 0x89, 0x73, 0x12, 0x04, 0xf6, 0x82, 0xaf, 0xfc, 0x8d, 0x26, 0x01, 0x07, 0x01, 0x38, 0xfe, 0xb7, 0xfe, 0x8c, 0x27, 0xfe, 0xa2, 0xa5, 0x87, 0x7a, 0x8f, 0x0f, 0x82, 0xaf, 0x01, 0x4c, 0x17, 0x46, 0x61, 0xd6, 0x01, 0x49, 0xfe, 0xc8, 0xf5, 0x31, 0x03, 0x85, 0xa5, 0x87, 0x7a, 0x8f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x69, 0xfe, 0x4d, 0x03, 0x60, 0x06, 0xf9, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x01, 0x15, 0x21, 0x35, 0x01, 0xb3, 0x07, 0x92, 0x43, 0x45, 0x71, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x3a, 0x08, 0x91, 0x45, 0x43, 0x72, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x01, 0xe8, 0xfd, 0x3e, 0x04, 0xe2, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0xfa, 0xb0, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0x07, 0x67, 0xa0, 0xa0, 0x00, 0x00, 0x02, 0x00, 0x60, 0xfd, 0x62, 0x03, 0x57, 0x06, 0x0e, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x03, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x27, 0x37, 0x16, 0x33, 0x32, 0x37, 0x01, 0x35, 0x21, 0x15, 0x01, 0xb3, 0x07, 0x92, 0x43, 0x45, 0x71, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0x3a, 0x08, 0x91, 0x45, 0x43, 0x72, 0x12, 0x85, 0x10, 0x33, 0x40, 0x07, 0xfe, 0xe8, 0x02, 0xc3, 0x04, 0xe2, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0xfa, 0xb0, 0xa7, 0x85, 0x7d, 0x8c, 0x0f, 0x82, 0xaf, 0xfd, 0xd0, 0xa0, 0xa0, 0x00, 0xff, 0xff, 0x00, 0xfc, 0x00, 0x3f, 0x05, 0x0d, 0x04, 0xc5, 0x10, 0x06, 0x00, 0x99, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0x01, 0xd3, 0x05, 0x46, 0x04, 0x6a, 0x10, 0x26, 0x09, 0x18, 0x00, 0x00, 0x10, 0x07, 0x09, 0xa1, 0x01, 0xdf, 0x01, 0x24, 0xff, 0xff, 0x00, 0xc3, 0x00, 0x9f, 0x05, 0x46, 0x04, 0x6a, 0x10, 0x26, 0x09, 0x18, 0x00, 0x00, 0x10, 0x27, 0x09, 0xa1, 0x00, 0xd0, 0xfe, 0x57, 0x10, 0x07, 0x09, 0xa1, 0x02, 0xed, 0x01, 0x24, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x46, 0x04, 0xa6, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x05, 0x15, 0x01, 0x35, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0x5f, 0x03, 0xa1, 0xfb, 0x7e, 0x04, 0x82, 0x46, 0xb6, 0x01, 0xd1, 0xb6, 0x02, 0x65, 0xfe, 0x91, 0xfe, 0x93, 0xb6, 0x01, 0xd1, 0xa6, 0x01, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x46, 0x04, 0xa6, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x17, 0x01, 0x15, 0x01, 0x11, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xa1, 0x46, 0x01, 0xd1, 0xb6, 0xfe, 0x2f, 0x04, 0xec, 0xb6, 0xfe, 0x2f, 0xa6, 0xfe, 0x2f, 0xb6, 0x01, 0x6d, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x47, 0x04, 0xa6, 0x10, 0x27, 0x09, 0xa1, 0x03, 0xc4, 0xff, 0xbb, 0x10, 0x06, 0x0d, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x46, 0x04, 0xa6, 0x10, 0x26, 0x09, 0xa1, 0xfe, 0xbb, 0x10, 0x06, 0x0d, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x46, 0x05, 0x27, 0x10, 0x27, 0x09, 0xa1, 0x00, 0xf4, 0x01, 0xe1, 0x10, 0x06, 0x0d, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x46, 0x05, 0x27, 0x10, 0x27, 0x09, 0xa1, 0x02, 0xcd, 0x01, 0xe1, 0x10, 0x06, 0x0d, 0xd6, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x47, 0x06, 0x12, 0x10, 0x27, 0x09, 0xa1, 0x03, 0xc4, 0x02, 0xcc, 0x10, 0x06, 0x0d, 0xd5, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x04, 0x05, 0x46, 0x06, 0x0d, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xfe, 0x02, 0xc7, 0x10, 0x06, 0x0d, 0xd6, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0xf1, 0x05, 0x46, 0x05, 0x4e, 0x00, 0x1c, 0x00, 0x3a, 0x00, 0x41, 0x00, 0x00, 0x25, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x06, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x09, 0x0b, 0x0d, 0x8c, 0x55, 0x4d, 0x97, 0x5e, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x06, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x09, 0x04, 0x07, 0x0d, 0x8c, 0x55, 0x4d, 0x97, 0x5d, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0x50, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x04, 0x06, 0x3d, 0x4b, 0x01, 0x9b, 0xb2, 0x50, 0x44, 0x3a, 0x04, 0x04, 0x02, 0x06, 0x3c, 0x4c, 0x52, 0xb2, 0x4e, 0x44, 0x3a, 0x04, 0x02, 0x04, 0x06, 0x3c, 0x4a, 0x03, 0x5e, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0xf1, 0x05, 0x46, 0x05, 0x4e, 0x00, 0x1c, 0x00, 0x3a, 0x00, 0x41, 0x00, 0x00, 0x25, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x1e, 0x01, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x06, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x09, 0x0b, 0x0d, 0x8c, 0x55, 0x4d, 0x97, 0x5e, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x06, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x09, 0x04, 0x07, 0x0d, 0x8c, 0x55, 0x4d, 0x97, 0xfb, 0xdb, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x50, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x3b, 0x05, 0x04, 0x06, 0x3d, 0x4b, 0x01, 0x9b, 0xb2, 0x50, 0x44, 0x3a, 0x04, 0x04, 0x02, 0x06, 0x3c, 0x4c, 0x52, 0xb2, 0x4e, 0x44, 0x3a, 0x04, 0x02, 0x04, 0x06, 0x3c, 0x4a, 0x03, 0x5e, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x08, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x03, 0x4e, 0x87, 0x51, 0x01, 0xc1, 0xfd, 0xed, 0x78, 0x87, 0x51, 0xfe, 0x3f, 0x02, 0x13, 0x02, 0x6f, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0xa2, 0x50, 0xa8, 0xaa, 0xf8, 0x50, 0xa8, 0xaa, 0x03, 0x4e, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x08, 0x05, 0x46, 0x04, 0xa8, 0x00, 0x0b, 0x00, 0x12, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x03, 0x4e, 0x87, 0x51, 0x01, 0xc1, 0xfd, 0xed, 0x78, 0x87, 0x51, 0xfe, 0x3f, 0x02, 0x13, 0xfd, 0xed, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x01, 0xa2, 0x50, 0xa8, 0xaa, 0xf8, 0x50, 0xa8, 0xaa, 0x03, 0x4e, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0x5f, 0x05, 0x46, 0x05, 0x4e, 0x00, 0x36, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x07, 0x27, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x17, 0x16, 0x1f, 0x01, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x13, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x3d, 0x4b, 0x2e, 0x7e, 0x4e, 0x4d, 0x97, 0x5e, 0x5f, 0xa1, 0x58, 0x62, 0x84, 0x07, 0x53, 0x94, 0x50, 0x39, 0x2b, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x3e, 0x4b, 0x2e, 0x7d, 0x4e, 0x4f, 0x9b, 0x58, 0x5e, 0x51, 0x62, 0x45, 0x84, 0x64, 0x07, 0x52, 0x93, 0x50, 0x3a, 0x2c, 0x4d, 0x97, 0x5d, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0x96, 0xb2, 0x50, 0x44, 0x17, 0x83, 0x34, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x3b, 0x03, 0xe9, 0x40, 0xe2, 0x10, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x17, 0x82, 0x34, 0x4c, 0x52, 0xb2, 0x4e, 0x22, 0x2a, 0x08, 0x0e, 0x2c, 0x03, 0xe9, 0x40, 0xe3, 0x0f, 0x4a, 0x03, 0x5e, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0x5f, 0x05, 0x46, 0x05, 0x4e, 0x00, 0x35, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x07, 0x27, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x3d, 0x4b, 0x2e, 0x7e, 0x4e, 0x4d, 0x97, 0x5e, 0x5f, 0xa1, 0x58, 0x62, 0x84, 0x07, 0x53, 0x94, 0x50, 0x39, 0x2b, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x3e, 0x4b, 0x2e, 0x7d, 0x4e, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x07, 0x52, 0x93, 0x50, 0x3a, 0x2c, 0x4d, 0x97, 0xfb, 0xdb, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x01, 0x96, 0xb2, 0x50, 0x44, 0x17, 0x83, 0x34, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x3b, 0x03, 0xe9, 0x40, 0xe2, 0x10, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x17, 0x82, 0x34, 0x4c, 0x52, 0xb2, 0x4e, 0x44, 0x3a, 0x03, 0xe9, 0x40, 0xe3, 0x0f, 0x4a, 0x03, 0x5e, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfd, 0x84, 0x05, 0x46, 0x06, 0x54, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x01, 0x21, 0x35, 0x21, 0x01, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x21, 0x35, 0x21, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0x03, 0x1c, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0x03, 0xfb, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0xfd, 0x5c, 0xaa, 0xfb, 0x5e, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0x03, 0x7e, 0xaa, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfd, 0x84, 0x05, 0x46, 0x06, 0x54, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x13, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x01, 0x11, 0x35, 0x21, 0x15, 0x11, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x01, 0x35, 0x21, 0x15, 0xc3, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0xfe, 0x9a, 0x04, 0x82, 0x03, 0xfb, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0xfe, 0xe1, 0xaa, 0xaa, 0xfc, 0x08, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0x01, 0xf9, 0xaa, 0xaa, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xff, 0x02, 0x05, 0x46, 0x05, 0x4e, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x21, 0x15, 0x21, 0x09, 0x02, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x0f, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x0d, 0x14, 0x8c, 0x55, 0x4d, 0x97, 0xfb, 0xdc, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x81, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0x96, 0xb2, 0x50, 0x44, 0x3a, 0x08, 0x02, 0x06, 0x3c, 0x4b, 0x53, 0xb2, 0x4e, 0x44, 0x3a, 0x06, 0x0a, 0x3c, 0x4a, 0xfe, 0x6c, 0xaa, 0x05, 0x9c, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xff, 0x02, 0x05, 0x46, 0x05, 0x4e, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x21, 0x15, 0x21, 0x03, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x63, 0x83, 0x0f, 0x05, 0x0e, 0x8b, 0x55, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x63, 0x85, 0x0d, 0x14, 0x8c, 0x55, 0x4d, 0x97, 0xfb, 0xdc, 0x04, 0x82, 0xfb, 0x7e, 0x01, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0x01, 0x96, 0xb2, 0x50, 0x44, 0x3a, 0x08, 0x02, 0x06, 0x3c, 0x4b, 0x53, 0xb2, 0x4e, 0x44, 0x3a, 0x06, 0x0a, 0x3c, 0x4a, 0xfe, 0x6c, 0xaa, 0x05, 0x9c, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x12, 0x05, 0x46, 0x06, 0x0c, 0x00, 0x1a, 0x00, 0x21, 0x00, 0x28, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x01, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x01, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0xfe, 0x9a, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0xbe, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x09, 0x3d, 0x4b, 0x01, 0x4a, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0xfa, 0x3a, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x12, 0x05, 0x46, 0x06, 0x0c, 0x00, 0x1a, 0x00, 0x21, 0x00, 0x28, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x02, 0x16, 0x33, 0x32, 0x36, 0x01, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x10, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x0d, 0x14, 0x8b, 0x55, 0x4d, 0x98, 0xfb, 0xdb, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0x02, 0xbe, 0xb2, 0x4f, 0x45, 0x3b, 0x07, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x06, 0x09, 0x3d, 0x4b, 0x01, 0x4a, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0xfb, 0xbf, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x2c, 0x05, 0x46, 0x05, 0xd7, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x13, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x01, 0x11, 0x35, 0x21, 0x15, 0x11, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x01, 0x35, 0x21, 0x15, 0xc3, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0xfe, 0x9a, 0x04, 0x82, 0x01, 0x25, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0xfe, 0xe1, 0xaa, 0xaa, 0x04, 0x28, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0xf9, 0xd9, 0xaa, 0xaa, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x2c, 0x05, 0x46, 0x05, 0xd7, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x01, 0x21, 0x35, 0x21, 0x01, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x21, 0x35, 0x21, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0x03, 0x1c, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0x25, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0xfd, 0x5c, 0xaa, 0x03, 0x7e, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0xfb, 0x5e, 0xaa, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x36, 0x05, 0x46, 0x05, 0xee, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x09, 0x01, 0x35, 0x09, 0x01, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x01, 0x11, 0x35, 0x01, 0x15, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0x03, 0x1c, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0x03, 0x95, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0xfd, 0x56, 0x01, 0x2f, 0xb0, 0xfe, 0xd1, 0xfd, 0xa6, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0xfe, 0xd0, 0xb0, 0x01, 0x2f, 0xb0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x36, 0x05, 0x46, 0x05, 0xee, 0x00, 0x06, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x13, 0x2d, 0x01, 0x35, 0x01, 0x15, 0x01, 0x11, 0x35, 0x01, 0x15, 0x11, 0x15, 0x01, 0x35, 0x01, 0x15, 0x05, 0x09, 0x01, 0x35, 0x01, 0xc3, 0x03, 0x1d, 0xfc, 0xe3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xe4, 0x03, 0x1c, 0xfb, 0x7e, 0x04, 0x82, 0x03, 0x95, 0xd5, 0xd2, 0xb2, 0xfe, 0xd0, 0xaa, 0xfe, 0xd1, 0xfe, 0xdb, 0xb0, 0x01, 0x2f, 0xb0, 0xfd, 0x27, 0xb0, 0x01, 0x2f, 0xaa, 0x01, 0x30, 0xb2, 0xd2, 0xfd, 0x4b, 0x01, 0x2f, 0xb0, 0xfe, 0xd1, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x84, 0x05, 0x46, 0x05, 0x26, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x09, 0x01, 0x35, 0x01, 0x11, 0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0x5f, 0x04, 0x70, 0xfe, 0x2f, 0xb6, 0x01, 0xd1, 0xfb, 0x14, 0xb6, 0x01, 0xd1, 0xa6, 0x01, 0xd1, 0xb6, 0xfe, 0x93, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0x84, 0x05, 0x46, 0x05, 0x26, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x09, 0x02, 0x35, 0x01, 0x15, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xa1, 0xfc, 0x5f, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x70, 0xb6, 0xfe, 0x2f, 0xb6, 0xfd, 0x9b, 0x01, 0x6f, 0x01, 0x6d, 0xb6, 0xfe, 0x2f, 0xa6, 0xfe, 0x2f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x84, 0x05, 0x47, 0x05, 0x26, 0x10, 0x27, 0x09, 0xa1, 0x03, 0xc4, 0xfe, 0xee, 0x10, 0x06, 0x0d, 0xed, 0x00, 0x00, 0xff, 0xff, 0x00, 0xc3, 0xff, 0x84, 0x05, 0x46, 0x05, 0x26, 0x10, 0x27, 0x09, 0xa1, 0xff, 0xfe, 0xfe, 0xe4, 0x10, 0x06, 0x0d, 0xee, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc4, 0xff, 0xb6, 0x05, 0x46, 0x05, 0x7b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x11, 0x15, 0x01, 0x35, 0x01, 0x15, 0x09, 0x01, 0x35, 0x21, 0x15, 0xc4, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0xfe, 0xde, 0x04, 0x82, 0x04, 0xd1, 0xaa, 0xaa, 0xfb, 0x95, 0xb0, 0x01, 0x6f, 0xaa, 0x01, 0x70, 0xb2, 0xfe, 0xee, 0x02, 0x39, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc4, 0xff, 0xb6, 0x05, 0x46, 0x05, 0x7b, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x09, 0x02, 0x35, 0x01, 0x15, 0x09, 0x01, 0x21, 0x35, 0x21, 0x05, 0x46, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0xfc, 0xa0, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0x04, 0xd1, 0xaa, 0xfa, 0xeb, 0x01, 0x15, 0x01, 0x12, 0xb2, 0xfe, 0x90, 0xaa, 0xfe, 0x91, 0x03, 0xfe, 0xaa, 0x00, 0x03, 0x00, 0xc3, 0xff, 0xc0, 0x05, 0x46, 0x05, 0xcd, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x15, 0x11, 0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0x03, 0xab, 0xb2, 0x01, 0x70, 0xb2, 0xfd, 0x4e, 0xb2, 0x01, 0x70, 0xb2, 0xfc, 0x97, 0xb0, 0x01, 0x6f, 0xaa, 0x01, 0x70, 0xb2, 0xfe, 0xee, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xff, 0xc0, 0x05, 0x46, 0x05, 0xcd, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x09, 0x01, 0x35, 0x01, 0x11, 0x01, 0x35, 0x09, 0x03, 0x35, 0x01, 0x15, 0x01, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0xfc, 0xa0, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xab, 0x01, 0x70, 0xb2, 0xfe, 0x90, 0xfe, 0x0c, 0x01, 0x70, 0xb2, 0xfe, 0x90, 0xfd, 0x55, 0x01, 0x15, 0x01, 0x12, 0xb2, 0xfe, 0x90, 0xaa, 0xfe, 0x91, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x11, 0x05, 0x46, 0x05, 0x28, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x03, 0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0x05, 0x46, 0x5e, 0x97, 0x4d, 0x55, 0x8c, 0x0d, 0x0b, 0x09, 0x85, 0x63, 0x56, 0xa2, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x0b, 0x09, 0x83, 0x63, 0x58, 0xa1, 0x5f, 0x01, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0x03, 0xca, 0x54, 0x4c, 0x3e, 0x06, 0x04, 0x04, 0x3c, 0x46, 0x4e, 0xb2, 0x54, 0x4c, 0x3e, 0x06, 0x04, 0x04, 0x3c, 0x46, 0x4e, 0xfc, 0x45, 0xb0, 0x01, 0x6f, 0xaa, 0x01, 0x70, 0xb2, 0xfe, 0xee, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0x00, 0x30, 0x05, 0x46, 0x05, 0x28, 0x00, 0x1b, 0x00, 0x22, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x09, 0x02, 0x35, 0x01, 0x15, 0x01, 0x05, 0x46, 0x5e, 0x97, 0x4d, 0x55, 0x8c, 0x0d, 0x0b, 0x09, 0x85, 0x63, 0x56, 0xa2, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x0b, 0x09, 0x83, 0x63, 0x58, 0xa1, 0x5f, 0xfb, 0x7d, 0x03, 0x61, 0xfc, 0x9f, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0xca, 0x54, 0x4c, 0x3e, 0x06, 0x04, 0x04, 0x3c, 0x46, 0x4e, 0xb2, 0x54, 0x4c, 0x3e, 0x06, 0x04, 0x04, 0x3c, 0x46, 0x4e, 0xfc, 0x64, 0x01, 0x15, 0x01, 0x12, 0xb2, 0xfe, 0x90, 0xaa, 0xfe, 0x91, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x98, 0x05, 0x46, 0x05, 0xd4, 0x00, 0x03, 0x00, 0x07, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x00, 0x17, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x13, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x03, 0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0x5e, 0x97, 0x4d, 0x55, 0x8c, 0x0d, 0x0b, 0x09, 0x85, 0x63, 0x56, 0xa2, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x05, 0x06, 0x09, 0x83, 0x63, 0x58, 0xa1, 0x5f, 0x01, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0x3e, 0xaa, 0xaa, 0xfe, 0xd6, 0xaa, 0xaa, 0x05, 0xdc, 0x56, 0x4a, 0x3c, 0x06, 0x04, 0x06, 0x3a, 0x44, 0x4e, 0xb4, 0x54, 0x4c, 0x3c, 0x06, 0x02, 0x04, 0x04, 0x3a, 0x44, 0x4e, 0xfc, 0x44, 0xb0, 0x01, 0x6f, 0xaa, 0x01, 0x70, 0xb2, 0xfe, 0xee, 0x00, 0x00, 0x00, 0x04, 0x00, 0xc3, 0xfe, 0x98, 0x05, 0x46, 0x05, 0xd4, 0x00, 0x03, 0x00, 0x07, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x00, 0x17, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x13, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x09, 0x02, 0x35, 0x01, 0x15, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0x01, 0x5e, 0x97, 0x4d, 0x55, 0x8c, 0x0d, 0x0b, 0x09, 0x85, 0x63, 0x56, 0xa2, 0x5e, 0x58, 0x9b, 0x4f, 0x55, 0x8b, 0x0e, 0x05, 0x06, 0x09, 0x83, 0x63, 0x58, 0xa1, 0x5f, 0xfb, 0x7d, 0x03, 0x60, 0xfc, 0xa0, 0x04, 0x82, 0xfb, 0x7e, 0x3e, 0xaa, 0xaa, 0xfe, 0xd6, 0xaa, 0xaa, 0x05, 0xdc, 0x56, 0x4a, 0x3c, 0x06, 0x04, 0x06, 0x3a, 0x44, 0x4e, 0xb4, 0x54, 0x4c, 0x3c, 0x06, 0x02, 0x04, 0x04, 0x3a, 0x44, 0x4e, 0xfc, 0x44, 0x01, 0x15, 0x01, 0x12, 0xb2, 0xfe, 0x90, 0xaa, 0xfe, 0x91, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0x00, 0x66, 0x05, 0x46, 0x04, 0xce, 0x00, 0x03, 0x00, 0x20, 0x00, 0x24, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x21, 0x35, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x33, 0x15, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x15, 0x21, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x42, 0x3c, 0x2a, 0x32, 0x1b, 0x18, 0x04, 0xfe, 0x8d, 0xf0, 0x0b, 0x1a, 0x31, 0x4e, 0x51, 0xb9, 0x50, 0x4d, 0x32, 0x19, 0x0d, 0xef, 0xfe, 0x8e, 0x03, 0x19, 0x1b, 0x32, 0x29, 0xfd, 0x82, 0x04, 0x82, 0xfb, 0x7e, 0x02, 0x5a, 0xaa, 0x02, 0x7b, 0x04, 0x1e, 0x2b, 0x44, 0x44, 0x5c, 0xa8, 0x39, 0x33, 0x5b, 0x32, 0x33, 0x33, 0x32, 0x5b, 0x30, 0x3c, 0xa8, 0x5b, 0x45, 0x43, 0x2c, 0x1e, 0xfc, 0xe9, 0xaa, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xcf, 0x05, 0x46, 0x05, 0x57, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x37, 0x21, 0x15, 0x21, 0x01, 0x00, 0x05, 0x04, 0x01, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfe, 0xa7, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x59, 0xfe, 0xa7, 0xfc, 0xd7, 0x03, 0x29, 0x01, 0x59, 0x79, 0xaa, 0x04, 0xb1, 0xfe, 0xe5, 0x5d, 0x5d, 0xfe, 0xe5, 0xd7, 0x01, 0x78, 0x84, 0xa6, 0x7c, 0x01, 0x80, 0x00, 0x02, 0x00, 0xc3, 0xff, 0xcf, 0x05, 0x46, 0x05, 0x57, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x15, 0x21, 0x35, 0x11, 0x35, 0x00, 0x05, 0x30, 0x15, 0x04, 0x01, 0x35, 0x00, 0x25, 0x24, 0x05, 0x45, 0xfb, 0x7e, 0x01, 0x59, 0x03, 0x29, 0xfc, 0xd7, 0xfe, 0xa7, 0x01, 0x59, 0x01, 0xac, 0xfe, 0x54, 0x79, 0xaa, 0xaa, 0x04, 0x07, 0xd7, 0xfe, 0x80, 0x7c, 0xa6, 0x84, 0xfe, 0x88, 0xd7, 0x01, 0x1b, 0x5d, 0x5d, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xd7, 0x05, 0x46, 0x05, 0x57, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x01, 0x00, 0x05, 0x04, 0x01, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x03, 0x4e, 0x87, 0x51, 0x01, 0xc1, 0xfd, 0xed, 0x78, 0x87, 0x51, 0xfe, 0x3f, 0x02, 0x13, 0x02, 0x6f, 0xfe, 0xa7, 0xfe, 0x54, 0x01, 0xac, 0x01, 0x59, 0xfe, 0xa7, 0xfc, 0xd7, 0x03, 0x29, 0x01, 0x59, 0x01, 0x71, 0x50, 0xa8, 0xaa, 0xf8, 0x50, 0xa8, 0xaa, 0x04, 0x07, 0xfe, 0xe5, 0x5d, 0x5d, 0xfe, 0xe5, 0xd7, 0x01, 0x78, 0x84, 0xa6, 0x7c, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0xd7, 0x05, 0x46, 0x05, 0x57, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x00, 0x01, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x37, 0x21, 0x35, 0x21, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x00, 0x25, 0x24, 0x03, 0x4e, 0x87, 0x51, 0x01, 0xc1, 0xfd, 0xed, 0x78, 0x87, 0x51, 0xfe, 0x3f, 0x02, 0x13, 0xfd, 0xed, 0x01, 0x59, 0x03, 0x29, 0xfc, 0xd7, 0xfe, 0xa7, 0x01, 0x59, 0x01, 0xac, 0xfe, 0x54, 0x01, 0x71, 0x50, 0xa8, 0xaa, 0xf8, 0x50, 0xa8, 0xaa, 0x04, 0x07, 0xd7, 0xfe, 0x80, 0x7c, 0xa6, 0x84, 0xfe, 0x88, 0xd7, 0x01, 0x1b, 0x5d, 0x5d, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xff, 0x09, 0x05, 0x46, 0x05, 0x4b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, 0x00, 0x00, 0x37, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x11, 0x00, 0x05, 0x04, 0x05, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfe, 0xec, 0xfe, 0x0f, 0x01, 0xea, 0x01, 0x1b, 0xfe, 0xc6, 0xfc, 0xb8, 0x03, 0x48, 0x01, 0x3a, 0x33, 0xaa, 0xaa, 0xfe, 0xd6, 0xaa, 0xaa, 0x05, 0x6b, 0xfe, 0xe5, 0x2d, 0x51, 0xf7, 0xd7, 0x01, 0x74, 0x58, 0xa6, 0x56, 0x01, 0x76, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xff, 0x09, 0x05, 0x46, 0x05, 0x4b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, 0x00, 0x00, 0x37, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x24, 0x25, 0x24, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x01, 0x3a, 0x03, 0x48, 0xfc, 0xb8, 0xfe, 0xc6, 0x01, 0x1b, 0x01, 0xea, 0xfe, 0x10, 0x33, 0xaa, 0xaa, 0xfe, 0xd6, 0xaa, 0xaa, 0x05, 0x6b, 0xd7, 0xfe, 0x8a, 0x56, 0xa6, 0x58, 0xfe, 0x8c, 0xd7, 0xf7, 0x51, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0x71, 0x05, 0x46, 0x05, 0x4b, 0x00, 0x13, 0x00, 0x1e, 0x00, 0x00, 0x05, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x01, 0x00, 0x05, 0x04, 0x05, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x01, 0xef, 0xfe, 0xd4, 0x01, 0xab, 0x56, 0xfd, 0xff, 0x02, 0x81, 0x7b, 0x7d, 0x25, 0x01, 0x2e, 0xfe, 0x52, 0x56, 0x02, 0x04, 0xfd, 0x7d, 0x7c, 0x7c, 0x03, 0x7b, 0xfe, 0xec, 0xfe, 0x0f, 0x01, 0xea, 0x01, 0x1b, 0xfe, 0xc6, 0xfc, 0xb8, 0x03, 0x48, 0x01, 0x3a, 0xea, 0xaa, 0x73, 0xaa, 0xa4, 0x73, 0x31, 0xaa, 0x73, 0xaa, 0xa5, 0x74, 0x05, 0x8f, 0xfe, 0xe5, 0x2d, 0x51, 0xf7, 0xd7, 0x01, 0x74, 0x58, 0xa6, 0x56, 0x01, 0x76, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfe, 0x71, 0x05, 0x46, 0x05, 0x4b, 0x00, 0x13, 0x00, 0x1e, 0x00, 0x00, 0x05, 0x21, 0x35, 0x21, 0x37, 0x21, 0x35, 0x21, 0x37, 0x17, 0x07, 0x21, 0x15, 0x21, 0x07, 0x21, 0x15, 0x21, 0x07, 0x27, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x24, 0x25, 0x24, 0x01, 0xef, 0xfe, 0xd4, 0x01, 0xab, 0x56, 0xfd, 0xff, 0x02, 0x81, 0x7b, 0x7d, 0x25, 0x01, 0x2e, 0xfe, 0x52, 0x56, 0x02, 0x04, 0xfd, 0x7d, 0x7c, 0x7c, 0xfe, 0xf9, 0x01, 0x3a, 0x03, 0x48, 0xfc, 0xb8, 0xfe, 0xc6, 0x01, 0x1b, 0x01, 0xea, 0xfe, 0x10, 0xea, 0xaa, 0x73, 0xaa, 0xa4, 0x73, 0x31, 0xaa, 0x73, 0xaa, 0xa5, 0x74, 0x05, 0x8f, 0xd7, 0xfe, 0x8a, 0x56, 0xa6, 0x58, 0xfe, 0x8c, 0xd7, 0xf7, 0x51, 0x2d, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x79, 0x05, 0x46, 0x05, 0x8b, 0x00, 0x1d, 0x00, 0x3a, 0x00, 0x45, 0x00, 0x00, 0x05, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x37, 0x36, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3e, 0x01, 0x13, 0x00, 0x05, 0x04, 0x05, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa0, 0x58, 0x57, 0x91, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x08, 0x05, 0x06, 0x0e, 0x99, 0x8e, 0x9e, 0x5d, 0xfe, 0xec, 0xfe, 0x0f, 0x01, 0xea, 0x01, 0x1b, 0xfe, 0xc6, 0xfc, 0xb8, 0x03, 0x48, 0x01, 0x3a, 0x28, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x39, 0x0c, 0x06, 0x41, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x01, 0x9a, 0xb2, 0x4f, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x04, 0x02, 0x03, 0x06, 0x43, 0x0c, 0x45, 0x03, 0xec, 0xfe, 0xe5, 0x2d, 0x51, 0xf7, 0xd7, 0x01, 0x74, 0x58, 0xa6, 0x56, 0x01, 0x76, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0x79, 0x05, 0x46, 0x05, 0x8b, 0x00, 0x1d, 0x00, 0x3a, 0x00, 0x45, 0x00, 0x00, 0x05, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x37, 0x36, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x13, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3e, 0x01, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x24, 0x25, 0x24, 0x05, 0x45, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa0, 0x58, 0x57, 0x91, 0x09, 0x05, 0x05, 0x0e, 0x8b, 0x55, 0x4d, 0x98, 0x5d, 0x5e, 0xa1, 0x58, 0x63, 0x83, 0x09, 0x07, 0x05, 0x0d, 0x8c, 0x54, 0x50, 0x9a, 0x59, 0x5f, 0xa1, 0x57, 0x63, 0x85, 0x08, 0x05, 0x06, 0x0e, 0x99, 0x8e, 0x9e, 0xfb, 0xdb, 0x01, 0x3a, 0x03, 0x48, 0xfc, 0xb8, 0xfe, 0xc6, 0x01, 0x1b, 0x01, 0xea, 0xfe, 0x10, 0x28, 0xb3, 0x4e, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x54, 0xb3, 0x4e, 0x39, 0x0c, 0x06, 0x41, 0x05, 0x02, 0x02, 0x06, 0x3d, 0x4b, 0x01, 0x9a, 0xb2, 0x4f, 0x45, 0x3b, 0x04, 0x03, 0x02, 0x06, 0x3d, 0x4c, 0x53, 0xb2, 0x4e, 0x45, 0x3b, 0x04, 0x02, 0x03, 0x06, 0x43, 0x0c, 0x45, 0x03, 0xec, 0xd7, 0xfe, 0x8a, 0x56, 0xa6, 0x58, 0xfe, 0x8c, 0xd7, 0xf7, 0x51, 0x2d, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc3, 0xfd, 0xed, 0x05, 0x46, 0x05, 0x8b, 0x00, 0x36, 0x00, 0x41, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x07, 0x27, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x17, 0x16, 0x1f, 0x01, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x13, 0x00, 0x05, 0x04, 0x05, 0x15, 0x00, 0x25, 0x35, 0x24, 0x01, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x3d, 0x4b, 0x2e, 0x7e, 0x4e, 0x4d, 0x97, 0x5e, 0x5f, 0xa1, 0x58, 0x62, 0x84, 0x07, 0x53, 0x94, 0x50, 0x39, 0x2b, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x3e, 0x4b, 0x2e, 0x7d, 0x4e, 0x4f, 0x9b, 0x58, 0x5e, 0x51, 0x62, 0x45, 0x84, 0x64, 0x07, 0x52, 0x93, 0x50, 0x3a, 0x2c, 0x4d, 0x97, 0x5d, 0xfe, 0xec, 0xfe, 0x0f, 0x01, 0xea, 0x01, 0x1b, 0xfe, 0xc6, 0xfc, 0xb8, 0x03, 0x48, 0x01, 0x3a, 0x01, 0x24, 0xb2, 0x50, 0x44, 0x17, 0x83, 0x34, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x3b, 0x03, 0xe9, 0x40, 0xe2, 0x10, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x17, 0x82, 0x34, 0x4c, 0x52, 0xb2, 0x4e, 0x22, 0x2a, 0x08, 0x0e, 0x2c, 0x03, 0xe9, 0x40, 0xe3, 0x0f, 0x4a, 0x03, 0xe6, 0xfe, 0xe5, 0x2d, 0x51, 0xf7, 0xd7, 0x01, 0x74, 0x58, 0xa6, 0x56, 0x01, 0x76, 0x00, 0x02, 0x00, 0xc3, 0xfd, 0xed, 0x05, 0x46, 0x05, 0x8b, 0x00, 0x36, 0x00, 0x41, 0x00, 0x00, 0x01, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2f, 0x01, 0x07, 0x27, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x36, 0x37, 0x36, 0x17, 0x16, 0x1f, 0x01, 0x37, 0x17, 0x07, 0x16, 0x33, 0x32, 0x36, 0x01, 0x35, 0x00, 0x05, 0x15, 0x04, 0x01, 0x35, 0x24, 0x25, 0x24, 0x05, 0x46, 0x5f, 0xa1, 0x58, 0x3d, 0x4b, 0x2e, 0x7e, 0x4e, 0x4d, 0x97, 0x5e, 0x5f, 0xa1, 0x58, 0x62, 0x84, 0x07, 0x53, 0x94, 0x50, 0x39, 0x2b, 0x4f, 0x9b, 0x58, 0x5e, 0xa2, 0x56, 0x3e, 0x4b, 0x2e, 0x7d, 0x4e, 0x4f, 0x9b, 0x58, 0x5e, 0x51, 0x62, 0x45, 0x84, 0x64, 0x07, 0x52, 0x93, 0x50, 0x3a, 0x2c, 0x4d, 0x97, 0xfb, 0xdb, 0x01, 0x3a, 0x03, 0x48, 0xfc, 0xb8, 0xfe, 0xc6, 0x01, 0x1b, 0x01, 0xea, 0xfe, 0x10, 0x01, 0x24, 0xb2, 0x50, 0x44, 0x17, 0x83, 0x34, 0x4b, 0x55, 0xb3, 0x4e, 0x45, 0x3b, 0x03, 0xe9, 0x40, 0xe2, 0x10, 0x4c, 0x54, 0xb3, 0x4e, 0x45, 0x17, 0x82, 0x34, 0x4c, 0x52, 0xb2, 0x4e, 0x22, 0x2a, 0x08, 0x0e, 0x2c, 0x03, 0xe9, 0x40, 0xe3, 0x0f, 0x4a, 0x03, 0xe6, 0xd7, 0xfe, 0x8a, 0x56, 0xa6, 0x58, 0xfe, 0x8c, 0xd7, 0xf7, 0x51, 0x2d, 0x00, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0xa1, 0x05, 0x46, 0x04, 0xae, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x37, 0x01, 0x15, 0x01, 0x11, 0x01, 0x15, 0x09, 0x03, 0x15, 0x01, 0x35, 0x01, 0xc3, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfc, 0xa0, 0x03, 0x60, 0xfb, 0x7e, 0x04, 0x82, 0xc3, 0xfe, 0x90, 0xb2, 0x01, 0x70, 0x01, 0xf4, 0xfe, 0x90, 0xb2, 0x01, 0x70, 0x02, 0xab, 0xfe, 0xeb, 0xfe, 0xee, 0xb2, 0x01, 0x70, 0xaa, 0x01, 0x6f, 0x00, 0x00, 0x03, 0x00, 0xc3, 0xfe, 0xa1, 0x05, 0x46, 0x04, 0xae, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00, 0x25, 0x15, 0x01, 0x35, 0x01, 0x15, 0x01, 0x35, 0x11, 0x35, 0x01, 0x15, 0x01, 0x35, 0x01, 0x05, 0x45, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x04, 0x82, 0xfb, 0x7e, 0x03, 0x60, 0xc3, 0xb2, 0xfe, 0x90, 0xb2, 0x02, 0xb2, 0xb2, 0xfe, 0x90, 0xb2, 0x03, 0x69, 0xb0, 0xfe, 0x91, 0xaa, 0xfe, 0x90, 0xb2, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa2, 0xff, 0xc9, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x17, 0x01, 0x17, 0x01, 0x17, 0x11, 0x13, 0x27, 0x09, 0x02, 0x27, 0x21, 0x03, 0x62, 0x54, 0xfd, 0x6c, 0xac, 0x02, 0x93, 0x53, 0x5b, 0xae, 0xfd, 0x6d, 0xfe, 0xd5, 0x02, 0x94, 0xaf, 0x02, 0x87, 0x04, 0x4e, 0x5c, 0xfd, 0x23, 0xbf, 0x02, 0xdd, 0x5d, 0x01, 0x78, 0xfd, 0x96, 0xc2, 0xfd, 0x23, 0x01, 0x4c, 0x02, 0xdd, 0xc1, 0x00, 0x00, 0x00, 0x02, 0x01, 0x03, 0xff, 0xc9, 0x05, 0x70, 0x04, 0xb3, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x21, 0x11, 0x37, 0x01, 0x37, 0x09, 0x01, 0x11, 0x21, 0x07, 0x09, 0x02, 0x02, 0xb0, 0xfe, 0xae, 0x53, 0x02, 0x94, 0xab, 0xfd, 0x6d, 0xfe, 0xa6, 0x02, 0x87, 0xae, 0x02, 0x93, 0xfe, 0xd6, 0xfd, 0x6c, 0x04, 0x4e, 0xfe, 0x88, 0x5d, 0xfd, 0x23, 0xbf, 0x02, 0xdd, 0xfd, 0xf2, 0x02, 0xcf, 0xc1, 0xfd, 0x23, 0xfe, 0xb4, 0x02, 0xdd, 0x00, 0x00, 0x02, 0x00, 0xa2, 0x00, 0x34, 0x05, 0x10, 0x05, 0x1e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x07, 0x01, 0x07, 0x01, 0x07, 0x21, 0x05, 0x37, 0x09, 0x02, 0x37, 0x11, 0x04, 0xb4, 0x53, 0xfd, 0x6d, 0xac, 0x02, 0x94, 0x54, 0x01, 0x52, 0xfd, 0xd4, 0xaf, 0xfd, 0x6c, 0x01, 0x2b, 0x02, 0x93, 0xae, 0x02, 0x11, 0x5d, 0x02, 0xdd, 0xbf, 0xfd, 0x23, 0x5c, 0x65, 0xc1, 0x02, 0xdd, 0x01, 0x4c, 0xfd, 0x23, 0xc2, 0xfd, 0x31, 0x00, 0x00, 0x00, 0x02, 0x01, 0x03, 0x00, 0x34, 0x05, 0x70, 0x05, 0x1e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x27, 0x01, 0x27, 0x01, 0x27, 0x11, 0x03, 0x17, 0x09, 0x02, 0x17, 0x21, 0x02, 0xb0, 0x53, 0x02, 0x93, 0xab, 0xfd, 0x6c, 0x53, 0x5b, 0xae, 0x02, 0x94, 0x01, 0x2a, 0xfd, 0x6d, 0xae, 0xfd, 0x79, 0x99, 0x5c, 0x02, 0xdd, 0xbf, 0xfd, 0x23, 0x5d, 0xfe, 0x88, 0x02, 0x6a, 0xc2, 0x02, 0xdd, 0xfe, 0xb4, 0xfd, 0x23, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x31, 0x00, 0x86, 0x05, 0xaf, 0x04, 0x7e, 0x00, 0x09, 0x00, 0x13, 0x00, 0x00, 0x25, 0x09, 0x01, 0x11, 0x21, 0x11, 0x09, 0x01, 0x11, 0x21, 0x01, 0x15, 0x21, 0x35, 0x03, 0x13, 0x35, 0x21, 0x15, 0x13, 0x01, 0xfb, 0xfe, 0x37, 0x01, 0xc9, 0x01, 0xea, 0x01, 0xc9, 0xfe, 0x37, 0xfe, 0x16, 0x02, 0x44, 0xfd, 0x62, 0xf0, 0xf0, 0x02, 0x9e, 0xf0, 0x86, 0x01, 0xfc, 0x01, 0xfc, 0xfe, 0xef, 0x01, 0x11, 0xfe, 0x04, 0xfe, 0x04, 0x01, 0x11, 0x01, 0xf5, 0x83, 0x83, 0xfe, 0xf6, 0xfe, 0xf6, 0x83, 0x83, 0x01, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x86, 0x05, 0xa0, 0x04, 0x7e, 0x00, 0x06, 0x00, 0x00, 0x25, 0x09, 0x01, 0x11, 0x21, 0x11, 0x21, 0x01, 0xfb, 0xfe, 0x37, 0x01, 0xc9, 0x03, 0xa4, 0xfc, 0x5c, 0x86, 0x01, 0xfc, 0x01, 0xfc, 0xfe, 0xef, 0xfe, 0x2a, 0x00, 0x01, 0x01, 0x3b, 0x00, 0x00, 0x04, 0xce, 0x06, 0x08, 0x00, 0x06, 0x00, 0x00, 0x09, 0x02, 0x23, 0x11, 0x21, 0x11, 0x01, 0x3b, 0x01, 0xc9, 0x01, 0xc9, 0xf5, 0xfe, 0x59, 0x04, 0x0c, 0x01, 0xfc, 0xfe, 0x04, 0xfb, 0xf4, 0x04, 0x0c, 0x00, 0x00, 0x01, 0x01, 0x3b, 0xff, 0xcd, 0x04, 0xce, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x01, 0x33, 0x11, 0x21, 0x11, 0x33, 0x01, 0x01, 0x3b, 0xf6, 0x01, 0xa7, 0xf5, 0xfe, 0x37, 0x01, 0xc9, 0x04, 0x0c, 0xfb, 0xf4, 0xfe, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa2, 0xff, 0xc9, 0x05, 0x10, 0x04, 0xb3, 0x00, 0x06, 0x00, 0x00, 0x01, 0x27, 0x09, 0x02, 0x27, 0x21, 0x05, 0x0f, 0xae, 0xfd, 0x6d, 0xfe, 0xd5, 0x02, 0x94, 0xaf, 0x02, 0x87, 0x01, 0xe4, 0xc2, 0xfd, 0x23, 0x01, 0x4c, 0x02, 0xdd, 0xc1, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0xff, 0xc9, 0x05, 0x70, 0x04, 0xb3, 0x00, 0x06, 0x00, 0x00, 0x01, 0x11, 0x21, 0x07, 0x09, 0x02, 0x01, 0x03, 0x02, 0x87, 0xae, 0x02, 0x93, 0xfe, 0xd6, 0xfd, 0x6c, 0x01, 0xe4, 0x02, 0xcf, 0xc1, 0xfd, 0x23, 0xfe, 0xb4, 0x02, 0xdd, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa2, 0x00, 0x34, 0x05, 0x10, 0x05, 0x1e, 0x00, 0x06, 0x00, 0x00, 0x25, 0x37, 0x09, 0x02, 0x37, 0x11, 0x02, 0x88, 0xaf, 0xfd, 0x6c, 0x01, 0x2b, 0x02, 0x93, 0xae, 0x34, 0xc1, 0x02, 0xdd, 0x01, 0x4c, 0xfd, 0x23, 0xc2, 0xfd, 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x00, 0x34, 0x05, 0x70, 0x05, 0x1e, 0x00, 0x06, 0x00, 0x00, 0x01, 0x17, 0x09, 0x02, 0x17, 0x21, 0x01, 0x03, 0xae, 0x02, 0x94, 0x01, 0x2a, 0xfd, 0x6d, 0xae, 0xfd, 0x79, 0x03, 0x03, 0xc2, 0x02, 0xdd, 0xfe, 0xb4, 0xfd, 0x23, 0xc1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x31, 0x00, 0x86, 0x05, 0xaf, 0x04, 0x7e, 0x00, 0x09, 0x00, 0x00, 0x25, 0x09, 0x01, 0x11, 0x21, 0x11, 0x09, 0x01, 0x11, 0x21, 0x01, 0xfb, 0xfe, 0x37, 0x01, 0xc9, 0x01, 0xea, 0x01, 0xc9, 0xfe, 0x37, 0xfe, 0x16, 0x86, 0x01, 0xfc, 0x01, 0xfc, 0xfe, 0xef, 0x01, 0x11, 0xfe, 0x04, 0xfe, 0x04, 0x01, 0x11, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x3b, 0xff, 0xcd, 0x04, 0xce, 0x06, 0x08, 0x00, 0x09, 0x00, 0x00, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x09, 0x01, 0x23, 0x03, 0xd8, 0xf5, 0xfe, 0x37, 0xfe, 0x37, 0xf6, 0xf6, 0x01, 0xc9, 0x01, 0xc9, 0xf5, 0x01, 0xc9, 0xfe, 0x04, 0x01, 0xfc, 0x02, 0x43, 0x01, 0xfc, 0xfe, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x69, 0xff, 0xf9, 0x05, 0xb1, 0x02, 0xd7, 0x00, 0x0b, 0x00, 0x00, 0x05, 0x23, 0x01, 0x37, 0x17, 0x11, 0x21, 0x35, 0x21, 0x11, 0x37, 0x17, 0x04, 0x4e, 0x51, 0xfe, 0x9f, 0x6c, 0xd1, 0xfc, 0x90, 0x04, 0x09, 0xd2, 0x6c, 0x07, 0x01, 0x8a, 0x78, 0xea, 0x01, 0x1c, 0xaa, 0xfe, 0x3a, 0xea, 0x78, 0x00, 0x00, 0x01, 0x00, 0x69, 0x02, 0x2d, 0x05, 0xb1, 0x05, 0x0b, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x07, 0x27, 0x11, 0x21, 0x35, 0x21, 0x11, 0x07, 0x27, 0x01, 0x04, 0x4e, 0x01, 0x62, 0x6c, 0xd2, 0xfb, 0xf7, 0x03, 0x70, 0xd1, 0x6c, 0x01, 0x61, 0x05, 0x0b, 0xfe, 0x76, 0x78, 0xea, 0xfe, 0x3a, 0xaa, 0x01, 0x1c, 0xea, 0x78, 0x01, 0x8a, 0x00, 0x00, 0x01, 0x00, 0x40, 0xff, 0xf9, 0x05, 0x88, 0x02, 0xd7, 0x00, 0x0b, 0x00, 0x00, 0x05, 0x01, 0x37, 0x17, 0x11, 0x21, 0x15, 0x21, 0x11, 0x37, 0x17, 0x01, 0x01, 0xa3, 0xfe, 0x9e, 0x6c, 0xd2, 0x04, 0x09, 0xfc, 0x90, 0xd1, 0x6c, 0xfe, 0x9f, 0x07, 0x01, 0x8a, 0x78, 0xea, 0x01, 0xc6, 0xaa, 0xfe, 0xe4, 0xea, 0x78, 0xfe, 0x76, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x02, 0x2d, 0x05, 0x88, 0x05, 0x0b, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x01, 0x07, 0x27, 0x11, 0x21, 0x15, 0x21, 0x11, 0x07, 0x27, 0x01, 0xa3, 0x51, 0x01, 0x61, 0x6c, 0xd1, 0x03, 0x70, 0xfb, 0xf7, 0xd2, 0x6c, 0x05, 0x0b, 0xfe, 0x76, 0x78, 0xea, 0xfe, 0xe4, 0xaa, 0x01, 0xc6, 0xea, 0x78, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0x04, 0xb2, 0xfb, 0x4e, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x72, 0x02, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x17, 0x11, 0x21, 0x11, 0x01, 0x21, 0x11, 0x21, 0xa7, 0x05, 0x7f, 0xfa, 0xe8, 0x04, 0xb2, 0xfb, 0x4e, 0xfc, 0x06, 0x20, 0xf9, 0xe0, 0x03, 0x10, 0x02, 0x9e, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x05, 0x21, 0x01, 0x03, 0x11, 0x21, 0x11, 0x01, 0x0e, 0x04, 0xb2, 0xfb, 0x4e, 0x67, 0x05, 0x7f, 0x8a, 0x05, 0x3c, 0xfa, 0x52, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x05, 0x11, 0x21, 0x03, 0x11, 0x21, 0x11, 0x05, 0xc0, 0xfb, 0x4e, 0x67, 0x05, 0x7f, 0x8a, 0x05, 0x3c, 0xfa, 0x52, 0x06, 0x20, 0xf9, 0xe0, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x05, 0x09, 0x05, 0x02, 0xc4, 0x02, 0x37, 0xfd, 0xc9, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x64, 0x02, 0x78, 0x02, 0x78, 0xfd, 0x88, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x13, 0x01, 0x11, 0x09, 0x03, 0x8e, 0x02, 0x36, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x02, 0x14, 0xfd, 0x88, 0x04, 0xf0, 0xfd, 0x88, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x13, 0x09, 0x01, 0x21, 0x09, 0x02, 0x8e, 0x02, 0x36, 0x02, 0x37, 0xfb, 0x0a, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x02, 0x14, 0xfd, 0x88, 0x02, 0x78, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x00, 0x02, 0x00, 0x05, 0xff, 0x04, 0x05, 0x85, 0x05, 0x24, 0x00, 0x02, 0x00, 0x06, 0x00, 0x00, 0x13, 0x21, 0x09, 0x04, 0x8e, 0x04, 0x6d, 0xfd, 0xc9, 0xfd, 0x41, 0x02, 0xbf, 0x02, 0xc0, 0xfd, 0x40, 0x02, 0x14, 0x02, 0x78, 0xfd, 0x88, 0x03, 0x10, 0xfc, 0xf0, 0xfc, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xa7, 0xff, 0x04, 0x06, 0x27, 0x05, 0x24, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x15, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x37, 0x00, 0x00, 0x05, 0x15, 0x23, 0x35, 0x33, 0x35, 0x13, 0x15, 0x23, 0x35, 0x13, 0x15, 0x23, 0x35, 0x01, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x01, 0x15, 0x23, 0x35, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x01, 0x15, 0x33, 0x15, 0x23, 0x35, 0x13, 0x15, 0x23, 0x35, 0x13, 0x15, 0x23, 0x35, 0x13, 0x15, 0x23, 0x15, 0x23, 0x35, 0x06, 0x26, 0xcc, 0x66, 0x66, 0x66, 0x66, 0x66, 0xfe, 0xc7, 0xb7, 0xd3, 0xb6, 0x03, 0xdf, 0x66, 0x66, 0xd3, 0xb7, 0xd3, 0xb6, 0xfe, 0xc7, 0x67, 0xce, 0x67, 0x67, 0x67, 0x67, 0xce, 0x67, 0x67, 0x16, 0xe6, 0x74, 0x72, 0x01, 0xb6, 0xcc, 0xcc, 0x01, 0xb4, 0xca, 0xca, 0xfc, 0x24, 0x74, 0x74, 0x74, 0x74, 0x05, 0xac, 0xe6, 0x72, 0x74, 0x74, 0x74, 0x74, 0x74, 0xfa, 0xc6, 0x72, 0x74, 0xe6, 0x01, 0xb6, 0xcc, 0xcc, 0x01, 0xb4, 0xca, 0xca, 0x01, 0xd0, 0x74, 0x72, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0xff, 0xca, 0x06, 0x22, 0x06, 0x23, 0x00, 0x04, 0x00, 0x00, 0x13, 0x09, 0x02, 0x21, 0x20, 0x03, 0x01, 0x03, 0x01, 0xfe, 0xda, 0xfc, 0x4a, 0x03, 0xb6, 0x02, 0x6d, 0xfd, 0x93, 0xfc, 0x14, 0x00, 0x00, 0x02, 0x00, 0x20, 0xff, 0xca, 0x06, 0x22, 0x06, 0x23, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x1b, 0x01, 0x21, 0x13, 0x09, 0x04, 0x21, 0x99, 0xf7, 0x03, 0x22, 0xf7, 0xfd, 0x78, 0xfc, 0xff, 0x03, 0x01, 0x03, 0x01, 0xfe, 0xda, 0xfc, 0x4a, 0x03, 0x8b, 0xfc, 0xb1, 0x03, 0x4f, 0x02, 0x0c, 0xfe, 0x1f, 0x02, 0x6d, 0xfd, 0x93, 0xfc, 0x14, 0x00, 0x02, 0x00, 0x87, 0xff, 0x46, 0x05, 0xc3, 0x05, 0xfc, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x09, 0x01, 0x11, 0x09, 0x01, 0x03, 0x11, 0x09, 0x01, 0x11, 0x01, 0xee, 0x02, 0x37, 0x02, 0x37, 0xfd, 0xc9, 0xfd, 0xc9, 0x67, 0x02, 0x9e, 0x02, 0x9d, 0xfd, 0x63, 0x01, 0x35, 0xfe, 0x95, 0x01, 0x6b, 0x02, 0xd8, 0x01, 0x6b, 0xfe, 0x95, 0xfc, 0xe6, 0x03, 0x5c, 0x01, 0xad, 0xfe, 0x53, 0xfc, 0xa4, 0xfe, 0x53, 0x00, 0x01, 0x00, 0x87, 0xff, 0x46, 0x05, 0xc3, 0x05, 0xfc, 0x00, 0x05, 0x00, 0x00, 0x37, 0x11, 0x09, 0x01, 0x11, 0x01, 0x87, 0x02, 0x9e, 0x02, 0x9d, 0xfd, 0x63, 0xf3, 0x03, 0x5c, 0x01, 0xad, 0xfe, 0x53, 0xfc, 0xa4, 0xfe, 0x53, 0x00, 0x00, 0x00, 0x01, 0x00, 0x1e, 0xff, 0xb9, 0x06, 0x2a, 0x05, 0x89, 0x00, 0x05, 0x00, 0x00, 0x05, 0x09, 0x01, 0x21, 0x09, 0x01, 0x01, 0xa2, 0xfe, 0x7d, 0x01, 0x83, 0x03, 0x05, 0x01, 0x83, 0xfe, 0x7d, 0x47, 0x02, 0xe8, 0x02, 0xe8, 0xfd, 0x18, 0xfd, 0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0xfe, 0x00, 0x07, 0xaa, 0x06, 0x28, 0x00, 0x0b, 0x00, 0x00, 0x16, 0x10, 0x01, 0x36, 0x20, 0x17, 0x00, 0x10, 0x01, 0x06, 0x20, 0x27, 0x65, 0x01, 0xd1, 0xe9, 0x01, 0xd1, 0xe9, 0x01, 0xd1, 0xfe, 0x2f, 0xe9, 0xfe, 0x2f, 0xe9, 0x40, 0x04, 0xa8, 0x01, 0x2a, 0x96, 0x96, 0xfe, 0xd6, 0xfb, 0x58, 0xfe, 0xd6, 0x96, 0x96, 0x00, 0x01, 0x00, 0x45, 0xff, 0xa0, 0x05, 0xfd, 0x06, 0x4d, 0x00, 0x04, 0x00, 0x00, 0x09, 0x03, 0x11, 0x03, 0xcd, 0x02, 0x2f, 0xfd, 0xd1, 0xfc, 0x79, 0x06, 0x4c, 0xfc, 0xaa, 0xfc, 0xaa, 0x01, 0x46, 0x04, 0x20, 0x00, 0x00, 0x02, 0x00, 0x45, 0xff, 0xa0, 0x05, 0xfd, 0x06, 0x4d, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x09, 0x01, 0x11, 0x09, 0x05, 0x11, 0x03, 0xa7, 0xfd, 0x05, 0x02, 0xfb, 0x01, 0xd7, 0xfe, 0x4f, 0x02, 0x2f, 0xfd, 0xd1, 0xfc, 0x79, 0x05, 0xc6, 0xfe, 0xee, 0xfc, 0x86, 0xfe, 0xec, 0x02, 0xd0, 0x03, 0x56, 0xfc, 0xaa, 0xfc, 0xaa, 0x01, 0x46, 0x04, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x15, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0xb5, 0xb6, 0x01, 0x38, 0xfe, 0xc8, 0x01, 0x38, 0xfe, 0xc8, 0x02, 0x8e, 0xfc, 0xbc, 0xac, 0xac, 0xac, 0xac, 0x05, 0xd5, 0xfe, 0x07, 0x90, 0x90, 0x90, 0xfe, 0x7e, 0xaa, 0x02, 0x2c, 0x90, 0x90, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x01, 0xf3, 0x06, 0x14, 0x00, 0x13, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x01, 0x53, 0xa0, 0xa0, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa0, 0xa0, 0x02, 0xbc, 0x90, 0xfd, 0xd4, 0x02, 0x2c, 0x90, 0x90, 0x90, 0x02, 0x38, 0xfd, 0xc8, 0x90, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xdb, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x00, 0x23, 0x00, 0x00, 0x13, 0x33, 0x11, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x11, 0x21, 0x15, 0x21, 0x11, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x33, 0x32, 0x17, 0xb5, 0xb6, 0x01, 0x01, 0x10, 0x0b, 0x23, 0x10, 0x10, 0x02, 0x70, 0x01, 0x5c, 0x52, 0x12, 0x11, 0x02, 0x8e, 0xfc, 0xbc, 0x05, 0x05, 0x0f, 0x0c, 0x22, 0x10, 0x11, 0x01, 0x71, 0x02, 0x5c, 0x52, 0x16, 0x14, 0x05, 0xd5, 0xfd, 0x2c, 0x01, 0x01, 0x09, 0x25, 0x24, 0x52, 0x86, 0x94, 0x04, 0xfe, 0x2f, 0xaa, 0x03, 0x02, 0x04, 0x03, 0x09, 0x25, 0x24, 0x52, 0x86, 0x94, 0x06, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x10, 0x00, 0x1d, 0x00, 0x00, 0x13, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x17, 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x15, 0x21, 0x15, 0xb5, 0x01, 0x9a, 0xe2, 0x73, 0x74, 0x74, 0x73, 0xe2, 0xe4, 0xb6, 0xac, 0xac, 0xb6, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0xe4, 0x01, 0x38, 0x05, 0xd5, 0x71, 0x72, 0xdb, 0xdd, 0x71, 0x71, 0xfd, 0xa8, 0x03, 0xcf, 0x90, 0x90, 0xd1, 0x92, 0x87, 0x86, 0x92, 0xd0, 0x90, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xfe, 0x66, 0x04, 0xcc, 0x05, 0xd5, 0x00, 0x1b, 0x00, 0x24, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x17, 0x13, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x19, 0x01, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x03, 0x32, 0x3b, 0x6e, 0x38, 0xb9, 0xc4, 0xac, 0x42, 0x7d, 0x6c, 0xc6, 0x63, 0x78, 0x39, 0x45, 0xcd, 0xb8, 0x01, 0x9a, 0xe7, 0xe2, 0x75, 0xfd, 0xc8, 0xe4, 0x84, 0x86, 0x86, 0x84, 0x02, 0xbc, 0x16, 0x90, 0x7e, 0xfe, 0x68, 0x01, 0x7f, 0x96, 0x62, 0xfd, 0xf1, 0xc2, 0x96, 0xaa, 0xf4, 0x01, 0x0e, 0x05, 0x6d, 0xd6, 0xd8, 0x8d, 0xba, 0x02, 0x4f, 0xfd, 0xee, 0x87, 0x83, 0x83, 0x85, 0x00, 0x04, 0x00, 0x40, 0xff, 0xa2, 0x04, 0x26, 0x04, 0xbc, 0x00, 0x23, 0x00, 0x28, 0x00, 0x30, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x07, 0x27, 0x37, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x37, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x37, 0x17, 0x07, 0x16, 0x0f, 0x01, 0x33, 0x35, 0x34, 0x07, 0x01, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x01, 0x13, 0x06, 0x07, 0x06, 0x15, 0x14, 0x03, 0xc2, 0xa6, 0x38, 0xa9, 0x7b, 0x7a, 0x52, 0x5d, 0x56, 0x63, 0x35, 0xe3, 0xe2, 0x26, 0x8d, 0x0a, 0x0c, 0x4b, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xd1, 0x6b, 0x85, 0x56, 0x97, 0x33, 0xa8, 0x30, 0x32, 0x9d, 0xfe, 0xdd, 0x37, 0x59, 0x8a, 0xa6, 0xfd, 0xff, 0xcd, 0x59, 0x2d, 0x4e, 0x02, 0x7f, 0xfd, 0x81, 0xaa, 0x66, 0x61, 0x3c, 0x7d, 0x4e, 0x85, 0x56, 0x7b, 0xbd, 0xc0, 0xbf, 0x0c, 0x0c, 0x45, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0x72, 0xb3, 0x4f, 0xcb, 0x73, 0x2b, 0x41, 0x12, 0x18, 0xba, 0xfe, 0x78, 0x2e, 0xd9, 0xb4, 0x29, 0xfe, 0xe2, 0x01, 0x15, 0x0c, 0x1e, 0x33, 0x7b, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xea, 0xff, 0x42, 0x02, 0xc4, 0x06, 0x93, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x11, 0x33, 0x13, 0x33, 0x03, 0x33, 0x15, 0x23, 0x03, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x03, 0x23, 0x13, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0x52, 0x2b, 0xad, 0x99, 0xad, 0x91, 0xbd, 0x98, 0x43, 0x67, 0xab, 0xab, 0xbf, 0x49, 0x0b, 0x0a, 0x5c, 0x99, 0xc1, 0x79, 0x79, 0x05, 0x9e, 0xfe, 0xc2, 0x02, 0x33, 0xfd, 0xcd, 0x8f, 0xfe, 0x0f, 0x6f, 0x89, 0x4e, 0x9a, 0x50, 0x0c, 0x10, 0xfe, 0xd6, 0x02, 0x72, 0x02, 0x1d, 0x8f, 0x01, 0x3e, 0xff, 0xff, 0x00, 0xb4, 0xfe, 0xbf, 0x05, 0x6a, 0x05, 0xd5, 0x10, 0x06, 0x04, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0x9a, 0x06, 0x14, 0x00, 0x19, 0x00, 0x00, 0x21, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x33, 0x11, 0x23, 0x03, 0xf4, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0x50, 0x51, 0x6a, 0xad, 0x59, 0x5a, 0xa5, 0xa5, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x06, 0x14, 0xfd, 0x9e, 0x65, 0x32, 0x32, 0x77, 0x78, 0xe8, 0xfd, 0xf5, 0xfe, 0x4c, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x04, 0xe0, 0x05, 0xd5, 0x00, 0x0e, 0x00, 0x00, 0x25, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x01, 0x04, 0x47, 0x98, 0xb1, 0x3e, 0xfd, 0x7b, 0xb6, 0xb6, 0x02, 0x5b, 0xea, 0xfd, 0x65, 0xaa, 0xfe, 0x15, 0x01, 0x41, 0x02, 0xcf, 0xfd, 0x31, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x77, 0xfd, 0x48, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0x26, 0x06, 0x14, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x11, 0x23, 0xa7, 0xa7, 0x01, 0xee, 0xd4, 0xfd, 0xe9, 0x01, 0x9e, 0x8f, 0xa6, 0x32, 0xfe, 0x00, 0xa7, 0x06, 0x14, 0xfc, 0x69, 0x01, 0xe3, 0xfd, 0xf4, 0xfe, 0x45, 0xfe, 0x4c, 0x01, 0x1b, 0x02, 0x23, 0xfd, 0xdd, 0x00, 0x00, 0x00, 0x01, 0x00, 0x52, 0xfe, 0xbf, 0x05, 0x51, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x01, 0x21, 0x68, 0x04, 0x1f, 0xfc, 0xaf, 0x04, 0x1b, 0xb5, 0xfb, 0xb7, 0x03, 0x51, 0xfc, 0xc4, 0x05, 0xd5, 0x9a, 0xfb, 0x6f, 0xfe, 0x15, 0x01, 0x41, 0x9a, 0x04, 0x91, 0x00, 0x01, 0x00, 0x4f, 0xfe, 0xe5, 0x04, 0x1e, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x35, 0x01, 0x21, 0x66, 0x03, 0x12, 0xfd, 0x92, 0x03, 0x14, 0xa6, 0xfc, 0xd7, 0x02, 0x6f, 0xfd, 0xa8, 0x04, 0x60, 0xa8, 0xfc, 0xdb, 0xfe, 0x52, 0x01, 0x1b, 0xa8, 0x03, 0x25, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xec, 0x05, 0xf1, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x35, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x01, 0x10, 0x12, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x04, 0x3b, 0xb0, 0xb0, 0x46, 0xd4, 0x95, 0xf3, 0xfe, 0xcf, 0x01, 0x31, 0xf3, 0x95, 0xd4, 0xfd, 0x2f, 0xd3, 0xb8, 0xb8, 0xd4, 0xd4, 0xb8, 0xb8, 0xd3, 0x04, 0xed, 0xe8, 0xfa, 0x2b, 0xe7, 0x84, 0x80, 0x01, 0xab, 0x01, 0x5c, 0x01, 0x5c, 0x01, 0xab, 0x80, 0xfd, 0x78, 0xfe, 0xe3, 0xfe, 0xbb, 0x01, 0x45, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x45, 0xfe, 0xbb, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x05, 0x83, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x13, 0x21, 0x09, 0x01, 0x21, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x01, 0x23, 0x01, 0x11, 0x23, 0xb5, 0x01, 0x0f, 0x01, 0x57, 0x01, 0x58, 0x01, 0x0f, 0xb8, 0xcc, 0x46, 0x3d, 0x79, 0x63, 0xfe, 0xa5, 0xb6, 0xfe, 0xa5, 0xb0, 0x05, 0xd5, 0xfc, 0x08, 0x03, 0xf8, 0xfa, 0x93, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0x04, 0xb7, 0xfc, 0x00, 0x04, 0x00, 0xfa, 0xe1, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x25, 0x13, 0x21, 0x01, 0x23, 0x01, 0x33, 0x13, 0x21, 0x13, 0x33, 0x02, 0x76, 0xf7, 0xfe, 0x11, 0x01, 0x5f, 0xcf, 0xfe, 0x00, 0xbd, 0x7b, 0x02, 0x5e, 0x7a, 0xc0, 0xc7, 0x02, 0xe7, 0xfc, 0x52, 0x05, 0xd5, 0xfe, 0x81, 0x01, 0x7f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xec, 0x05, 0xf1, 0x00, 0x0f, 0x00, 0x18, 0x00, 0x00, 0x25, 0x15, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x00, 0x10, 0x00, 0x23, 0x22, 0x26, 0x00, 0x10, 0x02, 0x23, 0x22, 0x02, 0x10, 0x12, 0x20, 0x01, 0x18, 0xb0, 0xb0, 0x45, 0xd5, 0x94, 0xf3, 0x01, 0x32, 0xfe, 0xce, 0xf3, 0x94, 0xd5, 0x02, 0xd1, 0xd2, 0xb8, 0xb9, 0xd3, 0xd3, 0x01, 0x71, 0xe7, 0xe8, 0x05, 0xd5, 0xe7, 0x84, 0x80, 0xfe, 0x55, 0xfd, 0x48, 0xfe, 0x55, 0x80, 0x01, 0x6b, 0x02, 0x3a, 0x01, 0x45, 0xfe, 0xbb, 0xfd, 0xc6, 0xfe, 0xbb, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x05, 0x4a, 0x04, 0x7b, 0x00, 0x14, 0x00, 0x00, 0x01, 0x30, 0x01, 0x23, 0x01, 0x33, 0x01, 0x13, 0x36, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x26, 0x22, 0x07, 0x06, 0x03, 0xba, 0xfe, 0xd8, 0xe1, 0xfe, 0x86, 0xaf, 0x01, 0x3b, 0xf9, 0x4b, 0xc8, 0x76, 0xa7, 0xa1, 0x49, 0x66, 0x25, 0x13, 0x03, 0x6d, 0xfc, 0x93, 0x04, 0x60, 0xfc, 0x54, 0x02, 0xe6, 0xe1, 0xbf, 0x86, 0x72, 0x72, 0x3a, 0x54, 0x2a, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3d, 0x00, 0x00, 0x08, 0x1f, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x00, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x13, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x06, 0xa9, 0xfe, 0xe8, 0xe5, 0xfe, 0xe5, 0xfe, 0xe1, 0xe4, 0xfe, 0xaf, 0xb8, 0x01, 0x1a, 0x01, 0x1a, 0xcc, 0x01, 0x1b, 0xed, 0x10, 0x36, 0x4d, 0x7c, 0x7a, 0x4c, 0x4d, 0x99, 0x49, 0x29, 0x26, 0x24, 0x1a, 0x04, 0xe1, 0xfb, 0x1f, 0x05, 0x10, 0xfa, 0xf0, 0x05, 0xd5, 0xfb, 0x12, 0x04, 0xee, 0xfb, 0x12, 0x04, 0x26, 0x47, 0x40, 0x5c, 0x5c, 0x5b, 0x6e, 0x83, 0x79, 0x36, 0x50, 0x28, 0x1c, 0x00, 0x01, 0x00, 0x4d, 0x00, 0x00, 0x06, 0xed, 0x04, 0x7b, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x26, 0x22, 0x07, 0x06, 0x07, 0x03, 0x23, 0x0b, 0x01, 0x23, 0x01, 0x33, 0x1b, 0x01, 0x33, 0x13, 0x04, 0xbf, 0x15, 0x33, 0x52, 0x77, 0x76, 0xa6, 0xa0, 0x49, 0x67, 0x24, 0x16, 0x06, 0xce, 0xc3, 0xd9, 0xda, 0xc3, 0xfe, 0xf8, 0xa6, 0xcf, 0xce, 0xc3, 0xcf, 0x03, 0x88, 0x56, 0x3d, 0x60, 0xbf, 0x86, 0x72, 0x72, 0x3a, 0x54, 0x2a, 0x19, 0x14, 0xfc, 0x93, 0x03, 0x96, 0xfc, 0x6a, 0x04, 0x60, 0xfc, 0x96, 0x03, 0x6a, 0xfc, 0x96, 0x00, 0x02, 0x00, 0x5d, 0x00, 0x00, 0x04, 0x0c, 0x04, 0xb3, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x10, 0x25, 0x36, 0x33, 0x32, 0x15, 0x14, 0x0f, 0x01, 0x13, 0x01, 0x33, 0x01, 0x23, 0x03, 0x07, 0x35, 0x36, 0x3f, 0x01, 0x36, 0x35, 0x26, 0x23, 0x22, 0x15, 0x14, 0xb4, 0x01, 0x32, 0x12, 0x10, 0x97, 0xa5, 0x72, 0x99, 0x01, 0x3b, 0xb0, 0xfe, 0x86, 0xe1, 0xbc, 0x97, 0x2c, 0x36, 0x94, 0xc3, 0x01, 0x29, 0x9d, 0x03, 0x4d, 0x01, 0x32, 0x31, 0x03, 0xf8, 0x99, 0x5d, 0x40, 0xfe, 0x2f, 0x03, 0xac, 0xfb, 0xa0, 0x02, 0x32, 0x55, 0xc4, 0x14, 0x1c, 0x50, 0x6e, 0x34, 0x34, 0xa0, 0x25, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x00, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x03, 0xff, 0xfd, 0x6c, 0xb6, 0xb6, 0x02, 0x94, 0x02, 0xc7, 0xfd, 0x39, 0x05, 0xd5, 0xfd, 0x9c, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x03, 0x6f, 0x04, 0x60, 0x00, 0x07, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x03, 0x6e, 0xfd, 0xe5, 0xa5, 0xa5, 0x02, 0x1b, 0x02, 0x04, 0xfd, 0xfc, 0x04, 0x60, 0xfe, 0x33, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0xff, 0xe7, 0x04, 0x56, 0x04, 0x68, 0x00, 0x0a, 0x00, 0x27, 0x00, 0x00, 0x01, 0x22, 0x15, 0x11, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x32, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x23, 0x07, 0x22, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x11, 0x10, 0x02, 0xea, 0x3a, 0x55, 0x56, 0x4c, 0x4d, 0x3f, 0x31, 0x7d, 0x73, 0x7c, 0x7c, 0x74, 0xb6, 0xa5, 0xb4, 0x78, 0x7a, 0x7a, 0x5b, 0x96, 0x3b, 0x34, 0x4e, 0x4e, 0x45, 0x65, 0x03, 0xcb, 0x91, 0xfd, 0x52, 0x68, 0x5d, 0xdf, 0xd0, 0x70, 0x5b, 0x9d, 0x84, 0x8d, 0xfe, 0xd9, 0xfe, 0xf1, 0xa1, 0x98, 0x01, 0x99, 0x9c, 0x01, 0x13, 0x01, 0x1e, 0x92, 0x6d, 0x1c, 0xa3, 0x17, 0x4e, 0x73, 0xbe, 0xca, 0x73, 0x67, 0x02, 0xaf, 0x01, 0x2e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe5, 0x02, 0x4f, 0x06, 0x14, 0x00, 0x17, 0x00, 0x00, 0x21, 0x35, 0x06, 0x23, 0x22, 0x2f, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x01, 0xa8, 0x67, 0xec, 0x22, 0x32, 0x01, 0x36, 0x4f, 0x8d, 0x96, 0x45, 0x5f, 0xd0, 0xe5, 0xa4, 0x48, 0x49, 0xae, 0xc9, 0x0a, 0xbd, 0x23, 0xcb, 0xbe, 0x02, 0x6c, 0x99, 0x61, 0x9c, 0x60, 0x62, 0xd4, 0xfb, 0x82, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x20, 0x00, 0x00, 0x00, 0x26, 0x22, 0x06, 0x14, 0x16, 0x32, 0x36, 0x00, 0x12, 0x20, 0x12, 0x10, 0x02, 0x20, 0x02, 0x00, 0x26, 0x20, 0x06, 0x15, 0x14, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x36, 0x35, 0x02, 0xc7, 0x55, 0x79, 0x54, 0x54, 0x7a, 0x54, 0xfd, 0x9f, 0xf5, 0x01, 0xb1, 0xf7, 0xf7, 0xfe, 0x4f, 0xf5, 0x02, 0xed, 0x9a, 0xfe, 0xf6, 0x9b, 0x12, 0x14, 0x32, 0x52, 0x78, 0x7a, 0x51, 0x2d, 0x15, 0x10, 0x01, 0x61, 0x5f, 0x5e, 0x87, 0x5c, 0x5c, 0x02, 0x68, 0x01, 0x38, 0xfe, 0xc8, 0xfd, 0xd9, 0xfe, 0xc7, 0x01, 0x39, 0x01, 0xda, 0xe9, 0xe7, 0xc9, 0x60, 0x4d, 0x47, 0x38, 0x5d, 0x5f, 0x32, 0x42, 0x49, 0x5b, 0x00, 0x00, 0x01, 0x00, 0x58, 0x00, 0x00, 0x02, 0xe2, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x02, 0xe1, 0xfd, 0x77, 0x01, 0xe2, 0xfe, 0x3f, 0x01, 0xc1, 0xfe, 0x2a, 0x04, 0x60, 0xfb, 0xa0, 0x93, 0x01, 0x78, 0x94, 0x01, 0x2d, 0x94, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xeb, 0xff, 0x11, 0x00, 0xd7, 0x03, 0x67, 0x12, 0x07, 0x02, 0x74, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x02, 0x9c, 0x03, 0x11, 0x05, 0xe0, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x01, 0x4c, 0xfe, 0xbd, 0x78, 0x01, 0x0c, 0x01, 0x0d, 0x77, 0xfe, 0xbd, 0x02, 0x9c, 0x03, 0x44, 0xfd, 0x40, 0x02, 0xc0, 0xfc, 0xbc, 0x00, 0x00, 0x01, 0x00, 0x79, 0xfe, 0x10, 0x04, 0x4e, 0x05, 0xf0, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x17, 0x1e, 0x01, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2e, 0x02, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0xda, 0x67, 0xb8, 0x55, 0x95, 0xa1, 0x36, 0x31, 0x9a, 0x6d, 0xd0, 0x5d, 0x60, 0x83, 0x67, 0xb5, 0x79, 0x70, 0x84, 0x3f, 0x16, 0x39, 0x1e, 0x47, 0x5d, 0x6e, 0x36, 0xc9, 0x2c, 0x0d, 0x2d, 0x22, 0x6c, 0x73, 0x6f, 0xd4, 0x67, 0x9b, 0xaa, 0x7a, 0x8b, 0x6e, 0xcc, 0xb5, 0xfb, 0xdc, 0x5f, 0xc4, 0x05, 0xa4, 0xc5, 0x37, 0x36, 0x80, 0x76, 0x63, 0x33, 0x2e, 0x23, 0x19, 0x2f, 0x69, 0x6c, 0xb6, 0xd9, 0x70, 0x59, 0x12, 0x77, 0x6e, 0x49, 0xaa, 0x10, 0x27, 0x4f, 0x38, 0xce, 0x2d, 0x0a, 0x21, 0x07, 0x18, 0x2f, 0xd0, 0x45, 0x46, 0x88, 0x7e, 0x6e, 0x7c, 0x1f, 0x18, 0x2d, 0xc0, 0xab, 0xc6, 0xe4, 0x26, 0x00, 0x00, 0x01, 0x00, 0x52, 0xfe, 0x10, 0x04, 0x9c, 0x05, 0xd5, 0x00, 0x18, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x22, 0x2e, 0x02, 0x27, 0x25, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x04, 0x3b, 0x61, 0x84, 0x23, 0x51, 0x6a, 0x7e, 0x3e, 0xfe, 0xf2, 0x47, 0x66, 0x70, 0x03, 0x51, 0xfc, 0xc4, 0x04, 0x1f, 0xfc, 0xb3, 0x67, 0x69, 0xe3, 0x7a, 0x90, 0xfe, 0xba, 0xaa, 0x10, 0x27, 0x4f, 0x38, 0xf3, 0x3f, 0x9a, 0x04, 0x91, 0xaa, 0x9a, 0xfb, 0x6f, 0x0d, 0x5f, 0xcd, 0x6e, 0x49, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x01, 0x11, 0x33, 0x11, 0xc1, 0x99, 0x99, 0x01, 0x92, 0x7a, 0x05, 0x58, 0x88, 0xfb, 0x30, 0x05, 0x58, 0xfa, 0xa8, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x01, 0x11, 0x33, 0x11, 0xc1, 0x99, 0x99, 0x01, 0x92, 0x7a, 0x04, 0x24, 0x88, 0xfc, 0x64, 0x05, 0x58, 0xfa, 0xa8, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x01, 0x11, 0x33, 0x11, 0xc1, 0x99, 0x99, 0x01, 0x92, 0x7a, 0x02, 0xf0, 0x88, 0xfd, 0x98, 0x05, 0x58, 0xfa, 0xa8, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x01, 0x11, 0x33, 0x11, 0xc1, 0x99, 0x99, 0x01, 0x92, 0x7a, 0x01, 0xbc, 0x88, 0xfe, 0xcc, 0x05, 0x58, 0xfa, 0xa8, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x37, 0x33, 0x15, 0x23, 0x01, 0x33, 0x11, 0x23, 0xc1, 0x99, 0x99, 0x01, 0x92, 0x7a, 0x7a, 0x88, 0x88, 0x05, 0x58, 0xfa, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x03, 0x23, 0x11, 0x33, 0x02, 0x34, 0x99, 0x99, 0xf9, 0x7a, 0x7a, 0x05, 0x58, 0x88, 0xfb, 0x30, 0x05, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x03, 0x23, 0x11, 0x33, 0x02, 0x34, 0x99, 0x99, 0xf9, 0x7a, 0x7a, 0x04, 0x24, 0x88, 0xfc, 0x64, 0x05, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x03, 0x23, 0x11, 0x33, 0x02, 0x34, 0x99, 0x99, 0xf9, 0x7a, 0x7a, 0x02, 0xf0, 0x88, 0xfd, 0x98, 0x05, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x03, 0x23, 0x11, 0x33, 0x02, 0x34, 0x99, 0x99, 0xf9, 0x7a, 0x7a, 0x01, 0xbc, 0x88, 0xfe, 0xcc, 0x05, 0x58, 0x00, 0x00, 0x00, 0x02, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x25, 0x33, 0x15, 0x2b, 0x02, 0x11, 0x33, 0x02, 0x34, 0x99, 0x99, 0xf9, 0x7a, 0x7a, 0x88, 0x88, 0x05, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x15, 0x21, 0x01, 0x3b, 0x7a, 0x02, 0x0c, 0xfe, 0x6e, 0x05, 0x58, 0x88, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x01, 0x3b, 0x7a, 0x7a, 0x01, 0x92, 0xfe, 0x6e, 0x05, 0x58, 0xfe, 0xcc, 0x88, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x01, 0x3b, 0x7a, 0x7a, 0x01, 0x92, 0xfe, 0x6e, 0x05, 0x58, 0xfd, 0x98, 0x88, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x07, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x01, 0x3b, 0x7a, 0x7a, 0x01, 0x92, 0xfe, 0x6e, 0x05, 0x58, 0xfc, 0x64, 0x88, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x02, 0xce, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x25, 0x21, 0x15, 0x21, 0x11, 0x33, 0x01, 0x3b, 0x01, 0x92, 0xfd, 0xf4, 0x7a, 0x88, 0x88, 0x05, 0x58, 0x00, 0x00, 0x01, 0x00, 0x5b, 0x02, 0x9c, 0x02, 0x4d, 0x05, 0xe4, 0x00, 0x09, 0x00, 0x00, 0x01, 0x33, 0x17, 0x07, 0x27, 0x11, 0x23, 0x11, 0x07, 0x27, 0x01, 0x3b, 0x33, 0xdf, 0x45, 0x83, 0x61, 0x84, 0x44, 0x05, 0xe4, 0xdd, 0x43, 0x83, 0xfd, 0x55, 0x02, 0xab, 0x83, 0x43, 0x00, 0x01, 0x00, 0x5b, 0x02, 0x98, 0x02, 0x4d, 0x05, 0xe0, 0x00, 0x09, 0x00, 0x00, 0x01, 0x23, 0x27, 0x37, 0x17, 0x11, 0x33, 0x11, 0x37, 0x17, 0x01, 0x6e, 0x33, 0xdf, 0x44, 0x84, 0x61, 0x83, 0x45, 0x02, 0x98, 0xdd, 0x43, 0x83, 0x02, 0xab, 0xfd, 0x55, 0x83, 0x43, 0x00, 0x02, 0x00, 0xaf, 0x02, 0x9c, 0x01, 0x23, 0x05, 0xe0, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x11, 0x07, 0x23, 0x27, 0xb0, 0x73, 0x73, 0x73, 0x0c, 0x5c, 0x0b, 0x03, 0x2a, 0x8e, 0x03, 0x44, 0xfe, 0x91, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0x02, 0x00, 0xaf, 0x02, 0x9c, 0x01, 0x23, 0x05, 0xe0, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x01, 0x23, 0x35, 0x33, 0x11, 0x23, 0x11, 0x37, 0x33, 0x17, 0x01, 0x23, 0x73, 0x73, 0x73, 0x0a, 0x5c, 0x0d, 0x05, 0x52, 0x8e, 0xfc, 0xbc, 0x01, 0x6f, 0xc8, 0xc8, 0x00, 0xff, 0xff, 0x00, 0xaf, 0x00, 0x00, 0x01, 0x23, 0x03, 0x44, 0x10, 0x07, 0x0e, 0x5c, 0x00, 0x00, 0xfd, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7b, 0x00, 0x00, 0x02, 0x86, 0x05, 0xd4, 0x00, 0x10, 0x00, 0x00, 0x33, 0x35, 0x20, 0x02, 0x21, 0x35, 0x20, 0x02, 0x21, 0x35, 0x20, 0x13, 0x16, 0x07, 0x16, 0x13, 0x12, 0xba, 0x01, 0x29, 0x12, 0xfe, 0xd7, 0x01, 0x29, 0x1b, 0xfe, 0xc5, 0x01, 0xe7, 0x0d, 0x08, 0x9d, 0xa6, 0x05, 0x09, 0xa3, 0x02, 0x27, 0xa3, 0x01, 0xc5, 0xa2, 0xfe, 0x8c, 0xe5, 0x63, 0x6d, 0xfe, 0xfb, 0xfe, 0x5a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7b, 0x00, 0x00, 0x02, 0x50, 0x04, 0x60, 0x00, 0x10, 0x00, 0x00, 0x33, 0x35, 0x20, 0x02, 0x21, 0x35, 0x20, 0x02, 0x21, 0x35, 0x20, 0x13, 0x16, 0x07, 0x16, 0x17, 0x12, 0xa8, 0x01, 0x0e, 0x12, 0xfe, 0xf2, 0x01, 0x0e, 0x1b, 0xfe, 0xf2, 0x01, 0xb1, 0x0d, 0x07, 0x77, 0x81, 0x05, 0x09, 0x99, 0x01, 0x7c, 0x99, 0x01, 0x1a, 0x98, 0xfe, 0xe8, 0x9e, 0x4d, 0x59, 0xbc, 0xfe, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0x01, 0xcb, 0x02, 0xf6, 0x05, 0xf0, 0x00, 0x09, 0x00, 0x00, 0x01, 0x10, 0x17, 0x07, 0x02, 0x35, 0x10, 0x21, 0x15, 0x20, 0x01, 0x0f, 0x69, 0x93, 0x7d, 0x02, 0x8e, 0xfe, 0x19, 0x03, 0xcd, 0xfe, 0xfe, 0xd2, 0x2e, 0x01, 0x31, 0xd4, 0x02, 0x20, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x67, 0x00, 0x56, 0x02, 0xf6, 0x04, 0x7b, 0x00, 0x09, 0x00, 0x00, 0x01, 0x10, 0x17, 0x07, 0x02, 0x35, 0x10, 0x21, 0x15, 0x20, 0x01, 0x0f, 0x69, 0x93, 0x7d, 0x02, 0x8e, 0xfe, 0x19, 0x02, 0x58, 0xfe, 0xfe, 0xd2, 0x2e, 0x01, 0x31, 0xd4, 0x02, 0x20, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x66, 0x04, 0xb6, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x11, 0x23, 0xb5, 0xb6, 0x02, 0x94, 0xb6, 0xb8, 0xcd, 0x45, 0x39, 0x78, 0x63, 0xfd, 0x6c, 0xb6, 0x05, 0xd5, 0xfd, 0x9c, 0x02, 0x64, 0xfa, 0x93, 0xfe, 0xf2, 0xf4, 0xaa, 0x96, 0xc2, 0x02, 0x5f, 0xfd, 0x39, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x06, 0x14, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x14, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x03, 0x4e, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x93, 0xa3, 0x3f, 0x2c, 0x63, 0x1e, 0x22, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x06, 0x14, 0xfd, 0x9e, 0x65, 0x64, 0xef, 0xe8, 0xfd, 0x48, 0xd6, 0xc0, 0x9c, 0x30, 0x38, 0x92, 0x00, 0x00, 0x01, 0xff, 0xfa, 0xfe, 0x4c, 0x05, 0xe6, 0x05, 0xd5, 0x00, 0x2a, 0x00, 0x00, 0x03, 0x21, 0x15, 0x21, 0x15, 0x21, 0x15, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x05, 0x04, 0x70, 0xfe, 0x23, 0x03, 0x08, 0xfe, 0x8e, 0x5f, 0x74, 0x59, 0x4c, 0x49, 0x89, 0x88, 0xfc, 0x68, 0x74, 0x75, 0x75, 0x60, 0x72, 0x71, 0x7b, 0xad, 0x59, 0x5a, 0x52, 0x54, 0x95, 0x9c, 0x01, 0x5a, 0xfd, 0xdb, 0xb6, 0xfe, 0x23, 0x05, 0xd5, 0xaa, 0xcb, 0x9a, 0xfe, 0x16, 0x38, 0x2b, 0x6c, 0x68, 0x8a, 0xdc, 0x7a, 0x79, 0x13, 0x13, 0x24, 0xc3, 0x31, 0x19, 0x19, 0x4b, 0x4b, 0x8f, 0x86, 0x49, 0x4a, 0x98, 0x01, 0xea, 0xfc, 0x4a, 0x05, 0x2b, 0x00, 0x00, 0x01, 0x00, 0x31, 0xfe, 0x4c, 0x04, 0xaf, 0x05, 0x9e, 0x00, 0x30, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x35, 0x01, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x02, 0xee, 0x5e, 0x74, 0x59, 0x4d, 0x49, 0xfe, 0xee, 0xfc, 0x54, 0x59, 0x5a, 0x60, 0x4c, 0xb4, 0x62, 0xab, 0x59, 0x5a, 0x53, 0x52, 0x96, 0x9d, 0x01, 0x83, 0xfd, 0xad, 0x43, 0x67, 0xab, 0xab, 0xbf, 0x92, 0x79, 0x79, 0xa7, 0x03, 0x0e, 0x01, 0xdc, 0x38, 0x2b, 0x6c, 0x68, 0x8a, 0xdd, 0xf2, 0x12, 0x13, 0x25, 0xc3, 0x31, 0x32, 0x4b, 0x4b, 0x8f, 0x84, 0x4b, 0x4a, 0xa6, 0x01, 0xf3, 0xfd, 0xa4, 0x89, 0x4e, 0x9a, 0x9f, 0xd2, 0x02, 0x60, 0x8f, 0x01, 0x3e, 0xfe, 0xc2, 0xa8, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x93, 0xff, 0xe3, 0x04, 0x09, 0x05, 0xf0, 0x10, 0x06, 0x01, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x77, 0xfe, 0x67, 0x03, 0x68, 0x04, 0x7c, 0x00, 0x31, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x15, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x64, 0x65, 0x36, 0x36, 0x66, 0x66, 0xb0, 0x45, 0x99, 0x58, 0x57, 0x48, 0x49, 0x40, 0x74, 0x35, 0x3f, 0x3d, 0x3c, 0x69, 0x8b, 0x85, 0x7b, 0x41, 0x46, 0x4b, 0x4d, 0x88, 0x57, 0x49, 0x4c, 0x40, 0x51, 0x4b, 0x4d, 0x48, 0xd6, 0xe8, 0x7c, 0x01, 0xac, 0x20, 0x56, 0x55, 0x7b, 0xba, 0x68, 0x68, 0x1a, 0x26, 0xb6, 0x2d, 0x14, 0x15, 0x3e, 0x48, 0x6d, 0x6d, 0x46, 0x45, 0x98, 0x4d, 0x55, 0x85, 0x88, 0x55, 0x55, 0x1c, 0x1c, 0x38, 0xbe, 0x25, 0x13, 0x12, 0xf0, 0xe5, 0x8f, 0xc1, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x25, 0x04, 0x60, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0xa7, 0x02, 0x7e, 0xfe, 0x2a, 0x01, 0xa6, 0xfe, 0x5a, 0xa8, 0x04, 0x60, 0x94, 0xfe, 0xd3, 0x94, 0xfd, 0xf5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x56, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x08, 0xf0, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x12, 0x00, 0x15, 0x00, 0x00, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0x03, 0x21, 0x03, 0x2b, 0x01, 0x03, 0x21, 0x03, 0x23, 0x01, 0x03, 0x21, 0x01, 0x03, 0x21, 0x02, 0x0f, 0xcf, 0x01, 0xa1, 0x01, 0xa3, 0xce, 0x02, 0x00, 0xbd, 0x7b, 0xfd, 0xa3, 0x7b, 0x02, 0xbd, 0x7b, 0xfd, 0xa2, 0x7a, 0xc0, 0x02, 0x68, 0xf7, 0x01, 0xef, 0x03, 0x1a, 0xf6, 0x01, 0xee, 0x05, 0xd5, 0xfb, 0x3e, 0x04, 0xc2, 0xfa, 0x2b, 0x01, 0x7f, 0xfe, 0x81, 0x01, 0x7f, 0xfe, 0x81, 0x05, 0x0e, 0xfd, 0x19, 0x02, 0xe7, 0xfd, 0x19, 0x00, 0x04, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0x70, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x35, 0x00, 0x40, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x25, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x15, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x30, 0x17, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x01, 0x16, 0x17, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x02, 0x78, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0x03, 0x54, 0xa6, 0x38, 0xaa, 0x7a, 0x63, 0x49, 0xa6, 0x38, 0xa9, 0x7b, 0x9b, 0xb6, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xdb, 0x6c, 0x10, 0x5b, 0xab, 0x51, 0xdb, 0xd8, 0xfe, 0xb6, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0xfd, 0xc8, 0x2f, 0x01, 0x6d, 0xb3, 0xe8, 0x96, 0x88, 0x56, 0x52, 0x3b, 0x02, 0x33, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x4c, 0xfd, 0x81, 0xaa, 0x66, 0x61, 0x27, 0x0a, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0x7e, 0x14, 0x44, 0x27, 0x27, 0xfc, 0xfe, 0xb4, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x01, 0x68, 0x6e, 0xa6, 0x3c, 0x12, 0x7f, 0x8b, 0x17, 0x10, 0x00, 0x03, 0x00, 0x0e, 0xff, 0xe3, 0x08, 0x43, 0x05, 0xf0, 0x00, 0x13, 0x00, 0x16, 0x00, 0x20, 0x00, 0x00, 0x01, 0x33, 0x13, 0x36, 0x37, 0x36, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x27, 0x26, 0x27, 0x21, 0x03, 0x23, 0x01, 0x03, 0x21, 0x00, 0x20, 0x02, 0x11, 0x10, 0x12, 0x20, 0x12, 0x11, 0x10, 0x02, 0x0f, 0xcf, 0xa5, 0x29, 0x64, 0xaa, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x52, 0xfe, 0xae, 0xfe, 0xe5, 0xfe, 0xe5, 0xaa, 0x47, 0x2a, 0xfd, 0xa9, 0x7a, 0xc0, 0x02, 0x68, 0xf7, 0x01, 0xef, 0x03, 0x2d, 0xfe, 0x74, 0xe9, 0xe9, 0x01, 0x8c, 0xe7, 0x05, 0xd5, 0xfe, 0x1e, 0xae, 0x7d, 0xd2, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0x9f, 0xfe, 0x5b, 0xd2, 0x58, 0x72, 0xfe, 0x81, 0x05, 0x0e, 0xfd, 0x19, 0x03, 0x25, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0x00, 0x00, 0x03, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0xbc, 0x04, 0x7b, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x38, 0x00, 0x00, 0x01, 0x32, 0x12, 0x11, 0x10, 0x02, 0x20, 0x27, 0x26, 0x27, 0x0e, 0x02, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x20, 0x17, 0x36, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x01, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x04, 0xed, 0xd8, 0xf7, 0xf7, 0xfe, 0x4f, 0x7b, 0x31, 0x1e, 0x10, 0x56, 0x7e, 0xa0, 0xa0, 0xb7, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0x01, 0x0c, 0x66, 0x7c, 0xfe, 0x7b, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0x01, 0xd1, 0x85, 0x9b, 0x9a, 0x86, 0x84, 0x9b, 0x9b, 0x04, 0x7b, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x9d, 0x3e, 0x52, 0x45, 0x87, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0xbd, 0xbd, 0xfd, 0xb8, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x01, 0xac, 0xe7, 0xfe, 0x6e, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0x00, 0x00, 0x02, 0x00, 0x0e, 0xff, 0xe3, 0x07, 0x99, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x01, 0x03, 0x21, 0x01, 0x33, 0x01, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x00, 0x23, 0x20, 0x03, 0x27, 0x21, 0x03, 0x23, 0x02, 0x76, 0xf7, 0x01, 0xef, 0xfe, 0xa1, 0xcf, 0x01, 0x8f, 0x42, 0xe8, 0xaf, 0x9c, 0xb7, 0xfe, 0xfc, 0xfe, 0xfe, 0x9a, 0x69, 0x22, 0xfd, 0xa2, 0x7a, 0xc0, 0x05, 0x0e, 0xfd, 0x19, 0x03, 0xae, 0xfb, 0x72, 0xc0, 0xd3, 0xf0, 0x03, 0x8b, 0xfc, 0x5c, 0xfe, 0xdc, 0xfe, 0xd6, 0x01, 0x34, 0x68, 0xfe, 0x81, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6e, 0xff, 0xe3, 0x06, 0x69, 0x04, 0x7b, 0x00, 0x28, 0x00, 0x33, 0x00, 0x00, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x11, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x03, 0x37, 0x41, 0x91, 0xa0, 0x9f, 0xb7, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xdb, 0xd8, 0x70, 0x6f, 0x86, 0x9c, 0xa6, 0xa6, 0x3c, 0x9f, 0x6a, 0xfe, 0xfe, 0xf8, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0xdf, 0x8d, 0x6f, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0xfc, 0xff, 0x00, 0xbe, 0x9f, 0x9f, 0xbe, 0xa4, 0x02, 0x7b, 0xfb, 0xa0, 0xac, 0x66, 0x63, 0x02, 0x50, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x06, 0xef, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x03, 0x21, 0x13, 0x03, 0x21, 0x03, 0x23, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x02, 0x76, 0xf7, 0x01, 0xef, 0xb3, 0x7b, 0xfd, 0xa2, 0x7a, 0xc0, 0x02, 0x01, 0xcf, 0x01, 0xac, 0x01, 0xa8, 0xbd, 0xfe, 0x00, 0x05, 0x0e, 0xfd, 0x19, 0xfd, 0xd9, 0x01, 0x7f, 0xfe, 0x81, 0x05, 0xd5, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6e, 0xff, 0xe3, 0x05, 0xad, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x11, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x19, 0x01, 0x01, 0x33, 0x01, 0x02, 0x78, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0x38, 0xa9, 0x7b, 0x9b, 0xb6, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xdb, 0xd8, 0x01, 0x3b, 0xb0, 0xfe, 0x86, 0x02, 0x33, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0xfd, 0xcd, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0xfc, 0xff, 0x00, 0xfe, 0x35, 0x03, 0xac, 0xfb, 0xa0, 0x00, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x06, 0xef, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x12, 0x00, 0x15, 0x00, 0x00, 0x01, 0x03, 0x29, 0x02, 0x15, 0x21, 0x03, 0x23, 0x03, 0x21, 0x03, 0x23, 0x01, 0x33, 0x01, 0x33, 0x01, 0x33, 0x01, 0x23, 0x17, 0x02, 0x76, 0xf7, 0x01, 0xef, 0x02, 0x3e, 0x01, 0x43, 0xfe, 0x83, 0x83, 0xce, 0x7b, 0xfd, 0xa2, 0x7a, 0xc0, 0x02, 0x01, 0xcf, 0x01, 0x43, 0xd1, 0x01, 0x40, 0xbd, 0xfd, 0xca, 0x5f, 0x30, 0x05, 0x0e, 0xfd, 0x19, 0xa8, 0xfe, 0x81, 0x01, 0x7f, 0xfe, 0x81, 0x05, 0xd5, 0xfc, 0x52, 0x03, 0xae, 0xfb, 0xaa, 0x8b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6e, 0xff, 0xe3, 0x05, 0xad, 0x04, 0x7b, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x30, 0x00, 0x00, 0x21, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x17, 0x33, 0x13, 0x33, 0x03, 0x33, 0x15, 0x23, 0x03, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x21, 0x23, 0x11, 0x03, 0x1c, 0x38, 0xa9, 0x7b, 0x9b, 0xb6, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xdb, 0x6c, 0x5d, 0x0d, 0xb2, 0x8b, 0xb0, 0x8c, 0x8c, 0xbd, 0xbd, 0xfe, 0x45, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0x01, 0x27, 0x81, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0x7e, 0x6d, 0xcd, 0x01, 0x9d, 0xfe, 0x63, 0x90, 0xfd, 0xcd, 0x02, 0x33, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0xfe, 0x81, 0x00, 0x00, 0x02, 0x00, 0x0e, 0xfe, 0x56, 0x06, 0xd9, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x18, 0x00, 0x00, 0x01, 0x03, 0x21, 0x01, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3f, 0x01, 0x03, 0x21, 0x03, 0x23, 0x01, 0x33, 0x09, 0x01, 0x33, 0x02, 0x76, 0xf7, 0x01, 0xef, 0x01, 0x47, 0x43, 0x46, 0x42, 0x70, 0xc2, 0x9a, 0x44, 0x26, 0x26, 0x2e, 0x11, 0x7b, 0xfd, 0xa2, 0x7a, 0xc0, 0x02, 0x01, 0xcf, 0x01, 0xa0, 0x01, 0x9d, 0xbd, 0x05, 0x0e, 0xfd, 0x19, 0xfd, 0x71, 0xc6, 0x3f, 0x3d, 0xaa, 0x24, 0x25, 0x85, 0x32, 0x01, 0x7f, 0xfe, 0x81, 0x05, 0xd5, 0xfb, 0x40, 0x04, 0xc0, 0x00, 0x02, 0x00, 0x6e, 0xfe, 0x56, 0x05, 0xad, 0x04, 0x7b, 0x00, 0x27, 0x00, 0x32, 0x00, 0x00, 0x21, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x19, 0x01, 0x01, 0x33, 0x01, 0x0e, 0x01, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x3f, 0x01, 0x03, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x03, 0x1c, 0x38, 0xa9, 0x7b, 0x9b, 0xb6, 0xe3, 0xe2, 0xe8, 0x96, 0x88, 0x56, 0xa4, 0x4c, 0x5b, 0xab, 0x51, 0xdb, 0xd8, 0x01, 0x3b, 0xb0, 0xfe, 0x45, 0x46, 0x86, 0x6f, 0x85, 0x62, 0x44, 0x4c, 0x2e, 0x17, 0xf1, 0xc9, 0x9b, 0x74, 0x64, 0x8a, 0xa6, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x12, 0x7f, 0x8b, 0x2e, 0x2e, 0xaa, 0x27, 0x27, 0xfc, 0xff, 0x00, 0xfe, 0x77, 0x03, 0x6a, 0xfb, 0x38, 0xc8, 0x7a, 0x9a, 0x48, 0x86, 0x42, 0x02, 0x33, 0x66, 0x7b, 0x62, 0x73, 0xd9, 0xb4, 0x29, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x10, 0x06, 0x03, 0x93, 0x00, 0x00, 0xff, 0xff, 0x00, 0x72, 0xff, 0xe3, 0x03, 0x90, 0x04, 0x7b, 0x10, 0x06, 0x03, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd5, 0x00, 0x12, 0x00, 0x00, 0x13, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xb5, 0xb6, 0xac, 0xac, 0x02, 0x5b, 0xea, 0xfd, 0x65, 0x02, 0xca, 0xef, 0xfd, 0x7b, 0xb6, 0xac, 0xac, 0x05, 0xd5, 0xb9, 0xaa, 0xfe, 0xec, 0x02, 0x77, 0xfd, 0x48, 0xfc, 0xe3, 0x02, 0xcf, 0xfd, 0x31, 0x04, 0x72, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x12, 0x00, 0x00, 0x13, 0x33, 0x15, 0x21, 0x15, 0x21, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xaf, 0xa6, 0x01, 0x05, 0xfe, 0xfb, 0x01, 0xee, 0xd4, 0xfd, 0xe9, 0x02, 0x2d, 0xd8, 0xfe, 0x00, 0xa6, 0xa2, 0xa2, 0x06, 0x14, 0xac, 0xa4, 0xfd, 0xb9, 0x01, 0xe3, 0xfd, 0xf4, 0xfd, 0xac, 0x02, 0x23, 0xfd, 0xdd, 0x04, 0xc4, 0xa4, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xdc, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x37, 0x11, 0x21, 0x15, 0x21, 0x11, 0xb5, 0xb6, 0xe3, 0x02, 0x8e, 0xfc, 0xbc, 0x02, 0xad, 0x03, 0x28, 0xfd, 0x5e, 0x4d, 0xfd, 0x2a, 0xaa, 0x02, 0xfa, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x02, 0x26, 0x06, 0x14, 0x00, 0x07, 0x00, 0x00, 0x13, 0x11, 0x33, 0x11, 0x37, 0x11, 0x23, 0x11, 0xae, 0xa5, 0xd3, 0xa6, 0x02, 0x9c, 0x03, 0x78, 0xfd, 0x05, 0x49, 0xfc, 0x9e, 0x02, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x4a, 0x00, 0x00, 0x04, 0x26, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x21, 0x15, 0x21, 0x11, 0x23, 0x35, 0x33, 0xe2, 0xb6, 0x97, 0x97, 0x02, 0x8e, 0xfc, 0xbc, 0x97, 0x97, 0x05, 0xd5, 0xe0, 0xa4, 0xfc, 0x59, 0xaa, 0x04, 0x51, 0xa4, 0x00, 0x01, 0x00, 0x6c, 0x00, 0x00, 0x02, 0xa7, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x01, 0x36, 0xa6, 0xcb, 0xcb, 0xa6, 0xca, 0xca, 0x06, 0x14, 0xfe, 0xe2, 0xa4, 0xfb, 0xae, 0x04, 0x52, 0xa4, 0x00, 0x03, 0x00, 0x09, 0xff, 0xe3, 0x05, 0xc6, 0x05, 0xf0, 0x00, 0x15, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x13, 0x33, 0x15, 0x23, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x23, 0x35, 0x33, 0x12, 0x37, 0x36, 0x04, 0x20, 0x07, 0x06, 0x07, 0x21, 0x26, 0x27, 0x13, 0x21, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x02, 0xe8, 0x01, 0x1b, 0xa9, 0x91, 0x15, 0x74, 0x72, 0x0a, 0x9e, 0xa9, 0xfe, 0xe5, 0xfe, 0xe5, 0xa9, 0xa0, 0x0a, 0x71, 0x74, 0x15, 0x92, 0xa9, 0x01, 0xe1, 0xfe, 0x74, 0x74, 0x5f, 0x12, 0x03, 0x55, 0x11, 0x5f, 0x73, 0xfc, 0xa5, 0x09, 0x6b, 0x74, 0x01, 0x8c, 0x74, 0x6b, 0x05, 0xf0, 0xd2, 0xb5, 0xfe, 0xe3, 0x90, 0xfe, 0xbe, 0xc4, 0xd3, 0xd2, 0xc4, 0x01, 0x43, 0x90, 0x01, 0x1d, 0xb5, 0xd2, 0xa4, 0xa4, 0x86, 0xd6, 0xd6, 0x86, 0xfe, 0x14, 0xfa, 0x97, 0xa4, 0xa4, 0x97, 0x00, 0x00, 0x00, 0x03, 0x00, 0x09, 0xff, 0xe3, 0x05, 0x00, 0x04, 0x7b, 0x00, 0x15, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x23, 0x35, 0x33, 0x36, 0x37, 0x36, 0x17, 0x22, 0x07, 0x06, 0x07, 0x21, 0x26, 0x27, 0x26, 0x13, 0x21, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x02, 0x85, 0xd8, 0x7c, 0x63, 0x13, 0xb1, 0xad, 0x09, 0x71, 0x7c, 0xd8, 0xd9, 0x7a, 0x71, 0x09, 0xaf, 0xb2, 0x13, 0x64, 0x7a, 0xd9, 0x85, 0x4d, 0x39, 0x0f, 0x02, 0x34, 0x0f, 0x39, 0x4d, 0x9a, 0xfd, 0xc2, 0x07, 0x45, 0x4d, 0x86, 0x85, 0x4d, 0x45, 0x04, 0x7b, 0x9c, 0x7e, 0xcd, 0x90, 0xf4, 0x90, 0x9d, 0x9d, 0x90, 0xf4, 0x90, 0xcd, 0x7e, 0x9c, 0x9c, 0x73, 0x55, 0x83, 0x81, 0x55, 0x75, 0xfe, 0x25, 0xab, 0x67, 0x73, 0x74, 0x67, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x67, 0xff, 0xe3, 0x09, 0x60, 0x05, 0xf0, 0x00, 0x1a, 0x00, 0x24, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x21, 0x20, 0x00, 0x10, 0x00, 0x04, 0x20, 0x02, 0x11, 0x10, 0x12, 0x20, 0x12, 0x11, 0x10, 0x00, 0x20, 0x02, 0x11, 0x10, 0x12, 0x20, 0x12, 0x11, 0x10, 0x02, 0xd6, 0x01, 0x1b, 0xa9, 0x2a, 0x20, 0x1f, 0x2a, 0xaa, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x52, 0xfe, 0xae, 0xfe, 0xe5, 0xfe, 0xe5, 0xaa, 0x2a, 0x20, 0x1f, 0x2a, 0xa9, 0xfe, 0xe5, 0xfe, 0xe5, 0xfe, 0xad, 0x01, 0x53, 0x01, 0xe1, 0xfe, 0x74, 0xe9, 0xe9, 0x01, 0x8c, 0xe8, 0x03, 0x34, 0xfe, 0x74, 0xe9, 0xe9, 0x01, 0x8c, 0xe8, 0x05, 0xf0, 0xd2, 0x35, 0x3d, 0x3d, 0x35, 0xd2, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0x9f, 0xfe, 0x5b, 0xd2, 0x34, 0x3d, 0x3c, 0x34, 0xd3, 0x01, 0xa4, 0x02, 0xc4, 0x01, 0xa5, 0xa4, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x48, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x65, 0xff, 0xe3, 0x06, 0xf1, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x31, 0x00, 0x00, 0x01, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x21, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x27, 0x32, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x33, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x05, 0x22, 0x85, 0x9b, 0x9a, 0x86, 0x84, 0x9b, 0x9b, 0xfc, 0x8e, 0x85, 0x9b, 0x9a, 0x86, 0x85, 0x9a, 0x9a, 0x85, 0xd8, 0x7c, 0x12, 0x11, 0x10, 0x13, 0x7b, 0xd9, 0xd8, 0xf7, 0xf7, 0xd8, 0xd9, 0x7b, 0x13, 0x10, 0x11, 0x12, 0x7c, 0xd8, 0xd9, 0xf5, 0xf5, 0x03, 0xdf, 0xe7, 0xfe, 0x6e, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0xe7, 0xfe, 0x6e, 0xe7, 0xe8, 0xc8, 0xc7, 0xe9, 0x9c, 0x9c, 0x18, 0x1b, 0x1b, 0x18, 0x9c, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x9d, 0x18, 0x1b, 0x1b, 0x18, 0x9d, 0x01, 0x39, 0x01, 0x13, 0x01, 0x14, 0x01, 0x38, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x25, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x15, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x01, 0x6b, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0xfe, 0x66, 0x01, 0x9a, 0xe2, 0x73, 0x74, 0x74, 0x73, 0xe2, 0xe4, 0xd5, 0xd5, 0xb6, 0xac, 0xac, 0x05, 0x2f, 0xfd, 0xcf, 0x92, 0x87, 0x86, 0x92, 0xa6, 0x71, 0x72, 0xdb, 0xdd, 0x71, 0x71, 0xc4, 0x90, 0xfe, 0xfc, 0x01, 0x04, 0x90, 0x00, 0x00, 0x02, 0xff, 0xfb, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x01, 0x35, 0x33, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x03, 0x81, 0x96, 0xfe, 0xf9, 0x96, 0x96, 0x01, 0x07, 0xfd, 0x11, 0xab, 0xa7, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xe4, 0xe4, 0xa7, 0x01, 0x64, 0x01, 0x96, 0xe7, 0xe7, 0xfe, 0x6a, 0xe7, 0xfe, 0x67, 0x90, 0x04, 0xec, 0xaa, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x64, 0xfe, 0xcc, 0x90, 0x8e, 0x8e, 0x00, 0x02, 0x00, 0x2d, 0x00, 0x00, 0x05, 0x0a, 0x05, 0xd5, 0x00, 0x1e, 0x00, 0x27, 0x00, 0x00, 0x01, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x23, 0x22, 0x07, 0x06, 0x15, 0x16, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x03, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x01, 0xa6, 0x01, 0x9a, 0xe2, 0xe8, 0xe8, 0xe2, 0xe4, 0xb6, 0x28, 0x53, 0x2b, 0x35, 0x01, 0x18, 0x15, 0x35, 0x3d, 0x47, 0x3e, 0x3f, 0x72, 0x58, 0x91, 0x1e, 0xb6, 0xe4, 0x7f, 0x8b, 0x8b, 0x7f, 0xe4, 0x05, 0xd5, 0xe3, 0xdb, 0xdd, 0xe2, 0xfd, 0xa8, 0x02, 0x58, 0x18, 0x1f, 0x3d, 0x35, 0x27, 0x20, 0x18, 0x94, 0x17, 0x49, 0x4b, 0x7d, 0x93, 0x4c, 0x3b, 0x92, 0x87, 0x86, 0x92, 0x00, 0x02, 0x00, 0x2d, 0xfe, 0x56, 0x05, 0x2f, 0x04, 0x7b, 0x00, 0x0c, 0x00, 0x31, 0x00, 0x00, 0x01, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x20, 0x06, 0x15, 0x03, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x27, 0x11, 0x23, 0x02, 0x4f, 0x09, 0x8e, 0x83, 0x80, 0x4f, 0x4b, 0x97, 0xfe, 0xfa, 0x97, 0xa6, 0x2e, 0x25, 0x28, 0x2e, 0x35, 0x19, 0x15, 0x35, 0x3d, 0x47, 0x3e, 0x3f, 0x72, 0x4b, 0x5e, 0x30, 0x31, 0xa6, 0x35, 0x9f, 0x6f, 0xb7, 0xe6, 0xe6, 0xb6, 0xac, 0x98, 0xa6, 0x01, 0x32, 0x0b, 0xaa, 0x73, 0x70, 0xcf, 0xcb, 0xe7, 0xe7, 0xcb, 0xfe, 0xe3, 0x19, 0x18, 0x1b, 0x41, 0x34, 0x28, 0x20, 0x18, 0x94, 0x17, 0x49, 0x4b, 0x7d, 0x86, 0x59, 0x3b, 0x17, 0x02, 0xa6, 0xaa, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0xa2, 0xfd, 0xd1, 0x00, 0x00, 0x02, 0x00, 0x67, 0xfe, 0x94, 0x05, 0x44, 0x05, 0xf0, 0x00, 0x09, 0x00, 0x23, 0x00, 0x00, 0x00, 0x20, 0x02, 0x11, 0x10, 0x12, 0x20, 0x12, 0x11, 0x10, 0x01, 0x27, 0x37, 0x27, 0x07, 0x06, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x02, 0x07, 0x17, 0x37, 0x17, 0x07, 0x17, 0x23, 0x27, 0x03, 0x9c, 0xfe, 0x74, 0xe9, 0xe9, 0x01, 0x8c, 0xe8, 0xfe, 0xa6, 0x41, 0x99, 0x60, 0x2e, 0x10, 0x0e, 0xfe, 0xe5, 0xfe, 0xad, 0x01, 0x53, 0x01, 0x1b, 0x01, 0x1b, 0x01, 0x52, 0xbc, 0xb2, 0x3e, 0xc2, 0x40, 0xa9, 0x58, 0xdb, 0x0d, 0x05, 0x4c, 0xfe, 0xb8, 0xfe, 0xe5, 0xfe, 0xe6, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x1a, 0x01, 0x1b, 0xfa, 0x90, 0x7d, 0x62, 0x74, 0x03, 0x01, 0x01, 0xa5, 0x01, 0x61, 0x01, 0x62, 0x01, 0xa5, 0xfe, 0x5b, 0xfe, 0x9e, 0xfe, 0xfc, 0xfe, 0x8e, 0x58, 0x4b, 0x7c, 0x7d, 0x6c, 0x6b, 0x0f, 0x00, 0x02, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x97, 0x04, 0x7b, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x00, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x00, 0x10, 0x16, 0x20, 0x36, 0x10, 0x26, 0x20, 0x03, 0x45, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xa6, 0xab, 0xab, 0xa6, 0xe5, 0xe5, 0xfd, 0xcc, 0x96, 0x01, 0x07, 0x97, 0x97, 0xfe, 0xf9, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x02, 0x10, 0x01, 0x44, 0x61, 0x64, 0xaa, 0xfb, 0x14, 0x90, 0x8e, 0x8e, 0x90, 0x03, 0x86, 0xfe, 0x6a, 0xe7, 0xe7, 0x01, 0x96, 0xe7, 0x00, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x01, 0x33, 0x15, 0x33, 0x15, 0x23, 0x15, 0x33, 0x32, 0x16, 0x10, 0x06, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x01, 0x6b, 0xe4, 0x7f, 0x8b, 0x8a, 0x80, 0xfe, 0x66, 0xb6, 0xd5, 0xd5, 0xe4, 0xe2, 0xe7, 0xe7, 0xe2, 0xe4, 0xb6, 0xac, 0xac, 0x04, 0x27, 0xfd, 0xd1, 0x92, 0x01, 0x0c, 0x91, 0x01, 0xae, 0x2d, 0x90, 0x4b, 0xe1, 0xfe, 0x48, 0xe2, 0xfe, 0xae, 0x05, 0x18, 0x90, 0x00, 0x00, 0x02, 0xff, 0xfb, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x25, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x33, 0x15, 0x33, 0x15, 0x23, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x03, 0x81, 0x96, 0xfe, 0xf9, 0x96, 0x96, 0x01, 0x07, 0xfe, 0x63, 0xa7, 0xab, 0xab, 0xa7, 0xe4, 0xe4, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x01, 0x64, 0x01, 0x96, 0xe7, 0xe7, 0xfe, 0x6a, 0xe7, 0x2b, 0xfd, 0xae, 0x06, 0x9b, 0x90, 0x93, 0x93, 0x90, 0xfe, 0xc5, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x00, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x36, 0x10, 0x26, 0x23, 0x01, 0x33, 0x11, 0x33, 0x32, 0x16, 0x10, 0x06, 0x2b, 0x01, 0x15, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x01, 0x6b, 0xe4, 0x7f, 0x8b, 0x8a, 0x80, 0xfe, 0x66, 0xb6, 0xe4, 0xe2, 0xe7, 0xe7, 0xe2, 0xe4, 0xd5, 0xd5, 0xb6, 0xac, 0xac, 0x04, 0x27, 0xfd, 0xd1, 0x92, 0x01, 0x0c, 0x91, 0x01, 0xae, 0xfe, 0xf8, 0xe1, 0xfe, 0x48, 0xe2, 0x5e, 0x90, 0x64, 0x64, 0x90, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfb, 0xfe, 0x56, 0x04, 0x2e, 0x06, 0x14, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x26, 0x20, 0x06, 0x10, 0x16, 0x20, 0x01, 0x35, 0x33, 0x11, 0x33, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x03, 0x81, 0x96, 0xfe, 0xf9, 0x96, 0x96, 0x01, 0x07, 0xfd, 0x11, 0xab, 0xa7, 0x34, 0x9f, 0x6f, 0xb8, 0xe5, 0xe5, 0xb8, 0x6f, 0x9f, 0x34, 0xe4, 0xe4, 0xa7, 0x01, 0x64, 0x01, 0x96, 0xe7, 0xe7, 0xfe, 0x6a, 0xe7, 0xfe, 0x67, 0x90, 0x06, 0xa0, 0xfd, 0xa2, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x64, 0xfe, 0xcc, 0x90, 0x8e, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x03, 0x4e, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x21, 0x23, 0x11, 0x21, 0x35, 0x21, 0x03, 0x4e, 0xb6, 0xfd, 0x72, 0x03, 0x44, 0x05, 0x2b, 0xaa, 0x00, 0x00, 0x00, 0x02, 0x00, 0xad, 0xfe, 0x56, 0x01, 0x54, 0x04, 0x7b, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x01, 0x07, 0x33, 0x11, 0x23, 0x01, 0x00, 0x52, 0xa5, 0xa5, 0x04, 0x7b, 0x1b, 0xf9, 0xf6, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x04, 0x97, 0x05, 0xf0, 0x00, 0x14, 0x00, 0x00, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x12, 0x19, 0x01, 0x23, 0x03, 0xe2, 0x8b, 0x8a, 0xa1, 0xc1, 0xb6, 0xb6, 0x48, 0x5c, 0x5b, 0x8e, 0xcd, 0xd1, 0xb4, 0x03, 0x7f, 0xd7, 0xd5, 0xff, 0xde, 0xfb, 0x08, 0x07, 0x7f, 0xf1, 0x87, 0x43, 0x42, 0xfe, 0xc1, 0xfe, 0xcc, 0xfc, 0x83, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0x56, 0x03, 0xf4, 0x04, 0x7b, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xf4, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfb, 0xdd, 0x06, 0x0a, 0xae, 0x65, 0x64, 0xef, 0x00, 0x00, 0xff, 0xff, 0x00, 0xd8, 0x00, 0x00, 0x01, 0x96, 0x04, 0x23, 0x12, 0x06, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x90, 0x01, 0x49, 0x02, 0x25, 0x03, 0x0b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x35, 0x21, 0x35, 0x21, 0x02, 0x25, 0xfe, 0x6b, 0x01, 0x95, 0xfe, 0x6b, 0x01, 0x95, 0x01, 0x49, 0x96, 0x96, 0x96, 0x00, 0x00, 0x01, 0x01, 0x16, 0x01, 0xe1, 0x01, 0xcd, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x01, 0x33, 0x11, 0x03, 0x23, 0x03, 0x01, 0x16, 0xb7, 0x12, 0x92, 0x13, 0x05, 0xd5, 0xfd, 0x71, 0xfe, 0x9b, 0x01, 0x65, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb1, 0x03, 0xaa, 0x01, 0x4b, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x01, 0x4a, 0x99, 0x05, 0xd5, 0xfd, 0xd5, 0x02, 0x2b, 0x00, 0xff, 0xff, 0x00, 0x9d, 0x00, 0x00, 0x04, 0x3b, 0x05, 0xd5, 0x12, 0x06, 0x03, 0xbb, 0x00, 0x00, 0x00, 0x02, 0x00, 0x45, 0xfe, 0x56, 0x02, 0xff, 0x06, 0x14, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x26, 0x23, 0x22, 0x07, 0x14, 0x33, 0x37, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0x30, 0x03, 0x23, 0x22, 0x37, 0x36, 0x33, 0x32, 0x01, 0x6a, 0x15, 0x31, 0x46, 0x01, 0x53, 0x48, 0xa6, 0xe1, 0xe1, 0x37, 0x6c, 0x2c, 0x3f, 0xac, 0x8a, 0x02, 0x36, 0xfc, 0x01, 0x01, 0xdd, 0x30, 0x03, 0x12, 0x84, 0x4b, 0x39, 0xfa, 0x02, 0x08, 0xfc, 0xfe, 0xa0, 0xfd, 0x70, 0x7c, 0x74, 0x9c, 0xcc, 0xca, 0x02, 0x86, 0xbd, 0xf6, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0xbf, 0x05, 0x47, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x01, 0x11, 0x23, 0xb5, 0xf5, 0x02, 0x54, 0xb0, 0x99, 0x99, 0xf5, 0xfd, 0xac, 0xb0, 0x05, 0xd5, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0xd5, 0xfe, 0x15, 0x01, 0x41, 0x04, 0xe1, 0xfb, 0x1f, 0x00, 0x00, 0x01, 0x00, 0xa7, 0xfe, 0xe5, 0x04, 0x78, 0x04, 0x7b, 0x00, 0x17, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x23, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x03, 0xf4, 0x84, 0x84, 0xa6, 0x70, 0x6f, 0x86, 0x9b, 0xa7, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0xb3, 0x02, 0xa4, 0xfd, 0xef, 0xfe, 0x52, 0x01, 0x1b, 0x02, 0x9e, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x87, 0x04, 0x60, 0xae, 0x65, 0x64, 0xef, 0x00, 0x01, 0x00, 0x03, 0xff, 0xe3, 0x05, 0x9a, 0x05, 0xf0, 0x00, 0x28, 0x00, 0x00, 0x25, 0x11, 0x21, 0x35, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x24, 0x27, 0x26, 0x27, 0x07, 0x27, 0x37, 0x34, 0x35, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x03, 0x01, 0x17, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x04, 0x49, 0xfe, 0xd7, 0x01, 0xdd, 0x69, 0xfe, 0x90, 0xfe, 0xc5, 0xb2, 0x7f, 0x24, 0x4c, 0x26, 0x64, 0x01, 0x63, 0x01, 0x3b, 0x83, 0xed, 0x64, 0x65, 0xe3, 0x7d, 0xf5, 0x7d, 0x79, 0x03, 0x04, 0x4c, 0x27, 0xfb, 0x94, 0x16, 0x5f, 0x7d, 0xf5, 0x61, 0x97, 0xd5, 0x01, 0x91, 0xa6, 0xfd, 0x7f, 0x53, 0x55, 0x01, 0xcc, 0x92, 0xe2, 0x1c, 0x7f, 0x25, 0x1e, 0x1f, 0x01, 0x6e, 0x01, 0x99, 0x48, 0x46, 0xd7, 0x5f, 0x60, 0x99, 0x97, 0xfe, 0xd9, 0x01, 0x95, 0x7f, 0xfe, 0x5f, 0xcf, 0x77, 0x99, 0x25, 0x00, 0x03, 0x00, 0x03, 0xfe, 0x56, 0x04, 0x8f, 0x04, 0x7b, 0x00, 0x26, 0x00, 0x30, 0x00, 0x3a, 0x00, 0x00, 0x25, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x35, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x33, 0x11, 0x37, 0x17, 0x0f, 0x01, 0x05, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x03, 0xeb, 0xe5, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0x33, 0xa0, 0x70, 0xba, 0x71, 0x3c, 0x1c, 0x5e, 0x1d, 0x68, 0x06, 0xe2, 0xba, 0x70, 0xa0, 0x33, 0xa6, 0x86, 0x1d, 0xa3, 0xa7, 0xfd, 0xdc, 0x12, 0x29, 0x4a, 0x85, 0x86, 0x95, 0x0c, 0x11, 0x2d, 0x4a, 0x87, 0x85, 0x94, 0x01, 0x8b, 0xfe, 0xe2, 0xfe, 0xe9, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0xbd, 0xbf, 0x5b, 0x63, 0x62, 0x9d, 0x53, 0x70, 0x23, 0x63, 0x27, 0x38, 0x3e, 0x01, 0x04, 0x01, 0x3a, 0x62, 0x63, 0xaa, 0xfe, 0xb1, 0x32, 0x63, 0x3d, 0x3d, 0xcb, 0x57, 0x3c, 0x6e, 0xdc, 0xc7, 0x15, 0x7e, 0x62, 0x41, 0x6e, 0xdc, 0xc8, 0x1d, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x16, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x01, 0x17, 0x25, 0x17, 0x05, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0x25, 0x27, 0x15, 0xb5, 0xb6, 0x02, 0x5b, 0xea, 0xfd, 0x65, 0x6d, 0x02, 0x16, 0x27, 0xfe, 0x22, 0x01, 0xfe, 0xef, 0xfe, 0x3d, 0xc2, 0xb6, 0x8b, 0x26, 0xb1, 0x01, 0x19, 0x63, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x77, 0xfd, 0x48, 0x7a, 0xc5, 0x7f, 0xb0, 0xfd, 0xc7, 0x01, 0xf7, 0x48, 0xfe, 0x51, 0x01, 0x6c, 0x33, 0x7f, 0x41, 0x68, 0x6e, 0x93, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x04, 0x28, 0x06, 0x14, 0x00, 0x13, 0x00, 0x16, 0x00, 0x00, 0x13, 0x33, 0x11, 0x01, 0x33, 0x01, 0x17, 0x25, 0x17, 0x05, 0x01, 0x23, 0x01, 0x07, 0x11, 0x23, 0x35, 0x07, 0x27, 0x37, 0x25, 0x27, 0x15, 0xa7, 0xa7, 0x01, 0xee, 0xd4, 0xfd, 0xe9, 0x55, 0x01, 0xbc, 0x1e, 0xfe, 0x72, 0x01, 0x8c, 0xd8, 0xfe, 0xab, 0xab, 0xa7, 0x86, 0x1d, 0xa3, 0x01, 0x05, 0x5e, 0x06, 0x14, 0xfc, 0x69, 0x01, 0xe3, 0xfd, 0xf4, 0x5b, 0xa4, 0x62, 0x93, 0xfe, 0x58, 0x01, 0x6c, 0x3f, 0xfe, 0xd3, 0xf0, 0x32, 0x63, 0x3c, 0x61, 0x65, 0x88, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x05, 0x60, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x16, 0x00, 0x19, 0x00, 0x00, 0x13, 0x33, 0x01, 0x25, 0x11, 0x33, 0x11, 0x37, 0x17, 0x07, 0x11, 0x23, 0x01, 0x05, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0x25, 0x03, 0x11, 0x25, 0x13, 0x11, 0xb5, 0xf5, 0x01, 0x3b, 0x01, 0x19, 0xb0, 0x8a, 0x27, 0xb1, 0xf5, 0xfe, 0xc9, 0xfe, 0xe3, 0xb0, 0x8b, 0x26, 0xb1, 0x01, 0x93, 0xe3, 0x01, 0xb9, 0xe0, 0x05, 0xd5, 0xfd, 0x6b, 0x67, 0x02, 0x2e, 0xfe, 0x13, 0x33, 0x7f, 0x41, 0xfc, 0xa5, 0x02, 0x8e, 0x69, 0xfd, 0xdb, 0x01, 0xe4, 0x33, 0x7f, 0x41, 0x95, 0x01, 0xdb, 0xfd, 0xd1, 0x16, 0xfe, 0x2c, 0x02, 0x26, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x04, 0x8f, 0x04, 0x7b, 0x00, 0x17, 0x00, 0x20, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x05, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x36, 0x17, 0x16, 0x17, 0x37, 0x17, 0x07, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x03, 0xf4, 0xa6, 0xfe, 0x00, 0xa7, 0x86, 0x1d, 0xa3, 0xa7, 0x3b, 0xa1, 0x6a, 0xad, 0x59, 0x43, 0x11, 0x83, 0x1d, 0x9a, 0xa8, 0x08, 0x2e, 0x38, 0x6f, 0x86, 0x9b, 0x02, 0xa4, 0xfd, 0x5c, 0x02, 0x6a, 0xbe, 0xfe, 0x54, 0x01, 0x6f, 0x32, 0x63, 0x3d, 0x02, 0x83, 0xae, 0x65, 0x64, 0x01, 0x78, 0x59, 0x99, 0x31, 0x63, 0x39, 0x30, 0x75, 0x40, 0x4f, 0xbe, 0xa4, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x04, 0xfe, 0x05, 0xd5, 0x00, 0x1d, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x1e, 0x01, 0x17, 0x13, 0x23, 0x03, 0x2e, 0x01, 0x2b, 0x01, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0x11, 0x21, 0x32, 0x17, 0x16, 0x17, 0x37, 0x17, 0x07, 0x14, 0x15, 0x14, 0x06, 0x2d, 0x01, 0x26, 0x27, 0x26, 0x27, 0x23, 0x11, 0x15, 0x33, 0x16, 0x37, 0x36, 0x37, 0x03, 0x32, 0x3b, 0x6e, 0x38, 0xb9, 0xc4, 0xac, 0x42, 0x7d, 0x6c, 0xc6, 0xb6, 0x8b, 0x26, 0xb1, 0x01, 0x9a, 0xe7, 0x71, 0x42, 0x1c, 0xd1, 0x27, 0xe5, 0x75, 0xfd, 0xc8, 0x01, 0xe3, 0x10, 0x28, 0x42, 0x85, 0xe4, 0xe4, 0x85, 0x42, 0x37, 0x0a, 0x02, 0xbc, 0x16, 0x90, 0x7e, 0xfe, 0x68, 0x01, 0x7f, 0x96, 0x62, 0xfd, 0x89, 0x03, 0x01, 0x33, 0x7f, 0x42, 0x02, 0x46, 0x6b, 0x3e, 0x64, 0x4e, 0x7f, 0x55, 0x0d, 0x0e, 0x8d, 0xba, 0xf2, 0xb3, 0x3f, 0x28, 0x42, 0x01, 0xfe, 0x16, 0x28, 0x01, 0x44, 0x38, 0x63, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x02, 0xf6, 0x04, 0x7b, 0x00, 0x19, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x25, 0x17, 0x05, 0x11, 0x23, 0x11, 0x07, 0x27, 0x37, 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x02, 0xf6, 0x1c, 0x42, 0x27, 0x8d, 0x96, 0x01, 0x86, 0x1e, 0xfe, 0x5c, 0xa7, 0x86, 0x1d, 0xa3, 0xa7, 0x34, 0xa8, 0x77, 0x11, 0x2a, 0x19, 0x03, 0xb4, 0x12, 0x11, 0xcb, 0xbe, 0x34, 0x90, 0x62, 0x9c, 0xfe, 0x54, 0x01, 0x6f, 0x32, 0x63, 0x3c, 0x02, 0x84, 0xae, 0x66, 0x63, 0x05, 0x05, 0x00, 0x00, 0x01, 0x00, 0x03, 0xff, 0xe3, 0x04, 0x8f, 0x05, 0xf0, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x15, 0x14, 0x04, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x05, 0x27, 0x25, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0xda, 0x67, 0xb8, 0x55, 0x95, 0xa1, 0x6b, 0x96, 0x4b, 0x01, 0xec, 0x26, 0xfe, 0xbd, 0x4f, 0x30, 0x61, 0xfe, 0xfb, 0xfd, 0x60, 0xd7, 0x73, 0x6f, 0xd4, 0x67, 0x9b, 0xaa, 0x7a, 0x8b, 0x57, 0xfe, 0x18, 0x26, 0x01, 0x41, 0x45, 0x2c, 0x5a, 0xfb, 0xdc, 0x5f, 0xc4, 0x05, 0xa4, 0xc5, 0x37, 0x36, 0x80, 0x76, 0x63, 0x65, 0x1f, 0x11, 0xb5, 0x7f, 0x77, 0x27, 0x38, 0x6c, 0xb6, 0xd9, 0xe0, 0x30, 0x2f, 0xd0, 0x45, 0x46, 0x88, 0x7e, 0x6e, 0x7c, 0x1f, 0x13, 0xb4, 0x7f, 0x77, 0x22, 0x2e, 0x60, 0xab, 0xc6, 0xe4, 0x26, 0x00, 0x00, 0x01, 0x00, 0x03, 0xff, 0xe3, 0x03, 0xbd, 0x04, 0x7b, 0x00, 0x2f, 0x00, 0x00, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x17, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x05, 0x27, 0x25, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x03, 0x30, 0x46, 0x97, 0x51, 0x7b, 0x7c, 0x59, 0x85, 0x28, 0x01, 0x8e, 0x1e, 0xfe, 0xf3, 0x44, 0x28, 0x49, 0x01, 0xde, 0xc2, 0x51, 0xb0, 0x61, 0x5c, 0xb2, 0x57, 0x75, 0x7e, 0x5b, 0x9a, 0x20, 0xfe, 0x7a, 0x1d, 0x01, 0x06, 0x38, 0x22, 0x45, 0xca, 0xb9, 0x5c, 0xa2, 0x04, 0x3f, 0xae, 0x28, 0x28, 0x54, 0x54, 0x40, 0x49, 0x21, 0x0a, 0x93, 0x63, 0x63, 0x20, 0x28, 0x4c, 0x89, 0x9c, 0xb6, 0x23, 0x23, 0xbe, 0x35, 0x35, 0x59, 0x51, 0x4b, 0x50, 0x25, 0x08, 0x90, 0x63, 0x61, 0x1b, 0x26, 0x4a, 0x83, 0x9e, 0xac, 0x1e, 0x00, 0x00, 0x01, 0xff, 0xa1, 0x00, 0x00, 0x05, 0x10, 0x05, 0xd5, 0x00, 0x14, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x11, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x01, 0x0f, 0x77, 0x6a, 0x8c, 0xac, 0xc1, 0xb6, 0x02, 0x94, 0xb6, 0xb6, 0xfd, 0x6c, 0xb6, 0x05, 0x30, 0x01, 0x5e, 0x69, 0x31, 0x46, 0xb5, 0xa3, 0xfd, 0x9c, 0x02, 0x64, 0xfa, 0x2b, 0x02, 0xc7, 0xfd, 0x39, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x05, 0xf0, 0x04, 0x60, 0x12, 0x06, 0x03, 0xdc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6b, 0x00, 0x00, 0x03, 0x70, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x03, 0x6f, 0xb5, 0xfd, 0xeb, 0x02, 0x15, 0xfd, 0xb1, 0x05, 0xd5, 0xfa, 0x2b, 0x02, 0xc9, 0xaa, 0x01, 0xb8, 0xaa, 0x00, 0x00, 0x02, 0x00, 0x3f, 0x00, 0x00, 0x03, 0xa3, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x13, 0x00, 0x00, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x3b, 0x01, 0x13, 0x11, 0x23, 0x11, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x02, 0xed, 0xe5, 0x7f, 0x8a, 0x8a, 0x7f, 0xe5, 0xb6, 0xb6, 0xe5, 0xe2, 0xe7, 0xe7, 0xe2, 0x05, 0x2f, 0x92, 0x86, 0x87, 0x92, 0x02, 0xd7, 0xfa, 0x2b, 0x02, 0x58, 0xe2, 0xdd, 0xdb, 0xe3, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x01, 0x33, 0x01, 0x11, 0x33, 0x11, 0x21, 0x09, 0x01, 0xb5, 0xb0, 0x01, 0x5b, 0xb6, 0x01, 0x5b, 0xb1, 0xfe, 0xf1, 0xfe, 0xa8, 0xfe, 0xa9, 0x05, 0xd5, 0xfa, 0xe1, 0x04, 0x00, 0xfc, 0x00, 0x05, 0x1f, 0xfa, 0x2b, 0x03, 0xf8, 0xfc, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x6b, 0x07, 0x6d, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0xb5, 0xb6, 0xb6, 0x07, 0x6d, 0xf8, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3d, 0x00, 0x00, 0x08, 0x67, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x25, 0x01, 0x33, 0x09, 0x01, 0x33, 0x01, 0x23, 0x09, 0x01, 0x23, 0x09, 0x01, 0x23, 0x01, 0x33, 0x03, 0x8f, 0x01, 0x1e, 0xcc, 0x01, 0x1b, 0x01, 0x1a, 0xb8, 0xfe, 0xaf, 0xe5, 0xfe, 0xe4, 0xfe, 0xe2, 0xcc, 0xfe, 0xe5, 0xfe, 0xe7, 0xb9, 0x01, 0x52, 0xe4, 0xc5, 0x05, 0x10, 0xfb, 0x12, 0x04, 0xee, 0xfa, 0x2b, 0x05, 0x10, 0xfa, 0xf0, 0x04, 0xee, 0xfb, 0x12, 0x05, 0xd5, 0x00, 0x00, 0x01, 0x00, 0xae, 0x04, 0xd0, 0x02, 0x53, 0x05, 0x58, 0x00, 0x03, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x02, 0x53, 0xfe, 0x5c, 0x01, 0xa4, 0x04, 0xd0, 0x88, 0x00, 0x00, 0x01, 0x00, 0x7e, 0x03, 0x9c, 0x02, 0x77, 0x05, 0x58, 0x00, 0x04, 0x00, 0x00, 0x13, 0x27, 0x01, 0x33, 0x15, 0xc1, 0x42, 0x01, 0xd4, 0x24, 0x03, 0x9c, 0x73, 0x01, 0x49, 0x88, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x02, 0x68, 0x02, 0x9a, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x01, 0x23, 0x01, 0x27, 0x01, 0x33, 0x02, 0x9a, 0x0e, 0xfe, 0x35, 0x5e, 0x01, 0xf0, 0x47, 0x04, 0xd0, 0xfd, 0x98, 0x57, 0x02, 0x99, 0x00, 0x01, 0x00, 0x56, 0x01, 0x34, 0x02, 0xa7, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x01, 0x23, 0x01, 0x27, 0x01, 0x33, 0x02, 0xa7, 0x0d, 0xfe, 0x27, 0x6b, 0x01, 0xfd, 0x54, 0x04, 0xd0, 0xfc, 0x64, 0x44, 0x03, 0xe0, 0x00, 0x01, 0x00, 0x51, 0x00, 0x00, 0x02, 0xad, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x01, 0x23, 0x01, 0x27, 0x01, 0x33, 0x02, 0xad, 0x0a, 0xfe, 0x1e, 0x70, 0x02, 0x02, 0x5a, 0x04, 0xd0, 0xfb, 0x30, 0x37, 0x05, 0x21, 0x00, 0x01, 0x00, 0x7e, 0x03, 0x9c, 0x02, 0x77, 0x05, 0x58, 0x00, 0x04, 0x00, 0x00, 0x13, 0x01, 0x15, 0x23, 0x01, 0xc1, 0x01, 0xb6, 0x24, 0xfe, 0x2c, 0x05, 0x58, 0xfe, 0xcc, 0x88, 0x01, 0x49, 0xff, 0xff, 0x00, 0xae, 0x03, 0x9c, 0x02, 0x53, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xa9, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, 0x02, 0x68, 0x02, 0x77, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xaa, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x01, 0x34, 0x02, 0x9a, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xab, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x56, 0x00, 0x00, 0x02, 0xa7, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xac, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x02, 0x68, 0x02, 0x9a, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x01, 0x15, 0x23, 0x01, 0x37, 0x01, 0x02, 0x9a, 0x47, 0xfe, 0x10, 0x5e, 0x01, 0xcb, 0x02, 0xf0, 0x88, 0x02, 0x99, 0x57, 0xfd, 0x98, 0xff, 0xff, 0x00, 0x7e, 0x02, 0x68, 0x02, 0x77, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xae, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0xae, 0x02, 0x68, 0x02, 0x53, 0x02, 0xf0, 0x10, 0x07, 0x0e, 0xa9, 0x00, 0x00, 0xfd, 0x98, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, 0x01, 0x34, 0x02, 0x77, 0x02, 0xf0, 0x10, 0x07, 0x0e, 0xaa, 0x00, 0x00, 0xfd, 0x98, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x02, 0x9a, 0x02, 0xf0, 0x10, 0x07, 0x0e, 0xab, 0x00, 0x00, 0xfd, 0x98, 0x00, 0x00, 0x00, 0x01, 0x00, 0x56, 0x01, 0x34, 0x02, 0xa7, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x01, 0x15, 0x23, 0x01, 0x37, 0x01, 0x02, 0xa7, 0x54, 0xfe, 0x03, 0x6b, 0x01, 0xd9, 0x01, 0xbc, 0x88, 0x03, 0xe0, 0x44, 0xfc, 0x64, 0xff, 0xff, 0x00, 0x63, 0x01, 0x34, 0x02, 0x9a, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xb3, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, 0x01, 0x34, 0x02, 0x77, 0x02, 0xf0, 0x10, 0x07, 0x0e, 0xae, 0x00, 0x00, 0xfd, 0x98, 0x00, 0x00, 0xff, 0xff, 0x00, 0xae, 0x01, 0x34, 0x02, 0x53, 0x01, 0xbc, 0x10, 0x07, 0x0e, 0xa9, 0x00, 0x00, 0xfc, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, 0x00, 0x00, 0x02, 0x77, 0x01, 0xbc, 0x10, 0x07, 0x0e, 0xaa, 0x00, 0x00, 0xfc, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x51, 0x00, 0x00, 0x02, 0xad, 0x05, 0x58, 0x00, 0x05, 0x00, 0x00, 0x25, 0x15, 0x23, 0x01, 0x37, 0x01, 0x02, 0xad, 0x5a, 0xfd, 0xfe, 0x70, 0x01, 0xe2, 0x88, 0x88, 0x05, 0x21, 0x37, 0xfb, 0x30, 0x00, 0xff, 0xff, 0x00, 0x56, 0x00, 0x00, 0x02, 0xa7, 0x04, 0x24, 0x10, 0x07, 0x0e, 0xb8, 0x00, 0x00, 0xfe, 0xcc, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0x00, 0x00, 0x02, 0x9a, 0x02, 0xf0, 0x10, 0x07, 0x0e, 0xb3, 0x00, 0x00, 0xfd, 0x98, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7e, 0x00, 0x00, 0x02, 0x77, 0x01, 0xbc, 0x10, 0x07, 0x0e, 0xae, 0x00, 0x00, 0xfc, 0x64, 0x00, 0x00, 0xff, 0xff, 0x00, 0xae, 0x00, 0x00, 0x02, 0x53, 0x00, 0x88, 0x11, 0x07, 0x0e, 0xa9, 0x00, 0x00, 0xfb, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x00, 0x00, 0x01, 0x3b, 0x05, 0x58, 0x00, 0x03, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0xc1, 0x7a, 0x05, 0x58, 0xfa, 0xa8, 0x00, 0x0e, 0x00, 0x87, 0x00, 0x00, 0x06, 0x81, 0x05, 0xdc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x06, 0x27, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0xfe, 0x98, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x03, 0x25, 0x02, 0x4e, 0xfd, 0xb2, 0xfd, 0x44, 0x02, 0x4e, 0xfd, 0xb2, 0x05, 0x0f, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x25, 0x02, 0x4e, 0xfd, 0xb2, 0x69, 0x64, 0x64, 0xfd, 0xad, 0x02, 0x4e, 0xfd, 0xb2, 0x02, 0xbc, 0x02, 0x4e, 0xfd, 0xb2, 0xfd, 0x44, 0x02, 0x4e, 0xfd, 0xb2, 0x05, 0x0f, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x25, 0x02, 0x4e, 0xfd, 0xb2, 0x69, 0x64, 0x64, 0xfd, 0xad, 0x02, 0x4e, 0xfd, 0xb2, 0x00, 0x0e, 0x00, 0x87, 0x00, 0x00, 0x06, 0x81, 0x05, 0xdc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x06, 0x27, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0xfe, 0x98, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x03, 0x1b, 0x02, 0x58, 0xfd, 0xa8, 0xfd, 0x44, 0x02, 0x58, 0xfd, 0xa8, 0x05, 0x19, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x1b, 0x02, 0x58, 0xfd, 0xa8, 0x5f, 0x64, 0x64, 0xfd, 0xa3, 0x02, 0x58, 0xfd, 0xa8, 0x02, 0xbc, 0x02, 0x58, 0xfd, 0xa8, 0xfd, 0x44, 0x02, 0x58, 0xfd, 0xa8, 0x05, 0x19, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x1b, 0x02, 0x58, 0xfd, 0xa8, 0x5f, 0x64, 0x64, 0xfd, 0xa3, 0x02, 0x58, 0xfd, 0xa8, 0x00, 0x0e, 0x00, 0x87, 0x00, 0x00, 0x06, 0x81, 0x05, 0xdc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x06, 0x27, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0xfe, 0x98, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x03, 0x25, 0x02, 0x4e, 0xfd, 0xb2, 0xfd, 0x44, 0x02, 0x4e, 0xfd, 0xb2, 0x05, 0x0f, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x25, 0x02, 0x4e, 0xfd, 0xb2, 0x69, 0x64, 0x64, 0xfd, 0xad, 0x02, 0x4e, 0xfd, 0xb2, 0x02, 0xbc, 0x02, 0x4e, 0xfd, 0xb2, 0xfd, 0x44, 0x02, 0x4e, 0xfd, 0xb2, 0x05, 0x0f, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x25, 0x02, 0x4e, 0xfd, 0xb2, 0x69, 0x64, 0x64, 0xfd, 0xad, 0x02, 0x4e, 0xfd, 0xb2, 0x00, 0x0e, 0x00, 0x87, 0x00, 0x00, 0x06, 0x81, 0x05, 0xdc, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x01, 0x11, 0x33, 0x11, 0x03, 0x11, 0x33, 0x11, 0x01, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x15, 0x35, 0x21, 0x15, 0x01, 0x11, 0x33, 0x11, 0x06, 0x27, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0xfe, 0x98, 0x5a, 0x5a, 0x5a, 0xfd, 0xb7, 0x01, 0xef, 0xfe, 0x11, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x01, 0xef, 0xfd, 0xb7, 0x5a, 0x03, 0x1b, 0x02, 0x58, 0xfd, 0xa8, 0xfd, 0x44, 0x02, 0x58, 0xfd, 0xa8, 0x05, 0x19, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x1b, 0x02, 0x58, 0xfd, 0xa8, 0x5f, 0x64, 0x64, 0xfd, 0xa3, 0x02, 0x58, 0xfd, 0xa8, 0x02, 0xbc, 0x02, 0x58, 0xfd, 0xa8, 0xfd, 0x44, 0x02, 0x58, 0xfd, 0xa8, 0x05, 0x19, 0x64, 0x64, 0xfa, 0x88, 0x64, 0x64, 0x03, 0x1b, 0x02, 0x58, 0xfd, 0xa8, 0x5f, 0x64, 0x64, 0xfd, 0xa3, 0x02, 0x58, 0xfd, 0xa8, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xcb, 0x06, 0x9f, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x10, 0x21, 0x20, 0x11, 0x35, 0x13, 0x33, 0x03, 0x15, 0x10, 0x21, 0x20, 0x11, 0x35, 0x34, 0x00, 0x11, 0x33, 0x16, 0x00, 0x03, 0xca, 0xfe, 0x56, 0xfe, 0x43, 0x35, 0xb4, 0x3e, 0x01, 0x12, 0x01, 0x08, 0xfe, 0x41, 0xa3, 0x01, 0x01, 0xbd, 0x02, 0xa1, 0x9f, 0xfd, 0xe0, 0x02, 0x25, 0x8b, 0x01, 0x09, 0xfe, 0xda, 0x73, 0xfe, 0x80, 0x01, 0x8a, 0xb8, 0xf9, 0x01, 0xcb, 0x01, 0x17, 0xc5, 0xfe, 0x07, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xcb, 0x06, 0x9f, 0x00, 0x09, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x12, 0x25, 0x04, 0x03, 0x15, 0x10, 0x21, 0x20, 0x11, 0x37, 0x15, 0x10, 0x20, 0x11, 0x35, 0x10, 0x25, 0x33, 0x36, 0x27, 0x26, 0x27, 0x33, 0x14, 0x16, 0x07, 0x33, 0x04, 0x03, 0x28, 0x01, 0xfe, 0xe8, 0xfe, 0xfe, 0x01, 0x01, 0x09, 0x01, 0x11, 0xa2, 0xfc, 0x99, 0x01, 0x6b, 0x12, 0x2e, 0x78, 0x78, 0x02, 0xbb, 0xc4, 0x21, 0x12, 0x01, 0x3c, 0x02, 0x9d, 0x01, 0x67, 0x0b, 0x08, 0xfe, 0x82, 0x55, 0xfe, 0x4e, 0x01, 0xad, 0x4b, 0x37, 0xfd, 0x9f, 0x02, 0x61, 0x3c, 0x01, 0xeb, 0x3d, 0xa3, 0x51, 0x52, 0xb2, 0x6c, 0x9e, 0xf3, 0x45, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x04, 0x1b, 0x06, 0xb3, 0x00, 0x09, 0x00, 0x21, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x15, 0x10, 0x21, 0x20, 0x11, 0x37, 0x15, 0x10, 0x21, 0x20, 0x11, 0x35, 0x10, 0x25, 0x33, 0x36, 0x27, 0x36, 0x23, 0x22, 0x15, 0x23, 0x10, 0x21, 0x20, 0x03, 0x06, 0x07, 0x04, 0x03, 0x70, 0xfe, 0xd8, 0xfe, 0xc6, 0x01, 0x36, 0x01, 0x2c, 0xaa, 0xfe, 0x26, 0xfe, 0x23, 0x01, 0xd3, 0x55, 0x45, 0x02, 0x01, 0xab, 0xa4, 0x93, 0x01, 0x34, 0x01, 0x3a, 0x01, 0x0b, 0x3d, 0x01, 0x08, 0x02, 0x7e, 0x01, 0xa4, 0xfe, 0x62, 0x5f, 0xfe, 0x5d, 0x01, 0xa3, 0x61, 0x57, 0xfd, 0xb3, 0x02, 0x3e, 0x78, 0x01, 0xd6, 0x4e, 0x5c, 0x61, 0x9a, 0xc4, 0x01, 0x64, 0xfe, 0xc1, 0x8b, 0x55, 0x72, 0x00, 0x00, 0x02, 0x00, 0x63, 0x00, 0x00, 0x06, 0x04, 0x06, 0xb3, 0x00, 0x24, 0x00, 0x2e, 0x00, 0x00, 0x37, 0x36, 0x37, 0x00, 0x11, 0x35, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x15, 0x10, 0x05, 0x24, 0x11, 0x35, 0x34, 0x37, 0x26, 0x23, 0x22, 0x11, 0x15, 0x10, 0x01, 0x17, 0x04, 0x17, 0x23, 0x26, 0x27, 0x26, 0x07, 0x01, 0x10, 0x23, 0x22, 0x11, 0x15, 0x02, 0x17, 0x36, 0x13, 0xf2, 0x59, 0x73, 0xfe, 0xa5, 0x01, 0x8d, 0x98, 0x8f, 0x5b, 0xe8, 0x01, 0xaa, 0xfe, 0x56, 0xfe, 0x62, 0x23, 0x4b, 0x9c, 0xeb, 0x01, 0x7e, 0xbf, 0x01, 0x5f, 0x33, 0xee, 0x0c, 0xd6, 0xe8, 0xdc, 0x04, 0x11, 0xff, 0xf6, 0x01, 0xf7, 0xfe, 0x01, 0xc3, 0x4e, 0x21, 0x01, 0x56, 0x01, 0xc6, 0x6d, 0x01, 0xf8, 0xb3, 0xa9, 0xfd, 0xff, 0x95, 0xfd, 0xd2, 0x1e, 0x1c, 0x02, 0x30, 0x77, 0x5f, 0x8c, 0x9a, 0xfe, 0xb7, 0x63, 0xfe, 0x2d, 0xfe, 0xb1, 0x18, 0x53, 0xd6, 0x52, 0x40, 0x40, 0xb4, 0x04, 0x5d, 0x01, 0x8f, 0xfe, 0x9e, 0x9a, 0xfe, 0x77, 0x1d, 0x1c, 0x01, 0x6c, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xcb, 0x06, 0xb3, 0x00, 0x17, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x1b, 0x01, 0x33, 0x03, 0x10, 0x21, 0x04, 0x19, 0x01, 0x34, 0x23, 0x22, 0x11, 0x17, 0x23, 0x03, 0x10, 0x21, 0x20, 0x11, 0x03, 0xca, 0xfe, 0x47, 0xfe, 0x52, 0x01, 0x51, 0xbb, 0x63, 0x01, 0x0a, 0x01, 0x1a, 0xff, 0xdb, 0x4b, 0xab, 0x3f, 0x01, 0x87, 0x01, 0x8b, 0x01, 0xc8, 0xfe, 0x1a, 0x01, 0xe9, 0x01, 0x2f, 0xfe, 0xd1, 0xfe, 0xb7, 0x01, 0x01, 0x4f, 0x03, 0x73, 0xd1, 0xfe, 0xff, 0xf6, 0x01, 0x0d, 0x01, 0x89, 0xfe, 0x8b, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xcb, 0x06, 0xb3, 0x00, 0x21, 0x00, 0x00, 0x01, 0x06, 0x07, 0x16, 0x1d, 0x01, 0x10, 0x20, 0x11, 0x13, 0x33, 0x03, 0x10, 0x21, 0x20, 0x11, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x03, 0x34, 0x23, 0x06, 0x07, 0x17, 0x23, 0x27, 0x10, 0x21, 0x20, 0x03, 0xa6, 0x04, 0xb9, 0xe1, 0xfc, 0x99, 0x30, 0xb0, 0x36, 0x01, 0x0a, 0x01, 0x11, 0xab, 0x99, 0x52, 0xc6, 0x02, 0xe2, 0xe9, 0x02, 0x21, 0xa8, 0x16, 0x01, 0x88, 0x01, 0x8e, 0x05, 0x1b, 0xe6, 0x7c, 0x73, 0xfe, 0x7d, 0xfe, 0x17, 0x02, 0x01, 0x01, 0x17, 0xfe, 0xe0, 0xfe, 0xa8, 0x01, 0x4e, 0x73, 0xcd, 0x28, 0xa9, 0x50, 0x01, 0x0a, 0xda, 0x01, 0xf5, 0x9a, 0x9e, 0x01, 0x90, 0x00, 0x00, 0x00, 0x03, 0x00, 0x63, 0xff, 0xe2, 0x04, 0x51, 0x06, 0xb3, 0x00, 0x09, 0x00, 0x13, 0x00, 0x26, 0x00, 0x00, 0x01, 0x12, 0x07, 0x22, 0x15, 0x14, 0x17, 0x36, 0x37, 0x33, 0x01, 0x10, 0x21, 0x20, 0x11, 0x15, 0x10, 0x21, 0x20, 0x11, 0x37, 0x15, 0x10, 0x21, 0x20, 0x11, 0x35, 0x34, 0x37, 0x26, 0x35, 0x10, 0x21, 0x20, 0x11, 0x14, 0x07, 0x33, 0x04, 0x02, 0x89, 0x02, 0xc1, 0xbc, 0x5e, 0x5b, 0xad, 0x10, 0x01, 0x1e, 0xfe, 0xe7, 0xfe, 0xd5, 0x01, 0x26, 0x01, 0x1e, 0xae, 0xfe, 0x33, 0xfe, 0x30, 0x5b, 0xab, 0x01, 0x5e, 0x01, 0x69, 0x0b, 0x0a, 0x01, 0x27, 0x04, 0xde, 0x01, 0x36, 0x01, 0xdf, 0xb4, 0x5f, 0x63, 0x09, 0xfd, 0xe5, 0x01, 0x88, 0xfe, 0x76, 0x4b, 0xfe, 0x5d, 0x01, 0x9b, 0x58, 0x4b, 0xfd, 0xb8, 0x02, 0x52, 0x46, 0x8d, 0xbc, 0x94, 0xce, 0x01, 0x8e, 0xfe, 0x2e, 0x25, 0x40, 0x7f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x05, 0xf7, 0x06, 0xb3, 0x00, 0x09, 0x00, 0x22, 0x00, 0x00, 0x01, 0x10, 0x23, 0x22, 0x19, 0x01, 0x10, 0x33, 0x32, 0x11, 0x25, 0x02, 0x03, 0x23, 0x36, 0x13, 0x11, 0x10, 0x23, 0x22, 0x03, 0x11, 0x10, 0x21, 0x20, 0x19, 0x01, 0x10, 0x21, 0x36, 0x17, 0x36, 0x33, 0x20, 0x13, 0x02, 0xf5, 0xf2, 0xf8, 0xf8, 0xf2, 0x03, 0x01, 0x09, 0xb7, 0xef, 0xee, 0x15, 0xda, 0xc2, 0x11, 0xfe, 0x5d, 0xfe, 0x69, 0x01, 0xa0, 0xc9, 0x86, 0x68, 0xde, 0x01, 0x5d, 0x01, 0x04, 0x92, 0x01, 0x82, 0xfe, 0x7e, 0xfd, 0x93, 0xfe, 0x5c, 0x01, 0xa4, 0x9b, 0xfe, 0x46, 0xfe, 0xfa, 0xe5, 0x01, 0xdb, 0x01, 0xd2, 0x01, 0x79, 0xfe, 0xed, 0xfd, 0x2d, 0xfd, 0xbd, 0x02, 0x43, 0x02, 0x6d, 0x02, 0x21, 0x02, 0xe6, 0xda, 0xfd, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x03, 0x9d, 0x06, 0xb3, 0x00, 0x15, 0x00, 0x00, 0x01, 0x10, 0x03, 0x23, 0x12, 0x19, 0x01, 0x10, 0x23, 0x20, 0x19, 0x01, 0x10, 0x13, 0x23, 0x02, 0x19, 0x01, 0x10, 0x21, 0x20, 0x11, 0x03, 0x9c, 0x8b, 0xb2, 0x93, 0xdc, 0xfe, 0xf8, 0x9d, 0xb4, 0x94, 0x01, 0xb3, 0x01, 0x86, 0x02, 0xfb, 0xfe, 0x8a, 0xfe, 0x7b, 0x01, 0x43, 0x01, 0xb8, 0x01, 0x9a, 0x01, 0x7e, 0xfe, 0x82, 0xfe, 0x66, 0xfe, 0x53, 0xfe, 0xb2, 0x01, 0x79, 0x01, 0x82, 0x01, 0x9a, 0x02, 0x1e, 0xfd, 0xe2, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xcb, 0x06, 0xa0, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x02, 0x21, 0x20, 0x11, 0x13, 0x33, 0x03, 0x10, 0x05, 0x20, 0x11, 0x35, 0x10, 0x2b, 0x01, 0x35, 0x33, 0x36, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x10, 0x07, 0x16, 0x11, 0x03, 0xca, 0x01, 0xfe, 0x4e, 0xfe, 0x4c, 0x27, 0xb9, 0x36, 0x01, 0x0a, 0x01, 0x11, 0xbd, 0xc6, 0x9e, 0xe5, 0xb4, 0xfc, 0x5a, 0xe1, 0xe1, 0x01, 0xc6, 0xfe, 0x1c, 0x01, 0xf3, 0x01, 0x24, 0xfe, 0xdc, 0xfe, 0xae, 0x01, 0x01, 0x44, 0x78, 0x01, 0x3c, 0xa8, 0x81, 0xaf, 0x95, 0xb9, 0xbe, 0x6d, 0xfe, 0xf7, 0x64, 0x63, 0xfe, 0x9e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x08, 0x07, 0x06, 0xb3, 0x00, 0x35, 0x00, 0x00, 0x25, 0x36, 0x37, 0x24, 0x03, 0x35, 0x10, 0x21, 0x32, 0x17, 0x36, 0x20, 0x17, 0x36, 0x33, 0x20, 0x11, 0x15, 0x14, 0x03, 0x23, 0x12, 0x3d, 0x01, 0x12, 0x23, 0x22, 0x15, 0x11, 0x23, 0x11, 0x10, 0x23, 0x06, 0x15, 0x11, 0x23, 0x11, 0x26, 0x23, 0x22, 0x11, 0x15, 0x12, 0x05, 0x36, 0x17, 0x04, 0x13, 0x21, 0x26, 0x25, 0x24, 0x01, 0x01, 0x3a, 0x68, 0x82, 0xfe, 0x6a, 0x2b, 0x01, 0x8b, 0xd1, 0x65, 0x5a, 0x01, 0x74, 0x62, 0x55, 0xdb, 0x01, 0x83, 0xc9, 0xb8, 0xe2, 0x01, 0xe3, 0xe7, 0x9b, 0xcc, 0xc5, 0x9c, 0x02, 0xe8, 0xdf, 0x28, 0x01, 0x87, 0x6e, 0x81, 0x01, 0xda, 0xf6, 0xfe, 0xef, 0x24, 0xfe, 0xbd, 0xfe, 0xbe, 0xfe, 0xe9, 0xa6, 0x78, 0x43, 0xf3, 0x01, 0xf0, 0x7b, 0x01, 0xeb, 0xb2, 0xbb, 0xbb, 0xb2, 0xfe, 0x1f, 0x67, 0xba, 0xfe, 0x64, 0x01, 0xb1, 0xc8, 0x3f, 0x01, 0x47, 0xe7, 0xfe, 0x5a, 0x01, 0xa6, 0x01, 0x00, 0x02, 0xfe, 0xfe, 0x5a, 0x01, 0xa6, 0xe7, 0xfe, 0xb7, 0x79, 0xfe, 0x41, 0xe9, 0x17, 0x0b, 0x23, 0xfe, 0x76, 0xa5, 0x5c, 0x5b, 0xfe, 0xc3, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xc9, 0x06, 0xb3, 0x00, 0x09, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x11, 0x26, 0x27, 0x20, 0x11, 0x15, 0x10, 0x05, 0x20, 0x13, 0x10, 0x21, 0x20, 0x11, 0x35, 0x10, 0x25, 0x32, 0x17, 0x35, 0x34, 0x21, 0x22, 0x06, 0x15, 0x23, 0x10, 0x21, 0x20, 0x11, 0x03, 0x30, 0x5f, 0xa6, 0xfe, 0xe3, 0x01, 0x1b, 0x01, 0x07, 0x98, 0xfe, 0x61, 0xfe, 0x3a, 0x01, 0xb3, 0x8e, 0x8d, 0xfe, 0xfe, 0x8a, 0x6f, 0xa1, 0x01, 0x8e, 0x01, 0xa5, 0x01, 0xda, 0x01, 0xcb, 0x3f, 0x01, 0xfe, 0xc1, 0xb8, 0xfe, 0x95, 0x01, 0x01, 0x62, 0xfd, 0xfe, 0x02, 0x02, 0xae, 0x01, 0xee, 0x14, 0x4a, 0xd1, 0xf9, 0x71, 0x6c, 0x01, 0x7c, 0xfe, 0x63, 0x00, 0x00, 0x00, 0x02, 0x00, 0x75, 0xff, 0xe2, 0x03, 0xdd, 0x06, 0xa0, 0x00, 0x09, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x10, 0x21, 0x22, 0x07, 0x11, 0x10, 0x21, 0x20, 0x11, 0x37, 0x15, 0x10, 0x21, 0x20, 0x19, 0x01, 0x10, 0x29, 0x01, 0x15, 0x21, 0x22, 0x1d, 0x01, 0x36, 0x33, 0x20, 0x03, 0x3a, 0xfe, 0xe8, 0x97, 0x74, 0x01, 0x16, 0x01, 0x0d, 0xa2, 0xfe, 0x46, 0xfe, 0x53, 0x01, 0x2f, 0x01, 0xd0, 0xfe, 0x35, 0x9b, 0x98, 0x7e, 0x01, 0xb8, 0x02, 0xab, 0x01, 0x4f, 0x4b, 0xfe, 0x26, 0xfe, 0xad, 0x01, 0x44, 0xfe, 0xfa, 0xfe, 0x18, 0x01, 0xe8, 0x03, 0x54, 0x01, 0x82, 0xa0, 0xe6, 0xc7, 0x55, 0x00, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x05, 0xdf, 0x06, 0xb3, 0x00, 0x20, 0x00, 0x00, 0x01, 0x10, 0x01, 0x23, 0x00, 0x19, 0x01, 0x10, 0x23, 0x22, 0x19, 0x01, 0x23, 0x11, 0x10, 0x23, 0x22, 0x19, 0x01, 0x10, 0x01, 0x23, 0x00, 0x19, 0x01, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x05, 0xdf, 0xfe, 0xe6, 0xc9, 0x01, 0x3b, 0xf3, 0xce, 0xa5, 0xef, 0xd3, 0x01, 0x1e, 0xc1, 0xfe, 0xf7, 0x01, 0x91, 0xc8, 0x6c, 0x75, 0xa7, 0x01, 0x9b, 0x02, 0xc2, 0xfe, 0x66, 0xfe, 0xd8, 0x01, 0x6e, 0x01, 0x55, 0x01, 0xcf, 0x01, 0x83, 0xfe, 0xcf, 0xfd, 0x82, 0x02, 0x87, 0x01, 0x28, 0xfe, 0x7d, 0xfe, 0x31, 0xfe, 0xa7, 0xfe, 0x96, 0x01, 0x28, 0x01, 0x9b, 0x01, 0xcf, 0x02, 0x21, 0xf0, 0xf0, 0xfd, 0xdf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xcb, 0x06, 0x9f, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x15, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x21, 0x20, 0x11, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x36, 0x35, 0x34, 0x24, 0x35, 0x33, 0x14, 0x04, 0x15, 0x14, 0x07, 0x16, 0x03, 0xca, 0xfe, 0x5f, 0xfe, 0x3a, 0x12, 0xb3, 0x1a, 0x01, 0x16, 0x01, 0x04, 0x9e, 0xc4, 0x67, 0xe9, 0xfe, 0x87, 0xc6, 0x01, 0x55, 0xd3, 0xe5, 0x01, 0xd7, 0x25, 0xfe, 0x30, 0x01, 0xdf, 0xb3, 0xb3, 0xfe, 0xc1, 0x01, 0x3f, 0x43, 0xc0, 0x2d, 0xb6, 0x3f, 0xb0, 0xa3, 0x72, 0xf4, 0x96, 0x8e, 0xdd, 0xb2, 0x79, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xca, 0x06, 0xc1, 0x00, 0x16, 0x00, 0x00, 0x01, 0x10, 0x25, 0x20, 0x11, 0x33, 0x10, 0x21, 0x20, 0x19, 0x01, 0x05, 0x04, 0x15, 0x10, 0x25, 0x35, 0x04, 0x27, 0x36, 0x25, 0x35, 0x25, 0x03, 0xc9, 0xfe, 0x49, 0xfe, 0x51, 0xab, 0x01, 0x04, 0x01, 0x14, 0xfe, 0x0f, 0x01, 0x3d, 0xfd, 0xf2, 0x01, 0x78, 0x01, 0x02, 0xfe, 0x87, 0x03, 0x65, 0x01, 0xd1, 0xfe, 0x0f, 0x02, 0x02, 0x4a, 0xfe, 0x56, 0x01, 0x4f, 0x04, 0x3b, 0x32, 0x78, 0xd6, 0xfe, 0x7d, 0x02, 0xb2, 0x02, 0xce, 0xb0, 0x5f, 0xa7, 0x82, 0x00, 0x01, 0x00, 0x63, 0x00, 0x00, 0x06, 0x31, 0x06, 0xb3, 0x00, 0x26, 0x00, 0x00, 0x01, 0x15, 0x10, 0x01, 0x23, 0x00, 0x11, 0x35, 0x10, 0x27, 0x22, 0x03, 0x11, 0x23, 0x11, 0x10, 0x23, 0x22, 0x11, 0x15, 0x10, 0x01, 0x23, 0x00, 0x11, 0x35, 0x10, 0x37, 0x36, 0x21, 0x15, 0x24, 0x03, 0x37, 0x32, 0x17, 0x36, 0x33, 0x20, 0x06, 0x31, 0xfe, 0xc5, 0xd7, 0x01, 0x60, 0xeb, 0xf0, 0x01, 0xad, 0xfe, 0xea, 0x01, 0x6c, 0xd4, 0xfe, 0xbd, 0xf8, 0xfa, 0x02, 0x82, 0xfd, 0x41, 0x9f, 0x71, 0xef, 0x7c, 0x69, 0xc6, 0x01, 0xac, 0x03, 0x1e, 0x7c, 0xfe, 0x62, 0xfe, 0xfc, 0x01, 0x62, 0x01, 0x49, 0x8c, 0x01, 0x4b, 0x02, 0xfe, 0xd7, 0xfe, 0xa2, 0x01, 0x5e, 0x01, 0x28, 0xfe, 0xb4, 0x95, 0xfe, 0xc1, 0xfe, 0x9d, 0x01, 0x04, 0x01, 0x9e, 0x77, 0x01, 0xa3, 0xfc, 0xfb, 0xa0, 0x01, 0xfe, 0xd8, 0x34, 0xf4, 0xf4, 0x00, 0x00, 0x01, 0x00, 0x75, 0xff, 0xe2, 0x03, 0xdd, 0x06, 0x9f, 0x00, 0x15, 0x00, 0x00, 0x01, 0x15, 0x10, 0x21, 0x20, 0x19, 0x01, 0x33, 0x11, 0x10, 0x21, 0x20, 0x11, 0x35, 0x34, 0x02, 0x27, 0x37, 0x33, 0x07, 0x14, 0x12, 0x03, 0xdc, 0xfe, 0x46, 0xfe, 0x53, 0xa2, 0x01, 0x0d, 0x01, 0x16, 0xe3, 0x02, 0x28, 0xb4, 0x42, 0xed, 0x02, 0x07, 0x2d, 0xfe, 0x08, 0x02, 0x52, 0x04, 0x6b, 0xfb, 0x6d, 0xfe, 0x76, 0x01, 0x49, 0x4b, 0xb3, 0x01, 0x26, 0x99, 0xd9, 0xe6, 0x7c, 0xfe, 0xfb, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x04, 0xe0, 0x06, 0xb3, 0x00, 0x24, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x07, 0x11, 0x16, 0x12, 0x33, 0x32, 0x12, 0x35, 0x11, 0x34, 0x02, 0x27, 0x23, 0x13, 0x23, 0x13, 0x35, 0x33, 0x15, 0x33, 0x04, 0x12, 0x07, 0x11, 0x16, 0x00, 0x21, 0x20, 0x00, 0x35, 0x11, 0x34, 0x12, 0x37, 0x01, 0xd6, 0x77, 0x4f, 0x02, 0x01, 0xbc, 0xd9, 0xd7, 0xb9, 0xc1, 0x83, 0x11, 0x12, 0xa8, 0x12, 0x84, 0x11, 0x01, 0x0f, 0xe1, 0x01, 0x01, 0xfe, 0xf5, 0xfe, 0xcb, 0xfe, 0xdd, 0xfe, 0xe6, 0xad, 0xc6, 0x05, 0xa7, 0x2f, 0xf0, 0xb3, 0xfe, 0xbd, 0x98, 0xfe, 0x88, 0x01, 0x77, 0x99, 0x01, 0x40, 0xb6, 0x01, 0x44, 0x02, 0xfc, 0xed, 0x03, 0x11, 0xe7, 0x44, 0x5c, 0xfe, 0x75, 0xb1, 0xfe, 0xb6, 0xd1, 0xfe, 0x26, 0x01, 0xd6, 0xd5, 0x01, 0x49, 0xb0, 0x01, 0x8d, 0x52, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xff, 0xe1, 0x03, 0xbd, 0x06, 0xb3, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x12, 0x21, 0x20, 0x03, 0x13, 0x33, 0x03, 0x10, 0x21, 0x20, 0x19, 0x01, 0x26, 0x23, 0x22, 0x17, 0x11, 0x23, 0x11, 0x26, 0x27, 0x23, 0x35, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x03, 0xbd, 0x01, 0xfe, 0x62, 0xfe, 0x3a, 0x04, 0x33, 0xb7, 0x3e, 0x01, 0x22, 0x01, 0x01, 0x01, 0xaf, 0x96, 0x02, 0x8f, 0x12, 0x8f, 0x84, 0x7e, 0x8b, 0x44, 0x5e, 0x99, 0x01, 0x4c, 0x01, 0xee, 0xfd, 0xf3, 0x01, 0xea, 0x01, 0x2e, 0xfe, 0xd7, 0xfe, 0xb2, 0x01, 0x35, 0x03, 0xb4, 0xa9, 0x54, 0xfe, 0x68, 0x01, 0x4d, 0x8c, 0x13, 0x9f, 0x9f, 0x9f, 0xfe, 0x86, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x05, 0xe5, 0x06, 0xb3, 0x00, 0x09, 0x00, 0x37, 0x00, 0x00, 0x01, 0x10, 0x23, 0x22, 0x11, 0x15, 0x10, 0x33, 0x32, 0x11, 0x01, 0x14, 0x00, 0x2b, 0x01, 0x22, 0x24, 0x35, 0x33, 0x14, 0x16, 0x3b, 0x01, 0x32, 0x36, 0x35, 0x10, 0x2b, 0x01, 0x35, 0x37, 0x36, 0x35, 0x10, 0x23, 0x22, 0x07, 0x16, 0x07, 0x15, 0x10, 0x25, 0x04, 0x11, 0x35, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x10, 0x07, 0x16, 0x02, 0xf2, 0xf6, 0xee, 0xfa, 0xea, 0x02, 0xe0, 0xfe, 0xdf, 0xfb, 0x5a, 0xbb, 0xfe, 0xd6, 0xb7, 0xc4, 0x75, 0x43, 0xb2, 0xd1, 0x73, 0x6f, 0x35, 0xbf, 0xef, 0x77, 0x64, 0x22, 0x03, 0xfe, 0x75, 0xfe, 0x5a, 0x01, 0x96, 0xe4, 0x62, 0x7e, 0xa8, 0x01, 0x7f, 0xd4, 0xc2, 0x04, 0x9e, 0x01, 0x76, 0xfe, 0x8f, 0x8b, 0xfe, 0x79, 0x01, 0x87, 0xfd, 0xc0, 0xd4, 0xfe, 0xde, 0xd9, 0x81, 0x3b, 0x80, 0xcd, 0x89, 0x01, 0x01, 0x97, 0x02, 0x89, 0xdf, 0x01, 0x35, 0x80, 0x70, 0x94, 0x72, 0xfd, 0xd7, 0x01, 0x01, 0x02, 0x29, 0x8b, 0x02, 0x10, 0xc7, 0xc1, 0xfe, 0x5a, 0xfe, 0xe5, 0x92, 0x7b, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xca, 0x06, 0x9f, 0x00, 0x19, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x21, 0x20, 0x19, 0x01, 0x02, 0x27, 0x06, 0x07, 0x13, 0x23, 0x27, 0x10, 0x05, 0x32, 0x13, 0x11, 0x33, 0x03, 0xc9, 0xfe, 0x47, 0xfe, 0x53, 0x31, 0xb8, 0x3e, 0x01, 0x04, 0x01, 0x1f, 0xbb, 0xa2, 0xb0, 0x01, 0x3b, 0xa1, 0x36, 0x01, 0x49, 0x9a, 0xc7, 0x98, 0x01, 0xca, 0xfe, 0x18, 0x01, 0xe8, 0xdd, 0xdc, 0xfe, 0xb7, 0x01, 0x4e, 0x02, 0x24, 0x01, 0xb2, 0x02, 0x01, 0xa8, 0xfe, 0xff, 0xf9, 0x01, 0x5e, 0x02, 0xfe, 0xaa, 0x01, 0xa2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x06, 0x0f, 0x06, 0xb3, 0x00, 0x2a, 0x00, 0x00, 0x37, 0x36, 0x37, 0x00, 0x11, 0x35, 0x10, 0x21, 0x32, 0x13, 0x12, 0x33, 0x20, 0x13, 0x15, 0x06, 0x03, 0x23, 0x12, 0x3d, 0x01, 0x10, 0x23, 0x22, 0x19, 0x01, 0x23, 0x11, 0x10, 0x20, 0x13, 0x15, 0x02, 0x01, 0x16, 0x17, 0x04, 0x17, 0x23, 0x26, 0x27, 0x26, 0x05, 0xe3, 0x6c, 0x8a, 0xfe, 0x8a, 0x01, 0x99, 0xc3, 0x7b, 0x6c, 0xcf, 0x01, 0x99, 0x01, 0x02, 0x9e, 0xce, 0xc1, 0xe9, 0xf4, 0x9a, 0xfe, 0x21, 0x02, 0x01, 0x01, 0x88, 0x6a, 0x4b, 0x01, 0x7a, 0x33, 0xee, 0x03, 0xe3, 0xf6, 0xfe, 0xfc, 0xb1, 0x62, 0x22, 0x01, 0x1c, 0x02, 0x20, 0x4b, 0x01, 0xf7, 0xfe, 0xf9, 0x01, 0x07, 0xfe, 0x20, 0x61, 0xeb, 0xfe, 0x94, 0x01, 0x60, 0xf2, 0x54, 0x01, 0x54, 0xfe, 0x72, 0xfe, 0xc0, 0x01, 0x40, 0x01, 0x8d, 0xfe, 0xa8, 0x6d, 0xfe, 0x4d, 0xfe, 0xad, 0x04, 0x12, 0x70, 0xe1, 0x52, 0x63, 0x45, 0xbe, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xc9, 0x06, 0xa1, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x13, 0x33, 0x03, 0x10, 0x21, 0x20, 0x19, 0x01, 0x06, 0x07, 0x04, 0x11, 0x35, 0x34, 0x37, 0x33, 0x06, 0x1d, 0x01, 0x10, 0x17, 0x36, 0x37, 0x11, 0x33, 0x03, 0xc8, 0xfe, 0x4a, 0xfe, 0x51, 0x1b, 0xaf, 0x1f, 0x01, 0x04, 0x01, 0x1f, 0x94, 0x82, 0xfe, 0x63, 0x82, 0xca, 0xa1, 0xe9, 0x94, 0x8b, 0x97, 0x01, 0xc5, 0xfe, 0x1d, 0x01, 0xbb, 0x01, 0x09, 0xfe, 0xf3, 0xfe, 0xe9, 0x01, 0x44, 0x01, 0xf8, 0x63, 0x0b, 0x02, 0x01, 0xb9, 0x28, 0xa9, 0xc9, 0xd4, 0x94, 0x28, 0xfe, 0xda, 0x01, 0x0a, 0x74, 0x02, 0x39, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xc9, 0x06, 0xb3, 0x00, 0x08, 0x00, 0x23, 0x00, 0x00, 0x01, 0x11, 0x26, 0x23, 0x20, 0x11, 0x15, 0x02, 0x20, 0x13, 0x10, 0x21, 0x20, 0x11, 0x35, 0x12, 0x21, 0x16, 0x17, 0x11, 0x34, 0x23, 0x22, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x23, 0x35, 0x20, 0x17, 0x36, 0x33, 0x20, 0x11, 0x03, 0x31, 0x67, 0xb3, 0xfe, 0xf8, 0x01, 0x02, 0x23, 0x97, 0xfe, 0x60, 0xfe, 0x3b, 0x01, 0x01, 0xb3, 0x7a, 0xa0, 0x9c, 0xa1, 0x94, 0xfd, 0x01, 0x00, 0x30, 0x4d, 0xbe, 0x01, 0x2a, 0x01, 0xcb, 0x01, 0xc6, 0x49, 0xfe, 0x90, 0x72, 0xfe, 0x8a, 0x01, 0x5d, 0xfe, 0x03, 0x02, 0x0c, 0x90, 0x01, 0xf9, 0x02, 0x3d, 0x01, 0x60, 0x7c, 0xb4, 0x3a, 0x3a, 0xb4, 0x9f, 0xc0, 0xc0, 0xfe, 0xb3, 0x00, 0x00, 0x01, 0x00, 0x75, 0x00, 0x00, 0x03, 0xdd, 0x06, 0xb3, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x37, 0x34, 0x23, 0x22, 0x11, 0x15, 0x36, 0x17, 0x04, 0x03, 0x15, 0x10, 0x03, 0x23, 0x12, 0x3d, 0x01, 0x10, 0x05, 0x26, 0x07, 0x11, 0x23, 0x11, 0x02, 0x21, 0x20, 0x13, 0x07, 0x02, 0x4e, 0x0e, 0x95, 0xb0, 0x9d, 0x8b, 0x01, 0x9e, 0x01, 0xad, 0xc6, 0xd1, 0xfe, 0xf8, 0x74, 0xa7, 0xa1, 0x01, 0x01, 0x33, 0x01, 0x59, 0x01, 0x12, 0x05, 0x0e, 0x92, 0x75, 0xfe, 0xe6, 0xe1, 0x68, 0x04, 0x01, 0xfe, 0x3d, 0x5e, 0xfe, 0xfd, 0xfe, 0xa7, 0x01, 0x75, 0xb0, 0xae, 0x01, 0x13, 0x01, 0x01, 0x62, 0xfc, 0x7c, 0x04, 0xf0, 0x01, 0xc3, 0xfe, 0xed, 0x92, 0x00, 0x01, 0x00, 0x64, 0xff, 0xe2, 0x04, 0x4a, 0x06, 0xa0, 0x00, 0x23, 0x00, 0x00, 0x01, 0x16, 0x07, 0x04, 0x11, 0x10, 0x02, 0x20, 0x00, 0x19, 0x01, 0x02, 0x13, 0x33, 0x02, 0x15, 0x11, 0x1a, 0x01, 0x17, 0x32, 0x12, 0x35, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x36, 0x35, 0x34, 0x24, 0x37, 0x33, 0x14, 0x04, 0x04, 0x1c, 0x02, 0xdf, 0x01, 0x0a, 0xff, 0xfe, 0x35, 0xfe, 0xe6, 0x02, 0x67, 0xc1, 0x79, 0x01, 0xb8, 0x9a, 0x9d, 0x9b, 0x03, 0xac, 0xbd, 0x51, 0xee, 0xff, 0x00, 0x01, 0xa5, 0x01, 0x07, 0x05, 0x07, 0xae, 0x8c, 0x7b, 0xfe, 0xf6, 0xfe, 0xe2, 0xfe, 0xb8, 0x01, 0x48, 0x01, 0x70, 0x01, 0x9d, 0x01, 0x2c, 0x01, 0x3d, 0xfe, 0x8b, 0xf4, 0xfe, 0x63, 0xfe, 0xf6, 0xfe, 0xf2, 0x01, 0x01, 0x0f, 0xad, 0xfb, 0xa3, 0x65, 0xc2, 0x81, 0x91, 0x8c, 0x54, 0x88, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xc9, 0x06, 0x9f, 0x00, 0x09, 0x00, 0x15, 0x00, 0x00, 0x01, 0x11, 0x26, 0x23, 0x20, 0x11, 0x15, 0x10, 0x21, 0x20, 0x13, 0x10, 0x21, 0x20, 0x11, 0x35, 0x10, 0x21, 0x36, 0x17, 0x11, 0x33, 0x03, 0x31, 0x6e, 0xb5, 0xff, 0x00, 0x01, 0x00, 0x01, 0x23, 0x97, 0xfe, 0x4f, 0xfe, 0x4c, 0x01, 0xb4, 0x95, 0x85, 0x97, 0x02, 0x07, 0x01, 0xa3, 0x50, 0xfe, 0x70, 0x59, 0xfe, 0x71, 0x01, 0x6c, 0xfd, 0xf4, 0x02, 0x3e, 0x4a, 0x02, 0x3d, 0x01, 0x52, 0x02, 0x49, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x75, 0xff, 0xe2, 0x03, 0xdc, 0x06, 0xb3, 0x00, 0x1a, 0x00, 0x24, 0x00, 0x00, 0x13, 0x10, 0x21, 0x32, 0x17, 0x36, 0x21, 0x15, 0x22, 0x1d, 0x01, 0x23, 0x35, 0x34, 0x23, 0x22, 0x15, 0x11, 0x36, 0x37, 0x20, 0x13, 0x15, 0x10, 0x21, 0x20, 0x13, 0x33, 0x10, 0x33, 0x20, 0x11, 0x35, 0x10, 0x21, 0x22, 0x07, 0x76, 0x01, 0x38, 0xb4, 0x57, 0x21, 0x01, 0x01, 0xfd, 0x93, 0x97, 0x9d, 0x95, 0x7d, 0x01, 0xb1, 0x01, 0xfe, 0x3c, 0xfe, 0x5e, 0x02, 0xa1, 0xfb, 0x01, 0x28, 0xfe, 0xee, 0x7c, 0x95, 0x05, 0x79, 0x01, 0x3a, 0xbd, 0xbd, 0x9f, 0xa0, 0x44, 0x44, 0xa0, 0x9b, 0xfe, 0x9e, 0x55, 0x01, 0xfe, 0x11, 0x77, 0xfd, 0xdb, 0x02, 0x1b, 0xfe, 0x85, 0x01, 0x71, 0x8b, 0x01, 0x52, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xed, 0x06, 0xa0, 0x00, 0x1c, 0x00, 0x23, 0x00, 0x00, 0x01, 0x23, 0x13, 0x33, 0x15, 0x23, 0x13, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x21, 0x20, 0x11, 0x03, 0x23, 0x20, 0x11, 0x10, 0x21, 0x33, 0x27, 0x33, 0x17, 0x33, 0x01, 0x14, 0x3b, 0x01, 0x03, 0x23, 0x22, 0x03, 0xec, 0xc6, 0x38, 0x8e, 0x71, 0x4e, 0xfe, 0x47, 0xfe, 0x53, 0x35, 0xb8, 0x41, 0x01, 0x03, 0x01, 0x16, 0x54, 0xcb, 0xfe, 0x90, 0x01, 0x73, 0x54, 0x21, 0xb4, 0x1f, 0xda, 0xfd, 0x3c, 0xda, 0xc0, 0x3e, 0x7f, 0xdd, 0x05, 0x69, 0xfe, 0xb9, 0x8d, 0xfe, 0x35, 0xfe, 0x18, 0x01, 0xe8, 0xdd, 0xdc, 0xfe, 0xb7, 0x01, 0x4e, 0x01, 0xc5, 0x01, 0x2d, 0x01, 0x36, 0xa8, 0xa8, 0xfe, 0xcf, 0xa5, 0x01, 0x47, 0x00, 0x00, 0x00, 0x02, 0x00, 0x75, 0xff, 0xe2, 0x03, 0xdd, 0x06, 0x9f, 0x00, 0x09, 0x00, 0x15, 0x00, 0x00, 0x01, 0x10, 0x21, 0x06, 0x07, 0x11, 0x10, 0x21, 0x20, 0x11, 0x37, 0x15, 0x10, 0x21, 0x20, 0x19, 0x01, 0x33, 0x11, 0x36, 0x33, 0x04, 0x03, 0x3a, 0xfe, 0xea, 0x92, 0x7a, 0x01, 0x1a, 0x01, 0x08, 0xa2, 0xfe, 0x56, 0xfe, 0x43, 0xa3, 0x91, 0x7b, 0x01, 0xb8, 0x02, 0x8d, 0x01, 0x7f, 0x03, 0x55, 0xfe, 0x58, 0xfe, 0x76, 0x01, 0x80, 0x6e, 0x5f, 0xfd, 0xd1, 0x02, 0x25, 0x04, 0x98, 0xfd, 0xbc, 0x4e, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, 0xff, 0xe2, 0x03, 0x8b, 0x06, 0xb3, 0x00, 0x21, 0x00, 0x00, 0x01, 0x07, 0x25, 0x03, 0x04, 0x17, 0x06, 0x04, 0x21, 0x35, 0x32, 0x36, 0x35, 0x26, 0x2f, 0x01, 0x13, 0x25, 0x37, 0x05, 0x37, 0x36, 0x34, 0x26, 0x23, 0x07, 0x35, 0x33, 0x32, 0x17, 0x16, 0x14, 0x0f, 0x01, 0x03, 0x8a, 0x45, 0xfe, 0xc9, 0x82, 0x01, 0x2e, 0x01, 0x01, 0xfe, 0xe8, 0xfe, 0xbd, 0xfb, 0xb5, 0x01, 0xeb, 0x68, 0xd2, 0xfe, 0xa0, 0x48, 0x01, 0x5b, 0x5f, 0x11, 0x43, 0x39, 0x75, 0x8c, 0x77, 0x43, 0x43, 0x1b, 0x65, 0x03, 0xcc, 0x8a, 0xab, 0xfe, 0xeb, 0x6e, 0xdc, 0xc6, 0xe6, 0xa0, 0x7f, 0x7a, 0xc0, 0x28, 0x45, 0x01, 0x95, 0xbe, 0x8c, 0xc5, 0xc2, 0x1c, 0x53, 0x38, 0x13, 0x9b, 0x4b, 0x4a, 0xb2, 0x37, 0xc4, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xca, 0x06, 0xb3, 0x00, 0x26, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x33, 0x10, 0x21, 0x20, 0x11, 0x34, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x35, 0x34, 0x27, 0x23, 0x35, 0x33, 0x32, 0x35, 0x34, 0x21, 0x23, 0x35, 0x33, 0x20, 0x11, 0x14, 0x07, 0x33, 0x16, 0x15, 0x16, 0x07, 0x16, 0x03, 0xc9, 0xfe, 0x49, 0xfe, 0x51, 0xab, 0x01, 0x04, 0x01, 0x0f, 0x8b, 0xd0, 0xbe, 0x8b, 0x8b, 0xd0, 0xd0, 0x76, 0xfe, 0x96, 0x6b, 0x6b, 0x02, 0x15, 0x88, 0x02, 0x98, 0x01, 0x76, 0x87, 0x01, 0x99, 0xfe, 0x49, 0x02, 0x04, 0xfe, 0x9c, 0x01, 0x17, 0xc5, 0xb3, 0x84, 0x79, 0x01, 0xb5, 0x99, 0xb8, 0x9e, 0xfe, 0xaa, 0x9b, 0x61, 0x4e, 0x87, 0x94, 0x47, 0x6e, 0x00, 0x01, 0x00, 0x6c, 0xff, 0xe2, 0x03, 0xd2, 0x06, 0xb2, 0x00, 0x26, 0x00, 0x00, 0x05, 0x20, 0x19, 0x01, 0x33, 0x11, 0x10, 0x21, 0x20, 0x11, 0x34, 0x27, 0x23, 0x35, 0x33, 0x32, 0x37, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x36, 0x35, 0x34, 0x21, 0x35, 0x20, 0x11, 0x06, 0x07, 0x23, 0x16, 0x17, 0x06, 0x07, 0x16, 0x15, 0x10, 0x02, 0x20, 0xfe, 0x4c, 0xa3, 0x01, 0x11, 0x01, 0x0a, 0x76, 0x98, 0x98, 0x61, 0x05, 0x05, 0x76, 0x95, 0x95, 0x64, 0xfe, 0xf5, 0x01, 0xb6, 0x01, 0x8f, 0x02, 0xa4, 0x01, 0x01, 0x9b, 0xac, 0x1e, 0x01, 0xe6, 0x04, 0x4d, 0xfb, 0xb3, 0xfe, 0xba, 0x01, 0x12, 0xe0, 0x02, 0xb1, 0x83, 0x7d, 0xb7, 0x01, 0xb4, 0x81, 0x9e, 0xfe, 0xd2, 0xa5, 0x53, 0x67, 0x7e, 0x80, 0x5c, 0x56, 0xe1, 0xfe, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0x5f, 0x03, 0xcb, 0x06, 0xb3, 0x00, 0x09, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x10, 0x05, 0x24, 0x19, 0x01, 0x10, 0x21, 0x20, 0x11, 0x03, 0x32, 0x37, 0x23, 0x02, 0x19, 0x01, 0x10, 0x21, 0x20, 0x19, 0x01, 0x10, 0x03, 0x16, 0x33, 0x15, 0x22, 0x27, 0x23, 0x06, 0x27, 0x01, 0x0e, 0x01, 0x07, 0x01, 0x0c, 0xfe, 0xf5, 0xfe, 0xf8, 0xab, 0xc3, 0x39, 0x02, 0xfa, 0x01, 0xb2, 0x01, 0xb3, 0xfe, 0x29, 0xd7, 0xaf, 0xfd, 0x13, 0xf7, 0xb1, 0x02, 0xd2, 0xfe, 0x68, 0x78, 0x78, 0x01, 0x98, 0x01, 0xa2, 0x01, 0xa0, 0xfe, 0x60, 0xfb, 0xa9, 0x53, 0x01, 0x04, 0x01, 0x5e, 0x01, 0xa6, 0x02, 0x3b, 0xfd, 0xc1, 0xfe, 0x5e, 0xfe, 0xa2, 0xfe, 0xf8, 0x4f, 0xbe, 0xe6, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xc9, 0x06, 0xb5, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x35, 0x33, 0x15, 0x10, 0x21, 0x20, 0x11, 0x35, 0x10, 0x2b, 0x01, 0x35, 0x33, 0x24, 0x11, 0x05, 0x15, 0x23, 0x11, 0x25, 0x10, 0x05, 0x04, 0x11, 0x03, 0xc8, 0xfe, 0x48, 0xfe, 0x55, 0xaa, 0x01, 0x08, 0x01, 0x0a, 0xda, 0xcd, 0x6f, 0x01, 0x38, 0xfd, 0xf0, 0xae, 0x03, 0x65, 0xfe, 0xdb, 0x01, 0x25, 0x01, 0x96, 0xfe, 0x4c, 0x01, 0xd4, 0xd3, 0xdd, 0xfe, 0xd6, 0x01, 0x14, 0x9b, 0x01, 0x1a, 0xa4, 0xad, 0x01, 0x78, 0x17, 0xec, 0x01, 0x8f, 0x15, 0xfd, 0xbf, 0x9e, 0x71, 0xfe, 0xd2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe2, 0x03, 0xd5, 0x06, 0xb4, 0x00, 0x20, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x35, 0x33, 0x15, 0x10, 0x21, 0x20, 0x11, 0x10, 0x2b, 0x01, 0x35, 0x33, 0x24, 0x03, 0x06, 0x23, 0x04, 0x11, 0x33, 0x14, 0x21, 0x32, 0x37, 0x33, 0x15, 0x02, 0x05, 0x04, 0x03, 0xc9, 0xfe, 0x49, 0xfe, 0x51, 0xac, 0x01, 0x03, 0x01, 0x0f, 0xfa, 0xad, 0x63, 0x01, 0x43, 0x02, 0x96, 0x76, 0xfe, 0x51, 0xab, 0x01, 0x04, 0xc8, 0x70, 0x8b, 0x0a, 0xfe, 0xf3, 0x01, 0x0b, 0x01, 0xc8, 0xfe, 0x1a, 0x01, 0xe6, 0x8e, 0x8e, 0xfe, 0xba, 0x01, 0x46, 0x01, 0x60, 0xad, 0x1e, 0x01, 0xbb, 0x6f, 0x02, 0x01, 0x77, 0xc6, 0xc5, 0xe1, 0xfe, 0x80, 0xa6, 0x9c, 0x00, 0x03, 0x00, 0x63, 0xff, 0xe2, 0x04, 0x48, 0x06, 0xb3, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x25, 0x00, 0x00, 0x01, 0x21, 0x24, 0x11, 0x10, 0x21, 0x20, 0x35, 0x01, 0x10, 0x29, 0x01, 0x11, 0x34, 0x21, 0x20, 0x01, 0x15, 0x10, 0x21, 0x20, 0x11, 0x10, 0x37, 0x23, 0x26, 0x11, 0x10, 0x21, 0x20, 0x11, 0x15, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x03, 0x2a, 0xfe, 0xe6, 0xfe, 0xfe, 0x01, 0x09, 0x01, 0x13, 0xfd, 0xe4, 0x01, 0x02, 0x01, 0x1a, 0xfe, 0xed, 0xfe, 0xf7, 0x02, 0xbb, 0xfe, 0x47, 0xfe, 0x53, 0xf1, 0x01, 0xf0, 0x01, 0xb4, 0x01, 0xb2, 0x7e, 0x7e, 0x7e, 0x02, 0xde, 0x02, 0xfe, 0xce, 0xfe, 0xd4, 0xf4, 0x03, 0x62, 0xfe, 0xba, 0x01, 0x9f, 0xe3, 0xfb, 0xda, 0x78, 0xfe, 0x6c, 0x01, 0xcc, 0x01, 0x21, 0x6a, 0x60, 0x01, 0x3f, 0x01, 0xdb, 0xfe, 0x7e, 0x97, 0xbe, 0xfe, 0xca, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe2, 0x06, 0x7e, 0x06, 0xb4, 0x00, 0x0a, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x11, 0x34, 0x26, 0x23, 0x20, 0x13, 0x11, 0x10, 0x05, 0x20, 0x13, 0x10, 0x21, 0x22, 0x27, 0x15, 0x10, 0x21, 0x35, 0x32, 0x35, 0x11, 0x10, 0x21, 0x22, 0x06, 0x1d, 0x01, 0x10, 0x21, 0x15, 0x20, 0x03, 0x35, 0x10, 0x36, 0x37, 0x32, 0x17, 0x36, 0x33, 0x04, 0x12, 0x15, 0x05, 0xd6, 0x74, 0x96, 0xfe, 0xfc, 0x01, 0x01, 0x03, 0x01, 0x0a, 0xa7, 0xfe, 0x49, 0x73, 0x8b, 0xfe, 0x5e, 0xf8, 0xfe, 0xf8, 0x7d, 0x8a, 0x01, 0x08, 0xfe, 0x4d, 0x01, 0xfc, 0xb7, 0xea, 0x7b, 0x6a, 0xe7, 0x01, 0x0a, 0xa7, 0x03, 0xb5, 0x01, 0x03, 0xc3, 0x9a, 0xfe, 0xd9, 0xfe, 0x6b, 0xfe, 0xd4, 0x01, 0x01, 0x84, 0xfd, 0xdd, 0x87, 0x9e, 0xfe, 0x6c, 0xa0, 0xf4, 0x03, 0x78, 0x01, 0x27, 0x9b, 0xc2, 0xfd, 0xfe, 0xaf, 0xa5, 0x01, 0xf6, 0xfd, 0x01, 0x01, 0xfa, 0x01, 0xd8, 0xd8, 0x01, 0xfe, 0xc4, 0xbf, 0x00, 0x03, 0x00, 0x6d, 0xfe, 0x1e, 0x06, 0x47, 0x06, 0x87, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x23, 0x00, 0x00, 0x01, 0x04, 0x07, 0x03, 0x06, 0x33, 0x32, 0x25, 0x17, 0x24, 0x37, 0x13, 0x36, 0x23, 0x22, 0x05, 0x01, 0x06, 0x05, 0x13, 0x23, 0x03, 0x04, 0x23, 0x22, 0x1b, 0x01, 0x36, 0x25, 0x03, 0x33, 0x13, 0x24, 0x33, 0x32, 0x03, 0x03, 0x3e, 0xfe, 0x2f, 0x18, 0x3b, 0x15, 0x65, 0x66, 0x01, 0x10, 0x9a, 0x01, 0xd0, 0x0d, 0x41, 0x18, 0x80, 0x52, 0xff, 0x00, 0x02, 0x27, 0x1d, 0xfd, 0x8a, 0x54, 0xbb, 0x53, 0xfe, 0xe6, 0x98, 0xbe, 0x26, 0x41, 0x20, 0x02, 0x76, 0x47, 0xab, 0x41, 0x01, 0x16, 0xae, 0xbe, 0x26, 0x03, 0xfc, 0x4e, 0xa8, 0xfe, 0x2c, 0xae, 0xae, 0xae, 0x46, 0x68, 0x01, 0xfa, 0xae, 0x49, 0xfd, 0xa1, 0xe0, 0x28, 0xfd, 0xf4, 0x02, 0x91, 0xaf, 0x01, 0x32, 0x01, 0xf9, 0xfa, 0x3a, 0x02, 0x28, 0xfd, 0x6a, 0x6e, 0xfe, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xfe, 0x28, 0x05, 0x78, 0x06, 0xd3, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x14, 0x00, 0x15, 0x14, 0x07, 0x04, 0x11, 0x02, 0x05, 0x24, 0x03, 0x34, 0x37, 0x27, 0x26, 0x27, 0x06, 0x11, 0x10, 0x05, 0x04, 0x17, 0x23, 0x26, 0x25, 0x06, 0x07, 0x27, 0x36, 0x37, 0x24, 0x11, 0x10, 0x25, 0x26, 0x35, 0x37, 0x17, 0x07, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x26, 0x00, 0x35, 0x01, 0x10, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x12, 0x17, 0x36, 0x03, 0x14, 0x01, 0x34, 0x1b, 0x01, 0x4b, 0x13, 0xfe, 0x99, 0xfe, 0x8c, 0x12, 0x36, 0x3f, 0x60, 0x4c, 0xc7, 0x01, 0x41, 0x01, 0xf4, 0x04, 0xc5, 0x0a, 0xfe, 0xa3, 0x87, 0x68, 0x6e, 0x60, 0x8d, 0xfe, 0xc1, 0x01, 0x1b, 0x21, 0x22, 0x90, 0x15, 0x88, 0x57, 0x64, 0x73, 0x01, 0xfe, 0xce, 0x02, 0x62, 0xd8, 0x1c, 0x18, 0x30, 0x50, 0x3c, 0x09, 0xe7, 0xce, 0x06, 0xd3, 0xa4, 0xfe, 0xe6, 0xab, 0x66, 0x45, 0x14, 0xfe, 0x2c, 0xfe, 0x20, 0x14, 0x14, 0x01, 0xeb, 0x66, 0x8e, 0x0a, 0x09, 0x5c, 0x37, 0xfe, 0xb9, 0xfe, 0xac, 0xad, 0xc0, 0xde, 0xa8, 0x59, 0x03, 0x98, 0x6c, 0x67, 0x2f, 0xe9, 0x01, 0x42, 0x01, 0xbf, 0x38, 0x4d, 0x75, 0xb1, 0x38, 0x79, 0x8e, 0x90, 0x89, 0x8b, 0x7a, 0x01, 0x1b, 0xd4, 0xfb, 0x0e, 0x01, 0x52, 0x05, 0x34, 0x1a, 0x5d, 0xa1, 0xfe, 0x95, 0x0a, 0x0a, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xe2, 0x03, 0x4e, 0x06, 0x1e, 0x00, 0x03, 0x00, 0x16, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x11, 0x26, 0x24, 0x35, 0x33, 0x16, 0x17, 0x16, 0xc3, 0x02, 0x1b, 0xfd, 0xe5, 0x02, 0x8b, 0xfe, 0x85, 0xfe, 0x87, 0x23, 0x9f, 0x20, 0xda, 0xd7, 0x01, 0xfe, 0xa1, 0xa8, 0x02, 0xab, 0xac, 0x06, 0x1e, 0x94, 0xfc, 0x20, 0xfe, 0x38, 0x01, 0xbe, 0xd0, 0xd0, 0xfe, 0xce, 0x01, 0x3c, 0xdd, 0xfe, 0xdd, 0xad, 0x7e, 0x7e, 0x00, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xe2, 0x03, 0x4e, 0x06, 0x38, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x11, 0x26, 0x24, 0x35, 0x33, 0x16, 0x17, 0x16, 0x02, 0x11, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x02, 0x9d, 0xfe, 0x85, 0xfe, 0x87, 0x23, 0x9f, 0x20, 0xda, 0xd7, 0x01, 0xfe, 0xa1, 0xa8, 0x02, 0xab, 0xac, 0x06, 0x38, 0xca, 0xca, 0xca, 0xfc, 0x3c, 0xfe, 0x38, 0x01, 0xbe, 0xd0, 0xd0, 0xfe, 0xce, 0x01, 0x3c, 0xdd, 0xfe, 0xdd, 0xad, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x04, 0x00, 0x5a, 0xff, 0xe2, 0x03, 0x4e, 0x07, 0x00, 0x00, 0x12, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x11, 0x26, 0x24, 0x35, 0x33, 0x16, 0x17, 0x16, 0x01, 0x21, 0x15, 0x21, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x03, 0x4e, 0xfe, 0x85, 0xfe, 0x87, 0x23, 0x9f, 0x20, 0xda, 0xd7, 0x01, 0xfe, 0xa1, 0xa8, 0x02, 0xab, 0xac, 0xfd, 0x58, 0x02, 0x1b, 0xfd, 0xe5, 0x01, 0x62, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x01, 0xaa, 0xfe, 0x38, 0x01, 0xbe, 0xd0, 0xd0, 0xfe, 0xce, 0x01, 0x3c, 0xdd, 0xfe, 0xdd, 0xad, 0x7e, 0x7e, 0x02, 0xb6, 0x94, 0x02, 0x25, 0xca, 0xca, 0xca, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xe2, 0x03, 0x4e, 0x06, 0x8c, 0x00, 0x03, 0x00, 0x16, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x11, 0x26, 0x24, 0x35, 0x33, 0x16, 0x17, 0x16, 0x01, 0xf0, 0xd3, 0xe8, 0x9b, 0x02, 0x0e, 0xfe, 0x85, 0xfe, 0x87, 0x23, 0x9f, 0x20, 0xda, 0xd7, 0x01, 0xfe, 0xa1, 0xa8, 0x02, 0xab, 0xac, 0x06, 0x8c, 0xfe, 0xf8, 0xfc, 0x26, 0xfe, 0x38, 0x01, 0xbe, 0xd0, 0xd0, 0xfe, 0xce, 0x01, 0x3c, 0xdd, 0xfe, 0xdd, 0xad, 0x7e, 0x7e, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xe2, 0x03, 0x4e, 0x07, 0x18, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0x07, 0x21, 0x15, 0x21, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x11, 0x26, 0x24, 0x35, 0x33, 0x16, 0x17, 0x16, 0x01, 0xf0, 0xa6, 0xcd, 0x89, 0x88, 0x02, 0x1b, 0xfd, 0xe5, 0x02, 0x96, 0xfe, 0x85, 0xfe, 0x87, 0x23, 0x9f, 0x20, 0xda, 0xd7, 0x01, 0xfe, 0xa1, 0xa8, 0x02, 0xab, 0xac, 0x07, 0x18, 0xfe, 0xf8, 0x79, 0x94, 0xfc, 0xa7, 0xfe, 0x38, 0x01, 0xbe, 0xd0, 0xd0, 0xfe, 0xce, 0x01, 0x3c, 0xdd, 0xfe, 0xdd, 0xad, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xe2, 0x03, 0x4e, 0x06, 0x79, 0x00, 0x08, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x02, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x13, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x11, 0x26, 0x24, 0x35, 0x33, 0x16, 0x17, 0x16, 0x02, 0xd7, 0x11, 0xfd, 0xef, 0x11, 0x6a, 0x16, 0x9a, 0x9a, 0x15, 0xe1, 0xfe, 0x85, 0xfe, 0x87, 0x23, 0x9f, 0x20, 0xda, 0xd7, 0x01, 0xfe, 0xa1, 0xa8, 0x02, 0xab, 0xac, 0x06, 0x79, 0xfe, 0xe1, 0x01, 0x1f, 0x96, 0x96, 0xfb, 0x31, 0xfe, 0x38, 0x01, 0xbe, 0xd0, 0xd0, 0xfe, 0xce, 0x01, 0x3c, 0xdd, 0xfe, 0xdd, 0xad, 0x7e, 0x7e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xfe, 0x1d, 0x03, 0x3c, 0x06, 0x1e, 0x00, 0x03, 0x00, 0x1b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x10, 0x23, 0x22, 0x15, 0x17, 0x23, 0x27, 0x10, 0x21, 0x20, 0x11, 0xf0, 0x02, 0x1a, 0xfd, 0xe6, 0x02, 0x4c, 0xfe, 0x9c, 0xfe, 0x82, 0x1e, 0x9a, 0x16, 0xdc, 0xcb, 0xcb, 0xb4, 0x32, 0x9b, 0x2c, 0x01, 0x49, 0x01, 0x64, 0x06, 0x1e, 0x94, 0xfa, 0x37, 0xfe, 0x5c, 0x01, 0xa6, 0xe1, 0xe3, 0xfe, 0xe8, 0x01, 0x16, 0x03, 0x13, 0x01, 0x02, 0xf4, 0xe2, 0xdc, 0x01, 0x86, 0xfe, 0x6f, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xfe, 0x1d, 0x03, 0x3c, 0x06, 0x64, 0x00, 0x03, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x10, 0x23, 0x22, 0x15, 0x17, 0x23, 0x27, 0x10, 0x21, 0x20, 0x11, 0x02, 0x2f, 0xd3, 0xe8, 0x9c, 0x01, 0xbe, 0xfe, 0x9c, 0xfe, 0x82, 0x1e, 0x9a, 0x16, 0xdc, 0xcb, 0xcb, 0xb4, 0x32, 0x9b, 0x2c, 0x01, 0x49, 0x01, 0x64, 0x06, 0x64, 0xfe, 0xf8, 0xfa, 0x65, 0xfe, 0x5c, 0x01, 0xa6, 0xe1, 0xe3, 0xfe, 0xe8, 0x01, 0x16, 0x03, 0x13, 0x01, 0x02, 0xf4, 0xe2, 0xdc, 0x01, 0x86, 0xfe, 0x6f, 0x00, 0x03, 0x00, 0x5a, 0xfe, 0x1d, 0x03, 0x3c, 0x07, 0x36, 0x00, 0x03, 0x00, 0x07, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0x07, 0x21, 0x15, 0x21, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x10, 0x23, 0x22, 0x15, 0x17, 0x23, 0x27, 0x10, 0x21, 0x20, 0x11, 0x02, 0x1d, 0xc1, 0xcd, 0xa5, 0x86, 0x02, 0x1a, 0xfd, 0xe6, 0x02, 0x56, 0xfe, 0x9c, 0xfe, 0x82, 0x1e, 0x9a, 0x16, 0xdc, 0xcb, 0xcb, 0xb4, 0x32, 0x9b, 0x2c, 0x01, 0x49, 0x01, 0x64, 0x07, 0x36, 0xfe, 0xf8, 0x79, 0x94, 0xfa, 0xa0, 0xfe, 0x5c, 0x01, 0xa6, 0xe1, 0xe3, 0xfe, 0xe8, 0x01, 0x16, 0x03, 0x13, 0x01, 0x02, 0xf4, 0xe2, 0xdc, 0x01, 0x86, 0xfe, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xfe, 0x1d, 0x03, 0x3c, 0x06, 0x79, 0x00, 0x08, 0x00, 0x20, 0x00, 0x00, 0x01, 0x02, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x13, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x10, 0x23, 0x22, 0x15, 0x17, 0x23, 0x27, 0x10, 0x21, 0x20, 0x11, 0x02, 0xfb, 0x11, 0xfd, 0xef, 0x11, 0x6a, 0x16, 0x9a, 0x9a, 0x15, 0xab, 0xfe, 0x9c, 0xfe, 0x82, 0x1e, 0x9a, 0x16, 0xdc, 0xcb, 0xcb, 0xb4, 0x32, 0x9b, 0x2c, 0x01, 0x49, 0x01, 0x64, 0x06, 0x79, 0xfe, 0xe1, 0x01, 0x1f, 0x96, 0x96, 0xf9, 0x48, 0xfe, 0x5c, 0x01, 0xa6, 0xe1, 0xe3, 0xfe, 0xe8, 0x01, 0x16, 0x03, 0x13, 0x01, 0x02, 0xf4, 0xe2, 0xdc, 0x01, 0x86, 0xfe, 0x6f, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0x00, 0x03, 0x60, 0x06, 0x1e, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x01, 0x10, 0x03, 0x23, 0x12, 0x11, 0x10, 0x23, 0x22, 0x11, 0x10, 0x13, 0x23, 0x02, 0x11, 0x10, 0x21, 0x20, 0x01, 0x21, 0x15, 0x21, 0x03, 0x60, 0x8a, 0x9b, 0x83, 0xdd, 0xe5, 0x82, 0x9c, 0x88, 0x01, 0x87, 0x01, 0x7f, 0xfd, 0x7e, 0x02, 0x1a, 0xfd, 0xe6, 0x02, 0x44, 0xfe, 0xf4, 0xfe, 0xc8, 0x01, 0x21, 0x01, 0x23, 0x01, 0x90, 0xfe, 0x6d, 0xfe, 0xe0, 0xfe, 0xdf, 0x01, 0x3a, 0x01, 0x0d, 0x02, 0x19, 0x01, 0xbe, 0x94, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0x00, 0x03, 0x60, 0x06, 0x64, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x01, 0x10, 0x03, 0x23, 0x12, 0x11, 0x10, 0x23, 0x22, 0x11, 0x10, 0x13, 0x23, 0x02, 0x11, 0x10, 0x21, 0x20, 0x01, 0x33, 0x03, 0x23, 0x03, 0x60, 0x8a, 0x9b, 0x83, 0xdd, 0xe5, 0x82, 0x9c, 0x88, 0x01, 0x87, 0x01, 0x7f, 0xfe, 0xd8, 0xca, 0xe8, 0x92, 0x02, 0x44, 0xfe, 0xf4, 0xfe, 0xc9, 0x01, 0x20, 0x01, 0x23, 0x01, 0x90, 0xfe, 0x6d, 0xfe, 0xe0, 0xfe, 0xdf, 0x01, 0x3a, 0x01, 0x0d, 0x02, 0x19, 0x02, 0x04, 0xfe, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0x00, 0x00, 0x03, 0x60, 0x06, 0x79, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x00, 0x01, 0x10, 0x03, 0x23, 0x12, 0x11, 0x10, 0x23, 0x22, 0x11, 0x10, 0x13, 0x23, 0x02, 0x11, 0x10, 0x21, 0x20, 0x03, 0x02, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x03, 0x60, 0x8a, 0x9b, 0x83, 0xdd, 0xe5, 0x82, 0x9c, 0x88, 0x01, 0x87, 0x01, 0x7f, 0x65, 0x11, 0xfd, 0xef, 0x11, 0x6a, 0x16, 0x9a, 0x9a, 0x15, 0x02, 0x44, 0xfe, 0xf4, 0xfe, 0xc9, 0x01, 0x20, 0x01, 0x23, 0x01, 0x90, 0xfe, 0x6d, 0xfe, 0xe0, 0xfe, 0xdf, 0x01, 0x3a, 0x01, 0x0d, 0x02, 0x19, 0x02, 0x19, 0xfe, 0xe1, 0x01, 0x1f, 0x96, 0x96, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xff, 0x05, 0x4f, 0x06, 0x1e, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x12, 0x03, 0x23, 0x00, 0x11, 0x02, 0x23, 0x22, 0x11, 0x15, 0x23, 0x35, 0x10, 0x23, 0x22, 0x11, 0x02, 0x01, 0x23, 0x02, 0x11, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x01, 0x21, 0x15, 0x21, 0x05, 0x4f, 0x01, 0xf8, 0xbc, 0x01, 0x11, 0x01, 0xbd, 0xd0, 0x95, 0xd0, 0xbe, 0x01, 0x01, 0x19, 0xbc, 0xfe, 0x01, 0x61, 0xca, 0x4f, 0x58, 0xc6, 0x01, 0x5e, 0xfc, 0x78, 0x02, 0x1a, 0xfd, 0xe6, 0x02, 0x56, 0xfe, 0xd1, 0xfe, 0xd9, 0x01, 0x16, 0x01, 0x40, 0x01, 0x7e, 0xfe, 0xa7, 0xd2, 0xd2, 0x01, 0x59, 0xfe, 0x82, 0xfe, 0xcd, 0xfe, 0xdc, 0x01, 0x24, 0x01, 0x33, 0x02, 0x0a, 0xe3, 0xe3, 0x01, 0xbe, 0x94, 0x00, 0x03, 0x00, 0x5a, 0xff, 0xff, 0x05, 0x4f, 0x06, 0x38, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x24, 0x00, 0x00, 0x01, 0x12, 0x03, 0x23, 0x00, 0x11, 0x02, 0x23, 0x22, 0x11, 0x15, 0x23, 0x35, 0x10, 0x23, 0x22, 0x11, 0x02, 0x01, 0x23, 0x02, 0x11, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x05, 0x4f, 0x01, 0xf8, 0xbc, 0x01, 0x11, 0x01, 0xbd, 0xd0, 0x95, 0xd0, 0xbe, 0x01, 0x01, 0x19, 0xbc, 0xfe, 0x01, 0x61, 0xca, 0x4f, 0x58, 0xc6, 0x01, 0x5e, 0xfd, 0xd8, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x02, 0x56, 0xfe, 0xd1, 0xfe, 0xd9, 0x01, 0x16, 0x01, 0x40, 0x01, 0x7e, 0xfe, 0xa7, 0xd2, 0xd2, 0x01, 0x59, 0xfe, 0x82, 0xfe, 0xcd, 0xfe, 0xdc, 0x01, 0x24, 0x01, 0x33, 0x02, 0x0a, 0xe3, 0xe3, 0x01, 0xd8, 0xca, 0xca, 0xca, 0x00, 0x00, 0x00, 0x04, 0x00, 0x5a, 0xff, 0xff, 0x05, 0x4f, 0x07, 0x28, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x00, 0x01, 0x12, 0x03, 0x23, 0x00, 0x11, 0x02, 0x23, 0x22, 0x11, 0x15, 0x23, 0x35, 0x10, 0x23, 0x22, 0x11, 0x02, 0x01, 0x23, 0x02, 0x11, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x01, 0x21, 0x15, 0x21, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x05, 0x4f, 0x01, 0xf8, 0xbc, 0x01, 0x11, 0x01, 0xbd, 0xd0, 0x95, 0xd0, 0xbe, 0x01, 0x01, 0x19, 0xbc, 0xfe, 0x01, 0x61, 0xca, 0x4f, 0x58, 0xc6, 0x01, 0x5e, 0xfc, 0x76, 0x02, 0x1b, 0xfd, 0xe5, 0x01, 0x62, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x02, 0x56, 0xfe, 0xd1, 0xfe, 0xd9, 0x01, 0x16, 0x01, 0x40, 0x01, 0x7e, 0xfe, 0xa7, 0xd2, 0xd2, 0x01, 0x59, 0xfe, 0x82, 0xfe, 0xcd, 0xfe, 0xdc, 0x01, 0x24, 0x01, 0x33, 0x02, 0x0a, 0xe3, 0xe3, 0x01, 0x37, 0x94, 0x02, 0x25, 0xca, 0xca, 0xca, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xff, 0x05, 0x4f, 0x06, 0x64, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x12, 0x03, 0x23, 0x00, 0x11, 0x02, 0x23, 0x22, 0x11, 0x15, 0x23, 0x35, 0x10, 0x23, 0x22, 0x11, 0x02, 0x01, 0x23, 0x02, 0x11, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x01, 0x33, 0x03, 0x23, 0x05, 0x4f, 0x01, 0xf8, 0xbc, 0x01, 0x11, 0x01, 0xbd, 0xd0, 0x95, 0xd0, 0xbe, 0x01, 0x01, 0x19, 0xbc, 0xfe, 0x01, 0x61, 0xca, 0x4f, 0x58, 0xc6, 0x01, 0x5e, 0xfd, 0xb7, 0xca, 0xe8, 0x93, 0x02, 0x56, 0xfe, 0xd1, 0xfe, 0xd9, 0x01, 0x16, 0x01, 0x40, 0x01, 0x7e, 0xfe, 0xa7, 0xd2, 0xd2, 0x01, 0x59, 0xfe, 0x82, 0xfe, 0xcd, 0xfe, 0xdc, 0x01, 0x24, 0x01, 0x33, 0x02, 0x0a, 0xe3, 0xe3, 0x02, 0x04, 0xfe, 0xf8, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xff, 0x05, 0x4f, 0x06, 0x79, 0x00, 0x1c, 0x00, 0x25, 0x00, 0x00, 0x01, 0x12, 0x03, 0x23, 0x00, 0x11, 0x02, 0x23, 0x22, 0x11, 0x15, 0x23, 0x35, 0x10, 0x23, 0x22, 0x11, 0x02, 0x01, 0x23, 0x02, 0x11, 0x10, 0x21, 0x32, 0x17, 0x36, 0x33, 0x20, 0x01, 0x02, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x05, 0x4f, 0x01, 0xf8, 0xbc, 0x01, 0x11, 0x01, 0xbd, 0xd0, 0x95, 0xd0, 0xbe, 0x01, 0x01, 0x19, 0xbc, 0xfe, 0x01, 0x61, 0xca, 0x4f, 0x58, 0xc6, 0x01, 0x5e, 0xfe, 0xb0, 0x11, 0xfd, 0xef, 0x11, 0x6a, 0x17, 0x98, 0x9b, 0x15, 0x02, 0x56, 0xfe, 0xd1, 0xfe, 0xd9, 0x01, 0x16, 0x01, 0x40, 0x01, 0x7e, 0xfe, 0xa7, 0xd2, 0xd2, 0x01, 0x59, 0xfe, 0x82, 0xfe, 0xcd, 0xfe, 0xdc, 0x01, 0x24, 0x01, 0x33, 0x02, 0x0a, 0xe3, 0xe3, 0x02, 0x19, 0xfe, 0xe1, 0x01, 0x1f, 0x96, 0x96, 0x00, 0x00, 0x02, 0x00, 0x36, 0xfe, 0x1d, 0x03, 0x84, 0x06, 0x1e, 0x00, 0x03, 0x00, 0x24, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x26, 0x23, 0x22, 0x15, 0x03, 0x23, 0x03, 0x34, 0x2b, 0x01, 0x27, 0x37, 0x17, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0xd5, 0x02, 0x1b, 0xfd, 0xe5, 0x02, 0xaf, 0xfe, 0x96, 0xfe, 0x73, 0x17, 0xa0, 0x15, 0xeb, 0xd1, 0x02, 0x79, 0x6f, 0x09, 0x81, 0x09, 0x8c, 0x4a, 0x62, 0x12, 0x4e, 0x48, 0x81, 0x47, 0x3c, 0x90, 0x01, 0x12, 0x06, 0x1e, 0x94, 0xfa, 0x36, 0xfe, 0x5d, 0x01, 0xa3, 0xe3, 0xe3, 0xfe, 0xe9, 0x01, 0x17, 0x03, 0x67, 0xb6, 0x8c, 0xfe, 0xa5, 0x01, 0x5b, 0x78, 0x28, 0xa1, 0x32, 0xbb, 0xbb, 0xfe, 0xc7, 0x00, 0x00, 0x00, 0x03, 0x00, 0x36, 0xfe, 0x1d, 0x03, 0x84, 0x06, 0x38, 0x00, 0x03, 0x00, 0x07, 0x00, 0x28, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x26, 0x23, 0x22, 0x15, 0x03, 0x23, 0x03, 0x34, 0x2b, 0x01, 0x27, 0x37, 0x17, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x02, 0x35, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x02, 0xaf, 0xfe, 0x96, 0xfe, 0x73, 0x17, 0xa0, 0x15, 0xeb, 0xd1, 0x02, 0x79, 0x6f, 0x09, 0x81, 0x09, 0x8c, 0x4a, 0x62, 0x12, 0x4e, 0x48, 0x81, 0x47, 0x3c, 0x90, 0x01, 0x12, 0x06, 0x38, 0xca, 0xca, 0xca, 0xfa, 0x52, 0xfe, 0x5d, 0x01, 0xa3, 0xe3, 0xe3, 0xfe, 0xe9, 0x01, 0x17, 0x03, 0x67, 0xb6, 0x8c, 0xfe, 0xa5, 0x01, 0x5b, 0x78, 0x28, 0xa1, 0x32, 0xbb, 0xbb, 0xfe, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x36, 0xfe, 0x1d, 0x03, 0x84, 0x07, 0x3c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x2c, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x26, 0x23, 0x22, 0x15, 0x03, 0x23, 0x03, 0x34, 0x2b, 0x01, 0x27, 0x37, 0x17, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0xd4, 0x02, 0x1a, 0xfd, 0xe6, 0x01, 0x61, 0xb7, 0xb7, 0xfe, 0xa0, 0xb7, 0xb7, 0x02, 0xaf, 0xfe, 0x96, 0xfe, 0x73, 0x17, 0xa0, 0x15, 0xeb, 0xd1, 0x02, 0x79, 0x6f, 0x09, 0x81, 0x09, 0x8c, 0x4a, 0x62, 0x12, 0x4e, 0x48, 0x81, 0x47, 0x3c, 0x90, 0x01, 0x12, 0x05, 0xab, 0x94, 0x02, 0x25, 0xca, 0xca, 0xca, 0xf9, 0x4e, 0xfe, 0x5d, 0x01, 0xa3, 0xe3, 0xe3, 0xfe, 0xe9, 0x01, 0x17, 0x03, 0x67, 0xb6, 0x8c, 0xfe, 0xa5, 0x01, 0x5b, 0x78, 0x28, 0xa1, 0x32, 0xbb, 0xbb, 0xfe, 0xc7, 0x00, 0x00, 0x02, 0x00, 0x36, 0xfe, 0x1d, 0x03, 0x84, 0x06, 0x64, 0x00, 0x03, 0x00, 0x24, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x26, 0x23, 0x22, 0x15, 0x03, 0x23, 0x03, 0x34, 0x2b, 0x01, 0x27, 0x37, 0x17, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x02, 0x1d, 0xc1, 0xdf, 0x93, 0x02, 0x18, 0xfe, 0x96, 0xfe, 0x73, 0x17, 0xa0, 0x15, 0xeb, 0xd1, 0x02, 0x79, 0x6f, 0x09, 0x81, 0x09, 0x8c, 0x4a, 0x62, 0x12, 0x4e, 0x48, 0x81, 0x47, 0x3c, 0x90, 0x01, 0x12, 0x06, 0x64, 0xfe, 0xf8, 0xfa, 0x64, 0xfe, 0x5d, 0x01, 0xa3, 0xe3, 0xe3, 0xfe, 0xe9, 0x01, 0x17, 0x03, 0x67, 0xb6, 0x8c, 0xfe, 0xa5, 0x01, 0x5b, 0x78, 0x28, 0xa1, 0x32, 0xbb, 0xbb, 0xfe, 0xc7, 0x00, 0x00, 0x02, 0x00, 0x36, 0xfe, 0x1d, 0x03, 0x84, 0x06, 0x79, 0x00, 0x08, 0x00, 0x29, 0x00, 0x00, 0x01, 0x02, 0x20, 0x03, 0x33, 0x16, 0x33, 0x32, 0x37, 0x13, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x26, 0x23, 0x22, 0x15, 0x03, 0x23, 0x03, 0x34, 0x2b, 0x01, 0x27, 0x37, 0x17, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x02, 0xf2, 0x11, 0xfd, 0xef, 0x11, 0x6a, 0x17, 0x98, 0x9b, 0x15, 0xfc, 0xfe, 0x96, 0xfe, 0x73, 0x17, 0xa0, 0x15, 0xeb, 0xd1, 0x02, 0x79, 0x6f, 0x09, 0x81, 0x09, 0x8c, 0x4a, 0x62, 0x12, 0x4e, 0x48, 0x81, 0x47, 0x3c, 0x90, 0x01, 0x12, 0x06, 0x79, 0xfe, 0xe1, 0x01, 0x1f, 0x96, 0x96, 0xf9, 0x47, 0xfe, 0x5d, 0x01, 0xa3, 0xe3, 0xe3, 0xfe, 0xe9, 0x01, 0x17, 0x03, 0x67, 0xb6, 0x8c, 0xfe, 0xa5, 0x01, 0x5b, 0x78, 0x28, 0xa1, 0x32, 0xbb, 0xbb, 0xfe, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0xfe, 0x1d, 0x03, 0x84, 0x06, 0xd1, 0x00, 0x06, 0x00, 0x27, 0x00, 0x00, 0x01, 0x13, 0x23, 0x27, 0x07, 0x23, 0x13, 0x01, 0x10, 0x21, 0x20, 0x11, 0x37, 0x33, 0x07, 0x10, 0x33, 0x32, 0x19, 0x01, 0x26, 0x23, 0x22, 0x15, 0x03, 0x23, 0x03, 0x34, 0x2b, 0x01, 0x27, 0x37, 0x17, 0x33, 0x32, 0x17, 0x36, 0x33, 0x20, 0x11, 0x02, 0x1c, 0xdc, 0x7d, 0xa2, 0xa2, 0x7d, 0xdd, 0x01, 0xed, 0xfe, 0x96, 0xfe, 0x73, 0x17, 0xa0, 0x15, 0xeb, 0xd1, 0x02, 0x79, 0x6f, 0x09, 0x81, 0x09, 0x8c, 0x4a, 0x62, 0x12, 0x4e, 0x48, 0x81, 0x47, 0x3c, 0x90, 0x01, 0x12, 0x06, 0xd1, 0xfe, 0x88, 0xf5, 0xf5, 0x01, 0x78, 0xf8, 0xef, 0xfe, 0x5d, 0x01, 0xa3, 0xe3, 0xe3, 0xfe, 0xe9, 0x01, 0x17, 0x03, 0x67, 0xb6, 0x8c, 0xfe, 0xa5, 0x01, 0x5b, 0x78, 0x28, 0xa1, 0x32, 0xbb, 0xbb, 0xfe, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x06, 0x14, 0x00, 0x09, 0x00, 0x20, 0x00, 0x00, 0x01, 0x22, 0x06, 0x10, 0x16, 0x20, 0x36, 0x35, 0x34, 0x26, 0x01, 0x10, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x21, 0x15, 0x21, 0x22, 0x15, 0x14, 0x16, 0x33, 0x32, 0x12, 0x10, 0x02, 0x20, 0x02, 0x02, 0x33, 0x84, 0x9b, 0x9a, 0x01, 0x0b, 0x9a, 0x9a, 0xfd, 0xad, 0xaf, 0x47, 0x3a, 0xae, 0x8e, 0x01, 0xca, 0xfe, 0x57, 0xa9, 0x69, 0x83, 0xd6, 0xf9, 0xf8, 0xfe, 0x50, 0xf5, 0x03, 0xdf, 0xe7, 0xfe, 0x6e, 0xe7, 0xe8, 0xc7, 0xc8, 0xe9, 0xfe, 0x50, 0x01, 0x4d, 0x9b, 0x2f, 0x8d, 0x31, 0x7c, 0x94, 0x93, 0x89, 0x49, 0x34, 0xfe, 0xc8, 0xfd, 0xda, 0xfe, 0xc6, 0x01, 0x39, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x05, 0x19, 0x06, 0x14, 0x00, 0x24, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x36, 0x33, 0x05, 0x19, 0x9e, 0x59, 0x46, 0x01, 0x11, 0xfe, 0xef, 0xa6, 0xfe, 0x39, 0xa6, 0x9f, 0x9f, 0x9c, 0xaa, 0x9d, 0x9e, 0x5a, 0x22, 0x23, 0x01, 0xc7, 0x9c, 0xaa, 0x06, 0x14, 0x99, 0x50, 0x68, 0x63, 0x8f, 0xfc, 0x2f, 0x03, 0xd1, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0xab, 0x99, 0x28, 0x28, 0x68, 0x63, 0x4e, 0xbb, 0xab, 0x00, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x03, 0xdd, 0x06, 0x14, 0x00, 0x15, 0x00, 0x19, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x01, 0x33, 0x15, 0x23, 0x03, 0xdc, 0xa6, 0xfe, 0x39, 0xa6, 0x9f, 0x9f, 0x9b, 0xa2, 0xa6, 0x9e, 0x5a, 0x45, 0x01, 0xc7, 0xa6, 0xa6, 0x04, 0x60, 0xfb, 0xa0, 0x03, 0xd1, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xb7, 0xaf, 0x99, 0x50, 0x68, 0x63, 0x01, 0xb2, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x03, 0xdd, 0x06, 0x14, 0x00, 0x15, 0x00, 0x00, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x02, 0x0f, 0x01, 0xcd, 0xa6, 0xfe, 0xd8, 0x5a, 0x45, 0x01, 0x11, 0xfe, 0xef, 0xa6, 0x9f, 0x9f, 0x9c, 0x06, 0x14, 0xf9, 0xec, 0x05, 0x7b, 0x50, 0x68, 0x63, 0x8f, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0xab, 0x00, 0x00, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x06, 0x4a, 0x06, 0x14, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x05, 0x33, 0x15, 0x23, 0x02, 0xac, 0x9e, 0x5a, 0x22, 0x23, 0x01, 0xc7, 0x4e, 0x19, 0x23, 0x47, 0x75, 0x9d, 0x9e, 0x59, 0x46, 0x02, 0x6d, 0xa6, 0xfe, 0x39, 0xa6, 0xfe, 0x39, 0xa6, 0x9f, 0x9f, 0x9c, 0xaa, 0x03, 0x94, 0xa6, 0xa6, 0x06, 0x14, 0x99, 0x28, 0x28, 0x68, 0x63, 0x4e, 0xbb, 0x55, 0x1c, 0x13, 0x27, 0x99, 0x50, 0x68, 0x63, 0xfb, 0xa0, 0x03, 0xd1, 0xfc, 0x2f, 0x03, 0xd1, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0xab, 0x02, 0xe9, 0x00, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x06, 0x4a, 0x06, 0x14, 0x00, 0x26, 0x00, 0x00, 0x01, 0x15, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x21, 0x35, 0x34, 0x36, 0x33, 0x21, 0x11, 0x23, 0x11, 0x21, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x36, 0x33, 0x02, 0xac, 0x9e, 0x5a, 0x22, 0x23, 0x01, 0xc7, 0x9c, 0xaa, 0x01, 0xcd, 0xa6, 0xfe, 0xd8, 0x59, 0x46, 0x01, 0x11, 0xfe, 0xef, 0xa6, 0xfe, 0x39, 0xa6, 0x9f, 0x9f, 0x9c, 0xaa, 0x06, 0x14, 0x99, 0x28, 0x28, 0x68, 0x63, 0x4e, 0xbb, 0xab, 0xf9, 0xec, 0x05, 0x7b, 0x50, 0x68, 0x63, 0x8f, 0xfc, 0x2f, 0x03, 0xd1, 0xfc, 0x2f, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0xab, 0x00, 0x01, 0x00, 0x2a, 0x00, 0x00, 0x04, 0xc5, 0x06, 0x14, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x22, 0x07, 0x06, 0x15, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, 0x3b, 0x01, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x02, 0xc9, 0x21, 0x21, 0x5b, 0x1e, 0x5a, 0x23, 0x22, 0xa6, 0x9f, 0x9f, 0x4e, 0x4e, 0xaa, 0x1b, 0xaa, 0x4f, 0x4c, 0x01, 0x55, 0xfe, 0xab, 0x22, 0x22, 0x67, 0xaa, 0xaa, 0xbf, 0x49, 0x49, 0x7a, 0x04, 0x60, 0x63, 0x68, 0x28, 0x28, 0x28, 0x28, 0x68, 0xfb, 0x3d, 0x03, 0xd1, 0x8f, 0x4e, 0xbb, 0x55, 0x56, 0x56, 0x53, 0xbd, 0x4e, 0x8f, 0xfd, 0xa0, 0x89, 0x27, 0x27, 0x9a, 0x50, 0x4f, 0xd2, 0x02, 0x60, 0x8f, 0x00, 0x00, 0x01, 0x00, 0x63, 0xff, 0xe3, 0x06, 0x07, 0x05, 0xf0, 0x00, 0x59, 0x00, 0x00, 0x01, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x27, 0x26, 0x07, 0x22, 0x07, 0x06, 0x15, 0x14, 0x02, 0xfc, 0x4d, 0x42, 0x4c, 0x3f, 0x69, 0x39, 0x35, 0x2c, 0x2d, 0x85, 0x38, 0xb0, 0x95, 0x6e, 0x70, 0xc2, 0x57, 0x53, 0x57, 0x61, 0x5c, 0x59, 0x59, 0x57, 0x75, 0x3f, 0x3f, 0x2d, 0x28, 0xa0, 0x39, 0x9a, 0x44, 0x45, 0x5c, 0x65, 0xa3, 0x40, 0x46, 0x05, 0x53, 0x52, 0x92, 0x7e, 0x58, 0x55, 0x01, 0x55, 0xfe, 0xab, 0x21, 0x22, 0x67, 0xab, 0xab, 0xbf, 0x49, 0x49, 0x79, 0x79, 0x2b, 0x31, 0x3d, 0x3e, 0x31, 0x2f, 0x04, 0x3f, 0xae, 0x2b, 0x11, 0x14, 0x2a, 0x27, 0x57, 0x40, 0x25, 0x24, 0x21, 0x0e, 0x2b, 0x98, 0x89, 0x9c, 0x5b, 0x5b, 0x11, 0x12, 0x23, 0xbe, 0x35, 0x1a, 0x1b, 0x2d, 0x2c, 0x51, 0x4b, 0x28, 0x23, 0x2a, 0x0f, 0x24, 0x4a, 0x4b, 0x82, 0xa6, 0x4e, 0x56, 0x0b, 0x1d, 0x1f, 0x87, 0x5f, 0x5d, 0x01, 0x60, 0x5c, 0x88, 0x4c, 0x8f, 0xfd, 0xa0, 0x89, 0x27, 0x27, 0x9a, 0x50, 0x4f, 0xd2, 0x02, 0x60, 0x8f, 0x4e, 0x41, 0x2b, 0x32, 0x01, 0x31, 0x30, 0x40, 0x3d, 0x00, 0x00, 0x01, 0xfc, 0xcb, 0x06, 0x04, 0x00, 0x00, 0x07, 0x6e, 0x00, 0x07, 0x00, 0x00, 0x11, 0x22, 0x04, 0x07, 0x35, 0x36, 0x24, 0x33, 0xd0, 0xfe, 0x6a, 0xcf, 0xd5, 0x01, 0x97, 0xc9, 0x06, 0xd4, 0x67, 0x69, 0x7e, 0x77, 0x75, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x04, 0x03, 0x35, 0x07, 0x6e, 0x00, 0x07, 0x00, 0x00, 0x11, 0x35, 0x32, 0x04, 0x17, 0x15, 0x26, 0x24, 0xc9, 0x01, 0x97, 0xd5, 0xcf, 0xfe, 0x6a, 0x06, 0xd4, 0x9a, 0x75, 0x77, 0x7e, 0x69, 0x67, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x72, 0x06, 0x0d, 0x00, 0x00, 0x07, 0x27, 0x00, 0x13, 0x00, 0x00, 0x11, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x23, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x04, 0x81, 0x19, 0x48, 0x27, 0x21, 0x5a, 0x30, 0x3f, 0x05, 0x91, 0x03, 0x66, 0x65, 0xb4, 0x52, 0x38, 0x32, 0x4f, 0x06, 0x48, 0x02, 0x37, 0x0b, 0x12, 0x0a, 0x24, 0x30, 0x47, 0x87, 0x4a, 0x49, 0x0e, 0x0d, 0x20, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x06, 0x0d, 0x02, 0x8e, 0x07, 0x27, 0x00, 0x13, 0x00, 0x00, 0x11, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x33, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x04, 0x81, 0x19, 0x48, 0x27, 0x21, 0x57, 0x33, 0x40, 0x04, 0x91, 0x03, 0x66, 0x65, 0xb4, 0x52, 0x38, 0x32, 0x4f, 0x06, 0xec, 0x02, 0x37, 0x0b, 0x12, 0x0a, 0x24, 0x2c, 0x4b, 0x87, 0x4a, 0x49, 0x0e, 0x0d, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1b, 0xff, 0x54, 0x07, 0x47, 0x07, 0x4c, 0x00, 0x03, 0x00, 0x07, 0x00, 0x2a, 0x00, 0x00, 0x09, 0x04, 0x15, 0x33, 0x35, 0x27, 0x35, 0x34, 0x36, 0x37, 0x36, 0x37, 0x36, 0x3f, 0x01, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x1d, 0x01, 0x03, 0xb1, 0x03, 0x96, 0xfc, 0x6a, 0xfc, 0x6a, 0x03, 0x3a, 0xb7, 0x06, 0x06, 0x05, 0x07, 0x12, 0x14, 0x28, 0x4f, 0x53, 0x1e, 0x21, 0xc9, 0xa5, 0x5d, 0xae, 0x54, 0x57, 0xa1, 0x47, 0x61, 0x76, 0x2e, 0x33, 0x51, 0x51, 0x32, 0x07, 0x4c, 0xfc, 0x04, 0xfc, 0x04, 0x03, 0xfc, 0xfd, 0xae, 0xfe, 0xfe, 0x93, 0x7b, 0x34, 0x3c, 0x15, 0x19, 0x1a, 0x1f, 0x2b, 0x56, 0x5a, 0x40, 0x45, 0x4c, 0x9f, 0xc2, 0x38, 0x39, 0xbc, 0x43, 0x46, 0x6e, 0x59, 0x31, 0x5e, 0x35, 0x59, 0x56, 0x82, 0x65, 0x9a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5a, 0xff, 0xe3, 0x05, 0x19, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x00, 0x37, 0x01, 0x33, 0x01, 0x07, 0x03, 0x21, 0x03, 0x13, 0x21, 0x03, 0x5a, 0x01, 0xf8, 0xcf, 0x01, 0xf8, 0x97, 0xae, 0xfd, 0xcb, 0xae, 0xec, 0x01, 0xb9, 0xdc, 0x23, 0x05, 0xb2, 0xfa, 0x4e, 0x40, 0x01, 0xf6, 0xfe, 0x0a, 0x02, 0xaa, 0x02, 0x7c, 0x00, 0x03, 0x00, 0xb4, 0xff, 0xed, 0x03, 0xac, 0x05, 0xe8, 0x00, 0x09, 0x00, 0x1a, 0x00, 0x24, 0x00, 0x00, 0x01, 0x11, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x07, 0x06, 0x21, 0x22, 0x27, 0x13, 0x11, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x01, 0x56, 0x2f, 0xe2, 0x6b, 0x37, 0xb3, 0x9d, 0xfe, 0xfb, 0x7a, 0x5a, 0xd8, 0x92, 0xba, 0xc2, 0xc1, 0x6a, 0x99, 0xfe, 0xdd, 0x5a, 0x77, 0xa2, 0x64, 0xd2, 0x55, 0x28, 0xd5, 0xac, 0x02, 0x7e, 0xfe, 0x23, 0x72, 0x3b, 0x42, 0x59, 0x95, 0x03, 0x57, 0x13, 0x61, 0x7b, 0xd0, 0xd5, 0x7a, 0x7a, 0xe4, 0x8e, 0x70, 0xa4, 0x13, 0x05, 0x34, 0xfe, 0x15, 0x80, 0x3d, 0x38, 0x68, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0xff, 0xe3, 0x03, 0x86, 0x05, 0xf3, 0x00, 0x05, 0x00, 0x00, 0x05, 0x09, 0x01, 0x17, 0x09, 0x01, 0x03, 0x14, 0xfd, 0x46, 0x02, 0xba, 0x72, 0xfd, 0xb9, 0x02, 0x47, 0x1d, 0x03, 0x08, 0x03, 0x08, 0x7f, 0xfd, 0x77, 0xfd, 0x77, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x03, 0x9f, 0x05, 0xd2, 0x00, 0x0c, 0x00, 0x15, 0x00, 0x00, 0x33, 0x11, 0x33, 0x20, 0x17, 0x16, 0x17, 0x16, 0x10, 0x07, 0x06, 0x04, 0x21, 0x37, 0x3e, 0x02, 0x10, 0x27, 0x2e, 0x01, 0x27, 0xb4, 0x51, 0x01, 0x5d, 0x8e, 0x90, 0x16, 0x09, 0x23, 0x32, 0xfe, 0xd9, 0xfe, 0xe2, 0x51, 0xb9, 0xb3, 0x3b, 0x09, 0x10, 0xa9, 0xe5, 0x05, 0xd2, 0x78, 0x7a, 0xf9, 0x65, 0xfe, 0x62, 0x7f, 0xb8, 0xad, 0xc0, 0x08, 0x63, 0xd4, 0x01, 0x7a, 0x5c, 0xac, 0x91, 0x0a, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0x40, 0x05, 0xf2, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x05, 0x07, 0x25, 0x11, 0x05, 0x07, 0x25, 0x11, 0x05, 0x07, 0x01, 0x56, 0xa2, 0x02, 0x8c, 0x1a, 0xfe, 0x30, 0x01, 0xea, 0x1a, 0xfe, 0x30, 0x01, 0xea, 0x1a, 0x01, 0x36, 0xfe, 0xca, 0x05, 0xf2, 0x75, 0xb2, 0x53, 0xfe, 0xc3, 0x58, 0xb2, 0x53, 0xfe, 0xc3, 0x58, 0xb2, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0x40, 0x05, 0xf2, 0x00, 0x09, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x05, 0x07, 0x25, 0x11, 0x05, 0x07, 0x01, 0x56, 0xa2, 0x02, 0x8c, 0x1a, 0xfe, 0x30, 0x01, 0xea, 0x1a, 0x03, 0x2a, 0xfc, 0xd6, 0x05, 0xf2, 0x75, 0xb2, 0x53, 0xfe, 0xc3, 0x58, 0xb2, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x02, 0xa3, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x87, 0x02, 0x1c, 0xbd, 0xbd, 0xfd, 0xe4, 0xbd, 0xbd, 0x05, 0xd5, 0xb4, 0xfb, 0x93, 0xb4, 0xb4, 0x04, 0x6d, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xcc, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x11, 0x21, 0x01, 0x11, 0x21, 0x11, 0x05, 0x21, 0x11, 0x21, 0xb4, 0x03, 0x18, 0xfc, 0xe8, 0x02, 0x76, 0xfe, 0x2c, 0x01, 0xd4, 0xfe, 0x2c, 0x01, 0xd4, 0x05, 0xd5, 0xfa, 0x2b, 0x03, 0x45, 0x01, 0xdc, 0xfe, 0x24, 0xb4, 0xfe, 0x23, 0x00, 0x00, 0x00, 0x05, 0x00, 0x87, 0xff, 0xe3, 0x05, 0xfa, 0x05, 0xf3, 0x00, 0x0f, 0x00, 0x14, 0x00, 0x19, 0x00, 0x1e, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x06, 0x04, 0x20, 0x24, 0x26, 0x02, 0x10, 0x12, 0x36, 0x24, 0x20, 0x04, 0x16, 0x12, 0x01, 0x36, 0x12, 0x37, 0x21, 0x03, 0x11, 0x21, 0x16, 0x12, 0x01, 0x21, 0x11, 0x06, 0x02, 0x01, 0x11, 0x21, 0x26, 0x02, 0x05, 0xfa, 0x6e, 0xbb, 0xfe, 0xfd, 0xfe, 0xe5, 0xfe, 0xfd, 0xbb, 0x6e, 0x6e, 0xbb, 0x01, 0x03, 0x01, 0x1b, 0x01, 0x03, 0xbb, 0x6e, 0xfd, 0x98, 0xae, 0xf7, 0x1b, 0xfe, 0x40, 0xa2, 0xfe, 0x3f, 0x1b, 0xf7, 0xfe, 0xee, 0x01, 0xc1, 0xaf, 0xf7, 0x02, 0x48, 0x01, 0xc0, 0x1b, 0xf7, 0x02, 0x4e, 0xfe, 0xe0, 0xd0, 0x7b, 0x7b, 0xd0, 0x01, 0x20, 0x01, 0x3a, 0x01, 0x20, 0xd0, 0x7b, 0x7b, 0xd0, 0xfe, 0xe0, 0xfd, 0x16, 0x1e, 0x01, 0x12, 0xc3, 0xfe, 0x0d, 0x01, 0xf3, 0xc3, 0xfe, 0xee, 0x02, 0x89, 0x01, 0xf3, 0x1e, 0xfe, 0xee, 0x01, 0x30, 0xfe, 0x0d, 0xc3, 0x01, 0x12, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x56, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0xb4, 0xa2, 0xa2, 0x05, 0xd5, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xff, 0xe3, 0x04, 0x10, 0x05, 0xf3, 0x00, 0x0a, 0x00, 0x00, 0x21, 0x23, 0x11, 0x33, 0x11, 0x01, 0x17, 0x09, 0x01, 0x07, 0x01, 0x01, 0x56, 0xa2, 0xa2, 0x02, 0x47, 0x6c, 0xfd, 0x76, 0x02, 0x91, 0x6c, 0xfd, 0xb2, 0x05, 0xd5, 0xfd, 0xe1, 0x02, 0x3d, 0x86, 0xfd, 0x81, 0xfd, 0x7b, 0x86, 0x02, 0x43, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x03, 0x96, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x09, 0x01, 0x17, 0x01, 0x23, 0x11, 0x33, 0x01, 0x56, 0x01, 0xcc, 0x73, 0xfd, 0x92, 0x73, 0xa2, 0x01, 0x33, 0x02, 0x00, 0x80, 0xfd, 0x4d, 0x05, 0xd5, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x09, 0xbf, 0x05, 0xf3, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x33, 0x09, 0x03, 0x17, 0x09, 0x03, 0x11, 0x23, 0xb4, 0x68, 0x02, 0x43, 0x01, 0xff, 0x01, 0xf7, 0x01, 0xf7, 0x73, 0xfd, 0x96, 0xfe, 0x0a, 0xfe, 0x09, 0xfd, 0xee, 0xa2, 0x05, 0xd5, 0xfd, 0xe5, 0x02, 0x39, 0xfd, 0xd1, 0x02, 0x2f, 0x80, 0xfd, 0x53, 0x02, 0x2e, 0xfd, 0xd2, 0x01, 0xee, 0xfb, 0x4c, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xd2, 0x05, 0xf3, 0x00, 0x08, 0x00, 0x00, 0x13, 0x33, 0x09, 0x01, 0x17, 0x09, 0x01, 0x11, 0x23, 0xb4, 0x68, 0x02, 0x43, 0x01, 0xff, 0x74, 0xfd, 0x96, 0xfd, 0xee, 0xa2, 0x05, 0xd5, 0xfd, 0xe5, 0x02, 0x39, 0x80, 0xfd, 0x53, 0x01, 0xee, 0xfb, 0x4c, 0x00, 0x05, 0x00, 0xb4, 0x00, 0x00, 0x05, 0xf3, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x21, 0x11, 0x21, 0x01, 0x11, 0x21, 0x11, 0x21, 0x11, 0x21, 0x11, 0x13, 0x11, 0x21, 0x11, 0x01, 0x56, 0x01, 0xac, 0xfd, 0xb2, 0x05, 0x3f, 0xfa, 0xc1, 0x02, 0xf0, 0x01, 0xad, 0xfc, 0x05, 0x01, 0xac, 0xa2, 0x01, 0xad, 0x02, 0x90, 0xfe, 0x24, 0x01, 0xdc, 0x03, 0x45, 0xfa, 0x2b, 0x05, 0x21, 0xfe, 0x24, 0x01, 0xdc, 0xfe, 0x24, 0x01, 0xdc, 0xfd, 0x6f, 0xfe, 0x24, 0x01, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x87, 0xff, 0xe3, 0x05, 0xfa, 0x05, 0xf3, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x27, 0x00, 0x00, 0x00, 0x36, 0x34, 0x2e, 0x02, 0x22, 0x0e, 0x02, 0x14, 0x1e, 0x02, 0x32, 0x36, 0x00, 0x02, 0x06, 0x04, 0x20, 0x24, 0x26, 0x02, 0x10, 0x12, 0x36, 0x24, 0x20, 0x04, 0x16, 0x12, 0x04, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, 0x05, 0x03, 0x55, 0x55, 0x8f, 0xc8, 0xd8, 0xc7, 0x8f, 0x55, 0x55, 0x8f, 0xc7, 0xd8, 0xc8, 0x01, 0x86, 0x6e, 0xbb, 0xfe, 0xfd, 0xfe, 0xe5, 0xfe, 0xfd, 0xbb, 0x6e, 0x6e, 0xbb, 0x01, 0x03, 0x01, 0x1b, 0x01, 0x03, 0xbb, 0x6e, 0xfd, 0xc4, 0x49, 0x69, 0x4a, 0x4a, 0x69, 0x49, 0x01, 0x94, 0xdf, 0xf0, 0xdf, 0x9e, 0x5f, 0x5f, 0x9e, 0xdf, 0xf0, 0xdf, 0x9e, 0x5f, 0x5f, 0x01, 0x58, 0xfe, 0xe0, 0xd0, 0x7b, 0x7b, 0xd0, 0x01, 0x20, 0x01, 0x3a, 0x01, 0x20, 0xd0, 0x7b, 0x7b, 0xd0, 0xfe, 0xe0, 0xd7, 0x52, 0x52, 0x74, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xe8, 0x00, 0x11, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x24, 0x21, 0x22, 0x07, 0x11, 0x23, 0x11, 0x36, 0x33, 0x20, 0x00, 0x11, 0x10, 0x05, 0x02, 0xd7, 0xf1, 0xfe, 0xf1, 0xfe, 0xfe, 0x2f, 0x32, 0xa2, 0x92, 0x71, 0x01, 0x3f, 0x01, 0x74, 0xfe, 0xa7, 0x02, 0x59, 0x66, 0xd4, 0xb6, 0xf9, 0x06, 0xfa, 0xc4, 0x05, 0xd4, 0x14, 0xfe, 0xbf, 0xfe, 0xec, 0xfe, 0xb0, 0x92, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x8d, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x33, 0x11, 0x33, 0x09, 0x01, 0x33, 0x11, 0x23, 0x11, 0x09, 0x01, 0x11, 0xb4, 0xa2, 0x01, 0xca, 0x01, 0xca, 0xa2, 0xa2, 0xfe, 0x36, 0xfe, 0x36, 0x05, 0xd5, 0xfd, 0xa2, 0x02, 0x5e, 0xfa, 0x2b, 0x04, 0xbd, 0xfd, 0xa1, 0x02, 0x5f, 0xfb, 0x43, 0x00, 0x00, 0x00, 0x02, 0x00, 0x87, 0x00, 0x00, 0x03, 0xb1, 0x05, 0xf2, 0x00, 0x0b, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x06, 0x07, 0x06, 0x07, 0x11, 0x23, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x03, 0x0f, 0x41, 0x70, 0x84, 0x70, 0x41, 0x41, 0x70, 0x84, 0x70, 0xe3, 0x6e, 0x5c, 0x39, 0x41, 0xa2, 0x40, 0x3a, 0x5e, 0x6c, 0x6d, 0xba, 0xdc, 0xba, 0x6d, 0x03, 0xe7, 0x93, 0x7c, 0x48, 0x48, 0x7c, 0x93, 0x7d, 0x48, 0x48, 0x4c, 0xd1, 0x3b, 0x25, 0x0e, 0xfd, 0x89, 0x02, 0x77, 0x0e, 0x25, 0x3c, 0xd0, 0xf4, 0xcf, 0x79, 0x79, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xd7, 0x05, 0xe9, 0x00, 0x0c, 0x00, 0x17, 0x00, 0x00, 0x08, 0x01, 0x15, 0x14, 0x02, 0x07, 0x06, 0x23, 0x11, 0x23, 0x11, 0x36, 0x33, 0x03, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x02, 0x8f, 0x01, 0x48, 0xb4, 0xe6, 0x6a, 0x7d, 0xa2, 0x92, 0x71, 0x61, 0xee, 0x78, 0x79, 0x7d, 0x67, 0xab, 0x26, 0x2a, 0x05, 0xe9, 0xfe, 0xe5, 0xfc, 0x8d, 0xfe, 0xd1, 0x4e, 0x24, 0xfe, 0x5c, 0x05, 0xd5, 0x14, 0xfc, 0x6f, 0x73, 0x72, 0x96, 0x9e, 0x6c, 0x58, 0x04, 0x00, 0x01, 0x00, 0x87, 0xff, 0xf2, 0x02, 0xa7, 0x05, 0xea, 0x00, 0x09, 0x00, 0x00, 0x09, 0x03, 0x07, 0x09, 0x03, 0x17, 0x01, 0x6c, 0x01, 0x3b, 0xfe, 0xc5, 0x01, 0x02, 0x73, 0xfe, 0x8c, 0x01, 0x3b, 0xfe, 0xc5, 0x01, 0x74, 0x73, 0x04, 0x4c, 0xfe, 0xa2, 0xfe, 0xa2, 0xfe, 0xe2, 0x80, 0x01, 0x9e, 0x01, 0x5e, 0x01, 0x5e, 0x01, 0x9e, 0x80, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x04, 0x7d, 0x05, 0xf2, 0x00, 0x07, 0x00, 0x00, 0x01, 0x07, 0x25, 0x11, 0x23, 0x11, 0x25, 0x37, 0x04, 0x7c, 0x32, 0xfe, 0x60, 0xa2, 0xfe, 0x52, 0x32, 0x04, 0x8a, 0xac, 0x95, 0xfb, 0x8d, 0x04, 0xad, 0x99, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x3c, 0x05, 0xea, 0x00, 0x07, 0x00, 0x00, 0x01, 0x17, 0x01, 0x11, 0x23, 0x11, 0x33, 0x11, 0x03, 0xc8, 0x74, 0xfd, 0x1a, 0xa2, 0xa2, 0x05, 0xea, 0x80, 0xfc, 0xc9, 0xfd, 0xcd, 0x05, 0xd5, 0xfd, 0x5c, 0x00, 0x01, 0x00, 0x87, 0xff, 0xe3, 0x04, 0x6a, 0x05, 0xf2, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x37, 0x09, 0x01, 0x17, 0x09, 0x01, 0x07, 0x09, 0x01, 0x27, 0x02, 0x16, 0xfe, 0x71, 0x87, 0x01, 0x6a, 0x01, 0x6a, 0x88, 0xfe, 0x71, 0x01, 0x8f, 0x88, 0xfe, 0x96, 0xfe, 0x96, 0x87, 0x02, 0xed, 0x02, 0xa3, 0x62, 0xfd, 0xa1, 0x02, 0x5f, 0x62, 0xfd, 0x5d, 0xfd, 0x58, 0x62, 0x02, 0x64, 0xfd, 0x9c, 0x62, 0x00, 0x00, 0x00, 0x03, 0x00, 0x87, 0x00, 0x00, 0x04, 0x65, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x24, 0x00, 0x00, 0x21, 0x23, 0x35, 0x26, 0x27, 0x26, 0x10, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16, 0x10, 0x07, 0x06, 0x07, 0x19, 0x01, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x03, 0x11, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x02, 0xc7, 0xa2, 0x99, 0x74, 0x91, 0x91, 0x73, 0x9a, 0xa2, 0x99, 0x74, 0x91, 0x91, 0x73, 0x9a, 0x56, 0x44, 0x62, 0x62, 0x44, 0xf8, 0x56, 0x44, 0x62, 0x62, 0x44, 0xcc, 0x1a, 0x80, 0xa1, 0x01, 0xc7, 0xa2, 0x80, 0x1a, 0xcb, 0xcb, 0x1a, 0x80, 0xa1, 0xfe, 0x39, 0xa2, 0x80, 0x1a, 0x03, 0x87, 0xfd, 0x30, 0x17, 0x4c, 0x6c, 0x01, 0x32, 0x6c, 0x4b, 0xfd, 0x48, 0x02, 0xd0, 0x17, 0x4c, 0x6e, 0x98, 0x96, 0x6e, 0x4c, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x05, 0x7b, 0x05, 0xf2, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x23, 0x11, 0x01, 0x37, 0x01, 0x11, 0x33, 0x11, 0x01, 0x17, 0x01, 0x03, 0x3b, 0xa2, 0xfd, 0xc1, 0x73, 0x01, 0xcc, 0xa2, 0x01, 0xcc, 0x73, 0xfd, 0xc1, 0x02, 0xf4, 0x02, 0x7e, 0x80, 0xfe, 0x00, 0x01, 0xe3, 0xfe, 0x1d, 0x02, 0x00, 0x80, 0xfd, 0x82, 0x00, 0x03, 0x00, 0x87, 0xff, 0xf1, 0x03, 0x45, 0x05, 0xb9, 0x00, 0x07, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x00, 0x00, 0x34, 0x26, 0x22, 0x06, 0x14, 0x16, 0x32, 0x24, 0x06, 0x20, 0x26, 0x10, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x10, 0x36, 0x20, 0x16, 0x10, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x02, 0x34, 0x26, 0x22, 0x06, 0x14, 0x16, 0x32, 0x02, 0xa3, 0x6f, 0x9c, 0x6f, 0x6f, 0x9c, 0x01, 0x11, 0xce, 0xfe, 0xde, 0xce, 0x67, 0x2a, 0x31, 0x31, 0x2a, 0x67, 0xce, 0x01, 0x22, 0xce, 0x67, 0x2a, 0x31, 0x31, 0x2a, 0x67, 0xa2, 0x6f, 0x9c, 0x6f, 0x6f, 0x9c, 0x01, 0x20, 0xae, 0x7b, 0x7b, 0xae, 0x7b, 0x31, 0xe5, 0xe5, 0x01, 0x42, 0x73, 0x2f, 0x1b, 0x1c, 0x2e, 0x72, 0x01, 0x43, 0xe5, 0xe5, 0xfe, 0xbe, 0x73, 0x2f, 0x1b, 0x1c, 0x2e, 0x72, 0x01, 0xc3, 0xae, 0x7b, 0x7b, 0xae, 0x7b, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x03, 0x7d, 0x05, 0xe8, 0x00, 0x0a, 0x00, 0x13, 0x00, 0x00, 0x33, 0x11, 0x36, 0x33, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x19, 0x01, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0xb4, 0x77, 0x74, 0xdb, 0x01, 0x03, 0xfe, 0xcb, 0xf2, 0xb6, 0xcf, 0xa2, 0x92, 0x26, 0x2b, 0x05, 0xd5, 0x13, 0xe6, 0xbd, 0xd0, 0xdc, 0xfd, 0x67, 0x03, 0x4e, 0x7f, 0x76, 0x63, 0x9c, 0x06, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xff, 0xed, 0x03, 0x7d, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x14, 0x00, 0x00, 0x13, 0x33, 0x11, 0x32, 0x04, 0x15, 0x14, 0x04, 0x23, 0x22, 0x27, 0x13, 0x30, 0x11, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0xb4, 0xa2, 0xf2, 0x01, 0x35, 0xfe, 0xfd, 0xdb, 0x74, 0x77, 0xa2, 0x2b, 0x26, 0x92, 0xa2, 0xcf, 0x05, 0xd5, 0xfd, 0x67, 0xdc, 0xd0, 0xbd, 0xe6, 0x13, 0x02, 0x87, 0xfe, 0x12, 0x06, 0x9c, 0x63, 0x76, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x02, 0x76, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x13, 0x35, 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x5a, 0x01, 0x7a, 0xa2, 0xa2, 0x02, 0x91, 0xb4, 0x02, 0x90, 0xfa, 0x2b, 0x02, 0x91, 0x00, 0x02, 0x00, 0x5a, 0x00, 0x00, 0x05, 0x19, 0x05, 0xf2, 0x00, 0x06, 0x00, 0x0e, 0x00, 0x00, 0x09, 0x01, 0x23, 0x01, 0x37, 0x09, 0x01, 0x00, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x16, 0x05, 0x19, 0xfe, 0x08, 0xcf, 0xfe, 0x08, 0x97, 0x01, 0xc9, 0x01, 0xc8, 0xfe, 0xb6, 0x4a, 0x69, 0x49, 0x49, 0x69, 0x4a, 0x05, 0xb2, 0xfa, 0x4e, 0x05, 0xb2, 0x40, 0xfa, 0xda, 0x05, 0x26, 0xfd, 0xd8, 0x52, 0x52, 0x74, 0x52, 0x52, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x01, 0x56, 0x05, 0xd5, 0x12, 0x06, 0x0f, 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0xff, 0xe3, 0x05, 0x19, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x00, 0x37, 0x01, 0x33, 0x01, 0x07, 0x09, 0x01, 0x5a, 0x01, 0xf8, 0xcf, 0x01, 0xf8, 0x97, 0xfe, 0x38, 0xfe, 0x37, 0x23, 0x05, 0xb2, 0xfa, 0x4e, 0x40, 0x05, 0x26, 0xfa, 0xda, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0xff, 0xe3, 0x04, 0x6a, 0x05, 0xf2, 0x12, 0x06, 0x0f, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x05, 0x8a, 0x05, 0xf3, 0x00, 0x08, 0x00, 0x00, 0x13, 0x09, 0x01, 0x07, 0x01, 0x11, 0x23, 0x11, 0x01, 0x5a, 0x02, 0x81, 0x02, 0xaf, 0x6e, 0xfe, 0x12, 0xa2, 0xfe, 0x41, 0x03, 0x2c, 0x02, 0xc7, 0xfd, 0x3b, 0x84, 0x01, 0xfe, 0xfb, 0x58, 0x04, 0x9d, 0xfe, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x99, 0x01, 0xe0, 0x05, 0xdc, 0x02, 0xa8, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x21, 0x35, 0x21, 0x05, 0x35, 0x21, 0x15, 0x29, 0x01, 0x35, 0x21, 0x01, 0xca, 0xfe, 0xcf, 0x01, 0x31, 0x02, 0xe0, 0x01, 0x31, 0xfd, 0xf7, 0xfe, 0xd0, 0x01, 0x30, 0x01, 0xe0, 0xc8, 0xc8, 0xc8, 0xc8, 0xc8, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x01, 0x37, 0x05, 0xdc, 0x04, 0x0e, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xff, 0x58, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x01, 0x3a, 0x05, 0xdc, 0x04, 0x0a, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x62, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x01, 0x3d, 0x05, 0xdc, 0x04, 0x0b, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xff, 0x5d, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x43, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x01, 0x3b, 0x05, 0xdc, 0x04, 0x0a, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x3c, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x01, 0x3d, 0x05, 0xdc, 0x04, 0x0a, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xff, 0x5d, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x62, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x06, 0x0f, 0x3c, 0x00, 0xa0, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x04, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0f, 0x3c, 0x00, 0xa0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x06, 0x0f, 0x3c, 0x00, 0xa0, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0f, 0x3c, 0x00, 0xa0, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x04, 0x80, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0f, 0x3c, 0x00, 0xa0, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x10, 0x26, 0x0b, 0xb3, 0x00, 0x00, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0b, 0xb4, 0x00, 0x00, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x06, 0x0b, 0xb3, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x06, 0x0b, 0xb4, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x00, 0x00, 0x05, 0xdc, 0x05, 0x48, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x02, 0xa0, 0x10, 0x27, 0x0f, 0x3c, 0x00, 0x00, 0x01, 0x20, 0x10, 0x26, 0x0f, 0x3c, 0x00, 0xa0, 0x10, 0x07, 0x0f, 0x3c, 0x00, 0x00, 0xfe, 0x20, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x46, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x23, 0x01, 0x33, 0x09, 0x01, 0x21, 0x03, 0x21, 0x03, 0x23, 0x01, 0x17, 0x01, 0x21, 0x03, 0x07, 0xb9, 0x01, 0xbd, 0xb9, 0xfe, 0x81, 0x02, 0x01, 0xfe, 0x86, 0x89, 0xfd, 0xc0, 0x89, 0x6c, 0x02, 0x00, 0x16, 0xff, 0x00, 0x01, 0xff, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x71, 0xfa, 0x2b, 0x01, 0xa1, 0xfe, 0x5f, 0x05, 0xd5, 0xc7, 0xfc, 0xf7, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xc7, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x25, 0x00, 0x2a, 0x00, 0x00, 0x13, 0x21, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x11, 0x14, 0x06, 0x23, 0x21, 0x01, 0x11, 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, 0x03, 0x11, 0x33, 0x36, 0x33, 0x11, 0x26, 0x23, 0x21, 0x11, 0x33, 0x11, 0x01, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x36, 0x35, 0x34, 0x27, 0xb5, 0x02, 0x29, 0xcf, 0xe1, 0xac, 0xe4, 0xf5, 0xe1, 0xfd, 0xc5, 0x01, 0x68, 0xd3, 0x35, 0x2d, 0x2d, 0x35, 0xd3, 0xc1, 0x20, 0x1d, 0x1d, 0x20, 0xfe, 0x31, 0xb6, 0x01, 0xec, 0xbb, 0xbb, 0x38, 0xbb, 0xbb, 0x05, 0xd5, 0xc0, 0xb1, 0xe5, 0x5d, 0x61, 0xfe, 0xe1, 0xc8, 0xda, 0x02, 0xe9, 0xfd, 0x7b, 0x07, 0x02, 0x77, 0x07, 0x02, 0x88, 0xfd, 0xdc, 0x03, 0x02, 0x1f, 0x02, 0xfa, 0xf3, 0x05, 0x0d, 0xfb, 0x11, 0x44, 0xdc, 0xe5, 0x44, 0x96, 0x36, 0xcd, 0xc4, 0x36, 0x00, 0x00, 0x04, 0x00, 0xd0, 0x00, 0x00, 0x05, 0x95, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x10, 0x00, 0x14, 0x00, 0x19, 0x00, 0x00, 0x13, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x29, 0x01, 0x01, 0x13, 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, 0x21, 0x11, 0x33, 0x03, 0x01, 0x36, 0x11, 0x10, 0x27, 0xd1, 0x01, 0xcf, 0x01, 0x87, 0x01, 0x6d, 0xfe, 0x91, 0xfe, 0x7b, 0xfe, 0x31, 0x01, 0x6a, 0x01, 0x59, 0xdc, 0x90, 0x90, 0xdd, 0xfe, 0x98, 0xb6, 0x01, 0x02, 0x7f, 0xc8, 0xc8, 0x05, 0xd5, 0xfe, 0x97, 0xfe, 0x80, 0xfe, 0x7e, 0xfe, 0x96, 0x05, 0x71, 0xfa, 0xf3, 0x41, 0x04, 0x8b, 0x41, 0xfa, 0xf3, 0x05, 0x0d, 0xfb, 0x6b, 0x95, 0x01, 0x7b, 0x01, 0x71, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcb, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x25, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x01, 0x0f, 0xb6, 0xfe, 0xf0, 0x04, 0x05, 0xfd, 0x65, 0x02, 0x80, 0xfd, 0x80, 0x02, 0xac, 0xfb, 0xea, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0x64, 0xfd, 0xe4, 0x64, 0xfd, 0x73, 0x64, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x01, 0x23, 0x11, 0x33, 0xb5, 0x03, 0xb9, 0xfd, 0xb1, 0x02, 0x15, 0xfd, 0xeb, 0xfe, 0x96, 0x01, 0x10, 0xb6, 0xb6, 0x05, 0xd5, 0x64, 0xfd, 0xe4, 0x64, 0xfd, 0x0f, 0x05, 0x71, 0xfa, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x05, 0xf0, 0x00, 0x1d, 0x00, 0x26, 0x00, 0x00, 0x01, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x11, 0x21, 0x35, 0x21, 0x11, 0x0e, 0x01, 0x23, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x32, 0x16, 0x17, 0x01, 0x11, 0x06, 0x07, 0x06, 0x11, 0x10, 0x17, 0x16, 0x04, 0xda, 0x72, 0xea, 0x78, 0xa8, 0x7a, 0x7a, 0xa8, 0x82, 0x73, 0x5b, 0x4d, 0xfe, 0x7d, 0x01, 0xdd, 0x69, 0xfe, 0x90, 0xfe, 0xc5, 0xfe, 0x9d, 0x01, 0x63, 0x01, 0x3b, 0x83, 0xed, 0x64, 0xfc, 0xb0, 0x19, 0x17, 0x98, 0x98, 0x17, 0x04, 0xe4, 0x61, 0x47, 0x40, 0xfb, 0x3b, 0x40, 0x26, 0x1f, 0x35, 0x01, 0xe7, 0x64, 0xfd, 0x7f, 0x53, 0x55, 0x01, 0x99, 0x01, 0x6d, 0x01, 0x6e, 0x01, 0x99, 0x48, 0x46, 0xfb, 0x63, 0x04, 0x49, 0x16, 0x1a, 0xaf, 0xfe, 0xba, 0xfe, 0xbb, 0xaf, 0x1a, 0x00, 0x00, 0x00, 0x02, 0x00, 0x5b, 0x00, 0x00, 0x02, 0x78, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x25, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x01, 0x10, 0xb6, 0xfe, 0x96, 0x02, 0x1c, 0x5a, 0x5a, 0xfd, 0xe4, 0x5a, 0x5a, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0x64, 0xfa, 0xf3, 0x64, 0x64, 0x05, 0x0d, 0x00, 0x00, 0x02, 0xff, 0xa0, 0xfe, 0x66, 0x02, 0x1d, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x01, 0x11, 0x14, 0x07, 0x36, 0x37, 0x36, 0x35, 0x11, 0x25, 0x21, 0x11, 0x10, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x01, 0x0f, 0x4d, 0x81, 0x39, 0x47, 0xfe, 0xf2, 0x01, 0x68, 0xb9, 0xcc, 0xf7, 0x38, 0x79, 0x63, 0x05, 0x71, 0xfa, 0xb1, 0xf2, 0x64, 0x0a, 0x4a, 0x5e, 0xea, 0x05, 0x09, 0x64, 0xfa, 0x93, 0xfe, 0xf2, 0xf4, 0x64, 0x96, 0xc2, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x92, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x21, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x21, 0x13, 0x11, 0x33, 0x11, 0xb5, 0x01, 0x68, 0x02, 0xb6, 0x8f, 0xfc, 0xf9, 0x03, 0x37, 0x8a, 0xfd, 0x15, 0xfe, 0x98, 0x5a, 0xb6, 0x05, 0xd5, 0xfd, 0x89, 0x02, 0x77, 0xfd, 0x40, 0xfc, 0xeb, 0x02, 0xcf, 0xfd, 0x31, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xad, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x13, 0x21, 0x11, 0x21, 0x15, 0x21, 0x13, 0x11, 0x33, 0x11, 0xb5, 0x01, 0x6a, 0x02, 0x8e, 0xfc, 0x08, 0x5a, 0xb6, 0x05, 0xd5, 0xfa, 0x8f, 0x64, 0x05, 0x6f, 0xfa, 0xf3, 0x05, 0x0d, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb0, 0x00, 0x00, 0x06, 0xb1, 0x05, 0xd5, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x00, 0x21, 0x11, 0x01, 0x23, 0x01, 0x03, 0x21, 0x11, 0x21, 0x09, 0x01, 0x21, 0x11, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x05, 0x47, 0xfe, 0x89, 0x40, 0xfe, 0x8b, 0x01, 0xfe, 0x96, 0x01, 0xa9, 0x01, 0x57, 0x01, 0x59, 0x01, 0xa8, 0xfe, 0xf0, 0xb6, 0xfa, 0xb3, 0xb6, 0x05, 0x71, 0xfb, 0xae, 0x04, 0x52, 0xfa, 0x8f, 0x05, 0xd5, 0xfc, 0x08, 0x03, 0xf8, 0xfa, 0x2b, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0xfa, 0xf3, 0x05, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x66, 0xff, 0xe3, 0x05, 0x45, 0x05, 0xf0, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x27, 0x00, 0x28, 0x00, 0x00, 0x01, 0x20, 0x17, 0x16, 0x11, 0x10, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x11, 0x10, 0x37, 0x36, 0x13, 0x16, 0x32, 0x37, 0x11, 0x26, 0x22, 0x07, 0x03, 0x11, 0x06, 0x07, 0x06, 0x10, 0x17, 0x16, 0x01, 0x11, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x01, 0x02, 0xd5, 0x01, 0x1b, 0xa9, 0xab, 0xaa, 0xaa, 0xfe, 0xe5, 0xfe, 0xe5, 0xa9, 0xaa, 0xaa, 0xa9, 0x40, 0x61, 0xf5, 0x61, 0x61, 0xf5, 0x61, 0x5f, 0x20, 0x1d, 0x8b, 0x8b, 0x1d, 0x02, 0x95, 0x1f, 0x1c, 0x8b, 0x8b, 0x1c, 0xfc, 0x38, 0x05, 0xf0, 0xd2, 0xd5, 0xfe, 0xa0, 0xfe, 0xa1, 0xd4, 0xd3, 0xd3, 0xd2, 0x01, 0x61, 0x01, 0x62, 0xd3, 0xd2, 0xfa, 0x8e, 0x32, 0x32, 0x04, 0xd7, 0x32, 0x32, 0xfb, 0x6a, 0x04, 0x54, 0x1d, 0x25, 0xb6, 0xfd, 0x9c, 0xb5, 0x25, 0x04, 0x35, 0xfb, 0xaf, 0x1d, 0x24, 0xb6, 0x02, 0x63, 0xb6, 0x24, 0xfd, 0xf4, 0x00, 0x00, 0x02, 0x00, 0x7a, 0xff, 0xdc, 0x04, 0x29, 0x05, 0xf6, 0x00, 0x11, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x06, 0x10, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x10, 0x07, 0x36, 0x10, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x34, 0x25, 0x15, 0x26, 0x20, 0x06, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x10, 0x04, 0x20, 0x27, 0x35, 0x16, 0x20, 0x36, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x10, 0x36, 0x20, 0x01, 0x2e, 0x5a, 0x7b, 0x9b, 0x64, 0x98, 0x97, 0x22, 0x74, 0x8d, 0x99, 0x63, 0x9e, 0x8e, 0x02, 0xc0, 0xb9, 0xfe, 0xe5, 0x92, 0x62, 0x85, 0x63, 0xb6, 0xb5, 0xfe, 0xfd, 0xfe, 0x44, 0xeb, 0xc9, 0x01, 0x43, 0x98, 0x6e, 0x7c, 0x64, 0xb6, 0xa5, 0xfb, 0x01, 0x98, 0x05, 0x2d, 0x5b, 0xfe, 0xca, 0x9a, 0x29, 0x1a, 0x27, 0xb9, 0xfe, 0xff, 0x4e, 0x58, 0x01, 0x64, 0xbb, 0x27, 0x1b, 0x27, 0x9d, 0xe3, 0xb4, 0x70, 0x75, 0x89, 0xe9, 0x69, 0x24, 0x1b, 0x32, 0xeb, 0xfe, 0x58, 0xee, 0x66, 0x7c, 0x95, 0x92, 0xfd, 0x86, 0x20, 0x1a, 0x2f, 0xcf, 0x01, 0x8c, 0xf4, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfa, 0x00, 0x00, 0x05, 0x1f, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x25, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x21, 0x02, 0x33, 0xb4, 0xfd, 0x14, 0x05, 0x23, 0xfe, 0x23, 0xfe, 0x98, 0xfe, 0x22, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0x64, 0xfa, 0x8f, 0x05, 0x71, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x9f, 0xff, 0xe3, 0x05, 0x5b, 0x05, 0xd5, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x11, 0x10, 0x07, 0x24, 0x19, 0x01, 0x21, 0x11, 0x10, 0x05, 0x26, 0x13, 0x11, 0x25, 0x21, 0x11, 0x14, 0x16, 0x20, 0x36, 0x35, 0x11, 0x21, 0x11, 0x10, 0x00, 0x20, 0x00, 0x11, 0x04, 0x4c, 0x4f, 0x01, 0x04, 0xfb, 0xf8, 0x01, 0x04, 0x50, 0x01, 0xfe, 0xf1, 0x01, 0x69, 0x73, 0x01, 0x04, 0x73, 0x01, 0x69, 0xfe, 0xce, 0xfd, 0xa8, 0xfe, 0xce, 0x05, 0x71, 0xfc, 0x99, 0xfe, 0xe6, 0x82, 0x62, 0x01, 0x61, 0x03, 0x40, 0xfc, 0xc0, 0xfe, 0x9e, 0x60, 0x7c, 0x01, 0x1f, 0x03, 0x67, 0x64, 0xfc, 0x35, 0xf0, 0xd3, 0xd3, 0xf0, 0x03, 0xcb, 0xfc, 0x5c, 0xfe, 0xdc, 0xfe, 0xd6, 0x01, 0x2a, 0x01, 0x24, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x00, 0x05, 0x25, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x01, 0x33, 0x01, 0x25, 0x21, 0x09, 0x01, 0x33, 0x01, 0x21, 0x8b, 0x01, 0xbc, 0xb4, 0xfe, 0x44, 0xfe, 0xcf, 0x01, 0x68, 0x01, 0xaa, 0x01, 0xab, 0x5a, 0xfe, 0x00, 0xfe, 0xea, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0xfb, 0x17, 0x04, 0xe9, 0xfa, 0x2b, 0x00, 0x00, 0x03, 0x00, 0x3d, 0x00, 0x00, 0x07, 0xd0, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x07, 0x00, 0x14, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x21, 0x01, 0x33, 0x01, 0x25, 0x21, 0x09, 0x01, 0x21, 0x09, 0x01, 0x33, 0x01, 0x21, 0x09, 0x01, 0x21, 0x04, 0x4a, 0x01, 0x24, 0xb4, 0xfe, 0xdc, 0xfb, 0xb0, 0x01, 0x23, 0xb4, 0xfe, 0xdd, 0xfe, 0xdb, 0x01, 0x68, 0x01, 0x1b, 0x01, 0x1a, 0x01, 0x68, 0x01, 0x1a, 0x01, 0x1a, 0x5a, 0xfe, 0xae, 0xfe, 0xa3, 0xfe, 0xe5, 0xfe, 0xe1, 0xfe, 0xa7, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0xfb, 0x12, 0x04, 0xee, 0xfb, 0x12, 0x04, 0xee, 0xfa, 0x2b, 0x05, 0x10, 0xfa, 0xf0, 0x00, 0x00, 0x02, 0x00, 0x61, 0x00, 0x00, 0x05, 0x6c, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x25, 0x21, 0x09, 0x01, 0x33, 0x09, 0x01, 0x21, 0x09, 0x01, 0x23, 0x01, 0x01, 0x0a, 0x03, 0x06, 0xb3, 0xfc, 0xfa, 0xfe, 0xa4, 0x01, 0x8c, 0x01, 0x51, 0x01, 0x5d, 0x58, 0xfe, 0x78, 0x02, 0x01, 0xfe, 0x74, 0xfe, 0xaf, 0xfe, 0xa3, 0x5a, 0x01, 0x8a, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0xfd, 0xce, 0x02, 0x32, 0xfd, 0x84, 0xfc, 0xa7, 0x02, 0x32, 0xfd, 0xce, 0x02, 0x7b, 0x00, 0x00, 0x00, 0x02, 0xff, 0xfc, 0x00, 0x00, 0x05, 0x1b, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x0e, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x11, 0x21, 0x11, 0x01, 0x21, 0x09, 0x01, 0x23, 0x01, 0x11, 0x33, 0x03, 0x16, 0x01, 0xab, 0x5a, 0xfe, 0x25, 0xfe, 0x98, 0xfe, 0x24, 0x01, 0x6c, 0x01, 0x7f, 0xfe, 0x61, 0xb4, 0x01, 0x9e, 0xb5, 0x03, 0x13, 0x02, 0xc2, 0xfc, 0xf2, 0xfd, 0x39, 0x02, 0xc7, 0x03, 0x0e, 0xfc, 0xf2, 0x02, 0xaa, 0xfd, 0x56, 0xfd, 0x9d, 0x00, 0x04, 0x00, 0x6e, 0xff, 0xe3, 0x04, 0x1e, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x33, 0x00, 0x00, 0x01, 0x34, 0x26, 0x27, 0x16, 0x15, 0x11, 0x33, 0x13, 0x11, 0x21, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3b, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x20, 0x16, 0x01, 0x35, 0x23, 0x22, 0x07, 0x11, 0x3e, 0x01, 0x37, 0x36, 0x05, 0x11, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x03, 0xc4, 0x87, 0x37, 0x44, 0x7a, 0x5a, 0xfe, 0xd2, 0x39, 0xa9, 0x4e, 0x9b, 0xb6, 0xe3, 0xe2, 0xbc, 0x6a, 0x88, 0x56, 0xa4, 0x4c, 0x6c, 0xc8, 0x33, 0x01, 0x01, 0xfe, 0xfe, 0xd2, 0xbc, 0x30, 0x2b, 0x55, 0x58, 0x35, 0x35, 0xfe, 0x8f, 0x3c, 0x7a, 0x6d, 0x02, 0x7f, 0xd3, 0x86, 0x18, 0x5d, 0x88, 0xfd, 0x59, 0x02, 0x1b, 0xfd, 0x81, 0xaa, 0x66, 0x61, 0xc1, 0xa2, 0xbd, 0xc0, 0x48, 0x7f, 0x8b, 0x2e, 0x2e, 0x74, 0x27, 0x27, 0xfc, 0xfe, 0x8b, 0x55, 0x04, 0xfd, 0xed, 0x04, 0x4e, 0x48, 0x47, 0xdc, 0x01, 0xfd, 0x12, 0x67, 0x8b, 0x77, 0x74, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x85, 0xff, 0xe3, 0x04, 0x92, 0x06, 0x14, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x00, 0x13, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x15, 0x21, 0x01, 0x34, 0x27, 0x26, 0x27, 0x11, 0x36, 0x37, 0x36, 0x37, 0x36, 0x01, 0x11, 0x33, 0x11, 0x01, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x85, 0x01, 0x2d, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0xfe, 0xd3, 0x03, 0xaa, 0x55, 0x27, 0x36, 0x36, 0x27, 0x34, 0x14, 0x0d, 0xfc, 0xb0, 0x79, 0x01, 0xc6, 0x16, 0x18, 0x94, 0x44, 0x45, 0x14, 0x0c, 0x55, 0x54, 0x94, 0x18, 0x16, 0x06, 0x14, 0xfd, 0xa2, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x64, 0xa8, 0x02, 0x74, 0x9f, 0x82, 0x3d, 0x20, 0xfc, 0x7a, 0x20, 0x3d, 0x4f, 0x73, 0x4b, 0x03, 0xda, 0xfa, 0xac, 0x05, 0x54, 0xfe, 0x64, 0x03, 0x69, 0x68, 0x74, 0x4a, 0x9e, 0x9f, 0x82, 0x82, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x00, 0x25, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x16, 0x17, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x11, 0x16, 0x33, 0x32, 0x37, 0x36, 0x25, 0x11, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x03, 0x83, 0x45, 0x95, 0x53, 0xe4, 0xfe, 0xf4, 0x01, 0x0f, 0xeb, 0x4d, 0x92, 0x44, 0x3e, 0x62, 0x40, 0x43, 0x4f, 0x41, 0x3d, 0x49, 0x49, 0x41, 0x4e, 0xfe, 0x48, 0x27, 0x21, 0x6e, 0x6e, 0x20, 0x8f, 0x64, 0x24, 0x24, 0x01, 0x3e, 0x01, 0x0e, 0x01, 0x12, 0x01, 0x3a, 0x23, 0x23, 0x64, 0x1f, 0x18, 0x0f, 0x14, 0xfc, 0x57, 0x13, 0x10, 0x13, 0x1b, 0x03, 0x53, 0x1a, 0x25, 0x80, 0xea, 0xe6, 0x83, 0x26, 0x00, 0x00, 0x00, 0x04, 0x00, 0x85, 0xff, 0xe3, 0x04, 0x92, 0x06, 0x14, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x21, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x10, 0x12, 0x33, 0x32, 0x16, 0x01, 0x14, 0x17, 0x16, 0x17, 0x16, 0x17, 0x11, 0x06, 0x07, 0x06, 0x01, 0x11, 0x33, 0x11, 0x01, 0x11, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x03, 0x64, 0x01, 0x2d, 0xfe, 0xd3, 0x34, 0x9f, 0x70, 0xb6, 0xe6, 0xe6, 0xb6, 0x70, 0x9f, 0xfd, 0xb7, 0x0e, 0x14, 0x33, 0x28, 0x36, 0x36, 0x28, 0x55, 0x02, 0xd7, 0x79, 0xfd, 0xc1, 0x16, 0x18, 0x94, 0x54, 0x56, 0x0d, 0x14, 0x45, 0x44, 0x94, 0x18, 0x03, 0xb6, 0x02, 0x5e, 0xf9, 0xec, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x02, 0x10, 0x01, 0x44, 0x61, 0xfe, 0x5a, 0x9e, 0x4b, 0x73, 0x4f, 0x3d, 0x20, 0x03, 0x86, 0x20, 0x3d, 0x82, 0x02, 0x9d, 0xfa, 0xac, 0x05, 0x54, 0xfe, 0x64, 0xfc, 0x36, 0x03, 0x82, 0x82, 0x9f, 0x9e, 0x4a, 0x74, 0x68, 0x69, 0x00, 0x00, 0x03, 0x00, 0x63, 0xff, 0xe3, 0x04, 0x0b, 0x04, 0x7b, 0x00, 0x13, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x21, 0x13, 0x16, 0x33, 0x32, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x12, 0x15, 0x01, 0x06, 0x11, 0x12, 0x17, 0x13, 0x21, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x04, 0x0a, 0xfd, 0xca, 0x01, 0x43, 0x56, 0xc3, 0xb0, 0x62, 0xb0, 0x60, 0xf1, 0xfe, 0xe6, 0x01, 0x0b, 0xe3, 0xce, 0xea, 0xfd, 0x6c, 0xb2, 0x01, 0xb1, 0x5f, 0x01, 0xce, 0x03, 0xb8, 0x98, 0x42, 0x3a, 0x02, 0x04, 0xfe, 0x62, 0x15, 0x5d, 0x75, 0x2d, 0x29, 0x01, 0x38, 0x01, 0x0a, 0x01, 0x13, 0x01, 0x43, 0xfe, 0xda, 0xf7, 0x01, 0x71, 0x7a, 0xfe, 0xdb, 0xfe, 0xf3, 0x8e, 0x01, 0xd3, 0xbe, 0xe7, 0x11, 0x00, 0x02, 0x00, 0x2a, 0x00, 0x00, 0x03, 0x80, 0x06, 0x14, 0x00, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x11, 0x33, 0x11, 0x34, 0x37, 0x36, 0x25, 0x15, 0x23, 0x22, 0x07, 0x06, 0x1d, 0x01, 0x21, 0x15, 0x21, 0x11, 0x21, 0x11, 0x23, 0x35, 0x33, 0x35, 0x34, 0x37, 0x36, 0x33, 0x01, 0xdc, 0x5d, 0x29, 0x33, 0x79, 0x14, 0x10, 0x01, 0xc0, 0x9d, 0x85, 0x34, 0x34, 0x01, 0x5d, 0xfe, 0xa3, 0xfe, 0xd3, 0x9f, 0x9f, 0x4e, 0x4f, 0xa9, 0x05, 0xae, 0x0a, 0x2d, 0x38, 0x91, 0xfb, 0xb6, 0x04, 0x4a, 0x5f, 0x44, 0x38, 0x8b, 0x64, 0x39, 0x37, 0x92, 0x64, 0x64, 0xfc, 0x1a, 0x03, 0xe6, 0x64, 0x64, 0xbc, 0x54, 0x56, 0x00, 0x00, 0x04, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x72, 0x04, 0x7b, 0x00, 0x07, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x11, 0x14, 0x07, 0x16, 0x36, 0x19, 0x01, 0x01, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x21, 0x11, 0x10, 0x00, 0x21, 0x22, 0x26, 0x03, 0x14, 0x17, 0x16, 0x17, 0x11, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x03, 0x9f, 0x5f, 0x04, 0xd4, 0xfc, 0xc7, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0x01, 0x2d, 0xfe, 0xf3, 0xfe, 0xec, 0x67, 0xb5, 0x6d, 0x54, 0x28, 0x36, 0x36, 0x28, 0x33, 0x14, 0x0d, 0x01, 0x10, 0x17, 0x17, 0x95, 0x43, 0x46, 0x14, 0x0c, 0x55, 0x54, 0x95, 0x17, 0x17, 0x03, 0xfa, 0xfc, 0x3d, 0xca, 0x8c, 0x05, 0x9d, 0x01, 0x12, 0x03, 0x6f, 0xfa, 0x97, 0x80, 0x2c, 0x2a, 0xbd, 0xbf, 0x71, 0x64, 0x61, 0x01, 0x44, 0x02, 0x10, 0x01, 0x44, 0x61, 0x64, 0xa8, 0xfc, 0x2d, 0xfe, 0xe2, 0xfe, 0xe9, 0x1d, 0x03, 0x77, 0x9f, 0x82, 0x3d, 0x20, 0x03, 0x86, 0x20, 0x3d, 0x4f, 0x73, 0x4b, 0xfd, 0xc2, 0x03, 0x69, 0x68, 0x74, 0x4a, 0x9e, 0x9f, 0x82, 0x82, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc1, 0x06, 0x14, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x15, 0x11, 0x33, 0x11, 0x34, 0x27, 0x26, 0x01, 0x11, 0x33, 0x11, 0x27, 0x21, 0x11, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x03, 0x9a, 0x08, 0x07, 0x40, 0x7e, 0x4b, 0x30, 0xfd, 0x15, 0x7a, 0xd4, 0x01, 0x2e, 0x42, 0xb2, 0x74, 0xbf, 0xc5, 0xfe, 0xce, 0x61, 0x60, 0x73, 0x86, 0xfe, 0xd2, 0x04, 0x0d, 0x0b, 0x0c, 0x68, 0xbe, 0xfd, 0x94, 0x02, 0x40, 0xc1, 0x5b, 0x3a, 0x01, 0xb6, 0xfa, 0xb4, 0x05, 0x4c, 0x64, 0xfd, 0x9e, 0x65, 0x64, 0xef, 0xe8, 0xfd, 0x5c, 0x02, 0xd0, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x55, 0x00, 0x03, 0x00, 0xcf, 0x00, 0x00, 0x01, 0xfd, 0x06, 0x14, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x03, 0x33, 0x15, 0x23, 0x07, 0x21, 0x11, 0x21, 0x01, 0x29, 0x79, 0x90, 0xa7, 0xa7, 0x43, 0x01, 0x2d, 0xfe, 0xd3, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0x02, 0x18, 0xe9, 0xcb, 0xfb, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xdb, 0xfe, 0x56, 0x01, 0xd8, 0x06, 0x14, 0x00, 0x08, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x00, 0x05, 0x11, 0x23, 0x11, 0x14, 0x07, 0x36, 0x37, 0x36, 0x07, 0x23, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x21, 0x11, 0x14, 0x07, 0x06, 0x03, 0x33, 0x15, 0x23, 0x01, 0x7e, 0x7a, 0x21, 0x40, 0x24, 0x37, 0xdc, 0xc7, 0x2c, 0x61, 0x21, 0x21, 0x01, 0x2e, 0x49, 0x4a, 0x57, 0xa5, 0xa5, 0x16, 0x04, 0x12, 0xfb, 0xd0, 0xb5, 0x54, 0x0f, 0x30, 0x48, 0xf4, 0x64, 0x30, 0x31, 0x99, 0x04, 0xac, 0xfb, 0x8c, 0xd6, 0x60, 0x60, 0x07, 0xbe, 0xe9, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xad, 0x06, 0x14, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x00, 0x13, 0x21, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x21, 0x13, 0x11, 0x33, 0x11, 0xa7, 0x01, 0x2e, 0x02, 0x43, 0x7e, 0xfd, 0x8e, 0x02, 0x89, 0x87, 0xfd, 0xaf, 0xfe, 0xd2, 0x5a, 0x7a, 0x06, 0x14, 0xfc, 0x69, 0x01, 0xe3, 0xfd, 0xf6, 0xfd, 0xaa, 0x02, 0x23, 0xfd, 0xdd, 0x05, 0xb0, 0xfa, 0xb4, 0x05, 0x4c, 0x00, 0x02, 0x00, 0xcf, 0x00, 0x00, 0x02, 0xa0, 0x06, 0x14, 0x00, 0x08, 0x00, 0x14, 0x00, 0x00, 0x01, 0x14, 0x17, 0x16, 0x17, 0x26, 0x35, 0x11, 0x23, 0x13, 0x22, 0x27, 0x26, 0x35, 0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x15, 0x01, 0x29, 0x37, 0x24, 0x40, 0x22, 0x79, 0xdd, 0xa4, 0x4a, 0x49, 0x01, 0x2d, 0x45, 0x5e, 0x01, 0x94, 0xa0, 0x48, 0x30, 0x0f, 0x54, 0xb5, 0x04, 0x30, 0xfa, 0x5a, 0x60, 0x60, 0xd6, 0x04, 0x7e, 0xfb, 0x4a, 0x9c, 0x5e, 0x64, 0x00, 0x00, 0x00, 0x04, 0x00, 0xa7, 0x00, 0x00, 0x07, 0xad, 0x04, 0x7b, 0x00, 0x22, 0x00, 0x26, 0x00, 0x31, 0x00, 0x3c, 0x00, 0x00, 0x13, 0x21, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x13, 0x11, 0x33, 0x11, 0x25, 0x16, 0x17, 0x16, 0x15, 0x11, 0x33, 0x11, 0x34, 0x27, 0x26, 0x25, 0x16, 0x17, 0x16, 0x15, 0x11, 0x33, 0x11, 0x34, 0x27, 0x26, 0xa7, 0x01, 0x2e, 0x42, 0xb2, 0x74, 0xbf, 0x8d, 0x18, 0x4c, 0xc8, 0x74, 0xbf, 0xc5, 0xfe, 0xce, 0x61, 0x60, 0x73, 0x86, 0xfe, 0xce, 0x61, 0x60, 0x73, 0x86, 0xfe, 0xd2, 0x5a, 0x7a, 0x02, 0x1f, 0x08, 0x07, 0x40, 0x7e, 0x4b, 0x30, 0x02, 0x9a, 0x08, 0x07, 0x40, 0x7e, 0x4b, 0x30, 0x04, 0x60, 0xae, 0x65, 0x64, 0xac, 0x4a, 0x80, 0x76, 0xef, 0xe8, 0xfd, 0x5c, 0x02, 0xd0, 0x9f, 0x9e, 0xbe, 0xab, 0xfd, 0x5c, 0x02, 0xd0, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x55, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0x11, 0x0b, 0x0c, 0x68, 0xbe, 0xfd, 0x94, 0x02, 0x40, 0xc1, 0x5b, 0x3a, 0x13, 0x0b, 0x0c, 0x68, 0xbe, 0xfd, 0x94, 0x02, 0x40, 0xc1, 0x5b, 0x3a, 0x00, 0x00, 0x00, 0x03, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc1, 0x04, 0x7b, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x15, 0x11, 0x33, 0x11, 0x34, 0x27, 0x26, 0x25, 0x11, 0x33, 0x11, 0x27, 0x21, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x11, 0x21, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x03, 0x9a, 0x08, 0x07, 0x40, 0x7e, 0x4b, 0x30, 0xfd, 0x15, 0x7a, 0xd4, 0x01, 0x2e, 0x42, 0xb2, 0x74, 0xbf, 0xc5, 0xfe, 0xce, 0x61, 0x60, 0x73, 0x86, 0xfe, 0xd2, 0x04, 0x0d, 0x0b, 0x0c, 0x68, 0xbe, 0xfd, 0x94, 0x02, 0x40, 0xc1, 0x5b, 0x3a, 0x02, 0xfc, 0x68, 0x03, 0x98, 0x64, 0xae, 0x65, 0x64, 0xef, 0xe8, 0xfd, 0x5c, 0x02, 0xd0, 0x9f, 0x9e, 0xbe, 0xa4, 0xfd, 0x55, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x1b, 0x00, 0x23, 0x00, 0x00, 0x01, 0x32, 0x12, 0x11, 0x10, 0x02, 0x23, 0x22, 0x02, 0x11, 0x10, 0x12, 0x13, 0x16, 0x32, 0x37, 0x11, 0x26, 0x22, 0x07, 0x03, 0x11, 0x06, 0x07, 0x06, 0x10, 0x17, 0x16, 0x01, 0x11, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x02, 0x34, 0xd8, 0xf7, 0xf7, 0xd8, 0xd9, 0xf5, 0xf5, 0x75, 0x2e, 0x6c, 0x2e, 0x2e, 0x6c, 0x2e, 0x5a, 0x2e, 0x24, 0x64, 0x64, 0x24, 0x01, 0xaa, 0x2e, 0x24, 0x65, 0x65, 0x24, 0x04, 0x7b, 0xfe, 0xc8, 0xfe, 0xec, 0xfe, 0xed, 0xfe, 0xc7, 0x01, 0x39, 0x01, 0x13, 0x01, 0x14, 0x01, 0x38, 0xfb, 0xd7, 0x0b, 0x0b, 0x03, 0xba, 0x0b, 0x0b, 0xfc, 0x6b, 0x03, 0x70, 0x1d, 0x2d, 0x80, 0xfe, 0x24, 0x80, 0x2d, 0x03, 0x52, 0xfc, 0x92, 0x1c, 0x2d, 0x81, 0x01, 0xdb, 0x80, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x72, 0x04, 0x7b, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x21, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x22, 0x26, 0x01, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x11, 0x36, 0x37, 0x36, 0x01, 0x11, 0x23, 0x11, 0x01, 0x11, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x01, 0x92, 0xfe, 0xd4, 0x01, 0x2c, 0x34, 0xa0, 0x6f, 0xb7, 0xe6, 0xe6, 0xb7, 0x6f, 0xa0, 0x02, 0x4a, 0x0e, 0x14, 0x33, 0x28, 0x36, 0x36, 0x28, 0x55, 0xfd, 0x28, 0x78, 0x02, 0x3f, 0x17, 0x17, 0x95, 0x53, 0x56, 0x0d, 0x14, 0x45, 0x43, 0x95, 0x17, 0xa8, 0xfd, 0xae, 0x06, 0x08, 0xa8, 0x64, 0x61, 0xfe, 0xbc, 0xfd, 0xf0, 0xfe, 0xbc, 0x61, 0x01, 0xa6, 0x9e, 0x4b, 0x73, 0x4f, 0x3d, 0x20, 0xfc, 0x7a, 0x20, 0x3d, 0x82, 0xfd, 0x6f, 0x05, 0x48, 0xfa, 0xb8, 0x01, 0x90, 0x03, 0xca, 0x03, 0x82, 0x82, 0x9f, 0x9e, 0x4a, 0x74, 0x68, 0x69, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0xfe, 0x56, 0x04, 0x72, 0x04, 0x7b, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x2d, 0x00, 0x00, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x10, 0x12, 0x33, 0x32, 0x16, 0x17, 0x35, 0x21, 0x11, 0x21, 0x01, 0x14, 0x17, 0x16, 0x17, 0x11, 0x06, 0x07, 0x06, 0x07, 0x06, 0x01, 0x33, 0x11, 0x23, 0x01, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x03, 0x45, 0x34, 0x9f, 0x70, 0xb7, 0xe5, 0xe5, 0xb7, 0x70, 0x9f, 0x34, 0x01, 0x2d, 0xfe, 0xd3, 0xfd, 0x83, 0x54, 0x28, 0x36, 0x36, 0x28, 0x33, 0x14, 0x0d, 0x02, 0xd7, 0x79, 0x79, 0xfe, 0x39, 0x17, 0x17, 0x95, 0x43, 0x46, 0x14, 0x0c, 0x55, 0x54, 0x95, 0x17, 0x17, 0xa8, 0x64, 0x61, 0x01, 0x44, 0x02, 0x10, 0x01, 0x44, 0x61, 0x64, 0xa8, 0xf9, 0xf8, 0x03, 0x94, 0x9f, 0x82, 0x3d, 0x20, 0x03, 0x86, 0x20, 0x3d, 0x4f, 0x73, 0x4b, 0xfc, 0x32, 0x05, 0x48, 0xfc, 0x48, 0x03, 0x69, 0x68, 0x74, 0x4a, 0x9e, 0x9f, 0x82, 0x82, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x03, 0x7c, 0x04, 0x7b, 0x00, 0x03, 0x00, 0x15, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x27, 0x21, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x1f, 0x01, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x01, 0x01, 0x79, 0xd3, 0x01, 0x2d, 0x34, 0xa8, 0x77, 0x19, 0x0d, 0x2f, 0x1c, 0x42, 0x27, 0x8d, 0x96, 0xfe, 0xd3, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0x64, 0xae, 0x66, 0x63, 0x03, 0x07, 0x85, 0x12, 0x11, 0xcb, 0xbe, 0xfd, 0x7a, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x04, 0x7b, 0x00, 0x1d, 0x00, 0x45, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x1f, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x03, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x01, 0x45, 0x23, 0x19, 0x44, 0x22, 0x23, 0x66, 0x2f, 0x94, 0x37, 0x3c, 0x22, 0x22, 0x1a, 0x4c, 0x26, 0x2a, 0x77, 0x2d, 0x82, 0x33, 0x40, 0xbe, 0x4b, 0x90, 0x47, 0x5f, 0x66, 0x45, 0x82, 0x2f, 0x81, 0x6a, 0xca, 0xb9, 0x5c, 0xa2, 0x44, 0x42, 0x53, 0x56, 0x63, 0x65, 0x48, 0x6c, 0x2e, 0x91, 0x76, 0xde, 0xc2, 0x51, 0xb0, 0x61, 0x03, 0xf9, 0x0f, 0x17, 0x3d, 0x76, 0x66, 0x30, 0x33, 0x22, 0x10, 0x33, 0x3b, 0x40, 0x7b, 0x52, 0x3f, 0x10, 0x17, 0x42, 0x73, 0x6c, 0x33, 0x37, 0x27, 0x0f, 0x2a, 0x37, 0x43, 0x6f, 0x54, 0xfc, 0xfe, 0x37, 0x38, 0x5e, 0x55, 0x4e, 0x4f, 0x2c, 0x10, 0x2c, 0x97, 0x88, 0xa6, 0xb5, 0x20, 0x1f, 0x7a, 0x31, 0x24, 0x59, 0x58, 0x44, 0x4c, 0x23, 0x0f, 0x2f, 0x9e, 0x90, 0xa4, 0xc0, 0x25, 0x25, 0x00, 0x02, 0x00, 0x31, 0x00, 0x00, 0x03, 0x2e, 0x05, 0x9e, 0x00, 0x07, 0x00, 0x1b, 0x00, 0x00, 0x25, 0x26, 0x37, 0x11, 0x23, 0x11, 0x06, 0x16, 0x13, 0x11, 0x21, 0x15, 0x21, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x21, 0x22, 0x26, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x01, 0xa2, 0x26, 0x02, 0x79, 0x01, 0x53, 0x81, 0x01, 0x56, 0xfe, 0xaa, 0x44, 0x68, 0xaa, 0xfe, 0xce, 0xbf, 0x92, 0x79, 0x79, 0x6a, 0x55, 0x7c, 0x03, 0xff, 0xfc, 0x37, 0xad, 0x4e, 0x05, 0x28, 0xfe, 0xac, 0x64, 0xfd, 0x55, 0x89, 0x4e, 0x64, 0x9f, 0xd2, 0x02, 0x75, 0x64, 0x01, 0x54, 0x00, 0x00, 0x03, 0x00, 0x9f, 0xff, 0xe5, 0x04, 0xbe, 0x04, 0x60, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x22, 0x00, 0x00, 0x25, 0x26, 0x27, 0x26, 0x35, 0x11, 0x23, 0x11, 0x14, 0x17, 0x16, 0x05, 0x11, 0x23, 0x11, 0x17, 0x21, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x21, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x21, 0x01, 0xc6, 0x08, 0x07, 0x40, 0x7e, 0x4b, 0x30, 0x02, 0xef, 0x79, 0xd3, 0xfe, 0xce, 0x41, 0xb3, 0x74, 0xbf, 0xc5, 0x01, 0x32, 0x61, 0x60, 0x73, 0x86, 0x01, 0x32, 0x53, 0x0b, 0x0c, 0x68, 0xbe, 0x02, 0x6c, 0xfd, 0xc0, 0xc1, 0x5b, 0x3a, 0x02, 0x03, 0x98, 0xfc, 0x68, 0x64, 0xae, 0x65, 0x64, 0xef, 0xe8, 0x02, 0xa4, 0xfd, 0x30, 0x9f, 0x9e, 0xbe, 0xa4, 0x02, 0xab, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x04, 0x39, 0x04, 0x60, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x13, 0x01, 0x33, 0x01, 0x27, 0x21, 0x09, 0x01, 0x33, 0x01, 0x21, 0xb8, 0x01, 0x37, 0x76, 0xfe, 0xc6, 0xf4, 0x01, 0x32, 0x01, 0x3b, 0x01, 0x3b, 0x5a, 0xfe, 0x86, 0xfe, 0xf2, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0x64, 0xfc, 0x54, 0x03, 0xac, 0xfb, 0xa0, 0x00, 0x00, 0x00, 0x03, 0x00, 0x4d, 0x00, 0x00, 0x06, 0x41, 0x04, 0x60, 0x00, 0x03, 0x00, 0x07, 0x00, 0x14, 0x00, 0x00, 0x01, 0x13, 0x33, 0x03, 0x21, 0x13, 0x33, 0x03, 0x27, 0x21, 0x1b, 0x01, 0x21, 0x1b, 0x01, 0x33, 0x01, 0x21, 0x0b, 0x01, 0x21, 0x03, 0x8c, 0xd8, 0x7a, 0xda, 0xfc, 0xbe, 0xd8, 0x7a, 0xda, 0xed, 0x01, 0x32, 0xcf, 0xce, 0x01, 0x2d, 0xcf, 0xce, 0x5a, 0xfe, 0xf8, 0xfe, 0xea, 0xd9, 0xda, 0xfe, 0xe6, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0xfc, 0x68, 0x03, 0x98, 0x64, 0xfc, 0x96, 0x03, 0x6a, 0xfc, 0x96, 0x03, 0x6a, 0xfb, 0xa0, 0x03, 0x96, 0xfc, 0x6a, 0x00, 0x02, 0x00, 0x44, 0x00, 0x00, 0x04, 0x9a, 0x04, 0x60, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x13, 0x01, 0x33, 0x01, 0x25, 0x21, 0x09, 0x01, 0x33, 0x09, 0x01, 0x21, 0x09, 0x01, 0x23, 0x01, 0xf8, 0x02, 0x66, 0x88, 0xfd, 0x99, 0xfe, 0xc5, 0x01, 0x68, 0x01, 0x01, 0x01, 0x00, 0x70, 0xfe, 0xc8, 0x01, 0xb4, 0xfe, 0x98, 0xff, 0x00, 0xfe, 0xff, 0x6f, 0x01, 0x38, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0x64, 0xfe, 0x81, 0x01, 0x7f, 0xfe, 0x2d, 0xfd, 0x73, 0x01, 0x7f, 0xfe, 0x81, 0x01, 0xd3, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x4a, 0x04, 0x60, 0x00, 0x03, 0x00, 0x12, 0x00, 0x00, 0x13, 0x01, 0x37, 0x01, 0x27, 0x21, 0x09, 0x01, 0x33, 0x01, 0x0e, 0x01, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x37, 0xbd, 0x01, 0x87, 0x37, 0xfe, 0xba, 0xfe, 0x01, 0x3b, 0x01, 0x3a, 0x01, 0x3c, 0x61, 0xfe, 0x45, 0x48, 0x83, 0x70, 0x84, 0x84, 0x4f, 0x49, 0x27, 0x03, 0xfc, 0xfb, 0xdb, 0x99, 0x03, 0x8c, 0x64, 0xfc, 0x97, 0x03, 0x69, 0xfb, 0x38, 0xc7, 0x7b, 0x64, 0x43, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x4f, 0x00, 0x00, 0x03, 0xf2, 0x04, 0x60, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x25, 0x21, 0x15, 0x01, 0x21, 0x15, 0x21, 0x35, 0x01, 0x21, 0x03, 0x06, 0xfd, 0xb7, 0x7e, 0x02, 0x49, 0xfc, 0xe2, 0x03, 0x8c, 0xfd, 0xb8, 0x02, 0x48, 0xfc, 0x5d, 0x02, 0x48, 0xfd, 0xcf, 0x03, 0xfc, 0xfc, 0x68, 0x03, 0x98, 0x64, 0x64, 0xfc, 0x68, 0x64, 0x64, 0x03, 0x98, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x24, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x6e, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x25, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xa4, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x26, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x1f, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x27, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x17, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xba, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x29, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x04, 0xfe, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x2a, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0x00, 0x00, 0x02, 0xab, 0x05, 0xd5, 0x10, 0x06, 0x11, 0x48, 0x00, 0x00, 0xff, 0xff, 0xff, 0xa0, 0xfe, 0x66, 0x01, 0x6b, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xe0, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x03, 0xf9, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x05, 0x83, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x30, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xae, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x31, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xff, 0xe3, 0x05, 0x44, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x32, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0x19, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x33, 0x00, 0x00, 0xff, 0xff, 0x00, 0x67, 0xfe, 0xf8, 0x05, 0x44, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x34, 0x00, 0x00, 0xff, 0xff, 0x00, 0xb4, 0x00, 0x00, 0x04, 0xcc, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x35, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x2c, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x36, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfa, 0x00, 0x00, 0x04, 0x6c, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x37, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa0, 0xff, 0xe3, 0x04, 0xa5, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x38, 0x00, 0x00, 0xff, 0xff, 0x00, 0x0e, 0x00, 0x00, 0x04, 0xde, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x39, 0x00, 0x00, 0xff, 0xff, 0x00, 0x3d, 0x00, 0x00, 0x06, 0xe3, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x3a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0xb6, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x3b, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x04, 0x6a, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x3c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x52, 0x00, 0x00, 0x04, 0x9c, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x6e, 0xff, 0xe3, 0x03, 0xc3, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x44, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xff, 0xe3, 0x04, 0x2e, 0x06, 0x14, 0x10, 0x06, 0x00, 0x45, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0x84, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x46, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x03, 0xeb, 0x06, 0x14, 0x10, 0x06, 0x00, 0x47, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x0c, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x48, 0x00, 0x00, 0xff, 0xff, 0x00, 0x2a, 0x00, 0x00, 0x02, 0xac, 0x06, 0x14, 0x10, 0x06, 0x00, 0x49, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x4a, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x06, 0x14, 0x10, 0x06, 0x00, 0x4b, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x01, 0x54, 0x06, 0x14, 0x10, 0x06, 0x00, 0x4c, 0x00, 0x00, 0xff, 0xff, 0xff, 0xde, 0xfe, 0x56, 0x01, 0x54, 0x06, 0x14, 0x10, 0x06, 0x00, 0x4d, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x26, 0x06, 0x14, 0x10, 0x06, 0x00, 0x4e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xad, 0x00, 0x00, 0x02, 0x01, 0x06, 0x14, 0x10, 0x06, 0x11, 0x3e, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x06, 0x67, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x50, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x03, 0xf4, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x51, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x03, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x52, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0xfe, 0x56, 0x04, 0x2e, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x53, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xfe, 0x56, 0x03, 0xeb, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x54, 0x00, 0x00, 0xff, 0xff, 0x00, 0xa7, 0x00, 0x00, 0x02, 0xf6, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x55, 0x00, 0x00, 0xff, 0xff, 0x00, 0x63, 0xff, 0xe3, 0x03, 0x67, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x56, 0x00, 0x00, 0xff, 0xff, 0x00, 0x31, 0x00, 0x00, 0x02, 0xa7, 0x05, 0x9e, 0x10, 0x06, 0x00, 0x57, 0x00, 0x00, 0xff, 0xff, 0x00, 0x9c, 0xff, 0xe3, 0x03, 0xe9, 0x04, 0x7b, 0x10, 0x06, 0x00, 0x58, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0x00, 0x00, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x06, 0x00, 0x59, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x97, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x35, 0x00, 0x00, 0x04, 0x07, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x36, 0xfe, 0x56, 0x04, 0x0c, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x00, 0x4f, 0x00, 0x00, 0x03, 0x79, 0x04, 0x60, 0x10, 0x06, 0x00, 0x5d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x7a, 0xff, 0xe3, 0x04, 0x1c, 0x05, 0xf0, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x14, 0x00, 0x19, 0x00, 0x00, 0x00, 0x20, 0x12, 0x10, 0x02, 0x20, 0x02, 0x10, 0x01, 0x36, 0x11, 0x10, 0x2f, 0x01, 0x26, 0x22, 0x07, 0x11, 0x16, 0x32, 0x37, 0x01, 0x06, 0x11, 0x10, 0x17, 0x01, 0x68, 0x01, 0xc4, 0xef, 0xef, 0xfe, 0x3c, 0xee, 0x02, 0x90, 0xb7, 0xb7, 0x5a, 0x2e, 0x6f, 0x2f, 0x2f, 0x6f, 0x2e, 0xfe, 0xda, 0xb6, 0xb6, 0x05, 0xf0, 0xfe, 0x73, 0xfd, 0x0d, 0xfe, 0x73, 0x01, 0x8d, 0x02, 0xf3, 0xfc, 0x23, 0x8f, 0x01, 0xd4, 0x01, 0xd5, 0x8f, 0x30, 0x0f, 0x0f, 0xfa, 0xd9, 0x0f, 0x0f, 0x04, 0xf7, 0x90, 0xfe, 0x2c, 0xfe, 0x2d, 0x90, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x60, 0x00, 0x00, 0x04, 0x35, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x11, 0x33, 0x11, 0x37, 0x11, 0x21, 0x15, 0x21, 0x35, 0x21, 0x11, 0x05, 0x35, 0x25, 0x01, 0xfd, 0xb6, 0x58, 0x01, 0x29, 0xfc, 0x46, 0x01, 0x29, 0xfe, 0xbd, 0x01, 0x43, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0xfa, 0x8f, 0x64, 0x64, 0x05, 0x0d, 0x48, 0x64, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x75, 0x00, 0x00, 0x04, 0x25, 0x05, 0xf0, 0x00, 0x10, 0x00, 0x28, 0x00, 0x00, 0x37, 0x33, 0x01, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x27, 0x17, 0x16, 0x15, 0x14, 0x0e, 0x01, 0x0b, 0x01, 0x36, 0x33, 0x32, 0x04, 0x15, 0x14, 0x0e, 0x01, 0x07, 0x03, 0x21, 0x15, 0x21, 0x37, 0x36, 0x00, 0x37, 0x36, 0x10, 0x26, 0x23, 0x22, 0x07, 0xe2, 0xe6, 0x01, 0x0c, 0x56, 0x1f, 0x44, 0x61, 0x3d, 0x59, 0x03, 0x51, 0x3e, 0x75, 0xbc, 0xfd, 0xe9, 0xa3, 0xdb, 0x01, 0x02, 0x2b, 0x49, 0x54, 0xec, 0x01, 0xf1, 0xfc, 0x51, 0x01, 0x02, 0x01, 0x74, 0x37, 0x6d, 0x79, 0x63, 0x88, 0xae, 0x64, 0x01, 0xcd, 0x95, 0x40, 0x8f, 0x01, 0x39, 0x5c, 0x39, 0x18, 0x04, 0x70, 0xa8, 0x64, 0xba, 0xcf, 0xfe, 0xdd, 0x04, 0x39, 0x68, 0xf4, 0xcc, 0x62, 0xac, 0x96, 0x91, 0xfe, 0x69, 0x64, 0x64, 0x05, 0x02, 0x41, 0x62, 0xbf, 0x01, 0x19, 0xa8, 0x95, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8c, 0xff, 0xe3, 0x04, 0x02, 0x05, 0xf0, 0x00, 0x24, 0x00, 0x2a, 0x00, 0x30, 0x00, 0x00, 0x05, 0x22, 0x27, 0x35, 0x17, 0x16, 0x33, 0x32, 0x37, 0x11, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x11, 0x26, 0x23, 0x22, 0x0f, 0x01, 0x35, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x04, 0x35, 0x36, 0x35, 0x34, 0x26, 0x27, 0x19, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x01, 0xf4, 0xa9, 0xbf, 0x1e, 0xb0, 0x9a, 0x5a, 0x48, 0x31, 0x39, 0xb7, 0xbe, 0x35, 0x2e, 0x35, 0x44, 0x8d, 0xc3, 0x18, 0xcf, 0x9d, 0xcf, 0xf2, 0x7f, 0x73, 0x7f, 0x92, 0xfe, 0xef, 0xb7, 0x69, 0x4e, 0x3e, 0x5a, 0x1d, 0x4a, 0x6a, 0x0c, 0x44, 0x10, 0x02, 0x95, 0x0a, 0x64, 0x08, 0x02, 0x20, 0x0a, 0x3c, 0x08, 0x68, 0x40, 0xd1, 0xb2, 0x7c, 0xaa, 0x21, 0x1f, 0xc5, 0x90, 0xdd, 0xf2, 0x92, 0x55, 0xe8, 0x6c, 0x8d, 0x24, 0x02, 0x96, 0xfe, 0x1a, 0x1d, 0x79, 0x58, 0xac, 0x00, 0x03, 0x00, 0x51, 0x00, 0x00, 0x04, 0x40, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x06, 0x00, 0x11, 0x00, 0x00, 0x01, 0x23, 0x13, 0x33, 0x09, 0x01, 0x21, 0x03, 0x21, 0x11, 0x33, 0x15, 0x23, 0x11, 0x21, 0x11, 0x21, 0x35, 0x03, 0x4a, 0xb7, 0x03, 0xb4, 0xfe, 0xf2, 0xfe, 0x7c, 0x01, 0x84, 0x03, 0x01, 0x6b, 0x9b, 0x9b, 0xfe, 0x98, 0xfe, 0x15, 0x05, 0x71, 0xfa, 0xf3, 0x04, 0xc1, 0xfc, 0xe3, 0x03, 0xcd, 0xfc, 0x33, 0x64, 0xfe, 0x5c, 0x01, 0xa4, 0x7f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x85, 0xff, 0xe3, 0x04, 0x18, 0x05, 0xd5, 0x00, 0x04, 0x00, 0x08, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x11, 0x23, 0x11, 0x36, 0x01, 0x36, 0x10, 0x27, 0x03, 0x11, 0x26, 0x23, 0x22, 0x07, 0x11, 0x21, 0x15, 0x21, 0x11, 0x1e, 0x01, 0x10, 0x04, 0x21, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x01, 0xcc, 0xb4, 0x5d, 0x01, 0x8a, 0xb7, 0xb7, 0x5a, 0x2c, 0x60, 0xa2, 0xb9, 0x02, 0xf7, 0xfe, 0x71, 0xf6, 0xfc, 0xfe, 0xf2, 0xfe, 0xdd, 0xa7, 0xbb, 0xaa, 0xc6, 0x74, 0x03, 0x91, 0x01, 0xe0, 0xfd, 0xfd, 0x1b, 0xfc, 0xe6, 0x5c, 0x01, 0xdc, 0x60, 0xfd, 0x49, 0x02, 0xd7, 0x0a, 0x4b, 0x02, 0xef, 0x64, 0xfe, 0x23, 0x09, 0xf5, 0xfe, 0x46, 0xf9, 0x3c, 0x88, 0x64, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x33, 0x05, 0xf0, 0x00, 0x04, 0x00, 0x09, 0x00, 0x11, 0x00, 0x25, 0x00, 0x00, 0x25, 0x36, 0x11, 0x10, 0x27, 0x01, 0x06, 0x11, 0x10, 0x1f, 0x01, 0x16, 0x32, 0x37, 0x11, 0x26, 0x22, 0x07, 0x13, 0x32, 0x17, 0x15, 0x27, 0x26, 0x20, 0x07, 0x11, 0x36, 0x33, 0x32, 0x12, 0x10, 0x02, 0x23, 0x20, 0x02, 0x10, 0x00, 0x03, 0x23, 0xb6, 0xb6, 0xfe, 0x55, 0xb8, 0xb8, 0x5a, 0x34, 0x9a, 0x29, 0x24, 0x9a, 0x39, 0xdc, 0x96, 0x97, 0x1e, 0x8a, 0xfe, 0xf4, 0x55, 0x3c, 0x5d, 0xdd, 0xeb, 0xf5, 0xde, 0xfe, 0xfc, 0xf6, 0x01, 0x2e, 0x70, 0x63, 0x01, 0x0c, 0x01, 0x18, 0x5c, 0x01, 0xca, 0xb3, 0xfe, 0x91, 0xfe, 0x23, 0x95, 0x32, 0x10, 0x08, 0x03, 0x22, 0x06, 0x13, 0x02, 0x8c, 0x3c, 0x6a, 0x0c, 0x36, 0x2d, 0xfe, 0x66, 0x16, 0xfe, 0xef, 0xfe, 0x2f, 0xfe, 0xea, 0x01, 0x8d, 0x02, 0xdb, 0x01, 0xa5, 0x00, 0x02, 0x00, 0x3a, 0x00, 0x00, 0x04, 0x5b, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x09, 0x01, 0x33, 0x01, 0x25, 0x21, 0x15, 0x01, 0x21, 0x01, 0x21, 0x03, 0x39, 0xfe, 0x3f, 0xc1, 0x01, 0xc1, 0xfc, 0x40, 0x04, 0x20, 0xfe, 0x1d, 0xfe, 0x7e, 0x01, 0xe4, 0xfd, 0x61, 0x05, 0x71, 0xfa, 0xf3, 0x05, 0x0d, 0x64, 0x64, 0xfa, 0x8f, 0x05, 0x71, 0x00, 0x00, 0x00, 0x07, 0x00, 0x7d, 0xff, 0xe3, 0x04, 0x17, 0x05, 0xf0, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x24, 0x00, 0x29, 0x00, 0x31, 0x00, 0x39, 0x00, 0x41, 0x00, 0x00, 0x25, 0x36, 0x27, 0x26, 0x27, 0x00, 0x10, 0x17, 0x16, 0x17, 0x11, 0x06, 0x07, 0x13, 0x35, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x20, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x20, 0x26, 0x35, 0x34, 0x36, 0x13, 0x11, 0x06, 0x07, 0x06, 0x05, 0x16, 0x32, 0x37, 0x11, 0x26, 0x22, 0x07, 0x19, 0x01, 0x16, 0x32, 0x37, 0x11, 0x26, 0x22, 0x17, 0x11, 0x36, 0x37, 0x36, 0x10, 0x27, 0x26, 0x03, 0x02, 0xbc, 0x06, 0x06, 0xb0, 0xfd, 0xf5, 0x55, 0x1e, 0x27, 0x27, 0x1d, 0x44, 0x73, 0x81, 0xe5, 0x01, 0x91, 0xe4, 0x81, 0x74, 0x83, 0x92, 0xef, 0xfe, 0x44, 0xef, 0x93, 0x81, 0xaf, 0x06, 0x07, 0x01, 0x16, 0x2d, 0x64, 0x2c, 0x2c, 0x64, 0x2d, 0x2c, 0x66, 0x2b, 0x2b, 0x66, 0xeb, 0x28, 0x1d, 0x56, 0x55, 0x1e, 0x64, 0x4a, 0xea, 0xe4, 0x4e, 0x02, 0x27, 0xfe, 0xf8, 0x4d, 0x1b, 0x12, 0x01, 0xfc, 0x12, 0x1b, 0xfd, 0xdc, 0x02, 0x20, 0xb1, 0x80, 0xb3, 0xd0, 0xd0, 0xb3, 0x80, 0xb1, 0x20, 0x01, 0x23, 0xc5, 0x8f, 0xd9, 0xe8, 0xe8, 0xd9, 0x8f, 0xc5, 0xfd, 0x6c, 0x02, 0x66, 0x4e, 0xe4, 0xea, 0x61, 0x06, 0x06, 0x02, 0x96, 0x07, 0x07, 0x02, 0xa2, 0xfd, 0xd0, 0x07, 0x07, 0x02, 0x30, 0x07, 0x21, 0xfe, 0x04, 0x12, 0x1b, 0x4d, 0x01, 0x08, 0x4d, 0x1b, 0x00, 0x04, 0x00, 0x5f, 0xff, 0xe3, 0x04, 0x2d, 0x05, 0xf0, 0x00, 0x04, 0x00, 0x09, 0x00, 0x11, 0x00, 0x25, 0x00, 0x00, 0x01, 0x06, 0x11, 0x10, 0x17, 0x01, 0x36, 0x11, 0x10, 0x2f, 0x01, 0x26, 0x22, 0x07, 0x11, 0x16, 0x32, 0x37, 0x03, 0x22, 0x27, 0x35, 0x17, 0x16, 0x20, 0x37, 0x11, 0x06, 0x23, 0x22, 0x02, 0x10, 0x12, 0x33, 0x20, 0x12, 0x10, 0x00, 0x01, 0x6f, 0xb6, 0xb6, 0x01, 0xab, 0xb8, 0xb8, 0x5a, 0x34, 0x9a, 0x29, 0x24, 0x9a, 0x39, 0xdc, 0x96, 0x97, 0x1e, 0x8a, 0x01, 0x0c, 0x55, 0x3c, 0x5d, 0xdd, 0xeb, 0xf5, 0xde, 0x01, 0x04, 0xf6, 0xfe, 0xd2, 0x05, 0x63, 0x63, 0xfe, 0xf4, 0xfe, 0xe8, 0x5c, 0xfe, 0x36, 0xb3, 0x01, 0x6f, 0x01, 0xdd, 0x95, 0x32, 0x10, 0x08, 0xfc, 0xde, 0x06, 0x13, 0xfd, 0x74, 0x3c, 0x6a, 0x0c, 0x36, 0x2d, 0x01, 0x9a, 0x16, 0x01, 0x11, 0x01, 0xd1, 0x01, 0x16, 0xfe, 0x73, 0xfd, 0x25, 0xfe, 0x5b, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x79, 0xff, 0xe3, 0x04, 0x1b, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x13, 0x00, 0x00, 0xff, 0xff, 0x00, 0xca, 0x00, 0x00, 0x03, 0xeb, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x14, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0x00, 0x00, 0x03, 0xdd, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x15, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8c, 0xff, 0xe3, 0x04, 0x02, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x16, 0x00, 0x00, 0xff, 0xff, 0x00, 0x5a, 0x00, 0x00, 0x04, 0x2e, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x17, 0x00, 0x00, 0xff, 0xff, 0x00, 0x8e, 0xff, 0xe3, 0x03, 0xf4, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x18, 0x00, 0x00, 0xff, 0xff, 0x00, 0x80, 0xff, 0xe3, 0x04, 0x21, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x19, 0x00, 0x00, 0xff, 0xff, 0x00, 0x97, 0x00, 0x00, 0x03, 0xf8, 0x05, 0xd5, 0x10, 0x06, 0x00, 0x1a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x7d, 0xff, 0xe3, 0x04, 0x17, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x00, 0x74, 0xff, 0xe3, 0x04, 0x14, 0x05, 0xf0, 0x10, 0x06, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x11, 0x23, 0x01, 0x11, 0x21, 0x11, 0x04, 0xa9, 0x7f, 0x7f, 0xfc, 0x0b, 0x08, 0x6a, 0x01, 0x5f, 0x02, 0xc3, 0xfc, 0x24, 0x04, 0xf5, 0xfb, 0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x37, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0xb4, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x46, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x06, 0x78, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x05, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x06, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x07, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x06, 0xe0, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xeb, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbe, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x03, 0x52, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x83, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0xfe, 0x31, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x84, 0x0f, 0x0e, 0x19, 0x14, 0x43, 0x15, 0x16, 0x11, 0x0f, 0x0f, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x18, 0x0f, 0x0f, 0x03, 0xf4, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x06, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2c, 0x00, 0x42, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x83, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x05, 0x4f, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfe, 0xa1, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2c, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x83, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x05, 0x4f, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfe, 0xa1, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x71, 0x00, 0x75, 0x00, 0x79, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x83, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x03, 0x07, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x84, 0x00, 0x88, 0x00, 0x8c, 0x00, 0x90, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x83, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x03, 0x07, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x56, 0x00, 0x6b, 0x00, 0x7f, 0x00, 0x95, 0x00, 0x99, 0x00, 0x9d, 0x00, 0xa1, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x02, 0x83, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x04, 0x5d, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xeb, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbe, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xb4, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0x95, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfc, 0xf4, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x06, 0x78, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfe, 0xd8, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x1f, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x07, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfe, 0xd8, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x1f, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfe, 0xd8, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x1f, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x29, 0x00, 0x3e, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x74, 0x00, 0x89, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x42, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfe, 0xd8, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x1f, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x90, 0x00, 0xa6, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfe, 0xd8, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x1f, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x06, 0xe0, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xeb, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbe, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfe, 0xd8, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfd, 0xe8, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x03, 0x52, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x1f, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0x95, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfc, 0xf4, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x58, 0x00, 0x5c, 0x00, 0x60, 0x00, 0x64, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x04, 0x59, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x8f, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x58, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x05, 0xb3, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xed, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x58, 0x00, 0x6d, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x05, 0xb3, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xed, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x0a, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x83, 0x00, 0x99, 0x00, 0x9d, 0x00, 0xa1, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x03, 0x6b, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x7a, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x83, 0x00, 0x99, 0x00, 0xb0, 0x00, 0xb4, 0x00, 0xb8, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x03, 0x6b, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x7a, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x56, 0x00, 0x6c, 0x00, 0x82, 0x00, 0x97, 0x00, 0xab, 0x00, 0xc1, 0x00, 0xc5, 0x00, 0xc9, 0x00, 0xcd, 0x00, 0x00, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x25, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x21, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x04, 0x00, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0xfe, 0xd7, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xf0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x04, 0xc1, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xeb, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbe, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x01, 0x40, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xf9, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x29, 0x00, 0x3e, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x94, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x41, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xfd, 0x43, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x36, 0x00, 0x4b, 0x00, 0x60, 0x00, 0x75, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x06, 0x78, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x41, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x42, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x90, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x0b, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x90, 0x00, 0xa6, 0x00, 0xbc, 0x00, 0xd2, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x0d, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0xcd, 0x00, 0xe3, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x06, 0xe0, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xeb, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbe, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x03, 0x52, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x08, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x37, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x00, 0x37, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0xb4, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x46, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x90, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x06, 0x78, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x90, 0x00, 0xa6, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x0b, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0xd1, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x90, 0x00, 0xa6, 0x00, 0xbc, 0x00, 0xd2, 0x00, 0xe8, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x00, 0x00, 0x0e, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0xcd, 0x00, 0xe3, 0x00, 0xf9, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x06, 0xe0, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xeb, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x42, 0x14, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbe, 0x42, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfc, 0x6c, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x14, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x41, 0x16, 0x18, 0x0f, 0x0e, 0x03, 0x52, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x02, 0x6d, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x3a, 0x00, 0x50, 0x00, 0x66, 0x00, 0x7c, 0x00, 0x92, 0x00, 0x00, 0x37, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0xb4, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xec, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd3, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x46, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x0a, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x39, 0x00, 0x51, 0x00, 0x67, 0x00, 0x7d, 0x00, 0x93, 0x00, 0xa9, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x06, 0x78, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xec, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd3, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x02, 0xc3, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4f, 0x00, 0x67, 0x00, 0x7d, 0x00, 0x93, 0x00, 0xa9, 0x00, 0xbf, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfd, 0xfe, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xec, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd3, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x02, 0x11, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x64, 0x00, 0x7c, 0x00, 0x92, 0x00, 0xa8, 0x00, 0xbe, 0x00, 0xd4, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x07, 0xd2, 0x20, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x15, 0xfe, 0xec, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xf0, 0x20, 0x16, 0x18, 0x10, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0xfa, 0xa1, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xec, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd3, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0x3f, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x01, 0x09, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x48, 0x19, 0x1a, 0x12, 0x0f, 0x01, 0x08, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0xfc, 0xf6, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x7a, 0x00, 0x92, 0x00, 0xa8, 0x00, 0xbe, 0x00, 0xd4, 0x00, 0xea, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xf9, 0x4e, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xec, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd3, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x9f, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x00, 0x0e, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x91, 0x00, 0xa9, 0x00, 0xbf, 0x00, 0xd5, 0x00, 0xeb, 0x01, 0x01, 0x00, 0x00, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x07, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x05, 0x8a, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0xfe, 0x15, 0x0e, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0e, 0x19, 0x15, 0x20, 0x22, 0x15, 0x17, 0x10, 0x01, 0xce, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x17, 0x10, 0x0f, 0xee, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x41, 0x16, 0x16, 0x11, 0x0e, 0xfa, 0x3c, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xec, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd3, 0x43, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x03, 0xcc, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfd, 0xe9, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xe4, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0xfd, 0xa8, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x0f, 0x00, 0xb4, 0x00, 0x46, 0x09, 0x1e, 0x05, 0x3b, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0xcc, 0x00, 0xe1, 0x00, 0xf6, 0x01, 0x0b, 0x00, 0x00, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x02, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x11, 0x21, 0x11, 0x27, 0x11, 0x21, 0x11, 0x25, 0x11, 0x33, 0x11, 0x01, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x20, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x01, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x03, 0x22, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x00, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x1e, 0x01, 0x07, 0x06, 0x07, 0x06, 0xe0, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x11, 0x0f, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0xfe, 0xea, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0x02, 0x19, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x01, 0x0f, 0x10, 0x18, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0d, 0x0d, 0x0f, 0x19, 0xfd, 0xbd, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x0f, 0x0e, 0x01, 0x0f, 0x0f, 0x18, 0xfa, 0xb3, 0x08, 0x6a, 0x7f, 0xf8, 0x94, 0x03, 0x76, 0x7f, 0xfd, 0xc4, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x21, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0xfe, 0xeb, 0x42, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x01, 0xf8, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x01, 0x0f, 0x0f, 0x19, 0x14, 0x41, 0x16, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0xfd, 0xd2, 0x42, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x15, 0x17, 0x0f, 0x0f, 0x01, 0x10, 0x0e, 0x18, 0x03, 0x52, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x49, 0x17, 0x1a, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x24, 0x24, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfd, 0xde, 0x10, 0x11, 0x1b, 0x18, 0x47, 0x18, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x18, 0x48, 0x18, 0x19, 0x13, 0xfc, 0xe3, 0x04, 0xf5, 0xfb, 0x0b, 0x8d, 0x03, 0xdb, 0xfc, 0x25, 0x8c, 0x02, 0xc3, 0xfd, 0x3d, 0x01, 0xf2, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x49, 0x18, 0x19, 0x13, 0x10, 0xfd, 0xef, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x02, 0x02, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x02, 0x12, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x01, 0x21, 0x11, 0x21, 0x01, 0xb1, 0x02, 0x7c, 0xfc, 0x87, 0x04, 0x76, 0xfb, 0x8a, 0x03, 0x07, 0x8d, 0x8d, 0x04, 0x66, 0xf6, 0xa7, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0xb4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x07, 0x6d, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0x05, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x07, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0x00, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x03, 0x72, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x42, 0x14, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x91, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x33, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x82, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x6b, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x02, 0x02, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x13, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x21, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x69, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x18, 0x48, 0x18, 0x1a, 0x11, 0x10, 0xfb, 0x9c, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2c, 0x00, 0x42, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfe, 0xc4, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x6b, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0xfa, 0x19, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2c, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfe, 0xc4, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x6b, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0xfa, 0x19, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x71, 0x00, 0x75, 0x00, 0x79, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x01, 0x10, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x6b, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0xfc, 0xa3, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x84, 0x00, 0x88, 0x00, 0x8c, 0x00, 0x90, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x01, 0x10, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x6b, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0xfc, 0xa3, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x0a, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x56, 0x00, 0x6b, 0x00, 0x7f, 0x00, 0x95, 0x00, 0x99, 0x00, 0x9d, 0x00, 0xa1, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xa2, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x42, 0x14, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x05, 0x6b, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0xfb, 0x26, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x33, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x82, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfd, 0x42, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x93, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x1c, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x01, 0x05, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x01, 0x49, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x07, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x1c, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x01, 0x49, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x08, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x1c, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x01, 0x49, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x1c, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x01, 0x49, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x90, 0x00, 0xa6, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x1c, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x01, 0x49, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x0b, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0x00, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x02, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0x72, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x42, 0x14, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x1c, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x91, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x33, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x82, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x01, 0x49, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x02, 0x53, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfd, 0x42, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x93, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x07, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x58, 0x00, 0x5c, 0x00, 0x60, 0x00, 0x64, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x81, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfb, 0x2b, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x58, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x22, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xf9, 0xaa, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x58, 0x00, 0x6d, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0x8f, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x22, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xf9, 0xaa, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x83, 0x00, 0x99, 0x00, 0x9d, 0x00, 0xa1, 0x00, 0xa5, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x6e, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x34, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x0b, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6d, 0x00, 0x83, 0x00, 0x99, 0x00, 0xb0, 0x00, 0xb4, 0x00, 0xb8, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x6e, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfc, 0x34, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x56, 0x00, 0x6c, 0x00, 0x82, 0x00, 0x97, 0x00, 0xab, 0x00, 0xc1, 0x00, 0xc5, 0x00, 0xc9, 0x00, 0xcd, 0x00, 0x00, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x95, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0xe1, 0x0e, 0x0f, 0x18, 0x14, 0x43, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x42, 0x15, 0x17, 0x10, 0x0e, 0xee, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x42, 0x14, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x03, 0xc3, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x01, 0x4a, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x10, 0x1b, 0x17, 0x4a, 0x17, 0x19, 0x13, 0x10, 0x10, 0x11, 0x1b, 0x17, 0xfa, 0xb7, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x33, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x82, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x07, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x29, 0x00, 0x3e, 0x00, 0x53, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x06, 0x74, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x03, 0x0b, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x21, 0x00, 0x36, 0x00, 0x4b, 0x00, 0x60, 0x00, 0x75, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x42, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0x01, 0x05, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x90, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x0a, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x29, 0x00, 0x3e, 0x00, 0x53, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x71, 0x00, 0x75, 0x00, 0x8a, 0x00, 0x9f, 0x00, 0xb4, 0x00, 0xc9, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x42, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0xcd, 0x00, 0xe3, 0x00, 0x00, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x72, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x42, 0x14, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0x91, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x33, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x82, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x21, 0x00, 0x37, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x00, 0x13, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0xb4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x07, 0x6d, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x38, 0x00, 0x4e, 0x00, 0x64, 0x00, 0x7a, 0x00, 0x90, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x01, 0x05, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x0a, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x4c, 0x00, 0x61, 0x00, 0x76, 0x00, 0x8b, 0x00, 0xa0, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x42, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x0b, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x79, 0x00, 0x8f, 0x00, 0xa5, 0x00, 0xbb, 0x00, 0xd1, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x6e, 0x00, 0x72, 0x00, 0x76, 0x00, 0x7a, 0x00, 0x90, 0x00, 0xa6, 0x00, 0xbc, 0x00, 0xd2, 0x00, 0xe8, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x0e, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0xcd, 0x00, 0xe3, 0x00, 0xf9, 0x00, 0x00, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x72, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x42, 0x14, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x02, 0x2f, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0x91, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x33, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x4a, 0x16, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x82, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x03, 0xfa, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x4a, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x19, 0x1a, 0x11, 0x10, 0x00, 0x00, 0x00, 0x09, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x22, 0x00, 0x3a, 0x00, 0x50, 0x00, 0x66, 0x00, 0x7c, 0x00, 0x92, 0x00, 0x00, 0x13, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0xb4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x42, 0x15, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x07, 0x6d, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x33, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6b, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x39, 0x00, 0x51, 0x00, 0x67, 0x00, 0x7d, 0x00, 0x93, 0x00, 0xa9, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x02, 0xf1, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x21, 0x21, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x42, 0x15, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x01, 0x05, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x33, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6b, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x4f, 0x00, 0x67, 0x00, 0x7d, 0x00, 0x93, 0x00, 0xa9, 0x00, 0xbf, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x01, 0xdc, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x42, 0x15, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x02, 0x3b, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x33, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6b, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x16, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x64, 0x00, 0x7c, 0x00, 0x92, 0x00, 0xa8, 0x00, 0xbe, 0x00, 0xd4, 0x00, 0x00, 0x05, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x13, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x94, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0xef, 0x0d, 0x0f, 0x19, 0x14, 0x43, 0x15, 0x17, 0x10, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x41, 0x16, 0x18, 0x10, 0x0d, 0xed, 0x0f, 0x0f, 0x19, 0x15, 0x41, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0f, 0xfd, 0x44, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x42, 0x15, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x32, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x2e, 0x24, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x05, 0xf8, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x33, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6b, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x00, 0x0d, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x2b, 0x00, 0x41, 0x00, 0x57, 0x00, 0x5b, 0x00, 0x5f, 0x00, 0x63, 0x00, 0x7a, 0x00, 0x92, 0x00, 0xa8, 0x00, 0xbe, 0x00, 0xd4, 0x00, 0xea, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x43, 0x14, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfc, 0xf6, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x42, 0x15, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x20, 0x21, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x07, 0x71, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x24, 0x25, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x33, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6b, 0x4a, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x0e, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x29, 0x00, 0x3e, 0x00, 0x53, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x71, 0x00, 0x75, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb6, 0x00, 0xcb, 0x00, 0xe0, 0x00, 0xf5, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x00, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x12, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x01, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x03, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x34, 0x37, 0x36, 0x37, 0x36, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x03, 0xe0, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xfe, 0x1f, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x0f, 0x19, 0x14, 0x22, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x02, 0x18, 0x20, 0x16, 0x17, 0x0f, 0x0f, 0x0f, 0x0e, 0x18, 0x15, 0x42, 0x15, 0x17, 0x11, 0x0e, 0x0e, 0x10, 0x18, 0x14, 0xcd, 0x21, 0x14, 0x18, 0x10, 0x0e, 0x0e, 0x0e, 0x1a, 0x14, 0x42, 0x16, 0x16, 0x10, 0x0f, 0x0f, 0x0f, 0x17, 0x16, 0xfd, 0xe4, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x02, 0x0e, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0xfd, 0xee, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x02, 0x22, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0xfd, 0xfe, 0x10, 0x11, 0x1b, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x01, 0x09, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x18, 0x1a, 0x11, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x49, 0x18, 0x19, 0x12, 0x10, 0x06, 0x68, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x34, 0x49, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6c, 0x49, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xb4, 0xfe, 0x14, 0x05, 0x2b, 0x07, 0x6d, 0x00, 0x14, 0x00, 0x2a, 0x00, 0x40, 0x00, 0x55, 0x00, 0x69, 0x00, 0x7f, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0xa1, 0x00, 0xb7, 0x00, 0xcc, 0x00, 0xe1, 0x00, 0xf6, 0x01, 0x0b, 0x00, 0x00, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x24, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x21, 0x11, 0x21, 0x37, 0x21, 0x11, 0x21, 0x13, 0x21, 0x15, 0x21, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x10, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x01, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x25, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x17, 0x16, 0x17, 0x16, 0x14, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x26, 0x27, 0x26, 0x00, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x03, 0x72, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x17, 0x11, 0x0d, 0x0d, 0x10, 0x18, 0x15, 0x41, 0x15, 0x17, 0x12, 0x0e, 0xfe, 0x24, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x15, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x20, 0x20, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfe, 0x15, 0x0e, 0x10, 0x18, 0x16, 0x3f, 0x16, 0x17, 0x12, 0x0e, 0x0e, 0x10, 0x19, 0x15, 0x40, 0x16, 0x18, 0x10, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x21, 0x20, 0x16, 0x17, 0x10, 0x0e, 0x0e, 0x0f, 0x18, 0x16, 0x41, 0x15, 0x17, 0x11, 0xfd, 0x33, 0x04, 0x76, 0xfb, 0x8a, 0x7f, 0x03, 0x78, 0xfc, 0x88, 0x7e, 0x02, 0x7c, 0xfd, 0x84, 0x01, 0xc0, 0x0f, 0x0f, 0x18, 0x15, 0x21, 0x21, 0x15, 0x17, 0x10, 0x0e, 0x0e, 0x10, 0x17, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0f, 0xfe, 0x24, 0x0e, 0x10, 0x17, 0x15, 0x22, 0x20, 0x15, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x01, 0xcf, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x0e, 0xfe, 0x23, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x18, 0x10, 0x0e, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x01, 0xdd, 0x0e, 0x10, 0x18, 0x15, 0x41, 0x16, 0x16, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x16, 0x40, 0x16, 0x17, 0x11, 0x91, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x13, 0x10, 0x10, 0x11, 0x1c, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x01, 0x34, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0xfd, 0xab, 0x49, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x17, 0x49, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x0f, 0x0f, 0x11, 0x1b, 0x02, 0x83, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x17, 0x26, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x11, 0x1a, 0x05, 0xe4, 0xf6, 0xa7, 0x8d, 0x08, 0x3f, 0xfc, 0x27, 0x8d, 0x02, 0x7c, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x10, 0x1c, 0x17, 0x49, 0x18, 0x19, 0x12, 0x10, 0x10, 0x11, 0x1a, 0x18, 0x01, 0x34, 0x49, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0xfd, 0xd0, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x12, 0x10, 0x01, 0x11, 0x11, 0x1b, 0x17, 0x48, 0x18, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x02, 0x6c, 0x49, 0x17, 0x1a, 0x12, 0x10, 0x10, 0x11, 0x1b, 0x17, 0x25, 0x24, 0x17, 0x1a, 0x11, 0x10, 0x01, 0x11, 0x10, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x11, 0x21, 0x11, 0x01, 0x8c, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x0e, 0x03, 0xda, 0x06, 0xf5, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf7, 0xd3, 0x07, 0x01, 0xf8, 0xff, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x33, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x03, 0x33, 0x03, 0x33, 0x01, 0x23, 0x27, 0x21, 0x07, 0x23, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x10, 0x78, 0xf1, 0xbd, 0x8a, 0x01, 0x04, 0x77, 0x3d, 0xfe, 0xd7, 0x3d, 0x77, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xac, 0xfe, 0x55, 0x02, 0x0f, 0xfc, 0xbc, 0xda, 0xda, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x49, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x21, 0x15, 0x21, 0x35, 0x36, 0x37, 0x00, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x01, 0x06, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x75, 0x01, 0x7d, 0xfd, 0xe6, 0x1f, 0x38, 0x01, 0x36, 0x5e, 0x4c, 0x2f, 0x6e, 0x41, 0x46, 0x77, 0x34, 0x82, 0x9d, 0xfe, 0xd6, 0x33, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfc, 0x3f, 0x72, 0x6e, 0x1f, 0x38, 0x01, 0x31, 0x5e, 0x42, 0x51, 0x23, 0x23, 0x7b, 0x1c, 0x1c, 0x84, 0x6c, 0x8b, 0xfe, 0xe4, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x59, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x57, 0x53, 0x5b, 0xab, 0x9f, 0x33, 0x71, 0x3f, 0x2f, 0x6b, 0x3c, 0x62, 0x6c, 0x64, 0x61, 0x4d, 0x54, 0x55, 0x57, 0x5a, 0x55, 0x24, 0x5c, 0x49, 0x42, 0x73, 0x31, 0x82, 0x98, 0x51, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x91, 0x12, 0x6d, 0x52, 0x7c, 0x86, 0x15, 0x14, 0x79, 0x1b, 0x1a, 0x4f, 0x46, 0x4a, 0x4c, 0x6c, 0x3f, 0x3c, 0x3a, 0x3d, 0x12, 0x17, 0x73, 0x11, 0x12, 0x76, 0x63, 0x45, 0x60, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x33, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x09, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x4d, 0xfe, 0xe9, 0x01, 0x17, 0x14, 0x95, 0x7a, 0x7a, 0x81, 0xfe, 0x8b, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0x97, 0xfe, 0x5d, 0x02, 0x1c, 0xfd, 0xe4, 0x6d, 0xba, 0xba, 0x79, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x51, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x21, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xfc, 0x01, 0xcb, 0xfe, 0xa0, 0x19, 0x1a, 0x1a, 0x19, 0x91, 0x54, 0x55, 0x57, 0x57, 0x9e, 0x36, 0x72, 0x3b, 0x33, 0x38, 0x38, 0x3e, 0x64, 0x75, 0x75, 0x64, 0x2f, 0x5d, 0x31, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x5f, 0xcc, 0x09, 0x04, 0x04, 0x4d, 0x4c, 0x83, 0x87, 0x4b, 0x4a, 0x12, 0x12, 0x71, 0x1b, 0x0e, 0x0d, 0x66, 0xae, 0x66, 0x14, 0x15, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x40, 0x00, 0x60, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x0d, 0x4f, 0x2e, 0x2e, 0x2e, 0x2e, 0x4f, 0x4e, 0x2e, 0x2e, 0x2e, 0x2e, 0x9a, 0x2c, 0x2d, 0x2d, 0x2c, 0x73, 0x3e, 0x3d, 0x09, 0x22, 0x34, 0x34, 0x3d, 0x83, 0x4b, 0x4c, 0x4f, 0x4f, 0x82, 0x97, 0x9e, 0x61, 0x61, 0xa4, 0x2c, 0x2d, 0x2d, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x9e, 0x34, 0x35, 0x5b, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5b, 0x35, 0x34, 0x01, 0x62, 0x67, 0x14, 0x0a, 0x0b, 0x4b, 0x4c, 0x99, 0x31, 0x1a, 0x1a, 0x4c, 0x4d, 0x84, 0x7f, 0x4f, 0x4e, 0xde, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x37, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x02, 0x2b, 0xfe, 0xc7, 0x7a, 0x01, 0x27, 0xfe, 0x61, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x30, 0xfc, 0xed, 0x02, 0xe4, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3d, 0x00, 0x5b, 0x00, 0x6a, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x55, 0xa8, 0x2f, 0x30, 0x5f, 0x54, 0x53, 0x30, 0x30, 0x30, 0xf8, 0x4c, 0x29, 0x2a, 0x93, 0x01, 0x02, 0x4a, 0x48, 0x29, 0x2a, 0x4b, 0x51, 0x32, 0x30, 0x4c, 0x4e, 0x8e, 0x8f, 0x4d, 0x4d, 0x30, 0x30, 0x29, 0x2a, 0x29, 0x4d, 0x49, 0x2c, 0x2b, 0x2b, 0x2a, 0x96, 0x2b, 0x2a, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x5b, 0x2c, 0x2b, 0x4b, 0x4c, 0x56, 0x2c, 0x2b, 0x96, 0x2b, 0x5d, 0x12, 0x31, 0x32, 0x48, 0x64, 0x74, 0x3a, 0x3a, 0x64, 0x4a, 0x30, 0x31, 0x12, 0x12, 0x3a, 0x37, 0x50, 0x79, 0x41, 0x41, 0x41, 0x41, 0x79, 0x4e, 0x39, 0x38, 0xc6, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x41, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x50, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x10, 0x2c, 0x2d, 0x2d, 0x2b, 0x74, 0x3d, 0x3d, 0x09, 0x20, 0x36, 0x33, 0x3e, 0x82, 0x97, 0x4e, 0x50, 0x82, 0x96, 0x4f, 0x4f, 0x60, 0x62, 0xa4, 0x2c, 0x2d, 0x2d, 0xb8, 0x4f, 0x5c, 0x2e, 0x2e, 0x4f, 0x4c, 0x30, 0x2f, 0x2f, 0x2e, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xdf, 0x67, 0x14, 0x0b, 0x0a, 0x4b, 0x4b, 0x9a, 0x2f, 0x1b, 0x1a, 0x98, 0x84, 0x81, 0x4d, 0x4e, 0x6f, 0x6f, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x01, 0x72, 0x68, 0x5c, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5c, 0x34, 0x34, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3e, 0x00, 0x4a, 0x00, 0x51, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x03, 0x86, 0x80, 0x2d, 0x2e, 0x2e, 0x2d, 0x80, 0x2d, 0x2e, 0x2e, 0x6d, 0x76, 0x99, 0x99, 0x76, 0x92, 0x7e, 0x7e, 0xfe, 0x9c, 0x78, 0x7e, 0x7b, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xc8, 0x56, 0x56, 0xac, 0xad, 0x56, 0x56, 0x56, 0x56, 0xad, 0xac, 0x56, 0xaf, 0xde, 0xd3, 0xd4, 0xde, 0xde, 0xd4, 0xd3, 0xde, 0xfc, 0xac, 0x02, 0xd1, 0x29, 0x74, 0x27, 0xfc, 0xbd, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x05, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x87, 0x72, 0x3b, 0x39, 0x81, 0x2c, 0x24, 0x4c, 0x3f, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfd, 0xdc, 0x95, 0x46, 0x45, 0x60, 0x54, 0x6c, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0xe9, 0x2c, 0x5b, 0x33, 0xa3, 0xb4, 0xb5, 0xa2, 0x33, 0x5c, 0x2b, 0x2a, 0x5f, 0x31, 0x70, 0x6f, 0x6e, 0x71, 0x31, 0x60, 0x29, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xeb, 0x17, 0x16, 0xe3, 0xce, 0xcd, 0xe5, 0x17, 0x17, 0x74, 0x22, 0x24, 0xaa, 0xac, 0xab, 0xab, 0x24, 0x22, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x34, 0x00, 0x40, 0x00, 0x4c, 0x00, 0x00, 0x01, 0x22, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x12, 0x10, 0x26, 0x23, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x05, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x02, 0xaf, 0x04, 0x0f, 0x05, 0x8e, 0x8b, 0x8c, 0x8e, 0x8f, 0x8d, 0x4e, 0x4f, 0x71, 0x55, 0x09, 0x4c, 0x58, 0x56, 0x4d, 0x4d, 0x56, 0x58, 0x01, 0x6b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x03, 0x2c, 0x01, 0xd7, 0xda, 0xdb, 0xd7, 0xd7, 0xdb, 0xa5, 0xc9, 0x28, 0x6a, 0x38, 0x01, 0x80, 0x01, 0x70, 0x9e, 0x9e, 0xfe, 0x90, 0x9e, 0x6e, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x16, 0x00, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x23, 0x14, 0x17, 0x23, 0x36, 0x35, 0x23, 0x06, 0x23, 0x22, 0x35, 0x34, 0x37, 0x36, 0x00, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x04, 0x5b, 0x3b, 0x01, 0x1b, 0x08, 0x19, 0xb0, 0x61, 0x3c, 0x1b, 0x36, 0x89, 0x35, 0x1b, 0x3c, 0x61, 0xaf, 0x18, 0x08, 0x01, 0x1c, 0xfd, 0x6b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x72, 0x01, 0x46, 0x94, 0xfe, 0x91, 0x01, 0x8c, 0x96, 0xfe, 0x9f, 0x72, 0x03, 0x18, 0x79, 0xfe, 0x7e, 0x26, 0x25, 0x4e, 0xe4, 0x9b, 0xcc, 0x6b, 0x6b, 0xcc, 0x9b, 0xe4, 0x4e, 0x25, 0x26, 0x01, 0x82, 0x04, 0x56, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfe, 0x9f, 0x01, 0x61, 0xfe, 0x7a, 0xfe, 0x42, 0x01, 0x93, 0xfe, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x30, 0x00, 0x38, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x03, 0x33, 0x03, 0x33, 0x01, 0x23, 0x27, 0x21, 0x07, 0x23, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x10, 0x78, 0xf1, 0xbd, 0x8a, 0x01, 0x04, 0x77, 0x3d, 0xfe, 0xd7, 0x3d, 0x77, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xac, 0xfe, 0x55, 0x02, 0x0f, 0xfc, 0xbc, 0xda, 0xda, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x46, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x21, 0x15, 0x21, 0x35, 0x36, 0x37, 0x00, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x01, 0x06, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x75, 0x01, 0x7d, 0xfd, 0xe6, 0x1f, 0x38, 0x01, 0x36, 0x5e, 0x4c, 0x2f, 0x6e, 0x41, 0x46, 0x77, 0x34, 0x82, 0x9d, 0xfe, 0xd6, 0x33, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfc, 0x3f, 0x72, 0x6e, 0x1f, 0x38, 0x01, 0x31, 0x5e, 0x42, 0x51, 0x23, 0x23, 0x7b, 0x1c, 0x1c, 0x84, 0x6c, 0x8b, 0xfe, 0xe4, 0x30, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x56, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x57, 0x53, 0x5b, 0xab, 0x9f, 0x33, 0x71, 0x3f, 0x2f, 0x6b, 0x3c, 0x62, 0x6c, 0x64, 0x61, 0x4d, 0x54, 0x55, 0x57, 0x5a, 0x55, 0x24, 0x5c, 0x49, 0x42, 0x73, 0x31, 0x82, 0x98, 0x51, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x91, 0x12, 0x6d, 0x52, 0x7c, 0x86, 0x15, 0x14, 0x79, 0x1b, 0x1a, 0x4f, 0x46, 0x4a, 0x4c, 0x6c, 0x3f, 0x3c, 0x3a, 0x3d, 0x12, 0x17, 0x73, 0x11, 0x12, 0x76, 0x63, 0x45, 0x60, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x30, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x09, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x4d, 0xfe, 0xe9, 0x01, 0x17, 0x14, 0x95, 0x7a, 0x7a, 0x81, 0xfe, 0x8b, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0x97, 0xfe, 0x5d, 0x02, 0x1c, 0xfd, 0xe4, 0x6d, 0xba, 0xba, 0x79, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x21, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xfc, 0x01, 0xcb, 0xfe, 0xa0, 0x19, 0x1a, 0x1a, 0x19, 0x91, 0x54, 0x55, 0x57, 0x57, 0x9e, 0x36, 0x72, 0x3b, 0x33, 0x38, 0x38, 0x3e, 0x64, 0x75, 0x75, 0x64, 0x2f, 0x5d, 0x31, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x5f, 0xcc, 0x09, 0x04, 0x04, 0x4d, 0x4c, 0x83, 0x87, 0x4b, 0x4a, 0x12, 0x12, 0x71, 0x1b, 0x0e, 0x0d, 0x66, 0xae, 0x66, 0x14, 0x15, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3d, 0x00, 0x5d, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x0d, 0x4f, 0x2e, 0x2e, 0x2e, 0x2e, 0x4f, 0x4e, 0x2e, 0x2e, 0x2e, 0x2e, 0x9a, 0x2c, 0x2d, 0x2d, 0x2c, 0x73, 0x3e, 0x3d, 0x09, 0x22, 0x34, 0x34, 0x3d, 0x83, 0x4b, 0x4c, 0x4f, 0x4f, 0x82, 0x97, 0x9e, 0x61, 0x61, 0xa4, 0x2c, 0x2d, 0x2d, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x9e, 0x34, 0x35, 0x5b, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5b, 0x35, 0x34, 0x01, 0x62, 0x67, 0x14, 0x0a, 0x0b, 0x4b, 0x4c, 0x99, 0x31, 0x1a, 0x1a, 0x4c, 0x4d, 0x84, 0x7f, 0x4f, 0x4e, 0xde, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x34, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x02, 0x2b, 0xfe, 0xc7, 0x7a, 0x01, 0x27, 0xfe, 0x61, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x30, 0xfc, 0xed, 0x02, 0xe4, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3a, 0x00, 0x58, 0x00, 0x67, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x55, 0xa8, 0x2f, 0x30, 0x5f, 0x54, 0x53, 0x30, 0x30, 0x30, 0xf8, 0x4c, 0x29, 0x2a, 0x93, 0x01, 0x02, 0x4a, 0x48, 0x29, 0x2a, 0x4b, 0x51, 0x32, 0x30, 0x4c, 0x4e, 0x8e, 0x8f, 0x4d, 0x4d, 0x30, 0x30, 0x29, 0x2a, 0x29, 0x4d, 0x49, 0x2c, 0x2b, 0x2b, 0x2a, 0x96, 0x2b, 0x2a, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x5b, 0x2c, 0x2b, 0x4b, 0x4c, 0x56, 0x2c, 0x2b, 0x96, 0x2b, 0x5d, 0x12, 0x31, 0x32, 0x48, 0x64, 0x74, 0x3a, 0x3a, 0x64, 0x4a, 0x30, 0x31, 0x12, 0x12, 0x3a, 0x37, 0x50, 0x79, 0x41, 0x41, 0x41, 0x41, 0x79, 0x4e, 0x39, 0x38, 0xc6, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x41, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x4d, 0x00, 0x5c, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x10, 0x2c, 0x2d, 0x2d, 0x2b, 0x74, 0x3d, 0x3d, 0x09, 0x20, 0x36, 0x33, 0x3e, 0x82, 0x97, 0x4e, 0x50, 0x82, 0x96, 0x4f, 0x4f, 0x60, 0x62, 0xa4, 0x2c, 0x2d, 0x2d, 0xb8, 0x4f, 0x5c, 0x2e, 0x2e, 0x4f, 0x4c, 0x30, 0x2f, 0x2f, 0x2e, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xdf, 0x67, 0x14, 0x0b, 0x0a, 0x4b, 0x4b, 0x9a, 0x2f, 0x1b, 0x1a, 0x98, 0x84, 0x81, 0x4d, 0x4e, 0x6f, 0x6f, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x01, 0x72, 0x68, 0x5c, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5c, 0x34, 0x34, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3b, 0x00, 0x47, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x03, 0x86, 0x80, 0x2d, 0x2e, 0x2e, 0x2d, 0x80, 0x2d, 0x2e, 0x2e, 0x6d, 0x76, 0x99, 0x99, 0x76, 0x92, 0x7e, 0x7e, 0xfe, 0x9c, 0x78, 0x7e, 0x7b, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xc8, 0x56, 0x56, 0xac, 0xad, 0x56, 0x56, 0x56, 0x56, 0xad, 0xac, 0x56, 0xaf, 0xde, 0xd3, 0xd4, 0xde, 0xde, 0xd4, 0xd3, 0xde, 0xfc, 0xac, 0x02, 0xd1, 0x29, 0x74, 0x27, 0xfc, 0xbd, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x05, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x87, 0x72, 0x3b, 0x39, 0x81, 0x2c, 0x24, 0x4c, 0x3f, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfd, 0xdc, 0x95, 0x46, 0x45, 0x60, 0x54, 0x6c, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x47, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0xe9, 0x2c, 0x5b, 0x33, 0xa3, 0xb4, 0xb5, 0xa2, 0x33, 0x5c, 0x2b, 0x2a, 0x5f, 0x31, 0x70, 0x6f, 0x6e, 0x71, 0x31, 0x60, 0x29, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xeb, 0x17, 0x16, 0xe3, 0xce, 0xcd, 0xe5, 0x17, 0x17, 0x74, 0x22, 0x24, 0xaa, 0xac, 0xab, 0xab, 0x24, 0x22, 0x00, 0x00, 0x05, 0x00, 0xc3, 0xfe, 0x14, 0x06, 0xb9, 0x07, 0x6d, 0x00, 0x11, 0x00, 0x1b, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x49, 0x00, 0x00, 0x01, 0x22, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x12, 0x10, 0x26, 0x23, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x02, 0xaf, 0x04, 0x0f, 0x05, 0x8e, 0x8b, 0x8c, 0x8e, 0x8f, 0x8d, 0x4e, 0x4f, 0x71, 0x55, 0x09, 0x4c, 0x58, 0x56, 0x4d, 0x4d, 0x56, 0x58, 0x01, 0x61, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x5e, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x03, 0x2c, 0x01, 0xd7, 0xda, 0xdb, 0xd7, 0xd7, 0xdb, 0xa5, 0xc9, 0x28, 0x6a, 0x38, 0x01, 0x80, 0x01, 0x70, 0x9e, 0x9e, 0xfe, 0x90, 0x9e, 0xfe, 0x30, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x38, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x09, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x04, 0x51, 0x14, 0x31, 0x38, 0x4c, 0x7d, 0x38, 0x11, 0x71, 0xfe, 0xe4, 0xfe, 0xe0, 0x71, 0x12, 0x38, 0x7c, 0x4e, 0x36, 0x31, 0xfd, 0x4f, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x72, 0x01, 0x46, 0x94, 0xfe, 0x91, 0x01, 0x8c, 0x96, 0xfe, 0x9f, 0x72, 0x01, 0xb6, 0x76, 0x3e, 0x47, 0x95, 0x2d, 0x3b, 0x9e, 0x9f, 0xfe, 0x6e, 0x01, 0x92, 0x9d, 0xa0, 0x3b, 0x2d, 0x95, 0x47, 0x41, 0x04, 0xcc, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfe, 0x9f, 0x01, 0x61, 0xfe, 0x7a, 0xfe, 0x42, 0x01, 0x93, 0xfe, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x29, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x03, 0x33, 0x03, 0x33, 0x01, 0x23, 0x27, 0x21, 0x07, 0x23, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x10, 0x78, 0xf1, 0xbd, 0x8a, 0x01, 0x04, 0x77, 0x3d, 0xfe, 0xd7, 0x3d, 0x77, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xac, 0xfe, 0x55, 0x02, 0x0f, 0xfc, 0xbc, 0xda, 0xda, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x37, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x21, 0x15, 0x21, 0x35, 0x36, 0x37, 0x00, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x01, 0x06, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x75, 0x01, 0x7d, 0xfd, 0xe6, 0x1f, 0x38, 0x01, 0x36, 0x5e, 0x4c, 0x2f, 0x6e, 0x41, 0x46, 0x77, 0x34, 0x82, 0x9d, 0xfe, 0xd6, 0x33, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfc, 0x3f, 0x72, 0x6e, 0x1f, 0x38, 0x01, 0x31, 0x5e, 0x42, 0x51, 0x23, 0x23, 0x7b, 0x1c, 0x1c, 0x84, 0x6c, 0x8b, 0xfe, 0xe4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x47, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x57, 0x53, 0x5b, 0xab, 0x9f, 0x33, 0x71, 0x3f, 0x2f, 0x6b, 0x3c, 0x62, 0x6c, 0x64, 0x61, 0x4d, 0x54, 0x55, 0x57, 0x5a, 0x55, 0x24, 0x5c, 0x49, 0x42, 0x73, 0x31, 0x82, 0x98, 0x51, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x91, 0x12, 0x6d, 0x52, 0x7c, 0x86, 0x15, 0x14, 0x79, 0x1b, 0x1a, 0x4f, 0x46, 0x4a, 0x4c, 0x6c, 0x3f, 0x3c, 0x3a, 0x3d, 0x12, 0x17, 0x73, 0x11, 0x12, 0x76, 0x63, 0x45, 0x60, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x21, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x09, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x4d, 0xfe, 0xe9, 0x01, 0x17, 0x14, 0x95, 0x7a, 0x7a, 0x81, 0xfe, 0x8b, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0x97, 0xfe, 0x5d, 0x02, 0x1c, 0xfd, 0xe4, 0x6d, 0xba, 0xba, 0x79, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x21, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xfc, 0x01, 0xcb, 0xfe, 0xa0, 0x19, 0x1a, 0x1a, 0x19, 0x91, 0x54, 0x55, 0x57, 0x57, 0x9e, 0x36, 0x72, 0x3b, 0x33, 0x38, 0x38, 0x3e, 0x64, 0x75, 0x75, 0x64, 0x2f, 0x5d, 0x31, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x5f, 0xcc, 0x09, 0x04, 0x04, 0x4d, 0x4c, 0x83, 0x87, 0x4b, 0x4a, 0x12, 0x12, 0x71, 0x1b, 0x0e, 0x0d, 0x66, 0xae, 0x66, 0x14, 0x15, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x2e, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x0d, 0x4f, 0x2e, 0x2e, 0x2e, 0x2e, 0x4f, 0x4e, 0x2e, 0x2e, 0x2e, 0x2e, 0x9a, 0x2c, 0x2d, 0x2d, 0x2c, 0x73, 0x3e, 0x3d, 0x09, 0x22, 0x34, 0x34, 0x3d, 0x83, 0x4b, 0x4c, 0x4f, 0x4f, 0x82, 0x97, 0x9e, 0x61, 0x61, 0xa4, 0x2c, 0x2d, 0x2d, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x9e, 0x34, 0x35, 0x5b, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5b, 0x35, 0x34, 0x01, 0x62, 0x67, 0x14, 0x0a, 0x0b, 0x4b, 0x4c, 0x99, 0x31, 0x1a, 0x1a, 0x4c, 0x4d, 0x84, 0x7f, 0x4f, 0x4e, 0xde, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x02, 0x2b, 0xfe, 0xc7, 0x7a, 0x01, 0x27, 0xfe, 0x61, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x30, 0xfc, 0xed, 0x02, 0xe4, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x2b, 0x00, 0x49, 0x00, 0x58, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x55, 0xa8, 0x2f, 0x30, 0x5f, 0x54, 0x53, 0x30, 0x30, 0x30, 0xf8, 0x4c, 0x29, 0x2a, 0x93, 0x01, 0x02, 0x4a, 0x48, 0x29, 0x2a, 0x4b, 0x51, 0x32, 0x30, 0x4c, 0x4e, 0x8e, 0x8f, 0x4d, 0x4d, 0x30, 0x30, 0x29, 0x2a, 0x29, 0x4d, 0x49, 0x2c, 0x2b, 0x2b, 0x2a, 0x96, 0x2b, 0x2a, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x5b, 0x2c, 0x2b, 0x4b, 0x4c, 0x56, 0x2c, 0x2b, 0x96, 0x2b, 0x5d, 0x12, 0x31, 0x32, 0x48, 0x64, 0x74, 0x3a, 0x3a, 0x64, 0x4a, 0x30, 0x31, 0x12, 0x12, 0x3a, 0x37, 0x50, 0x79, 0x41, 0x41, 0x41, 0x41, 0x79, 0x4e, 0x39, 0x38, 0xc6, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x41, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x3e, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x10, 0x2c, 0x2d, 0x2d, 0x2b, 0x74, 0x3d, 0x3d, 0x09, 0x20, 0x36, 0x33, 0x3e, 0x82, 0x97, 0x4e, 0x50, 0x82, 0x96, 0x4f, 0x4f, 0x60, 0x62, 0xa4, 0x2c, 0x2d, 0x2d, 0xb8, 0x4f, 0x5c, 0x2e, 0x2e, 0x4f, 0x4c, 0x30, 0x2f, 0x2f, 0x2e, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xdf, 0x67, 0x14, 0x0b, 0x0a, 0x4b, 0x4b, 0x9a, 0x2f, 0x1b, 0x1a, 0x98, 0x84, 0x81, 0x4d, 0x4e, 0x6f, 0x6f, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x01, 0x72, 0x68, 0x5c, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5c, 0x34, 0x34, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x03, 0x86, 0x80, 0x2d, 0x2e, 0x2e, 0x2d, 0x80, 0x2d, 0x2e, 0x2e, 0x6d, 0x76, 0x99, 0x99, 0x76, 0x92, 0x7e, 0x7e, 0xfe, 0x9c, 0x78, 0x7e, 0x7b, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xc8, 0x56, 0x56, 0xac, 0xad, 0x56, 0x56, 0x56, 0x56, 0xad, 0xac, 0x56, 0xaf, 0xde, 0xd3, 0xd4, 0xde, 0xde, 0xd4, 0xd3, 0xde, 0xfc, 0xac, 0x02, 0xd1, 0x29, 0x74, 0x27, 0xfc, 0xbd, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x05, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x87, 0x72, 0x3b, 0x39, 0x81, 0x2c, 0x24, 0x4c, 0x3f, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfd, 0xdc, 0x95, 0x46, 0x45, 0x60, 0x54, 0x6c, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x38, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0xe9, 0x2c, 0x5b, 0x33, 0xa3, 0xb4, 0xb5, 0xa2, 0x33, 0x5c, 0x2b, 0x2a, 0x5f, 0x31, 0x70, 0x6f, 0x6e, 0x71, 0x31, 0x60, 0x29, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xeb, 0x17, 0x16, 0xe3, 0xce, 0xcd, 0xe5, 0x17, 0x17, 0x74, 0x22, 0x24, 0xaa, 0xac, 0xab, 0xab, 0x24, 0x22, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x18, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x03, 0x22, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x12, 0x10, 0x26, 0x23, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0x2f, 0x04, 0x0f, 0x05, 0x8e, 0x8b, 0x8c, 0x8e, 0x8f, 0x8d, 0x4e, 0x4f, 0x71, 0x55, 0x09, 0x4c, 0x58, 0x56, 0x4d, 0x4d, 0x56, 0x58, 0xfe, 0x9c, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x02, 0x41, 0x01, 0xd7, 0xda, 0xdb, 0xd7, 0xd7, 0xdb, 0xa5, 0xc9, 0x28, 0x6a, 0x38, 0x01, 0x80, 0x01, 0x70, 0x9e, 0x9e, 0xfe, 0x90, 0x9e, 0x03, 0x6f, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x06, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x29, 0x00, 0x00, 0x01, 0x30, 0x09, 0x01, 0x30, 0x01, 0x30, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x04, 0x4f, 0x01, 0x70, 0xfe, 0x90, 0xfe, 0x8f, 0xfe, 0xae, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x72, 0x01, 0x46, 0x94, 0xfe, 0x91, 0x01, 0x8c, 0x96, 0xfe, 0x9f, 0x72, 0x02, 0xf9, 0xfd, 0xf2, 0xfd, 0xfa, 0x02, 0x06, 0x06, 0x0a, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfe, 0x9f, 0x01, 0x61, 0xfe, 0x7a, 0xfe, 0x42, 0x01, 0x93, 0xfe, 0x6d, 0x00, 0x03, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x09, 0x00, 0x15, 0x00, 0x21, 0x00, 0x00, 0x01, 0x13, 0x21, 0x01, 0x13, 0x09, 0x01, 0x13, 0x01, 0x21, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x03, 0xaf, 0x80, 0x01, 0xa3, 0xfe, 0xae, 0x81, 0xfe, 0xae, 0xfe, 0xad, 0x82, 0xfe, 0xae, 0x01, 0xa2, 0xfe, 0x5e, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x05, 0x31, 0xfe, 0x47, 0xfe, 0xef, 0xfe, 0x47, 0x01, 0x11, 0xfe, 0xef, 0x01, 0xb9, 0x01, 0x11, 0x03, 0x7d, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x3e, 0x00, 0x46, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x03, 0x33, 0x03, 0x33, 0x01, 0x23, 0x27, 0x21, 0x07, 0x23, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x10, 0x78, 0xf1, 0xbd, 0x8a, 0x01, 0x04, 0x77, 0x3d, 0xfe, 0xd7, 0x3d, 0x77, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xac, 0xfe, 0x55, 0x02, 0x0f, 0xfc, 0xbc, 0xda, 0xda, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x54, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x21, 0x15, 0x21, 0x35, 0x36, 0x37, 0x00, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x01, 0x06, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x75, 0x01, 0x7d, 0xfd, 0xe6, 0x1f, 0x38, 0x01, 0x36, 0x5e, 0x4c, 0x2f, 0x6e, 0x41, 0x46, 0x77, 0x34, 0x82, 0x9d, 0xfe, 0xd6, 0x33, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfc, 0x3f, 0x72, 0x6e, 0x1f, 0x38, 0x01, 0x31, 0x5e, 0x42, 0x51, 0x23, 0x23, 0x7b, 0x1c, 0x1c, 0x84, 0x6c, 0x8b, 0xfe, 0xe4, 0x30, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x64, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x35, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x57, 0x53, 0x5b, 0xab, 0x9f, 0x33, 0x71, 0x3f, 0x2f, 0x6b, 0x3c, 0x62, 0x6c, 0x64, 0x61, 0x4d, 0x54, 0x55, 0x57, 0x5a, 0x55, 0x24, 0x5c, 0x49, 0x42, 0x73, 0x31, 0x82, 0x98, 0x51, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x91, 0x12, 0x6d, 0x52, 0x7c, 0x86, 0x15, 0x14, 0x79, 0x1b, 0x1a, 0x4f, 0x46, 0x4a, 0x4c, 0x6c, 0x3f, 0x3c, 0x3a, 0x3d, 0x12, 0x17, 0x73, 0x11, 0x12, 0x76, 0x63, 0x45, 0x60, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x3e, 0x00, 0x49, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x09, 0x01, 0x21, 0x03, 0x33, 0x11, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x4d, 0xfe, 0xe9, 0x01, 0x17, 0x14, 0x95, 0x7a, 0x7a, 0x81, 0xfe, 0x8b, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0x97, 0xfe, 0x5d, 0x02, 0x1c, 0xfd, 0xe4, 0x6d, 0xba, 0xba, 0x79, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x5c, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x21, 0x15, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xfc, 0x01, 0xcb, 0xfe, 0xa0, 0x19, 0x1a, 0x1a, 0x19, 0x91, 0x54, 0x55, 0x57, 0x57, 0x9e, 0x36, 0x72, 0x3b, 0x33, 0x38, 0x38, 0x3e, 0x64, 0x75, 0x75, 0x64, 0x2f, 0x5d, 0x31, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x5f, 0xcc, 0x09, 0x04, 0x04, 0x4d, 0x4c, 0x83, 0x87, 0x4b, 0x4a, 0x12, 0x12, 0x71, 0x1b, 0x0e, 0x0d, 0x66, 0xae, 0x66, 0x14, 0x15, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x4b, 0x00, 0x6b, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x13, 0x15, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x0d, 0x4f, 0x2e, 0x2e, 0x2e, 0x2e, 0x4f, 0x4e, 0x2e, 0x2e, 0x2e, 0x2e, 0x9a, 0x2c, 0x2d, 0x2d, 0x2c, 0x73, 0x3e, 0x3d, 0x09, 0x22, 0x34, 0x34, 0x3d, 0x83, 0x4b, 0x4c, 0x4f, 0x4f, 0x82, 0x97, 0x9e, 0x61, 0x61, 0xa4, 0x2c, 0x2d, 0x2d, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x9e, 0x34, 0x35, 0x5b, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5b, 0x35, 0x34, 0x01, 0x62, 0x67, 0x14, 0x0a, 0x0b, 0x4b, 0x4c, 0x99, 0x31, 0x1a, 0x1a, 0x4c, 0x4d, 0x84, 0x7f, 0x4f, 0x4e, 0xde, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x42, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x21, 0x15, 0x01, 0x23, 0x01, 0x21, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x02, 0x2b, 0xfe, 0xc7, 0x7a, 0x01, 0x27, 0xfe, 0x61, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0x30, 0xfc, 0xed, 0x02, 0xe4, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x48, 0x00, 0x66, 0x00, 0x75, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37, 0x36, 0x34, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x20, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x22, 0x07, 0x06, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0x55, 0xa8, 0x2f, 0x30, 0x5f, 0x54, 0x53, 0x30, 0x30, 0x30, 0xf8, 0x4c, 0x29, 0x2a, 0x93, 0x01, 0x02, 0x4a, 0x48, 0x29, 0x2a, 0x4b, 0x51, 0x32, 0x30, 0x4c, 0x4e, 0x8e, 0x8f, 0x4d, 0x4d, 0x30, 0x30, 0x29, 0x2a, 0x29, 0x4d, 0x49, 0x2c, 0x2b, 0x2b, 0x2a, 0x96, 0x2b, 0x2a, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfd, 0x5b, 0x2c, 0x2b, 0x4b, 0x4c, 0x56, 0x2c, 0x2b, 0x96, 0x2b, 0x5d, 0x12, 0x31, 0x32, 0x48, 0x64, 0x74, 0x3a, 0x3a, 0x64, 0x4a, 0x30, 0x31, 0x12, 0x12, 0x3a, 0x37, 0x50, 0x79, 0x41, 0x41, 0x41, 0x41, 0x79, 0x4e, 0x39, 0x38, 0xc6, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x41, 0x3f, 0x26, 0x25, 0x25, 0x24, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x5b, 0x00, 0x6a, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x35, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x13, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x10, 0x2c, 0x2d, 0x2d, 0x2b, 0x74, 0x3d, 0x3d, 0x09, 0x20, 0x36, 0x33, 0x3e, 0x82, 0x97, 0x4e, 0x50, 0x82, 0x96, 0x4f, 0x4f, 0x60, 0x62, 0xa4, 0x2c, 0x2d, 0x2d, 0xb8, 0x4f, 0x5c, 0x2e, 0x2e, 0x4f, 0x4c, 0x30, 0x2f, 0x2f, 0x2e, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xdf, 0x67, 0x14, 0x0b, 0x0a, 0x4b, 0x4b, 0x9a, 0x2f, 0x1b, 0x1a, 0x98, 0x84, 0x81, 0x4d, 0x4e, 0x6f, 0x6f, 0xd4, 0xc6, 0x75, 0x76, 0x08, 0x09, 0x01, 0x72, 0x68, 0x5c, 0x5a, 0x34, 0x35, 0x35, 0x34, 0x5a, 0x5c, 0x34, 0x34, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x49, 0x00, 0x55, 0x00, 0x5c, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x00, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x37, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x01, 0x11, 0x07, 0x35, 0x37, 0x33, 0x11, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x03, 0x86, 0x80, 0x2d, 0x2e, 0x2e, 0x2d, 0x80, 0x2d, 0x2e, 0x2e, 0x6d, 0x76, 0x99, 0x99, 0x76, 0x92, 0x7e, 0x7e, 0xfe, 0x9c, 0x78, 0x7e, 0x7b, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfe, 0xc8, 0x56, 0x56, 0xac, 0xad, 0x56, 0x56, 0x56, 0x56, 0xad, 0xac, 0x56, 0xaf, 0xde, 0xd3, 0xd4, 0xde, 0xde, 0xd4, 0xd3, 0xde, 0xfc, 0xac, 0x02, 0xd1, 0x29, 0x74, 0x27, 0xfc, 0xbd, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x48, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x05, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0x87, 0x72, 0x3b, 0x39, 0x81, 0x2c, 0x24, 0x4c, 0x3f, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfd, 0xdc, 0x95, 0x46, 0x45, 0x60, 0x54, 0x6c, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x55, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x15, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x02, 0xe9, 0x2c, 0x5b, 0x33, 0xa3, 0xb4, 0xb5, 0xa2, 0x33, 0x5c, 0x2b, 0x2a, 0x5f, 0x31, 0x70, 0x6f, 0x6e, 0x71, 0x31, 0x60, 0x29, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xeb, 0x17, 0x16, 0xe3, 0xce, 0xcd, 0xe5, 0x17, 0x17, 0x74, 0x22, 0x24, 0xaa, 0xac, 0xab, 0xab, 0x24, 0x22, 0x00, 0x00, 0x00, 0x05, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x4d, 0x00, 0x57, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x01, 0x22, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x07, 0x12, 0x10, 0x26, 0x23, 0x22, 0x06, 0x10, 0x16, 0x33, 0x32, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x01, 0xfb, 0x04, 0x0f, 0x05, 0x8e, 0x8b, 0x8c, 0x8e, 0x8f, 0x8d, 0x4e, 0x4f, 0x71, 0x55, 0x09, 0x4c, 0x58, 0x56, 0x4d, 0x4d, 0x56, 0x58, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xfb, 0xbf, 0x01, 0xd7, 0xda, 0xdb, 0xd7, 0xd7, 0xdb, 0xa5, 0xc9, 0x28, 0x6a, 0x38, 0x01, 0x80, 0x01, 0x70, 0x9e, 0x9e, 0xfe, 0x90, 0x9e, 0x00, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x46, 0x00, 0x00, 0x05, 0x36, 0x35, 0x06, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x26, 0x35, 0x34, 0x20, 0x15, 0x14, 0x07, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x14, 0x17, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x17, 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x11, 0x23, 0x03, 0xe6, 0x33, 0x40, 0x99, 0x30, 0x17, 0x83, 0x0e, 0x39, 0x9a, 0x43, 0x2d, 0x70, 0x01, 0xa9, 0x70, 0x2c, 0x44, 0x9a, 0x38, 0x0f, 0x84, 0x16, 0x30, 0x98, 0x42, 0x34, 0xfd, 0x1b, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0xd8, 0x72, 0x01, 0x46, 0x94, 0xfe, 0x91, 0x01, 0x8c, 0x96, 0xfe, 0x9f, 0x72, 0xfc, 0x4c, 0xfb, 0xc3, 0x03, 0x01, 0x0c, 0x43, 0x95, 0x34, 0x24, 0x8d, 0x13, 0x82, 0x6a, 0xea, 0xea, 0x6a, 0x82, 0x13, 0x8d, 0x24, 0x34, 0x92, 0x46, 0x0c, 0x01, 0x05, 0xc5, 0xfb, 0x4c, 0x07, 0xf1, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0xf0, 0xfe, 0x9f, 0x01, 0x61, 0xfe, 0x7a, 0xfe, 0x42, 0x01, 0x93, 0xfe, 0x6d, 0x00, 0x04, 0x00, 0xb4, 0xfe, 0x14, 0x06, 0xaa, 0x07, 0x6d, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x03, 0x21, 0x17, 0x03, 0x37, 0x17, 0x03, 0x37, 0x21, 0x03, 0x13, 0x05, 0x01, 0x13, 0x25, 0x05, 0x13, 0x01, 0x25, 0x01, 0x22, 0x15, 0x11, 0x14, 0x33, 0x21, 0x32, 0x35, 0x11, 0x34, 0x23, 0x25, 0x21, 0x32, 0x15, 0x11, 0x14, 0x23, 0x21, 0x22, 0x35, 0x11, 0x34, 0x03, 0xaf, 0x5a, 0xfe, 0xdd, 0xeb, 0x5b, 0xed, 0xeb, 0x59, 0xeb, 0xfe, 0xdb, 0x58, 0x9c, 0x01, 0x87, 0xfe, 0xd8, 0x57, 0xfe, 0xae, 0xfe, 0xad, 0x58, 0xfe, 0xd8, 0x01, 0x88, 0xfe, 0x78, 0x6c, 0x6c, 0x04, 0x46, 0x6c, 0x6c, 0xfb, 0xba, 0x04, 0x46, 0xd8, 0xd8, 0xfb, 0xba, 0xd8, 0x04, 0x6e, 0xfe, 0xce, 0xbe, 0xfe, 0xcd, 0xbe, 0xbe, 0x01, 0x33, 0xbe, 0x01, 0xf5, 0xfe, 0x6f, 0x28, 0xfe, 0xe2, 0xfe, 0x54, 0xdf, 0xdf, 0x01, 0xa8, 0x01, 0x22, 0x28, 0x03, 0x55, 0x78, 0xf8, 0x87, 0x78, 0x78, 0x07, 0x79, 0x78, 0x78, 0xf0, 0xf8, 0x87, 0xf0, 0xf0, 0x07, 0x79, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x89, 0xff, 0x6a, 0x06, 0xf9, 0x07, 0x56, 0x00, 0x07, 0x00, 0x11, 0x00, 0x19, 0x00, 0x23, 0x00, 0x2b, 0x00, 0x33, 0x00, 0x7f, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x37, 0x22, 0x06, 0x15, 0x14, 0x33, 0x32, 0x36, 0x35, 0x34, 0x24, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x17, 0x22, 0x06, 0x15, 0x14, 0x33, 0x32, 0x36, 0x35, 0x34, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x36, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x06, 0x32, 0x3e, 0x03, 0x37, 0x13, 0x17, 0x07, 0x3e, 0x04, 0x35, 0x34, 0x26, 0x27, 0x26, 0x27, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x07, 0x26, 0x35, 0x34, 0x37, 0x26, 0x22, 0x07, 0x16, 0x15, 0x14, 0x07, 0x27, 0x36, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x06, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x1e, 0x03, 0x17, 0x27, 0x37, 0x13, 0x1e, 0x03, 0x12, 0x32, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x16, 0x15, 0x14, 0x0e, 0x02, 0x07, 0x05, 0x07, 0x25, 0x07, 0x06, 0x07, 0x05, 0x07, 0x25, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x05, 0x27, 0x25, 0x26, 0x2f, 0x01, 0x05, 0x27, 0x25, 0x2e, 0x03, 0x35, 0x34, 0x37, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x02, 0x9c, 0x3b, 0x53, 0x3b, 0x3b, 0x53, 0x69, 0x10, 0x28, 0x0c, 0x0f, 0x29, 0x01, 0x84, 0x3b, 0x53, 0x3c, 0x3c, 0x53, 0x14, 0x0f, 0x28, 0x0c, 0x10, 0x28, 0xfe, 0x97, 0x14, 0x1d, 0x14, 0x14, 0x1d, 0xd4, 0x13, 0x1d, 0x14, 0x14, 0x1d, 0x91, 0x61, 0x46, 0x29, 0x19, 0x08, 0x02, 0x0e, 0x79, 0x0b, 0x35, 0x66, 0x67, 0x4e, 0x30, 0x3c, 0x32, 0x2b, 0x3a, 0x41, 0x58, 0x58, 0x47, 0x4b, 0x74, 0x3d, 0x10, 0x75, 0x14, 0x01, 0x26, 0x97, 0x26, 0x01, 0x15, 0x75, 0x10, 0x3c, 0x75, 0x4b, 0x47, 0x58, 0x58, 0x42, 0x3b, 0x2b, 0x31, 0x3d, 0x31, 0x4d, 0x68, 0x66, 0x35, 0x0b, 0x78, 0x0f, 0x02, 0x08, 0x18, 0x29, 0x33, 0x89, 0x44, 0x27, 0xb5, 0x81, 0x7d, 0x9c, 0x54, 0x8d, 0x44, 0x76, 0x89, 0x50, 0x01, 0x76, 0x04, 0xfe, 0x22, 0x01, 0x02, 0x04, 0x01, 0xc9, 0x14, 0xfe, 0x3f, 0x1d, 0x98, 0xe1, 0x98, 0x1d, 0xfe, 0x3f, 0x14, 0x01, 0xc8, 0x03, 0x02, 0x01, 0xfe, 0x21, 0x04, 0x01, 0x76, 0x50, 0x89, 0x76, 0x43, 0x8c, 0x54, 0x9c, 0x7d, 0x81, 0xb6, 0x26, 0x03, 0x38, 0x90, 0x67, 0x67, 0x90, 0x67, 0x82, 0x3d, 0x18, 0x12, 0x3e, 0x18, 0x11, 0x75, 0x90, 0x67, 0x67, 0x90, 0x67, 0xdc, 0x3d, 0x18, 0x12, 0x3e, 0x18, 0x11, 0xfd, 0x22, 0x36, 0x27, 0x27, 0x36, 0x27, 0x5d, 0x36, 0x27, 0x27, 0x36, 0x27, 0xe0, 0x24, 0x39, 0x5d, 0x57, 0x3e, 0x01, 0x3a, 0x06, 0xfb, 0x1f, 0x4c, 0x6b, 0x74, 0x93, 0x4c, 0x4a, 0x98, 0x37, 0x33, 0x28, 0x23, 0x83, 0x58, 0x51, 0x69, 0x6b, 0xa4, 0x5c, 0x42, 0x3f, 0x26, 0x53, 0x54, 0x1b, 0x0e, 0x03, 0x03, 0x0e, 0x1b, 0x54, 0x53, 0x26, 0x3f, 0x42, 0x5c, 0xa4, 0x6b, 0x69, 0x51, 0x58, 0x83, 0x23, 0x28, 0x33, 0x37, 0x98, 0x4a, 0x4c, 0x93, 0x74, 0x6b, 0x4c, 0x1f, 0xfb, 0x06, 0xfe, 0xc6, 0x3e, 0x57, 0x5d, 0x39, 0x06, 0x02, 0x06, 0x86, 0xbe, 0xb7, 0x8c, 0x8a, 0x72, 0xac, 0xc8, 0x6c, 0xc8, 0xa1, 0x7e, 0x33, 0x1a, 0x44, 0x23, 0x01, 0x1f, 0x1f, 0xae, 0x40, 0xac, 0x6d, 0x8a, 0x8a, 0x6d, 0xac, 0x40, 0xae, 0x1f, 0x1f, 0x01, 0x23, 0x44, 0x1a, 0x33, 0x7e, 0xa1, 0xc8, 0x6c, 0xc8, 0xac, 0x72, 0x8a, 0x8c, 0xb7, 0xbe, 0x86, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x43, 0xff, 0x6a, 0x08, 0x43, 0x06, 0x8a, 0x00, 0x09, 0x00, 0x14, 0x00, 0x18, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x8e, 0x00, 0x99, 0x00, 0x9f, 0x00, 0xfd, 0x01, 0x07, 0x00, 0x00, 0x01, 0x22, 0x26, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x27, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x33, 0x15, 0x23, 0x01, 0x22, 0x26, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x01, 0x37, 0x17, 0x07, 0x27, 0x37, 0x01, 0x15, 0x23, 0x35, 0x25, 0x17, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x37, 0x16, 0x17, 0x3e, 0x04, 0x37, 0x16, 0x33, 0x32, 0x3e, 0x04, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x27, 0x2e, 0x04, 0x23, 0x22, 0x0e, 0x02, 0x0f, 0x01, 0x06, 0x07, 0x2e, 0x01, 0x20, 0x06, 0x07, 0x26, 0x2f, 0x01, 0x2e, 0x03, 0x23, 0x22, 0x0e, 0x03, 0x07, 0x06, 0x15, 0x14, 0x16, 0x17, 0x1e, 0x05, 0x33, 0x32, 0x37, 0x1e, 0x04, 0x17, 0x36, 0x25, 0x32, 0x36, 0x35, 0x34, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x01, 0x07, 0x17, 0x07, 0x27, 0x37, 0x01, 0x34, 0x37, 0x27, 0x26, 0x27, 0x23, 0x22, 0x2e, 0x06, 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x02, 0x17, 0x16, 0x1f, 0x01, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x37, 0x36, 0x37, 0x3e, 0x03, 0x33, 0x32, 0x16, 0x17, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x0e, 0x07, 0x2b, 0x01, 0x06, 0x0f, 0x01, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x26, 0x01, 0x06, 0x20, 0x27, 0x16, 0x17, 0x16, 0x33, 0x32, 0x36, 0x03, 0x20, 0x2d, 0x38, 0x37, 0x2e, 0x2d, 0x38, 0x37, 0x1b, 0x10, 0x29, 0x0d, 0x0f, 0x15, 0x14, 0x30, 0x63, 0x63, 0x02, 0x0f, 0x2e, 0x37, 0x37, 0x2e, 0x2d, 0x37, 0x38, 0xfb, 0xcb, 0x2e, 0xb1, 0x33, 0x39, 0x26, 0x03, 0x39, 0x63, 0xfe, 0x09, 0x3c, 0x39, 0x0f, 0x05, 0x34, 0x2e, 0xa0, 0x7d, 0x5e, 0x3e, 0x74, 0x3b, 0x33, 0x04, 0x0f, 0x39, 0x3b, 0x16, 0x10, 0x04, 0x1c, 0x0b, 0x12, 0x09, 0x01, 0x4a, 0x23, 0x1d, 0x32, 0x21, 0x2b, 0x14, 0x30, 0x0b, 0x2c, 0x2a, 0x2f, 0x02, 0x22, 0x1b, 0x27, 0x27, 0x10, 0x0f, 0x1d, 0x20, 0x0e, 0x11, 0x11, 0x39, 0x50, 0x37, 0xee, 0xfe, 0xde, 0xef, 0x37, 0x50, 0x38, 0x11, 0x11, 0x0f, 0x1f, 0x1d, 0x0f, 0x11, 0x26, 0x27, 0x1b, 0x22, 0x02, 0x2f, 0x2a, 0x2c, 0x0a, 0x31, 0x14, 0x2a, 0x21, 0x33, 0x1d, 0x23, 0x49, 0x01, 0x09, 0x12, 0x0c, 0x1b, 0x05, 0x10, 0x02, 0xb8, 0x11, 0x28, 0x0d, 0x0f, 0x15, 0x13, 0x01, 0xbb, 0x99, 0x26, 0x39, 0x33, 0xb1, 0xfb, 0x51, 0x0b, 0x12, 0x34, 0x0e, 0x09, 0x1e, 0x35, 0x27, 0x2f, 0x19, 0x31, 0x11, 0x39, 0x09, 0x3b, 0x34, 0x24, 0x28, 0x20, 0x2d, 0x7a, 0x3a, 0x1b, 0x2d, 0x2d, 0x17, 0x15, 0x21, 0x0f, 0x3b, 0x24, 0x31, 0x94, 0x01, 0x7a, 0x93, 0x32, 0x24, 0x3a, 0x10, 0x21, 0x15, 0x16, 0x2d, 0x2e, 0x1a, 0x3b, 0x79, 0x2e, 0x20, 0x27, 0x25, 0x34, 0x3c, 0x08, 0x39, 0x11, 0x32, 0x18, 0x30, 0x26, 0x36, 0x1d, 0x09, 0x0f, 0x33, 0x13, 0x0c, 0x0c, 0x1f, 0x56, 0x08, 0x14, 0x1d, 0x3b, 0x31, 0x7a, 0xb0, 0x7b, 0x30, 0x3c, 0x1d, 0x13, 0x08, 0x56, 0x20, 0x0b, 0x02, 0xe2, 0x57, 0xfe, 0xda, 0x57, 0x0f, 0x1c, 0x32, 0x8d, 0x60, 0x71, 0x02, 0xd1, 0x6e, 0x82, 0x6e, 0x6e, 0x82, 0x6e, 0x1b, 0x41, 0x15, 0x11, 0x1f, 0x1d, 0x19, 0x12, 0xd4, 0xd2, 0x01, 0x8b, 0x6e, 0x82, 0x6e, 0x6e, 0x82, 0x6e, 0x02, 0xb5, 0x2d, 0xda, 0xba, 0x18, 0x94, 0xfd, 0x4d, 0xd2, 0xd2, 0x93, 0x76, 0x24, 0x44, 0x11, 0x19, 0x4b, 0x3b, 0x37, 0x22, 0x08, 0x0d, 0x44, 0x3b, 0x4b, 0x19, 0x11, 0x44, 0x24, 0x76, 0x0d, 0x0f, 0x13, 0x68, 0x35, 0x57, 0x4d, 0x27, 0x14, 0x0b, 0x0c, 0x20, 0x11, 0x31, 0x0a, 0x2a, 0x4c, 0x37, 0x2e, 0x34, 0x02, 0x28, 0x1a, 0x23, 0x13, 0x0e, 0x22, 0x11, 0x19, 0x19, 0x4e, 0x83, 0x65, 0x6d, 0x6d, 0x65, 0x83, 0x4e, 0x19, 0x19, 0x11, 0x22, 0x0e, 0x13, 0x23, 0x1a, 0x28, 0x02, 0x34, 0x2e, 0x37, 0x4c, 0x2a, 0x0a, 0x31, 0x11, 0x20, 0x0c, 0x0b, 0x14, 0x27, 0x4d, 0x57, 0x35, 0x68, 0x13, 0x0f, 0x4e, 0x41, 0x15, 0x11, 0x1f, 0x1d, 0x19, 0x12, 0x02, 0x9a, 0xbb, 0x94, 0x18, 0xba, 0xda, 0xfb, 0xef, 0x2a, 0x2c, 0x50, 0xdd, 0x49, 0x09, 0x08, 0x1b, 0x0d, 0x2c, 0x0f, 0x39, 0x09, 0x3a, 0x6b, 0x52, 0x34, 0x5f, 0x35, 0x22, 0x32, 0x53, 0x12, 0x27, 0x18, 0x19, 0x27, 0x15, 0x52, 0x1d, 0x1b, 0x4e, 0x4e, 0x1b, 0x1d, 0x52, 0x15, 0x27, 0x19, 0x18, 0x27, 0x12, 0x53, 0x32, 0x22, 0x35, 0x5f, 0x34, 0x52, 0x6b, 0x3a, 0x09, 0x39, 0x0f, 0x2c, 0x0d, 0x1b, 0x08, 0x09, 0x49, 0xdd, 0x50, 0x2c, 0x2a, 0x30, 0x28, 0x73, 0x42, 0x44, 0x30, 0x48, 0x2e, 0x26, 0x1b, 0x1b, 0x26, 0x2e, 0x48, 0x30, 0x44, 0x42, 0x73, 0x28, 0xfe, 0xe0, 0x16, 0x16, 0x24, 0x15, 0x27, 0x26, 0x00, 0x08, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x11, 0x00, 0x19, 0x00, 0x28, 0x00, 0x32, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x7f, 0x00, 0xb8, 0x00, 0x00, 0x01, 0x37, 0x16, 0x33, 0x32, 0x37, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x06, 0x23, 0x22, 0x01, 0x17, 0x06, 0x22, 0x27, 0x37, 0x16, 0x32, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x07, 0x22, 0x06, 0x15, 0x14, 0x17, 0x3e, 0x01, 0x37, 0x26, 0x05, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x05, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x02, 0x62, 0x53, 0x3e, 0x52, 0x34, 0x4c, 0x4b, 0x35, 0x51, 0x3f, 0x52, 0x61, 0x81, 0x43, 0x3d, 0x3e, 0x42, 0x82, 0x01, 0x8c, 0x38, 0x6e, 0xae, 0x6e, 0x38, 0x51, 0x78, 0xea, 0x26, 0x49, 0x1d, 0x24, 0x3f, 0x31, 0x12, 0x2f, 0x2b, 0x3a, 0x3f, 0x5b, 0x46, 0x21, 0x2b, 0x05, 0x26, 0x3e, 0x11, 0x14, 0x01, 0x8c, 0x04, 0x5a, 0x3f, 0x3c, 0x2a, 0x30, 0x13, 0x31, 0x3f, 0x24, 0x1d, 0x49, 0x6d, 0x0b, 0x18, 0x2b, 0x24, 0x0e, 0x03, 0x0b, 0x0c, 0x27, 0x3a, 0x01, 0x6b, 0x10, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x11, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0xfe, 0xfd, 0x5d, 0x94, 0xa3, 0x01, 0xb9, 0xa3, 0x93, 0x5d, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0xfb, 0x46, 0x0f, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x0f, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x69, 0xaf, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xae, 0x6a, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x01, 0x8c, 0x62, 0x40, 0x2c, 0x2c, 0x40, 0x62, 0x64, 0x1c, 0x1c, 0x01, 0xa8, 0x78, 0x3d, 0x3d, 0x78, 0x2e, 0x01, 0x06, 0x4c, 0x1c, 0x0b, 0x23, 0x24, 0x2d, 0x47, 0x30, 0x2c, 0x61, 0x26, 0x30, 0x24, 0x0e, 0x0f, 0x07, 0x34, 0x25, 0x11, 0x1d, 0x43, 0x61, 0x2c, 0x30, 0x47, 0x2d, 0x24, 0x23, 0x0b, 0x1c, 0x04, 0x03, 0x16, 0x18, 0x1c, 0x0e, 0x0c, 0x03, 0x3b, 0xa7, 0x82, 0x74, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x74, 0x82, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x7a, 0xe7, 0x77, 0x84, 0x84, 0x77, 0xe7, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x3d, 0x7c, 0x8f, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x8f, 0x7c, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0xfe, 0xf7, 0x8e, 0x9e, 0x9e, 0x8c, 0x01, 0x0b, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x99, 0xff, 0x6a, 0x07, 0xbb, 0x07, 0x0b, 0x00, 0x07, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x31, 0x00, 0x3b, 0x00, 0x47, 0x00, 0x68, 0x00, 0x98, 0x00, 0xaa, 0x00, 0xbc, 0x00, 0x00, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x37, 0x22, 0x06, 0x15, 0x14, 0x33, 0x32, 0x36, 0x35, 0x34, 0x03, 0x22, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x15, 0x14, 0x07, 0x06, 0x00, 0x14, 0x06, 0x22, 0x26, 0x34, 0x36, 0x32, 0x03, 0x34, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x23, 0x22, 0x27, 0x26, 0x01, 0x22, 0x06, 0x15, 0x14, 0x33, 0x32, 0x36, 0x35, 0x34, 0x01, 0x37, 0x16, 0x33, 0x32, 0x36, 0x37, 0x17, 0x06, 0x23, 0x22, 0x26, 0x12, 0x20, 0x37, 0x36, 0x35, 0x34, 0x27, 0x3e, 0x02, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x1e, 0x01, 0x17, 0x06, 0x15, 0x14, 0x17, 0x12, 0x20, 0x04, 0x17, 0x16, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x2b, 0x01, 0x06, 0x07, 0x0e, 0x01, 0x07, 0x06, 0x20, 0x27, 0x2e, 0x01, 0x27, 0x26, 0x27, 0x23, 0x22, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x17, 0x36, 0x37, 0x36, 0x03, 0x26, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x36, 0x37, 0x26, 0x25, 0x06, 0x07, 0x16, 0x17, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x27, 0x26, 0x23, 0x22, 0x02, 0xca, 0x4a, 0x68, 0x4a, 0x4a, 0x68, 0x82, 0x14, 0x31, 0x0e, 0x14, 0x32, 0x0e, 0x16, 0x28, 0x21, 0x1b, 0x16, 0x28, 0x21, 0x01, 0xd8, 0x49, 0x69, 0x4a, 0x4a, 0x69, 0xe8, 0x16, 0x1c, 0x21, 0x28, 0x16, 0x1c, 0x21, 0x28, 0x01, 0x02, 0x14, 0x32, 0x0f, 0x14, 0x32, 0xfd, 0x33, 0x5f, 0x75, 0xb9, 0x57, 0xa2, 0x35, 0x5f, 0x97, 0xf6, 0x74, 0xd2, 0x7c, 0x01, 0x93, 0x95, 0x6f, 0x4b, 0x1b, 0x1a, 0x1c, 0x4e, 0x51, 0x75, 0x40, 0x65, 0x1c, 0x19, 0x65, 0x40, 0x75, 0x51, 0x4e, 0x1c, 0x1a, 0x1c, 0x4c, 0x70, 0xbb, 0x01, 0x45, 0x01, 0x18, 0x58, 0x5e, 0x0f, 0x16, 0x1a, 0x60, 0x81, 0x07, 0x0c, 0x19, 0x1e, 0x79, 0x50, 0x07, 0x0d, 0x34, 0x33, 0x9a, 0x62, 0x85, 0xfe, 0xfd, 0x85, 0x62, 0x9a, 0x33, 0x34, 0x0d, 0x07, 0x50, 0x78, 0x1f, 0x19, 0x0c, 0x07, 0x82, 0x5f, 0x1a, 0x17, 0x0e, 0x5f, 0x57, 0xc1, 0x15, 0x1d, 0x0c, 0x13, 0x24, 0x27, 0x07, 0x15, 0x3f, 0x1c, 0x23, 0x03, 0x07, 0x36, 0x2f, 0x04, 0xe8, 0x0e, 0x30, 0x36, 0x07, 0x04, 0x22, 0x1c, 0x40, 0x14, 0x07, 0x27, 0x24, 0x13, 0x0c, 0x1c, 0x04, 0x08, 0x74, 0x52, 0x52, 0x74, 0x52, 0x68, 0x31, 0x13, 0x0e, 0x31, 0x13, 0x0e, 0xfe, 0x52, 0x15, 0x20, 0x24, 0x1f, 0x15, 0x20, 0x24, 0x1f, 0x02, 0x0c, 0x74, 0x52, 0x52, 0x74, 0x52, 0xfe, 0x05, 0x15, 0x1f, 0x24, 0x20, 0x15, 0x1f, 0x24, 0x01, 0x6b, 0x31, 0x13, 0x0e, 0x31, 0x13, 0x0e, 0xfd, 0xa8, 0x54, 0xa4, 0x58, 0x4c, 0x54, 0xd6, 0x72, 0xfe, 0xde, 0xcb, 0x9a, 0xb8, 0x86, 0x95, 0x2c, 0x30, 0x5e, 0x31, 0x8a, 0x69, 0x6f, 0x45, 0x35, 0x35, 0x45, 0x6f, 0x69, 0x8a, 0x31, 0x5e, 0x30, 0x2c, 0x95, 0x86, 0xb8, 0x9a, 0x06, 0x00, 0xa4, 0x7c, 0x88, 0x9b, 0x06, 0xa4, 0x87, 0x2c, 0x36, 0x5b, 0x3f, 0x4b, 0x69, 0x7b, 0x70, 0x6e, 0xad, 0x37, 0x4c, 0x4c, 0x37, 0xad, 0x6e, 0x70, 0x7b, 0x69, 0x4b, 0x3f, 0x5b, 0x36, 0x2c, 0x87, 0xa4, 0x06, 0x9b, 0x88, 0x7c, 0xfd, 0xcc, 0x15, 0x07, 0x0f, 0x52, 0x3a, 0x1e, 0x33, 0x97, 0x2f, 0x15, 0x87, 0x7b, 0x57, 0x60, 0x60, 0x57, 0x7b, 0x87, 0x15, 0x2f, 0x97, 0x33, 0x1e, 0x3a, 0x52, 0x0f, 0x07, 0x00, 0x00, 0x09, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x39, 0x00, 0x3e, 0x00, 0x42, 0x00, 0x46, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x21, 0x10, 0x00, 0x20, 0x00, 0x05, 0x36, 0x37, 0x11, 0x23, 0x03, 0x11, 0x23, 0x11, 0x16, 0x25, 0x36, 0x37, 0x23, 0x05, 0x35, 0x23, 0x16, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0xc8, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0xf8, 0x04, 0x5f, 0xfe, 0xb9, 0xfe, 0x30, 0xfe, 0xb8, 0x02, 0x6d, 0x50, 0x44, 0x94, 0x7a, 0x94, 0x45, 0x01, 0xd7, 0x41, 0x19, 0x5a, 0xfd, 0x6a, 0x5b, 0x19, 0x03, 0xff, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xdb, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x6a, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0xdf, 0x0b, 0x2a, 0x01, 0x25, 0xfe, 0xa6, 0x01, 0x5a, 0xfe, 0xdb, 0x2a, 0x99, 0x52, 0x64, 0xb8, 0xb8, 0x66, 0x00, 0x00, 0x09, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x3a, 0x00, 0x3f, 0x00, 0x43, 0x00, 0x47, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x07, 0x21, 0x10, 0x00, 0x20, 0x00, 0x05, 0x36, 0x37, 0x11, 0x23, 0x03, 0x11, 0x23, 0x11, 0x16, 0x25, 0x36, 0x37, 0x23, 0x05, 0x35, 0x23, 0x16, 0x01, 0x12, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x03, 0x5c, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfd, 0x72, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xc9, 0x04, 0x5f, 0xfe, 0xb9, 0xfe, 0x30, 0xfe, 0xb8, 0x02, 0x6d, 0x50, 0x44, 0x94, 0x7a, 0x94, 0x45, 0x01, 0xd7, 0x41, 0x19, 0x5a, 0xfd, 0x6a, 0x5b, 0x19, 0x02, 0xea, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x02, 0x16, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xac, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0xdf, 0x0b, 0x2a, 0x01, 0x25, 0xfe, 0xa6, 0x01, 0x5a, 0xfe, 0xdb, 0x2a, 0x99, 0x52, 0x64, 0xb8, 0xb8, 0x66, 0x00, 0x09, 0x00, 0x55, 0xff, 0x6a, 0x08, 0x14, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0c, 0x00, 0x11, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x59, 0x00, 0x7e, 0x00, 0x00, 0x01, 0x35, 0x23, 0x16, 0x05, 0x36, 0x37, 0x23, 0x01, 0x11, 0x23, 0x11, 0x16, 0x17, 0x36, 0x37, 0x11, 0x23, 0x25, 0x21, 0x10, 0x00, 0x20, 0x00, 0x13, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x14, 0x07, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x02, 0x07, 0x02, 0x21, 0x20, 0x03, 0x26, 0x03, 0x07, 0x06, 0x07, 0x06, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x26, 0x37, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x17, 0x16, 0x17, 0x26, 0x27, 0x26, 0x21, 0x20, 0x07, 0x06, 0x07, 0x36, 0x3f, 0x01, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x06, 0x02, 0xe9, 0x5b, 0x1a, 0x02, 0xd8, 0x40, 0x1a, 0x5a, 0xfe, 0x77, 0x93, 0x44, 0xca, 0x4f, 0x44, 0x93, 0xfd, 0x93, 0x04, 0x5e, 0xfe, 0xba, 0xfe, 0x2f, 0xfe, 0xb9, 0x4f, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0x01, 0x9c, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfc, 0x2a, 0x01, 0xda, 0x01, 0x4e, 0x01, 0x50, 0x01, 0xd8, 0x02, 0x54, 0x35, 0x15, 0x1b, 0x30, 0x45, 0x1c, 0x16, 0x10, 0x0a, 0x26, 0xbc, 0xec, 0xfe, 0xb0, 0xfe, 0xb2, 0xed, 0xbc, 0x27, 0x09, 0x10, 0x17, 0x1c, 0x44, 0x30, 0x1a, 0x15, 0x36, 0x53, 0x02, 0x7a, 0x01, 0x92, 0x01, 0x1c, 0x01, 0x1e, 0x01, 0x90, 0x01, 0x18, 0x21, 0x22, 0x1c, 0x17, 0x10, 0x29, 0x7b, 0x25, 0x15, 0x2a, 0x8b, 0xc7, 0xfe, 0xe1, 0xfe, 0xe4, 0xca, 0x8a, 0x2a, 0x15, 0x25, 0x7a, 0x28, 0x10, 0x17, 0x1c, 0x44, 0x18, 0x01, 0x01, 0xa1, 0xb8, 0x66, 0x50, 0x52, 0x64, 0xfe, 0xa6, 0x01, 0x5a, 0xfe, 0xdb, 0x2a, 0x0b, 0x0b, 0x2a, 0x01, 0x25, 0x87, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0x01, 0xae, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xa2, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0x1d, 0x1b, 0x1f, 0x14, 0x18, 0x1f, 0x25, 0x26, 0x36, 0x1f, 0x19, 0x39, 0x20, 0xfe, 0xe9, 0xd1, 0xfe, 0xfa, 0x01, 0x06, 0xd0, 0x01, 0x16, 0x1e, 0x39, 0x19, 0x1f, 0x36, 0x26, 0x25, 0x1f, 0x19, 0x13, 0x1e, 0x1c, 0x1d, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x14, 0x13, 0x1a, 0x1f, 0x19, 0x39, 0x88, 0x2d, 0x0e, 0x0f, 0xc7, 0x9a, 0xe0, 0xe0, 0x9b, 0xc6, 0x10, 0x0d, 0x2d, 0x88, 0x39, 0x19, 0x1f, 0x1b, 0x14, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x21, 0x10, 0x00, 0x20, 0x00, 0x25, 0x21, 0x16, 0x17, 0x16, 0x24, 0x37, 0x36, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x7f, 0x04, 0x5f, 0xfe, 0xb9, 0xfe, 0x30, 0xfe, 0xb8, 0x03, 0xd5, 0xfc, 0xb5, 0x1e, 0x53, 0x7f, 0x01, 0x6c, 0x80, 0x53, 0x03, 0xff, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xdb, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xb9, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0x7b, 0x75, 0x5c, 0x8e, 0x01, 0x8e, 0x5c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x21, 0x10, 0x00, 0x20, 0x00, 0x25, 0x21, 0x16, 0x17, 0x16, 0x37, 0x32, 0x37, 0x36, 0x01, 0xe1, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0x01, 0x9b, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfc, 0x2a, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x7f, 0x04, 0x5f, 0xfe, 0xb9, 0xfe, 0x30, 0xfe, 0xb8, 0x03, 0xd5, 0xfc, 0xb5, 0x1e, 0x53, 0x7f, 0xb6, 0xb6, 0x80, 0x53, 0x03, 0x8c, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xa2, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xb9, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0x7b, 0x75, 0x5c, 0x8e, 0x01, 0x8e, 0x5c, 0x00, 0x07, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x41, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x17, 0x16, 0x07, 0x14, 0x07, 0x06, 0x22, 0x26, 0x35, 0x34, 0x37, 0x05, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x21, 0x10, 0x00, 0x20, 0x00, 0x25, 0x21, 0x16, 0x17, 0x16, 0x37, 0x32, 0x37, 0x36, 0x05, 0xfe, 0x3a, 0x19, 0x01, 0x18, 0x18, 0x45, 0x30, 0x18, 0xfc, 0x1e, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0x01, 0x9b, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfc, 0x2a, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x7f, 0x04, 0x5f, 0xfe, 0xb9, 0xfe, 0x30, 0xfe, 0xb8, 0x03, 0xd5, 0xfc, 0xb5, 0x1e, 0x53, 0x7f, 0xb6, 0xb6, 0x80, 0x53, 0x04, 0x2c, 0x80, 0x38, 0x22, 0x2b, 0x1a, 0x1b, 0x36, 0x2c, 0x23, 0x35, 0x20, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xa2, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xb9, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0x7b, 0x75, 0x5c, 0x8e, 0x01, 0x8e, 0x5c, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x33, 0x00, 0x00, 0x01, 0x25, 0x17, 0x07, 0x17, 0x07, 0x25, 0x27, 0x15, 0x05, 0x27, 0x37, 0x27, 0x37, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x21, 0x10, 0x00, 0x20, 0x00, 0x25, 0x21, 0x16, 0x17, 0x16, 0x24, 0x37, 0x36, 0x04, 0x09, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0x90, 0xfe, 0xf7, 0x46, 0xb3, 0xb3, 0x46, 0xfe, 0x29, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x7f, 0x04, 0x5f, 0xfe, 0xb9, 0xfe, 0x30, 0xfe, 0xb8, 0x03, 0xd5, 0xfc, 0xb5, 0x1e, 0x53, 0x7f, 0x01, 0x6c, 0x80, 0x53, 0x04, 0x27, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0x55, 0x55, 0xce, 0x6e, 0x8a, 0x8b, 0x6e, 0xfd, 0xf5, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xb9, 0xfe, 0xfe, 0xfe, 0x96, 0x01, 0x6a, 0x7b, 0x75, 0x5c, 0x8e, 0x01, 0x8e, 0x5c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x80, 0xff, 0x6a, 0x07, 0x01, 0x07, 0x63, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x2a, 0x00, 0x35, 0x00, 0x49, 0x00, 0x57, 0x00, 0x5f, 0x00, 0x00, 0x01, 0x37, 0x16, 0x17, 0x16, 0x04, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x2f, 0x01, 0x06, 0x21, 0x20, 0x27, 0x07, 0x06, 0x05, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x34, 0x24, 0x21, 0x20, 0x04, 0x15, 0x14, 0x07, 0x16, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x37, 0x26, 0x25, 0x36, 0x35, 0x34, 0x24, 0x21, 0x20, 0x04, 0x15, 0x14, 0x17, 0x36, 0x21, 0x20, 0x17, 0x26, 0x23, 0x22, 0x07, 0x16, 0x33, 0x32, 0x01, 0xe7, 0x67, 0x1a, 0x24, 0x80, 0x01, 0x6b, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0xf6, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xc8, 0x0c, 0xcf, 0xfe, 0xf5, 0xfe, 0xf6, 0xcf, 0x0d, 0xc9, 0x03, 0x38, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfd, 0xf8, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0xfe, 0x3f, 0x01, 0xe7, 0x01, 0x59, 0x01, 0x5a, 0x01, 0xe6, 0xe4, 0xcb, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0xcc, 0xe4, 0x05, 0x45, 0xa9, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xab, 0xdb, 0x01, 0x29, 0x01, 0x2a, 0x3c, 0x9e, 0xc8, 0xc7, 0x9e, 0x9e, 0xc7, 0xc8, 0x01, 0xd1, 0x47, 0x2c, 0x26, 0x8d, 0x01, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x01, 0x51, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0xe0, 0x0e, 0x39, 0x39, 0x0e, 0xe0, 0x2a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x02, 0x5c, 0x86, 0xbe, 0xbe, 0x86, 0x82, 0x5c, 0xfc, 0xfe, 0xa5, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0x01, 0x5b, 0xfc, 0x5c, 0x02, 0x36, 0x4a, 0x51, 0x72, 0x72, 0x51, 0x4a, 0x36, 0xcf, 0xf5, 0x6e, 0x6e, 0x1c, 0x00, 0x07, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x07, 0x30, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x4a, 0x00, 0x00, 0x01, 0x05, 0x07, 0x25, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x17, 0x05, 0x27, 0x01, 0x37, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x36, 0x20, 0x17, 0x25, 0x11, 0x16, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x37, 0x11, 0x02, 0x8a, 0x01, 0x10, 0x45, 0xfe, 0xef, 0x02, 0x06, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfd, 0xf8, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0xb7, 0x45, 0xfe, 0xef, 0x45, 0xfd, 0xff, 0x67, 0x1a, 0x24, 0x7f, 0x01, 0x6c, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0xf6, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0xb2, 0x77, 0x01, 0x0c, 0x77, 0x01, 0x8f, 0x9b, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x9d, 0x05, 0x67, 0xd4, 0x6f, 0xd5, 0xfe, 0xbc, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x01, 0xec, 0x6e, 0xd5, 0x6f, 0xfd, 0x3e, 0x47, 0x2c, 0x26, 0x8e, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x01, 0x51, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x02, 0x1d, 0x2a, 0x2a, 0xec, 0xfd, 0xd0, 0xe7, 0xfe, 0xd1, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0x01, 0x2f, 0xe7, 0x02, 0x30, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x32, 0x00, 0x39, 0x00, 0x00, 0x01, 0x37, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x2d, 0x01, 0x17, 0x07, 0x17, 0x07, 0x25, 0x01, 0xe7, 0x67, 0x1a, 0x24, 0x7f, 0x01, 0x6c, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0xf6, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0xa9, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x01, 0xc7, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0x01, 0xd1, 0x47, 0x2c, 0x26, 0x8e, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x01, 0x51, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x02, 0x87, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x64, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x37, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0xe7, 0x67, 0x1a, 0x24, 0x7f, 0x01, 0x6c, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0x27, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0x01, 0x9b, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfc, 0x2a, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0xd1, 0x47, 0x2c, 0x26, 0x8e, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x01, 0xf3, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xa2, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x37, 0x00, 0x43, 0x00, 0x51, 0x00, 0x00, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x05, 0x10, 0x00, 0x21, 0x32, 0x37, 0x26, 0x27, 0x06, 0x23, 0x22, 0x00, 0x11, 0x33, 0x14, 0x00, 0x20, 0x00, 0x35, 0x33, 0x14, 0x07, 0x16, 0x1d, 0x01, 0x36, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x05, 0x06, 0x07, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x34, 0x27, 0x26, 0x03, 0xf5, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfd, 0x72, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfe, 0xb8, 0x01, 0x93, 0x01, 0x1c, 0x7b, 0x6a, 0x5b, 0x3b, 0x26, 0x29, 0xe8, 0xfe, 0xb8, 0x7a, 0x01, 0x00, 0x01, 0x6c, 0x01, 0x00, 0x79, 0x6f, 0x32, 0xbc, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x04, 0x8e, 0x47, 0x52, 0x1b, 0x23, 0x20, 0x18, 0x0f, 0x0b, 0x1e, 0x01, 0x01, 0x02, 0x03, 0x8c, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xa2, 0xfe, 0xc4, 0xfe, 0x43, 0x29, 0x30, 0x6c, 0x05, 0x01, 0x6a, 0x01, 0x02, 0xca, 0xfe, 0xe5, 0x01, 0x1c, 0xc9, 0xd5, 0xa0, 0x64, 0x63, 0x04, 0xda, 0x01, 0x33, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x36, 0x43, 0x24, 0x28, 0x18, 0x17, 0x08, 0x13, 0x39, 0x05, 0x06, 0x2e, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x33, 0x00, 0x3f, 0x00, 0x00, 0x01, 0x37, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x01, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0xe7, 0x67, 0x1a, 0x24, 0x7f, 0x01, 0x6c, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0x03, 0x9a, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfe, 0x65, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfd, 0x85, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0xd1, 0x47, 0x2c, 0x26, 0x8e, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x02, 0xef, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfe, 0x62, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x17, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x47, 0x00, 0x57, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x06, 0x0f, 0x01, 0x23, 0x27, 0x26, 0x35, 0x26, 0x37, 0x36, 0x33, 0x16, 0x17, 0x16, 0x17, 0x33, 0x34, 0x37, 0x36, 0x21, 0x32, 0x17, 0x16, 0x15, 0x33, 0x36, 0x37, 0x36, 0x37, 0x32, 0x17, 0x16, 0x07, 0x14, 0x0f, 0x01, 0x23, 0x27, 0x26, 0x27, 0x34, 0x37, 0x36, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x37, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x05, 0x15, 0x18, 0x16, 0x36, 0x01, 0x2d, 0x97, 0x02, 0x8f, 0x37, 0x01, 0x09, 0x22, 0x38, 0x25, 0x1d, 0x19, 0x09, 0x01, 0x0c, 0x1f, 0xfd, 0x8f, 0x37, 0x1f, 0x0c, 0x01, 0x09, 0x19, 0x1d, 0x25, 0x39, 0x22, 0x09, 0x01, 0x38, 0x8f, 0x02, 0x97, 0x2d, 0x01, 0x36, 0x17, 0xfe, 0x43, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xd5, 0x67, 0x1a, 0x24, 0x7f, 0x01, 0x6c, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0x04, 0xc0, 0x0e, 0x25, 0x3f, 0x41, 0x3e, 0xcf, 0xbe, 0x44, 0x4c, 0x15, 0x19, 0x44, 0x01, 0x20, 0x20, 0x31, 0x0e, 0x1d, 0x47, 0x47, 0x1d, 0x0e, 0x31, 0x20, 0x20, 0x01, 0x44, 0x19, 0x15, 0x4c, 0x44, 0xbe, 0xcf, 0x3e, 0x41, 0x3f, 0x25, 0x0e, 0xfe, 0x2a, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfd, 0xaa, 0x47, 0x2c, 0x26, 0x8e, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x00, 0x00, 0x00, 0x04, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x17, 0x00, 0x23, 0x00, 0x33, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x27, 0x23, 0x15, 0x14, 0x06, 0x22, 0x26, 0x35, 0x14, 0x06, 0x22, 0x26, 0x3d, 0x01, 0x23, 0x06, 0x07, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x25, 0x37, 0x16, 0x17, 0x16, 0x04, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x21, 0x26, 0x27, 0x26, 0x21, 0x20, 0x07, 0x06, 0x01, 0x12, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0x4c, 0x63, 0x95, 0xd4, 0x96, 0x95, 0xd5, 0x95, 0x63, 0x4d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0x4e, 0x67, 0x1a, 0x24, 0x80, 0x01, 0x6b, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xfe, 0x30, 0xa4, 0x2d, 0x56, 0x04, 0x1f, 0x14, 0x16, 0xc8, 0xfe, 0xe2, 0xfe, 0xe4, 0xca, 0x15, 0x02, 0xea, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0xc3, 0xa0, 0x4f, 0x64, 0x8e, 0x8e, 0x64, 0x64, 0x8e, 0x8e, 0x64, 0x4f, 0xa0, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x5b, 0x47, 0x2c, 0x26, 0x8d, 0x01, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0xb5, 0x33, 0x03, 0x3b, 0x1a, 0x19, 0xe0, 0xe0, 0x19, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, 0x13, 0x32, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x23, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x04, 0x22, 0x01, 0x80, 0xfc, 0x3f, 0x01, 0x7f, 0x61, 0xb6, 0x80, 0x23, 0x1a, 0x68, 0x22, 0x2d, 0xa4, 0xe8, 0xfc, 0xd8, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0x8c, 0x87, 0x87, 0x87, 0x87, 0xfd, 0xac, 0x8e, 0x27, 0x2c, 0x48, 0x39, 0x32, 0xb5, 0x02, 0x39, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0x11, 0x03, 0x60, 0xfc, 0xd1, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0x71, 0x87, 0x87, 0x02, 0x8c, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xd9, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x21, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x15, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x04, 0x22, 0x01, 0x80, 0xfc, 0x3f, 0x01, 0x7f, 0xfe, 0xb1, 0x03, 0x60, 0xfb, 0x28, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0x8c, 0x87, 0x87, 0x87, 0x87, 0xfd, 0xe5, 0x87, 0x87, 0x01, 0x79, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x29, 0x00, 0x37, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x05, 0x35, 0x21, 0x15, 0x01, 0x35, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x35, 0x21, 0x35, 0x21, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x35, 0x01, 0x12, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0x78, 0x03, 0x60, 0xfc, 0x68, 0x01, 0x53, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x01, 0x34, 0x01, 0x52, 0x34, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0x02, 0xea, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x05, 0x87, 0x87, 0x02, 0x2d, 0x87, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x03, 0x02, 0x87, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x03, 0x02, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x1f, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x42, 0x00, 0x00, 0x01, 0x17, 0x16, 0x14, 0x06, 0x22, 0x26, 0x34, 0x37, 0x01, 0x35, 0x21, 0x15, 0x13, 0x25, 0x37, 0x0d, 0x01, 0x27, 0x25, 0x17, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x05, 0xae, 0x3b, 0x18, 0x30, 0x45, 0x30, 0x18, 0xfc, 0x9d, 0x03, 0x60, 0x0a, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x47, 0x45, 0x01, 0x36, 0x45, 0xfb, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0xac, 0x80, 0x35, 0x4f, 0x36, 0x36, 0x4f, 0x35, 0xfe, 0x45, 0x87, 0x87, 0x02, 0xa5, 0xf0, 0x6f, 0xf1, 0x6e, 0x6e, 0xf1, 0x6f, 0xfe, 0xaf, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x91, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x33, 0x00, 0x00, 0x01, 0x35, 0x21, 0x15, 0x13, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0x11, 0x03, 0x60, 0x31, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfe, 0x65, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfd, 0x85, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0x71, 0x87, 0x87, 0x03, 0x17, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfe, 0x62, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x25, 0x00, 0x31, 0x00, 0x00, 0x25, 0x27, 0x01, 0x17, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0x53, 0x33, 0x03, 0x10, 0x33, 0xfc, 0xdf, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xac, 0x7b, 0x01, 0x96, 0x7b, 0x01, 0xbb, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xd9, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x42, 0x00, 0x00, 0x01, 0x27, 0x13, 0x17, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x03, 0x37, 0x13, 0x03, 0x22, 0x07, 0x06, 0x07, 0x0e, 0x01, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x27, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x02, 0x82, 0x56, 0xf3, 0x56, 0xfd, 0x9d, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x04, 0x68, 0xf3, 0x55, 0xf3, 0x8a, 0x2f, 0x25, 0x0a, 0x16, 0x3f, 0xb0, 0x3f, 0x19, 0x0b, 0x1f, 0x2f, 0x33, 0x1d, 0x6c, 0x0e, 0x16, 0x40, 0xb0, 0x3f, 0x19, 0x0b, 0x1f, 0x2f, 0x2f, 0x24, 0x0b, 0x15, 0x3f, 0xb1, 0x3f, 0x15, 0x0f, 0x6d, 0x1c, 0x03, 0x5c, 0x5f, 0x01, 0x0e, 0x5f, 0xfe, 0x80, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0xe6, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0xfe, 0x57, 0x69, 0x1d, 0x22, 0x62, 0x01, 0x63, 0x28, 0x21, 0x5f, 0x5f, 0x39, 0x28, 0x22, 0x62, 0x62, 0x28, 0x22, 0x5f, 0x69, 0x1e, 0x22, 0x62, 0x62, 0x22, 0x28, 0x39, 0x5f, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x03, 0x37, 0x27, 0x37, 0x17, 0x15, 0x07, 0x17, 0x15, 0x07, 0x27, 0x37, 0x27, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xb9, 0x48, 0x82, 0x3b, 0xe9, 0x36, 0x36, 0xe9, 0x3b, 0x82, 0x48, 0xfd, 0x08, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0xff, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xfe, 0x24, 0x3e, 0x4e, 0x76, 0x8d, 0x58, 0x2e, 0x2e, 0x58, 0x8d, 0x76, 0x4e, 0x3e, 0x01, 0x23, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x17, 0x00, 0x22, 0x00, 0x29, 0x00, 0x36, 0x00, 0x42, 0x00, 0x4e, 0x00, 0x00, 0x01, 0x32, 0x17, 0x16, 0x15, 0x06, 0x0f, 0x01, 0x23, 0x27, 0x26, 0x35, 0x26, 0x37, 0x36, 0x33, 0x16, 0x17, 0x16, 0x17, 0x33, 0x34, 0x37, 0x36, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x2d, 0x01, 0x17, 0x07, 0x17, 0x07, 0x25, 0x03, 0x37, 0x27, 0x37, 0x17, 0x15, 0x07, 0x17, 0x15, 0x07, 0x27, 0x37, 0x27, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x05, 0xc6, 0x17, 0x18, 0x36, 0x02, 0x2d, 0x97, 0x02, 0x8e, 0x38, 0x02, 0x09, 0x22, 0x3a, 0x24, 0x1d, 0x19, 0x09, 0x02, 0x0a, 0x1f, 0xfc, 0xb4, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x01, 0xc7, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0x78, 0x48, 0x82, 0x3b, 0xe9, 0x36, 0x36, 0xe9, 0x3b, 0x82, 0x48, 0xfd, 0x08, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x02, 0xaf, 0x0e, 0x25, 0x3f, 0x41, 0x3e, 0xcf, 0xbe, 0x44, 0x4c, 0x15, 0x19, 0x44, 0x01, 0x20, 0x20, 0x31, 0x0e, 0x1d, 0x47, 0x01, 0x4e, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x64, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0xfe, 0x17, 0x3e, 0x4e, 0x76, 0x8d, 0x58, 0x2e, 0x2e, 0x58, 0x8d, 0x76, 0x4e, 0x3e, 0x01, 0x23, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x21, 0x34, 0x36, 0x32, 0x16, 0x15, 0x23, 0x34, 0x26, 0x22, 0x06, 0x15, 0x03, 0x37, 0x27, 0x37, 0x17, 0x15, 0x07, 0x17, 0x15, 0x07, 0x27, 0x37, 0x27, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0xe1, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0x01, 0x9b, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xde, 0x48, 0x82, 0x3b, 0xe9, 0x36, 0x36, 0xe9, 0x3b, 0x82, 0x48, 0xfd, 0x08, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0x8c, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfe, 0x5d, 0x3e, 0x4e, 0x76, 0x8d, 0x58, 0x2e, 0x2e, 0x58, 0x8d, 0x76, 0x4e, 0x3e, 0x01, 0x23, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0c, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x37, 0x27, 0x37, 0x17, 0x15, 0x07, 0x17, 0x15, 0x07, 0x27, 0x37, 0x27, 0x01, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x91, 0x48, 0x82, 0x3b, 0xe9, 0x36, 0x36, 0xe9, 0x3b, 0x82, 0x48, 0x02, 0x11, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfe, 0x65, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfd, 0x85, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0xe9, 0x3e, 0x4e, 0x76, 0x8d, 0x58, 0x2e, 0x2e, 0x58, 0x8d, 0x76, 0x4e, 0x3e, 0x02, 0xc1, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfe, 0x62, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x38, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x25, 0x35, 0x21, 0x15, 0x23, 0x14, 0x06, 0x22, 0x26, 0x35, 0x21, 0x23, 0x14, 0x16, 0x32, 0x36, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0xc8, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0x78, 0x03, 0x60, 0xda, 0x7e, 0xb0, 0x7e, 0x01, 0x33, 0xba, 0x37, 0x4c, 0x37, 0x03, 0xff, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xdb, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x63, 0x87, 0x87, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0a, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x33, 0x00, 0x39, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x2d, 0x01, 0x17, 0x07, 0x17, 0x07, 0x25, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x25, 0x35, 0x21, 0x15, 0x23, 0x14, 0x06, 0x22, 0x26, 0x35, 0x21, 0x23, 0x14, 0x16, 0x32, 0x36, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x01, 0xc7, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0xfd, 0x09, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0x78, 0x03, 0x60, 0xda, 0x7e, 0xb0, 0x7e, 0x01, 0x33, 0xba, 0x37, 0x4c, 0x37, 0x03, 0xfd, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x64, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0xe8, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x63, 0x87, 0x87, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x25, 0x00, 0x2f, 0x00, 0x35, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x15, 0x05, 0x27, 0x37, 0x27, 0x37, 0x05, 0x25, 0x17, 0x07, 0x17, 0x07, 0x25, 0x01, 0x35, 0x21, 0x15, 0x23, 0x14, 0x06, 0x22, 0x26, 0x35, 0x21, 0x23, 0x14, 0x16, 0x32, 0x36, 0x01, 0x12, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x02, 0xe0, 0xfe, 0xf7, 0x46, 0xb3, 0xb3, 0x46, 0x01, 0x99, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0xfe, 0x08, 0x03, 0x60, 0xda, 0x7e, 0xb0, 0x7e, 0x01, 0x33, 0xba, 0x37, 0x4c, 0x37, 0x02, 0xea, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x02, 0xb1, 0x55, 0xce, 0x6e, 0x8a, 0x8b, 0x6e, 0xce, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0xfe, 0x07, 0x87, 0x87, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x00, 0x00, 0x07, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x35, 0x00, 0x46, 0x00, 0x00, 0x01, 0x25, 0x37, 0x0d, 0x01, 0x27, 0x25, 0x17, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x05, 0x7b, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x47, 0x45, 0x01, 0x36, 0x45, 0xfb, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xd5, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0x04, 0x16, 0xf0, 0x6f, 0xf1, 0x6e, 0x6e, 0xf1, 0x6f, 0xfe, 0xaf, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x91, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfd, 0x25, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x22, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x45, 0x00, 0x56, 0x00, 0x00, 0x25, 0x27, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x01, 0x25, 0x37, 0x0d, 0x01, 0x27, 0x25, 0x17, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x03, 0x73, 0x6d, 0x0e, 0x16, 0x3f, 0xb0, 0x3f, 0x16, 0x0e, 0x6c, 0x07, 0x07, 0x1b, 0x4c, 0x1b, 0x07, 0x02, 0x02, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x47, 0x45, 0x01, 0x36, 0x45, 0xfb, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xd5, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0x9f, 0x39, 0x28, 0x22, 0x62, 0x62, 0x22, 0x28, 0x39, 0x13, 0x10, 0x3c, 0x3c, 0x10, 0x03, 0x64, 0xf0, 0x6f, 0xf1, 0x6e, 0x6e, 0xf1, 0x6f, 0xfe, 0xaf, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x91, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfd, 0x25, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x35, 0x00, 0x46, 0x00, 0x00, 0x01, 0x17, 0x05, 0x27, 0x05, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x05, 0x07, 0x25, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x04, 0xf9, 0x45, 0xfe, 0xef, 0x45, 0xfe, 0x5a, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfe, 0x40, 0x01, 0x10, 0x45, 0xfe, 0xef, 0xfe, 0x55, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0xd5, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0x05, 0x67, 0x6e, 0xd5, 0x6f, 0xde, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x01, 0xec, 0xd4, 0x6f, 0xd5, 0xfd, 0xf1, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfd, 0x25, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x00, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x10, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x37, 0x00, 0x42, 0x00, 0x46, 0x00, 0x56, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x05, 0x07, 0x25, 0x01, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01, 0x17, 0x05, 0x27, 0x03, 0x27, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x22, 0x07, 0x06, 0x01, 0xe7, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0xfe, 0xc4, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0xf1, 0x01, 0x10, 0x45, 0xfe, 0xef, 0x02, 0x06, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfd, 0xf8, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0xb7, 0x45, 0xfe, 0xef, 0x45, 0x75, 0x6d, 0x0e, 0x16, 0x3f, 0xb0, 0x3f, 0x16, 0x0e, 0x6c, 0x07, 0x07, 0x1b, 0x4c, 0x1b, 0x07, 0x01, 0x4c, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x01, 0xe5, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x03, 0xf1, 0xd4, 0x6f, 0xd5, 0xfe, 0xbc, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x01, 0xec, 0x6e, 0xd5, 0x6f, 0xfc, 0x0c, 0x39, 0x28, 0x22, 0x62, 0x62, 0x22, 0x28, 0x39, 0x13, 0x10, 0x3c, 0x3c, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x34, 0x00, 0x4f, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x01, 0x14, 0x07, 0x06, 0x07, 0x17, 0x16, 0x07, 0x14, 0x07, 0x06, 0x22, 0x26, 0x35, 0x34, 0x3f, 0x01, 0x26, 0x27, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x12, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x02, 0xf4, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfe, 0xd3, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0x03, 0x54, 0x3f, 0x34, 0x46, 0x1d, 0x19, 0x01, 0x18, 0x18, 0x45, 0x30, 0x18, 0x1d, 0x45, 0x35, 0x3f, 0x7a, 0x37, 0x4b, 0x37, 0x02, 0xea, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x03, 0x12, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfc, 0xc4, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x03, 0x83, 0x8c, 0x62, 0x51, 0x0e, 0x3f, 0x37, 0x23, 0x2b, 0x1a, 0x1b, 0x36, 0x2c, 0x23, 0x35, 0x3f, 0x0d, 0x52, 0x62, 0x8c, 0x53, 0x77, 0x77, 0x53, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x10, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x00, 0x01, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x01, 0x25, 0x17, 0x07, 0x17, 0x07, 0x25, 0x27, 0x15, 0x05, 0x27, 0x37, 0x27, 0x37, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0xe7, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0x01, 0xbb, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0x90, 0xfe, 0xf7, 0x46, 0xb3, 0xb3, 0x46, 0xfe, 0x29, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0x4c, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x03, 0x22, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0x55, 0x55, 0xce, 0x6e, 0x8a, 0x8b, 0x6e, 0xfd, 0xf5, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x18, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x39, 0x00, 0x00, 0x01, 0x27, 0x13, 0x17, 0x01, 0x03, 0x37, 0x13, 0x01, 0x36, 0x37, 0x36, 0x20, 0x17, 0x16, 0x17, 0x07, 0x26, 0x27, 0x26, 0x23, 0x26, 0x07, 0x06, 0x07, 0x01, 0x17, 0x16, 0x0e, 0x01, 0x22, 0x26, 0x34, 0x37, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0x82, 0x56, 0xf3, 0x56, 0x01, 0x8c, 0xf3, 0x55, 0xf3, 0xfc, 0x91, 0x21, 0x2d, 0xa4, 0x01, 0xd0, 0xa4, 0x2e, 0x21, 0x68, 0x19, 0x24, 0x80, 0xb6, 0xb6, 0x7f, 0x24, 0x1a, 0x03, 0x78, 0x3b, 0x19, 0x01, 0x31, 0x44, 0x31, 0x19, 0xfb, 0x86, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x03, 0x5c, 0x5f, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0xfd, 0x91, 0x38, 0x33, 0xb5, 0xb5, 0x33, 0x38, 0x48, 0x2c, 0x27, 0x8e, 0x01, 0x8e, 0x27, 0x2c, 0x03, 0x23, 0x80, 0x35, 0x4f, 0x36, 0x36, 0x4f, 0x35, 0xbe, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x16, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x34, 0x00, 0x3c, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x21, 0x34, 0x00, 0x20, 0x00, 0x05, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x75, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfc, 0xfe, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x03, 0xff, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xdb, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfc, 0xa4, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x61, 0x60, 0x4c, 0x74, 0x75, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x35, 0x00, 0x3b, 0x00, 0x43, 0x00, 0x00, 0x01, 0x25, 0x37, 0x0d, 0x01, 0x27, 0x25, 0x17, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x21, 0x34, 0x00, 0x20, 0x00, 0x05, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x05, 0x7b, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x47, 0x45, 0x01, 0x36, 0x45, 0xfb, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x75, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfc, 0xfe, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x04, 0x16, 0xf0, 0x6f, 0xf1, 0x6e, 0x6e, 0xf1, 0x6f, 0xfe, 0xaf, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x91, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfc, 0xa4, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x61, 0x60, 0x4c, 0x74, 0x75, 0x4c, 0x00, 0x0e, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x19, 0x00, 0x4e, 0x00, 0x5a, 0x00, 0x66, 0x00, 0x6c, 0x00, 0x78, 0x00, 0x84, 0x00, 0x8a, 0x00, 0x90, 0x00, 0x96, 0x00, 0x9c, 0x00, 0xa2, 0x00, 0x00, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x05, 0x21, 0x34, 0x00, 0x20, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x27, 0x15, 0x23, 0x11, 0x26, 0x27, 0x11, 0x23, 0x35, 0x0e, 0x01, 0x22, 0x27, 0x23, 0x35, 0x26, 0x34, 0x37, 0x11, 0x26, 0x27, 0x11, 0x23, 0x11, 0x06, 0x07, 0x11, 0x16, 0x14, 0x07, 0x15, 0x23, 0x06, 0x22, 0x26, 0x27, 0x15, 0x23, 0x11, 0x06, 0x07, 0x11, 0x23, 0x35, 0x06, 0x07, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x36, 0x37, 0x35, 0x06, 0x07, 0x13, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x01, 0x15, 0x16, 0x17, 0x35, 0x26, 0x27, 0x26, 0x27, 0x15, 0x36, 0x3f, 0x01, 0x26, 0x27, 0x15, 0x16, 0x17, 0x25, 0x06, 0x07, 0x15, 0x36, 0x3f, 0x01, 0x06, 0x07, 0x15, 0x16, 0x17, 0x04, 0x21, 0x68, 0x43, 0x4c, 0x5f, 0x64, 0x47, 0x45, 0x66, 0xfe, 0x64, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x02, 0xec, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfb, 0x8b, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0x30, 0x3d, 0x1b, 0x21, 0x3d, 0x1b, 0x62, 0x80, 0x33, 0x3d, 0x27, 0x27, 0x1e, 0x1e, 0x3d, 0x1f, 0x1e, 0x27, 0x27, 0x3d, 0x32, 0x80, 0x63, 0x1a, 0x3d, 0x22, 0x1b, 0x3d, 0x31, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x03, 0xff, 0x1f, 0x15, 0x15, 0x1e, 0x1c, 0x17, 0x14, 0x20, 0xfd, 0xdb, 0x1d, 0x20, 0x20, 0x1d, 0xef, 0x67, 0x44, 0x47, 0x64, 0x5e, 0x4d, 0x42, 0x69, 0x78, 0x1f, 0x14, 0x18, 0x1b, 0x1d, 0x16, 0x15, 0x1e, 0x01, 0xe9, 0x20, 0x1c, 0x1d, 0x5c, 0x1e, 0x1f, 0x1c, 0x21, 0xf3, 0x1e, 0x1f, 0x27, 0x16, 0xfc, 0xad, 0x1f, 0x1d, 0x16, 0x26, 0xf3, 0x1f, 0x1d, 0x20, 0x1c, 0x04, 0x1a, 0x52, 0x6c, 0x75, 0x49, 0x4f, 0x6f, 0x6f, 0xfc, 0xe9, 0x60, 0x4c, 0x74, 0x75, 0x4c, 0xe6, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x01, 0x37, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x9b, 0x85, 0xba, 0x01, 0x3b, 0x2e, 0x29, 0xfe, 0x6e, 0x59, 0x36, 0x47, 0x24, 0x40, 0x3c, 0x9c, 0x3c, 0x01, 0x3d, 0x04, 0x01, 0xfd, 0x6a, 0x02, 0x96, 0x01, 0x04, 0xfe, 0xc3, 0x3c, 0x9c, 0x3c, 0x40, 0x24, 0x46, 0x37, 0x59, 0x01, 0x93, 0x2a, 0x2e, 0xfe, 0xc5, 0xbc, 0x86, 0x9c, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x02, 0xa4, 0x18, 0x21, 0x21, 0x18, 0x16, 0x23, 0x20, 0xfc, 0x0a, 0x01, 0xa2, 0x0f, 0x12, 0xfe, 0x91, 0x4f, 0x6f, 0x6f, 0x4f, 0x49, 0x75, 0x6c, 0x52, 0x19, 0x20, 0x23, 0x16, 0x18, 0x21, 0x21, 0x01, 0x79, 0xa3, 0x01, 0x0a, 0x8c, 0x13, 0x28, 0x0a, 0x08, 0xf2, 0x14, 0x09, 0x26, 0x1e, 0x18, 0x84, 0x21, 0x2d, 0xd2, 0x19, 0x1d, 0x9c, 0x2d, 0x21, 0xfd, 0x07, 0x0b, 0xc3, 0x09, 0x14, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x2d, 0x00, 0x35, 0x00, 0x00, 0x01, 0x27, 0x13, 0x17, 0x01, 0x03, 0x37, 0x13, 0x01, 0x27, 0x13, 0x17, 0x01, 0x03, 0x37, 0x13, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x21, 0x34, 0x00, 0x20, 0x00, 0x05, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x02, 0x82, 0x56, 0xf3, 0x56, 0x01, 0x8c, 0xf3, 0x55, 0xf3, 0xfd, 0x2c, 0x56, 0xf3, 0x56, 0x01, 0x8c, 0xf3, 0x55, 0xf3, 0xfb, 0x43, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x75, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfc, 0xfe, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x04, 0x13, 0x5f, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0xfe, 0x58, 0x5f, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0x3f, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfc, 0xa4, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x61, 0x60, 0x4c, 0x74, 0x75, 0x4c, 0x00, 0x07, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x11, 0x00, 0x1d, 0x00, 0x29, 0x00, 0x35, 0x00, 0x41, 0x00, 0x47, 0x00, 0x4f, 0x00, 0x00, 0x01, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x03, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x21, 0x34, 0x00, 0x20, 0x00, 0x05, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x05, 0x30, 0x4d, 0x21, 0x1c, 0x17, 0x13, 0x0c, 0x0c, 0x20, 0x10, 0x09, 0x04, 0x0b, 0x23, 0x1c, 0x35, 0x10, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfe, 0x65, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfd, 0x85, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x75, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfc, 0xfe, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x02, 0xc8, 0x74, 0x32, 0x0f, 0x0b, 0x04, 0x0c, 0x22, 0x14, 0x15, 0x0e, 0x0f, 0x24, 0x14, 0x10, 0x01, 0xc0, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfe, 0x62, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfc, 0xa4, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x61, 0x60, 0x4c, 0x74, 0x75, 0x4c, 0x00, 0x00, 0x06, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x06, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x33, 0x00, 0x00, 0x01, 0x25, 0x17, 0x07, 0x17, 0x07, 0x25, 0x27, 0x15, 0x05, 0x27, 0x37, 0x27, 0x37, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x21, 0x34, 0x00, 0x20, 0x00, 0x05, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x04, 0x09, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0x90, 0xfe, 0xf7, 0x46, 0xb3, 0xb3, 0x46, 0xfe, 0x29, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x75, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfc, 0xfe, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x04, 0x27, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0x55, 0x55, 0xce, 0x6e, 0x8a, 0x8b, 0x6e, 0xfd, 0xf5, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfc, 0xa4, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x61, 0x60, 0x4c, 0x74, 0x75, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x55, 0xff, 0x6a, 0x08, 0x14, 0x06, 0x6e, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x13, 0x00, 0x3d, 0x00, 0x62, 0x00, 0x00, 0x25, 0x21, 0x34, 0x00, 0x20, 0x00, 0x01, 0x15, 0x05, 0x27, 0x37, 0x27, 0x37, 0x05, 0x25, 0x17, 0x07, 0x17, 0x07, 0x25, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x14, 0x07, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x06, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x02, 0x07, 0x02, 0x21, 0x20, 0x03, 0x26, 0x03, 0x07, 0x06, 0x07, 0x06, 0x22, 0x26, 0x35, 0x34, 0x37, 0x36, 0x3f, 0x01, 0x26, 0x37, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x17, 0x16, 0x17, 0x26, 0x27, 0x26, 0x21, 0x20, 0x07, 0x06, 0x07, 0x36, 0x3f, 0x01, 0x07, 0x06, 0x07, 0x06, 0x22, 0x27, 0x06, 0x05, 0xfa, 0xfc, 0x74, 0x01, 0x09, 0x01, 0x79, 0x01, 0x0a, 0xfd, 0xf2, 0xfe, 0xf7, 0x45, 0xb2, 0xb2, 0x45, 0x01, 0x99, 0x01, 0x0a, 0x45, 0xb2, 0xb2, 0x45, 0xfe, 0xf6, 0xfc, 0x90, 0x01, 0xda, 0x01, 0x4e, 0x01, 0x50, 0x01, 0xd8, 0x02, 0x54, 0x35, 0x15, 0x1b, 0x30, 0x45, 0x1c, 0x16, 0x10, 0x0a, 0x26, 0xbc, 0xec, 0xfe, 0xb0, 0xfe, 0xb2, 0xed, 0xbc, 0x27, 0x09, 0x10, 0x17, 0x1c, 0x44, 0x30, 0x1a, 0x15, 0x36, 0x53, 0x02, 0x7a, 0x01, 0x92, 0x01, 0x1c, 0x01, 0x1e, 0x01, 0x90, 0x01, 0x18, 0x21, 0x22, 0x1c, 0x17, 0x10, 0x29, 0x7b, 0x25, 0x15, 0x2a, 0x8b, 0xc7, 0xfe, 0xe1, 0xfe, 0xe4, 0xca, 0x8a, 0x2a, 0x15, 0x25, 0x7a, 0x28, 0x10, 0x17, 0x1c, 0x44, 0x18, 0x01, 0xcb, 0xe8, 0x01, 0x46, 0xfe, 0xba, 0x02, 0x74, 0x55, 0xce, 0x6e, 0x8a, 0x8b, 0x6e, 0xce, 0xce, 0x6e, 0x8b, 0x8a, 0x6e, 0xce, 0xe8, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0x1d, 0x1b, 0x1f, 0x14, 0x18, 0x1f, 0x25, 0x26, 0x36, 0x1f, 0x19, 0x39, 0x20, 0xfe, 0xe9, 0xd1, 0xfe, 0xfa, 0x01, 0x06, 0xd0, 0x01, 0x16, 0x1e, 0x39, 0x19, 0x1f, 0x36, 0x26, 0x25, 0x1f, 0x19, 0x13, 0x1e, 0x1c, 0x1d, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x14, 0x13, 0x1a, 0x1f, 0x19, 0x39, 0x88, 0x2d, 0x0e, 0x0f, 0xc7, 0x9a, 0xe0, 0xe0, 0x9b, 0xc6, 0x10, 0x0d, 0x2d, 0x88, 0x39, 0x19, 0x1f, 0x1b, 0x14, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x07, 0x00, 0x13, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x00, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0xdb, 0x87, 0xbf, 0x87, 0x87, 0xbf, 0xfe, 0xe0, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x01, 0x5a, 0xd4, 0x96, 0x96, 0xd4, 0x96, 0x03, 0x3b, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xdb, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x03, 0x00, 0x07, 0x00, 0x12, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x00, 0x01, 0x25, 0x37, 0x0d, 0x01, 0x27, 0x25, 0x17, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x02, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x05, 0x7b, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x47, 0x45, 0x01, 0x36, 0x45, 0xfb, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x44, 0x5f, 0x43, 0x43, 0x5f, 0xfd, 0x07, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x16, 0xf0, 0x6f, 0xf1, 0x6e, 0x6e, 0xf1, 0x6f, 0xfe, 0xaf, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xfe, 0x14, 0x6a, 0x4b, 0x4b, 0x6a, 0x4b, 0x01, 0xa6, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x08, 0x00, 0x10, 0x00, 0x14, 0x00, 0x18, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x3a, 0x00, 0x46, 0x00, 0x00, 0x01, 0x17, 0x16, 0x14, 0x06, 0x22, 0x26, 0x34, 0x37, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x25, 0x37, 0x0d, 0x01, 0x27, 0x25, 0x17, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x05, 0xae, 0x3b, 0x18, 0x30, 0x45, 0x30, 0x18, 0xfd, 0x67, 0x87, 0xbf, 0x87, 0x87, 0xbf, 0x02, 0x19, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x47, 0x45, 0x01, 0x36, 0x45, 0xfb, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0xac, 0x80, 0x35, 0x4f, 0x36, 0x36, 0x4f, 0x35, 0xfe, 0x2e, 0xd4, 0x96, 0x96, 0xd4, 0x96, 0x03, 0x52, 0xf0, 0x6f, 0xf1, 0x6e, 0x6e, 0xf1, 0x6f, 0xfe, 0xaf, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0x91, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x07, 0x00, 0x1f, 0xff, 0x3c, 0x07, 0x63, 0x06, 0x6e, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1f, 0x00, 0x6b, 0x00, 0x94, 0x00, 0x00, 0x00, 0x26, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x20, 0x26, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x2f, 0x01, 0x25, 0x17, 0x05, 0x25, 0x37, 0x05, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x35, 0x2e, 0x01, 0x27, 0x02, 0x11, 0x34, 0x36, 0x37, 0x36, 0x37, 0x12, 0x20, 0x13, 0x16, 0x17, 0x1e, 0x01, 0x15, 0x10, 0x03, 0x0e, 0x01, 0x07, 0x15, 0x23, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x13, 0x34, 0x26, 0x22, 0x06, 0x07, 0x06, 0x07, 0x06, 0x0f, 0x01, 0x0e, 0x01, 0x1d, 0x01, 0x23, 0x35, 0x06, 0x22, 0x27, 0x15, 0x23, 0x35, 0x34, 0x26, 0x2f, 0x01, 0x26, 0x27, 0x26, 0x27, 0x2e, 0x01, 0x22, 0x06, 0x15, 0x12, 0x17, 0x16, 0x17, 0x16, 0x1d, 0x01, 0x25, 0x16, 0x32, 0x37, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x3e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x07, 0x16, 0x17, 0x1e, 0x02, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x04, 0x93, 0x49, 0x4a, 0x68, 0x4b, 0x4b, 0xfd, 0x8f, 0x49, 0x49, 0x69, 0x4a, 0x4a, 0xed, 0x45, 0x01, 0x36, 0x45, 0x02, 0x3e, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfd, 0x1b, 0x87, 0xbf, 0x87, 0x87, 0xbf, 0xfd, 0xde, 0x41, 0x4e, 0x15, 0x7c, 0x5d, 0x37, 0x35, 0x9d, 0xec, 0x02, 0x9f, 0xec, 0x9c, 0x35, 0x37, 0x5e, 0x7c, 0x16, 0x4d, 0x41, 0x7a, 0x23, 0x74, 0x1a, 0x6e, 0x01, 0x23, 0x34, 0x21, 0x06, 0x0c, 0x5f, 0x25, 0x32, 0x55, 0x23, 0x18, 0x7a, 0x63, 0xeb, 0x6d, 0x7b, 0x18, 0x23, 0x55, 0x32, 0x25, 0x5e, 0x0d, 0x05, 0x22, 0x34, 0x23, 0x02, 0x6e, 0x1a, 0x74, 0x22, 0x01, 0x2b, 0x6b, 0xee, 0x62, 0x18, 0x2b, 0x83, 0x32, 0x0f, 0x36, 0x10, 0x01, 0x08, 0x0a, 0x0b, 0x2e, 0x0e, 0x0f, 0x2d, 0x81, 0xc8, 0xfd, 0xc6, 0xca, 0x81, 0x2d, 0x10, 0x0d, 0x2e, 0x16, 0x07, 0x02, 0x0f, 0x36, 0x0f, 0x33, 0x82, 0x2c, 0x18, 0x03, 0x28, 0x53, 0x75, 0x51, 0x51, 0x75, 0x53, 0x53, 0x75, 0x51, 0x51, 0x76, 0x52, 0xee, 0x6e, 0xf1, 0x6f, 0xf0, 0xf0, 0x6f, 0xf1, 0xfc, 0xd6, 0xd4, 0x96, 0x96, 0xd4, 0x96, 0xfe, 0x78, 0xcb, 0x3e, 0x5b, 0x31, 0x01, 0x17, 0x01, 0x27, 0x53, 0x6b, 0x0a, 0xdf, 0xb0, 0x01, 0x08, 0xfe, 0xf8, 0xaf, 0xe0, 0x0a, 0x6b, 0x53, 0xfe, 0xd9, 0xfe, 0xe9, 0x31, 0x5b, 0x3e, 0xcb, 0xe7, 0x24, 0x1f, 0x6e, 0x39, 0xf0, 0x01, 0x12, 0x1c, 0x28, 0x23, 0x6d, 0xf3, 0x71, 0x2c, 0x25, 0x40, 0x1c, 0x3c, 0x3f, 0xfb, 0x4c, 0x1e, 0x20, 0x4e, 0xfb, 0x3f, 0x3c, 0x1c, 0x40, 0x25, 0x2c, 0x71, 0xf3, 0x6d, 0x23, 0x28, 0x1c, 0xfe, 0xee, 0xf0, 0x39, 0x6e, 0x1f, 0x24, 0xe7, 0xdb, 0x26, 0x25, 0x21, 0x59, 0x3b, 0x65, 0x56, 0x22, 0x13, 0x44, 0x78, 0x0f, 0x86, 0x38, 0x36, 0x30, 0x0e, 0x0a, 0xb5, 0x90, 0xe0, 0xe0, 0x8f, 0xb5, 0x0b, 0x0e, 0x30, 0x6e, 0x86, 0x0f, 0x78, 0x44, 0x13, 0x22, 0x56, 0x65, 0x3b, 0x59, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2f, 0x00, 0x3b, 0x00, 0x47, 0x00, 0x4f, 0x00, 0x5b, 0x00, 0x67, 0x00, 0x00, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x37, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x17, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x27, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x02, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x8d, 0x83, 0x53, 0x60, 0x76, 0x7d, 0x59, 0x55, 0x81, 0x68, 0x81, 0x56, 0x59, 0x7d, 0x77, 0x5f, 0x53, 0x84, 0x2c, 0x68, 0x43, 0x4c, 0x5f, 0x64, 0x47, 0x45, 0x66, 0x77, 0x1f, 0x15, 0x15, 0x1e, 0x1c, 0x17, 0x14, 0x20, 0xfe, 0xca, 0x67, 0x44, 0x47, 0x64, 0x5e, 0x4d, 0x42, 0x69, 0x78, 0x1f, 0x14, 0x18, 0x1b, 0x1d, 0x16, 0x15, 0x1e, 0x0f, 0x87, 0xbf, 0x87, 0x87, 0xbf, 0xfd, 0x37, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x04, 0x1a, 0x66, 0x88, 0x93, 0x5b, 0x63, 0x8b, 0x8b, 0x63, 0x63, 0x8b, 0x8b, 0x63, 0x5b, 0x93, 0x88, 0x66, 0x52, 0x6c, 0x75, 0x49, 0x4f, 0x6f, 0x6f, 0x4f, 0x18, 0x21, 0x21, 0x18, 0x16, 0x23, 0x20, 0x19, 0x4f, 0x6f, 0x6f, 0x4f, 0x49, 0x75, 0x6c, 0x52, 0x19, 0x20, 0x23, 0x16, 0x18, 0x21, 0x21, 0xfd, 0x28, 0xd4, 0x96, 0x96, 0xd4, 0x96, 0x02, 0x26, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x0a, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x4a, 0x00, 0x56, 0x00, 0x5e, 0x00, 0x62, 0x00, 0x66, 0x00, 0x6b, 0x00, 0x70, 0x00, 0x74, 0x00, 0x79, 0x00, 0x7e, 0x00, 0x00, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x34, 0x27, 0x11, 0x23, 0x11, 0x26, 0x27, 0x15, 0x17, 0x07, 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0x33, 0x11, 0x33, 0x11, 0x27, 0x37, 0x17, 0x35, 0x26, 0x20, 0x07, 0x15, 0x37, 0x17, 0x07, 0x11, 0x33, 0x11, 0x33, 0x11, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x35, 0x23, 0x15, 0x23, 0x11, 0x27, 0x37, 0x35, 0x06, 0x07, 0x11, 0x23, 0x11, 0x06, 0x07, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x24, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x13, 0x11, 0x33, 0x11, 0x13, 0x33, 0x35, 0x27, 0x17, 0x33, 0x35, 0x07, 0x27, 0x11, 0x15, 0x17, 0x35, 0x26, 0x01, 0x35, 0x07, 0x15, 0x03, 0x06, 0x07, 0x15, 0x37, 0x11, 0x35, 0x07, 0x27, 0x15, 0x01, 0x12, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0x3a, 0x3d, 0x1b, 0x22, 0x05, 0x05, 0x3d, 0x2f, 0x3d, 0x3d, 0x3e, 0x3d, 0x3d, 0x3d, 0x3d, 0x51, 0x45, 0x87, 0x96, 0xfe, 0x8b, 0x96, 0x87, 0x45, 0x52, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3d, 0x3e, 0x2e, 0x3e, 0x05, 0x05, 0x21, 0x1c, 0x3d, 0x3b, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x02, 0xb5, 0x44, 0x5f, 0x43, 0x43, 0x5f, 0x11, 0x3d, 0xf5, 0x3d, 0x3d, 0x7a, 0x2f, 0x03, 0x2c, 0x2f, 0x17, 0xfd, 0x47, 0x3d, 0x3e, 0x18, 0x16, 0x2e, 0x2c, 0x02, 0x02, 0xea, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0xaa, 0x8f, 0xfe, 0x85, 0x01, 0xf3, 0x2c, 0x28, 0x67, 0x04, 0x09, 0xfe, 0x2d, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x02, 0x38, 0xfe, 0xd7, 0x01, 0x10, 0x3f, 0x6f, 0x69, 0x7b, 0x60, 0x60, 0x7b, 0x69, 0x6f, 0x3f, 0xfe, 0xf0, 0x01, 0x29, 0xfd, 0xc8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x01, 0xd3, 0x09, 0x04, 0x68, 0x28, 0x2c, 0xfe, 0x0c, 0x01, 0x7d, 0x90, 0xab, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x19, 0x6a, 0x4b, 0x4b, 0x6a, 0x4b, 0x01, 0x64, 0x02, 0x38, 0xfd, 0xc8, 0x01, 0x0f, 0xb1, 0x2f, 0xe0, 0x63, 0x04, 0x22, 0x01, 0x23, 0x7f, 0x24, 0x7a, 0x16, 0xfe, 0x6f, 0xe0, 0x2f, 0xb1, 0x01, 0xa4, 0x13, 0x17, 0x79, 0x24, 0xfe, 0xdb, 0x81, 0x22, 0x04, 0x63, 0x00, 0x08, 0x00, 0x99, 0xff, 0x6a, 0x0b, 0x33, 0x07, 0x6c, 0x00, 0x09, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x25, 0x00, 0x31, 0x00, 0x3d, 0x00, 0x49, 0x00, 0x55, 0x00, 0x00, 0x01, 0x21, 0x15, 0x03, 0x33, 0x15, 0x21, 0x35, 0x13, 0x23, 0x25, 0x21, 0x15, 0x03, 0x33, 0x15, 0x21, 0x35, 0x13, 0x23, 0x25, 0x21, 0x15, 0x03, 0x33, 0x15, 0x21, 0x35, 0x13, 0x23, 0x00, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x01, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x09, 0xdd, 0x01, 0x55, 0xdf, 0xdf, 0xfe, 0xa2, 0xe0, 0xd7, 0xfe, 0x48, 0x01, 0x55, 0xdf, 0xdf, 0xfe, 0xa2, 0xe0, 0xd7, 0xfe, 0x48, 0x01, 0x55, 0xdf, 0xdf, 0xfe, 0xa2, 0xdf, 0xd6, 0xfc, 0xe1, 0x44, 0x5f, 0x43, 0x43, 0x5f, 0x02, 0x10, 0x7e, 0xb1, 0x7e, 0x7a, 0x37, 0x4b, 0x37, 0xfe, 0x65, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xfd, 0x85, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x07, 0x6c, 0x68, 0xfe, 0xf4, 0x5c, 0x68, 0x01, 0x0c, 0x5c, 0x68, 0xfe, 0xf4, 0x5c, 0x68, 0x01, 0x0c, 0x5c, 0x68, 0xfe, 0xf4, 0x5c, 0x68, 0x01, 0x0c, 0xfa, 0x7f, 0x6a, 0x4b, 0x4b, 0x6a, 0x4b, 0x03, 0x44, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfe, 0x62, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x00, 0x05, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2b, 0x00, 0x37, 0x00, 0x00, 0x01, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x03, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x04, 0x34, 0x36, 0x32, 0x16, 0x14, 0x06, 0x22, 0x01, 0x27, 0x37, 0x27, 0x37, 0x17, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x02, 0x53, 0x56, 0x66, 0x66, 0x56, 0x66, 0x66, 0x56, 0x66, 0x66, 0x56, 0x66, 0xfe, 0x59, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x79, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x02, 0x42, 0x87, 0xbf, 0x87, 0x87, 0xbf, 0x01, 0x01, 0x55, 0x65, 0x65, 0x55, 0x66, 0x67, 0x55, 0x66, 0x66, 0x55, 0x67, 0x03, 0x28, 0x5f, 0x71, 0x72, 0x5f, 0x71, 0x71, 0x5f, 0x72, 0x71, 0x5f, 0x71, 0xaf, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0xfe, 0xc3, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x1c, 0xd4, 0x96, 0x96, 0xd4, 0x96, 0x02, 0x64, 0x5f, 0x71, 0x72, 0x5f, 0x71, 0x71, 0x5f, 0x72, 0x71, 0x5f, 0x71, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x00, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x14, 0x06, 0x23, 0x22, 0x26, 0x25, 0x34, 0x36, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x05, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x02, 0x42, 0x49, 0x35, 0x34, 0x4a, 0x4a, 0x34, 0x35, 0x49, 0x02, 0x08, 0x4a, 0x68, 0x4b, 0x4b, 0x34, 0x35, 0x49, 0xfc, 0x4f, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x79, 0x01, 0x93, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x91, 0xfe, 0x6f, 0xfe, 0xe3, 0xfe, 0xe4, 0xfe, 0x6d, 0x03, 0xfd, 0x3b, 0x51, 0x51, 0x76, 0x52, 0x53, 0x3a, 0x3b, 0x51, 0x51, 0x3b, 0x3a, 0x53, 0x53, 0xd9, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0x74, 0xfe, 0xc4, 0xfe, 0x43, 0x01, 0xbd, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0xc0, 0xfe, 0x40, 0x00, 0x00, 0x0a, 0x00, 0x99, 0xff, 0x6a, 0x06, 0xe9, 0x06, 0x6e, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x13, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x37, 0x00, 0x00, 0x13, 0x10, 0x00, 0x21, 0x20, 0x00, 0x11, 0x10, 0x00, 0x21, 0x20, 0x00, 0x01, 0x35, 0x21, 0x15, 0x33, 0x35, 0x21, 0x15, 0x25, 0x27, 0x25, 0x17, 0x05, 0x25, 0x37, 0x05, 0x01, 0x21, 0x11, 0x21, 0x01, 0x21, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x07, 0x01, 0x11, 0x27, 0x12, 0x01, 0x02, 0x27, 0x26, 0x21, 0x20, 0x07, 0x06, 0x03, 0x17, 0x21, 0x99, 0x01, 0xd9, 0x01, 0x4f, 0x01, 0x50, 0x01, 0xd7, 0xfe, 0x29, 0xfe, 0xb0, 0xfe, 0xb1, 0xfe, 0x27, 0x01, 0x48, 0x01, 0x7f, 0xc2, 0x01, 0x80, 0xfc, 0x65, 0x45, 0x01, 0x36, 0x45, 0x02, 0x3e, 0xfe, 0xcb, 0x45, 0x01, 0x35, 0xfc, 0x9a, 0x02, 0xce, 0xfd, 0x32, 0x02, 0xff, 0xfc, 0xd1, 0xb0, 0xe7, 0xe8, 0xf9, 0xb6, 0x14, 0xca, 0xfc, 0x3f, 0xcc, 0x14, 0x05, 0x41, 0x18, 0xab, 0xc8, 0xfe, 0xe2, 0xfe, 0xe4, 0xca, 0xab, 0x19, 0xca, 0x03, 0xc1, 0x02, 0xea, 0x01, 0x75, 0x02, 0x0f, 0xfd, 0xf1, 0xfe, 0x8b, 0xfe, 0x8c, 0xfd, 0xf4, 0x02, 0x0c, 0x01, 0xba, 0x87, 0x87, 0x87, 0x87, 0xe6, 0x6e, 0xf1, 0x6f, 0xf0, 0xf0, 0x6f, 0xf1, 0xfc, 0x87, 0x01, 0x18, 0xfe, 0x61, 0x93, 0xd9, 0xc9, 0x01, 0x11, 0x9e, 0xfe, 0xc4, 0x01, 0x3c, 0x9e, 0xfe, 0xef, 0x01, 0xb3, 0x01, 0x02, 0xbf, 0xe0, 0xe0, 0xbf, 0xfe, 0xff, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x34, 0xff, 0x6a, 0x07, 0x56, 0x07, 0x14, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x52, 0x00, 0x8f, 0x00, 0x9d, 0x00, 0xab, 0x00, 0xb5, 0x00, 0xbb, 0x00, 0xc1, 0x00, 0x00, 0x00, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x37, 0x17, 0x16, 0x33, 0x32, 0x37, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x20, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x16, 0x33, 0x32, 0x01, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x07, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x25, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x15, 0x23, 0x34, 0x36, 0x32, 0x16, 0x15, 0x21, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x15, 0x23, 0x34, 0x36, 0x32, 0x16, 0x15, 0x01, 0x26, 0x27, 0x06, 0x07, 0x15, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x15, 0x36, 0x37, 0x06, 0x23, 0x05, 0x35, 0x23, 0x22, 0x27, 0x16, 0x03, 0x88, 0x75, 0x52, 0x38, 0x6c, 0x59, 0x5b, 0x6a, 0x38, 0x90, 0x66, 0x69, 0x8e, 0x83, 0x05, 0x1a, 0x31, 0xf7, 0xfe, 0xbf, 0xf8, 0x35, 0x20, 0x03, 0x86, 0x90, 0x6d, 0xfd, 0xa0, 0x07, 0x01, 0x2b, 0x05, 0xfe, 0xd5, 0x07, 0x0d, 0x01, 0x15, 0x14, 0xfe, 0xe7, 0x10, 0x14, 0x5c, 0x93, 0xa3, 0x01, 0xb9, 0xa3, 0x90, 0x5d, 0x17, 0x0f, 0xfe, 0xec, 0x13, 0x01, 0x10, 0x0d, 0x07, 0xfe, 0xdb, 0x04, 0x01, 0x26, 0x06, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x73, 0x04, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x04, 0x5e, 0x03, 0x60, 0x08, 0x13, 0x5e, 0x14, 0x5a, 0x11, 0x18, 0x69, 0xac, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xad, 0x68, 0x1b, 0x0e, 0x55, 0x13, 0x58, 0x12, 0x08, 0x5b, 0x04, 0x02, 0xe0, 0x13, 0x2d, 0x3b, 0x2c, 0x13, 0x79, 0x7e, 0xb0, 0x7e, 0x01, 0x9b, 0x13, 0x2c, 0x3b, 0x2c, 0x13, 0x7a, 0x7e, 0xb1, 0x7e, 0xfe, 0x67, 0x20, 0x24, 0x18, 0x2d, 0x27, 0x21, 0x24, 0x1d, 0x7b, 0x56, 0x2e, 0x41, 0x34, 0xfe, 0x73, 0x13, 0x39, 0x38, 0x2e, 0x02, 0xfc, 0x2e, 0x78, 0x3d, 0x3d, 0x78, 0xfc, 0x25, 0x42, 0x20, 0x19, 0x44, 0x47, 0x81, 0x93, 0x8f, 0x7d, 0x4b, 0x53, 0x17, 0x17, 0x42, 0x01, 0xc7, 0x24, 0x62, 0x15, 0x43, 0x16, 0x4a, 0x41, 0x69, 0x3f, 0x6c, 0x3a, 0x31, 0xe2, 0x77, 0x84, 0x84, 0x76, 0xe3, 0x38, 0x35, 0x6a, 0x3f, 0x67, 0x3e, 0x4c, 0x15, 0x43, 0x15, 0x52, 0x34, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0xbd, 0x4d, 0x45, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x44, 0x4d, 0x07, 0x44, 0x07, 0x56, 0x57, 0x24, 0x40, 0x22, 0x3c, 0x3c, 0xfe, 0xfd, 0x8c, 0x9e, 0x9e, 0x8c, 0x01, 0x03, 0x40, 0x36, 0x20, 0x40, 0x22, 0x4f, 0x60, 0x07, 0x44, 0x51, 0x2b, 0x5a, 0x45, 0x45, 0x59, 0x2c, 0x8c, 0xc4, 0xc4, 0x8c, 0x2b, 0x5a, 0x45, 0x45, 0x59, 0x2c, 0x8c, 0xc4, 0xc4, 0x8c, 0xfe, 0x03, 0x07, 0x0b, 0x07, 0x0a, 0x91, 0x05, 0x04, 0x84, 0x63, 0x27, 0x46, 0x0a, 0x61, 0x61, 0x09, 0x43, 0x00, 0x00, 0x09, 0x00, 0x56, 0xff, 0x6a, 0x08, 0x13, 0x07, 0x14, 0x00, 0x3f, 0x00, 0x48, 0x00, 0x5d, 0x00, 0xa8, 0x00, 0xb6, 0x00, 0xc4, 0x00, 0xce, 0x00, 0xd4, 0x00, 0xda, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x20, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x36, 0x3f, 0x01, 0x07, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x06, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x17, 0x16, 0x04, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x37, 0x17, 0x16, 0x33, 0x32, 0x37, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x20, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x16, 0x33, 0x32, 0x05, 0x22, 0x26, 0x35, 0x34, 0x36, 0x3f, 0x01, 0x34, 0x27, 0x07, 0x27, 0x37, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x1e, 0x01, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x02, 0x07, 0x06, 0x20, 0x27, 0x26, 0x03, 0x26, 0x27, 0x07, 0x06, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x15, 0x23, 0x34, 0x36, 0x32, 0x16, 0x15, 0x21, 0x34, 0x2e, 0x01, 0x22, 0x0e, 0x01, 0x15, 0x23, 0x34, 0x36, 0x32, 0x16, 0x15, 0x01, 0x26, 0x27, 0x06, 0x07, 0x15, 0x16, 0x33, 0x32, 0x3f, 0x01, 0x15, 0x36, 0x37, 0x06, 0x23, 0x05, 0x35, 0x23, 0x22, 0x27, 0x16, 0x06, 0xf4, 0x02, 0x09, 0x09, 0x14, 0x03, 0x18, 0x26, 0xd9, 0x8b, 0x68, 0xfe, 0xe7, 0x69, 0x88, 0xdc, 0x26, 0x19, 0x04, 0x13, 0x09, 0x09, 0x01, 0x16, 0x48, 0x7a, 0x27, 0x0f, 0x2e, 0x28, 0x2b, 0x19, 0x07, 0x0e, 0x01, 0x15, 0x14, 0xfe, 0xe7, 0x11, 0x13, 0x5c, 0x94, 0xa3, 0x01, 0xb8, 0xa4, 0x91, 0x5c, 0x18, 0x0e, 0xfe, 0xeb, 0x14, 0x01, 0x0f, 0x0f, 0x07, 0x19, 0x2b, 0x28, 0x2f, 0x0e, 0x2a, 0x7d, 0x49, 0xfd, 0x1b, 0x75, 0x53, 0x37, 0x6c, 0x58, 0x5c, 0x6a, 0x38, 0x90, 0x67, 0x68, 0x8e, 0x84, 0x05, 0x1b, 0x31, 0xf6, 0xfe, 0xbf, 0xf8, 0x36, 0x1f, 0x02, 0x87, 0x90, 0x6c, 0xfc, 0xd6, 0x21, 0x32, 0x38, 0x2f, 0x51, 0x07, 0x5c, 0x04, 0x5a, 0x05, 0x07, 0x10, 0x0b, 0x1d, 0x04, 0x15, 0x22, 0x0d, 0x36, 0x81, 0xe3, 0x55, 0x5e, 0xcb, 0x5f, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x14, 0x04, 0x1c, 0x0b, 0x12, 0x06, 0x04, 0x5e, 0x04, 0x5f, 0x06, 0x03, 0x51, 0x2e, 0x36, 0x30, 0x21, 0x27, 0x2f, 0x10, 0x0d, 0x15, 0x28, 0x68, 0xad, 0xc3, 0xfd, 0xfa, 0xc4, 0xad, 0x68, 0x26, 0x18, 0x0e, 0x20, 0x02, 0x9a, 0x14, 0x2b, 0x3c, 0x2d, 0x12, 0x7a, 0x7e, 0xb0, 0x7e, 0x01, 0x9c, 0x13, 0x2c, 0x3b, 0x2d, 0x12, 0x7a, 0x7e, 0xb0, 0x7e, 0xfe, 0x67, 0x20, 0x24, 0x17, 0x2d, 0x27, 0x21, 0x24, 0x1c, 0x7b, 0x56, 0x2f, 0x41, 0x34, 0xfe, 0x72, 0x12, 0x38, 0x39, 0x2f, 0x03, 0x7c, 0x28, 0x2c, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x2a, 0x27, 0x2c, 0x19, 0x2c, 0x88, 0x33, 0x3c, 0x25, 0x57, 0x4c, 0x69, 0x3f, 0x6c, 0x3a, 0x31, 0xe2, 0x77, 0x84, 0x84, 0x76, 0xe3, 0x38, 0x35, 0x6a, 0x3f, 0x67, 0x44, 0x60, 0x28, 0x3c, 0x33, 0x88, 0x2c, 0x19, 0xaf, 0x2e, 0x78, 0x3d, 0x3d, 0x78, 0xfc, 0x25, 0x42, 0x20, 0x19, 0x44, 0x47, 0x81, 0x93, 0x8f, 0x7d, 0x4b, 0x53, 0x17, 0x17, 0x42, 0x41, 0x36, 0x25, 0x2c, 0x34, 0x11, 0x1d, 0x03, 0x4a, 0x07, 0x44, 0x06, 0x4d, 0x45, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x44, 0x4d, 0x07, 0x44, 0x07, 0x34, 0x19, 0x1d, 0x11, 0x34, 0x2c, 0x25, 0x36, 0x3c, 0x33, 0x2a, 0x68, 0x62, 0xfe, 0xfd, 0x8c, 0x9e, 0x9e, 0x8c, 0x01, 0x03, 0x5d, 0x70, 0x2d, 0x6f, 0x01, 0xc4, 0x2b, 0x5a, 0x45, 0x45, 0x59, 0x2c, 0x8c, 0xc4, 0xc4, 0x8c, 0x2b, 0x5a, 0x45, 0x45, 0x59, 0x2c, 0x8c, 0xc4, 0xc4, 0x8c, 0xfe, 0x03, 0x07, 0x0b, 0x07, 0x0a, 0x91, 0x05, 0x04, 0x84, 0x63, 0x27, 0x46, 0x0a, 0x61, 0x61, 0x09, 0x43, 0x00, 0x09, 0x00, 0x34, 0xff, 0x6a, 0x07, 0x56, 0x07, 0x14, 0x00, 0x08, 0x00, 0x1d, 0x00, 0x2a, 0x00, 0x5f, 0x00, 0x9c, 0x00, 0xaa, 0x00, 0xb4, 0x00, 0xc3, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x37, 0x17, 0x16, 0x33, 0x32, 0x37, 0x16, 0x15, 0x14, 0x07, 0x0e, 0x01, 0x20, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x16, 0x33, 0x32, 0x17, 0x06, 0x23, 0x22, 0x27, 0x1e, 0x01, 0x32, 0x36, 0x37, 0x06, 0x23, 0x22, 0x01, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x07, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x25, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x37, 0x22, 0x06, 0x15, 0x14, 0x17, 0x3e, 0x01, 0x37, 0x26, 0x05, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x36, 0x37, 0x36, 0x33, 0x32, 0x16, 0x07, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x03, 0x88, 0x75, 0x52, 0x38, 0x6c, 0x59, 0x5b, 0x6a, 0x38, 0x90, 0x66, 0x69, 0x8e, 0x83, 0x05, 0x1a, 0x31, 0xf7, 0xfe, 0xbf, 0xf8, 0x35, 0x20, 0x03, 0x86, 0x90, 0x6d, 0x65, 0x67, 0x6b, 0x39, 0x38, 0x2f, 0xad, 0xd3, 0xaa, 0x2d, 0x41, 0x34, 0x69, 0xfc, 0xd6, 0x07, 0x01, 0x2b, 0x05, 0xfe, 0xd5, 0x07, 0x0d, 0x01, 0x15, 0x14, 0xfe, 0xe7, 0x10, 0x14, 0x5c, 0x93, 0xa3, 0x01, 0xb9, 0xa3, 0x90, 0x5d, 0x17, 0x0f, 0xfe, 0xec, 0x13, 0x01, 0x10, 0x0d, 0x07, 0xfe, 0xdb, 0x04, 0x01, 0x26, 0x06, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x73, 0x04, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x04, 0x5e, 0x03, 0x60, 0x08, 0x13, 0x5e, 0x14, 0x5a, 0x11, 0x18, 0x69, 0xac, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xad, 0x68, 0x1b, 0x0e, 0x55, 0x13, 0x58, 0x12, 0x08, 0x5b, 0x04, 0x01, 0xb2, 0x59, 0x3c, 0x38, 0x54, 0x06, 0x2b, 0x44, 0x1e, 0x24, 0x3c, 0x33, 0x07, 0xe4, 0x21, 0x2b, 0x05, 0x26, 0x3e, 0x11, 0x13, 0x02, 0xb2, 0x07, 0x33, 0x3c, 0x21, 0x21, 0x45, 0x2a, 0x07, 0x2d, 0x28, 0x36, 0x3c, 0x59, 0x94, 0x0b, 0x18, 0x29, 0x26, 0x0e, 0x03, 0x0b, 0x0c, 0x27, 0x3a, 0x02, 0xfc, 0x2e, 0x78, 0x3d, 0x3d, 0x78, 0xfc, 0x25, 0x42, 0x20, 0x19, 0x44, 0x47, 0x81, 0x93, 0x8f, 0x7d, 0x4b, 0x53, 0x17, 0x17, 0x42, 0x68, 0x1f, 0x09, 0x45, 0x4c, 0x4d, 0x45, 0x0a, 0x02, 0x4e, 0x24, 0x62, 0x15, 0x43, 0x16, 0x4a, 0x41, 0x69, 0x3f, 0x6c, 0x3a, 0x31, 0xe2, 0x77, 0x84, 0x84, 0x76, 0xe3, 0x38, 0x35, 0x6a, 0x3f, 0x67, 0x3e, 0x4c, 0x15, 0x43, 0x15, 0x52, 0x34, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0xbd, 0x4d, 0x45, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x44, 0x4d, 0x07, 0x44, 0x07, 0x56, 0x57, 0x24, 0x40, 0x22, 0x3c, 0x3c, 0xfe, 0xfd, 0x8c, 0x9e, 0x9e, 0x8c, 0x01, 0x03, 0x40, 0x36, 0x20, 0x40, 0x22, 0x4f, 0x60, 0x07, 0x44, 0x9f, 0x46, 0x5f, 0x57, 0x3b, 0x45, 0x18, 0x0b, 0x21, 0x17, 0x49, 0x2b, 0x20, 0x0d, 0x0d, 0x06, 0x2f, 0x21, 0x0f, 0x2d, 0x1d, 0x17, 0x21, 0x0c, 0x19, 0x43, 0x42, 0x2a, 0x26, 0x5f, 0x7a, 0x03, 0x14, 0x15, 0x19, 0x0c, 0x0b, 0x03, 0x35, 0x00, 0x06, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x11, 0x00, 0x19, 0x00, 0x4a, 0x00, 0x83, 0x00, 0x98, 0x00, 0xad, 0x00, 0x00, 0x01, 0x37, 0x16, 0x33, 0x32, 0x37, 0x16, 0x33, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x06, 0x23, 0x22, 0x01, 0x17, 0x06, 0x22, 0x27, 0x37, 0x16, 0x32, 0x25, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x01, 0x3e, 0x01, 0x33, 0x32, 0x16, 0x15, 0x14, 0x0f, 0x01, 0x23, 0x27, 0x26, 0x27, 0x34, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x25, 0x32, 0x16, 0x17, 0x33, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x15, 0x06, 0x0f, 0x01, 0x23, 0x27, 0x26, 0x35, 0x34, 0x36, 0x02, 0x62, 0x53, 0x3e, 0x52, 0x34, 0x4c, 0x4b, 0x35, 0x51, 0x3f, 0x52, 0x61, 0x81, 0x43, 0x3d, 0x3e, 0x42, 0x82, 0x01, 0x8c, 0x38, 0x6e, 0xae, 0x6e, 0x38, 0x51, 0x78, 0x02, 0x75, 0x10, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x11, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0xfe, 0xfd, 0x5d, 0x94, 0xa3, 0x01, 0xb9, 0xa3, 0x93, 0x5d, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0xfb, 0x46, 0x0f, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x0f, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x69, 0xaf, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xae, 0x6a, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x02, 0x99, 0x09, 0x34, 0x29, 0x29, 0x38, 0x38, 0x8f, 0x02, 0x97, 0x2c, 0x02, 0x3a, 0x2a, 0x37, 0x1f, 0x0c, 0x01, 0x7e, 0x28, 0x34, 0x09, 0x01, 0x0c, 0x1f, 0x37, 0x2b, 0x39, 0x01, 0x2d, 0x97, 0x02, 0x8f, 0x37, 0x37, 0x01, 0x8c, 0x62, 0x40, 0x2c, 0x2c, 0x40, 0x62, 0x64, 0x1c, 0x1c, 0x01, 0xa8, 0x78, 0x3d, 0x3d, 0x78, 0x2e, 0x38, 0x82, 0x74, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x74, 0x82, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x7a, 0xe7, 0x77, 0x84, 0x84, 0x77, 0xe7, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x3d, 0x7c, 0x8f, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x8f, 0x7c, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0xfe, 0xf7, 0x8e, 0x9e, 0x9e, 0x8c, 0x01, 0x0b, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0x01, 0x95, 0x30, 0x42, 0x3d, 0x31, 0x4a, 0x4a, 0xbe, 0xcf, 0x3d, 0x42, 0x2a, 0x48, 0x47, 0x1b, 0x10, 0x72, 0x42, 0x30, 0x10, 0x1b, 0x47, 0x48, 0x2a, 0x42, 0x3d, 0xcf, 0xbe, 0x4a, 0x4a, 0x31, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x1e, 0x00, 0x28, 0x00, 0x37, 0x00, 0x44, 0x00, 0x75, 0x00, 0xae, 0x00, 0xb8, 0x00, 0x00, 0x01, 0x05, 0x07, 0x2d, 0x01, 0x17, 0x05, 0x27, 0x13, 0x17, 0x06, 0x22, 0x27, 0x37, 0x16, 0x32, 0x03, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x07, 0x22, 0x06, 0x15, 0x14, 0x17, 0x3e, 0x01, 0x37, 0x26, 0x05, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x05, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x01, 0x32, 0x37, 0x36, 0x37, 0x17, 0x06, 0x07, 0x06, 0x23, 0x02, 0x8a, 0x01, 0x10, 0x45, 0xfe, 0xef, 0x02, 0xb5, 0x45, 0xfe, 0xef, 0x45, 0x67, 0x38, 0x6e, 0xae, 0x6e, 0x38, 0x51, 0x78, 0xea, 0x26, 0x49, 0x1d, 0x24, 0x3f, 0x31, 0x12, 0x2f, 0x2b, 0x3a, 0x3f, 0x5b, 0x46, 0x21, 0x2b, 0x05, 0x26, 0x3e, 0x11, 0x14, 0x01, 0x8c, 0x04, 0x5a, 0x3f, 0x3c, 0x2a, 0x30, 0x13, 0x31, 0x3f, 0x24, 0x1d, 0x49, 0x6d, 0x0b, 0x18, 0x2b, 0x24, 0x0e, 0x03, 0x0b, 0x0c, 0x27, 0x3a, 0x01, 0x6b, 0x10, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x11, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0xfe, 0xfd, 0x5d, 0x94, 0xa3, 0x01, 0xb9, 0xa3, 0x93, 0x5d, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0xfb, 0x46, 0x0f, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x0f, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x69, 0xaf, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xae, 0x6a, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x03, 0x8a, 0xb6, 0x80, 0x24, 0x19, 0x68, 0x1f, 0x30, 0xa3, 0xe9, 0x05, 0x67, 0xd4, 0x6f, 0xd5, 0x6e, 0x6e, 0xd5, 0x6f, 0xfe, 0x3d, 0x78, 0x3d, 0x3d, 0x78, 0x2e, 0x01, 0x06, 0x4c, 0x1c, 0x0b, 0x23, 0x24, 0x2d, 0x47, 0x30, 0x2c, 0x61, 0x26, 0x30, 0x24, 0x0e, 0x0f, 0x07, 0x34, 0x25, 0x11, 0x1d, 0x43, 0x61, 0x2c, 0x30, 0x47, 0x2d, 0x24, 0x23, 0x0b, 0x1c, 0x04, 0x03, 0x16, 0x18, 0x1c, 0x0e, 0x0c, 0x03, 0x3b, 0xa7, 0x82, 0x74, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x74, 0x82, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x7a, 0xe7, 0x77, 0x84, 0x84, 0x77, 0xe7, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x3d, 0x7c, 0x8f, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x8f, 0x7c, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0xfe, 0xf7, 0x8e, 0x9e, 0x9e, 0x8c, 0x01, 0x0b, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0xfe, 0x7f, 0x8e, 0x28, 0x2b, 0x48, 0x36, 0x35, 0xb5, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x27, 0x00, 0x34, 0x00, 0x69, 0x00, 0xa8, 0x00, 0xb5, 0x00, 0xbe, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x07, 0x22, 0x06, 0x15, 0x14, 0x17, 0x3e, 0x01, 0x37, 0x26, 0x05, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x05, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3f, 0x01, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x00, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x06, 0x15, 0x06, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x07, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x13, 0x37, 0x27, 0x37, 0x17, 0x15, 0x07, 0x17, 0x15, 0x07, 0x27, 0x37, 0x27, 0x02, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x37, 0x03, 0x14, 0x26, 0x49, 0x1d, 0x24, 0x3f, 0x31, 0x12, 0x2f, 0x2b, 0x3a, 0x3f, 0x5b, 0x46, 0x21, 0x2b, 0x05, 0x26, 0x3e, 0x11, 0x14, 0x01, 0x8c, 0x04, 0x5a, 0x3f, 0x3c, 0x2a, 0x30, 0x13, 0x31, 0x3f, 0x24, 0x1d, 0x49, 0x6d, 0x0b, 0x18, 0x2b, 0x24, 0x0e, 0x03, 0x0b, 0x0c, 0x27, 0x3a, 0x01, 0x6b, 0x10, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x02, 0x07, 0x08, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0xfe, 0xfd, 0x02, 0x5c, 0x93, 0xa3, 0x01, 0xb9, 0xa3, 0x90, 0x5d, 0x03, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0xfe, 0x0a, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x01, 0x02, 0x0c, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x03, 0x69, 0xac, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xad, 0x68, 0x03, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x61, 0x0c, 0x03, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x93, 0x48, 0x82, 0x3b, 0xe9, 0x36, 0x36, 0xe9, 0x3b, 0x82, 0x48, 0x0a, 0x77, 0x51, 0x38, 0x6b, 0x5a, 0x5b, 0x6a, 0x38, 0x03, 0xa8, 0x4c, 0x1c, 0x0b, 0x23, 0x24, 0x2d, 0x47, 0x30, 0x2c, 0x61, 0x26, 0x30, 0x24, 0x0e, 0x0f, 0x07, 0x34, 0x25, 0x11, 0x1d, 0x43, 0x61, 0x2c, 0x30, 0x47, 0x2d, 0x24, 0x23, 0x0b, 0x1c, 0x04, 0x03, 0x16, 0x18, 0x1c, 0x0e, 0x0c, 0x03, 0x3b, 0xa7, 0x83, 0x73, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x0f, 0x24, 0x82, 0x41, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x7a, 0x05, 0xe2, 0x77, 0x84, 0x84, 0x76, 0xe3, 0x05, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x03, 0x13, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x07, 0x1c, 0x07, 0x8a, 0x57, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0x08, 0xfe, 0xfd, 0x8c, 0x9e, 0x9e, 0x8c, 0x01, 0x03, 0x08, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0x0f, 0x60, 0x81, 0x2a, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0xfb, 0x3a, 0x3d, 0x4e, 0x77, 0x8d, 0x59, 0x2e, 0x2d, 0x59, 0x8d, 0x77, 0x4e, 0x3d, 0x01, 0xda, 0x2e, 0x78, 0x3d, 0x3d, 0x78, 0x00, 0x0b, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x27, 0x00, 0x34, 0x00, 0x65, 0x00, 0x9e, 0x00, 0xa6, 0x00, 0xaf, 0x00, 0xb8, 0x00, 0xbc, 0x00, 0xc0, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x16, 0x07, 0x22, 0x06, 0x15, 0x14, 0x17, 0x3e, 0x01, 0x37, 0x26, 0x05, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x05, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x26, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x01, 0x36, 0x32, 0x17, 0x07, 0x26, 0x22, 0x07, 0x25, 0x36, 0x20, 0x17, 0x07, 0x26, 0x23, 0x22, 0x07, 0x12, 0x32, 0x37, 0x17, 0x06, 0x23, 0x22, 0x27, 0x37, 0x01, 0x17, 0x05, 0x27, 0x25, 0x05, 0x07, 0x25, 0x03, 0x14, 0x26, 0x49, 0x1d, 0x24, 0x3f, 0x31, 0x12, 0x2f, 0x2b, 0x3a, 0x3f, 0x5b, 0x46, 0x21, 0x2b, 0x05, 0x26, 0x3e, 0x11, 0x14, 0x01, 0x8c, 0x04, 0x5a, 0x3f, 0x3c, 0x2a, 0x30, 0x13, 0x31, 0x3f, 0x24, 0x1d, 0x49, 0x6d, 0x0b, 0x18, 0x2b, 0x24, 0x0e, 0x03, 0x0b, 0x0c, 0x27, 0x3a, 0x01, 0x6b, 0x10, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x11, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0xfe, 0xfd, 0x5d, 0x94, 0xa3, 0x01, 0xb9, 0xa3, 0x93, 0x5d, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0xfb, 0x46, 0x0f, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x0f, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x69, 0xaf, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xae, 0x6a, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x02, 0xf3, 0x3f, 0xb0, 0x3f, 0x56, 0x1b, 0x4c, 0x1b, 0xfe, 0xb5, 0xa3, 0x01, 0xd2, 0xa3, 0x56, 0x80, 0xb6, 0xb4, 0x81, 0xfb, 0x77, 0x51, 0x38, 0x6b, 0x5a, 0x5b, 0x6a, 0x38, 0x01, 0xc4, 0x45, 0xfe, 0xef, 0x45, 0xfe, 0xa2, 0x01, 0x10, 0x45, 0xfe, 0xef, 0x03, 0xa8, 0x4c, 0x1c, 0x0b, 0x23, 0x24, 0x2d, 0x47, 0x30, 0x2c, 0x61, 0x26, 0x30, 0x24, 0x0e, 0x0f, 0x07, 0x34, 0x25, 0x11, 0x1d, 0x43, 0x61, 0x2c, 0x30, 0x47, 0x2d, 0x24, 0x23, 0x0b, 0x1c, 0x04, 0x03, 0x16, 0x18, 0x1c, 0x0e, 0x0c, 0x03, 0x3b, 0xa7, 0x82, 0x74, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x74, 0x82, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x7a, 0xe7, 0x77, 0x84, 0x84, 0x77, 0xe7, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x3d, 0x7c, 0x8f, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x8f, 0x7c, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0xfe, 0xf7, 0x8e, 0x9e, 0x9e, 0x8c, 0x01, 0x0b, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0xfe, 0x13, 0x63, 0x63, 0x5f, 0x3c, 0x3c, 0xf5, 0xb5, 0xb5, 0x60, 0x8e, 0x8e, 0x01, 0xfa, 0x2e, 0x78, 0x3d, 0x3d, 0x78, 0x02, 0x3d, 0x6e, 0xd5, 0x6f, 0xd4, 0xd4, 0x6f, 0xd5, 0x00, 0x00, 0x00, 0x05, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x34, 0x00, 0x64, 0x00, 0x8e, 0x00, 0x00, 0x01, 0x14, 0x06, 0x07, 0x17, 0x16, 0x14, 0x06, 0x22, 0x26, 0x35, 0x34, 0x35, 0x06, 0x22, 0x27, 0x37, 0x16, 0x32, 0x37, 0x17, 0x36, 0x3f, 0x01, 0x2e, 0x01, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x21, 0x14, 0x06, 0x22, 0x26, 0x35, 0x33, 0x14, 0x16, 0x32, 0x36, 0x35, 0x03, 0x36, 0x20, 0x17, 0x07, 0x26, 0x20, 0x07, 0x01, 0x26, 0x10, 0x36, 0x3f, 0x01, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x36, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x14, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x02, 0x00, 0x20, 0x00, 0x03, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x05, 0x12, 0x21, 0x32, 0x24, 0x37, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x05, 0x36, 0x35, 0x34, 0x2f, 0x01, 0x26, 0x27, 0x06, 0x07, 0x26, 0x20, 0x07, 0x26, 0x27, 0x06, 0x0f, 0x01, 0x06, 0x15, 0x14, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0xa2, 0x73, 0x46, 0x1d, 0x18, 0x30, 0x45, 0x30, 0x63, 0xaf, 0x6a, 0x38, 0x52, 0x77, 0x51, 0x2e, 0x07, 0x0d, 0x1d, 0x45, 0x74, 0x7a, 0x37, 0x4b, 0x37, 0xfe, 0x65, 0x7e, 0xb0, 0x7e, 0x79, 0x37, 0x4c, 0x37, 0xdf, 0xa3, 0x01, 0xd2, 0xa3, 0x56, 0x80, 0xfe, 0x96, 0x81, 0xfe, 0x0c, 0x0f, 0x1d, 0x13, 0x12, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x5e, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x12, 0x27, 0x09, 0x0f, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x69, 0xfe, 0x8d, 0xfd, 0xf9, 0xfe, 0x8f, 0x6a, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x01, 0x1b, 0xc2, 0x01, 0xae, 0xdd, 0x01, 0x36, 0x5d, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0x01, 0x21, 0x10, 0x18, 0x1b, 0x0e, 0x27, 0xda, 0x8a, 0x69, 0xfe, 0xe8, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x0f, 0x1c, 0x11, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0x04, 0x88, 0x8b, 0xb4, 0x0e, 0x3f, 0x35, 0x4f, 0x36, 0x36, 0x2c, 0x03, 0x03, 0x35, 0x3d, 0x78, 0x2e, 0x2e, 0x63, 0x18, 0x1d, 0x3f, 0x0e, 0xb4, 0x8b, 0x53, 0x77, 0x77, 0x53, 0x8b, 0xc5, 0xc5, 0x8b, 0x53, 0x77, 0x77, 0x53, 0xfc, 0xda, 0xb5, 0xb5, 0x60, 0x8e, 0x8e, 0x01, 0xc6, 0x7c, 0x01, 0x06, 0xc4, 0x6a, 0x61, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0x0d, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x61, 0xcc, 0xa0, 0xc8, 0x7c, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0xfe, 0xf7, 0xfe, 0xd4, 0x01, 0x2a, 0x01, 0x0b, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0xe6, 0xfe, 0x1e, 0xfb, 0xe7, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x2b, 0x82, 0x51, 0x88, 0x8d, 0xae, 0x62, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x54, 0xa8, 0x6e, 0x6b, 0x82, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x36, 0xff, 0x6a, 0x07, 0x4e, 0x07, 0x14, 0x00, 0x34, 0x00, 0x73, 0x00, 0x7b, 0x00, 0x83, 0x00, 0x87, 0x00, 0x8b, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x2e, 0x02, 0x27, 0x26, 0x27, 0x06, 0x07, 0x26, 0x23, 0x22, 0x07, 0x26, 0x27, 0x06, 0x07, 0x0e, 0x03, 0x15, 0x14, 0x17, 0x16, 0x17, 0x25, 0x17, 0x05, 0x16, 0x17, 0x25, 0x17, 0x05, 0x17, 0x16, 0x17, 0x16, 0x20, 0x37, 0x36, 0x3f, 0x01, 0x25, 0x37, 0x05, 0x36, 0x37, 0x25, 0x37, 0x00, 0x32, 0x17, 0x3e, 0x01, 0x3f, 0x01, 0x17, 0x16, 0x17, 0x1e, 0x04, 0x15, 0x14, 0x06, 0x15, 0x06, 0x07, 0x17, 0x07, 0x27, 0x06, 0x07, 0x17, 0x07, 0x27, 0x07, 0x02, 0x07, 0x06, 0x21, 0x20, 0x27, 0x26, 0x03, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x07, 0x27, 0x37, 0x26, 0x27, 0x35, 0x34, 0x3e, 0x03, 0x37, 0x36, 0x3f, 0x01, 0x17, 0x1e, 0x01, 0x17, 0x03, 0x21, 0x26, 0x27, 0x26, 0x20, 0x07, 0x06, 0x05, 0x21, 0x34, 0x37, 0x36, 0x33, 0x32, 0x00, 0x0b, 0x01, 0x37, 0x13, 0x05, 0x27, 0x13, 0x17, 0x06, 0x73, 0x10, 0x09, 0x09, 0x14, 0x04, 0x18, 0x26, 0xda, 0x8a, 0x69, 0x8b, 0x8d, 0x69, 0x89, 0xdb, 0x26, 0x18, 0x05, 0x13, 0x09, 0x0a, 0x02, 0x07, 0x08, 0x01, 0x21, 0x0a, 0xfe, 0xdf, 0x0c, 0x15, 0x01, 0x01, 0x18, 0xfe, 0xfd, 0x02, 0x5c, 0x93, 0xa3, 0x01, 0xb9, 0xa3, 0x90, 0x5d, 0x03, 0xfe, 0xfe, 0x17, 0x01, 0x01, 0x13, 0x0e, 0xfe, 0xe0, 0x09, 0xfe, 0x0a, 0xcc, 0x5e, 0x54, 0xe4, 0x80, 0x36, 0x0e, 0x22, 0x15, 0x04, 0x1c, 0x0b, 0x11, 0x06, 0x01, 0x02, 0x0c, 0x61, 0x09, 0x62, 0x0d, 0x1d, 0x63, 0x17, 0x63, 0x03, 0x69, 0xac, 0xc4, 0xfe, 0xfd, 0xfe, 0xfc, 0xc3, 0xad, 0x68, 0x03, 0x62, 0x18, 0x62, 0x1b, 0x0e, 0x62, 0x09, 0x61, 0x0c, 0x03, 0x06, 0x11, 0x0b, 0x1c, 0x04, 0x15, 0x22, 0x0e, 0x36, 0x80, 0xe4, 0x54, 0x79, 0x02, 0x77, 0x15, 0x3f, 0x60, 0xfe, 0xf0, 0x5f, 0x3e, 0x02, 0xec, 0xfc, 0x74, 0x84, 0x84, 0xbd, 0xbc, 0x01, 0x0b, 0x86, 0xf3, 0x55, 0xf3, 0xfd, 0x2c, 0x56, 0xf3, 0x56, 0x02, 0xda, 0x83, 0x73, 0x2e, 0x66, 0x3e, 0x76, 0x19, 0xa1, 0xa7, 0x3a, 0xc4, 0x15, 0x15, 0xc4, 0x3a, 0xa7, 0xa1, 0x1b, 0x72, 0x41, 0x65, 0x2e, 0x0f, 0x24, 0x82, 0x41, 0x2b, 0x42, 0x2c, 0x45, 0x40, 0x79, 0x3e, 0x7a, 0x05, 0xe2, 0x77, 0x84, 0x84, 0x76, 0xe3, 0x05, 0x7a, 0x3e, 0x79, 0x39, 0x4c, 0x2c, 0x42, 0x03, 0x13, 0x0d, 0x61, 0x89, 0x16, 0x09, 0x3a, 0x8c, 0x75, 0x18, 0x93, 0x41, 0x77, 0x6a, 0x39, 0x07, 0x1c, 0x07, 0x8a, 0x57, 0x0f, 0x42, 0x0e, 0x51, 0x57, 0x2e, 0x3e, 0x2e, 0x08, 0xfe, 0xfd, 0x8c, 0x9e, 0x9e, 0x8c, 0x01, 0x03, 0x08, 0x2e, 0x3e, 0x2e, 0x51, 0x57, 0x0e, 0x42, 0x0f, 0x60, 0x81, 0x2a, 0x39, 0x6a, 0x77, 0x41, 0x93, 0x18, 0x75, 0x8c, 0x3a, 0x09, 0x16, 0x89, 0x61, 0xfb, 0x47, 0x61, 0x4b, 0x74, 0x75, 0x4b, 0xe7, 0xe7, 0xa4, 0xa3, 0xfe, 0xba, 0x01, 0x7e, 0x01, 0x0e, 0x5f, 0xfe, 0xf2, 0x5f, 0x5f, 0x01, 0x0e, 0x5f, 0x00, 0x00, 0x01, 0xff, 0xc0, 0x04, 0x9a, 0x00, 0xb4, 0x06, 0x12, 0x00, 0x03, 0x00, 0x00, 0x11, 0x33, 0x03, 0x23, 0xb3, 0x69, 0x8a, 0x06, 0x12, 0xfe, 0x88, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x27, 0x05, 0x0e, 0xff, 0x3f, 0x05, 0xd9, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x25, 0x33, 0x15, 0x23, 0xfe, 0x88, 0xb6, 0xb6, 0xfe, 0xa0, 0xb7, 0xb7, 0x05, 0xd9, 0xcb, 0xcb, 0xcb, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0xb4, 0x04, 0xee, 0xff, 0x0c, 0x05, 0xf6, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x03, 0x23, 0xfe, 0x65, 0xa6, 0xcd, 0x8a, 0x05, 0xf6, 0xfe, 0xf8, 0x00, 0x00, 0x01, 0xfd, 0x0a, 0x05, 0x0e, 0xff, 0x5d, 0x05, 0xe9, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x27, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x23, 0x34, 0x36, 0x33, 0x32, 0x16, 0x1f, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x3d, 0x01, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x26, 0xfe, 0x30, 0x34, 0x16, 0x1c, 0x0b, 0x20, 0x24, 0x71, 0x5d, 0x4d, 0x21, 0x37, 0x2b, 0x33, 0x15, 0x1e, 0x0e, 0x1d, 0x24, 0x70, 0x02, 0x5c, 0x4c, 0x1e, 0x36, 0x05, 0x39, 0x21, 0x0e, 0x0b, 0x32, 0x2d, 0x06, 0x65, 0x76, 0x10, 0x1b, 0x1e, 0x0d, 0x0c, 0x33, 0x29, 0x06, 0x64, 0x77, 0x10, 0x00, 0x00, 0x01, 0xfd, 0x57, 0x04, 0xee, 0xfe, 0xb1, 0x05, 0xf6, 0x00, 0x03, 0x00, 0x00, 0x01, 0x13, 0x23, 0x03, 0xfe, 0x00, 0xb0, 0x89, 0xcf, 0x05, 0xf6, 0xfe, 0xf8, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x20, 0x04, 0xee, 0xff, 0x46, 0x05, 0xf8, 0x00, 0x06, 0x00, 0x00, 0x01, 0x33, 0x13, 0x23, 0x27, 0x07, 0x23, 0xfd, 0xdf, 0xa9, 0xbe, 0x7d, 0x96, 0x95, 0x7d, 0x05, 0xf8, 0xfe, 0xf6, 0xb2, 0xb2, 0x00, 0x00, 0x01, 0xfd, 0x20, 0x04, 0xee, 0xff, 0x46, 0x05, 0xf8, 0x00, 0x06, 0x00, 0x00, 0x01, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0xfd, 0xdf, 0xbe, 0x7d, 0x95, 0x96, 0x7d, 0xbe, 0x04, 0xee, 0x01, 0x0a, 0xb2, 0xb2, 0xfe, 0xf6, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x19, 0x05, 0x06, 0xff, 0x4d, 0x05, 0xf8, 0x00, 0x0d, 0x00, 0x00, 0x03, 0x23, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x07, 0x23, 0x3e, 0x01, 0x33, 0x32, 0x16, 0xb3, 0x6a, 0x0c, 0x59, 0x4b, 0x4a, 0x57, 0x0e, 0x6a, 0x08, 0x90, 0x81, 0x82, 0x8f, 0x05, 0x06, 0x36, 0x39, 0x37, 0x38, 0x77, 0x7b, 0x7a, 0x00, 0x00, 0x01, 0xfd, 0x19, 0x05, 0x06, 0xff, 0x4d, 0x05, 0xf8, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x33, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x37, 0x33, 0x0e, 0x01, 0x23, 0x22, 0x26, 0xfd, 0x1a, 0x6a, 0x0b, 0x59, 0x4b, 0x4a, 0x57, 0x0f, 0x6a, 0x09, 0x90, 0x81, 0x81, 0x90, 0x05, 0xf8, 0x36, 0x39, 0x37, 0x38, 0x77, 0x7b, 0x7a, 0x00, 0x01, 0xfd, 0xd7, 0x05, 0x0e, 0xfe, 0x8f, 0x05, 0xdb, 0x00, 0x03, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0xfd, 0xd7, 0xb8, 0xb8, 0x05, 0xdb, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfd, 0x35, 0x04, 0xee, 0xff, 0xba, 0x05, 0xf6, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x03, 0x33, 0x03, 0x23, 0x03, 0x33, 0x03, 0x23, 0xed, 0xa7, 0xcd, 0x8a, 0x7d, 0xa6, 0xcd, 0x8a, 0x05, 0xf6, 0xfe, 0xf8, 0x01, 0x08, 0xfe, 0xf8, 0x00, 0x02, 0xfc, 0xac, 0x04, 0xee, 0xff, 0x31, 0x05, 0xf6, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x13, 0x23, 0x03, 0x21, 0x13, 0x23, 0x03, 0xfd, 0x53, 0xb1, 0x8a, 0xcd, 0x01, 0xd4, 0xb0, 0x8a, 0xcd, 0x05, 0xf6, 0xfe, 0xf8, 0x01, 0x08, 0xfe, 0xf8, 0x01, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x96, 0x00, 0x03, 0x00, 0x00, 0x35, 0x33, 0x15, 0x23, 0x87, 0x87, 0x96, 0x96, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0x00, 0x96, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x37, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0xe1, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x96, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x68, 0x01, 0x90, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x70, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x01, 0x90, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xff, 0x06, 0x01, 0x68, 0x00, 0x96, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x17, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x70, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x64, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xff, 0x06, 0x00, 0x87, 0x00, 0x96, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x15, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x87, 0x87, 0x87, 0x87, 0x64, 0x96, 0x01, 0x90, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xff, 0x06, 0x01, 0x68, 0x00, 0x96, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x17, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0xe1, 0x87, 0x87, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x87, 0x87, 0x64, 0x96, 0x01, 0x90, 0x96, 0x64, 0x96, 0x01, 0x90, 0x96, 0x00, 0x01, 0x00, 0x75, 0xff, 0xec, 0x07, 0x24, 0x02, 0x9d, 0x00, 0x26, 0x00, 0x00, 0x01, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x03, 0x26, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x33, 0x16, 0x06, 0x3e, 0x3e, 0x39, 0x39, 0x36, 0x5c, 0x68, 0x40, 0x48, 0x16, 0x8b, 0xd2, 0xe9, 0xbe, 0xb0, 0x70, 0xfe, 0xd8, 0x01, 0x01, 0x3a, 0xa5, 0x3a, 0xb7, 0x5d, 0x88, 0xea, 0xab, 0xb3, 0x6f, 0x35, 0x1a, 0xa5, 0x12, 0x01, 0xf8, 0xd0, 0x3b, 0x35, 0xb8, 0x49, 0x53, 0x42, 0x83, 0x35, 0x3a, 0x26, 0x65, 0x01, 0x08, 0x8a, 0x5c, 0x5e, 0x88, 0x7d, 0x43, 0x22, 0x02, 0x37, 0x3a, 0x6d, 0x34, 0x77, 0x3e, 0x37, 0x4b, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x01, 0x60, 0x02, 0x58, 0x00, 0x0d, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x01, 0x0d, 0x41, 0x8d, 0x51, 0x20, 0x59, 0x27, 0x2c, 0xa6, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0xd9, 0xd9, 0xbb, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x02, 0x3f, 0x02, 0x58, 0x00, 0x14, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x01, 0x0d, 0x45, 0x89, 0x51, 0x20, 0x59, 0x27, 0x2c, 0xa6, 0x2c, 0x28, 0x59, 0x31, 0x63, 0x87, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0xd9, 0xd9, 0x6a, 0x31, 0x2c, 0xb8, 0x00, 0x00, 0x02, 0x00, 0x75, 0xff, 0xa5, 0x07, 0x86, 0x03, 0x11, 0x00, 0x2c, 0x00, 0x3e, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x23, 0x24, 0x27, 0x24, 0x03, 0x26, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x21, 0x32, 0x25, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x05, 0xd2, 0x5d, 0x63, 0xfc, 0xf5, 0xfe, 0xed, 0x70, 0xfe, 0xd8, 0x01, 0x01, 0x3a, 0xa5, 0x3a, 0xb7, 0x48, 0x01, 0x0e, 0xd0, 0x01, 0x01, 0x19, 0x1f, 0x1a, 0x49, 0x03, 0x14, 0xa9, 0x34, 0x2f, 0x4a, 0x49, 0x7b, 0x10, 0x04, 0x48, 0x08, 0x06, 0xed, 0xf1, 0x5f, 0x64, 0x5e, 0x04, 0x0d, 0x2f, 0x1e, 0x24, 0x16, 0x14, 0x37, 0x11, 0x05, 0x25, 0x2c, 0x24, 0x2b, 0x18, 0x3c, 0x01, 0x27, 0x67, 0x01, 0x06, 0x8a, 0x5c, 0x5e, 0x88, 0x73, 0x4d, 0x1f, 0x36, 0x04, 0x1b, 0x2c, 0x7c, 0x79, 0x1f, 0x24, 0x9b, 0x4b, 0x17, 0x32, 0x53, 0x96, 0x25, 0x1e, 0x90, 0x6a, 0x01, 0xb8, 0xdf, 0x41, 0x7a, 0x14, 0x1b, 0x47, 0x27, 0x19, 0x0a, 0x19, 0x3c, 0x13, 0x12, 0x38, 0x42, 0x4e, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x02, 0xec, 0x03, 0xd9, 0x00, 0x0f, 0x00, 0x30, 0x00, 0x00, 0x01, 0x36, 0x35, 0x34, 0x27, 0x26, 0x07, 0x06, 0x07, 0x06, 0x07, 0x14, 0x17, 0x16, 0x33, 0x32, 0x01, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x06, 0x07, 0x06, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x21, 0x02, 0x1a, 0x25, 0x3b, 0x1c, 0x28, 0x2f, 0x24, 0x24, 0x01, 0x32, 0x24, 0x26, 0x41, 0xfd, 0xe9, 0xd9, 0x4b, 0x88, 0x48, 0x36, 0x1b, 0x0e, 0x39, 0x57, 0x75, 0x46, 0x58, 0x07, 0x14, 0x87, 0x47, 0x44, 0x51, 0x3b, 0x57, 0x29, 0x15, 0x46, 0x43, 0x6f, 0x63, 0x82, 0xfe, 0xdf, 0x02, 0x19, 0x2b, 0x4d, 0x3b, 0x33, 0x19, 0x01, 0x01, 0x2a, 0x29, 0x33, 0x50, 0x26, 0x19, 0xfe, 0xb7, 0x17, 0x0c, 0x5d, 0x30, 0x32, 0x37, 0x02, 0x02, 0x45, 0x57, 0x81, 0x34, 0x2c, 0x94, 0x45, 0x24, 0x32, 0x48, 0x66, 0x33, 0x8c, 0xd0, 0x8f, 0x88, 0x2c, 0x27, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xb7, 0x03, 0x08, 0x00, 0x21, 0x00, 0x35, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x07, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x02, 0x29, 0xa4, 0x16, 0x07, 0x13, 0x1a, 0x20, 0x23, 0x84, 0x72, 0xc3, 0x7a, 0xa7, 0xa6, 0x7b, 0xc3, 0x72, 0x85, 0x23, 0x1a, 0x21, 0x13, 0x08, 0x14, 0xa7, 0x1b, 0x3a, 0x39, 0x39, 0x0d, 0x11, 0x32, 0x16, 0x08, 0x15, 0x1c, 0x3d, 0x39, 0x20, 0x17, 0x0a, 0x15, 0x33, 0x11, 0x02, 0xfa, 0x50, 0x96, 0x32, 0x2a, 0x49, 0x31, 0x43, 0x32, 0x11, 0xb8, 0x39, 0x39, 0xb8, 0x11, 0x28, 0x4d, 0x2e, 0x4c, 0x2c, 0x30, 0x8f, 0x57, 0x0e, 0xb8, 0x0a, 0x20, 0x35, 0x15, 0x1d, 0x2b, 0x35, 0x44, 0x16, 0x15, 0x45, 0x32, 0x2e, 0x18, 0x1a, 0x34, 0x21, 0x0a, 0x00, 0x00, 0x02, 0x00, 0x60, 0xfe, 0x0c, 0x06, 0x14, 0x02, 0xe4, 0x00, 0x2e, 0x00, 0x40, 0x00, 0x00, 0x25, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x2b, 0x01, 0x06, 0x07, 0x06, 0x07, 0x06, 0x27, 0x24, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x36, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x04, 0x3f, 0x3b, 0x2a, 0x6c, 0x34, 0x84, 0x05, 0x24, 0x85, 0x24, 0x4f, 0x65, 0x32, 0x59, 0x2d, 0x12, 0x06, 0x17, 0x03, 0xed, 0xf1, 0x2b, 0x28, 0x38, 0x72, 0x8f, 0x9e, 0xb8, 0xfe, 0xb3, 0x55, 0x3e, 0x38, 0xa6, 0x38, 0x18, 0x36, 0xec, 0x7e, 0x87, 0xc0, 0x61, 0x04, 0x14, 0x11, 0x2b, 0x1e, 0x23, 0x1f, 0x13, 0x2e, 0x13, 0x09, 0x34, 0x44, 0x5a, 0x2a, 0x0a, 0x05, 0x0d, 0x23, 0x2b, 0x6d, 0xb9, 0x3d, 0x1a, 0xa5, 0x45, 0x13, 0x32, 0x58, 0x91, 0x3a, 0xd6, 0x01, 0xb8, 0x7a, 0x46, 0x91, 0x4e, 0x56, 0x01, 0x02, 0xbe, 0x8a, 0x7d, 0xa6, 0x60, 0x6b, 0x9b, 0x4c, 0x3a, 0x82, 0x44, 0x62, 0x01, 0x5a, 0x7a, 0x57, 0x4b, 0x23, 0x19, 0x0a, 0x1b, 0x3a, 0x1e, 0x19, 0x3c, 0x2c, 0x3b, 0x14, 0x09, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0xec, 0x03, 0xd9, 0x10, 0x06, 0x11, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x03, 0xb7, 0x03, 0x08, 0x10, 0x06, 0x11, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x01, 0x60, 0x03, 0xe8, 0x10, 0x26, 0x10, 0xfd, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x00, 0xca, 0x03, 0x52, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0x3f, 0x03, 0xe8, 0x10, 0x26, 0x10, 0xfe, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x00, 0xca, 0x03, 0x52, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x8b, 0x01, 0xb7, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x25, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x01, 0x1c, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x38, 0x3a, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x3a, 0xdc, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0xff, 0xff, 0x00, 0x75, 0xfe, 0x90, 0x07, 0x24, 0x03, 0x20, 0x10, 0x27, 0x10, 0xf7, 0x02, 0x76, 0x02, 0x8a, 0x10, 0x27, 0x11, 0x07, 0x02, 0x65, 0xfe, 0x90, 0x10, 0x06, 0x10, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xf4, 0x01, 0xd3, 0x03, 0xe8, 0x10, 0x26, 0x10, 0xfd, 0x00, 0x00, 0x10, 0x27, 0x10, 0xf7, 0x00, 0x59, 0x03, 0x52, 0x10, 0x07, 0x11, 0x07, 0x00, 0x48, 0xfe, 0xf4, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xf4, 0x02, 0x3f, 0x03, 0xe8, 0x10, 0x26, 0x10, 0xfe, 0x00, 0x00, 0x10, 0x27, 0x10, 0xf7, 0x00, 0x59, 0x03, 0x52, 0x10, 0x07, 0x11, 0x07, 0x00, 0x48, 0xfe, 0xf4, 0xff, 0xff, 0x00, 0x75, 0xff, 0xec, 0x07, 0x24, 0x03, 0xb6, 0x10, 0x27, 0x10, 0xf9, 0x02, 0x76, 0x03, 0x20, 0x10, 0x06, 0x10, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x01, 0xc2, 0x04, 0xe2, 0x10, 0x26, 0x10, 0xfd, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf9, 0x00, 0x59, 0x04, 0x4c, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0x3f, 0x04, 0xe2, 0x10, 0x26, 0x10, 0xfe, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf9, 0x00, 0x59, 0x04, 0x4c, 0x00, 0x02, 0x00, 0x8d, 0xfe, 0x0c, 0x04, 0xb8, 0x05, 0xaf, 0x00, 0x30, 0x00, 0x49, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x21, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x37, 0x22, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x33, 0x20, 0x17, 0x15, 0x22, 0x07, 0x17, 0x16, 0x17, 0x16, 0x01, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x15, 0x05, 0x04, 0x94, 0x24, 0x2c, 0x74, 0x6f, 0x4a, 0x37, 0x05, 0x42, 0x67, 0x58, 0xc9, 0x42, 0x74, 0x01, 0x29, 0xad, 0xbf, 0x87, 0xe1, 0xfe, 0x88, 0x98, 0x76, 0xbf, 0x56, 0x7b, 0x0a, 0x0c, 0x56, 0x7e, 0x79, 0x56, 0xf5, 0xae, 0x01, 0x08, 0xb4, 0x62, 0x1c, 0x1a, 0x2e, 0x41, 0x51, 0xfd, 0x62, 0x46, 0x28, 0x0e, 0x0e, 0x32, 0x34, 0x53, 0x38, 0x2f, 0x2e, 0x39, 0x3b, 0x10, 0x1a, 0x55, 0x1d, 0x6c, 0xfe, 0xcc, 0xb8, 0xb8, 0x96, 0x64, 0x9c, 0x0f, 0xb2, 0x18, 0x50, 0xb7, 0xfc, 0x89, 0x5e, 0xa4, 0x76, 0xb8, 0x63, 0xc2, 0x96, 0xe0, 0x01, 0x02, 0xdf, 0x65, 0x34, 0x13, 0x13, 0x29, 0xb8, 0x3f, 0x36, 0x9a, 0x0d, 0x5b, 0xa0, 0x5f, 0x77, 0x03, 0xa3, 0x12, 0x14, 0x24, 0x25, 0x2d, 0x60, 0x2b, 0x2d, 0x21, 0x64, 0x21, 0x12, 0x20, 0x1a, 0x4d, 0x1b, 0x0a, 0x1d, 0x66, 0x4d, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xed, 0x05, 0x4b, 0x00, 0x1e, 0x00, 0x37, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x01, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x15, 0x05, 0x02, 0xfe, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x9b, 0xe8, 0xc6, 0x44, 0x4f, 0x96, 0x42, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0xfe, 0xda, 0x46, 0x28, 0x0e, 0x0f, 0x33, 0x34, 0x53, 0x38, 0x2e, 0x2c, 0x3a, 0x3c, 0x0f, 0x1a, 0x55, 0x1d, 0x6c, 0xfe, 0xcc, 0x02, 0x1d, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0x23, 0x34, 0x62, 0x9a, 0x18, 0x34, 0x62, 0x42, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x01, 0xfd, 0x12, 0x14, 0x24, 0x25, 0x2d, 0x60, 0x2b, 0x2d, 0x21, 0x64, 0x21, 0x12, 0x20, 0x1a, 0x4d, 0x1b, 0x0a, 0x1d, 0x66, 0x4d, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0xb8, 0x05, 0x4b, 0x00, 0x29, 0x00, 0x42, 0x00, 0x00, 0x01, 0x16, 0x17, 0x15, 0x06, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x27, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x15, 0x05, 0x02, 0x3e, 0xe8, 0xc6, 0x3a, 0x42, 0x2d, 0x1b, 0x5e, 0x66, 0x3c, 0x4e, 0xbc, 0x71, 0x24, 0x35, 0x3e, 0x25, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0x5b, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x26, 0x46, 0x28, 0x0e, 0x0f, 0x33, 0x34, 0x53, 0x38, 0x2e, 0x2c, 0x3a, 0x3c, 0x0f, 0x1a, 0x55, 0x1d, 0x6c, 0xfe, 0xcc, 0x03, 0x0c, 0x34, 0x62, 0x9a, 0x14, 0x29, 0x4e, 0x22, 0x77, 0xb8, 0xa8, 0x36, 0x61, 0x2e, 0x25, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x23, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0xc8, 0x12, 0x14, 0x24, 0x25, 0x2d, 0x60, 0x2b, 0x2d, 0x21, 0x64, 0x21, 0x12, 0x20, 0x1a, 0x4d, 0x1b, 0x0a, 0x1d, 0x66, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x8d, 0xfe, 0x0c, 0x04, 0xb8, 0x05, 0xaa, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x21, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x37, 0x22, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x33, 0x20, 0x17, 0x15, 0x22, 0x07, 0x17, 0x16, 0x17, 0x16, 0x01, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x04, 0x94, 0x24, 0x2c, 0x74, 0x6f, 0x4a, 0x37, 0x05, 0x42, 0x67, 0x58, 0xc9, 0x42, 0x74, 0x01, 0x29, 0xad, 0xbf, 0x87, 0xe1, 0xfe, 0x88, 0x98, 0x76, 0xbf, 0x56, 0x7b, 0x0a, 0x0c, 0x56, 0x7e, 0x79, 0x56, 0xf5, 0xae, 0x01, 0x08, 0xb4, 0x62, 0x1c, 0x1a, 0x2e, 0x41, 0x51, 0xfd, 0xbe, 0x86, 0x86, 0x86, 0x86, 0xb8, 0xb8, 0x96, 0x64, 0x9c, 0x0f, 0xb2, 0x18, 0x50, 0xb7, 0xfc, 0x89, 0x5e, 0xa4, 0x76, 0xb8, 0x63, 0xc2, 0x96, 0xe0, 0x01, 0x02, 0xdf, 0x65, 0x34, 0x13, 0x13, 0x29, 0xb8, 0x3f, 0x36, 0x9a, 0x0d, 0x5b, 0xa0, 0x5f, 0x77, 0x03, 0xf8, 0x96, 0x01, 0x90, 0x96, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x03, 0xed, 0x05, 0x46, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x03, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x02, 0xfe, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x9b, 0xe8, 0xc6, 0x44, 0x4f, 0x96, 0x42, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0xcb, 0x88, 0x88, 0x88, 0x88, 0x02, 0x1d, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0x23, 0x34, 0x62, 0x9a, 0x18, 0x34, 0x62, 0x42, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x02, 0x52, 0x96, 0x01, 0x90, 0x96, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x04, 0xb8, 0x05, 0x46, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x00, 0x01, 0x16, 0x17, 0x15, 0x06, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x02, 0x3e, 0xe8, 0xc6, 0x3a, 0x42, 0x2d, 0x1b, 0x5e, 0x66, 0x3c, 0x4e, 0xbc, 0x71, 0x24, 0x35, 0x3e, 0x25, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0x5b, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x35, 0x88, 0x88, 0x88, 0x88, 0x03, 0x0c, 0x34, 0x62, 0x9a, 0x14, 0x29, 0x4e, 0x22, 0x77, 0xb8, 0xa8, 0x36, 0x61, 0x2e, 0x25, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x23, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0x01, 0x1d, 0x96, 0x01, 0x90, 0x96, 0x00, 0x04, 0x00, 0x8d, 0xfe, 0x0c, 0x04, 0xb8, 0x05, 0xaa, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x21, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x37, 0x22, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x33, 0x20, 0x17, 0x15, 0x22, 0x07, 0x17, 0x16, 0x17, 0x16, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x04, 0x94, 0x24, 0x2c, 0x74, 0x6f, 0x4a, 0x37, 0x05, 0x42, 0x67, 0x58, 0xc9, 0x42, 0x74, 0x01, 0x29, 0xad, 0xbf, 0x87, 0xe1, 0xfe, 0x88, 0x98, 0x76, 0xbf, 0x56, 0x7b, 0x0a, 0x0c, 0x56, 0x7e, 0x79, 0x56, 0xf5, 0xae, 0x01, 0x08, 0xb4, 0x62, 0x1c, 0x1a, 0x2e, 0x41, 0x51, 0xfd, 0xbe, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0xb8, 0x96, 0x64, 0x9c, 0x0f, 0xb2, 0x18, 0x50, 0xb7, 0xfc, 0x89, 0x5e, 0xa4, 0x76, 0xb8, 0x63, 0xc2, 0x96, 0xe0, 0x01, 0x02, 0xdf, 0x65, 0x34, 0x13, 0x13, 0x29, 0xb8, 0x3f, 0x36, 0x9a, 0x0d, 0x5b, 0xa0, 0x5f, 0x77, 0x04, 0xf2, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x04, 0xff, 0xee, 0x00, 0x00, 0x03, 0xed, 0x05, 0x46, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x03, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x02, 0xfe, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x9b, 0xe8, 0xc6, 0x44, 0x4f, 0x96, 0x42, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0xcb, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x02, 0x1d, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0x23, 0x34, 0x62, 0x9a, 0x18, 0x34, 0x62, 0x42, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x03, 0x4c, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x04, 0xff, 0xee, 0x00, 0x00, 0x04, 0xb8, 0x05, 0x46, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x01, 0x16, 0x17, 0x15, 0x06, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x02, 0x3e, 0xe8, 0xc6, 0x3a, 0x42, 0x2d, 0x1b, 0x5e, 0x66, 0x3c, 0x4e, 0xbc, 0x71, 0x24, 0x35, 0x3e, 0x25, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0x5b, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x35, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x03, 0x0c, 0x34, 0x62, 0x9a, 0x14, 0x29, 0x4e, 0x22, 0x77, 0xb8, 0xa8, 0x36, 0x61, 0x2e, 0x25, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x23, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0x02, 0x17, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x05, 0x00, 0x8d, 0xfe, 0x0c, 0x04, 0xb8, 0x04, 0xb0, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x00, 0x25, 0x33, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x21, 0x32, 0x37, 0x15, 0x06, 0x23, 0x20, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x37, 0x22, 0x23, 0x22, 0x07, 0x06, 0x07, 0x35, 0x36, 0x33, 0x20, 0x17, 0x15, 0x22, 0x07, 0x17, 0x16, 0x17, 0x16, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x04, 0x94, 0x24, 0x2c, 0x74, 0x6f, 0x4a, 0x37, 0x05, 0x42, 0x67, 0x58, 0xc9, 0x42, 0x74, 0x01, 0x29, 0xad, 0xbf, 0x87, 0xe1, 0xfe, 0x88, 0x98, 0x76, 0xbf, 0x56, 0x7b, 0x0a, 0x0c, 0x56, 0x7e, 0x79, 0x56, 0xf5, 0xae, 0x01, 0x08, 0xb4, 0x62, 0x1c, 0x1a, 0x2e, 0x41, 0x51, 0xfd, 0xbe, 0x86, 0x86, 0x21, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0xb8, 0x96, 0x64, 0x9c, 0x0f, 0xb2, 0x18, 0x50, 0xb7, 0xfc, 0x89, 0x5e, 0xa4, 0x76, 0xb8, 0x63, 0xc2, 0x96, 0xe0, 0x01, 0x02, 0xdf, 0x65, 0x34, 0x13, 0x13, 0x29, 0xb8, 0x3f, 0x36, 0x9a, 0x0d, 0x5b, 0xa0, 0x5f, 0x77, 0x03, 0xf8, 0x96, 0xfb, 0x9b, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xee, 0xfe, 0x3e, 0x03, 0xed, 0x04, 0x4c, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x17, 0x16, 0x17, 0x15, 0x06, 0x07, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x03, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x02, 0xfe, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x9b, 0xe8, 0xc6, 0x44, 0x4f, 0x96, 0x42, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0xcb, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x70, 0x88, 0x88, 0x02, 0x1d, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0x23, 0x34, 0x62, 0x9a, 0x18, 0x34, 0x62, 0x42, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0xfc, 0xda, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x05, 0x14, 0x96, 0x00, 0x05, 0xff, 0xee, 0xfe, 0x3e, 0x04, 0xb8, 0x04, 0x4c, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x39, 0x00, 0x00, 0x01, 0x16, 0x17, 0x15, 0x06, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x27, 0x26, 0x07, 0x35, 0x36, 0x37, 0x32, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x02, 0x3e, 0xe8, 0xc6, 0x3a, 0x42, 0x2d, 0x1b, 0x5e, 0x66, 0x3c, 0x4e, 0xbc, 0x71, 0x24, 0x35, 0x3e, 0x25, 0x83, 0x43, 0xc7, 0x93, 0x73, 0x5a, 0xcc, 0x74, 0x5e, 0x68, 0x55, 0x5b, 0x4b, 0x5d, 0x4c, 0xa2, 0x4a, 0x91, 0x41, 0x44, 0x91, 0x40, 0x87, 0x87, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x65, 0x88, 0x88, 0x03, 0x0c, 0x34, 0x62, 0x9a, 0x14, 0x29, 0x4e, 0x22, 0x77, 0xb8, 0xa8, 0x36, 0x61, 0x2e, 0x25, 0x81, 0x1b, 0x50, 0xb8, 0x48, 0x3a, 0x6a, 0x56, 0x23, 0x17, 0x17, 0x13, 0x10, 0x07, 0x06, 0xb8, 0x07, 0x01, 0xfb, 0xa5, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x05, 0x14, 0x96, 0x00, 0x01, 0x00, 0x00, 0x05, 0x33, 0x03, 0x09, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x00, 0x09, 0x01, 0x35, 0x01, 0x03, 0x09, 0xfc, 0xf7, 0x03, 0x09, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0x00, 0x00, 0x01, 0x00, 0xbf, 0xfe, 0x56, 0x04, 0xa4, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x13, 0x33, 0x01, 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x01, 0x11, 0x23, 0xc0, 0xa5, 0x02, 0x99, 0xa5, 0x4a, 0x49, 0xa2, 0xe5, 0xd2, 0x5e, 0x22, 0x23, 0xfd, 0x67, 0xa5, 0x05, 0xd5, 0xfb, 0x83, 0x04, 0x7d, 0xfa, 0x17, 0xd6, 0x60, 0x60, 0x9c, 0x30, 0x31, 0xad, 0x04, 0x7d, 0xfb, 0x83, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x01, 0xe9, 0x04, 0x60, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x33, 0x15, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x33, 0xb0, 0xa5, 0x94, 0x94, 0xa5, 0xa2, 0xa2, 0x04, 0x60, 0xfe, 0x08, 0xa4, 0xfe, 0x3c, 0x01, 0xc4, 0xa4, 0x00, 0x00, 0x02, 0xff, 0x0d, 0xfe, 0x56, 0x01, 0xf7, 0x04, 0x60, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x00, 0x13, 0x20, 0x35, 0x34, 0x3b, 0x01, 0x11, 0x33, 0x11, 0x33, 0x15, 0x23, 0x06, 0x07, 0x06, 0x03, 0x23, 0x22, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x1e, 0xfe, 0xef, 0xf3, 0xae, 0xa5, 0xa3, 0xac, 0x10, 0x30, 0x49, 0x1d, 0xa3, 0x6b, 0x02, 0x04, 0x6f, 0x5e, 0x23, 0x0f, 0xfe, 0x56, 0xdd, 0xcd, 0x04, 0x60, 0xfb, 0xa0, 0x9b, 0x70, 0x3f, 0x60, 0x01, 0x10, 0x33, 0x41, 0x30, 0x17, 0x00, 0x00, 0xff, 0xff, 0x01, 0x69, 0x06, 0x63, 0x03, 0x84, 0x08, 0x33, 0x10, 0x27, 0x00, 0x71, 0x00, 0xaa, 0x02, 0x3d, 0x10, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x01, 0x55, 0x00, 0x00, 0xff, 0xff, 0x01, 0x69, 0x06, 0x61, 0x03, 0x84, 0x08, 0x34, 0x10, 0x27, 0x00, 0x71, 0x00, 0xaa, 0x00, 0xff, 0x10, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x02, 0x5b, 0x00, 0x00, 0xff, 0xff, 0x01, 0x69, 0x06, 0x5e, 0x03, 0x84, 0x08, 0x33, 0x10, 0x27, 0x10, 0xf3, 0x04, 0x43, 0x01, 0x50, 0x10, 0x07, 0x00, 0x71, 0x00, 0xaa, 0x02, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x01, 0x6a, 0x06, 0x63, 0x03, 0x82, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xec, 0x04, 0x72, 0x02, 0x64, 0x10, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x01, 0x55, 0x00, 0x00, 0xff, 0xff, 0x01, 0x6a, 0x06, 0x63, 0x03, 0x82, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xee, 0x04, 0x18, 0x02, 0x64, 0x10, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x01, 0x55, 0x00, 0x00, 0xff, 0xff, 0x01, 0x69, 0x06, 0x61, 0x03, 0x84, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xec, 0x04, 0x72, 0x02, 0x64, 0x10, 0x07, 0x00, 0x71, 0x00, 0xaa, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x69, 0x06, 0x61, 0x03, 0x84, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xee, 0x04, 0x18, 0x02, 0x64, 0x10, 0x07, 0x00, 0x71, 0x00, 0xaa, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x01, 0x50, 0x06, 0x6a, 0x03, 0xa3, 0x08, 0x33, 0x10, 0x27, 0x10, 0xed, 0x04, 0x46, 0x01, 0x5c, 0x10, 0x07, 0x00, 0x71, 0x00, 0xaa, 0x02, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x01, 0x63, 0x06, 0x63, 0x03, 0x89, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xf0, 0x04, 0x43, 0x02, 0x62, 0x10, 0x07, 0x10, 0xeb, 0x04, 0x43, 0x01, 0x55, 0x00, 0x00, 0xff, 0xff, 0x01, 0x50, 0x06, 0x6a, 0x03, 0xa3, 0x08, 0x56, 0x10, 0x27, 0x10, 0xeb, 0x04, 0x43, 0x02, 0x7d, 0x10, 0x07, 0x10, 0xed, 0x04, 0x46, 0x01, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x01, 0x63, 0x06, 0x63, 0x03, 0x89, 0x08, 0x57, 0x10, 0x27, 0x10, 0xf0, 0x04, 0x43, 0x01, 0x75, 0x10, 0x07, 0x10, 0xf3, 0x04, 0x43, 0x02, 0x7c, 0x00, 0x00, 0xff, 0xff, 0x01, 0x50, 0x06, 0x6a, 0x03, 0xc5, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xec, 0x04, 0xba, 0x02, 0x64, 0x10, 0x07, 0x10, 0xed, 0x04, 0x46, 0x01, 0x5c, 0x00, 0x00, 0xff, 0xff, 0x01, 0x63, 0x06, 0x63, 0x04, 0x96, 0x08, 0x3a, 0x10, 0x27, 0x10, 0xef, 0x04, 0x43, 0x01, 0x75, 0x10, 0x07, 0x10, 0xec, 0x05, 0x8a, 0x02, 0x44, 0x00, 0x00, 0xff, 0xff, 0x01, 0x63, 0x06, 0x63, 0x03, 0xfc, 0x08, 0x3a, 0x10, 0x27, 0x10, 0xee, 0x05, 0x4b, 0x02, 0x44, 0x10, 0x07, 0x10, 0xef, 0x04, 0x43, 0x01, 0x75, 0x00, 0x00, 0xff, 0xff, 0x01, 0x50, 0x06, 0x63, 0x03, 0xa3, 0x08, 0x75, 0x10, 0x27, 0x10, 0xef, 0x04, 0x43, 0x01, 0x75, 0x10, 0x07, 0x10, 0xed, 0x04, 0x46, 0x02, 0x8c, 0x00, 0x00, 0xff, 0xff, 0x01, 0x50, 0x06, 0x56, 0x03, 0xa3, 0x08, 0x59, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x43, 0x01, 0x50, 0x10, 0x07, 0x10, 0xed, 0x04, 0x46, 0x02, 0x70, 0x00, 0x00, 0xff, 0xff, 0x01, 0x5c, 0x06, 0x56, 0x03, 0x90, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x43, 0x01, 0x50, 0x10, 0x07, 0x10, 0xec, 0x04, 0x72, 0x02, 0x64, 0x00, 0x00, 0xff, 0xff, 0x01, 0x5c, 0x06, 0x56, 0x03, 0x90, 0x08, 0x5a, 0x10, 0x27, 0x10, 0xf2, 0x04, 0x43, 0x01, 0x50, 0x10, 0x07, 0x10, 0xee, 0x04, 0x18, 0x02, 0x64, 0x00, 0x00, 0xff, 0xff, 0x01, 0x5c, 0x06, 0x56, 0x03, 0x90, 0x08, 0x8b, 0x10, 0x27, 0x02, 0xba, 0x04, 0x34, 0x02, 0x10, 0x10, 0x07, 0x10, 0xf2, 0x04, 0x43, 0x01, 0x50, 0x00, 0x00, 0xff, 0xff, 0x01, 0x63, 0x06, 0x63, 0x04, 0x87, 0x08, 0x5b, 0x10, 0x27, 0x02, 0xba, 0x05, 0x75, 0x01, 0xe0, 0x10, 0x07, 0x10, 0xef, 0x04, 0x43, 0x01, 0x75, 0x00, 0x00, 0xff, 0xff, 0xfc, 0xf1, 0x04, 0x7b, 0xff, 0x62, 0x06, 0x6e, 0x10, 0x26, 0x02, 0xb2, 0x00, 0x00, 0x10, 0x07, 0x02, 0xb8, 0xff, 0x12, 0x00, 0x5a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x01, 0x2c, 0x00, 0x03, 0x00, 0x00, 0x11, 0x21, 0x11, 0x21, 0x01, 0x0e, 0xfe, 0xf2, 0x01, 0x2c, 0xfe, 0xd4, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe3, 0x02, 0xfb, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x3d, 0x01, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x06, 0x23, 0x22, 0x26, 0x52, 0xae, 0x5e, 0x81, 0x65, 0xb6, 0xbe, 0xde, 0x56, 0xab, 0x3d, 0xec, 0x51, 0x51, 0x95, 0xcb, 0x03, 0xee, 0xfc, 0x12, 0xfe, 0xe6, 0xea, 0x2c, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x92, 0x02, 0x26, 0x00, 0x06, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x03, 0x5c, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0xfe, 0x57, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0xaf, 0xe1, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0xfe, 0x0c, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0x04, 0x1a, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x77, 0x02, 0x26, 0x00, 0x18, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0xaf, 0xe1, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0x00, 0x02, 0x00, 0x81, 0xfe, 0xc8, 0x05, 0x86, 0x07, 0xc4, 0x00, 0x24, 0x00, 0x2b, 0x00, 0x00, 0x25, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x26, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x03, 0xaa, 0x46, 0xa6, 0x2c, 0x27, 0x59, 0x44, 0x75, 0x65, 0x46, 0x10, 0x19, 0x6d, 0xea, 0x79, 0x4d, 0x59, 0x3e, 0xfe, 0xf9, 0x01, 0x39, 0xa6, 0x3b, 0x96, 0x24, 0x41, 0x48, 0x63, 0x9c, 0x99, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xb0, 0x49, 0x7e, 0xe3, 0x04, 0x6a, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x33, 0x2e, 0x28, 0xb1, 0x42, 0x22, 0x16, 0x5b, 0x01, 0x12, 0x8a, 0x5c, 0x73, 0x73, 0x7e, 0x42, 0x10, 0x22, 0x35, 0x06, 0xac, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x02, 0x24, 0x07, 0xc4, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x27, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x01, 0x84, 0x4e, 0x48, 0x8b, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0x96, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0x01, 0x73, 0xb2, 0x65, 0x5c, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0x6a, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x02, 0x75, 0x07, 0xc4, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x0b, 0x01, 0x33, 0x17, 0x37, 0x33, 0x03, 0x01, 0x31, 0x45, 0x89, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0x2c, 0x28, 0x59, 0x43, 0x75, 0x87, 0x8a, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x06, 0x7e, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x75, 0xfe, 0xf0, 0x06, 0x13, 0x03, 0x46, 0x00, 0x37, 0x00, 0x3e, 0x00, 0x00, 0x05, 0x36, 0x35, 0x26, 0x27, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x03, 0xde, 0x52, 0x01, 0x2a, 0x1a, 0x1b, 0x28, 0x2f, 0x48, 0x4b, 0x1b, 0x26, 0x69, 0x4f, 0x73, 0x1d, 0x1f, 0x1f, 0x67, 0x65, 0x61, 0x17, 0x21, 0x0d, 0x29, 0x3b, 0x42, 0x02, 0x03, 0x66, 0x73, 0xc4, 0x50, 0x5e, 0xa9, 0x69, 0xfe, 0xf8, 0x39, 0xa5, 0x3a, 0x95, 0x3c, 0xa1, 0x52, 0x45, 0x86, 0xfe, 0x8b, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0x21, 0x33, 0x21, 0x2b, 0x0d, 0x08, 0x28, 0x3b, 0x3d, 0x41, 0x3c, 0x5e, 0x0e, 0x06, 0x86, 0xc4, 0xb8, 0xac, 0xa5, 0x06, 0x11, 0x23, 0x30, 0x1b, 0x1e, 0x7b, 0x62, 0x56, 0x60, 0x1f, 0x0c, 0x29, 0x67, 0x01, 0x06, 0x99, 0x5a, 0x5a, 0x99, 0x72, 0x4e, 0x1f, 0x08, 0x0f, 0x02, 0x42, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfe, 0xd4, 0x02, 0x00, 0x04, 0x40, 0x00, 0x0d, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x0b, 0x01, 0x33, 0x17, 0x37, 0x33, 0x0b, 0x01, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x0d, 0x41, 0x8d, 0x51, 0x20, 0x59, 0x27, 0x2c, 0xa6, 0x96, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0x16, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0xd9, 0xd9, 0xbb, 0x02, 0x36, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0xfc, 0x70, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfe, 0xd4, 0x02, 0x3f, 0x04, 0x40, 0x00, 0x14, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x0b, 0x01, 0x33, 0x17, 0x37, 0x33, 0x0b, 0x01, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x0d, 0x45, 0x89, 0x51, 0x20, 0x59, 0x27, 0x2c, 0xa6, 0x2c, 0x28, 0x59, 0x31, 0x63, 0x87, 0x8a, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0x16, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0xd9, 0xd9, 0x6a, 0x31, 0x2c, 0xb8, 0x02, 0xfa, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0xfc, 0x70, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x0b, 0x04, 0x72, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x0b, 0x01, 0x33, 0x17, 0x37, 0x33, 0x03, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0x43, 0x75, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0x35, 0xaf, 0x7d, 0x75, 0x75, 0x7d, 0xaf, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0x01, 0x8e, 0x01, 0x46, 0xc3, 0xc3, 0xfe, 0xba, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x02, 0x01, 0x06, 0x14, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x33, 0x11, 0x14, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x35, 0xae, 0xa5, 0x45, 0x5e, 0x0a, 0x1d, 0xa3, 0x92, 0x06, 0x14, 0xfb, 0x82, 0x99, 0x61, 0x9c, 0xc0, 0xd6, 0x00, 0x00, 0x02, 0x00, 0x82, 0x00, 0x00, 0x03, 0xef, 0x02, 0xee, 0x00, 0x0a, 0x00, 0x24, 0x00, 0x00, 0x01, 0x26, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x17, 0x1e, 0x01, 0x13, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x02, 0x60, 0x0d, 0x0c, 0x0b, 0x0b, 0x6c, 0x4a, 0x64, 0x02, 0x01, 0xa2, 0x68, 0x04, 0x02, 0xa5, 0x01, 0x21, 0x13, 0x32, 0x1c, 0x65, 0x43, 0x75, 0x51, 0x42, 0x28, 0x22, 0x7c, 0x8d, 0x32, 0x34, 0xab, 0xb8, 0x62, 0x01, 0x1a, 0x2a, 0x31, 0x32, 0x65, 0x0c, 0x43, 0x59, 0x3e, 0x29, 0x32, 0x01, 0xd1, 0x27, 0x2b, 0xa8, 0xae, 0x65, 0x4f, 0x2c, 0xb8, 0x33, 0x1f, 0x3b, 0x49, 0x0f, 0x30, 0x9a, 0xad, 0x7f, 0x44, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0xa2, 0x05, 0xf0, 0x10, 0x06, 0x01, 0xe4, 0x00, 0x00, 0xff, 0xff, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x00, 0x05, 0x0f, 0x10, 0x06, 0x01, 0xe5, 0x00, 0x00, 0xff, 0xff, 0x00, 0x87, 0xfe, 0x75, 0x01, 0xd7, 0x04, 0x7b, 0x10, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x10, 0x07, 0x02, 0x9d, 0xff, 0x5c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x47, 0x00, 0x00, 0x02, 0x38, 0x04, 0x60, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x37, 0x33, 0x13, 0x23, 0x13, 0x21, 0x13, 0x21, 0xb3, 0x79, 0xa0, 0x79, 0x21, 0xfe, 0xd3, 0xc4, 0x01, 0x2d, 0x64, 0x03, 0x98, 0xfc, 0x04, 0x04, 0x60, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x2d, 0xfe, 0x56, 0x02, 0x38, 0x04, 0x60, 0x00, 0x08, 0x00, 0x16, 0x00, 0x00, 0x05, 0x13, 0x23, 0x03, 0x06, 0x07, 0x36, 0x37, 0x36, 0x05, 0x23, 0x37, 0x33, 0x32, 0x37, 0x36, 0x37, 0x13, 0x21, 0x03, 0x06, 0x07, 0x06, 0x01, 0x16, 0xb6, 0x79, 0xbb, 0x1f, 0x30, 0x41, 0x2d, 0x43, 0xfe, 0xf9, 0xc6, 0x12, 0x2d, 0x5e, 0x2b, 0x2b, 0x1a, 0xd1, 0x01, 0x2d, 0xc8, 0x25, 0x5a, 0x5b, 0x16, 0x04, 0x12, 0xfb, 0xd0, 0xb5, 0x54, 0x0f, 0x30, 0x48, 0xf4, 0x64, 0x30, 0x31, 0x99, 0x04, 0xac, 0xfb, 0x8c, 0xd6, 0x60, 0x60, 0x00, 0xff, 0xff, 0xff, 0xd7, 0xfe, 0x76, 0x02, 0x2a, 0x04, 0x7b, 0x10, 0x27, 0x02, 0xb0, 0xff, 0x34, 0x00, 0x00, 0x10, 0x06, 0x00, 0xf3, 0x00, 0x00, 0xff, 0xff, 0x00, 0xab, 0xfe, 0x89, 0x01, 0x54, 0x04, 0x7b, 0x10, 0x26, 0x00, 0xf3, 0x00, 0x00, 0x10, 0x07, 0x02, 0xd4, 0x02, 0xcd, 0x00, 0x00, 0x00, 0x02, 0x00, 0xd8, 0x00, 0xd8, 0x01, 0x96, 0x04, 0xfb, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0xd8, 0xbe, 0xbe, 0xbe, 0xbe, 0x01, 0xd6, 0xfe, 0x04, 0x23, 0xfe, 0x00, 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x02, 0xab, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x21, 0x15, 0x23, 0x11, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x23, 0x88, 0x02, 0x21, 0xb5, 0xb6, 0xfd, 0xdf, 0xb5, 0xb6, 0x05, 0xd5, 0xaa, 0xfb, 0x7f, 0xaa, 0xaa, 0x04, 0x81, 0x00, 0x01, 0x01, 0x82, 0x02, 0x95, 0x04, 0x89, 0x03, 0x3f, 0x00, 0x03, 0x00, 0x00, 0x01, 0x15, 0x21, 0x35, 0x04, 0x88, 0xfc, 0xfa, 0x03, 0x3f, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x04, 0xcb, 0x02, 0xe6, 0x08, 0xf2, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, 0x35, 0x33, 0x16, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x01, 0x35, 0x25, 0x15, 0x01, 0x35, 0x25, 0x15, 0x01, 0xdb, 0x0d, 0x1e, 0x34, 0x3d, 0x48, 0x25, 0x1e, 0x0e, 0x58, 0x0a, 0x16, 0x11, 0x2d, 0x37, 0x04, 0x02, 0x56, 0x03, 0x50, 0x40, 0x0c, 0x5d, 0x0b, 0x19, 0x28, 0x4b, 0x40, 0x1c, 0x18, 0xfe, 0xe0, 0x02, 0x0e, 0xfd, 0xf2, 0x02, 0x0e, 0x05, 0x84, 0x4c, 0x28, 0x45, 0x3f, 0x34, 0x6d, 0x6d, 0x62, 0x7d, 0x38, 0x54, 0x22, 0x19, 0x14, 0x18, 0xaa, 0x52, 0x59, 0x24, 0x36, 0xc3, 0xae, 0x73, 0x39, 0x49, 0x74, 0x85, 0x36, 0x59, 0x0a, 0x09, 0x21, 0x1e, 0x02, 0xb3, 0x6e, 0x82, 0x6e, 0xfe, 0x8e, 0x6e, 0x82, 0x6e, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x04, 0xcb, 0x02, 0xe6, 0x09, 0x55, 0x00, 0x28, 0x00, 0x4f, 0x00, 0x5e, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, 0x35, 0x33, 0x16, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x03, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x33, 0x16, 0x33, 0x15, 0x22, 0x2f, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x33, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0xdb, 0x0d, 0x1e, 0x34, 0x3d, 0x48, 0x25, 0x1e, 0x0e, 0x58, 0x0a, 0x16, 0x11, 0x2d, 0x37, 0x04, 0x02, 0x56, 0x03, 0x50, 0x40, 0x0c, 0x5d, 0x0b, 0x19, 0x28, 0x4b, 0x40, 0x1c, 0x18, 0x0f, 0x21, 0x13, 0x1e, 0x15, 0x61, 0x3e, 0x1a, 0x38, 0x42, 0x24, 0x31, 0x0b, 0x12, 0x0c, 0x11, 0x12, 0x2b, 0x12, 0x2e, 0x18, 0x43, 0x4d, 0x55, 0x66, 0x32, 0x0e, 0x51, 0x0b, 0x1f, 0x2b, 0x33, 0x8f, 0x03, 0x02, 0x09, 0x1f, 0x12, 0x15, 0x0a, 0x10, 0x29, 0x11, 0x05, 0x84, 0x4c, 0x28, 0x45, 0x3f, 0x34, 0x6d, 0x6d, 0x62, 0x7d, 0x38, 0x54, 0x22, 0x19, 0x14, 0x18, 0xaa, 0x52, 0x59, 0x24, 0x36, 0xc3, 0xae, 0x73, 0x39, 0x49, 0x74, 0x85, 0x36, 0x59, 0x0a, 0x09, 0x21, 0x1e, 0x02, 0x6d, 0x24, 0x2a, 0x07, 0x0d, 0x39, 0x5e, 0x57, 0x34, 0x15, 0x27, 0x36, 0x4f, 0x27, 0x26, 0x01, 0x01, 0x6e, 0x02, 0x05, 0x3d, 0x4e, 0x56, 0x9a, 0x29, 0x71, 0x61, 0x1a, 0x4b, 0xee, 0x07, 0x07, 0x15, 0x18, 0x22, 0x1c, 0x09, 0x0d, 0x1c, 0x25, 0x12, 0x08, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xb4, 0x04, 0xba, 0x02, 0xe6, 0x08, 0xe8, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, 0x35, 0x33, 0x16, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x01, 0x35, 0x25, 0x15, 0x01, 0x35, 0x25, 0x15, 0x01, 0xdb, 0x0d, 0x1e, 0x34, 0x3d, 0x48, 0x25, 0x1e, 0x0e, 0x58, 0x0a, 0x16, 0x11, 0x2d, 0x37, 0x04, 0x02, 0x56, 0x03, 0x50, 0x40, 0x0c, 0x5d, 0x0b, 0x19, 0x28, 0x4b, 0x40, 0x1c, 0x18, 0xfe, 0xe0, 0x02, 0x0e, 0xfd, 0xf2, 0x02, 0x0e, 0x07, 0x78, 0x4c, 0x28, 0x45, 0x3f, 0x34, 0x6d, 0x6d, 0x62, 0x7d, 0x38, 0x54, 0x22, 0x19, 0x14, 0x18, 0xaa, 0x52, 0x59, 0x24, 0x36, 0xc3, 0xae, 0x73, 0x39, 0x49, 0x74, 0x85, 0x36, 0x59, 0x0a, 0x09, 0x21, 0x1e, 0xfe, 0x67, 0x6e, 0x82, 0x6e, 0xfe, 0x8e, 0x6e, 0x82, 0x6e, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x04, 0xcb, 0x02, 0xe6, 0x08, 0x02, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, 0x35, 0x33, 0x16, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x01, 0x35, 0x25, 0x15, 0x01, 0xdb, 0x0d, 0x1e, 0x34, 0x3d, 0x48, 0x25, 0x1e, 0x0e, 0x58, 0x0a, 0x16, 0x11, 0x2d, 0x37, 0x04, 0x02, 0x56, 0x03, 0x50, 0x40, 0x0c, 0x5d, 0x0b, 0x19, 0x28, 0x4b, 0x40, 0x1c, 0x18, 0xfe, 0xe0, 0x02, 0x0e, 0x05, 0x84, 0x4c, 0x28, 0x45, 0x3f, 0x34, 0x6d, 0x6d, 0x62, 0x7d, 0x38, 0x54, 0x22, 0x19, 0x14, 0x18, 0xaa, 0x52, 0x59, 0x24, 0x36, 0xc3, 0xae, 0x73, 0x39, 0x49, 0x74, 0x85, 0x36, 0x59, 0x0a, 0x09, 0x21, 0x1e, 0x01, 0xc3, 0x6e, 0x82, 0x6e, 0x00, 0x03, 0x00, 0xb4, 0x04, 0xcb, 0x02, 0xe6, 0x09, 0x55, 0x00, 0x28, 0x00, 0x47, 0x00, 0x56, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, 0x35, 0x33, 0x16, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x1e, 0x01, 0x33, 0x15, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x35, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0xdb, 0x0d, 0x1e, 0x34, 0x3d, 0x48, 0x25, 0x1e, 0x0e, 0x58, 0x0a, 0x16, 0x11, 0x2d, 0x37, 0x04, 0x02, 0x56, 0x03, 0x50, 0x40, 0x0c, 0x5d, 0x0b, 0x19, 0x28, 0x4b, 0x40, 0x1c, 0x18, 0x0c, 0x08, 0x12, 0x61, 0x3e, 0x1a, 0x38, 0x42, 0x24, 0x31, 0x0c, 0x0f, 0x21, 0x12, 0x20, 0x1d, 0x1b, 0x19, 0x26, 0x3f, 0xb4, 0x84, 0x89, 0x7d, 0x15, 0x4d, 0x03, 0x02, 0x09, 0x1f, 0x12, 0x15, 0x0a, 0x10, 0x29, 0x11, 0x05, 0x84, 0x4c, 0x28, 0x45, 0x3f, 0x34, 0x6d, 0x6d, 0x62, 0x7d, 0x38, 0x54, 0x22, 0x19, 0x14, 0x18, 0xaa, 0x52, 0x59, 0x24, 0x36, 0xc3, 0xae, 0x73, 0x39, 0x49, 0x74, 0x85, 0x36, 0x59, 0x0a, 0x09, 0x21, 0x1e, 0x02, 0xc3, 0x02, 0x0a, 0x38, 0x5f, 0x57, 0x34, 0x15, 0x27, 0x36, 0x4f, 0x20, 0x2d, 0x01, 0x01, 0x6e, 0x02, 0x02, 0x03, 0x3d, 0x2a, 0x7b, 0x6e, 0x6d, 0x12, 0x70, 0x07, 0x07, 0x15, 0x18, 0x22, 0x1c, 0x09, 0x0d, 0x1c, 0x25, 0x12, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0xb4, 0x04, 0xba, 0x02, 0xe6, 0x08, 0x20, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x36, 0x37, 0x36, 0x35, 0x33, 0x16, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0x27, 0x33, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x06, 0x27, 0x26, 0x01, 0x35, 0x25, 0x15, 0x01, 0xdb, 0x0d, 0x1e, 0x34, 0x3d, 0x48, 0x25, 0x1e, 0x0e, 0x58, 0x0a, 0x16, 0x11, 0x2d, 0x37, 0x04, 0x02, 0x56, 0x03, 0x50, 0x40, 0x0c, 0x5d, 0x0b, 0x19, 0x28, 0x4b, 0x40, 0x1c, 0x18, 0xfe, 0xe0, 0x02, 0x0e, 0x06, 0xb0, 0x4c, 0x28, 0x45, 0x3f, 0x34, 0x6d, 0x6d, 0x62, 0x7d, 0x38, 0x54, 0x22, 0x19, 0x14, 0x18, 0xaa, 0x52, 0x59, 0x24, 0x36, 0xc3, 0xae, 0x73, 0x39, 0x49, 0x74, 0x85, 0x36, 0x59, 0x0a, 0x09, 0x21, 0x1e, 0xfe, 0x3f, 0x6e, 0x82, 0x6e, 0x00, 0x02, 0x00, 0xc6, 0x04, 0xbf, 0x02, 0xd4, 0x07, 0x9e, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x15, 0x05, 0x03, 0x35, 0x25, 0x15, 0x01, 0x2e, 0x46, 0x28, 0x0e, 0x0f, 0x33, 0x34, 0x53, 0x37, 0x2f, 0x2d, 0x39, 0x3c, 0x0f, 0x1a, 0x54, 0x1e, 0x6c, 0xfe, 0xcc, 0x68, 0x02, 0x0e, 0x05, 0x23, 0x12, 0x14, 0x24, 0x25, 0x2d, 0x60, 0x2b, 0x2d, 0x21, 0x64, 0x21, 0x12, 0x20, 0x1a, 0x4d, 0x1b, 0x0a, 0x1d, 0x66, 0x4d, 0x01, 0xef, 0x6e, 0x82, 0x6e, 0x00, 0x03, 0x00, 0xc6, 0x04, 0xbf, 0x02, 0xd4, 0x08, 0xf1, 0x00, 0x18, 0x00, 0x37, 0x00, 0x46, 0x00, 0x00, 0x01, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x15, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x37, 0x15, 0x05, 0x13, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x1e, 0x01, 0x33, 0x15, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x35, 0x32, 0x37, 0x36, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x2e, 0x46, 0x28, 0x0e, 0x0f, 0x33, 0x34, 0x53, 0x37, 0x2f, 0x2d, 0x39, 0x3c, 0x0f, 0x1a, 0x54, 0x1e, 0x6c, 0xfe, 0xcc, 0xc4, 0x08, 0x12, 0x61, 0x3e, 0x1a, 0x38, 0x42, 0x24, 0x31, 0x0c, 0x0f, 0x21, 0x12, 0x20, 0x1d, 0x1b, 0x19, 0x26, 0x3f, 0xb4, 0x84, 0x89, 0x7d, 0x15, 0x4d, 0x03, 0x02, 0x09, 0x1f, 0x12, 0x15, 0x0a, 0x10, 0x29, 0x11, 0x05, 0x23, 0x12, 0x14, 0x24, 0x25, 0x2d, 0x60, 0x2b, 0x2d, 0x21, 0x64, 0x21, 0x12, 0x20, 0x1a, 0x4d, 0x1b, 0x0a, 0x1d, 0x66, 0x4d, 0x02, 0xef, 0x02, 0x0a, 0x38, 0x5f, 0x57, 0x34, 0x15, 0x27, 0x36, 0x4f, 0x20, 0x2d, 0x01, 0x01, 0x6e, 0x02, 0x02, 0x03, 0x3d, 0x2a, 0x7b, 0x6e, 0x6d, 0x12, 0x70, 0x07, 0x07, 0x15, 0x18, 0x22, 0x1c, 0x09, 0x0d, 0x1c, 0x25, 0x12, 0x08, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x02, 0x13, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x33, 0x11, 0x33, 0x11, 0x33, 0x15, 0xae, 0xa5, 0xc0, 0x05, 0xd5, 0xfa, 0xbe, 0x93, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x02, 0x13, 0x05, 0xd5, 0x00, 0x07, 0x00, 0x00, 0x25, 0x33, 0x15, 0x21, 0x35, 0x33, 0x11, 0x33, 0x01, 0x53, 0xc0, 0xfd, 0xdb, 0xc0, 0xa5, 0x93, 0x93, 0x93, 0x05, 0x42, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x01, 0x54, 0x05, 0xd5, 0x00, 0x05, 0x00, 0x00, 0x29, 0x01, 0x35, 0x33, 0x11, 0x33, 0x01, 0x53, 0xfe, 0x9b, 0xc0, 0xa5, 0x93, 0x05, 0x42, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0xff, 0xe3, 0x04, 0x2f, 0x03, 0x93, 0x00, 0x07, 0x00, 0x15, 0x00, 0x00, 0x12, 0x10, 0x16, 0x32, 0x36, 0x10, 0x26, 0x22, 0x01, 0x06, 0x23, 0x22, 0x02, 0x10, 0x12, 0x20, 0x12, 0x15, 0x14, 0x07, 0x33, 0x15, 0xf2, 0xa7, 0xeb, 0xa7, 0xa7, 0xeb, 0x01, 0x0c, 0x46, 0x51, 0xaf, 0xf9, 0xf9, 0x01, 0x5f, 0xf9, 0x5d, 0xd5, 0x02, 0x3e, 0xfe, 0xfa, 0xb9, 0xb9, 0x01, 0x06, 0xb9, 0xfd, 0x09, 0x1d, 0x01, 0x15, 0x01, 0x86, 0x01, 0x15, 0xfe, 0xeb, 0xc3, 0xa9, 0x7f, 0x93, 0x00, 0x02, 0xff, 0xee, 0xff, 0xe3, 0x04, 0x2f, 0x03, 0x93, 0x00, 0x07, 0x00, 0x19, 0x00, 0x00, 0x12, 0x10, 0x16, 0x32, 0x36, 0x10, 0x26, 0x22, 0x01, 0x06, 0x22, 0x27, 0x21, 0x35, 0x33, 0x26, 0x35, 0x34, 0x12, 0x20, 0x12, 0x15, 0x14, 0x07, 0x33, 0x15, 0xf2, 0xa7, 0xeb, 0xa7, 0xa7, 0xeb, 0x01, 0x0c, 0x46, 0xa1, 0x46, 0xfe, 0x76, 0xd5, 0x5d, 0xf9, 0x01, 0x5f, 0xf9, 0x5d, 0xd5, 0x02, 0x3e, 0xfe, 0xfa, 0xb9, 0xb9, 0x01, 0x06, 0xb9, 0xfd, 0x09, 0x1d, 0x1d, 0x93, 0x7f, 0xa9, 0xc3, 0x01, 0x15, 0xfe, 0xeb, 0xc3, 0xa9, 0x7f, 0x93, 0x00, 0x02, 0xff, 0xee, 0xff, 0xe3, 0x03, 0xb8, 0x03, 0x93, 0x00, 0x07, 0x00, 0x15, 0x00, 0x00, 0x12, 0x10, 0x16, 0x32, 0x36, 0x10, 0x26, 0x22, 0x03, 0x26, 0x35, 0x34, 0x12, 0x20, 0x12, 0x10, 0x02, 0x23, 0x22, 0x27, 0x21, 0x35, 0xf2, 0xa7, 0xeb, 0xa7, 0xa7, 0xeb, 0xd6, 0x5d, 0xf9, 0x01, 0x5f, 0xf9, 0xf9, 0xb0, 0x50, 0x46, 0xfe, 0x76, 0x02, 0x3e, 0xfe, 0xfa, 0xb9, 0xb9, 0x01, 0x06, 0xb9, 0xfd, 0x9c, 0x7f, 0xa9, 0xc3, 0x01, 0x15, 0xfe, 0xeb, 0xfe, 0x7a, 0xfe, 0xeb, 0x1d, 0x93, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0x20, 0x05, 0xd9, 0x00, 0x0a, 0x00, 0x00, 0x29, 0x01, 0x11, 0x03, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x11, 0x21, 0x03, 0x1f, 0xfe, 0x15, 0xfd, 0xaf, 0xa1, 0xa1, 0xae, 0xfd, 0x01, 0x46, 0x03, 0x2a, 0x02, 0xaf, 0xfe, 0x5d, 0x01, 0xa3, 0xfd, 0x51, 0xfd, 0x69, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x20, 0x05, 0xd9, 0x00, 0x0c, 0x00, 0x00, 0x25, 0x15, 0x21, 0x35, 0x21, 0x11, 0x03, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x11, 0x03, 0x1f, 0xfc, 0xcf, 0x01, 0x46, 0xfd, 0xaf, 0xa1, 0xa1, 0xae, 0xfd, 0x93, 0x93, 0x93, 0x02, 0x97, 0x02, 0xaf, 0xfe, 0x5d, 0x01, 0xa3, 0xfd, 0x51, 0xfd, 0x69, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x02, 0xd7, 0x05, 0xd9, 0x00, 0x0a, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x03, 0x33, 0x1b, 0x01, 0x33, 0x03, 0x11, 0x12, 0x01, 0x46, 0xfd, 0xaf, 0xa1, 0xa1, 0xae, 0xfd, 0x93, 0x02, 0x97, 0x02, 0xaf, 0xfe, 0x5d, 0x01, 0xa3, 0xfd, 0x51, 0xfc, 0xd6, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x04, 0x55, 0x03, 0x71, 0x00, 0x08, 0x00, 0x00, 0x21, 0x23, 0x09, 0x01, 0x23, 0x01, 0x33, 0x01, 0x33, 0x04, 0x55, 0xf9, 0xfe, 0xc5, 0xfe, 0xc5, 0xaf, 0x01, 0x7a, 0xe1, 0x01, 0x48, 0x7b, 0x02, 0xbd, 0xfd, 0x43, 0x03, 0x71, 0xfd, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0x55, 0x03, 0x71, 0x00, 0x0a, 0x00, 0x00, 0x33, 0x23, 0x35, 0x33, 0x01, 0x33, 0x01, 0x33, 0x15, 0x23, 0x01, 0xe6, 0xf8, 0x7a, 0x01, 0x49, 0xe1, 0x01, 0x48, 0x7b, 0xf9, 0xfe, 0xc5, 0x93, 0x02, 0xde, 0xfd, 0x22, 0x93, 0x02, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0c, 0x03, 0x71, 0x00, 0x08, 0x00, 0x00, 0x33, 0x23, 0x35, 0x33, 0x01, 0x33, 0x01, 0x23, 0x01, 0xe6, 0xf8, 0x7a, 0x01, 0x49, 0xe1, 0x01, 0x7a, 0xb0, 0xfe, 0xc5, 0x93, 0x02, 0xde, 0xfc, 0x8f, 0x02, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc8, 0x03, 0x71, 0x00, 0x09, 0x00, 0x00, 0x29, 0x01, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x04, 0xc7, 0xfb, 0xe0, 0xa7, 0x02, 0x19, 0xa7, 0xb9, 0x03, 0x71, 0xfd, 0x22, 0x02, 0xde, 0xfd, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0xc8, 0x03, 0x71, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x04, 0xc7, 0xfb, 0x27, 0xb9, 0xa7, 0x02, 0x19, 0xa7, 0xb9, 0x93, 0x02, 0xde, 0xfd, 0x22, 0x02, 0xde, 0xfd, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0e, 0x03, 0x71, 0x00, 0x09, 0x00, 0x00, 0x29, 0x01, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x04, 0x0e, 0xfb, 0xe0, 0xb9, 0xa7, 0x02, 0x19, 0xa7, 0x93, 0x02, 0xde, 0xfd, 0x22, 0x02, 0xde, 0x00, 0x01, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc8, 0x03, 0x71, 0x00, 0x09, 0x00, 0x00, 0x33, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0xa7, 0x02, 0xc0, 0xfd, 0x40, 0x03, 0x67, 0xb9, 0x93, 0x02, 0x4b, 0x93, 0xfd, 0x22, 0x93, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0xc8, 0x03, 0x71, 0x00, 0x09, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0x12, 0x03, 0x79, 0xfd, 0x40, 0x03, 0x67, 0xb9, 0x93, 0x02, 0x4b, 0x93, 0xfd, 0x22, 0x93, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0e, 0x03, 0x71, 0x00, 0x07, 0x00, 0x00, 0x01, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x04, 0x0e, 0xfb, 0xe0, 0x03, 0x79, 0xfd, 0x40, 0x03, 0x71, 0xfc, 0x8f, 0x93, 0x02, 0x4b, 0x93, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x04, 0x59, 0x05, 0xe2, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x00, 0x21, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x21, 0x15, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x01, 0xd0, 0x49, 0x43, 0x67, 0x77, 0x77, 0xce, 0xf1, 0xcf, 0x76, 0x76, 0x68, 0x43, 0x4a, 0x01, 0xe2, 0xfc, 0x9a, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x03, 0x0e, 0x0b, 0x20, 0x31, 0xa8, 0xc5, 0xa9, 0x62, 0x62, 0xa9, 0xc5, 0xa8, 0x31, 0x20, 0x0b, 0xfd, 0x85, 0x93, 0x04, 0xad, 0x70, 0x60, 0x38, 0x38, 0x60, 0x70, 0x60, 0x38, 0x38, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x59, 0x05, 0xe2, 0x00, 0x15, 0x00, 0x21, 0x00, 0x00, 0x25, 0x21, 0x15, 0x21, 0x35, 0x21, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x02, 0x76, 0x01, 0xe2, 0xfb, 0x96, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x77, 0xce, 0xf1, 0xcf, 0x76, 0x76, 0x68, 0x43, 0x4a, 0xfe, 0x7c, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x93, 0x93, 0x93, 0x02, 0x7b, 0x0b, 0x20, 0x31, 0xa8, 0xc5, 0xa9, 0x62, 0x62, 0xa9, 0xc5, 0xa8, 0x31, 0x20, 0x0b, 0x01, 0x9f, 0x70, 0x60, 0x38, 0x38, 0x60, 0x70, 0x60, 0x38, 0x38, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe1, 0x05, 0xe2, 0x00, 0x13, 0x00, 0x1f, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x3e, 0x01, 0x32, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x12, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x77, 0xce, 0xf1, 0xcf, 0x76, 0x76, 0x68, 0x43, 0x4a, 0xfe, 0x7c, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x93, 0x02, 0x7b, 0x0b, 0x20, 0x31, 0xa8, 0xc5, 0xa9, 0x62, 0x62, 0xa9, 0xc5, 0xa8, 0x31, 0x20, 0x0b, 0xfc, 0xf2, 0x04, 0xad, 0x70, 0x60, 0x38, 0x38, 0x60, 0x70, 0x60, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc8, 0x04, 0xa6, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x10, 0x33, 0x15, 0x22, 0x07, 0x33, 0x15, 0x23, 0x01, 0x21, 0x35, 0x21, 0x01, 0xdc, 0xda, 0x77, 0x02, 0x78, 0xd9, 0x02, 0xeb, 0xfb, 0xe0, 0x04, 0x20, 0x03, 0x9c, 0x01, 0x0a, 0x66, 0x9a, 0x9e, 0xfc, 0xf8, 0x93, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0xc8, 0x04, 0xa6, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x10, 0x33, 0x15, 0x22, 0x07, 0x33, 0x15, 0x23, 0x01, 0x21, 0x35, 0x21, 0x01, 0xdc, 0xda, 0x77, 0x02, 0x78, 0xd9, 0x02, 0xeb, 0xfb, 0x27, 0x04, 0xd9, 0x03, 0x9c, 0x01, 0x0a, 0x66, 0x9a, 0x9e, 0xfc, 0xf8, 0x93, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0e, 0x04, 0xa6, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x00, 0x01, 0x10, 0x33, 0x15, 0x22, 0x07, 0x33, 0x15, 0x23, 0x01, 0x21, 0x35, 0x21, 0x01, 0xdc, 0xda, 0x77, 0x02, 0x78, 0xd9, 0x02, 0x32, 0xfb, 0xe0, 0x04, 0x20, 0x03, 0x9c, 0x01, 0x0a, 0x66, 0x9a, 0x9e, 0xfc, 0xf8, 0x93, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x06, 0x0a, 0x05, 0xee, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x22, 0x26, 0x10, 0x36, 0x20, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x11, 0x33, 0x15, 0x01, 0x35, 0x34, 0x27, 0x26, 0x22, 0x06, 0x14, 0x16, 0x33, 0x04, 0xa9, 0xfe, 0x70, 0x8d, 0xdf, 0xa9, 0x9e, 0x9f, 0x01, 0x42, 0x55, 0x7d, 0x02, 0x37, 0xb9, 0xfc, 0x83, 0x53, 0x33, 0xb2, 0x62, 0x67, 0x54, 0x02, 0xde, 0xfe, 0xc4, 0x01, 0x3c, 0xd6, 0x01, 0x55, 0xe5, 0x66, 0x98, 0xb6, 0xc9, 0xfd, 0x22, 0x93, 0x03, 0x71, 0xc9, 0x83, 0x5d, 0x38, 0x98, 0xc6, 0x83, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x06, 0x0a, 0x05, 0xee, 0x00, 0x15, 0x00, 0x1f, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x22, 0x26, 0x10, 0x36, 0x20, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x11, 0x33, 0x15, 0x21, 0x35, 0x01, 0x35, 0x34, 0x27, 0x26, 0x22, 0x06, 0x14, 0x16, 0x33, 0x04, 0xa9, 0xfe, 0x70, 0x8d, 0xdf, 0xa9, 0x9e, 0x9f, 0x01, 0x42, 0x55, 0x7d, 0x02, 0x37, 0xb9, 0xf9, 0xe5, 0x02, 0x9e, 0x53, 0x33, 0xb2, 0x62, 0x67, 0x54, 0x93, 0x02, 0x4b, 0xfe, 0xc4, 0x01, 0x3c, 0xd6, 0x01, 0x55, 0xe5, 0x66, 0x98, 0xb6, 0xc9, 0xfd, 0x22, 0x93, 0x93, 0x02, 0xde, 0xc9, 0x83, 0x5d, 0x38, 0x98, 0xc6, 0x83, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x05, 0x50, 0x05, 0xee, 0x00, 0x13, 0x00, 0x1d, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x23, 0x11, 0x23, 0x22, 0x26, 0x10, 0x36, 0x20, 0x17, 0x16, 0x1d, 0x01, 0x21, 0x11, 0x21, 0x35, 0x01, 0x35, 0x34, 0x27, 0x26, 0x22, 0x06, 0x14, 0x16, 0x33, 0x04, 0xa9, 0xfe, 0x70, 0x8d, 0xdf, 0xa9, 0x9e, 0x9f, 0x01, 0x42, 0x55, 0x7d, 0x02, 0x37, 0xfa, 0x9e, 0x02, 0x9e, 0x53, 0x33, 0xb2, 0x62, 0x67, 0x54, 0x93, 0x02, 0x4b, 0xfe, 0xc4, 0x01, 0x3c, 0xd6, 0x01, 0x55, 0xe5, 0x66, 0x98, 0xb6, 0xc9, 0xfc, 0x8f, 0x93, 0x02, 0xde, 0xc9, 0x83, 0x5d, 0x38, 0x98, 0xc6, 0x83, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x03, 0x3a, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0xae, 0x02, 0x42, 0xfe, 0x63, 0x01, 0x9d, 0xfe, 0x63, 0x01, 0xe6, 0x05, 0xd5, 0x93, 0xfe, 0x2f, 0x92, 0xfd, 0xb4, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x3a, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x23, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x12, 0xc0, 0x02, 0x42, 0xfe, 0x63, 0x01, 0x9d, 0xfe, 0x63, 0x01, 0xe6, 0x93, 0x05, 0x42, 0x93, 0xfe, 0x2f, 0x92, 0xfd, 0xb4, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x02, 0xf1, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x35, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x01, 0x53, 0xfe, 0x9b, 0xc0, 0x02, 0x42, 0xfe, 0x63, 0x01, 0x9d, 0xfe, 0x63, 0x93, 0x05, 0x42, 0x93, 0xfe, 0x2f, 0x92, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0x3a, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0x01, 0xd4, 0xfe, 0x63, 0x01, 0x9d, 0xfe, 0x63, 0x02, 0x43, 0xbf, 0x02, 0xdf, 0x92, 0x01, 0xd1, 0x93, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x3a, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0x12, 0x01, 0xe6, 0xfe, 0x63, 0x01, 0x9d, 0xfe, 0x63, 0x02, 0x43, 0xbf, 0x93, 0x02, 0x4c, 0x92, 0x01, 0xd1, 0x93, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x02, 0x7a, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x02, 0x7a, 0xfd, 0x74, 0x01, 0xe6, 0xfe, 0x63, 0x01, 0x9d, 0xfe, 0x63, 0x02, 0x43, 0x93, 0x02, 0x4c, 0x92, 0x01, 0xd1, 0x93, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x04, 0x18, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x17, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x01, 0x11, 0x33, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x33, 0x15, 0x02, 0x59, 0xfe, 0xef, 0x01, 0x0e, 0x49, 0x2f, 0x28, 0x28, 0x37, 0xfe, 0x10, 0xa7, 0x01, 0x33, 0x5e, 0x73, 0x4f, 0x47, 0xbe, 0x02, 0xde, 0xfd, 0xb5, 0x5d, 0x4f, 0x7a, 0x7d, 0x49, 0x5f, 0xfd, 0x22, 0x05, 0xd5, 0xfd, 0x9c, 0x87, 0x5f, 0xd2, 0xa4, 0x82, 0x93, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x18, 0x05, 0xd5, 0x00, 0x0e, 0x00, 0x19, 0x00, 0x00, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x33, 0x15, 0x01, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x12, 0xb9, 0xa7, 0x01, 0x33, 0x5e, 0x73, 0x4f, 0x47, 0xbe, 0xfe, 0x41, 0xfe, 0xef, 0x01, 0x0e, 0x49, 0x2f, 0x28, 0x28, 0x37, 0x93, 0x05, 0x42, 0xfd, 0x9c, 0x87, 0x5f, 0xd2, 0xa4, 0x82, 0x93, 0x02, 0xde, 0xfd, 0xb5, 0x5d, 0x4f, 0x7a, 0x7d, 0x49, 0x5f, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xa1, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x19, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x01, 0x35, 0x33, 0x11, 0x33, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x02, 0x59, 0xfe, 0xef, 0x01, 0x0e, 0x49, 0x2f, 0x28, 0x28, 0x37, 0xfd, 0x57, 0xb9, 0xa7, 0x01, 0x33, 0x5e, 0x73, 0x4f, 0x4f, 0x50, 0x61, 0x02, 0xde, 0xfd, 0xb5, 0x5d, 0x4f, 0x7a, 0x7d, 0x49, 0x5f, 0xfd, 0x22, 0x93, 0x05, 0x42, 0xfd, 0x9c, 0x87, 0x5f, 0xd2, 0xad, 0x87, 0x85, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x04, 0x7a, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x21, 0x34, 0x02, 0x27, 0x26, 0x27, 0x03, 0x35, 0x21, 0x15, 0x05, 0x13, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x21, 0x15, 0x02, 0x66, 0x18, 0x30, 0x46, 0x7b, 0xaf, 0x03, 0x0c, 0xfd, 0xd6, 0x8e, 0x7a, 0x2f, 0x3b, 0x06, 0x02, 0x01, 0x70, 0x99, 0x01, 0x5f, 0x96, 0xdc, 0xdc, 0x01, 0x39, 0x56, 0x93, 0x01, 0xfe, 0xef, 0xea, 0xb8, 0xe6, 0x9c, 0x40, 0x39, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x04, 0x7a, 0x05, 0xd5, 0x00, 0x16, 0x00, 0x00, 0x23, 0x35, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x03, 0x35, 0x21, 0x15, 0x05, 0x13, 0x16, 0x17, 0x16, 0x17, 0x16, 0x15, 0x21, 0x15, 0x12, 0x02, 0x75, 0x03, 0x07, 0x0b, 0x30, 0x46, 0x7b, 0xaf, 0x03, 0x0c, 0xfd, 0xd6, 0x8e, 0x7a, 0x2f, 0x3b, 0x06, 0x02, 0x01, 0x70, 0x93, 0x58, 0x5d, 0xb0, 0x96, 0xdc, 0xdc, 0x01, 0x39, 0x56, 0x93, 0x01, 0xfe, 0xef, 0xea, 0xb8, 0xe6, 0x9c, 0x40, 0x39, 0x93, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0xba, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x00, 0x23, 0x35, 0x21, 0x26, 0x27, 0x26, 0x27, 0x26, 0x27, 0x03, 0x35, 0x21, 0x15, 0x05, 0x13, 0x16, 0x17, 0x16, 0x12, 0x07, 0x12, 0x02, 0x75, 0x03, 0x07, 0x0b, 0x30, 0x46, 0x7b, 0xaf, 0x03, 0x0c, 0xfd, 0xd6, 0x8e, 0x7a, 0x2f, 0x3b, 0x0a, 0x01, 0x93, 0x58, 0x5d, 0xb0, 0x96, 0xdc, 0xdc, 0x01, 0x39, 0x56, 0x93, 0x01, 0xfe, 0xef, 0xea, 0xb8, 0xe6, 0xfe, 0xc9, 0x71, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x02, 0x98, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x00, 0x21, 0x11, 0x03, 0x35, 0x13, 0x33, 0x11, 0x33, 0x15, 0x01, 0x32, 0xfb, 0xf9, 0xa8, 0xbf, 0x04, 0xdf, 0xfe, 0xc7, 0xf6, 0x01, 0x39, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x02, 0x98, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x03, 0x35, 0x13, 0x33, 0x11, 0x33, 0x15, 0x12, 0x01, 0x44, 0xfb, 0xf9, 0xa8, 0xbf, 0x93, 0x04, 0x4c, 0xfe, 0xc7, 0xf6, 0x01, 0x39, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x01, 0xd8, 0x05, 0xd5, 0x00, 0x08, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x03, 0x35, 0x13, 0x33, 0x11, 0x12, 0x01, 0x44, 0xfb, 0xf9, 0xa8, 0x93, 0x04, 0x4c, 0xfe, 0xc7, 0xf6, 0x01, 0x39, 0xfa, 0x2b, 0x00, 0x00, 0x03, 0x00, 0xad, 0x00, 0x00, 0x06, 0xfa, 0x04, 0x1a, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x00, 0x33, 0x11, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x33, 0x15, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0xae, 0xdb, 0xb3, 0x70, 0x6c, 0x30, 0x21, 0x87, 0xbe, 0xbd, 0x55, 0x7a, 0xc0, 0xfe, 0x98, 0x93, 0x51, 0x74, 0x72, 0x01, 0xca, 0xfd, 0x8e, 0x94, 0x50, 0x62, 0x85, 0x01, 0xcb, 0x01, 0xee, 0xa6, 0x00, 0xff, 0x4b, 0x2d, 0x2d, 0xd2, 0x58, 0x80, 0x68, 0xfd, 0xb9, 0x93, 0x02, 0x7c, 0x82, 0x80, 0xc5, 0x95, 0xfe, 0x6e, 0x01, 0x63, 0x83, 0x7f, 0xa7, 0xd2, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x06, 0xfa, 0x04, 0x1a, 0x00, 0x13, 0x00, 0x1c, 0x00, 0x25, 0x00, 0x00, 0x23, 0x35, 0x33, 0x11, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x33, 0x15, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x12, 0xc0, 0xdb, 0xb3, 0x70, 0x6c, 0x30, 0x21, 0x87, 0xbe, 0xbd, 0x55, 0x7a, 0xc0, 0xfe, 0x98, 0x93, 0x51, 0x74, 0x72, 0x01, 0xca, 0xfd, 0x8e, 0x94, 0x50, 0x62, 0x85, 0x01, 0xcb, 0x93, 0x01, 0x5b, 0xa6, 0x00, 0xff, 0x4b, 0x2d, 0x2d, 0xd2, 0x58, 0x80, 0x68, 0xfd, 0xb9, 0x93, 0x02, 0x7c, 0x82, 0x80, 0xc5, 0x95, 0xfe, 0x6e, 0x01, 0x63, 0x83, 0x7f, 0xa7, 0xd2, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x06, 0x3a, 0x04, 0x1a, 0x00, 0x11, 0x00, 0x1a, 0x00, 0x23, 0x00, 0x00, 0x23, 0x35, 0x33, 0x11, 0x34, 0x12, 0x33, 0x32, 0x16, 0x17, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x16, 0x15, 0x11, 0x03, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x11, 0x21, 0x01, 0x34, 0x26, 0x23, 0x22, 0x06, 0x1d, 0x01, 0x21, 0x12, 0xc0, 0xdb, 0xb3, 0x70, 0x6c, 0x30, 0x21, 0x87, 0xbe, 0xbd, 0x55, 0x7a, 0xa8, 0x93, 0x51, 0x74, 0x72, 0x01, 0xca, 0xfd, 0x8e, 0x94, 0x50, 0x62, 0x85, 0x01, 0xcb, 0x93, 0x01, 0x5b, 0xa6, 0x00, 0xff, 0x4b, 0x2d, 0x2d, 0xd2, 0x58, 0x80, 0x68, 0xfd, 0x26, 0x02, 0x7c, 0x82, 0x80, 0xc5, 0x95, 0xfe, 0x6e, 0x01, 0x63, 0x83, 0x7f, 0xa7, 0xd2, 0xf2, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0x7a, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x01, 0x61, 0xfe, 0xd6, 0x01, 0x2a, 0xa5, 0x01, 0x2a, 0xfe, 0xd6, 0x01, 0x73, 0x03, 0x81, 0x93, 0x01, 0xc1, 0xfe, 0x3f, 0x93, 0xfd, 0x12, 0x93, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x7a, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x12, 0x01, 0x73, 0xfe, 0xd6, 0x01, 0x2a, 0xa5, 0x01, 0x2a, 0xfe, 0xd6, 0x01, 0x73, 0x93, 0x02, 0xee, 0x93, 0x01, 0xc1, 0xfe, 0x3f, 0x93, 0xfd, 0x12, 0x93, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x31, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x02, 0x06, 0xfd, 0xe8, 0x01, 0x73, 0xfe, 0xd6, 0x01, 0x2a, 0xa5, 0x01, 0x2a, 0xfe, 0xd6, 0x93, 0x02, 0xee, 0x93, 0x01, 0xc1, 0xfe, 0x3f, 0x93, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x05, 0xb6, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x15, 0x00, 0x00, 0x25, 0x11, 0x21, 0x11, 0x07, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x03, 0x9d, 0xfe, 0x6a, 0xa6, 0xfe, 0xd6, 0x01, 0x2a, 0xa6, 0x01, 0x96, 0xa6, 0x01, 0x2b, 0xfe, 0xd5, 0x01, 0x73, 0x93, 0x02, 0xee, 0xfd, 0x12, 0x93, 0x03, 0x81, 0x93, 0x01, 0xc1, 0xfe, 0x3f, 0x01, 0xc1, 0xfe, 0x3f, 0x93, 0xfd, 0x12, 0x93, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x05, 0xb6, 0x05, 0xd5, 0x00, 0x13, 0x00, 0x17, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x25, 0x11, 0x21, 0x11, 0x12, 0x01, 0x73, 0xfe, 0xd6, 0x01, 0x2a, 0xa6, 0x01, 0x96, 0xa6, 0x01, 0x2b, 0xfe, 0xd5, 0x01, 0x73, 0xfd, 0xe7, 0xfe, 0x6a, 0x93, 0x02, 0xee, 0x93, 0x01, 0xc1, 0xfe, 0x3f, 0x01, 0xc1, 0xfe, 0x3f, 0x93, 0xfd, 0x12, 0x93, 0x93, 0x02, 0xee, 0xfd, 0x12, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x05, 0x6e, 0x05, 0xd5, 0x00, 0x11, 0x00, 0x15, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x03, 0x11, 0x21, 0x11, 0x04, 0x43, 0xfb, 0xab, 0x01, 0x73, 0xfe, 0xd6, 0x01, 0x2a, 0xa6, 0x01, 0x96, 0xa6, 0x01, 0x2b, 0xfe, 0xd5, 0xa6, 0xfe, 0x6a, 0x93, 0x02, 0xee, 0x93, 0x01, 0xc1, 0xfe, 0x3f, 0x01, 0xc1, 0xfe, 0x3f, 0x93, 0xfd, 0x12, 0x02, 0xee, 0xfd, 0x12, 0x00, 0x00, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x00, 0x04, 0xc8, 0x03, 0x71, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x33, 0x11, 0x21, 0x11, 0x33, 0x15, 0x01, 0x11, 0x21, 0x11, 0xa7, 0x03, 0x67, 0xb9, 0xfc, 0x87, 0x02, 0x19, 0x03, 0x71, 0xfd, 0x22, 0x93, 0x02, 0xde, 0xfd, 0xb5, 0x02, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0xc8, 0x03, 0x71, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x23, 0x35, 0x33, 0x11, 0x21, 0x11, 0x33, 0x15, 0x01, 0x11, 0x21, 0x11, 0x12, 0xb9, 0x03, 0x67, 0xb9, 0xfc, 0x87, 0x02, 0x19, 0x93, 0x02, 0xde, 0xfd, 0x22, 0x93, 0x02, 0xde, 0xfd, 0xb5, 0x02, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0e, 0x03, 0x71, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x29, 0x01, 0x35, 0x33, 0x11, 0x21, 0x05, 0x11, 0x21, 0x11, 0x04, 0x0e, 0xfb, 0xe0, 0xb9, 0x03, 0x67, 0xfd, 0x40, 0x02, 0x19, 0x93, 0x02, 0xde, 0x93, 0xfd, 0xb5, 0x02, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x04, 0x92, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x01, 0x21, 0x01, 0x07, 0x01, 0x21, 0x01, 0x21, 0x15, 0x03, 0x65, 0xfd, 0xb6, 0x01, 0x25, 0x68, 0xfe, 0x5f, 0x04, 0x12, 0xfe, 0x91, 0x01, 0xb8, 0x05, 0x42, 0xfb, 0x7e, 0xc0, 0x05, 0xd5, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x92, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x21, 0x01, 0x05, 0x35, 0x21, 0x01, 0x21, 0x01, 0x21, 0x15, 0x03, 0x65, 0xfd, 0xb6, 0x01, 0x25, 0xfd, 0xae, 0x01, 0xb8, 0xfe, 0x91, 0x04, 0x12, 0xfe, 0x91, 0x01, 0xb8, 0x05, 0x42, 0xfb, 0x7e, 0xc0, 0x93, 0x05, 0x42, 0xfa, 0xbe, 0x93, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x4a, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x01, 0x21, 0x01, 0x05, 0x35, 0x21, 0x01, 0x21, 0x01, 0x03, 0x65, 0xfd, 0xb6, 0x01, 0x25, 0xfd, 0xae, 0x01, 0xb8, 0xfe, 0x91, 0x04, 0x12, 0xfe, 0x5f, 0x05, 0x42, 0xfb, 0x7e, 0xc0, 0x93, 0x05, 0x42, 0xfa, 0x2b, 0x00, 0x00, 0x03, 0x00, 0xad, 0x00, 0x00, 0x05, 0x5b, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x06, 0x07, 0x06, 0x2f, 0x01, 0x11, 0x21, 0x15, 0x03, 0x15, 0x97, 0x55, 0x21, 0x1b, 0x1b, 0x1b, 0x5e, 0x94, 0xfe, 0x3f, 0x01, 0x1c, 0xfe, 0x3e, 0x01, 0xc2, 0x01, 0x84, 0x77, 0x3a, 0x3e, 0x01, 0x3d, 0x53, 0x7e, 0xbf, 0x02, 0x46, 0x03, 0x71, 0x51, 0x45, 0x3d, 0x3c, 0x64, 0x5e, 0xfd, 0x9c, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x22, 0x03, 0x71, 0x02, 0x64, 0x85, 0x90, 0x7c, 0x91, 0x5b, 0x7c, 0x01, 0x01, 0xfd, 0xb5, 0x93, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x05, 0x5b, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x21, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x01, 0x11, 0x21, 0x11, 0x01, 0x35, 0x33, 0x11, 0x21, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x06, 0x07, 0x06, 0x2f, 0x01, 0x11, 0x21, 0x15, 0x03, 0x15, 0x97, 0x55, 0x21, 0x1b, 0x1b, 0x1b, 0x5e, 0x94, 0xfe, 0x3f, 0x01, 0x1c, 0xfd, 0x7e, 0xc0, 0x01, 0xc2, 0x01, 0x84, 0x77, 0x3a, 0x3e, 0x01, 0x3d, 0x53, 0x7e, 0xbf, 0x02, 0x46, 0x03, 0x71, 0x51, 0x45, 0x3d, 0x3c, 0x64, 0x5e, 0xfd, 0x9c, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x22, 0x93, 0x02, 0xde, 0x02, 0x64, 0x85, 0x90, 0x7c, 0x91, 0x5b, 0x7c, 0x01, 0x01, 0xfd, 0xb5, 0x93, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x04, 0xe3, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x0e, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x2b, 0x01, 0x01, 0x11, 0x21, 0x11, 0x13, 0x21, 0x35, 0x33, 0x11, 0x21, 0x11, 0x21, 0x32, 0x17, 0x16, 0x15, 0x06, 0x07, 0x06, 0x2f, 0x01, 0x03, 0x15, 0x97, 0x55, 0x21, 0x1b, 0x1b, 0x1b, 0x5e, 0x94, 0xfe, 0x3f, 0x01, 0x1c, 0xa5, 0xfc, 0xd9, 0xc0, 0x01, 0xc2, 0x01, 0x84, 0x77, 0x3a, 0x3e, 0x01, 0x3d, 0x53, 0x7e, 0xbf, 0x03, 0x71, 0x51, 0x45, 0x3d, 0x3c, 0x64, 0x5e, 0xfd, 0x9c, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x22, 0x93, 0x02, 0xde, 0x02, 0x64, 0x85, 0x90, 0x7c, 0x91, 0x5b, 0x7c, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x03, 0xe3, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x02, 0x7e, 0xfe, 0xd6, 0xa6, 0xa6, 0x01, 0x2a, 0xa6, 0xbe, 0x03, 0x81, 0xfe, 0xfc, 0x02, 0x9b, 0xfe, 0xfc, 0x01, 0xc1, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe3, 0x05, 0xd5, 0x00, 0x0f, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x33, 0x15, 0x12, 0x02, 0x90, 0xfe, 0xd6, 0xa6, 0xa6, 0x01, 0x2a, 0xa6, 0xbe, 0x93, 0x02, 0xee, 0xfe, 0xfc, 0x02, 0x9b, 0xfe, 0xfc, 0x01, 0xc1, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x24, 0x05, 0xd5, 0x00, 0x0d, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x11, 0x12, 0x02, 0x90, 0xfe, 0xd6, 0xa6, 0xa6, 0x01, 0x2a, 0xa6, 0x93, 0x02, 0xee, 0xfe, 0xfc, 0x02, 0x9b, 0xfe, 0xfc, 0x01, 0xc1, 0xfa, 0x2b, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0x00, 0x05, 0x49, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x01, 0xac, 0x01, 0x12, 0xfe, 0xf2, 0x4a, 0x2f, 0x27, 0x27, 0x37, 0x01, 0x4a, 0xfe, 0xcd, 0x61, 0x70, 0x4f, 0x4f, 0x4f, 0x61, 0x01, 0xfa, 0x01, 0x2b, 0xfe, 0xd5, 0x01, 0xeb, 0x02, 0xf7, 0x02, 0x4b, 0x5d, 0x4f, 0x7a, 0x7d, 0x49, 0x5f, 0xfd, 0x09, 0x02, 0x64, 0x87, 0x5f, 0xd2, 0xad, 0x87, 0x85, 0xfd, 0x22, 0x93, 0xfe, 0x2f, 0x93, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x05, 0x49, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x35, 0x21, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x01, 0xac, 0x01, 0x12, 0xfe, 0xf2, 0x4a, 0x2f, 0x27, 0x27, 0x37, 0xfe, 0x80, 0x02, 0xca, 0xfe, 0xcd, 0x61, 0x70, 0x4f, 0x4f, 0x4f, 0x61, 0x01, 0xfa, 0x01, 0x2b, 0xfe, 0xd5, 0x01, 0xeb, 0x02, 0xf7, 0x02, 0x4b, 0x5d, 0x4f, 0x7a, 0x7d, 0x49, 0x5f, 0xfd, 0x09, 0x93, 0x01, 0xd1, 0x87, 0x5f, 0xd2, 0xad, 0x87, 0x85, 0xfd, 0x22, 0x93, 0xfe, 0x2f, 0x93, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x89, 0x05, 0xd5, 0x00, 0x0a, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x21, 0x11, 0x21, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x01, 0x35, 0x21, 0x11, 0x21, 0x22, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x33, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x01, 0xac, 0x01, 0x12, 0xfe, 0xf2, 0x4a, 0x2f, 0x27, 0x27, 0x37, 0xfe, 0x80, 0x02, 0xca, 0xfe, 0xcd, 0x61, 0x70, 0x4f, 0x4f, 0x4f, 0x61, 0x01, 0xfa, 0x01, 0x2b, 0xfe, 0xd5, 0x02, 0xf7, 0x02, 0x4b, 0x5d, 0x4f, 0x7a, 0x7d, 0x49, 0x5f, 0xfd, 0x09, 0x93, 0x01, 0xd1, 0x87, 0x5f, 0xd2, 0xad, 0x87, 0x85, 0xfd, 0x22, 0x93, 0xfd, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x36, 0x00, 0x00, 0x03, 0x7a, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x01, 0x61, 0xfe, 0xd6, 0x02, 0xf9, 0xfe, 0xd6, 0x01, 0x73, 0x05, 0x42, 0x93, 0x93, 0xfb, 0x51, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x7a, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x12, 0x01, 0x73, 0xfe, 0xd6, 0x02, 0xf9, 0xfe, 0xd6, 0x01, 0x73, 0x93, 0x04, 0xaf, 0x93, 0x93, 0xfb, 0x51, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x31, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x11, 0x21, 0x35, 0x21, 0x15, 0x21, 0x02, 0x06, 0xfd, 0xe8, 0x01, 0x73, 0xfe, 0xd6, 0x02, 0xf9, 0xfe, 0xd6, 0x93, 0x04, 0xaf, 0x93, 0x93, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x36, 0x00, 0x00, 0x04, 0x92, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x25, 0x09, 0x01, 0x07, 0x01, 0x33, 0x01, 0x33, 0x15, 0x03, 0x65, 0xfe, 0xdb, 0xfe, 0xdb, 0xe4, 0x01, 0xa1, 0xd0, 0x01, 0x6f, 0x7b, 0x93, 0x04, 0x82, 0xfb, 0x7e, 0x93, 0x05, 0xd5, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x92, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x0a, 0x00, 0x00, 0x25, 0x09, 0x01, 0x05, 0x35, 0x33, 0x01, 0x33, 0x01, 0x33, 0x15, 0x03, 0x65, 0xfe, 0xdb, 0xfe, 0xdb, 0xfe, 0xd3, 0x7b, 0x01, 0x6f, 0xd0, 0x01, 0x6f, 0x7b, 0x93, 0x04, 0x82, 0xfb, 0x7e, 0x93, 0x93, 0x05, 0x42, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x4a, 0x05, 0xd5, 0x00, 0x02, 0x00, 0x08, 0x00, 0x00, 0x25, 0x09, 0x01, 0x05, 0x35, 0x33, 0x01, 0x33, 0x01, 0x03, 0x65, 0xfe, 0xdb, 0xfe, 0xdb, 0xfe, 0xd3, 0x7b, 0x01, 0x6f, 0xd0, 0x01, 0xa1, 0x93, 0x04, 0x82, 0xfb, 0x7e, 0x93, 0x93, 0x05, 0x42, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x00, 0x21, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0x21, 0x15, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x01, 0xd0, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xfe, 0xd6, 0x01, 0xd0, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0x01, 0xe2, 0xfc, 0x9a, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x01, 0x86, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0xf3, 0x93, 0xfe, 0x7b, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xf2, 0x93, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x00, 0x23, 0x35, 0x21, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0x21, 0x15, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x12, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xfe, 0xd6, 0x01, 0xd0, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0x01, 0xe2, 0xfc, 0x9a, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x93, 0xf3, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0xf3, 0x93, 0xfe, 0x7b, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xf2, 0x93, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe1, 0x05, 0xd5, 0x00, 0x1c, 0x00, 0x28, 0x00, 0x00, 0x23, 0x35, 0x21, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x12, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xfe, 0xd6, 0x01, 0xd0, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0xfe, 0x7c, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x93, 0xf3, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0xf3, 0x93, 0xfe, 0x7b, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xfe, 0x7b, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x03, 0xe3, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x15, 0x02, 0x7e, 0xfe, 0xd6, 0xa6, 0x02, 0x76, 0xbe, 0x05, 0x42, 0xfe, 0xc5, 0x01, 0xce, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe3, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x33, 0x15, 0x12, 0x02, 0x90, 0xfe, 0xd6, 0xa6, 0x02, 0x76, 0xbe, 0x93, 0x04, 0xaf, 0xfe, 0xc5, 0x01, 0xce, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x24, 0x05, 0xd5, 0x00, 0x09, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x21, 0x11, 0x12, 0x02, 0x90, 0xfe, 0xd6, 0xa6, 0x02, 0x76, 0x93, 0x04, 0xaf, 0xfe, 0xc5, 0x01, 0xce, 0xfa, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0x00, 0x00, 0x03, 0xe3, 0x04, 0xe6, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x15, 0x02, 0x7e, 0xfe, 0xd6, 0xa6, 0xa6, 0x01, 0xd0, 0xbe, 0x03, 0x4f, 0xfe, 0xfc, 0x02, 0x9b, 0xfe, 0xfc, 0xfc, 0xb1, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe3, 0x04, 0xe6, 0x00, 0x0d, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x15, 0x12, 0x02, 0x90, 0xfe, 0xd6, 0xa6, 0xa6, 0x01, 0xd0, 0xbe, 0x93, 0x02, 0xbc, 0xfe, 0xfc, 0x02, 0x9b, 0xfe, 0xfc, 0xfc, 0xb1, 0x93, 0x00, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x03, 0x24, 0x04, 0xe6, 0x00, 0x0b, 0x00, 0x00, 0x23, 0x35, 0x21, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x12, 0x02, 0x90, 0xfe, 0xd6, 0xa6, 0xa6, 0x01, 0xd0, 0x93, 0x02, 0xbc, 0xfe, 0xfc, 0x02, 0x9b, 0xfe, 0xfc, 0xfc, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x00, 0xad, 0x00, 0x00, 0x03, 0xd5, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0x01, 0x54, 0x01, 0x1c, 0xfe, 0x3e, 0x01, 0xc2, 0xfe, 0x3e, 0x02, 0x67, 0xc0, 0x02, 0xde, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x22, 0x03, 0x71, 0x01, 0xd1, 0x93, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xd5, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x35, 0x33, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x33, 0x15, 0x01, 0x54, 0x01, 0x1c, 0xfd, 0x7e, 0xc0, 0x01, 0xc2, 0xfe, 0x3e, 0x02, 0x67, 0xc0, 0x02, 0xde, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x22, 0x93, 0x02, 0xde, 0x01, 0xd1, 0x93, 0xfa, 0xbe, 0x93, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0x16, 0x05, 0xd5, 0x00, 0x03, 0x00, 0x0d, 0x00, 0x00, 0x01, 0x11, 0x21, 0x11, 0x01, 0x35, 0x33, 0x11, 0x21, 0x11, 0x21, 0x35, 0x21, 0x11, 0x01, 0x54, 0x01, 0x1c, 0xfd, 0x7e, 0xc0, 0x01, 0xc2, 0xfe, 0x3e, 0x02, 0x67, 0x02, 0xde, 0xfd, 0xb5, 0x02, 0x4b, 0xfd, 0x22, 0x93, 0x02, 0xde, 0x01, 0xd1, 0x93, 0xfa, 0x2b, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x00, 0x12, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x13, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x11, 0x33, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0x21, 0x15, 0xf2, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x8c, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xa6, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0x01, 0xe2, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0xfc, 0x7e, 0x01, 0x86, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0x01, 0x86, 0xfe, 0x7b, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xf2, 0x93, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x28, 0x00, 0x00, 0x12, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x01, 0x15, 0x21, 0x35, 0x21, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x11, 0x33, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0xf2, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x03, 0x14, 0xfb, 0x96, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xa6, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0xfd, 0x11, 0x93, 0x93, 0xf3, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0x01, 0x86, 0xfe, 0x7b, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xf2, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe1, 0x05, 0xd5, 0x00, 0x0b, 0x00, 0x26, 0x00, 0x00, 0x12, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x13, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x11, 0x33, 0x11, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x11, 0x21, 0x35, 0xf2, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x8c, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xa6, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0xfd, 0x78, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0xfd, 0x11, 0xf3, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0x01, 0x86, 0xfe, 0x7b, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xfe, 0x7b, 0x93, 0x00, 0x00, 0x00, 0x02, 0x00, 0x65, 0x00, 0x00, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x00, 0x21, 0x11, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0x21, 0x15, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x01, 0xd0, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xfe, 0xd6, 0x02, 0xfa, 0xfe, 0xd6, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0x01, 0xe2, 0xfc, 0x9a, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x01, 0x86, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0xf3, 0x93, 0x93, 0xf2, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xf2, 0x93, 0x03, 0x22, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x59, 0x05, 0xd5, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x00, 0x25, 0x15, 0x21, 0x35, 0x21, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x15, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x04, 0x58, 0xfb, 0x96, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xfe, 0xd6, 0x02, 0xfa, 0xfe, 0xd6, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0xfe, 0x7c, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x93, 0x93, 0x93, 0xf3, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0xf3, 0x93, 0x93, 0xf2, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0xf2, 0x02, 0x8f, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0xe1, 0x05, 0xd5, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x35, 0x26, 0x27, 0x2e, 0x01, 0x34, 0x37, 0x36, 0x37, 0x36, 0x37, 0x35, 0x21, 0x35, 0x21, 0x15, 0x21, 0x15, 0x16, 0x17, 0x1e, 0x01, 0x14, 0x06, 0x07, 0x06, 0x07, 0x00, 0x14, 0x1e, 0x01, 0x32, 0x3e, 0x01, 0x34, 0x2e, 0x01, 0x22, 0x06, 0x02, 0x76, 0xfd, 0x78, 0x01, 0xe2, 0x49, 0x43, 0x67, 0x77, 0x3c, 0x3e, 0x64, 0x43, 0x49, 0xfe, 0xd6, 0x02, 0xfa, 0xfe, 0xd6, 0x4f, 0x3e, 0x67, 0x77, 0x77, 0x67, 0x42, 0x4b, 0xfe, 0x7c, 0x52, 0x8c, 0xa6, 0x8d, 0x51, 0x51, 0x8d, 0xa6, 0x8c, 0x93, 0xf3, 0x0b, 0x1f, 0x31, 0xa6, 0xc6, 0x53, 0x56, 0x2f, 0x1f, 0x0b, 0xf3, 0x93, 0x93, 0xf2, 0x0d, 0x1e, 0x32, 0xa6, 0xc6, 0xa6, 0x31, 0x20, 0x0b, 0x01, 0x9d, 0x70, 0x5f, 0x38, 0x38, 0x5f, 0x70, 0x60, 0x38, 0x38, 0x00, 0xff, 0xff, 0xfd, 0x3a, 0x03, 0xfb, 0xff, 0x28, 0x06, 0x20, 0x10, 0x07, 0x02, 0x9c, 0xfc, 0x65, 0xff, 0x1a, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0xca, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdd, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x01, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb3, 0x00, 0x00, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb3, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x00, 0x99, 0x02, 0x86, 0x05, 0xdc, 0x05, 0xd5, 0x12, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x02, 0x86, 0x10, 0x27, 0x0b, 0xb4, 0x00, 0x00, 0x03, 0xc9, 0x10, 0x07, 0x0b, 0xb4, 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x01, 0x6e, 0x05, 0x18, 0x04, 0x99, 0x05, 0xe0, 0x00, 0x0b, 0x00, 0x00, 0x01, 0x07, 0x23, 0x27, 0x23, 0x07, 0x23, 0x27, 0x23, 0x07, 0x23, 0x27, 0x04, 0x98, 0x5a, 0x2d, 0x2d, 0x9d, 0x2d, 0x2d, 0x2d, 0x9e, 0x2d, 0x2d, 0x5a, 0x05, 0xe0, 0xc8, 0x64, 0x64, 0x64, 0x64, 0xc8, 0x00, 0x00, 0x01, 0x00, 0xb4, 0xfe, 0x56, 0x05, 0x63, 0x05, 0xd5, 0x00, 0x0e, 0x00, 0x00, 0x21, 0x23, 0x11, 0x01, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x11, 0x33, 0x15, 0x01, 0x23, 0x04, 0xae, 0xb0, 0xfd, 0xac, 0xf5, 0xb0, 0x02, 0x54, 0xf5, 0xb5, 0xfe, 0xb6, 0x78, 0x04, 0xe1, 0xfb, 0x1f, 0x05, 0xd5, 0xfb, 0x1f, 0x04, 0xe1, 0xfa, 0xd5, 0xaa, 0xfe, 0x56, 0x00, 0x00, 0x00, 0x01, 0x00, 0xad, 0xfe, 0x56, 0x04, 0xb3, 0x04, 0x60, 0x00, 0x0e, 0x00, 0x00, 0x21, 0x23, 0x11, 0x01, 0x23, 0x11, 0x33, 0x11, 0x01, 0x33, 0x11, 0x33, 0x15, 0x01, 0x23, 0x04, 0x0d, 0xa5, 0xfe, 0x1a, 0xd4, 0xa4, 0x01, 0xe6, 0xd5, 0xa5, 0xfe, 0xfb, 0x6e, 0x03, 0x83, 0xfc, 0x7d, 0x04, 0x60, 0xfc, 0x7f, 0x03, 0x81, 0xfc, 0x39, 0x99, 0xfe, 0x56, 0x00, 0x00, 0x00, 0x02, 0x00, 0x9c, 0xfe, 0x56, 0x03, 0xe9, 0x04, 0x7b, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x00, 0x25, 0x35, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x11, 0x10, 0x02, 0x23, 0x22, 0x26, 0x27, 0x35, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x01, 0x03, 0x43, 0x3c, 0x9f, 0x6a, 0xad, 0xb4, 0xa5, 0x70, 0x6f, 0x87, 0x9b, 0xa6, 0xe5, 0xec, 0x57, 0x9b, 0x49, 0x49, 0x8e, 0x4a, 0xa3, 0xa2, 0xfe, 0xfa, 0x6a, 0x42, 0x66, 0x63, 0xf0, 0xe7, 0x02, 0xa6, 0xfd, 0x61, 0x9f, 0x9f, 0xbe, 0xa4, 0x02, 0x7b, 0xfc, 0x2b, 0xfe, 0xe2, 0xfe, 0xe9, 0x1d, 0x1e, 0xb3, 0x2c, 0x2a, 0xbd, 0x04, 0xd0, 0x00, 0x03, 0x00, 0x70, 0xfe, 0x90, 0x03, 0xda, 0x03, 0x52, 0x00, 0x20, 0x00, 0x2c, 0x00, 0x38, 0x00, 0x00, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x03, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x01, 0xeb, 0x33, 0xa4, 0xcd, 0x57, 0x4a, 0x49, 0x4a, 0x28, 0x59, 0x44, 0x76, 0x84, 0x57, 0x54, 0xba, 0x29, 0x29, 0x5c, 0x5d, 0x68, 0x4c, 0x1d, 0x1f, 0x9b, 0x1f, 0x07, 0x08, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x39, 0x39, 0xa6, 0x39, 0x39, 0x39, 0x39, 0xa6, 0x39, 0x02, 0x3f, 0x7a, 0x99, 0x4e, 0x89, 0x86, 0x75, 0x49, 0x53, 0x2c, 0xb8, 0x82, 0x80, 0x21, 0x07, 0x26, 0xb8, 0x2a, 0x09, 0x31, 0x70, 0x1b, 0x2a, 0x44, 0xfd, 0xab, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x02, 0x00, 0x70, 0xfe, 0xa2, 0x03, 0xda, 0x03, 0x52, 0x00, 0x20, 0x00, 0x24, 0x00, 0x00, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x03, 0x33, 0x15, 0x23, 0x01, 0xeb, 0x33, 0xa4, 0xcd, 0x57, 0x4a, 0x49, 0x4a, 0x28, 0x59, 0x44, 0x76, 0x84, 0x57, 0x54, 0xba, 0x29, 0x29, 0x5c, 0x5d, 0x68, 0x4c, 0x1d, 0x1f, 0x9b, 0x1f, 0x07, 0xa3, 0x88, 0x88, 0x02, 0x3f, 0x7a, 0x99, 0x4e, 0x89, 0x86, 0x75, 0x49, 0x53, 0x2c, 0xb8, 0x82, 0x80, 0x21, 0x07, 0x26, 0xb8, 0x2a, 0x09, 0x31, 0x70, 0x1b, 0x2a, 0x44, 0xfd, 0x77, 0x96, 0x00, 0x04, 0x00, 0x70, 0xfe, 0xa2, 0x03, 0xda, 0x05, 0xf7, 0x00, 0x20, 0x00, 0x2b, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x00, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x03, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x07, 0x06, 0x17, 0x2b, 0x01, 0x35, 0x33, 0x11, 0x33, 0x11, 0x36, 0x37, 0x36, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x03, 0x33, 0x15, 0x23, 0x01, 0xeb, 0x33, 0xa4, 0xcd, 0x57, 0x4a, 0x49, 0x4a, 0x28, 0x59, 0x44, 0x76, 0x84, 0x57, 0x54, 0xba, 0x29, 0x29, 0x5c, 0x5d, 0x68, 0x4c, 0x1d, 0x1f, 0x9b, 0x1f, 0x07, 0xba, 0x32, 0x46, 0x14, 0x2f, 0x1b, 0x01, 0x40, 0x2e, 0x15, 0x9d, 0x65, 0x49, 0x5c, 0x20, 0x5e, 0x38, 0x3f, 0x3b, 0x3a, 0x30, 0x98, 0x88, 0x88, 0x02, 0x3f, 0x7a, 0x99, 0x4e, 0x89, 0x86, 0x75, 0x49, 0x53, 0x2c, 0xb8, 0x82, 0x80, 0x21, 0x07, 0x26, 0xb8, 0x2a, 0x09, 0x31, 0x70, 0x1b, 0x2a, 0x44, 0x02, 0xa7, 0x0d, 0x21, 0x15, 0x20, 0x10, 0x01, 0x1c, 0x15, 0xa8, 0x65, 0x01, 0x8f, 0xfe, 0xbf, 0x49, 0x28, 0x18, 0x1a, 0x19, 0x52, 0x5b, 0x32, 0x2a, 0xfb, 0x35, 0x96, 0x00, 0x00, 0x00, 0x04, 0x00, 0x70, 0xff, 0xda, 0x03, 0xda, 0x05, 0x78, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x03, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0xeb, 0x33, 0xa4, 0xcd, 0x57, 0x4a, 0x49, 0x4a, 0x28, 0x59, 0x44, 0x76, 0x84, 0x57, 0x54, 0xba, 0x29, 0x29, 0x5c, 0x5d, 0x68, 0x4c, 0x1d, 0x1f, 0x9b, 0x1f, 0x07, 0xcf, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x02, 0x3f, 0x7a, 0x99, 0x4e, 0x89, 0x86, 0x75, 0x49, 0x53, 0x2c, 0xb8, 0x82, 0x80, 0x21, 0x07, 0x26, 0xb8, 0x2a, 0x09, 0x31, 0x70, 0x1b, 0x2a, 0x44, 0x02, 0xbd, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x05, 0x00, 0x70, 0xff, 0xda, 0x03, 0xda, 0x05, 0xaa, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x01, 0x26, 0x27, 0x33, 0x16, 0x17, 0x16, 0x15, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x03, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x01, 0xeb, 0x33, 0xa4, 0xcd, 0x57, 0x4a, 0x49, 0x4a, 0x28, 0x59, 0x44, 0x76, 0x84, 0x57, 0x54, 0xba, 0x29, 0x29, 0x5c, 0x5d, 0x68, 0x4c, 0x1d, 0x1f, 0x9b, 0x1f, 0x07, 0x5f, 0x87, 0x87, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x87, 0x87, 0x02, 0x3f, 0x7a, 0x99, 0x4e, 0x89, 0x86, 0x75, 0x49, 0x53, 0x2c, 0xb8, 0x82, 0x80, 0x21, 0x07, 0x26, 0xb8, 0x2a, 0x09, 0x31, 0x70, 0x1b, 0x2a, 0x44, 0x02, 0xef, 0x96, 0x01, 0x90, 0x96, 0x64, 0x96, 0x01, 0x90, 0x96, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x0b, 0x02, 0x26, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x13, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0x43, 0x75, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0xd0, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x38, 0x3a, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x3a, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0xfd, 0x4a, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x02, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x0b, 0x02, 0x26, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x13, 0x33, 0x15, 0x23, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0x43, 0x75, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0x7a, 0x87, 0x87, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0xfd, 0x40, 0x96, 0x00, 0x03, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x0b, 0x02, 0x26, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x05, 0x33, 0x15, 0x23, 0x01, 0x33, 0x15, 0x23, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0x43, 0x75, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0xfe, 0x3a, 0x87, 0x87, 0x02, 0x40, 0x87, 0x87, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0xe0, 0x96, 0xfe, 0xb6, 0x96, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x0b, 0x03, 0xb6, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0x43, 0x75, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0x3b, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0x02, 0x18, 0x96, 0x96, 0x96, 0x00, 0x00, 0x05, 0xff, 0xb3, 0xfe, 0x0c, 0x04, 0x0b, 0x04, 0xb0, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x00, 0x01, 0x33, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x02, 0x07, 0x04, 0x21, 0x35, 0x20, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x13, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x07, 0x33, 0x15, 0x23, 0x11, 0x33, 0x15, 0x23, 0x02, 0x39, 0xa5, 0x1b, 0x03, 0x09, 0x42, 0x26, 0x5b, 0x43, 0x75, 0x75, 0x2d, 0x3d, 0xe2, 0xff, 0x00, 0xfe, 0xdf, 0x01, 0x11, 0xb7, 0xc4, 0x20, 0x08, 0x3b, 0x87, 0x87, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x87, 0x87, 0x02, 0x26, 0x70, 0x1e, 0x67, 0x4d, 0x2c, 0xb8, 0x3e, 0xfe, 0xea, 0x85, 0x97, 0xb8, 0x80, 0x8a, 0xd0, 0x3a, 0x48, 0x7e, 0x02, 0x18, 0x96, 0x01, 0x90, 0x96, 0x64, 0x96, 0x01, 0x90, 0x96, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x75, 0xfe, 0x0c, 0x09, 0x40, 0x03, 0xb6, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x00, 0x25, 0x16, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x33, 0x32, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x33, 0x06, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x2f, 0x01, 0x33, 0x17, 0x16, 0x17, 0x16, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x05, 0x26, 0x46, 0x2b, 0x21, 0xa6, 0x11, 0x3a, 0x63, 0x7f, 0xa6, 0x4b, 0x27, 0x59, 0x44, 0x75, 0x83, 0x6a, 0x3d, 0x62, 0x21, 0x1d, 0x42, 0x2b, 0x7c, 0x10, 0x2c, 0x55, 0x3a, 0x32, 0x7b, 0x24, 0x15, 0x4c, 0x77, 0xae, 0x48, 0x6c, 0x73, 0x63, 0xf7, 0x5f, 0xa5, 0x61, 0x01, 0x01, 0x84, 0x56, 0x48, 0x59, 0x55, 0x6d, 0x55, 0x39, 0x01, 0x01, 0x0e, 0x3a, 0xa6, 0x20, 0x0f, 0x19, 0x34, 0x19, 0x86, 0x86, 0x86, 0x88, 0x88, 0xb5, 0x02, 0x7c, 0x5f, 0xca, 0xcd, 0x32, 0xa9, 0x01, 0x18, 0x01, 0x26, 0xfe, 0xaa, 0x61, 0x53, 0x2c, 0xb8, 0x60, 0x5b, 0x19, 0x09, 0x19, 0x46, 0x7b, 0x9f, 0x1e, 0x14, 0x02, 0x02, 0x3c, 0xb3, 0x6b, 0xaa, 0x3e, 0x1a, 0x01, 0x1c, 0x47, 0x01, 0x48, 0xf6, 0xb4, 0xce, 0xdc, 0xb3, 0x26, 0x18, 0x25, 0x30, 0x9e, 0x6c, 0x8e, 0x7d, 0x3d, 0xea, 0x9c, 0x4a, 0x3c, 0x7e, 0x02, 0xfe, 0x96, 0xfc, 0x18, 0x96, 0x00, 0x03, 0xff, 0xee, 0xfe, 0xa2, 0x05, 0x70, 0x03, 0xe8, 0x00, 0x31, 0x00, 0x35, 0x00, 0x39, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x01, 0x5a, 0x27, 0x33, 0x44, 0x59, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x27, 0x27, 0x5e, 0x62, 0x27, 0x22, 0xa5, 0x11, 0x3a, 0x63, 0x80, 0xa5, 0x52, 0x44, 0x5c, 0x21, 0x20, 0x38, 0x32, 0x7b, 0x10, 0x2b, 0x57, 0x3d, 0x3a, 0x59, 0x41, 0x36, 0x01, 0x3c, 0x86, 0x86, 0x86, 0x88, 0x88, 0x8a, 0x3b, 0x21, 0x2e, 0xb8, 0x2c, 0x50, 0x64, 0xc0, 0x9c, 0x40, 0x64, 0x63, 0x7a, 0x67, 0xc2, 0xcd, 0x32, 0xaa, 0x01, 0x02, 0x01, 0x16, 0x01, 0x26, 0xfe, 0xaa, 0xc7, 0x71, 0x5c, 0x18, 0x09, 0x19, 0x3d, 0x84, 0x9c, 0x21, 0x18, 0x31, 0x28, 0x03, 0xa7, 0x96, 0xfb, 0xe6, 0x96, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0xfe, 0xa2, 0x06, 0x7f, 0x03, 0xe8, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x00, 0x05, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x04, 0x7d, 0x21, 0x20, 0x38, 0x32, 0x7b, 0x10, 0x2b, 0x57, 0x3d, 0x3a, 0x59, 0x41, 0x36, 0x24, 0x27, 0x33, 0x44, 0x59, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x27, 0x27, 0x5e, 0x62, 0x27, 0x22, 0xa5, 0x11, 0x3a, 0x63, 0x80, 0xa5, 0x4b, 0x28, 0x59, 0x43, 0x75, 0x82, 0x6a, 0x3e, 0xfd, 0xdb, 0x86, 0x86, 0x86, 0x88, 0x88, 0x14, 0x09, 0x19, 0x3d, 0x84, 0x9c, 0x21, 0x18, 0x31, 0x28, 0x49, 0x3b, 0x21, 0x2e, 0xb8, 0x2c, 0x50, 0x64, 0xc0, 0x9c, 0x40, 0x64, 0x63, 0x7a, 0x67, 0xc2, 0xcd, 0x32, 0xaa, 0x01, 0x02, 0x01, 0x16, 0x01, 0x26, 0xfe, 0xaa, 0x61, 0x53, 0x2c, 0xb8, 0x60, 0x5a, 0x03, 0xe2, 0x96, 0xfb, 0xe6, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x75, 0xfe, 0x0c, 0x09, 0x40, 0x02, 0xee, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x52, 0x00, 0x00, 0x25, 0x16, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x33, 0x32, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x33, 0x06, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x2f, 0x01, 0x33, 0x17, 0x16, 0x17, 0x16, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x05, 0x26, 0x46, 0x2b, 0x21, 0xa6, 0x11, 0x3a, 0x63, 0x7f, 0xa6, 0x4b, 0x27, 0x59, 0x44, 0x75, 0x83, 0x6a, 0x3d, 0x62, 0x21, 0x1d, 0x42, 0x2b, 0x7c, 0x10, 0x2c, 0x55, 0x3a, 0x32, 0x7b, 0x24, 0x15, 0x4c, 0x77, 0xae, 0x48, 0x6c, 0x73, 0x63, 0xf7, 0x5f, 0xa5, 0x61, 0x01, 0x01, 0x84, 0x56, 0x48, 0x59, 0x55, 0x6d, 0x55, 0x39, 0x01, 0x01, 0x0e, 0x3a, 0xa6, 0x20, 0x0f, 0x19, 0x34, 0x9f, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb5, 0x02, 0x7c, 0x5f, 0xca, 0xcd, 0x32, 0xa9, 0x01, 0x18, 0x01, 0x26, 0xfe, 0xaa, 0x61, 0x53, 0x2c, 0xb8, 0x60, 0x5b, 0x19, 0x09, 0x19, 0x46, 0x7b, 0x9f, 0x1e, 0x14, 0x02, 0x02, 0x3c, 0xb3, 0x6b, 0xaa, 0x3e, 0x1a, 0x01, 0x1c, 0x47, 0x01, 0x48, 0xf6, 0xb4, 0xce, 0xdc, 0xb3, 0x26, 0x18, 0x25, 0x30, 0x9e, 0x6c, 0x8e, 0x7d, 0x3d, 0xea, 0x9c, 0x4a, 0x3c, 0x7e, 0xfd, 0xea, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfe, 0x0c, 0x05, 0x70, 0x02, 0xee, 0x00, 0x31, 0x00, 0x35, 0x00, 0x39, 0x00, 0x3d, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x5a, 0x27, 0x33, 0x44, 0x59, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x27, 0x27, 0x5e, 0x62, 0x27, 0x22, 0xa5, 0x11, 0x3a, 0x63, 0x80, 0xa5, 0x52, 0x44, 0x5c, 0x21, 0x20, 0x38, 0x32, 0x7b, 0x10, 0x2b, 0x57, 0x3d, 0x3a, 0x59, 0x41, 0x36, 0x01, 0xc2, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x8a, 0x3b, 0x21, 0x2e, 0xb8, 0x2c, 0x50, 0x64, 0xc0, 0x9c, 0x40, 0x64, 0x63, 0x7a, 0x67, 0xc2, 0xcd, 0x32, 0xaa, 0x01, 0x02, 0x01, 0x16, 0x01, 0x26, 0xfe, 0xaa, 0xc7, 0x71, 0x5c, 0x18, 0x09, 0x19, 0x3d, 0x84, 0x9c, 0x21, 0x18, 0x31, 0x28, 0xfe, 0x61, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x04, 0xff, 0xee, 0xfe, 0x0c, 0x06, 0x7f, 0x02, 0xee, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x44, 0x00, 0x00, 0x05, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x04, 0x7d, 0x21, 0x20, 0x38, 0x32, 0x7b, 0x10, 0x2b, 0x57, 0x3d, 0x3a, 0x59, 0x41, 0x36, 0x24, 0x27, 0x33, 0x44, 0x59, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x27, 0x27, 0x5e, 0x62, 0x27, 0x22, 0xa5, 0x11, 0x3a, 0x63, 0x80, 0xa5, 0x4b, 0x28, 0x59, 0x43, 0x75, 0x82, 0x6a, 0x3e, 0xfe, 0x61, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x14, 0x09, 0x19, 0x3d, 0x84, 0x9c, 0x21, 0x18, 0x31, 0x28, 0x49, 0x3b, 0x21, 0x2e, 0xb8, 0x2c, 0x50, 0x64, 0xc0, 0x9c, 0x40, 0x64, 0x63, 0x7a, 0x67, 0xc2, 0xcd, 0x32, 0xaa, 0x01, 0x02, 0x01, 0x16, 0x01, 0x26, 0xfe, 0xaa, 0x61, 0x53, 0x2c, 0xb8, 0x60, 0x5a, 0xfe, 0x9c, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x07, 0x00, 0x75, 0xfe, 0x0c, 0x09, 0x40, 0x04, 0xb0, 0x00, 0x46, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x52, 0x00, 0x56, 0x00, 0x5a, 0x00, 0x5e, 0x00, 0x00, 0x25, 0x16, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x33, 0x32, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x33, 0x06, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x27, 0x26, 0x2f, 0x01, 0x33, 0x17, 0x16, 0x17, 0x16, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x05, 0x26, 0x46, 0x2b, 0x21, 0xa6, 0x11, 0x3a, 0x63, 0x7f, 0xa6, 0x4b, 0x27, 0x59, 0x44, 0x75, 0x83, 0x6a, 0x3d, 0x62, 0x21, 0x1d, 0x42, 0x2b, 0x7c, 0x10, 0x2c, 0x55, 0x3a, 0x32, 0x7b, 0x24, 0x15, 0x4c, 0x77, 0xae, 0x48, 0x6c, 0x73, 0x63, 0xf7, 0x5f, 0xa5, 0x61, 0x01, 0x01, 0x84, 0x56, 0x48, 0x59, 0x55, 0x6d, 0x55, 0x39, 0x01, 0x01, 0x0e, 0x3a, 0xa6, 0x20, 0x0f, 0x19, 0x34, 0x19, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xf7, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb5, 0x02, 0x7c, 0x5f, 0xca, 0xcd, 0x32, 0xa9, 0x01, 0x18, 0x01, 0x26, 0xfe, 0xaa, 0x61, 0x53, 0x2c, 0xb8, 0x60, 0x5b, 0x19, 0x09, 0x19, 0x46, 0x7b, 0x9f, 0x1e, 0x14, 0x02, 0x02, 0x3c, 0xb3, 0x6b, 0xaa, 0x3e, 0x1a, 0x01, 0x1c, 0x47, 0x01, 0x48, 0xf6, 0xb4, 0xce, 0xdc, 0xb3, 0x26, 0x18, 0x25, 0x30, 0x9e, 0x6c, 0x8e, 0x7d, 0x3d, 0xea, 0x9c, 0x4a, 0x3c, 0x7e, 0x03, 0xf8, 0x96, 0x64, 0x96, 0x96, 0x96, 0xfb, 0x82, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xee, 0xfe, 0x0c, 0x05, 0x70, 0x04, 0xb0, 0x00, 0x31, 0x00, 0x35, 0x00, 0x39, 0x00, 0x3d, 0x00, 0x41, 0x00, 0x45, 0x00, 0x49, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x5a, 0x27, 0x33, 0x44, 0x59, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x27, 0x27, 0x5e, 0x62, 0x27, 0x22, 0xa5, 0x11, 0x3a, 0x63, 0x80, 0xa5, 0x52, 0x44, 0x5c, 0x21, 0x20, 0x38, 0x32, 0x7b, 0x10, 0x2b, 0x57, 0x3d, 0x3a, 0x59, 0x41, 0x36, 0x01, 0x3c, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xf7, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x8a, 0x3b, 0x21, 0x2e, 0xb8, 0x2c, 0x50, 0x64, 0xc0, 0x9c, 0x40, 0x64, 0x63, 0x7a, 0x67, 0xc2, 0xcd, 0x32, 0xaa, 0x01, 0x02, 0x01, 0x16, 0x01, 0x26, 0xfe, 0xaa, 0xc7, 0x71, 0x5c, 0x18, 0x09, 0x19, 0x3d, 0x84, 0x9c, 0x21, 0x18, 0x31, 0x28, 0x04, 0x6f, 0x96, 0x64, 0x96, 0x96, 0x96, 0xfb, 0x82, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x07, 0xff, 0xee, 0xfe, 0x0c, 0x06, 0x7f, 0x04, 0xb0, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x44, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x50, 0x00, 0x00, 0x05, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x33, 0x14, 0x17, 0x16, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x04, 0x7d, 0x21, 0x20, 0x38, 0x32, 0x7b, 0x10, 0x2b, 0x57, 0x3d, 0x3a, 0x59, 0x41, 0x36, 0x24, 0x27, 0x33, 0x44, 0x59, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x27, 0x27, 0x5e, 0x62, 0x27, 0x22, 0xa5, 0x11, 0x3a, 0x63, 0x80, 0xa5, 0x4b, 0x28, 0x59, 0x43, 0x75, 0x82, 0x6a, 0x3e, 0xfd, 0xdb, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xf7, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x14, 0x09, 0x19, 0x3d, 0x84, 0x9c, 0x21, 0x18, 0x31, 0x28, 0x49, 0x3b, 0x21, 0x2e, 0xb8, 0x2c, 0x50, 0x64, 0xc0, 0x9c, 0x40, 0x64, 0x63, 0x7a, 0x67, 0xc2, 0xcd, 0x32, 0xaa, 0x01, 0x02, 0x01, 0x16, 0x01, 0x26, 0xfe, 0xaa, 0x61, 0x53, 0x2c, 0xb8, 0x60, 0x5a, 0x04, 0xaa, 0x96, 0x64, 0x96, 0x96, 0x96, 0xfb, 0x82, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x04, 0x00, 0x75, 0xfe, 0x0c, 0x08, 0xe5, 0x02, 0xe5, 0x00, 0x3c, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x51, 0x00, 0x00, 0x21, 0x23, 0x22, 0x27, 0x26, 0x35, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x33, 0x06, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x33, 0x06, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2f, 0x01, 0x06, 0x03, 0x22, 0x07, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x01, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x05, 0xd0, 0xf9, 0x22, 0x2f, 0x28, 0x43, 0x4f, 0xd6, 0x48, 0x6c, 0x73, 0x63, 0xf7, 0x5f, 0xa5, 0x61, 0x01, 0x01, 0x84, 0x56, 0x48, 0x5c, 0x52, 0x92, 0x27, 0x1d, 0x23, 0x9a, 0x01, 0x0d, 0x09, 0x24, 0x67, 0x6f, 0x61, 0x85, 0x40, 0x50, 0x70, 0x57, 0xa8, 0x26, 0x0d, 0x0e, 0x37, 0x4a, 0x43, 0x75, 0x76, 0x5d, 0x19, 0xb7, 0x10, 0x45, 0x71, 0x98, 0x82, 0xa8, 0xd6, 0x74, 0xa8, 0x01, 0x02, 0x7b, 0x21, 0xfe, 0xe6, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x1e, 0x1a, 0x10, 0xba, 0x80, 0x9b, 0x4d, 0x1a, 0x01, 0x1c, 0x47, 0x01, 0x48, 0xf6, 0xb4, 0xce, 0xdc, 0xb3, 0x26, 0x18, 0x25, 0x44, 0x8a, 0x6c, 0x7f, 0x93, 0x8a, 0x0f, 0x37, 0x28, 0x32, 0x92, 0x6c, 0x5e, 0x46, 0x22, 0x01, 0x02, 0x25, 0x47, 0xe9, 0x4d, 0x46, 0x0c, 0x0b, 0x2c, 0xb8, 0x5c, 0x1a, 0x76, 0x02, 0x37, 0x51, 0x6c, 0xc2, 0x3f, 0x5b, 0x46, 0x87, 0x13, 0x05, 0xfd, 0x01, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfe, 0xa2, 0x05, 0x94, 0x02, 0xe5, 0x00, 0x0c, 0x00, 0x2e, 0x00, 0x32, 0x00, 0x36, 0x00, 0x00, 0x01, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x03, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x05, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0x97, 0x82, 0xa8, 0xd6, 0x73, 0xa8, 0x7d, 0x21, 0x2c, 0x44, 0xa8, 0xf8, 0x43, 0x46, 0x3a, 0x23, 0x5c, 0x9b, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x10, 0x28, 0x5b, 0x56, 0x89, 0x82, 0x44, 0x4c, 0x68, 0x60, 0xa7, 0xa5, 0xb6, 0xfe, 0xc5, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x01, 0xe6, 0x6c, 0xc2, 0x3f, 0x5b, 0x46, 0x87, 0x13, 0x05, 0xfd, 0xc9, 0x2a, 0x23, 0x3d, 0x8a, 0xb8, 0x2c, 0x50, 0x64, 0x72, 0x4e, 0x18, 0x50, 0x32, 0x86, 0x54, 0x89, 0x3f, 0x21, 0x27, 0x44, 0xec, 0xa9, 0x6d, 0x78, 0xc8, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfe, 0xa2, 0x06, 0x51, 0x02, 0xe5, 0x00, 0x2b, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x00, 0x21, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2f, 0x01, 0x06, 0x03, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x03, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x3c, 0xfc, 0x43, 0x46, 0x3a, 0x23, 0x5c, 0x9b, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x10, 0x28, 0x5b, 0x56, 0x89, 0x82, 0x44, 0x4c, 0x66, 0x62, 0xab, 0x26, 0x0d, 0x0e, 0x37, 0x4a, 0x43, 0x75, 0x75, 0x5d, 0x19, 0xb8, 0xca, 0x97, 0x82, 0xa8, 0xd6, 0x73, 0xa8, 0x7d, 0x21, 0x2c, 0x44, 0xe3, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x2a, 0x23, 0x3d, 0x8a, 0xb8, 0x2c, 0x50, 0x64, 0x72, 0x4e, 0x18, 0x50, 0x32, 0x86, 0x54, 0x89, 0x3f, 0x21, 0x27, 0x44, 0xec, 0x4b, 0x48, 0x0c, 0x0b, 0x2c, 0xb8, 0x5c, 0x1a, 0x76, 0x01, 0xe6, 0x6c, 0xc2, 0x3f, 0x5b, 0x46, 0x87, 0x13, 0x05, 0xfd, 0x01, 0x96, 0x96, 0x96, 0x00, 0x05, 0x00, 0x75, 0xfe, 0x0c, 0x08, 0xe5, 0x04, 0xb0, 0x00, 0x3c, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x51, 0x00, 0x55, 0x00, 0x00, 0x21, 0x23, 0x22, 0x27, 0x26, 0x35, 0x14, 0x07, 0x06, 0x07, 0x06, 0x23, 0x26, 0x27, 0x26, 0x11, 0x34, 0x37, 0x33, 0x06, 0x17, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x33, 0x06, 0x17, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2f, 0x01, 0x06, 0x03, 0x22, 0x07, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x05, 0xd0, 0xf9, 0x22, 0x2f, 0x28, 0x43, 0x4f, 0xd6, 0x48, 0x6c, 0x73, 0x63, 0xf7, 0x5f, 0xa5, 0x61, 0x01, 0x01, 0x84, 0x56, 0x48, 0x5c, 0x52, 0x92, 0x27, 0x1d, 0x23, 0x9a, 0x01, 0x0d, 0x09, 0x24, 0x67, 0x6f, 0x61, 0x85, 0x40, 0x50, 0x70, 0x57, 0xa8, 0x26, 0x0d, 0x0e, 0x37, 0x4a, 0x43, 0x75, 0x76, 0x5d, 0x19, 0xb7, 0x10, 0x45, 0x71, 0x98, 0x82, 0xa8, 0xd6, 0x74, 0xa8, 0x01, 0x02, 0x7b, 0x21, 0xfd, 0x95, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x1e, 0x1a, 0x10, 0xba, 0x80, 0x9b, 0x4d, 0x1a, 0x01, 0x1c, 0x47, 0x01, 0x48, 0xf6, 0xb4, 0xce, 0xdc, 0xb3, 0x26, 0x18, 0x25, 0x44, 0x8a, 0x6c, 0x7f, 0x93, 0x8a, 0x0f, 0x37, 0x28, 0x32, 0x92, 0x6c, 0x5e, 0x46, 0x22, 0x01, 0x02, 0x25, 0x47, 0xe9, 0x4d, 0x46, 0x0c, 0x0b, 0x2c, 0xb8, 0x5c, 0x1a, 0x76, 0x02, 0x37, 0x51, 0x6c, 0xc2, 0x3f, 0x5b, 0x46, 0x87, 0x13, 0x05, 0x02, 0x79, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x05, 0xff, 0xee, 0x00, 0x00, 0x05, 0x94, 0x04, 0xb0, 0x00, 0x0c, 0x00, 0x2e, 0x00, 0x32, 0x00, 0x36, 0x00, 0x3a, 0x00, 0x00, 0x01, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x03, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0x97, 0x82, 0xa8, 0xd6, 0x73, 0xa8, 0x7d, 0x21, 0x2c, 0x44, 0xa8, 0xf8, 0x43, 0x46, 0x3a, 0x23, 0x5c, 0x9b, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x10, 0x28, 0x5b, 0x56, 0x89, 0x82, 0x44, 0x4c, 0x68, 0x60, 0xa7, 0xa5, 0xb6, 0xfd, 0xa0, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x01, 0xe6, 0x6c, 0xc2, 0x3f, 0x5b, 0x46, 0x87, 0x13, 0x05, 0xfd, 0xc9, 0x2a, 0x23, 0x3d, 0x8a, 0xb8, 0x2c, 0x50, 0x64, 0x72, 0x4e, 0x18, 0x50, 0x32, 0x86, 0x54, 0x89, 0x3f, 0x21, 0x27, 0x44, 0xec, 0xa9, 0x6d, 0x78, 0x04, 0xb0, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xee, 0x00, 0x00, 0x06, 0x51, 0x04, 0xb0, 0x00, 0x2b, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x40, 0x00, 0x44, 0x00, 0x00, 0x21, 0x23, 0x22, 0x27, 0x26, 0x27, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x3d, 0x01, 0x33, 0x15, 0x14, 0x16, 0x17, 0x36, 0x37, 0x36, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2f, 0x01, 0x06, 0x03, 0x06, 0x07, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x3c, 0xfc, 0x43, 0x46, 0x3a, 0x23, 0x5c, 0x9b, 0x75, 0x44, 0x59, 0x27, 0x48, 0xa6, 0x10, 0x28, 0x5b, 0x56, 0x89, 0x82, 0x44, 0x4c, 0x66, 0x62, 0xab, 0x26, 0x0d, 0x0e, 0x37, 0x4a, 0x43, 0x75, 0x75, 0x5d, 0x19, 0xb8, 0xca, 0x97, 0x82, 0xa8, 0xd6, 0x73, 0xa8, 0x7d, 0x21, 0x2c, 0x44, 0xfd, 0xf8, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x2a, 0x23, 0x3d, 0x8a, 0xb8, 0x2c, 0x50, 0x64, 0x72, 0x4e, 0x18, 0x50, 0x32, 0x86, 0x54, 0x89, 0x3f, 0x21, 0x27, 0x44, 0xec, 0x4b, 0x48, 0x0c, 0x0b, 0x2c, 0xb8, 0x5c, 0x1a, 0x76, 0x01, 0xe6, 0x6c, 0xc2, 0x3f, 0x5b, 0x46, 0x87, 0x13, 0x05, 0x02, 0x79, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x05, 0x00, 0x81, 0x00, 0x00, 0x06, 0xe8, 0x06, 0x14, 0x00, 0x1c, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x29, 0x02, 0x35, 0x21, 0x11, 0x33, 0x11, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2f, 0x01, 0x06, 0x25, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0xd3, 0xfd, 0xf9, 0xfe, 0xb6, 0x01, 0x4a, 0xa6, 0xc3, 0xf8, 0x53, 0x3d, 0x69, 0x5f, 0xa9, 0x26, 0x0d, 0x0e, 0x37, 0x4a, 0x44, 0x75, 0x76, 0x5d, 0x19, 0xb8, 0xfe, 0x1f, 0xa8, 0xd5, 0x74, 0xa9, 0x01, 0x02, 0x7b, 0x22, 0x2b, 0x48, 0x6e, 0x9f, 0x32, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0x05, 0x5c, 0xfb, 0x0e, 0x01, 0x3f, 0x63, 0x21, 0x27, 0x45, 0xeb, 0x4d, 0x46, 0x0c, 0x0b, 0x2c, 0xb8, 0x5c, 0x1a, 0x76, 0xb8, 0x3f, 0x5d, 0x44, 0x87, 0x13, 0x05, 0x51, 0x78, 0x03, 0x74, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x05, 0xff, 0xee, 0x00, 0x00, 0x05, 0x3f, 0x06, 0x14, 0x00, 0x0c, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x00, 0x25, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x13, 0x21, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x02, 0x00, 0xa8, 0xd6, 0x74, 0xa8, 0x01, 0x02, 0x7b, 0x21, 0x2b, 0x48, 0x6e, 0xa0, 0x6a, 0xfd, 0xfa, 0xf0, 0xf0, 0xa6, 0xc3, 0xf9, 0x52, 0x3e, 0x69, 0x5e, 0xa8, 0xa6, 0xb6, 0xfe, 0xca, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0x3f, 0x5d, 0x44, 0x87, 0x13, 0x05, 0x51, 0x78, 0xfe, 0x92, 0xb8, 0x05, 0x5c, 0xfb, 0x0e, 0x01, 0x3f, 0x63, 0x21, 0x27, 0x45, 0xeb, 0xa9, 0x6d, 0x78, 0x04, 0xe2, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x05, 0xff, 0xee, 0x00, 0x00, 0x05, 0xfa, 0x06, 0x14, 0x00, 0x1c, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x29, 0x01, 0x23, 0x35, 0x33, 0x11, 0x33, 0x11, 0x12, 0x37, 0x36, 0x33, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x2f, 0x01, 0x06, 0x25, 0x33, 0x32, 0x37, 0x36, 0x27, 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x06, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x02, 0xe6, 0xfd, 0xf8, 0xf0, 0xf0, 0xa6, 0xc3, 0xf9, 0x52, 0x3e, 0x69, 0x5e, 0xaa, 0x26, 0x0c, 0x0f, 0x37, 0x49, 0x44, 0x75, 0x76, 0x5d, 0x19, 0xb7, 0xfe, 0x1e, 0xa8, 0xd6, 0x74, 0xa8, 0x01, 0x02, 0x7b, 0x21, 0x2b, 0x48, 0x6e, 0xa0, 0x33, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0x05, 0x5c, 0xfb, 0x0e, 0x01, 0x3f, 0x63, 0x21, 0x27, 0x45, 0xeb, 0x4d, 0x46, 0x0c, 0x0b, 0x2c, 0xb8, 0x5c, 0x1a, 0x76, 0xb8, 0x3f, 0x5d, 0x44, 0x87, 0x13, 0x05, 0x51, 0x78, 0x03, 0x74, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x69, 0xfe, 0x0c, 0x04, 0x3a, 0x05, 0x46, 0x00, 0x25, 0x00, 0x2b, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x00, 0x01, 0x06, 0x23, 0x20, 0x27, 0x26, 0x10, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x37, 0x36, 0x32, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x1e, 0x01, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x15, 0x14, 0x17, 0x16, 0x21, 0x32, 0x37, 0x01, 0x36, 0x34, 0x22, 0x15, 0x14, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x04, 0x3a, 0x89, 0xe7, 0xfe, 0x85, 0x8d, 0x59, 0xa9, 0x37, 0x3d, 0x70, 0x57, 0xd7, 0x55, 0x72, 0x52, 0x33, 0x54, 0x3d, 0xa3, 0x4d, 0x90, 0x82, 0xef, 0xdf, 0x8b, 0x25, 0x60, 0x01, 0x3c, 0xae, 0xbf, 0xfd, 0x79, 0x7a, 0xb9, 0x0a, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xfe, 0x6f, 0x63, 0xbc, 0x7a, 0x01, 0x92, 0x8c, 0x32, 0x74, 0x2a, 0x6e, 0x40, 0x30, 0x30, 0x40, 0x70, 0x5b, 0x43, 0x2b, 0x20, 0x40, 0x4d, 0xb8, 0xe4, 0x81, 0x6b, 0x6c, 0x3d, 0x9e, 0x76, 0x02, 0x96, 0x38, 0x60, 0x33, 0x24, 0x03, 0x48, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x04, 0xff, 0xee, 0x00, 0x00, 0x03, 0x93, 0x06, 0x40, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x22, 0x00, 0x26, 0x00, 0x00, 0x37, 0x32, 0x37, 0x26, 0x27, 0x26, 0x35, 0x10, 0x37, 0x36, 0x33, 0x15, 0x22, 0x06, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x25, 0x15, 0x05, 0x04, 0x2b, 0x01, 0x35, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x36, 0x91, 0xb6, 0x44, 0x2f, 0x4f, 0xb8, 0x70, 0xe2, 0xc4, 0xa7, 0x37, 0x4b, 0x3f, 0x32, 0x42, 0x01, 0x03, 0xfe, 0x86, 0xfe, 0xc5, 0xa0, 0x4f, 0x01, 0x90, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0x5d, 0x18, 0x3b, 0x64, 0x8c, 0x01, 0x08, 0x7d, 0x4d, 0xa9, 0x89, 0xff, 0x34, 0x46, 0x21, 0x81, 0xb8, 0xc5, 0xa4, 0xb8, 0x05, 0x88, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xee, 0x00, 0x00, 0x03, 0x8c, 0x05, 0x46, 0x00, 0x24, 0x00, 0x2f, 0x00, 0x33, 0x00, 0x37, 0x00, 0x3b, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x37, 0x26, 0x27, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x36, 0x32, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x07, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x02, 0x22, 0x07, 0x06, 0x15, 0x14, 0x17, 0x36, 0x35, 0x34, 0x27, 0x03, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0xbd, 0xaf, 0xb6, 0x6a, 0x56, 0x61, 0x3b, 0x35, 0x24, 0x57, 0x3d, 0x1b, 0x0b, 0x0f, 0x5d, 0x51, 0xd6, 0x50, 0x5d, 0x0f, 0x0c, 0x1c, 0x45, 0x4f, 0x1c, 0x3d, 0x37, 0x65, 0x56, 0x6a, 0xb6, 0x97, 0x2f, 0x1b, 0x2a, 0x5d, 0x5c, 0x2a, 0x71, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb9, 0xb9, 0xb8, 0x28, 0x24, 0x27, 0x55, 0x5a, 0x27, 0x2d, 0x1f, 0x29, 0x37, 0x34, 0x2d, 0x2d, 0x34, 0x37, 0x29, 0x1f, 0x2d, 0x27, 0x62, 0x4d, 0x1f, 0x2c, 0x28, 0xb8, 0x02, 0x55, 0x07, 0x0c, 0x20, 0x1d, 0x5f, 0x5f, 0x1d, 0x20, 0x0c, 0x02, 0xf8, 0x96, 0x64, 0x96, 0x96, 0x96, 0xff, 0xff, 0x00, 0x75, 0xfe, 0xa2, 0x07, 0x86, 0x03, 0x11, 0x10, 0x26, 0x10, 0xff, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x03, 0x14, 0xfe, 0xa2, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xd4, 0x02, 0xec, 0x03, 0xd9, 0x10, 0x26, 0x11, 0x00, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x01, 0x7e, 0xfe, 0xd4, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xd4, 0x03, 0xb7, 0x03, 0x08, 0x10, 0x26, 0x11, 0x01, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x01, 0x7e, 0xfe, 0xd4, 0xff, 0xff, 0x00, 0x75, 0xfe, 0xa2, 0x07, 0x86, 0x04, 0x4c, 0x10, 0x26, 0x10, 0xff, 0x00, 0x00, 0x10, 0x27, 0x10, 0xf6, 0x05, 0x5c, 0x03, 0xb6, 0x10, 0x07, 0x10, 0xf6, 0x03, 0x14, 0xfe, 0xa2, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xd4, 0x02, 0xec, 0x05, 0x14, 0x10, 0x26, 0x11, 0x00, 0x00, 0x00, 0x10, 0x27, 0x10, 0xf6, 0x01, 0x7e, 0x04, 0x7e, 0x10, 0x07, 0x10, 0xf6, 0x01, 0x7e, 0xfe, 0xd4, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xd4, 0x03, 0xb7, 0x04, 0x7e, 0x10, 0x26, 0x11, 0x01, 0x00, 0x00, 0x10, 0x27, 0x10, 0xf6, 0x01, 0x8f, 0x03, 0xe8, 0x10, 0x07, 0x10, 0xf6, 0x01, 0x7e, 0xfe, 0xd4, 0xff, 0xff, 0x00, 0x75, 0xfd, 0xa8, 0x07, 0x86, 0x03, 0x11, 0x10, 0x26, 0x10, 0xff, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf9, 0x02, 0xa3, 0xfe, 0xa2, 0xff, 0xff, 0xff, 0xee, 0xfd, 0xda, 0x02, 0xec, 0x03, 0xd9, 0x10, 0x26, 0x11, 0x00, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf9, 0x01, 0x0e, 0xfe, 0xd4, 0xff, 0xff, 0xff, 0xee, 0xfd, 0xda, 0x03, 0xb7, 0x03, 0x08, 0x10, 0x26, 0x11, 0x01, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf9, 0x01, 0x0e, 0xfe, 0xd4, 0xff, 0xff, 0x00, 0x60, 0xfe, 0x0c, 0x06, 0x14, 0x04, 0x01, 0x10, 0x26, 0x11, 0x02, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x03, 0x9a, 0x03, 0x6b, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0xec, 0x05, 0x14, 0x10, 0x26, 0x11, 0x03, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x01, 0x7e, 0x04, 0x7e, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x03, 0xb7, 0x04, 0x7e, 0x10, 0x26, 0x11, 0x04, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x01, 0x8f, 0x03, 0xe8, 0xff, 0xff, 0x00, 0x60, 0xfe, 0x0c, 0x06, 0x14, 0x04, 0xfb, 0x10, 0x26, 0x11, 0x02, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf8, 0x03, 0x2a, 0x03, 0x6b, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0xec, 0x06, 0x0e, 0x10, 0x26, 0x11, 0x03, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf8, 0x01, 0x0e, 0x04, 0x7e, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x03, 0xb7, 0x05, 0x78, 0x10, 0x26, 0x11, 0x04, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf8, 0x01, 0x1e, 0x03, 0xe8, 0x00, 0x01, 0x00, 0x75, 0xff, 0xa7, 0x07, 0xa9, 0x06, 0x14, 0x00, 0x37, 0x00, 0x00, 0x25, 0x32, 0x24, 0x36, 0x3d, 0x01, 0x34, 0x27, 0x25, 0x24, 0x3d, 0x01, 0x34, 0x37, 0x36, 0x37, 0x01, 0x21, 0x01, 0x06, 0x07, 0x06, 0x17, 0x16, 0x17, 0x05, 0x16, 0x1d, 0x01, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x27, 0x06, 0x04, 0x23, 0x21, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x04, 0x77, 0xa6, 0x01, 0x46, 0x2c, 0x6d, 0xfc, 0xb7, 0xfe, 0xc1, 0x09, 0x11, 0x90, 0x02, 0x6c, 0x01, 0x3c, 0xfc, 0xc4, 0x55, 0x0d, 0x09, 0x04, 0x05, 0x9d, 0x03, 0x69, 0xdf, 0x2b, 0x0d, 0x14, 0x29, 0x51, 0x53, 0x33, 0x0a, 0x4b, 0xfe, 0x95, 0x91, 0xfe, 0x3e, 0xad, 0x73, 0xfe, 0xd7, 0x39, 0xa5, 0x3a, 0xb7, 0x5d, 0x88, 0x58, 0x96, 0x6c, 0x05, 0x09, 0x6b, 0x12, 0x91, 0x37, 0xbe, 0x07, 0x06, 0x3e, 0x63, 0x60, 0x01, 0x9b, 0xfd, 0xe8, 0x37, 0x23, 0x0a, 0x23, 0x35, 0x1b, 0x96, 0x26, 0xf8, 0x45, 0x5e, 0x11, 0x05, 0xb8, 0x32, 0x30, 0x39, 0x82, 0x26, 0x62, 0x01, 0x0b, 0x8a, 0x5c, 0x5e, 0x88, 0x7e, 0x42, 0x22, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x05, 0xde, 0x06, 0x14, 0x00, 0x20, 0x00, 0x00, 0x23, 0x35, 0x21, 0x32, 0x37, 0x36, 0x27, 0x26, 0x27, 0x25, 0x24, 0x3d, 0x01, 0x34, 0x37, 0x36, 0x37, 0x01, 0x21, 0x01, 0x06, 0x07, 0x06, 0x17, 0x16, 0x17, 0x05, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x12, 0x04, 0x87, 0x85, 0x29, 0x11, 0x03, 0x0b, 0x5a, 0xfc, 0xb7, 0xfe, 0xc1, 0x09, 0x10, 0x91, 0x02, 0x6c, 0x01, 0x3c, 0xfc, 0xc4, 0x55, 0x0d, 0x09, 0x04, 0x05, 0x9d, 0x03, 0x69, 0xdf, 0x38, 0x55, 0xc9, 0xb8, 0x68, 0x2c, 0x1c, 0x6e, 0x0f, 0x91, 0x37, 0xbe, 0x08, 0x05, 0x3e, 0x62, 0x61, 0x01, 0x9b, 0xfd, 0xe8, 0x37, 0x23, 0x0a, 0x23, 0x35, 0x1b, 0x96, 0x26, 0xf8, 0x71, 0x65, 0x9b, 0x00, 0x00, 0x01, 0xff, 0xee, 0x00, 0x00, 0x06, 0x53, 0x06, 0x14, 0x00, 0x29, 0x00, 0x00, 0x23, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x25, 0x24, 0x3d, 0x01, 0x34, 0x37, 0x36, 0x37, 0x01, 0x21, 0x01, 0x06, 0x07, 0x06, 0x17, 0x16, 0x17, 0x05, 0x16, 0x1d, 0x01, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x26, 0x27, 0x06, 0x23, 0x12, 0x04, 0x87, 0x7b, 0x33, 0x0e, 0x65, 0xfc, 0xb7, 0xfe, 0xc1, 0x09, 0x10, 0x91, 0x02, 0x6c, 0x01, 0x3c, 0xfc, 0xc4, 0x55, 0x0d, 0x09, 0x04, 0x05, 0x9d, 0x03, 0x69, 0xdf, 0x2b, 0x0d, 0x14, 0x29, 0x51, 0x51, 0x32, 0x0a, 0x56, 0x97, 0xb8, 0x68, 0x1d, 0x18, 0x7f, 0x11, 0x91, 0x37, 0xbe, 0x08, 0x04, 0x3f, 0x62, 0x61, 0x01, 0x9b, 0xfd, 0xe8, 0x37, 0x23, 0x0a, 0x23, 0x35, 0x1b, 0x96, 0x26, 0xf8, 0x45, 0x5f, 0x10, 0x05, 0xb8, 0x2f, 0x28, 0x57, 0x00, 0x00, 0x00, 0x03, 0x00, 0x75, 0xff, 0xa7, 0x07, 0x11, 0x06, 0x14, 0x00, 0x37, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x00, 0x25, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x01, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x13, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x05, 0x0c, 0x59, 0x98, 0xb8, 0xa5, 0xad, 0x73, 0xfe, 0xd7, 0x39, 0xa5, 0x3a, 0xb7, 0x5d, 0x88, 0xa6, 0xae, 0x8e, 0x20, 0x0e, 0x30, 0xfe, 0xe9, 0x2d, 0x09, 0x1f, 0x5a, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0x02, 0x0d, 0x13, 0x23, 0x26, 0x3a, 0x4f, 0x77, 0x3a, 0x34, 0x5d, 0x1e, 0x57, 0x17, 0x99, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x39, 0x39, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x39, 0x78, 0x4c, 0x3c, 0x49, 0x26, 0x62, 0x01, 0x0b, 0x8a, 0x5c, 0x5e, 0x88, 0x7e, 0x42, 0x22, 0x50, 0x41, 0x37, 0x1a, 0x2e, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x77, 0x2a, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfd, 0x3f, 0x1a, 0x0e, 0x10, 0xb8, 0x18, 0x2b, 0x29, 0x78, 0x40, 0x03, 0xbc, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x03, 0x6e, 0x06, 0x14, 0x00, 0x1f, 0x00, 0x2b, 0x00, 0x37, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x13, 0x16, 0x15, 0x14, 0x07, 0x06, 0x13, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x01, 0x17, 0xfe, 0xd7, 0x01, 0x17, 0x85, 0x29, 0x0e, 0x31, 0xfe, 0xea, 0x2e, 0x0a, 0x1b, 0x5e, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0xf7, 0x5c, 0x38, 0x55, 0xfe, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x38, 0x3a, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x3a, 0xb8, 0x68, 0x24, 0x24, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x76, 0x2b, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfe, 0xb6, 0x7b, 0x7b, 0x71, 0x65, 0x9b, 0x04, 0x60, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0c, 0x06, 0x14, 0x00, 0x29, 0x00, 0x35, 0x00, 0x41, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x01, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x06, 0x01, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x01, 0x17, 0xfe, 0xd7, 0x01, 0x17, 0x85, 0x29, 0x0e, 0x31, 0xfe, 0xea, 0x2e, 0x0a, 0x1b, 0x5e, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0x02, 0x0c, 0x14, 0x22, 0x27, 0x3a, 0x4f, 0x77, 0x3a, 0x35, 0x5c, 0x1e, 0x57, 0x13, 0x10, 0x55, 0x01, 0x01, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x38, 0x3a, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x3a, 0xb8, 0x68, 0x24, 0x24, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x76, 0x2b, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfd, 0x3f, 0x1a, 0x0e, 0x10, 0xb8, 0x18, 0x2b, 0x29, 0x78, 0x2e, 0x1b, 0x9b, 0x04, 0x60, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x81, 0xff, 0xc9, 0x06, 0x24, 0x06, 0x14, 0x00, 0x21, 0x00, 0x44, 0x00, 0x48, 0x00, 0x00, 0x01, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x13, 0x06, 0x27, 0x26, 0x27, 0x24, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x01, 0x33, 0x15, 0x23, 0x03, 0x6e, 0x42, 0x22, 0x48, 0x0c, 0x0b, 0x3d, 0x5c, 0x4f, 0x4a, 0x46, 0x3c, 0x32, 0x3d, 0x29, 0x36, 0x33, 0x36, 0x46, 0x43, 0x10, 0x1d, 0x01, 0x02, 0x43, 0x4d, 0x7c, 0x62, 0x83, 0xba, 0x5b, 0xfe, 0xf9, 0x0e, 0xa6, 0x0d, 0x02, 0x90, 0x6d, 0x72, 0x7e, 0x50, 0x89, 0x58, 0x45, 0xa5, 0x2c, 0x28, 0x59, 0x43, 0x75, 0x89, 0x66, 0x8e, 0xfe, 0x72, 0x87, 0x87, 0x04, 0x6f, 0x52, 0x04, 0x0e, 0x1e, 0x21, 0x1c, 0x12, 0x10, 0x0a, 0x0f, 0x58, 0x6e, 0x2a, 0x27, 0x0b, 0x58, 0x0a, 0x1a, 0x1a, 0x1e, 0x26, 0x11, 0x10, 0x1c, 0x2f, 0x2e, 0x51, 0x26, 0x2b, 0xfb, 0x70, 0x14, 0x02, 0x02, 0x1e, 0x58, 0xc3, 0x4b, 0x35, 0x3a, 0x2c, 0x5c, 0x2e, 0x23, 0x1b, 0x2f, 0x5e, 0x49, 0x01, 0x01, 0x03, 0xb1, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x7b, 0x7e, 0x05, 0xdf, 0x96, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x03, 0x6e, 0x06, 0x72, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x13, 0x16, 0x15, 0x14, 0x07, 0x06, 0x01, 0x33, 0x15, 0x23, 0x01, 0x17, 0xfe, 0xd7, 0x01, 0x17, 0x85, 0x29, 0x0e, 0x31, 0xfe, 0xea, 0x2e, 0x0a, 0x1b, 0x5e, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0xf7, 0x5c, 0x38, 0x55, 0xfe, 0xd4, 0x87, 0x87, 0xb8, 0x68, 0x24, 0x24, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x76, 0x2b, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfe, 0xb6, 0x7b, 0x7b, 0x71, 0x65, 0x9b, 0x06, 0x72, 0x96, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x04, 0x0c, 0x06, 0x72, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x01, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x06, 0x01, 0x33, 0x15, 0x23, 0x01, 0x17, 0xfe, 0xd7, 0x01, 0x17, 0x85, 0x29, 0x0e, 0x31, 0xfe, 0xea, 0x2e, 0x0a, 0x1b, 0x5e, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0x02, 0x0c, 0x14, 0x22, 0x27, 0x3a, 0x4f, 0x77, 0x3a, 0x35, 0x5c, 0x1e, 0x57, 0x13, 0x10, 0x55, 0xfe, 0xd7, 0x87, 0x87, 0xb8, 0x68, 0x24, 0x24, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x76, 0x2b, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfd, 0x3f, 0x1a, 0x0e, 0x10, 0xb8, 0x18, 0x2b, 0x29, 0x78, 0x2e, 0x1b, 0x9b, 0x06, 0x72, 0x96, 0x00, 0x00, 0x00, 0x05, 0x00, 0x81, 0xfd, 0xa8, 0x06, 0x24, 0x06, 0x14, 0x00, 0x21, 0x00, 0x44, 0x00, 0x48, 0x00, 0x4c, 0x00, 0x50, 0x00, 0x00, 0x01, 0x15, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x16, 0x17, 0x16, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x33, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x26, 0x27, 0x26, 0x37, 0x36, 0x37, 0x36, 0x13, 0x06, 0x27, 0x26, 0x27, 0x24, 0x35, 0x34, 0x37, 0x33, 0x06, 0x15, 0x16, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x19, 0x01, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0x42, 0x22, 0x48, 0x0c, 0x0b, 0x3d, 0x5c, 0x4f, 0x4a, 0x46, 0x3c, 0x32, 0x3d, 0x29, 0x36, 0x33, 0x36, 0x46, 0x43, 0x10, 0x1d, 0x01, 0x02, 0x43, 0x4d, 0x7c, 0x62, 0x83, 0xba, 0x5b, 0xfe, 0xf9, 0x0e, 0xa6, 0x0d, 0x02, 0x90, 0x6d, 0x72, 0x7e, 0x50, 0x89, 0x58, 0x45, 0xa5, 0x2c, 0x28, 0x59, 0x43, 0x75, 0x89, 0x66, 0x8e, 0xfe, 0x5b, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x04, 0x6f, 0x52, 0x04, 0x0e, 0x1e, 0x21, 0x1c, 0x12, 0x10, 0x0a, 0x0f, 0x58, 0x6e, 0x2a, 0x27, 0x0b, 0x58, 0x0a, 0x1a, 0x1a, 0x1e, 0x26, 0x11, 0x10, 0x1c, 0x2f, 0x2e, 0x51, 0x26, 0x2b, 0xfb, 0x70, 0x14, 0x02, 0x02, 0x1e, 0x58, 0xc3, 0x4b, 0x35, 0x3a, 0x2c, 0x5c, 0x2e, 0x23, 0x1b, 0x2f, 0x5e, 0x49, 0x01, 0x01, 0x03, 0xb1, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x7b, 0x7e, 0xfe, 0x41, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfd, 0xda, 0x03, 0x6e, 0x06, 0x14, 0x00, 0x1f, 0x00, 0x23, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x13, 0x16, 0x15, 0x14, 0x07, 0x06, 0x03, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x17, 0xfe, 0xd7, 0x01, 0x17, 0x85, 0x29, 0x0e, 0x31, 0xfe, 0xea, 0x2e, 0x0a, 0x1b, 0x5e, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0xf7, 0x5c, 0x38, 0x55, 0xbc, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0x68, 0x24, 0x24, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x76, 0x2b, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfe, 0xb6, 0x7b, 0x7b, 0x71, 0x65, 0x9b, 0xfe, 0x70, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x04, 0xff, 0xee, 0xfd, 0xda, 0x04, 0x0c, 0x06, 0x14, 0x00, 0x29, 0x00, 0x2d, 0x00, 0x31, 0x00, 0x35, 0x00, 0x00, 0x29, 0x01, 0x35, 0x21, 0x32, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x01, 0x15, 0x05, 0x06, 0x07, 0x06, 0x15, 0x14, 0x17, 0x01, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x26, 0x2f, 0x01, 0x06, 0x07, 0x06, 0x03, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x17, 0xfe, 0xd7, 0x01, 0x17, 0x85, 0x29, 0x0e, 0x31, 0xfe, 0xea, 0x2e, 0x0a, 0x1b, 0x5e, 0x02, 0x9f, 0xfd, 0xe8, 0x40, 0x13, 0x05, 0x1c, 0x02, 0x0c, 0x14, 0x22, 0x27, 0x3a, 0x4f, 0x77, 0x3a, 0x35, 0x5c, 0x1e, 0x57, 0x13, 0x10, 0x55, 0xb9, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0xb8, 0x68, 0x24, 0x24, 0x45, 0x42, 0x01, 0x7c, 0x3d, 0x51, 0x23, 0x21, 0x76, 0x2b, 0x01, 0x36, 0xba, 0xfa, 0x1e, 0x28, 0x0b, 0x19, 0x20, 0x25, 0xfd, 0x3f, 0x1a, 0x0e, 0x10, 0xb8, 0x18, 0x2b, 0x29, 0x78, 0x2e, 0x1b, 0x9b, 0xfe, 0x70, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x03, 0x03, 0x69, 0x03, 0x84, 0x06, 0x72, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x09, 0x01, 0x35, 0x01, 0x03, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x06, 0x72, 0xfc, 0xf7, 0x03, 0x09, 0x97, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x39, 0x39, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x39, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0xfd, 0x35, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x00, 0x03, 0x00, 0x64, 0x03, 0x84, 0x03, 0x6e, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x09, 0x01, 0x35, 0x01, 0x03, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x03, 0x6e, 0xfc, 0xf7, 0x03, 0x09, 0x90, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x38, 0x3a, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x3a, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0xfd, 0x35, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x00, 0x03, 0x00, 0x64, 0x03, 0x84, 0x03, 0x6e, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x0f, 0x00, 0x1b, 0x00, 0x00, 0x09, 0x01, 0x35, 0x01, 0x03, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x03, 0x6e, 0xfc, 0xf7, 0x03, 0x09, 0x90, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x38, 0x3a, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x3a, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0xfd, 0x35, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0x00, 0x00, 0x03, 0x02, 0x1c, 0xfe, 0xa2, 0x06, 0x72, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x35, 0x09, 0x01, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x06, 0x72, 0xfc, 0xf7, 0x03, 0x09, 0xfc, 0x8b, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0xf8, 0x0d, 0x96, 0x96, 0x96, 0x00, 0x00, 0x03, 0x00, 0x64, 0xfe, 0xd4, 0x03, 0x6e, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x35, 0x09, 0x01, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0xfc, 0xf7, 0x03, 0x09, 0xfe, 0x27, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0xf8, 0x3f, 0x96, 0x96, 0x96, 0x00, 0x00, 0x03, 0x00, 0x64, 0xfe, 0xd4, 0x03, 0x6e, 0x07, 0x2b, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x00, 0x09, 0x01, 0x35, 0x09, 0x01, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0xfc, 0xf7, 0x03, 0x09, 0xfe, 0x27, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0xf8, 0x3f, 0x96, 0x96, 0x96, 0x00, 0x00, 0x04, 0x03, 0x2a, 0x05, 0x33, 0x06, 0x72, 0x08, 0x34, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x09, 0x01, 0x35, 0x09, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x06, 0x72, 0xfc, 0xf7, 0x03, 0x09, 0xfd, 0x28, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0x01, 0x09, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x04, 0x00, 0x43, 0x05, 0x33, 0x03, 0x6e, 0x08, 0x34, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x09, 0x01, 0x35, 0x09, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0xfc, 0xf7, 0x03, 0x09, 0xfd, 0x46, 0x87, 0x87, 0x70, 0x88, 0x88, 0xe0, 0x86, 0x86, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0x01, 0x09, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x04, 0x00, 0x43, 0x05, 0x33, 0x03, 0x6e, 0x08, 0x34, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x00, 0x09, 0x01, 0x35, 0x09, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0x6e, 0xfc, 0xf7, 0x03, 0x09, 0xfd, 0x46, 0x87, 0x87, 0x70, 0x88, 0x88, 0xe0, 0x86, 0x86, 0x06, 0x95, 0xfe, 0x9e, 0x96, 0x01, 0x62, 0x01, 0x09, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x02, 0x00, 0x81, 0xfe, 0xc8, 0x05, 0x86, 0x07, 0x9e, 0x00, 0x24, 0x00, 0x28, 0x00, 0x00, 0x25, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x26, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x33, 0x15, 0x23, 0x03, 0xaa, 0x46, 0xa6, 0x2c, 0x27, 0x59, 0x44, 0x75, 0x65, 0x46, 0x10, 0x19, 0x6d, 0xea, 0x79, 0x4d, 0x59, 0x3e, 0xfe, 0xf9, 0x01, 0x39, 0xa6, 0x3b, 0x96, 0x24, 0x41, 0x48, 0x63, 0x9c, 0x92, 0x87, 0x87, 0x49, 0x7e, 0xe3, 0x04, 0x6a, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x33, 0x2e, 0x28, 0xb1, 0x42, 0x22, 0x16, 0x5b, 0x01, 0x12, 0x8a, 0x5c, 0x73, 0x73, 0x7e, 0x42, 0x10, 0x22, 0x35, 0x07, 0xcc, 0x96, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x01, 0x84, 0x07, 0x9e, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x03, 0x33, 0x15, 0x23, 0x01, 0x84, 0x4e, 0x48, 0x8b, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0x9d, 0x87, 0x87, 0x01, 0x73, 0xb2, 0x65, 0x5c, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0x01, 0x8a, 0x96, 0x00, 0x00, 0x00, 0x02, 0xff, 0xee, 0x00, 0x00, 0x02, 0x75, 0x07, 0x9e, 0x00, 0x14, 0x00, 0x18, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x03, 0x33, 0x15, 0x23, 0x01, 0x31, 0x45, 0x89, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0x2c, 0x28, 0x59, 0x43, 0x75, 0x87, 0x91, 0x87, 0x87, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x07, 0x9e, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x81, 0xfe, 0xc8, 0x05, 0x86, 0x08, 0x34, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x25, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x26, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x13, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0xaa, 0x46, 0xa6, 0x2c, 0x27, 0x59, 0x44, 0x75, 0x65, 0x46, 0x10, 0x19, 0x6d, 0xea, 0x79, 0x4d, 0x59, 0x3e, 0xfe, 0xf9, 0x01, 0x39, 0xa6, 0x3b, 0x96, 0x24, 0x41, 0x48, 0x63, 0x9c, 0x8d, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x49, 0x7e, 0xe3, 0x04, 0x6a, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x33, 0x2e, 0x28, 0xb1, 0x42, 0x22, 0x16, 0x5b, 0x01, 0x12, 0x8a, 0x5c, 0x73, 0x73, 0x7e, 0x42, 0x10, 0x22, 0x35, 0x08, 0x62, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0x00, 0x00, 0x01, 0xdb, 0x08, 0x34, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x15, 0x00, 0x19, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x03, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x84, 0x4e, 0x48, 0x8b, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0xa1, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x01, 0x73, 0xb2, 0x65, 0x5c, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0x02, 0x20, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x04, 0xff, 0xee, 0x00, 0x00, 0x02, 0x75, 0x08, 0x34, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x03, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x31, 0x45, 0x89, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0x2c, 0x28, 0x59, 0x43, 0x75, 0x87, 0x95, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x08, 0x34, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0x04, 0x00, 0x81, 0xfc, 0xe0, 0x05, 0x86, 0x06, 0x14, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x00, 0x25, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x26, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x01, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x03, 0xaa, 0x46, 0xa6, 0x2c, 0x27, 0x59, 0x44, 0x75, 0x65, 0x46, 0x10, 0x19, 0x6d, 0xea, 0x79, 0x4d, 0x59, 0x3e, 0xfe, 0xf9, 0x01, 0x39, 0xa6, 0x3b, 0x96, 0x24, 0x41, 0x48, 0x63, 0x9c, 0xfe, 0xf9, 0x86, 0x86, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x49, 0x7e, 0xe3, 0x04, 0x6a, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0x33, 0x2e, 0x28, 0xb1, 0x42, 0x22, 0x16, 0x5b, 0x01, 0x12, 0x8a, 0x5c, 0x73, 0x73, 0x7e, 0x42, 0x10, 0x22, 0x35, 0xfd, 0xa4, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x04, 0xff, 0xee, 0xfe, 0x0c, 0x01, 0xc2, 0x06, 0x14, 0x00, 0x0d, 0x00, 0x11, 0x00, 0x15, 0x00, 0x19, 0x00, 0x00, 0x01, 0x14, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x03, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x84, 0x4e, 0x48, 0x8b, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0xba, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x01, 0x73, 0xb2, 0x65, 0x5c, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0xf8, 0x8e, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x00, 0x00, 0x00, 0x04, 0xff, 0xee, 0xfe, 0x0c, 0x02, 0x75, 0x06, 0x14, 0x00, 0x14, 0x00, 0x18, 0x00, 0x1c, 0x00, 0x20, 0x00, 0x00, 0x25, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x37, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x03, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x01, 0x31, 0x45, 0x89, 0x75, 0x44, 0x59, 0x27, 0x2c, 0xa6, 0x2c, 0x28, 0x59, 0x43, 0x75, 0x87, 0x93, 0x87, 0x87, 0x70, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x56, 0x56, 0xb8, 0x2c, 0x31, 0x6a, 0x04, 0x95, 0xfb, 0x6b, 0x6a, 0x31, 0x2c, 0xb8, 0xfe, 0xa2, 0x96, 0x01, 0x90, 0x96, 0x96, 0x96, 0x00, 0x03, 0x00, 0x84, 0xfc, 0xc7, 0x05, 0x8e, 0x02, 0xbc, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x2e, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x25, 0x33, 0x15, 0x23, 0x13, 0x33, 0x15, 0x23, 0x04, 0x63, 0x28, 0x18, 0x14, 0x2d, 0x30, 0x36, 0x43, 0x75, 0x40, 0x1e, 0x03, 0x50, 0x6c, 0xd7, 0x58, 0x52, 0x69, 0x65, 0xfe, 0xd8, 0x2b, 0xa5, 0x2c, 0xb5, 0x51, 0x44, 0x50, 0x47, 0xae, 0x44, 0x1d, 0x5a, 0xfe, 0x48, 0x86, 0x86, 0x70, 0x87, 0x87, 0x02, 0x45, 0x61, 0x60, 0x50, 0x3c, 0x40, 0xb8, 0x30, 0x6d, 0x93, 0xc7, 0x42, 0x1b, 0x25, 0x6b, 0x01, 0x63, 0xaf, 0x8d, 0x89, 0xb3, 0xec, 0x35, 0x18, 0x14, 0x30, 0xe3, 0x65, 0x70, 0xb8, 0xcb, 0x77, 0x96, 0xfb, 0x37, 0x96, 0x00, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xd4, 0x01, 0x60, 0x03, 0xe8, 0x10, 0x27, 0x10, 0xf6, 0x00, 0xca, 0x03, 0x52, 0x10, 0x26, 0x10, 0xfd, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x00, 0xca, 0xfe, 0xd4, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xd4, 0x02, 0x3f, 0x03, 0xe8, 0x10, 0x27, 0x10, 0xf6, 0x00, 0xca, 0x03, 0x52, 0x10, 0x26, 0x10, 0xfe, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf6, 0x00, 0xca, 0xfe, 0xd4, 0x00, 0x04, 0x00, 0x84, 0xfc, 0xae, 0x05, 0x8e, 0x02, 0xbc, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x36, 0x00, 0x42, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x25, 0x33, 0x15, 0x23, 0x01, 0x34, 0x27, 0x26, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x32, 0x3e, 0x01, 0x14, 0x07, 0x06, 0x22, 0x27, 0x26, 0x34, 0x37, 0x36, 0x32, 0x17, 0x04, 0x63, 0x28, 0x18, 0x14, 0x2d, 0x30, 0x36, 0x43, 0x75, 0x40, 0x1e, 0x03, 0x50, 0x6c, 0xd7, 0x58, 0x52, 0x69, 0x65, 0xfe, 0xd8, 0x2b, 0xa5, 0x2c, 0xb5, 0x51, 0x44, 0x50, 0x47, 0xae, 0x44, 0x1d, 0x5a, 0xfe, 0x48, 0x86, 0x86, 0x01, 0x05, 0x19, 0x19, 0x4a, 0x32, 0x19, 0x19, 0x4a, 0x32, 0x6e, 0x39, 0x39, 0xa6, 0x38, 0x3a, 0x3a, 0x38, 0xa6, 0x39, 0x02, 0x45, 0x61, 0x60, 0x50, 0x3c, 0x40, 0xb8, 0x30, 0x6d, 0x93, 0xc7, 0x42, 0x1b, 0x25, 0x6b, 0x01, 0x63, 0xaf, 0x8d, 0x89, 0xb3, 0xec, 0x35, 0x18, 0x14, 0x30, 0xe3, 0x65, 0x70, 0xb8, 0xcb, 0x77, 0x96, 0xfb, 0x64, 0x28, 0x1c, 0x1d, 0x38, 0x29, 0x2a, 0x1c, 0x1b, 0x38, 0x85, 0xb8, 0x40, 0x40, 0x40, 0x40, 0xb8, 0x40, 0x3f, 0x3f, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xf4, 0x01, 0xd3, 0x03, 0xe8, 0x10, 0x27, 0x10, 0xf6, 0x00, 0xca, 0x03, 0x52, 0x10, 0x26, 0x10, 0xfd, 0x00, 0x00, 0x10, 0x07, 0x11, 0x07, 0x00, 0x48, 0xfe, 0xf4, 0xff, 0xff, 0xff, 0xee, 0xfe, 0xf4, 0x02, 0x3f, 0x03, 0xe8, 0x10, 0x27, 0x10, 0xf6, 0x00, 0xca, 0x03, 0x52, 0x10, 0x26, 0x10, 0xfe, 0x00, 0x00, 0x10, 0x07, 0x11, 0x07, 0x00, 0x48, 0xfe, 0xf4, 0x00, 0x04, 0x00, 0x84, 0xfe, 0x0c, 0x05, 0x8e, 0x03, 0xb6, 0x00, 0x26, 0x00, 0x2a, 0x00, 0x2e, 0x00, 0x32, 0x00, 0x00, 0x01, 0x16, 0x17, 0x16, 0x17, 0x16, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x27, 0x06, 0x07, 0x06, 0x07, 0x06, 0x23, 0x22, 0x27, 0x24, 0x11, 0x34, 0x37, 0x33, 0x06, 0x15, 0x14, 0x17, 0x16, 0x33, 0x32, 0x37, 0x36, 0x37, 0x36, 0x35, 0x34, 0x27, 0x01, 0x33, 0x15, 0x23, 0x17, 0x33, 0x15, 0x23, 0x27, 0x33, 0x15, 0x23, 0x04, 0x63, 0x28, 0x18, 0x14, 0x2d, 0x30, 0x36, 0x43, 0x75, 0x40, 0x1e, 0x03, 0x50, 0x6c, 0xd7, 0x58, 0x52, 0x69, 0x65, 0xfe, 0xd8, 0x2b, 0xa5, 0x2c, 0xb5, 0x51, 0x44, 0x50, 0x47, 0xae, 0x44, 0x1d, 0x5a, 0xfe, 0x74, 0x88, 0x88, 0x71, 0x87, 0x87, 0xe1, 0x87, 0x87, 0x02, 0x45, 0x61, 0x60, 0x50, 0x3c, 0x40, 0xb8, 0x30, 0x6d, 0x93, 0xc7, 0x42, 0x1b, 0x25, 0x6b, 0x01, 0x63, 0xaf, 0x8d, 0x89, 0xb3, 0xec, 0x35, 0x18, 0x14, 0x30, 0xe3, 0x65, 0x70, 0xb8, 0xcb, 0x01, 0x71, 0x96, 0x64, 0x96, 0x96, 0x96, 0x00, 0x00, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x01, 0xc2, 0x04, 0xe2, 0x10, 0x26, 0x10, 0xfd, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf8, 0x00, 0x59, 0x03, 0x52, 0xff, 0xff, 0xff, 0xee, 0x00, 0x00, 0x02, 0x3f, 0x04, 0xe2, 0x10, 0x26, 0x10, 0xfe, 0x00, 0x00, 0x10, 0x07, 0x10, 0xf8, 0x00, 0x59, 0x03, 0x52, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x57, 0x0a, 0xdd, 0x83, 0xf3, 0x6b, 0x5f, 0x0f, 0x3c, 0xf5, 0x00, 0x1f, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xce, 0x3f, 0xd8, 0x65, 0x00, 0x00, 0x00, 0x00, 0xce, 0x3f, 0xd8, 0x65, 0xf8, 0xa7, 0xfc, 0xae, 0x0c, 0x1a, 0x09, 0x55, 0x00, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x6d, 0xfe, 0x1d, 0x00, 0x00, 0x0c, 0x7e, 0xf8, 0xa7, 0xfc, 0xc9, 0x0c, 0x1a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x0e, 0x04, 0x52, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x02, 0xaa, 0x00, 0x00, 0x02, 0x49, 0x00, 0x00, 0x02, 0xe2, 0x01, 0x16, 0x03, 0x4f, 0x00, 0xb1, 0x06, 0x08, 0x00, 0x8e, 0x04, 0x94, 0x00, 0x99, 0x06, 0xd7, 0x00, 0x65, 0x05, 0x9d, 0x00, 0x74, 0x01, 0xfa, 0x00, 0xb1, 0x02, 0xcf, 0x00, 0x9e, 0x02, 0xcf, 0x00, 0x93, 0x03, 0x99, 0x00, 0x36, 0x06, 0x08, 0x00, 0xc3, 0x02, 0x49, 0x00, 0x8e, 0x02, 0x99, 0x00, 0x5a, 0x02, 0x49, 0x00, 0xc5, 0x02, 0x6d, 0x00, 0x00, 0x04, 0x94, 0x00, 0x79, 0x04, 0x94, 0x00, 0xca, 0x04, 0x94, 0x00, 0x87, 0x04, 0x94, 0x00, 0x8c, 0x04, 0x94, 0x00, 0x5a, 0x04, 0x94, 0x00, 0x8e, 0x04, 0x94, 0x00, 0x80, 0x04, 0x94, 0x00, 0x97, 0x04, 0x94, 0x00, 0x7d, 0x04, 0x94, 0x00, 0x74, 0x02, 0x6d, 0x00, 0xd8, 0x02, 0x6d, 0x00, 0x8e, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x03, 0xd2, 0x00, 0x84, 0x07, 0x33, 0x00, 0x79, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xf0, 0x00, 0xb4, 0x05, 0x07, 0x00, 0x67, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x24, 0x00, 0xb4, 0x05, 0x94, 0x00, 0x67, 0x05, 0x6a, 0x00, 0xb4, 0x02, 0x1f, 0x00, 0xb4, 0x02, 0x1f, 0xff, 0xa1, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x02, 0x00, 0xb4, 0x06, 0x36, 0x00, 0xb4, 0x05, 0x62, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x57, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x05, 0x00, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x79, 0x04, 0x65, 0xff, 0xfb, 0x05, 0x45, 0x00, 0xa0, 0x04, 0xec, 0x00, 0x0e, 0x07, 0x1e, 0x00, 0x3d, 0x04, 0xee, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0xee, 0x00, 0x52, 0x02, 0xcf, 0x00, 0x9e, 0x02, 0x6d, 0x00, 0x00, 0x02, 0xcf, 0x00, 0xb3, 0x06, 0x08, 0x00, 0xc3, 0x03, 0x99, 0xff, 0xee, 0x03, 0x99, 0x00, 0x99, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x92, 0x00, 0xa7, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x92, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x02, 0x88, 0x00, 0x2a, 0x04, 0x92, 0x00, 0x65, 0x04, 0x90, 0x00, 0xa7, 0x02, 0x00, 0x00, 0xad, 0x02, 0x00, 0xff, 0xdf, 0x04, 0x2b, 0x00, 0xa7, 0x02, 0x00, 0x00, 0xad, 0x07, 0x03, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x92, 0x00, 0x65, 0x02, 0xf5, 0x00, 0xa7, 0x03, 0xc0, 0x00, 0x63, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x42, 0x00, 0x36, 0x05, 0xe3, 0x00, 0x4d, 0x04, 0x42, 0x00, 0x35, 0x04, 0x42, 0x00, 0x36, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0x94, 0x00, 0xe6, 0x02, 0x6d, 0x00, 0xea, 0x04, 0x94, 0x00, 0xe6, 0x06, 0x08, 0x00, 0xc3, 0x02, 0x49, 0x00, 0x00, 0x02, 0xe2, 0x01, 0x16, 0x04, 0x94, 0x00, 0x9a, 0x04, 0x94, 0x00, 0x74, 0x04, 0x94, 0x00, 0x54, 0x04, 0x94, 0x00, 0x49, 0x02, 0x6d, 0x00, 0xea, 0x03, 0x99, 0x00, 0x52, 0x03, 0x99, 0x00, 0xc1, 0x07, 0x33, 0x00, 0xfe, 0x03, 0x64, 0x00, 0x67, 0x04, 0x67, 0x00, 0x8e, 0x06, 0x08, 0x00, 0xc3, 0x02, 0x99, 0x00, 0x5a, 0x07, 0x33, 0x00, 0xfe, 0x03, 0x99, 0x00, 0xbf, 0x03, 0x99, 0x00, 0xaf, 0x06, 0x08, 0x00, 0xc3, 0x02, 0xe2, 0x00, 0x54, 0x02, 0xe2, 0x00, 0x58, 0x03, 0x99, 0x01, 0x4d, 0x04, 0x94, 0x00, 0x9c, 0x04, 0x94, 0x00, 0x8e, 0x02, 0x49, 0x00, 0xc5, 0x03, 0x99, 0x01, 0x05, 0x02, 0xe2, 0x00, 0x7b, 0x03, 0x64, 0x00, 0x56, 0x04, 0x67, 0x00, 0xad, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x58, 0x03, 0xd2, 0x00, 0x80, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x07, 0x03, 0x00, 0x07, 0x05, 0x07, 0x00, 0x67, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x02, 0x1f, 0x00, 0x35, 0x02, 0x1f, 0x00, 0x91, 0x02, 0x1f, 0xff, 0xff, 0x02, 0x1f, 0x00, 0x05, 0x05, 0x94, 0x00, 0x09, 0x05, 0x62, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x05, 0xaa, 0x00, 0x67, 0x05, 0xaa, 0x00, 0x67, 0x05, 0xaa, 0x00, 0x67, 0x05, 0xaa, 0x00, 0x67, 0x06, 0x08, 0x00, 0xfc, 0x05, 0xaa, 0x00, 0x5b, 0x05, 0x45, 0x00, 0xa0, 0x05, 0x45, 0x00, 0xa0, 0x05, 0x45, 0x00, 0xa0, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x5b, 0x00, 0xb4, 0x04, 0x89, 0x00, 0xa7, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x69, 0x00, 0x6e, 0x07, 0x11, 0x00, 0x6e, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x02, 0x00, 0xff, 0xcd, 0x02, 0x00, 0x00, 0x81, 0x02, 0x00, 0xff, 0xe2, 0x02, 0x00, 0xff, 0xf6, 0x04, 0x67, 0x00, 0x65, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x06, 0x08, 0x00, 0xc3, 0x04, 0x67, 0x00, 0x40, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x42, 0x00, 0x36, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x42, 0x00, 0x36, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x05, 0x94, 0x00, 0x09, 0x04, 0x92, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0xff, 0xe8, 0x06, 0x98, 0x00, 0xb4, 0x05, 0x00, 0x00, 0x6c, 0x02, 0x1f, 0xff, 0xe7, 0x02, 0x00, 0xff, 0xd8, 0x02, 0x1f, 0x00, 0x02, 0x02, 0x00, 0xff, 0xf4, 0x02, 0x1f, 0xff, 0xf7, 0x02, 0x00, 0xff, 0xe7, 0x02, 0x1f, 0x00, 0x9e, 0x02, 0x00, 0x00, 0x87, 0x02, 0x1f, 0x00, 0xb4, 0x02, 0x00, 0x00, 0xad, 0x04, 0x3f, 0x00, 0xb4, 0x04, 0x00, 0x00, 0xad, 0x02, 0x1f, 0xff, 0xa1, 0x02, 0x00, 0xff, 0xdf, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0x02, 0x00, 0xb4, 0x02, 0x00, 0x00, 0xad, 0x04, 0x02, 0x00, 0xb4, 0x02, 0x00, 0x00, 0x7a, 0x04, 0x02, 0x00, 0xb4, 0x02, 0xb3, 0x00, 0xad, 0x04, 0x02, 0x00, 0xb4, 0x02, 0x76, 0x00, 0xad, 0x04, 0x0b, 0xff, 0xf4, 0x02, 0x0b, 0x00, 0x01, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0xdb, 0x00, 0xb8, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x07, 0xb3, 0x00, 0x67, 0x07, 0x5d, 0x00, 0x65, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0x75, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0xa7, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x02, 0x88, 0x00, 0x2a, 0x04, 0x92, 0x00, 0x1c, 0x05, 0x4a, 0xff, 0xa2, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x04, 0xf0, 0x00, 0x00, 0x04, 0x92, 0x00, 0x00, 0x05, 0x10, 0x00, 0x67, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x94, 0x00, 0x09, 0x05, 0xe5, 0xff, 0xa2, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x8c, 0x00, 0x75, 0x05, 0xaa, 0x00, 0x69, 0x04, 0x6c, 0x00, 0x93, 0x04, 0x24, 0xff, 0xa1, 0x02, 0x88, 0xff, 0x8c, 0x05, 0x94, 0x00, 0x67, 0x04, 0xf1, 0x00, 0x07, 0x07, 0x15, 0x00, 0xa7, 0x02, 0x8b, 0x00, 0xb4, 0x02, 0x1f, 0x00, 0x09, 0x05, 0x5e, 0x00, 0xb4, 0x04, 0x2b, 0x00, 0xa6, 0x02, 0x00, 0x00, 0x09, 0x04, 0x42, 0x00, 0x36, 0x07, 0x03, 0x00, 0xa0, 0x05, 0x62, 0xff, 0xa1, 0x04, 0x90, 0x00, 0xa7, 0x05, 0xaa, 0x00, 0x67, 0x06, 0x93, 0x00, 0x5c, 0x04, 0x67, 0x00, 0x6a, 0x06, 0xd4, 0x00, 0x67, 0x05, 0x77, 0x00, 0x65, 0x04, 0xb1, 0xff, 0xa2, 0x04, 0x92, 0x00, 0xa6, 0x05, 0x00, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x66, 0x03, 0xc0, 0x00, 0x5a, 0x04, 0x8c, 0x00, 0xb4, 0x02, 0x6b, 0xff, 0x0d, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0x00, 0x15, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0xff, 0xfb, 0x06, 0x2d, 0x00, 0x9b, 0x04, 0x90, 0x00, 0x9e, 0x05, 0x80, 0x00, 0x46, 0x05, 0x30, 0x00, 0xb4, 0x05, 0x5a, 0xff, 0xfd, 0x05, 0x42, 0x00, 0x36, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0xcb, 0x00, 0x90, 0x04, 0xcb, 0x00, 0x52, 0x04, 0x28, 0x00, 0x5d, 0x03, 0xc7, 0x00, 0x65, 0x04, 0x94, 0x00, 0x87, 0x04, 0xcb, 0x00, 0x53, 0x04, 0x28, 0x00, 0x5d, 0x03, 0xac, 0x00, 0x4f, 0x04, 0x92, 0x00, 0xa7, 0x02, 0x1f, 0x00, 0xb4, 0x03, 0x8b, 0x00, 0xb4, 0x03, 0x4e, 0x00, 0x12, 0x02, 0x20, 0x00, 0xb4, 0x0a, 0x3c, 0x00, 0xb4, 0x09, 0x5a, 0x00, 0xb4, 0x08, 0x4f, 0x00, 0x65, 0x06, 0x03, 0x00, 0xb4, 0x05, 0xa9, 0x00, 0xb4, 0x03, 0x49, 0x00, 0xad, 0x06, 0xb4, 0x00, 0xb4, 0x06, 0xa6, 0x00, 0xb4, 0x05, 0xbd, 0x00, 0xa7, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x02, 0x1f, 0xff, 0xff, 0x02, 0x00, 0xff, 0xe4, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x6e, 0x00, 0x65, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x07, 0x03, 0x00, 0x07, 0x07, 0x11, 0x00, 0x6e, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x2b, 0xff, 0xec, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x04, 0xcb, 0x00, 0x90, 0x04, 0x28, 0x00, 0x4f, 0x02, 0x00, 0xff, 0xdf, 0x0a, 0x3c, 0x00, 0xb4, 0x09, 0x5a, 0x00, 0xb4, 0x08, 0x4f, 0x00, 0x65, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x08, 0x03, 0x00, 0xb4, 0x04, 0xe9, 0x00, 0xb4, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x07, 0x03, 0x00, 0x07, 0x07, 0x11, 0x00, 0x6e, 0x05, 0xaa, 0x00, 0x5b, 0x04, 0x67, 0x00, 0x40, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x02, 0x1f, 0xff, 0xb0, 0x02, 0x00, 0xff, 0xca, 0x02, 0x1f, 0x00, 0x04, 0x02, 0x00, 0xff, 0xe6, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0x00, 0x00, 0xb3, 0x02, 0xf5, 0x00, 0x75, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0xa7, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x83, 0x00, 0x8c, 0x03, 0xc1, 0x00, 0x3f, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0xff, 0xf2, 0x05, 0x4b, 0x00, 0xb4, 0x06, 0x08, 0x00, 0x65, 0x05, 0x07, 0x00, 0x65, 0x04, 0x65, 0x00, 0x65, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x03, 0x6a, 0x00, 0x7c, 0x06, 0x11, 0x00, 0xa7, 0x03, 0x6f, 0x00, 0x31, 0x02, 0x00, 0xff, 0xdf, 0x07, 0x2f, 0x00, 0x65, 0x07, 0x2f, 0x00, 0x65, 0x04, 0xec, 0xff, 0xfe, 0x05, 0x07, 0x00, 0x0a, 0x03, 0xf5, 0x00, 0x08, 0x04, 0x02, 0x00, 0x09, 0x04, 0x65, 0xff, 0xba, 0x03, 0xc0, 0x00, 0x63, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0x57, 0x00, 0x48, 0x03, 0x72, 0x00, 0x48, 0x04, 0xf0, 0x00, 0x09, 0x05, 0x45, 0x00, 0x0a, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x02, 0x1f, 0xff, 0xa1, 0x02, 0x00, 0xff, 0xdf, 0x05, 0xa0, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x00, 0x00, 0x09, 0x02, 0xf5, 0x00, 0x0c, 0x04, 0x65, 0xff, 0xf7, 0x04, 0x42, 0x00, 0x09, 0x04, 0x52, 0x00, 0x9c, 0x04, 0x92, 0x00, 0x65, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x92, 0x00, 0xa7, 0x03, 0xf4, 0x00, 0x72, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x92, 0x00, 0x65, 0x05, 0x03, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x05, 0xe6, 0x00, 0x6f, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xd4, 0x00, 0x77, 0x05, 0x95, 0x00, 0x77, 0x04, 0xc8, 0x00, 0x65, 0x02, 0x00, 0xff, 0xdf, 0x05, 0x02, 0x00, 0x65, 0x04, 0x92, 0x00, 0x65, 0x04, 0x88, 0x00, 0x65, 0x04, 0x4a, 0x00, 0x56, 0x04, 0x4a, 0x00, 0x56, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x02, 0x00, 0x00, 0x0c, 0x02, 0x6f, 0x00, 0x95, 0x02, 0xac, 0x00, 0x68, 0x02, 0xd9, 0x00, 0x43, 0x03, 0x82, 0x00, 0x45, 0x02, 0x01, 0x00, 0xad, 0x05, 0x15, 0x00, 0xad, 0x07, 0x03, 0x00, 0xa7, 0x07, 0x03, 0x00, 0xa7, 0x07, 0x03, 0x00, 0xa7, 0x04, 0xa6, 0xff, 0xdf, 0x04, 0x9f, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa1, 0x04, 0x67, 0x00, 0x65, 0x06, 0x2d, 0x00, 0x65, 0x05, 0x3d, 0x00, 0x85, 0x04, 0xbf, 0x00, 0x64, 0x02, 0xfb, 0x00, 0x00, 0x02, 0xfb, 0x00, 0x00, 0x02, 0xfa, 0x00, 0x00, 0x02, 0xf5, 0x00, 0xa7, 0x02, 0xf4, 0x00, 0xa7, 0x03, 0xd1, 0x00, 0x76, 0x03, 0xd1, 0x00, 0x68, 0x04, 0x58, 0x00, 0xa7, 0x04, 0x58, 0x00, 0xa7, 0x03, 0xc0, 0x00, 0x63, 0x02, 0x6b, 0xff, 0xdd, 0x02, 0x6b, 0xff, 0xdd, 0x03, 0x52, 0x00, 0x31, 0x02, 0x6b, 0xff, 0x0d, 0x02, 0xd2, 0x00, 0x31, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x90, 0x00, 0x00, 0x04, 0x72, 0x00, 0x65, 0x04, 0x4e, 0x00, 0xad, 0x04, 0x42, 0x00, 0x36, 0x05, 0xe3, 0x00, 0x4d, 0x04, 0x42, 0x00, 0x36, 0x04, 0x65, 0x00, 0x5b, 0x03, 0xc7, 0x00, 0x4f, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0x28, 0x00, 0x4f, 0x04, 0x28, 0x00, 0x62, 0x03, 0xac, 0x00, 0x4f, 0x03, 0xac, 0x00, 0x4f, 0x03, 0xac, 0x00, 0x4f, 0x03, 0xac, 0x00, 0x4f, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x2c, 0x00, 0xa7, 0x04, 0xc8, 0x00, 0x65, 0x05, 0x19, 0x00, 0x65, 0x04, 0xb5, 0x00, 0xa7, 0x02, 0x1a, 0xff, 0x0d, 0x04, 0xcd, 0x00, 0xa7, 0x03, 0xa6, 0x00, 0xa7, 0x05, 0x3c, 0x00, 0x65, 0x03, 0xac, 0x00, 0x4f, 0x03, 0xac, 0x00, 0x4f, 0x07, 0x4d, 0x00, 0x65, 0x07, 0x9d, 0x00, 0x65, 0x07, 0x4a, 0x00, 0x65, 0x05, 0xfa, 0x00, 0x31, 0x04, 0x64, 0x00, 0x31, 0x05, 0x9a, 0x00, 0x31, 0x06, 0x1b, 0x00, 0x2a, 0x05, 0x14, 0x00, 0xad, 0x04, 0xb6, 0x00, 0xad, 0x03, 0xb5, 0x00, 0x30, 0x03, 0xb5, 0x00, 0x30, 0x04, 0xc2, 0x00, 0x00, 0x04, 0xc7, 0x00, 0x00, 0x02, 0xe9, 0x00, 0x69, 0x02, 0xdf, 0x00, 0x69, 0x01, 0x42, 0xff, 0xec, 0x01, 0xdd, 0x00, 0x69, 0x02, 0x20, 0x00, 0x40, 0x02, 0x21, 0x00, 0x40, 0x02, 0xba, 0x00, 0x1c, 0x03, 0xb5, 0x00, 0x30, 0x02, 0xae, 0x00, 0x22, 0x02, 0x01, 0x00, 0x90, 0x03, 0x4f, 0x00, 0x90, 0x02, 0x49, 0x00, 0x9c, 0x02, 0x49, 0x00, 0xa0, 0x02, 0x49, 0x00, 0xb0, 0x02, 0x36, 0x00, 0x69, 0x02, 0x36, 0x00, 0x69, 0x02, 0xa9, 0x00, 0x69, 0x02, 0xa9, 0x00, 0x69, 0x03, 0x99, 0x00, 0xf0, 0x03, 0x99, 0x00, 0xf0, 0x03, 0x99, 0x00, 0xad, 0x03, 0x99, 0x00, 0xad, 0x03, 0x99, 0x00, 0xad, 0x03, 0x99, 0x00, 0xad, 0x01, 0xfa, 0x00, 0xc0, 0x03, 0x99, 0x00, 0xbf, 0x03, 0x99, 0x01, 0x4d, 0x03, 0x99, 0x00, 0x99, 0x01, 0xfa, 0x00, 0xc0, 0x03, 0x99, 0x00, 0xbf, 0x03, 0x99, 0x00, 0x99, 0x03, 0x99, 0x01, 0x4d, 0x02, 0x6d, 0x00, 0x63, 0x02, 0x6d, 0x00, 0x63, 0x02, 0x36, 0x00, 0x69, 0x02, 0x36, 0x00, 0x69, 0x03, 0x99, 0x01, 0x02, 0x03, 0x99, 0x01, 0x02, 0x02, 0xce, 0x00, 0x5a, 0x02, 0x49, 0x00, 0x5a, 0x03, 0x99, 0x00, 0xb3, 0x03, 0x99, 0x01, 0x71, 0x03, 0x99, 0x00, 0xd6, 0x03, 0x99, 0x01, 0x2a, 0x03, 0x99, 0x00, 0xa3, 0x03, 0x99, 0x00, 0xd8, 0x02, 0x45, 0x00, 0x00, 0x03, 0x99, 0x00, 0xd7, 0x03, 0x10, 0x00, 0x69, 0x01, 0x32, 0x00, 0x6d, 0x02, 0xaf, 0x00, 0x69, 0x03, 0x32, 0x00, 0x69, 0x02, 0xa9, 0x00, 0x69, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x99, 0x00, 0xad, 0x03, 0x99, 0x00, 0xbf, 0x03, 0xba, 0x00, 0x9c, 0x03, 0x99, 0x00, 0xd6, 0x03, 0x99, 0x00, 0xa3, 0x00, 0x00, 0xfc, 0xfe, 0x00, 0x00, 0xfd, 0xb3, 0x00, 0x00, 0xfd, 0x15, 0x00, 0x00, 0xfd, 0x09, 0x00, 0x00, 0xfd, 0x2a, 0x00, 0x00, 0xfc, 0x55, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfd, 0xdf, 0x00, 0x00, 0xfd, 0x28, 0x00, 0x00, 0xfd, 0x7f, 0x00, 0x00, 0xfd, 0x3b, 0x00, 0x00, 0xfd, 0x42, 0x00, 0x00, 0xfd, 0x18, 0x00, 0x00, 0xfd, 0xf6, 0x00, 0x00, 0xfd, 0x3f, 0x00, 0x00, 0xfc, 0xbb, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfe, 0x50, 0x00, 0x00, 0xfd, 0xcf, 0x00, 0x00, 0xfd, 0xcf, 0x00, 0x00, 0xff, 0x87, 0x00, 0x00, 0xfc, 0xfe, 0x00, 0x00, 0xfd, 0xb3, 0x00, 0x00, 0xfd, 0x6e, 0x00, 0x00, 0xfd, 0xfe, 0x00, 0x00, 0xfe, 0x80, 0x00, 0x00, 0xff, 0x0c, 0x00, 0x00, 0xfd, 0xc0, 0x00, 0x00, 0xfd, 0x57, 0x00, 0x00, 0xfd, 0x57, 0x00, 0x00, 0xfd, 0x6e, 0x00, 0x00, 0xfd, 0x57, 0x00, 0x00, 0xfd, 0xbb, 0x00, 0x00, 0xfd, 0xb8, 0x00, 0x00, 0xfd, 0xdf, 0x00, 0x00, 0xfd, 0x27, 0x00, 0x00, 0xfd, 0x71, 0x00, 0x00, 0xfd, 0xad, 0x00, 0x00, 0xfd, 0x6d, 0x00, 0x00, 0xfd, 0x92, 0x00, 0x00, 0xfd, 0xf6, 0x00, 0x00, 0xfd, 0x3f, 0x00, 0x00, 0xfc, 0xc0, 0x00, 0x00, 0xfd, 0x18, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfd, 0x09, 0x00, 0x00, 0xfd, 0x2a, 0x00, 0x00, 0xfc, 0x55, 0x00, 0x00, 0xfc, 0x55, 0x00, 0x00, 0xfb, 0xfe, 0x00, 0x00, 0xfd, 0xb9, 0x00, 0x00, 0xfb, 0x6f, 0x00, 0x00, 0xfb, 0xde, 0x00, 0x00, 0xfa, 0xaa, 0x00, 0x00, 0xfd, 0xe8, 0x00, 0x00, 0xfd, 0x40, 0x00, 0x00, 0xfd, 0x6b, 0x00, 0x00, 0xfc, 0xc0, 0x00, 0x00, 0xfd, 0x74, 0x00, 0x00, 0xfe, 0x39, 0x00, 0x00, 0xfc, 0x55, 0x00, 0x00, 0xfc, 0xfe, 0x00, 0x00, 0xfd, 0xb3, 0x00, 0x00, 0xfd, 0x09, 0x00, 0x00, 0xfd, 0xcf, 0x00, 0x00, 0xfd, 0x37, 0x00, 0x00, 0xfd, 0xff, 0x00, 0x00, 0xfd, 0x27, 0x00, 0x00, 0xfd, 0x69, 0x00, 0x00, 0xfd, 0x60, 0x00, 0x00, 0xfd, 0x69, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0xfc, 0xc0, 0x00, 0x00, 0xfd, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xb9, 0x00, 0x00, 0xfd, 0x13, 0x00, 0x00, 0xfd, 0x74, 0x00, 0x00, 0xfd, 0xb9, 0x00, 0x00, 0xff, 0x43, 0x00, 0x00, 0xfc, 0xe8, 0x00, 0x00, 0xfc, 0xcc, 0x00, 0x00, 0xfc, 0xcc, 0x00, 0x00, 0xfc, 0xcc, 0x00, 0x00, 0xfc, 0xcc, 0x00, 0x00, 0xfd, 0x73, 0x00, 0x00, 0xfc, 0xcc, 0x00, 0x00, 0xfc, 0xd2, 0x04, 0xb6, 0x00, 0xb4, 0x04, 0x16, 0x00, 0xad, 0x06, 0x34, 0x00, 0xb4, 0x04, 0xa9, 0x00, 0xb4, 0x02, 0x01, 0x00, 0x90, 0x02, 0x01, 0x00, 0x90, 0x05, 0x62, 0x00, 0xb4, 0x04, 0xad, 0x00, 0xa7, 0x03, 0x99, 0x01, 0x8a, 0x03, 0xf4, 0x00, 0x72, 0x03, 0xf5, 0x00, 0x65, 0x03, 0xf4, 0x00, 0x72, 0x02, 0x6d, 0x00, 0x8e, 0x03, 0x99, 0x01, 0x4d, 0x03, 0x99, 0x00, 0xc1, 0x04, 0xfc, 0x00, 0x0e, 0x02, 0x49, 0x00, 0xc5, 0x05, 0x5f, 0xff, 0xea, 0x06, 0x45, 0xff, 0xf5, 0x02, 0xf0, 0xff, 0xef, 0x05, 0xd9, 0xff, 0xf4, 0x05, 0xf0, 0xff, 0xe5, 0x05, 0xf1, 0xff, 0xdf, 0x02, 0x6f, 0x00, 0x04, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x02, 0x00, 0xb4, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0xee, 0x00, 0x52, 0x05, 0x6a, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x02, 0x1f, 0x00, 0xb4, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0xec, 0x00, 0x0e, 0x06, 0x36, 0x00, 0xb4, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x57, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x65, 0xff, 0xfb, 0x04, 0x65, 0xff, 0xfd, 0x05, 0xaa, 0x00, 0x67, 0x04, 0xee, 0x00, 0x36, 0x05, 0xaa, 0x00, 0x67, 0x05, 0x80, 0x00, 0x46, 0x02, 0x1f, 0x00, 0x05, 0x04, 0x65, 0xff, 0xfd, 0x04, 0xbf, 0x00, 0x65, 0x03, 0xe4, 0x00, 0x77, 0x04, 0x90, 0x00, 0xa7, 0x02, 0x6f, 0x00, 0x95, 0x04, 0x2a, 0x00, 0x86, 0x04, 0xbf, 0x00, 0x65, 0x04, 0x98, 0x00, 0xac, 0x04, 0x42, 0x00, 0x1c, 0x04, 0x67, 0x00, 0x65, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xea, 0x00, 0x60, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x02, 0x6f, 0x00, 0x95, 0x04, 0x3e, 0x00, 0xab, 0x04, 0x42, 0x00, 0x36, 0x04, 0x94, 0x00, 0x9c, 0x04, 0x05, 0x00, 0x42, 0x04, 0x03, 0x00, 0x60, 0x04, 0x67, 0x00, 0x65, 0x04, 0x55, 0x00, 0x42, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x39, 0x00, 0x65, 0x04, 0x90, 0x00, 0x65, 0x04, 0x55, 0x00, 0x5a, 0x04, 0x2a, 0x00, 0x86, 0x04, 0xbf, 0x00, 0x64, 0x04, 0x28, 0x00, 0x35, 0x04, 0xbf, 0x00, 0x64, 0x06, 0x07, 0x00, 0x79, 0x02, 0x6f, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x67, 0x00, 0x65, 0x04, 0x2a, 0x00, 0x86, 0x06, 0x07, 0x00, 0x79, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x6c, 0x00, 0x96, 0x04, 0x75, 0x00, 0x65, 0x05, 0x07, 0x00, 0x4e, 0x06, 0x10, 0xff, 0xe5, 0x05, 0x07, 0x00, 0x4e, 0x04, 0xbf, 0x00, 0x64, 0x06, 0x07, 0x00, 0x3a, 0x04, 0xc7, 0x00, 0x64, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x04, 0xab, 0x00, 0x7d, 0x04, 0x39, 0x00, 0x65, 0x04, 0x24, 0x00, 0xb4, 0x03, 0x4d, 0xff, 0x54, 0x04, 0xbf, 0x00, 0xa1, 0x04, 0xbf, 0x00, 0xab, 0x06, 0x3a, 0x00, 0x66, 0x04, 0x84, 0x00, 0x6b, 0x06, 0xb8, 0x00, 0x67, 0x06, 0x07, 0x00, 0x79, 0x05, 0x75, 0x00, 0x67, 0x04, 0xbf, 0x00, 0x65, 0x05, 0xb2, 0x00, 0xb4, 0x04, 0x6d, 0x00, 0x28, 0x04, 0xf1, 0x00, 0x47, 0x04, 0x5e, 0x00, 0x5a, 0x05, 0x86, 0x00, 0x67, 0x04, 0x80, 0x00, 0x30, 0x05, 0x08, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x04, 0x65, 0x00, 0x27, 0x03, 0xdc, 0x00, 0x31, 0x04, 0xc7, 0x00, 0x64, 0x04, 0x92, 0x00, 0xa7, 0x03, 0xf5, 0x00, 0x65, 0x02, 0x00, 0xff, 0xdf, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x6e, 0x00, 0xb0, 0x04, 0x5b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x05, 0x07, 0x00, 0x67, 0x06, 0x36, 0x00, 0xb4, 0x04, 0xaf, 0x00, 0x72, 0x04, 0x92, 0x00, 0x4c, 0x05, 0x10, 0x00, 0x67, 0x05, 0x07, 0x00, 0x67, 0x05, 0x10, 0x00, 0x67, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x05, 0xa9, 0xff, 0xfb, 0x04, 0x64, 0x00, 0xb4, 0x05, 0x07, 0x00, 0x67, 0x04, 0x92, 0x00, 0x79, 0x02, 0x1f, 0x00, 0xb4, 0x02, 0x1f, 0x00, 0x05, 0x02, 0x1f, 0xff, 0xa1, 0x07, 0xe0, 0x00, 0x4b, 0x07, 0x86, 0x00, 0xb4, 0x05, 0xa9, 0xff, 0xfb, 0x05, 0x1c, 0x00, 0xb4, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x63, 0x00, 0x1f, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x64, 0x00, 0xb4, 0x05, 0xa0, 0x00, 0x5a, 0x04, 0x8c, 0x00, 0xb4, 0x07, 0xc1, 0x00, 0x24, 0x04, 0x9d, 0x00, 0x79, 0x05, 0x62, 0x00, 0xb4, 0x05, 0x62, 0x00, 0xb4, 0x05, 0x1c, 0x00, 0xb4, 0x05, 0x6a, 0x00, 0x4b, 0x06, 0x36, 0x00, 0xb4, 0x05, 0x6a, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x57, 0x00, 0xb4, 0x05, 0x07, 0x00, 0x67, 0x04, 0x65, 0xff, 0xfb, 0x04, 0x63, 0x00, 0x1f, 0x06, 0x32, 0x00, 0x6c, 0x04, 0xee, 0x00, 0x36, 0x05, 0x97, 0x00, 0xb4, 0x04, 0xef, 0x00, 0x9d, 0x07, 0xb3, 0x00, 0xb4, 0x07, 0xe0, 0x00, 0xb4, 0x05, 0xfe, 0x00, 0x36, 0x06, 0x5a, 0x00, 0xb4, 0x04, 0xf0, 0x00, 0xb4, 0x05, 0x07, 0x00, 0x63, 0x07, 0xc5, 0x00, 0xbd, 0x05, 0x00, 0x00, 0x7a, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x70, 0x00, 0x64, 0x04, 0x3e, 0x00, 0xa7, 0x03, 0xc8, 0x00, 0xa7, 0x04, 0xfa, 0x00, 0x60, 0x04, 0x6e, 0x00, 0x65, 0x06, 0x7c, 0x00, 0x3f, 0x03, 0xd4, 0x00, 0x77, 0x04, 0xad, 0x00, 0xa7, 0x04, 0xad, 0x00, 0xa7, 0x04, 0x59, 0x00, 0xa7, 0x04, 0x9a, 0x00, 0x44, 0x05, 0x6e, 0x00, 0xa7, 0x04, 0xb5, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x04, 0xb5, 0x00, 0xa7, 0x04, 0x92, 0x00, 0xa7, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x31, 0x00, 0x36, 0x04, 0x42, 0x00, 0x36, 0x06, 0x27, 0x00, 0x64, 0x04, 0x42, 0x00, 0x35, 0x04, 0xe6, 0x00, 0xa7, 0x04, 0x41, 0x00, 0x87, 0x06, 0x96, 0x00, 0xa7, 0x06, 0xc8, 0x00, 0xa7, 0x05, 0x16, 0x00, 0x37, 0x05, 0xaf, 0x00, 0xa7, 0x04, 0x3e, 0x00, 0xa7, 0x03, 0xf3, 0x00, 0x65, 0x06, 0x0f, 0x00, 0xad, 0x04, 0x54, 0x00, 0x68, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x80, 0x00, 0x2a, 0x03, 0xc8, 0x00, 0xa7, 0x03, 0xf3, 0x00, 0x65, 0x03, 0xc0, 0x00, 0x63, 0x02, 0x00, 0x00, 0xad, 0x02, 0x00, 0xff, 0xf6, 0x02, 0x00, 0xff, 0xdf, 0x06, 0x7f, 0x00, 0x44, 0x06, 0x78, 0x00, 0xa7, 0x04, 0xb1, 0x00, 0x2a, 0x04, 0x59, 0x00, 0xa7, 0x04, 0xad, 0x00, 0xa7, 0x04, 0x42, 0x00, 0x36, 0x04, 0xb5, 0x00, 0xa7, 0x06, 0xb8, 0x00, 0x67, 0x06, 0x07, 0x00, 0x79, 0x05, 0x8c, 0x00, 0x1b, 0x04, 0xd6, 0x00, 0x1b, 0x06, 0xc9, 0x00, 0xbd, 0x05, 0x64, 0x00, 0xad, 0x06, 0x54, 0x00, 0x0e, 0x05, 0xa3, 0x00, 0x2d, 0x08, 0x59, 0x00, 0xb4, 0x07, 0x35, 0x00, 0xad, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x60, 0x07, 0x64, 0x00, 0xb4, 0x05, 0xef, 0x00, 0xad, 0x04, 0x94, 0x00, 0x67, 0x03, 0xe4, 0x00, 0x51, 0x06, 0x2a, 0x00, 0x0e, 0x06, 0x4f, 0x00, 0x2d, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xa0, 0x00, 0x0e, 0x04, 0xc9, 0x00, 0x2d, 0x05, 0xa0, 0x00, 0x0e, 0x04, 0xc9, 0x00, 0x2d, 0x07, 0x24, 0x00, 0x67, 0x06, 0x82, 0x00, 0x65, 0x06, 0xdc, 0x00, 0x67, 0x05, 0x75, 0x00, 0x65, 0x08, 0x7e, 0x00, 0x6a, 0x07, 0x66, 0x00, 0x88, 0x06, 0xb8, 0x00, 0x67, 0x06, 0x07, 0x00, 0x79, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x03, 0x9e, 0x00, 0x35, 0x00, 0x00, 0xfc, 0x45, 0x00, 0x00, 0xfd, 0x54, 0x00, 0x00, 0xfd, 0xee, 0x00, 0x00, 0xfd, 0xee, 0x00, 0x00, 0xfa, 0x69, 0x03, 0x02, 0xf8, 0xa7, 0x03, 0x02, 0xf9, 0x1c, 0x05, 0x8f, 0x00, 0xb4, 0x04, 0xdf, 0x00, 0xad, 0x04, 0xf0, 0x00, 0x1d, 0x04, 0x3e, 0x00, 0x22, 0x04, 0x57, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x64, 0x00, 0xb4, 0x03, 0xc8, 0x00, 0xa7, 0x04, 0xdb, 0x00, 0x3f, 0x04, 0x40, 0x00, 0x32, 0x04, 0x7e, 0x00, 0xb4, 0x03, 0xd0, 0x00, 0xa7, 0x07, 0xc1, 0x00, 0x24, 0x06, 0x7c, 0x00, 0x3f, 0x04, 0x9d, 0x00, 0x79, 0x03, 0xd4, 0x00, 0x77, 0x05, 0x1c, 0x00, 0xb4, 0x04, 0x59, 0x00, 0xa7, 0x05, 0x1c, 0x00, 0xb4, 0x04, 0x59, 0x00, 0xa7, 0x05, 0x1c, 0x00, 0x1d, 0x04, 0x59, 0x00, 0x36, 0x06, 0x2a, 0x00, 0x2d, 0x05, 0xfc, 0x00, 0x25, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0xc1, 0x00, 0xad, 0x07, 0x4d, 0x00, 0xb4, 0x06, 0x50, 0x00, 0xad, 0x07, 0xc8, 0x00, 0xb4, 0x06, 0x97, 0x00, 0xad, 0x06, 0x52, 0x00, 0x67, 0x04, 0xfd, 0x00, 0x65, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x65, 0xff, 0xfb, 0x04, 0x31, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0xee, 0x00, 0x36, 0x04, 0x42, 0x00, 0x35, 0x06, 0xb9, 0xff, 0xfb, 0x05, 0xce, 0x00, 0x04, 0x04, 0xef, 0x00, 0x9d, 0x04, 0x41, 0x00, 0x87, 0x04, 0xef, 0x00, 0x9d, 0x04, 0x41, 0x00, 0x87, 0x04, 0xef, 0x00, 0x9d, 0x04, 0x90, 0x00, 0xa7, 0x06, 0xc6, 0x00, 0x12, 0x05, 0x3d, 0x00, 0x0d, 0x06, 0xc6, 0x00, 0x12, 0x05, 0x3d, 0x00, 0x0d, 0x02, 0x1f, 0x00, 0xb4, 0x07, 0xc1, 0x00, 0x24, 0x06, 0x7c, 0x00, 0x3f, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x59, 0x00, 0xab, 0x05, 0x96, 0x00, 0x30, 0x04, 0xd3, 0x00, 0x29, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0xc1, 0x00, 0xad, 0x05, 0x97, 0x00, 0xb4, 0x04, 0xe6, 0x00, 0xad, 0x04, 0xef, 0x00, 0x9d, 0x04, 0x41, 0x00, 0x87, 0x06, 0x64, 0x00, 0xb4, 0x05, 0x93, 0x00, 0xad, 0x02, 0x00, 0x00, 0xad, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x07, 0x03, 0x00, 0x07, 0x07, 0x11, 0x00, 0x6e, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x69, 0x04, 0x6e, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x69, 0x04, 0x6e, 0x00, 0x65, 0x07, 0xc1, 0x00, 0x24, 0x06, 0x7c, 0x00, 0x3f, 0x04, 0x9d, 0x00, 0x79, 0x03, 0xd4, 0x00, 0x77, 0x04, 0xcb, 0x00, 0x90, 0x04, 0x28, 0x00, 0x4f, 0x05, 0x62, 0x00, 0xb4, 0x04, 0xad, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0xad, 0x00, 0xa7, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0x07, 0x00, 0x63, 0x03, 0xf3, 0x00, 0x65, 0x04, 0x63, 0x00, 0x1f, 0x04, 0x42, 0x00, 0x36, 0x04, 0x63, 0x00, 0x1f, 0x04, 0x42, 0x00, 0x36, 0x04, 0x63, 0x00, 0x1f, 0x04, 0x42, 0x00, 0x36, 0x04, 0xef, 0x00, 0x9d, 0x04, 0x41, 0x00, 0x87, 0x04, 0x64, 0x00, 0xb4, 0x03, 0xc8, 0x00, 0xa7, 0x06, 0x5a, 0x00, 0xb4, 0x05, 0xaf, 0x00, 0xa7, 0x04, 0xdb, 0x00, 0x3f, 0x04, 0x40, 0x00, 0x32, 0x04, 0xee, 0x00, 0x36, 0x04, 0x42, 0x00, 0x35, 0x04, 0xee, 0x00, 0x36, 0x04, 0x42, 0x00, 0x35, 0x04, 0xf0, 0x00, 0x82, 0x04, 0x3e, 0x00, 0x65, 0x07, 0x3e, 0x00, 0x82, 0x06, 0x75, 0x00, 0x65, 0x07, 0x04, 0x00, 0xb4, 0x06, 0x42, 0x00, 0x99, 0x04, 0xe3, 0x00, 0xb4, 0x04, 0x3c, 0x00, 0x99, 0x07, 0xb7, 0x00, 0x30, 0x06, 0xe4, 0x00, 0x29, 0x08, 0x03, 0x00, 0xb4, 0x06, 0xf6, 0x00, 0xad, 0x05, 0x94, 0x00, 0x67, 0x04, 0xbf, 0x00, 0x65, 0x05, 0x90, 0xff, 0xfb, 0x05, 0x1e, 0x00, 0x04, 0x04, 0x6c, 0x00, 0x93, 0x03, 0xe4, 0x00, 0x77, 0x05, 0x6a, 0x00, 0x4b, 0x04, 0x9a, 0x00, 0x44, 0x08, 0x6a, 0x00, 0x4b, 0x07, 0x27, 0x00, 0x44, 0x06, 0x6f, 0x00, 0xb4, 0x06, 0x39, 0x00, 0xa7, 0x07, 0x6d, 0x00, 0x7a, 0x07, 0x19, 0x00, 0x68, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x05, 0x1c, 0x00, 0xb4, 0x04, 0x59, 0x00, 0xa7, 0x07, 0xc7, 0x00, 0x4b, 0x06, 0x84, 0x00, 0x44, 0x07, 0xc8, 0x00, 0xb4, 0x06, 0x91, 0x00, 0xa7, 0x05, 0xb5, 0x00, 0xb4, 0x04, 0xea, 0x00, 0xa7, 0x04, 0x42, 0x00, 0x36, 0x05, 0x2a, 0x00, 0x09, 0x07, 0x11, 0x00, 0x6e, 0x04, 0x38, 0x00, 0x37, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x5b, 0x00, 0xa7, 0x04, 0x5b, 0x00, 0x20, 0x03, 0x88, 0x00, 0xa7, 0x03, 0xe4, 0x00, 0x75, 0x02, 0x00, 0x00, 0xad, 0x02, 0xd7, 0x00, 0x00, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0x32, 0x00, 0x01, 0x05, 0x6e, 0x00, 0xa7, 0x04, 0xad, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x03, 0xf5, 0x00, 0x72, 0x04, 0xec, 0x00, 0x65, 0x04, 0xec, 0x00, 0x65, 0x04, 0xec, 0x00, 0x2d, 0x07, 0x5d, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x03, 0xc6, 0x00, 0x87, 0x04, 0x54, 0x00, 0x2d, 0x04, 0x54, 0x00, 0x2d, 0x04, 0x31, 0x00, 0x36, 0x04, 0x22, 0x00, 0xa7, 0x05, 0x4e, 0x00, 0x9c, 0x06, 0xd2, 0x00, 0x9c, 0x04, 0x97, 0x00, 0x2a, 0x04, 0x42, 0x00, 0x36, 0x05, 0xe3, 0x00, 0x4d, 0x03, 0xc7, 0x00, 0x4f, 0x03, 0xc9, 0x00, 0x6c, 0x04, 0x32, 0x00, 0xa1, 0x04, 0x42, 0x00, 0x36, 0x04, 0x0f, 0x00, 0x87, 0x03, 0xc6, 0x00, 0x87, 0x04, 0x40, 0x00, 0x51, 0x04, 0x9a, 0x00, 0x44, 0x03, 0x19, 0x00, 0x09, 0x04, 0x6a, 0x00, 0x04, 0x03, 0x1c, 0x00, 0x72, 0x03, 0x7d, 0x00, 0x72, 0x02, 0xdd, 0x00, 0x72, 0x02, 0xdd, 0x00, 0x4a, 0x03, 0x83, 0x00, 0x40, 0x03, 0x69, 0x00, 0x72, 0x01, 0x56, 0x00, 0x72, 0x01, 0x56, 0xff, 0xc4, 0x02, 0xf9, 0x00, 0x72, 0x02, 0x86, 0x00, 0x72, 0x03, 0xe9, 0x00, 0x72, 0x03, 0x64, 0x00, 0x72, 0x03, 0x64, 0x00, 0x72, 0x03, 0x91, 0x00, 0x40, 0x03, 0x2a, 0x00, 0x3f, 0x02, 0xbc, 0x00, 0x72, 0x03, 0x26, 0x00, 0x72, 0x02, 0xc5, 0xff, 0xfd, 0x03, 0x51, 0x00, 0x64, 0x04, 0x7b, 0x00, 0x26, 0x02, 0xd1, 0x00, 0x45, 0x02, 0xd1, 0x00, 0x45, 0x02, 0xeb, 0x00, 0x3f, 0x04, 0xaa, 0x00, 0x45, 0x03, 0x15, 0x00, 0x69, 0x02, 0xeb, 0x00, 0x3f, 0x03, 0x00, 0x00, 0x3f, 0x03, 0x00, 0x00, 0x3f, 0x02, 0x98, 0x00, 0x4b, 0x02, 0x96, 0x00, 0x49, 0x02, 0xeb, 0x00, 0x3f, 0x01, 0x49, 0x00, 0x6d, 0x03, 0x10, 0x00, 0x69, 0x04, 0x7c, 0x00, 0x69, 0x02, 0xf1, 0x00, 0x69, 0x02, 0xfa, 0x00, 0x3f, 0x02, 0xaa, 0x00, 0x3f, 0x02, 0xfa, 0x00, 0x3f, 0x02, 0xfa, 0x00, 0x3f, 0x03, 0x15, 0x00, 0x69, 0x02, 0x1f, 0x00, 0x1f, 0x02, 0xea, 0x00, 0x63, 0x03, 0x61, 0x00, 0x63, 0x04, 0x7c, 0x00, 0x69, 0x03, 0x00, 0x00, 0x22, 0x02, 0xe4, 0x00, 0x6c, 0x02, 0xae, 0x00, 0x12, 0x02, 0xc6, 0x00, 0x3f, 0x02, 0xfd, 0x00, 0x3f, 0x02, 0x9e, 0x00, 0x21, 0x01, 0x49, 0x00, 0x6d, 0x01, 0xdd, 0x00, 0x69, 0x02, 0xea, 0x00, 0x63, 0x03, 0x00, 0x00, 0x22, 0x02, 0xe4, 0x00, 0x6c, 0x02, 0xae, 0x00, 0x12, 0x02, 0xf6, 0x00, 0x6c, 0x02, 0xfd, 0x00, 0x3f, 0x02, 0x9e, 0x00, 0x21, 0x04, 0x92, 0x00, 0xa7, 0x03, 0x69, 0x00, 0x72, 0x02, 0xac, 0x00, 0x68, 0x04, 0xcd, 0x00, 0x2d, 0x02, 0x00, 0x00, 0x82, 0x02, 0xeb, 0x00, 0x3f, 0x02, 0xaa, 0x00, 0x3f, 0x02, 0xaa, 0x00, 0x3f, 0x02, 0xfa, 0x00, 0x3f, 0x02, 0x98, 0x00, 0x4b, 0x02, 0x22, 0x00, 0x1b, 0x01, 0xad, 0xff, 0xec, 0x02, 0xeb, 0x00, 0x3f, 0x02, 0xea, 0x00, 0x63, 0x01, 0xe1, 0x00, 0x41, 0x01, 0xcb, 0x00, 0x6d, 0x01, 0xe0, 0x00, 0x41, 0x01, 0xe1, 0x00, 0x41, 0x01, 0xb0, 0xff, 0x67, 0x01, 0xcb, 0x00, 0x6d, 0x01, 0xb0, 0x00, 0x51, 0x02, 0xb5, 0x00, 0x65, 0x04, 0x7c, 0x00, 0x69, 0x04, 0x7c, 0x00, 0x69, 0x02, 0xf4, 0xff, 0xec, 0x03, 0x73, 0x00, 0x69, 0x02, 0xf1, 0x00, 0x65, 0x02, 0xfa, 0x00, 0x3f, 0x02, 0xfa, 0x00, 0x3f, 0x02, 0x98, 0x00, 0x3f, 0x02, 0x10, 0xff, 0xec, 0x02, 0x1f, 0x00, 0x1f, 0x03, 0xa8, 0x00, 0x54, 0x03, 0x03, 0x00, 0x3f, 0x02, 0x9a, 0x00, 0x69, 0x02, 0xec, 0x00, 0x6d, 0x03, 0x00, 0x00, 0x22, 0x02, 0xa3, 0x00, 0x31, 0x03, 0x24, 0x00, 0x31, 0x02, 0xa3, 0x00, 0x31, 0x02, 0xd2, 0x00, 0x31, 0x02, 0xfa, 0x00, 0x3f, 0x00, 0x00, 0xfc, 0xb9, 0x00, 0x00, 0xfc, 0xb9, 0x00, 0x00, 0xfc, 0xb9, 0x00, 0x00, 0xfc, 0xb9, 0x00, 0x00, 0xfc, 0xa2, 0x00, 0x00, 0xfc, 0xa2, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa5, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x04, 0xf0, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x05, 0x07, 0x00, 0x67, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x24, 0x00, 0xb4, 0x02, 0x88, 0x00, 0x2a, 0x05, 0x94, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa5, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0xff, 0xef, 0x05, 0x6a, 0x00, 0x0f, 0x04, 0x90, 0x00, 0x01, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x02, 0x1f, 0x00, 0x00, 0x02, 0x00, 0xff, 0xd8, 0x02, 0x1f, 0x00, 0x06, 0x02, 0x00, 0xff, 0xf6, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0x02, 0x00, 0xb4, 0x02, 0x12, 0x00, 0xb4, 0x04, 0x02, 0x00, 0x02, 0x02, 0x12, 0xff, 0xfe, 0x04, 0x02, 0x00, 0xb4, 0x02, 0x00, 0xff, 0xf6, 0x04, 0x02, 0x00, 0xb4, 0x02, 0x00, 0xff, 0xe2, 0x06, 0x36, 0x00, 0xb4, 0x07, 0x03, 0x00, 0xa7, 0x06, 0x36, 0x00, 0xb4, 0x07, 0x03, 0x00, 0xa7, 0x06, 0x36, 0x00, 0xb4, 0x07, 0x03, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0x62, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x04, 0x57, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x57, 0x00, 0xb4, 0x04, 0x92, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0xa7, 0x05, 0x00, 0x00, 0xb4, 0x02, 0xf5, 0x00, 0x4b, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x92, 0x00, 0x79, 0x03, 0xc0, 0x00, 0x63, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x65, 0xff, 0xfb, 0x02, 0xd2, 0x00, 0x31, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x42, 0x00, 0x36, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x42, 0x00, 0x36, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x07, 0x1e, 0x00, 0x3d, 0x05, 0xe3, 0x00, 0x4d, 0x04, 0xee, 0x00, 0x36, 0x04, 0x42, 0x00, 0x35, 0x04, 0xee, 0x00, 0x36, 0x04, 0x42, 0x00, 0x35, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0x90, 0x00, 0xa7, 0x02, 0xd2, 0x00, 0x03, 0x05, 0xe3, 0x00, 0x4d, 0x04, 0x42, 0x00, 0x36, 0x04, 0x69, 0x00, 0x6e, 0x02, 0x88, 0x00, 0x2a, 0x02, 0x88, 0x00, 0x01, 0x02, 0x88, 0x00, 0x2a, 0x05, 0x88, 0x00, 0xa0, 0x04, 0x67, 0x00, 0x65, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x6e, 0x00, 0x65, 0x02, 0x1f, 0x00, 0x51, 0x02, 0x00, 0x00, 0x3d, 0x02, 0x1f, 0x00, 0xb4, 0x02, 0x00, 0x00, 0xab, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x67, 0x00, 0x65, 0x06, 0x93, 0x00, 0x5c, 0x04, 0x67, 0x00, 0x6a, 0x06, 0x93, 0x00, 0x5c, 0x04, 0x67, 0x00, 0x6a, 0x06, 0x93, 0x00, 0x5c, 0x04, 0x67, 0x00, 0x6a, 0x06, 0x93, 0x00, 0x5c, 0x04, 0x67, 0x00, 0x6a, 0x06, 0x93, 0x00, 0x5c, 0x04, 0x67, 0x00, 0x6a, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x05, 0x45, 0x00, 0xa0, 0x04, 0x90, 0x00, 0x9c, 0x06, 0x2d, 0x00, 0x9b, 0x04, 0x90, 0x00, 0x9e, 0x06, 0x2d, 0x00, 0x9b, 0x04, 0x90, 0x00, 0x9e, 0x06, 0x2d, 0x00, 0x9b, 0x04, 0x90, 0x00, 0x9e, 0x06, 0x2d, 0x00, 0x9b, 0x04, 0x90, 0x00, 0x9e, 0x06, 0x2d, 0x00, 0x9b, 0x04, 0x90, 0x00, 0x9e, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x42, 0x00, 0x36, 0x05, 0x89, 0x00, 0xb4, 0x03, 0x6f, 0x00, 0x1c, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x06, 0x51, 0x00, 0x04, 0x06, 0x51, 0x00, 0x05, 0x05, 0x89, 0x00, 0x06, 0x05, 0xc4, 0x00, 0x04, 0x05, 0x19, 0x00, 0x06, 0x05, 0x58, 0x00, 0x03, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xe4, 0x00, 0x77, 0x05, 0x1e, 0x00, 0x06, 0x05, 0x1e, 0x00, 0x06, 0x06, 0xf4, 0x00, 0x04, 0x07, 0x04, 0x00, 0x05, 0x06, 0x78, 0x00, 0x06, 0x06, 0xae, 0x00, 0x04, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x06, 0x06, 0x00, 0x06, 0x06, 0x03, 0x00, 0x06, 0x07, 0xd1, 0x00, 0x04, 0x07, 0xd7, 0x00, 0x05, 0x07, 0x64, 0x00, 0x06, 0x07, 0x90, 0x00, 0x04, 0x06, 0xb8, 0x00, 0x06, 0x06, 0xd1, 0x00, 0x03, 0x02, 0x6f, 0x00, 0x8b, 0x02, 0x6f, 0x00, 0x82, 0x02, 0x6f, 0xff, 0xb9, 0x02, 0x6f, 0xff, 0xc2, 0x02, 0x6f, 0x00, 0x04, 0x02, 0x6f, 0xff, 0xd8, 0x02, 0x6f, 0xff, 0xd1, 0x02, 0x6f, 0xff, 0xcc, 0x02, 0xbc, 0x00, 0x06, 0x02, 0xb1, 0x00, 0x06, 0x04, 0x92, 0x00, 0x04, 0x04, 0x92, 0x00, 0x05, 0x04, 0x1b, 0x00, 0x06, 0x04, 0x51, 0x00, 0x04, 0x03, 0x85, 0x00, 0x06, 0x03, 0x8c, 0x00, 0x03, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x05, 0xca, 0x00, 0x06, 0x06, 0x1b, 0x00, 0x06, 0x07, 0xe1, 0x00, 0x04, 0x07, 0xea, 0x00, 0x05, 0x06, 0xc1, 0x00, 0x06, 0x06, 0xfc, 0x00, 0x04, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x05, 0xa4, 0x00, 0x06, 0x07, 0x2e, 0x00, 0x05, 0x07, 0x49, 0x00, 0x04, 0x06, 0x76, 0x00, 0x03, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x05, 0xc6, 0x00, 0x06, 0x06, 0x12, 0x00, 0x06, 0x07, 0xd7, 0x00, 0x04, 0x07, 0xe2, 0x00, 0x05, 0x06, 0xcf, 0x00, 0x06, 0x06, 0xff, 0x00, 0x04, 0x06, 0xa2, 0x00, 0x06, 0x06, 0xdb, 0x00, 0x03, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x03, 0xe4, 0x00, 0x77, 0x03, 0xf2, 0x00, 0x77, 0x04, 0x90, 0x00, 0xa7, 0x04, 0xb6, 0x00, 0xa7, 0x02, 0x6f, 0xff, 0x99, 0x02, 0x6f, 0x00, 0x95, 0x04, 0x67, 0x00, 0x65, 0x04, 0x67, 0x00, 0x65, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x06, 0x51, 0x00, 0x04, 0x06, 0x51, 0x00, 0x05, 0x05, 0x89, 0x00, 0x06, 0x05, 0xc4, 0x00, 0x04, 0x05, 0x19, 0x00, 0x06, 0x05, 0x58, 0x00, 0x03, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x06, 0x06, 0x00, 0x06, 0x06, 0x03, 0x00, 0x06, 0x07, 0xd1, 0x00, 0x04, 0x07, 0xd7, 0x00, 0x05, 0x07, 0x64, 0x00, 0x06, 0x07, 0x90, 0x00, 0x04, 0x06, 0xb8, 0x00, 0x06, 0x06, 0xd1, 0x00, 0x03, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x05, 0xc6, 0x00, 0x06, 0x06, 0x12, 0x00, 0x06, 0x07, 0xd7, 0x00, 0x04, 0x07, 0xe2, 0x00, 0x05, 0x06, 0xcf, 0x00, 0x06, 0x06, 0xff, 0x00, 0x04, 0x06, 0xa2, 0x00, 0x06, 0x06, 0xdb, 0x00, 0x03, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xbf, 0x00, 0x65, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x05, 0x28, 0xff, 0xfd, 0x04, 0xfc, 0x00, 0x0e, 0x04, 0xec, 0x00, 0x0e, 0x03, 0x99, 0x01, 0x5f, 0x03, 0x99, 0x01, 0x8a, 0x03, 0x99, 0x01, 0x5f, 0x03, 0x99, 0x00, 0xa3, 0x03, 0x99, 0x00, 0xa3, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0xb6, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x05, 0xcb, 0xff, 0xfd, 0x05, 0x5f, 0xff, 0xea, 0x06, 0xb3, 0xff, 0xfd, 0x06, 0x45, 0xff, 0xf5, 0x05, 0x6a, 0x00, 0xb4, 0x03, 0x99, 0x00, 0x7b, 0x03, 0x99, 0x00, 0xa2, 0x03, 0x99, 0x00, 0xa3, 0x02, 0x6f, 0xff, 0xee, 0x02, 0x6f, 0xff, 0xe6, 0x02, 0x6f, 0xff, 0xdc, 0x02, 0x6f, 0x00, 0x04, 0x02, 0x6f, 0xff, 0xe7, 0x02, 0x6f, 0xff, 0xe9, 0x02, 0x1f, 0xff, 0xf7, 0x02, 0x1f, 0x00, 0x02, 0x03, 0x6b, 0xff, 0xfd, 0x02, 0xf0, 0xff, 0xef, 0x03, 0x99, 0x00, 0x71, 0x03, 0x99, 0x00, 0x86, 0x03, 0x99, 0x00, 0xa3, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x2a, 0x00, 0x86, 0x04, 0x65, 0xff, 0xfd, 0x04, 0x65, 0xff, 0xfd, 0x06, 0x15, 0xff, 0xfd, 0x05, 0xf0, 0xff, 0xe5, 0x04, 0xee, 0x00, 0x06, 0x03, 0x99, 0x00, 0x99, 0x03, 0x99, 0x00, 0xc1, 0x03, 0x99, 0x00, 0x99, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0x07, 0x00, 0x79, 0x06, 0xc6, 0xff, 0xfd, 0x05, 0xd9, 0xff, 0xf4, 0x06, 0xa4, 0xff, 0xfd, 0x05, 0xf1, 0xff, 0xdf, 0x05, 0x80, 0x00, 0x46, 0x03, 0x99, 0x01, 0x4d, 0x03, 0x99, 0x01, 0x5f, 0x03, 0x99, 0x00, 0x00, 0x07, 0x33, 0x00, 0x00, 0x03, 0x99, 0x00, 0x00, 0x07, 0x33, 0x00, 0x00, 0x02, 0x5f, 0x00, 0x00, 0x01, 0xcc, 0x00, 0x00, 0x01, 0x33, 0x00, 0x00, 0x04, 0x94, 0x00, 0x00, 0x02, 0x49, 0x00, 0x00, 0x01, 0x70, 0x00, 0x00, 0x00, 0xb7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x99, 0x00, 0x5a, 0x02, 0x99, 0x00, 0x5a, 0x04, 0x94, 0x00, 0x5a, 0x03, 0x99, 0x00, 0x5a, 0x07, 0x33, 0x00, 0x5a, 0x07, 0x33, 0x00, 0x00, 0x03, 0x99, 0x00, 0xea, 0x03, 0x99, 0xff, 0xee, 0x02, 0x49, 0x00, 0x9c, 0x02, 0x49, 0x00, 0xa0, 0x02, 0x49, 0x00, 0x9c, 0x02, 0x49, 0x00, 0xa0, 0x03, 0xba, 0x00, 0x9c, 0x03, 0xba, 0x00, 0x9c, 0x03, 0xba, 0x00, 0x9c, 0x03, 0xba, 0x00, 0x9c, 0x03, 0x99, 0x00, 0x33, 0x03, 0x99, 0x00, 0x33, 0x04, 0x3f, 0x01, 0x14, 0x04, 0x3f, 0x01, 0x14, 0x02, 0x68, 0x00, 0xd4, 0x04, 0xce, 0x00, 0xd4, 0x07, 0x33, 0x00, 0xd4, 0x02, 0x49, 0x00, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x70, 0x00, 0x00, 0x09, 0xa9, 0x00, 0x65, 0x0c, 0x7e, 0x00, 0x65, 0x01, 0xa2, 0x00, 0x24, 0x02, 0xb0, 0x00, 0x24, 0x03, 0xbe, 0x00, 0x24, 0x01, 0xa2, 0x00, 0x24, 0x02, 0xb0, 0x00, 0x24, 0x03, 0xbe, 0x00, 0x24, 0x02, 0x70, 0x00, 0x09, 0x02, 0xe1, 0x00, 0x8e, 0x02, 0xe1, 0x00, 0xad, 0x06, 0x08, 0x00, 0xaf, 0x03, 0x7e, 0x00, 0x84, 0x03, 0xd2, 0x00, 0x84, 0x03, 0x99, 0xff, 0xee, 0x05, 0xc9, 0xff, 0xb0, 0x05, 0xc9, 0xff, 0xb0, 0x01, 0xcc, 0xff, 0xb3, 0x07, 0x33, 0x00, 0x36, 0x03, 0x99, 0x00, 0xc6, 0x01, 0x33, 0xfe, 0xaf, 0x02, 0xcf, 0x00, 0x9e, 0x02, 0xcf, 0x00, 0x9e, 0x06, 0xa3, 0x00, 0x42, 0x05, 0x46, 0x00, 0x84, 0x05, 0x46, 0x00, 0x84, 0x03, 0x94, 0x00, 0x5a, 0x04, 0x94, 0x00, 0xd4, 0x03, 0x99, 0x00, 0xc2, 0x03, 0x99, 0x00, 0xc2, 0x03, 0x99, 0x00, 0x36, 0x02, 0x6d, 0x01, 0x00, 0x05, 0xc9, 0xff, 0xb0, 0x03, 0x99, 0x00, 0x36, 0x03, 0x3c, 0x00, 0x82, 0x07, 0x33, 0x00, 0x5a, 0x05, 0xc9, 0xff, 0xb0, 0x06, 0x08, 0x01, 0x18, 0x04, 0x38, 0x00, 0xe1, 0x04, 0xc6, 0x00, 0x24, 0x06, 0x08, 0x01, 0x42, 0x06, 0x08, 0x01, 0x42, 0x02, 0x49, 0x00, 0xc5, 0x05, 0xbd, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x64, 0x02, 0x49, 0x00, 0xc5, 0x02, 0x49, 0x00, 0xc5, 0x01, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xe2, 0x00, 0x4e, 0x01, 0x49, 0x00, 0x6d, 0x02, 0xe2, 0x00, 0x38, 0x02, 0xe2, 0x00, 0x5b, 0x02, 0xe2, 0x00, 0x52, 0x02, 0xe2, 0x00, 0x61, 0x02, 0xe2, 0x00, 0x50, 0x02, 0xe2, 0x00, 0x4a, 0x03, 0xcc, 0x00, 0x7b, 0x03, 0xcc, 0x00, 0x7b, 0x03, 0xcc, 0x00, 0x7b, 0x01, 0xc4, 0x00, 0x63, 0x01, 0xc4, 0x00, 0x5c, 0x02, 0xde, 0x00, 0x69, 0x02, 0xe2, 0x00, 0x4e, 0x02, 0xe2, 0x00, 0x7b, 0x02, 0xe2, 0x00, 0x54, 0x02, 0xe2, 0x00, 0x58, 0x02, 0xe2, 0x00, 0x38, 0x02, 0xe2, 0x00, 0x5b, 0x02, 0xe2, 0x00, 0x52, 0x02, 0xe2, 0x00, 0x61, 0x02, 0xe2, 0x00, 0x50, 0x02, 0xe2, 0x00, 0x4a, 0x03, 0xcc, 0x00, 0x7b, 0x03, 0xcc, 0x00, 0x7b, 0x03, 0xcc, 0x00, 0x7b, 0x01, 0xc4, 0x00, 0x63, 0x01, 0xc4, 0x00, 0x5c, 0x02, 0xd1, 0x00, 0x45, 0x03, 0x00, 0x00, 0x3f, 0x02, 0xfa, 0x00, 0x3f, 0x03, 0x32, 0x00, 0x69, 0x03, 0x00, 0x00, 0x3f, 0x02, 0xe9, 0x00, 0x69, 0x03, 0x10, 0x00, 0x69, 0x01, 0x32, 0x00, 0x6d, 0x04, 0x7c, 0x00, 0x69, 0x02, 0xde, 0x00, 0x69, 0x03, 0x15, 0x00, 0x69, 0x02, 0xaf, 0x00, 0x69, 0x02, 0x1f, 0x00, 0x1f, 0x06, 0x50, 0x00, 0x4d, 0x04, 0x94, 0x00, 0x67, 0x04, 0x94, 0x00, 0x56, 0x04, 0x94, 0x00, 0x77, 0x04, 0x94, 0x00, 0x74, 0x07, 0x03, 0x00, 0xa7, 0x05, 0x62, 0x00, 0x69, 0x09, 0x29, 0x00, 0xb4, 0x07, 0xbb, 0x00, 0xb4, 0x07, 0x1e, 0x00, 0x35, 0x05, 0xa5, 0x00, 0x55, 0x04, 0x94, 0x00, 0x65, 0x04, 0x94, 0x00, 0x00, 0x04, 0x94, 0x00, 0x24, 0x04, 0x94, 0x00, 0x12, 0x09, 0x29, 0x00, 0xbb, 0x04, 0x94, 0x00, 0x29, 0x04, 0x94, 0x00, 0x3d, 0x04, 0x94, 0x00, 0x53, 0x04, 0x94, 0x00, 0x0e, 0x05, 0x92, 0x00, 0x69, 0x04, 0x94, 0x00, 0x94, 0x04, 0x94, 0x00, 0x12, 0x04, 0x94, 0x00, 0x5f, 0x04, 0xe3, 0x00, 0x09, 0x00, 0x00, 0xfc, 0x77, 0x00, 0x00, 0xfc, 0x9e, 0x00, 0x00, 0xfc, 0x9e, 0x00, 0x00, 0xfc, 0x9e, 0x00, 0x00, 0xfc, 0x78, 0x00, 0x00, 0xfb, 0xc8, 0x00, 0x00, 0xfc, 0x9e, 0x07, 0x55, 0x00, 0x3c, 0x07, 0x55, 0x00, 0x3c, 0x05, 0x07, 0x00, 0x67, 0x08, 0x16, 0x00, 0xaf, 0x04, 0x9f, 0xff, 0xdb, 0x07, 0x55, 0x00, 0x36, 0x07, 0xae, 0x00, 0x36, 0x04, 0x6c, 0x00, 0x93, 0x05, 0x07, 0x00, 0x63, 0x06, 0xda, 0x00, 0xaf, 0x07, 0x1d, 0x00, 0x41, 0x05, 0x6e, 0x00, 0x01, 0x06, 0x1e, 0x00, 0xb4, 0x04, 0x90, 0x00, 0x40, 0x04, 0x90, 0x00, 0x51, 0x03, 0x61, 0x00, 0x35, 0x05, 0x05, 0x00, 0x5f, 0x05, 0x2f, 0x00, 0x3d, 0x02, 0xf9, 0xff, 0xe7, 0x05, 0xe3, 0x00, 0x1c, 0x05, 0xc4, 0x00, 0xb2, 0x07, 0x7d, 0x00, 0x30, 0x07, 0x33, 0x00, 0xfe, 0x05, 0x05, 0x00, 0x63, 0x05, 0x0c, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x05, 0xbe, 0x00, 0x3b, 0x05, 0xdc, 0x00, 0x4a, 0x05, 0xb3, 0x00, 0xb4, 0x06, 0x74, 0x00, 0x98, 0x04, 0xec, 0x00, 0xb4, 0x07, 0x57, 0x00, 0xe9, 0x07, 0xbc, 0xff, 0xfd, 0x07, 0x33, 0x01, 0x09, 0x04, 0xec, 0x00, 0x0e, 0x05, 0x5c, 0x00, 0x52, 0x04, 0x28, 0x00, 0x4f, 0x05, 0x80, 0x00, 0x46, 0x05, 0x80, 0x00, 0x46, 0x04, 0x6f, 0x00, 0x15, 0x02, 0x6f, 0x00, 0x3d, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0xec, 0x00, 0x0e, 0x05, 0xa9, 0x00, 0x52, 0x05, 0x10, 0x00, 0x75, 0x06, 0x27, 0x00, 0x70, 0x04, 0x42, 0x00, 0x4e, 0x04, 0x5c, 0x00, 0x91, 0x05, 0xa9, 0x00, 0x4b, 0x04, 0x24, 0x00, 0xb4, 0x07, 0xb3, 0x00, 0x33, 0x03, 0x53, 0x00, 0x5d, 0x05, 0x5d, 0x00, 0x5c, 0x04, 0xda, 0xff, 0xfc, 0x03, 0x5a, 0x00, 0x18, 0x04, 0xa4, 0x00, 0x4d, 0x02, 0xbc, 0x00, 0x3f, 0x06, 0xaa, 0x00, 0x51, 0x08, 0x98, 0x00, 0x87, 0x05, 0x0e, 0x00, 0x20, 0x05, 0x3d, 0x00, 0x00, 0x04, 0xb6, 0x00, 0xb4, 0x06, 0x1c, 0x00, 0xb4, 0x05, 0xd6, 0x00, 0x16, 0x05, 0x94, 0x00, 0x92, 0x04, 0x02, 0x00, 0x07, 0x04, 0x02, 0x00, 0x06, 0x04, 0x65, 0xff, 0xfd, 0x05, 0xe5, 0x00, 0x4e, 0x05, 0x19, 0x00, 0x51, 0x04, 0x6e, 0x00, 0x51, 0x02, 0x87, 0x00, 0x47, 0x02, 0x87, 0xff, 0x2e, 0x05, 0x9d, 0x00, 0x35, 0x03, 0xca, 0x00, 0x48, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x7b, 0x09, 0xdd, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x54, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x54, 0x06, 0xfa, 0x00, 0x58, 0x06, 0xfa, 0x00, 0x38, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x5b, 0x06, 0xfa, 0x00, 0x7b, 0x06, 0xfa, 0x00, 0x58, 0x06, 0xfa, 0x00, 0x5b, 0x06, 0xfa, 0x00, 0x61, 0x04, 0x16, 0x00, 0x7b, 0x02, 0x1f, 0x00, 0xb4, 0x03, 0x8b, 0x00, 0xb4, 0x04, 0xf6, 0x00, 0xb4, 0x06, 0xa5, 0x00, 0xb4, 0x04, 0xec, 0x00, 0x0e, 0x06, 0xa4, 0x00, 0x0e, 0x08, 0x0f, 0x00, 0x0e, 0x09, 0x7b, 0x00, 0x0e, 0x06, 0x9b, 0x00, 0xb4, 0x04, 0xee, 0x00, 0x36, 0x06, 0xb7, 0x00, 0x36, 0x08, 0x25, 0x00, 0x36, 0x04, 0x02, 0x00, 0xb4, 0x05, 0x07, 0x00, 0x67, 0x05, 0x8b, 0x00, 0xb4, 0x06, 0x36, 0x00, 0xb4, 0x02, 0x00, 0x00, 0xad, 0x03, 0x4b, 0x00, 0xad, 0x04, 0x96, 0x00, 0xad, 0x05, 0xd7, 0x00, 0xad, 0x04, 0x42, 0x00, 0x36, 0x05, 0xd6, 0x00, 0x36, 0x07, 0x22, 0x00, 0x36, 0x08, 0x6d, 0x00, 0x36, 0x05, 0xe5, 0x00, 0xad, 0x04, 0x42, 0x00, 0x35, 0x05, 0xeb, 0x00, 0x35, 0x07, 0x36, 0x00, 0x35, 0x02, 0x00, 0x00, 0xad, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x92, 0x00, 0x65, 0x07, 0x03, 0x00, 0xa7, 0x08, 0xf7, 0x00, 0x6c, 0x05, 0x8b, 0x00, 0xb4, 0x08, 0xf7, 0x00, 0x6c, 0x05, 0x10, 0x00, 0x67, 0x03, 0xf4, 0x00, 0x72, 0x05, 0x07, 0x00, 0x67, 0x06, 0xfa, 0x00, 0x4e, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x27, 0x06, 0x08, 0x00, 0x13, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x6a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x6a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x0c, 0x06, 0x08, 0x01, 0x37, 0x06, 0x08, 0x01, 0x81, 0x06, 0x08, 0x01, 0x37, 0x06, 0x08, 0x01, 0x81, 0x06, 0x08, 0x01, 0xad, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x28, 0x06, 0x08, 0x00, 0x47, 0x06, 0x08, 0x00, 0xc7, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0xbd, 0x06, 0x08, 0x00, 0x8d, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x02, 0xb7, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x02, 0xb7, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x6b, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x6c, 0x06, 0x08, 0x00, 0x6a, 0x06, 0x08, 0x00, 0x6c, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x7a, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0xa9, 0x06, 0x08, 0x00, 0xa9, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x00, 0x60, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x31, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x00, 0x40, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x01, 0x20, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x6d, 0x06, 0x08, 0x00, 0x6d, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x6b, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x31, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x31, 0x04, 0xec, 0x00, 0x0e, 0x04, 0x94, 0x00, 0x79, 0x03, 0xb9, 0x00, 0x55, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x06, 0x45, 0x00, 0x8b, 0x04, 0xd1, 0xff, 0xfb, 0x04, 0xd1, 0xff, 0xfb, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x05, 0x2b, 0x00, 0xc3, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x05, 0x2b, 0x00, 0xc3, 0x04, 0x94, 0x01, 0x0e, 0x05, 0x73, 0x00, 0x8c, 0x05, 0x73, 0x00, 0x8c, 0x04, 0xda, 0x00, 0x16, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x02, 0x6d, 0x00, 0x00, 0x04, 0x95, 0x01, 0x62, 0x06, 0x08, 0x00, 0xeb, 0x04, 0x81, 0x01, 0x23, 0x04, 0x81, 0x01, 0x35, 0x04, 0x96, 0x00, 0x36, 0x04, 0x96, 0x00, 0x36, 0x04, 0x96, 0x00, 0x36, 0x05, 0x24, 0x00, 0xc6, 0x05, 0xff, 0x00, 0xc6, 0x06, 0x08, 0x00, 0xfe, 0x06, 0x74, 0x00, 0x9d, 0x06, 0x74, 0x00, 0x9d, 0x06, 0x08, 0x00, 0xd5, 0x03, 0x99, 0x01, 0x84, 0x03, 0x99, 0x00, 0x5b, 0x03, 0x99, 0x00, 0xf4, 0x03, 0x99, 0x00, 0x5b, 0x05, 0x45, 0x00, 0xed, 0x05, 0x45, 0x00, 0xed, 0x05, 0x45, 0x00, 0xed, 0x05, 0x45, 0x00, 0xed, 0x03, 0xc0, 0x00, 0x69, 0x05, 0xae, 0x00, 0x69, 0x07, 0x9c, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x05, 0xae, 0x00, 0x69, 0x07, 0x9c, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x04, 0x94, 0x00, 0x6c, 0x04, 0x94, 0x00, 0x6c, 0x01, 0xdf, 0x00, 0x90, 0x04, 0x94, 0x00, 0x6c, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc2, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0x91, 0x06, 0x08, 0x00, 0xc3, 0x02, 0xb3, 0x00, 0xbb, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc2, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x0a, 0x00, 0xc3, 0x06, 0x0a, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xba, 0x07, 0x33, 0x00, 0xb8, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc4, 0x06, 0x08, 0x00, 0xc4, 0x06, 0x08, 0x00, 0xc4, 0x06, 0x08, 0x00, 0xc4, 0x07, 0x89, 0x00, 0x85, 0x07, 0x89, 0x00, 0x85, 0x03, 0x57, 0x00, 0x9e, 0x06, 0x08, 0x00, 0xc2, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc4, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xbb, 0x06, 0x08, 0x00, 0xbb, 0x06, 0x08, 0x00, 0xbb, 0x06, 0x08, 0x00, 0xbb, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xb7, 0x06, 0x08, 0x00, 0xb7, 0x06, 0x08, 0x00, 0xb7, 0x06, 0x08, 0x00, 0xb7, 0x06, 0x08, 0x00, 0xab, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xab, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xab, 0x06, 0x08, 0x00, 0xab, 0x05, 0x45, 0x00, 0xed, 0x05, 0x45, 0x00, 0xed, 0x05, 0x45, 0x00, 0xed, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x05, 0x9e, 0x00, 0xc3, 0x05, 0x9e, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x03, 0xbf, 0x00, 0x9d, 0x03, 0xbf, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x07, 0x33, 0x00, 0x6c, 0x07, 0x33, 0x00, 0x6c, 0x06, 0x08, 0x00, 0x58, 0x06, 0x08, 0x00, 0x6c, 0x03, 0xbf, 0x00, 0xd6, 0x05, 0x45, 0x00, 0xb4, 0x05, 0x45, 0x00, 0xb4, 0x05, 0x45, 0x00, 0xb4, 0x06, 0x08, 0x00, 0xfe, 0x06, 0x08, 0x00, 0xfe, 0x05, 0xe8, 0xff, 0xfb, 0x05, 0xe8, 0xff, 0xfb, 0x05, 0xe8, 0x00, 0x7e, 0x05, 0xe8, 0x00, 0x7e, 0x03, 0x8e, 0x00, 0x05, 0x02, 0x49, 0x00, 0xc5, 0x04, 0x81, 0x00, 0xe0, 0x06, 0x08, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x05, 0x46, 0x00, 0x59, 0x05, 0x46, 0x00, 0x59, 0x06, 0x08, 0x00, 0xab, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xbd, 0x06, 0x08, 0x00, 0xbd, 0x06, 0x08, 0x01, 0x56, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x0a, 0x3d, 0x00, 0x85, 0x0a, 0x3d, 0x00, 0x85, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xca, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xbf, 0x07, 0x33, 0x03, 0x3a, 0x07, 0x33, 0x00, 0xd4, 0x07, 0x33, 0x00, 0xd4, 0x07, 0x33, 0x00, 0xd4, 0x07, 0x33, 0x00, 0x4f, 0x06, 0x45, 0x00, 0x9d, 0x05, 0x2b, 0x00, 0xc3, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x05, 0x2b, 0x00, 0xc3, 0x06, 0x45, 0x00, 0x9d, 0x06, 0x45, 0x00, 0x9d, 0x07, 0x33, 0x00, 0x4f, 0x06, 0x45, 0x00, 0x9d, 0x05, 0x2b, 0x00, 0xc3, 0x06, 0x45, 0x00, 0x9d, 0x05, 0x2b, 0x00, 0xc3, 0x06, 0x45, 0x00, 0xc3, 0x04, 0x55, 0x00, 0x42, 0x04, 0x55, 0x00, 0x66, 0x04, 0x92, 0x00, 0x83, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x01, 0x79, 0x06, 0x08, 0x01, 0x79, 0x03, 0x84, 0x01, 0x1b, 0x02, 0xcf, 0x00, 0x9e, 0x02, 0xcf, 0x00, 0xb3, 0x02, 0xcf, 0x00, 0x9e, 0x02, 0xcf, 0x00, 0xb3, 0x05, 0xd2, 0x02, 0xa8, 0x05, 0xd2, 0x00, 0x5a, 0x05, 0xd2, 0x02, 0xa8, 0x05, 0xd2, 0x00, 0x5a, 0x06, 0x08, 0x00, 0xc3, 0x03, 0xb1, 0x00, 0x05, 0x07, 0x33, 0x00, 0xde, 0x06, 0x08, 0x00, 0xc3, 0x03, 0x60, 0x00, 0x9e, 0x03, 0x60, 0x00, 0x78, 0x03, 0x60, 0x00, 0x9e, 0x03, 0x60, 0x00, 0x78, 0x03, 0xc0, 0x01, 0x83, 0x03, 0xc0, 0x00, 0x25, 0x08, 0x4c, 0x00, 0x8c, 0x08, 0x4c, 0x00, 0x8c, 0x0a, 0x2e, 0x00, 0x8c, 0x08, 0x4c, 0x00, 0x8c, 0x0a, 0x64, 0x00, 0x6c, 0x0a, 0x2e, 0x00, 0x00, 0x06, 0x49, 0x00, 0x87, 0x02, 0x6f, 0x00, 0x95, 0x04, 0x92, 0x00, 0xa7, 0x06, 0x07, 0x00, 0x79, 0x04, 0xbf, 0x00, 0x65, 0x05, 0x73, 0x00, 0x17, 0x08, 0x4c, 0x00, 0x8c, 0x06, 0x49, 0x00, 0x1f, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x02, 0x4b, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x00, 0x9e, 0x03, 0x99, 0x02, 0x4b, 0x03, 0x99, 0x00, 0x9e, 0x05, 0x66, 0x02, 0x5f, 0x05, 0x66, 0x00, 0x97, 0x05, 0x66, 0x02, 0x5f, 0x05, 0x66, 0x02, 0x5f, 0x05, 0x66, 0x00, 0x97, 0x05, 0x66, 0x02, 0x5f, 0x05, 0x66, 0x00, 0x97, 0x03, 0xc0, 0x01, 0x83, 0x06, 0x08, 0x00, 0x31, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0x49, 0x00, 0x87, 0x05, 0x89, 0x00, 0x05, 0x04, 0x94, 0x00, 0x50, 0x04, 0x92, 0xff, 0x8f, 0x04, 0x92, 0x00, 0x83, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0x01, 0x52, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0xff, 0x9e, 0x04, 0x55, 0xff, 0x9e, 0x04, 0x55, 0xff, 0x9e, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0x02, 0x3c, 0x04, 0x55, 0x01, 0xe2, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0x02, 0x3c, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0x9a, 0x04, 0x55, 0xff, 0xee, 0x04, 0x55, 0x01, 0x9a, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0x02, 0xc4, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0x04, 0xe5, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0x02, 0xc4, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0x02, 0xc4, 0x05, 0x89, 0xff, 0xee, 0x05, 0x89, 0xff, 0xee, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x04, 0xe1, 0x00, 0xa7, 0x04, 0xe1, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x03, 0xf6, 0x00, 0xa7, 0x03, 0xf6, 0x00, 0xa7, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x03, 0x9d, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x06, 0x48, 0x00, 0x64, 0x03, 0x8e, 0x00, 0x05, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x66, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x03, 0xcb, 0x00, 0x64, 0x03, 0xcb, 0x00, 0xa7, 0x05, 0xb2, 0x00, 0xa7, 0x06, 0xfc, 0x00, 0xa7, 0x06, 0xfc, 0x00, 0xa7, 0x06, 0xfc, 0x00, 0xa7, 0x02, 0xc9, 0x00, 0x05, 0x02, 0xc9, 0x00, 0x05, 0x02, 0xc9, 0x00, 0x05, 0x02, 0xc9, 0x00, 0x05, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x04, 0x3f, 0x01, 0x14, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x08, 0x0e, 0x00, 0x64, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x06, 0x48, 0x00, 0x64, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0xfa, 0x00, 0xa7, 0x05, 0xfa, 0x00, 0xa7, 0x05, 0x46, 0x00, 0xa7, 0x05, 0x46, 0x00, 0xa7, 0x05, 0x89, 0x00, 0x05, 0x06, 0x74, 0x00, 0x99, 0x07, 0x33, 0x00, 0x5d, 0x06, 0x74, 0x00, 0x5a, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x75, 0x06, 0x74, 0x00, 0x77, 0x06, 0x74, 0x00, 0x77, 0x04, 0x1f, 0x00, 0x99, 0x06, 0x73, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x65, 0x00, 0x70, 0x06, 0x65, 0x00, 0x70, 0x04, 0xd5, 0x00, 0x70, 0x07, 0x4a, 0x00, 0x70, 0x08, 0xf7, 0x00, 0x7e, 0x09, 0x00, 0x00, 0x82, 0x06, 0x74, 0x00, 0xa5, 0x06, 0x74, 0x00, 0xa4, 0x06, 0x74, 0x00, 0xa4, 0x03, 0xd5, 0x00, 0x8a, 0x06, 0x74, 0x00, 0x5a, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0x8f, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0xa0, 0x04, 0x62, 0x00, 0x84, 0x06, 0x74, 0x00, 0x9f, 0x04, 0x62, 0x00, 0x84, 0x06, 0x74, 0x00, 0x70, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x5a, 0x04, 0xd1, 0x00, 0x5a, 0x05, 0x5f, 0x00, 0x99, 0x04, 0xad, 0x00, 0x99, 0x05, 0xa4, 0x00, 0x99, 0x03, 0xec, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0xa0, 0x06, 0x74, 0x00, 0x99, 0x05, 0x1d, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x79, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x02, 0x93, 0x06, 0x74, 0x00, 0x99, 0x04, 0x6b, 0x00, 0x9d, 0x05, 0x46, 0x00, 0x9d, 0x05, 0x46, 0x00, 0x9d, 0x06, 0x74, 0x00, 0x91, 0x06, 0x74, 0x01, 0x31, 0x06, 0x74, 0x01, 0x93, 0x06, 0x74, 0x00, 0xdf, 0x06, 0x74, 0x00, 0xea, 0x06, 0x74, 0x01, 0xba, 0x06, 0x74, 0x00, 0x53, 0x06, 0x74, 0x00, 0xa4, 0x06, 0x74, 0x00, 0xac, 0x06, 0x74, 0x00, 0xcf, 0x06, 0x74, 0x01, 0x01, 0x06, 0x74, 0x00, 0x62, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x3e, 0x06, 0x74, 0x00, 0x98, 0x06, 0x74, 0x00, 0xac, 0x06, 0x74, 0x00, 0x9e, 0x06, 0x74, 0x01, 0x20, 0x06, 0x74, 0x00, 0xb4, 0x06, 0x74, 0x00, 0xcb, 0x06, 0x74, 0x01, 0x32, 0x06, 0x74, 0x01, 0x8a, 0x06, 0x74, 0x01, 0x2f, 0x06, 0x74, 0x01, 0x11, 0x06, 0x74, 0x00, 0xb4, 0x06, 0x74, 0x00, 0xcb, 0x06, 0x74, 0x01, 0x32, 0x06, 0x74, 0x01, 0x8a, 0x06, 0x74, 0x01, 0x2a, 0x06, 0x74, 0x01, 0x11, 0x06, 0x74, 0x01, 0x22, 0x06, 0x74, 0x00, 0xa6, 0x06, 0x74, 0x01, 0x35, 0x06, 0x74, 0x00, 0xcd, 0x06, 0x74, 0x01, 0x21, 0x06, 0x74, 0x00, 0xa3, 0x06, 0x74, 0x01, 0x35, 0x06, 0x74, 0x00, 0xcd, 0x06, 0x74, 0x00, 0xc2, 0x03, 0x65, 0x00, 0x9a, 0x04, 0x98, 0x00, 0x9a, 0x06, 0x74, 0x01, 0x52, 0x06, 0x74, 0x00, 0xa9, 0x03, 0x65, 0x00, 0xa2, 0x02, 0x92, 0x00, 0x9a, 0x03, 0x7b, 0x00, 0x9b, 0x05, 0x62, 0x00, 0x9a, 0x05, 0x83, 0x00, 0x76, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x8c, 0x06, 0x74, 0x00, 0x9a, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x01, 0x12, 0x06, 0x42, 0x00, 0x87, 0x06, 0x42, 0x00, 0x87, 0x06, 0x42, 0x00, 0x87, 0x06, 0x42, 0x00, 0x87, 0x06, 0x42, 0x00, 0x87, 0x06, 0x42, 0x00, 0x87, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x01, 0x35, 0x06, 0x74, 0x01, 0x35, 0x06, 0x74, 0x00, 0x5f, 0x06, 0x74, 0x00, 0xb2, 0x06, 0x74, 0x00, 0xf2, 0x03, 0xe5, 0x00, 0x70, 0x06, 0x74, 0x00, 0x6c, 0x06, 0x74, 0x00, 0x70, 0x06, 0x74, 0x01, 0x0b, 0x06, 0x74, 0x00, 0xae, 0x06, 0x74, 0x00, 0xeb, 0x06, 0x74, 0x00, 0xea, 0x06, 0x74, 0x00, 0xea, 0x06, 0x74, 0x00, 0x5a, 0x05, 0x0e, 0x00, 0x99, 0x07, 0x3b, 0x00, 0x9d, 0x07, 0xd7, 0x00, 0x91, 0x08, 0x75, 0x00, 0x9d, 0x06, 0x80, 0x00, 0x9d, 0x06, 0x08, 0x00, 0xf2, 0x06, 0x08, 0x00, 0xba, 0x06, 0x08, 0x01, 0x59, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x01, 0x58, 0x06, 0x08, 0x01, 0x58, 0x06, 0x08, 0x01, 0xc7, 0x06, 0x08, 0x01, 0x40, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x09, 0x06, 0x13, 0x00, 0xbd, 0x06, 0x08, 0x01, 0x85, 0x05, 0x46, 0x00, 0x9d, 0x05, 0x46, 0x01, 0x36, 0x05, 0x46, 0x00, 0x9e, 0x05, 0x46, 0x00, 0x9e, 0x06, 0x1e, 0x00, 0x6c, 0x05, 0x46, 0x01, 0x66, 0x05, 0x46, 0x01, 0x23, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x4d, 0x05, 0x46, 0x00, 0x9d, 0x06, 0x08, 0x00, 0x13, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x13, 0x06, 0x08, 0x00, 0x41, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x6c, 0x06, 0x08, 0x00, 0x76, 0x06, 0x08, 0x01, 0x87, 0x06, 0x08, 0x00, 0x26, 0x06, 0x08, 0x00, 0xa3, 0x06, 0x08, 0x00, 0x2f, 0x06, 0x08, 0x00, 0xa3, 0x06, 0x08, 0x00, 0x4f, 0x06, 0x08, 0x00, 0x7c, 0x06, 0x08, 0x01, 0x14, 0x06, 0x08, 0x00, 0xd5, 0x06, 0x08, 0x00, 0xe9, 0x06, 0x08, 0x00, 0x9d, 0x06, 0x08, 0x00, 0xd8, 0x06, 0x08, 0x00, 0xe2, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x01, 0x30, 0x06, 0x08, 0x00, 0xf1, 0x06, 0x08, 0x01, 0x1e, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x4a, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x4e, 0x06, 0x08, 0x00, 0x4e, 0x06, 0x08, 0x00, 0x2a, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x2b, 0x06, 0x08, 0x00, 0x2a, 0x06, 0x08, 0x00, 0x2b, 0x06, 0x08, 0x00, 0x2b, 0x06, 0x08, 0x00, 0x2b, 0x06, 0x08, 0x00, 0x2d, 0x06, 0x08, 0x00, 0x76, 0x06, 0x08, 0x00, 0x88, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0x39, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0xa8, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x64, 0x06, 0x08, 0x00, 0x96, 0x06, 0x08, 0x00, 0x96, 0x06, 0x08, 0x00, 0x90, 0x06, 0x08, 0x00, 0x90, 0x06, 0x08, 0x00, 0x63, 0x06, 0x08, 0x00, 0x63, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x4d, 0x06, 0x08, 0x00, 0x90, 0x06, 0x08, 0x00, 0xa3, 0x06, 0x08, 0x00, 0x8c, 0x06, 0x08, 0x00, 0x75, 0x06, 0x08, 0x00, 0x90, 0x06, 0x08, 0x00, 0x57, 0x06, 0x08, 0x00, 0x57, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x08, 0x00, 0x4b, 0x06, 0x74, 0x00, 0x5b, 0x06, 0x74, 0x00, 0x6d, 0x06, 0x74, 0x00, 0x6d, 0x06, 0x74, 0x00, 0x6d, 0x06, 0x74, 0x00, 0x6d, 0x06, 0x74, 0x00, 0x99, 0x06, 0x08, 0x02, 0xb7, 0x06, 0x08, 0x02, 0x6b, 0x06, 0x08, 0x01, 0xd2, 0x02, 0x52, 0x00, 0x9c, 0x02, 0x52, 0x00, 0x6c, 0x03, 0xdf, 0x00, 0x9c, 0x03, 0xdf, 0x00, 0x6c, 0x06, 0x08, 0x01, 0x1e, 0x06, 0x08, 0x01, 0x74, 0x06, 0x08, 0x01, 0x2c, 0x06, 0x08, 0x00, 0x63, 0x06, 0x08, 0x01, 0x35, 0x06, 0x08, 0x00, 0x71, 0x06, 0x08, 0x00, 0x90, 0x06, 0x08, 0x01, 0x68, 0x06, 0x08, 0x01, 0x68, 0x06, 0x08, 0x01, 0xe6, 0x06, 0x08, 0x01, 0xe6, 0x06, 0x08, 0x01, 0x8c, 0x06, 0x08, 0x01, 0xab, 0x06, 0x08, 0x01, 0x05, 0x06, 0x08, 0x01, 0x19, 0x06, 0x08, 0x01, 0x32, 0x06, 0x08, 0x01, 0x51, 0x06, 0x08, 0x02, 0x7d, 0x06, 0x08, 0x02, 0x2e, 0x06, 0x08, 0x01, 0x42, 0x06, 0x08, 0x01, 0x77, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x74, 0x00, 0x88, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x08, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0xe2, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0xe2, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0xcd, 0x06, 0x08, 0x00, 0xcd, 0x06, 0x08, 0x00, 0xcd, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x01, 0xba, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x26, 0x06, 0x08, 0x00, 0x26, 0x06, 0x08, 0x00, 0xf9, 0x06, 0x08, 0x00, 0xf9, 0x06, 0x08, 0x00, 0x72, 0x06, 0x08, 0x00, 0x72, 0x06, 0x08, 0x01, 0x1c, 0x06, 0x08, 0x00, 0x75, 0x06, 0x08, 0x00, 0x94, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x96, 0x06, 0x08, 0x00, 0x96, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0x96, 0x06, 0x08, 0x00, 0x67, 0x06, 0x08, 0x00, 0x87, 0x06, 0x08, 0x00, 0x91, 0x06, 0x08, 0x00, 0x91, 0x06, 0x08, 0x00, 0x69, 0x02, 0xcf, 0x00, 0x63, 0x02, 0xcf, 0x00, 0x47, 0x03, 0x8e, 0x00, 0x05, 0x03, 0x90, 0x00, 0x9e, 0x03, 0x90, 0x00, 0x9d, 0x02, 0xcf, 0x00, 0xa4, 0x02, 0xcf, 0x00, 0x93, 0x04, 0x01, 0x00, 0xa4, 0x04, 0x01, 0x00, 0x93, 0x06, 0x08, 0x00, 0x51, 0x06, 0x08, 0x00, 0x50, 0x06, 0x08, 0x00, 0x47, 0x06, 0x08, 0x00, 0x47, 0x08, 0x55, 0x00, 0x69, 0x0a, 0x52, 0x00, 0x5a, 0x0a, 0x52, 0x00, 0x69, 0x0a, 0x52, 0x00, 0x5a, 0x0a, 0x52, 0x00, 0x5a, 0x0a, 0x52, 0x00, 0x69, 0x0a, 0x52, 0x00, 0x5a, 0x0a, 0x52, 0x00, 0x5a, 0x0a, 0x52, 0x00, 0x69, 0x0a, 0x52, 0x00, 0x5a, 0x0a, 0x52, 0x00, 0x69, 0x0a, 0x52, 0x00, 0x69, 0x05, 0x46, 0x00, 0x00, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x03, 0x2a, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x05, 0x46, 0x01, 0x0e, 0x06, 0x08, 0x00, 0x5a, 0x06, 0x08, 0x00, 0x69, 0x06, 0x08, 0x00, 0xe6, 0x06, 0x08, 0x00, 0xe6, 0x04, 0xeb, 0x00, 0x47, 0x04, 0xeb, 0x00, 0x47, 0x05, 0x48, 0x00, 0xe6, 0x05, 0x48, 0x00, 0xe6, 0x06, 0x08, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x07, 0x33, 0x00, 0xc3, 0x03, 0x8e, 0x00, 0x05, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x07, 0x33, 0x00, 0x34, 0x07, 0x33, 0x00, 0x34, 0x07, 0x33, 0x00, 0x34, 0x09, 0x8a, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0xff, 0xc5, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x69, 0x03, 0xc0, 0x00, 0x60, 0x06, 0x08, 0x00, 0xfc, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc4, 0x06, 0x08, 0x00, 0xc4, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xc3, 0x06, 0x08, 0x00, 0xa2, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0xa2, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0x31, 0x06, 0x08, 0x00, 0x31, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x08, 0x00, 0xa2, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0xa2, 0x06, 0x08, 0x01, 0x03, 0x06, 0x08, 0x00, 0x31, 0x06, 0x08, 0x01, 0x3b, 0x06, 0x04, 0x00, 0x69, 0x06, 0x04, 0x00, 0x69, 0x06, 0x04, 0x00, 0x40, 0x06, 0x04, 0x00, 0x40, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0xcd, 0x00, 0xa7, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x05, 0x89, 0x00, 0x05, 0x06, 0xcd, 0x00, 0xa7, 0x06, 0x42, 0x00, 0x20, 0x06, 0x42, 0x00, 0x20, 0x06, 0x49, 0x00, 0x87, 0x06, 0x49, 0x00, 0x87, 0x06, 0x49, 0x00, 0x1e, 0x08, 0x0e, 0x00, 0x64, 0x06, 0x42, 0x00, 0x45, 0x06, 0x42, 0x00, 0x45, 0x04, 0x02, 0x00, 0x09, 0x02, 0x00, 0x00, 0x09, 0x04, 0x02, 0xff, 0xdc, 0x04, 0x57, 0x00, 0x09, 0x05, 0x00, 0x00, 0xb4, 0x04, 0x69, 0x00, 0x40, 0x02, 0xd2, 0xff, 0xeb, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x2b, 0x00, 0xa7, 0x04, 0xee, 0x00, 0x52, 0x03, 0xc7, 0x00, 0x4f, 0x05, 0xa0, 0x00, 0x67, 0x06, 0x36, 0x00, 0xb4, 0x04, 0xec, 0x00, 0x0e, 0x05, 0xa0, 0x00, 0x67, 0x05, 0x49, 0x00, 0x36, 0x08, 0x1f, 0x00, 0x3d, 0x06, 0xec, 0x00, 0x4d, 0x04, 0x42, 0x00, 0x5d, 0x04, 0xb6, 0x00, 0xb4, 0x04, 0x16, 0x00, 0xad, 0x04, 0xbf, 0x00, 0x64, 0x02, 0xfb, 0x00, 0x00, 0x04, 0x67, 0x00, 0x65, 0x03, 0x88, 0x00, 0x58, 0x01, 0x42, 0xff, 0xec, 0x03, 0x19, 0x00, 0x09, 0x04, 0x92, 0x00, 0x79, 0x04, 0xee, 0x00, 0x52, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x03, 0x8d, 0x00, 0xc0, 0x02, 0xa8, 0x00, 0x5b, 0x02, 0xa8, 0x00, 0x5b, 0x01, 0xd1, 0x00, 0xaf, 0x01, 0xd1, 0x00, 0xaf, 0x01, 0xd1, 0x00, 0xaf, 0x02, 0xc6, 0x00, 0x7b, 0x02, 0x90, 0x00, 0x7b, 0x03, 0x65, 0x00, 0x67, 0x03, 0x65, 0x00, 0x67, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x06, 0x52, 0xff, 0xfb, 0x05, 0x1b, 0x00, 0x31, 0x04, 0x6c, 0x00, 0x93, 0x03, 0xe4, 0x00, 0x77, 0x03, 0x88, 0x00, 0xa7, 0x03, 0xc0, 0x00, 0x63, 0x08, 0xff, 0x00, 0x0e, 0x07, 0x17, 0x00, 0x6e, 0x08, 0xa9, 0x00, 0x0e, 0x07, 0x20, 0x00, 0x6e, 0x08, 0x39, 0x00, 0x0e, 0x07, 0x10, 0x00, 0x6e, 0x06, 0xfe, 0x00, 0x0e, 0x05, 0xe3, 0x00, 0x6e, 0x06, 0xfe, 0x00, 0x0e, 0x05, 0xe3, 0x00, 0x6e, 0x06, 0xe7, 0x00, 0x0e, 0x05, 0xe3, 0x00, 0x6e, 0x05, 0x10, 0x00, 0x67, 0x03, 0xf4, 0x00, 0x72, 0x04, 0xb8, 0x00, 0x09, 0x04, 0x32, 0x00, 0x0c, 0x04, 0xe5, 0x00, 0xb4, 0x02, 0xd2, 0x00, 0xad, 0x04, 0x2f, 0x00, 0x4a, 0x03, 0x12, 0x00, 0x6c, 0x05, 0xce, 0x00, 0x09, 0x05, 0x11, 0x00, 0x09, 0x09, 0xc6, 0x00, 0x67, 0x07, 0x55, 0x00, 0x65, 0x04, 0x57, 0x00, 0x09, 0x04, 0x92, 0xff, 0xfc, 0x05, 0x48, 0x00, 0x2d, 0x05, 0x93, 0x00, 0x2d, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x92, 0x00, 0x65, 0x04, 0x5b, 0x00, 0x09, 0x04, 0x92, 0xff, 0xfc, 0x04, 0x5b, 0x00, 0x09, 0x04, 0x92, 0xff, 0xfc, 0x04, 0x02, 0x00, 0x09, 0x02, 0x00, 0x00, 0xad, 0x05, 0x4b, 0x00, 0xb4, 0x04, 0x90, 0x00, 0xa7, 0x02, 0x6d, 0x00, 0xd8, 0x02, 0xb5, 0x00, 0x90, 0x02, 0xe2, 0x01, 0x16, 0x01, 0xfa, 0x00, 0xb1, 0x04, 0xef, 0x00, 0x9d, 0x03, 0x82, 0x00, 0x45, 0x05, 0x8f, 0x00, 0xb4, 0x04, 0xcc, 0x00, 0xa7, 0x05, 0x94, 0x00, 0x03, 0x04, 0x92, 0x00, 0x03, 0x04, 0xb8, 0x00, 0x03, 0x04, 0x2b, 0x00, 0x03, 0x05, 0x62, 0x00, 0x03, 0x04, 0x90, 0x00, 0x03, 0x05, 0x00, 0x00, 0x03, 0x02, 0xf5, 0x00, 0x03, 0x04, 0x92, 0x00, 0x03, 0x03, 0xc0, 0x00, 0x03, 0x05, 0xc4, 0xff, 0xa2, 0x06, 0x96, 0x00, 0xa7, 0x04, 0x24, 0x00, 0x6b, 0x04, 0x57, 0x00, 0x3f, 0x06, 0x36, 0x00, 0xb4, 0x02, 0x1f, 0x00, 0xb4, 0x08, 0xa2, 0x00, 0x3d, 0x01, 0x89, 0x00, 0xae, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0xd9, 0x00, 0x63, 0x01, 0xe6, 0x00, 0x56, 0x01, 0xec, 0x00, 0x51, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0x89, 0x00, 0xae, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0xd9, 0x00, 0x63, 0x01, 0xe6, 0x00, 0x56, 0x01, 0xd9, 0x00, 0x63, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0x89, 0x00, 0xae, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0xd9, 0x00, 0x63, 0x01, 0xe6, 0x00, 0x56, 0x01, 0xd9, 0x00, 0x63, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0x89, 0x00, 0xae, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0xec, 0x00, 0x51, 0x01, 0xe6, 0x00, 0x56, 0x01, 0xd9, 0x00, 0x63, 0x01, 0xb6, 0x00, 0x7e, 0x01, 0x89, 0x00, 0xae, 0x01, 0xfa, 0x00, 0xc0, 0x07, 0x08, 0x00, 0x87, 0x07, 0x08, 0x00, 0x87, 0x07, 0x08, 0x00, 0x87, 0x07, 0x08, 0x00, 0x87, 0x04, 0x2d, 0x00, 0x63, 0x04, 0x2d, 0x00, 0x63, 0x04, 0x7d, 0x00, 0x63, 0x06, 0x66, 0x00, 0x63, 0x04, 0x36, 0x00, 0x63, 0x04, 0x2d, 0x00, 0x63, 0x04, 0xb3, 0x00, 0x63, 0x06, 0x59, 0x00, 0x63, 0x03, 0xff, 0x00, 0x63, 0x04, 0x2d, 0x00, 0x63, 0x08, 0x69, 0x00, 0x63, 0x04, 0x3d, 0x00, 0x63, 0x04, 0x3f, 0x00, 0x75, 0x06, 0x42, 0x00, 0x63, 0x04, 0x2d, 0x00, 0x63, 0x04, 0x3e, 0x00, 0x63, 0x06, 0x93, 0x00, 0x63, 0x04, 0x3f, 0x00, 0x75, 0x05, 0x43, 0x00, 0x63, 0x04, 0x32, 0x00, 0x2d, 0x06, 0x47, 0x00, 0x63, 0x04, 0x3e, 0x00, 0x63, 0x06, 0x71, 0x00, 0x63, 0x04, 0x3d, 0x00, 0x63, 0x04, 0x3d, 0x00, 0x63, 0x04, 0x40, 0x00, 0x75, 0x04, 0xac, 0x00, 0x64, 0x04, 0x3d, 0x00, 0x63, 0x04, 0x3e, 0x00, 0x75, 0x04, 0x4f, 0x00, 0x63, 0x04, 0x3f, 0x00, 0x75, 0x03, 0xb7, 0x00, 0x2d, 0x04, 0x2c, 0x00, 0x63, 0x04, 0x34, 0x00, 0x6c, 0x04, 0x2d, 0x00, 0x63, 0x04, 0x2d, 0x00, 0x63, 0x04, 0x2e, 0x00, 0x63, 0x04, 0x98, 0x00, 0x63, 0x06, 0xe0, 0x00, 0x63, 0x06, 0xb4, 0x00, 0x6d, 0x05, 0xd1, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xa8, 0x00, 0x5a, 0x03, 0xba, 0x00, 0x5a, 0x03, 0xba, 0x00, 0x5a, 0x03, 0xba, 0x00, 0x5a, 0x05, 0xa9, 0x00, 0x5a, 0x05, 0xa9, 0x00, 0x5a, 0x05, 0xa9, 0x00, 0x5a, 0x05, 0xa9, 0x00, 0x5a, 0x05, 0xa9, 0x00, 0x5a, 0x03, 0xef, 0x00, 0x36, 0x03, 0xef, 0x00, 0x36, 0x03, 0xef, 0x00, 0x36, 0x03, 0xef, 0x00, 0x36, 0x03, 0xef, 0x00, 0x36, 0x03, 0xef, 0x00, 0x36, 0x04, 0x67, 0x00, 0x65, 0x04, 0xf5, 0x00, 0x2a, 0x04, 0x89, 0x00, 0x2a, 0x04, 0x89, 0x00, 0x2a, 0x06, 0xf6, 0x00, 0x2a, 0x06, 0xf6, 0x00, 0x2a, 0x04, 0xf0, 0x00, 0x2a, 0x06, 0x32, 0x00, 0x63, 0x00, 0x00, 0xfc, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x62, 0x00, 0x1b, 0x05, 0x73, 0x00, 0x5a, 0x04, 0x5f, 0x00, 0xb4, 0x04, 0x0c, 0x00, 0x5a, 0x04, 0x53, 0x00, 0xb4, 0x03, 0xf3, 0x00, 0xb4, 0x03, 0xf3, 0x00, 0xb4, 0x03, 0x2a, 0x00, 0x87, 0x04, 0x80, 0x00, 0xb4, 0x06, 0x81, 0x00, 0x87, 0x02, 0x0a, 0x00, 0xb4, 0x04, 0x96, 0x00, 0xb4, 0x03, 0xef, 0x00, 0xb4, 0x0a, 0x45, 0x00, 0xb4, 0x06, 0x58, 0x00, 0xb4, 0x06, 0xa6, 0x00, 0xb4, 0x06, 0x81, 0x00, 0x87, 0x04, 0xf0, 0x00, 0xb4, 0x06, 0x40, 0x00, 0xb4, 0x04, 0x38, 0x00, 0x87, 0x04, 0x5d, 0x00, 0xb4, 0x03, 0x2d, 0x00, 0x87, 0x05, 0x03, 0x00, 0x5a, 0x04, 0x95, 0x00, 0xb4, 0x04, 0xf0, 0x00, 0x87, 0x04, 0xec, 0x00, 0x87, 0x05, 0xd4, 0x00, 0x5a, 0x03, 0xcc, 0x00, 0x87, 0x04, 0x03, 0x00, 0xb4, 0x04, 0x03, 0x00, 0xb4, 0x03, 0x2a, 0x00, 0x5a, 0x05, 0x73, 0x00, 0x5a, 0x02, 0x0a, 0x00, 0xb4, 0x05, 0x73, 0x00, 0x5a, 0x04, 0xf0, 0x00, 0x87, 0x05, 0xe3, 0x00, 0x5a, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x05, 0x55, 0x00, 0x0e, 0x05, 0x43, 0x00, 0xb4, 0x05, 0xe5, 0x00, 0xd0, 0x05, 0x40, 0x00, 0xb4, 0x04, 0xd9, 0x00, 0xb4, 0x05, 0x94, 0x00, 0x67, 0x02, 0xd3, 0x00, 0x5b, 0x02, 0xd1, 0xff, 0xa1, 0x05, 0x6a, 0x00, 0xb4, 0x04, 0xb6, 0x00, 0xb4, 0x07, 0x61, 0x00, 0xb0, 0x05, 0xaa, 0x00, 0x66, 0x04, 0x92, 0x00, 0x7a, 0x05, 0x19, 0xff, 0xfb, 0x05, 0xfa, 0x00, 0x9f, 0x05, 0x34, 0x00, 0x0e, 0x07, 0xfa, 0x00, 0x3d, 0x05, 0xcd, 0x00, 0x61, 0x05, 0x17, 0xff, 0xfd, 0x04, 0xc3, 0x00, 0x6e, 0x05, 0x19, 0x00, 0x85, 0x03, 0xf5, 0x00, 0x65, 0x05, 0x19, 0x00, 0x85, 0x04, 0x6e, 0x00, 0x63, 0x03, 0x59, 0x00, 0x2a, 0x05, 0x19, 0x00, 0x65, 0x05, 0x4e, 0x00, 0xa7, 0x02, 0x87, 0x00, 0xcf, 0x02, 0x87, 0xff, 0xdc, 0x04, 0xaf, 0x00, 0xa7, 0x02, 0x87, 0x00, 0xcf, 0x08, 0x38, 0x00, 0xa7, 0x05, 0x4e, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x05, 0x19, 0x00, 0x65, 0x05, 0x19, 0x00, 0x65, 0x03, 0x7b, 0x00, 0xa7, 0x03, 0xc0, 0x00, 0x63, 0x03, 0x59, 0x00, 0x31, 0x05, 0x52, 0x00, 0x9f, 0x04, 0x5f, 0x00, 0x36, 0x06, 0x8d, 0x00, 0x4d, 0x04, 0xdd, 0x00, 0x44, 0x04, 0x7f, 0x00, 0x36, 0x04, 0x3f, 0x00, 0x4f, 0x04, 0xec, 0x00, 0x0e, 0x04, 0xf0, 0x00, 0xb4, 0x05, 0x07, 0x00, 0x67, 0x05, 0x8b, 0x00, 0xb4, 0x04, 0x8c, 0x00, 0xb4, 0x04, 0x24, 0x00, 0xb4, 0x05, 0x94, 0x00, 0x67, 0x05, 0x6a, 0x00, 0xb4, 0x03, 0x31, 0x00, 0x87, 0x02, 0x1f, 0xff, 0xa1, 0x04, 0xb8, 0x00, 0xb4, 0x04, 0x02, 0x00, 0xb4, 0x06, 0x36, 0x00, 0xb4, 0x05, 0x62, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x04, 0x57, 0x00, 0xb4, 0x05, 0xaa, 0x00, 0x67, 0x05, 0x00, 0x00, 0xb4, 0x04, 0x92, 0x00, 0x79, 0x04, 0x65, 0xff, 0xfb, 0x05, 0x45, 0x00, 0xa0, 0x04, 0xec, 0x00, 0x0e, 0x07, 0x1e, 0x00, 0x3d, 0x04, 0xee, 0x00, 0x36, 0x04, 0x65, 0xff, 0xfd, 0x04, 0xee, 0x00, 0x52, 0x04, 0x69, 0x00, 0x6e, 0x04, 0x92, 0x00, 0xa7, 0x03, 0xf5, 0x00, 0x65, 0x04, 0x92, 0x00, 0x65, 0x04, 0x6e, 0x00, 0x65, 0x02, 0x88, 0x00, 0x2a, 0x04, 0x92, 0x00, 0x65, 0x04, 0x90, 0x00, 0xa7, 0x02, 0x00, 0x00, 0xad, 0x02, 0x00, 0xff, 0xdf, 0x04, 0x2b, 0x00, 0xa7, 0x02, 0x00, 0x00, 0xad, 0x07, 0x03, 0x00, 0xa7, 0x04, 0x90, 0x00, 0xa7, 0x04, 0x67, 0x00, 0x65, 0x04, 0x92, 0x00, 0xa7, 0x04, 0x92, 0x00, 0x65, 0x02, 0xf5, 0x00, 0xa7, 0x03, 0xc0, 0x00, 0x63, 0x02, 0xd2, 0x00, 0x31, 0x04, 0x90, 0x00, 0x9c, 0x04, 0x42, 0x00, 0x36, 0x05, 0xe3, 0x00, 0x4d, 0x04, 0x42, 0x00, 0x35, 0x04, 0x42, 0x00, 0x36, 0x03, 0xc7, 0x00, 0x4f, 0x04, 0x94, 0x00, 0x7a, 0x04, 0x94, 0x00, 0x60, 0x04, 0x94, 0x00, 0x75, 0x04, 0x94, 0x00, 0x8c, 0x04, 0x94, 0x00, 0x51, 0x04, 0x94, 0x00, 0x85, 0x04, 0x94, 0x00, 0x65, 0x04, 0x94, 0x00, 0x3a, 0x04, 0x94, 0x00, 0x7d, 0x04, 0x92, 0x00, 0x5f, 0x04, 0x94, 0x00, 0x79, 0x04, 0x94, 0x00, 0xca, 0x04, 0x94, 0x00, 0x87, 0x04, 0x94, 0x00, 0x8c, 0x04, 0x94, 0x00, 0x5a, 0x04, 0x94, 0x00, 0x8e, 0x04, 0x94, 0x00, 0x80, 0x04, 0x94, 0x00, 0x97, 0x04, 0x94, 0x00, 0x7d, 0x04, 0x94, 0x00, 0x74, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x09, 0xd1, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x05, 0xde, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x6c, 0x00, 0xc3, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x5d, 0x00, 0xb4, 0x07, 0x82, 0x00, 0x89, 0x08, 0x85, 0x00, 0x43, 0x07, 0x81, 0x00, 0x36, 0x08, 0x53, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x08, 0x69, 0x00, 0x55, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x80, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x08, 0x69, 0x00, 0x55, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x1f, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x0b, 0x8c, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x99, 0x07, 0x81, 0x00, 0x34, 0x08, 0x69, 0x00, 0x56, 0x07, 0x81, 0x00, 0x34, 0x07, 0x81, 0x00, 0x36, 0x07, 0x81, 0x00, 0x36, 0x07, 0x81, 0x00, 0x36, 0x07, 0x81, 0x00, 0x36, 0x07, 0x81, 0x00, 0x36, 0x07, 0x81, 0x00, 0x36, 0x00, 0x00, 0xff, 0xc1, 0x00, 0x00, 0xfd, 0x28, 0x00, 0x00, 0xfd, 0xb5, 0x00, 0x00, 0xfd, 0x0b, 0x00, 0x00, 0xfd, 0x58, 0x00, 0x00, 0xfd, 0x21, 0x00, 0x00, 0xfd, 0x21, 0x00, 0x00, 0xfd, 0x1a, 0x00, 0x00, 0xfd, 0x1a, 0x00, 0x00, 0xfd, 0xd8, 0x00, 0x00, 0xfd, 0x36, 0x00, 0x00, 0xfc, 0xad, 0x00, 0x87, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x01, 0x68, 0x00, 0x00, 0x07, 0x11, 0x00, 0x75, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x07, 0x74, 0x00, 0x75, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x06, 0x01, 0x00, 0x60, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x01, 0x8a, 0x00, 0x00, 0x07, 0x11, 0x00, 0x75, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x07, 0x11, 0x00, 0x75, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x04, 0xa5, 0x00, 0x8d, 0x04, 0x73, 0xff, 0xee, 0x04, 0xa5, 0xff, 0xee, 0x04, 0xa5, 0x00, 0x8d, 0x04, 0x73, 0xff, 0xee, 0x04, 0xa5, 0xff, 0xee, 0x04, 0xa5, 0x00, 0x8d, 0x04, 0x73, 0xff, 0xee, 0x04, 0xa5, 0xff, 0xee, 0x04, 0xa5, 0x00, 0x8d, 0x04, 0x73, 0xff, 0xee, 0x04, 0xa5, 0xff, 0xee, 0x03, 0x08, 0x00, 0x00, 0x05, 0x62, 0x00, 0xbf, 0x02, 0x00, 0x00, 0x0d, 0x02, 0xa3, 0xff, 0x0d, 0x04, 0xec, 0x01, 0x69, 0x04, 0xec, 0x01, 0x69, 0x04, 0xec, 0x01, 0x69, 0x04, 0xec, 0x01, 0x6a, 0x04, 0xec, 0x01, 0x6a, 0x04, 0xec, 0x01, 0x69, 0x04, 0xec, 0x01, 0x69, 0x04, 0xec, 0x01, 0x50, 0x04, 0xec, 0x01, 0x63, 0x04, 0xec, 0x01, 0x50, 0x04, 0xec, 0x01, 0x63, 0x04, 0xec, 0x01, 0x50, 0x04, 0xec, 0x01, 0x63, 0x04, 0xec, 0x01, 0x63, 0x04, 0xec, 0x01, 0x50, 0x04, 0xec, 0x01, 0x50, 0x04, 0xec, 0x01, 0x5c, 0x04, 0xec, 0x01, 0x5c, 0x04, 0xec, 0x01, 0x5c, 0x04, 0xec, 0x01, 0x63, 0x00, 0x00, 0xfc, 0xf1, 0x01, 0x0e, 0x00, 0x00, 0x03, 0xaf, 0x00, 0x00, 0x04, 0x65, 0xff, 0xb4, 0x04, 0x65, 0xff, 0xb4, 0x05, 0x73, 0x00, 0x81, 0x02, 0x31, 0xff, 0xee, 0x02, 0x62, 0xff, 0xee, 0x06, 0x00, 0x00, 0x75, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x03, 0xf9, 0xff, 0xb4, 0x02, 0x00, 0x00, 0xad, 0x03, 0xdc, 0x00, 0x82, 0x05, 0x07, 0x00, 0x65, 0x04, 0x65, 0x00, 0x65, 0x02, 0x00, 0x00, 0x87, 0x02, 0x87, 0x00, 0x47, 0x02, 0x87, 0xff, 0x2e, 0x02, 0x00, 0xff, 0xd8, 0x02, 0x00, 0x00, 0xab, 0x02, 0x6d, 0x00, 0xd8, 0x03, 0x31, 0x00, 0x87, 0x06, 0x08, 0x01, 0x82, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xc6, 0x00, 0x00, 0x00, 0xc6, 0x02, 0x01, 0x00, 0xad, 0x02, 0x01, 0xff, 0xee, 0x02, 0x01, 0xff, 0xee, 0x04, 0x1d, 0x00, 0x65, 0x04, 0x1d, 0xff, 0xee, 0x04, 0x1d, 0xff, 0xee, 0x03, 0x0d, 0x00, 0x36, 0x03, 0x0d, 0xff, 0xee, 0x03, 0x0d, 0xff, 0xee, 0x04, 0x42, 0x00, 0x36, 0x04, 0x42, 0xff, 0xee, 0x04, 0x42, 0xff, 0xee, 0x04, 0xb5, 0x00, 0xa7, 0x04, 0xb5, 0xff, 0xee, 0x04, 0xb5, 0xff, 0xee, 0x04, 0xb5, 0x00, 0xa7, 0x04, 0xb5, 0xff, 0xee, 0x04, 0xb5, 0xff, 0xee, 0x04, 0x46, 0x00, 0x65, 0x04, 0x46, 0xff, 0xee, 0x04, 0x46, 0xff, 0xee, 0x04, 0xb5, 0x00, 0xa7, 0x04, 0xb5, 0xff, 0xee, 0x04, 0xb5, 0xff, 0xee, 0x05, 0xf7, 0x00, 0x65, 0x05, 0xf7, 0xff, 0xee, 0x05, 0xf7, 0xff, 0xee, 0x03, 0x27, 0x00, 0xad, 0x03, 0x27, 0xff, 0xee, 0x03, 0x27, 0xff, 0xee, 0x03, 0x27, 0x00, 0x36, 0x03, 0x27, 0xff, 0xee, 0x03, 0x27, 0xff, 0xee, 0x04, 0x05, 0x00, 0xa7, 0x04, 0x05, 0xff, 0xee, 0x04, 0x05, 0xff, 0xee, 0x04, 0x67, 0x00, 0xad, 0x04, 0x67, 0xff, 0xee, 0x04, 0x67, 0xff, 0xee, 0x02, 0x85, 0x00, 0x36, 0x02, 0x85, 0xff, 0xee, 0x02, 0x85, 0xff, 0xee, 0x06, 0xe7, 0x00, 0xad, 0x06, 0xe7, 0xff, 0xee, 0x06, 0xe7, 0xff, 0xee, 0x03, 0x67, 0x00, 0x36, 0x03, 0x67, 0xff, 0xee, 0x03, 0x67, 0xff, 0xee, 0x05, 0xa3, 0x00, 0x36, 0x05, 0xa3, 0xff, 0xee, 0x05, 0xa3, 0xff, 0xee, 0x04, 0xb5, 0x00, 0xa7, 0x04, 0xb5, 0xff, 0xee, 0x04, 0xb5, 0xff, 0xee, 0x04, 0x80, 0x00, 0x36, 0x04, 0x80, 0xff, 0xee, 0x04, 0x80, 0xff, 0xee, 0x05, 0x48, 0x00, 0xad, 0x05, 0x48, 0xff, 0xee, 0x05, 0x48, 0xff, 0xee, 0x03, 0xd0, 0x00, 0xad, 0x03, 0xd0, 0xff, 0xee, 0x03, 0xd0, 0xff, 0xee, 0x05, 0x36, 0x00, 0x64, 0x05, 0x36, 0xff, 0xee, 0x05, 0x36, 0xff, 0xee, 0x03, 0x67, 0x00, 0x36, 0x03, 0x67, 0xff, 0xee, 0x03, 0x67, 0xff, 0xee, 0x04, 0x80, 0x00, 0x36, 0x04, 0x80, 0xff, 0xee, 0x04, 0x80, 0xff, 0xee, 0x04, 0x46, 0x00, 0x65, 0x04, 0x46, 0xff, 0xee, 0x04, 0x46, 0xff, 0xee, 0x03, 0xd0, 0x00, 0xad, 0x03, 0xd0, 0xff, 0xee, 0x03, 0xd0, 0xff, 0xee, 0x03, 0xd0, 0x00, 0xad, 0x03, 0xd0, 0xff, 0xee, 0x03, 0xd0, 0xff, 0xee, 0x03, 0xc3, 0x00, 0xad, 0x03, 0xc3, 0xff, 0xee, 0x03, 0xc3, 0xff, 0xee, 0x04, 0x46, 0x00, 0x65, 0x04, 0x46, 0xff, 0xee, 0x04, 0x46, 0xff, 0xee, 0x04, 0x46, 0x00, 0x65, 0x04, 0x46, 0xff, 0xee, 0x04, 0x46, 0xff, 0xee, 0x00, 0x00, 0xfd, 0x3b, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x74, 0x00, 0x99, 0x06, 0x07, 0x01, 0x6e, 0x05, 0x8f, 0x00, 0xb4, 0x04, 0xdf, 0x00, 0xad, 0x04, 0x90, 0x00, 0x9c, 0x03, 0xc7, 0x00, 0x70, 0x03, 0xc7, 0x00, 0x70, 0x03, 0xc7, 0x00, 0x70, 0x03, 0xc7, 0x00, 0x70, 0x03, 0xc7, 0x00, 0x70, 0x03, 0xf9, 0xff, 0xb4, 0x03, 0xf9, 0xff, 0xb4, 0x03, 0xf9, 0xff, 0xb4, 0x03, 0xf9, 0xff, 0xb4, 0x03, 0xf9, 0xff, 0xb4, 0x09, 0x2d, 0x00, 0x75, 0x06, 0x08, 0xff, 0xee, 0x06, 0x6c, 0xff, 0xee, 0x09, 0x2d, 0x00, 0x75, 0x06, 0x08, 0xff, 0xee, 0x06, 0x6c, 0xff, 0xee, 0x09, 0x2d, 0x00, 0x75, 0x06, 0x08, 0xff, 0xee, 0x06, 0x6c, 0xff, 0xee, 0x08, 0xd2, 0x00, 0x75, 0x06, 0x1d, 0xff, 0xee, 0x06, 0x3e, 0xff, 0xee, 0x08, 0xd2, 0x00, 0x75, 0x06, 0x1d, 0xff, 0xee, 0x06, 0x3e, 0xff, 0xee, 0x06, 0xd5, 0x00, 0x81, 0x05, 0xbb, 0xff, 0xee, 0x05, 0xe8, 0xff, 0xee, 0x03, 0xd5, 0x00, 0x69, 0x04, 0x4b, 0xff, 0xee, 0x03, 0x79, 0xff, 0xee, 0x07, 0x74, 0x00, 0x75, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x07, 0x74, 0x00, 0x75, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x07, 0x74, 0x00, 0x75, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x06, 0x01, 0x00, 0x60, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x06, 0x01, 0x00, 0x60, 0x03, 0x71, 0xff, 0xee, 0x03, 0xa4, 0xff, 0xee, 0x07, 0x96, 0x00, 0x75, 0x06, 0x40, 0xff, 0xee, 0x06, 0x40, 0xff, 0xee, 0x06, 0x71, 0x00, 0x75, 0x03, 0x6d, 0xff, 0xee, 0x03, 0xf9, 0xff, 0xee, 0x06, 0x11, 0x00, 0x81, 0x03, 0x6d, 0xff, 0xee, 0x03, 0xf9, 0xff, 0xee, 0x06, 0x11, 0x00, 0x81, 0x03, 0x6d, 0xff, 0xee, 0x03, 0xf9, 0xff, 0xee, 0x06, 0x71, 0x03, 0x69, 0x03, 0x6d, 0x00, 0x64, 0x03, 0xf9, 0x00, 0x64, 0x06, 0x71, 0x02, 0x1c, 0x03, 0x6d, 0x00, 0x64, 0x03, 0xf9, 0x00, 0x64, 0x06, 0x71, 0x03, 0x2a, 0x03, 0x6d, 0x00, 0x43, 0x03, 0xf9, 0x00, 0x43, 0x05, 0x73, 0x00, 0x81, 0x02, 0x31, 0xff, 0xee, 0x02, 0x62, 0xff, 0xee, 0x05, 0x73, 0x00, 0x81, 0x02, 0x31, 0xff, 0xee, 0x02, 0x62, 0xff, 0xee, 0x05, 0x73, 0x00, 0x81, 0x02, 0x31, 0xff, 0xee, 0x02, 0x62, 0xff, 0xee, 0x05, 0x7b, 0x00, 0x84, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x05, 0x7b, 0x00, 0x84, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x05, 0x7b, 0x00, 0x84, 0x02, 0x01, 0xff, 0xee, 0x02, 0x2c, 0xff, 0xee, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x3f, 0xf8, 0x00, 0x01, 0x0a, 0xa7, 0x30, 0x00, 0x00, 0x0b, 0x0f, 0xea, 0x00, 0x10, 0x00, 0x24, 0xff, 0xd3, 0x00, 0x10, 0x00, 0x25, 0xff, 0xb7, 0x00, 0x10, 0x00, 0x2a, 0x00, 0x4b, 0x00, 0x10, 0x00, 0x2d, 0x00, 0x72, 0x00, 0x10, 0x00, 0x32, 0x00, 0x39, 0x00, 0x10, 0x00, 0x34, 0x00, 0x4b, 0x00, 0x10, 0x00, 0x37, 0xff, 0x44, 0x00, 0x10, 0x00, 0x39, 0xff, 0x88, 0x00, 0x10, 0x00, 0x3a, 0xff, 0xad, 0x00, 0x10, 0x00, 0x3b, 0xff, 0x9a, 0x00, 0x10, 0x00, 0x3c, 0xff, 0x0d, 0x00, 0x10, 0x00, 0x52, 0x00, 0x26, 0x00, 0x10, 0x00, 0x59, 0xff, 0xc9, 0x00, 0x10, 0x00, 0x5c, 0xff, 0xdc, 0x00, 0x10, 0x00, 0x82, 0xff, 0xd3, 0x00, 0x10, 0x00, 0x83, 0xff, 0xd3, 0x00, 0x10, 0x00, 0x84, 0xff, 0xd3, 0x00, 0x10, 0x00, 0x85, 0xff, 0xd3, 0x00, 0x10, 0x00, 0x86, 0xff, 0xd3, 0x00, 0x10, 0x00, 0x94, 0x00, 0x39, 0x00, 0x10, 0x00, 0x95, 0x00, 0x39, 0x00, 0x10, 0x00, 0x96, 0x00, 0x39, 0x00, 0x10, 0x00, 0x97, 0x00, 0x39, 0x00, 0x10, 0x00, 0x98, 0x00, 0x39, 0x00, 0x10, 0x00, 0x9f, 0xff, 0x0d, 0x00, 0x10, 0x00, 0xb4, 0x00, 0x26, 0x00, 0x10, 0x00, 0xb5, 0x00, 0x26, 0x00, 0x10, 0x00, 0xb6, 0x00, 0x26, 0x00, 0x10, 0x00, 0xb7, 0x00, 0x26, 0x00, 0x10, 0x00, 0xb8, 0x00, 0x26, 0x00, 0x10, 0x00, 0xbf, 0xff, 0xdc, 0x00, 0x10, 0x00, 0xc1, 0xff, 0xdc, 0x00, 0x10, 0x00, 0xc2, 0xff, 0xd3, 0x00, 0x10, 0x00, 0xc4, 0xff, 0xd3, 0x00, 0x10, 0x00, 0xc6, 0xff, 0xd3, 0x00, 0x10, 0x00, 0xe0, 0x00, 0x4b, 0x00, 0x10, 0x01, 0x26, 0xff, 0x44, 0x00, 0x10, 0x01, 0x3a, 0xff, 0x0d, 0x00, 0x24, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x24, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x24, 0x00, 0x39, 0x00, 0x24, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x34, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x37, 0xff, 0x61, 0x00, 0x24, 0x00, 0x39, 0xff, 0x7d, 0x00, 0x24, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x24, 0x00, 0x3c, 0xff, 0x61, 0x00, 0x24, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x49, 0xff, 0xb7, 0x00, 0x24, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x59, 0xff, 0x88, 0x00, 0x24, 0x00, 0x5a, 0xff, 0xad, 0x00, 0x24, 0x00, 0x5c, 0xff, 0x75, 0x00, 0x24, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x24, 0x00, 0x82, 0x00, 0x39, 0x00, 0x24, 0x00, 0x83, 0x00, 0x39, 0x00, 0x24, 0x00, 0x84, 0x00, 0x39, 0x00, 0x24, 0x00, 0x85, 0x00, 0x39, 0x00, 0x24, 0x00, 0x86, 0x00, 0x39, 0x00, 0x24, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x24, 0x00, 0x9f, 0xff, 0x61, 0x00, 0x24, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xbf, 0xff, 0x75, 0x00, 0x24, 0x00, 0xc1, 0xff, 0x75, 0x00, 0x24, 0x00, 0xc2, 0x00, 0x39, 0x00, 0x24, 0x00, 0xc4, 0x00, 0x39, 0x00, 0x24, 0x00, 0xc6, 0x00, 0x39, 0x00, 0x24, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xcb, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xd3, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x24, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x11, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x13, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x24, 0xff, 0x61, 0x00, 0x24, 0x01, 0x25, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x26, 0xff, 0x61, 0x00, 0x24, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x24, 0x01, 0x36, 0xff, 0x90, 0x00, 0x24, 0x01, 0x37, 0xff, 0xad, 0x00, 0x24, 0x01, 0x38, 0xff, 0x61, 0x00, 0x24, 0x01, 0x39, 0xff, 0x75, 0x00, 0x24, 0x01, 0x3a, 0xff, 0x61, 0x00, 0x24, 0x01, 0x88, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xac, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xad, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xae, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xaf, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xdc, 0xff, 0x61, 0x00, 0x24, 0x01, 0xdd, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xf3, 0xff, 0xdc, 0x00, 0x24, 0x01, 0xf4, 0xff, 0x61, 0x00, 0x24, 0x01, 0xf5, 0xff, 0x75, 0x00, 0x24, 0x05, 0xd0, 0xff, 0x90, 0x00, 0x24, 0x05, 0xd1, 0xff, 0xad, 0x00, 0x24, 0x05, 0xd2, 0xff, 0x90, 0x00, 0x24, 0x05, 0xd3, 0xff, 0xad, 0x00, 0x24, 0x05, 0xd4, 0xff, 0x90, 0x00, 0x24, 0x05, 0xd5, 0xff, 0xad, 0x00, 0x24, 0x06, 0x42, 0xff, 0x61, 0x00, 0x24, 0x06, 0x43, 0xff, 0x75, 0x00, 0x24, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0x24, 0x07, 0x52, 0xff, 0x03, 0x00, 0x24, 0x07, 0x53, 0x00, 0x2f, 0x00, 0x25, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x36, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x39, 0xff, 0xc1, 0x00, 0x25, 0x00, 0x3a, 0xff, 0xb7, 0x00, 0x25, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x25, 0x00, 0x6d, 0xff, 0xc1, 0x00, 0x25, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x25, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x25, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x25, 0x00, 0xe4, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x1c, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x1e, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x20, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x22, 0xff, 0xdc, 0x00, 0x25, 0x01, 0x36, 0xff, 0xb7, 0x00, 0x25, 0x01, 0x38, 0xff, 0x90, 0x00, 0x25, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x25, 0x01, 0xac, 0xff, 0xdc, 0x00, 0x25, 0x01, 0xae, 0xff, 0xdc, 0x00, 0x25, 0x01, 0xda, 0xff, 0xdc, 0x00, 0x25, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x25, 0x05, 0xd0, 0xff, 0xb7, 0x00, 0x25, 0x05, 0xd2, 0xff, 0xb7, 0x00, 0x25, 0x05, 0xd4, 0xff, 0xb7, 0x00, 0x25, 0x06, 0x42, 0xff, 0x90, 0x00, 0x25, 0x07, 0x51, 0xff, 0x90, 0x00, 0x25, 0x07, 0x52, 0xff, 0x90, 0x00, 0x25, 0x07, 0x53, 0xff, 0xad, 0x00, 0x26, 0x00, 0x3c, 0xff, 0xdc, 0x00, 0x26, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x26, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x26, 0x00, 0x9f, 0xff, 0xdc, 0x00, 0x26, 0x01, 0x38, 0xff, 0xdc, 0x00, 0x26, 0x01, 0x3a, 0xff, 0xdc, 0x00, 0x26, 0x01, 0xf4, 0xff, 0xdc, 0x00, 0x26, 0x06, 0x42, 0xff, 0xdc, 0x00, 0x26, 0x07, 0x52, 0x00, 0x26, 0x00, 0x27, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x27, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x27, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x27, 0x00, 0xc2, 0xff, 0xdc, 0x00, 0x27, 0x00, 0xc4, 0xff, 0xdc, 0x00, 0x27, 0x00, 0xc6, 0xff, 0xdc, 0x00, 0x27, 0x01, 0x38, 0xff, 0x90, 0x00, 0x27, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x27, 0x01, 0xf4, 0xff, 0x90, 0x00, 0x27, 0x06, 0x42, 0xff, 0x90, 0x00, 0x27, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x27, 0x07, 0x52, 0xff, 0xc9, 0x00, 0x27, 0x07, 0x53, 0xff, 0x44, 0x00, 0x29, 0x00, 0x11, 0xfe, 0xb7, 0x00, 0x29, 0x00, 0x1d, 0xff, 0x61, 0x00, 0x29, 0x00, 0x24, 0xff, 0x44, 0x00, 0x29, 0x00, 0x36, 0xff, 0xdc, 0x00, 0x29, 0x00, 0x37, 0xff, 0xdc, 0x00, 0x29, 0x00, 0x44, 0xff, 0x44, 0x00, 0x29, 0x00, 0x48, 0xff, 0x90, 0x00, 0x29, 0x00, 0x4c, 0xff, 0x6b, 0x00, 0x29, 0x00, 0x52, 0xff, 0xb7, 0x00, 0x29, 0x00, 0x55, 0xff, 0x6b, 0x00, 0x29, 0x00, 0x58, 0xff, 0x90, 0x00, 0x29, 0x00, 0x5c, 0xff, 0x44, 0x00, 0x29, 0x00, 0x82, 0xff, 0x44, 0x00, 0x29, 0x00, 0x83, 0xff, 0x44, 0x00, 0x29, 0x00, 0x84, 0xff, 0x44, 0x00, 0x29, 0x00, 0x85, 0xff, 0x44, 0x00, 0x29, 0x00, 0x86, 0xff, 0x44, 0x00, 0x29, 0x00, 0xa2, 0xff, 0x44, 0x00, 0x29, 0x00, 0xa3, 0xff, 0x44, 0x00, 0x29, 0x00, 0xa4, 0xff, 0x44, 0x00, 0x29, 0x00, 0xa5, 0xff, 0x44, 0x00, 0x29, 0x00, 0xa6, 0xff, 0x44, 0x00, 0x29, 0x00, 0xa7, 0xff, 0x44, 0x00, 0x29, 0x00, 0xaa, 0xff, 0x90, 0x00, 0x29, 0x00, 0xab, 0xff, 0x90, 0x00, 0x29, 0x00, 0xac, 0xff, 0x90, 0x00, 0x29, 0x00, 0xad, 0xff, 0x90, 0x00, 0x29, 0x00, 0xb4, 0xff, 0xb7, 0x00, 0x29, 0x00, 0xb5, 0xff, 0xb7, 0x00, 0x29, 0x00, 0xb6, 0xff, 0xb7, 0x00, 0x29, 0x00, 0xb7, 0xff, 0xb7, 0x00, 0x29, 0x00, 0xb8, 0xff, 0xb7, 0x00, 0x29, 0x00, 0xbb, 0xff, 0x90, 0x00, 0x29, 0x00, 0xbc, 0xff, 0x90, 0x00, 0x29, 0x00, 0xbd, 0xff, 0x90, 0x00, 0x29, 0x00, 0xbe, 0xff, 0x90, 0x00, 0x29, 0x00, 0xbf, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc1, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc2, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc3, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc4, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc5, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc6, 0xff, 0x44, 0x00, 0x29, 0x00, 0xc7, 0xff, 0x44, 0x00, 0x29, 0x00, 0xd5, 0xff, 0x90, 0x00, 0x29, 0x00, 0xd7, 0xff, 0x90, 0x00, 0x29, 0x00, 0xd9, 0xff, 0x90, 0x00, 0x29, 0x00, 0xdb, 0xff, 0x90, 0x00, 0x29, 0x00, 0xdd, 0xff, 0x90, 0x00, 0x29, 0x00, 0xf1, 0xff, 0x6b, 0x00, 0x29, 0x00, 0xf5, 0xff, 0x6b, 0x00, 0x29, 0x01, 0x0f, 0xff, 0xb7, 0x00, 0x29, 0x01, 0x11, 0xff, 0xb7, 0x00, 0x29, 0x01, 0x13, 0xff, 0xb7, 0x00, 0x29, 0x01, 0x17, 0xff, 0x6b, 0x00, 0x29, 0x01, 0x19, 0xff, 0x6b, 0x00, 0x29, 0x01, 0x1b, 0xff, 0x6b, 0x00, 0x29, 0x01, 0x1c, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x1e, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x20, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x22, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x24, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x26, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x28, 0xff, 0xdc, 0x00, 0x29, 0x01, 0x2b, 0xff, 0x90, 0x00, 0x29, 0x01, 0x2d, 0xff, 0x90, 0x00, 0x29, 0x01, 0x2f, 0xff, 0x90, 0x00, 0x29, 0x01, 0x31, 0xff, 0x90, 0x00, 0x29, 0x01, 0x33, 0xff, 0x90, 0x00, 0x29, 0x01, 0x35, 0xff, 0x90, 0x00, 0x29, 0x01, 0x39, 0xff, 0x44, 0x00, 0x29, 0x01, 0xad, 0xff, 0xb7, 0x00, 0x29, 0x01, 0xaf, 0xff, 0xb7, 0x00, 0x29, 0x01, 0xda, 0xff, 0xdc, 0x00, 0x29, 0x01, 0xdc, 0xff, 0xdc, 0x00, 0x29, 0x01, 0xf1, 0xff, 0xb7, 0x00, 0x29, 0x01, 0xf5, 0xff, 0x44, 0x00, 0x29, 0x06, 0x43, 0xff, 0x44, 0x00, 0x29, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x29, 0x07, 0x53, 0xfe, 0x88, 0x00, 0x2a, 0x00, 0x37, 0xff, 0xb7, 0x00, 0x2a, 0x00, 0x3c, 0xff, 0x9a, 0x00, 0x2a, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x2a, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x2a, 0x00, 0x9f, 0xff, 0x9a, 0x00, 0x2a, 0x01, 0x26, 0xff, 0xb7, 0x00, 0x2a, 0x01, 0x3a, 0xff, 0x9a, 0x00, 0x2a, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x2a, 0x07, 0x52, 0xff, 0xd3, 0x00, 0x2a, 0x07, 0x53, 0xff, 0xc9, 0x00, 0x2b, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x2b, 0x07, 0x51, 0xff, 0xb7, 0x00, 0x2b, 0x07, 0x52, 0xff, 0xc1, 0x00, 0x2b, 0x07, 0x53, 0xff, 0xb7, 0x00, 0x2d, 0x00, 0x10, 0xff, 0xb7, 0x00, 0x2d, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x2d, 0x07, 0x51, 0xff, 0xb7, 0x00, 0x2d, 0x07, 0x52, 0xff, 0xc1, 0x00, 0x2d, 0x07, 0x53, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x10, 0xff, 0x29, 0x00, 0x2e, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x26, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x32, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x37, 0xff, 0x61, 0x00, 0x2e, 0x00, 0x38, 0xff, 0xc9, 0x00, 0x2e, 0x00, 0x3a, 0xff, 0xb7, 0x00, 0x2e, 0x00, 0x3c, 0xff, 0xb7, 0x00, 0x2e, 0x00, 0x44, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x48, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0x52, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0x58, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0x5c, 0xff, 0x6b, 0x00, 0x2e, 0x00, 0x6d, 0xff, 0x7d, 0x00, 0x2e, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0x89, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x94, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x95, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x96, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x97, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x98, 0xff, 0x90, 0x00, 0x2e, 0x00, 0x9b, 0xff, 0xc9, 0x00, 0x2e, 0x00, 0x9c, 0xff, 0xc9, 0x00, 0x2e, 0x00, 0x9d, 0xff, 0xc9, 0x00, 0x2e, 0x00, 0x9e, 0xff, 0xc9, 0x00, 0x2e, 0x00, 0x9f, 0xff, 0xb7, 0x00, 0x2e, 0x00, 0xa2, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0xa3, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0xa4, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0xa5, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0xa6, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0xa7, 0xff, 0xdc, 0x00, 0x2e, 0x00, 0xaa, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xab, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xac, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xad, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xb4, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xb5, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xb6, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xb7, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xb8, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xbb, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xbc, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xbd, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xbe, 0xff, 0x9a, 0x00, 0x2e, 0x00, 0xbf, 0xff, 0x6b, 0x00, 0x2e, 0x00, 0xc1, 0xff, 0x6b, 0x00, 0x2e, 0x00, 0xc8, 0xff, 0x90, 0x00, 0x2e, 0x00, 0xce, 0xff, 0x90, 0x00, 0x2e, 0x00, 0xdd, 0xff, 0x9a, 0x00, 0x2e, 0x01, 0x26, 0xff, 0x61, 0x00, 0x2e, 0x01, 0x30, 0xff, 0xc9, 0x00, 0x2e, 0x01, 0x31, 0xff, 0x9a, 0x00, 0x2e, 0x01, 0x3a, 0xff, 0xb7, 0x00, 0x2e, 0x07, 0x51, 0xff, 0xc1, 0x00, 0x2e, 0x07, 0x52, 0xff, 0xc1, 0x00, 0x2f, 0x00, 0x10, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0x24, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x32, 0xff, 0xb7, 0x00, 0x2f, 0x00, 0x37, 0xfe, 0xe6, 0x00, 0x2f, 0x00, 0x38, 0xff, 0x9a, 0x00, 0x2f, 0x00, 0x39, 0xff, 0x1f, 0x00, 0x2f, 0x00, 0x3a, 0xff, 0x44, 0x00, 0x2f, 0x00, 0x3c, 0xfe, 0xf0, 0x00, 0x2f, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0x58, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0x5c, 0xff, 0x44, 0x00, 0x2f, 0x00, 0x82, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x83, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x84, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x85, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x86, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x94, 0xff, 0xb7, 0x00, 0x2f, 0x00, 0x95, 0xff, 0xb7, 0x00, 0x2f, 0x00, 0x96, 0xff, 0xb7, 0x00, 0x2f, 0x00, 0x97, 0xff, 0xb7, 0x00, 0x2f, 0x00, 0x98, 0xff, 0xb7, 0x00, 0x2f, 0x00, 0x9b, 0xff, 0x9a, 0x00, 0x2f, 0x00, 0x9c, 0xff, 0x9a, 0x00, 0x2f, 0x00, 0x9d, 0xff, 0x9a, 0x00, 0x2f, 0x00, 0x9e, 0xff, 0x9a, 0x00, 0x2f, 0x00, 0x9f, 0xfe, 0xf0, 0x00, 0x2f, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xbb, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xbc, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xbd, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xbe, 0xff, 0xdc, 0x00, 0x2f, 0x00, 0xbf, 0xff, 0x44, 0x00, 0x2f, 0x00, 0xc1, 0xff, 0x44, 0x00, 0x2f, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x2f, 0x01, 0x26, 0xfe, 0xe6, 0x00, 0x2f, 0x01, 0x30, 0xff, 0x9a, 0x00, 0x2f, 0x01, 0x31, 0xff, 0xdc, 0x00, 0x2f, 0x01, 0x3a, 0xfe, 0xf0, 0x00, 0x2f, 0x07, 0x51, 0xfe, 0x61, 0x00, 0x2f, 0x07, 0x52, 0xfd, 0xe6, 0x00, 0x32, 0x00, 0x10, 0x00, 0x39, 0x00, 0x32, 0x00, 0x11, 0xff, 0xad, 0x00, 0x32, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x3b, 0xff, 0x7d, 0x00, 0x32, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x32, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x32, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x32, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x32, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x32, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x32, 0x07, 0x53, 0xff, 0x44, 0x00, 0x33, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x33, 0x00, 0x11, 0xfe, 0xc1, 0x00, 0x33, 0x00, 0x24, 0xff, 0x7d, 0x00, 0x33, 0x00, 0x3c, 0xff, 0xd3, 0x00, 0x33, 0x00, 0x44, 0xff, 0xa4, 0x00, 0x33, 0x00, 0x48, 0xff, 0xb7, 0x00, 0x33, 0x00, 0x4c, 0xff, 0xd3, 0x00, 0x33, 0x00, 0x51, 0xff, 0xdc, 0x00, 0x33, 0x00, 0x52, 0xff, 0xb7, 0x00, 0x33, 0x00, 0x55, 0xff, 0xdc, 0x00, 0x33, 0x00, 0x56, 0xff, 0xdc, 0x00, 0x33, 0x00, 0x58, 0xff, 0xdc, 0x00, 0x33, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x33, 0x00, 0x82, 0xff, 0x7d, 0x00, 0x33, 0x00, 0x83, 0xff, 0x7d, 0x00, 0x33, 0x00, 0x84, 0xff, 0x7d, 0x00, 0x33, 0x00, 0x85, 0xff, 0x7d, 0x00, 0x33, 0x00, 0x86, 0xff, 0x7d, 0x00, 0x33, 0x00, 0x9f, 0xff, 0xd3, 0x00, 0x33, 0x00, 0xa2, 0xff, 0xa4, 0x00, 0x33, 0x00, 0xa3, 0xff, 0xa4, 0x00, 0x33, 0x00, 0xa4, 0xff, 0xa4, 0x00, 0x33, 0x00, 0xa5, 0xff, 0xa4, 0x00, 0x33, 0x00, 0xa6, 0xff, 0xa4, 0x00, 0x33, 0x00, 0xa7, 0xff, 0xa4, 0x00, 0x33, 0x00, 0xaa, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xab, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xac, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xad, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xb3, 0xff, 0xdc, 0x00, 0x33, 0x00, 0xb4, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xb5, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xb6, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xb7, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xb8, 0xff, 0xb7, 0x00, 0x33, 0x00, 0xbb, 0xff, 0xdc, 0x00, 0x33, 0x00, 0xbc, 0xff, 0xdc, 0x00, 0x33, 0x00, 0xbd, 0xff, 0xdc, 0x00, 0x33, 0x00, 0xbe, 0xff, 0xdc, 0x00, 0x33, 0x00, 0xdd, 0xff, 0xb7, 0x00, 0x33, 0x01, 0x0a, 0xff, 0xdc, 0x00, 0x33, 0x01, 0x17, 0xff, 0xdc, 0x00, 0x33, 0x01, 0x1b, 0xff, 0xdc, 0x00, 0x33, 0x01, 0x21, 0xff, 0xdc, 0x00, 0x33, 0x01, 0x23, 0xff, 0xdc, 0x00, 0x33, 0x01, 0x31, 0xff, 0xdc, 0x00, 0x33, 0x01, 0x3a, 0xff, 0xd3, 0x00, 0x33, 0x07, 0x51, 0x00, 0x26, 0x00, 0x33, 0x07, 0x52, 0x00, 0x26, 0x00, 0x33, 0x07, 0x53, 0xfe, 0xb7, 0x00, 0x34, 0x00, 0x10, 0x00, 0x39, 0x00, 0x34, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x34, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x34, 0x07, 0x53, 0xff, 0x7d, 0x00, 0x35, 0x00, 0x10, 0xff, 0xad, 0x00, 0x35, 0x00, 0x11, 0xff, 0xb7, 0x00, 0x35, 0x00, 0x1d, 0xff, 0xc1, 0x00, 0x35, 0x00, 0x24, 0xff, 0xad, 0x00, 0x35, 0x00, 0x26, 0xff, 0x9a, 0x00, 0x35, 0x00, 0x37, 0xff, 0x6b, 0x00, 0x35, 0x00, 0x39, 0xff, 0x90, 0x00, 0x35, 0x00, 0x3a, 0xff, 0xad, 0x00, 0x35, 0x00, 0x3c, 0xff, 0x7d, 0x00, 0x35, 0x00, 0x44, 0xff, 0xd3, 0x00, 0x35, 0x00, 0x48, 0xff, 0xa4, 0x00, 0x35, 0x00, 0x52, 0xff, 0xa4, 0x00, 0x35, 0x00, 0x58, 0xff, 0xa4, 0x00, 0x35, 0x00, 0x5c, 0xff, 0x90, 0x00, 0x35, 0x00, 0x6d, 0xff, 0x90, 0x00, 0x35, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x35, 0x00, 0x82, 0xff, 0xad, 0x00, 0x35, 0x00, 0x83, 0xff, 0xad, 0x00, 0x35, 0x00, 0x84, 0xff, 0xad, 0x00, 0x35, 0x00, 0x85, 0xff, 0xad, 0x00, 0x35, 0x00, 0x86, 0xff, 0xad, 0x00, 0x35, 0x00, 0x89, 0xff, 0x9a, 0x00, 0x35, 0x00, 0x9f, 0xff, 0x7d, 0x00, 0x35, 0x00, 0xa2, 0xff, 0xd3, 0x00, 0x35, 0x00, 0xa3, 0xff, 0xd3, 0x00, 0x35, 0x00, 0xa4, 0xff, 0xd3, 0x00, 0x35, 0x00, 0xa5, 0xff, 0xd3, 0x00, 0x35, 0x00, 0xa6, 0xff, 0xd3, 0x00, 0x35, 0x00, 0xa7, 0xff, 0xd3, 0x00, 0x35, 0x00, 0xaa, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xab, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xac, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xad, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xb4, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xb5, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xb6, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xb7, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xb8, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xbb, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xbc, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xbd, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xbe, 0xff, 0xa4, 0x00, 0x35, 0x00, 0xbf, 0xff, 0x90, 0x00, 0x35, 0x00, 0xc1, 0xff, 0x90, 0x00, 0x35, 0x00, 0xc8, 0xff, 0x9a, 0x00, 0x35, 0x00, 0xce, 0xff, 0x9a, 0x00, 0x35, 0x00, 0xdd, 0xff, 0xa4, 0x00, 0x35, 0x01, 0x26, 0xff, 0x6b, 0x00, 0x35, 0x01, 0x31, 0xff, 0xa4, 0x00, 0x35, 0x01, 0x3a, 0xff, 0x7d, 0x00, 0x35, 0x07, 0x51, 0xff, 0x6b, 0x00, 0x35, 0x07, 0x52, 0xff, 0x7d, 0x00, 0x35, 0x07, 0x53, 0xff, 0xdc, 0x00, 0x36, 0x00, 0x24, 0x00, 0x26, 0x00, 0x36, 0x00, 0x82, 0x00, 0x26, 0x00, 0x36, 0x00, 0x83, 0x00, 0x26, 0x00, 0x36, 0x00, 0x84, 0x00, 0x26, 0x00, 0x36, 0x00, 0x85, 0x00, 0x26, 0x00, 0x36, 0x00, 0x86, 0x00, 0x26, 0x00, 0x37, 0x00, 0x10, 0xff, 0x44, 0x00, 0x37, 0x00, 0x11, 0xff, 0x0d, 0x00, 0x37, 0x00, 0x1d, 0xff, 0x1f, 0x00, 0x37, 0x00, 0x24, 0xff, 0x61, 0x00, 0x37, 0x00, 0x26, 0xff, 0x88, 0x00, 0x37, 0x00, 0x37, 0xff, 0xdc, 0x00, 0x37, 0x00, 0x44, 0xfe, 0xad, 0x00, 0x37, 0x00, 0x46, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0x48, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0x4c, 0xff, 0xc1, 0x00, 0x37, 0x00, 0x52, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0x55, 0xfe, 0xd3, 0x00, 0x37, 0x00, 0x56, 0xfe, 0xad, 0x00, 0x37, 0x00, 0x58, 0xfe, 0xc9, 0x00, 0x37, 0x00, 0x5a, 0xfe, 0xad, 0x00, 0x37, 0x00, 0x5c, 0xfe, 0xc1, 0x00, 0x37, 0x00, 0x6d, 0xff, 0x44, 0x00, 0x37, 0x00, 0x7d, 0xff, 0x90, 0x00, 0x37, 0x00, 0x82, 0xff, 0x61, 0x00, 0x37, 0x00, 0x83, 0xff, 0x61, 0x00, 0x37, 0x00, 0x84, 0xff, 0x61, 0x00, 0x37, 0x00, 0x85, 0xff, 0x61, 0x00, 0x37, 0x00, 0x86, 0xff, 0x61, 0x00, 0x37, 0x00, 0x89, 0xff, 0x88, 0x00, 0x37, 0x00, 0xa2, 0xff, 0x11, 0x00, 0x37, 0x00, 0xa3, 0xfe, 0xad, 0x00, 0x37, 0x00, 0xa4, 0xff, 0x11, 0x00, 0x37, 0x00, 0xa5, 0xff, 0x11, 0x00, 0x37, 0x00, 0xa6, 0xff, 0x11, 0x00, 0x37, 0x00, 0xa7, 0xff, 0x11, 0x00, 0x37, 0x00, 0xa9, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0xaa, 0xfe, 0xe0, 0x00, 0x37, 0x00, 0xab, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0xac, 0xfe, 0xe0, 0x00, 0x37, 0x00, 0xad, 0xfe, 0xe0, 0x00, 0x37, 0x00, 0xb4, 0xfe, 0xf4, 0x00, 0x37, 0x00, 0xb5, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0xb6, 0xfe, 0xf4, 0x00, 0x37, 0x00, 0xb7, 0xfe, 0xf4, 0x00, 0x37, 0x00, 0xb8, 0xfe, 0xf4, 0x00, 0x37, 0x00, 0xbb, 0xfe, 0xe7, 0x00, 0x37, 0x00, 0xbc, 0xfe, 0xc9, 0x00, 0x37, 0x00, 0xbd, 0xfe, 0xe7, 0x00, 0x37, 0x00, 0xbe, 0xfe, 0xe7, 0x00, 0x37, 0x00, 0xbf, 0xfe, 0xc1, 0x00, 0x37, 0x00, 0xc1, 0xfe, 0xc1, 0x00, 0x37, 0x00, 0xc8, 0xff, 0x88, 0x00, 0x37, 0x00, 0xc9, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0xce, 0xff, 0x88, 0x00, 0x37, 0x00, 0xcf, 0xfe, 0xa4, 0x00, 0x37, 0x00, 0xdd, 0xfe, 0xa4, 0x00, 0x37, 0x01, 0x17, 0xfe, 0xd3, 0x00, 0x37, 0x01, 0x1b, 0xfe, 0xd3, 0x00, 0x37, 0x01, 0x21, 0xfe, 0xad, 0x00, 0x37, 0x01, 0x23, 0xfe, 0xad, 0x00, 0x37, 0x01, 0x26, 0xff, 0xdc, 0x00, 0x37, 0x01, 0x31, 0xfe, 0xc9, 0x00, 0x37, 0x07, 0x52, 0xff, 0xd3, 0x00, 0x37, 0x07, 0x53, 0xfe, 0xf8, 0x00, 0x38, 0x00, 0x3d, 0xff, 0xdc, 0x00, 0x38, 0x01, 0x3f, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x10, 0xff, 0x88, 0x00, 0x39, 0x00, 0x11, 0xfe, 0xf8, 0x00, 0x39, 0x00, 0x1d, 0xff, 0x59, 0x00, 0x39, 0x00, 0x24, 0xff, 0x7d, 0x00, 0x39, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x44, 0xff, 0x61, 0x00, 0x39, 0x00, 0x48, 0xff, 0x61, 0x00, 0x39, 0x00, 0x4c, 0xff, 0xd3, 0x00, 0x39, 0x00, 0x52, 0xff, 0x61, 0x00, 0x39, 0x00, 0x58, 0xff, 0x75, 0x00, 0x39, 0x00, 0x5c, 0xff, 0xc9, 0x00, 0x39, 0x00, 0x6d, 0xff, 0x4e, 0x00, 0x39, 0x00, 0x7d, 0xff, 0x90, 0x00, 0x39, 0x00, 0x82, 0xff, 0x7d, 0x00, 0x39, 0x00, 0x83, 0xff, 0x7d, 0x00, 0x39, 0x00, 0x84, 0xff, 0x7d, 0x00, 0x39, 0x00, 0x85, 0xff, 0x7d, 0x00, 0x39, 0x00, 0x86, 0xff, 0x7d, 0x00, 0x39, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x39, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x39, 0x00, 0xa2, 0xff, 0x61, 0x00, 0x39, 0x00, 0xa3, 0xff, 0x61, 0x00, 0x39, 0x00, 0xa4, 0xff, 0x61, 0x00, 0x39, 0x00, 0xa5, 0xff, 0x61, 0x00, 0x39, 0x00, 0xa6, 0xff, 0x61, 0x00, 0x39, 0x00, 0xa7, 0xff, 0x61, 0x00, 0x39, 0x00, 0xaa, 0xff, 0x61, 0x00, 0x39, 0x00, 0xab, 0xff, 0x61, 0x00, 0x39, 0x00, 0xac, 0xff, 0x61, 0x00, 0x39, 0x00, 0xad, 0xff, 0x61, 0x00, 0x39, 0x00, 0xb4, 0xff, 0x61, 0x00, 0x39, 0x00, 0xb5, 0xff, 0x61, 0x00, 0x39, 0x00, 0xb6, 0xff, 0x61, 0x00, 0x39, 0x00, 0xb7, 0xff, 0x61, 0x00, 0x39, 0x00, 0xb8, 0xff, 0x61, 0x00, 0x39, 0x00, 0xbb, 0xff, 0x75, 0x00, 0x39, 0x00, 0xbc, 0xff, 0x75, 0x00, 0x39, 0x00, 0xbd, 0xff, 0x75, 0x00, 0x39, 0x00, 0xbe, 0xff, 0x75, 0x00, 0x39, 0x00, 0xbf, 0xff, 0xc9, 0x00, 0x39, 0x00, 0xc1, 0xff, 0xc9, 0x00, 0x39, 0x00, 0xdd, 0xff, 0x61, 0x00, 0x39, 0x01, 0x31, 0xff, 0x75, 0x00, 0x39, 0x07, 0x53, 0xfe, 0xe6, 0x00, 0x3a, 0x00, 0x10, 0xff, 0xad, 0x00, 0x3a, 0x00, 0x11, 0xff, 0x15, 0x00, 0x3a, 0x00, 0x1d, 0xff, 0x88, 0x00, 0x3a, 0x00, 0x24, 0xff, 0x90, 0x00, 0x3a, 0x00, 0x44, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0x48, 0xff, 0x88, 0x00, 0x3a, 0x00, 0x4c, 0xff, 0xd3, 0x00, 0x3a, 0x00, 0x52, 0xff, 0x88, 0x00, 0x3a, 0x00, 0x55, 0xff, 0xa4, 0x00, 0x3a, 0x00, 0x58, 0xff, 0xb7, 0x00, 0x3a, 0x00, 0x5c, 0xff, 0xdc, 0x00, 0x3a, 0x00, 0x6d, 0xff, 0x90, 0x00, 0x3a, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x3a, 0x00, 0x82, 0xff, 0x90, 0x00, 0x3a, 0x00, 0x83, 0xff, 0x90, 0x00, 0x3a, 0x00, 0x84, 0xff, 0x90, 0x00, 0x3a, 0x00, 0x85, 0xff, 0x90, 0x00, 0x3a, 0x00, 0x86, 0xff, 0x90, 0x00, 0x3a, 0x00, 0xa2, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0xa3, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0xa4, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0xa5, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0xa6, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0xa7, 0xff, 0x7d, 0x00, 0x3a, 0x00, 0xaa, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xab, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xac, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xad, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xb4, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xb5, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xb6, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xb7, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xb8, 0xff, 0x88, 0x00, 0x3a, 0x00, 0xbb, 0xff, 0xb7, 0x00, 0x3a, 0x00, 0xbc, 0xff, 0xb7, 0x00, 0x3a, 0x00, 0xbd, 0xff, 0xb7, 0x00, 0x3a, 0x00, 0xbe, 0xff, 0xb7, 0x00, 0x3a, 0x00, 0xbf, 0xff, 0xdc, 0x00, 0x3a, 0x00, 0xc1, 0xff, 0xdc, 0x00, 0x3a, 0x00, 0xdd, 0xff, 0x88, 0x00, 0x3a, 0x01, 0x17, 0xff, 0xa4, 0x00, 0x3a, 0x01, 0x1b, 0xff, 0xa4, 0x00, 0x3a, 0x01, 0x31, 0xff, 0xb7, 0x00, 0x3a, 0x07, 0x51, 0xff, 0xdc, 0x00, 0x3a, 0x07, 0x53, 0xfe, 0xf8, 0x00, 0x3b, 0x00, 0x10, 0xff, 0x9a, 0x00, 0x3b, 0x00, 0x26, 0xff, 0x6b, 0x00, 0x3b, 0x00, 0x32, 0xff, 0x7d, 0x00, 0x3b, 0x00, 0x37, 0xff, 0xdc, 0x00, 0x3b, 0x00, 0x48, 0xff, 0xa4, 0x00, 0x3b, 0x00, 0x6d, 0xff, 0x90, 0x00, 0x3b, 0x00, 0x89, 0xff, 0x6b, 0x00, 0x3b, 0x00, 0x94, 0xff, 0x7d, 0x00, 0x3b, 0x00, 0x95, 0xff, 0x7d, 0x00, 0x3b, 0x00, 0x96, 0xff, 0x7d, 0x00, 0x3b, 0x00, 0x97, 0xff, 0x7d, 0x00, 0x3b, 0x00, 0x98, 0xff, 0x7d, 0x00, 0x3b, 0x00, 0xaa, 0xff, 0xa4, 0x00, 0x3b, 0x00, 0xab, 0xff, 0xa4, 0x00, 0x3b, 0x00, 0xac, 0xff, 0xa4, 0x00, 0x3b, 0x00, 0xad, 0xff, 0xa4, 0x00, 0x3b, 0x00, 0xc8, 0xff, 0x6b, 0x00, 0x3b, 0x00, 0xce, 0xff, 0x6b, 0x00, 0x3b, 0x00, 0xdd, 0xff, 0xa4, 0x00, 0x3b, 0x01, 0x26, 0xff, 0xdc, 0x00, 0x3b, 0x07, 0x51, 0xff, 0x61, 0x00, 0x3b, 0x07, 0x52, 0xff, 0xad, 0x00, 0x3b, 0x07, 0x53, 0xff, 0xd3, 0x00, 0x3c, 0x00, 0x10, 0xff, 0x0d, 0x00, 0x3c, 0x00, 0x11, 0xfe, 0x61, 0x00, 0x3c, 0x00, 0x1d, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0x24, 0xff, 0x61, 0x00, 0x3c, 0x00, 0x26, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x32, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x44, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0x48, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0x4c, 0xff, 0xb7, 0x00, 0x3c, 0x00, 0x52, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0x58, 0xff, 0x15, 0x00, 0x3c, 0x00, 0x6d, 0xff, 0x1f, 0x00, 0x3c, 0x00, 0x7d, 0xff, 0x6b, 0x00, 0x3c, 0x00, 0x82, 0xff, 0x61, 0x00, 0x3c, 0x00, 0x83, 0xff, 0x61, 0x00, 0x3c, 0x00, 0x84, 0xff, 0x61, 0x00, 0x3c, 0x00, 0x85, 0xff, 0x61, 0x00, 0x3c, 0x00, 0x86, 0xff, 0x61, 0x00, 0x3c, 0x00, 0x89, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x94, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x95, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x96, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x97, 0xff, 0x90, 0x00, 0x3c, 0x00, 0x98, 0xff, 0x90, 0x00, 0x3c, 0x00, 0xa2, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0xa3, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0xa4, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0xa5, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0xa6, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0xa7, 0xfe, 0xe6, 0x00, 0x3c, 0x00, 0xaa, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xab, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xac, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xad, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xb4, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xb5, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xb6, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xb7, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xb8, 0xfe, 0xf0, 0x00, 0x3c, 0x00, 0xbb, 0xff, 0x15, 0x00, 0x3c, 0x00, 0xbc, 0xff, 0x15, 0x00, 0x3c, 0x00, 0xbd, 0xff, 0x15, 0x00, 0x3c, 0x00, 0xbe, 0xff, 0x15, 0x00, 0x3c, 0x00, 0xc8, 0xff, 0x90, 0x00, 0x3c, 0x00, 0xce, 0xff, 0x90, 0x00, 0x3c, 0x00, 0xdd, 0xfe, 0xf0, 0x00, 0x3c, 0x01, 0x31, 0xff, 0x15, 0x00, 0x3c, 0x07, 0x51, 0xff, 0x90, 0x00, 0x3c, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x3c, 0x07, 0x53, 0xfe, 0xf8, 0x00, 0x3d, 0x00, 0x10, 0xff, 0xdc, 0x00, 0x3d, 0x07, 0x51, 0xff, 0xdc, 0x00, 0x3d, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x3d, 0x07, 0x53, 0xff, 0xdc, 0x00, 0x48, 0x00, 0x5b, 0xff, 0xdc, 0x00, 0x49, 0x00, 0x10, 0xff, 0x90, 0x00, 0x49, 0x00, 0x11, 0xff, 0x6b, 0x00, 0x49, 0x00, 0x1d, 0xff, 0xb7, 0x00, 0x49, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x49, 0x00, 0x5a, 0xff, 0xdc, 0x00, 0x49, 0x00, 0x5c, 0xff, 0xdc, 0x00, 0x49, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x49, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x49, 0x00, 0xbf, 0xff, 0xdc, 0x00, 0x49, 0x00, 0xc1, 0xff, 0xdc, 0x00, 0x49, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x49, 0x07, 0x51, 0x00, 0x41, 0x00, 0x49, 0x07, 0x53, 0xff, 0x15, 0x00, 0x4e, 0x00, 0x44, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0x48, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0x52, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0x58, 0xff, 0xc1, 0x00, 0x4e, 0x00, 0x5c, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xa2, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0xa3, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0xa4, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0xa5, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0xa6, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0xa7, 0xff, 0xdc, 0x00, 0x4e, 0x00, 0xaa, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xab, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xac, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xad, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xb4, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xb5, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xb6, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xb7, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xb8, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xbb, 0xff, 0xc1, 0x00, 0x4e, 0x00, 0xbc, 0xff, 0xc1, 0x00, 0x4e, 0x00, 0xbd, 0xff, 0xc1, 0x00, 0x4e, 0x00, 0xbe, 0xff, 0xc1, 0x00, 0x4e, 0x00, 0xbf, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xc1, 0xff, 0xb7, 0x00, 0x4e, 0x00, 0xdd, 0xff, 0xb7, 0x00, 0x4e, 0x01, 0x31, 0xff, 0xc1, 0x00, 0x51, 0x07, 0x51, 0xff, 0x6b, 0x00, 0x51, 0x07, 0x52, 0xff, 0x90, 0x00, 0x51, 0x07, 0x53, 0xff, 0xa4, 0x00, 0x52, 0x00, 0x10, 0x00, 0x26, 0x00, 0x52, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x52, 0x00, 0x5b, 0xff, 0xc1, 0x00, 0x52, 0x07, 0x51, 0xff, 0x6b, 0x00, 0x52, 0x07, 0x52, 0xff, 0xb7, 0x00, 0x52, 0x07, 0x53, 0xff, 0x7d, 0x00, 0x55, 0x00, 0x10, 0xff, 0x7d, 0x00, 0x55, 0x00, 0x11, 0xff, 0x44, 0x00, 0x55, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x46, 0xff, 0xd3, 0x00, 0x55, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x48, 0xff, 0xd3, 0x00, 0x55, 0x00, 0x4a, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x4b, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x50, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x51, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x52, 0xff, 0xd3, 0x00, 0x55, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x55, 0xff, 0xdc, 0x00, 0x55, 0x00, 0x5b, 0xff, 0xc9, 0x00, 0x55, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x55, 0x00, 0xa9, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xaa, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xab, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xac, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xad, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xb3, 0xff, 0xdc, 0x00, 0x55, 0x00, 0xb4, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xb5, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xb6, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xb7, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xb8, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xc9, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xcf, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xd1, 0x00, 0x48, 0x00, 0x55, 0x00, 0xdd, 0xff, 0xd3, 0x00, 0x55, 0x00, 0xe1, 0xff, 0xdc, 0x00, 0x55, 0x01, 0x0a, 0xff, 0xdc, 0x00, 0x55, 0x01, 0x17, 0xff, 0xdc, 0x00, 0x55, 0x01, 0x1b, 0xff, 0xdc, 0x00, 0x55, 0x07, 0x52, 0x00, 0x56, 0x00, 0x55, 0x07, 0x53, 0xfe, 0xc9, 0x00, 0x59, 0x00, 0x10, 0xff, 0xc9, 0x00, 0x59, 0x00, 0x11, 0xff, 0x61, 0x00, 0x59, 0x00, 0x1d, 0xff, 0x90, 0x00, 0x59, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x59, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x59, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x59, 0x07, 0x53, 0xfe, 0xf0, 0x00, 0x5a, 0x00, 0x11, 0xff, 0x44, 0x00, 0x5a, 0x00, 0x1d, 0xff, 0x90, 0x00, 0x5a, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x5a, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x5a, 0x07, 0x53, 0xff, 0x29, 0x00, 0x5b, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x5b, 0x00, 0x48, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0x52, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x5b, 0x00, 0xaa, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xab, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xac, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xad, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xb4, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xb5, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xb6, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xb7, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xb8, 0xff, 0xc1, 0x00, 0x5b, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x5b, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x5b, 0x00, 0xdd, 0xff, 0xc1, 0x00, 0x5c, 0x00, 0x10, 0xff, 0xdc, 0x00, 0x5c, 0x00, 0x11, 0xfe, 0xdc, 0x00, 0x5c, 0x00, 0x1d, 0xff, 0x6b, 0x00, 0x5c, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x5c, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x5c, 0x07, 0x53, 0xfe, 0xd3, 0x00, 0x6d, 0x00, 0x25, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x27, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x2d, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x37, 0xff, 0x90, 0x00, 0x6d, 0x00, 0x39, 0xff, 0x90, 0x00, 0x6d, 0x00, 0x3a, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x3c, 0xff, 0x6b, 0x00, 0x6d, 0x00, 0x59, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x5a, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x5c, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x88, 0x00, 0x97, 0x00, 0x6d, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0x9f, 0xff, 0x6b, 0x00, 0x6d, 0x00, 0xbf, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0xc1, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0xd0, 0xff, 0xdc, 0x00, 0x6d, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x6d, 0x01, 0x26, 0xff, 0x90, 0x00, 0x6d, 0x01, 0x3a, 0xff, 0x6b, 0x00, 0x7d, 0x00, 0x24, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x25, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x27, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x2d, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x37, 0xff, 0x44, 0x00, 0x7d, 0x00, 0x39, 0xff, 0x4e, 0x00, 0x7d, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x7d, 0x00, 0x3b, 0xff, 0x90, 0x00, 0x7d, 0x00, 0x3c, 0xff, 0x1f, 0x00, 0x7d, 0x00, 0x59, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x5a, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x5c, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x82, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x83, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x84, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x85, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x86, 0xff, 0xb7, 0x00, 0x7d, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0x9f, 0xff, 0x1f, 0x00, 0x7d, 0x00, 0xbf, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0xc1, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x7d, 0x00, 0xd0, 0xff, 0xdc, 0x00, 0x7d, 0x01, 0x26, 0xff, 0x44, 0x00, 0x7d, 0x01, 0x3a, 0xff, 0x1f, 0x00, 0x82, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x82, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x24, 0x00, 0x39, 0x00, 0x82, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x34, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x37, 0xff, 0x61, 0x00, 0x82, 0x00, 0x39, 0xff, 0x7d, 0x00, 0x82, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x82, 0x00, 0x3c, 0xff, 0x61, 0x00, 0x82, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x49, 0xff, 0xb7, 0x00, 0x82, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x59, 0xff, 0x88, 0x00, 0x82, 0x00, 0x5a, 0xff, 0xad, 0x00, 0x82, 0x00, 0x5c, 0xff, 0x75, 0x00, 0x82, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x82, 0x00, 0x82, 0x00, 0x39, 0x00, 0x82, 0x00, 0x83, 0x00, 0x39, 0x00, 0x82, 0x00, 0x84, 0x00, 0x39, 0x00, 0x82, 0x00, 0x85, 0x00, 0x39, 0x00, 0x82, 0x00, 0x86, 0x00, 0x39, 0x00, 0x82, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x82, 0x00, 0x9f, 0xff, 0x61, 0x00, 0x82, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xbf, 0xff, 0x75, 0x00, 0x82, 0x00, 0xc1, 0xff, 0x75, 0x00, 0x82, 0x00, 0xc2, 0x00, 0x39, 0x00, 0x82, 0x00, 0xc4, 0x00, 0x39, 0x00, 0x82, 0x00, 0xc6, 0x00, 0x39, 0x00, 0x82, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x82, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x11, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x13, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x24, 0xff, 0x61, 0x00, 0x82, 0x01, 0x25, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x26, 0xff, 0x61, 0x00, 0x82, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x82, 0x01, 0x36, 0xff, 0x90, 0x00, 0x82, 0x01, 0x37, 0xff, 0xad, 0x00, 0x82, 0x01, 0x38, 0xff, 0x61, 0x00, 0x82, 0x01, 0x39, 0xff, 0x75, 0x00, 0x82, 0x01, 0x3a, 0xff, 0x61, 0x00, 0x82, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x82, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0x82, 0x05, 0xd0, 0xff, 0x90, 0x00, 0x82, 0x05, 0xd3, 0xff, 0xad, 0x00, 0x82, 0x05, 0xd4, 0xff, 0x90, 0x00, 0x82, 0x05, 0xd5, 0xff, 0xad, 0x00, 0x82, 0x06, 0x42, 0xff, 0x61, 0x00, 0x82, 0x06, 0x43, 0xff, 0x75, 0x00, 0x82, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0x82, 0x07, 0x52, 0xff, 0x03, 0x00, 0x82, 0x07, 0x53, 0x00, 0x2f, 0x00, 0x83, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x83, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x24, 0x00, 0x39, 0x00, 0x83, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x34, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x37, 0xff, 0x61, 0x00, 0x83, 0x00, 0x39, 0xff, 0x7d, 0x00, 0x83, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x83, 0x00, 0x3c, 0xff, 0x61, 0x00, 0x83, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x49, 0xff, 0xb7, 0x00, 0x83, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x59, 0xff, 0x88, 0x00, 0x83, 0x00, 0x5a, 0xff, 0xad, 0x00, 0x83, 0x00, 0x5c, 0xff, 0x75, 0x00, 0x83, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x83, 0x00, 0x82, 0x00, 0x39, 0x00, 0x83, 0x00, 0x83, 0x00, 0x39, 0x00, 0x83, 0x00, 0x84, 0x00, 0x39, 0x00, 0x83, 0x00, 0x85, 0x00, 0x39, 0x00, 0x83, 0x00, 0x86, 0x00, 0x39, 0x00, 0x83, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x83, 0x00, 0x9f, 0xff, 0x61, 0x00, 0x83, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xbf, 0xff, 0x75, 0x00, 0x83, 0x00, 0xc1, 0xff, 0x75, 0x00, 0x83, 0x00, 0xc2, 0x00, 0x39, 0x00, 0x83, 0x00, 0xc4, 0x00, 0x39, 0x00, 0x83, 0x00, 0xc6, 0x00, 0x39, 0x00, 0x83, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x83, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x11, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x13, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x24, 0xff, 0x61, 0x00, 0x83, 0x01, 0x25, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x26, 0xff, 0x61, 0x00, 0x83, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x83, 0x01, 0x36, 0xff, 0x90, 0x00, 0x83, 0x01, 0x37, 0xff, 0xad, 0x00, 0x83, 0x01, 0x38, 0xff, 0x61, 0x00, 0x83, 0x01, 0x39, 0xff, 0x75, 0x00, 0x83, 0x01, 0x3a, 0xff, 0x61, 0x00, 0x83, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x83, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0x83, 0x05, 0xd0, 0xff, 0x90, 0x00, 0x83, 0x05, 0xd2, 0xff, 0x90, 0x00, 0x83, 0x05, 0xd3, 0xff, 0xad, 0x00, 0x83, 0x05, 0xd4, 0xff, 0x90, 0x00, 0x83, 0x05, 0xd5, 0xff, 0xad, 0x00, 0x83, 0x06, 0x42, 0xff, 0x61, 0x00, 0x83, 0x06, 0x43, 0xff, 0x75, 0x00, 0x83, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0x83, 0x07, 0x52, 0xff, 0x03, 0x00, 0x83, 0x07, 0x53, 0x00, 0x2f, 0x00, 0x84, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x84, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x24, 0x00, 0x39, 0x00, 0x84, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x34, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x37, 0xff, 0x61, 0x00, 0x84, 0x00, 0x39, 0xff, 0x7d, 0x00, 0x84, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x84, 0x00, 0x3c, 0xff, 0x61, 0x00, 0x84, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x49, 0xff, 0xb7, 0x00, 0x84, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x59, 0xff, 0x88, 0x00, 0x84, 0x00, 0x5a, 0xff, 0xad, 0x00, 0x84, 0x00, 0x5c, 0xff, 0x75, 0x00, 0x84, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x84, 0x00, 0x82, 0x00, 0x39, 0x00, 0x84, 0x00, 0x83, 0x00, 0x39, 0x00, 0x84, 0x00, 0x84, 0x00, 0x39, 0x00, 0x84, 0x00, 0x85, 0x00, 0x39, 0x00, 0x84, 0x00, 0x86, 0x00, 0x39, 0x00, 0x84, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x84, 0x00, 0x9f, 0xff, 0x61, 0x00, 0x84, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xbf, 0xff, 0x75, 0x00, 0x84, 0x00, 0xc1, 0xff, 0x75, 0x00, 0x84, 0x00, 0xc2, 0x00, 0x39, 0x00, 0x84, 0x00, 0xc4, 0x00, 0x39, 0x00, 0x84, 0x00, 0xc6, 0x00, 0x39, 0x00, 0x84, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x84, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x11, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x13, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x24, 0xff, 0x61, 0x00, 0x84, 0x01, 0x25, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x26, 0xff, 0x61, 0x00, 0x84, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x84, 0x01, 0x36, 0xff, 0x90, 0x00, 0x84, 0x01, 0x37, 0xff, 0xad, 0x00, 0x84, 0x01, 0x38, 0xff, 0x61, 0x00, 0x84, 0x01, 0x39, 0xff, 0x75, 0x00, 0x84, 0x01, 0x3a, 0xff, 0x61, 0x00, 0x84, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x84, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0x84, 0x05, 0xd0, 0xff, 0x90, 0x00, 0x84, 0x05, 0xd2, 0xff, 0x90, 0x00, 0x84, 0x05, 0xd3, 0xff, 0xad, 0x00, 0x84, 0x05, 0xd4, 0xff, 0x90, 0x00, 0x84, 0x05, 0xd5, 0xff, 0xad, 0x00, 0x84, 0x06, 0x42, 0xff, 0x61, 0x00, 0x84, 0x06, 0x43, 0xff, 0x75, 0x00, 0x84, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0x84, 0x07, 0x52, 0xff, 0x03, 0x00, 0x84, 0x07, 0x53, 0x00, 0x2f, 0x00, 0x85, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x85, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x24, 0x00, 0x39, 0x00, 0x85, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x34, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x37, 0xff, 0x61, 0x00, 0x85, 0x00, 0x39, 0xff, 0x7d, 0x00, 0x85, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x85, 0x00, 0x3c, 0xff, 0x61, 0x00, 0x85, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x49, 0xff, 0xb7, 0x00, 0x85, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x59, 0xff, 0x88, 0x00, 0x85, 0x00, 0x5a, 0xff, 0xad, 0x00, 0x85, 0x00, 0x5c, 0xff, 0x75, 0x00, 0x85, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x85, 0x00, 0x82, 0x00, 0x39, 0x00, 0x85, 0x00, 0x83, 0x00, 0x39, 0x00, 0x85, 0x00, 0x84, 0x00, 0x39, 0x00, 0x85, 0x00, 0x85, 0x00, 0x39, 0x00, 0x85, 0x00, 0x86, 0x00, 0x39, 0x00, 0x85, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x85, 0x00, 0x9f, 0xff, 0x61, 0x00, 0x85, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xbf, 0xff, 0x75, 0x00, 0x85, 0x00, 0xc1, 0xff, 0x75, 0x00, 0x85, 0x00, 0xc2, 0x00, 0x39, 0x00, 0x85, 0x00, 0xc4, 0x00, 0x39, 0x00, 0x85, 0x00, 0xc6, 0x00, 0x39, 0x00, 0x85, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x85, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x11, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x13, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x24, 0xff, 0x61, 0x00, 0x85, 0x01, 0x25, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x26, 0xff, 0x61, 0x00, 0x85, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x85, 0x01, 0x36, 0xff, 0x90, 0x00, 0x85, 0x01, 0x37, 0xff, 0xad, 0x00, 0x85, 0x01, 0x38, 0xff, 0x61, 0x00, 0x85, 0x01, 0x39, 0xff, 0x75, 0x00, 0x85, 0x01, 0x3a, 0xff, 0x61, 0x00, 0x85, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x85, 0x05, 0xd0, 0xff, 0x90, 0x00, 0x85, 0x05, 0xd2, 0xff, 0x90, 0x00, 0x85, 0x05, 0xd3, 0xff, 0xad, 0x00, 0x85, 0x05, 0xd4, 0xff, 0x90, 0x00, 0x85, 0x05, 0xd5, 0xff, 0xad, 0x00, 0x85, 0x06, 0x42, 0xff, 0x61, 0x00, 0x85, 0x06, 0x43, 0xff, 0x75, 0x00, 0x85, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0x85, 0x07, 0x52, 0xff, 0x03, 0x00, 0x85, 0x07, 0x53, 0x00, 0x2f, 0x00, 0x86, 0x00, 0x10, 0xff, 0xd3, 0x00, 0x86, 0x00, 0x11, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x24, 0x00, 0x39, 0x00, 0x86, 0x00, 0x26, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x32, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x34, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x37, 0xff, 0x61, 0x00, 0x86, 0x00, 0x39, 0xff, 0x7d, 0x00, 0x86, 0x00, 0x3a, 0xff, 0x90, 0x00, 0x86, 0x00, 0x3c, 0xff, 0x61, 0x00, 0x86, 0x00, 0x46, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x47, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x48, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x49, 0xff, 0xb7, 0x00, 0x86, 0x00, 0x52, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x54, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x57, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x59, 0xff, 0x88, 0x00, 0x86, 0x00, 0x5a, 0xff, 0xad, 0x00, 0x86, 0x00, 0x5c, 0xff, 0x75, 0x00, 0x86, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0x86, 0x00, 0x82, 0x00, 0x39, 0x00, 0x86, 0x00, 0x83, 0x00, 0x39, 0x00, 0x86, 0x00, 0x84, 0x00, 0x39, 0x00, 0x86, 0x00, 0x85, 0x00, 0x39, 0x00, 0x86, 0x00, 0x86, 0x00, 0x39, 0x00, 0x86, 0x00, 0x89, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x94, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x95, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x96, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x97, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x98, 0xff, 0xdc, 0x00, 0x86, 0x00, 0x9f, 0xff, 0x61, 0x00, 0x86, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xab, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xac, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xad, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xbf, 0xff, 0x75, 0x00, 0x86, 0x00, 0xc1, 0xff, 0x75, 0x00, 0x86, 0x00, 0xc2, 0x00, 0x39, 0x00, 0x86, 0x00, 0xc4, 0x00, 0x39, 0x00, 0x86, 0x00, 0xc6, 0x00, 0x39, 0x00, 0x86, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xc9, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xca, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xce, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xcf, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xde, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xe0, 0xff, 0xdc, 0x00, 0x86, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x10, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x11, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x12, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x13, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x24, 0xff, 0x61, 0x00, 0x86, 0x01, 0x25, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x26, 0xff, 0x61, 0x00, 0x86, 0x01, 0x27, 0xff, 0xdc, 0x00, 0x86, 0x01, 0x36, 0xff, 0x90, 0x00, 0x86, 0x01, 0x37, 0xff, 0xad, 0x00, 0x86, 0x01, 0x38, 0xff, 0x61, 0x00, 0x86, 0x01, 0x39, 0xff, 0x75, 0x00, 0x86, 0x01, 0x3a, 0xff, 0x61, 0x00, 0x86, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0x86, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0x86, 0x05, 0xd0, 0xff, 0x90, 0x00, 0x86, 0x05, 0xd2, 0xff, 0x90, 0x00, 0x86, 0x05, 0xd3, 0xff, 0xad, 0x00, 0x86, 0x05, 0xd4, 0xff, 0x90, 0x00, 0x86, 0x05, 0xd5, 0xff, 0xad, 0x00, 0x86, 0x06, 0x42, 0xff, 0x61, 0x00, 0x86, 0x06, 0x43, 0xff, 0x75, 0x00, 0x86, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0x86, 0x07, 0x52, 0xff, 0x03, 0x00, 0x86, 0x07, 0x53, 0x00, 0x2f, 0x00, 0x88, 0x07, 0x51, 0xff, 0xad, 0x00, 0x88, 0x07, 0x52, 0xff, 0xa4, 0x00, 0x88, 0x07, 0x53, 0xff, 0x90, 0x00, 0x89, 0x00, 0x3c, 0xff, 0xdc, 0x00, 0x89, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x89, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x89, 0x00, 0x9f, 0xff, 0xdc, 0x00, 0x89, 0x01, 0x3a, 0xff, 0xdc, 0x00, 0x89, 0x07, 0x52, 0x00, 0x26, 0x00, 0x92, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x92, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x92, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x92, 0x00, 0xc2, 0xff, 0xdc, 0x00, 0x92, 0x00, 0xc4, 0xff, 0xdc, 0x00, 0x92, 0x00, 0xc6, 0xff, 0xdc, 0x00, 0x92, 0x01, 0x38, 0xff, 0x90, 0x00, 0x92, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x92, 0x01, 0xf4, 0xff, 0x90, 0x00, 0x92, 0x06, 0x42, 0xff, 0x90, 0x00, 0x92, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x92, 0x07, 0x52, 0xff, 0xc9, 0x00, 0x92, 0x07, 0x53, 0xff, 0x44, 0x00, 0x94, 0x00, 0x10, 0x00, 0x39, 0x00, 0x94, 0x00, 0x11, 0xff, 0xad, 0x00, 0x94, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x3b, 0xff, 0x7d, 0x00, 0x94, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x94, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x94, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x94, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x94, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x94, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x94, 0x07, 0x53, 0xff, 0x44, 0x00, 0x95, 0x00, 0x10, 0x00, 0x39, 0x00, 0x95, 0x00, 0x11, 0xff, 0xad, 0x00, 0x95, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x3b, 0xff, 0x7d, 0x00, 0x95, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x95, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x95, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x95, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x95, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x95, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x95, 0x07, 0x53, 0xff, 0x44, 0x00, 0x96, 0x00, 0x10, 0x00, 0x39, 0x00, 0x96, 0x00, 0x11, 0xff, 0xad, 0x00, 0x96, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x3b, 0xff, 0x7d, 0x00, 0x96, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x96, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x96, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x96, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x96, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x96, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x96, 0x07, 0x53, 0xff, 0x44, 0x00, 0x97, 0x00, 0x10, 0x00, 0x39, 0x00, 0x97, 0x00, 0x11, 0xff, 0xad, 0x00, 0x97, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x3b, 0xff, 0x7d, 0x00, 0x97, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x97, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x97, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x97, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x97, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x97, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x97, 0x07, 0x53, 0xff, 0x44, 0x00, 0x98, 0x00, 0x10, 0x00, 0x39, 0x00, 0x98, 0x00, 0x11, 0xff, 0xad, 0x00, 0x98, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x24, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x39, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x3b, 0xff, 0x7d, 0x00, 0x98, 0x00, 0x3c, 0xff, 0x90, 0x00, 0x98, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x82, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x83, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x84, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x85, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x86, 0xff, 0xdc, 0x00, 0x98, 0x00, 0x9f, 0xff, 0x90, 0x00, 0x98, 0x01, 0x3a, 0xff, 0x90, 0x00, 0x98, 0x07, 0x51, 0xff, 0xd3, 0x00, 0x98, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x98, 0x07, 0x53, 0xff, 0x44, 0x00, 0x9b, 0x00, 0x3d, 0xff, 0xdc, 0x00, 0x9b, 0x01, 0x3f, 0xff, 0xdc, 0x00, 0x9c, 0x00, 0x3d, 0xff, 0xdc, 0x00, 0x9c, 0x01, 0x3f, 0xff, 0xdc, 0x00, 0x9d, 0x00, 0x3d, 0xff, 0xdc, 0x00, 0x9d, 0x01, 0x3f, 0xff, 0xdc, 0x00, 0x9e, 0x00, 0x3d, 0xff, 0xdc, 0x00, 0x9e, 0x01, 0x3f, 0xff, 0xdc, 0x00, 0x9f, 0x00, 0x10, 0xff, 0x0d, 0x00, 0x9f, 0x00, 0x11, 0xfe, 0x61, 0x00, 0x9f, 0x00, 0x1d, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0x24, 0xff, 0x61, 0x00, 0x9f, 0x00, 0x26, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x32, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x44, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0x48, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0x4c, 0xff, 0xb7, 0x00, 0x9f, 0x00, 0x52, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0x58, 0xff, 0x15, 0x00, 0x9f, 0x00, 0x6d, 0xff, 0x1f, 0x00, 0x9f, 0x00, 0x7d, 0xff, 0x6b, 0x00, 0x9f, 0x00, 0x82, 0xff, 0x61, 0x00, 0x9f, 0x00, 0x83, 0xff, 0x61, 0x00, 0x9f, 0x00, 0x84, 0xff, 0x61, 0x00, 0x9f, 0x00, 0x85, 0xff, 0x61, 0x00, 0x9f, 0x00, 0x86, 0xff, 0x61, 0x00, 0x9f, 0x00, 0x89, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x94, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x95, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x96, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x97, 0xff, 0x90, 0x00, 0x9f, 0x00, 0x98, 0xff, 0x90, 0x00, 0x9f, 0x00, 0xa2, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0xa3, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0xa4, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0xa5, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0xa6, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0xa7, 0xfe, 0xe6, 0x00, 0x9f, 0x00, 0xaa, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xab, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xac, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xad, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xb4, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xb5, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xb6, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xb7, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xb8, 0xfe, 0xf0, 0x00, 0x9f, 0x00, 0xbb, 0xff, 0x15, 0x00, 0x9f, 0x00, 0xbc, 0xff, 0x15, 0x00, 0x9f, 0x00, 0xbd, 0xff, 0x15, 0x00, 0x9f, 0x00, 0xbe, 0xff, 0x15, 0x00, 0x9f, 0x00, 0xc8, 0xff, 0x90, 0x00, 0x9f, 0x00, 0xce, 0xff, 0x90, 0x00, 0x9f, 0x00, 0xdd, 0xfe, 0xf0, 0x00, 0x9f, 0x01, 0x31, 0xff, 0x15, 0x00, 0x9f, 0x07, 0x51, 0xff, 0x90, 0x00, 0x9f, 0x07, 0x52, 0xff, 0xdc, 0x00, 0x9f, 0x07, 0x53, 0xfe, 0xf8, 0x00, 0xa0, 0x00, 0x11, 0xff, 0x6b, 0x00, 0xa0, 0x00, 0x1d, 0xff, 0xb7, 0x00, 0xa0, 0x07, 0x51, 0xff, 0xdc, 0x00, 0xa0, 0x07, 0x53, 0xff, 0x44, 0x00, 0xa1, 0x00, 0x10, 0x00, 0x26, 0x00, 0xa1, 0x07, 0x51, 0xff, 0x90, 0x00, 0xa1, 0x07, 0x52, 0xff, 0x90, 0x00, 0xa1, 0x07, 0x53, 0xff, 0xad, 0x00, 0xaa, 0x00, 0x5b, 0xff, 0xdc, 0x00, 0xab, 0x00, 0x5b, 0xff, 0xdc, 0x00, 0xac, 0x00, 0x5b, 0xff, 0xdc, 0x00, 0xad, 0x00, 0x5b, 0xff, 0xdc, 0x00, 0xb2, 0x07, 0x51, 0xff, 0xa4, 0x00, 0xb2, 0x07, 0x52, 0xff, 0x90, 0x00, 0xb2, 0x07, 0x53, 0xff, 0xb7, 0x00, 0xb3, 0x07, 0x51, 0xff, 0x6b, 0x00, 0xb3, 0x07, 0x52, 0xff, 0x90, 0x00, 0xb3, 0x07, 0x53, 0xff, 0xa4, 0x00, 0xb4, 0x00, 0x10, 0x00, 0x26, 0x00, 0xb4, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xb4, 0x00, 0x5b, 0xff, 0xc1, 0x00, 0xb4, 0x07, 0x51, 0xff, 0x6b, 0x00, 0xb4, 0x07, 0x52, 0xff, 0xb7, 0x00, 0xb4, 0x07, 0x53, 0xff, 0x7d, 0x00, 0xb5, 0x00, 0x10, 0x00, 0x26, 0x00, 0xb5, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xb5, 0x00, 0x5b, 0xff, 0xc1, 0x00, 0xb5, 0x07, 0x51, 0xff, 0x6b, 0x00, 0xb5, 0x07, 0x52, 0xff, 0xb7, 0x00, 0xb5, 0x07, 0x53, 0xff, 0x7d, 0x00, 0xb6, 0x00, 0x10, 0x00, 0x26, 0x00, 0xb6, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xb6, 0x00, 0x5b, 0xff, 0xc1, 0x00, 0xb6, 0x07, 0x51, 0xff, 0x6b, 0x00, 0xb6, 0x07, 0x52, 0xff, 0xb7, 0x00, 0xb6, 0x07, 0x53, 0xff, 0x7d, 0x00, 0xb7, 0x00, 0x10, 0x00, 0x26, 0x00, 0xb7, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xb7, 0x00, 0x5b, 0xff, 0xc1, 0x00, 0xb7, 0x07, 0x51, 0xff, 0x6b, 0x00, 0xb7, 0x07, 0x52, 0xff, 0xb7, 0x00, 0xb7, 0x07, 0x53, 0xff, 0x7d, 0x00, 0xb8, 0x00, 0x10, 0x00, 0x26, 0x00, 0xb8, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xb8, 0x00, 0x5b, 0xff, 0xc1, 0x00, 0xb8, 0x07, 0x51, 0xff, 0x6b, 0x00, 0xb8, 0x07, 0x52, 0xff, 0xb7, 0x00, 0xb8, 0x07, 0x53, 0xff, 0x7d, 0x00, 0xbf, 0x00, 0x10, 0xff, 0xdc, 0x00, 0xbf, 0x00, 0x11, 0xfe, 0xdc, 0x00, 0xbf, 0x00, 0x1d, 0xff, 0x6b, 0x00, 0xbf, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xbf, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xbf, 0x07, 0x53, 0xfe, 0xd3, 0x00, 0xc1, 0x00, 0x10, 0xff, 0xdc, 0x00, 0xc1, 0x00, 0x11, 0xfe, 0xdc, 0x00, 0xc1, 0x00, 0x1d, 0xff, 0x6b, 0x00, 0xc1, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xc1, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xc1, 0x07, 0x53, 0xfe, 0xd3, 0x00, 0xc2, 0x00, 0x10, 0xff, 0xd3, 0x00, 0xc2, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x24, 0x00, 0x39, 0x00, 0xc2, 0x00, 0x26, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x32, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x34, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x37, 0xff, 0x61, 0x00, 0xc2, 0x00, 0x39, 0xff, 0x7d, 0x00, 0xc2, 0x00, 0x3a, 0xff, 0x90, 0x00, 0xc2, 0x00, 0x3c, 0xff, 0x61, 0x00, 0xc2, 0x00, 0x46, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x47, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x48, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x49, 0xff, 0xb7, 0x00, 0xc2, 0x00, 0x52, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x54, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x57, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x59, 0xff, 0x88, 0x00, 0xc2, 0x00, 0x5a, 0xff, 0xad, 0x00, 0xc2, 0x00, 0x5c, 0xff, 0x75, 0x00, 0xc2, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0xc2, 0x00, 0x82, 0x00, 0x39, 0x00, 0xc2, 0x00, 0x83, 0x00, 0x39, 0x00, 0xc2, 0x00, 0x84, 0x00, 0x39, 0x00, 0xc2, 0x00, 0x85, 0x00, 0x39, 0x00, 0xc2, 0x00, 0x86, 0x00, 0x39, 0x00, 0xc2, 0x00, 0x94, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x95, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x96, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x97, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x98, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0x9f, 0xff, 0x61, 0x00, 0xc2, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xab, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xac, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xad, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xbf, 0xff, 0x75, 0x00, 0xc2, 0x00, 0xc1, 0xff, 0x75, 0x00, 0xc2, 0x00, 0xc2, 0x00, 0x39, 0x00, 0xc2, 0x00, 0xc4, 0x00, 0x39, 0x00, 0xc2, 0x00, 0xc6, 0x00, 0x39, 0x00, 0xc2, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xca, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xce, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xd3, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xde, 0xff, 0xdc, 0x00, 0xc2, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x10, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x11, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x12, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x13, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x24, 0xff, 0x61, 0x00, 0xc2, 0x01, 0x25, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x26, 0xff, 0x61, 0x00, 0xc2, 0x01, 0x27, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0x36, 0xff, 0x90, 0x00, 0xc2, 0x01, 0x37, 0xff, 0xad, 0x00, 0xc2, 0x01, 0x38, 0xff, 0x61, 0x00, 0xc2, 0x01, 0x39, 0xff, 0x75, 0x00, 0xc2, 0x01, 0x3a, 0xff, 0x61, 0x00, 0xc2, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0xc2, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0xc2, 0x05, 0xd0, 0xff, 0x90, 0x00, 0xc2, 0x05, 0xd2, 0xff, 0x90, 0x00, 0xc2, 0x05, 0xd3, 0xff, 0xad, 0x00, 0xc2, 0x05, 0xd4, 0xff, 0x90, 0x00, 0xc2, 0x05, 0xd5, 0xff, 0xad, 0x00, 0xc2, 0x06, 0x42, 0xff, 0x61, 0x00, 0xc2, 0x06, 0x43, 0xff, 0x75, 0x00, 0xc2, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0xc2, 0x07, 0x52, 0xff, 0x02, 0x00, 0xc2, 0x07, 0x53, 0x00, 0x2f, 0x00, 0xc4, 0x00, 0x10, 0xff, 0xd3, 0x00, 0xc4, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x24, 0x00, 0x39, 0x00, 0xc4, 0x00, 0x26, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x32, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x34, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x37, 0xff, 0x61, 0x00, 0xc4, 0x00, 0x39, 0xff, 0x7d, 0x00, 0xc4, 0x00, 0x3a, 0xff, 0x90, 0x00, 0xc4, 0x00, 0x3c, 0xff, 0x61, 0x00, 0xc4, 0x00, 0x46, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x47, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x48, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x49, 0xff, 0xb7, 0x00, 0xc4, 0x00, 0x52, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x54, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x57, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x59, 0xff, 0x88, 0x00, 0xc4, 0x00, 0x5a, 0xff, 0xad, 0x00, 0xc4, 0x00, 0x5c, 0xff, 0x75, 0x00, 0xc4, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0xc4, 0x00, 0x82, 0x00, 0x39, 0x00, 0xc4, 0x00, 0x83, 0x00, 0x39, 0x00, 0xc4, 0x00, 0x84, 0x00, 0x39, 0x00, 0xc4, 0x00, 0x85, 0x00, 0x39, 0x00, 0xc4, 0x00, 0x86, 0x00, 0x39, 0x00, 0xc4, 0x00, 0x94, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x95, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x96, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x97, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x98, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0x9f, 0xff, 0x61, 0x00, 0xc4, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xab, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xac, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xad, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xbf, 0xff, 0x75, 0x00, 0xc4, 0x00, 0xc1, 0xff, 0x75, 0x00, 0xc4, 0x00, 0xc2, 0x00, 0x39, 0x00, 0xc4, 0x00, 0xc4, 0x00, 0x39, 0x00, 0xc4, 0x00, 0xc6, 0x00, 0x39, 0x00, 0xc4, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xca, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xce, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xd3, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xde, 0xff, 0xdc, 0x00, 0xc4, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x10, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x11, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x12, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x13, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x24, 0xff, 0x61, 0x00, 0xc4, 0x01, 0x25, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x26, 0xff, 0x61, 0x00, 0xc4, 0x01, 0x27, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0x36, 0xff, 0x90, 0x00, 0xc4, 0x01, 0x37, 0xff, 0xad, 0x00, 0xc4, 0x01, 0x38, 0xff, 0x61, 0x00, 0xc4, 0x01, 0x39, 0xff, 0x75, 0x00, 0xc4, 0x01, 0x3a, 0xff, 0x61, 0x00, 0xc4, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0xc4, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0xc4, 0x05, 0xd0, 0xff, 0x90, 0x00, 0xc4, 0x05, 0xd2, 0xff, 0x90, 0x00, 0xc4, 0x05, 0xd3, 0xff, 0xad, 0x00, 0xc4, 0x05, 0xd4, 0xff, 0x90, 0x00, 0xc4, 0x05, 0xd5, 0xff, 0xad, 0x00, 0xc4, 0x06, 0x42, 0xff, 0x61, 0x00, 0xc4, 0x06, 0x43, 0xff, 0x75, 0x00, 0xc4, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0xc4, 0x07, 0x52, 0xff, 0x02, 0x00, 0xc4, 0x07, 0x53, 0x00, 0x2f, 0x00, 0xc6, 0x00, 0x10, 0xff, 0xd3, 0x00, 0xc6, 0x00, 0x11, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x1d, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x24, 0x00, 0x39, 0x00, 0xc6, 0x00, 0x26, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x2a, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x32, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x34, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x37, 0xff, 0x61, 0x00, 0xc6, 0x00, 0x39, 0xff, 0x7d, 0x00, 0xc6, 0x00, 0x3a, 0xff, 0x90, 0x00, 0xc6, 0x00, 0x3c, 0xff, 0x61, 0x00, 0xc6, 0x00, 0x46, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x47, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x48, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x49, 0xff, 0xb7, 0x00, 0xc6, 0x00, 0x52, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x54, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x57, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x59, 0xff, 0x88, 0x00, 0xc6, 0x00, 0x5a, 0xff, 0xad, 0x00, 0xc6, 0x00, 0x6d, 0xff, 0xb7, 0x00, 0xc6, 0x00, 0x82, 0x00, 0x39, 0x00, 0xc6, 0x00, 0x83, 0x00, 0x39, 0x00, 0xc6, 0x00, 0x84, 0x00, 0x39, 0x00, 0xc6, 0x00, 0x85, 0x00, 0x39, 0x00, 0xc6, 0x00, 0x86, 0x00, 0x39, 0x00, 0xc6, 0x00, 0x94, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x95, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x96, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x97, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x98, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0x9f, 0xff, 0x61, 0x00, 0xc6, 0x00, 0xa9, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xab, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xac, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xad, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xc2, 0x00, 0x39, 0x00, 0xc6, 0x00, 0xc4, 0x00, 0x39, 0x00, 0xc6, 0x00, 0xc6, 0x00, 0x39, 0x00, 0xc6, 0x00, 0xc8, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xca, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xcc, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xcd, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xce, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xd1, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xd3, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xd5, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xd7, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xd9, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xdb, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xde, 0xff, 0xdc, 0x00, 0xc6, 0x00, 0xe2, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x0e, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x0f, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x10, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x11, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x13, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x24, 0xff, 0x61, 0x00, 0xc6, 0x01, 0x25, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x26, 0xff, 0x61, 0x00, 0xc6, 0x01, 0x27, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0x36, 0xff, 0x90, 0x00, 0xc6, 0x01, 0x37, 0xff, 0xad, 0x00, 0xc6, 0x01, 0x38, 0xff, 0x61, 0x00, 0xc6, 0x01, 0x3a, 0xff, 0x61, 0x00, 0xc6, 0x01, 0xf0, 0xff, 0xdc, 0x00, 0xc6, 0x01, 0xf1, 0xff, 0xdc, 0x00, 0xc6, 0x05, 0xd0, 0xff, 0x90, 0x00, 0xc6, 0x05, 0xd2, 0xff, 0x90, 0x00, 0xc6, 0x05, 0xd3, 0xff, 0xad, 0x00, 0xc6, 0x05, 0xd4, 0xff, 0x90, 0x00, 0xc6, 0x05, 0xd5, 0xff, 0xad, 0x00, 0xc6, 0x06, 0x42, 0xff, 0x61, 0x00, 0xc6, 0x07, 0x51, 0xfe, 0xf8, 0x00, 0xc6, 0x07, 0x52, 0xff, 0x02, 0x00, 0xc6, 0x07, 0x53, 0x00, 0x2f, 0x00, 0xc8, 0x00, 0x3c, 0xff, 0xdc, 0x00, 0xc8, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xc8, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xc8, 0x00, 0x9f, 0xff, 0xdc, 0x00, 0xc8, 0x01, 0x3a, 0xff, 0xdc, 0x00, 0xc8, 0x07, 0x52, 0x00, 0x26, 0x00, 0xce, 0x00, 0x3c, 0xff, 0xdc, 0x00, 0xce, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xce, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xce, 0x00, 0x9f, 0xff, 0xdc, 0x00, 0xce, 0x01, 0x3a, 0xff, 0xdc, 0x00, 0xce, 0x07, 0x52, 0x00, 0x26, 0x00, 0xd0, 0x00, 0x24, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x39, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x3c, 0xff, 0x90, 0x00, 0xd0, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x82, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x83, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x84, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x85, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x86, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0x9f, 0xff, 0x90, 0x00, 0xd0, 0x00, 0xc2, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0xc4, 0xff, 0xdc, 0x00, 0xd0, 0x00, 0xc6, 0xff, 0xdc, 0x00, 0xd0, 0x01, 0x38, 0xff, 0x90, 0x00, 0xd0, 0x01, 0x3a, 0xff, 0x90, 0x00, 0xd0, 0x01, 0xf4, 0xff, 0x90, 0x00, 0xd0, 0x06, 0x42, 0xff, 0x90, 0x00, 0xd0, 0x07, 0x51, 0xff, 0xd3, 0x00, 0xd0, 0x07, 0x52, 0xff, 0xc9, 0x00, 0xd0, 0x07, 0x53, 0xff, 0x44, 0x00, 0xd2, 0x00, 0x24, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x39, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x3c, 0xff, 0x90, 0x00, 0xd2, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x82, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x83, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x84, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x85, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x86, 0xff, 0xdc, 0x00, 0xd2, 0x00, 0x9f, 0xff, 0x90, 0x00, 0xd2, 0x01, 0x3a, 0xff, 0x90, 0x00, 0xd2, 0x07, 0x51, 0xff, 0xd3, 0x00, 0xd2, 0x07, 0x52, 0xff, 0xc9, 0x00, 0xd2, 0x07, 0x53, 0xff, 0x44, 0x00, 0xdd, 0x00, 0x5b, 0xff, 0xdc, 0x00, 0xe0, 0x00, 0x37, 0xff, 0xb7, 0x00, 0xe0, 0x00, 0x3c, 0xff, 0x9a, 0x00, 0xe0, 0x00, 0x6d, 0xff, 0xdc, 0x00, 0xe0, 0x00, 0x7d, 0xff, 0xdc, 0x00, 0xe0, 0x00, 0x9f, 0xff, 0x9a, 0x00, 0xe0, 0x01, 0x26, 0xff, 0xb7, 0x00, 0xe0, 0x01, 0x3a, 0xff, 0x9a, 0x00, 0xe0, 0x07, 0x51, 0xff, 0xd3, 0x00, 0xe0, 0x07, 0x52, 0xff, 0xd3, 0x00, 0xe0, 0x07, 0x53, 0xff, 0xc9, 0x00, 0xfb, 0x00, 0x10, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0x24, 0x00, 0x2f, 0x00, 0xfb, 0x00, 0x32, 0xff, 0xb7, 0x00, 0xfb, 0x00, 0x37, 0xfe, 0xe6, 0x00, 0xfb, 0x00, 0x38, 0xff, 0x9a, 0x00, 0xfb, 0x00, 0x39, 0xff, 0x1f, 0x00, 0xfb, 0x00, 0x3a, 0xff, 0x44, 0x00, 0xfb, 0x00, 0x3c, 0xfe, 0xf0, 0x00, 0xfb, 0x00, 0x48, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0x52, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0x58, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0x5c, 0xff, 0x44, 0x00, 0xfb, 0x00, 0x82, 0x00, 0x2f, 0x00, 0xfb, 0x00, 0x83, 0x00, 0x2f, 0x00, 0xfb, 0x00, 0x84, 0x00, 0x2f, 0x00, 0xfb, 0x00, 0x85, 0x00, 0x2f, 0x00, 0xfb, 0x00, 0x86, 0x00, 0x2f, 0x00, 0xfb, 0x00, 0x94, 0xff, 0xb7, 0x00, 0xfb, 0x00, 0x95, 0xff, 0xb7, 0x00, 0xfb, 0x00, 0x96, 0xff, 0xb7, 0x00, 0xfb, 0x00, 0x97, 0xff, 0xb7, 0x00, 0xfb, 0x00, 0x98, 0xff, 0xb7, 0x00, 0xfb, 0x00, 0x9b, 0xff, 0x9a, 0x00, 0xfb, 0x00, 0x9c, 0xff, 0x9a, 0x00, 0xfb, 0x00, 0x9d, 0xff, 0x9a, 0x00, 0xfb, 0x00, 0x9e, 0xff, 0x9a, 0x00, 0xfb, 0x00, 0x9f, 0xfe, 0xf0, 0x00, 0xfb, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xab, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xac, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xad, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xbb, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xbc, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xbd, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xbe, 0xff, 0xdc, 0x00, 0xfb, 0x00, 0xbf, 0xff, 0x44, 0x00, 0xfb, 0x00, 0xc1, 0xff, 0x44, 0x00, 0xfb, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0xfb, 0x01, 0x26, 0xfe, 0xe6, 0x00, 0xfb, 0x01, 0x30, 0xff, 0x9a, 0x00, 0xfb, 0x01, 0x31, 0xff, 0xdc, 0x00, 0xfb, 0x01, 0x3a, 0xfe, 0xf0, 0x00, 0xfb, 0x07, 0x51, 0xfe, 0x61, 0x00, 0xfb, 0x07, 0x52, 0xfd, 0xe6, 0x00, 0xff, 0x00, 0x10, 0xff, 0xdc, 0x00, 0xff, 0x00, 0x24, 0x00, 0x2f, 0x00, 0xff, 0x00, 0x32, 0xff, 0xb7, 0x00, 0xff, 0x00, 0x37, 0xfe, 0xe6, 0x00, 0xff, 0x00, 0x38, 0xff, 0x9a, 0x00, 0xff, 0x00, 0x39, 0xff, 0x1f, 0x00, 0xff, 0x00, 0x3a, 0xff, 0x44, 0x00, 0xff, 0x00, 0x3c, 0xfe, 0xf0, 0x00, 0xff, 0x00, 0x48, 0xff, 0xdc, 0x00, 0xff, 0x00, 0x52, 0xff, 0xdc, 0x00, 0xff, 0x00, 0x58, 0xff, 0xdc, 0x00, 0xff, 0x00, 0x5c, 0xff, 0x44, 0x00, 0xff, 0x00, 0x82, 0x00, 0x2f, 0x00, 0xff, 0x00, 0x83, 0x00, 0x2f, 0x00, 0xff, 0x00, 0x84, 0x00, 0x2f, 0x00, 0xff, 0x00, 0x85, 0x00, 0x2f, 0x00, 0xff, 0x00, 0x86, 0x00, 0x2f, 0x00, 0xff, 0x00, 0x94, 0xff, 0xb7, 0x00, 0xff, 0x00, 0x95, 0xff, 0xb7, 0x00, 0xff, 0x00, 0x96, 0xff, 0xb7, 0x00, 0xff, 0x00, 0x97, 0xff, 0xb7, 0x00, 0xff, 0x00, 0x98, 0xff, 0xb7, 0x00, 0xff, 0x00, 0x9b, 0xff, 0x9a, 0x00, 0xff, 0x00, 0x9c, 0xff, 0x9a, 0x00, 0xff, 0x00, 0x9d, 0xff, 0x9a, 0x00, 0xff, 0x00, 0x9e, 0xff, 0x9a, 0x00, 0xff, 0x00, 0x9f, 0xfe, 0xf0, 0x00, 0xff, 0x00, 0xaa, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xab, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xac, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xad, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xb4, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xb5, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xb6, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xb7, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xb8, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xbb, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xbc, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xbd, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xbe, 0xff, 0xdc, 0x00, 0xff, 0x00, 0xbf, 0xff, 0x44, 0x00, 0xff, 0x00, 0xc1, 0xff, 0x44, 0x00, 0xff, 0x00, 0xdd, 0xff, 0xdc, 0x00, 0xff, 0x01, 0x26, 0xfe, 0xe6, 0x00, 0xff, 0x01, 0x30, 0xff, 0x9a, 0x00, 0xff, 0x01, 0x31, 0xff, 0xdc, 0x00, 0xff, 0x01, 0x3a, 0xfe, 0xf0, 0x00, 0xff, 0x07, 0x51, 0xfe, 0x61, 0x00, 0xff, 0x07, 0x52, 0xfd, 0xe6, 0x01, 0x02, 0x00, 0x4f, 0xff, 0x3f, 0x01, 0x0a, 0x07, 0x51, 0xff, 0x6b, 0x01, 0x0a, 0x07, 0x52, 0xff, 0x90, 0x01, 0x0a, 0x07, 0x53, 0xff, 0xa4, 0x01, 0x16, 0x00, 0x10, 0xff, 0xad, 0x01, 0x16, 0x00, 0x11, 0xff, 0xb7, 0x01, 0x16, 0x00, 0x1d, 0xff, 0xc1, 0x01, 0x16, 0x00, 0x24, 0xff, 0xad, 0x01, 0x16, 0x00, 0x26, 0xff, 0x9a, 0x01, 0x16, 0x00, 0x37, 0xff, 0x6b, 0x01, 0x16, 0x00, 0x39, 0xff, 0x90, 0x01, 0x16, 0x00, 0x3a, 0xff, 0xad, 0x01, 0x16, 0x00, 0x3c, 0xff, 0x7d, 0x01, 0x16, 0x00, 0x44, 0xff, 0xd3, 0x01, 0x16, 0x00, 0x48, 0xff, 0xa4, 0x01, 0x16, 0x00, 0x52, 0xff, 0xa4, 0x01, 0x16, 0x00, 0x58, 0xff, 0xa4, 0x01, 0x16, 0x00, 0x5c, 0xff, 0x90, 0x01, 0x16, 0x00, 0x6d, 0xff, 0x90, 0x01, 0x16, 0x00, 0x7d, 0xff, 0xdc, 0x01, 0x16, 0x00, 0x82, 0xff, 0xad, 0x01, 0x16, 0x00, 0x83, 0xff, 0xad, 0x01, 0x16, 0x00, 0x84, 0xff, 0xad, 0x01, 0x16, 0x00, 0x85, 0xff, 0xad, 0x01, 0x16, 0x00, 0x86, 0xff, 0xad, 0x01, 0x16, 0x00, 0x89, 0xff, 0x9a, 0x01, 0x16, 0x00, 0x9f, 0xff, 0x7d, 0x01, 0x16, 0x00, 0xa2, 0xff, 0xd3, 0x01, 0x16, 0x00, 0xa3, 0xff, 0xd3, 0x01, 0x16, 0x00, 0xa4, 0xff, 0xd3, 0x01, 0x16, 0x00, 0xa5, 0xff, 0xd3, 0x01, 0x16, 0x00, 0xa6, 0xff, 0xd3, 0x01, 0x16, 0x00, 0xa7, 0xff, 0xd3, 0x01, 0x16, 0x00, 0xaa, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xab, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xac, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xad, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xb4, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xb5, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xb6, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xb7, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xb8, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xbb, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xbc, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xbd, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xbe, 0xff, 0xa4, 0x01, 0x16, 0x00, 0xbf, 0xff, 0x90, 0x01, 0x16, 0x00, 0xc1, 0xff, 0x90, 0x01, 0x16, 0x00, 0xc8, 0xff, 0x9a, 0x01, 0x16, 0x00, 0xce, 0xff, 0x9a, 0x01, 0x16, 0x00, 0xdd, 0xff, 0xa4, 0x01, 0x16, 0x01, 0x26, 0xff, 0x6b, 0x01, 0x16, 0x01, 0x31, 0xff, 0xa4, 0x01, 0x16, 0x01, 0x3a, 0xff, 0x7d, 0x01, 0x16, 0x07, 0x51, 0xff, 0x6b, 0x01, 0x16, 0x07, 0x52, 0xff, 0x7d, 0x01, 0x16, 0x07, 0x53, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x10, 0xff, 0x7d, 0x01, 0x17, 0x00, 0x11, 0xff, 0x44, 0x01, 0x17, 0x00, 0x1d, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x46, 0xff, 0xd3, 0x01, 0x17, 0x00, 0x47, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x48, 0xff, 0xd3, 0x01, 0x17, 0x00, 0x4a, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x4b, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x50, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x51, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x52, 0xff, 0xd3, 0x01, 0x17, 0x00, 0x54, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x55, 0xff, 0xdc, 0x01, 0x17, 0x00, 0x5b, 0xff, 0xc9, 0x01, 0x17, 0x00, 0x6d, 0xff, 0xb7, 0x01, 0x17, 0x00, 0xa9, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xaa, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xab, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xac, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xad, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xb3, 0xff, 0xdc, 0x01, 0x17, 0x00, 0xb4, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xb5, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xb6, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xb7, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xb8, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xc9, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xcf, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xd1, 0x00, 0x48, 0x01, 0x17, 0x00, 0xdd, 0xff, 0xd3, 0x01, 0x17, 0x00, 0xe1, 0xff, 0xdc, 0x01, 0x17, 0x01, 0x0a, 0xff, 0xdc, 0x01, 0x17, 0x01, 0x17, 0xff, 0xdc, 0x01, 0x17, 0x01, 0x1b, 0xff, 0xdc, 0x01, 0x17, 0x07, 0x52, 0x00, 0x56, 0x01, 0x17, 0x07, 0x53, 0xfe, 0xc9, 0x01, 0x1a, 0x00, 0x10, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x11, 0xff, 0xb7, 0x01, 0x1a, 0x00, 0x1d, 0xff, 0xc1, 0x01, 0x1a, 0x00, 0x24, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x26, 0xff, 0x9a, 0x01, 0x1a, 0x00, 0x37, 0xff, 0x6b, 0x01, 0x1a, 0x00, 0x39, 0xff, 0x90, 0x01, 0x1a, 0x00, 0x3a, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x3c, 0xff, 0x7d, 0x01, 0x1a, 0x00, 0x44, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0x48, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0x52, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0x58, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0x5c, 0xff, 0x90, 0x01, 0x1a, 0x00, 0x6d, 0xff, 0x90, 0x01, 0x1a, 0x00, 0x7d, 0xff, 0xdc, 0x01, 0x1a, 0x00, 0x82, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x83, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x84, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x85, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x86, 0xff, 0xad, 0x01, 0x1a, 0x00, 0x89, 0xff, 0x9a, 0x01, 0x1a, 0x00, 0x9f, 0xff, 0x7d, 0x01, 0x1a, 0x00, 0xa2, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0xa3, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0xa4, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0xa5, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0xa6, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0xa7, 0xff, 0xd3, 0x01, 0x1a, 0x00, 0xaa, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xab, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xac, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xad, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xb4, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xb5, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xb6, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xb7, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xb8, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xbb, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xbc, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xbd, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xbe, 0xff, 0xa4, 0x01, 0x1a, 0x00, 0xbf, 0xff, 0x90, 0x01, 0x1a, 0x00, 0xc1, 0xff, 0x90, 0x01, 0x1a, 0x00, 0xc8, 0xff, 0x9a, 0x01, 0x1a, 0x00, 0xce, 0xff, 0x9a, 0x01, 0x1a, 0x00, 0xdd, 0xff, 0xa4, 0x01, 0x1a, 0x01, 0x26, 0xff, 0x6b, 0x01, 0x1a, 0x01, 0x31, 0xff, 0xa4, 0x01, 0x1a, 0x01, 0x3a, 0xff, 0x7d, 0x01, 0x1a, 0x07, 0x51, 0xff, 0x6b, 0x01, 0x1a, 0x07, 0x52, 0xff, 0x7d, 0x01, 0x1a, 0x07, 0x53, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x10, 0xff, 0x7d, 0x01, 0x1b, 0x00, 0x11, 0xff, 0x44, 0x01, 0x1b, 0x00, 0x1d, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x46, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0x47, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x48, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0x4a, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x4b, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x50, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x51, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x52, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0x54, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x55, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0x5b, 0xff, 0xc9, 0x01, 0x1b, 0x00, 0x6d, 0xff, 0xb7, 0x01, 0x1b, 0x00, 0xa9, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xaa, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xab, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xac, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xad, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xb3, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0xb4, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xb5, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xb6, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xb7, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xb8, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xc9, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xcf, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xd1, 0xff, 0xdc, 0x01, 0x1b, 0x00, 0xdd, 0xff, 0xd3, 0x01, 0x1b, 0x00, 0xe1, 0xff, 0xdc, 0x01, 0x1b, 0x01, 0x0a, 0xff, 0xdc, 0x01, 0x1b, 0x01, 0x17, 0xff, 0xdc, 0x01, 0x1b, 0x01, 0x1b, 0xff, 0xdc, 0x01, 0x1b, 0x07, 0x52, 0x00, 0x56, 0x01, 0x1b, 0x07, 0x53, 0xfe, 0xc9, 0x01, 0x20, 0x00, 0x24, 0x00, 0x26, 0x01, 0x20, 0x00, 0x82, 0x00, 0x26, 0x01, 0x20, 0x00, 0x83, 0x00, 0x26, 0x01, 0x20, 0x00, 0x84, 0x00, 0x26, 0x01, 0x20, 0x00, 0x85, 0x00, 0x26, 0x01, 0x20, 0x00, 0x86, 0x00, 0x26, 0x01, 0x22, 0x00, 0x24, 0x00, 0x26, 0x01, 0x22, 0x00, 0x82, 0x00, 0x26, 0x01, 0x22, 0x00, 0x83, 0x00, 0x26, 0x01, 0x22, 0x00, 0x84, 0x00, 0x26, 0x01, 0x22, 0x00, 0x85, 0x00, 0x26, 0x01, 0x22, 0x00, 0x86, 0x00, 0x26, 0x01, 0x26, 0x00, 0x10, 0xff, 0x44, 0x01, 0x26, 0x00, 0x11, 0xff, 0x0d, 0x01, 0x26, 0x00, 0x1d, 0xff, 0x1f, 0x01, 0x26, 0x00, 0x24, 0xff, 0x61, 0x01, 0x26, 0x00, 0x26, 0xff, 0x88, 0x01, 0x26, 0x00, 0x37, 0xff, 0xdc, 0x01, 0x26, 0x00, 0x44, 0xfe, 0xad, 0x01, 0x26, 0x00, 0x46, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0x48, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0x4c, 0xff, 0xc1, 0x01, 0x26, 0x00, 0x52, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0x55, 0xfe, 0xd3, 0x01, 0x26, 0x00, 0x56, 0xfe, 0xad, 0x01, 0x26, 0x00, 0x58, 0xfe, 0xc9, 0x01, 0x26, 0x00, 0x5a, 0xfe, 0xad, 0x01, 0x26, 0x00, 0x5c, 0xfe, 0xc1, 0x01, 0x26, 0x00, 0x6d, 0xff, 0x44, 0x01, 0x26, 0x00, 0x7d, 0xff, 0x90, 0x01, 0x26, 0x00, 0x82, 0xff, 0x61, 0x01, 0x26, 0x00, 0x83, 0xff, 0x61, 0x01, 0x26, 0x00, 0x84, 0xff, 0x61, 0x01, 0x26, 0x00, 0x85, 0xff, 0x61, 0x01, 0x26, 0x00, 0x86, 0xff, 0x61, 0x01, 0x26, 0x00, 0x89, 0xff, 0x88, 0x01, 0x26, 0x00, 0xa2, 0xfe, 0xad, 0x01, 0x26, 0x00, 0xa3, 0xfe, 0xad, 0x01, 0x26, 0x00, 0xa4, 0xfe, 0xad, 0x01, 0x26, 0x00, 0xa5, 0xfe, 0xad, 0x01, 0x26, 0x00, 0xa6, 0xfe, 0xad, 0x01, 0x26, 0x00, 0xa7, 0xfe, 0xad, 0x01, 0x26, 0x00, 0xa9, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xaa, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xab, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xac, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xad, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xb4, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xb5, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xb6, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xb7, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xb8, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xbb, 0xfe, 0xc9, 0x01, 0x26, 0x00, 0xbc, 0xfe, 0xc9, 0x01, 0x26, 0x00, 0xbd, 0xfe, 0xc9, 0x01, 0x26, 0x00, 0xbe, 0xfe, 0xc9, 0x01, 0x26, 0x00, 0xbf, 0xfe, 0xc1, 0x01, 0x26, 0x00, 0xc1, 0xfe, 0xc1, 0x01, 0x26, 0x00, 0xc8, 0xff, 0x88, 0x01, 0x26, 0x00, 0xc9, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xce, 0xff, 0x88, 0x01, 0x26, 0x00, 0xcf, 0xfe, 0xa4, 0x01, 0x26, 0x00, 0xdd, 0xfe, 0xa4, 0x01, 0x26, 0x01, 0x17, 0xfe, 0xd3, 0x01, 0x26, 0x01, 0x1b, 0xfe, 0xd3, 0x01, 0x26, 0x01, 0x21, 0xfe, 0xad, 0x01, 0x26, 0x01, 0x23, 0xfe, 0xad, 0x01, 0x26, 0x01, 0x26, 0xff, 0xdc, 0x01, 0x26, 0x01, 0x31, 0xfe, 0xc9, 0x01, 0x26, 0x07, 0x52, 0xff, 0xd3, 0x01, 0x26, 0x07, 0x53, 0xfe, 0xf8, 0x01, 0x30, 0x00, 0x3d, 0xff, 0xdc, 0x01, 0x30, 0x01, 0x3f, 0xff, 0xdc, 0x01, 0x3a, 0x00, 0x10, 0xff, 0x0d, 0x01, 0x3a, 0x00, 0x11, 0xfe, 0x61, 0x01, 0x3a, 0x00, 0x1d, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0x24, 0xff, 0x61, 0x01, 0x3a, 0x00, 0x26, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x32, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x44, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0x48, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0x4c, 0xff, 0xb7, 0x01, 0x3a, 0x00, 0x52, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0x58, 0xff, 0x15, 0x01, 0x3a, 0x00, 0x6d, 0xff, 0x1f, 0x01, 0x3a, 0x00, 0x7d, 0xff, 0x6b, 0x01, 0x3a, 0x00, 0x82, 0xff, 0x61, 0x01, 0x3a, 0x00, 0x83, 0xff, 0x61, 0x01, 0x3a, 0x00, 0x84, 0xff, 0x61, 0x01, 0x3a, 0x00, 0x85, 0xff, 0x61, 0x01, 0x3a, 0x00, 0x86, 0xff, 0x61, 0x01, 0x3a, 0x00, 0x89, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x94, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x95, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x96, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x97, 0xff, 0x90, 0x01, 0x3a, 0x00, 0x98, 0xff, 0x90, 0x01, 0x3a, 0x00, 0xa2, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0xa3, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0xa4, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0xa5, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0xa6, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0xa7, 0xfe, 0xe6, 0x01, 0x3a, 0x00, 0xaa, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xab, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xac, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xad, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xb4, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xb5, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xb6, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xb7, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xb8, 0xfe, 0xf0, 0x01, 0x3a, 0x00, 0xbb, 0xff, 0x15, 0x01, 0x3a, 0x00, 0xbc, 0xff, 0x15, 0x01, 0x3a, 0x00, 0xbd, 0xff, 0x15, 0x01, 0x3a, 0x00, 0xbe, 0xff, 0x15, 0x01, 0x3a, 0x00, 0xc8, 0xff, 0x90, 0x01, 0x3a, 0x00, 0xce, 0xff, 0x90, 0x01, 0x3a, 0x00, 0xdd, 0xfe, 0xf0, 0x01, 0x3a, 0x01, 0x31, 0xff, 0x15, 0x01, 0x3a, 0x07, 0x51, 0xff, 0x90, 0x01, 0x3a, 0x07, 0x52, 0xff, 0xdc, 0x01, 0x3a, 0x07, 0x53, 0xfe, 0xf8, 0x01, 0x3f, 0x00, 0x10, 0xff, 0xdc, 0x01, 0x3f, 0x07, 0x51, 0xff, 0xdc, 0x01, 0x3f, 0x07, 0x52, 0xff, 0xdc, 0x01, 0x3f, 0x07, 0x53, 0xff, 0xdc, 0x07, 0x45, 0x00, 0x24, 0xff, 0xd3, 0x07, 0x45, 0x00, 0x25, 0xff, 0xb7, 0x07, 0x45, 0x00, 0x2a, 0x00, 0x4b, 0x07, 0x45, 0x00, 0x2d, 0x00, 0x72, 0x07, 0x45, 0x00, 0x32, 0x00, 0x39, 0x07, 0x45, 0x00, 0x34, 0x00, 0x4b, 0x07, 0x45, 0x00, 0x37, 0xff, 0x44, 0x07, 0x45, 0x00, 0x39, 0xff, 0x88, 0x07, 0x45, 0x00, 0x3a, 0xff, 0xad, 0x07, 0x45, 0x00, 0x3b, 0xff, 0x9a, 0x07, 0x45, 0x00, 0x3c, 0xff, 0x0d, 0x07, 0x45, 0x00, 0x52, 0x00, 0x26, 0x07, 0x45, 0x00, 0x59, 0xff, 0xc9, 0x07, 0x45, 0x00, 0x5c, 0xff, 0xdc, 0x07, 0x45, 0x00, 0x82, 0xff, 0xd3, 0x07, 0x45, 0x00, 0x83, 0xff, 0xd3, 0x07, 0x45, 0x00, 0x84, 0xff, 0xd3, 0x07, 0x45, 0x00, 0x85, 0xff, 0xd3, 0x07, 0x45, 0x00, 0x86, 0xff, 0xd3, 0x07, 0x45, 0x00, 0x94, 0x00, 0x39, 0x07, 0x45, 0x00, 0x95, 0x00, 0x39, 0x07, 0x45, 0x00, 0x96, 0x00, 0x39, 0x07, 0x45, 0x00, 0x97, 0x00, 0x39, 0x07, 0x45, 0x00, 0x98, 0x00, 0x39, 0x07, 0x45, 0x00, 0x9f, 0xff, 0x0d, 0x07, 0x45, 0x00, 0xb4, 0x00, 0x26, 0x07, 0x45, 0x00, 0xb5, 0x00, 0x26, 0x07, 0x45, 0x00, 0xb6, 0x00, 0x26, 0x07, 0x45, 0x00, 0xb7, 0x00, 0x26, 0x07, 0x45, 0x00, 0xb8, 0x00, 0x26, 0x07, 0x45, 0x00, 0xbf, 0xff, 0xdc, 0x07, 0x45, 0x00, 0xc1, 0xff, 0xdc, 0x07, 0x45, 0x00, 0xe0, 0x00, 0x4b, 0x07, 0x45, 0x01, 0x26, 0xff, 0x44, 0x07, 0x45, 0x01, 0x3a, 0xff, 0x0d, 0x07, 0x51, 0x00, 0x24, 0xfe, 0xf8, 0x07, 0x51, 0x00, 0x25, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x26, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x27, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x29, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x2a, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x2b, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x2d, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x2e, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x2f, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x32, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x33, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x34, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x35, 0xff, 0xc1, 0x07, 0x51, 0x00, 0x3b, 0xff, 0x88, 0x07, 0x51, 0x00, 0x3d, 0xff, 0xdc, 0x07, 0x51, 0x00, 0x49, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x51, 0xff, 0x90, 0x07, 0x51, 0x00, 0x52, 0xff, 0x6b, 0x07, 0x51, 0x00, 0x55, 0xff, 0x90, 0x07, 0x51, 0x00, 0x59, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x5a, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x5c, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x82, 0xfe, 0xf8, 0x07, 0x51, 0x00, 0x83, 0xfe, 0xf8, 0x07, 0x51, 0x00, 0x84, 0xfe, 0xf8, 0x07, 0x51, 0x00, 0x85, 0xfe, 0xf8, 0x07, 0x51, 0x00, 0x86, 0xfe, 0xf8, 0x07, 0x51, 0x00, 0x88, 0xfe, 0x7d, 0x07, 0x51, 0x00, 0x89, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x94, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x95, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x96, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x97, 0xff, 0xb7, 0x07, 0x51, 0x00, 0x98, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xa0, 0xff, 0xc1, 0x07, 0x51, 0x00, 0xa1, 0xff, 0xc1, 0x07, 0x51, 0x00, 0xb2, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xb3, 0xff, 0x90, 0x07, 0x51, 0x00, 0xb4, 0xff, 0x6b, 0x07, 0x51, 0x00, 0xb5, 0xff, 0x6b, 0x07, 0x51, 0x00, 0xb6, 0xff, 0x6b, 0x07, 0x51, 0x00, 0xb7, 0xff, 0x6b, 0x07, 0x51, 0x00, 0xb8, 0xff, 0x6b, 0x07, 0x51, 0x00, 0xbf, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xc1, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xc8, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xce, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xd0, 0xff, 0xc1, 0x07, 0x51, 0x00, 0xe0, 0xff, 0xb7, 0x07, 0x51, 0x00, 0xfb, 0xff, 0xc1, 0x07, 0x51, 0x00, 0xff, 0xff, 0xc1, 0x07, 0x51, 0x01, 0x0a, 0xff, 0x90, 0x07, 0x51, 0x01, 0x16, 0xff, 0xc1, 0x07, 0x51, 0x01, 0x17, 0xff, 0x90, 0x07, 0x51, 0x01, 0x1a, 0xff, 0xc1, 0x07, 0x51, 0x01, 0x1b, 0xff, 0x90, 0x07, 0x51, 0x01, 0x3f, 0xff, 0xdc, 0x07, 0x51, 0x0e, 0x78, 0xff, 0xc1, 0x07, 0x53, 0x00, 0x24, 0x00, 0x26, 0x07, 0x53, 0x00, 0x25, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x26, 0xff, 0x90, 0x07, 0x53, 0x00, 0x27, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x29, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x2a, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x2b, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x2d, 0x00, 0x2f, 0x07, 0x53, 0x00, 0x2e, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x2f, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x32, 0xff, 0x90, 0x07, 0x53, 0x00, 0x33, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x34, 0xff, 0x90, 0x07, 0x53, 0x00, 0x35, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x37, 0xfe, 0xe6, 0x07, 0x53, 0x00, 0x39, 0xfe, 0x88, 0x07, 0x53, 0x00, 0x3a, 0xff, 0x03, 0x07, 0x53, 0x00, 0x3b, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x3c, 0xfe, 0x88, 0x07, 0x53, 0x00, 0x49, 0xff, 0xdc, 0x07, 0x53, 0x00, 0x51, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x52, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x55, 0xff, 0xb7, 0x07, 0x53, 0x00, 0x59, 0xff, 0x15, 0x07, 0x53, 0x00, 0x5a, 0xff, 0x3c, 0x07, 0x53, 0x00, 0x5c, 0xff, 0x90, 0x07, 0x53, 0x00, 0x82, 0x00, 0x26, 0x07, 0x53, 0x00, 0x83, 0x00, 0x26, 0x07, 0x53, 0x00, 0x84, 0x00, 0x26, 0x07, 0x53, 0x00, 0x85, 0x00, 0x26, 0x07, 0x53, 0x00, 0x86, 0x00, 0x26, 0x07, 0x53, 0x00, 0x88, 0x00, 0x26, 0x07, 0x53, 0x00, 0x89, 0xff, 0x90, 0x07, 0x53, 0x00, 0x94, 0xff, 0x90, 0x07, 0x53, 0x00, 0x95, 0xff, 0x90, 0x07, 0x53, 0x00, 0x96, 0xff, 0x90, 0x07, 0x53, 0x00, 0x97, 0xff, 0x90, 0x07, 0x53, 0x00, 0x98, 0xff, 0x90, 0x07, 0x53, 0x00, 0x9f, 0xfe, 0x88, 0x07, 0x53, 0x00, 0xa0, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xa1, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb2, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb3, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb4, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb5, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb6, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb7, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xb8, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xbf, 0xff, 0x90, 0x07, 0x53, 0x00, 0xc1, 0xff, 0x90, 0x07, 0x53, 0x00, 0xc8, 0xff, 0x90, 0x07, 0x53, 0x00, 0xce, 0xff, 0x90, 0x07, 0x53, 0x00, 0xd0, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xe0, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xfb, 0xff, 0xb7, 0x07, 0x53, 0x00, 0xff, 0xff, 0xb7, 0x07, 0x53, 0x01, 0x0a, 0xff, 0xb7, 0x07, 0x53, 0x01, 0x16, 0xff, 0xb7, 0x07, 0x53, 0x01, 0x17, 0xff, 0xb7, 0x07, 0x53, 0x01, 0x1a, 0xff, 0xb7, 0x07, 0x53, 0x01, 0x1b, 0xff, 0xb7, 0x07, 0x53, 0x01, 0x26, 0xfe, 0xe6, 0x07, 0x53, 0x01, 0x3a, 0xfe, 0x88, 0x07, 0x53, 0x0e, 0x78, 0xff, 0xb7, 0x0e, 0x60, 0x00, 0x10, 0xff, 0x44, 0x0e, 0x60, 0x00, 0x11, 0xff, 0x0d, 0x0e, 0x60, 0x00, 0x1d, 0xff, 0x1f, 0x0e, 0x60, 0x00, 0x24, 0xff, 0x61, 0x0e, 0x60, 0x00, 0x26, 0xff, 0x88, 0x0e, 0x60, 0x00, 0x37, 0xff, 0xdc, 0x0e, 0x60, 0x00, 0x44, 0xfe, 0xad, 0x0e, 0x60, 0x00, 0x46, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0x48, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0x4c, 0xff, 0xc1, 0x0e, 0x60, 0x00, 0x52, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0x55, 0xfe, 0xd3, 0x0e, 0x60, 0x00, 0x56, 0xfe, 0xad, 0x0e, 0x60, 0x00, 0x58, 0xfe, 0xc9, 0x0e, 0x60, 0x00, 0x5a, 0xfe, 0xad, 0x0e, 0x60, 0x00, 0x5c, 0xfe, 0xc1, 0x0e, 0x60, 0x00, 0x6d, 0xff, 0x44, 0x0e, 0x60, 0x00, 0x7d, 0xff, 0x90, 0x0e, 0x60, 0x00, 0x82, 0xff, 0x61, 0x0e, 0x60, 0x00, 0x83, 0xff, 0x61, 0x0e, 0x60, 0x00, 0x84, 0xff, 0x61, 0x0e, 0x60, 0x00, 0x85, 0xff, 0x61, 0x0e, 0x60, 0x00, 0x86, 0xff, 0x61, 0x0e, 0x60, 0x00, 0x89, 0xff, 0x88, 0x0e, 0x60, 0x00, 0xa2, 0xff, 0x11, 0x0e, 0x60, 0x00, 0xa3, 0xfe, 0xad, 0x0e, 0x60, 0x00, 0xa4, 0xff, 0x11, 0x0e, 0x60, 0x00, 0xa5, 0xff, 0x11, 0x0e, 0x60, 0x00, 0xa6, 0xff, 0x11, 0x0e, 0x60, 0x00, 0xa7, 0xff, 0x11, 0x0e, 0x60, 0x00, 0xa9, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0xaa, 0xfe, 0xe0, 0x0e, 0x60, 0x00, 0xab, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0xac, 0xfe, 0xe0, 0x0e, 0x60, 0x00, 0xad, 0xfe, 0xe0, 0x0e, 0x60, 0x00, 0xb4, 0xfe, 0xf4, 0x0e, 0x60, 0x00, 0xb5, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0xb6, 0xfe, 0xf4, 0x0e, 0x60, 0x00, 0xb7, 0xfe, 0xf4, 0x0e, 0x60, 0x00, 0xb8, 0xfe, 0xf4, 0x0e, 0x60, 0x00, 0xbb, 0xfe, 0xe7, 0x0e, 0x60, 0x00, 0xbc, 0xfe, 0xc9, 0x0e, 0x60, 0x00, 0xbd, 0xfe, 0xe7, 0x0e, 0x60, 0x00, 0xbe, 0xfe, 0xe7, 0x0e, 0x60, 0x00, 0xbf, 0xfe, 0xc1, 0x0e, 0x60, 0x00, 0xc1, 0xfe, 0xc1, 0x0e, 0x60, 0x00, 0xc8, 0xff, 0x88, 0x0e, 0x60, 0x00, 0xc9, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0xce, 0xff, 0x88, 0x0e, 0x60, 0x00, 0xcf, 0xfe, 0xa4, 0x0e, 0x60, 0x00, 0xdd, 0xfe, 0xa4, 0x0e, 0x60, 0x01, 0x17, 0xfe, 0xd3, 0x0e, 0x60, 0x01, 0x1b, 0xfe, 0xd3, 0x0e, 0x60, 0x01, 0x21, 0xfe, 0xad, 0x0e, 0x60, 0x01, 0x23, 0xfe, 0xad, 0x0e, 0x60, 0x01, 0x26, 0xff, 0xdc, 0x0e, 0x60, 0x01, 0x31, 0xfe, 0xc9, 0x0e, 0x60, 0x07, 0x52, 0xff, 0xd3, 0x0e, 0x60, 0x07, 0x53, 0xfe, 0xf8, 0x0e, 0x78, 0x00, 0x10, 0xff, 0x29, 0x0e, 0x78, 0x00, 0x24, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x26, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x32, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x37, 0xff, 0x61, 0x0e, 0x78, 0x00, 0x38, 0xff, 0xc9, 0x0e, 0x78, 0x00, 0x3a, 0xff, 0xb7, 0x0e, 0x78, 0x00, 0x3c, 0xff, 0xb7, 0x0e, 0x78, 0x00, 0x44, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x48, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0x52, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0x58, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0x5c, 0xff, 0x6b, 0x0e, 0x78, 0x00, 0x6d, 0xff, 0x7d, 0x0e, 0x78, 0x00, 0x82, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x83, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x84, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x85, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x86, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0x89, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x94, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x95, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x96, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x97, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x98, 0xff, 0x90, 0x0e, 0x78, 0x00, 0x9b, 0xff, 0xc9, 0x0e, 0x78, 0x00, 0x9c, 0xff, 0xc9, 0x0e, 0x78, 0x00, 0x9d, 0xff, 0xc9, 0x0e, 0x78, 0x00, 0x9e, 0xff, 0xc9, 0x0e, 0x78, 0x00, 0x9f, 0xff, 0xb7, 0x0e, 0x78, 0x00, 0xa2, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0xa3, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0xa4, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0xa5, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0xa6, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0xa7, 0xff, 0xdc, 0x0e, 0x78, 0x00, 0xaa, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xab, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xac, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xad, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xb4, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xb5, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xb6, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xb7, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xb8, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xbb, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xbc, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xbd, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xbe, 0xff, 0x9a, 0x0e, 0x78, 0x00, 0xbf, 0xff, 0x6b, 0x0e, 0x78, 0x00, 0xc1, 0xff, 0x6b, 0x0e, 0x78, 0x00, 0xc8, 0xff, 0x90, 0x0e, 0x78, 0x00, 0xce, 0xff, 0x90, 0x0e, 0x78, 0x00, 0xdd, 0xff, 0x9a, 0x0e, 0x78, 0x01, 0x26, 0xff, 0x61, 0x0e, 0x78, 0x01, 0x30, 0xff, 0xc9, 0x0e, 0x78, 0x01, 0x31, 0xff, 0x9a, 0x0e, 0x78, 0x01, 0x3a, 0xff, 0xb7, 0x0e, 0x78, 0x07, 0x51, 0xff, 0xc1, 0x0e, 0x78, 0x07, 0x52, 0xff, 0xc1, 0x0e, 0x79, 0x00, 0x44, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0x48, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0x52, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0x58, 0xff, 0xc1, 0x0e, 0x79, 0x00, 0x5c, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xa2, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0xa3, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0xa4, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0xa5, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0xa6, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0xa7, 0xff, 0xdc, 0x0e, 0x79, 0x00, 0xaa, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xab, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xac, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xad, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xb4, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xb5, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xb6, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xb7, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xb8, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xbb, 0xff, 0xc1, 0x0e, 0x79, 0x00, 0xbc, 0xff, 0xc1, 0x0e, 0x79, 0x00, 0xbd, 0xff, 0xc1, 0x0e, 0x79, 0x00, 0xbe, 0xff, 0xc1, 0x0e, 0x79, 0x00, 0xbf, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xc1, 0xff, 0xb7, 0x0e, 0x79, 0x00, 0xdd, 0xff, 0xb7, 0x0e, 0x79, 0x01, 0x31, 0xff, 0xc1, 0x0e, 0xaa, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xab, 0x0e, 0xc2, 0xff, 0xb1, 0x0e, 0xac, 0x0e, 0xc2, 0xff, 0xa3, 0x0e, 0xad, 0x0e, 0xc2, 0xff, 0x9c, 0x0e, 0xae, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xb0, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xb1, 0x0e, 0xc2, 0xff, 0xb1, 0x0e, 0xb2, 0x0e, 0xc2, 0xff, 0xa3, 0x0e, 0xb3, 0x0e, 0xc2, 0xff, 0xb1, 0x0e, 0xb4, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xb6, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xb7, 0x0e, 0xc2, 0xff, 0xb1, 0x0e, 0xb8, 0x0e, 0xc2, 0xff, 0xa3, 0x0e, 0xb9, 0x0e, 0xc2, 0xff, 0xb1, 0x0e, 0xba, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xbc, 0x0e, 0xc2, 0xff, 0xd8, 0x0e, 0xbd, 0x0e, 0xc2, 0xff, 0x9c, 0x0e, 0xbe, 0x0e, 0xc2, 0xff, 0xa3, 0x0e, 0xbf, 0x0e, 0xc2, 0xff, 0xb1, 0x0e, 0xc0, 0x0e, 0xc2, 0xff, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x02, 0x2c, 0x00, 0x00, 0x02, 0xc8, 0x00, 0x00, 0x02, 0xe4, 0x00, 0x00, 0x03, 0x20, 0x00, 0x00, 0x03, 0x58, 0x00, 0x00, 0x03, 0xa4, 0x00, 0x00, 0x03, 0xd8, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x04, 0x14, 0x00, 0x00, 0x04, 0x2c, 0x00, 0x00, 0x04, 0x48, 0x00, 0x00, 0x04, 0xa4, 0x00, 0x00, 0x04, 0xd4, 0x00, 0x00, 0x05, 0x34, 0x00, 0x00, 0x05, 0xac, 0x00, 0x00, 0x05, 0xe8, 0x00, 0x00, 0x06, 0x48, 0x00, 0x00, 0x06, 0xc0, 0x00, 0x00, 0x06, 0xe8, 0x00, 0x00, 0x07, 0x74, 0x00, 0x00, 0x07, 0xec, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x68, 0x00, 0x00, 0x08, 0x90, 0x00, 0x00, 0x08, 0xb8, 0x00, 0x00, 0x09, 0x2c, 0x00, 0x00, 0x0a, 0x14, 0x00, 0x00, 0x0a, 0x4c, 0x00, 0x00, 0x0a, 0xb8, 0x00, 0x00, 0x0b, 0x14, 0x00, 0x00, 0x0b, 0x64, 0x00, 0x00, 0x0b, 0x94, 0x00, 0x00, 0x0b, 0xc0, 0x00, 0x00, 0x0c, 0x28, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x00, 0x0c, 0x74, 0x00, 0x00, 0x0c, 0xa0, 0x00, 0x00, 0x0c, 0xd4, 0x00, 0x00, 0x0c, 0xf4, 0x00, 0x00, 0x0d, 0x30, 0x00, 0x00, 0x0d, 0x60, 0x00, 0x00, 0x0d, 0xc4, 0x00, 0x00, 0x0e, 0x08, 0x00, 0x00, 0x0e, 0x7c, 0x00, 0x00, 0x0e, 0xe0, 0x00, 0x00, 0x0f, 0x58, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x0f, 0xc4, 0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x10, 0x30, 0x00, 0x00, 0x10, 0x70, 0x00, 0x00, 0x10, 0xa0, 0x00, 0x00, 0x10, 0xd0, 0x00, 0x00, 0x10, 0xf4, 0x00, 0x00, 0x11, 0x14, 0x00, 0x00, 0x11, 0x38, 0x00, 0x00, 0x11, 0x64, 0x00, 0x00, 0x11, 0x80, 0x00, 0x00, 0x11, 0xa0, 0x00, 0x00, 0x12, 0x10, 0x00, 0x00, 0x12, 0x70, 0x00, 0x00, 0x12, 0xc8, 0x00, 0x00, 0x13, 0x28, 0x00, 0x00, 0x13, 0x8c, 0x00, 0x00, 0x13, 0xcc, 0x00, 0x00, 0x14, 0x48, 0x00, 0x00, 0x14, 0x8c, 0x00, 0x00, 0x14, 0xb0, 0x00, 0x00, 0x14, 0xe8, 0x00, 0x00, 0x15, 0x1c, 0x00, 0x00, 0x15, 0x38, 0x00, 0x00, 0x15, 0xa0, 0x00, 0x00, 0x15, 0xe4, 0x00, 0x00, 0x16, 0x38, 0x00, 0x00, 0x16, 0x98, 0x00, 0x00, 0x16, 0xf8, 0x00, 0x00, 0x17, 0x38, 0x00, 0x00, 0x17, 0xb0, 0x00, 0x00, 0x17, 0xf4, 0x00, 0x00, 0x18, 0x3c, 0x00, 0x00, 0x18, 0x64, 0x00, 0x00, 0x18, 0xa0, 0x00, 0x00, 0x18, 0xe0, 0x00, 0x00, 0x19, 0x20, 0x00, 0x00, 0x19, 0x50, 0x00, 0x00, 0x19, 0xb4, 0x00, 0x00, 0x19, 0xd0, 0x00, 0x00, 0x1a, 0x34, 0x00, 0x00, 0x1a, 0x94, 0x00, 0x00, 0x1a, 0x94, 0x00, 0x00, 0x1a, 0xc4, 0x00, 0x00, 0x1b, 0x3c, 0x00, 0x00, 0x1b, 0x94, 0x00, 0x00, 0x1c, 0x28, 0x00, 0x00, 0x1c, 0x84, 0x00, 0x00, 0x1c, 0xb0, 0x00, 0x00, 0x1d, 0x68, 0x00, 0x00, 0x1d, 0x90, 0x00, 0x00, 0x1e, 0x6c, 0x00, 0x00, 0x1e, 0xe8, 0x00, 0x00, 0x1f, 0x2c, 0x00, 0x00, 0x1f, 0x4c, 0x00, 0x00, 0x1f, 0x68, 0x00, 0x00, 0x20, 0x50, 0x00, 0x00, 0x20, 0x6c, 0x00, 0x00, 0x20, 0xc4, 0x00, 0x00, 0x21, 0x04, 0x00, 0x00, 0x21, 0x58, 0x00, 0x00, 0x21, 0xcc, 0x00, 0x00, 0x21, 0xe8, 0x00, 0x00, 0x22, 0x4c, 0x00, 0x00, 0x22, 0x84, 0x00, 0x00, 0x22, 0x9c, 0x00, 0x00, 0x22, 0xe0, 0x00, 0x00, 0x23, 0x0c, 0x00, 0x00, 0x23, 0x68, 0x00, 0x00, 0x23, 0xb0, 0x00, 0x00, 0x23, 0xd0, 0x00, 0x00, 0x23, 0xf0, 0x00, 0x00, 0x24, 0x10, 0x00, 0x00, 0x24, 0x84, 0x00, 0x00, 0x24, 0x9c, 0x00, 0x00, 0x24, 0xb4, 0x00, 0x00, 0x24, 0xd0, 0x00, 0x00, 0x24, 0xec, 0x00, 0x00, 0x25, 0x08, 0x00, 0x00, 0x25, 0x7c, 0x00, 0x00, 0x25, 0xcc, 0x00, 0x00, 0x25, 0xe4, 0x00, 0x00, 0x25, 0xfc, 0x00, 0x00, 0x26, 0x14, 0x00, 0x00, 0x26, 0x30, 0x00, 0x00, 0x26, 0x4c, 0x00, 0x00, 0x26, 0x64, 0x00, 0x00, 0x26, 0x7c, 0x00, 0x00, 0x26, 0x98, 0x00, 0x00, 0x26, 0xb4, 0x00, 0x00, 0x27, 0x18, 0x00, 0x00, 0x27, 0x34, 0x00, 0x00, 0x27, 0x4c, 0x00, 0x00, 0x27, 0x64, 0x00, 0x00, 0x27, 0x80, 0x00, 0x00, 0x27, 0x9c, 0x00, 0x00, 0x27, 0xb8, 0x00, 0x00, 0x27, 0xfc, 0x00, 0x00, 0x28, 0x94, 0x00, 0x00, 0x28, 0xac, 0x00, 0x00, 0x28, 0xc4, 0x00, 0x00, 0x28, 0xe0, 0x00, 0x00, 0x28, 0xfc, 0x00, 0x00, 0x29, 0x14, 0x00, 0x00, 0x29, 0x5c, 0x00, 0x00, 0x29, 0xe8, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x2a, 0x18, 0x00, 0x00, 0x2a, 0x30, 0x00, 0x00, 0x2a, 0x48, 0x00, 0x00, 0x2a, 0x60, 0x00, 0x00, 0x2a, 0x78, 0x00, 0x00, 0x2b, 0x30, 0x00, 0x00, 0x2b, 0x48, 0x00, 0x00, 0x2b, 0x60, 0x00, 0x00, 0x2b, 0x78, 0x00, 0x00, 0x2b, 0x90, 0x00, 0x00, 0x2b, 0xa8, 0x00, 0x00, 0x2b, 0xc0, 0x00, 0x00, 0x2b, 0xd8, 0x00, 0x00, 0x2b, 0xf4, 0x00, 0x00, 0x2c, 0x10, 0x00, 0x00, 0x2c, 0x98, 0x00, 0x00, 0x2c, 0xb0, 0x00, 0x00, 0x2c, 0xc8, 0x00, 0x00, 0x2c, 0xe0, 0x00, 0x00, 0x2c, 0xf8, 0x00, 0x00, 0x2d, 0x10, 0x00, 0x00, 0x2d, 0x28, 0x00, 0x00, 0x2d, 0x5c, 0x00, 0x00, 0x2d, 0xec, 0x00, 0x00, 0x2e, 0x04, 0x00, 0x00, 0x2e, 0x1c, 0x00, 0x00, 0x2e, 0x34, 0x00, 0x00, 0x2e, 0x4c, 0x00, 0x00, 0x2e, 0x64, 0x00, 0x00, 0x2e, 0xc4, 0x00, 0x00, 0x2e, 0xdc, 0x00, 0x00, 0x2e, 0xf8, 0x00, 0x00, 0x2f, 0x10, 0x00, 0x00, 0x2f, 0x2c, 0x00, 0x00, 0x2f, 0x44, 0x00, 0x00, 0x2f, 0x5c, 0x00, 0x00, 0x2f, 0x74, 0x00, 0x00, 0x2f, 0x8c, 0x00, 0x00, 0x2f, 0xa4, 0x00, 0x00, 0x2f, 0xc0, 0x00, 0x00, 0x2f, 0xd8, 0x00, 0x00, 0x2f, 0xf0, 0x00, 0x00, 0x30, 0x08, 0x00, 0x00, 0x30, 0x24, 0x00, 0x00, 0x30, 0x3c, 0x00, 0x00, 0x30, 0x54, 0x00, 0x00, 0x30, 0x70, 0x00, 0x00, 0x30, 0x80, 0x00, 0x00, 0x30, 0xf4, 0x00, 0x00, 0x31, 0x0c, 0x00, 0x00, 0x31, 0x28, 0x00, 0x00, 0x31, 0x44, 0x00, 0x00, 0x31, 0x60, 0x00, 0x00, 0x31, 0x78, 0x00, 0x00, 0x31, 0x90, 0x00, 0x00, 0x31, 0xa8, 0x00, 0x00, 0x31, 0xc0, 0x00, 0x00, 0x31, 0xdc, 0x00, 0x00, 0x31, 0xf8, 0x00, 0x00, 0x32, 0x14, 0x00, 0x00, 0x32, 0x2c, 0x00, 0x00, 0x32, 0x44, 0x00, 0x00, 0x32, 0x5c, 0x00, 0x00, 0x32, 0x78, 0x00, 0x00, 0x32, 0x90, 0x00, 0x00, 0x32, 0xa8, 0x00, 0x00, 0x32, 0xc0, 0x00, 0x00, 0x32, 0xdc, 0x00, 0x00, 0x32, 0xf8, 0x00, 0x00, 0x33, 0x44, 0x00, 0x00, 0x33, 0x9c, 0x00, 0x00, 0x33, 0xb8, 0x00, 0x00, 0x33, 0xd4, 0x00, 0x00, 0x33, 0xf0, 0x00, 0x00, 0x34, 0x0c, 0x00, 0x00, 0x34, 0x28, 0x00, 0x00, 0x34, 0x44, 0x00, 0x00, 0x34, 0x5c, 0x00, 0x00, 0x34, 0x74, 0x00, 0x00, 0x34, 0x90, 0x00, 0x00, 0x34, 0xb0, 0x00, 0x00, 0x34, 0xcc, 0x00, 0x00, 0x34, 0xe8, 0x00, 0x00, 0x35, 0x04, 0x00, 0x00, 0x35, 0x20, 0x00, 0x00, 0x35, 0x38, 0x00, 0x00, 0x35, 0x50, 0x00, 0x00, 0x35, 0x84, 0x00, 0x00, 0x35, 0x9c, 0x00, 0x00, 0x35, 0xb8, 0x00, 0x00, 0x35, 0xd0, 0x00, 0x00, 0x35, 0xec, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x36, 0x20, 0x00, 0x00, 0x36, 0x38, 0x00, 0x00, 0x36, 0x54, 0x00, 0x00, 0x36, 0x90, 0x00, 0x00, 0x36, 0xc4, 0x00, 0x00, 0x36, 0xe0, 0x00, 0x00, 0x36, 0xf8, 0x00, 0x00, 0x37, 0x10, 0x00, 0x00, 0x37, 0x28, 0x00, 0x00, 0x37, 0x44, 0x00, 0x00, 0x37, 0x5c, 0x00, 0x00, 0x37, 0x74, 0x00, 0x00, 0x37, 0xd0, 0x00, 0x00, 0x38, 0x30, 0x00, 0x00, 0x38, 0x4c, 0x00, 0x00, 0x38, 0x64, 0x00, 0x00, 0x38, 0x80, 0x00, 0x00, 0x38, 0x98, 0x00, 0x00, 0x38, 0xb0, 0x00, 0x00, 0x38, 0xc8, 0x00, 0x00, 0x39, 0x2c, 0x00, 0x00, 0x39, 0xcc, 0x00, 0x00, 0x39, 0xe4, 0x00, 0x00, 0x39, 0xfc, 0x00, 0x00, 0x3a, 0x14, 0x00, 0x00, 0x3a, 0x2c, 0x00, 0x00, 0x3a, 0x48, 0x00, 0x00, 0x3a, 0x60, 0x00, 0x00, 0x3a, 0x78, 0x00, 0x00, 0x3a, 0x90, 0x00, 0x00, 0x3a, 0xac, 0x00, 0x00, 0x3a, 0xc4, 0x00, 0x00, 0x3a, 0xdc, 0x00, 0x00, 0x3a, 0xf4, 0x00, 0x00, 0x3b, 0x10, 0x00, 0x00, 0x3b, 0x2c, 0x00, 0x00, 0x3b, 0x44, 0x00, 0x00, 0x3b, 0x5c, 0x00, 0x00, 0x3b, 0x78, 0x00, 0x00, 0x3b, 0x94, 0x00, 0x00, 0x3b, 0xcc, 0x00, 0x00, 0x3c, 0x24, 0x00, 0x00, 0x3c, 0x40, 0x00, 0x00, 0x3c, 0x58, 0x00, 0x00, 0x3c, 0x74, 0x00, 0x00, 0x3c, 0x8c, 0x00, 0x00, 0x3c, 0xa8, 0x00, 0x00, 0x3c, 0xc0, 0x00, 0x00, 0x3c, 0xd8, 0x00, 0x00, 0x3c, 0xf0, 0x00, 0x00, 0x3d, 0x08, 0x00, 0x00, 0x3d, 0x20, 0x00, 0x00, 0x3d, 0x38, 0x00, 0x00, 0x3d, 0x50, 0x00, 0x00, 0x3d, 0x6c, 0x00, 0x00, 0x3d, 0x88, 0x00, 0x00, 0x3d, 0xa4, 0x00, 0x00, 0x3d, 0xbc, 0x00, 0x00, 0x3d, 0xd8, 0x00, 0x00, 0x3d, 0xf0, 0x00, 0x00, 0x3e, 0x08, 0x00, 0x00, 0x3e, 0x20, 0x00, 0x00, 0x3e, 0x3c, 0x00, 0x00, 0x3e, 0x54, 0x00, 0x00, 0x3e, 0x6c, 0x00, 0x00, 0x3e, 0xa4, 0x00, 0x00, 0x3f, 0x2c, 0x00, 0x00, 0x3f, 0xb0, 0x00, 0x00, 0x3f, 0xc0, 0x00, 0x00, 0x40, 0x3c, 0x00, 0x00, 0x40, 0x94, 0x00, 0x00, 0x40, 0xfc, 0x00, 0x00, 0x41, 0x58, 0x00, 0x00, 0x41, 0xd0, 0x00, 0x00, 0x42, 0x3c, 0x00, 0x00, 0x42, 0x4c, 0x00, 0x00, 0x42, 0xb4, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x43, 0x64, 0x00, 0x00, 0x43, 0xe4, 0x00, 0x00, 0x44, 0x18, 0x00, 0x00, 0x44, 0x80, 0x00, 0x00, 0x44, 0xf8, 0x00, 0x00, 0x45, 0x38, 0x00, 0x00, 0x45, 0x8c, 0x00, 0x00, 0x46, 0x08, 0x00, 0x00, 0x46, 0x88, 0x00, 0x00, 0x47, 0x08, 0x00, 0x00, 0x47, 0x34, 0x00, 0x00, 0x47, 0x60, 0x00, 0x00, 0x47, 0xb8, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x48, 0x2c, 0x00, 0x00, 0x48, 0x74, 0x00, 0x00, 0x48, 0xec, 0x00, 0x00, 0x49, 0x2c, 0x00, 0x00, 0x49, 0x3c, 0x00, 0x00, 0x49, 0xac, 0x00, 0x00, 0x49, 0xc4, 0x00, 0x00, 0x49, 0xdc, 0x00, 0x00, 0x4a, 0x50, 0x00, 0x00, 0x4a, 0xc0, 0x00, 0x00, 0x4b, 0x1c, 0x00, 0x00, 0x4b, 0x8c, 0x00, 0x00, 0x4b, 0xf0, 0x00, 0x00, 0x4c, 0x5c, 0x00, 0x00, 0x4c, 0xd4, 0x00, 0x00, 0x4c, 0xe4, 0x00, 0x00, 0x4d, 0x48, 0x00, 0x00, 0x4d, 0xa0, 0x00, 0x00, 0x4d, 0xd8, 0x00, 0x00, 0x4e, 0x2c, 0x00, 0x00, 0x4e, 0x64, 0x00, 0x00, 0x4e, 0x7c, 0x00, 0x00, 0x4e, 0x94, 0x00, 0x00, 0x4f, 0x04, 0x00, 0x00, 0x4f, 0x64, 0x00, 0x00, 0x4f, 0xbc, 0x00, 0x00, 0x50, 0x24, 0x00, 0x00, 0x50, 0x6c, 0x00, 0x00, 0x50, 0xb0, 0x00, 0x00, 0x51, 0x20, 0x00, 0x00, 0x51, 0x90, 0x00, 0x00, 0x51, 0xfc, 0x00, 0x00, 0x52, 0x68, 0x00, 0x00, 0x52, 0xdc, 0x00, 0x00, 0x53, 0x38, 0x00, 0x00, 0x53, 0x90, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x54, 0x54, 0x00, 0x00, 0x54, 0x70, 0x00, 0x00, 0x54, 0x88, 0x00, 0x00, 0x54, 0xcc, 0x00, 0x00, 0x54, 0xdc, 0x00, 0x00, 0x54, 0xf4, 0x00, 0x00, 0x55, 0x0c, 0x00, 0x00, 0x55, 0x24, 0x00, 0x00, 0x55, 0x3c, 0x00, 0x00, 0x55, 0x54, 0x00, 0x00, 0x55, 0x6c, 0x00, 0x00, 0x55, 0x84, 0x00, 0x00, 0x55, 0x9c, 0x00, 0x00, 0x55, 0xb4, 0x00, 0x00, 0x55, 0xd0, 0x00, 0x00, 0x55, 0xe8, 0x00, 0x00, 0x56, 0x04, 0x00, 0x00, 0x56, 0x20, 0x00, 0x00, 0x56, 0x38, 0x00, 0x00, 0x56, 0x50, 0x00, 0x00, 0x56, 0x6c, 0x00, 0x00, 0x56, 0x84, 0x00, 0x00, 0x56, 0x9c, 0x00, 0x00, 0x56, 0xb4, 0x00, 0x00, 0x56, 0xcc, 0x00, 0x00, 0x56, 0xe4, 0x00, 0x00, 0x56, 0xfc, 0x00, 0x00, 0x57, 0x14, 0x00, 0x00, 0x57, 0x2c, 0x00, 0x00, 0x57, 0x44, 0x00, 0x00, 0x57, 0x54, 0x00, 0x00, 0x57, 0x6c, 0x00, 0x00, 0x57, 0x84, 0x00, 0x00, 0x57, 0x9c, 0x00, 0x00, 0x57, 0xb4, 0x00, 0x00, 0x57, 0xcc, 0x00, 0x00, 0x57, 0xe4, 0x00, 0x00, 0x58, 0x5c, 0x00, 0x00, 0x58, 0xf8, 0x00, 0x00, 0x59, 0x14, 0x00, 0x00, 0x59, 0x2c, 0x00, 0x00, 0x59, 0x44, 0x00, 0x00, 0x59, 0x60, 0x00, 0x00, 0x59, 0x78, 0x00, 0x00, 0x59, 0x90, 0x00, 0x00, 0x59, 0xa8, 0x00, 0x00, 0x59, 0xc0, 0x00, 0x00, 0x59, 0xd8, 0x00, 0x00, 0x59, 0xf0, 0x00, 0x00, 0x5a, 0x0c, 0x00, 0x00, 0x5a, 0x24, 0x00, 0x00, 0x5a, 0x3c, 0x00, 0x00, 0x5a, 0x54, 0x00, 0x00, 0x5a, 0x6c, 0x00, 0x00, 0x5a, 0x84, 0x00, 0x00, 0x5a, 0xe4, 0x00, 0x00, 0x5b, 0x3c, 0x00, 0x00, 0x5b, 0x54, 0x00, 0x00, 0x5b, 0x6c, 0x00, 0x00, 0x5b, 0x84, 0x00, 0x00, 0x5b, 0x9c, 0x00, 0x00, 0x5b, 0xb4, 0x00, 0x00, 0x5b, 0xcc, 0x00, 0x00, 0x5b, 0xe4, 0x00, 0x00, 0x5b, 0xfc, 0x00, 0x00, 0x5c, 0x14, 0x00, 0x00, 0x5c, 0x2c, 0x00, 0x00, 0x5c, 0x44, 0x00, 0x00, 0x5c, 0x5c, 0x00, 0x00, 0x5c, 0x74, 0x00, 0x00, 0x5c, 0x8c, 0x00, 0x00, 0x5c, 0xa4, 0x00, 0x00, 0x5c, 0xbc, 0x00, 0x00, 0x5c, 0xd4, 0x00, 0x00, 0x5c, 0xec, 0x00, 0x00, 0x5d, 0x04, 0x00, 0x00, 0x5d, 0x1c, 0x00, 0x00, 0x5d, 0x34, 0x00, 0x00, 0x5d, 0x4c, 0x00, 0x00, 0x5d, 0x64, 0x00, 0x00, 0x5d, 0x7c, 0x00, 0x00, 0x5d, 0x94, 0x00, 0x00, 0x5d, 0xac, 0x00, 0x00, 0x5d, 0xc4, 0x00, 0x00, 0x5d, 0xdc, 0x00, 0x00, 0x5d, 0xf4, 0x00, 0x00, 0x5e, 0x0c, 0x00, 0x00, 0x5e, 0x24, 0x00, 0x00, 0x5e, 0x3c, 0x00, 0x00, 0x5e, 0x54, 0x00, 0x00, 0x5e, 0x6c, 0x00, 0x00, 0x5e, 0x84, 0x00, 0x00, 0x5e, 0x9c, 0x00, 0x00, 0x5f, 0x24, 0x00, 0x00, 0x5f, 0xb4, 0x00, 0x00, 0x5f, 0xcc, 0x00, 0x00, 0x5f, 0xe8, 0x00, 0x00, 0x60, 0x2c, 0x00, 0x00, 0x60, 0xd0, 0x00, 0x00, 0x61, 0x84, 0x00, 0x00, 0x62, 0x28, 0x00, 0x00, 0x62, 0x74, 0x00, 0x00, 0x62, 0xc0, 0x00, 0x00, 0x62, 0xd8, 0x00, 0x00, 0x62, 0xf0, 0x00, 0x00, 0x63, 0x08, 0x00, 0x00, 0x63, 0x20, 0x00, 0x00, 0x63, 0x38, 0x00, 0x00, 0x63, 0x50, 0x00, 0x00, 0x63, 0x68, 0x00, 0x00, 0x63, 0x80, 0x00, 0x00, 0x63, 0x98, 0x00, 0x00, 0x63, 0xb0, 0x00, 0x00, 0x63, 0xc8, 0x00, 0x00, 0x63, 0xe0, 0x00, 0x00, 0x63, 0xf8, 0x00, 0x00, 0x64, 0x10, 0x00, 0x00, 0x64, 0x64, 0x00, 0x00, 0x64, 0xe8, 0x00, 0x00, 0x65, 0x50, 0x00, 0x00, 0x65, 0x7c, 0x00, 0x00, 0x66, 0x1c, 0x00, 0x00, 0x66, 0xbc, 0x00, 0x00, 0x67, 0x28, 0x00, 0x00, 0x67, 0xbc, 0x00, 0x00, 0x68, 0x48, 0x00, 0x00, 0x68, 0x7c, 0x00, 0x00, 0x68, 0xd0, 0x00, 0x00, 0x69, 0x88, 0x00, 0x00, 0x69, 0xe0, 0x00, 0x00, 0x6a, 0x2c, 0x00, 0x00, 0x6a, 0x7c, 0x00, 0x00, 0x6a, 0xfc, 0x00, 0x00, 0x6b, 0x5c, 0x00, 0x00, 0x6b, 0x6c, 0x00, 0x00, 0x6b, 0xd4, 0x00, 0x00, 0x6c, 0x80, 0x00, 0x00, 0x6c, 0xc0, 0x00, 0x00, 0x6d, 0x08, 0x00, 0x00, 0x6d, 0x84, 0x00, 0x00, 0x6d, 0xf8, 0x00, 0x00, 0x6e, 0x64, 0x00, 0x00, 0x6e, 0xb4, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x6f, 0x60, 0x00, 0x00, 0x6f, 0xd0, 0x00, 0x00, 0x70, 0x30, 0x00, 0x00, 0x70, 0x90, 0x00, 0x00, 0x71, 0x04, 0x00, 0x00, 0x71, 0x5c, 0x00, 0x00, 0x71, 0xec, 0x00, 0x00, 0x72, 0x60, 0x00, 0x00, 0x72, 0xd0, 0x00, 0x00, 0x73, 0x44, 0x00, 0x00, 0x73, 0xa4, 0x00, 0x00, 0x74, 0x4c, 0x00, 0x00, 0x74, 0x5c, 0x00, 0x00, 0x74, 0x6c, 0x00, 0x00, 0x75, 0x1c, 0x00, 0x00, 0x75, 0xac, 0x00, 0x00, 0x75, 0xec, 0x00, 0x00, 0x76, 0x7c, 0x00, 0x00, 0x76, 0xf0, 0x00, 0x00, 0x77, 0x50, 0x00, 0x00, 0x77, 0xcc, 0x00, 0x00, 0x78, 0x48, 0x00, 0x00, 0x78, 0x8c, 0x00, 0x00, 0x78, 0xe0, 0x00, 0x00, 0x79, 0x44, 0x00, 0x00, 0x79, 0x7c, 0x00, 0x00, 0x79, 0x8c, 0x00, 0x00, 0x79, 0xb8, 0x00, 0x00, 0x7a, 0x28, 0x00, 0x00, 0x7a, 0x78, 0x00, 0x00, 0x7a, 0xa8, 0x00, 0x00, 0x7b, 0x1c, 0x00, 0x00, 0x7b, 0x90, 0x00, 0x00, 0x7c, 0x04, 0x00, 0x00, 0x7c, 0x90, 0x00, 0x00, 0x7c, 0xe4, 0x00, 0x00, 0x7d, 0x40, 0x00, 0x00, 0x7d, 0x70, 0x00, 0x00, 0x7d, 0xd4, 0x00, 0x00, 0x7e, 0x38, 0x00, 0x00, 0x7e, 0xb8, 0x00, 0x00, 0x7e, 0xc8, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x7f, 0x38, 0x00, 0x00, 0x7f, 0x80, 0x00, 0x00, 0x7f, 0xc0, 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x80, 0x48, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x80, 0xe4, 0x00, 0x00, 0x81, 0x44, 0x00, 0x00, 0x81, 0xd0, 0x00, 0x00, 0x82, 0x10, 0x00, 0x00, 0x82, 0x6c, 0x00, 0x00, 0x82, 0xac, 0x00, 0x00, 0x83, 0x0c, 0x00, 0x00, 0x83, 0x50, 0x00, 0x00, 0x83, 0x94, 0x00, 0x00, 0x83, 0xf4, 0x00, 0x00, 0x84, 0x58, 0x00, 0x00, 0x84, 0xbc, 0x00, 0x00, 0x84, 0xe4, 0x00, 0x00, 0x85, 0x1c, 0x00, 0x00, 0x85, 0x64, 0x00, 0x00, 0x85, 0x94, 0x00, 0x00, 0x85, 0xd8, 0x00, 0x00, 0x86, 0x48, 0x00, 0x00, 0x86, 0xb0, 0x00, 0x00, 0x87, 0x40, 0x00, 0x00, 0x87, 0x9c, 0x00, 0x00, 0x87, 0xfc, 0x00, 0x00, 0x88, 0x5c, 0x00, 0x00, 0x88, 0xcc, 0x00, 0x00, 0x89, 0x54, 0x00, 0x00, 0x89, 0x64, 0x00, 0x00, 0x89, 0xf8, 0x00, 0x00, 0x8a, 0x70, 0x00, 0x00, 0x8a, 0x80, 0x00, 0x00, 0x8a, 0xd4, 0x00, 0x00, 0x8b, 0x0c, 0x00, 0x00, 0x8b, 0x2c, 0x00, 0x00, 0x8b, 0xa0, 0x00, 0x00, 0x8c, 0x10, 0x00, 0x00, 0x8c, 0x80, 0x00, 0x00, 0x8d, 0x10, 0x00, 0x00, 0x8d, 0xd8, 0x00, 0x00, 0x8e, 0x94, 0x00, 0x00, 0x8f, 0x38, 0x00, 0x00, 0x8f, 0xc4, 0x00, 0x00, 0x90, 0x94, 0x00, 0x00, 0x91, 0x28, 0x00, 0x00, 0x91, 0xa0, 0x00, 0x00, 0x91, 0xdc, 0x00, 0x00, 0x92, 0x40, 0x00, 0x00, 0x92, 0x80, 0x00, 0x00, 0x92, 0xd0, 0x00, 0x00, 0x93, 0x34, 0x00, 0x00, 0x93, 0x78, 0x00, 0x00, 0x93, 0xcc, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x94, 0x48, 0x00, 0x00, 0x94, 0x88, 0x00, 0x00, 0x94, 0xdc, 0x00, 0x00, 0x95, 0x48, 0x00, 0x00, 0x95, 0x80, 0x00, 0x00, 0x95, 0xc4, 0x00, 0x00, 0x95, 0xd4, 0x00, 0x00, 0x95, 0xec, 0x00, 0x00, 0x95, 0xfc, 0x00, 0x00, 0x96, 0x0c, 0x00, 0x00, 0x96, 0x30, 0x00, 0x00, 0x96, 0x64, 0x00, 0x00, 0x96, 0x9c, 0x00, 0x00, 0x96, 0xf8, 0x00, 0x00, 0x97, 0x58, 0x00, 0x00, 0x97, 0x80, 0x00, 0x00, 0x97, 0xa8, 0x00, 0x00, 0x97, 0xd0, 0x00, 0x00, 0x97, 0xf8, 0x00, 0x00, 0x98, 0x1c, 0x00, 0x00, 0x98, 0x44, 0x00, 0x00, 0x98, 0x60, 0x00, 0x00, 0x98, 0x70, 0x00, 0x00, 0x98, 0x8c, 0x00, 0x00, 0x98, 0xac, 0x00, 0x00, 0x98, 0xc8, 0x00, 0x00, 0x98, 0xdc, 0x00, 0x00, 0x98, 0xfc, 0x00, 0x00, 0x99, 0x18, 0x00, 0x00, 0x99, 0x40, 0x00, 0x00, 0x99, 0x5c, 0x00, 0x00, 0x99, 0x70, 0x00, 0x00, 0x99, 0x84, 0x00, 0x00, 0x99, 0xa8, 0x00, 0x00, 0x99, 0xcc, 0x00, 0x00, 0x99, 0xf8, 0x00, 0x00, 0x9a, 0x14, 0x00, 0x00, 0x9a, 0x48, 0x00, 0x00, 0x9a, 0x64, 0x00, 0x00, 0x9a, 0xb0, 0x00, 0x00, 0x9a, 0xf0, 0x00, 0x00, 0x9b, 0x4c, 0x00, 0x00, 0x9b, 0x78, 0x00, 0x00, 0x9b, 0xb0, 0x00, 0x00, 0x9b, 0xe4, 0x00, 0x00, 0x9c, 0x30, 0x00, 0x00, 0x9c, 0x4c, 0x00, 0x00, 0x9c, 0xe4, 0x00, 0x00, 0x9d, 0x1c, 0x00, 0x00, 0x9d, 0x2c, 0x00, 0x00, 0x9d, 0x4c, 0x00, 0x00, 0x9d, 0x70, 0x00, 0x00, 0x9d, 0x94, 0x00, 0x00, 0x9d, 0xb8, 0x00, 0x00, 0x9d, 0xd8, 0x00, 0x00, 0x9d, 0xec, 0x00, 0x00, 0x9e, 0x04, 0x00, 0x00, 0x9e, 0x14, 0x00, 0x00, 0x9e, 0x28, 0x00, 0x00, 0x9e, 0x94, 0x00, 0x00, 0x9e, 0xbc, 0x00, 0x00, 0x9e, 0xe0, 0x00, 0x00, 0x9f, 0x0c, 0x00, 0x00, 0x9f, 0x20, 0x00, 0x00, 0x9f, 0x34, 0x00, 0x00, 0x9f, 0x48, 0x00, 0x00, 0x9f, 0x5c, 0x00, 0x00, 0x9f, 0x7c, 0x00, 0x00, 0x9f, 0xa8, 0x00, 0x00, 0x9f, 0xfc, 0x00, 0x00, 0xa0, 0x10, 0x00, 0x00, 0xa0, 0x24, 0x00, 0x00, 0xa0, 0x50, 0x00, 0x00, 0xa0, 0x6c, 0x00, 0x00, 0xa0, 0x88, 0x00, 0x00, 0xa0, 0xb4, 0x00, 0x00, 0xa0, 0xd0, 0x00, 0x00, 0xa1, 0x04, 0x00, 0x00, 0xa1, 0x20, 0x00, 0x00, 0xa1, 0x48, 0x00, 0x00, 0xa1, 0x6c, 0x00, 0x00, 0xa1, 0x88, 0x00, 0x00, 0xa1, 0x9c, 0x00, 0x00, 0xa1, 0xb0, 0x00, 0x00, 0xa1, 0xd4, 0x00, 0x00, 0xa1, 0xf4, 0x00, 0x00, 0xa2, 0x14, 0x00, 0x00, 0xa2, 0x58, 0x00, 0x00, 0xa2, 0x8c, 0x00, 0x00, 0xa2, 0xb0, 0x00, 0x00, 0xa2, 0xd4, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0xa3, 0x1c, 0x00, 0x00, 0xa3, 0x4c, 0x00, 0x00, 0xa3, 0x7c, 0x00, 0x00, 0xa3, 0x94, 0x00, 0x00, 0xa3, 0xa8, 0x00, 0x00, 0xa3, 0xf4, 0x00, 0x00, 0xa4, 0x10, 0x00, 0x00, 0xa4, 0x24, 0x00, 0x00, 0xa4, 0x38, 0x00, 0x00, 0xa4, 0x54, 0x00, 0x00, 0xa4, 0x78, 0x00, 0x00, 0xa4, 0xc0, 0x00, 0x00, 0xa4, 0xd4, 0x00, 0x00, 0xa4, 0xe8, 0x00, 0x00, 0xa4, 0xfc, 0x00, 0x00, 0xa5, 0x30, 0x00, 0x00, 0xa5, 0x44, 0x00, 0x00, 0xa5, 0x58, 0x00, 0x00, 0xa5, 0x6c, 0x00, 0x00, 0xa5, 0x80, 0x00, 0x00, 0xa5, 0xdc, 0x00, 0x00, 0xa5, 0xf8, 0x00, 0x00, 0xa6, 0x14, 0x00, 0x00, 0xa6, 0x34, 0x00, 0x00, 0xa6, 0x54, 0x00, 0x00, 0xa6, 0x84, 0x00, 0x00, 0xa6, 0xa8, 0x00, 0x00, 0xa6, 0xd0, 0x00, 0x00, 0xa7, 0x18, 0x00, 0x00, 0xa7, 0x4c, 0x00, 0x00, 0xa7, 0xac, 0x00, 0x00, 0xa7, 0xc8, 0x00, 0x00, 0xa7, 0xdc, 0x00, 0x00, 0xa7, 0xf0, 0x00, 0x00, 0xa8, 0x04, 0x00, 0x00, 0xa8, 0x14, 0x00, 0x00, 0xa8, 0x28, 0x00, 0x00, 0xa8, 0x3c, 0x00, 0x00, 0xa8, 0x60, 0x00, 0x00, 0xa8, 0x88, 0x00, 0x00, 0xa8, 0xb0, 0x00, 0x00, 0xa8, 0xd0, 0x00, 0x00, 0xa9, 0x4c, 0x00, 0x00, 0xa9, 0xc0, 0x00, 0x00, 0xa9, 0xd8, 0x00, 0x00, 0xaa, 0x10, 0x00, 0x00, 0xaa, 0x38, 0x00, 0x00, 0xaa, 0x38, 0x00, 0x00, 0xaa, 0x78, 0x00, 0x00, 0xaa, 0x90, 0x00, 0x00, 0xaa, 0xa4, 0x00, 0x00, 0xaa, 0xe4, 0x00, 0x00, 0xaa, 0xf8, 0x00, 0x00, 0xab, 0x5c, 0x00, 0x00, 0xab, 0x70, 0x00, 0x00, 0xab, 0x84, 0x00, 0x00, 0xab, 0xa0, 0x00, 0x00, 0xab, 0xbc, 0x00, 0x00, 0xac, 0x30, 0x00, 0x00, 0xac, 0x44, 0x00, 0x00, 0xac, 0x6c, 0x00, 0x00, 0xac, 0x7c, 0x00, 0x00, 0xac, 0x8c, 0x00, 0x00, 0xac, 0xbc, 0x00, 0x00, 0xac, 0xec, 0x00, 0x00, 0xad, 0x08, 0x00, 0x00, 0xad, 0x24, 0x00, 0x00, 0xad, 0x34, 0x00, 0x00, 0xad, 0x44, 0x00, 0x00, 0xad, 0x78, 0x00, 0x00, 0xad, 0x88, 0x00, 0x00, 0xad, 0xa0, 0x00, 0x00, 0xad, 0xb8, 0x00, 0x00, 0xad, 0xc8, 0x00, 0x00, 0xad, 0xe4, 0x00, 0x00, 0xae, 0x00, 0x00, 0x00, 0xae, 0x18, 0x00, 0x00, 0xae, 0x28, 0x00, 0x00, 0xae, 0x44, 0x00, 0x00, 0xae, 0x60, 0x00, 0x00, 0xae, 0x7c, 0x00, 0x00, 0xae, 0x94, 0x00, 0x00, 0xae, 0xb0, 0x00, 0x00, 0xae, 0xc8, 0x00, 0x00, 0xae, 0xe0, 0x00, 0x00, 0xae, 0xf0, 0x00, 0x00, 0xaf, 0x00, 0x00, 0x00, 0xaf, 0x20, 0x00, 0x00, 0xaf, 0x50, 0x00, 0x00, 0xaf, 0x60, 0x00, 0x00, 0xaf, 0x70, 0x00, 0x00, 0xaf, 0x80, 0x00, 0x00, 0xaf, 0xfc, 0x00, 0x00, 0xb0, 0x0c, 0x00, 0x00, 0xb0, 0x1c, 0x00, 0x00, 0xb0, 0x44, 0x00, 0x00, 0xb0, 0x54, 0x00, 0x00, 0xb0, 0x64, 0x00, 0x00, 0xb0, 0x9c, 0x00, 0x00, 0xb0, 0xac, 0x00, 0x00, 0xb0, 0xbc, 0x00, 0x00, 0xb0, 0xcc, 0x00, 0x00, 0xb1, 0x04, 0x00, 0x00, 0xb1, 0x14, 0x00, 0x00, 0xb1, 0x24, 0x00, 0x00, 0xb1, 0xa8, 0x00, 0x00, 0xb1, 0xb8, 0x00, 0x00, 0xb2, 0x20, 0x00, 0x00, 0xb2, 0x9c, 0x00, 0x00, 0xb2, 0xb8, 0x00, 0x00, 0xb2, 0xd4, 0x00, 0x00, 0xb2, 0xec, 0x00, 0x00, 0xb3, 0x04, 0x00, 0x00, 0xb3, 0x1c, 0x00, 0x00, 0xb3, 0x34, 0x00, 0x00, 0xb3, 0x4c, 0x00, 0x00, 0xb3, 0xd4, 0x00, 0x00, 0xb4, 0x38, 0x00, 0x00, 0xb4, 0x78, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xb5, 0x9c, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0xb6, 0x48, 0x00, 0x00, 0xb6, 0xc4, 0x00, 0x00, 0xb6, 0xf8, 0x00, 0x00, 0xb7, 0x30, 0x00, 0x00, 0xb7, 0x70, 0x00, 0x00, 0xb7, 0x80, 0x00, 0x00, 0xb7, 0xd0, 0x00, 0x00, 0xb8, 0x4c, 0x00, 0x00, 0xb8, 0x5c, 0x00, 0x00, 0xb8, 0xa8, 0x00, 0x00, 0xb9, 0x0c, 0x00, 0x00, 0xb9, 0x80, 0x00, 0x00, 0xb9, 0xe4, 0x00, 0x00, 0xba, 0x20, 0x00, 0x00, 0xba, 0x80, 0x00, 0x00, 0xbb, 0x04, 0x00, 0x00, 0xbb, 0x60, 0x00, 0x00, 0xbb, 0xbc, 0x00, 0x00, 0xbc, 0x18, 0x00, 0x00, 0xbc, 0x30, 0x00, 0x00, 0xbc, 0x48, 0x00, 0x00, 0xbc, 0x60, 0x00, 0x00, 0xbc, 0x78, 0x00, 0x00, 0xbc, 0x90, 0x00, 0x00, 0xbc, 0xcc, 0x00, 0x00, 0xbd, 0x54, 0x00, 0x00, 0xbd, 0xc4, 0x00, 0x00, 0xbe, 0x34, 0x00, 0x00, 0xbe, 0x50, 0x00, 0x00, 0xbe, 0x68, 0x00, 0x00, 0xbe, 0xf0, 0x00, 0x00, 0xbf, 0x58, 0x00, 0x00, 0xc0, 0x04, 0x00, 0x00, 0xc0, 0x78, 0x00, 0x00, 0xc0, 0xe4, 0x00, 0x00, 0xc1, 0x58, 0x00, 0x00, 0xc1, 0xc0, 0x00, 0x00, 0xc1, 0xd0, 0x00, 0x00, 0xc2, 0x48, 0x00, 0x00, 0xc2, 0xa4, 0x00, 0x00, 0xc2, 0xd0, 0x00, 0x00, 0xc3, 0x44, 0x00, 0x00, 0xc3, 0xa0, 0x00, 0x00, 0xc4, 0x60, 0x00, 0x00, 0xc4, 0xe0, 0x00, 0x00, 0xc5, 0x48, 0x00, 0x00, 0xc5, 0xa8, 0x00, 0x00, 0xc6, 0x24, 0x00, 0x00, 0xc7, 0x0c, 0x00, 0x00, 0xc7, 0x80, 0x00, 0x00, 0xc7, 0xec, 0x00, 0x00, 0xc8, 0x9c, 0x00, 0x00, 0xc9, 0x4c, 0x00, 0x00, 0xc9, 0xe0, 0x00, 0x00, 0xca, 0x78, 0x00, 0x00, 0xca, 0xb0, 0x00, 0x00, 0xca, 0xe8, 0x00, 0x00, 0xcb, 0x84, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xcc, 0x10, 0x00, 0x00, 0xcc, 0x20, 0x00, 0x00, 0xcc, 0x30, 0x00, 0x00, 0xcc, 0x9c, 0x00, 0x00, 0xcd, 0x08, 0x00, 0x00, 0xcd, 0x18, 0x00, 0x00, 0xcd, 0x28, 0x00, 0x00, 0xcd, 0x38, 0x00, 0x00, 0xcd, 0x74, 0x00, 0x00, 0xcd, 0xac, 0x00, 0x00, 0xce, 0x2c, 0x00, 0x00, 0xce, 0x3c, 0x00, 0x00, 0xce, 0x54, 0x00, 0x00, 0xce, 0x6c, 0x00, 0x00, 0xce, 0x84, 0x00, 0x00, 0xce, 0xa0, 0x00, 0x00, 0xce, 0xf8, 0x00, 0x00, 0xcf, 0x10, 0x00, 0x00, 0xcf, 0x68, 0x00, 0x00, 0xcf, 0x78, 0x00, 0x00, 0xcf, 0x88, 0x00, 0x00, 0xcf, 0x98, 0x00, 0x00, 0xcf, 0xa8, 0x00, 0x00, 0xd0, 0x0c, 0x00, 0x00, 0xd0, 0x68, 0x00, 0x00, 0xd0, 0xac, 0x00, 0x00, 0xd0, 0xc4, 0x00, 0x00, 0xd0, 0xdc, 0x00, 0x00, 0xd0, 0xf4, 0x00, 0x00, 0xd1, 0x24, 0x00, 0x00, 0xd1, 0x34, 0x00, 0x00, 0xd1, 0x84, 0x00, 0x00, 0xd1, 0x94, 0x00, 0x00, 0xd1, 0xb4, 0x00, 0x00, 0xd2, 0x0c, 0x00, 0x00, 0xd2, 0x1c, 0x00, 0x00, 0xd2, 0x74, 0x00, 0x00, 0xd2, 0xec, 0x00, 0x00, 0xd3, 0x1c, 0x00, 0x00, 0xd3, 0x38, 0x00, 0x00, 0xd3, 0x70, 0x00, 0x00, 0xd3, 0xac, 0x00, 0x00, 0xd3, 0xbc, 0x00, 0x00, 0xd3, 0xcc, 0x00, 0x00, 0xd3, 0xdc, 0x00, 0x00, 0xd4, 0x04, 0x00, 0x00, 0xd4, 0x14, 0x00, 0x00, 0xd4, 0x24, 0x00, 0x00, 0xd4, 0x34, 0x00, 0x00, 0xd4, 0x78, 0x00, 0x00, 0xd4, 0xf0, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd5, 0x30, 0x00, 0x00, 0xd5, 0x68, 0x00, 0x00, 0xd5, 0x98, 0x00, 0x00, 0xd5, 0xd4, 0x00, 0x00, 0xd6, 0x28, 0x00, 0x00, 0xd6, 0x40, 0x00, 0x00, 0xd6, 0x90, 0x00, 0x00, 0xd6, 0xe8, 0x00, 0x00, 0xd7, 0x70, 0x00, 0x00, 0xd7, 0xc4, 0x00, 0x00, 0xd7, 0xd4, 0x00, 0x00, 0xd8, 0x60, 0x00, 0x00, 0xd8, 0xcc, 0x00, 0x00, 0xd8, 0xec, 0x00, 0x00, 0xd9, 0x40, 0x00, 0x00, 0xd9, 0x50, 0x00, 0x00, 0xd9, 0xa8, 0x00, 0x00, 0xda, 0x1c, 0x00, 0x00, 0xda, 0x4c, 0x00, 0x00, 0xda, 0x68, 0x00, 0x00, 0xda, 0xa0, 0x00, 0x00, 0xda, 0xdc, 0x00, 0x00, 0xdb, 0x18, 0x00, 0x00, 0xdb, 0x48, 0x00, 0x00, 0xdb, 0x58, 0x00, 0x00, 0xdb, 0x80, 0x00, 0x00, 0xdb, 0x90, 0x00, 0x00, 0xdb, 0xa0, 0x00, 0x00, 0xdb, 0xc8, 0x00, 0x00, 0xdb, 0xd8, 0x00, 0x00, 0xdc, 0x80, 0x00, 0x00, 0xdc, 0x90, 0x00, 0x00, 0xdc, 0xc0, 0x00, 0x00, 0xdd, 0x00, 0x00, 0x00, 0xdd, 0x30, 0x00, 0x00, 0xdd, 0x6c, 0x00, 0x00, 0xdd, 0xb8, 0x00, 0x00, 0xdd, 0xd0, 0x00, 0x00, 0xde, 0x18, 0x00, 0x00, 0xde, 0x6c, 0x00, 0x00, 0xde, 0xd4, 0x00, 0x00, 0xdf, 0x28, 0x00, 0x00, 0xdf, 0x40, 0x00, 0x00, 0xdf, 0x5c, 0x00, 0x00, 0xdf, 0xc0, 0x00, 0x00, 0xdf, 0xd8, 0x00, 0x00, 0xe0, 0x30, 0x00, 0x00, 0xe0, 0x40, 0x00, 0x00, 0xe0, 0x50, 0x00, 0x00, 0xe0, 0x60, 0x00, 0x00, 0xe0, 0x70, 0x00, 0x00, 0xe0, 0xd4, 0x00, 0x00, 0xe1, 0x30, 0x00, 0x00, 0xe1, 0x88, 0x00, 0x00, 0xe1, 0xa0, 0x00, 0x00, 0xe1, 0xb8, 0x00, 0x00, 0xe1, 0xd0, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0xe2, 0xa0, 0x00, 0x00, 0xe2, 0xb0, 0x00, 0x00, 0xe3, 0x10, 0x00, 0x00, 0xe3, 0x68, 0x00, 0x00, 0xe3, 0xf4, 0x00, 0x00, 0xe4, 0x64, 0x00, 0x00, 0xe4, 0xa4, 0x00, 0x00, 0xe4, 0xe4, 0x00, 0x00, 0xe5, 0x3c, 0x00, 0x00, 0xe5, 0x94, 0x00, 0x00, 0xe5, 0xfc, 0x00, 0x00, 0xe6, 0x64, 0x00, 0x00, 0xe6, 0xe0, 0x00, 0x00, 0xe7, 0x58, 0x00, 0x00, 0xe8, 0x44, 0x00, 0x00, 0xe9, 0x20, 0x00, 0x00, 0xe9, 0x84, 0x00, 0x00, 0xe9, 0xe8, 0x00, 0x00, 0xe9, 0xf8, 0x00, 0x00, 0xea, 0x08, 0x00, 0x00, 0xea, 0x54, 0x00, 0x00, 0xea, 0xa4, 0x00, 0x00, 0xea, 0xbc, 0x00, 0x00, 0xea, 0xd4, 0x00, 0x00, 0xeb, 0x78, 0x00, 0x00, 0xeb, 0xfc, 0x00, 0x00, 0xec, 0xf4, 0x00, 0x00, 0xed, 0xdc, 0x00, 0x00, 0xee, 0xb8, 0x00, 0x00, 0xef, 0x68, 0x00, 0x00, 0xef, 0x80, 0x00, 0x00, 0xef, 0x98, 0x00, 0x00, 0xef, 0xfc, 0x00, 0x00, 0xf0, 0x58, 0x00, 0x00, 0xf0, 0xa4, 0x00, 0x00, 0xf1, 0x3c, 0x00, 0x00, 0xf1, 0x70, 0x00, 0x00, 0xf1, 0x98, 0x00, 0x00, 0xf1, 0xc0, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x00, 0xf3, 0x44, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xf4, 0x18, 0x00, 0x00, 0xf4, 0x30, 0x00, 0x00, 0xf4, 0x90, 0x00, 0x00, 0xf4, 0xf4, 0x00, 0x00, 0xf5, 0x54, 0x00, 0x00, 0xf5, 0xd8, 0x00, 0x00, 0xf5, 0xfc, 0x00, 0x00, 0xf6, 0x20, 0x00, 0x00, 0xf6, 0x54, 0x00, 0x00, 0xf6, 0x88, 0x00, 0x00, 0xf6, 0xe0, 0x00, 0x00, 0xf7, 0x3c, 0x00, 0x00, 0xf7, 0xa0, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x00, 0x00, 0xf8, 0x30, 0x00, 0x00, 0xf8, 0x74, 0x00, 0x00, 0xf8, 0xb8, 0x00, 0x00, 0xf9, 0x04, 0x00, 0x00, 0xf9, 0x4c, 0x00, 0x00, 0xf9, 0x98, 0x00, 0x00, 0xf9, 0xe4, 0x00, 0x00, 0xfa, 0x24, 0x00, 0x00, 0xfa, 0x64, 0x00, 0x00, 0xfa, 0xa0, 0x00, 0x00, 0xfa, 0xdc, 0x00, 0x00, 0xfb, 0x14, 0x00, 0x00, 0xfb, 0x4c, 0x00, 0x00, 0xfb, 0xac, 0x00, 0x00, 0xfc, 0x10, 0x00, 0x00, 0xfd, 0x04, 0x00, 0x00, 0xfd, 0xe0, 0x00, 0x00, 0xfd, 0xf8, 0x00, 0x00, 0xfe, 0x10, 0x00, 0x00, 0xfe, 0x40, 0x00, 0x00, 0xfe, 0x70, 0x00, 0x00, 0xfe, 0x80, 0x00, 0x00, 0xfe, 0xb0, 0x00, 0x00, 0xfe, 0xf4, 0x00, 0x00, 0xff, 0x34, 0x00, 0x00, 0xff, 0x7c, 0x00, 0x00, 0xff, 0xc4, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x3c, 0x00, 0x01, 0x00, 0x84, 0x00, 0x01, 0x00, 0xcc, 0x00, 0x01, 0x01, 0x1c, 0x00, 0x01, 0x01, 0x68, 0x00, 0x01, 0x01, 0xa4, 0x00, 0x01, 0x01, 0xb4, 0x00, 0x01, 0x02, 0x44, 0x00, 0x01, 0x02, 0xd4, 0x00, 0x01, 0x03, 0x6c, 0x00, 0x01, 0x04, 0x04, 0x00, 0x01, 0x04, 0x14, 0x00, 0x01, 0x04, 0x2c, 0x00, 0x01, 0x04, 0x44, 0x00, 0x01, 0x04, 0xa0, 0x00, 0x01, 0x05, 0x00, 0x00, 0x01, 0x05, 0x4c, 0x00, 0x01, 0x05, 0x98, 0x00, 0x01, 0x05, 0xe0, 0x00, 0x01, 0x06, 0x28, 0x00, 0x01, 0x06, 0x64, 0x00, 0x01, 0x06, 0xa0, 0x00, 0x01, 0x06, 0xe8, 0x00, 0x01, 0x07, 0x30, 0x00, 0x01, 0x07, 0x7c, 0x00, 0x01, 0x07, 0xc4, 0x00, 0x01, 0x07, 0xd4, 0x00, 0x01, 0x07, 0xf0, 0x00, 0x01, 0x08, 0x08, 0x00, 0x01, 0x08, 0x24, 0x00, 0x01, 0x08, 0x3c, 0x00, 0x01, 0x08, 0x4c, 0x00, 0x01, 0x08, 0x5c, 0x00, 0x01, 0x08, 0x78, 0x00, 0x01, 0x08, 0x94, 0x00, 0x01, 0x08, 0xa4, 0x00, 0x01, 0x08, 0xb4, 0x00, 0x01, 0x08, 0xcc, 0x00, 0x01, 0x08, 0xe4, 0x00, 0x01, 0x08, 0xfc, 0x00, 0x01, 0x09, 0x14, 0x00, 0x01, 0x09, 0x2c, 0x00, 0x01, 0x09, 0x44, 0x00, 0x01, 0x09, 0x54, 0x00, 0x01, 0x09, 0x64, 0x00, 0x01, 0x09, 0x7c, 0x00, 0x01, 0x09, 0x94, 0x00, 0x01, 0x09, 0xac, 0x00, 0x01, 0x09, 0xc4, 0x00, 0x01, 0x09, 0xe0, 0x00, 0x01, 0x09, 0xf8, 0x00, 0x01, 0x0a, 0x08, 0x00, 0x01, 0x0a, 0x18, 0x00, 0x01, 0x0a, 0x30, 0x00, 0x01, 0x0a, 0x48, 0x00, 0x01, 0x0a, 0x60, 0x00, 0x01, 0x0a, 0x78, 0x00, 0x01, 0x0a, 0x90, 0x00, 0x01, 0x0a, 0xa8, 0x00, 0x01, 0x0a, 0xc0, 0x00, 0x01, 0x0a, 0xd8, 0x00, 0x01, 0x0a, 0xf0, 0x00, 0x01, 0x0b, 0x08, 0x00, 0x01, 0x0b, 0x20, 0x00, 0x01, 0x0b, 0x38, 0x00, 0x01, 0x0b, 0x60, 0x00, 0x01, 0x0b, 0x88, 0x00, 0x01, 0x0b, 0xa0, 0x00, 0x01, 0x0b, 0xb8, 0x00, 0x01, 0x0c, 0x08, 0x00, 0x01, 0x0c, 0x58, 0x00, 0x01, 0x0c, 0xb8, 0x00, 0x01, 0x0d, 0x18, 0x00, 0x01, 0x0d, 0x68, 0x00, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x0e, 0x08, 0x00, 0x01, 0x0e, 0x5c, 0x00, 0x01, 0x0e, 0xf0, 0x00, 0x01, 0x0f, 0x80, 0x00, 0x01, 0x10, 0x20, 0x00, 0x01, 0x10, 0xbc, 0x00, 0x01, 0x11, 0x38, 0x00, 0x01, 0x11, 0xb4, 0x00, 0x01, 0x12, 0x24, 0x00, 0x01, 0x12, 0x90, 0x00, 0x01, 0x12, 0xa0, 0x00, 0x01, 0x12, 0xfc, 0x00, 0x01, 0x13, 0x5c, 0x00, 0x01, 0x13, 0xb4, 0x00, 0x01, 0x14, 0x08, 0x00, 0x01, 0x14, 0x5c, 0x00, 0x01, 0x14, 0x6c, 0x00, 0x01, 0x14, 0x7c, 0x00, 0x01, 0x14, 0xcc, 0x00, 0x01, 0x15, 0x1c, 0x00, 0x01, 0x15, 0x80, 0x00, 0x01, 0x15, 0xe8, 0x00, 0x01, 0x16, 0x48, 0x00, 0x01, 0x16, 0xc0, 0x00, 0x01, 0x17, 0x28, 0x00, 0x01, 0x17, 0xc0, 0x00, 0x01, 0x17, 0xd0, 0x00, 0x01, 0x17, 0xe0, 0x00, 0x01, 0x17, 0xf0, 0x00, 0x01, 0x18, 0x00, 0x00, 0x01, 0x18, 0x54, 0x00, 0x01, 0x18, 0xa0, 0x00, 0x01, 0x19, 0x14, 0x00, 0x01, 0x19, 0x88, 0x00, 0x01, 0x19, 0xf0, 0x00, 0x01, 0x1a, 0x5c, 0x00, 0x01, 0x1a, 0x8c, 0x00, 0x01, 0x1a, 0xbc, 0x00, 0x01, 0x1a, 0xf4, 0x00, 0x01, 0x1b, 0x44, 0x00, 0x01, 0x1c, 0x1c, 0x00, 0x01, 0x1c, 0x88, 0x00, 0x01, 0x1c, 0x98, 0x00, 0x01, 0x1c, 0xe0, 0x00, 0x01, 0x1d, 0x38, 0x00, 0x01, 0x1d, 0x68, 0x00, 0x01, 0x1d, 0xf8, 0x00, 0x01, 0x1e, 0x1c, 0x00, 0x01, 0x1e, 0x58, 0x00, 0x01, 0x1e, 0x68, 0x00, 0x01, 0x1e, 0xa0, 0x00, 0x01, 0x1e, 0xb0, 0x00, 0x01, 0x1e, 0xc0, 0x00, 0x01, 0x1e, 0xd0, 0x00, 0x01, 0x1e, 0xe0, 0x00, 0x01, 0x1f, 0x34, 0x00, 0x01, 0x1f, 0x88, 0x00, 0x01, 0x20, 0x18, 0x00, 0x01, 0x20, 0xd4, 0x00, 0x01, 0x21, 0x0c, 0x00, 0x01, 0x21, 0x44, 0x00, 0x01, 0x21, 0x88, 0x00, 0x01, 0x21, 0xf8, 0x00, 0x01, 0x22, 0x68, 0x00, 0x01, 0x22, 0x78, 0x00, 0x01, 0x22, 0xb0, 0x00, 0x01, 0x22, 0xf4, 0x00, 0x01, 0x23, 0x50, 0x00, 0x01, 0x23, 0xc4, 0x00, 0x01, 0x23, 0xd4, 0x00, 0x01, 0x23, 0xe4, 0x00, 0x01, 0x23, 0xf4, 0x00, 0x01, 0x24, 0x44, 0x00, 0x01, 0x24, 0x64, 0x00, 0x01, 0x24, 0x74, 0x00, 0x01, 0x24, 0x9c, 0x00, 0x01, 0x24, 0xac, 0x00, 0x01, 0x25, 0x08, 0x00, 0x01, 0x25, 0x18, 0x00, 0x01, 0x25, 0x4c, 0x00, 0x01, 0x25, 0x98, 0x00, 0x01, 0x26, 0x14, 0x00, 0x01, 0x26, 0x5c, 0x00, 0x01, 0x26, 0x8c, 0x00, 0x01, 0x26, 0xbc, 0x00, 0x01, 0x27, 0x2c, 0x00, 0x01, 0x27, 0x5c, 0x00, 0x01, 0x27, 0x78, 0x00, 0x01, 0x27, 0xa8, 0x00, 0x01, 0x27, 0xdc, 0x00, 0x01, 0x27, 0xfc, 0x00, 0x01, 0x28, 0x34, 0x00, 0x01, 0x28, 0x64, 0x00, 0x01, 0x28, 0x94, 0x00, 0x01, 0x28, 0xf4, 0x00, 0x01, 0x29, 0xb0, 0x00, 0x01, 0x29, 0xfc, 0x00, 0x01, 0x2a, 0x68, 0x00, 0x01, 0x2a, 0x90, 0x00, 0x01, 0x2a, 0xd4, 0x00, 0x01, 0x2b, 0x0c, 0x00, 0x01, 0x2b, 0x8c, 0x00, 0x01, 0x2c, 0x14, 0x00, 0x01, 0x2c, 0x7c, 0x00, 0x01, 0x2d, 0x54, 0x00, 0x01, 0x2d, 0xb8, 0x00, 0x01, 0x2e, 0x20, 0x00, 0x01, 0x2e, 0x94, 0x00, 0x01, 0x2e, 0xf0, 0x00, 0x01, 0x2f, 0x84, 0x00, 0x01, 0x30, 0x14, 0x00, 0x01, 0x30, 0xa8, 0x00, 0x01, 0x30, 0xcc, 0x00, 0x01, 0x31, 0x00, 0x00, 0x01, 0x31, 0x68, 0x00, 0x01, 0x31, 0xc8, 0x00, 0x01, 0x32, 0x14, 0x00, 0x01, 0x32, 0x7c, 0x00, 0x01, 0x32, 0xb8, 0x00, 0x01, 0x32, 0xf0, 0x00, 0x01, 0x33, 0x54, 0x00, 0x01, 0x33, 0x94, 0x00, 0x01, 0x33, 0xe0, 0x00, 0x01, 0x34, 0x2c, 0x00, 0x01, 0x34, 0xa8, 0x00, 0x01, 0x34, 0xcc, 0x00, 0x01, 0x35, 0x2c, 0x00, 0x01, 0x35, 0x64, 0x00, 0x01, 0x35, 0xec, 0x00, 0x01, 0x36, 0x68, 0x00, 0x01, 0x36, 0xc0, 0x00, 0x01, 0x36, 0xd4, 0x00, 0x01, 0x36, 0xe8, 0x00, 0x01, 0x36, 0xfc, 0x00, 0x01, 0x37, 0x10, 0x00, 0x01, 0x37, 0x24, 0x00, 0x01, 0x37, 0x38, 0x00, 0x01, 0x37, 0x94, 0x00, 0x01, 0x37, 0xa8, 0x00, 0x01, 0x37, 0xbc, 0x00, 0x01, 0x38, 0x38, 0x00, 0x01, 0x38, 0x48, 0x00, 0x01, 0x38, 0x88, 0x00, 0x01, 0x39, 0x14, 0x00, 0x01, 0x39, 0x50, 0x00, 0x01, 0x39, 0xb8, 0x00, 0x01, 0x3a, 0x18, 0x00, 0x01, 0x3a, 0x9c, 0x00, 0x01, 0x3b, 0x2c, 0x00, 0x01, 0x3b, 0xbc, 0x00, 0x01, 0x3c, 0x00, 0x00, 0x01, 0x3c, 0x44, 0x00, 0x01, 0x3c, 0xcc, 0x00, 0x01, 0x3d, 0x18, 0x00, 0x01, 0x3d, 0x50, 0x00, 0x01, 0x3d, 0x80, 0x00, 0x01, 0x3d, 0xac, 0x00, 0x01, 0x3d, 0xe8, 0x00, 0x01, 0x3e, 0x40, 0x00, 0x01, 0x3e, 0x74, 0x00, 0x01, 0x3e, 0xb4, 0x00, 0x01, 0x3e, 0xd4, 0x00, 0x01, 0x3f, 0x6c, 0x00, 0x01, 0x3f, 0xe8, 0x00, 0x01, 0x40, 0x48, 0x00, 0x01, 0x40, 0xac, 0x00, 0x01, 0x40, 0xdc, 0x00, 0x01, 0x41, 0x4c, 0x00, 0x01, 0x41, 0xdc, 0x00, 0x01, 0x42, 0x84, 0x00, 0x01, 0x42, 0xd4, 0x00, 0x01, 0x43, 0x2c, 0x00, 0x01, 0x43, 0x94, 0x00, 0x01, 0x44, 0x08, 0x00, 0x01, 0x44, 0x4c, 0x00, 0x01, 0x44, 0xb0, 0x00, 0x01, 0x44, 0xd8, 0x00, 0x01, 0x45, 0x08, 0x00, 0x01, 0x45, 0x54, 0x00, 0x01, 0x45, 0xac, 0x00, 0x01, 0x46, 0x14, 0x00, 0x01, 0x46, 0x80, 0x00, 0x01, 0x46, 0xa0, 0x00, 0x01, 0x46, 0xc4, 0x00, 0x01, 0x46, 0xe8, 0x00, 0x01, 0x47, 0x08, 0x00, 0x01, 0x47, 0x34, 0x00, 0x01, 0x47, 0x64, 0x00, 0x01, 0x47, 0x7c, 0x00, 0x01, 0x47, 0x94, 0x00, 0x01, 0x47, 0xac, 0x00, 0x01, 0x47, 0xc4, 0x00, 0x01, 0x47, 0xdc, 0x00, 0x01, 0x47, 0xf4, 0x00, 0x01, 0x48, 0x0c, 0x00, 0x01, 0x48, 0x24, 0x00, 0x01, 0x48, 0x3c, 0x00, 0x01, 0x48, 0x54, 0x00, 0x01, 0x48, 0x6c, 0x00, 0x01, 0x48, 0x84, 0x00, 0x01, 0x48, 0x9c, 0x00, 0x01, 0x48, 0xb4, 0x00, 0x01, 0x48, 0xcc, 0x00, 0x01, 0x48, 0xe4, 0x00, 0x01, 0x48, 0xfc, 0x00, 0x01, 0x49, 0x14, 0x00, 0x01, 0x49, 0x2c, 0x00, 0x01, 0x49, 0x44, 0x00, 0x01, 0x49, 0x5c, 0x00, 0x01, 0x49, 0x74, 0x00, 0x01, 0x49, 0x8c, 0x00, 0x01, 0x49, 0xa4, 0x00, 0x01, 0x49, 0xbc, 0x00, 0x01, 0x49, 0xd4, 0x00, 0x01, 0x49, 0xec, 0x00, 0x01, 0x4a, 0x04, 0x00, 0x01, 0x4a, 0x24, 0x00, 0x01, 0x4a, 0x40, 0x00, 0x01, 0x4a, 0x58, 0x00, 0x01, 0x4a, 0x70, 0x00, 0x01, 0x4a, 0x88, 0x00, 0x01, 0x4a, 0xa0, 0x00, 0x01, 0x4a, 0xb8, 0x00, 0x01, 0x4a, 0xd0, 0x00, 0x01, 0x4a, 0xe8, 0x00, 0x01, 0x4b, 0x00, 0x00, 0x01, 0x4b, 0x18, 0x00, 0x01, 0x4b, 0x30, 0x00, 0x01, 0x4b, 0x48, 0x00, 0x01, 0x4b, 0x60, 0x00, 0x01, 0x4b, 0x78, 0x00, 0x01, 0x4b, 0x90, 0x00, 0x01, 0x4b, 0xa8, 0x00, 0x01, 0x4b, 0xc0, 0x00, 0x01, 0x4b, 0xd8, 0x00, 0x01, 0x4b, 0xf0, 0x00, 0x01, 0x4c, 0x08, 0x00, 0x01, 0x4c, 0x20, 0x00, 0x01, 0x4c, 0x38, 0x00, 0x01, 0x4c, 0x50, 0x00, 0x01, 0x4c, 0x68, 0x00, 0x01, 0x4c, 0x80, 0x00, 0x01, 0x4c, 0x98, 0x00, 0x01, 0x4c, 0xb0, 0x00, 0x01, 0x4c, 0xd0, 0x00, 0x01, 0x4c, 0xe8, 0x00, 0x01, 0x4d, 0x00, 0x00, 0x01, 0x4d, 0x18, 0x00, 0x01, 0x4d, 0x30, 0x00, 0x01, 0x4d, 0x48, 0x00, 0x01, 0x4d, 0x60, 0x00, 0x01, 0x4d, 0x78, 0x00, 0x01, 0x4d, 0x90, 0x00, 0x01, 0x4d, 0xa8, 0x00, 0x01, 0x4d, 0xc0, 0x00, 0x01, 0x4d, 0xd8, 0x00, 0x01, 0x4d, 0xf0, 0x00, 0x01, 0x4e, 0x08, 0x00, 0x01, 0x4e, 0x20, 0x00, 0x01, 0x4e, 0x38, 0x00, 0x01, 0x4e, 0x50, 0x00, 0x01, 0x4e, 0x68, 0x00, 0x01, 0x4e, 0x80, 0x00, 0x01, 0x4e, 0x98, 0x00, 0x01, 0x4e, 0xb0, 0x00, 0x01, 0x4e, 0xc8, 0x00, 0x01, 0x4e, 0xe0, 0x00, 0x01, 0x4f, 0x00, 0x00, 0x01, 0x4f, 0x18, 0x00, 0x01, 0x4f, 0x30, 0x00, 0x01, 0x4f, 0x48, 0x00, 0x01, 0x4f, 0x60, 0x00, 0x01, 0x4f, 0x78, 0x00, 0x01, 0x4f, 0x90, 0x00, 0x01, 0x4f, 0xa8, 0x00, 0x01, 0x4f, 0xc0, 0x00, 0x01, 0x4f, 0xd8, 0x00, 0x01, 0x4f, 0xf0, 0x00, 0x01, 0x50, 0x08, 0x00, 0x01, 0x50, 0x20, 0x00, 0x01, 0x50, 0x38, 0x00, 0x01, 0x50, 0x50, 0x00, 0x01, 0x50, 0x68, 0x00, 0x01, 0x50, 0x80, 0x00, 0x01, 0x50, 0x98, 0x00, 0x01, 0x50, 0xb0, 0x00, 0x01, 0x50, 0xc8, 0x00, 0x01, 0x50, 0xe0, 0x00, 0x01, 0x51, 0x00, 0x00, 0x01, 0x51, 0x20, 0x00, 0x01, 0x51, 0x38, 0x00, 0x01, 0x51, 0x50, 0x00, 0x01, 0x51, 0x68, 0x00, 0x01, 0x51, 0x80, 0x00, 0x01, 0x51, 0x98, 0x00, 0x01, 0x51, 0xb0, 0x00, 0x01, 0x51, 0xc8, 0x00, 0x01, 0x51, 0xe0, 0x00, 0x01, 0x51, 0xf8, 0x00, 0x01, 0x52, 0x10, 0x00, 0x01, 0x52, 0x28, 0x00, 0x01, 0x52, 0x40, 0x00, 0x01, 0x52, 0x58, 0x00, 0x01, 0x52, 0x70, 0x00, 0x01, 0x52, 0x88, 0x00, 0x01, 0x52, 0xa0, 0x00, 0x01, 0x52, 0xb8, 0x00, 0x01, 0x52, 0xd0, 0x00, 0x01, 0x52, 0xe8, 0x00, 0x01, 0x53, 0x00, 0x00, 0x01, 0x53, 0x18, 0x00, 0x01, 0x53, 0x30, 0x00, 0x01, 0x53, 0x48, 0x00, 0x01, 0x53, 0x60, 0x00, 0x01, 0x53, 0x78, 0x00, 0x01, 0x53, 0x90, 0x00, 0x01, 0x53, 0xa8, 0x00, 0x01, 0x53, 0xc0, 0x00, 0x01, 0x53, 0xd8, 0x00, 0x01, 0x53, 0xf0, 0x00, 0x01, 0x54, 0x08, 0x00, 0x01, 0x54, 0x20, 0x00, 0x01, 0x54, 0x38, 0x00, 0x01, 0x54, 0x50, 0x00, 0x01, 0x54, 0x68, 0x00, 0x01, 0x54, 0x80, 0x00, 0x01, 0x54, 0x98, 0x00, 0x01, 0x54, 0xb0, 0x00, 0x01, 0x54, 0xc8, 0x00, 0x01, 0x54, 0xe0, 0x00, 0x01, 0x54, 0xf8, 0x00, 0x01, 0x55, 0x10, 0x00, 0x01, 0x55, 0x28, 0x00, 0x01, 0x55, 0x40, 0x00, 0x01, 0x55, 0x58, 0x00, 0x01, 0x55, 0x70, 0x00, 0x01, 0x55, 0x88, 0x00, 0x01, 0x55, 0xa0, 0x00, 0x01, 0x55, 0xb8, 0x00, 0x01, 0x55, 0xd0, 0x00, 0x01, 0x55, 0xe8, 0x00, 0x01, 0x56, 0x00, 0x00, 0x01, 0x56, 0x18, 0x00, 0x01, 0x56, 0x30, 0x00, 0x01, 0x56, 0x80, 0x00, 0x01, 0x56, 0xc8, 0x00, 0x01, 0x57, 0x60, 0x00, 0x01, 0x57, 0x70, 0x00, 0x01, 0x57, 0x88, 0x00, 0x01, 0x57, 0xa0, 0x00, 0x01, 0x57, 0xb8, 0x00, 0x01, 0x57, 0xd0, 0x00, 0x01, 0x57, 0xe8, 0x00, 0x01, 0x58, 0x00, 0x00, 0x01, 0x58, 0x18, 0x00, 0x01, 0x58, 0x30, 0x00, 0x01, 0x58, 0x48, 0x00, 0x01, 0x58, 0x60, 0x00, 0x01, 0x58, 0x78, 0x00, 0x01, 0x58, 0x90, 0x00, 0x01, 0x58, 0xa8, 0x00, 0x01, 0x58, 0xc0, 0x00, 0x01, 0x58, 0xd8, 0x00, 0x01, 0x58, 0xf0, 0x00, 0x01, 0x59, 0x08, 0x00, 0x01, 0x59, 0x20, 0x00, 0x01, 0x59, 0x38, 0x00, 0x01, 0x59, 0x50, 0x00, 0x01, 0x59, 0x68, 0x00, 0x01, 0x59, 0x80, 0x00, 0x01, 0x59, 0x98, 0x00, 0x01, 0x59, 0xb0, 0x00, 0x01, 0x59, 0xc8, 0x00, 0x01, 0x59, 0xe0, 0x00, 0x01, 0x59, 0xf8, 0x00, 0x01, 0x5a, 0x10, 0x00, 0x01, 0x5a, 0x28, 0x00, 0x01, 0x5a, 0x40, 0x00, 0x01, 0x5a, 0x58, 0x00, 0x01, 0x5a, 0x70, 0x00, 0x01, 0x5a, 0x88, 0x00, 0x01, 0x5a, 0xa0, 0x00, 0x01, 0x5a, 0xb8, 0x00, 0x01, 0x5a, 0xd0, 0x00, 0x01, 0x5a, 0xe8, 0x00, 0x01, 0x5b, 0x00, 0x00, 0x01, 0x5b, 0x18, 0x00, 0x01, 0x5b, 0x38, 0x00, 0x01, 0x5b, 0x50, 0x00, 0x01, 0x5b, 0x68, 0x00, 0x01, 0x5b, 0x80, 0x00, 0x01, 0x5b, 0x98, 0x00, 0x01, 0x5b, 0xb0, 0x00, 0x01, 0x5b, 0xc8, 0x00, 0x01, 0x5b, 0xe0, 0x00, 0x01, 0x5b, 0xf8, 0x00, 0x01, 0x5c, 0x10, 0x00, 0x01, 0x5c, 0x28, 0x00, 0x01, 0x5c, 0x40, 0x00, 0x01, 0x5c, 0x58, 0x00, 0x01, 0x5c, 0x70, 0x00, 0x01, 0x5c, 0x88, 0x00, 0x01, 0x5c, 0xa0, 0x00, 0x01, 0x5c, 0xb8, 0x00, 0x01, 0x5c, 0xd0, 0x00, 0x01, 0x5c, 0xf0, 0x00, 0x01, 0x5d, 0x08, 0x00, 0x01, 0x5d, 0x20, 0x00, 0x01, 0x5d, 0x38, 0x00, 0x01, 0x5d, 0x50, 0x00, 0x01, 0x5d, 0x68, 0x00, 0x01, 0x5d, 0x80, 0x00, 0x01, 0x5d, 0x98, 0x00, 0x01, 0x5d, 0xb0, 0x00, 0x01, 0x5d, 0xc8, 0x00, 0x01, 0x5d, 0xe0, 0x00, 0x01, 0x5d, 0xf8, 0x00, 0x01, 0x5e, 0x10, 0x00, 0x01, 0x5e, 0x28, 0x00, 0x01, 0x5e, 0x40, 0x00, 0x01, 0x5e, 0x58, 0x00, 0x01, 0x5e, 0x70, 0x00, 0x01, 0x5e, 0x88, 0x00, 0x01, 0x5e, 0xa0, 0x00, 0x01, 0x5e, 0xb8, 0x00, 0x01, 0x5e, 0xd0, 0x00, 0x01, 0x5e, 0xe8, 0x00, 0x01, 0x5f, 0x00, 0x00, 0x01, 0x5f, 0x18, 0x00, 0x01, 0x5f, 0x30, 0x00, 0x01, 0x5f, 0x48, 0x00, 0x01, 0x5f, 0x60, 0x00, 0x01, 0x5f, 0x78, 0x00, 0x01, 0x5f, 0x90, 0x00, 0x01, 0x5f, 0xa8, 0x00, 0x01, 0x5f, 0xc0, 0x00, 0x01, 0x5f, 0xd8, 0x00, 0x01, 0x5f, 0xf0, 0x00, 0x01, 0x60, 0x1c, 0x00, 0x01, 0x60, 0x58, 0x00, 0x01, 0x60, 0x70, 0x00, 0x01, 0x60, 0x88, 0x00, 0x01, 0x60, 0xa0, 0x00, 0x01, 0x60, 0xb8, 0x00, 0x01, 0x60, 0xd0, 0x00, 0x01, 0x60, 0xe8, 0x00, 0x01, 0x61, 0x00, 0x00, 0x01, 0x61, 0x18, 0x00, 0x01, 0x61, 0x30, 0x00, 0x01, 0x61, 0x48, 0x00, 0x01, 0x61, 0x60, 0x00, 0x01, 0x61, 0x78, 0x00, 0x01, 0x61, 0x94, 0x00, 0x01, 0x61, 0xb0, 0x00, 0x01, 0x61, 0xc8, 0x00, 0x01, 0x61, 0xe0, 0x00, 0x01, 0x61, 0xf8, 0x00, 0x01, 0x62, 0x10, 0x00, 0x01, 0x62, 0x28, 0x00, 0x01, 0x62, 0x40, 0x00, 0x01, 0x62, 0x58, 0x00, 0x01, 0x62, 0x70, 0x00, 0x01, 0x62, 0x8c, 0x00, 0x01, 0x62, 0xa8, 0x00, 0x01, 0x62, 0xc0, 0x00, 0x01, 0x62, 0xd8, 0x00, 0x01, 0x62, 0xf4, 0x00, 0x01, 0x63, 0x10, 0x00, 0x01, 0x63, 0x28, 0x00, 0x01, 0x63, 0x40, 0x00, 0x01, 0x63, 0x58, 0x00, 0x01, 0x63, 0x70, 0x00, 0x01, 0x63, 0x88, 0x00, 0x01, 0x63, 0xa0, 0x00, 0x01, 0x63, 0xb8, 0x00, 0x01, 0x63, 0xd0, 0x00, 0x01, 0x63, 0xec, 0x00, 0x01, 0x64, 0x08, 0x00, 0x01, 0x64, 0x20, 0x00, 0x01, 0x64, 0x38, 0x00, 0x01, 0x64, 0x54, 0x00, 0x01, 0x64, 0x70, 0x00, 0x01, 0x64, 0x8c, 0x00, 0x01, 0x64, 0xa8, 0x00, 0x01, 0x64, 0xc0, 0x00, 0x01, 0x64, 0xd8, 0x00, 0x01, 0x64, 0xf0, 0x00, 0x01, 0x65, 0x08, 0x00, 0x01, 0x65, 0x20, 0x00, 0x01, 0x65, 0x38, 0x00, 0x01, 0x65, 0x50, 0x00, 0x01, 0x65, 0x68, 0x00, 0x01, 0x65, 0x84, 0x00, 0x01, 0x65, 0xa0, 0x00, 0x01, 0x65, 0xb8, 0x00, 0x01, 0x65, 0xd0, 0x00, 0x01, 0x65, 0xec, 0x00, 0x01, 0x66, 0x08, 0x00, 0x01, 0x66, 0x24, 0x00, 0x01, 0x66, 0x40, 0x00, 0x01, 0x66, 0x58, 0x00, 0x01, 0x66, 0x70, 0x00, 0x01, 0x66, 0x88, 0x00, 0x01, 0x66, 0xa0, 0x00, 0x01, 0x66, 0xb8, 0x00, 0x01, 0x66, 0xd0, 0x00, 0x01, 0x66, 0xe8, 0x00, 0x01, 0x67, 0x00, 0x00, 0x01, 0x67, 0x18, 0x00, 0x01, 0x67, 0x30, 0x00, 0x01, 0x67, 0x4c, 0x00, 0x01, 0x67, 0x68, 0x00, 0x01, 0x67, 0x80, 0x00, 0x01, 0x67, 0x98, 0x00, 0x01, 0x67, 0xb0, 0x00, 0x01, 0x67, 0xc8, 0x00, 0x01, 0x67, 0xe0, 0x00, 0x01, 0x67, 0xf8, 0x00, 0x01, 0x68, 0x10, 0x00, 0x01, 0x68, 0x28, 0x00, 0x01, 0x68, 0x44, 0x00, 0x01, 0x68, 0x5c, 0x00, 0x01, 0x68, 0x78, 0x00, 0x01, 0x68, 0x94, 0x00, 0x01, 0x68, 0xac, 0x00, 0x01, 0x68, 0xc4, 0x00, 0x01, 0x68, 0xdc, 0x00, 0x01, 0x68, 0xf4, 0x00, 0x01, 0x69, 0x0c, 0x00, 0x01, 0x69, 0x24, 0x00, 0x01, 0x69, 0x3c, 0x00, 0x01, 0x69, 0x54, 0x00, 0x01, 0x69, 0x6c, 0x00, 0x01, 0x69, 0x88, 0x00, 0x01, 0x69, 0xa0, 0x00, 0x01, 0x69, 0xb8, 0x00, 0x01, 0x69, 0xd4, 0x00, 0x01, 0x69, 0xf0, 0x00, 0x01, 0x6a, 0x0c, 0x00, 0x01, 0x6a, 0x28, 0x00, 0x01, 0x6a, 0x40, 0x00, 0x01, 0x6a, 0x50, 0x00, 0x01, 0x6a, 0x68, 0x00, 0x01, 0x6a, 0x78, 0x00, 0x01, 0x6a, 0x90, 0x00, 0x01, 0x6a, 0xa0, 0x00, 0x01, 0x6a, 0xb8, 0x00, 0x01, 0x6a, 0xc8, 0x00, 0x01, 0x6a, 0xe0, 0x00, 0x01, 0x6a, 0xf0, 0x00, 0x01, 0x6b, 0x08, 0x00, 0x01, 0x6b, 0x18, 0x00, 0x01, 0x6b, 0x30, 0x00, 0x01, 0x6b, 0x40, 0x00, 0x01, 0x6b, 0x58, 0x00, 0x01, 0x6b, 0x70, 0x00, 0x01, 0x6b, 0x88, 0x00, 0x01, 0x6b, 0xa0, 0x00, 0x01, 0x6b, 0xb8, 0x00, 0x01, 0x6b, 0xd0, 0x00, 0x01, 0x6b, 0xe8, 0x00, 0x01, 0x6c, 0x00, 0x00, 0x01, 0x6c, 0x18, 0x00, 0x01, 0x6c, 0x30, 0x00, 0x01, 0x6c, 0x48, 0x00, 0x01, 0x6c, 0x60, 0x00, 0x01, 0x6c, 0x78, 0x00, 0x01, 0x6c, 0x90, 0x00, 0x01, 0x6c, 0xa8, 0x00, 0x01, 0x6c, 0xc0, 0x00, 0x01, 0x6c, 0xd8, 0x00, 0x01, 0x6c, 0xf0, 0x00, 0x01, 0x6d, 0x08, 0x00, 0x01, 0x6d, 0x20, 0x00, 0x01, 0x6d, 0x38, 0x00, 0x01, 0x6d, 0x50, 0x00, 0x01, 0x6d, 0x68, 0x00, 0x01, 0x6d, 0x80, 0x00, 0x01, 0x6d, 0x98, 0x00, 0x01, 0x6d, 0xb0, 0x00, 0x01, 0x6d, 0xc8, 0x00, 0x01, 0x6d, 0xe0, 0x00, 0x01, 0x6d, 0xf8, 0x00, 0x01, 0x6e, 0x10, 0x00, 0x01, 0x6e, 0x28, 0x00, 0x01, 0x6e, 0x40, 0x00, 0x01, 0x6e, 0x58, 0x00, 0x01, 0x6e, 0x70, 0x00, 0x01, 0x6e, 0x88, 0x00, 0x01, 0x6e, 0xa0, 0x00, 0x01, 0x6e, 0xb8, 0x00, 0x01, 0x6e, 0xd0, 0x00, 0x01, 0x6e, 0xe8, 0x00, 0x01, 0x6f, 0x00, 0x00, 0x01, 0x6f, 0x18, 0x00, 0x01, 0x6f, 0x30, 0x00, 0x01, 0x6f, 0x48, 0x00, 0x01, 0x6f, 0x60, 0x00, 0x01, 0x6f, 0x78, 0x00, 0x01, 0x6f, 0x90, 0x00, 0x01, 0x6f, 0xa8, 0x00, 0x01, 0x6f, 0xc0, 0x00, 0x01, 0x6f, 0xd8, 0x00, 0x01, 0x6f, 0xf0, 0x00, 0x01, 0x70, 0x08, 0x00, 0x01, 0x70, 0x20, 0x00, 0x01, 0x70, 0x38, 0x00, 0x01, 0x70, 0x50, 0x00, 0x01, 0x70, 0x68, 0x00, 0x01, 0x70, 0x80, 0x00, 0x01, 0x70, 0x98, 0x00, 0x01, 0x70, 0xb0, 0x00, 0x01, 0x70, 0xc0, 0x00, 0x01, 0x70, 0xd8, 0x00, 0x01, 0x70, 0xe8, 0x00, 0x01, 0x70, 0xf8, 0x00, 0x01, 0x71, 0x20, 0x00, 0x01, 0x71, 0x30, 0x00, 0x01, 0x71, 0x48, 0x00, 0x01, 0x71, 0x60, 0x00, 0x01, 0x71, 0x78, 0x00, 0x01, 0x71, 0x90, 0x00, 0x01, 0x71, 0xa8, 0x00, 0x01, 0x71, 0xc0, 0x00, 0x01, 0x71, 0xdc, 0x00, 0x01, 0x71, 0xec, 0x00, 0x01, 0x72, 0x08, 0x00, 0x01, 0x72, 0x18, 0x00, 0x01, 0x72, 0x30, 0x00, 0x01, 0x72, 0x4c, 0x00, 0x01, 0x72, 0x64, 0x00, 0x01, 0x72, 0x7c, 0x00, 0x01, 0x72, 0x94, 0x00, 0x01, 0x72, 0xac, 0x00, 0x01, 0x72, 0xc4, 0x00, 0x01, 0x72, 0xd4, 0x00, 0x01, 0x72, 0xec, 0x00, 0x01, 0x73, 0x04, 0x00, 0x01, 0x73, 0x1c, 0x00, 0x01, 0x73, 0x34, 0x00, 0x01, 0x73, 0x50, 0x00, 0x01, 0x73, 0x60, 0x00, 0x01, 0x73, 0x7c, 0x00, 0x01, 0x73, 0x94, 0x00, 0x01, 0x73, 0xac, 0x00, 0x01, 0x73, 0xc4, 0x00, 0x01, 0x73, 0xdc, 0x00, 0x01, 0x73, 0xf4, 0x00, 0x01, 0x74, 0x04, 0x00, 0x01, 0x74, 0x1c, 0x00, 0x01, 0x74, 0x34, 0x00, 0x01, 0x74, 0x4c, 0x00, 0x01, 0x74, 0x64, 0x00, 0x01, 0x74, 0x7c, 0x00, 0x01, 0x74, 0x94, 0x00, 0x01, 0x74, 0xb0, 0x00, 0x01, 0x74, 0xc0, 0x00, 0x01, 0x74, 0xdc, 0x00, 0x01, 0x74, 0xf4, 0x00, 0x01, 0x75, 0x04, 0x00, 0x01, 0x75, 0x14, 0x00, 0x01, 0x75, 0x2c, 0x00, 0x01, 0x75, 0x44, 0x00, 0x01, 0x75, 0x5c, 0x00, 0x01, 0x75, 0x74, 0x00, 0x01, 0x75, 0x8c, 0x00, 0x01, 0x75, 0xa8, 0x00, 0x01, 0x75, 0xb8, 0x00, 0x01, 0x75, 0xd4, 0x00, 0x01, 0x75, 0xe4, 0x00, 0x01, 0x75, 0xfc, 0x00, 0x01, 0x76, 0x0c, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x30, 0x00, 0x01, 0x76, 0x4c, 0x00, 0x01, 0x76, 0x5c, 0x00, 0x01, 0x76, 0x78, 0x00, 0x01, 0x76, 0x94, 0x00, 0x01, 0x76, 0xb0, 0x00, 0x01, 0x76, 0xcc, 0x00, 0x01, 0x76, 0xe4, 0x00, 0x01, 0x76, 0xfc, 0x00, 0x01, 0x77, 0x20, 0x00, 0x01, 0x77, 0x40, 0x00, 0x01, 0x77, 0x60, 0x00, 0x01, 0x77, 0x84, 0x00, 0x01, 0x77, 0xbc, 0x00, 0x01, 0x77, 0xf0, 0x00, 0x01, 0x78, 0x24, 0x00, 0x01, 0x78, 0x58, 0x00, 0x01, 0x78, 0x88, 0x00, 0x01, 0x78, 0xd0, 0x00, 0x01, 0x79, 0x00, 0x00, 0x01, 0x79, 0x1c, 0x00, 0x01, 0x79, 0x34, 0x00, 0x01, 0x79, 0x58, 0x00, 0x01, 0x79, 0x88, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x79, 0xa0, 0x00, 0x01, 0x7a, 0x7c, 0x00, 0x01, 0x7b, 0x8c, 0x00, 0x01, 0x7b, 0xac, 0x00, 0x01, 0x7b, 0xc4, 0x00, 0x01, 0x7b, 0xe4, 0x00, 0x01, 0x7c, 0x00, 0x00, 0x01, 0x7c, 0x18, 0x00, 0x01, 0x7c, 0x38, 0x00, 0x01, 0x7c, 0x5c, 0x00, 0x01, 0x7c, 0x84, 0x00, 0x01, 0x7c, 0xb0, 0x00, 0x01, 0x7c, 0xe0, 0x00, 0x01, 0x7c, 0xfc, 0x00, 0x01, 0x7d, 0x78, 0x00, 0x01, 0x7d, 0x8c, 0x00, 0x01, 0x7d, 0xc8, 0x00, 0x01, 0x7e, 0x04, 0x00, 0x01, 0x7e, 0x30, 0x00, 0x01, 0x7e, 0x54, 0x00, 0x01, 0x7e, 0x70, 0x00, 0x01, 0x7e, 0x8c, 0x00, 0x01, 0x7e, 0xbc, 0x00, 0x01, 0x7e, 0xec, 0x00, 0x01, 0x7f, 0x04, 0x00, 0x01, 0x7f, 0x1c, 0x00, 0x01, 0x7f, 0x38, 0x00, 0x01, 0x7f, 0x6c, 0x00, 0x01, 0x7f, 0xa0, 0x00, 0x01, 0x7f, 0xd0, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x14, 0x00, 0x01, 0x80, 0x44, 0x00, 0x01, 0x80, 0x5c, 0x00, 0x01, 0x80, 0x78, 0x00, 0x01, 0x80, 0x9c, 0x00, 0x01, 0x80, 0xfc, 0x00, 0x01, 0x81, 0x10, 0x00, 0x01, 0x81, 0x64, 0x00, 0x01, 0x81, 0x98, 0x00, 0x01, 0x81, 0xc0, 0x00, 0x01, 0x82, 0x00, 0x00, 0x01, 0x82, 0x4c, 0x00, 0x01, 0x82, 0x70, 0x00, 0x01, 0x82, 0xac, 0x00, 0x01, 0x83, 0x10, 0x00, 0x01, 0x83, 0x40, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0x7c, 0x00, 0x01, 0x83, 0xd0, 0x00, 0x01, 0x83, 0xf4, 0x00, 0x01, 0x84, 0x2c, 0x00, 0x01, 0x84, 0x90, 0x00, 0x01, 0x85, 0x20, 0x00, 0x01, 0x85, 0x48, 0x00, 0x01, 0x85, 0xf8, 0x00, 0x01, 0x86, 0x84, 0x00, 0x01, 0x86, 0xb8, 0x00, 0x01, 0x86, 0xd4, 0x00, 0x01, 0x86, 0xfc, 0x00, 0x01, 0x87, 0x34, 0x00, 0x01, 0x87, 0x70, 0x00, 0x01, 0x87, 0xb4, 0x00, 0x01, 0x87, 0xc8, 0x00, 0x01, 0x87, 0xdc, 0x00, 0x01, 0x87, 0xf0, 0x00, 0x01, 0x88, 0x04, 0x00, 0x01, 0x88, 0x18, 0x00, 0x01, 0x88, 0x2c, 0x00, 0x01, 0x88, 0x40, 0x00, 0x01, 0x88, 0x54, 0x00, 0x01, 0x88, 0x68, 0x00, 0x01, 0x88, 0x7c, 0x00, 0x01, 0x88, 0x90, 0x00, 0x01, 0x88, 0xa4, 0x00, 0x01, 0x88, 0xb8, 0x00, 0x01, 0x88, 0xcc, 0x00, 0x01, 0x88, 0xe0, 0x00, 0x01, 0x88, 0xf4, 0x00, 0x01, 0x89, 0x08, 0x00, 0x01, 0x89, 0x1c, 0x00, 0x01, 0x89, 0x30, 0x00, 0x01, 0x89, 0x44, 0x00, 0x01, 0x89, 0x58, 0x00, 0x01, 0x89, 0x6c, 0x00, 0x01, 0x89, 0x80, 0x00, 0x01, 0x89, 0x94, 0x00, 0x01, 0x89, 0xa8, 0x00, 0x01, 0x89, 0xbc, 0x00, 0x01, 0x89, 0xd0, 0x00, 0x01, 0x89, 0xe4, 0x00, 0x01, 0x8a, 0x58, 0x00, 0x01, 0x8b, 0x08, 0x00, 0x01, 0x8b, 0x98, 0x00, 0x01, 0x8b, 0xd8, 0x00, 0x01, 0x8c, 0x40, 0x00, 0x01, 0x8c, 0xc4, 0x00, 0x01, 0x8d, 0x48, 0x00, 0x01, 0x8e, 0x2c, 0x00, 0x01, 0x8e, 0xf8, 0x00, 0x01, 0x8f, 0xa4, 0x00, 0x01, 0x90, 0x04, 0x00, 0x01, 0x90, 0x1c, 0x00, 0x01, 0x90, 0xb4, 0x00, 0x01, 0x90, 0xfc, 0x00, 0x01, 0x91, 0x54, 0x00, 0x01, 0x92, 0xe0, 0x00, 0x01, 0x93, 0x7c, 0x00, 0x01, 0x94, 0x14, 0x00, 0x01, 0x94, 0xa8, 0x00, 0x01, 0x95, 0x14, 0x00, 0x01, 0x95, 0xb4, 0x00, 0x01, 0x96, 0x44, 0x00, 0x01, 0x96, 0x78, 0x00, 0x01, 0x96, 0xf8, 0x00, 0x01, 0x97, 0x60, 0x00, 0x01, 0x97, 0x84, 0x00, 0x01, 0x97, 0xa4, 0x00, 0x01, 0x97, 0xcc, 0x00, 0x01, 0x97, 0xf4, 0x00, 0x01, 0x98, 0x2c, 0x00, 0x01, 0x98, 0x70, 0x00, 0x01, 0x98, 0xa8, 0x00, 0x01, 0x99, 0x68, 0x00, 0x01, 0x9a, 0x40, 0x00, 0x01, 0x9a, 0xb8, 0x00, 0x01, 0x9a, 0xd0, 0x00, 0x01, 0x9b, 0x5c, 0x00, 0x01, 0x9b, 0xf8, 0x00, 0x01, 0x9c, 0x90, 0x00, 0x01, 0x9c, 0xa0, 0x00, 0x01, 0x9c, 0xb4, 0x00, 0x01, 0x9c, 0xcc, 0x00, 0x01, 0x9e, 0x0c, 0x00, 0x01, 0x9e, 0xfc, 0x00, 0x01, 0x9f, 0x4c, 0x00, 0x01, 0x9f, 0xa8, 0x00, 0x01, 0xa0, 0x08, 0x00, 0x01, 0xa0, 0xb4, 0x00, 0x01, 0xa1, 0x48, 0x00, 0x01, 0xa2, 0x24, 0x00, 0x01, 0xa2, 0xa4, 0x00, 0x01, 0xa3, 0x20, 0x00, 0x01, 0xa3, 0x64, 0x00, 0x01, 0xa3, 0xf4, 0x00, 0x01, 0xa4, 0x98, 0x00, 0x01, 0xa5, 0x4c, 0x00, 0x01, 0xa5, 0xbc, 0x00, 0x01, 0xa6, 0x58, 0x00, 0x01, 0xa7, 0x70, 0x00, 0x01, 0xa8, 0x6c, 0x00, 0x01, 0xa9, 0x1c, 0x00, 0x01, 0xa9, 0x8c, 0x00, 0x01, 0xaa, 0x34, 0x00, 0x01, 0xaa, 0xd4, 0x00, 0x01, 0xab, 0x34, 0x00, 0x01, 0xab, 0x80, 0x00, 0x01, 0xab, 0xd0, 0x00, 0x01, 0xac, 0x10, 0x00, 0x01, 0xac, 0x7c, 0x00, 0x01, 0xac, 0x8c, 0x00, 0x01, 0xac, 0x9c, 0x00, 0x01, 0xad, 0x90, 0x00, 0x01, 0xad, 0xc4, 0x00, 0x01, 0xad, 0xd4, 0x00, 0x01, 0xad, 0xe4, 0x00, 0x01, 0xae, 0xd8, 0x00, 0x01, 0xaf, 0x9c, 0x00, 0x01, 0xb0, 0x24, 0x00, 0x01, 0xb0, 0xa0, 0x00, 0x01, 0xb1, 0x68, 0x00, 0x01, 0xb2, 0x48, 0x00, 0x01, 0xb2, 0x74, 0x00, 0x01, 0xb3, 0xb8, 0x00, 0x01, 0xb4, 0x0c, 0x00, 0x01, 0xb4, 0xb0, 0x00, 0x01, 0xb5, 0x40, 0x00, 0x01, 0xb5, 0xcc, 0x00, 0x01, 0xb6, 0x44, 0x00, 0x01, 0xb6, 0x8c, 0x00, 0x01, 0xb6, 0xfc, 0x00, 0x01, 0xb7, 0x7c, 0x00, 0x01, 0xb8, 0x10, 0x00, 0x01, 0xb8, 0x84, 0x00, 0x01, 0xb8, 0xb4, 0x00, 0x01, 0xb8, 0xf8, 0x00, 0x01, 0xb9, 0x4c, 0x00, 0x01, 0xb9, 0xb4, 0x00, 0x01, 0xb9, 0xd4, 0x00, 0x01, 0xb9, 0xf8, 0x00, 0x01, 0xba, 0x24, 0x00, 0x01, 0xba, 0xa8, 0x00, 0x01, 0xbb, 0x54, 0x00, 0x01, 0xbb, 0xf4, 0x00, 0x01, 0xbc, 0x2c, 0x00, 0x01, 0xbc, 0x94, 0x00, 0x01, 0xbd, 0x2c, 0x00, 0x01, 0xbd, 0x58, 0x00, 0x01, 0xbd, 0x78, 0x00, 0x01, 0xbd, 0x98, 0x00, 0x01, 0xbd, 0xc0, 0x00, 0x01, 0xbd, 0xe0, 0x00, 0x01, 0xbe, 0x00, 0x00, 0x01, 0xbe, 0x20, 0x00, 0x01, 0xbe, 0x40, 0x00, 0x01, 0xbe, 0x60, 0x00, 0x01, 0xbe, 0x80, 0x00, 0x01, 0xbe, 0xa0, 0x00, 0x01, 0xbe, 0xc0, 0x00, 0x01, 0xbe, 0xe0, 0x00, 0x01, 0xbf, 0x00, 0x00, 0x01, 0xbf, 0x20, 0x00, 0x01, 0xbf, 0x40, 0x00, 0x01, 0xbf, 0x58, 0x00, 0x01, 0xbf, 0x68, 0x00, 0x01, 0xbf, 0x80, 0x00, 0x01, 0xbf, 0xa0, 0x00, 0x01, 0xbf, 0xb8, 0x00, 0x01, 0xbf, 0xc8, 0x00, 0x01, 0xbf, 0xe0, 0x00, 0x01, 0xc0, 0x00, 0x00, 0x01, 0xc0, 0x28, 0x00, 0x01, 0xc0, 0x40, 0x00, 0x01, 0xc0, 0x50, 0x00, 0x01, 0xc0, 0x68, 0x00, 0x01, 0xc0, 0x88, 0x00, 0x01, 0xc0, 0x98, 0x00, 0x01, 0xc0, 0xa8, 0x00, 0x01, 0xc0, 0xb8, 0x00, 0x01, 0xc0, 0xc8, 0x00, 0x01, 0xc0, 0xd8, 0x00, 0x01, 0xc0, 0xf0, 0x00, 0x01, 0xc1, 0x10, 0x00, 0x01, 0xc1, 0x28, 0x00, 0x01, 0xc1, 0x38, 0x00, 0x01, 0xc1, 0x50, 0x00, 0x01, 0xc1, 0x70, 0x00, 0x01, 0xc1, 0x98, 0x00, 0x01, 0xc1, 0xb0, 0x00, 0x01, 0xc1, 0xc0, 0x00, 0x01, 0xc1, 0xd8, 0x00, 0x01, 0xc1, 0xf8, 0x00, 0x01, 0xc2, 0x08, 0x00, 0x01, 0xc2, 0x18, 0x00, 0x01, 0xc2, 0x28, 0x00, 0x01, 0xc2, 0x38, 0x00, 0x01, 0xc2, 0xbc, 0x00, 0x01, 0xc3, 0x38, 0x00, 0x01, 0xc4, 0x14, 0x00, 0x01, 0xc4, 0x24, 0x00, 0x01, 0xc4, 0x34, 0x00, 0x01, 0xc4, 0x9c, 0x00, 0x01, 0xc4, 0xbc, 0x00, 0x01, 0xc4, 0xec, 0x00, 0x01, 0xc5, 0x1c, 0x00, 0x01, 0xc5, 0x4c, 0x00, 0x01, 0xc5, 0x7c, 0x00, 0x01, 0xc5, 0xc0, 0x00, 0x01, 0xc6, 0x04, 0x00, 0x01, 0xc6, 0x34, 0x00, 0x01, 0xc6, 0x64, 0x00, 0x01, 0xc6, 0x94, 0x00, 0x01, 0xc6, 0xc4, 0x00, 0x01, 0xc7, 0x10, 0x00, 0x01, 0xc7, 0x5c, 0x00, 0x01, 0xc8, 0x04, 0x00, 0x01, 0xc8, 0xac, 0x00, 0x01, 0xc8, 0xf8, 0x00, 0x01, 0xc9, 0x44, 0x00, 0x01, 0xc9, 0x90, 0x00, 0x01, 0xc9, 0xdc, 0x00, 0x01, 0xca, 0x24, 0x00, 0x01, 0xca, 0x70, 0x00, 0x01, 0xca, 0xac, 0x00, 0x01, 0xca, 0xe8, 0x00, 0x01, 0xcb, 0x24, 0x00, 0x01, 0xcb, 0x60, 0x00, 0x01, 0xcb, 0xb4, 0x00, 0x01, 0xcc, 0x34, 0x00, 0x01, 0xcc, 0xc0, 0x00, 0x01, 0xcd, 0x84, 0x00, 0x01, 0xce, 0x48, 0x00, 0x01, 0xcf, 0x5c, 0x00, 0x01, 0xcf, 0xbc, 0x00, 0x01, 0xd0, 0x04, 0x00, 0x01, 0xd0, 0x3c, 0x00, 0x01, 0xd0, 0x74, 0x00, 0x01, 0xd0, 0xac, 0x00, 0x01, 0xd0, 0xe4, 0x00, 0x01, 0xd1, 0x1c, 0x00, 0x01, 0xd1, 0x54, 0x00, 0x01, 0xd1, 0xd4, 0x00, 0x01, 0xd2, 0x54, 0x00, 0x01, 0xd2, 0x90, 0x00, 0x01, 0xd2, 0xfc, 0x00, 0x01, 0xd3, 0xa4, 0x00, 0x01, 0xd4, 0x4c, 0x00, 0x01, 0xd4, 0x70, 0x00, 0x01, 0xd4, 0x98, 0x00, 0x01, 0xd4, 0xc0, 0x00, 0x01, 0xd4, 0xe8, 0x00, 0x01, 0xd5, 0x10, 0x00, 0x01, 0xd5, 0x38, 0x00, 0x01, 0xd5, 0x5c, 0x00, 0x01, 0xd5, 0x80, 0x00, 0x01, 0xd5, 0x9c, 0x00, 0x01, 0xd5, 0xb8, 0x00, 0x01, 0xd5, 0xd4, 0x00, 0x01, 0xd6, 0x1c, 0x00, 0x01, 0xd6, 0x64, 0x00, 0x01, 0xd6, 0xac, 0x00, 0x01, 0xd6, 0xf4, 0x00, 0x01, 0xd7, 0x10, 0x00, 0x01, 0xd7, 0x2c, 0x00, 0x01, 0xd7, 0x94, 0x00, 0x01, 0xd8, 0x14, 0x00, 0x01, 0xd8, 0x7c, 0x00, 0x01, 0xd8, 0xbc, 0x00, 0x01, 0xd8, 0xfc, 0x00, 0x01, 0xd9, 0x3c, 0x00, 0x01, 0xd9, 0x7c, 0x00, 0x01, 0xd9, 0xd8, 0x00, 0x01, 0xda, 0x34, 0x00, 0x01, 0xda, 0x74, 0x00, 0x01, 0xda, 0xb4, 0x00, 0x01, 0xda, 0xf4, 0x00, 0x01, 0xdb, 0x34, 0x00, 0x01, 0xdb, 0x74, 0x00, 0x01, 0xdb, 0xb4, 0x00, 0x01, 0xdc, 0x10, 0x00, 0x01, 0xdc, 0x6c, 0x00, 0x01, 0xdc, 0xc4, 0x00, 0x01, 0xdd, 0x1c, 0x00, 0x01, 0xdd, 0x60, 0x00, 0x01, 0xdd, 0xa8, 0x00, 0x01, 0xdd, 0xf0, 0x00, 0x01, 0xde, 0x3c, 0x00, 0x01, 0xde, 0x78, 0x00, 0x01, 0xde, 0xb4, 0x00, 0x01, 0xde, 0xf8, 0x00, 0x01, 0xdf, 0x38, 0x00, 0x01, 0xdf, 0x78, 0x00, 0x01, 0xdf, 0xb4, 0x00, 0x01, 0xe0, 0x10, 0x00, 0x01, 0xe0, 0x60, 0x00, 0x01, 0xe0, 0xc0, 0x00, 0x01, 0xe1, 0x1c, 0x00, 0x01, 0xe1, 0x7c, 0x00, 0x01, 0xe1, 0xf0, 0x00, 0x01, 0xe2, 0x44, 0x00, 0x01, 0xe2, 0x88, 0x00, 0x01, 0xe2, 0xcc, 0x00, 0x01, 0xe3, 0x20, 0x00, 0x01, 0xe3, 0xfc, 0x00, 0x01, 0xe4, 0x18, 0x00, 0x01, 0xe4, 0x78, 0x00, 0x01, 0xe4, 0xbc, 0x00, 0x01, 0xe5, 0x04, 0x00, 0x01, 0xe5, 0x60, 0x00, 0x01, 0xe5, 0xb8, 0x00, 0x01, 0xe6, 0x14, 0x00, 0x01, 0xe6, 0x84, 0x00, 0x01, 0xe6, 0xb8, 0x00, 0x01, 0xe6, 0xec, 0x00, 0x01, 0xe7, 0x3c, 0x00, 0x01, 0xe7, 0x74, 0x00, 0x01, 0xe7, 0xd8, 0x00, 0x01, 0xe8, 0x6c, 0x00, 0x01, 0xe8, 0xa0, 0x00, 0x01, 0xe9, 0x08, 0x00, 0x01, 0xe9, 0xc8, 0x00, 0x01, 0xe9, 0xf4, 0x00, 0x01, 0xea, 0x24, 0x00, 0x01, 0xea, 0x88, 0x00, 0x01, 0xeb, 0x2c, 0x00, 0x01, 0xeb, 0x80, 0x00, 0x01, 0xeb, 0xe4, 0x00, 0x01, 0xec, 0x88, 0x00, 0x01, 0xec, 0xdc, 0x00, 0x01, 0xec, 0xf8, 0x00, 0x01, 0xed, 0x20, 0x00, 0x01, 0xed, 0x48, 0x00, 0x01, 0xed, 0x80, 0x00, 0x01, 0xed, 0x9c, 0x00, 0x01, 0xed, 0xd8, 0x00, 0x01, 0xee, 0x14, 0x00, 0x01, 0xee, 0x24, 0x00, 0x01, 0xee, 0x38, 0x00, 0x01, 0xee, 0x84, 0x00, 0x01, 0xee, 0x98, 0x00, 0x01, 0xee, 0xa8, 0x00, 0x01, 0xee, 0xdc, 0x00, 0x01, 0xee, 0xf4, 0x00, 0x01, 0xef, 0x0c, 0x00, 0x01, 0xef, 0xa4, 0x00, 0x01, 0xf0, 0x5c, 0x00, 0x01, 0xf0, 0x7c, 0x00, 0x01, 0xf0, 0xa0, 0x00, 0x01, 0xf1, 0x0c, 0x00, 0x01, 0xf1, 0x84, 0x00, 0x01, 0xf1, 0xa0, 0x00, 0x01, 0xf1, 0xd4, 0x00, 0x01, 0xf1, 0xfc, 0x00, 0x01, 0xf2, 0x44, 0x00, 0x01, 0xf2, 0x6c, 0x00, 0x01, 0xf2, 0x94, 0x00, 0x01, 0xf2, 0xd4, 0x00, 0x01, 0xf3, 0x14, 0x00, 0x01, 0xf3, 0x64, 0x00, 0x01, 0xf3, 0x7c, 0x00, 0x01, 0xf3, 0x9c, 0x00, 0x01, 0xf4, 0x68, 0x00, 0x01, 0xf5, 0xa0, 0x00, 0x01, 0xf7, 0x48, 0x00, 0x01, 0xf7, 0xe8, 0x00, 0x01, 0xf8, 0xb0, 0x00, 0x01, 0xf9, 0x78, 0x00, 0x01, 0xf9, 0x9c, 0x00, 0x01, 0xf9, 0xc0, 0x00, 0x01, 0xf9, 0xdc, 0x00, 0x01, 0xfa, 0x08, 0x00, 0x01, 0xfa, 0x20, 0x00, 0x01, 0xfa, 0x54, 0x00, 0x01, 0xfa, 0x84, 0x00, 0x01, 0xfa, 0xa4, 0x00, 0x01, 0xfb, 0x04, 0x00, 0x01, 0xfb, 0x64, 0x00, 0x01, 0xfb, 0xe0, 0x00, 0x01, 0xfc, 0x28, 0x00, 0x01, 0xfc, 0x88, 0x00, 0x01, 0xfc, 0xe8, 0x00, 0x01, 0xfd, 0x54, 0x00, 0x01, 0xfd, 0xbc, 0x00, 0x01, 0xfe, 0x3c, 0x00, 0x01, 0xfe, 0xb0, 0x00, 0x01, 0xff, 0x40, 0x00, 0x01, 0xff, 0xd0, 0x00, 0x02, 0x00, 0x84, 0x00, 0x02, 0x01, 0x24, 0x00, 0x02, 0x01, 0xd4, 0x00, 0x02, 0x02, 0xbc, 0x00, 0x02, 0x03, 0x30, 0x00, 0x02, 0x03, 0x88, 0x00, 0x02, 0x04, 0x40, 0x00, 0x02, 0x04, 0xb4, 0x00, 0x02, 0x04, 0xcc, 0x00, 0x02, 0x04, 0xec, 0x00, 0x02, 0x05, 0x0c, 0x00, 0x02, 0x05, 0x2c, 0x00, 0x02, 0x05, 0x50, 0x00, 0x02, 0x05, 0x70, 0x00, 0x02, 0x05, 0xcc, 0x00, 0x02, 0x06, 0x38, 0x00, 0x02, 0x06, 0x7c, 0x00, 0x02, 0x06, 0xc0, 0x00, 0x02, 0x07, 0x00, 0x00, 0x02, 0x07, 0x4c, 0x00, 0x02, 0x07, 0x90, 0x00, 0x02, 0x08, 0x70, 0x00, 0x02, 0x08, 0xf4, 0x00, 0x02, 0x09, 0x80, 0x00, 0x02, 0x09, 0xcc, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x02, 0x0a, 0x60, 0x00, 0x02, 0x0a, 0xa4, 0x00, 0x02, 0x0a, 0xe0, 0x00, 0x02, 0x0b, 0x18, 0x00, 0x02, 0x0b, 0x60, 0x00, 0x02, 0x0b, 0xa0, 0x00, 0x02, 0x0c, 0x08, 0x00, 0x02, 0x0c, 0x6c, 0x00, 0x02, 0x0c, 0xb4, 0x00, 0x02, 0x0c, 0xf8, 0x00, 0x02, 0x0d, 0x80, 0x00, 0x02, 0x0d, 0xe8, 0x00, 0x02, 0x0e, 0x3c, 0x00, 0x02, 0x0e, 0x90, 0x00, 0x02, 0x0e, 0xfc, 0x00, 0x02, 0x0f, 0x64, 0x00, 0x02, 0x0f, 0xe4, 0x00, 0x02, 0x10, 0x5c, 0x00, 0x02, 0x11, 0x10, 0x00, 0x02, 0x11, 0xc4, 0x00, 0x02, 0x12, 0x08, 0x00, 0x02, 0x12, 0x50, 0x00, 0x02, 0x12, 0xdc, 0x00, 0x02, 0x13, 0x64, 0x00, 0x02, 0x13, 0xa0, 0x00, 0x02, 0x13, 0xd8, 0x00, 0x02, 0x14, 0x2c, 0x00, 0x02, 0x14, 0x7c, 0x00, 0x02, 0x15, 0x0c, 0x00, 0x02, 0x15, 0x98, 0x00, 0x02, 0x16, 0x08, 0x00, 0x02, 0x16, 0x78, 0x00, 0x02, 0x16, 0xbc, 0x00, 0x02, 0x17, 0x00, 0x00, 0x02, 0x17, 0x68, 0x00, 0x02, 0x17, 0xd0, 0x00, 0x02, 0x18, 0x24, 0x00, 0x02, 0x18, 0x74, 0x00, 0x02, 0x18, 0xf0, 0x00, 0x02, 0x19, 0x70, 0x00, 0x02, 0x19, 0xdc, 0x00, 0x02, 0x1a, 0x48, 0x00, 0x02, 0x1a, 0xa8, 0x00, 0x02, 0x1a, 0xc0, 0x00, 0x02, 0x1b, 0x1c, 0x00, 0x02, 0x1b, 0x44, 0x00, 0x02, 0x1b, 0x6c, 0x00, 0x02, 0x1b, 0xa0, 0x00, 0x02, 0x1b, 0xd4, 0x00, 0x02, 0x1b, 0xfc, 0x00, 0x02, 0x1c, 0x20, 0x00, 0x02, 0x1c, 0xe8, 0x00, 0x02, 0x1d, 0x9c, 0x00, 0x02, 0x1e, 0x68, 0x00, 0x02, 0x1f, 0x20, 0x00, 0x02, 0x1f, 0xd0, 0x00, 0x02, 0x20, 0xb8, 0x00, 0x02, 0x21, 0x9c, 0x00, 0x02, 0x22, 0x5c, 0x00, 0x02, 0x23, 0x10, 0x00, 0x02, 0x23, 0x60, 0x00, 0x02, 0x23, 0x9c, 0x00, 0x02, 0x24, 0x00, 0x00, 0x02, 0x24, 0x38, 0x00, 0x02, 0x24, 0x5c, 0x00, 0x02, 0x24, 0x80, 0x00, 0x02, 0x24, 0xa8, 0x00, 0x02, 0x24, 0xcc, 0x00, 0x02, 0x24, 0xf0, 0x00, 0x02, 0x25, 0x20, 0x00, 0x02, 0x25, 0x50, 0x00, 0x02, 0x25, 0x80, 0x00, 0x02, 0x25, 0xc0, 0x00, 0x02, 0x25, 0xfc, 0x00, 0x02, 0x26, 0x40, 0x00, 0x02, 0x26, 0x9c, 0x00, 0x02, 0x26, 0xf0, 0x00, 0x02, 0x27, 0x58, 0x00, 0x02, 0x27, 0xdc, 0x00, 0x02, 0x28, 0x64, 0x00, 0x02, 0x28, 0x94, 0x00, 0x02, 0x28, 0xc0, 0x00, 0x02, 0x28, 0xf8, 0x00, 0x02, 0x29, 0x30, 0x00, 0x02, 0x29, 0x9c, 0x00, 0x02, 0x2a, 0x08, 0x00, 0x02, 0x2a, 0x58, 0x00, 0x02, 0x2a, 0x9c, 0x00, 0x02, 0x2a, 0xc0, 0x00, 0x02, 0x2a, 0xf4, 0x00, 0x02, 0x2b, 0x2c, 0x00, 0x02, 0x2b, 0x60, 0x00, 0x02, 0x2b, 0xb4, 0x00, 0x02, 0x2b, 0xe4, 0x00, 0x02, 0x2c, 0x10, 0x00, 0x02, 0x2c, 0x3c, 0x00, 0x02, 0x2c, 0x80, 0x00, 0x02, 0x2c, 0xc4, 0x00, 0x02, 0x2c, 0xd4, 0x00, 0x02, 0x2c, 0xec, 0x00, 0x02, 0x2d, 0x20, 0x00, 0x02, 0x2d, 0x8c, 0x00, 0x02, 0x2d, 0xd0, 0x00, 0x02, 0x2e, 0x10, 0x00, 0x02, 0x2e, 0x50, 0x00, 0x02, 0x2e, 0x7c, 0x00, 0x02, 0x2e, 0xac, 0x00, 0x02, 0x2f, 0x10, 0x00, 0x02, 0x2f, 0x48, 0x00, 0x02, 0x2f, 0x80, 0x00, 0x02, 0x30, 0x00, 0x00, 0x02, 0x30, 0x80, 0x00, 0x02, 0x30, 0xf8, 0x00, 0x02, 0x31, 0x70, 0x00, 0x02, 0x31, 0xcc, 0x00, 0x02, 0x32, 0x30, 0x00, 0x02, 0x32, 0x68, 0x00, 0x02, 0x32, 0x9c, 0x00, 0x02, 0x33, 0x04, 0x00, 0x02, 0x33, 0x64, 0x00, 0x02, 0x33, 0xbc, 0x00, 0x02, 0x34, 0x10, 0x00, 0x02, 0x34, 0x48, 0x00, 0x02, 0x34, 0x80, 0x00, 0x02, 0x34, 0xd4, 0x00, 0x02, 0x35, 0x28, 0x00, 0x02, 0x35, 0xb8, 0x00, 0x02, 0x36, 0x48, 0x00, 0x02, 0x36, 0xb0, 0x00, 0x02, 0x37, 0x18, 0x00, 0x02, 0x37, 0x64, 0x00, 0x02, 0x37, 0xb0, 0x00, 0x02, 0x38, 0x28, 0x00, 0x02, 0x38, 0xa0, 0x00, 0x02, 0x39, 0x28, 0x00, 0x02, 0x39, 0xb0, 0x00, 0x02, 0x3a, 0x08, 0x00, 0x02, 0x3a, 0x60, 0x00, 0x02, 0x3a, 0xd4, 0x00, 0x02, 0x3b, 0x44, 0x00, 0x02, 0x3b, 0x68, 0x00, 0x02, 0x3b, 0x88, 0x00, 0x02, 0x3b, 0xac, 0x00, 0x02, 0x3b, 0xd0, 0x00, 0x02, 0x3c, 0x44, 0x00, 0x02, 0x3c, 0xa8, 0x00, 0x02, 0x3d, 0x00, 0x00, 0x02, 0x3d, 0x18, 0x00, 0x02, 0x3d, 0x8c, 0x00, 0x02, 0x3d, 0xec, 0x00, 0x02, 0x3e, 0x60, 0x00, 0x02, 0x3e, 0xcc, 0x00, 0x02, 0x3f, 0x40, 0x00, 0x02, 0x3f, 0xa4, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0x40, 0x74, 0x00, 0x02, 0x40, 0xd8, 0x00, 0x02, 0x41, 0x0c, 0x00, 0x02, 0x41, 0x84, 0x00, 0x02, 0x41, 0xb0, 0x00, 0x02, 0x41, 0xe8, 0x00, 0x02, 0x42, 0x18, 0x00, 0x02, 0x42, 0x44, 0x00, 0x02, 0x42, 0x5c, 0x00, 0x02, 0x42, 0x7c, 0x00, 0x02, 0x42, 0xd4, 0x00, 0x02, 0x42, 0xf4, 0x00, 0x02, 0x43, 0x14, 0x00, 0x02, 0x43, 0x34, 0x00, 0x02, 0x43, 0x54, 0x00, 0x02, 0x43, 0x7c, 0x00, 0x02, 0x43, 0xa4, 0x00, 0x02, 0x43, 0xcc, 0x00, 0x02, 0x43, 0xf4, 0x00, 0x02, 0x44, 0x14, 0x00, 0x02, 0x44, 0x64, 0x00, 0x02, 0x45, 0x5c, 0x00, 0x02, 0x45, 0x80, 0x00, 0x02, 0x45, 0xa4, 0x00, 0x02, 0x45, 0xc4, 0x00, 0x02, 0x45, 0xe4, 0x00, 0x02, 0x46, 0x04, 0x00, 0x02, 0x46, 0x5c, 0x00, 0x02, 0x46, 0xb4, 0x00, 0x02, 0x47, 0x00, 0x00, 0x02, 0x47, 0x38, 0x00, 0x02, 0x47, 0xa4, 0x00, 0x02, 0x48, 0x04, 0x00, 0x02, 0x4c, 0xb8, 0x00, 0x02, 0x4d, 0x24, 0x00, 0x02, 0x4d, 0x98, 0x00, 0x02, 0x4d, 0xa8, 0x00, 0x02, 0x4d, 0xb8, 0x00, 0x02, 0x4d, 0xc8, 0x00, 0x02, 0x4d, 0xd8, 0x00, 0x02, 0x4e, 0x08, 0x00, 0x02, 0x4e, 0x54, 0x00, 0x02, 0x4e, 0x98, 0x00, 0x02, 0x4e, 0xd0, 0x00, 0x02, 0x4e, 0xec, 0x00, 0x02, 0x4f, 0x24, 0x00, 0x02, 0x4f, 0x5c, 0x00, 0x02, 0x4f, 0x78, 0x00, 0x02, 0x4f, 0xb0, 0x00, 0x02, 0x4f, 0xd0, 0x00, 0x02, 0x4f, 0xec, 0x00, 0x02, 0x50, 0x10, 0x00, 0x02, 0x50, 0x34, 0x00, 0x02, 0x50, 0x50, 0x00, 0x02, 0x50, 0x70, 0x00, 0x02, 0x50, 0xa4, 0x00, 0x02, 0x50, 0xfc, 0x00, 0x02, 0x51, 0x30, 0x00, 0x02, 0x51, 0x4c, 0x00, 0x02, 0x51, 0x80, 0x00, 0x02, 0x51, 0xd8, 0x00, 0x02, 0x52, 0x0c, 0x00, 0x02, 0x52, 0x28, 0x00, 0x02, 0x52, 0x78, 0x00, 0x02, 0x52, 0xa4, 0x00, 0x02, 0x53, 0x4c, 0x00, 0x02, 0x53, 0x5c, 0x00, 0x02, 0x53, 0xc8, 0x00, 0x02, 0x54, 0x38, 0x00, 0x02, 0x54, 0x60, 0x00, 0x02, 0x54, 0xf4, 0x00, 0x02, 0x55, 0xb8, 0x00, 0x02, 0x56, 0x90, 0x00, 0x02, 0x57, 0x2c, 0x00, 0x02, 0x57, 0xec, 0x00, 0x02, 0x58, 0xc0, 0x00, 0x02, 0x59, 0x4c, 0x00, 0x02, 0x5a, 0x3c, 0x00, 0x02, 0x5b, 0x10, 0x00, 0x02, 0x5b, 0xe0, 0x00, 0x02, 0x5b, 0xfc, 0x00, 0x02, 0x5c, 0x18, 0x00, 0x02, 0x5c, 0x34, 0x00, 0x02, 0x5c, 0x50, 0x00, 0x02, 0x5c, 0x84, 0x00, 0x02, 0x5c, 0xbc, 0x00, 0x02, 0x5c, 0xf4, 0x00, 0x02, 0x5d, 0x30, 0x00, 0x02, 0x5d, 0x68, 0x00, 0x02, 0x5d, 0xa8, 0x00, 0x02, 0x5d, 0xf0, 0x00, 0x02, 0x5e, 0x3c, 0x00, 0x02, 0x5e, 0x60, 0x00, 0x02, 0x5e, 0x84, 0x00, 0x02, 0x5e, 0xa8, 0x00, 0x02, 0x5e, 0xcc, 0x00, 0x02, 0x5e, 0xf0, 0x00, 0x02, 0x5f, 0x14, 0x00, 0x02, 0x5f, 0x38, 0x00, 0x02, 0x5f, 0x5c, 0x00, 0x02, 0x5f, 0x7c, 0x00, 0x02, 0x5f, 0xa0, 0x00, 0x02, 0x5f, 0xc4, 0x00, 0x02, 0x5f, 0xe8, 0x00, 0x02, 0x60, 0x08, 0x00, 0x02, 0x60, 0x28, 0x00, 0x02, 0x60, 0x48, 0x00, 0x02, 0x60, 0x6c, 0x00, 0x02, 0x60, 0x94, 0x00, 0x02, 0x60, 0xbc, 0x00, 0x02, 0x60, 0xe8, 0x00, 0x02, 0x61, 0x14, 0x00, 0x02, 0x61, 0x3c, 0x00, 0x02, 0x61, 0x6c, 0x00, 0x02, 0x61, 0x98, 0x00, 0x02, 0x61, 0xc0, 0x00, 0x02, 0x61, 0xe8, 0x00, 0x02, 0x62, 0x10, 0x00, 0x02, 0x62, 0x3c, 0x00, 0x02, 0x62, 0x68, 0x00, 0x02, 0x62, 0x90, 0x00, 0x02, 0x62, 0xc0, 0x00, 0x02, 0x62, 0xec, 0x00, 0x02, 0x63, 0x14, 0x00, 0x02, 0x63, 0x3c, 0x00, 0x02, 0x63, 0x68, 0x00, 0x02, 0x63, 0x94, 0x00, 0x02, 0x63, 0xbc, 0x00, 0x02, 0x63, 0xe4, 0x00, 0x02, 0x64, 0x10, 0x00, 0x02, 0x64, 0x3c, 0x00, 0x02, 0x64, 0x64, 0x00, 0x02, 0x64, 0x88, 0x00, 0x02, 0x64, 0xb4, 0x00, 0x02, 0x64, 0xe0, 0x00, 0x02, 0x65, 0x08, 0x00, 0x02, 0x65, 0x30, 0x00, 0x02, 0x65, 0x5c, 0x00, 0x02, 0x65, 0x88, 0x00, 0x02, 0x65, 0xb0, 0x00, 0x02, 0x65, 0xe0, 0x00, 0x02, 0x66, 0x14, 0x00, 0x02, 0x66, 0x48, 0x00, 0x02, 0x66, 0x7c, 0x00, 0x02, 0x66, 0xb0, 0x00, 0x02, 0x66, 0xe4, 0x00, 0x02, 0x67, 0x18, 0x00, 0x02, 0x67, 0x50, 0x00, 0x02, 0x67, 0x88, 0x00, 0x02, 0x67, 0xc0, 0x00, 0x02, 0x67, 0xf8, 0x00, 0x02, 0x68, 0x2c, 0x00, 0x02, 0x68, 0x60, 0x00, 0x02, 0x68, 0x94, 0x00, 0x02, 0x68, 0xc8, 0x00, 0x02, 0x68, 0xfc, 0x00, 0x02, 0x69, 0x20, 0x00, 0x02, 0x69, 0x4c, 0x00, 0x02, 0x69, 0x78, 0x00, 0x02, 0x69, 0xa4, 0x00, 0x02, 0x69, 0xcc, 0x00, 0x02, 0x69, 0xf4, 0x00, 0x02, 0x6a, 0x20, 0x00, 0x02, 0x6a, 0x4c, 0x00, 0x02, 0x6a, 0x80, 0x00, 0x02, 0x6a, 0xac, 0x00, 0x02, 0x6a, 0xd8, 0x00, 0x02, 0x6b, 0x0c, 0x00, 0x02, 0x6b, 0x38, 0x00, 0x02, 0x6b, 0x64, 0x00, 0x02, 0x6b, 0x98, 0x00, 0x02, 0x6b, 0xc4, 0x00, 0x02, 0x6b, 0xf0, 0x00, 0x02, 0x6c, 0x24, 0x00, 0x02, 0x6c, 0x54, 0x00, 0x02, 0x6c, 0x88, 0x00, 0x02, 0x6c, 0xcc, 0x00, 0x02, 0x6c, 0xfc, 0x00, 0x02, 0x6d, 0x30, 0x00, 0x02, 0x6d, 0x70, 0x00, 0x02, 0x6d, 0xa4, 0x00, 0x02, 0x6d, 0xd4, 0x00, 0x02, 0x6e, 0x14, 0x00, 0x02, 0x6e, 0x48, 0x00, 0x02, 0x6e, 0x78, 0x00, 0x02, 0x6e, 0xb8, 0x00, 0x02, 0x6f, 0x00, 0x00, 0x02, 0x6f, 0x44, 0x00, 0x02, 0x6f, 0xa0, 0x00, 0x02, 0x6f, 0xd4, 0x00, 0x02, 0x70, 0x0c, 0x00, 0x02, 0x70, 0x3c, 0x00, 0x02, 0x70, 0x70, 0x00, 0x02, 0x70, 0x90, 0x00, 0x02, 0x70, 0xac, 0x00, 0x02, 0x70, 0xec, 0x00, 0x02, 0x71, 0x08, 0x00, 0x02, 0x71, 0x24, 0x00, 0x02, 0x71, 0x40, 0x00, 0x02, 0x71, 0x5c, 0x00, 0x02, 0x71, 0x78, 0x00, 0x02, 0x71, 0x94, 0x00, 0x02, 0x71, 0xb0, 0x00, 0x02, 0x71, 0xcc, 0x00, 0x02, 0x71, 0xf0, 0x00, 0x02, 0x72, 0x18, 0x00, 0x02, 0x72, 0x3c, 0x00, 0x02, 0x72, 0x64, 0x00, 0x02, 0x72, 0x78, 0x00, 0x02, 0x72, 0x94, 0x00, 0x02, 0x72, 0xb0, 0x00, 0x02, 0x72, 0xcc, 0x00, 0x02, 0x72, 0xe8, 0x00, 0x02, 0x73, 0x04, 0x00, 0x02, 0x73, 0x20, 0x00, 0x02, 0x73, 0x3c, 0x00, 0x02, 0x73, 0x58, 0x00, 0x02, 0x73, 0x74, 0x00, 0x02, 0x73, 0x90, 0x00, 0x02, 0x73, 0xac, 0x00, 0x02, 0x73, 0xc8, 0x00, 0x02, 0x73, 0xe4, 0x00, 0x02, 0x74, 0x00, 0x00, 0x02, 0x74, 0x1c, 0x00, 0x02, 0x74, 0x30, 0x00, 0x02, 0x74, 0xe4, 0x00, 0x02, 0x77, 0xf8, 0x00, 0x02, 0x78, 0xa0, 0x00, 0x02, 0x78, 0xb4, 0x00, 0x02, 0x78, 0xc8, 0x00, 0x02, 0x78, 0xe4, 0x00, 0x02, 0x79, 0x00, 0x00, 0x02, 0x79, 0x1c, 0x00, 0x02, 0x79, 0x40, 0x00, 0x02, 0x79, 0x68, 0x00, 0x02, 0x79, 0x8c, 0x00, 0x02, 0x79, 0xb0, 0x00, 0x02, 0x79, 0xcc, 0x00, 0x02, 0x79, 0xf4, 0x00, 0x02, 0x7a, 0x18, 0x00, 0x02, 0x7a, 0x34, 0x00, 0x02, 0x7a, 0x60, 0x00, 0x02, 0x7a, 0xb4, 0x00, 0x02, 0x7a, 0xcc, 0x00, 0x02, 0x7b, 0x24, 0x00, 0x02, 0x7b, 0x84, 0x00, 0x02, 0x7c, 0xc0, 0x00, 0x02, 0x7d, 0x48, 0x00, 0x02, 0x7d, 0xd0, 0x00, 0x02, 0x7f, 0x8c, 0x00, 0x02, 0x7f, 0xa8, 0x00, 0x02, 0x7f, 0xd4, 0x00, 0x02, 0x7f, 0xf0, 0x00, 0x02, 0x80, 0x1c, 0x00, 0x02, 0x80, 0x38, 0x00, 0x02, 0x80, 0x64, 0x00, 0x02, 0x80, 0x84, 0x00, 0x02, 0x80, 0xb4, 0x00, 0x02, 0x80, 0xd0, 0x00, 0x02, 0x80, 0xf8, 0x00, 0x02, 0x81, 0x14, 0x00, 0x02, 0x81, 0x3c, 0x00, 0x02, 0x81, 0x58, 0x00, 0x02, 0x81, 0x84, 0x00, 0x02, 0x81, 0xa0, 0x00, 0x02, 0x81, 0xcc, 0x00, 0x02, 0x81, 0xe8, 0x00, 0x02, 0x82, 0x14, 0x00, 0x02, 0x82, 0x30, 0x00, 0x02, 0x82, 0x5c, 0x00, 0x02, 0x82, 0x78, 0x00, 0x02, 0x82, 0xa4, 0x00, 0x02, 0x82, 0xc0, 0x00, 0x02, 0x82, 0xec, 0x00, 0x02, 0x83, 0x08, 0x00, 0x02, 0x83, 0x34, 0x00, 0x02, 0x83, 0x50, 0x00, 0x02, 0x83, 0x7c, 0x00, 0x02, 0x83, 0x9c, 0x00, 0x02, 0x83, 0xd0, 0x00, 0x02, 0x84, 0x14, 0x00, 0x02, 0x84, 0xa4, 0x00, 0x02, 0x84, 0xd8, 0x00, 0x02, 0x85, 0x40, 0x00, 0x02, 0x86, 0x38, 0x00, 0x02, 0x86, 0xec, 0x00, 0x02, 0x87, 0xa8, 0x00, 0x02, 0x87, 0xf8, 0x00, 0x02, 0x88, 0x50, 0x00, 0x02, 0x88, 0xa8, 0x00, 0x02, 0x89, 0x04, 0x00, 0x02, 0x89, 0x60, 0x00, 0x02, 0x89, 0xc8, 0x00, 0x02, 0x8a, 0x18, 0x00, 0x02, 0x8a, 0x40, 0x00, 0x02, 0x8a, 0x68, 0x00, 0x02, 0x8a, 0xa4, 0x00, 0x02, 0x8b, 0x1c, 0x00, 0x02, 0x8b, 0x70, 0x00, 0x02, 0x8b, 0xc4, 0x00, 0x02, 0x8b, 0xf0, 0x00, 0x02, 0x8c, 0x1c, 0x00, 0x02, 0x8c, 0x48, 0x00, 0x02, 0x8c, 0x78, 0x00, 0x02, 0x8c, 0xbc, 0x00, 0x02, 0x8d, 0x00, 0x00, 0x02, 0x8d, 0x1c, 0x00, 0x02, 0x8d, 0x38, 0x00, 0x02, 0x8d, 0x50, 0x00, 0x02, 0x8d, 0x68, 0x00, 0x02, 0x8d, 0xb0, 0x00, 0x02, 0x8d, 0xdc, 0x00, 0x02, 0x8e, 0x08, 0x00, 0x02, 0x8e, 0x30, 0x00, 0x02, 0x8e, 0x58, 0x00, 0x02, 0x8e, 0x94, 0x00, 0x02, 0x8e, 0xd8, 0x00, 0x02, 0x8f, 0x04, 0x00, 0x02, 0x8f, 0x2c, 0x00, 0x02, 0x8f, 0x94, 0x00, 0x02, 0x8f, 0xd4, 0x00, 0x02, 0x90, 0x14, 0x00, 0x02, 0x90, 0x54, 0x00, 0x02, 0x90, 0x94, 0x00, 0x02, 0x91, 0x14, 0x00, 0x02, 0x91, 0x94, 0x00, 0x02, 0x92, 0x14, 0x00, 0x02, 0x92, 0x94, 0x00, 0x02, 0x92, 0xbc, 0x00, 0x02, 0x92, 0xe4, 0x00, 0x02, 0x93, 0x0c, 0x00, 0x02, 0x93, 0x38, 0x00, 0x02, 0x93, 0x54, 0x00, 0x02, 0x93, 0x80, 0x00, 0x02, 0x93, 0x9c, 0x00, 0x02, 0x93, 0xc4, 0x00, 0x02, 0x94, 0xb4, 0x00, 0x02, 0x95, 0x20, 0x00, 0x02, 0x95, 0xd4, 0x00, 0x02, 0x9e, 0xb4, 0x00, 0x02, 0xa1, 0x94, 0x00, 0x02, 0xa1, 0xcc, 0x00, 0x02, 0xa2, 0x30, 0x00, 0x02, 0xa2, 0x80, 0x00, 0x02, 0xa2, 0xe4, 0x00, 0x02, 0xa3, 0x78, 0x00, 0x02, 0xa4, 0x44, 0x00, 0x02, 0xa5, 0x10, 0x00, 0x02, 0xa5, 0x74, 0x00, 0x02, 0xa6, 0x10, 0x00, 0x02, 0xa8, 0x90, 0x00, 0x02, 0xab, 0x70, 0x00, 0x02, 0xab, 0xa8, 0x00, 0x02, 0xac, 0x20, 0x00, 0x02, 0xac, 0x94, 0x00, 0x02, 0xac, 0xec, 0x00, 0x02, 0xae, 0x48, 0x00, 0x02, 0xaf, 0xf4, 0x00, 0x02, 0xb0, 0x3c, 0x00, 0x02, 0xb0, 0x70, 0x00, 0x02, 0xb1, 0x64, 0x00, 0x02, 0xb2, 0x34, 0x00, 0x02, 0xb2, 0xc8, 0x00, 0x02, 0xb3, 0x5c, 0x00, 0x02, 0xb4, 0x20, 0x00, 0x02, 0xb4, 0xe8, 0x00, 0x02, 0xb5, 0xac, 0x00, 0x02, 0xb6, 0x70, 0x00, 0x02, 0xb9, 0xf4, 0x00, 0x02, 0xba, 0x70, 0x00, 0x02, 0xbb, 0x90, 0x00, 0x02, 0xbd, 0x2c, 0x00, 0x02, 0xc0, 0x88, 0x00, 0x02, 0xc1, 0x08, 0x00, 0x02, 0xc1, 0x8c, 0x00, 0x02, 0xc2, 0x00, 0x00, 0x02, 0xc2, 0x64, 0x00, 0x02, 0xc2, 0xe8, 0x00, 0x02, 0xc3, 0x78, 0x00, 0x02, 0xc4, 0xbc, 0x00, 0x02, 0xc5, 0xec, 0x00, 0x02, 0xc6, 0x88, 0x00, 0x02, 0xc7, 0x1c, 0x00, 0x02, 0xc7, 0xd0, 0x00, 0x02, 0xc7, 0xf0, 0x00, 0x02, 0xc8, 0x10, 0x00, 0x02, 0xc8, 0x30, 0x00, 0x02, 0xc8, 0x50, 0x00, 0x02, 0xc8, 0x70, 0x00, 0x02, 0xc8, 0x90, 0x00, 0x02, 0xc8, 0xb0, 0x00, 0x02, 0xc8, 0xd0, 0x00, 0x02, 0xca, 0x44, 0x00, 0x02, 0xcb, 0x20, 0x00, 0x02, 0xcb, 0xfc, 0x00, 0x02, 0xcc, 0xa8, 0x00, 0x02, 0xcd, 0xc4, 0x00, 0x02, 0xce, 0x54, 0x00, 0x02, 0xce, 0xe4, 0x00, 0x02, 0xcf, 0x9c, 0x00, 0x02, 0xd0, 0x10, 0x00, 0x02, 0xd0, 0x84, 0x00, 0x02, 0xd0, 0xf8, 0x00, 0x02, 0xd1, 0x50, 0x00, 0x02, 0xd1, 0xac, 0x00, 0x02, 0xd2, 0x40, 0x00, 0x02, 0xd2, 0xec, 0x00, 0x02, 0xd3, 0x54, 0x00, 0x02, 0xd3, 0xc8, 0x00, 0x02, 0xd4, 0x60, 0x00, 0x02, 0xd4, 0xc4, 0x00, 0x02, 0xd5, 0x84, 0x00, 0x02, 0xd6, 0x64, 0x00, 0x02, 0xd7, 0x34, 0x00, 0x02, 0xd7, 0xa8, 0x00, 0x02, 0xd8, 0x4c, 0x00, 0x02, 0xd8, 0xa8, 0x00, 0x02, 0xd9, 0x44, 0x00, 0x02, 0xda, 0x2c, 0x00, 0x02, 0xda, 0xa8, 0x00, 0x02, 0xdb, 0xd0, 0x00, 0x02, 0xdd, 0xfc, 0x00, 0x02, 0xde, 0x94, 0x00, 0x02, 0xdf, 0xb0, 0x00, 0x02, 0xe0, 0xf8, 0x00, 0x02, 0xe2, 0x0c, 0x00, 0x02, 0xe3, 0xa0, 0x00, 0x02, 0xe4, 0x98, 0x00, 0x02, 0xe5, 0x18, 0x00, 0x02, 0xe5, 0xdc, 0x00, 0x02, 0xe6, 0xc4, 0x00, 0x02, 0xe7, 0x58, 0x00, 0x02, 0xe7, 0xcc, 0x00, 0x02, 0xe8, 0x6c, 0x00, 0x02, 0xe8, 0xb4, 0x00, 0x02, 0xe9, 0x54, 0x00, 0x02, 0xea, 0x1c, 0x00, 0x02, 0xea, 0x70, 0x00, 0x02, 0xea, 0xa0, 0x00, 0x02, 0xeb, 0xc0, 0x00, 0x02, 0xec, 0xac, 0x00, 0x02, 0xec, 0xec, 0x00, 0x02, 0xed, 0x48, 0x00, 0x02, 0xed, 0xac, 0x00, 0x02, 0xee, 0x0c, 0x00, 0x02, 0xee, 0x60, 0x00, 0x02, 0xee, 0xac, 0x00, 0x02, 0xef, 0x40, 0x00, 0x02, 0xf0, 0x00, 0x00, 0x02, 0xf0, 0xe8, 0x00, 0x02, 0xf2, 0xf4, 0x00, 0x02, 0xf3, 0xe8, 0x00, 0x02, 0xf5, 0x0c, 0x00, 0x02, 0xf6, 0x48, 0x00, 0x02, 0xf7, 0x48, 0x00, 0x02, 0xf8, 0x6c, 0x00, 0x02, 0xf9, 0xa0, 0x00, 0x02, 0xfa, 0x90, 0x00, 0x02, 0xfb, 0x64, 0x00, 0x02, 0xfc, 0x70, 0x00, 0x02, 0xfd, 0xa4, 0x00, 0x02, 0xfe, 0xfc, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x98, 0x00, 0x03, 0x01, 0x08, 0x00, 0x03, 0x01, 0xbc, 0x00, 0x03, 0x02, 0xb0, 0x00, 0x03, 0x03, 0xe8, 0x00, 0x03, 0x05, 0x64, 0x00, 0x03, 0x07, 0x24, 0x00, 0x03, 0x07, 0xc0, 0x00, 0x03, 0x08, 0x80, 0x00, 0x03, 0x08, 0xe8, 0x00, 0x03, 0x09, 0x74, 0x00, 0x03, 0x09, 0x90, 0x00, 0x03, 0x09, 0xb8, 0x00, 0x03, 0x09, 0xd0, 0x00, 0x03, 0x09, 0xe8, 0x00, 0x03, 0x0a, 0x00, 0x00, 0x03, 0x0a, 0x18, 0x00, 0x03, 0x0a, 0x98, 0x00, 0x03, 0x0a, 0xe8, 0x00, 0x03, 0x0b, 0x6c, 0x00, 0x03, 0x0c, 0x64, 0x00, 0x03, 0x0d, 0x0c, 0x00, 0x03, 0x0e, 0x2c, 0x00, 0x03, 0x0e, 0xdc, 0x00, 0x03, 0x0f, 0x64, 0x00, 0x03, 0x10, 0x08, 0x00, 0x03, 0x11, 0x0c, 0x00, 0x03, 0x12, 0xf4, 0x00, 0x03, 0x15, 0xb8, 0x00, 0x03, 0x17, 0x78, 0x00, 0x03, 0x17, 0xfc, 0x00, 0x03, 0x18, 0x48, 0x00, 0x03, 0x19, 0x20, 0x00, 0x03, 0x1a, 0x08, 0x00, 0x03, 0x1a, 0xec, 0x00, 0x03, 0x1b, 0x78, 0x00, 0x03, 0x1c, 0x58, 0x00, 0x03, 0x1d, 0x68, 0x00, 0x03, 0x1e, 0x40, 0x00, 0x03, 0x1f, 0x1c, 0x00, 0x03, 0x1f, 0x6c, 0x00, 0x03, 0x1f, 0xa0, 0x00, 0x03, 0x1f, 0xec, 0x00, 0x03, 0x20, 0x8c, 0x00, 0x03, 0x21, 0xd8, 0x00, 0x03, 0x23, 0x1c, 0x00, 0x03, 0x23, 0x58, 0x00, 0x03, 0x23, 0xd8, 0x00, 0x03, 0x24, 0x30, 0x00, 0x03, 0x24, 0x8c, 0x00, 0x03, 0x24, 0xe4, 0x00, 0x03, 0x25, 0x50, 0x00, 0x03, 0x25, 0xb4, 0x00, 0x03, 0x26, 0x1c, 0x00, 0x03, 0x26, 0x80, 0x00, 0x03, 0x27, 0x28, 0x00, 0x03, 0x28, 0x08, 0x00, 0x03, 0x29, 0x18, 0x00, 0x03, 0x2a, 0x84, 0x00, 0x03, 0x2b, 0x18, 0x00, 0x03, 0x2c, 0xa8, 0x00, 0x03, 0x2e, 0x0c, 0x00, 0x03, 0x2f, 0x98, 0x00, 0x03, 0x33, 0x58, 0x00, 0x03, 0x34, 0xe4, 0x00, 0x03, 0x36, 0x5c, 0x00, 0x03, 0x36, 0xe8, 0x00, 0x03, 0x37, 0x98, 0x00, 0x03, 0x3a, 0x4c, 0x00, 0x03, 0x3b, 0xec, 0x00, 0x03, 0x3d, 0x04, 0x00, 0x03, 0x3d, 0xf0, 0x00, 0x03, 0x3f, 0x04, 0x00, 0x03, 0x3f, 0xec, 0x00, 0x03, 0x40, 0x74, 0x00, 0x03, 0x40, 0xd8, 0x00, 0x03, 0x41, 0x3c, 0x00, 0x03, 0x41, 0x80, 0x00, 0x03, 0x41, 0xc0, 0x00, 0x03, 0x42, 0x8c, 0x00, 0x03, 0x43, 0x84, 0x00, 0x03, 0x44, 0x04, 0x00, 0x03, 0x44, 0x38, 0x00, 0x03, 0x44, 0x74, 0x00, 0x03, 0x44, 0xb8, 0x00, 0x03, 0x44, 0xe8, 0x00, 0x03, 0x45, 0x48, 0x00, 0x03, 0x45, 0xbc, 0x00, 0x03, 0x46, 0xa0, 0x00, 0x03, 0x47, 0x38, 0x00, 0x03, 0x47, 0xf4, 0x00, 0x03, 0x49, 0x74, 0x00, 0x03, 0x4a, 0xf8, 0x00, 0x03, 0x4e, 0x58, 0x00, 0x03, 0x4e, 0xb8, 0x00, 0x03, 0x4f, 0x68, 0x00, 0x03, 0x4f, 0xd0, 0x00, 0x03, 0x50, 0x5c, 0x00, 0x03, 0x50, 0xec, 0x00, 0x03, 0x51, 0xac, 0x00, 0x03, 0x52, 0x38, 0x00, 0x03, 0x52, 0xb8, 0x00, 0x03, 0x53, 0x34, 0x00, 0x03, 0x53, 0xa4, 0x00, 0x03, 0x53, 0xf8, 0x00, 0x03, 0x54, 0x60, 0x00, 0x03, 0x54, 0xc4, 0x00, 0x03, 0x55, 0x1c, 0x00, 0x03, 0x55, 0xe0, 0x00, 0x03, 0x56, 0x24, 0x00, 0x03, 0x56, 0x78, 0x00, 0x03, 0x56, 0xc8, 0x00, 0x03, 0x57, 0x34, 0x00, 0x03, 0x57, 0xf0, 0x00, 0x03, 0x59, 0x9c, 0x00, 0x03, 0x5b, 0x90, 0x00, 0x03, 0x5c, 0xbc, 0x00, 0x03, 0x5e, 0xec, 0x00, 0x03, 0x60, 0x4c, 0x00, 0x03, 0x62, 0xc4, 0x00, 0x03, 0x68, 0x14, 0x00, 0x03, 0x69, 0x4c, 0x00, 0x03, 0x6b, 0x9c, 0x00, 0x03, 0x6c, 0x60, 0x00, 0x03, 0x6d, 0x24, 0x00, 0x03, 0x6d, 0xf0, 0x00, 0x03, 0x6f, 0x74, 0x00, 0x03, 0x70, 0xf4, 0x00, 0x03, 0x72, 0x54, 0x00, 0x03, 0x73, 0xb0, 0x00, 0x03, 0x74, 0xfc, 0x00, 0x03, 0x75, 0x80, 0x00, 0x03, 0x75, 0xb4, 0x00, 0x03, 0x75, 0xe8, 0x00, 0x03, 0x76, 0x18, 0x00, 0x03, 0x76, 0x48, 0x00, 0x03, 0x76, 0xa0, 0x00, 0x03, 0x76, 0xbc, 0x00, 0x03, 0x76, 0xd8, 0x00, 0x03, 0x76, 0xf4, 0x00, 0x03, 0x77, 0x1c, 0x00, 0x03, 0x77, 0x40, 0x00, 0x03, 0x77, 0x58, 0x00, 0x03, 0x77, 0x70, 0x00, 0x03, 0x78, 0x4c, 0x00, 0x03, 0x78, 0xe4, 0x00, 0x03, 0x79, 0xa0, 0x00, 0x03, 0x7a, 0x10, 0x00, 0x03, 0x7a, 0x84, 0x00, 0x03, 0x7b, 0xa4, 0x00, 0x03, 0x7c, 0x8c, 0x00, 0x03, 0x7c, 0xf8, 0x00, 0x03, 0x7d, 0x68, 0x00, 0x03, 0x7d, 0xa4, 0x00, 0x03, 0x7d, 0xe0, 0x00, 0x03, 0x7e, 0x08, 0x00, 0x03, 0x7e, 0x34, 0x00, 0x03, 0x7e, 0x5c, 0x00, 0x03, 0x7e, 0x88, 0x00, 0x03, 0x7e, 0xb0, 0x00, 0x03, 0x7e, 0xdc, 0x00, 0x03, 0x7f, 0x08, 0x00, 0x03, 0x7f, 0x34, 0x00, 0x03, 0x7f, 0x98, 0x00, 0x03, 0x7f, 0xfc, 0x00, 0x03, 0x80, 0x5c, 0x00, 0x03, 0x80, 0xec, 0x00, 0x03, 0x81, 0x94, 0x00, 0x03, 0x82, 0x00, 0x00, 0x03, 0x82, 0x90, 0x00, 0x03, 0x83, 0x34, 0x00, 0x03, 0x83, 0x90, 0x00, 0x03, 0x84, 0x54, 0x00, 0x03, 0x84, 0xf8, 0x00, 0x03, 0x85, 0x98, 0x00, 0x03, 0x86, 0x6c, 0x00, 0x03, 0x87, 0x70, 0x00, 0x03, 0x88, 0x88, 0x00, 0x03, 0x89, 0x64, 0x00, 0x03, 0x8a, 0x64, 0x00, 0x03, 0x8b, 0x7c, 0x00, 0x03, 0x8c, 0x48, 0x00, 0x03, 0x8d, 0x70, 0x00, 0x03, 0x8e, 0x88, 0x00, 0x03, 0x8f, 0xb8, 0x00, 0x03, 0x90, 0x38, 0x00, 0x03, 0x90, 0xe8, 0x00, 0x03, 0x91, 0xb0, 0x00, 0x03, 0x92, 0x3c, 0x00, 0x03, 0x92, 0xec, 0x00, 0x03, 0x93, 0xb4, 0x00, 0x03, 0x94, 0x2c, 0x00, 0x03, 0x95, 0x04, 0x00, 0x03, 0x95, 0xcc, 0x00, 0x03, 0x96, 0x90, 0x00, 0x03, 0x96, 0xc0, 0x00, 0x03, 0x96, 0xec, 0x00, 0x03, 0x97, 0x18, 0x00, 0x03, 0x97, 0x44, 0x00, 0x03, 0x97, 0x74, 0x00, 0x03, 0x98, 0x00, 0x00, 0x03, 0x98, 0x28, 0x00, 0x03, 0x98, 0x50, 0x00, 0x03, 0x98, 0xa4, 0x00, 0x03, 0x98, 0xf8, 0x00, 0x03, 0x99, 0x20, 0x00, 0x03, 0x99, 0x50, 0x00, 0x03, 0x99, 0x80, 0x00, 0x03, 0x99, 0xa0, 0x00, 0x03, 0x99, 0xf0, 0x00, 0x03, 0x9a, 0x40, 0x00, 0x03, 0x9a, 0x6c, 0x00, 0x03, 0x9a, 0x9c, 0x00, 0x03, 0x9a, 0xe4, 0x00, 0x03, 0x9b, 0x2c, 0x00, 0x03, 0x9b, 0x80, 0x00, 0x03, 0x9b, 0xd0, 0x00, 0x03, 0x9c, 0x1c, 0x00, 0x03, 0x9c, 0x6c, 0x00, 0x03, 0x9c, 0xc0, 0x00, 0x03, 0x9d, 0x14, 0x00, 0x03, 0x9d, 0x80, 0x00, 0x03, 0x9e, 0x24, 0x00, 0x03, 0x9e, 0x7c, 0x00, 0x03, 0x9e, 0xc4, 0x00, 0x03, 0x9f, 0x1c, 0x00, 0x03, 0x9f, 0xa8, 0x00, 0x03, 0xa0, 0x28, 0x00, 0x03, 0xa0, 0xb4, 0x00, 0x03, 0xa1, 0x84, 0x00, 0x03, 0xa2, 0x14, 0x00, 0x03, 0xa3, 0x38, 0x00, 0x03, 0xa4, 0x64, 0x00, 0x03, 0xa4, 0xf0, 0x00, 0x03, 0xa5, 0x50, 0x00, 0x03, 0xa5, 0xb0, 0x00, 0x03, 0xa5, 0xec, 0x00, 0x03, 0xa6, 0x20, 0x00, 0x03, 0xa6, 0x54, 0x00, 0x03, 0xa6, 0x78, 0x00, 0x03, 0xa6, 0x9c, 0x00, 0x03, 0xa6, 0xb4, 0x00, 0x03, 0xa6, 0xcc, 0x00, 0x03, 0xa7, 0x24, 0x00, 0x03, 0xa7, 0x78, 0x00, 0x03, 0xa8, 0x3c, 0x00, 0x03, 0xa8, 0xfc, 0x00, 0x03, 0xa9, 0xf8, 0x00, 0x03, 0xaa, 0x28, 0x00, 0x03, 0xaa, 0x58, 0x00, 0x03, 0xaa, 0x9c, 0x00, 0x03, 0xaa, 0xdc, 0x00, 0x03, 0xab, 0x1c, 0x00, 0x03, 0xab, 0x78, 0x00, 0x03, 0xab, 0xb4, 0x00, 0x03, 0xab, 0xf0, 0x00, 0x03, 0xac, 0x3c, 0x00, 0x03, 0xac, 0x88, 0x00, 0x03, 0xad, 0x0c, 0x00, 0x03, 0xad, 0x0c, 0x00, 0x03, 0xad, 0x20, 0x00, 0x03, 0xad, 0x34, 0x00, 0x03, 0xad, 0x50, 0x00, 0x03, 0xad, 0x64, 0x00, 0x03, 0xad, 0x80, 0x00, 0x03, 0xad, 0x9c, 0x00, 0x03, 0xad, 0xc0, 0x00, 0x03, 0xad, 0xd4, 0x00, 0x03, 0xad, 0xf0, 0x00, 0x03, 0xae, 0x0c, 0x00, 0x03, 0xae, 0x30, 0x00, 0x03, 0xae, 0x4c, 0x00, 0x03, 0xae, 0x70, 0x00, 0x03, 0xae, 0x94, 0x00, 0x03, 0xae, 0xc0, 0x00, 0x03, 0xae, 0xd4, 0x00, 0x03, 0xae, 0xf0, 0x00, 0x03, 0xaf, 0x0c, 0x00, 0x03, 0xaf, 0x30, 0x00, 0x03, 0xaf, 0x4c, 0x00, 0x03, 0xaf, 0x70, 0x00, 0x03, 0xaf, 0x94, 0x00, 0x03, 0xaf, 0xc0, 0x00, 0x03, 0xaf, 0xdc, 0x00, 0x03, 0xb0, 0x00, 0x00, 0x03, 0xb0, 0x24, 0x00, 0x03, 0xb0, 0x50, 0x00, 0x03, 0xb0, 0x74, 0x00, 0x03, 0xb0, 0xa0, 0x00, 0x03, 0xb0, 0xcc, 0x00, 0x03, 0xb1, 0x00, 0x00, 0x03, 0xb1, 0x14, 0x00, 0x03, 0xb1, 0x30, 0x00, 0x03, 0xb1, 0x4c, 0x00, 0x03, 0xb1, 0x70, 0x00, 0x03, 0xb1, 0x8c, 0x00, 0x03, 0xb1, 0xb0, 0x00, 0x03, 0xb1, 0xd4, 0x00, 0x03, 0xb2, 0x00, 0x00, 0x03, 0xb2, 0x1c, 0x00, 0x03, 0xb2, 0x40, 0x00, 0x03, 0xb2, 0x64, 0x00, 0x03, 0xb2, 0x90, 0x00, 0x03, 0xb2, 0xb4, 0x00, 0x03, 0xb2, 0xe0, 0x00, 0x03, 0xb3, 0x0c, 0x00, 0x03, 0xb3, 0x40, 0x00, 0x03, 0xb3, 0x5c, 0x00, 0x03, 0xb3, 0x80, 0x00, 0x03, 0xb3, 0xa4, 0x00, 0x03, 0xb3, 0xd0, 0x00, 0x03, 0xb3, 0xf4, 0x00, 0x03, 0xb4, 0x20, 0x00, 0x03, 0xb4, 0x4c, 0x00, 0x03, 0xb4, 0x80, 0x00, 0x03, 0xb4, 0xa4, 0x00, 0x03, 0xb4, 0xd0, 0x00, 0x03, 0xb4, 0xfc, 0x00, 0x03, 0xb5, 0x30, 0x00, 0x03, 0xb5, 0x5c, 0x00, 0x03, 0xb5, 0x90, 0x00, 0x03, 0xb5, 0xc4, 0x00, 0x03, 0xb6, 0x00, 0x00, 0x03, 0xb6, 0x14, 0x00, 0x03, 0xb6, 0x30, 0x00, 0x03, 0xb6, 0x4c, 0x00, 0x03, 0xb6, 0x70, 0x00, 0x03, 0xb6, 0x8c, 0x00, 0x03, 0xb6, 0xb0, 0x00, 0x03, 0xb6, 0xd4, 0x00, 0x03, 0xb7, 0x00, 0x00, 0x03, 0xb7, 0x1c, 0x00, 0x03, 0xb7, 0x40, 0x00, 0x03, 0xb7, 0x64, 0x00, 0x03, 0xb7, 0x90, 0x00, 0x03, 0xb7, 0xb4, 0x00, 0x03, 0xb7, 0xe0, 0x00, 0x03, 0xb8, 0x0c, 0x00, 0x03, 0xb8, 0x40, 0x00, 0x03, 0xb8, 0x5c, 0x00, 0x03, 0xb8, 0x80, 0x00, 0x03, 0xb8, 0xa4, 0x00, 0x03, 0xb8, 0xd0, 0x00, 0x03, 0xb8, 0xf4, 0x00, 0x03, 0xb9, 0x20, 0x00, 0x03, 0xb9, 0x4c, 0x00, 0x03, 0xb9, 0x80, 0x00, 0x03, 0xb9, 0xa4, 0x00, 0x03, 0xb9, 0xd0, 0x00, 0x03, 0xb9, 0xfc, 0x00, 0x03, 0xba, 0x30, 0x00, 0x03, 0xba, 0x5c, 0x00, 0x03, 0xba, 0x90, 0x00, 0x03, 0xba, 0xc4, 0x00, 0x03, 0xbb, 0x00, 0x00, 0x03, 0xbb, 0x1c, 0x00, 0x03, 0xbb, 0x40, 0x00, 0x03, 0xbb, 0x64, 0x00, 0x03, 0xbb, 0x90, 0x00, 0x03, 0xbb, 0xb4, 0x00, 0x03, 0xbb, 0xe0, 0x00, 0x03, 0xbc, 0x0c, 0x00, 0x03, 0xbc, 0x40, 0x00, 0x03, 0xbc, 0x64, 0x00, 0x03, 0xbc, 0x90, 0x00, 0x03, 0xbc, 0xbc, 0x00, 0x03, 0xbc, 0xf0, 0x00, 0x03, 0xbd, 0x1c, 0x00, 0x03, 0xbd, 0x50, 0x00, 0x03, 0xbd, 0x84, 0x00, 0x03, 0xbd, 0xc0, 0x00, 0x03, 0xbd, 0xe4, 0x00, 0x03, 0xbe, 0x10, 0x00, 0x03, 0xbe, 0x3c, 0x00, 0x03, 0xbe, 0x70, 0x00, 0x03, 0xbe, 0x9c, 0x00, 0x03, 0xbe, 0xd0, 0x00, 0x03, 0xbf, 0x04, 0x00, 0x03, 0xbf, 0x40, 0x00, 0x03, 0xbf, 0x6c, 0x00, 0x03, 0xbf, 0xa0, 0x00, 0x03, 0xbf, 0xd4, 0x00, 0x03, 0xc0, 0x10, 0x00, 0x03, 0xc0, 0x44, 0x00, 0x03, 0xc0, 0x80, 0x00, 0x03, 0xc0, 0xbc, 0x00, 0x03, 0xc1, 0x00, 0x00, 0x03, 0xc1, 0x14, 0x00, 0x03, 0xc1, 0x30, 0x00, 0x03, 0xc1, 0x4c, 0x00, 0x03, 0xc1, 0x70, 0x00, 0x03, 0xc1, 0x8c, 0x00, 0x03, 0xc1, 0xb0, 0x00, 0x03, 0xc1, 0xd4, 0x00, 0x03, 0xc2, 0x00, 0x00, 0x03, 0xc2, 0x1c, 0x00, 0x03, 0xc2, 0x40, 0x00, 0x03, 0xc2, 0x64, 0x00, 0x03, 0xc2, 0x90, 0x00, 0x03, 0xc2, 0xb4, 0x00, 0x03, 0xc2, 0xe0, 0x00, 0x03, 0xc3, 0x0c, 0x00, 0x03, 0xc3, 0x40, 0x00, 0x03, 0xc3, 0x5c, 0x00, 0x03, 0xc3, 0x80, 0x00, 0x03, 0xc3, 0xa4, 0x00, 0x03, 0xc3, 0xd0, 0x00, 0x03, 0xc3, 0xf4, 0x00, 0x03, 0xc4, 0x20, 0x00, 0x03, 0xc4, 0x4c, 0x00, 0x03, 0xc4, 0x80, 0x00, 0x03, 0xc4, 0xa4, 0x00, 0x03, 0xc4, 0xd0, 0x00, 0x03, 0xc4, 0xfc, 0x00, 0x03, 0xc5, 0x30, 0x00, 0x03, 0xc5, 0x5c, 0x00, 0x03, 0xc5, 0x90, 0x00, 0x03, 0xc5, 0xc4, 0x00, 0x03, 0xc6, 0x00, 0x00, 0x03, 0xc6, 0x1c, 0x00, 0x03, 0xc6, 0x40, 0x00, 0x03, 0xc6, 0x64, 0x00, 0x03, 0xc6, 0x90, 0x00, 0x03, 0xc6, 0xb4, 0x00, 0x03, 0xc6, 0xe0, 0x00, 0x03, 0xc7, 0x0c, 0x00, 0x03, 0xc7, 0x40, 0x00, 0x03, 0xc7, 0x64, 0x00, 0x03, 0xc7, 0x90, 0x00, 0x03, 0xc7, 0xbc, 0x00, 0x03, 0xc7, 0xf0, 0x00, 0x03, 0xc8, 0x1c, 0x00, 0x03, 0xc8, 0x50, 0x00, 0x03, 0xc8, 0x84, 0x00, 0x03, 0xc8, 0xc0, 0x00, 0x03, 0xc8, 0xe4, 0x00, 0x03, 0xc9, 0x10, 0x00, 0x03, 0xc9, 0x3c, 0x00, 0x03, 0xc9, 0x70, 0x00, 0x03, 0xc9, 0x9c, 0x00, 0x03, 0xc9, 0xd0, 0x00, 0x03, 0xca, 0x04, 0x00, 0x03, 0xca, 0x40, 0x00, 0x03, 0xca, 0x6c, 0x00, 0x03, 0xca, 0xa0, 0x00, 0x03, 0xca, 0xd4, 0x00, 0x03, 0xcb, 0x10, 0x00, 0x03, 0xcb, 0x44, 0x00, 0x03, 0xcb, 0x80, 0x00, 0x03, 0xcb, 0xbc, 0x00, 0x03, 0xcc, 0x00, 0x00, 0x03, 0xcc, 0x1c, 0x00, 0x03, 0xcc, 0x40, 0x00, 0x03, 0xcc, 0x64, 0x00, 0x03, 0xcc, 0x90, 0x00, 0x03, 0xcc, 0xb4, 0x00, 0x03, 0xcc, 0xe0, 0x00, 0x03, 0xcd, 0x0c, 0x00, 0x03, 0xcd, 0x40, 0x00, 0x03, 0xcd, 0x64, 0x00, 0x03, 0xcd, 0x90, 0x00, 0x03, 0xcd, 0xbc, 0x00, 0x03, 0xcd, 0xf0, 0x00, 0x03, 0xce, 0x1c, 0x00, 0x03, 0xce, 0x50, 0x00, 0x03, 0xce, 0x84, 0x00, 0x03, 0xce, 0xc0, 0x00, 0x03, 0xce, 0xe4, 0x00, 0x03, 0xcf, 0x10, 0x00, 0x03, 0xcf, 0x3c, 0x00, 0x03, 0xcf, 0x70, 0x00, 0x03, 0xcf, 0x9c, 0x00, 0x03, 0xcf, 0xd0, 0x00, 0x03, 0xd0, 0x04, 0x00, 0x03, 0xd0, 0x40, 0x00, 0x03, 0xd0, 0x6c, 0x00, 0x03, 0xd0, 0xa0, 0x00, 0x03, 0xd0, 0xd4, 0x00, 0x03, 0xd1, 0x10, 0x00, 0x03, 0xd1, 0x44, 0x00, 0x03, 0xd1, 0x80, 0x00, 0x03, 0xd1, 0xbc, 0x00, 0x03, 0xd2, 0x00, 0x00, 0x03, 0xd2, 0x24, 0x00, 0x03, 0xd2, 0x50, 0x00, 0x03, 0xd2, 0x7c, 0x00, 0x03, 0xd2, 0xb0, 0x00, 0x03, 0xd2, 0xdc, 0x00, 0x03, 0xd3, 0x10, 0x00, 0x03, 0xd3, 0x44, 0x00, 0x03, 0xd3, 0x80, 0x00, 0x03, 0xd3, 0xac, 0x00, 0x03, 0xd3, 0xe0, 0x00, 0x03, 0xd4, 0x14, 0x00, 0x03, 0xd4, 0x50, 0x00, 0x03, 0xd4, 0x84, 0x00, 0x03, 0xd4, 0xc0, 0x00, 0x03, 0xd4, 0xfc, 0x00, 0x03, 0xd5, 0x40, 0x00, 0x03, 0xd5, 0x6c, 0x00, 0x03, 0xd5, 0xa0, 0x00, 0x03, 0xd5, 0xd4, 0x00, 0x03, 0xd6, 0x10, 0x00, 0x03, 0xd6, 0x44, 0x00, 0x03, 0xd6, 0x80, 0x00, 0x03, 0xd6, 0xbc, 0x00, 0x03, 0xd7, 0x00, 0x00, 0x03, 0xd7, 0x34, 0x00, 0x03, 0xd7, 0x70, 0x00, 0x03, 0xd7, 0xac, 0x00, 0x03, 0xd7, 0xf0, 0x00, 0x03, 0xd8, 0x2c, 0x00, 0x03, 0xd8, 0x70, 0x00, 0x03, 0xd8, 0xb4, 0x00, 0x03, 0xd9, 0x00, 0x00, 0x03, 0xd9, 0x4c, 0x00, 0x03, 0xd9, 0x98, 0x00, 0x03, 0xd9, 0xe0, 0x00, 0x03, 0xda, 0x24, 0x00, 0x03, 0xda, 0xf0, 0x00, 0x03, 0xdb, 0xb8, 0x00, 0x03, 0xdc, 0x40, 0x00, 0x03, 0xdc, 0xc8, 0x00, 0x03, 0xdd, 0x14, 0x00, 0x03, 0xdd, 0x50, 0x00, 0x03, 0xdd, 0x8c, 0x00, 0x03, 0xdd, 0xc0, 0x00, 0x03, 0xdd, 0xf4, 0x00, 0x03, 0xde, 0x1c, 0x00, 0x03, 0xde, 0x50, 0x00, 0x03, 0xde, 0x84, 0x00, 0x03, 0xde, 0xa4, 0x00, 0x03, 0xde, 0xec, 0x00, 0x03, 0xdf, 0x44, 0x00, 0x03, 0xe0, 0x04, 0x00, 0x03, 0xe0, 0xd8, 0x00, 0x03, 0xe1, 0xbc, 0x00, 0x03, 0xe1, 0xe4, 0x00, 0x03, 0xe2, 0x44, 0x00, 0x03, 0xe2, 0xbc, 0x00, 0x03, 0xe3, 0x28, 0x00, 0x03, 0xe3, 0xd4, 0x00, 0x03, 0xe4, 0x74, 0x00, 0x03, 0xe4, 0xe8, 0x00, 0x03, 0xe5, 0x78, 0x00, 0x03, 0xe6, 0x0c, 0x00, 0x03, 0xe6, 0xb0, 0x00, 0x03, 0xe7, 0x30, 0x00, 0x03, 0xe7, 0xc8, 0x00, 0x03, 0xe8, 0x44, 0x00, 0x03, 0xe8, 0xcc, 0x00, 0x03, 0xe9, 0x50, 0x00, 0x03, 0xe9, 0xb0, 0x00, 0x03, 0xea, 0x10, 0x00, 0x03, 0xea, 0x20, 0x00, 0x03, 0xea, 0x38, 0x00, 0x03, 0xea, 0x58, 0x00, 0x03, 0xea, 0x94, 0x00, 0x03, 0xea, 0xcc, 0x00, 0x03, 0xea, 0xe4, 0x00, 0x03, 0xea, 0xfc, 0x00, 0x03, 0xeb, 0x14, 0x00, 0x03, 0xeb, 0x2c, 0x00, 0x03, 0xeb, 0x44, 0x00, 0x03, 0xeb, 0x5c, 0x00, 0x03, 0xec, 0x2c, 0x00, 0x03, 0xec, 0xf8, 0x00, 0x03, 0xed, 0x48, 0x00, 0x03, 0xed, 0x98, 0x00, 0x03, 0xee, 0x5c, 0x00, 0x03, 0xef, 0x18, 0x00, 0x03, 0xef, 0x7c, 0x00, 0x03, 0xef, 0xd8, 0x00, 0x03, 0xf0, 0x5c, 0x00, 0x03, 0xf0, 0xdc, 0x00, 0x03, 0xf1, 0x6c, 0x00, 0x03, 0xf1, 0xfc, 0x00, 0x03, 0xf2, 0x58, 0x00, 0x03, 0xf2, 0xbc, 0x00, 0x03, 0xf3, 0x24, 0x00, 0x03, 0xf3, 0x88, 0x00, 0x03, 0xf3, 0xc4, 0x00, 0x03, 0xf4, 0x00, 0x00, 0x03, 0xf4, 0x18, 0x00, 0x03, 0xf4, 0x30, 0x00, 0x03, 0xf4, 0x74, 0x00, 0x03, 0xf4, 0xbc, 0x00, 0x03, 0xf5, 0x04, 0x00, 0x03, 0xf5, 0x54, 0x00, 0x03, 0xf5, 0xcc, 0x00, 0x03, 0xf6, 0x48, 0x00, 0x03, 0xf6, 0xdc, 0x00, 0x03, 0xf7, 0x74, 0x00, 0x03, 0xf7, 0xf4, 0x00, 0x03, 0xf8, 0x3c, 0x00, 0x03, 0xf8, 0x80, 0x00, 0x03, 0xf8, 0xe4, 0x00, 0x03, 0xf9, 0x44, 0x00, 0x03, 0xf9, 0x98, 0x00, 0x03, 0xf9, 0xec, 0x00, 0x03, 0xfa, 0x64, 0x00, 0x03, 0xfa, 0xd8, 0x00, 0x03, 0xfb, 0xb8, 0x00, 0x03, 0xfc, 0x98, 0x00, 0x03, 0xfd, 0x68, 0x00, 0x03, 0xfe, 0x38, 0x00, 0x03, 0xfe, 0x84, 0x00, 0x03, 0xfe, 0xcc, 0x00, 0x03, 0xff, 0x14, 0x00, 0x03, 0xff, 0x5c, 0x00, 0x03, 0xff, 0xa4, 0x00, 0x03, 0xff, 0xec, 0x00, 0x04, 0x00, 0x44, 0x00, 0x04, 0x00, 0x6c, 0x00, 0x04, 0x00, 0x94, 0x00, 0x04, 0x00, 0xbc, 0x00, 0x04, 0x00, 0xe8, 0x00, 0x04, 0x01, 0x14, 0x00, 0x04, 0x01, 0x40, 0x00, 0x04, 0x01, 0x6c, 0x00, 0x04, 0x01, 0xa4, 0x00, 0x04, 0x01, 0xd8, 0x00, 0x04, 0x02, 0x0c, 0x00, 0x04, 0x02, 0x44, 0x00, 0x04, 0x02, 0x7c, 0x00, 0x04, 0x02, 0xb0, 0x00, 0x04, 0x02, 0xdc, 0x00, 0x04, 0x03, 0x08, 0x00, 0x04, 0x03, 0x34, 0x00, 0x04, 0x03, 0x5c, 0x00, 0x04, 0x03, 0x8c, 0x00, 0x04, 0x03, 0xbc, 0x00, 0x04, 0x03, 0xec, 0x00, 0x04, 0x04, 0x1c, 0x00, 0x04, 0x04, 0xc8, 0x00, 0x04, 0x04, 0xec, 0x00, 0x04, 0x05, 0x24, 0x00, 0x04, 0x05, 0x68, 0x00, 0x04, 0x05, 0x90, 0x00, 0x04, 0x05, 0xbc, 0x00, 0x04, 0x05, 0xf4, 0x00, 0x04, 0x06, 0x18, 0x00, 0x04, 0x06, 0x54, 0x00, 0x04, 0x06, 0x9c, 0x00, 0x04, 0x06, 0xdc, 0x00, 0x04, 0x07, 0x4c, 0x00, 0x04, 0x07, 0xa8, 0x00, 0x04, 0x08, 0x1c, 0x00, 0x04, 0x08, 0xcc, 0x00, 0x04, 0x09, 0x28, 0x00, 0x04, 0x09, 0x38, 0x00, 0x04, 0x09, 0x88, 0x00, 0x04, 0x09, 0xc4, 0x00, 0x04, 0x0a, 0x04, 0x00, 0x04, 0x0a, 0x38, 0x00, 0x04, 0x0a, 0x6c, 0x00, 0x04, 0x0a, 0xd4, 0x00, 0x04, 0x0b, 0x24, 0x00, 0x04, 0x0b, 0x5c, 0x00, 0x04, 0x0b, 0xb8, 0x00, 0x04, 0x0c, 0x04, 0x00, 0x04, 0x0c, 0x70, 0x00, 0x04, 0x0c, 0xd0, 0x00, 0x04, 0x0d, 0x30, 0x00, 0x04, 0x0d, 0x58, 0x00, 0x04, 0x0d, 0x80, 0x00, 0x04, 0x0e, 0x00, 0x00, 0x04, 0x0e, 0x4c, 0x00, 0x04, 0x0e, 0xc4, 0x00, 0x04, 0x0e, 0xf8, 0x00, 0x04, 0x0f, 0x0c, 0x00, 0x04, 0x0f, 0x38, 0x00, 0x04, 0x0f, 0xe4, 0x00, 0x04, 0x10, 0x3c, 0x00, 0x04, 0x10, 0x64, 0x00, 0x04, 0x10, 0x8c, 0x00, 0x04, 0x10, 0xb4, 0x00, 0x04, 0x10, 0xdc, 0x00, 0x04, 0x11, 0x04, 0x00, 0x04, 0x11, 0x2c, 0x00, 0x04, 0x11, 0x54, 0x00, 0x04, 0x11, 0x7c, 0x00, 0x04, 0x11, 0xa4, 0x00, 0x04, 0x11, 0xc8, 0x00, 0x04, 0x11, 0xe8, 0x00, 0x04, 0x12, 0x0c, 0x00, 0x04, 0x12, 0x30, 0x00, 0x04, 0x12, 0x54, 0x00, 0x04, 0x12, 0x74, 0x00, 0x04, 0x12, 0xa0, 0x00, 0x04, 0x12, 0xcc, 0x00, 0x04, 0x12, 0xf8, 0x00, 0x04, 0x13, 0x24, 0x00, 0x04, 0x13, 0x38, 0x00, 0x04, 0x13, 0x7c, 0x00, 0x04, 0x13, 0xc0, 0x00, 0x04, 0x13, 0xf0, 0x00, 0x04, 0x14, 0x20, 0x00, 0x04, 0x14, 0x64, 0x00, 0x04, 0x14, 0xbc, 0x00, 0x04, 0x15, 0x40, 0x00, 0x04, 0x15, 0xd0, 0x00, 0x04, 0x15, 0xe0, 0x00, 0x04, 0x16, 0x70, 0x00, 0x04, 0x16, 0x9c, 0x00, 0x04, 0x16, 0xac, 0x00, 0x04, 0x17, 0x0c, 0x00, 0x04, 0x17, 0xe4, 0x00, 0x04, 0x18, 0x68, 0x00, 0x04, 0x19, 0x14, 0x00, 0x04, 0x19, 0x70, 0x00, 0x04, 0x1a, 0x04, 0x00, 0x04, 0x1a, 0x4c, 0x00, 0x04, 0x1a, 0xc8, 0x00, 0x04, 0x1b, 0x24, 0x00, 0x04, 0x1b, 0xb4, 0x00, 0x04, 0x1c, 0x14, 0x00, 0x04, 0x1c, 0xa8, 0x00, 0x04, 0x1c, 0xb8, 0x00, 0x04, 0x1c, 0xc8, 0x00, 0x04, 0x1d, 0x10, 0x00, 0x04, 0x1d, 0x58, 0x00, 0x04, 0x1d, 0x84, 0x00, 0x04, 0x1d, 0xac, 0x00, 0x04, 0x1d, 0xdc, 0x00, 0x04, 0x1e, 0x08, 0x00, 0x04, 0x1e, 0x90, 0x00, 0x04, 0x1f, 0x14, 0x00, 0x04, 0x1f, 0xc8, 0x00, 0x04, 0x20, 0x68, 0x00, 0x04, 0x20, 0xc4, 0x00, 0x04, 0x21, 0x2c, 0x00, 0x04, 0x21, 0xa0, 0x00, 0x04, 0x22, 0x38, 0x00, 0x04, 0x22, 0xc0, 0x00, 0x04, 0x23, 0x28, 0x00, 0x04, 0x23, 0x80, 0x00, 0x04, 0x23, 0xe8, 0x00, 0x04, 0x24, 0x40, 0x00, 0x04, 0x24, 0xac, 0x00, 0x04, 0x24, 0xcc, 0x00, 0x04, 0x24, 0xec, 0x00, 0x04, 0x25, 0x34, 0x00, 0x04, 0x25, 0x78, 0x00, 0x04, 0x25, 0x88, 0x00, 0x04, 0x25, 0xb0, 0x00, 0x04, 0x25, 0xd4, 0x00, 0x04, 0x25, 0xf0, 0x00, 0x04, 0x26, 0x00, 0x00, 0x04, 0x26, 0x60, 0x00, 0x04, 0x26, 0x98, 0x00, 0x04, 0x26, 0xe4, 0x00, 0x04, 0x27, 0x6c, 0x00, 0x04, 0x28, 0x20, 0x00, 0x04, 0x28, 0x7c, 0x00, 0x04, 0x28, 0xd8, 0x00, 0x04, 0x29, 0x40, 0x00, 0x04, 0x29, 0xb0, 0x00, 0x04, 0x2a, 0x44, 0x00, 0x04, 0x2a, 0x9c, 0x00, 0x04, 0x2b, 0x30, 0x00, 0x04, 0x2b, 0xc4, 0x00, 0x04, 0x2c, 0x0c, 0x00, 0x04, 0x2c, 0x1c, 0x00, 0x04, 0x2c, 0x48, 0x00, 0x04, 0x2c, 0x8c, 0x00, 0x04, 0x2c, 0xc8, 0x00, 0x04, 0x2c, 0xe4, 0x00, 0x04, 0x2d, 0x30, 0x00, 0x04, 0x2d, 0x4c, 0x00, 0x04, 0x2d, 0x6c, 0x00, 0x04, 0x2d, 0x90, 0x00, 0x04, 0x2d, 0xb4, 0x00, 0x04, 0x2d, 0xd8, 0x00, 0x04, 0x2d, 0xf8, 0x00, 0x04, 0x2e, 0x0c, 0x00, 0x04, 0x2e, 0x20, 0x00, 0x04, 0x2e, 0x34, 0x00, 0x04, 0x2e, 0x48, 0x00, 0x04, 0x2e, 0x6c, 0x00, 0x04, 0x2e, 0x80, 0x00, 0x04, 0x2e, 0x94, 0x00, 0x04, 0x2e, 0xa8, 0x00, 0x04, 0x2e, 0xbc, 0x00, 0x04, 0x2e, 0xe0, 0x00, 0x04, 0x2e, 0xf4, 0x00, 0x04, 0x2f, 0x08, 0x00, 0x04, 0x2f, 0x1c, 0x00, 0x04, 0x2f, 0x30, 0x00, 0x04, 0x2f, 0x54, 0x00, 0x04, 0x2f, 0x68, 0x00, 0x04, 0x2f, 0x7c, 0x00, 0x04, 0x2f, 0x90, 0x00, 0x04, 0x2f, 0xa4, 0x00, 0x04, 0x2f, 0xbc, 0x00, 0x04, 0x30, 0x8c, 0x00, 0x04, 0x31, 0x5c, 0x00, 0x04, 0x32, 0x2c, 0x00, 0x04, 0x32, 0xfc, 0x00, 0x04, 0x33, 0x50, 0x00, 0x04, 0x33, 0xb8, 0x00, 0x04, 0x34, 0x2c, 0x00, 0x04, 0x34, 0xc8, 0x00, 0x04, 0x35, 0x20, 0x00, 0x04, 0x35, 0x90, 0x00, 0x04, 0x36, 0x14, 0x00, 0x04, 0x36, 0x90, 0x00, 0x04, 0x36, 0xe4, 0x00, 0x04, 0x37, 0x48, 0x00, 0x04, 0x37, 0xf4, 0x00, 0x04, 0x38, 0x60, 0x00, 0x04, 0x38, 0xc0, 0x00, 0x04, 0x39, 0x34, 0x00, 0x04, 0x39, 0x98, 0x00, 0x04, 0x39, 0xf0, 0x00, 0x04, 0x3a, 0x74, 0x00, 0x04, 0x3a, 0xc4, 0x00, 0x04, 0x3b, 0x44, 0x00, 0x04, 0x3b, 0xac, 0x00, 0x04, 0x3c, 0x54, 0x00, 0x04, 0x3c, 0xb4, 0x00, 0x04, 0x3d, 0x44, 0x00, 0x04, 0x3d, 0xac, 0x00, 0x04, 0x3e, 0x20, 0x00, 0x04, 0x3e, 0x88, 0x00, 0x04, 0x3f, 0x04, 0x00, 0x04, 0x3f, 0x58, 0x00, 0x04, 0x3f, 0xcc, 0x00, 0x04, 0x40, 0x44, 0x00, 0x04, 0x40, 0x98, 0x00, 0x04, 0x41, 0x0c, 0x00, 0x04, 0x41, 0x7c, 0x00, 0x04, 0x41, 0xf4, 0x00, 0x04, 0x42, 0x68, 0x00, 0x04, 0x42, 0xcc, 0x00, 0x04, 0x43, 0x38, 0x00, 0x04, 0x43, 0xbc, 0x00, 0x04, 0x44, 0x4c, 0x00, 0x04, 0x44, 0xd8, 0x00, 0x04, 0x45, 0xa4, 0x00, 0x04, 0x45, 0xf8, 0x00, 0x04, 0x46, 0x58, 0x00, 0x04, 0x46, 0xc8, 0x00, 0x04, 0x47, 0x1c, 0x00, 0x04, 0x47, 0x80, 0x00, 0x04, 0x47, 0xe4, 0x00, 0x04, 0x48, 0x44, 0x00, 0x04, 0x48, 0xa4, 0x00, 0x04, 0x49, 0x14, 0x00, 0x04, 0x49, 0x84, 0x00, 0x04, 0x49, 0xdc, 0x00, 0x04, 0x4a, 0x34, 0x00, 0x04, 0x4a, 0x98, 0x00, 0x04, 0x4b, 0x0c, 0x00, 0x04, 0x4b, 0x8c, 0x00, 0x04, 0x4c, 0x1c, 0x00, 0x04, 0x4c, 0x90, 0x00, 0x04, 0x4d, 0x14, 0x00, 0x04, 0x4d, 0x8c, 0x00, 0x04, 0x4e, 0x10, 0x00, 0x04, 0x4e, 0xa0, 0x00, 0x04, 0x4f, 0x18, 0x00, 0x04, 0x4f, 0xa0, 0x00, 0x04, 0x50, 0x24, 0x00, 0x04, 0x50, 0x94, 0x00, 0x04, 0x50, 0xfc, 0x00, 0x04, 0x51, 0x50, 0x00, 0x04, 0x51, 0x98, 0x00, 0x04, 0x52, 0x1c, 0x00, 0x04, 0x52, 0x8c, 0x00, 0x04, 0x53, 0x0c, 0x00, 0x04, 0x54, 0x04, 0x00, 0x04, 0x54, 0x2c, 0x00, 0x04, 0x54, 0x54, 0x00, 0x04, 0x54, 0x9c, 0x00, 0x04, 0x54, 0xe4, 0x00, 0x04, 0x54, 0xe4, 0x00, 0x04, 0x54, 0xe4, 0x00, 0x04, 0x54, 0xe4, 0x00, 0x04, 0x54, 0xe4, 0x00, 0x04, 0x55, 0x70, 0x00, 0x04, 0x55, 0xa8, 0x00, 0x04, 0x56, 0x20, 0x00, 0x04, 0x56, 0x4c, 0x00, 0x04, 0x56, 0x9c, 0x00, 0x04, 0x56, 0xdc, 0x00, 0x04, 0x57, 0x0c, 0x00, 0x04, 0x57, 0x38, 0x00, 0x04, 0x57, 0x74, 0x00, 0x04, 0x58, 0x0c, 0x00, 0x04, 0x58, 0x28, 0x00, 0x04, 0x58, 0x60, 0x00, 0x04, 0x58, 0x88, 0x00, 0x04, 0x58, 0xc8, 0x00, 0x04, 0x58, 0xf8, 0x00, 0x04, 0x59, 0x54, 0x00, 0x04, 0x59, 0xe4, 0x00, 0x04, 0x5a, 0x2c, 0x00, 0x04, 0x5a, 0x64, 0x00, 0x04, 0x5a, 0xcc, 0x00, 0x04, 0x5b, 0x20, 0x00, 0x04, 0x5b, 0x58, 0x00, 0x04, 0x5b, 0x84, 0x00, 0x04, 0x5b, 0xac, 0x00, 0x04, 0x5b, 0xf0, 0x00, 0x04, 0x5c, 0x6c, 0x00, 0x04, 0x5c, 0xa4, 0x00, 0x04, 0x5d, 0x24, 0x00, 0x04, 0x5d, 0x68, 0x00, 0x04, 0x5d, 0xb0, 0x00, 0x04, 0x5d, 0xd4, 0x00, 0x04, 0x5e, 0x1c, 0x00, 0x04, 0x5e, 0x2c, 0x00, 0x04, 0x5e, 0x58, 0x00, 0x04, 0x5e, 0x68, 0x00, 0x04, 0x5e, 0x9c, 0x00, 0x04, 0x5e, 0xd4, 0x00, 0x04, 0x5e, 0xf0, 0x00, 0x04, 0x5f, 0x0c, 0x00, 0x04, 0x5f, 0x28, 0x00, 0x04, 0x5f, 0x44, 0x00, 0x04, 0x5f, 0x60, 0x00, 0x04, 0x5f, 0x88, 0x00, 0x04, 0x5f, 0xb0, 0x00, 0x04, 0x5f, 0xdc, 0x00, 0x04, 0x60, 0x04, 0x00, 0x04, 0x60, 0x2c, 0x00, 0x04, 0x60, 0x58, 0x00, 0x04, 0x60, 0x80, 0x00, 0x04, 0x60, 0xa8, 0x00, 0x04, 0x60, 0xd0, 0x00, 0x04, 0x60, 0xf8, 0x00, 0x04, 0x61, 0x20, 0x00, 0x04, 0x61, 0x4c, 0x00, 0x04, 0x61, 0x74, 0x00, 0x04, 0x61, 0x9c, 0x00, 0x04, 0x61, 0xc8, 0x00, 0x04, 0x61, 0xf0, 0x00, 0x04, 0x62, 0x18, 0x00, 0x04, 0x62, 0x40, 0x00, 0x04, 0x62, 0x68, 0x00, 0x04, 0x62, 0x90, 0x00, 0x04, 0x62, 0xbc, 0x00, 0x04, 0x62, 0xe4, 0x00, 0x04, 0x63, 0x0c, 0x00, 0x04, 0x63, 0x38, 0x00, 0x04, 0x63, 0x60, 0x00, 0x04, 0x63, 0x88, 0x00, 0x04, 0x63, 0xb0, 0x00, 0x04, 0x63, 0xd8, 0x00, 0x04, 0x64, 0x00, 0x00, 0x04, 0x64, 0x2c, 0x00, 0x04, 0x64, 0x54, 0x00, 0x04, 0x64, 0x7c, 0x00, 0x04, 0x64, 0xa8, 0x00, 0x04, 0x64, 0xd0, 0x00, 0x04, 0x64, 0xf8, 0x00, 0x04, 0x65, 0x20, 0x00, 0x04, 0x65, 0x48, 0x00, 0x04, 0x65, 0x70, 0x00, 0x04, 0x65, 0x9c, 0x00, 0x04, 0x65, 0xc4, 0x00, 0x04, 0x65, 0xec, 0x00, 0x04, 0x66, 0x18, 0x00, 0x04, 0x66, 0x40, 0x00, 0x04, 0x66, 0x68, 0x00, 0x04, 0x66, 0x90, 0x00, 0x04, 0x66, 0xb8, 0x00, 0x04, 0x66, 0xe0, 0x00, 0x04, 0x67, 0x0c, 0x00, 0x04, 0x67, 0x34, 0x00, 0x04, 0x67, 0x5c, 0x00, 0x04, 0x67, 0x88, 0x00, 0x04, 0x67, 0xb0, 0x00, 0x04, 0x67, 0xd8, 0x00, 0x04, 0x68, 0x00, 0x00, 0x04, 0x68, 0x28, 0x00, 0x04, 0x68, 0x50, 0x00, 0x04, 0x68, 0x7c, 0x00, 0x04, 0x68, 0xa4, 0x00, 0x04, 0x68, 0xcc, 0x00, 0x04, 0x68, 0xf8, 0x00, 0x04, 0x69, 0x20, 0x00, 0x04, 0x69, 0x48, 0x00, 0x04, 0x69, 0x70, 0x00, 0x04, 0x69, 0x98, 0x00, 0x04, 0x69, 0xc0, 0x00, 0x04, 0x69, 0xec, 0x00, 0x04, 0x6a, 0x14, 0x00, 0x04, 0x6a, 0x3c, 0x00, 0x04, 0x6a, 0x68, 0x00, 0x04, 0x6a, 0x90, 0x00, 0x04, 0x6a, 0xb8, 0x00, 0x04, 0x6a, 0xe0, 0x00, 0x04, 0x6b, 0x08, 0x00, 0x04, 0x6b, 0x30, 0x00, 0x04, 0x6b, 0x5c, 0x00, 0x04, 0x6b, 0x84, 0x00, 0x04, 0x6b, 0xac, 0x00, 0x04, 0x6b, 0xd8, 0x00, 0x04, 0x6c, 0x00, 0x00, 0x04, 0x6c, 0x28, 0x00, 0x04, 0x6c, 0x50, 0x00, 0x04, 0x6c, 0x9c, 0x00, 0x04, 0x6d, 0x2c, 0x00, 0x04, 0x6d, 0x98, 0x00, 0x04, 0x6d, 0xd8, 0x00, 0x04, 0x6e, 0x14, 0x00, 0x04, 0x6e, 0x9c, 0x00, 0x04, 0x6e, 0xd8, 0x00, 0x04, 0x6f, 0x24, 0x00, 0x04, 0x6f, 0x68, 0x00, 0x04, 0x6f, 0x98, 0x00, 0x04, 0x6f, 0xf4, 0x00, 0x04, 0x70, 0x8c, 0x00, 0x04, 0x71, 0x28, 0x00, 0x04, 0x71, 0x60, 0x00, 0x04, 0x71, 0xd4, 0x00, 0x04, 0x72, 0x10, 0x00, 0x04, 0x72, 0x78, 0x00, 0x04, 0x72, 0xcc, 0x00, 0x04, 0x73, 0x14, 0x00, 0x04, 0x73, 0xb8, 0x00, 0x04, 0x74, 0x54, 0x00, 0x04, 0x74, 0xcc, 0x00, 0x04, 0x75, 0x68, 0x00, 0x04, 0x75, 0xdc, 0x00, 0x04, 0x76, 0x44, 0x00, 0x04, 0x77, 0x0c, 0x00, 0x04, 0x77, 0x80, 0x00, 0x04, 0x77, 0xb8, 0x00, 0x04, 0x78, 0x14, 0x00, 0x04, 0x78, 0x58, 0x00, 0x04, 0x78, 0xa4, 0x00, 0x04, 0x79, 0x60, 0x00, 0x04, 0x79, 0xd4, 0x00, 0x04, 0x7a, 0x5c, 0x00, 0x04, 0x7a, 0xf8, 0x00, 0x04, 0x7b, 0x94, 0x00, 0x04, 0x7b, 0xe0, 0x00, 0x04, 0x7c, 0xac, 0x00, 0x04, 0x7d, 0x08, 0x00, 0x04, 0x7d, 0x7c, 0x00, 0x04, 0x7d, 0xb8, 0x00, 0x04, 0x7e, 0x14, 0x00, 0x04, 0x7e, 0x68, 0x00, 0x04, 0x7e, 0xb8, 0x00, 0x04, 0x7e, 0xfc, 0x00, 0x04, 0x7f, 0x0c, 0x00, 0x04, 0x7f, 0x1c, 0x00, 0x04, 0x7f, 0x2c, 0x00, 0x04, 0x7f, 0x3c, 0x00, 0x04, 0x7f, 0x4c, 0x00, 0x04, 0x7f, 0x5c, 0x00, 0x04, 0x7f, 0x6c, 0x00, 0x04, 0x7f, 0x7c, 0x00, 0x04, 0x7f, 0x8c, 0x00, 0x04, 0x7f, 0x9c, 0x00, 0x04, 0x7f, 0xac, 0x00, 0x04, 0x7f, 0xbc, 0x00, 0x04, 0x7f, 0xcc, 0x00, 0x04, 0x7f, 0xdc, 0x00, 0x04, 0x7f, 0xec, 0x00, 0x04, 0x7f, 0xfc, 0x00, 0x04, 0x80, 0x0c, 0x00, 0x04, 0x80, 0x1c, 0x00, 0x04, 0x80, 0x2c, 0x00, 0x04, 0x80, 0x3c, 0x00, 0x04, 0x80, 0x4c, 0x00, 0x04, 0x80, 0x5c, 0x00, 0x04, 0x80, 0x6c, 0x00, 0x04, 0x80, 0x7c, 0x00, 0x04, 0x80, 0x8c, 0x00, 0x04, 0x80, 0x9c, 0x00, 0x04, 0x80, 0xac, 0x00, 0x04, 0x80, 0xbc, 0x00, 0x04, 0x80, 0xcc, 0x00, 0x04, 0x80, 0xdc, 0x00, 0x04, 0x80, 0xec, 0x00, 0x04, 0x80, 0xfc, 0x00, 0x04, 0x81, 0x0c, 0x00, 0x04, 0x81, 0x1c, 0x00, 0x04, 0x81, 0x2c, 0x00, 0x04, 0x81, 0x3c, 0x00, 0x04, 0x81, 0x4c, 0x00, 0x04, 0x81, 0x5c, 0x00, 0x04, 0x81, 0x6c, 0x00, 0x04, 0x81, 0x7c, 0x00, 0x04, 0x81, 0x8c, 0x00, 0x04, 0x81, 0x9c, 0x00, 0x04, 0x81, 0xac, 0x00, 0x04, 0x81, 0xbc, 0x00, 0x04, 0x81, 0xcc, 0x00, 0x04, 0x81, 0xdc, 0x00, 0x04, 0x81, 0xec, 0x00, 0x04, 0x81, 0xfc, 0x00, 0x04, 0x82, 0x0c, 0x00, 0x04, 0x82, 0x1c, 0x00, 0x04, 0x82, 0x2c, 0x00, 0x04, 0x82, 0x3c, 0x00, 0x04, 0x82, 0xa8, 0x00, 0x04, 0x82, 0xe8, 0x00, 0x04, 0x83, 0x74, 0x00, 0x04, 0x84, 0x04, 0x00, 0x04, 0x84, 0x50, 0x00, 0x04, 0x84, 0xc0, 0x00, 0x04, 0x85, 0x48, 0x00, 0x04, 0x85, 0x84, 0x00, 0x04, 0x86, 0x5c, 0x00, 0x04, 0x86, 0xe8, 0x00, 0x04, 0x86, 0xf8, 0x00, 0x04, 0x87, 0x08, 0x00, 0x04, 0x87, 0x18, 0x00, 0x04, 0x87, 0x28, 0x00, 0x04, 0x87, 0x38, 0x00, 0x04, 0x87, 0x48, 0x00, 0x04, 0x87, 0x58, 0x00, 0x04, 0x87, 0x68, 0x00, 0x04, 0x87, 0x78, 0x00, 0x04, 0x87, 0x88, 0x00, 0x04, 0x87, 0xb4, 0x00, 0x04, 0x87, 0xec, 0x00, 0x04, 0x88, 0x68, 0x00, 0x04, 0x89, 0x24, 0x00, 0x04, 0x8a, 0x20, 0x00, 0x04, 0x8b, 0x5c, 0x00, 0x04, 0x8c, 0xd8, 0x00, 0x04, 0x8e, 0x8c, 0x00, 0x04, 0x8f, 0x08, 0x00, 0x04, 0x8f, 0xc4, 0x00, 0x04, 0x90, 0xc4, 0x00, 0x04, 0x92, 0x00, 0x00, 0x04, 0x93, 0x7c, 0x00, 0x04, 0x95, 0x38, 0x00, 0x04, 0x97, 0x2c, 0x00, 0x04, 0x97, 0xe8, 0x00, 0x04, 0x98, 0xe4, 0x00, 0x04, 0x9a, 0x20, 0x00, 0x04, 0x9b, 0x9c, 0x00, 0x04, 0x9d, 0x4c, 0x00, 0x04, 0x9f, 0x48, 0x00, 0x04, 0xa1, 0x7c, 0x00, 0x04, 0xa2, 0x78, 0x00, 0x04, 0xa3, 0xb4, 0x00, 0x04, 0xa5, 0x34, 0x00, 0x04, 0xa6, 0xf0, 0x00, 0x04, 0xa8, 0xec, 0x00, 0x04, 0xab, 0x28, 0x00, 0x04, 0xad, 0x9c, 0x00, 0x04, 0xae, 0xd0, 0x00, 0x04, 0xb0, 0x44, 0x00, 0x04, 0xb2, 0x04, 0x00, 0x04, 0xb4, 0x00, 0x00, 0x04, 0xb6, 0x3c, 0x00, 0x04, 0xb8, 0xb8, 0x00, 0x04, 0xbb, 0x6c, 0x00, 0x04, 0xbc, 0xe4, 0x00, 0x04, 0xbe, 0xa0, 0x00, 0x04, 0xc0, 0x9c, 0x00, 0x04, 0xc2, 0xd8, 0x00, 0x04, 0xc5, 0x54, 0x00, 0x04, 0xc8, 0x10, 0x00, 0x04, 0xcb, 0x04, 0x00, 0x04, 0xcc, 0xc4, 0x00, 0x04, 0xce, 0xcc, 0x00, 0x04, 0xd1, 0x14, 0x00, 0x04, 0xd3, 0x9c, 0x00, 0x04, 0xd6, 0x60, 0x00, 0x04, 0xd9, 0x64, 0x00, 0x04, 0xdc, 0x94, 0x00, 0x04, 0xdc, 0xc0, 0x00, 0x04, 0xdc, 0xf8, 0x00, 0x04, 0xdd, 0x74, 0x00, 0x04, 0xde, 0x30, 0x00, 0x04, 0xdf, 0x28, 0x00, 0x04, 0xe0, 0x64, 0x00, 0x04, 0xe1, 0xe0, 0x00, 0x04, 0xe3, 0x94, 0x00, 0x04, 0xe4, 0x10, 0x00, 0x04, 0xe4, 0xcc, 0x00, 0x04, 0xe5, 0xcc, 0x00, 0x04, 0xe7, 0x08, 0x00, 0x04, 0xe8, 0x84, 0x00, 0x04, 0xea, 0x40, 0x00, 0x04, 0xec, 0x34, 0x00, 0x04, 0xec, 0xf0, 0x00, 0x04, 0xed, 0xec, 0x00, 0x04, 0xef, 0x28, 0x00, 0x04, 0xf0, 0xa0, 0x00, 0x04, 0xf2, 0x5c, 0x00, 0x04, 0xf4, 0x58, 0x00, 0x04, 0xf6, 0x8c, 0x00, 0x04, 0xf7, 0x84, 0x00, 0x04, 0xf8, 0xc0, 0x00, 0x04, 0xfa, 0x3c, 0x00, 0x04, 0xfb, 0xf8, 0x00, 0x04, 0xfd, 0xf0, 0x00, 0x05, 0x00, 0x2c, 0x00, 0x05, 0x02, 0x9c, 0x00, 0x05, 0x03, 0xd0, 0x00, 0x05, 0x05, 0x44, 0x00, 0x05, 0x07, 0x00, 0x00, 0x05, 0x08, 0xfc, 0x00, 0x05, 0x0b, 0x38, 0x00, 0x05, 0x0d, 0xa4, 0x00, 0x05, 0x10, 0x58, 0x00, 0x05, 0x11, 0xd0, 0x00, 0x05, 0x13, 0x8c, 0x00, 0x05, 0x15, 0x7c, 0x00, 0x05, 0x17, 0xb8, 0x00, 0x05, 0x1a, 0x34, 0x00, 0x05, 0x1c, 0xf0, 0x00, 0x05, 0x1f, 0xe4, 0x00, 0x05, 0x21, 0xa8, 0x00, 0x05, 0x23, 0xb0, 0x00, 0x05, 0x25, 0xf8, 0x00, 0x05, 0x28, 0x7c, 0x00, 0x05, 0x2b, 0x40, 0x00, 0x05, 0x2e, 0x30, 0x00, 0x05, 0x31, 0x60, 0x00, 0x05, 0x31, 0xbc, 0x00, 0x05, 0x32, 0x78, 0x00, 0x05, 0x33, 0x54, 0x00, 0x05, 0x34, 0x50, 0x00, 0x05, 0x35, 0x10, 0x00, 0x05, 0x35, 0xfc, 0x00, 0x05, 0x37, 0x14, 0x00, 0x05, 0x37, 0xc0, 0x00, 0x05, 0x38, 0xf4, 0x00, 0x05, 0x3a, 0x08, 0x00, 0x05, 0x3a, 0xf8, 0x00, 0x05, 0x3b, 0xac, 0x00, 0x05, 0x3c, 0x84, 0x00, 0x05, 0x3d, 0x64, 0x00, 0x05, 0x3e, 0x20, 0x00, 0x05, 0x3e, 0xd8, 0x00, 0x05, 0x3f, 0xb0, 0x00, 0x05, 0x40, 0xa8, 0x00, 0x05, 0x41, 0x64, 0x00, 0x05, 0x42, 0x4c, 0x00, 0x05, 0x43, 0x60, 0x00, 0x05, 0x44, 0x08, 0x00, 0x05, 0x45, 0x38, 0x00, 0x05, 0x46, 0x48, 0x00, 0x05, 0x47, 0x34, 0x00, 0x05, 0x47, 0xe4, 0x00, 0x05, 0x48, 0xb8, 0x00, 0x05, 0x49, 0x94, 0x00, 0x05, 0x4a, 0x4c, 0x00, 0x05, 0x4a, 0xd8, 0x00, 0x05, 0x4b, 0x88, 0x00, 0x05, 0x4c, 0x58, 0x00, 0x05, 0x4c, 0xe8, 0x00, 0x05, 0x4d, 0xa4, 0x00, 0x05, 0x4e, 0x8c, 0x00, 0x05, 0x4f, 0x0c, 0x00, 0x05, 0x50, 0x14, 0x00, 0x05, 0x50, 0xfc, 0x00, 0x05, 0x51, 0xc0, 0x00, 0x05, 0x52, 0x48, 0x00, 0x05, 0x52, 0xf4, 0x00, 0x05, 0x53, 0xa8, 0x00, 0x05, 0x54, 0x34, 0x00, 0x05, 0x54, 0xb0, 0x00, 0x05, 0x55, 0x84, 0x00, 0x05, 0x56, 0x7c, 0x00, 0x05, 0x57, 0x94, 0x00, 0x05, 0x58, 0x6c, 0x00, 0x05, 0x59, 0x70, 0x00, 0x05, 0x5a, 0xa0, 0x00, 0x05, 0x5b, 0x68, 0x00, 0x05, 0x5c, 0xb8, 0x00, 0x05, 0x5d, 0xe8, 0x00, 0x05, 0x5e, 0xf4, 0x00, 0x05, 0x5f, 0xc4, 0x00, 0x05, 0x60, 0xb8, 0x00, 0x05, 0x61, 0xb4, 0x00, 0x05, 0x62, 0x88, 0x00, 0x05, 0x63, 0x28, 0x00, 0x05, 0x65, 0x30, 0x00, 0x05, 0x68, 0x14, 0x00, 0x05, 0x6a, 0x3c, 0x00, 0x05, 0x6c, 0x58, 0x00, 0x05, 0x6d, 0x58, 0x00, 0x05, 0x6e, 0x58, 0x00, 0x05, 0x6f, 0xf0, 0x00, 0x05, 0x70, 0xd0, 0x00, 0x05, 0x71, 0xb0, 0x00, 0x05, 0x72, 0xb4, 0x00, 0x05, 0x73, 0x88, 0x00, 0x05, 0x74, 0xc0, 0x00, 0x05, 0x75, 0xcc, 0x00, 0x05, 0x76, 0xa4, 0x00, 0x05, 0x77, 0x84, 0x00, 0x05, 0x78, 0x90, 0x00, 0x05, 0x79, 0x70, 0x00, 0x05, 0x7a, 0x98, 0x00, 0x05, 0x7b, 0x6c, 0x00, 0x05, 0x7c, 0x10, 0x00, 0x05, 0x7c, 0xc8, 0x00, 0x05, 0x7d, 0x5c, 0x00, 0x05, 0x7e, 0x1c, 0x00, 0x05, 0x7f, 0x10, 0x00, 0x05, 0x7f, 0xc8, 0x00, 0x05, 0x80, 0x80, 0x00, 0x05, 0x81, 0x74, 0x00, 0x05, 0x82, 0x48, 0x00, 0x05, 0x83, 0x5c, 0x00, 0x05, 0x84, 0x30, 0x00, 0x05, 0x85, 0x04, 0x00, 0x05, 0x85, 0xdc, 0x00, 0x05, 0x86, 0xac, 0x00, 0x05, 0x87, 0x78, 0x00, 0x05, 0x88, 0x78, 0x00, 0x05, 0x89, 0xa8, 0x00, 0x05, 0x8a, 0xa8, 0x00, 0x05, 0x8b, 0xdc, 0x00, 0x05, 0x8c, 0xec, 0x00, 0x05, 0x8d, 0xc0, 0x00, 0x05, 0x8e, 0xa0, 0x00, 0x05, 0x8f, 0x80, 0x00, 0x05, 0x90, 0x7c, 0x00, 0x05, 0x92, 0x78, 0x00, 0x05, 0x93, 0x5c, 0x00, 0x05, 0x94, 0x70, 0x00, 0x05, 0x95, 0x44, 0x00, 0x05, 0x96, 0x90, 0x00, 0x05, 0x97, 0x54, 0x00, 0x05, 0x98, 0x34, 0x00, 0x05, 0x99, 0x30, 0x00, 0x05, 0x9a, 0xf8, 0x00, 0x05, 0x9c, 0x38, 0x00, 0x05, 0x9d, 0xb4, 0x00, 0x05, 0x9e, 0xd4, 0x00, 0x05, 0x9f, 0xa8, 0x00, 0x05, 0xa0, 0x50, 0x00, 0x05, 0xa1, 0x30, 0x00, 0x05, 0xa3, 0x74, 0x00, 0x05, 0xa5, 0xf4, 0x00, 0x05, 0xa8, 0x60, 0x00, 0x05, 0xaa, 0x68, 0x00, 0x05, 0xac, 0xa0, 0x00, 0x05, 0xae, 0xdc, 0x00, 0x05, 0xb1, 0x2c, 0x00, 0x05, 0xb2, 0xec, 0x00, 0x05, 0xb4, 0xa8, 0x00, 0x05, 0xb4, 0xc4, 0x00, 0x05, 0xb4, 0xec, 0x00, 0x05, 0xb5, 0x08, 0x00, 0x05, 0xb5, 0x64, 0x00, 0x05, 0xb5, 0x84, 0x00, 0x05, 0xb5, 0xa8, 0x00, 0x05, 0xb5, 0xd0, 0x00, 0x05, 0xb6, 0x04, 0x00, 0x05, 0xb6, 0x38, 0x00, 0x05, 0xb6, 0x54, 0x00, 0x05, 0xb6, 0x7c, 0x00, 0x05, 0xb6, 0xa8, 0x00, 0x05, 0xb6, 0xc0, 0x00, 0x05, 0xb6, 0xe4, 0x00, 0x05, 0xb7, 0x14, 0x00, 0x05, 0xb7, 0x44, 0x00, 0x05, 0xb7, 0x68, 0x00, 0x05, 0xb7, 0xa0, 0x00, 0x05, 0xb8, 0x18, 0x00, 0x05, 0xb8, 0x48, 0x00, 0x05, 0xb8, 0x88, 0x00, 0x05, 0xb9, 0x44, 0x00, 0x05, 0xb9, 0xe0, 0x00, 0x05, 0xba, 0x80, 0x00, 0x05, 0xbb, 0x44, 0x00, 0x05, 0xbb, 0x54, 0x00, 0x05, 0xbb, 0x64, 0x00, 0x05, 0xbb, 0x7c, 0x00, 0x05, 0xbb, 0x94, 0x00, 0x05, 0xbb, 0xe4, 0x00, 0x05, 0xbc, 0x04, 0x00, 0x05, 0xbc, 0x24, 0x00, 0x05, 0xbc, 0x44, 0x00, 0x05, 0xbc, 0x5c, 0x00, 0x05, 0xbc, 0x74, 0x00, 0x05, 0xbc, 0x8c, 0x00, 0x05, 0xbd, 0x64, 0x00, 0x05, 0xbe, 0x10, 0x00, 0x05, 0xbe, 0xd8, 0x00, 0x05, 0xbf, 0x84, 0x00, 0x05, 0xc0, 0x00, 0x00, 0x05, 0xc0, 0x98, 0x00, 0x05, 0xc1, 0x4c, 0x00, 0x05, 0xc1, 0xd4, 0x00, 0x05, 0xc2, 0x78, 0x00, 0x05, 0xc3, 0x3c, 0x00, 0x05, 0xc3, 0xd0, 0x00, 0x05, 0xc4, 0x80, 0x00, 0x05, 0xc4, 0xa0, 0x00, 0x05, 0xc4, 0xe8, 0x00, 0x05, 0xc5, 0x14, 0x00, 0x05, 0xc5, 0x64, 0x00, 0x05, 0xc5, 0x80, 0x00, 0x05, 0xc5, 0x9c, 0x00, 0x05, 0xc5, 0xb8, 0x00, 0x05, 0xc5, 0xd4, 0x00, 0x05, 0xc5, 0xf0, 0x00, 0x05, 0xc6, 0x0c, 0x00, 0x05, 0xc6, 0x28, 0x00, 0x05, 0xc6, 0x44, 0x00, 0x05, 0xc6, 0x60, 0x00, 0x05, 0xc6, 0x7c, 0x00, 0x05, 0xc6, 0x98, 0x00, 0x05, 0xc6, 0xb4, 0x00, 0x05, 0xc6, 0xd0, 0x00, 0x05, 0xc6, 0xec, 0x00, 0x05, 0xc7, 0x08, 0x00, 0x05, 0xc7, 0x24, 0x00, 0x05, 0xc7, 0x40, 0x00, 0x05, 0xc7, 0x5c, 0x00, 0x05, 0xc7, 0x78, 0x00, 0x05, 0xc7, 0x94, 0x00, 0x05, 0xc7, 0xac, 0x00, 0x05, 0xc7, 0xc8, 0x00, 0x05, 0xc8, 0x00, 0x00, 0x05, 0xc8, 0x70, 0x00, 0x05, 0xc8, 0xc4, 0x00, 0x05, 0xc9, 0x4c, 0x00, 0x05, 0xc9, 0x98, 0x00, 0x05, 0xc9, 0xf4, 0x00, 0x05, 0xca, 0xb0, 0x00, 0x05, 0xcb, 0x10, 0x00, 0x05, 0xcb, 0x80, 0x00, 0x05, 0xcb, 0xec, 0x00, 0x05, 0xcc, 0x18, 0x00, 0x05, 0xcc, 0x90, 0x00, 0x05, 0xcc, 0xa0, 0x00, 0x05, 0xcc, 0xb0, 0x00, 0x05, 0xcc, 0xc8, 0x00, 0x05, 0xcc, 0xf4, 0x00, 0x05, 0xcd, 0x4c, 0x00, 0x05, 0xcd, 0x64, 0x00, 0x05, 0xcd, 0x7c, 0x00, 0x05, 0xcd, 0xa0, 0x00, 0x05, 0xcd, 0xcc, 0x00, 0x05, 0xcd, 0xe8, 0x00, 0x05, 0xce, 0x80, 0x00, 0x05, 0xcf, 0x8c, 0x00, 0x05, 0xd0, 0x24, 0x00, 0x05, 0xd0, 0xac, 0x00, 0x05, 0xd1, 0xa4, 0x00, 0x05, 0xd2, 0x2c, 0x00, 0x05, 0xd2, 0x8c, 0x00, 0x05, 0xd3, 0x5c, 0x00, 0x05, 0xd3, 0x78, 0x00, 0x05, 0xd3, 0x9c, 0x00, 0x05, 0xd3, 0xbc, 0x00, 0x05, 0xd4, 0x0c, 0x00, 0x05, 0xd4, 0x64, 0x00, 0x05, 0xd4, 0xb4, 0x00, 0x05, 0xd4, 0xe8, 0x00, 0x05, 0xd5, 0x20, 0x00, 0x05, 0xd5, 0x50, 0x00, 0x05, 0xd5, 0x80, 0x00, 0x05, 0xd5, 0xb0, 0x00, 0x05, 0xd5, 0xdc, 0x00, 0x05, 0xd6, 0x08, 0x00, 0x05, 0xd6, 0x38, 0x00, 0x05, 0xd6, 0x60, 0x00, 0x05, 0xd6, 0x88, 0x00, 0x05, 0xd6, 0xb0, 0x00, 0x05, 0xd6, 0xd8, 0x00, 0x05, 0xd7, 0x44, 0x00, 0x05, 0xd7, 0xb4, 0x00, 0x05, 0xd8, 0x20, 0x00, 0x05, 0xd8, 0x54, 0x00, 0x05, 0xd8, 0x88, 0x00, 0x05, 0xd8, 0xbc, 0x00, 0x05, 0xd9, 0x1c, 0x00, 0x05, 0xd9, 0x84, 0x00, 0x05, 0xd9, 0xe8, 0x00, 0x05, 0xda, 0x18, 0x00, 0x05, 0xda, 0x4c, 0x00, 0x05, 0xda, 0x7c, 0x00, 0x05, 0xda, 0xac, 0x00, 0x05, 0xda, 0xe0, 0x00, 0x05, 0xdb, 0x10, 0x00, 0x05, 0xdb, 0x64, 0x00, 0x05, 0xdb, 0xb8, 0x00, 0x05, 0xdc, 0x10, 0x00, 0x05, 0xdc, 0x5c, 0x00, 0x05, 0xdc, 0xac, 0x00, 0x05, 0xdc, 0xf8, 0x00, 0x05, 0xdd, 0x20, 0x00, 0x05, 0xdd, 0x4c, 0x00, 0x05, 0xdd, 0x74, 0x00, 0x05, 0xdd, 0xe8, 0x00, 0x05, 0xde, 0x60, 0x00, 0x05, 0xde, 0xd0, 0x00, 0x05, 0xdf, 0x04, 0x00, 0x05, 0xdf, 0x3c, 0x00, 0x05, 0xdf, 0x70, 0x00, 0x05, 0xdf, 0xc0, 0x00, 0x05, 0xe0, 0x14, 0x00, 0x05, 0xe0, 0x64, 0x00, 0x05, 0xe0, 0x94, 0x00, 0x05, 0xe0, 0xc8, 0x00, 0x05, 0xe0, 0xf8, 0x00, 0x05, 0xe1, 0x2c, 0x00, 0x05, 0xe1, 0x64, 0x00, 0x05, 0xe1, 0x98, 0x00, 0x05, 0xe2, 0x08, 0x00, 0x05, 0xe2, 0x7c, 0x00, 0x05, 0xe2, 0xec, 0x00, 0x05, 0xe3, 0x20, 0x00, 0x05, 0xe3, 0x58, 0x00, 0x05, 0xe3, 0x8c, 0x00, 0x05, 0xe3, 0xf4, 0x00, 0x05, 0xe4, 0x60, 0x00, 0x05, 0xe4, 0xc8, 0x00, 0x05, 0xe4, 0xf4, 0x00, 0x05, 0xe5, 0x24, 0x00, 0x05, 0xe5, 0x50, 0x00, 0x05, 0xe5, 0x84, 0x00, 0x05, 0xe5, 0xbc, 0x00, 0x05, 0xe5, 0xf0, 0x00, 0x05, 0xe6, 0x74, 0x00, 0x05, 0xe6, 0xfc, 0x00, 0x05, 0xe7, 0x80, 0x00, 0x05, 0xe7, 0xac, 0x00, 0x05, 0xe7, 0xdc, 0x00, 0x05, 0xe8, 0x08, 0x00, 0x05, 0xe8, 0x38, 0x00, 0x05, 0xe8, 0x6c, 0x00, 0x05, 0xe8, 0x9c, 0x00, 0x05, 0xe8, 0xd8, 0x00, 0x05, 0xe9, 0x18, 0x00, 0x05, 0xe9, 0x54, 0x00, 0x05, 0xe9, 0xd4, 0x00, 0x05, 0xea, 0x58, 0x00, 0x05, 0xea, 0xd8, 0x00, 0x05, 0xeb, 0x60, 0x00, 0x05, 0xeb, 0xec, 0x00, 0x05, 0xec, 0x74, 0x00, 0x05, 0xec, 0x88, 0x00, 0x05, 0xec, 0xac, 0x00, 0x05, 0xec, 0xd0, 0x00, 0x05, 0xec, 0xf4, 0x00, 0x05, 0xed, 0x18, 0x00, 0x05, 0xed, 0x3c, 0x00, 0x05, 0xed, 0x60, 0x00, 0x05, 0xed, 0x84, 0x00, 0x05, 0xed, 0xa8, 0x00, 0x05, 0xed, 0xd8, 0x00, 0x05, 0xee, 0x14, 0x00, 0x05, 0xee, 0x50, 0x00, 0x05, 0xee, 0xb8, 0x00, 0x05, 0xef, 0x60, 0x00, 0x05, 0xef, 0xd0, 0x00, 0x05, 0xf0, 0x90, 0x00, 0x05, 0xf1, 0x18, 0x00, 0x05, 0xf1, 0xac, 0x00, 0x05, 0xf2, 0x44, 0x00, 0x05, 0xf2, 0xa4, 0x00, 0x05, 0xf3, 0x14, 0x00, 0x05, 0xf3, 0x80, 0x00, 0x05, 0xf4, 0x04, 0x00, 0x05, 0xf4, 0xec, 0x00, 0x05, 0xf5, 0x98, 0x00, 0x05, 0xf6, 0x54, 0x00, 0x05, 0xf7, 0x48, 0x00, 0x05, 0xf7, 0xfc, 0x00, 0x05, 0xf8, 0xc0, 0x00, 0x05, 0xf9, 0xd8, 0x00, 0x05, 0xfa, 0xb0, 0x00, 0x05, 0xfb, 0x98, 0x00, 0x05, 0xfc, 0x8c, 0x00, 0x05, 0xfd, 0x30, 0x00, 0x05, 0xfd, 0xe8, 0x00, 0x05, 0xfe, 0xe4, 0x00, 0x05, 0xff, 0x94, 0x00, 0x06, 0x00, 0x58, 0x00, 0x06, 0x00, 0xfc, 0x00, 0x06, 0x01, 0x88, 0x00, 0x06, 0x02, 0x2c, 0x00, 0x06, 0x02, 0xd4, 0x00, 0x06, 0x03, 0x50, 0x00, 0x06, 0x04, 0x00, 0x00, 0x06, 0x04, 0x18, 0x00, 0x06, 0x04, 0x30, 0x00, 0x06, 0x04, 0x48, 0x00, 0x06, 0x04, 0x68, 0x00, 0x06, 0x04, 0x88, 0x00, 0x06, 0x04, 0xa8, 0x00, 0x06, 0x04, 0xc0, 0x00, 0x06, 0x04, 0xd8, 0x00, 0x06, 0x04, 0xf0, 0x00, 0x06, 0x05, 0x08, 0x00, 0x06, 0x05, 0x20, 0x00, 0x06, 0x05, 0x38, 0x00, 0x06, 0x05, 0x50, 0x00, 0x06, 0x05, 0x68, 0x00, 0x06, 0x05, 0x80, 0x00, 0x06, 0x06, 0x2c, 0x00, 0x06, 0x06, 0x9c, 0x00, 0x06, 0x07, 0x20, 0x00, 0x06, 0x08, 0x10, 0x00, 0x06, 0x08, 0xc0, 0x00, 0x06, 0x09, 0x8c, 0x00, 0x06, 0x0a, 0x64, 0x00, 0x06, 0x0a, 0xdc, 0x00, 0x06, 0x0b, 0x70, 0x00, 0x06, 0x0c, 0x60, 0x00, 0x06, 0x0c, 0xec, 0x00, 0x06, 0x0d, 0x94, 0x00, 0x06, 0x0d, 0xf8, 0x00, 0x06, 0x0e, 0x5c, 0x00, 0x06, 0x0e, 0xc0, 0x00, 0x06, 0x0e, 0xf8, 0x00, 0x06, 0x0f, 0x30, 0x00, 0x06, 0x0f, 0x68, 0x00, 0x06, 0x0f, 0xac, 0x00, 0x06, 0x0f, 0xf0, 0x00, 0x06, 0x10, 0x34, 0x00, 0x06, 0x10, 0xb0, 0x00, 0x06, 0x10, 0xf0, 0x00, 0x06, 0x11, 0x40, 0x00, 0x06, 0x11, 0xd4, 0x00, 0x06, 0x12, 0x28, 0x00, 0x06, 0x12, 0x8c, 0x00, 0x06, 0x13, 0x20, 0x00, 0x06, 0x13, 0x78, 0x00, 0x06, 0x13, 0xdc, 0x00, 0x06, 0x14, 0x6c, 0x00, 0x06, 0x14, 0x8c, 0x00, 0x06, 0x14, 0xac, 0x00, 0x06, 0x15, 0x74, 0x00, 0x06, 0x15, 0x94, 0x00, 0x06, 0x15, 0xb4, 0x00, 0x06, 0x16, 0x50, 0x00, 0x06, 0x16, 0x68, 0x00, 0x06, 0x16, 0x80, 0x00, 0x01, 0x00, 0x00, 0x12, 0x0e, 0x03, 0x54, 0x00, 0x2b, 0x00, 0x68, 0x00, 0x0c, 0x00, 0x02, 0x00, 0x10, 0x00, 0x99, 0x00, 0x08, 0x00, 0x00, 0x04, 0x15, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1a, 0x01, 0x3e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x01, 0x32, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x19, 0x01, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x02, 0x23, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x19, 0x02, 0x5c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x19, 0x02, 0xaa, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0c, 0x02, 0xde, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x16, 0x03, 0x19, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x11, 0x03, 0x54, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x1d, 0x03, 0xa2, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x12, 0x9d, 0x28, 0xfc, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x34, 0x3c, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0f, 0x3c, 0x59, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x09, 0x3c, 0x7d, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x32, 0x01, 0xcb, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x08, 0x02, 0x19, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x03, 0x00, 0x32, 0x02, 0x28, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x32, 0x02, 0x76, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x18, 0x02, 0xc4, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x2c, 0x02, 0xeb, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x08, 0x00, 0x22, 0x03, 0x30, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0b, 0x00, 0x3a, 0x03, 0x66, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0d, 0x25, 0x3a, 0x03, 0xc0, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x0e, 0x00, 0x68, 0x3b, 0x9a, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x10, 0x00, 0x1e, 0x3c, 0x39, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x11, 0x00, 0x12, 0x3c, 0x69, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x33, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x52, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x36, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x52, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x70, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x0a, 0x00, 0x00, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x33, 0x20, 0x62, 0x79, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x62, 0x79, 0x20, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x0a, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x0a, 0x00, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x47, 0x00, 0x43, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x4c, 0x47, 0x43, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x43, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x00, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6f, 0x00, 0x6b, 0x00, 0x00, 0x42, 0x6f, 0x6f, 0x6b, 0x00, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x47, 0x00, 0x43, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x4c, 0x47, 0x43, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x43, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x00, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x47, 0x00, 0x43, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x4c, 0x47, 0x43, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x20, 0x43, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x00, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x32, 0x00, 0x2e, 0x00, 0x33, 0x00, 0x34, 0x00, 0x00, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x2e, 0x33, 0x34, 0x00, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x4c, 0x00, 0x47, 0x00, 0x43, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x4c, 0x47, 0x43, 0x53, 0x61, 0x6e, 0x73, 0x43, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x00, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x00, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x74, 0x65, 0x61, 0x6d, 0x00, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x76, 0x00, 0x75, 0x00, 0x2e, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x74, 0x00, 0x00, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x6a, 0x61, 0x76, 0x75, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x66, 0x6f, 0x72, 0x67, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x00, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x28, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x29, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x70, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x70, 0x00, 0x68, 0x00, 0x73, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x41, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x20, 0x00, 0x28, 0x00, 0x73, 0x00, 0x65, 0x00, 0x65, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x29, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x33, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x52, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x50, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x73, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x67, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x65, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x79, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x0a, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x79, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x28, 0x00, 0x22, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x22, 0x00, 0x29, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x73, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x28, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x22, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x22, 0x00, 0x29, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x75, 0x00, 0x63, 0x00, 0x65, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x6c, 0x00, 0x75, 0x00, 0x64, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x70, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x2f, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x77, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x66, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x76, 0x00, 0x65, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x73, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x0a, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x6c, 0x00, 0x75, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x0a, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x70, 0x00, 0x68, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x70, 0x00, 0x68, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x20, 0x00, 0x69, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x65, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x73, 0x00, 0x20, 0x00, 0x22, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x22, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x0a, 0x00, 0x22, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x76, 0x00, 0x6f, 0x00, 0x69, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x61, 0x00, 0x74, 0x00, 0x20, 0x00, 0x68, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x22, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x0a, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x22, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x63, 0x00, 0x6b, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x20, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x0a, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x66, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00, 0x20, 0x00, 0x49, 0x00, 0x53, 0x00, 0x20, 0x00, 0x50, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x56, 0x00, 0x49, 0x00, 0x44, 0x00, 0x45, 0x00, 0x44, 0x00, 0x20, 0x00, 0x22, 0x00, 0x41, 0x00, 0x53, 0x00, 0x20, 0x00, 0x49, 0x00, 0x53, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x57, 0x00, 0x49, 0x00, 0x54, 0x00, 0x48, 0x00, 0x4f, 0x00, 0x55, 0x00, 0x54, 0x00, 0x20, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x52, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x59, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x4b, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x45, 0x00, 0x58, 0x00, 0x50, 0x00, 0x52, 0x00, 0x45, 0x00, 0x53, 0x00, 0x53, 0x00, 0x0a, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x50, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x45, 0x00, 0x44, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x4c, 0x00, 0x55, 0x00, 0x44, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x20, 0x00, 0x42, 0x00, 0x55, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x49, 0x00, 0x54, 0x00, 0x45, 0x00, 0x44, 0x00, 0x20, 0x00, 0x54, 0x00, 0x4f, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x52, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x49, 0x00, 0x45, 0x00, 0x53, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x52, 0x00, 0x43, 0x00, 0x48, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x41, 0x00, 0x42, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x54, 0x00, 0x59, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x49, 0x00, 0x54, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x53, 0x00, 0x53, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, 0x50, 0x00, 0x41, 0x00, 0x52, 0x00, 0x54, 0x00, 0x49, 0x00, 0x43, 0x00, 0x55, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x52, 0x00, 0x20, 0x00, 0x50, 0x00, 0x55, 0x00, 0x52, 0x00, 0x50, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x45, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x46, 0x00, 0x52, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x45, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x59, 0x00, 0x52, 0x00, 0x49, 0x00, 0x47, 0x00, 0x48, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x50, 0x00, 0x41, 0x00, 0x54, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x52, 0x00, 0x41, 0x00, 0x44, 0x00, 0x45, 0x00, 0x4d, 0x00, 0x41, 0x00, 0x52, 0x00, 0x4b, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x52, 0x00, 0x49, 0x00, 0x47, 0x00, 0x48, 0x00, 0x54, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x20, 0x00, 0x45, 0x00, 0x56, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x48, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x20, 0x00, 0x42, 0x00, 0x49, 0x00, 0x54, 0x00, 0x53, 0x00, 0x54, 0x00, 0x52, 0x00, 0x45, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x47, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x55, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x41, 0x00, 0x54, 0x00, 0x49, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x42, 0x00, 0x45, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x41, 0x00, 0x42, 0x00, 0x4c, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x41, 0x00, 0x47, 0x00, 0x45, 0x00, 0x53, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x41, 0x00, 0x42, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x54, 0x00, 0x59, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x4c, 0x00, 0x55, 0x00, 0x44, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x0a, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x47, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x52, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x53, 0x00, 0x50, 0x00, 0x45, 0x00, 0x43, 0x00, 0x49, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x49, 0x00, 0x52, 0x00, 0x45, 0x00, 0x43, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x49, 0x00, 0x44, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x53, 0x00, 0x45, 0x00, 0x51, 0x00, 0x55, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x49, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x41, 0x00, 0x47, 0x00, 0x45, 0x00, 0x53, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x57, 0x00, 0x48, 0x00, 0x45, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x43, 0x00, 0x54, 0x00, 0x49, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x52, 0x00, 0x41, 0x00, 0x43, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x54, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x57, 0x00, 0x49, 0x00, 0x53, 0x00, 0x45, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x41, 0x00, 0x52, 0x00, 0x49, 0x00, 0x53, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x20, 0x00, 0x46, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x55, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x45, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x41, 0x00, 0x42, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x54, 0x00, 0x59, 0x00, 0x20, 0x00, 0x54, 0x00, 0x4f, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x45, 0x00, 0x20, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x46, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x44, 0x00, 0x45, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x53, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x45, 0x00, 0x78, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x73, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x0a, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x77, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x73, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x77, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x75, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x69, 0x00, 0x7a, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x47, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x0a, 0x00, 0x49, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x2e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x73, 0x00, 0x70, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x76, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x66, 0x00, 0x75, 0x00, 0x72, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x3a, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x74, 0x00, 0x20, 0x00, 0x67, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x41, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x2d, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x28, 0x00, 0x63, 0x00, 0x29, 0x00, 0x20, 0x00, 0x32, 0x00, 0x30, 0x00, 0x30, 0x00, 0x36, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x52, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x52, 0x00, 0x65, 0x00, 0x73, 0x00, 0x65, 0x00, 0x72, 0x00, 0x76, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x50, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x73, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, 0x62, 0x00, 0x79, 0x00, 0x20, 0x00, 0x67, 0x00, 0x72, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x65, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x79, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x63, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x70, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x79, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x28, 0x00, 0x22, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x22, 0x00, 0x29, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x73, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x69, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x66, 0x00, 0x69, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x28, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x22, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x22, 0x00, 0x29, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x75, 0x00, 0x63, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x42, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x56, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x6c, 0x00, 0x75, 0x00, 0x64, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x74, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x70, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x2f, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x77, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x66, 0x00, 0x75, 0x00, 0x72, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x73, 0x00, 0x75, 0x00, 0x62, 0x00, 0x6a, 0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x0a, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x77, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x3a, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6f, 0x00, 0x76, 0x00, 0x65, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x72, 0x00, 0x69, 0x00, 0x67, 0x00, 0x68, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x72, 0x00, 0x61, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x72, 0x00, 0x6b, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x70, 0x00, 0x65, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x69, 0x00, 0x73, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x73, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x63, 0x00, 0x6c, 0x00, 0x75, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x69, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x65, 0x00, 0x64, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x0a, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x64, 0x00, 0x65, 0x00, 0x73, 0x00, 0x69, 0x00, 0x67, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x70, 0x00, 0x68, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x70, 0x00, 0x68, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x63, 0x00, 0x68, 0x00, 0x61, 0x00, 0x72, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x64, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6c, 0x00, 0x79, 0x00, 0x20, 0x00, 0x69, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x72, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x65, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x0a, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x73, 0x00, 0x20, 0x00, 0x22, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x22, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x64, 0x00, 0x20, 0x00, 0x22, 0x00, 0x41, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x22, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x75, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x76, 0x00, 0x6f, 0x00, 0x69, 0x00, 0x64, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x65, 0x00, 0x78, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x62, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x73, 0x00, 0x0a, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x61, 0x00, 0x74, 0x00, 0x20, 0x00, 0x68, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x64, 0x00, 0x69, 0x00, 0x66, 0x00, 0x69, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x64, 0x00, 0x69, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x75, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x0a, 0x00, 0x22, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x20, 0x00, 0x41, 0x00, 0x72, 0x00, 0x65, 0x00, 0x76, 0x00, 0x22, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x73, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x72, 0x00, 0x74, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x70, 0x00, 0x61, 0x00, 0x63, 0x00, 0x6b, 0x00, 0x61, 0x00, 0x67, 0x00, 0x65, 0x00, 0x20, 0x00, 0x62, 0x00, 0x75, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x79, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x79, 0x00, 0x70, 0x00, 0x65, 0x00, 0x66, 0x00, 0x61, 0x00, 0x63, 0x00, 0x65, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x62, 0x00, 0x79, 0x00, 0x0a, 0x00, 0x69, 0x00, 0x74, 0x00, 0x73, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x66, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00, 0x20, 0x00, 0x49, 0x00, 0x53, 0x00, 0x20, 0x00, 0x50, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x56, 0x00, 0x49, 0x00, 0x44, 0x00, 0x45, 0x00, 0x44, 0x00, 0x20, 0x00, 0x22, 0x00, 0x41, 0x00, 0x53, 0x00, 0x20, 0x00, 0x49, 0x00, 0x53, 0x00, 0x22, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x57, 0x00, 0x49, 0x00, 0x54, 0x00, 0x48, 0x00, 0x4f, 0x00, 0x55, 0x00, 0x54, 0x00, 0x20, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x52, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x59, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x4b, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x45, 0x00, 0x58, 0x00, 0x50, 0x00, 0x52, 0x00, 0x45, 0x00, 0x53, 0x00, 0x53, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x50, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x45, 0x00, 0x44, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x4c, 0x00, 0x55, 0x00, 0x44, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x20, 0x00, 0x42, 0x00, 0x55, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x49, 0x00, 0x54, 0x00, 0x45, 0x00, 0x44, 0x00, 0x20, 0x00, 0x54, 0x00, 0x4f, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x52, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x49, 0x00, 0x45, 0x00, 0x53, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x0a, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x52, 0x00, 0x43, 0x00, 0x48, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x41, 0x00, 0x42, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x54, 0x00, 0x59, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x46, 0x00, 0x49, 0x00, 0x54, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x53, 0x00, 0x53, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x41, 0x00, 0x20, 0x00, 0x50, 0x00, 0x41, 0x00, 0x52, 0x00, 0x54, 0x00, 0x49, 0x00, 0x43, 0x00, 0x55, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x52, 0x00, 0x20, 0x00, 0x50, 0x00, 0x55, 0x00, 0x52, 0x00, 0x50, 0x00, 0x4f, 0x00, 0x53, 0x00, 0x45, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x46, 0x00, 0x52, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x45, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x0a, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x59, 0x00, 0x52, 0x00, 0x49, 0x00, 0x47, 0x00, 0x48, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x50, 0x00, 0x41, 0x00, 0x54, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x54, 0x00, 0x52, 0x00, 0x41, 0x00, 0x44, 0x00, 0x45, 0x00, 0x4d, 0x00, 0x41, 0x00, 0x52, 0x00, 0x4b, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x52, 0x00, 0x49, 0x00, 0x47, 0x00, 0x48, 0x00, 0x54, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x20, 0x00, 0x45, 0x00, 0x56, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x48, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x0a, 0x00, 0x54, 0x00, 0x41, 0x00, 0x56, 0x00, 0x4d, 0x00, 0x4a, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x20, 0x00, 0x42, 0x00, 0x41, 0x00, 0x48, 0x00, 0x20, 0x00, 0x42, 0x00, 0x45, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x41, 0x00, 0x42, 0x00, 0x4c, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4c, 0x00, 0x41, 0x00, 0x49, 0x00, 0x4d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x44, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x41, 0x00, 0x47, 0x00, 0x45, 0x00, 0x53, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x41, 0x00, 0x42, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x54, 0x00, 0x59, 0x00, 0x2c, 0x00, 0x0a, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x4c, 0x00, 0x55, 0x00, 0x44, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x59, 0x00, 0x20, 0x00, 0x47, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x45, 0x00, 0x52, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x53, 0x00, 0x50, 0x00, 0x45, 0x00, 0x43, 0x00, 0x49, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x44, 0x00, 0x49, 0x00, 0x52, 0x00, 0x45, 0x00, 0x43, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x43, 0x00, 0x49, 0x00, 0x44, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x53, 0x00, 0x45, 0x00, 0x51, 0x00, 0x55, 0x00, 0x45, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x49, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x0a, 0x00, 0x44, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x41, 0x00, 0x47, 0x00, 0x45, 0x00, 0x53, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x57, 0x00, 0x48, 0x00, 0x45, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x41, 0x00, 0x43, 0x00, 0x54, 0x00, 0x49, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x43, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x52, 0x00, 0x41, 0x00, 0x43, 0x00, 0x54, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x54, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x57, 0x00, 0x49, 0x00, 0x53, 0x00, 0x45, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x41, 0x00, 0x52, 0x00, 0x49, 0x00, 0x53, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x0a, 0x00, 0x46, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x55, 0x00, 0x54, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x20, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x45, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x41, 0x00, 0x42, 0x00, 0x49, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x54, 0x00, 0x59, 0x00, 0x20, 0x00, 0x54, 0x00, 0x4f, 0x00, 0x20, 0x00, 0x55, 0x00, 0x53, 0x00, 0x45, 0x00, 0x20, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00, 0x20, 0x00, 0x4f, 0x00, 0x52, 0x00, 0x20, 0x00, 0x46, 0x00, 0x52, 0x00, 0x4f, 0x00, 0x4d, 0x00, 0x0a, 0x00, 0x4f, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x52, 0x00, 0x20, 0x00, 0x44, 0x00, 0x45, 0x00, 0x41, 0x00, 0x4c, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x47, 0x00, 0x53, 0x00, 0x20, 0x00, 0x49, 0x00, 0x4e, 0x00, 0x20, 0x00, 0x54, 0x00, 0x48, 0x00, 0x45, 0x00, 0x20, 0x00, 0x46, 0x00, 0x4f, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x20, 0x00, 0x53, 0x00, 0x4f, 0x00, 0x46, 0x00, 0x54, 0x00, 0x57, 0x00, 0x41, 0x00, 0x52, 0x00, 0x45, 0x00, 0x2e, 0x00, 0x0a, 0x00, 0x0a, 0x00, 0x45, 0x00, 0x78, 0x00, 0x63, 0x00, 0x65, 0x00, 0x70, 0x00, 0x74, 0x00, 0x20, 0x00, 0x61, 0x00, 0x73, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x61, 0x00, 0x6d, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x20, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x20, 0x00, 0x73, 0x00, 0x68, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x20, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x0a, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x64, 0x00, 0x76, 0x00, 0x65, 0x00, 0x72, 0x00, 0x74, 0x00, 0x69, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x77, 0x00, 0x69, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x65, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x20, 0x00, 0x73, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x75, 0x00, 0x73, 0x00, 0x65, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x0a, 0x00, 0x64, 0x00, 0x65, 0x00, 0x61, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x73, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x74, 0x00, 0x68, 0x00, 0x69, 0x00, 0x73, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x20, 0x00, 0x53, 0x00, 0x6f, 0x00, 0x66, 0x00, 0x74, 0x00, 0x77, 0x00, 0x61, 0x00, 0x72, 0x00, 0x65, 0x00, 0x20, 0x00, 0x77, 0x00, 0x69, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x74, 0x00, 0x20, 0x00, 0x70, 0x00, 0x72, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x77, 0x00, 0x72, 0x00, 0x69, 0x00, 0x74, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x61, 0x00, 0x75, 0x00, 0x74, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x69, 0x00, 0x7a, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x0a, 0x00, 0x66, 0x00, 0x72, 0x00, 0x6f, 0x00, 0x6d, 0x00, 0x20, 0x00, 0x54, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x42, 0x00, 0x61, 0x00, 0x68, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x20, 0x00, 0x66, 0x00, 0x75, 0x00, 0x72, 0x00, 0x74, 0x00, 0x68, 0x00, 0x65, 0x00, 0x72, 0x00, 0x20, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6d, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2c, 0x00, 0x20, 0x00, 0x63, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x61, 0x00, 0x63, 0x00, 0x74, 0x00, 0x3a, 0x00, 0x20, 0x00, 0x74, 0x00, 0x61, 0x00, 0x76, 0x00, 0x6d, 0x00, 0x6a, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x20, 0x00, 0x40, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x65, 0x00, 0x65, 0x00, 0x0a, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x66, 0x00, 0x72, 0x00, 0x2e, 0x00, 0x00, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x28, 0x63, 0x29, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x29, 0x2e, 0x20, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x20, 0x47, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x41, 0x72, 0x65, 0x76, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x28, 0x63, 0x29, 0x20, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x75, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x29, 0x0a, 0x0a, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x56, 0x65, 0x72, 0x61, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x33, 0x20, 0x62, 0x79, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x56, 0x65, 0x72, 0x61, 0x20, 0x69, 0x73, 0x0a, 0x61, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x6f, 0x66, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x62, 0x79, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x0a, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x28, 0x22, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x0a, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, 0x22, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2c, 0x20, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x2c, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x72, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x73, 0x6f, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x0a, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x0a, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x22, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x0a, 0x22, 0x56, 0x65, 0x72, 0x61, 0x22, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x0a, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x22, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x0a, 0x56, 0x65, 0x72, 0x61, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6f, 0x6c, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x20, 0x62, 0x75, 0x74, 0x20, 0x6e, 0x6f, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6f, 0x6c, 0x64, 0x20, 0x62, 0x79, 0x20, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x0a, 0x0a, 0x54, 0x48, 0x45, 0x20, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x49, 0x53, 0x20, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x44, 0x20, 0x22, 0x41, 0x53, 0x20, 0x49, 0x53, 0x22, 0x2c, 0x20, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, 0x20, 0x4f, 0x46, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x4b, 0x49, 0x4e, 0x44, 0x2c, 0x20, 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, 0x53, 0x0a, 0x4f, 0x52, 0x20, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x42, 0x55, 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x20, 0x54, 0x4f, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x49, 0x45, 0x53, 0x20, 0x4f, 0x46, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x0a, 0x46, 0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x4e, 0x4f, 0x4e, 0x49, 0x4e, 0x46, 0x52, 0x49, 0x4e, 0x47, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x4f, 0x46, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x2c, 0x20, 0x50, 0x41, 0x54, 0x45, 0x4e, 0x54, 0x2c, 0x0a, 0x54, 0x52, 0x41, 0x44, 0x45, 0x4d, 0x41, 0x52, 0x4b, 0x2c, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x52, 0x49, 0x47, 0x48, 0x54, 0x2e, 0x20, 0x49, 0x4e, 0x20, 0x4e, 0x4f, 0x20, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x20, 0x53, 0x48, 0x41, 0x4c, 0x4c, 0x20, 0x42, 0x49, 0x54, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x20, 0x4f, 0x52, 0x20, 0x54, 0x48, 0x45, 0x20, 0x47, 0x4e, 0x4f, 0x4d, 0x45, 0x0a, 0x46, 0x4f, 0x55, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x42, 0x45, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x2c, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x0a, 0x41, 0x4e, 0x59, 0x20, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x2c, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x2c, 0x20, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x41, 0x4c, 0x2c, 0x20, 0x4f, 0x52, 0x20, 0x43, 0x4f, 0x4e, 0x53, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, 0x2c, 0x0a, 0x57, 0x48, 0x45, 0x54, 0x48, 0x45, 0x52, 0x20, 0x49, 0x4e, 0x20, 0x41, 0x4e, 0x20, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x4f, 0x46, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x2c, 0x20, 0x54, 0x4f, 0x52, 0x54, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x57, 0x49, 0x53, 0x45, 0x2c, 0x20, 0x41, 0x52, 0x49, 0x53, 0x49, 0x4e, 0x47, 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x2c, 0x20, 0x4f, 0x55, 0x54, 0x20, 0x4f, 0x46, 0x0a, 0x54, 0x48, 0x45, 0x20, 0x55, 0x53, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4e, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x20, 0x54, 0x4f, 0x20, 0x55, 0x53, 0x45, 0x20, 0x54, 0x48, 0x45, 0x20, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x44, 0x45, 0x41, 0x4c, 0x49, 0x4e, 0x47, 0x53, 0x20, 0x49, 0x4e, 0x20, 0x54, 0x48, 0x45, 0x0a, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x2e, 0x0a, 0x0a, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x61, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x47, 0x6e, 0x6f, 0x6d, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x6e, 0x6f, 0x6d, 0x65, 0x0a, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x2c, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x0a, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x64, 0x65, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x0a, 0x49, 0x6e, 0x63, 0x2e, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x3a, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x74, 0x20, 0x67, 0x6e, 0x6f, 0x6d, 0x65, 0x20, 0x64, 0x6f, 0x74, 0x0a, 0x6f, 0x72, 0x67, 0x2e, 0x20, 0x0a, 0x0a, 0x41, 0x72, 0x65, 0x76, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20, 0x62, 0x79, 0x20, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x62, 0x79, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x0a, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x28, 0x22, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x22, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, 0x22, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x42, 0x69, 0x74, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, 0x56, 0x65, 0x72, 0x61, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2c, 0x0a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2c, 0x20, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x2c, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2c, 0x0a, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x72, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x73, 0x6f, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6d, 0x61, 0x72, 0x6b, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x0a, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x0a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x67, 0x6c, 0x79, 0x70, 0x68, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x22, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x22, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x20, 0x22, 0x41, 0x72, 0x65, 0x76, 0x22, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x62, 0x65, 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x20, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x73, 0x0a, 0x6f, 0x72, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x0a, 0x22, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x20, 0x41, 0x72, 0x65, 0x76, 0x22, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6f, 0x6c, 0x64, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x20, 0x62, 0x75, 0x74, 0x0a, 0x6e, 0x6f, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x66, 0x61, 0x63, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x6f, 0x6c, 0x64, 0x20, 0x62, 0x79, 0x0a, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x0a, 0x0a, 0x54, 0x48, 0x45, 0x20, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x49, 0x53, 0x20, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x44, 0x20, 0x22, 0x41, 0x53, 0x20, 0x49, 0x53, 0x22, 0x2c, 0x20, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, 0x20, 0x4f, 0x46, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x4b, 0x49, 0x4e, 0x44, 0x2c, 0x0a, 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x42, 0x55, 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x20, 0x54, 0x4f, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x49, 0x45, 0x53, 0x20, 0x4f, 0x46, 0x0a, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x20, 0x46, 0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x4e, 0x4f, 0x4e, 0x49, 0x4e, 0x46, 0x52, 0x49, 0x4e, 0x47, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x0a, 0x4f, 0x46, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x2c, 0x20, 0x50, 0x41, 0x54, 0x45, 0x4e, 0x54, 0x2c, 0x20, 0x54, 0x52, 0x41, 0x44, 0x45, 0x4d, 0x41, 0x52, 0x4b, 0x2c, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x52, 0x49, 0x47, 0x48, 0x54, 0x2e, 0x20, 0x49, 0x4e, 0x20, 0x4e, 0x4f, 0x20, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x20, 0x53, 0x48, 0x41, 0x4c, 0x4c, 0x0a, 0x54, 0x41, 0x56, 0x4d, 0x4a, 0x4f, 0x4e, 0x47, 0x20, 0x42, 0x41, 0x48, 0x20, 0x42, 0x45, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x2c, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x0a, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x47, 0x45, 0x4e, 0x45, 0x52, 0x41, 0x4c, 0x2c, 0x20, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x2c, 0x20, 0x49, 0x4e, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x41, 0x4c, 0x2c, 0x20, 0x4f, 0x52, 0x20, 0x43, 0x4f, 0x4e, 0x53, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x0a, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, 0x2c, 0x20, 0x57, 0x48, 0x45, 0x54, 0x48, 0x45, 0x52, 0x20, 0x49, 0x4e, 0x20, 0x41, 0x4e, 0x20, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x4f, 0x46, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x2c, 0x20, 0x54, 0x4f, 0x52, 0x54, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x57, 0x49, 0x53, 0x45, 0x2c, 0x20, 0x41, 0x52, 0x49, 0x53, 0x49, 0x4e, 0x47, 0x0a, 0x46, 0x52, 0x4f, 0x4d, 0x2c, 0x20, 0x4f, 0x55, 0x54, 0x20, 0x4f, 0x46, 0x20, 0x54, 0x48, 0x45, 0x20, 0x55, 0x53, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4e, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x20, 0x54, 0x4f, 0x20, 0x55, 0x53, 0x45, 0x20, 0x54, 0x48, 0x45, 0x20, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x0a, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x44, 0x45, 0x41, 0x4c, 0x49, 0x4e, 0x47, 0x53, 0x20, 0x49, 0x4e, 0x20, 0x54, 0x48, 0x45, 0x20, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x2e, 0x0a, 0x0a, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x20, 0x61, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x0a, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x77, 0x69, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x0a, 0x64, 0x65, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x54, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x42, 0x61, 0x68, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x66, 0x75, 0x72, 0x74, 0x68, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x3a, 0x20, 0x74, 0x61, 0x76, 0x6d, 0x6a, 0x6f, 0x6e, 0x67, 0x20, 0x40, 0x20, 0x66, 0x72, 0x65, 0x65, 0x0a, 0x2e, 0x20, 0x66, 0x72, 0x2e, 0x00, 0x00, 0x68, 0x00, 0x74, 0x00, 0x74, 0x00, 0x70, 0x00, 0x3a, 0x00, 0x2f, 0x00, 0x2f, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x76, 0x00, 0x75, 0x00, 0x2e, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x75, 0x00, 0x72, 0x00, 0x63, 0x00, 0x65, 0x00, 0x66, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x67, 0x00, 0x65, 0x00, 0x2e, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x74, 0x00, 0x2f, 0x00, 0x77, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x69, 0x00, 0x2f, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x78, 0x00, 0x2e, 0x00, 0x70, 0x00, 0x68, 0x00, 0x70, 0x00, 0x2f, 0x00, 0x4c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x00, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x64, 0x65, 0x6a, 0x61, 0x76, 0x75, 0x2e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x66, 0x6f, 0x72, 0x67, 0x65, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x77, 0x69, 0x6b, 0x69, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x70, 0x68, 0x70, 0x2f, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x00, 0x00, 0x44, 0x00, 0x65, 0x00, 0x6a, 0x00, 0x61, 0x00, 0x56, 0x00, 0x75, 0x00, 0x20, 0x00, 0x4c, 0x00, 0x47, 0x00, 0x43, 0x00, 0x20, 0x00, 0x53, 0x00, 0x61, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x00, 0x44, 0x65, 0x6a, 0x61, 0x56, 0x75, 0x20, 0x4c, 0x47, 0x43, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x00, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x64, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x73, 0x00, 0x65, 0x00, 0x64, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x64, 0x65, 0x6e, 0x73, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7e, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0xac, 0x00, 0xa3, 0x00, 0x84, 0x00, 0x85, 0x00, 0xbd, 0x00, 0x96, 0x00, 0xe8, 0x00, 0x86, 0x00, 0x8e, 0x00, 0x8b, 0x00, 0x9d, 0x00, 0xa9, 0x00, 0xa4, 0x01, 0x02, 0x00, 0x8a, 0x00, 0xda, 0x00, 0x83, 0x00, 0x93, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0x8d, 0x00, 0x97, 0x00, 0x88, 0x00, 0xc3, 0x00, 0xde, 0x00, 0xf1, 0x00, 0x9e, 0x00, 0xaa, 0x00, 0xf5, 0x00, 0xf4, 0x00, 0xf6, 0x00, 0xa2, 0x00, 0xad, 0x00, 0xc9, 0x00, 0xc7, 0x00, 0xae, 0x00, 0x62, 0x00, 0x63, 0x00, 0x90, 0x00, 0x64, 0x00, 0xcb, 0x00, 0x65, 0x00, 0xc8, 0x00, 0xca, 0x00, 0xcf, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xe9, 0x00, 0x66, 0x00, 0xd3, 0x00, 0xd0, 0x00, 0xd1, 0x00, 0xaf, 0x00, 0x67, 0x00, 0xf0, 0x00, 0x91, 0x00, 0xd6, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0x68, 0x00, 0xeb, 0x00, 0xed, 0x00, 0x89, 0x00, 0x6a, 0x00, 0x69, 0x00, 0x6b, 0x00, 0x6d, 0x00, 0x6c, 0x00, 0x6e, 0x00, 0xa0, 0x00, 0x6f, 0x00, 0x71, 0x00, 0x70, 0x00, 0x72, 0x00, 0x73, 0x00, 0x75, 0x00, 0x74, 0x00, 0x76, 0x00, 0x77, 0x00, 0xea, 0x00, 0x78, 0x00, 0x7a, 0x00, 0x79, 0x00, 0x7b, 0x00, 0x7d, 0x00, 0x7c, 0x00, 0xb8, 0x00, 0xa1, 0x00, 0x7f, 0x00, 0x7e, 0x00, 0x80, 0x00, 0x81, 0x00, 0xec, 0x00, 0xee, 0x00, 0xba, 0x01, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x00, 0xfd, 0x00, 0xfe, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x0c, 0x00, 0xff, 0x01, 0x00, 0x01, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, 0x01, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x00, 0xf8, 0x00, 0xf9, 0x01, 0x1c, 0x01, 0x1d, 0x01, 0x1e, 0x01, 0x1f, 0x01, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x23, 0x01, 0x24, 0x01, 0x25, 0x01, 0x26, 0x01, 0x27, 0x01, 0x28, 0x01, 0x29, 0x01, 0x2a, 0x01, 0x2b, 0x00, 0xfa, 0x00, 0xd7, 0x01, 0x2c, 0x01, 0x2d, 0x01, 0x2e, 0x01, 0x2f, 0x01, 0x30, 0x01, 0x31, 0x01, 0x32, 0x01, 0x33, 0x01, 0x34, 0x01, 0x35, 0x01, 0x36, 0x01, 0x37, 0x01, 0x38, 0x01, 0x39, 0x01, 0x3a, 0x00, 0xe2, 0x00, 0xe3, 0x01, 0x3b, 0x01, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, 0x3f, 0x01, 0x40, 0x01, 0x41, 0x01, 0x42, 0x01, 0x43, 0x01, 0x44, 0x01, 0x45, 0x01, 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x49, 0x00, 0xb0, 0x00, 0xb1, 0x01, 0x4a, 0x01, 0x4b, 0x01, 0x4c, 0x01, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x53, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xe4, 0x00, 0xe5, 0x01, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x58, 0x01, 0x59, 0x01, 0x5a, 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x63, 0x01, 0x64, 0x01, 0x65, 0x01, 0x66, 0x01, 0x67, 0x01, 0x68, 0x01, 0x69, 0x00, 0xbb, 0x01, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x6d, 0x00, 0xe6, 0x00, 0xe7, 0x01, 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x73, 0x01, 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x78, 0x01, 0x79, 0x01, 0x7a, 0x01, 0x7b, 0x01, 0x7c, 0x01, 0x7d, 0x01, 0x7e, 0x01, 0x7f, 0x01, 0x80, 0x00, 0xa6, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, 0x93, 0x01, 0x94, 0x01, 0x95, 0x01, 0x96, 0x01, 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, 0xae, 0x01, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb9, 0x01, 0xba, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbe, 0x01, 0xbf, 0x01, 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, 0xc4, 0x01, 0xc5, 0x01, 0xc6, 0x01, 0xc7, 0x01, 0xc8, 0x01, 0xc9, 0x01, 0xca, 0x01, 0xcb, 0x01, 0xcc, 0x01, 0xcd, 0x01, 0xce, 0x01, 0xcf, 0x01, 0xd0, 0x01, 0xd1, 0x01, 0xd2, 0x01, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd6, 0x01, 0xd7, 0x01, 0xd8, 0x01, 0xd9, 0x01, 0xda, 0x01, 0xdb, 0x01, 0xdc, 0x01, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0xe0, 0x01, 0xe1, 0x01, 0xe2, 0x01, 0xe3, 0x01, 0xe4, 0x01, 0xe5, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, 0xe9, 0x01, 0xea, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xee, 0x01, 0xef, 0x01, 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0xfc, 0x01, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x02, 0x00, 0x02, 0x01, 0x02, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x07, 0x02, 0x08, 0x02, 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x18, 0x02, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x1d, 0x02, 0x1e, 0x02, 0x1f, 0x02, 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x23, 0x02, 0x24, 0x02, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x31, 0x02, 0x32, 0x02, 0x33, 0x02, 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, 0x3b, 0x02, 0x3c, 0x02, 0x3d, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x47, 0x02, 0x48, 0x02, 0x49, 0x02, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x02, 0x4d, 0x02, 0x4e, 0x02, 0x4f, 0x02, 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x53, 0x02, 0x54, 0x02, 0x55, 0x02, 0x56, 0x02, 0x57, 0x02, 0x58, 0x02, 0x59, 0x02, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, 0x02, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, 0x02, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, 0x02, 0x6e, 0x02, 0x6f, 0x02, 0x70, 0x02, 0x71, 0x02, 0x72, 0x02, 0x73, 0x02, 0x74, 0x02, 0x75, 0x02, 0x76, 0x02, 0x77, 0x02, 0x78, 0x02, 0x79, 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, 0x7d, 0x02, 0x7e, 0x02, 0x7f, 0x02, 0x80, 0x02, 0x81, 0x02, 0x82, 0x02, 0x83, 0x02, 0x84, 0x02, 0x85, 0x02, 0x86, 0x02, 0x87, 0x02, 0x88, 0x02, 0x89, 0x02, 0x8a, 0x02, 0x8b, 0x02, 0x8c, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, 0x02, 0x90, 0x02, 0x91, 0x02, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, 0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, 0x02, 0x9c, 0x02, 0x9d, 0x02, 0x9e, 0x02, 0x9f, 0x02, 0xa0, 0x02, 0xa1, 0x02, 0xa2, 0x02, 0xa3, 0x02, 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa7, 0x02, 0xa8, 0x02, 0xa9, 0x02, 0xaa, 0x02, 0xab, 0x02, 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xaf, 0x02, 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x00, 0xd8, 0x00, 0xe1, 0x02, 0xb4, 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xb7, 0x02, 0xb8, 0x02, 0xb9, 0x02, 0xba, 0x02, 0xbb, 0x02, 0xbc, 0x02, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, 0xc0, 0x02, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0xe0, 0x00, 0xd9, 0x00, 0xdf, 0x02, 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, 0xc8, 0x02, 0xc9, 0x02, 0xca, 0x02, 0xcb, 0x02, 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, 0x02, 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x03, 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0b, 0x03, 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, 0x14, 0x03, 0x15, 0x03, 0x16, 0x03, 0x17, 0x03, 0x18, 0x03, 0x19, 0x03, 0x1a, 0x03, 0x1b, 0x03, 0x1c, 0x03, 0x1d, 0x03, 0x1e, 0x03, 0x1f, 0x03, 0x20, 0x03, 0x21, 0x03, 0x22, 0x03, 0x23, 0x03, 0x24, 0x03, 0x25, 0x03, 0x26, 0x03, 0x27, 0x03, 0x28, 0x03, 0x29, 0x03, 0x2a, 0x03, 0x2b, 0x03, 0x2c, 0x03, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, 0x30, 0x03, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, 0x38, 0x03, 0x39, 0x03, 0x3a, 0x03, 0x3b, 0x03, 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, 0x60, 0x00, 0x9f, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, 0x74, 0x03, 0x75, 0x03, 0x76, 0x00, 0x9b, 0x03, 0x77, 0x03, 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0x7b, 0x03, 0x7c, 0x03, 0x7d, 0x03, 0x7e, 0x03, 0x7f, 0x03, 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, 0x84, 0x03, 0x85, 0x03, 0x86, 0x03, 0x87, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x8b, 0x03, 0x8c, 0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0x90, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, 0x98, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x9b, 0x03, 0x9c, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, 0xa0, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0xa3, 0x03, 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, 0xa8, 0x03, 0xa9, 0x03, 0xaa, 0x03, 0xab, 0x03, 0xac, 0x03, 0xad, 0x03, 0xae, 0x03, 0xaf, 0x03, 0xb0, 0x03, 0xb1, 0x03, 0xb2, 0x03, 0xb3, 0x03, 0xb4, 0x03, 0xb5, 0x03, 0xb6, 0x03, 0xb7, 0x03, 0xb8, 0x03, 0xb9, 0x03, 0xba, 0x03, 0xbb, 0x03, 0xbc, 0x03, 0xbd, 0x03, 0xbe, 0x03, 0xbf, 0x03, 0xc0, 0x03, 0xc1, 0x03, 0xc2, 0x03, 0xc3, 0x03, 0xc4, 0x03, 0xc5, 0x03, 0xc6, 0x03, 0xc7, 0x03, 0xc8, 0x03, 0xc9, 0x03, 0xca, 0x03, 0xcb, 0x03, 0xcc, 0x03, 0xcd, 0x03, 0xce, 0x03, 0xcf, 0x03, 0xd0, 0x03, 0xd1, 0x03, 0xd2, 0x03, 0xd3, 0x03, 0xd4, 0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd7, 0x03, 0xd8, 0x03, 0xd9, 0x03, 0xda, 0x03, 0xdb, 0x03, 0xdc, 0x03, 0xdd, 0x03, 0xde, 0x03, 0xdf, 0x03, 0xe0, 0x03, 0xe1, 0x03, 0xe2, 0x03, 0xe3, 0x03, 0xe4, 0x03, 0xe5, 0x03, 0xe6, 0x03, 0xe7, 0x03, 0xe8, 0x03, 0xe9, 0x03, 0xea, 0x03, 0xeb, 0x03, 0xec, 0x03, 0xed, 0x03, 0xee, 0x03, 0xef, 0x03, 0xf0, 0x03, 0xf1, 0x03, 0xf2, 0x03, 0xf3, 0x03, 0xf4, 0x03, 0xf5, 0x03, 0xf6, 0x03, 0xf7, 0x03, 0xf8, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfb, 0x03, 0xfc, 0x03, 0xfd, 0x03, 0xfe, 0x03, 0xff, 0x04, 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, 0x08, 0x04, 0x09, 0x04, 0x0a, 0x04, 0x0b, 0x04, 0x0c, 0x04, 0x0d, 0x04, 0x0e, 0x04, 0x0f, 0x04, 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, 0x04, 0x14, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, 0x04, 0x18, 0x04, 0x19, 0x04, 0x1a, 0x04, 0x1b, 0x04, 0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, 0x04, 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, 0x04, 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, 0x04, 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2b, 0x04, 0x2c, 0x04, 0x2d, 0x04, 0x2e, 0x04, 0x2f, 0x04, 0x30, 0x04, 0x31, 0x04, 0x32, 0x04, 0x33, 0x04, 0x34, 0x04, 0x35, 0x04, 0x36, 0x04, 0x37, 0x04, 0x38, 0x04, 0x39, 0x04, 0x3a, 0x04, 0x3b, 0x04, 0x3c, 0x04, 0x3d, 0x04, 0x3e, 0x04, 0x3f, 0x04, 0x40, 0x04, 0x41, 0x04, 0x42, 0x04, 0x43, 0x04, 0x44, 0x04, 0x45, 0x04, 0x46, 0x04, 0x47, 0x04, 0x48, 0x04, 0x49, 0x04, 0x4a, 0x04, 0x4b, 0x04, 0x4c, 0x04, 0x4d, 0x04, 0x4e, 0x04, 0x4f, 0x04, 0x50, 0x04, 0x51, 0x04, 0x52, 0x04, 0x53, 0x04, 0x54, 0x04, 0x55, 0x04, 0x56, 0x04, 0x57, 0x04, 0x58, 0x04, 0x59, 0x04, 0x5a, 0x04, 0x5b, 0x04, 0x5c, 0x04, 0x5d, 0x04, 0x5e, 0x04, 0x5f, 0x04, 0x60, 0x04, 0x61, 0x04, 0x62, 0x04, 0x63, 0x04, 0x64, 0x04, 0x65, 0x04, 0x66, 0x04, 0x67, 0x04, 0x68, 0x04, 0x69, 0x04, 0x6a, 0x04, 0x6b, 0x04, 0x6c, 0x04, 0x6d, 0x04, 0x6e, 0x04, 0x6f, 0x04, 0x70, 0x04, 0x71, 0x04, 0x72, 0x04, 0x73, 0x04, 0x74, 0x04, 0x75, 0x04, 0x76, 0x04, 0x77, 0x04, 0x78, 0x04, 0x79, 0x04, 0x7a, 0x04, 0x7b, 0x04, 0x7c, 0x04, 0x7d, 0x04, 0x7e, 0x04, 0x7f, 0x04, 0x80, 0x04, 0x81, 0x04, 0x82, 0x04, 0x83, 0x04, 0x84, 0x04, 0x85, 0x04, 0x86, 0x04, 0x87, 0x04, 0x88, 0x04, 0x89, 0x04, 0x8a, 0x04, 0x8b, 0x04, 0x8c, 0x04, 0x8d, 0x04, 0x8e, 0x04, 0x8f, 0x04, 0x90, 0x04, 0x91, 0x04, 0x92, 0x04, 0x93, 0x04, 0x94, 0x04, 0x95, 0x04, 0x96, 0x04, 0x97, 0x04, 0x98, 0x04, 0x99, 0x04, 0x9a, 0x04, 0x9b, 0x04, 0x9c, 0x04, 0x9d, 0x04, 0x9e, 0x04, 0x9f, 0x04, 0xa0, 0x04, 0xa1, 0x04, 0xa2, 0x04, 0xa3, 0x04, 0xa4, 0x04, 0xa5, 0x04, 0xa6, 0x04, 0xa7, 0x04, 0xa8, 0x04, 0xa9, 0x04, 0xaa, 0x04, 0xab, 0x04, 0xac, 0x04, 0xad, 0x04, 0xae, 0x04, 0xaf, 0x04, 0xb0, 0x04, 0xb1, 0x04, 0xb2, 0x04, 0xb3, 0x04, 0xb4, 0x04, 0xb5, 0x04, 0xb6, 0x04, 0xb7, 0x04, 0xb8, 0x04, 0xb9, 0x04, 0xba, 0x04, 0xbb, 0x04, 0xbc, 0x04, 0xbd, 0x04, 0xbe, 0x04, 0xbf, 0x04, 0xc0, 0x04, 0xc1, 0x04, 0xc2, 0x04, 0xc3, 0x04, 0xc4, 0x04, 0xc5, 0x04, 0xc6, 0x04, 0xc7, 0x04, 0xc8, 0x04, 0xc9, 0x04, 0xca, 0x04, 0xcb, 0x04, 0xcc, 0x04, 0xcd, 0x04, 0xce, 0x04, 0xcf, 0x04, 0xd0, 0x04, 0xd1, 0x04, 0xd2, 0x04, 0xd3, 0x04, 0xd4, 0x04, 0xd5, 0x04, 0xd6, 0x04, 0xd7, 0x04, 0xd8, 0x04, 0xd9, 0x04, 0xda, 0x04, 0xdb, 0x04, 0xdc, 0x04, 0xdd, 0x04, 0xde, 0x04, 0xdf, 0x04, 0xe0, 0x04, 0xe1, 0x04, 0xe2, 0x04, 0xe3, 0x04, 0xe4, 0x04, 0xe5, 0x04, 0xe6, 0x04, 0xe7, 0x04, 0xe8, 0x04, 0xe9, 0x04, 0xea, 0x04, 0xeb, 0x04, 0xec, 0x04, 0xed, 0x04, 0xee, 0x04, 0xef, 0x04, 0xf0, 0x04, 0xf1, 0x04, 0xf2, 0x04, 0xf3, 0x04, 0xf4, 0x04, 0xf5, 0x04, 0xf6, 0x04, 0xf7, 0x04, 0xf8, 0x04, 0xf9, 0x04, 0xfa, 0x04, 0xfb, 0x04, 0xfc, 0x04, 0xfd, 0x04, 0xfe, 0x04, 0xff, 0x05, 0x00, 0x05, 0x01, 0x05, 0x02, 0x05, 0x03, 0x05, 0x04, 0x05, 0x05, 0x05, 0x06, 0x05, 0x07, 0x05, 0x08, 0x05, 0x09, 0x05, 0x0a, 0x05, 0x0b, 0x05, 0x0c, 0x05, 0x0d, 0x05, 0x0e, 0x05, 0x0f, 0x05, 0x10, 0x05, 0x11, 0x05, 0x12, 0x05, 0x13, 0x05, 0x14, 0x05, 0x15, 0x05, 0x16, 0x05, 0x17, 0x05, 0x18, 0x05, 0x19, 0x05, 0x1a, 0x05, 0x1b, 0x05, 0x1c, 0x05, 0x1d, 0x05, 0x1e, 0x05, 0x1f, 0x05, 0x20, 0x05, 0x21, 0x05, 0x22, 0x05, 0x23, 0x05, 0x24, 0x05, 0x25, 0x05, 0x26, 0x05, 0x27, 0x05, 0x28, 0x05, 0x29, 0x05, 0x2a, 0x05, 0x2b, 0x05, 0x2c, 0x05, 0x2d, 0x05, 0x2e, 0x05, 0x2f, 0x05, 0x30, 0x05, 0x31, 0x05, 0x32, 0x05, 0x33, 0x05, 0x34, 0x05, 0x35, 0x05, 0x36, 0x05, 0x37, 0x05, 0x38, 0x05, 0x39, 0x05, 0x3a, 0x05, 0x3b, 0x05, 0x3c, 0x05, 0x3d, 0x05, 0x3e, 0x05, 0x3f, 0x05, 0x40, 0x05, 0x41, 0x05, 0x42, 0x05, 0x43, 0x05, 0x44, 0x05, 0x45, 0x05, 0x46, 0x05, 0x47, 0x05, 0x48, 0x05, 0x49, 0x05, 0x4a, 0x05, 0x4b, 0x05, 0x4c, 0x05, 0x4d, 0x05, 0x4e, 0x05, 0x4f, 0x05, 0x50, 0x05, 0x51, 0x05, 0x52, 0x05, 0x53, 0x05, 0x54, 0x05, 0x55, 0x05, 0x56, 0x05, 0x57, 0x05, 0x58, 0x05, 0x59, 0x05, 0x5a, 0x05, 0x5b, 0x05, 0x5c, 0x05, 0x5d, 0x05, 0x5e, 0x05, 0x5f, 0x05, 0x60, 0x05, 0x61, 0x05, 0x62, 0x05, 0x63, 0x05, 0x64, 0x05, 0x65, 0x05, 0x66, 0x05, 0x67, 0x05, 0x68, 0x05, 0x69, 0x05, 0x6a, 0x05, 0x6b, 0x05, 0x6c, 0x05, 0x6d, 0x05, 0x6e, 0x05, 0x6f, 0x05, 0x70, 0x05, 0x71, 0x05, 0x72, 0x05, 0x73, 0x05, 0x74, 0x05, 0x75, 0x05, 0x76, 0x05, 0x77, 0x05, 0x78, 0x05, 0x79, 0x05, 0x7a, 0x05, 0x7b, 0x05, 0x7c, 0x05, 0x7d, 0x05, 0x7e, 0x05, 0x7f, 0x05, 0x80, 0x05, 0x81, 0x05, 0x82, 0x05, 0x83, 0x05, 0x84, 0x05, 0x85, 0x05, 0x86, 0x05, 0x87, 0x05, 0x88, 0x05, 0x89, 0x05, 0x8a, 0x05, 0x8b, 0x05, 0x8c, 0x05, 0x8d, 0x05, 0x8e, 0x05, 0x8f, 0x05, 0x90, 0x05, 0x91, 0x05, 0x92, 0x05, 0x93, 0x05, 0x94, 0x05, 0x95, 0x05, 0x96, 0x05, 0x97, 0x05, 0x98, 0x05, 0x99, 0x05, 0x9a, 0x05, 0x9b, 0x05, 0x9c, 0x05, 0x9d, 0x05, 0x9e, 0x05, 0x9f, 0x05, 0xa0, 0x05, 0xa1, 0x05, 0xa2, 0x05, 0xa3, 0x05, 0xa4, 0x05, 0xa5, 0x05, 0xa6, 0x05, 0xa7, 0x05, 0xa8, 0x05, 0xa9, 0x05, 0xaa, 0x05, 0xab, 0x05, 0xac, 0x05, 0xad, 0x05, 0xae, 0x05, 0xaf, 0x05, 0xb0, 0x05, 0xb1, 0x05, 0xb2, 0x05, 0xb3, 0x05, 0xb4, 0x05, 0xb5, 0x05, 0xb6, 0x05, 0xb7, 0x05, 0xb8, 0x05, 0xb9, 0x05, 0xba, 0x05, 0xbb, 0x05, 0xbc, 0x05, 0xbd, 0x05, 0xbe, 0x05, 0xbf, 0x05, 0xc0, 0x05, 0xc1, 0x05, 0xc2, 0x05, 0xc3, 0x05, 0xc4, 0x05, 0xc5, 0x05, 0xc6, 0x05, 0xc7, 0x05, 0xc8, 0x05, 0xc9, 0x05, 0xca, 0x05, 0xcb, 0x05, 0xcc, 0x05, 0xcd, 0x05, 0xce, 0x05, 0xcf, 0x05, 0xd0, 0x05, 0xd1, 0x05, 0xd2, 0x05, 0xd3, 0x05, 0xd4, 0x05, 0xd5, 0x05, 0xd6, 0x05, 0xd7, 0x05, 0xd8, 0x05, 0xd9, 0x05, 0xda, 0x05, 0xdb, 0x05, 0xdc, 0x05, 0xdd, 0x05, 0xde, 0x05, 0xdf, 0x05, 0xe0, 0x05, 0xe1, 0x05, 0xe2, 0x05, 0xe3, 0x05, 0xe4, 0x05, 0xe5, 0x05, 0xe6, 0x05, 0xe7, 0x05, 0xe8, 0x05, 0xe9, 0x05, 0xea, 0x05, 0xeb, 0x05, 0xec, 0x05, 0xed, 0x05, 0xee, 0x05, 0xef, 0x05, 0xf0, 0x05, 0xf1, 0x05, 0xf2, 0x05, 0xf3, 0x05, 0xf4, 0x05, 0xf5, 0x05, 0xf6, 0x05, 0xf7, 0x05, 0xf8, 0x05, 0xf9, 0x05, 0xfa, 0x05, 0xfb, 0x05, 0xfc, 0x05, 0xfd, 0x05, 0xfe, 0x05, 0xff, 0x06, 0x00, 0x06, 0x01, 0x06, 0x02, 0x06, 0x03, 0x06, 0x04, 0x06, 0x05, 0x06, 0x06, 0x06, 0x07, 0x06, 0x08, 0x06, 0x09, 0x06, 0x0a, 0x06, 0x0b, 0x06, 0x0c, 0x06, 0x0d, 0x06, 0x0e, 0x06, 0x0f, 0x06, 0x10, 0x06, 0x11, 0x06, 0x12, 0x06, 0x13, 0x06, 0x14, 0x06, 0x15, 0x06, 0x16, 0x06, 0x17, 0x06, 0x18, 0x06, 0x19, 0x06, 0x1a, 0x06, 0x1b, 0x06, 0x1c, 0x06, 0x1d, 0x06, 0x1e, 0x06, 0x1f, 0x06, 0x20, 0x06, 0x21, 0x06, 0x22, 0x06, 0x23, 0x06, 0x24, 0x06, 0x25, 0x06, 0x26, 0x06, 0x27, 0x06, 0x28, 0x06, 0x29, 0x06, 0x2a, 0x06, 0x2b, 0x06, 0x2c, 0x06, 0x2d, 0x06, 0x2e, 0x06, 0x2f, 0x06, 0x30, 0x06, 0x31, 0x06, 0x32, 0x06, 0x33, 0x06, 0x34, 0x06, 0x35, 0x06, 0x36, 0x06, 0x37, 0x06, 0x38, 0x06, 0x39, 0x06, 0x3a, 0x06, 0x3b, 0x06, 0x3c, 0x06, 0x3d, 0x06, 0x3e, 0x06, 0x3f, 0x06, 0x40, 0x06, 0x41, 0x06, 0x42, 0x06, 0x43, 0x06, 0x44, 0x06, 0x45, 0x06, 0x46, 0x06, 0x47, 0x06, 0x48, 0x06, 0x49, 0x06, 0x4a, 0x06, 0x4b, 0x06, 0x4c, 0x06, 0x4d, 0x06, 0x4e, 0x06, 0x4f, 0x06, 0x50, 0x06, 0x51, 0x06, 0x52, 0x06, 0x53, 0x06, 0x54, 0x06, 0x55, 0x06, 0x56, 0x06, 0x57, 0x06, 0x58, 0x06, 0x59, 0x06, 0x5a, 0x06, 0x5b, 0x06, 0x5c, 0x06, 0x5d, 0x06, 0x5e, 0x06, 0x5f, 0x06, 0x60, 0x06, 0x61, 0x06, 0x62, 0x06, 0x63, 0x06, 0x64, 0x06, 0x65, 0x06, 0x66, 0x06, 0x67, 0x06, 0x68, 0x06, 0x69, 0x06, 0x6a, 0x06, 0x6b, 0x06, 0x6c, 0x06, 0x6d, 0x06, 0x6e, 0x06, 0x6f, 0x06, 0x70, 0x06, 0x71, 0x06, 0x72, 0x06, 0x73, 0x06, 0x74, 0x06, 0x75, 0x06, 0x76, 0x06, 0x77, 0x06, 0x78, 0x06, 0x79, 0x06, 0x7a, 0x06, 0x7b, 0x06, 0x7c, 0x06, 0x7d, 0x06, 0x7e, 0x06, 0x7f, 0x06, 0x80, 0x06, 0x81, 0x06, 0x82, 0x06, 0x83, 0x06, 0x84, 0x06, 0x85, 0x06, 0x86, 0x06, 0x87, 0x06, 0x88, 0x06, 0x89, 0x06, 0x8a, 0x06, 0x8b, 0x06, 0x8c, 0x06, 0x8d, 0x06, 0x8e, 0x06, 0x8f, 0x06, 0x90, 0x06, 0x91, 0x06, 0x92, 0x06, 0x93, 0x06, 0x94, 0x06, 0x95, 0x06, 0x96, 0x06, 0x97, 0x06, 0x98, 0x06, 0x99, 0x06, 0x9a, 0x06, 0x9b, 0x06, 0x9c, 0x06, 0x9d, 0x06, 0x9e, 0x06, 0x9f, 0x06, 0xa0, 0x06, 0xa1, 0x06, 0xa2, 0x06, 0xa3, 0x06, 0xa4, 0x06, 0xa5, 0x06, 0xa6, 0x06, 0xa7, 0x06, 0xa8, 0x06, 0xa9, 0x06, 0xaa, 0x06, 0xab, 0x06, 0xac, 0x06, 0xad, 0x06, 0xae, 0x06, 0xaf, 0x06, 0xb0, 0x06, 0xb1, 0x06, 0xb2, 0x06, 0xb3, 0x06, 0xb4, 0x06, 0xb5, 0x06, 0xb6, 0x06, 0xb7, 0x06, 0xb8, 0x06, 0xb9, 0x06, 0xba, 0x06, 0xbb, 0x06, 0xbc, 0x06, 0xbd, 0x06, 0xbe, 0x06, 0xbf, 0x06, 0xc0, 0x06, 0xc1, 0x06, 0xc2, 0x06, 0xc3, 0x06, 0xc4, 0x06, 0xc5, 0x06, 0xc6, 0x06, 0xc7, 0x06, 0xc8, 0x06, 0xc9, 0x06, 0xca, 0x06, 0xcb, 0x06, 0xcc, 0x06, 0xcd, 0x06, 0xce, 0x06, 0xcf, 0x06, 0xd0, 0x06, 0xd1, 0x06, 0xd2, 0x06, 0xd3, 0x06, 0xd4, 0x06, 0xd5, 0x06, 0xd6, 0x06, 0xd7, 0x06, 0xd8, 0x06, 0xd9, 0x06, 0xda, 0x06, 0xdb, 0x06, 0xdc, 0x06, 0xdd, 0x06, 0xde, 0x06, 0xdf, 0x06, 0xe0, 0x06, 0xe1, 0x06, 0xe2, 0x06, 0xe3, 0x06, 0xe4, 0x06, 0xe5, 0x06, 0xe6, 0x06, 0xe7, 0x06, 0xe8, 0x06, 0xe9, 0x06, 0xea, 0x06, 0xeb, 0x06, 0xec, 0x06, 0xed, 0x06, 0xee, 0x06, 0xef, 0x06, 0xf0, 0x06, 0xf1, 0x06, 0xf2, 0x06, 0xf3, 0x06, 0xf4, 0x06, 0xf5, 0x06, 0xf6, 0x06, 0xf7, 0x06, 0xf8, 0x06, 0xf9, 0x06, 0xfa, 0x06, 0xfb, 0x06, 0xfc, 0x06, 0xfd, 0x06, 0xfe, 0x06, 0xff, 0x07, 0x00, 0x07, 0x01, 0x07, 0x02, 0x07, 0x03, 0x07, 0x04, 0x07, 0x05, 0x07, 0x06, 0x07, 0x07, 0x07, 0x08, 0x07, 0x09, 0x07, 0x0a, 0x07, 0x0b, 0x07, 0x0c, 0x07, 0x0d, 0x07, 0x0e, 0x07, 0x0f, 0x07, 0x10, 0x07, 0x11, 0x07, 0x12, 0x07, 0x13, 0x07, 0x14, 0x07, 0x15, 0x07, 0x16, 0x07, 0x17, 0x07, 0x18, 0x07, 0x19, 0x07, 0x1a, 0x07, 0x1b, 0x07, 0x1c, 0x07, 0x1d, 0x07, 0x1e, 0x07, 0x1f, 0x07, 0x20, 0x07, 0x21, 0x07, 0x22, 0x07, 0x23, 0x07, 0x24, 0x07, 0x25, 0x07, 0x26, 0x07, 0x27, 0x07, 0x28, 0x07, 0x29, 0x07, 0x2a, 0x07, 0x2b, 0x07, 0x2c, 0x07, 0x2d, 0x07, 0x2e, 0x07, 0x2f, 0x07, 0x30, 0x07, 0x31, 0x07, 0x32, 0x07, 0x33, 0x07, 0x34, 0x07, 0x35, 0x07, 0x36, 0x07, 0x37, 0x07, 0x38, 0x07, 0x39, 0x07, 0x3a, 0x07, 0x3b, 0x07, 0x3c, 0x07, 0x3d, 0x07, 0x3e, 0x07, 0x3f, 0x07, 0x40, 0x07, 0x41, 0x07, 0x42, 0x07, 0x43, 0x07, 0x44, 0x07, 0x45, 0x07, 0x46, 0x07, 0x47, 0x07, 0x48, 0x07, 0x49, 0x07, 0x4a, 0x07, 0x4b, 0x07, 0x4c, 0x07, 0x4d, 0x07, 0x4e, 0x07, 0x4f, 0x07, 0x50, 0x07, 0x51, 0x07, 0x52, 0x07, 0x53, 0x07, 0x54, 0x07, 0x55, 0x07, 0x56, 0x07, 0x57, 0x07, 0x58, 0x07, 0x59, 0x07, 0x5a, 0x07, 0x5b, 0x07, 0x5c, 0x07, 0x5d, 0x07, 0x5e, 0x07, 0x5f, 0x07, 0x60, 0x07, 0x61, 0x07, 0x62, 0x07, 0x63, 0x07, 0x64, 0x07, 0x65, 0x07, 0x66, 0x07, 0x67, 0x07, 0x68, 0x07, 0x69, 0x00, 0xb2, 0x00, 0xb3, 0x07, 0x6a, 0x07, 0x6b, 0x07, 0x6c, 0x00, 0xb6, 0x00, 0xb7, 0x00, 0xc4, 0x07, 0x6d, 0x00, 0xb4, 0x00, 0xb5, 0x00, 0xc5, 0x07, 0x6e, 0x00, 0x82, 0x00, 0xc2, 0x00, 0x87, 0x07, 0x6f, 0x07, 0x70, 0x07, 0x71, 0x00, 0xab, 0x07, 0x72, 0x07, 0x73, 0x07, 0x74, 0x07, 0x75, 0x07, 0x76, 0x07, 0x77, 0x07, 0x78, 0x07, 0x79, 0x07, 0x7a, 0x00, 0xc6, 0x07, 0x7b, 0x07, 0x7c, 0x07, 0x7d, 0x07, 0x7e, 0x07, 0x7f, 0x07, 0x80, 0x07, 0x81, 0x07, 0x82, 0x00, 0xbe, 0x00, 0xbf, 0x07, 0x83, 0x07, 0x84, 0x07, 0x85, 0x07, 0x86, 0x07, 0x87, 0x07, 0x88, 0x07, 0x89, 0x07, 0x8a, 0x07, 0x8b, 0x00, 0xbc, 0x07, 0x8c, 0x07, 0x8d, 0x07, 0x8e, 0x07, 0x8f, 0x07, 0x90, 0x07, 0x91, 0x07, 0x92, 0x07, 0x93, 0x07, 0x94, 0x07, 0x95, 0x07, 0x96, 0x07, 0x97, 0x07, 0x98, 0x07, 0x99, 0x07, 0x9a, 0x07, 0x9b, 0x07, 0x9c, 0x07, 0x9d, 0x07, 0x9e, 0x07, 0x9f, 0x07, 0xa0, 0x07, 0xa1, 0x07, 0xa2, 0x07, 0xa3, 0x07, 0xa4, 0x07, 0xa5, 0x07, 0xa6, 0x07, 0xa7, 0x07, 0xa8, 0x07, 0xa9, 0x07, 0xaa, 0x07, 0xab, 0x07, 0xac, 0x07, 0xad, 0x07, 0xae, 0x07, 0xaf, 0x07, 0xb0, 0x07, 0xb1, 0x07, 0xb2, 0x07, 0xb3, 0x07, 0xb4, 0x07, 0xb5, 0x07, 0xb6, 0x07, 0xb7, 0x07, 0xb8, 0x07, 0xb9, 0x07, 0xba, 0x07, 0xbb, 0x07, 0xbc, 0x07, 0xbd, 0x07, 0xbe, 0x07, 0xbf, 0x07, 0xc0, 0x07, 0xc1, 0x07, 0xc2, 0x07, 0xc3, 0x07, 0xc4, 0x07, 0xc5, 0x07, 0xc6, 0x07, 0xc7, 0x07, 0xc8, 0x07, 0xc9, 0x07, 0xca, 0x07, 0xcb, 0x07, 0xcc, 0x07, 0xcd, 0x07, 0xce, 0x07, 0xcf, 0x07, 0xd0, 0x07, 0xd1, 0x07, 0xd2, 0x07, 0xd3, 0x07, 0xd4, 0x07, 0xd5, 0x07, 0xd6, 0x07, 0xd7, 0x07, 0xd8, 0x07, 0xd9, 0x07, 0xda, 0x07, 0xdb, 0x07, 0xdc, 0x07, 0xdd, 0x07, 0xde, 0x00, 0xf7, 0x07, 0xdf, 0x07, 0xe0, 0x07, 0xe1, 0x07, 0xe2, 0x07, 0xe3, 0x07, 0xe4, 0x07, 0xe5, 0x07, 0xe6, 0x07, 0xe7, 0x07, 0xe8, 0x07, 0xe9, 0x07, 0xea, 0x07, 0xeb, 0x07, 0xec, 0x07, 0xed, 0x07, 0xee, 0x07, 0xef, 0x07, 0xf0, 0x07, 0xf1, 0x07, 0xf2, 0x07, 0xf3, 0x07, 0xf4, 0x07, 0xf5, 0x07, 0xf6, 0x07, 0xf7, 0x07, 0xf8, 0x07, 0xf9, 0x07, 0xfa, 0x07, 0xfb, 0x07, 0xfc, 0x07, 0xfd, 0x07, 0xfe, 0x07, 0xff, 0x08, 0x00, 0x08, 0x01, 0x08, 0x02, 0x08, 0x03, 0x08, 0x04, 0x08, 0x05, 0x08, 0x06, 0x08, 0x07, 0x08, 0x08, 0x08, 0x09, 0x08, 0x0a, 0x08, 0x0b, 0x08, 0x0c, 0x08, 0x0d, 0x08, 0x0e, 0x08, 0x0f, 0x08, 0x10, 0x08, 0x11, 0x08, 0x12, 0x08, 0x13, 0x08, 0x14, 0x08, 0x15, 0x08, 0x16, 0x08, 0x17, 0x08, 0x18, 0x08, 0x19, 0x08, 0x1a, 0x08, 0x1b, 0x00, 0x8c, 0x08, 0x1c, 0x08, 0x1d, 0x08, 0x1e, 0x08, 0x1f, 0x08, 0x20, 0x08, 0x21, 0x08, 0x22, 0x08, 0x23, 0x08, 0x24, 0x08, 0x25, 0x08, 0x26, 0x08, 0x27, 0x08, 0x28, 0x08, 0x29, 0x08, 0x2a, 0x08, 0x2b, 0x08, 0x2c, 0x08, 0x2d, 0x08, 0x2e, 0x08, 0x2f, 0x08, 0x30, 0x08, 0x31, 0x08, 0x32, 0x08, 0x33, 0x08, 0x34, 0x08, 0x35, 0x08, 0x36, 0x08, 0x37, 0x08, 0x38, 0x08, 0x39, 0x08, 0x3a, 0x08, 0x3b, 0x08, 0x3c, 0x08, 0x3d, 0x08, 0x3e, 0x08, 0x3f, 0x08, 0x40, 0x08, 0x41, 0x08, 0x42, 0x08, 0x43, 0x08, 0x44, 0x08, 0x45, 0x08, 0x46, 0x08, 0x47, 0x08, 0x48, 0x08, 0x49, 0x08, 0x4a, 0x08, 0x4b, 0x08, 0x4c, 0x08, 0x4d, 0x08, 0x4e, 0x08, 0x4f, 0x08, 0x50, 0x08, 0x51, 0x08, 0x52, 0x08, 0x53, 0x08, 0x54, 0x08, 0x55, 0x08, 0x56, 0x08, 0x57, 0x08, 0x58, 0x08, 0x59, 0x08, 0x5a, 0x08, 0x5b, 0x08, 0x5c, 0x08, 0x5d, 0x08, 0x5e, 0x08, 0x5f, 0x08, 0x60, 0x08, 0x61, 0x08, 0x62, 0x08, 0x63, 0x08, 0x64, 0x08, 0x65, 0x08, 0x66, 0x08, 0x67, 0x08, 0x68, 0x08, 0x69, 0x08, 0x6a, 0x08, 0x6b, 0x08, 0x6c, 0x08, 0x6d, 0x08, 0x6e, 0x08, 0x6f, 0x08, 0x70, 0x08, 0x71, 0x08, 0x72, 0x08, 0x73, 0x08, 0x74, 0x08, 0x75, 0x08, 0x76, 0x08, 0x77, 0x08, 0x78, 0x08, 0x79, 0x08, 0x7a, 0x08, 0x7b, 0x08, 0x7c, 0x08, 0x7d, 0x08, 0x7e, 0x08, 0x7f, 0x08, 0x80, 0x08, 0x81, 0x08, 0x82, 0x08, 0x83, 0x08, 0x84, 0x08, 0x85, 0x08, 0x86, 0x08, 0x87, 0x08, 0x88, 0x08, 0x89, 0x08, 0x8a, 0x08, 0x8b, 0x08, 0x8c, 0x08, 0x8d, 0x08, 0x8e, 0x08, 0x8f, 0x08, 0x90, 0x08, 0x91, 0x08, 0x92, 0x08, 0x93, 0x08, 0x94, 0x08, 0x95, 0x08, 0x96, 0x08, 0x97, 0x08, 0x98, 0x08, 0x99, 0x08, 0x9a, 0x08, 0x9b, 0x08, 0x9c, 0x08, 0x9d, 0x08, 0x9e, 0x08, 0x9f, 0x08, 0xa0, 0x08, 0xa1, 0x08, 0xa2, 0x08, 0xa3, 0x08, 0xa4, 0x08, 0xa5, 0x08, 0xa6, 0x08, 0xa7, 0x08, 0xa8, 0x08, 0xa9, 0x08, 0xaa, 0x08, 0xab, 0x08, 0xac, 0x08, 0xad, 0x08, 0xae, 0x08, 0xaf, 0x08, 0xb0, 0x08, 0xb1, 0x08, 0xb2, 0x08, 0xb3, 0x08, 0xb4, 0x08, 0xb5, 0x08, 0xb6, 0x08, 0xb7, 0x08, 0xb8, 0x08, 0xb9, 0x08, 0xba, 0x08, 0xbb, 0x08, 0xbc, 0x08, 0xbd, 0x08, 0xbe, 0x08, 0xbf, 0x08, 0xc0, 0x08, 0xc1, 0x08, 0xc2, 0x08, 0xc3, 0x08, 0xc4, 0x08, 0xc5, 0x08, 0xc6, 0x08, 0xc7, 0x08, 0xc8, 0x08, 0xc9, 0x08, 0xca, 0x08, 0xcb, 0x08, 0xcc, 0x08, 0xcd, 0x08, 0xce, 0x08, 0xcf, 0x08, 0xd0, 0x08, 0xd1, 0x08, 0xd2, 0x08, 0xd3, 0x08, 0xd4, 0x08, 0xd5, 0x08, 0xd6, 0x08, 0xd7, 0x08, 0xd8, 0x08, 0xd9, 0x08, 0xda, 0x08, 0xdb, 0x08, 0xdc, 0x08, 0xdd, 0x08, 0xde, 0x08, 0xdf, 0x08, 0xe0, 0x08, 0xe1, 0x08, 0xe2, 0x08, 0xe3, 0x08, 0xe4, 0x08, 0xe5, 0x08, 0xe6, 0x08, 0xe7, 0x08, 0xe8, 0x08, 0xe9, 0x08, 0xea, 0x08, 0xeb, 0x08, 0xec, 0x08, 0xed, 0x00, 0x98, 0x08, 0xee, 0x08, 0xef, 0x08, 0xf0, 0x00, 0xa8, 0x08, 0xf1, 0x08, 0xf2, 0x08, 0xf3, 0x08, 0xf4, 0x08, 0xf5, 0x08, 0xf6, 0x08, 0xf7, 0x08, 0xf8, 0x00, 0x9a, 0x08, 0xf9, 0x00, 0x99, 0x00, 0xef, 0x08, 0xfa, 0x08, 0xfb, 0x08, 0xfc, 0x08, 0xfd, 0x08, 0xfe, 0x08, 0xff, 0x09, 0x00, 0x00, 0xa5, 0x09, 0x01, 0x09, 0x02, 0x09, 0x03, 0x00, 0x92, 0x09, 0x04, 0x09, 0x05, 0x09, 0x06, 0x09, 0x07, 0x09, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x09, 0x0b, 0x09, 0x0c, 0x09, 0x0d, 0x09, 0x0e, 0x09, 0x0f, 0x00, 0x9c, 0x09, 0x10, 0x09, 0x11, 0x09, 0x12, 0x09, 0x13, 0x09, 0x14, 0x09, 0x15, 0x09, 0x16, 0x09, 0x17, 0x09, 0x18, 0x09, 0x19, 0x09, 0x1a, 0x09, 0x1b, 0x09, 0x1c, 0x09, 0x1d, 0x09, 0x1e, 0x09, 0x1f, 0x09, 0x20, 0x09, 0x21, 0x09, 0x22, 0x09, 0x23, 0x09, 0x24, 0x09, 0x25, 0x09, 0x26, 0x09, 0x27, 0x09, 0x28, 0x09, 0x29, 0x09, 0x2a, 0x09, 0x2b, 0x00, 0xa7, 0x09, 0x2c, 0x09, 0x2d, 0x09, 0x2e, 0x09, 0x2f, 0x09, 0x30, 0x09, 0x31, 0x09, 0x32, 0x09, 0x33, 0x09, 0x34, 0x09, 0x35, 0x09, 0x36, 0x09, 0x37, 0x09, 0x38, 0x09, 0x39, 0x09, 0x3a, 0x09, 0x3b, 0x09, 0x3c, 0x09, 0x3d, 0x09, 0x3e, 0x09, 0x3f, 0x09, 0x40, 0x09, 0x41, 0x09, 0x42, 0x00, 0x8f, 0x09, 0x43, 0x09, 0x44, 0x09, 0x45, 0x00, 0x94, 0x00, 0x95, 0x09, 0x46, 0x09, 0x47, 0x09, 0x48, 0x09, 0x49, 0x09, 0x4a, 0x09, 0x4b, 0x09, 0x4c, 0x09, 0x4d, 0x09, 0x4e, 0x09, 0x4f, 0x09, 0x50, 0x09, 0x51, 0x09, 0x52, 0x09, 0x53, 0x09, 0x54, 0x09, 0x55, 0x09, 0x56, 0x09, 0x57, 0x09, 0x58, 0x09, 0x59, 0x09, 0x5a, 0x09, 0x5b, 0x09, 0x5c, 0x09, 0x5d, 0x09, 0x5e, 0x09, 0x5f, 0x09, 0x60, 0x09, 0x61, 0x09, 0x62, 0x09, 0x63, 0x09, 0x64, 0x09, 0x65, 0x09, 0x66, 0x09, 0x67, 0x09, 0x68, 0x09, 0x69, 0x09, 0x6a, 0x09, 0x6b, 0x09, 0x6c, 0x09, 0x6d, 0x09, 0x6e, 0x09, 0x6f, 0x09, 0x70, 0x09, 0x71, 0x09, 0x72, 0x09, 0x73, 0x09, 0x74, 0x09, 0x75, 0x09, 0x76, 0x09, 0x77, 0x09, 0x78, 0x09, 0x79, 0x09, 0x7a, 0x09, 0x7b, 0x09, 0x7c, 0x09, 0x7d, 0x09, 0x7e, 0x09, 0x7f, 0x09, 0x80, 0x09, 0x81, 0x09, 0x82, 0x09, 0x83, 0x09, 0x84, 0x09, 0x85, 0x09, 0x86, 0x09, 0x87, 0x09, 0x88, 0x09, 0x89, 0x09, 0x8a, 0x09, 0x8b, 0x09, 0x8c, 0x09, 0x8d, 0x09, 0x8e, 0x09, 0x8f, 0x09, 0x90, 0x09, 0x91, 0x09, 0x92, 0x09, 0x93, 0x09, 0x94, 0x09, 0x95, 0x09, 0x96, 0x09, 0x97, 0x09, 0x98, 0x09, 0x99, 0x09, 0x9a, 0x09, 0x9b, 0x09, 0x9c, 0x09, 0x9d, 0x09, 0x9e, 0x09, 0x9f, 0x09, 0xa0, 0x09, 0xa1, 0x09, 0xa2, 0x09, 0xa3, 0x09, 0xa4, 0x09, 0xa5, 0x09, 0xa6, 0x09, 0xa7, 0x09, 0xa8, 0x09, 0xa9, 0x09, 0xaa, 0x09, 0xab, 0x09, 0xac, 0x09, 0xad, 0x09, 0xae, 0x09, 0xaf, 0x09, 0xb0, 0x09, 0xb1, 0x09, 0xb2, 0x09, 0xb3, 0x09, 0xb4, 0x09, 0xb5, 0x09, 0xb6, 0x09, 0xb7, 0x09, 0xb8, 0x09, 0xb9, 0x09, 0xba, 0x09, 0xbb, 0x09, 0xbc, 0x09, 0xbd, 0x09, 0xbe, 0x09, 0xbf, 0x09, 0xc0, 0x09, 0xc1, 0x09, 0xc2, 0x09, 0xc3, 0x09, 0xc4, 0x09, 0xc5, 0x09, 0xc6, 0x09, 0xc7, 0x09, 0xc8, 0x09, 0xc9, 0x09, 0xca, 0x09, 0xcb, 0x09, 0xcc, 0x09, 0xcd, 0x09, 0xce, 0x09, 0xcf, 0x09, 0xd0, 0x09, 0xd1, 0x09, 0xd2, 0x09, 0xd3, 0x09, 0xd4, 0x09, 0xd5, 0x09, 0xd6, 0x09, 0xd7, 0x09, 0xd8, 0x09, 0xd9, 0x09, 0xda, 0x09, 0xdb, 0x09, 0xdc, 0x09, 0xdd, 0x09, 0xde, 0x09, 0xdf, 0x09, 0xe0, 0x09, 0xe1, 0x09, 0xe2, 0x09, 0xe3, 0x09, 0xe4, 0x09, 0xe5, 0x09, 0xe6, 0x09, 0xe7, 0x09, 0xe8, 0x09, 0xe9, 0x09, 0xea, 0x09, 0xeb, 0x09, 0xec, 0x09, 0xed, 0x09, 0xee, 0x09, 0xef, 0x09, 0xf0, 0x09, 0xf1, 0x09, 0xf2, 0x09, 0xf3, 0x09, 0xf4, 0x09, 0xf5, 0x09, 0xf6, 0x09, 0xf7, 0x09, 0xf8, 0x09, 0xf9, 0x09, 0xfa, 0x09, 0xfb, 0x09, 0xfc, 0x09, 0xfd, 0x09, 0xfe, 0x09, 0xff, 0x0a, 0x00, 0x0a, 0x01, 0x0a, 0x02, 0x0a, 0x03, 0x0a, 0x04, 0x0a, 0x05, 0x0a, 0x06, 0x0a, 0x07, 0x0a, 0x08, 0x0a, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0a, 0x0c, 0x0a, 0x0d, 0x0a, 0x0e, 0x0a, 0x0f, 0x0a, 0x10, 0x0a, 0x11, 0x0a, 0x12, 0x0a, 0x13, 0x0a, 0x14, 0x0a, 0x15, 0x0a, 0x16, 0x0a, 0x17, 0x0a, 0x18, 0x0a, 0x19, 0x0a, 0x1a, 0x0a, 0x1b, 0x0a, 0x1c, 0x0a, 0x1d, 0x0a, 0x1e, 0x0a, 0x1f, 0x0a, 0x20, 0x0a, 0x21, 0x0a, 0x22, 0x0a, 0x23, 0x0a, 0x24, 0x0a, 0x25, 0x0a, 0x26, 0x0a, 0x27, 0x0a, 0x28, 0x0a, 0x29, 0x0a, 0x2a, 0x0a, 0x2b, 0x0a, 0x2c, 0x0a, 0x2d, 0x0a, 0x2e, 0x0a, 0x2f, 0x0a, 0x30, 0x0a, 0x31, 0x0a, 0x32, 0x0a, 0x33, 0x0a, 0x34, 0x0a, 0x35, 0x0a, 0x36, 0x0a, 0x37, 0x0a, 0x38, 0x0a, 0x39, 0x0a, 0x3a, 0x0a, 0x3b, 0x0a, 0x3c, 0x0a, 0x3d, 0x0a, 0x3e, 0x0a, 0x3f, 0x0a, 0x40, 0x0a, 0x41, 0x0a, 0x42, 0x0a, 0x43, 0x0a, 0x44, 0x0a, 0x45, 0x0a, 0x46, 0x0a, 0x47, 0x0a, 0x48, 0x0a, 0x49, 0x0a, 0x4a, 0x0a, 0x4b, 0x0a, 0x4c, 0x0a, 0x4d, 0x0a, 0x4e, 0x0a, 0x4f, 0x0a, 0x50, 0x0a, 0x51, 0x0a, 0x52, 0x0a, 0x53, 0x0a, 0x54, 0x0a, 0x55, 0x0a, 0x56, 0x0a, 0x57, 0x0a, 0x58, 0x0a, 0x59, 0x0a, 0x5a, 0x0a, 0x5b, 0x0a, 0x5c, 0x0a, 0x5d, 0x0a, 0x5e, 0x0a, 0x5f, 0x0a, 0x60, 0x0a, 0x61, 0x0a, 0x62, 0x0a, 0x63, 0x0a, 0x64, 0x0a, 0x65, 0x0a, 0x66, 0x0a, 0x67, 0x0a, 0x68, 0x0a, 0x69, 0x0a, 0x6a, 0x0a, 0x6b, 0x0a, 0x6c, 0x0a, 0x6d, 0x0a, 0x6e, 0x0a, 0x6f, 0x0a, 0x70, 0x0a, 0x71, 0x0a, 0x72, 0x0a, 0x73, 0x0a, 0x74, 0x0a, 0x75, 0x0a, 0x76, 0x0a, 0x77, 0x0a, 0x78, 0x0a, 0x79, 0x0a, 0x7a, 0x0a, 0x7b, 0x0a, 0x7c, 0x0a, 0x7d, 0x0a, 0x7e, 0x0a, 0x7f, 0x0a, 0x80, 0x0a, 0x81, 0x0a, 0x82, 0x0a, 0x83, 0x0a, 0x84, 0x0a, 0x85, 0x0a, 0x86, 0x0a, 0x87, 0x0a, 0x88, 0x0a, 0x89, 0x0a, 0x8a, 0x0a, 0x8b, 0x0a, 0x8c, 0x0a, 0x8d, 0x0a, 0x8e, 0x0a, 0x8f, 0x0a, 0x90, 0x0a, 0x91, 0x0a, 0x92, 0x0a, 0x93, 0x0a, 0x94, 0x0a, 0x95, 0x0a, 0x96, 0x0a, 0x97, 0x0a, 0x98, 0x0a, 0x99, 0x0a, 0x9a, 0x0a, 0x9b, 0x0a, 0x9c, 0x0a, 0x9d, 0x0a, 0x9e, 0x0a, 0x9f, 0x0a, 0xa0, 0x0a, 0xa1, 0x0a, 0xa2, 0x0a, 0xa3, 0x0a, 0xa4, 0x0a, 0xa5, 0x0a, 0xa6, 0x0a, 0xa7, 0x0a, 0xa8, 0x0a, 0xa9, 0x0a, 0xaa, 0x0a, 0xab, 0x0a, 0xac, 0x0a, 0xad, 0x0a, 0xae, 0x0a, 0xaf, 0x0a, 0xb0, 0x0a, 0xb1, 0x0a, 0xb2, 0x0a, 0xb3, 0x0a, 0xb4, 0x0a, 0xb5, 0x0a, 0xb6, 0x0a, 0xb7, 0x0a, 0xb8, 0x0a, 0xb9, 0x0a, 0xba, 0x0a, 0xbb, 0x0a, 0xbc, 0x0a, 0xbd, 0x0a, 0xbe, 0x0a, 0xbf, 0x0a, 0xc0, 0x0a, 0xc1, 0x0a, 0xc2, 0x0a, 0xc3, 0x0a, 0xc4, 0x0a, 0xc5, 0x0a, 0xc6, 0x0a, 0xc7, 0x0a, 0xc8, 0x0a, 0xc9, 0x0a, 0xca, 0x0a, 0xcb, 0x0a, 0xcc, 0x0a, 0xcd, 0x0a, 0xce, 0x0a, 0xcf, 0x0a, 0xd0, 0x0a, 0xd1, 0x0a, 0xd2, 0x0a, 0xd3, 0x0a, 0xd4, 0x0a, 0xd5, 0x0a, 0xd6, 0x0a, 0xd7, 0x0a, 0xd8, 0x0a, 0xd9, 0x0a, 0xda, 0x0a, 0xdb, 0x0a, 0xdc, 0x0a, 0xdd, 0x0a, 0xde, 0x0a, 0xdf, 0x0a, 0xe0, 0x0a, 0xe1, 0x0a, 0xe2, 0x0a, 0xe3, 0x0a, 0xe4, 0x0a, 0xe5, 0x0a, 0xe6, 0x0a, 0xe7, 0x0a, 0xe8, 0x0a, 0xe9, 0x0a, 0xea, 0x0a, 0xeb, 0x0a, 0xec, 0x0a, 0xed, 0x0a, 0xee, 0x0a, 0xef, 0x0a, 0xf0, 0x0a, 0xf1, 0x0a, 0xf2, 0x0a, 0xf3, 0x0a, 0xf4, 0x0a, 0xf5, 0x0a, 0xf6, 0x00, 0xb9, 0x0a, 0xf7, 0x0a, 0xf8, 0x0a, 0xf9, 0x0a, 0xfa, 0x0a, 0xfb, 0x0a, 0xfc, 0x0a, 0xfd, 0x0a, 0xfe, 0x0a, 0xff, 0x0b, 0x00, 0x0b, 0x01, 0x0b, 0x02, 0x0b, 0x03, 0x0b, 0x04, 0x0b, 0x05, 0x0b, 0x06, 0x0b, 0x07, 0x0b, 0x08, 0x0b, 0x09, 0x0b, 0x0a, 0x0b, 0x0b, 0x0b, 0x0c, 0x0b, 0x0d, 0x0b, 0x0e, 0x0b, 0x0f, 0x0b, 0x10, 0x0b, 0x11, 0x0b, 0x12, 0x0b, 0x13, 0x0b, 0x14, 0x0b, 0x15, 0x0b, 0x16, 0x0b, 0x17, 0x0b, 0x18, 0x0b, 0x19, 0x0b, 0x1a, 0x0b, 0x1b, 0x0b, 0x1c, 0x0b, 0x1d, 0x0b, 0x1e, 0x0b, 0x1f, 0x0b, 0x20, 0x0b, 0x21, 0x0b, 0x22, 0x0b, 0x23, 0x0b, 0x24, 0x0b, 0x25, 0x0b, 0x26, 0x0b, 0x27, 0x0b, 0x28, 0x0b, 0x29, 0x0b, 0x2a, 0x0b, 0x2b, 0x0b, 0x2c, 0x0b, 0x2d, 0x0b, 0x2e, 0x0b, 0x2f, 0x0b, 0x30, 0x0b, 0x31, 0x0b, 0x32, 0x0b, 0x33, 0x0b, 0x34, 0x0b, 0x35, 0x0b, 0x36, 0x0b, 0x37, 0x0b, 0x38, 0x0b, 0x39, 0x0b, 0x3a, 0x0b, 0x3b, 0x0b, 0x3c, 0x0b, 0x3d, 0x0b, 0x3e, 0x0b, 0x3f, 0x0b, 0x40, 0x0b, 0x41, 0x0b, 0x42, 0x0b, 0x43, 0x0b, 0x44, 0x0b, 0x45, 0x0b, 0x46, 0x0b, 0x47, 0x0b, 0x48, 0x0b, 0x49, 0x0b, 0x4a, 0x0b, 0x4b, 0x0b, 0x4c, 0x0b, 0x4d, 0x0b, 0x4e, 0x0b, 0x4f, 0x0b, 0x50, 0x0b, 0x51, 0x0b, 0x52, 0x0b, 0x53, 0x0b, 0x54, 0x0b, 0x55, 0x0b, 0x56, 0x0b, 0x57, 0x0b, 0x58, 0x0b, 0x59, 0x0b, 0x5a, 0x0b, 0x5b, 0x0b, 0x5c, 0x0b, 0x5d, 0x0b, 0x5e, 0x0b, 0x5f, 0x0b, 0x60, 0x0b, 0x61, 0x0b, 0x62, 0x0b, 0x63, 0x0b, 0x64, 0x0b, 0x65, 0x0b, 0x66, 0x0b, 0x67, 0x0b, 0x68, 0x0b, 0x69, 0x0b, 0x6a, 0x0b, 0x6b, 0x0b, 0x6c, 0x0b, 0x6d, 0x0b, 0x6e, 0x0b, 0x6f, 0x0b, 0x70, 0x0b, 0x71, 0x0b, 0x72, 0x0b, 0x73, 0x0b, 0x74, 0x0b, 0x75, 0x0b, 0x76, 0x0b, 0x77, 0x0b, 0x78, 0x0b, 0x79, 0x0b, 0x7a, 0x0b, 0x7b, 0x0b, 0x7c, 0x0b, 0x7d, 0x0b, 0x7e, 0x0b, 0x7f, 0x0b, 0x80, 0x0b, 0x81, 0x0b, 0x82, 0x0b, 0x83, 0x0b, 0x84, 0x0b, 0x85, 0x0b, 0x86, 0x0b, 0x87, 0x0b, 0x88, 0x0b, 0x89, 0x0b, 0x8a, 0x0b, 0x8b, 0x0b, 0x8c, 0x0b, 0x8d, 0x0b, 0x8e, 0x0b, 0x8f, 0x0b, 0x90, 0x0b, 0x91, 0x0b, 0x92, 0x0b, 0x93, 0x0b, 0x94, 0x0b, 0x95, 0x0b, 0x96, 0x0b, 0x97, 0x0b, 0x98, 0x0b, 0x99, 0x0b, 0x9a, 0x0b, 0x9b, 0x0b, 0x9c, 0x0b, 0x9d, 0x0b, 0x9e, 0x0b, 0x9f, 0x0b, 0xa0, 0x0b, 0xa1, 0x0b, 0xa2, 0x0b, 0xa3, 0x0b, 0xa4, 0x0b, 0xa5, 0x0b, 0xa6, 0x0b, 0xa7, 0x0b, 0xa8, 0x0b, 0xa9, 0x0b, 0xaa, 0x0b, 0xab, 0x0b, 0xac, 0x0b, 0xad, 0x0b, 0xae, 0x0b, 0xaf, 0x0b, 0xb0, 0x0b, 0xb1, 0x0b, 0xb2, 0x0b, 0xb3, 0x0b, 0xb4, 0x0b, 0xb5, 0x0b, 0xb6, 0x0b, 0xb7, 0x0b, 0xb8, 0x0b, 0xb9, 0x0b, 0xba, 0x0b, 0xbb, 0x0b, 0xbc, 0x0b, 0xbd, 0x0b, 0xbe, 0x0b, 0xbf, 0x0b, 0xc0, 0x0b, 0xc1, 0x0b, 0xc2, 0x0b, 0xc3, 0x0b, 0xc4, 0x0b, 0xc5, 0x0b, 0xc6, 0x0b, 0xc7, 0x0b, 0xc8, 0x0b, 0xc9, 0x0b, 0xca, 0x0b, 0xcb, 0x0b, 0xcc, 0x0b, 0xcd, 0x0b, 0xce, 0x0b, 0xcf, 0x0b, 0xd0, 0x0b, 0xd1, 0x0b, 0xd2, 0x0b, 0xd3, 0x0b, 0xd4, 0x0b, 0xd5, 0x0b, 0xd6, 0x0b, 0xd7, 0x0b, 0xd8, 0x0b, 0xd9, 0x0b, 0xda, 0x0b, 0xdb, 0x0b, 0xdc, 0x0b, 0xdd, 0x0b, 0xde, 0x0b, 0xdf, 0x0b, 0xe0, 0x0b, 0xe1, 0x0b, 0xe2, 0x0b, 0xe3, 0x0b, 0xe4, 0x0b, 0xe5, 0x0b, 0xe6, 0x0b, 0xe7, 0x0b, 0xe8, 0x0b, 0xe9, 0x0b, 0xea, 0x0b, 0xeb, 0x0b, 0xec, 0x0b, 0xed, 0x0b, 0xee, 0x0b, 0xef, 0x0b, 0xf0, 0x0b, 0xf1, 0x0b, 0xf2, 0x0b, 0xf3, 0x0b, 0xf4, 0x0b, 0xf5, 0x0b, 0xf6, 0x0b, 0xf7, 0x0b, 0xf8, 0x0b, 0xf9, 0x0b, 0xfa, 0x0b, 0xfb, 0x0b, 0xfc, 0x0b, 0xfd, 0x0b, 0xfe, 0x0b, 0xff, 0x0c, 0x00, 0x0c, 0x01, 0x0c, 0x02, 0x0c, 0x03, 0x0c, 0x04, 0x0c, 0x05, 0x0c, 0x06, 0x0c, 0x07, 0x0c, 0x08, 0x0c, 0x09, 0x0c, 0x0a, 0x0c, 0x0b, 0x0c, 0x0c, 0x0c, 0x0d, 0x0c, 0x0e, 0x0c, 0x0f, 0x0c, 0x10, 0x0c, 0x11, 0x0c, 0x12, 0x0c, 0x13, 0x0c, 0x14, 0x0c, 0x15, 0x0c, 0x16, 0x0c, 0x17, 0x0c, 0x18, 0x0c, 0x19, 0x0c, 0x1a, 0x0c, 0x1b, 0x0c, 0x1c, 0x0c, 0x1d, 0x0c, 0x1e, 0x0c, 0x1f, 0x0c, 0x20, 0x0c, 0x21, 0x0c, 0x22, 0x0c, 0x23, 0x0c, 0x24, 0x0c, 0x25, 0x0c, 0x26, 0x0c, 0x27, 0x0c, 0x28, 0x0c, 0x29, 0x0c, 0x2a, 0x0c, 0x2b, 0x0c, 0x2c, 0x0c, 0x2d, 0x0c, 0x2e, 0x0c, 0x2f, 0x0c, 0x30, 0x0c, 0x31, 0x0c, 0x32, 0x0c, 0x33, 0x0c, 0x34, 0x0c, 0x35, 0x0c, 0x36, 0x0c, 0x37, 0x0c, 0x38, 0x0c, 0x39, 0x0c, 0x3a, 0x0c, 0x3b, 0x0c, 0x3c, 0x0c, 0x3d, 0x0c, 0x3e, 0x0c, 0x3f, 0x0c, 0x40, 0x0c, 0x41, 0x0c, 0x42, 0x0c, 0x43, 0x0c, 0x44, 0x0c, 0x45, 0x0c, 0x46, 0x0c, 0x47, 0x0c, 0x48, 0x0c, 0x49, 0x0c, 0x4a, 0x0c, 0x4b, 0x0c, 0x4c, 0x0c, 0x4d, 0x0c, 0x4e, 0x0c, 0x4f, 0x0c, 0x50, 0x0c, 0x51, 0x0c, 0x52, 0x0c, 0x53, 0x0c, 0x54, 0x0c, 0x55, 0x0c, 0x56, 0x0c, 0x57, 0x0c, 0x58, 0x0c, 0x59, 0x0c, 0x5a, 0x0c, 0x5b, 0x0c, 0x5c, 0x0c, 0x5d, 0x0c, 0x5e, 0x0c, 0x5f, 0x0c, 0x60, 0x0c, 0x61, 0x0c, 0x62, 0x0c, 0x63, 0x0c, 0x64, 0x0c, 0x65, 0x0c, 0x66, 0x0c, 0x67, 0x0c, 0x68, 0x0c, 0x69, 0x0c, 0x6a, 0x0c, 0x6b, 0x0c, 0x6c, 0x0c, 0x6d, 0x0c, 0x6e, 0x0c, 0x6f, 0x0c, 0x70, 0x0c, 0x71, 0x0c, 0x72, 0x0c, 0x73, 0x0c, 0x74, 0x0c, 0x75, 0x0c, 0x76, 0x0c, 0x77, 0x0c, 0x78, 0x0c, 0x79, 0x0c, 0x7a, 0x0c, 0x7b, 0x0c, 0x7c, 0x0c, 0x7d, 0x0c, 0x7e, 0x0c, 0x7f, 0x0c, 0x80, 0x0c, 0x81, 0x0c, 0x82, 0x0c, 0x83, 0x0c, 0x84, 0x0c, 0x85, 0x0c, 0x86, 0x0c, 0x87, 0x0c, 0x88, 0x0c, 0x89, 0x0c, 0x8a, 0x0c, 0x8b, 0x0c, 0x8c, 0x0c, 0x8d, 0x0c, 0x8e, 0x0c, 0x8f, 0x0c, 0x90, 0x0c, 0x91, 0x0c, 0x92, 0x0c, 0x93, 0x0c, 0x94, 0x0c, 0x95, 0x0c, 0x96, 0x0c, 0x97, 0x0c, 0x98, 0x0c, 0x99, 0x0c, 0x9a, 0x0c, 0x9b, 0x0c, 0x9c, 0x0c, 0x9d, 0x0c, 0x9e, 0x0c, 0x9f, 0x0c, 0xa0, 0x0c, 0xa1, 0x0c, 0xa2, 0x0c, 0xa3, 0x0c, 0xa4, 0x0c, 0xa5, 0x0c, 0xa6, 0x0c, 0xa7, 0x0c, 0xa8, 0x0c, 0xa9, 0x0c, 0xaa, 0x0c, 0xab, 0x0c, 0xac, 0x0c, 0xad, 0x0c, 0xae, 0x0c, 0xaf, 0x0c, 0xb0, 0x0c, 0xb1, 0x0c, 0xb2, 0x0c, 0xb3, 0x0c, 0xb4, 0x0c, 0xb5, 0x0c, 0xb6, 0x0c, 0xb7, 0x0c, 0xb8, 0x0c, 0xb9, 0x0c, 0xba, 0x0c, 0xbb, 0x0c, 0xbc, 0x0c, 0xbd, 0x0c, 0xbe, 0x0c, 0xbf, 0x0c, 0xc0, 0x0c, 0xc1, 0x0c, 0xc2, 0x0c, 0xc3, 0x0c, 0xc4, 0x0c, 0xc5, 0x0c, 0xc6, 0x0c, 0xc7, 0x0c, 0xc8, 0x0c, 0xc9, 0x0c, 0xca, 0x0c, 0xcb, 0x0c, 0xcc, 0x0c, 0xcd, 0x0c, 0xce, 0x0c, 0xcf, 0x0c, 0xd0, 0x0c, 0xd1, 0x0c, 0xd2, 0x0c, 0xd3, 0x0c, 0xd4, 0x0c, 0xd5, 0x0c, 0xd6, 0x0c, 0xd7, 0x0c, 0xd8, 0x0c, 0xd9, 0x0c, 0xda, 0x0c, 0xdb, 0x0c, 0xdc, 0x0c, 0xdd, 0x0c, 0xde, 0x0c, 0xdf, 0x0c, 0xe0, 0x0c, 0xe1, 0x0c, 0xe2, 0x0c, 0xe3, 0x0c, 0xe4, 0x0c, 0xe5, 0x0c, 0xe6, 0x0c, 0xe7, 0x0c, 0xe8, 0x0c, 0xe9, 0x0c, 0xea, 0x0c, 0xeb, 0x0c, 0xec, 0x0c, 0xed, 0x0c, 0xee, 0x0c, 0xef, 0x0c, 0xf0, 0x0c, 0xf1, 0x0c, 0xf2, 0x0c, 0xf3, 0x0c, 0xf4, 0x0c, 0xf5, 0x0c, 0xf6, 0x0c, 0xf7, 0x0c, 0xf8, 0x0c, 0xf9, 0x0c, 0xfa, 0x0c, 0xfb, 0x0c, 0xfc, 0x0c, 0xfd, 0x0c, 0xfe, 0x0c, 0xff, 0x0d, 0x00, 0x0d, 0x01, 0x0d, 0x02, 0x0d, 0x03, 0x0d, 0x04, 0x0d, 0x05, 0x0d, 0x06, 0x0d, 0x07, 0x0d, 0x08, 0x0d, 0x09, 0x0d, 0x0a, 0x0d, 0x0b, 0x0d, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0d, 0x0f, 0x0d, 0x10, 0x0d, 0x11, 0x0d, 0x12, 0x0d, 0x13, 0x0d, 0x14, 0x0d, 0x15, 0x0d, 0x16, 0x0d, 0x17, 0x0d, 0x18, 0x0d, 0x19, 0x0d, 0x1a, 0x0d, 0x1b, 0x0d, 0x1c, 0x0d, 0x1d, 0x0d, 0x1e, 0x0d, 0x1f, 0x0d, 0x20, 0x0d, 0x21, 0x0d, 0x22, 0x0d, 0x23, 0x0d, 0x24, 0x0d, 0x25, 0x0d, 0x26, 0x0d, 0x27, 0x0d, 0x28, 0x0d, 0x29, 0x0d, 0x2a, 0x0d, 0x2b, 0x0d, 0x2c, 0x0d, 0x2d, 0x0d, 0x2e, 0x0d, 0x2f, 0x0d, 0x30, 0x0d, 0x31, 0x0d, 0x32, 0x0d, 0x33, 0x0d, 0x34, 0x0d, 0x35, 0x0d, 0x36, 0x0d, 0x37, 0x0d, 0x38, 0x0d, 0x39, 0x0d, 0x3a, 0x0d, 0x3b, 0x0d, 0x3c, 0x0d, 0x3d, 0x0d, 0x3e, 0x0d, 0x3f, 0x0d, 0x40, 0x0d, 0x41, 0x0d, 0x42, 0x0d, 0x43, 0x0d, 0x44, 0x0d, 0x45, 0x0d, 0x46, 0x0d, 0x47, 0x0d, 0x48, 0x0d, 0x49, 0x0d, 0x4a, 0x0d, 0x4b, 0x0d, 0x4c, 0x0d, 0x4d, 0x0d, 0x4e, 0x0d, 0x4f, 0x0d, 0x50, 0x0d, 0x51, 0x0d, 0x52, 0x0d, 0x53, 0x0d, 0x54, 0x0d, 0x55, 0x0d, 0x56, 0x0d, 0x57, 0x0d, 0x58, 0x0d, 0x59, 0x0d, 0x5a, 0x0d, 0x5b, 0x0d, 0x5c, 0x0d, 0x5d, 0x0d, 0x5e, 0x0d, 0x5f, 0x0d, 0x60, 0x0d, 0x61, 0x0d, 0x62, 0x0d, 0x63, 0x0d, 0x64, 0x0d, 0x65, 0x0d, 0x66, 0x0d, 0x67, 0x0d, 0x68, 0x0d, 0x69, 0x0d, 0x6a, 0x0d, 0x6b, 0x0d, 0x6c, 0x0d, 0x6d, 0x0d, 0x6e, 0x0d, 0x6f, 0x0d, 0x70, 0x0d, 0x71, 0x0d, 0x72, 0x0d, 0x73, 0x0d, 0x74, 0x0d, 0x75, 0x0d, 0x76, 0x0d, 0x77, 0x0d, 0x78, 0x0d, 0x79, 0x0d, 0x7a, 0x0d, 0x7b, 0x0d, 0x7c, 0x0d, 0x7d, 0x0d, 0x7e, 0x0d, 0x7f, 0x0d, 0x80, 0x0d, 0x81, 0x0d, 0x82, 0x0d, 0x83, 0x0d, 0x84, 0x0d, 0x85, 0x0d, 0x86, 0x0d, 0x87, 0x0d, 0x88, 0x0d, 0x89, 0x0d, 0x8a, 0x0d, 0x8b, 0x0d, 0x8c, 0x0d, 0x8d, 0x0d, 0x8e, 0x0d, 0x8f, 0x0d, 0x90, 0x0d, 0x91, 0x0d, 0x92, 0x0d, 0x93, 0x0d, 0x94, 0x0d, 0x95, 0x0d, 0x96, 0x0d, 0x97, 0x0d, 0x98, 0x0d, 0x99, 0x0d, 0x9a, 0x0d, 0x9b, 0x0d, 0x9c, 0x0d, 0x9d, 0x0d, 0x9e, 0x0d, 0x9f, 0x0d, 0xa0, 0x0d, 0xa1, 0x0d, 0xa2, 0x0d, 0xa3, 0x0d, 0xa4, 0x0d, 0xa5, 0x0d, 0xa6, 0x0d, 0xa7, 0x0d, 0xa8, 0x0d, 0xa9, 0x0d, 0xaa, 0x0d, 0xab, 0x0d, 0xac, 0x0d, 0xad, 0x0d, 0xae, 0x0d, 0xaf, 0x0d, 0xb0, 0x0d, 0xb1, 0x0d, 0xb2, 0x0d, 0xb3, 0x0d, 0xb4, 0x0d, 0xb5, 0x0d, 0xb6, 0x0d, 0xb7, 0x0d, 0xb8, 0x0d, 0xb9, 0x0d, 0xba, 0x0d, 0xbb, 0x0d, 0xbc, 0x0d, 0xbd, 0x0d, 0xbe, 0x0d, 0xbf, 0x0d, 0xc0, 0x0d, 0xc1, 0x0d, 0xc2, 0x0d, 0xc3, 0x0d, 0xc4, 0x0d, 0xc5, 0x0d, 0xc6, 0x0d, 0xc7, 0x0d, 0xc8, 0x0d, 0xc9, 0x0d, 0xca, 0x0d, 0xcb, 0x0d, 0xcc, 0x0d, 0xcd, 0x0d, 0xce, 0x0d, 0xcf, 0x0d, 0xd0, 0x0d, 0xd1, 0x0d, 0xd2, 0x0d, 0xd3, 0x0d, 0xd4, 0x0d, 0xd5, 0x0d, 0xd6, 0x0d, 0xd7, 0x0d, 0xd8, 0x0d, 0xd9, 0x0d, 0xda, 0x0d, 0xdb, 0x0d, 0xdc, 0x0d, 0xdd, 0x0d, 0xde, 0x0d, 0xdf, 0x0d, 0xe0, 0x0d, 0xe1, 0x0d, 0xe2, 0x0d, 0xe3, 0x0d, 0xe4, 0x0d, 0xe5, 0x0d, 0xe6, 0x0d, 0xe7, 0x0d, 0xe8, 0x0d, 0xe9, 0x0d, 0xea, 0x0d, 0xeb, 0x0d, 0xec, 0x0d, 0xed, 0x0d, 0xee, 0x0d, 0xef, 0x0d, 0xf0, 0x0d, 0xf1, 0x0d, 0xf2, 0x0d, 0xf3, 0x0d, 0xf4, 0x0d, 0xf5, 0x0d, 0xf6, 0x0d, 0xf7, 0x0d, 0xf8, 0x0d, 0xf9, 0x0d, 0xfa, 0x0d, 0xfb, 0x0d, 0xfc, 0x0d, 0xfd, 0x0d, 0xfe, 0x0d, 0xff, 0x0e, 0x00, 0x0e, 0x01, 0x0e, 0x02, 0x0e, 0x03, 0x0e, 0x04, 0x0e, 0x05, 0x0e, 0x06, 0x0e, 0x07, 0x0e, 0x08, 0x0e, 0x09, 0x0e, 0x0a, 0x0e, 0x0b, 0x0e, 0x0c, 0x0e, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0e, 0x10, 0x0e, 0x11, 0x0e, 0x12, 0x0e, 0x13, 0x0e, 0x14, 0x0e, 0x15, 0x0e, 0x16, 0x0e, 0x17, 0x0e, 0x18, 0x0e, 0x19, 0x0e, 0x1a, 0x0e, 0x1b, 0x0e, 0x1c, 0x0e, 0x1d, 0x0e, 0x1e, 0x0e, 0x1f, 0x0e, 0x20, 0x0e, 0x21, 0x0e, 0x22, 0x0e, 0x23, 0x0e, 0x24, 0x0e, 0x25, 0x0e, 0x26, 0x0e, 0x27, 0x0e, 0x28, 0x0e, 0x29, 0x0e, 0x2a, 0x0e, 0x2b, 0x0e, 0x2c, 0x0e, 0x2d, 0x0e, 0x2e, 0x0e, 0x2f, 0x0e, 0x30, 0x0e, 0x31, 0x0e, 0x32, 0x0e, 0x33, 0x0e, 0x34, 0x0e, 0x35, 0x0e, 0x36, 0x0e, 0x37, 0x0e, 0x38, 0x0e, 0x39, 0x0e, 0x3a, 0x0e, 0x3b, 0x0e, 0x3c, 0x0e, 0x3d, 0x0e, 0x3e, 0x0e, 0x3f, 0x0e, 0x40, 0x0e, 0x41, 0x0e, 0x42, 0x0e, 0x43, 0x0e, 0x44, 0x0e, 0x45, 0x0e, 0x46, 0x0e, 0x47, 0x0e, 0x48, 0x0e, 0x49, 0x0e, 0x4a, 0x0e, 0x4b, 0x0e, 0x4c, 0x0e, 0x4d, 0x0e, 0x4e, 0x0e, 0x4f, 0x0e, 0x50, 0x0e, 0x51, 0x0e, 0x52, 0x0e, 0x53, 0x0e, 0x54, 0x0e, 0x55, 0x0e, 0x56, 0x0e, 0x57, 0x0e, 0x58, 0x0e, 0x59, 0x0e, 0x5a, 0x0e, 0x5b, 0x0e, 0x5c, 0x0e, 0x5d, 0x0e, 0x5e, 0x0e, 0x5f, 0x0e, 0x60, 0x0e, 0x61, 0x0e, 0x62, 0x0e, 0x63, 0x0e, 0x64, 0x0e, 0x65, 0x0e, 0x66, 0x0e, 0x67, 0x0e, 0x68, 0x0e, 0x69, 0x0e, 0x6a, 0x0e, 0x6b, 0x0e, 0x6c, 0x0e, 0x6d, 0x0e, 0x6e, 0x0e, 0x6f, 0x0e, 0x70, 0x0e, 0x71, 0x0e, 0x72, 0x0e, 0x73, 0x0e, 0x74, 0x0e, 0x75, 0x0e, 0x76, 0x0e, 0x77, 0x0e, 0x78, 0x0e, 0x79, 0x0e, 0x7a, 0x0e, 0x7b, 0x0e, 0x7c, 0x0e, 0x7d, 0x0e, 0x7e, 0x0e, 0x7f, 0x0e, 0x80, 0x0e, 0x81, 0x0e, 0x82, 0x0e, 0x83, 0x0e, 0x84, 0x0e, 0x85, 0x0e, 0x86, 0x0e, 0x87, 0x0e, 0x88, 0x0e, 0x89, 0x0e, 0x8a, 0x0e, 0x8b, 0x0e, 0x8c, 0x0e, 0x8d, 0x0e, 0x8e, 0x0e, 0x8f, 0x0e, 0x90, 0x0e, 0x91, 0x0e, 0x92, 0x0e, 0x93, 0x0e, 0x94, 0x0e, 0x95, 0x0e, 0x96, 0x0e, 0x97, 0x0e, 0x98, 0x0e, 0x99, 0x0e, 0x9a, 0x0e, 0x9b, 0x0e, 0x9c, 0x0e, 0x9d, 0x0e, 0x9e, 0x0e, 0x9f, 0x0e, 0xa0, 0x0e, 0xa1, 0x0e, 0xa2, 0x0e, 0xa3, 0x0e, 0xa4, 0x0e, 0xa5, 0x0e, 0xa6, 0x0e, 0xa7, 0x0e, 0xa8, 0x0e, 0xa9, 0x0e, 0xaa, 0x0e, 0xab, 0x0e, 0xac, 0x0e, 0xad, 0x0e, 0xae, 0x0e, 0xaf, 0x0e, 0xb0, 0x0e, 0xb1, 0x0e, 0xb2, 0x0e, 0xb3, 0x0e, 0xb4, 0x0e, 0xb5, 0x0e, 0xb6, 0x0e, 0xb7, 0x0e, 0xb8, 0x0e, 0xb9, 0x0e, 0xba, 0x0e, 0xbb, 0x0e, 0xbc, 0x0e, 0xbd, 0x0e, 0xbe, 0x0e, 0xbf, 0x0e, 0xc0, 0x0e, 0xc1, 0x0e, 0xc2, 0x0e, 0xc3, 0x0e, 0xc4, 0x0e, 0xc5, 0x0e, 0xc6, 0x0e, 0xc7, 0x0e, 0xc8, 0x0e, 0xc9, 0x0e, 0xca, 0x0e, 0xcb, 0x0e, 0xcc, 0x0e, 0xcd, 0x0e, 0xce, 0x0e, 0xcf, 0x0e, 0xd0, 0x0e, 0xd1, 0x0e, 0xd2, 0x0e, 0xd3, 0x0e, 0xd4, 0x0e, 0xd5, 0x0e, 0xd6, 0x0e, 0xd7, 0x0e, 0xd8, 0x0e, 0xd9, 0x0e, 0xda, 0x0e, 0xdb, 0x0e, 0xdc, 0x0e, 0xdd, 0x0e, 0xde, 0x0e, 0xdf, 0x0e, 0xe0, 0x0e, 0xe1, 0x0e, 0xe2, 0x0e, 0xe3, 0x0e, 0xe4, 0x0e, 0xe5, 0x0e, 0xe6, 0x0e, 0xe7, 0x0e, 0xe8, 0x0e, 0xe9, 0x0e, 0xea, 0x0e, 0xeb, 0x0e, 0xec, 0x0e, 0xed, 0x0e, 0xee, 0x0e, 0xef, 0x0e, 0xf0, 0x0e, 0xf1, 0x0e, 0xf2, 0x0e, 0xf3, 0x0e, 0xf4, 0x0e, 0xf5, 0x0e, 0xf6, 0x0e, 0xf7, 0x0e, 0xf8, 0x0e, 0xf9, 0x0e, 0xfa, 0x0e, 0xfb, 0x0e, 0xfc, 0x0e, 0xfd, 0x0e, 0xfe, 0x0e, 0xff, 0x0f, 0x00, 0x0f, 0x01, 0x0f, 0x02, 0x0f, 0x03, 0x0f, 0x04, 0x0f, 0x05, 0x0f, 0x06, 0x0f, 0x07, 0x0f, 0x08, 0x0f, 0x09, 0x0f, 0x0a, 0x0f, 0x0b, 0x0f, 0x0c, 0x00, 0xc0, 0x00, 0xc1, 0x0f, 0x0d, 0x0f, 0x0e, 0x0f, 0x0f, 0x0f, 0x10, 0x0f, 0x11, 0x0f, 0x12, 0x0f, 0x13, 0x0f, 0x14, 0x0f, 0x15, 0x0f, 0x16, 0x0f, 0x17, 0x0f, 0x18, 0x0f, 0x19, 0x0f, 0x1a, 0x0f, 0x1b, 0x0f, 0x1c, 0x0f, 0x1d, 0x0f, 0x1e, 0x0f, 0x1f, 0x0f, 0x20, 0x0f, 0x21, 0x0f, 0x22, 0x0f, 0x23, 0x0f, 0x24, 0x0f, 0x25, 0x0f, 0x26, 0x0f, 0x27, 0x0f, 0x28, 0x0f, 0x29, 0x0f, 0x2a, 0x0f, 0x2b, 0x0f, 0x2c, 0x0f, 0x2d, 0x0f, 0x2e, 0x0f, 0x2f, 0x0f, 0x30, 0x0f, 0x31, 0x0f, 0x32, 0x0f, 0x33, 0x0f, 0x34, 0x0f, 0x35, 0x0f, 0x36, 0x0f, 0x37, 0x0f, 0x38, 0x0f, 0x39, 0x0f, 0x3a, 0x0f, 0x3b, 0x0f, 0x3c, 0x0f, 0x3d, 0x0f, 0x3e, 0x0f, 0x3f, 0x0f, 0x40, 0x0f, 0x41, 0x0f, 0x42, 0x0f, 0x43, 0x0f, 0x44, 0x0f, 0x45, 0x0f, 0x46, 0x0f, 0x47, 0x0f, 0x48, 0x0f, 0x49, 0x0f, 0x4a, 0x0f, 0x4b, 0x0f, 0x4c, 0x0f, 0x4d, 0x0f, 0x4e, 0x0f, 0x4f, 0x0f, 0x50, 0x0f, 0x51, 0x0f, 0x52, 0x0f, 0x53, 0x0f, 0x54, 0x0f, 0x55, 0x0f, 0x56, 0x0f, 0x57, 0x0f, 0x58, 0x0f, 0x59, 0x0f, 0x5a, 0x0f, 0x5b, 0x0f, 0x5c, 0x0f, 0x5d, 0x0f, 0x5e, 0x0f, 0x5f, 0x0f, 0x60, 0x0f, 0x61, 0x0f, 0x62, 0x0f, 0x63, 0x0f, 0x64, 0x0f, 0x65, 0x0f, 0x66, 0x0f, 0x67, 0x0f, 0x68, 0x0f, 0x69, 0x0f, 0x6a, 0x0f, 0x6b, 0x0f, 0x6c, 0x0f, 0x6d, 0x0f, 0x6e, 0x0f, 0x6f, 0x0f, 0x70, 0x0f, 0x71, 0x0f, 0x72, 0x0f, 0x73, 0x0f, 0x74, 0x0f, 0x75, 0x0f, 0x76, 0x0f, 0x77, 0x0f, 0x78, 0x0f, 0x79, 0x0f, 0x7a, 0x0f, 0x7b, 0x0f, 0x7c, 0x0f, 0x7d, 0x0f, 0x7e, 0x0f, 0x7f, 0x0f, 0x80, 0x0f, 0x81, 0x0f, 0x82, 0x0f, 0x83, 0x0f, 0x84, 0x0f, 0x85, 0x0f, 0x86, 0x0f, 0x87, 0x0f, 0x88, 0x0f, 0x89, 0x0f, 0x8a, 0x0f, 0x8b, 0x0f, 0x8c, 0x0f, 0x8d, 0x0f, 0x8e, 0x0f, 0x8f, 0x0f, 0x90, 0x0f, 0x91, 0x0f, 0x92, 0x0f, 0x93, 0x0f, 0x94, 0x0f, 0x95, 0x0f, 0x96, 0x0f, 0x97, 0x0f, 0x98, 0x0f, 0x99, 0x0f, 0x9a, 0x0f, 0x9b, 0x0f, 0x9c, 0x0f, 0x9d, 0x0f, 0x9e, 0x0f, 0x9f, 0x0f, 0xa0, 0x0f, 0xa1, 0x0f, 0xa2, 0x0f, 0xa3, 0x0f, 0xa4, 0x0f, 0xa5, 0x0f, 0xa6, 0x0f, 0xa7, 0x0f, 0xa8, 0x0f, 0xa9, 0x0f, 0xaa, 0x0f, 0xab, 0x0f, 0xac, 0x0f, 0xad, 0x0f, 0xae, 0x0f, 0xaf, 0x0f, 0xb0, 0x0f, 0xb1, 0x0f, 0xb2, 0x0f, 0xb3, 0x0f, 0xb4, 0x0f, 0xb5, 0x0f, 0xb6, 0x0f, 0xb7, 0x0f, 0xb8, 0x0f, 0xb9, 0x0f, 0xba, 0x0f, 0xbb, 0x0f, 0xbc, 0x0f, 0xbd, 0x0f, 0xbe, 0x0f, 0xbf, 0x0f, 0xc0, 0x0f, 0xc1, 0x0f, 0xc2, 0x0f, 0xc3, 0x0f, 0xc4, 0x0f, 0xc5, 0x0f, 0xc6, 0x0f, 0xc7, 0x0f, 0xc8, 0x0f, 0xc9, 0x0f, 0xca, 0x0f, 0xcb, 0x0f, 0xcc, 0x0f, 0xcd, 0x0f, 0xce, 0x0f, 0xcf, 0x0f, 0xd0, 0x0f, 0xd1, 0x0f, 0xd2, 0x0f, 0xd3, 0x0f, 0xd4, 0x0f, 0xd5, 0x0f, 0xd6, 0x0f, 0xd7, 0x0f, 0xd8, 0x0f, 0xd9, 0x0f, 0xda, 0x0f, 0xdb, 0x0f, 0xdc, 0x0f, 0xdd, 0x0f, 0xde, 0x0f, 0xdf, 0x0f, 0xe0, 0x0f, 0xe1, 0x0f, 0xe2, 0x0f, 0xe3, 0x0f, 0xe4, 0x0f, 0xe5, 0x0f, 0xe6, 0x0f, 0xe7, 0x0f, 0xe8, 0x0f, 0xe9, 0x0f, 0xea, 0x0f, 0xeb, 0x0f, 0xec, 0x0f, 0xed, 0x0f, 0xee, 0x0f, 0xef, 0x0f, 0xf0, 0x0f, 0xf1, 0x0f, 0xf2, 0x0f, 0xf3, 0x0f, 0xf4, 0x0f, 0xf5, 0x0f, 0xf6, 0x0f, 0xf7, 0x0f, 0xf8, 0x0f, 0xf9, 0x0f, 0xfa, 0x0f, 0xfb, 0x0f, 0xfc, 0x0f, 0xfd, 0x0f, 0xfe, 0x0f, 0xff, 0x10, 0x00, 0x10, 0x01, 0x10, 0x02, 0x10, 0x03, 0x10, 0x04, 0x10, 0x05, 0x10, 0x06, 0x10, 0x07, 0x10, 0x08, 0x10, 0x09, 0x10, 0x0a, 0x10, 0x0b, 0x10, 0x0c, 0x10, 0x0d, 0x10, 0x0e, 0x10, 0x0f, 0x10, 0x10, 0x10, 0x11, 0x10, 0x12, 0x10, 0x13, 0x10, 0x14, 0x10, 0x15, 0x10, 0x16, 0x10, 0x17, 0x10, 0x18, 0x10, 0x19, 0x10, 0x1a, 0x10, 0x1b, 0x10, 0x1c, 0x10, 0x1d, 0x10, 0x1e, 0x10, 0x1f, 0x10, 0x20, 0x10, 0x21, 0x10, 0x22, 0x10, 0x23, 0x10, 0x24, 0x10, 0x25, 0x10, 0x26, 0x10, 0x27, 0x10, 0x28, 0x10, 0x29, 0x10, 0x2a, 0x10, 0x2b, 0x10, 0x2c, 0x10, 0x2d, 0x10, 0x2e, 0x10, 0x2f, 0x10, 0x30, 0x10, 0x31, 0x10, 0x32, 0x10, 0x33, 0x10, 0x34, 0x10, 0x35, 0x10, 0x36, 0x10, 0x37, 0x10, 0x38, 0x10, 0x39, 0x10, 0x3a, 0x10, 0x3b, 0x10, 0x3c, 0x10, 0x3d, 0x10, 0x3e, 0x10, 0x3f, 0x10, 0x40, 0x10, 0x41, 0x10, 0x42, 0x10, 0x43, 0x10, 0x44, 0x10, 0x45, 0x10, 0x46, 0x10, 0x47, 0x10, 0x48, 0x10, 0x49, 0x10, 0x4a, 0x10, 0x4b, 0x10, 0x4c, 0x10, 0x4d, 0x10, 0x4e, 0x10, 0x4f, 0x10, 0x50, 0x10, 0x51, 0x10, 0x52, 0x10, 0x53, 0x10, 0x54, 0x10, 0x55, 0x10, 0x56, 0x10, 0x57, 0x10, 0x58, 0x10, 0x59, 0x10, 0x5a, 0x10, 0x5b, 0x10, 0x5c, 0x10, 0x5d, 0x10, 0x5e, 0x10, 0x5f, 0x10, 0x60, 0x10, 0x61, 0x10, 0x62, 0x10, 0x63, 0x10, 0x64, 0x10, 0x65, 0x10, 0x66, 0x10, 0x67, 0x10, 0x68, 0x10, 0x69, 0x10, 0x6a, 0x10, 0x6b, 0x10, 0x6c, 0x10, 0x6d, 0x10, 0x6e, 0x10, 0x6f, 0x10, 0x70, 0x10, 0x71, 0x10, 0x72, 0x10, 0x73, 0x10, 0x74, 0x10, 0x75, 0x10, 0x76, 0x10, 0x77, 0x10, 0x78, 0x10, 0x79, 0x10, 0x7a, 0x10, 0x7b, 0x10, 0x7c, 0x10, 0x7d, 0x10, 0x7e, 0x10, 0x7f, 0x10, 0x80, 0x10, 0x81, 0x10, 0x82, 0x10, 0x83, 0x10, 0x84, 0x10, 0x85, 0x10, 0x86, 0x10, 0x87, 0x10, 0x88, 0x10, 0x89, 0x10, 0x8a, 0x10, 0x8b, 0x10, 0x8c, 0x10, 0x8d, 0x10, 0x8e, 0x10, 0x8f, 0x10, 0x90, 0x10, 0x91, 0x10, 0x92, 0x10, 0x93, 0x10, 0x94, 0x10, 0x95, 0x10, 0x96, 0x10, 0x97, 0x10, 0x98, 0x10, 0x99, 0x10, 0x9a, 0x10, 0x9b, 0x10, 0x9c, 0x10, 0x9d, 0x10, 0x9e, 0x10, 0x9f, 0x10, 0xa0, 0x10, 0xa1, 0x10, 0xa2, 0x10, 0xa3, 0x10, 0xa4, 0x10, 0xa5, 0x10, 0xa6, 0x10, 0xa7, 0x10, 0xa8, 0x10, 0xa9, 0x10, 0xaa, 0x10, 0xab, 0x10, 0xac, 0x10, 0xad, 0x10, 0xae, 0x10, 0xaf, 0x10, 0xb0, 0x10, 0xb1, 0x10, 0xb2, 0x10, 0xb3, 0x10, 0xb4, 0x10, 0xb5, 0x10, 0xb6, 0x10, 0xb7, 0x10, 0xb8, 0x10, 0xb9, 0x10, 0xba, 0x10, 0xbb, 0x10, 0xbc, 0x10, 0xbd, 0x10, 0xbe, 0x10, 0xbf, 0x10, 0xc0, 0x10, 0xc1, 0x10, 0xc2, 0x10, 0xc3, 0x10, 0xc4, 0x10, 0xc5, 0x10, 0xc6, 0x10, 0xc7, 0x10, 0xc8, 0x10, 0xc9, 0x10, 0xca, 0x10, 0xcb, 0x10, 0xcc, 0x10, 0xcd, 0x10, 0xce, 0x10, 0xcf, 0x10, 0xd0, 0x10, 0xd1, 0x10, 0xd2, 0x10, 0xd3, 0x10, 0xd4, 0x10, 0xd5, 0x10, 0xd6, 0x10, 0xd7, 0x10, 0xd8, 0x10, 0xd9, 0x10, 0xda, 0x10, 0xdb, 0x10, 0xdc, 0x10, 0xdd, 0x10, 0xde, 0x10, 0xdf, 0x10, 0xe0, 0x10, 0xe1, 0x10, 0xe2, 0x10, 0xe3, 0x10, 0xe4, 0x10, 0xe5, 0x10, 0xe6, 0x10, 0xe7, 0x10, 0xe8, 0x10, 0xe9, 0x10, 0xea, 0x10, 0xeb, 0x10, 0xec, 0x10, 0xed, 0x10, 0xee, 0x10, 0xef, 0x10, 0xf0, 0x10, 0xf1, 0x10, 0xf2, 0x10, 0xf3, 0x10, 0xf4, 0x10, 0xf5, 0x10, 0xf6, 0x10, 0xf7, 0x10, 0xf8, 0x10, 0xf9, 0x10, 0xfa, 0x10, 0xfb, 0x10, 0xfc, 0x10, 0xfd, 0x10, 0xfe, 0x10, 0xff, 0x11, 0x00, 0x11, 0x01, 0x11, 0x02, 0x11, 0x03, 0x11, 0x04, 0x11, 0x05, 0x11, 0x06, 0x11, 0x07, 0x11, 0x08, 0x11, 0x09, 0x11, 0x0a, 0x11, 0x0b, 0x11, 0x0c, 0x11, 0x0d, 0x11, 0x0e, 0x11, 0x0f, 0x11, 0x10, 0x11, 0x11, 0x11, 0x12, 0x11, 0x13, 0x11, 0x14, 0x11, 0x15, 0x11, 0x16, 0x11, 0x17, 0x11, 0x18, 0x11, 0x19, 0x11, 0x1a, 0x11, 0x1b, 0x11, 0x1c, 0x11, 0x1d, 0x11, 0x1e, 0x11, 0x1f, 0x11, 0x20, 0x11, 0x21, 0x11, 0x22, 0x11, 0x23, 0x11, 0x24, 0x11, 0x25, 0x11, 0x26, 0x11, 0x27, 0x11, 0x28, 0x11, 0x29, 0x11, 0x2a, 0x11, 0x2b, 0x11, 0x2c, 0x11, 0x2d, 0x11, 0x2e, 0x11, 0x2f, 0x11, 0x30, 0x11, 0x31, 0x11, 0x32, 0x11, 0x33, 0x11, 0x34, 0x11, 0x35, 0x11, 0x36, 0x11, 0x37, 0x11, 0x38, 0x11, 0x39, 0x11, 0x3a, 0x11, 0x3b, 0x11, 0x3c, 0x11, 0x3d, 0x11, 0x3e, 0x11, 0x3f, 0x11, 0x40, 0x11, 0x41, 0x11, 0x42, 0x11, 0x43, 0x11, 0x44, 0x11, 0x45, 0x11, 0x46, 0x11, 0x47, 0x11, 0x48, 0x11, 0x49, 0x11, 0x4a, 0x11, 0x4b, 0x11, 0x4c, 0x11, 0x4d, 0x11, 0x4e, 0x11, 0x4f, 0x11, 0x50, 0x11, 0x51, 0x11, 0x52, 0x11, 0x53, 0x11, 0x54, 0x11, 0x55, 0x11, 0x56, 0x11, 0x57, 0x11, 0x58, 0x11, 0x59, 0x11, 0x5a, 0x11, 0x5b, 0x11, 0x5c, 0x11, 0x5d, 0x11, 0x5e, 0x11, 0x5f, 0x11, 0x60, 0x11, 0x61, 0x11, 0x62, 0x11, 0x63, 0x11, 0x64, 0x11, 0x65, 0x11, 0x66, 0x11, 0x67, 0x11, 0x68, 0x11, 0x69, 0x11, 0x6a, 0x11, 0x6b, 0x11, 0x6c, 0x11, 0x6d, 0x11, 0x6e, 0x11, 0x6f, 0x11, 0x70, 0x11, 0x71, 0x11, 0x72, 0x11, 0x73, 0x11, 0x74, 0x11, 0x75, 0x11, 0x76, 0x11, 0x77, 0x11, 0x78, 0x11, 0x79, 0x11, 0x7a, 0x11, 0x7b, 0x11, 0x7c, 0x11, 0x7d, 0x11, 0x7e, 0x11, 0x7f, 0x11, 0x80, 0x11, 0x81, 0x11, 0x82, 0x11, 0x83, 0x11, 0x84, 0x11, 0x85, 0x11, 0x86, 0x11, 0x87, 0x11, 0x88, 0x11, 0x89, 0x11, 0x8a, 0x11, 0x8b, 0x11, 0x8c, 0x11, 0x8d, 0x11, 0x8e, 0x11, 0x8f, 0x11, 0x90, 0x11, 0x91, 0x11, 0x92, 0x11, 0x93, 0x11, 0x94, 0x11, 0x95, 0x11, 0x96, 0x11, 0x97, 0x11, 0x98, 0x11, 0x99, 0x11, 0x9a, 0x11, 0x9b, 0x11, 0x9c, 0x11, 0x9d, 0x11, 0x9e, 0x11, 0x9f, 0x11, 0xa0, 0x11, 0xa1, 0x11, 0xa2, 0x11, 0xa3, 0x11, 0xa4, 0x11, 0xa5, 0x11, 0xa6, 0x11, 0xa7, 0x11, 0xa8, 0x11, 0xa9, 0x11, 0xaa, 0x11, 0xab, 0x11, 0xac, 0x11, 0xad, 0x11, 0xae, 0x11, 0xaf, 0x11, 0xb0, 0x11, 0xb1, 0x11, 0xb2, 0x11, 0xb3, 0x11, 0xb4, 0x11, 0xb5, 0x11, 0xb6, 0x11, 0xb7, 0x11, 0xb8, 0x11, 0xb9, 0x11, 0xba, 0x11, 0xbb, 0x11, 0xbc, 0x11, 0xbd, 0x11, 0xbe, 0x11, 0xbf, 0x11, 0xc0, 0x11, 0xc1, 0x11, 0xc2, 0x11, 0xc3, 0x11, 0xc4, 0x11, 0xc5, 0x11, 0xc6, 0x11, 0xc7, 0x11, 0xc8, 0x11, 0xc9, 0x11, 0xca, 0x11, 0xcb, 0x11, 0xcc, 0x11, 0xcd, 0x11, 0xce, 0x11, 0xcf, 0x11, 0xd0, 0x11, 0xd1, 0x11, 0xd2, 0x11, 0xd3, 0x11, 0xd4, 0x11, 0xd5, 0x11, 0xd6, 0x11, 0xd7, 0x11, 0xd8, 0x11, 0xd9, 0x11, 0xda, 0x11, 0xdb, 0x11, 0xdc, 0x11, 0xdd, 0x11, 0xde, 0x11, 0xdf, 0x11, 0xe0, 0x11, 0xe1, 0x11, 0xe2, 0x11, 0xe3, 0x11, 0xe4, 0x11, 0xe5, 0x11, 0xe6, 0x11, 0xe7, 0x11, 0xe8, 0x11, 0xe9, 0x11, 0xea, 0x11, 0xeb, 0x11, 0xec, 0x11, 0xed, 0x11, 0xee, 0x11, 0xef, 0x11, 0xf0, 0x11, 0xf1, 0x11, 0xf2, 0x11, 0xf3, 0x11, 0xf4, 0x11, 0xf5, 0x11, 0xf6, 0x11, 0xf7, 0x11, 0xf8, 0x11, 0xf9, 0x11, 0xfa, 0x11, 0xfb, 0x11, 0xfc, 0x11, 0xfd, 0x11, 0xfe, 0x11, 0xff, 0x12, 0x00, 0x12, 0x01, 0x12, 0x02, 0x12, 0x03, 0x12, 0x04, 0x12, 0x05, 0x12, 0x06, 0x12, 0x07, 0x12, 0x08, 0x12, 0x09, 0x12, 0x0a, 0x12, 0x0b, 0x12, 0x0c, 0x12, 0x0d, 0x12, 0x0e, 0x09, 0x73, 0x66, 0x74, 0x68, 0x79, 0x70, 0x68, 0x65, 0x6e, 0x07, 0x41, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x61, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x41, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x61, 0x62, 0x72, 0x65, 0x76, 0x65, 0x07, 0x41, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x61, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x0b, 0x43, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x63, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0a, 0x43, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x63, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x44, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x64, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x44, 0x63, 0x72, 0x6f, 0x61, 0x74, 0x07, 0x45, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x65, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x45, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x65, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0a, 0x45, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x65, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, 0x45, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x65, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x06, 0x45, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x65, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x0b, 0x47, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x67, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0a, 0x47, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x67, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x47, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x67, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0b, 0x48, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x68, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x04, 0x48, 0x62, 0x61, 0x72, 0x04, 0x68, 0x62, 0x61, 0x72, 0x06, 0x49, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x69, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x07, 0x49, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x69, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x49, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x69, 0x62, 0x72, 0x65, 0x76, 0x65, 0x07, 0x49, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x69, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x02, 0x49, 0x4a, 0x02, 0x69, 0x6a, 0x0b, 0x4a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x6a, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0c, 0x4b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6b, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x6c, 0x61, 0x6e, 0x64, 0x69, 0x63, 0x06, 0x4c, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x6c, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x4c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x4c, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6c, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x04, 0x4c, 0x64, 0x6f, 0x74, 0x04, 0x6c, 0x64, 0x6f, 0x74, 0x06, 0x4e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x6e, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x4e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x6e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x4e, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x6e, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x0b, 0x6e, 0x61, 0x70, 0x6f, 0x73, 0x74, 0x72, 0x6f, 0x70, 0x68, 0x65, 0x03, 0x45, 0x6e, 0x67, 0x03, 0x65, 0x6e, 0x67, 0x07, 0x4f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x6f, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x4f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x6f, 0x62, 0x72, 0x65, 0x76, 0x65, 0x0d, 0x4f, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0d, 0x6f, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x06, 0x52, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x72, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0c, 0x52, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x72, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x52, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x72, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x53, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x73, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x53, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x73, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0c, 0x54, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x74, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x06, 0x54, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x74, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x04, 0x54, 0x62, 0x61, 0x72, 0x04, 0x74, 0x62, 0x61, 0x72, 0x06, 0x55, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x06, 0x75, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x07, 0x55, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x07, 0x75, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x6e, 0x06, 0x55, 0x62, 0x72, 0x65, 0x76, 0x65, 0x06, 0x75, 0x62, 0x72, 0x65, 0x76, 0x65, 0x05, 0x55, 0x72, 0x69, 0x6e, 0x67, 0x05, 0x75, 0x72, 0x69, 0x6e, 0x67, 0x0d, 0x55, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0d, 0x75, 0x68, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x07, 0x55, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x07, 0x75, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x0b, 0x57, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x77, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x59, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x0b, 0x79, 0x63, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x06, 0x5a, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x7a, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x5a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0a, 0x7a, 0x64, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x05, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x39, 0x46, 0x05, 0x4f, 0x68, 0x6f, 0x72, 0x6e, 0x05, 0x6f, 0x68, 0x6f, 0x72, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x41, 0x45, 0x05, 0x55, 0x68, 0x6f, 0x72, 0x6e, 0x05, 0x75, 0x68, 0x6f, 0x72, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x35, 0x06, 0x47, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x06, 0x67, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x31, 0x46, 0x39, 0x0a, 0x41, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0a, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x41, 0x45, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x61, 0x65, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x4f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x61, 0x63, 0x75, 0x74, 0x65, 0x0b, 0x6f, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x61, 0x63, 0x75, 0x74, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x37, 0x0c, 0x53, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x36, 0x08, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x6a, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x46, 0x37, 0x09, 0x67, 0x72, 0x61, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x09, 0x61, 0x63, 0x75, 0x74, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x32, 0x09, 0x74, 0x69, 0x6c, 0x64, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x0d, 0x68, 0x6f, 0x6f, 0x6b, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x63, 0x6f, 0x6d, 0x62, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x32, 0x0c, 0x64, 0x6f, 0x74, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x63, 0x6f, 0x6d, 0x62, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x37, 0x45, 0x05, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0d, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x61, 0x6e, 0x6f, 0x74, 0x65, 0x6c, 0x65, 0x69, 0x61, 0x0c, 0x45, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x45, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x49, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x4f, 0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x11, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x05, 0x41, 0x6c, 0x70, 0x68, 0x61, 0x04, 0x42, 0x65, 0x74, 0x61, 0x05, 0x47, 0x61, 0x6d, 0x6d, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x39, 0x34, 0x07, 0x45, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x04, 0x5a, 0x65, 0x74, 0x61, 0x03, 0x45, 0x74, 0x61, 0x05, 0x54, 0x68, 0x65, 0x74, 0x61, 0x04, 0x49, 0x6f, 0x74, 0x61, 0x05, 0x4b, 0x61, 0x70, 0x70, 0x61, 0x06, 0x4c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x02, 0x4d, 0x75, 0x02, 0x4e, 0x75, 0x02, 0x58, 0x69, 0x07, 0x4f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x02, 0x50, 0x69, 0x03, 0x52, 0x68, 0x6f, 0x05, 0x53, 0x69, 0x67, 0x6d, 0x61, 0x03, 0x54, 0x61, 0x75, 0x07, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x03, 0x50, 0x68, 0x69, 0x03, 0x43, 0x68, 0x69, 0x03, 0x50, 0x73, 0x69, 0x0c, 0x49, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0f, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0a, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x08, 0x65, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x09, 0x69, 0x6f, 0x74, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x14, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x05, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x04, 0x62, 0x65, 0x74, 0x61, 0x05, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x05, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x07, 0x65, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x04, 0x7a, 0x65, 0x74, 0x61, 0x03, 0x65, 0x74, 0x61, 0x05, 0x74, 0x68, 0x65, 0x74, 0x61, 0x04, 0x69, 0x6f, 0x74, 0x61, 0x05, 0x6b, 0x61, 0x70, 0x70, 0x61, 0x06, 0x6c, 0x61, 0x6d, 0x62, 0x64, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x42, 0x43, 0x02, 0x6e, 0x75, 0x02, 0x78, 0x69, 0x07, 0x6f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x03, 0x72, 0x68, 0x6f, 0x06, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x31, 0x05, 0x73, 0x69, 0x67, 0x6d, 0x61, 0x03, 0x74, 0x61, 0x75, 0x07, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x03, 0x70, 0x68, 0x69, 0x03, 0x63, 0x68, 0x69, 0x03, 0x70, 0x73, 0x69, 0x05, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x0c, 0x69, 0x6f, 0x74, 0x61, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0f, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x0c, 0x6f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0c, 0x75, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x0a, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x74, 0x6f, 0x6e, 0x6f, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x30, 0x06, 0x74, 0x68, 0x65, 0x74, 0x61, 0x31, 0x08, 0x55, 0x70, 0x73, 0x69, 0x6c, 0x6f, 0x6e, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x34, 0x04, 0x70, 0x68, 0x69, 0x31, 0x06, 0x6f, 0x6d, 0x65, 0x67, 0x61, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x30, 0x35, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x44, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x37, 0x46, 0x06, 0x57, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, 0x77, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, 0x57, 0x61, 0x63, 0x75, 0x74, 0x65, 0x06, 0x77, 0x61, 0x63, 0x75, 0x74, 0x65, 0x09, 0x57, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x09, 0x77, 0x64, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x31, 0x06, 0x59, 0x67, 0x72, 0x61, 0x76, 0x65, 0x06, 0x79, 0x67, 0x72, 0x61, 0x76, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x31, 0x46, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x31, 0x0a, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x61, 0x73, 0x68, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x36, 0x0d, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x64, 0x62, 0x6c, 0x0d, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x33, 0x0e, 0x6f, 0x6e, 0x65, 0x64, 0x6f, 0x74, 0x65, 0x6e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x0e, 0x74, 0x77, 0x6f, 0x64, 0x6f, 0x74, 0x65, 0x6e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x31, 0x06, 0x6d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x06, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x42, 0x09, 0x65, 0x78, 0x63, 0x6c, 0x61, 0x6d, 0x64, 0x62, 0x6c, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x30, 0x0d, 0x63, 0x6f, 0x6c, 0x6f, 0x6e, 0x6d, 0x6f, 0x6e, 0x65, 0x74, 0x61, 0x72, 0x79, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x32, 0x04, 0x6c, 0x69, 0x72, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x36, 0x06, 0x70, 0x65, 0x73, 0x65, 0x74, 0x61, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x41, 0x04, 0x64, 0x6f, 0x6e, 0x67, 0x04, 0x45, 0x75, 0x72, 0x6f, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x30, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x30, 0x08, 0x49, 0x66, 0x72, 0x61, 0x6b, 0x74, 0x75, 0x72, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x37, 0x0b, 0x77, 0x65, 0x69, 0x65, 0x72, 0x73, 0x74, 0x72, 0x61, 0x73, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x42, 0x08, 0x52, 0x66, 0x72, 0x61, 0x6b, 0x74, 0x75, 0x72, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x44, 0x0c, 0x70, 0x72, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x44, 0x09, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x34, 0x05, 0x61, 0x6c, 0x65, 0x70, 0x68, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x32, 0x08, 0x6f, 0x6e, 0x65, 0x74, 0x68, 0x69, 0x72, 0x64, 0x09, 0x74, 0x77, 0x6f, 0x74, 0x68, 0x69, 0x72, 0x64, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x41, 0x09, 0x6f, 0x6e, 0x65, 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x0c, 0x74, 0x68, 0x72, 0x65, 0x65, 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x73, 0x0b, 0x66, 0x69, 0x76, 0x65, 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x73, 0x0c, 0x73, 0x65, 0x76, 0x65, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x74, 0x68, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x38, 0x39, 0x09, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x6c, 0x65, 0x66, 0x74, 0x07, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x0a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x72, 0x69, 0x67, 0x68, 0x74, 0x09, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x6f, 0x77, 0x6e, 0x09, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x62, 0x6f, 0x74, 0x68, 0x09, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x64, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x37, 0x0c, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x75, 0x70, 0x64, 0x6e, 0x62, 0x73, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x34, 0x0e, 0x63, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x43, 0x46, 0x0c, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x6c, 0x65, 0x66, 0x74, 0x0a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x75, 0x70, 0x0d, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x72, 0x69, 0x67, 0x68, 0x74, 0x0c, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x64, 0x6f, 0x77, 0x6e, 0x0c, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x64, 0x62, 0x6c, 0x62, 0x6f, 0x74, 0x68, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x46, 0x46, 0x09, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x31, 0x0b, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x34, 0x08, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x73, 0x65, 0x74, 0x08, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x07, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x6e, 0x6f, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x41, 0x08, 0x73, 0x75, 0x63, 0x68, 0x74, 0x68, 0x61, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x36, 0x0c, 0x61, 0x73, 0x74, 0x65, 0x72, 0x69, 0x73, 0x6b, 0x6d, 0x61, 0x74, 0x68, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x31, 0x43, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x0a, 0x6f, 0x72, 0x74, 0x68, 0x6f, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x05, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x36, 0x0a, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x61, 0x6e, 0x64, 0x09, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x6f, 0x72, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x05, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x33, 0x09, 0x74, 0x68, 0x65, 0x72, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x42, 0x07, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x34, 0x09, 0x63, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x65, 0x6e, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x35, 0x46, 0x0b, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x63, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x31, 0x0c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x0e, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x65, 0x74, 0x09, 0x6e, 0x6f, 0x74, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x35, 0x0c, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x78, 0x73, 0x75, 0x62, 0x73, 0x65, 0x74, 0x0e, 0x72, 0x65, 0x66, 0x6c, 0x65, 0x78, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x65, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x34, 0x0a, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x70, 0x6c, 0x75, 0x73, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x36, 0x0e, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x34, 0x0d, 0x70, 0x65, 0x72, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x34, 0x07, 0x64, 0x6f, 0x74, 0x6d, 0x61, 0x74, 0x68, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x32, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x31, 0x05, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x30, 0x46, 0x0d, 0x72, 0x65, 0x76, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x31, 0x46, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x74, 0x70, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x6c, 0x62, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x33, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x34, 0x36, 0x39, 0x08, 0x53, 0x46, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x31, 0x08, 0x53, 0x46, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x42, 0x08, 0x53, 0x46, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x30, 0x46, 0x08, 0x53, 0x46, 0x30, 0x33, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x33, 0x08, 0x53, 0x46, 0x30, 0x32, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x37, 0x08, 0x53, 0x46, 0x30, 0x34, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x42, 0x08, 0x53, 0x46, 0x30, 0x38, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x33, 0x08, 0x53, 0x46, 0x30, 0x39, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x42, 0x08, 0x53, 0x46, 0x30, 0x36, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x33, 0x08, 0x53, 0x46, 0x30, 0x37, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x42, 0x08, 0x53, 0x46, 0x30, 0x35, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x34, 0x46, 0x08, 0x53, 0x46, 0x34, 0x33, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x34, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x32, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x39, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x32, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x35, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x30, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x39, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x38, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x38, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x37, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x36, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x33, 0x37, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x32, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x31, 0x39, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x30, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x32, 0x33, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x37, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x38, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x31, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x35, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x36, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x30, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x34, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x35, 0x33, 0x30, 0x30, 0x30, 0x30, 0x08, 0x53, 0x46, 0x34, 0x34, 0x30, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x37, 0x46, 0x07, 0x75, 0x70, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x33, 0x07, 0x64, 0x6e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x37, 0x05, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x42, 0x07, 0x6c, 0x66, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x38, 0x46, 0x07, 0x72, 0x74, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x07, 0x6c, 0x74, 0x73, 0x68, 0x61, 0x64, 0x65, 0x05, 0x73, 0x68, 0x61, 0x64, 0x65, 0x07, 0x64, 0x6b, 0x73, 0x68, 0x61, 0x64, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x39, 0x46, 0x09, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x62, 0x6f, 0x78, 0x06, 0x48, 0x32, 0x32, 0x30, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x39, 0x06, 0x48, 0x31, 0x38, 0x35, 0x34, 0x33, 0x06, 0x48, 0x31, 0x38, 0x35, 0x35, 0x31, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x72, 0x65, 0x63, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x31, 0x07, 0x74, 0x72, 0x69, 0x61, 0x67, 0x75, 0x70, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x39, 0x07, 0x74, 0x72, 0x69, 0x61, 0x67, 0x72, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x42, 0x07, 0x74, 0x72, 0x69, 0x61, 0x67, 0x64, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x33, 0x07, 0x74, 0x72, 0x69, 0x61, 0x67, 0x6c, 0x66, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x39, 0x06, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x43, 0x45, 0x06, 0x48, 0x31, 0x38, 0x35, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x37, 0x09, 0x69, 0x6e, 0x76, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x09, 0x69, 0x6e, 0x76, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x35, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x62, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x35, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x39, 0x09, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0x66, 0x61, 0x63, 0x65, 0x0c, 0x69, 0x6e, 0x76, 0x73, 0x6d, 0x69, 0x6c, 0x65, 0x66, 0x61, 0x63, 0x65, 0x03, 0x73, 0x75, 0x6e, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x46, 0x06, 0x66, 0x65, 0x6d, 0x61, 0x6c, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x31, 0x04, 0x6d, 0x61, 0x6c, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x35, 0x46, 0x05, 0x73, 0x70, 0x61, 0x64, 0x65, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x32, 0x04, 0x63, 0x6c, 0x75, 0x62, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x34, 0x05, 0x68, 0x65, 0x61, 0x72, 0x74, 0x07, 0x64, 0x69, 0x61, 0x6d, 0x6f, 0x6e, 0x64, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x39, 0x0b, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x65, 0x0e, 0x6d, 0x75, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x6e, 0x6f, 0x74, 0x65, 0x64, 0x62, 0x6c, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x37, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x35, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x42, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x44, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x45, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x38, 0x46, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x43, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x43, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x44, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x44, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x44, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x44, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x44, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x44, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x45, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x39, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x38, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x39, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x41, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x41, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x42, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x41, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x42, 0x35, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x36, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x32, 0x43, 0x37, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x34, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x35, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x35, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x35, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x35, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x35, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x35, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x36, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x36, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x36, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x36, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x38, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x39, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x39, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x41, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x46, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x46, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x41, 0x37, 0x46, 0x46, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x2e, 0x35, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x2e, 0x35, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x2e, 0x35, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x2e, 0x35, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x2e, 0x35, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x2e, 0x34, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x2e, 0x34, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x2e, 0x34, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x2e, 0x34, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x2e, 0x34, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x2e, 0x33, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x2e, 0x33, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x2e, 0x33, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x2e, 0x33, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x2e, 0x33, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x2e, 0x32, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x2e, 0x32, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x2e, 0x32, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x2e, 0x32, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x2e, 0x32, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x35, 0x2e, 0x31, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x36, 0x2e, 0x31, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x37, 0x2e, 0x31, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x38, 0x2e, 0x31, 0x09, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x45, 0x39, 0x2e, 0x31, 0x04, 0x73, 0x74, 0x65, 0x6d, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x30, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x30, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x30, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x30, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x30, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x31, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x32, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x37, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x38, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x44, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x45, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x33, 0x46, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x34, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x34, 0x34, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x36, 0x43, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x34, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x35, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x42, 0x30, 0x36, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x32, 0x30, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x32, 0x31, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x32, 0x32, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x32, 0x33, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x39, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x41, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x42, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x43, 0x07, 0x75, 0x6e, 0x69, 0x46, 0x46, 0x46, 0x44, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x30, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x31, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x32, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x33, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x34, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x35, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x36, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x37, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x38, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x39, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x41, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x42, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x43, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x44, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x45, 0x06, 0x75, 0x31, 0x30, 0x33, 0x30, 0x46, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x30, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x31, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x32, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x33, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x34, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x35, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x36, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x37, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x38, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x39, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x41, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x42, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x43, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x44, 0x06, 0x75, 0x31, 0x30, 0x33, 0x31, 0x45, 0x06, 0x75, 0x31, 0x30, 0x33, 0x32, 0x30, 0x06, 0x75, 0x31, 0x30, 0x33, 0x32, 0x31, 0x06, 0x75, 0x31, 0x30, 0x33, 0x32, 0x32, 0x06, 0x75, 0x31, 0x30, 0x33, 0x32, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x30, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x31, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x32, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x34, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x35, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x36, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x37, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x38, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x39, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x41, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x42, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x43, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x44, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x45, 0x06, 0x75, 0x31, 0x44, 0x33, 0x30, 0x46, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x30, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x31, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x32, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x34, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x35, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x36, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x37, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x38, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x39, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x41, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x42, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x43, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x44, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x45, 0x06, 0x75, 0x31, 0x44, 0x33, 0x31, 0x46, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x30, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x31, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x32, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x34, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x35, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x36, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x37, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x38, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x39, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x41, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x42, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x43, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x44, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x45, 0x06, 0x75, 0x31, 0x44, 0x33, 0x32, 0x46, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x30, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x31, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x32, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x34, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x35, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x36, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x37, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x38, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x39, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x41, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x42, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x43, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x44, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x45, 0x06, 0x75, 0x31, 0x44, 0x33, 0x33, 0x46, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x30, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x31, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x32, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x34, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x35, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x36, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x37, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x38, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x39, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x41, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x42, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x43, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x44, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x45, 0x06, 0x75, 0x31, 0x44, 0x33, 0x34, 0x46, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x30, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x31, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x32, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x33, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x34, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x35, 0x06, 0x75, 0x31, 0x44, 0x33, 0x35, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x33, 0x38, 0x06, 0x75, 0x31, 0x44, 0x35, 0x33, 0x39, 0x06, 0x75, 0x31, 0x44, 0x35, 0x33, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x33, 0x43, 0x06, 0x75, 0x31, 0x44, 0x35, 0x33, 0x44, 0x06, 0x75, 0x31, 0x44, 0x35, 0x33, 0x45, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x31, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x33, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x34, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x41, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x43, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x44, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x45, 0x06, 0x75, 0x31, 0x44, 0x35, 0x34, 0x46, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x33, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x34, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x35, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x37, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x38, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x39, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x41, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x43, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x44, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x45, 0x06, 0x75, 0x31, 0x44, 0x35, 0x35, 0x46, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x31, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x33, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x34, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x35, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x37, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x38, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x39, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x41, 0x06, 0x75, 0x31, 0x44, 0x35, 0x36, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x31, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x33, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x34, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x35, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x37, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x38, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x39, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x41, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x43, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x44, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x45, 0x06, 0x75, 0x31, 0x44, 0x35, 0x41, 0x46, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x31, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x33, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x34, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x35, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x37, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x38, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x39, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x41, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x43, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x44, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x45, 0x06, 0x75, 0x31, 0x44, 0x35, 0x42, 0x46, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x31, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x33, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x34, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x35, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x36, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x37, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x38, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x39, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x41, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x42, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x43, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x44, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x45, 0x06, 0x75, 0x31, 0x44, 0x35, 0x43, 0x46, 0x06, 0x75, 0x31, 0x44, 0x35, 0x44, 0x30, 0x06, 0x75, 0x31, 0x44, 0x35, 0x44, 0x31, 0x06, 0x75, 0x31, 0x44, 0x35, 0x44, 0x32, 0x06, 0x75, 0x31, 0x44, 0x35, 0x44, 0x33, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x38, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x39, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x41, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x42, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x43, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x44, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x45, 0x06, 0x75, 0x31, 0x44, 0x37, 0x44, 0x46, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x30, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x31, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x32, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x33, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x34, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x35, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x36, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x37, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x38, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x39, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x41, 0x06, 0x75, 0x31, 0x44, 0x37, 0x45, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x33, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x34, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x35, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x36, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x37, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x38, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x39, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x39, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x39, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x39, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x30, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x41, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x42, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x43, 0x46, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x31, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x32, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x33, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x34, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x35, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x36, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x37, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x38, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x39, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x41, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x42, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x43, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x44, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x45, 0x06, 0x75, 0x31, 0x46, 0x30, 0x44, 0x46, 0x06, 0x75, 0x31, 0x46, 0x34, 0x32, 0x44, 0x06, 0x75, 0x31, 0x46, 0x34, 0x32, 0x45, 0x06, 0x75, 0x31, 0x46, 0x34, 0x33, 0x31, 0x06, 0x75, 0x31, 0x46, 0x34, 0x33, 0x35, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x30, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x31, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x32, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x33, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x34, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x35, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x36, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x37, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x38, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x39, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x41, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x42, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x43, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x44, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x45, 0x06, 0x75, 0x31, 0x46, 0x36, 0x30, 0x46, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x30, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x31, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x32, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x33, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x34, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x35, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x36, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x37, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x38, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x39, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x41, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x42, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x43, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x44, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x45, 0x06, 0x75, 0x31, 0x46, 0x36, 0x31, 0x46, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x30, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x31, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x32, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x33, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x35, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x36, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x37, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x38, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x39, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x41, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x42, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x44, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x45, 0x06, 0x75, 0x31, 0x46, 0x36, 0x32, 0x46, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x30, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x31, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x32, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x33, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x34, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x35, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x36, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x37, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x38, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x39, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x41, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x42, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x43, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x44, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x45, 0x06, 0x75, 0x31, 0x46, 0x36, 0x33, 0x46, 0x06, 0x75, 0x31, 0x46, 0x36, 0x34, 0x30, 0x09, 0x64, 0x6c, 0x4c, 0x74, 0x63, 0x61, 0x72, 0x6f, 0x6e, 0x08, 0x44, 0x69, 0x65, 0x72, 0x65, 0x73, 0x69, 0x73, 0x05, 0x41, 0x63, 0x75, 0x74, 0x65, 0x05, 0x54, 0x69, 0x6c, 0x64, 0x65, 0x05, 0x47, 0x72, 0x61, 0x76, 0x65, 0x0a, 0x43, 0x69, 0x72, 0x63, 0x75, 0x6d, 0x66, 0x6c, 0x65, 0x78, 0x05, 0x43, 0x61, 0x72, 0x6f, 0x6e, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x31, 0x31, 0x2e, 0x63, 0x61, 0x73, 0x65, 0x05, 0x42, 0x72, 0x65, 0x76, 0x65, 0x09, 0x44, 0x6f, 0x74, 0x61, 0x63, 0x63, 0x65, 0x6e, 0x74, 0x0c, 0x48, 0x75, 0x6e, 0x67, 0x61, 0x72, 0x75, 0x6d, 0x6c, 0x61, 0x75, 0x74, 0x0b, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x67, 0x72, 0x61, 0x76, 0x65, 0x0a, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x64, 0x6f, 0x74, 0x0c, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x32, 0x64, 0x6f, 0x74, 0x73, 0x0c, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x33, 0x64, 0x6f, 0x74, 0x73, 0x0e, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x33, 0x64, 0x6f, 0x74, 0x73, 0x5f, 0x61, 0x0e, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x32, 0x64, 0x6f, 0x74, 0x73, 0x5f, 0x61, 0x0c, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x34, 0x64, 0x6f, 0x74, 0x73, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x36, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x36, 0x45, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x36, 0x45, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x31, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x31, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x31, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x36, 0x46, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x36, 0x46, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x36, 0x46, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x41, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x41, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0b, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x72, 0x69, 0x6e, 0x67, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x37, 0x43, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x37, 0x43, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x37, 0x43, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x37, 0x44, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x37, 0x44, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x37, 0x44, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x31, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x31, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x31, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x32, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x32, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x32, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x35, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x35, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x46, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x46, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x46, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0e, 0x61, 0x72, 0x61, 0x62, 0x69, 0x63, 0x5f, 0x67, 0x61, 0x66, 0x5f, 0x62, 0x61, 0x72, 0x07, 0x45, 0x6e, 0x67, 0x2e, 0x61, 0x6c, 0x74, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x36, 0x38, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x0f, 0x75, 0x6e, 0x69, 0x30, 0x32, 0x39, 0x44, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x34, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x30, 0x38, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x37, 0x30, 0x33, 0x30, 0x34, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x30, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x30, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x34, 0x30, 0x33, 0x30, 0x30, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x34, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x38, 0x30, 0x33, 0x30, 0x43, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x38, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x43, 0x30, 0x33, 0x30, 0x37, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x33, 0x30, 0x33, 0x30, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x32, 0x30, 0x33, 0x30, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x32, 0x30, 0x33, 0x30, 0x30, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x32, 0x30, 0x33, 0x30, 0x33, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x30, 0x33, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x30, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x30, 0x30, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x36, 0x30, 0x33, 0x30, 0x39, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x32, 0x30, 0x33, 0x30, 0x39, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x33, 0x30, 0x31, 0x30, 0x33, 0x30, 0x37, 0x0a, 0x62, 0x72, 0x61, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x6f, 0x74, 0x05, 0x4a, 0x2e, 0x61, 0x6c, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x16, 0x75, 0x6e, 0x69, 0x46, 0x45, 0x41, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x74, 0x61, 0x72, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x35, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x35, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x43, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x43, 0x45, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x43, 0x45, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x32, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x05, 0x6c, 0x2e, 0x61, 0x6c, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x44, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x11, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x38, 0x2e, 0x6d, 0x6f, 0x6e, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x11, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x39, 0x2e, 0x6d, 0x6f, 0x6e, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x0f, 0x69, 0x6f, 0x67, 0x6f, 0x6e, 0x65, 0x6b, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x0f, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x38, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x0f, 0x75, 0x6e, 0x69, 0x32, 0x31, 0x34, 0x39, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x0f, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x32, 0x44, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x0f, 0x75, 0x6e, 0x69, 0x31, 0x45, 0x43, 0x42, 0x2e, 0x64, 0x6f, 0x74, 0x6c, 0x65, 0x73, 0x73, 0x03, 0x64, 0x63, 0x6f, 0x05, 0x49, 0x2e, 0x61, 0x6c, 0x74, 0x0a, 0x61, 0x72, 0x72, 0x6f, 0x77, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x35, 0x31, 0x30, 0x36, 0x34, 0x42, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x35, 0x31, 0x30, 0x36, 0x34, 0x43, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x34, 0x42, 0x30, 0x36, 0x35, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x35, 0x31, 0x30, 0x36, 0x34, 0x45, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x35, 0x31, 0x30, 0x36, 0x34, 0x46, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x34, 0x45, 0x30, 0x36, 0x35, 0x31, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x35, 0x34, 0x30, 0x36, 0x34, 0x45, 0x0b, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x35, 0x34, 0x30, 0x36, 0x34, 0x46, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x41, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x41, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x41, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x42, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x42, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x42, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x43, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x43, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x43, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x44, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x44, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x44, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x45, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x45, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x46, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x46, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x43, 0x46, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x30, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x30, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x30, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x31, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x31, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x31, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x32, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x32, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x32, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x33, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x33, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x33, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x34, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x34, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x34, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x35, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x35, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x36, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x36, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x36, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x37, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x37, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x37, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x38, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x38, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x38, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x39, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x39, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x39, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x41, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x41, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x41, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x42, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x42, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x42, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x43, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x43, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x43, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x44, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x44, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x44, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x45, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x45, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x46, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x46, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x44, 0x46, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x30, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x30, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x30, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x31, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x31, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x31, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x32, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x32, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x32, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x33, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x33, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x33, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x34, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x34, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x34, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x35, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x35, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x36, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x36, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x36, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x37, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x37, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x37, 0x45, 0x37, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x09, 0x52, 0x69, 0x6e, 0x67, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x30, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x31, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x32, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x33, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x34, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x35, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x36, 0x2e, 0x61, 0x6c, 0x74, 0x0b, 0x75, 0x6e, 0x69, 0x32, 0x36, 0x33, 0x37, 0x2e, 0x61, 0x6c, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x37, 0x45, 0x2e, 0x64, 0x69, 0x61, 0x63, 0x11, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x41, 0x2e, 0x62, 0x72, 0x65, 0x76, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x11, 0x75, 0x6e, 0x69, 0x30, 0x34, 0x38, 0x42, 0x2e, 0x62, 0x72, 0x65, 0x76, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x05, 0x79, 0x2e, 0x61, 0x6c, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x39, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x41, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x42, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x38, 0x46, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x30, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x33, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x34, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x36, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x37, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x39, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x41, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x41, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x41, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x42, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x42, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x42, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x43, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x43, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x43, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x44, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x44, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x44, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x45, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x45, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x46, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x46, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x39, 0x46, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x30, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x30, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x30, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x32, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x32, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x32, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x33, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x33, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x33, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x35, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x35, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x35, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x37, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x37, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x37, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x38, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x38, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x38, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x41, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x41, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x41, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x42, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x42, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x42, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x43, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x43, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x43, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x45, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x45, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x41, 0x45, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x30, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x30, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x30, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x32, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x32, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x32, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x34, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x34, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x34, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x36, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x36, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x36, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x37, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x37, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x37, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x38, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x38, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x38, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x39, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x39, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x39, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x43, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x43, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x43, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x44, 0x2e, 0x66, 0x69, 0x6e, 0x61, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x44, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x0c, 0x75, 0x6e, 0x69, 0x30, 0x36, 0x42, 0x44, 0x2e, 0x6d, 0x65, 0x64, 0x69, 0x00, 0x00, 0x00, 0xb8, 0x02, 0x80, 0x40, 0xff, 0xfb, 0xfe, 0x03, 0xfa, 0x14, 0x03, 0xf9, 0x25, 0x03, 0xf8, 0x32, 0x03, 0xf7, 0x96, 0x03, 0xf6, 0x0e, 0x03, 0xf5, 0xfe, 0x03, 0xf4, 0xfe, 0x03, 0xf3, 0x25, 0x03, 0xf2, 0x0e, 0x03, 0xf1, 0x96, 0x03, 0xf0, 0x25, 0x03, 0xef, 0x8a, 0x41, 0x05, 0xef, 0xfe, 0x03, 0xee, 0x96, 0x03, 0xed, 0x96, 0x03, 0xec, 0xfa, 0x03, 0xeb, 0xfa, 0x03, 0xea, 0xfe, 0x03, 0xe9, 0x3a, 0x03, 0xe8, 0x42, 0x03, 0xe7, 0xfe, 0x03, 0xe6, 0x32, 0x03, 0xe5, 0xe4, 0x53, 0x05, 0xe5, 0x96, 0x03, 0xe4, 0x8a, 0x41, 0x05, 0xe4, 0x53, 0x03, 0xe3, 0xe2, 0x2f, 0x05, 0xe3, 0xfa, 0x03, 0xe2, 0x2f, 0x03, 0xe1, 0xfe, 0x03, 0xe0, 0xfe, 0x03, 0xdf, 0x32, 0x03, 0xde, 0x14, 0x03, 0xdd, 0x96, 0x03, 0xdc, 0xfe, 0x03, 0xdb, 0x12, 0x03, 0xda, 0x7d, 0x03, 0xd9, 0xbb, 0x03, 0xd8, 0xfe, 0x03, 0xd6, 0x8a, 0x41, 0x05, 0xd6, 0x7d, 0x03, 0xd5, 0xd4, 0x47, 0x05, 0xd5, 0x7d, 0x03, 0xd4, 0x47, 0x03, 0xd3, 0xd2, 0x1b, 0x05, 0xd3, 0xfe, 0x03, 0xd2, 0x1b, 0x03, 0xd1, 0xfe, 0x03, 0xd0, 0xfe, 0x03, 0xcf, 0xfe, 0x03, 0xce, 0xfe, 0x03, 0xcd, 0x96, 0x03, 0xcc, 0xcb, 0x1e, 0x05, 0xcc, 0xfe, 0x03, 0xcb, 0x1e, 0x03, 0xca, 0x32, 0x03, 0xc9, 0xfe, 0x03, 0xc6, 0x85, 0x11, 0x05, 0xc6, 0x1c, 0x03, 0xc5, 0x16, 0x03, 0xc4, 0xfe, 0x03, 0xc3, 0xfe, 0x03, 0xc2, 0xfe, 0x03, 0xc1, 0xfe, 0x03, 0xc0, 0xfe, 0x03, 0xbf, 0xfe, 0x03, 0xbe, 0xfe, 0x03, 0xbd, 0xfe, 0x03, 0xbc, 0xfe, 0x03, 0xbb, 0xfe, 0x03, 0xba, 0x11, 0x03, 0xb9, 0x86, 0x25, 0x05, 0xb9, 0xfe, 0x03, 0xb8, 0xb7, 0xbb, 0x05, 0xb8, 0xfe, 0x03, 0xb7, 0xb6, 0x5d, 0x05, 0xb7, 0xbb, 0x03, 0xb7, 0x80, 0x04, 0xb6, 0xb5, 0x25, 0x05, 0xb6, 0x5d, 0x40, 0xff, 0x03, 0xb6, 0x40, 0x04, 0xb5, 0x25, 0x03, 0xb4, 0xfe, 0x03, 0xb3, 0x96, 0x03, 0xb2, 0xfe, 0x03, 0xb1, 0xfe, 0x03, 0xb0, 0xfe, 0x03, 0xaf, 0xfe, 0x03, 0xae, 0x64, 0x03, 0xad, 0x0e, 0x03, 0xac, 0xab, 0x25, 0x05, 0xac, 0x64, 0x03, 0xab, 0xaa, 0x12, 0x05, 0xab, 0x25, 0x03, 0xaa, 0x12, 0x03, 0xa9, 0x8a, 0x41, 0x05, 0xa9, 0xfa, 0x03, 0xa8, 0xfe, 0x03, 0xa7, 0xfe, 0x03, 0xa6, 0xfe, 0x03, 0xa5, 0x12, 0x03, 0xa4, 0xfe, 0x03, 0xa3, 0xa2, 0x0e, 0x05, 0xa3, 0x32, 0x03, 0xa2, 0x0e, 0x03, 0xa1, 0x64, 0x03, 0xa0, 0x8a, 0x41, 0x05, 0xa0, 0x96, 0x03, 0x9f, 0xfe, 0x03, 0x9e, 0x9d, 0x0c, 0x05, 0x9e, 0xfe, 0x03, 0x9d, 0x0c, 0x03, 0x9c, 0x9b, 0x19, 0x05, 0x9c, 0x64, 0x03, 0x9b, 0x9a, 0x10, 0x05, 0x9b, 0x19, 0x03, 0x9a, 0x10, 0x03, 0x99, 0x0a, 0x03, 0x98, 0xfe, 0x03, 0x97, 0x96, 0x0d, 0x05, 0x97, 0xfe, 0x03, 0x96, 0x0d, 0x03, 0x95, 0x8a, 0x41, 0x05, 0x95, 0x96, 0x03, 0x94, 0x93, 0x0e, 0x05, 0x94, 0x28, 0x03, 0x93, 0x0e, 0x03, 0x92, 0xfa, 0x03, 0x91, 0x90, 0xbb, 0x05, 0x91, 0xfe, 0x03, 0x90, 0x8f, 0x5d, 0x05, 0x90, 0xbb, 0x03, 0x90, 0x80, 0x04, 0x8f, 0x8e, 0x25, 0x05, 0x8f, 0x5d, 0x03, 0x8f, 0x40, 0x04, 0x8e, 0x25, 0x03, 0x8d, 0xfe, 0x03, 0x8c, 0x8b, 0x2e, 0x05, 0x8c, 0xfe, 0x03, 0x8b, 0x2e, 0x03, 0x8a, 0x86, 0x25, 0x05, 0x8a, 0x41, 0x03, 0x89, 0x88, 0x0b, 0x05, 0x89, 0x14, 0x03, 0x88, 0x0b, 0x03, 0x87, 0x86, 0x25, 0x05, 0x87, 0x64, 0x03, 0x86, 0x85, 0x11, 0x05, 0x86, 0x25, 0x03, 0x85, 0x11, 0x03, 0x84, 0xfe, 0x03, 0x83, 0x82, 0x11, 0x05, 0x83, 0xfe, 0x03, 0x82, 0x11, 0x03, 0x81, 0xfe, 0x03, 0x80, 0xfe, 0x03, 0x7f, 0xfe, 0x03, 0x40, 0xff, 0x7e, 0x7d, 0x7d, 0x05, 0x7e, 0xfe, 0x03, 0x7d, 0x7d, 0x03, 0x7c, 0x64, 0x03, 0x7b, 0x54, 0x15, 0x05, 0x7b, 0x25, 0x03, 0x7a, 0xfe, 0x03, 0x79, 0xfe, 0x03, 0x78, 0x0e, 0x03, 0x77, 0x0c, 0x03, 0x76, 0x0a, 0x03, 0x75, 0xfe, 0x03, 0x74, 0xfa, 0x03, 0x73, 0xfa, 0x03, 0x72, 0xfa, 0x03, 0x71, 0xfa, 0x03, 0x70, 0xfe, 0x03, 0x6f, 0xfe, 0x03, 0x6e, 0xfe, 0x03, 0x6c, 0x21, 0x03, 0x6b, 0xfe, 0x03, 0x6a, 0x11, 0x42, 0x05, 0x6a, 0x53, 0x03, 0x69, 0xfe, 0x03, 0x68, 0x7d, 0x03, 0x67, 0x11, 0x42, 0x05, 0x66, 0xfe, 0x03, 0x65, 0xfe, 0x03, 0x64, 0xfe, 0x03, 0x63, 0xfe, 0x03, 0x62, 0xfe, 0x03, 0x61, 0x3a, 0x03, 0x60, 0xfa, 0x03, 0x5e, 0x0c, 0x03, 0x5d, 0xfe, 0x03, 0x5b, 0xfe, 0x03, 0x5a, 0xfe, 0x03, 0x59, 0x58, 0x0a, 0x05, 0x59, 0xfa, 0x03, 0x58, 0x0a, 0x03, 0x57, 0x16, 0x19, 0x05, 0x57, 0x32, 0x03, 0x56, 0xfe, 0x03, 0x55, 0x54, 0x15, 0x05, 0x55, 0x42, 0x03, 0x54, 0x15, 0x03, 0x53, 0x01, 0x10, 0x05, 0x53, 0x18, 0x03, 0x52, 0x14, 0x03, 0x51, 0x4a, 0x13, 0x05, 0x51, 0xfe, 0x03, 0x50, 0x0b, 0x03, 0x4f, 0xfe, 0x03, 0x4e, 0x4d, 0x10, 0x05, 0x4e, 0xfe, 0x03, 0x4d, 0x10, 0x03, 0x4c, 0xfe, 0x03, 0x4b, 0x4a, 0x13, 0x05, 0x4b, 0xfe, 0x03, 0x4a, 0x49, 0x10, 0x05, 0x4a, 0x13, 0x03, 0x49, 0x1d, 0x0d, 0x05, 0x49, 0x10, 0x03, 0x48, 0x0d, 0x03, 0x47, 0xfe, 0x03, 0x46, 0x96, 0x03, 0x45, 0x96, 0x03, 0x44, 0xfe, 0x03, 0x43, 0x02, 0x2d, 0x05, 0x43, 0xfa, 0x03, 0x42, 0xbb, 0x03, 0x41, 0x4b, 0x03, 0x40, 0xfe, 0x03, 0x3f, 0xfe, 0x03, 0x3e, 0x3d, 0x12, 0x05, 0x3e, 0x14, 0x03, 0x3d, 0x3c, 0x0f, 0x05, 0x3d, 0x12, 0x03, 0x3c, 0x3b, 0x0d, 0x05, 0x3c, 0x40, 0xff, 0x0f, 0x03, 0x3b, 0x0d, 0x03, 0x3a, 0xfe, 0x03, 0x39, 0xfe, 0x03, 0x38, 0x37, 0x14, 0x05, 0x38, 0xfa, 0x03, 0x37, 0x36, 0x10, 0x05, 0x37, 0x14, 0x03, 0x36, 0x35, 0x0b, 0x05, 0x36, 0x10, 0x03, 0x35, 0x0b, 0x03, 0x34, 0x1e, 0x03, 0x33, 0x0d, 0x03, 0x32, 0x31, 0x0b, 0x05, 0x32, 0xfe, 0x03, 0x31, 0x0b, 0x03, 0x30, 0x2f, 0x0b, 0x05, 0x30, 0x0d, 0x03, 0x2f, 0x0b, 0x03, 0x2e, 0x2d, 0x09, 0x05, 0x2e, 0x10, 0x03, 0x2d, 0x09, 0x03, 0x2c, 0x32, 0x03, 0x2b, 0x2a, 0x25, 0x05, 0x2b, 0x64, 0x03, 0x2a, 0x29, 0x12, 0x05, 0x2a, 0x25, 0x03, 0x29, 0x12, 0x03, 0x28, 0x27, 0x25, 0x05, 0x28, 0x41, 0x03, 0x27, 0x25, 0x03, 0x26, 0x25, 0x0b, 0x05, 0x26, 0x0f, 0x03, 0x25, 0x0b, 0x03, 0x24, 0xfe, 0x03, 0x23, 0xfe, 0x03, 0x22, 0x0f, 0x03, 0x21, 0x01, 0x10, 0x05, 0x21, 0x12, 0x03, 0x20, 0x64, 0x03, 0x1f, 0xfa, 0x03, 0x1e, 0x1d, 0x0d, 0x05, 0x1e, 0x64, 0x03, 0x1d, 0x0d, 0x03, 0x1c, 0x11, 0x42, 0x05, 0x1c, 0xfe, 0x03, 0x1b, 0xfa, 0x03, 0x1a, 0x42, 0x03, 0x19, 0x11, 0x42, 0x05, 0x19, 0xfe, 0x03, 0x18, 0x64, 0x03, 0x17, 0x16, 0x19, 0x05, 0x17, 0xfe, 0x03, 0x16, 0x01, 0x10, 0x05, 0x16, 0x19, 0x03, 0x15, 0xfe, 0x03, 0x14, 0xfe, 0x03, 0x13, 0xfe, 0x03, 0x12, 0x11, 0x42, 0x05, 0x12, 0xfe, 0x03, 0x11, 0x02, 0x2d, 0x05, 0x11, 0x42, 0x03, 0x10, 0x7d, 0x03, 0x0f, 0x64, 0x03, 0x0e, 0xfe, 0x03, 0x0d, 0x0c, 0x16, 0x05, 0x0d, 0xfe, 0x03, 0x0c, 0x01, 0x10, 0x05, 0x0c, 0x16, 0x03, 0x0b, 0xfe, 0x03, 0x0a, 0x10, 0x03, 0x09, 0xfe, 0x03, 0x08, 0x02, 0x2d, 0x05, 0x08, 0xfe, 0x03, 0x07, 0x14, 0x03, 0x06, 0x64, 0x03, 0x04, 0x01, 0x10, 0x05, 0x04, 0xfe, 0x03, 0x40, 0x15, 0x03, 0x02, 0x2d, 0x05, 0x03, 0xfe, 0x03, 0x02, 0x01, 0x10, 0x05, 0x02, 0x2d, 0x03, 0x01, 0x10, 0x03, 0x00, 0xfe, 0x03, 0x01, 0xb8, 0x01, 0x64, 0x85, 0x8d, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x1d }; unsigned int dejavu_sans_condensed_ttf_len = 552620; #endif mapserver-8.6.0/src/dxfcolor.h000066400000000000000000000107731511405061000163120ustar00rootroot00000000000000struct dxfcolor { int r, g, b; }; struct dxfcolor ctable[256] = { {0, 0, 0}, {255, 0, 0}, {255, 255, 0}, {0, 255, 0}, {0, 255, 255}, {0, 0, 255}, {255, 0, 255}, {255, 255, 255}, {128, 128, 128}, {192, 192, 192}, {255, 0, 0}, {255, 127, 127}, {204, 0, 0}, {204, 102, 102}, {153, 0, 0}, {153, 76, 76}, {127, 0, 0}, {127, 63, 63}, {76, 0, 0}, {76, 38, 38}, {255, 63, 0}, {255, 159, 127}, {204, 51, 0}, {204, 127, 102}, {153, 38, 0}, {153, 95, 76}, {127, 31, 0}, {127, 79, 63}, {76, 19, 0}, {76, 47, 38}, {255, 127, 0}, {255, 191, 127}, {204, 102, 0}, {204, 153, 102}, {153, 76, 0}, {153, 114, 76}, {127, 63, 0}, {127, 95, 63}, {76, 38, 0}, {76, 57, 38}, {255, 191, 0}, {255, 223, 127}, {204, 153, 0}, {204, 178, 102}, {153, 114, 0}, {153, 133, 76}, {127, 95, 0}, {127, 111, 63}, {76, 57, 0}, {76, 66, 38}, {255, 255, 0}, {255, 255, 127}, {204, 204, 0}, {204, 204, 102}, {153, 153, 0}, {153, 153, 76}, {127, 127, 0}, {127, 127, 63}, {76, 76, 0}, {76, 76, 38}, {191, 255, 0}, {223, 255, 127}, {153, 204, 0}, {178, 204, 102}, {114, 153, 0}, {133, 153, 76}, {95, 127, 0}, {111, 127, 63}, {57, 76, 0}, {66, 76, 38}, {127, 255, 0}, {191, 255, 127}, {102, 204, 0}, {153, 204, 102}, {76, 153, 0}, {114, 153, 76}, {63, 127, 0}, {95, 127, 63}, {38, 76, 0}, {57, 76, 38}, {63, 255, 0}, {159, 255, 127}, {51, 204, 0}, {127, 204, 102}, {38, 153, 0}, {95, 153, 76}, {31, 127, 0}, {79, 127, 63}, {19, 76, 0}, {47, 76, 38}, {0, 255, 0}, {127, 255, 127}, {0, 204, 0}, {102, 204, 102}, {0, 153, 0}, {76, 153, 76}, {0, 127, 0}, {63, 127, 63}, {0, 76, 0}, {38, 76, 38}, {0, 255, 63}, {127, 255, 159}, {0, 204, 51}, {102, 204, 127}, {0, 153, 38}, {76, 153, 95}, {0, 127, 31}, {63, 127, 79}, {0, 76, 19}, {38, 76, 47}, {0, 255, 127}, {127, 255, 191}, {0, 204, 102}, {102, 204, 153}, {0, 153, 76}, {76, 153, 114}, {0, 127, 63}, {63, 127, 95}, {0, 76, 38}, {38, 76, 57}, {0, 255, 191}, {127, 255, 223}, {0, 204, 153}, {102, 204, 178}, {0, 153, 114}, {76, 153, 133}, {0, 127, 95}, {63, 127, 111}, {0, 76, 57}, {38, 76, 66}, {0, 255, 255}, {127, 255, 255}, {0, 204, 204}, {102, 204, 204}, {0, 153, 153}, {76, 153, 153}, {0, 127, 127}, {63, 127, 127}, {0, 76, 76}, {38, 76, 76}, {0, 191, 255}, {127, 223, 255}, {0, 153, 204}, {102, 178, 204}, {0, 114, 153}, {76, 133, 153}, {0, 95, 127}, {63, 111, 127}, {0, 57, 76}, {38, 66, 76}, {0, 127, 255}, {127, 191, 255}, {0, 102, 204}, {102, 153, 204}, {0, 76, 153}, {76, 114, 153}, {0, 63, 127}, {63, 95, 127}, {0, 38, 76}, {38, 57, 76}, {0, 63, 255}, {127, 159, 255}, {0, 51, 204}, {102, 127, 204}, {0, 38, 153}, {76, 95, 153}, {0, 31, 127}, {63, 79, 127}, {0, 19, 76}, {38, 47, 76}, {0, 0, 255}, {127, 127, 255}, {0, 0, 204}, {102, 102, 204}, {0, 0, 153}, {76, 76, 153}, {0, 0, 127}, {63, 63, 127}, {0, 0, 76}, {38, 38, 76}, {63, 0, 255}, {159, 127, 255}, {51, 0, 204}, {127, 102, 204}, {38, 0, 153}, {95, 76, 153}, {31, 0, 127}, {79, 63, 127}, {19, 0, 76}, {47, 38, 76}, {127, 0, 255}, {191, 127, 255}, {102, 0, 204}, {153, 102, 204}, {76, 0, 153}, {114, 76, 153}, {63, 0, 127}, {95, 63, 127}, {38, 0, 76}, {57, 38, 76}, {191, 0, 255}, {223, 127, 255}, {153, 0, 204}, {178, 102, 204}, {114, 0, 153}, {133, 76, 153}, {95, 0, 127}, {111, 63, 127}, {57, 0, 76}, {66, 38, 76}, {255, 0, 255}, {255, 127, 255}, {204, 0, 204}, {204, 102, 204}, {153, 0, 153}, {153, 76, 153}, {127, 0, 127}, {127, 63, 127}, {76, 0, 76}, {76, 38, 76}, {255, 0, 191}, {255, 127, 223}, {204, 0, 153}, {204, 102, 178}, {153, 0, 114}, {153, 76, 133}, {127, 0, 95}, {127, 63, 111}, {76, 0, 57}, {76, 38, 66}, {255, 0, 127}, {255, 127, 191}, {204, 0, 102}, {204, 102, 153}, {153, 0, 76}, {153, 76, 114}, {127, 0, 63}, {127, 63, 95}, {76, 0, 38}, {76, 38, 57}, {255, 0, 63}, {255, 127, 159}, {204, 0, 51}, {204, 102, 127}, {153, 0, 38}, {153, 76, 95}, {127, 0, 31}, {127, 63, 79}, {76, 0, 19}, {76, 38, 47}, {51, 51, 51}, {91, 91, 91}, {132, 132, 132}, {173, 173, 173}, {214, 214, 214}, {255, 255, 255}, }; mapserver-8.6.0/src/flatgeobuf/000077500000000000000000000000001511405061000164275ustar00rootroot00000000000000mapserver-8.6.0/src/flatgeobuf/LICENSE000066400000000000000000000023671511405061000174440ustar00rootroot00000000000000Copyright (c) 2018, Björn Harrtell Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mapserver-8.6.0/src/flatgeobuf/feature_generated.h000066400000000000000000000242351511405061000222570ustar00rootroot00000000000000// automatically generated by the FlatBuffers compiler, do not modify #ifndef FLATBUFFERS_GENERATED_FEATURE_FLATGEOBUF_H_ #define FLATBUFFERS_GENERATED_FEATURE_FLATGEOBUF_H_ #include "flatbuffers/flatbuffers.h" // Ensure the included flatbuffers.h is the same version as when this file was // generated, otherwise it may not be compatible. static_assert(FLATBUFFERS_VERSION_MAJOR == 2 && FLATBUFFERS_VERSION_MINOR == 0 && FLATBUFFERS_VERSION_REVISION == 6, "Non-compatible flatbuffers version included"); #include "header_generated.h" namespace mapserver { namespace FlatGeobuf { struct Geometry; struct GeometryBuilder; struct Feature; struct FeatureBuilder; struct Geometry FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef GeometryBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_ENDS = 4, VT_XY = 6, VT_Z = 8, VT_M = 10, VT_T = 12, VT_TM = 14, VT_TYPE = 16, VT_PARTS = 18 }; const flatbuffers::Vector *ends() const { return GetPointer *>(VT_ENDS); } const flatbuffers::Vector *xy() const { return GetPointer *>(VT_XY); } const flatbuffers::Vector *z() const { return GetPointer *>(VT_Z); } const flatbuffers::Vector *m() const { return GetPointer *>(VT_M); } const flatbuffers::Vector *t() const { return GetPointer *>(VT_T); } const flatbuffers::Vector *tm() const { return GetPointer *>(VT_TM); } FlatGeobuf::GeometryType type() const { return static_cast(GetField(VT_TYPE, 0)); } const flatbuffers::Vector> *parts() const { return GetPointer> *>(VT_PARTS); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_ENDS) && verifier.VerifyVector(ends()) && VerifyOffset(verifier, VT_XY) && verifier.VerifyVector(xy()) && VerifyOffset(verifier, VT_Z) && verifier.VerifyVector(z()) && VerifyOffset(verifier, VT_M) && verifier.VerifyVector(m()) && VerifyOffset(verifier, VT_T) && verifier.VerifyVector(t()) && VerifyOffset(verifier, VT_TM) && verifier.VerifyVector(tm()) && VerifyField(verifier, VT_TYPE, 1) && VerifyOffset(verifier, VT_PARTS) && verifier.VerifyVector(parts()) && verifier.VerifyVectorOfTables(parts()) && verifier.EndTable(); } }; struct GeometryBuilder { typedef Geometry Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_ends(flatbuffers::Offset> ends) { fbb_.AddOffset(Geometry::VT_ENDS, ends); } void add_xy(flatbuffers::Offset> xy) { fbb_.AddOffset(Geometry::VT_XY, xy); } void add_z(flatbuffers::Offset> z) { fbb_.AddOffset(Geometry::VT_Z, z); } void add_m(flatbuffers::Offset> m) { fbb_.AddOffset(Geometry::VT_M, m); } void add_t(flatbuffers::Offset> t) { fbb_.AddOffset(Geometry::VT_T, t); } void add_tm(flatbuffers::Offset> tm) { fbb_.AddOffset(Geometry::VT_TM, tm); } void add_type(FlatGeobuf::GeometryType type) { fbb_.AddElement(Geometry::VT_TYPE, static_cast(type), 0); } void add_parts(flatbuffers::Offset>> parts) { fbb_.AddOffset(Geometry::VT_PARTS, parts); } explicit GeometryBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); return o; } }; inline flatbuffers::Offset CreateGeometry( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset> ends = 0, flatbuffers::Offset> xy = 0, flatbuffers::Offset> z = 0, flatbuffers::Offset> m = 0, flatbuffers::Offset> t = 0, flatbuffers::Offset> tm = 0, FlatGeobuf::GeometryType type = FlatGeobuf::GeometryType::Unknown, flatbuffers::Offset>> parts = 0) { GeometryBuilder builder_(_fbb); builder_.add_parts(parts); builder_.add_tm(tm); builder_.add_t(t); builder_.add_m(m); builder_.add_z(z); builder_.add_xy(xy); builder_.add_ends(ends); builder_.add_type(type); return builder_.Finish(); } inline flatbuffers::Offset CreateGeometryDirect( flatbuffers::FlatBufferBuilder &_fbb, const std::vector *ends = nullptr, const std::vector *xy = nullptr, const std::vector *z = nullptr, const std::vector *m = nullptr, const std::vector *t = nullptr, const std::vector *tm = nullptr, FlatGeobuf::GeometryType type = FlatGeobuf::GeometryType::Unknown, const std::vector> *parts = nullptr) { auto ends__ = ends ? _fbb.CreateVector(*ends) : 0; auto xy__ = xy ? _fbb.CreateVector(*xy) : 0; auto z__ = z ? _fbb.CreateVector(*z) : 0; auto m__ = m ? _fbb.CreateVector(*m) : 0; auto t__ = t ? _fbb.CreateVector(*t) : 0; auto tm__ = tm ? _fbb.CreateVector(*tm) : 0; auto parts__ = parts ? _fbb.CreateVector>(*parts) : 0; return FlatGeobuf::CreateGeometry( _fbb, ends__, xy__, z__, m__, t__, tm__, type, parts__); } struct Feature FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef FeatureBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_GEOMETRY = 4, VT_PROPERTIES = 6, VT_COLUMNS = 8 }; const FlatGeobuf::Geometry *geometry() const { return GetPointer(VT_GEOMETRY); } const flatbuffers::Vector *properties() const { return GetPointer *>(VT_PROPERTIES); } const flatbuffers::Vector> *columns() const { return GetPointer> *>(VT_COLUMNS); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_GEOMETRY) && verifier.VerifyTable(geometry()) && VerifyOffset(verifier, VT_PROPERTIES) && verifier.VerifyVector(properties()) && VerifyOffset(verifier, VT_COLUMNS) && verifier.VerifyVector(columns()) && verifier.VerifyVectorOfTables(columns()) && verifier.EndTable(); } }; struct FeatureBuilder { typedef Feature Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_geometry(flatbuffers::Offset geometry) { fbb_.AddOffset(Feature::VT_GEOMETRY, geometry); } void add_properties(flatbuffers::Offset> properties) { fbb_.AddOffset(Feature::VT_PROPERTIES, properties); } void add_columns(flatbuffers::Offset>> columns) { fbb_.AddOffset(Feature::VT_COLUMNS, columns); } explicit FeatureBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); return o; } }; inline flatbuffers::Offset CreateFeature( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset geometry = 0, flatbuffers::Offset> properties = 0, flatbuffers::Offset>> columns = 0) { FeatureBuilder builder_(_fbb); builder_.add_columns(columns); builder_.add_properties(properties); builder_.add_geometry(geometry); return builder_.Finish(); } inline flatbuffers::Offset CreateFeatureDirect( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset geometry = 0, const std::vector *properties = nullptr, const std::vector> *columns = nullptr) { auto properties__ = properties ? _fbb.CreateVector(*properties) : 0; auto columns__ = columns ? _fbb.CreateVector>(*columns) : 0; return FlatGeobuf::CreateFeature( _fbb, geometry, properties__, columns__); } inline const FlatGeobuf::Feature *GetFeature(const void *buf) { return flatbuffers::GetRoot(buf); } inline const FlatGeobuf::Feature *GetSizePrefixedFeature(const void *buf) { return flatbuffers::GetSizePrefixedRoot(buf); } inline bool VerifyFeatureBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifyBuffer(nullptr); } inline bool VerifySizePrefixedFeatureBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifySizePrefixedBuffer(nullptr); } inline void FinishFeatureBuffer( flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset root) { fbb.Finish(root); } inline void FinishSizePrefixedFeatureBuffer( flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset root) { fbb.FinishSizePrefixed(root); } } // namespace FlatGeobuf } #endif // FLATBUFFERS_GENERATED_FEATURE_FLATGEOBUF_H_ mapserver-8.6.0/src/flatgeobuf/flatgeobuf_c.cpp000066400000000000000000000315311511405061000215560ustar00rootroot00000000000000#include "flatgeobuf_c.h" #include "feature_generated.h" #include "geometryreader.h" #include "packedrtree.h" #include using namespace mapserver::flatbuffers; using namespace mapserver::FlatGeobuf; typedef flatgeobuf_ctx ctx; uint8_t flatgeobuf_magicbytes[] = { 0x66, 0x67, 0x62, 0x03, 0x66, 0x67, 0x62, 0x01 }; uint8_t FLATGEOBUF_MAGICBYTES_SIZE = sizeof(flatgeobuf_magicbytes); uint32_t INIT_BUFFER_SIZE = 1024 * 4; template void parse_value(uint8_t *data, char **values, uint16_t i, uint32_t &offset, bool found) { using std::to_string; if (found) { msFree(values[i]); values[i] = msStrdup(to_string(*((T*) (data + offset))).c_str()); } offset += sizeof(T); } ctx *flatgeobuf_init_ctx() { ctx *c = (ctx *) malloc(sizeof(ctx)); memset(c, 0, sizeof(ctx)); c->is_null_geom = false; c->done = false; return c; } void flatgeobuf_free_ctx(ctx *ctx) { if (ctx->columns) { for (uint32_t i = 0; i < ctx->columns_len; i++) free(ctx->columns[i].name); free(ctx->columns); } if (ctx->search_result) free(ctx->search_result); if (ctx->buf) free(ctx->buf); if (ctx->wkt) free(ctx->wkt); free(ctx); } void flatgeobuf_ensure_line(ctx *ctx, uint32_t len) { if (!ctx->line) { ctx->line_len = len; ctx->line = (lineObj *) malloc(ctx->line_len * sizeof(lineObj)); return; } if (ctx->line_len < len) { ctx->line_len = len; ctx->line = (lineObj *) realloc(ctx->buf, ctx->line_len * sizeof(lineObj)); } } void flatgeobuf_ensure_point(ctx *ctx, uint32_t len) { if (!ctx->point) { ctx->point_len = len; ctx->point = (pointObj *) malloc(ctx->point_len * sizeof(pointObj)); return; } if (ctx->point_len < len) { ctx->point_len = len; ctx->point = (pointObj *) realloc(ctx->buf, ctx->point_len * sizeof(pointObj)); } } int flatgeobuf_ensure_buf(ctx *ctx, uint32_t size) { if (size > 100 * 1024 * 1024) { msSetError(MS_FGBERR, "Invalid buffer size requested", "flatgeobuf_ensure_buf"); return -1; } if (!ctx->buf) { ctx->buf_size = std::max(INIT_BUFFER_SIZE, size); ctx->buf = (uint8_t *) malloc(ctx->buf_size); if (ctx->buf == NULL) { msSetError(MS_FGBERR, "Failed to allocate buffer", "flatgeobuf_ensure_buf"); return -1; } return 0; } if (ctx->buf_size < size) { ctx->buf_size = std::max(ctx->buf_size * 2, size); auto buf = (uint8_t *) realloc(ctx->buf, ctx->buf_size); if (buf == NULL) { msSetError(MS_FGBERR, "Failed to reallocate buffer", "flatgeobuf_ensure_buf"); return -1; } ctx->buf = buf; } return 0; } int flatgeobuf_decode_feature(ctx *ctx, layerObj *layer, shapeObj *shape) { ctx->is_null_geom = false; uint32_t featureSize; if (VSIFReadL(&featureSize, sizeof(featureSize), 1, ctx->file) != 1) { if (VSIFEofL(ctx->file)) { ctx->done = true; return 0; } return -1; } ctx->offset += sizeof(uoffset_t); if (flatgeobuf_ensure_buf(ctx, featureSize) != 0) { return -1; } if (VSIFReadL(ctx->buf, 1, featureSize, ctx->file) != featureSize) { msSetError(MS_FGBERR, "Failed to read feature", "flatgeobuf_decode_feature"); return -1; } ctx->offset += featureSize; auto feature = GetFeature(ctx->buf); const auto geometry = feature->geometry(); if (geometry) { GeometryReader(ctx, geometry).read(shape); } else { ctx->is_null_geom = true; return 0; } auto properties = feature->properties(); if (properties && properties->size() != 0) { ctx->properties = (uint8_t *) properties->data(); ctx->properties_size = properties->size(); flatgeobuf_decode_properties(ctx, layer, shape); } else { ctx->properties_size = 0; } return 0; } int flatgeobuf_decode_properties(ctx *ctx, layerObj *layer, shapeObj *shape) { uint8_t type; uint32_t offset = 0; uint8_t *data = ctx->properties; uint32_t size = ctx->properties_size; uint16_t numvalues = layer->numitems; bool found; char **values; if (numvalues == 0) return 0; values = (char **) msSmallCalloc(sizeof(char *), numvalues); if (shape->values) msFreeCharArray(shape->values, shape->numvalues); shape->numvalues = numvalues; shape->values = values; if (size > 0 && size < (sizeof(uint16_t) + sizeof(uint8_t))) { msSetError(MS_FGBERR, "Unexpected properties data size", "flatgeobuf_decode_properties"); return -1; } while (offset + 1 < size) { uint16_t i; memcpy(&i, data + offset, sizeof(uint16_t)); offset += sizeof(uint16_t); if (i >= ctx->columns_len) { msSetError(MS_FGBERR, "Column index out of range", "flatgeobuf_decode_properties"); return -1; } const auto& column = ctx->columns[i]; const int32_t ii = column.itemindex; found = ii != -1; type = column.type; switch (type) { case flatgeobuf_column_type_bool: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_byte: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_ubyte: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_short: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_ushort: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_int: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_uint: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_long: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_ulong: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_float: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_double: parse_value(data, values, ii, offset, found); break; case flatgeobuf_column_type_datetime: case flatgeobuf_column_type_string: { uint32_t len; if (offset + sizeof(len) > size){ msSetError(MS_FGBERR, "Invalid size for string value", "flatgeobuf_decode_properties"); return -1; } memcpy(&len, data + offset, sizeof(uint32_t)); offset += sizeof(len); if (found) { char *str = (char *) msSmallMalloc(len + 1); memcpy(str, data + offset, len); str[len] = '\0'; msFree(values[ii]); values[ii] = str; } offset += len; break; } } } for(int i = 0; i < shape->numvalues; i++) { if( shape->values[i] == NULL) shape->values[i] = msStrdup(""); } return 0; } int flatgeobuf_check_magicbytes(ctx *ctx) { if (ctx->offset != 0) { msSetError(MS_FGBERR, "Unexpected offset", "flatgeobuf_check_magicbytes"); return -1; } if (flatgeobuf_ensure_buf(ctx, FLATGEOBUF_MAGICBYTES_SIZE) != 0) return -1; if (VSIFReadL(ctx->buf, 8, 1, ctx->file) != 1) { msSetError(MS_FGBERR, "Failed to read magicbytes", "flatgeobuf_check_magicbytes"); return -1; } uint32_t i; for (i = 0; i < FLATGEOBUF_MAGICBYTES_SIZE / 2; i++) { if (ctx->buf[i] != flatgeobuf_magicbytes[i]) { msSetError(MS_FGBERR, "Data is not FlatGeobuf", "flatgeobuf_check_magicbytes"); return -1; } } ctx->offset += FLATGEOBUF_MAGICBYTES_SIZE; return 0; } int flatgeobuf_decode_header(ctx *ctx) { if (ctx->offset != FLATGEOBUF_MAGICBYTES_SIZE) { msSetError(MS_FGBERR, "Unexpected offset", "flatgeobuf_decode_header"); return -1; } if (VSIFSeekL(ctx->file, ctx->offset, SEEK_SET) == -1) { msSetError(MS_FGBERR, "Unable to get seek in file", "flatgeobuf_decode_header"); return -1; } uint32_t headerSize; if (VSIFReadL(&headerSize, 4, 1, ctx->file) != 1) { msSetError(MS_FGBERR, "Failed to read header size", "flatgeobuf_decode_header"); return -1; } ctx->offset += sizeof(uoffset_t); if (flatgeobuf_ensure_buf(ctx, headerSize) != 0) { return -1; } if (VSIFReadL(ctx->buf, 1, headerSize, ctx->file) != headerSize) { msSetError(MS_FGBERR, "Failed to read header", "flatgeobuf_decode_header"); return -1; } auto header = GetHeader(ctx->buf); ctx->offset += headerSize; ctx->geometry_type = (uint8_t) header->geometry_type(); ctx->features_count = header->features_count(); auto envelope = header->envelope(); if (envelope != nullptr) { ctx->has_extent = true; ctx->xmin = envelope->Get(0); ctx->ymin = envelope->Get(1); ctx->xmax = envelope->Get(2); ctx->ymax = envelope->Get(3); ctx->bounds.minx = ctx->xmin; ctx->bounds.miny = ctx->ymin; ctx->bounds.maxx = ctx->xmax; ctx->bounds.maxy = ctx->ymax; } ctx->has_z = header->has_z(); ctx->has_m = header->has_m(); ctx->has_t = header->has_t(); ctx->has_tm = header->has_tm(); ctx->index_node_size = header->index_node_size(); auto crs = header->crs(); if (crs != nullptr) { ctx->srid = crs->code(); auto wkt = crs->wkt(); if (wkt != nullptr) ctx->wkt = msStrdup(wkt->c_str()); } auto columns = header->columns(); if (columns != nullptr) { auto size = columns->size(); ctx->columns = (flatgeobuf_column *) malloc(size * sizeof(flatgeobuf_column)); memset(ctx->columns, 0, size * sizeof(flatgeobuf_column)); ctx->columns_len = size; for (uint32_t i = 0; i < size; i++) { auto column = columns->Get(i); ctx->columns[i].name = msStrdup(column->name()->c_str()); ctx->columns[i].type = (uint8_t) column->type(); ctx->columns[i].itemindex = -1; } } ctx->index_offset = ctx->offset; ctx->feature_offset = ctx->offset; if ( ctx->index_node_size > 0) ctx->feature_offset += PackedRTree::size(ctx->features_count, ctx->index_node_size); return 0; } int flatgeobuf_index_search(ctx *ctx, rectObj *rect) { const auto treeOffset = ctx->offset; const auto readNode = [treeOffset, ctx] (uint8_t *buf, size_t i, size_t s) { if (VSIFSeekL(ctx->file, treeOffset + i, SEEK_SET) == -1) throw std::runtime_error("Unable to seek in file"); if (VSIFReadL(buf, 1, s, ctx->file) != s) throw std::runtime_error("Unable to read file"); }; NodeItem n { rect->minx, rect->miny, rect->maxx, rect->maxy, 0 }; try { const auto foundItems = PackedRTree::streamSearch(ctx->features_count, ctx->index_node_size, n, readNode); ctx->search_result = (flatgeobuf_search_item *) malloc(foundItems.size() * sizeof(flatgeobuf_search_item)); memcpy(ctx->search_result, foundItems.data(), foundItems.size() * sizeof(flatgeobuf_search_item)); ctx->search_result_len = (uint32_t) foundItems.size(); } catch (const std::exception &e) { msSetError(MS_FGBERR, "Unable to seek or read file", "flatgeobuf_index_search"); return -1; } return 0; } int flatgeobuf_index_skip(ctx *ctx) { auto treeSize = PackedRTree::size(ctx->features_count, ctx->index_node_size); ctx->offset += treeSize; if (VSIFSeekL(ctx->file, ctx->offset, SEEK_SET) == -1) { msSetError(MS_FGBERR, "Unable to seek in file", "flatgeobuf_index_skip"); return -1; } return 0; } int flatgeobuf_read_feature_offset(ctx *ctx, uint64_t index, uint64_t *featureOffset) { try { const auto levelBounds = PackedRTree::generateLevelBounds(ctx->features_count, ctx->index_node_size); const auto bottomLevelOffset = ctx->index_offset + (levelBounds.front().first * sizeof(NodeItem)); const auto nodeItemOffset = bottomLevelOffset + (index * sizeof(NodeItem)); const auto featureOffsetOffset = nodeItemOffset + (sizeof(double) * 4); if (VSIFSeekL(ctx->file, featureOffsetOffset, SEEK_SET) == -1) { msSetError(MS_FGBERR, "Failed to seek feature offset", "flatgeobuf_read_feature_offset"); return -1; } if (VSIFReadL(featureOffset, sizeof(uint64_t), 1, ctx->file) != 1) { msSetError(MS_FGBERR, "Failed to read feature offset", "flatgeobuf_read_feature_offset"); return -1; } return 0; } catch (const std::exception& e) { msSetError(MS_FGBERR, "Failed to calculate tree size", "flatgeobuf_read_feature_offset"); return -1; } } mapserver-8.6.0/src/flatgeobuf/flatgeobuf_c.h000066400000000000000000000064711511405061000212300ustar00rootroot00000000000000#ifndef FLATGEOBUF_C_H #define FLATGEOBUF_C_H #include "../../mapserver.h" #include "../../maperror.h" #include "../../mapprimitive.h" #include #include #ifdef __cplusplus extern "C" { #endif extern uint8_t flatgeobuf_magicbytes[]; extern uint8_t FLATGEOBUF_MAGICBYTES_SIZE; // need c compatible variant of this enum #define flatgeobuf_column_type_byte UINT8_C(0) #define flatgeobuf_column_type_ubyte UINT8_C(1) #define flatgeobuf_column_type_bool UINT8_C(2) #define flatgeobuf_column_type_short UINT8_C(3) #define flatgeobuf_column_type_ushort UINT8_C(4) #define flatgeobuf_column_type_int UINT8_C(5) #define flatgeobuf_column_type_uint UINT8_C(6) #define flatgeobuf_column_type_long UINT8_C(7) #define flatgeobuf_column_type_ulong UINT8_C(8) #define flatgeobuf_column_type_float UINT8_C(9) #define flatgeobuf_column_type_double UINT8_C(10) #define flatgeobuf_column_type_string UINT8_C(11) #define flatgeobuf_column_type_json UINT8_C(12) #define flatgeobuf_column_type_datetime UINT8_C(13) #define flatgeobuf_column_type_binary UINT8_C(14) typedef struct flatgeobuf_column { char *name; uint8_t type; const char *title; const char *description; uint32_t width; uint32_t precision; uint32_t scale; bool nullable; bool unique; bool primary_key; const char * metadata; int32_t itemindex; } flatgeobuf_column; typedef struct flatgeobuf_item { double xmin; double xmax; double ymin; double ymax; uint32_t size; uint64_t offset; } flatgeobuf_item; typedef struct flatgeobuf_search_item { uint64_t offset; uint64_t index; } flatgeobuf_search_item; typedef struct flatgeobuf_ctx { VSILFILE *file; uint64_t index_offset; uint64_t feature_offset; uint64_t offset; uint8_t *buf; uint32_t buf_size; bool done; // header contents const char *name; uint64_t features_count; uint8_t geometry_type; bool has_extent; double xmin; double xmax; double ymin; double ymax; bool has_z; bool has_m; bool has_t; bool has_tm; uint16_t index_node_size; int32_t srid; char *wkt; flatgeobuf_column *columns; uint16_t columns_len; // mapserver structs rectObj bounds; // index search result flatgeobuf_search_item *search_result; uint32_t search_result_len; uint32_t search_index; // shape parts buffers // NOTE: not used at this time, need to introduce optional free in mapdraw lineObj *line; uint32_t line_len; pointObj *point; uint32_t point_len; bool is_null_geom; uint64_t feature_index; int ms_type; uint8_t *properties; uint32_t properties_size; } flatgeobuf_ctx; flatgeobuf_ctx *flatgeobuf_init_ctx(); void flatgeobuf_free_ctx(flatgeobuf_ctx *ctx); int flatgeobuf_ensure_buf(flatgeobuf_ctx *ctx, uint32_t size); void flatgeobuf_ensure_line(flatgeobuf_ctx *ctx, uint32_t len); void flatgeobuf_ensure_point(flatgeobuf_ctx *ctx, uint32_t len); int flatgeobuf_check_magicbytes(flatgeobuf_ctx *ctx); int flatgeobuf_decode_header(flatgeobuf_ctx *ctx); int flatgeobuf_decode_feature(flatgeobuf_ctx *ctx, layerObj *layer, shapeObj *shape); int flatgeobuf_decode_properties(flatgeobuf_ctx *ctx, layerObj *layer, shapeObj *shape); int flatgeobuf_index_search(flatgeobuf_ctx *ctx, rectObj *rect); int flatgeobuf_index_skip(flatgeobuf_ctx *ctx); int flatgeobuf_read_feature_offset(flatgeobuf_ctx *ctx, uint64_t index, uint64_t *featureOffset); #ifdef __cplusplus } #endif #endif /* FLATGEOBUF_C_H */ mapserver-8.6.0/src/flatgeobuf/geometryreader.cpp000066400000000000000000000106441511405061000221560ustar00rootroot00000000000000#include "geometryreader.h" using namespace mapserver::flatbuffers; using namespace mapserver::FlatGeobuf; void GeometryReader::readPoint(shapeObj *shape) { lineObj *l = (lineObj *) malloc(sizeof(lineObj)); pointObj *p = (pointObj *) malloc(sizeof(pointObj)); p->x = m_xy[m_offset + 0]; p->y = m_xy[m_offset + 1]; if (m_has_z) p->z = m_geometry->z()->data()[m_offset]; if (m_has_m) p->m = m_geometry->m()->data()[m_offset]; l[0].numpoints = 1; l[0].point = p; shape->numlines = 1; shape->line = l; shape->type = MS_SHAPE_POINT; } void GeometryReader::readLineObj(lineObj *line) { const double *z = m_has_z ? m_geometry->z()->data() : nullptr; const double *m = m_has_m ? m_geometry->m()->data() : nullptr; line->point = (pointObj *) malloc(m_length * sizeof(pointObj)); line->numpoints = m_length; for (uint32_t i = m_offset; i < m_offset + m_length; i++) { pointObj *point = &line->point[i - m_offset]; memcpy(point, &m_xy[i * 2], 2 * sizeof(double)); if (m_has_z) point->z = z[i]; if (m_has_m) point->m = m[i]; } } void GeometryReader::readMultiPoint(shapeObj *shape) { readLineString(shape); shape->type = MS_SHAPE_POINT; } void GeometryReader::readLineString(shapeObj *shape) { lineObj *line = (lineObj *) malloc(sizeof(lineObj)); readLineObj(line); shape->numlines = 1; shape->line = line; shape->type = MS_SHAPE_LINE; } void GeometryReader::readMultiLineString(shapeObj *shape) { readPolygon(shape); shape->type = MS_SHAPE_LINE; } void GeometryReader::readPolygon(shapeObj *shape) { const auto ends = m_geometry->ends(); uint32_t nrings = 1; if (ends != nullptr && ends->size() > 1) nrings = ends->size(); lineObj *line = (lineObj *) malloc(nrings * sizeof(lineObj)); if (nrings > 1) { for (uint32_t i = 0; i < nrings; i++) { const auto e = ends->Get(i); m_length = e - m_offset; readLineObj(&line[i]); m_offset = e; } } else { readLineObj(line); } shape->numlines = nrings; shape->line = line; shape->type = MS_SHAPE_POLYGON; } void GeometryReader::readMultiPolygon(shapeObj *shape) { const auto parts = m_geometry->parts(); lineObj *line = (lineObj *) nullptr; auto numlines = 0; for (size_t i = 0; i < parts->size(); i++) { GeometryReader(m_ctx, parts->Get(i), GeometryType::Polygon).read(shape); lineObj *tmp = line; line = (lineObj *) realloc(line, (numlines + shape->numlines) * sizeof(lineObj)); if (!line) { free(tmp); free(shape->line); break; } for (int j = 0; j < shape->numlines; j++) line[numlines + j] = shape->line[j]; numlines += shape->numlines; free(shape->line); } shape->line = line; shape->numlines = numlines; } /*void GeometryReader::readGeometryCollection(shapeObj *shape) { // TODO return; }*/ void GeometryReader::read(shapeObj *shape) { // nested types switch (m_geometry_type) { //case GeometryType::GeometryCollection: return readGeometryCollection(shape); case GeometryType::MultiPolygon: return readMultiPolygon(shape); /*case GeometryType::CompoundCurve: return readCompoundCurve(); case GeometryType::CurvePolygon: return readCurvePolygon(); case GeometryType::MultiCurve: return readMultiCurve(); case GeometryType::MultiSurface: return readMultiSurface(); case GeometryType::PolyhedralSurface: return readPolyhedralSurface();*/ default: break; } // if not nested must have geometry data const auto pXy = m_geometry->xy(); const auto xySize = pXy->size(); m_xy = pXy->data(); m_length = xySize / 2; switch (m_geometry_type) { case GeometryType::Point: return readPoint(shape); case GeometryType::MultiPoint: return readMultiPoint(shape); case GeometryType::LineString: return readLineString(shape); case GeometryType::MultiLineString: return readMultiLineString(shape); case GeometryType::Polygon: return readPolygon(shape); /* case GeometryType::CircularString: return readSimpleCurve(true); case GeometryType::Triangle: return readTriangle(); case GeometryType::TIN: return readTIN(); */ default: break; } }mapserver-8.6.0/src/flatgeobuf/geometryreader.h000066400000000000000000000032361511405061000216220ustar00rootroot00000000000000#ifndef FLATGEOBUF_GEOMETRYREADER_H #define FLATGEOBUF_GEOMETRYREADER_H #include "../../mapserver.h" #include "../../maperror.h" #include "../../mapprimitive.h" #include "flatgeobuf_c.h" #include "feature_generated.h" namespace mapserver { namespace FlatGeobuf { class GeometryReader { private: flatgeobuf_ctx *m_ctx; const FlatGeobuf::Geometry *m_geometry; FlatGeobuf::GeometryType m_geometry_type; bool m_has_z; bool m_has_m; const double *m_xy = nullptr; uint32_t m_length = 0; uint32_t m_offset = 0; void readPoint(shapeObj *); void readMultiPoint(shapeObj *); void readLineString(shapeObj *); void readMultiLineString(shapeObj *); void readPolygon(shapeObj *); void readMultiPolygon(shapeObj *); //void readGeometryCollection(shapeObj *); void readLineObj(lineObj *line); public: GeometryReader( flatgeobuf_ctx *ctx, const FlatGeobuf::Geometry *geometry) : m_ctx (ctx), m_geometry (geometry), m_geometry_type ((FlatGeobuf::GeometryType) ctx->geometry_type), m_has_z (ctx->has_z), m_has_m (ctx->has_m) { } GeometryReader( flatgeobuf_ctx *ctx, const FlatGeobuf::Geometry *geometry, const FlatGeobuf::GeometryType geometry_type) : m_ctx (ctx), m_geometry (geometry), m_geometry_type (geometry_type), m_has_z (ctx->has_z), m_has_m (ctx->has_m) { } void read(shapeObj *); }; } } #endif /* FLATGEOBUF_GEOMETRYREADER_H */mapserver-8.6.0/src/flatgeobuf/header_generated.h000066400000000000000000000547361511405061000220650ustar00rootroot00000000000000// automatically generated by the FlatBuffers compiler, do not modify #ifndef FLATBUFFERS_GENERATED_HEADER_FLATGEOBUF_H_ #define FLATBUFFERS_GENERATED_HEADER_FLATGEOBUF_H_ #include "flatbuffers/flatbuffers.h" // Ensure the included flatbuffers.h is the same version as when this file was // generated, otherwise it may not be compatible. static_assert(FLATBUFFERS_VERSION_MAJOR == 2 && FLATBUFFERS_VERSION_MINOR == 0 && FLATBUFFERS_VERSION_REVISION == 6, "Non-compatible flatbuffers version included"); namespace mapserver { namespace FlatGeobuf { struct Column; struct ColumnBuilder; struct Crs; struct CrsBuilder; struct Header; struct HeaderBuilder; enum class GeometryType : uint8_t { Unknown = 0, Point = 1, LineString = 2, Polygon = 3, MultiPoint = 4, MultiLineString = 5, MultiPolygon = 6, GeometryCollection = 7, CircularString = 8, CompoundCurve = 9, CurvePolygon = 10, MultiCurve = 11, MultiSurface = 12, Curve = 13, Surface = 14, PolyhedralSurface = 15, TIN = 16, Triangle = 17, MIN = Unknown, MAX = Triangle }; inline const GeometryType (&EnumValuesGeometryType())[18] { static const GeometryType values[] = { GeometryType::Unknown, GeometryType::Point, GeometryType::LineString, GeometryType::Polygon, GeometryType::MultiPoint, GeometryType::MultiLineString, GeometryType::MultiPolygon, GeometryType::GeometryCollection, GeometryType::CircularString, GeometryType::CompoundCurve, GeometryType::CurvePolygon, GeometryType::MultiCurve, GeometryType::MultiSurface, GeometryType::Curve, GeometryType::Surface, GeometryType::PolyhedralSurface, GeometryType::TIN, GeometryType::Triangle }; return values; } inline const char * const *EnumNamesGeometryType() { static const char * const names[19] = { "Unknown", "Point", "LineString", "Polygon", "MultiPoint", "MultiLineString", "MultiPolygon", "GeometryCollection", "CircularString", "CompoundCurve", "CurvePolygon", "MultiCurve", "MultiSurface", "Curve", "Surface", "PolyhedralSurface", "TIN", "Triangle", nullptr }; return names; } inline const char *EnumNameGeometryType(GeometryType e) { if (flatbuffers::IsOutRange(e, GeometryType::Unknown, GeometryType::Triangle)) return ""; const size_t index = static_cast(e); return EnumNamesGeometryType()[index]; } enum class ColumnType : uint8_t { Byte = 0, UByte = 1, Bool = 2, Short = 3, UShort = 4, Int = 5, UInt = 6, Long = 7, ULong = 8, Float = 9, Double = 10, String = 11, Json = 12, DateTime = 13, Binary = 14, MIN = Byte, MAX = Binary }; inline const ColumnType (&EnumValuesColumnType())[15] { static const ColumnType values[] = { ColumnType::Byte, ColumnType::UByte, ColumnType::Bool, ColumnType::Short, ColumnType::UShort, ColumnType::Int, ColumnType::UInt, ColumnType::Long, ColumnType::ULong, ColumnType::Float, ColumnType::Double, ColumnType::String, ColumnType::Json, ColumnType::DateTime, ColumnType::Binary }; return values; } inline const char * const *EnumNamesColumnType() { static const char * const names[16] = { "Byte", "UByte", "Bool", "Short", "UShort", "Int", "UInt", "Long", "ULong", "Float", "Double", "String", "Json", "DateTime", "Binary", nullptr }; return names; } inline const char *EnumNameColumnType(ColumnType e) { if (flatbuffers::IsOutRange(e, ColumnType::Byte, ColumnType::Binary)) return ""; const size_t index = static_cast(e); return EnumNamesColumnType()[index]; } struct Column FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ColumnBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_TYPE = 6, VT_TITLE = 8, VT_DESCRIPTION = 10, VT_WIDTH = 12, VT_PRECISION = 14, VT_SCALE = 16, VT_NULLABLE = 18, VT_UNIQUE = 20, VT_PRIMARY_KEY = 22, VT_METADATA = 24 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } FlatGeobuf::ColumnType type() const { return static_cast(GetField(VT_TYPE, 0)); } const flatbuffers::String *title() const { return GetPointer(VT_TITLE); } const flatbuffers::String *description() const { return GetPointer(VT_DESCRIPTION); } int32_t width() const { return GetField(VT_WIDTH, -1); } int32_t precision() const { return GetField(VT_PRECISION, -1); } int32_t scale() const { return GetField(VT_SCALE, -1); } bool nullable() const { return GetField(VT_NULLABLE, 1) != 0; } bool unique() const { return GetField(VT_UNIQUE, 0) != 0; } bool primary_key() const { return GetField(VT_PRIMARY_KEY, 0) != 0; } const flatbuffers::String *metadata() const { return GetPointer(VT_METADATA); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyField(verifier, VT_TYPE, 1) && VerifyOffset(verifier, VT_TITLE) && verifier.VerifyString(title()) && VerifyOffset(verifier, VT_DESCRIPTION) && verifier.VerifyString(description()) && VerifyField(verifier, VT_WIDTH, 4) && VerifyField(verifier, VT_PRECISION, 4) && VerifyField(verifier, VT_SCALE, 4) && VerifyField(verifier, VT_NULLABLE, 1) && VerifyField(verifier, VT_UNIQUE, 1) && VerifyField(verifier, VT_PRIMARY_KEY, 1) && VerifyOffset(verifier, VT_METADATA) && verifier.VerifyString(metadata()) && verifier.EndTable(); } }; struct ColumnBuilder { typedef Column Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Column::VT_NAME, name); } void add_type(FlatGeobuf::ColumnType type) { fbb_.AddElement(Column::VT_TYPE, static_cast(type), 0); } void add_title(flatbuffers::Offset title) { fbb_.AddOffset(Column::VT_TITLE, title); } void add_description(flatbuffers::Offset description) { fbb_.AddOffset(Column::VT_DESCRIPTION, description); } void add_width(int32_t width) { fbb_.AddElement(Column::VT_WIDTH, width, -1); } void add_precision(int32_t precision) { fbb_.AddElement(Column::VT_PRECISION, precision, -1); } void add_scale(int32_t scale) { fbb_.AddElement(Column::VT_SCALE, scale, -1); } void add_nullable(bool nullable) { fbb_.AddElement(Column::VT_NULLABLE, static_cast(nullable), 1); } void add_unique(bool unique) { fbb_.AddElement(Column::VT_UNIQUE, static_cast(unique), 0); } void add_primary_key(bool primary_key) { fbb_.AddElement(Column::VT_PRIMARY_KEY, static_cast(primary_key), 0); } void add_metadata(flatbuffers::Offset metadata) { fbb_.AddOffset(Column::VT_METADATA, metadata); } explicit ColumnBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, Column::VT_NAME); return o; } }; inline flatbuffers::Offset CreateColumn( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, FlatGeobuf::ColumnType type = FlatGeobuf::ColumnType::Byte, flatbuffers::Offset title = 0, flatbuffers::Offset description = 0, int32_t width = -1, int32_t precision = -1, int32_t scale = -1, bool nullable = true, bool unique = false, bool primary_key = false, flatbuffers::Offset metadata = 0) { ColumnBuilder builder_(_fbb); builder_.add_metadata(metadata); builder_.add_scale(scale); builder_.add_precision(precision); builder_.add_width(width); builder_.add_description(description); builder_.add_title(title); builder_.add_name(name); builder_.add_primary_key(primary_key); builder_.add_unique(unique); builder_.add_nullable(nullable); builder_.add_type(type); return builder_.Finish(); } inline flatbuffers::Offset CreateColumnDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, FlatGeobuf::ColumnType type = FlatGeobuf::ColumnType::Byte, const char *title = nullptr, const char *description = nullptr, int32_t width = -1, int32_t precision = -1, int32_t scale = -1, bool nullable = true, bool unique = false, bool primary_key = false, const char *metadata = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto title__ = title ? _fbb.CreateString(title) : 0; auto description__ = description ? _fbb.CreateString(description) : 0; auto metadata__ = metadata ? _fbb.CreateString(metadata) : 0; return FlatGeobuf::CreateColumn( _fbb, name__, type, title__, description__, width, precision, scale, nullable, unique, primary_key, metadata__); } struct Crs FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef CrsBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_ORG = 4, VT_CODE = 6, VT_NAME = 8, VT_DESCRIPTION = 10, VT_WKT = 12, VT_CODE_STRING = 14 }; const flatbuffers::String *org() const { return GetPointer(VT_ORG); } int32_t code() const { return GetField(VT_CODE, 0); } const flatbuffers::String *name() const { return GetPointer(VT_NAME); } const flatbuffers::String *description() const { return GetPointer(VT_DESCRIPTION); } const flatbuffers::String *wkt() const { return GetPointer(VT_WKT); } const flatbuffers::String *code_string() const { return GetPointer(VT_CODE_STRING); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_ORG) && verifier.VerifyString(org()) && VerifyField(verifier, VT_CODE, 4) && VerifyOffset(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffset(verifier, VT_DESCRIPTION) && verifier.VerifyString(description()) && VerifyOffset(verifier, VT_WKT) && verifier.VerifyString(wkt()) && VerifyOffset(verifier, VT_CODE_STRING) && verifier.VerifyString(code_string()) && verifier.EndTable(); } }; struct CrsBuilder { typedef Crs Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_org(flatbuffers::Offset org) { fbb_.AddOffset(Crs::VT_ORG, org); } void add_code(int32_t code) { fbb_.AddElement(Crs::VT_CODE, code, 0); } void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Crs::VT_NAME, name); } void add_description(flatbuffers::Offset description) { fbb_.AddOffset(Crs::VT_DESCRIPTION, description); } void add_wkt(flatbuffers::Offset wkt) { fbb_.AddOffset(Crs::VT_WKT, wkt); } void add_code_string(flatbuffers::Offset code_string) { fbb_.AddOffset(Crs::VT_CODE_STRING, code_string); } explicit CrsBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); return o; } }; inline flatbuffers::Offset CreateCrs( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset org = 0, int32_t code = 0, flatbuffers::Offset name = 0, flatbuffers::Offset description = 0, flatbuffers::Offset wkt = 0, flatbuffers::Offset code_string = 0) { CrsBuilder builder_(_fbb); builder_.add_code_string(code_string); builder_.add_wkt(wkt); builder_.add_description(description); builder_.add_name(name); builder_.add_code(code); builder_.add_org(org); return builder_.Finish(); } inline flatbuffers::Offset CreateCrsDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *org = nullptr, int32_t code = 0, const char *name = nullptr, const char *description = nullptr, const char *wkt = nullptr, const char *code_string = nullptr) { auto org__ = org ? _fbb.CreateString(org) : 0; auto name__ = name ? _fbb.CreateString(name) : 0; auto description__ = description ? _fbb.CreateString(description) : 0; auto wkt__ = wkt ? _fbb.CreateString(wkt) : 0; auto code_string__ = code_string ? _fbb.CreateString(code_string) : 0; return FlatGeobuf::CreateCrs( _fbb, org__, code, name__, description__, wkt__, code_string__); } struct Header FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef HeaderBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_ENVELOPE = 6, VT_GEOMETRY_TYPE = 8, VT_HAS_Z = 10, VT_HAS_M = 12, VT_HAS_T = 14, VT_HAS_TM = 16, VT_COLUMNS = 18, VT_FEATURES_COUNT = 20, VT_INDEX_NODE_SIZE = 22, VT_CRS = 24, VT_TITLE = 26, VT_DESCRIPTION = 28, VT_METADATA = 30 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } const flatbuffers::Vector *envelope() const { return GetPointer *>(VT_ENVELOPE); } FlatGeobuf::GeometryType geometry_type() const { return static_cast(GetField(VT_GEOMETRY_TYPE, 0)); } bool has_z() const { return GetField(VT_HAS_Z, 0) != 0; } bool has_m() const { return GetField(VT_HAS_M, 0) != 0; } bool has_t() const { return GetField(VT_HAS_T, 0) != 0; } bool has_tm() const { return GetField(VT_HAS_TM, 0) != 0; } const flatbuffers::Vector> *columns() const { return GetPointer> *>(VT_COLUMNS); } uint64_t features_count() const { return GetField(VT_FEATURES_COUNT, 0); } uint16_t index_node_size() const { return GetField(VT_INDEX_NODE_SIZE, 16); } const FlatGeobuf::Crs *crs() const { return GetPointer(VT_CRS); } const flatbuffers::String *title() const { return GetPointer(VT_TITLE); } const flatbuffers::String *description() const { return GetPointer(VT_DESCRIPTION); } const flatbuffers::String *metadata() const { return GetPointer(VT_METADATA); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffset(verifier, VT_ENVELOPE) && verifier.VerifyVector(envelope()) && VerifyField(verifier, VT_GEOMETRY_TYPE, 1) && VerifyField(verifier, VT_HAS_Z, 1) && VerifyField(verifier, VT_HAS_M, 1) && VerifyField(verifier, VT_HAS_T, 1) && VerifyField(verifier, VT_HAS_TM, 1) && VerifyOffset(verifier, VT_COLUMNS) && verifier.VerifyVector(columns()) && verifier.VerifyVectorOfTables(columns()) && VerifyField(verifier, VT_FEATURES_COUNT, 8) && VerifyField(verifier, VT_INDEX_NODE_SIZE, 2) && VerifyOffset(verifier, VT_CRS) && verifier.VerifyTable(crs()) && VerifyOffset(verifier, VT_TITLE) && verifier.VerifyString(title()) && VerifyOffset(verifier, VT_DESCRIPTION) && verifier.VerifyString(description()) && VerifyOffset(verifier, VT_METADATA) && verifier.VerifyString(metadata()) && verifier.EndTable(); } }; struct HeaderBuilder { typedef Header Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Header::VT_NAME, name); } void add_envelope(flatbuffers::Offset> envelope) { fbb_.AddOffset(Header::VT_ENVELOPE, envelope); } void add_geometry_type(FlatGeobuf::GeometryType geometry_type) { fbb_.AddElement(Header::VT_GEOMETRY_TYPE, static_cast(geometry_type), 0); } void add_has_z(bool has_z) { fbb_.AddElement(Header::VT_HAS_Z, static_cast(has_z), 0); } void add_has_m(bool has_m) { fbb_.AddElement(Header::VT_HAS_M, static_cast(has_m), 0); } void add_has_t(bool has_t) { fbb_.AddElement(Header::VT_HAS_T, static_cast(has_t), 0); } void add_has_tm(bool has_tm) { fbb_.AddElement(Header::VT_HAS_TM, static_cast(has_tm), 0); } void add_columns(flatbuffers::Offset>> columns) { fbb_.AddOffset(Header::VT_COLUMNS, columns); } void add_features_count(uint64_t features_count) { fbb_.AddElement(Header::VT_FEATURES_COUNT, features_count, 0); } void add_index_node_size(uint16_t index_node_size) { fbb_.AddElement(Header::VT_INDEX_NODE_SIZE, index_node_size, 16); } void add_crs(flatbuffers::Offset crs) { fbb_.AddOffset(Header::VT_CRS, crs); } void add_title(flatbuffers::Offset title) { fbb_.AddOffset(Header::VT_TITLE, title); } void add_description(flatbuffers::Offset description) { fbb_.AddOffset(Header::VT_DESCRIPTION, description); } void add_metadata(flatbuffers::Offset metadata) { fbb_.AddOffset(Header::VT_METADATA, metadata); } explicit HeaderBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset
Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset
(end); return o; } }; inline flatbuffers::Offset
CreateHeader( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, flatbuffers::Offset> envelope = 0, FlatGeobuf::GeometryType geometry_type = FlatGeobuf::GeometryType::Unknown, bool has_z = false, bool has_m = false, bool has_t = false, bool has_tm = false, flatbuffers::Offset>> columns = 0, uint64_t features_count = 0, uint16_t index_node_size = 16, flatbuffers::Offset crs = 0, flatbuffers::Offset title = 0, flatbuffers::Offset description = 0, flatbuffers::Offset metadata = 0) { HeaderBuilder builder_(_fbb); builder_.add_features_count(features_count); builder_.add_metadata(metadata); builder_.add_description(description); builder_.add_title(title); builder_.add_crs(crs); builder_.add_columns(columns); builder_.add_envelope(envelope); builder_.add_name(name); builder_.add_index_node_size(index_node_size); builder_.add_has_tm(has_tm); builder_.add_has_t(has_t); builder_.add_has_m(has_m); builder_.add_has_z(has_z); builder_.add_geometry_type(geometry_type); return builder_.Finish(); } inline flatbuffers::Offset
CreateHeaderDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, const std::vector *envelope = nullptr, FlatGeobuf::GeometryType geometry_type = FlatGeobuf::GeometryType::Unknown, bool has_z = false, bool has_m = false, bool has_t = false, bool has_tm = false, const std::vector> *columns = nullptr, uint64_t features_count = 0, uint16_t index_node_size = 16, flatbuffers::Offset crs = 0, const char *title = nullptr, const char *description = nullptr, const char *metadata = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto envelope__ = envelope ? _fbb.CreateVector(*envelope) : 0; auto columns__ = columns ? _fbb.CreateVector>(*columns) : 0; auto title__ = title ? _fbb.CreateString(title) : 0; auto description__ = description ? _fbb.CreateString(description) : 0; auto metadata__ = metadata ? _fbb.CreateString(metadata) : 0; return FlatGeobuf::CreateHeader( _fbb, name__, envelope__, geometry_type, has_z, has_m, has_t, has_tm, columns__, features_count, index_node_size, crs, title__, description__, metadata__); } inline const FlatGeobuf::Header *GetHeader(const void *buf) { return flatbuffers::GetRoot(buf); } inline const FlatGeobuf::Header *GetSizePrefixedHeader(const void *buf) { return flatbuffers::GetSizePrefixedRoot(buf); } inline bool VerifyHeaderBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifyBuffer(nullptr); } inline bool VerifySizePrefixedHeaderBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifySizePrefixedBuffer(nullptr); } inline void FinishHeaderBuffer( flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset root) { fbb.Finish(root); } inline void FinishSizePrefixedHeaderBuffer( flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset root) { fbb.FinishSizePrefixed(root); } } // namespace FlatGeobuf } #endif // FLATBUFFERS_GENERATED_HEADER_FLATGEOBUF_H_ mapserver-8.6.0/src/flatgeobuf/include/000077500000000000000000000000001511405061000200525ustar00rootroot00000000000000mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/000077500000000000000000000000001511405061000223555ustar00rootroot00000000000000mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/LICENSE000066400000000000000000000261171511405061000233710ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2014 Google Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/allocator.h000066400000000000000000000051131511405061000245060ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_ALLOCATOR_H_ #define FLATBUFFERS_ALLOCATOR_H_ #include "flatbuffers/base.h" namespace mapserver { namespace flatbuffers { // Allocator interface. This is flatbuffers-specific and meant only for // `vector_downward` usage. class Allocator { public: virtual ~Allocator() {} // Allocate `size` bytes of memory. virtual uint8_t *allocate(size_t size) = 0; // Deallocate `size` bytes of memory at `p` allocated by this allocator. virtual void deallocate(uint8_t *p, size_t size) = 0; // Reallocate `new_size` bytes of memory, replacing the old region of size // `old_size` at `p`. In contrast to a normal realloc, this grows downwards, // and is intended specifcally for `vector_downward` use. // `in_use_back` and `in_use_front` indicate how much of `old_size` is // actually in use at each end, and needs to be copied. virtual uint8_t *reallocate_downward(uint8_t *old_p, size_t old_size, size_t new_size, size_t in_use_back, size_t in_use_front) { FLATBUFFERS_ASSERT(new_size > old_size); // vector_downward only grows uint8_t *new_p = allocate(new_size); memcpy_downward(old_p, old_size, new_p, new_size, in_use_back, in_use_front); deallocate(old_p, old_size); return new_p; } protected: // Called by `reallocate_downward` to copy memory from `old_p` of `old_size` // to `new_p` of `new_size`. Only memory of size `in_use_front` and // `in_use_back` will be copied from the front and back of the old memory // allocation. void memcpy_downward(uint8_t *old_p, size_t old_size, uint8_t *new_p, size_t new_size, size_t in_use_back, size_t in_use_front) { memcpy(new_p + new_size - in_use_back, old_p + old_size - in_use_back, in_use_back); memcpy(new_p, old_p, in_use_front); } }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_ALLOCATOR_H_mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/array.h000066400000000000000000000211621511405061000236460ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_ARRAY_H_ #define FLATBUFFERS_ARRAY_H_ #include "flatbuffers/base.h" #include "flatbuffers/stl_emulation.h" #include "flatbuffers/vector.h" namespace mapserver { namespace flatbuffers { // This is used as a helper type for accessing arrays. template class Array { // Array can carry only POD data types (scalars or structs). typedef typename flatbuffers::bool_constant::value> scalar_tag; typedef typename flatbuffers::conditional::type IndirectHelperType; public: typedef uint16_t size_type; typedef typename IndirectHelper::return_type return_type; typedef VectorIterator const_iterator; typedef VectorReverseIterator const_reverse_iterator; // If T is a LE-scalar or a struct (!scalar_tag::value). static FLATBUFFERS_CONSTEXPR bool is_span_observable = (scalar_tag::value && (FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1)) || !scalar_tag::value; FLATBUFFERS_CONSTEXPR uint16_t size() const { return length; } return_type Get(uoffset_t i) const { FLATBUFFERS_ASSERT(i < size()); return IndirectHelper::Read(Data(), i); } return_type operator[](uoffset_t i) const { return Get(i); } // If this is a Vector of enums, T will be its storage type, not the enum // type. This function makes it convenient to retrieve value with enum // type E. template E GetEnum(uoffset_t i) const { return static_cast(Get(i)); } const_iterator begin() const { return const_iterator(Data(), 0); } const_iterator end() const { return const_iterator(Data(), size()); } const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } const_iterator cbegin() const { return begin(); } const_iterator cend() const { return end(); } const_reverse_iterator crbegin() const { return rbegin(); } const_reverse_iterator crend() const { return rend(); } // Get a mutable pointer to elements inside this array. // This method used to mutate arrays of structs followed by a @p Mutate // operation. For primitive types use @p Mutate directly. // @warning Assignments and reads to/from the dereferenced pointer are not // automatically converted to the correct endianness. typename flatbuffers::conditional::type GetMutablePointer(uoffset_t i) const { FLATBUFFERS_ASSERT(i < size()); return const_cast(&data()[i]); } // Change elements if you have a non-const pointer to this object. void Mutate(uoffset_t i, const T &val) { MutateImpl(scalar_tag(), i, val); } // The raw data in little endian format. Use with care. const uint8_t *Data() const { return data_; } uint8_t *Data() { return data_; } // Similarly, but typed, much like std::vector::data const T *data() const { return reinterpret_cast(Data()); } T *data() { return reinterpret_cast(Data()); } // Copy data from a span with endian conversion. // If this Array and the span overlap, the behavior is undefined. void CopyFromSpan(flatbuffers::span src) { const auto p1 = reinterpret_cast(src.data()); const auto p2 = Data(); FLATBUFFERS_ASSERT(!(p1 >= p2 && p1 < (p2 + length)) && !(p2 >= p1 && p2 < (p1 + length))); (void)p1; (void)p2; CopyFromSpanImpl(flatbuffers::bool_constant(), src); } protected: void MutateImpl(flatbuffers::true_type, uoffset_t i, const T &val) { FLATBUFFERS_ASSERT(i < size()); WriteScalar(data() + i, val); } void MutateImpl(flatbuffers::false_type, uoffset_t i, const T &val) { *(GetMutablePointer(i)) = val; } void CopyFromSpanImpl(flatbuffers::true_type, flatbuffers::span src) { // Use std::memcpy() instead of std::copy() to avoid performance degradation // due to aliasing if T is char or unsigned char. // The size is known at compile time, so memcpy would be inlined. std::memcpy(data(), src.data(), length * sizeof(T)); } // Copy data from flatbuffers::span with endian conversion. void CopyFromSpanImpl(flatbuffers::false_type, flatbuffers::span src) { for (size_type k = 0; k < length; k++) { Mutate(k, src[k]); } } // This class is only used to access pre-existing data. Don't ever // try to construct these manually. // 'constexpr' allows us to use 'size()' at compile time. // @note Must not use 'FLATBUFFERS_CONSTEXPR' here, as const is not allowed on // a constructor. #if defined(__cpp_constexpr) constexpr Array(); #else Array(); #endif uint8_t data_[length * sizeof(T)]; private: // This class is a pointer. Copying will therefore create an invalid object. // Private and unimplemented copy constructor. Array(const Array &); Array &operator=(const Array &); }; // Specialization for Array[struct] with access using Offset pointer. // This specialization used by idl_gen_text.cpp. template class Array, length> { static_assert(flatbuffers::is_same::value, "unexpected type T"); public: typedef const void *return_type; const uint8_t *Data() const { return data_; } // Make idl_gen_text.cpp::PrintContainer happy. return_type operator[](uoffset_t) const { FLATBUFFERS_ASSERT(false); return nullptr; } private: // This class is only used to access pre-existing data. Array(); Array(const Array &); Array &operator=(const Array &); uint8_t data_[1]; }; template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(Array &arr) FLATBUFFERS_NOEXCEPT { static_assert( Array::is_span_observable, "wrong type U, only plain struct, LE-scalar, or byte types are allowed"); return span(arr.data(), N); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span( const Array &arr) FLATBUFFERS_NOEXCEPT { static_assert( Array::is_span_observable, "wrong type U, only plain struct, LE-scalar, or byte types are allowed"); return span(arr.data(), N); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_bytes_span(Array &arr) FLATBUFFERS_NOEXCEPT { static_assert(Array::is_span_observable, "internal error, Array might hold only scalars or structs"); return span(arr.Data(), sizeof(U) * N); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_bytes_span(const Array &arr) FLATBUFFERS_NOEXCEPT { static_assert(Array::is_span_observable, "internal error, Array might hold only scalars or structs"); return span(arr.Data(), sizeof(U) * N); } // Cast a raw T[length] to a raw flatbuffers::Array // without endian conversion. Use with care. // TODO: move these Cast-methods to `internal` namespace. template Array &CastToArray(T (&arr)[length]) { return *reinterpret_cast *>(arr); } template const Array &CastToArray(const T (&arr)[length]) { return *reinterpret_cast *>(arr); } template Array &CastToArrayOfEnum(T (&arr)[length]) { static_assert(sizeof(E) == sizeof(T), "invalid enum type E"); return *reinterpret_cast *>(arr); } template const Array &CastToArrayOfEnum(const T (&arr)[length]) { static_assert(sizeof(E) == sizeof(T), "invalid enum type E"); return *reinterpret_cast *>(arr); } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_ARRAY_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/base.h000066400000000000000000000403561511405061000234500ustar00rootroot00000000000000#ifndef FLATBUFFERS_BASE_H_ #define FLATBUFFERS_BASE_H_ // clang-format off // If activate should be declared and included first. #if defined(FLATBUFFERS_MEMORY_LEAK_TRACKING) && \ defined(_MSC_VER) && defined(_DEBUG) // The _CRTDBG_MAP_ALLOC inside will replace // calloc/free (etc) to its debug version using #define directives. #define _CRTDBG_MAP_ALLOC #include #include // Replace operator new by trace-enabled version. #define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) #define new DEBUG_NEW #endif #if !defined(FLATBUFFERS_ASSERT) #include #define FLATBUFFERS_ASSERT assert #elif defined(FLATBUFFERS_ASSERT_INCLUDE) // Include file with forward declaration #include FLATBUFFERS_ASSERT_INCLUDE #endif #ifndef ARDUINO #include #endif #include #include #include #if defined(ARDUINO) && !defined(ARDUINOSTL_M_H) #include #else #include #endif #include #include #include #include #include #include #include #if defined(__unix__) && !defined(FLATBUFFERS_LOCALE_INDEPENDENT) #include #endif #ifdef __ANDROID__ #include #endif #if defined(__ICCARM__) #include #endif // Note the __clang__ check is needed, because clang presents itself // as an older GNUC compiler (4.2). // Clang 3.3 and later implement all of the ISO C++ 2011 standard. // Clang 3.4 and later implement all of the ISO C++ 2014 standard. // http://clang.llvm.org/cxx_status.html // Note the MSVC value '__cplusplus' may be incorrect: // The '__cplusplus' predefined macro in the MSVC stuck at the value 199711L, // indicating (erroneously!) that the compiler conformed to the C++98 Standard. // This value should be correct starting from MSVC2017-15.7-Preview-3. // The '__cplusplus' will be valid only if MSVC2017-15.7-P3 and the `/Zc:__cplusplus` switch is set. // Workaround (for details see MSDN): // Use the _MSC_VER and _MSVC_LANG definition instead of the __cplusplus for compatibility. // The _MSVC_LANG macro reports the Standard version regardless of the '/Zc:__cplusplus' switch. #if defined(__GNUC__) && !defined(__clang__) #define FLATBUFFERS_GCC (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #else #define FLATBUFFERS_GCC 0 #endif #if defined(__clang__) #define FLATBUFFERS_CLANG (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) #else #define FLATBUFFERS_CLANG 0 #endif /// @cond FLATBUFFERS_INTERNAL #if __cplusplus <= 199711L && \ (!defined(_MSC_VER) || _MSC_VER < 1600) && \ (!defined(__GNUC__) || \ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40400)) #error A C++11 compatible compiler with support for the auto typing is \ required for FlatBuffers. #error __cplusplus _MSC_VER __GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__ #endif #if !defined(__clang__) && \ defined(__GNUC__) && \ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40600) // Backwards compatibility for g++ 4.4, and 4.5 which don't have the nullptr // and constexpr keywords. Note the __clang__ check is needed, because clang // presents itself as an older GNUC compiler. #ifndef nullptr_t const class nullptr_t { public: template inline operator T*() const { return 0; } private: void operator&() const; } nullptr = {}; #endif #ifndef constexpr #define constexpr const #endif #endif // The wire format uses a little endian encoding (since that's efficient for // the common platforms). #if defined(__s390x__) #define FLATBUFFERS_LITTLEENDIAN 0 #endif // __s390x__ #if !defined(FLATBUFFERS_LITTLEENDIAN) #if defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__) #if (defined(__BIG_ENDIAN__) || \ (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) #define FLATBUFFERS_LITTLEENDIAN 0 #else #define FLATBUFFERS_LITTLEENDIAN 1 #endif // __BIG_ENDIAN__ #elif defined(_MSC_VER) #if defined(_M_PPC) #define FLATBUFFERS_LITTLEENDIAN 0 #else #define FLATBUFFERS_LITTLEENDIAN 1 #endif #else #error Unable to determine endianness, define FLATBUFFERS_LITTLEENDIAN. #endif #endif // !defined(FLATBUFFERS_LITTLEENDIAN) #define FLATBUFFERS_VERSION_MAJOR 2 #define FLATBUFFERS_VERSION_MINOR 0 #define FLATBUFFERS_VERSION_REVISION 6 #define FLATBUFFERS_STRING_EXPAND(X) #X #define FLATBUFFERS_STRING(X) FLATBUFFERS_STRING_EXPAND(X) namespace mapserver { namespace flatbuffers { // Returns version as string "MAJOR.MINOR.REVISION". const char* FLATBUFFERS_VERSION(); } } #if (!defined(_MSC_VER) || _MSC_VER > 1600) && \ (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 407)) || \ defined(__clang__) #define FLATBUFFERS_FINAL_CLASS final #define FLATBUFFERS_OVERRIDE override #define FLATBUFFERS_EXPLICIT_CPP11 explicit #define FLATBUFFERS_VTABLE_UNDERLYING_TYPE : flatbuffers::voffset_t #else #define FLATBUFFERS_FINAL_CLASS #define FLATBUFFERS_OVERRIDE #define FLATBUFFERS_EXPLICIT_CPP11 #define FLATBUFFERS_VTABLE_UNDERLYING_TYPE #endif #if (!defined(_MSC_VER) || _MSC_VER >= 1900) && \ (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) || \ (defined(__cpp_constexpr) && __cpp_constexpr >= 200704) #define FLATBUFFERS_CONSTEXPR constexpr #define FLATBUFFERS_CONSTEXPR_CPP11 constexpr #define FLATBUFFERS_CONSTEXPR_DEFINED #else #define FLATBUFFERS_CONSTEXPR const #define FLATBUFFERS_CONSTEXPR_CPP11 #endif #if (defined(__cplusplus) && __cplusplus >= 201402L) || \ (defined(__cpp_constexpr) && __cpp_constexpr >= 201304) #define FLATBUFFERS_CONSTEXPR_CPP14 FLATBUFFERS_CONSTEXPR_CPP11 #else #define FLATBUFFERS_CONSTEXPR_CPP14 #endif #if (defined(__GXX_EXPERIMENTAL_CXX0X__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)) || \ (defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 190023026)) || \ defined(__clang__) #define FLATBUFFERS_NOEXCEPT noexcept #else #define FLATBUFFERS_NOEXCEPT #endif // NOTE: the FLATBUFFERS_DELETE_FUNC macro may change the access mode to // private, so be sure to put it at the end or reset access mode explicitly. #if (!defined(_MSC_VER) || _MSC_FULL_VER >= 180020827) && \ (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 404)) || \ defined(__clang__) #define FLATBUFFERS_DELETE_FUNC(func) func = delete #else #define FLATBUFFERS_DELETE_FUNC(func) private: func #endif #if (!defined(_MSC_VER) || _MSC_VER >= 1900) && \ (!defined(__GNUC__) || (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)) || \ defined(__clang__) #define FLATBUFFERS_DEFAULT_DECLARATION #endif // Check if we can use template aliases // Not possible if Microsoft Compiler before 2012 // Possible is the language feature __cpp_alias_templates is defined well // Or possible if the C++ std is C+11 or newer #if (defined(_MSC_VER) && _MSC_VER > 1700 /* MSVC2012 */) \ || (defined(__cpp_alias_templates) && __cpp_alias_templates >= 200704) \ || (defined(__cplusplus) && __cplusplus >= 201103L) #define FLATBUFFERS_TEMPLATES_ALIASES #endif #ifndef FLATBUFFERS_HAS_STRING_VIEW // Only provide flatbuffers::string_view if __has_include can be used // to detect a header that provides an implementation #if defined(__has_include) // Check for std::string_view (in c++17) #if __has_include() && (__cplusplus >= 201606 || (defined(_HAS_CXX17) && _HAS_CXX17)) #include namespace mapserver { namespace flatbuffers { typedef std::string_view string_view; } } #define FLATBUFFERS_HAS_STRING_VIEW 1 // Check for std::experimental::string_view (in c++14, compiler-dependent) #elif __has_include() && (__cplusplus >= 201411) #include namespace mapserver { namespace flatbuffers { typedef std::experimental::string_view string_view; } } #define FLATBUFFERS_HAS_STRING_VIEW 1 // Check for absl::string_view #elif __has_include("absl/strings/string_view.h") && (__cplusplus >= 201411) #include "absl/strings/string_view.h" namespace mapserver { namespace flatbuffers { typedef absl::string_view string_view; } } #define FLATBUFFERS_HAS_STRING_VIEW 1 #endif #endif // __has_include #endif // !FLATBUFFERS_HAS_STRING_VIEW #ifndef FLATBUFFERS_GENERAL_HEAP_ALLOC_OK // Allow heap allocations to be used #define FLATBUFFERS_GENERAL_HEAP_ALLOC_OK 1 #endif // !FLATBUFFERS_GENERAL_HEAP_ALLOC_OK #ifndef FLATBUFFERS_HAS_NEW_STRTOD // Modern (C++11) strtod and strtof functions are available for use. // 1) nan/inf strings as argument of strtod; // 2) hex-float as argument of strtod/strtof. #if (defined(_MSC_VER) && _MSC_VER >= 1900) || \ (defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409)) || \ (defined(__clang__)) #define FLATBUFFERS_HAS_NEW_STRTOD 1 #endif #endif // !FLATBUFFERS_HAS_NEW_STRTOD #ifndef FLATBUFFERS_LOCALE_INDEPENDENT // Enable locale independent functions {strtof_l, strtod_l,strtoll_l, strtoull_l}. #if ((defined(_MSC_VER) && _MSC_VER >= 1800) || \ (defined(_XOPEN_VERSION) && (_XOPEN_VERSION>=700)) && (!defined(__ANDROID_API__) || (defined(__ANDROID_API__) && (__ANDROID_API__>=21)))) #define FLATBUFFERS_LOCALE_INDEPENDENT 1 #else #define FLATBUFFERS_LOCALE_INDEPENDENT 0 #endif #endif // !FLATBUFFERS_LOCALE_INDEPENDENT // Suppress Undefined Behavior Sanitizer (recoverable only). Usage: // - __supress_ubsan__("undefined") // - __supress_ubsan__("signed-integer-overflow") #if defined(__clang__) && (__clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >=7)) #define __supress_ubsan__(type) __attribute__((no_sanitize(type))) #elif defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 409) #define __supress_ubsan__(type) __attribute__((no_sanitize_undefined)) #else #define __supress_ubsan__(type) #endif // This is constexpr function used for checking compile-time constants. // Avoid `#pragma warning(disable: 4127) // C4127: expression is constant`. template FLATBUFFERS_CONSTEXPR inline bool IsConstTrue(T t) { return !!t; } // Enable C++ attribute [[]] if std:c++17 or higher. #if ((__cplusplus >= 201703L) \ || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201703L))) // All attributes unknown to an implementation are ignored without causing an error. #define FLATBUFFERS_ATTRIBUTE(attr) attr #define FLATBUFFERS_FALLTHROUGH() [[fallthrough]] #else #define FLATBUFFERS_ATTRIBUTE(attr) #if FLATBUFFERS_CLANG >= 30800 #define FLATBUFFERS_FALLTHROUGH() [[clang::fallthrough]] #elif FLATBUFFERS_GCC >= 70300 #define FLATBUFFERS_FALLTHROUGH() [[gnu::fallthrough]] #else #define FLATBUFFERS_FALLTHROUGH() #endif #endif /// @endcond /// @file namespace mapserver { namespace flatbuffers { /// @cond FLATBUFFERS_INTERNAL // Our default offset / size type, 32bit on purpose on 64bit systems. // Also, using a consistent offset type maintains compatibility of serialized // offset values between 32bit and 64bit systems. typedef uint32_t uoffset_t; // Signed offsets for references that can go in both directions. typedef int32_t soffset_t; // Offset/index used in v-tables, can be changed to uint8_t in // format forks to save a bit of space if desired. typedef uint16_t voffset_t; typedef uintmax_t largest_scalar_t; // In 32bits, this evaluates to 2GB - 1 #define FLATBUFFERS_MAX_BUFFER_SIZE ((1ULL << (sizeof(::mapserver::flatbuffers::soffset_t) * 8 - 1)) - 1) // We support aligning the contents of buffers up to this size. #ifndef FLATBUFFERS_MAX_ALIGNMENT #define FLATBUFFERS_MAX_ALIGNMENT 32 #endif /// @brief The length of a FlatBuffer file header. static const size_t kFileIdentifierLength = 4; inline bool VerifyAlignmentRequirements(size_t align, size_t min_align = 1) { return (min_align <= align) && (align <= (FLATBUFFERS_MAX_ALIGNMENT)) && (align & (align - 1)) == 0; // must be power of 2 } #if defined(_MSC_VER) #pragma warning(disable: 4351) // C4351: new behavior: elements of array ... will be default initialized #pragma warning(push) #pragma warning(disable: 4127) // C4127: conditional expression is constant #endif template T EndianSwap(T t) { #if defined(_MSC_VER) #define FLATBUFFERS_BYTESWAP16 _byteswap_ushort #define FLATBUFFERS_BYTESWAP32 _byteswap_ulong #define FLATBUFFERS_BYTESWAP64 _byteswap_uint64 #elif defined(__ICCARM__) #define FLATBUFFERS_BYTESWAP16 __REV16 #define FLATBUFFERS_BYTESWAP32 __REV #define FLATBUFFERS_BYTESWAP64(x) \ ((__REV(static_cast(x >> 32U))) | (static_cast(__REV(static_cast(x)))) << 32U) #else #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ < 408 && !defined(__clang__) // __builtin_bswap16 was missing prior to GCC 4.8. #define FLATBUFFERS_BYTESWAP16(x) \ static_cast(__builtin_bswap32(static_cast(x) << 16)) #else #define FLATBUFFERS_BYTESWAP16 __builtin_bswap16 #endif #define FLATBUFFERS_BYTESWAP32 __builtin_bswap32 #define FLATBUFFERS_BYTESWAP64 __builtin_bswap64 #endif if (sizeof(T) == 1) { // Compile-time if-then's. return t; } else if (sizeof(T) == 2) { union { T t; uint16_t i; } u = { t }; u.i = FLATBUFFERS_BYTESWAP16(u.i); return u.t; } else if (sizeof(T) == 4) { union { T t; uint32_t i; } u = { t }; u.i = FLATBUFFERS_BYTESWAP32(u.i); return u.t; } else if (sizeof(T) == 8) { union { T t; uint64_t i; } u = { t }; u.i = FLATBUFFERS_BYTESWAP64(u.i); return u.t; } else { FLATBUFFERS_ASSERT(0); return t; } } #if defined(_MSC_VER) #pragma warning(pop) #endif template T EndianScalar(T t) { #if FLATBUFFERS_LITTLEENDIAN return t; #else return EndianSwap(t); #endif } template // UBSAN: C++ aliasing type rules, see std::bit_cast<> for details. __supress_ubsan__("alignment") T ReadScalar(const void *p) { return EndianScalar(*reinterpret_cast(p)); } // See https://github.com/google/flatbuffers/issues/5950 #if (FLATBUFFERS_GCC >= 100000) && (FLATBUFFERS_GCC < 110000) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wstringop-overflow" #endif template // UBSAN: C++ aliasing type rules, see std::bit_cast<> for details. __supress_ubsan__("alignment") void WriteScalar(void *p, T t) { *reinterpret_cast(p) = EndianScalar(t); } template struct Offset; template __supress_ubsan__("alignment") void WriteScalar(void *p, Offset t) { *reinterpret_cast(p) = EndianScalar(t.o); } #if (FLATBUFFERS_GCC >= 100000) && (FLATBUFFERS_GCC < 110000) #pragma GCC diagnostic pop #endif // Computes how many bytes you'd have to pad to be able to write an // "scalar_size" scalar if the buffer had grown to "buf_size" (downwards in // memory). __supress_ubsan__("unsigned-integer-overflow") inline size_t PaddingBytes(size_t buf_size, size_t scalar_size) { return ((~buf_size) + 1) & (scalar_size - 1); } // Generic 'operator==' with conditional specialisations. // T e - new value of a scalar field. // T def - default of scalar (is known at compile-time). template inline bool IsTheSameAs(T e, T def) { return e == def; } #if defined(FLATBUFFERS_NAN_DEFAULTS) && \ defined(FLATBUFFERS_HAS_NEW_STRTOD) && (FLATBUFFERS_HAS_NEW_STRTOD > 0) // Like `operator==(e, def)` with weak NaN if T=(float|double). template inline bool IsFloatTheSameAs(T e, T def) { return (e == def) || ((def != def) && (e != e)); } template<> inline bool IsTheSameAs(float e, float def) { return IsFloatTheSameAs(e, def); } template<> inline bool IsTheSameAs(double e, double def) { return IsFloatTheSameAs(e, def); } #endif // Check 'v' is out of closed range [low; high]. // Workaround for GCC warning [-Werror=type-limits]: // comparison is always true due to limited range of data type. template inline bool IsOutRange(const T &v, const T &low, const T &high) { return (v < low) || (high < v); } // Check 'v' is in closed range [low; high]. template inline bool IsInRange(const T &v, const T &low, const T &high) { return !IsOutRange(v, low, high); } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_BASE_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/bfbs_generator.h000066400000000000000000000024141511405061000255110ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_BFBS_GENERATOR_H_ #define FLATBUFFERS_BFBS_GENERATOR_H_ #include namespace mapserver { namespace flatbuffers { enum GeneratorStatus { OK, FAILED, FAILED_VERIFICATION, }; // A Flatbuffer Code Generator that receives a binary serialized reflection.fbs // and generates code from it. class BfbsGenerator { public: virtual ~BfbsGenerator() {} // Generate code from the provided `buffer` of given `length`. The buffer is // a serialized reflection.fbs. virtual GeneratorStatus Generate(const uint8_t *buffer, int64_t length) = 0; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_BFBS_GENERATOR_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/buffer.h000066400000000000000000000122211511405061000237750ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_BUFFER_H_ #define FLATBUFFERS_BUFFER_H_ #include "flatbuffers/base.h" namespace mapserver { namespace flatbuffers { // Wrapper for uoffset_t to allow safe template specialization. // Value is allowed to be 0 to indicate a null object (see e.g. AddOffset). template struct Offset { uoffset_t o; Offset() : o(0) {} Offset(uoffset_t _o) : o(_o) {} Offset Union() const { return Offset(o); } bool IsNull() const { return !o; } }; inline void EndianCheck() { int endiantest = 1; // If this fails, see FLATBUFFERS_LITTLEENDIAN above. FLATBUFFERS_ASSERT(*reinterpret_cast(&endiantest) == FLATBUFFERS_LITTLEENDIAN); (void)endiantest; } template FLATBUFFERS_CONSTEXPR size_t AlignOf() { // clang-format off #ifdef _MSC_VER return __alignof(T); #else #ifndef alignof return __alignof__(T); #else return alignof(T); #endif #endif // clang-format on } // Lexicographically compare two strings (possibly containing nulls), and // return true if the first is less than the second. static inline bool StringLessThan(const char *a_data, uoffset_t a_size, const char *b_data, uoffset_t b_size) { const auto cmp = memcmp(a_data, b_data, (std::min)(a_size, b_size)); return cmp == 0 ? a_size < b_size : cmp < 0; } // When we read serialized data from memory, in the case of most scalars, // we want to just read T, but in the case of Offset, we want to actually // perform the indirection and return a pointer. // The template specialization below does just that. // It is wrapped in a struct since function templates can't overload on the // return type like this. // The typedef is for the convenience of callers of this function // (avoiding the need for a trailing return decltype) template struct IndirectHelper { typedef T return_type; typedef T mutable_return_type; static const size_t element_stride = sizeof(T); static return_type Read(const uint8_t *p, uoffset_t i) { return EndianScalar((reinterpret_cast(p))[i]); } }; template struct IndirectHelper> { typedef const T *return_type; typedef T *mutable_return_type; static const size_t element_stride = sizeof(uoffset_t); static return_type Read(const uint8_t *p, uoffset_t i) { p += i * sizeof(uoffset_t); return reinterpret_cast(p + ReadScalar(p)); } }; template struct IndirectHelper { typedef const T *return_type; typedef T *mutable_return_type; static const size_t element_stride = sizeof(T); static return_type Read(const uint8_t *p, uoffset_t i) { return reinterpret_cast(p + i * sizeof(T)); } }; /// @brief Get a pointer to the the file_identifier section of the buffer. /// @return Returns a const char pointer to the start of the file_identifier /// characters in the buffer. The returned char * has length /// 'flatbuffers::FlatBufferBuilder::kFileIdentifierLength'. /// This function is UNDEFINED for FlatBuffers whose schema does not include /// a file_identifier (likely points at padding or the start of a the root /// vtable). inline const char *GetBufferIdentifier(const void *buf, bool size_prefixed = false) { return reinterpret_cast(buf) + ((size_prefixed) ? 2 * sizeof(uoffset_t) : sizeof(uoffset_t)); } // Helper to see if the identifier in a buffer has the expected value. inline bool BufferHasIdentifier(const void *buf, const char *identifier, bool size_prefixed = false) { return strncmp(GetBufferIdentifier(buf, size_prefixed), identifier, flatbuffers::kFileIdentifierLength) == 0; } /// @cond FLATBUFFERS_INTERNAL // Helpers to get a typed pointer to the root object contained in the buffer. template T *GetMutableRoot(void *buf) { EndianCheck(); return reinterpret_cast( reinterpret_cast(buf) + EndianScalar(*reinterpret_cast(buf))); } template T *GetMutableSizePrefixedRoot(void *buf) { return GetMutableRoot(reinterpret_cast(buf) + sizeof(uoffset_t)); } template const T *GetRoot(const void *buf) { return GetMutableRoot(const_cast(buf)); } template const T *GetSizePrefixedRoot(const void *buf) { return GetRoot(reinterpret_cast(buf) + sizeof(uoffset_t)); } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_BUFFER_H_mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/buffer_ref.h000066400000000000000000000030261511405061000246340ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_BUFFER_REF_H_ #define FLATBUFFERS_BUFFER_REF_H_ #include "flatbuffers/base.h" #include "flatbuffers/verifier.h" namespace mapserver { namespace flatbuffers { // Convenient way to bundle a buffer and its length, to pass it around // typed by its root. // A BufferRef does not own its buffer. struct BufferRefBase {}; // for std::is_base_of template struct BufferRef : BufferRefBase { BufferRef() : buf(nullptr), len(0), must_free(false) {} BufferRef(uint8_t *_buf, uoffset_t _len) : buf(_buf), len(_len), must_free(false) {} ~BufferRef() { if (must_free) free(buf); } const T *GetRoot() const { return flatbuffers::GetRoot(buf); } bool Verify() { Verifier verifier(buf, len); return verifier.VerifyBuffer(nullptr); } uint8_t *buf; uoffset_t len; bool must_free; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_BUFFER_REF_H_mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/code_generators.h000066400000000000000000000176251511405061000257040ustar00rootroot00000000000000/* * Copyright 2014 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. */ #ifndef FLATBUFFERS_CODE_GENERATORS_H_ #define FLATBUFFERS_CODE_GENERATORS_H_ #include #include #include "flatbuffers/idl.h" namespace mapserver { namespace flatbuffers { // Utility class to assist in generating code through use of text templates. // // Example code: // CodeWriter code("\t"); // code.SetValue("NAME", "Foo"); // code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }"; // code.SetValue("NAME", "Bar"); // code += "void {{NAME}}() { printf("%s", "{{NAME}}"); }"; // std::cout << code.ToString() << std::endl; // // Output: // void Foo() { printf("%s", "Foo"); } // void Bar() { printf("%s", "Bar"); } class CodeWriter { public: CodeWriter(std::string pad = std::string()) : pad_(pad), cur_ident_lvl_(0), ignore_ident_(false) {} // Clears the current "written" code. void Clear() { stream_.str(""); stream_.clear(); } // Associates a key with a value. All subsequent calls to operator+=, where // the specified key is contained in {{ and }} delimiters will be replaced by // the given value. void SetValue(const std::string &key, const std::string &value) { value_map_[key] = value; } std::string GetValue(const std::string &key) const { const auto it = value_map_.find(key); return it == value_map_.end() ? "" : it->second; } // Appends the given text to the generated code as well as a newline // character. Any text within {{ and }} delimiters is replaced by values // previously stored in the CodeWriter by calling SetValue above. The newline // will be suppressed if the text ends with the \\ character. void operator+=(std::string text); // Returns the current contents of the CodeWriter as a std::string. std::string ToString() const { return stream_.str(); } // Increase ident level for writing code void IncrementIdentLevel() { cur_ident_lvl_++; } // Decrease ident level for writing code void DecrementIdentLevel() { if (cur_ident_lvl_) cur_ident_lvl_--; } void SetPadding(const std::string &padding) { pad_ = padding; } private: std::map value_map_; std::stringstream stream_; std::string pad_; int cur_ident_lvl_; bool ignore_ident_; // Add ident padding (tab or space) based on ident level void AppendIdent(std::stringstream &stream); }; class BaseGenerator { public: virtual bool generate() = 0; static std::string NamespaceDir(const Parser &parser, const std::string &path, const Namespace &ns, const bool dasherize = false); std::string GeneratedFileName(const std::string &path, const std::string &file_name, const IDLOptions &options) const; protected: BaseGenerator(const Parser &parser, const std::string &path, const std::string &file_name, std::string qualifying_start, std::string qualifying_separator, std::string default_extension) : parser_(parser), path_(path), file_name_(file_name), qualifying_start_(qualifying_start), qualifying_separator_(qualifying_separator), default_extension_(default_extension) {} virtual ~BaseGenerator() {} // No copy/assign. BaseGenerator &operator=(const BaseGenerator &); BaseGenerator(const BaseGenerator &); std::string NamespaceDir(const Namespace &ns, const bool dasherize = false) const; static const char *FlatBuffersGeneratedWarning(); static std::string FullNamespace(const char *separator, const Namespace &ns); static std::string LastNamespacePart(const Namespace &ns); // tracks the current namespace for early exit in WrapInNameSpace // c++, java and csharp returns a different namespace from // the following default (no early exit, always fully qualify), // which works for js and php virtual const Namespace *CurrentNameSpace() const { return nullptr; } // Ensure that a type is prefixed with its namespace even within // its own namespace to avoid conflict between generated method // names and similarly named classes or structs std::string WrapInNameSpace(const Namespace *ns, const std::string &name) const; std::string WrapInNameSpace(const Definition &def) const; std::string GetNameSpace(const Definition &def) const; const Parser &parser_; const std::string &path_; const std::string &file_name_; const std::string qualifying_start_; const std::string qualifying_separator_; const std::string default_extension_; }; struct CommentConfig { const char *first_line; const char *content_line_prefix; const char *last_line; }; extern void GenComment(const std::vector &dc, std::string *code_ptr, const CommentConfig *config, const char *prefix = ""); class FloatConstantGenerator { public: virtual ~FloatConstantGenerator() {} std::string GenFloatConstant(const FieldDef &field) const; private: virtual std::string Value(double v, const std::string &src) const = 0; virtual std::string Inf(double v) const = 0; virtual std::string NaN(double v) const = 0; virtual std::string Value(float v, const std::string &src) const = 0; virtual std::string Inf(float v) const = 0; virtual std::string NaN(float v) const = 0; template std::string GenFloatConstantImpl(const FieldDef &field) const; }; class SimpleFloatConstantGenerator : public FloatConstantGenerator { public: SimpleFloatConstantGenerator(const char *nan_number, const char *pos_inf_number, const char *neg_inf_number); private: std::string Value(double v, const std::string &src) const FLATBUFFERS_OVERRIDE; std::string Inf(double v) const FLATBUFFERS_OVERRIDE; std::string NaN(double v) const FLATBUFFERS_OVERRIDE; std::string Value(float v, const std::string &src) const FLATBUFFERS_OVERRIDE; std::string Inf(float v) const FLATBUFFERS_OVERRIDE; std::string NaN(float v) const FLATBUFFERS_OVERRIDE; const std::string nan_number_; const std::string pos_inf_number_; const std::string neg_inf_number_; }; // C++, C#, Java like generator. class TypedFloatConstantGenerator : public FloatConstantGenerator { public: TypedFloatConstantGenerator(const char *double_prefix, const char *single_prefix, const char *nan_number, const char *pos_inf_number, const char *neg_inf_number = ""); private: std::string Value(double v, const std::string &src) const FLATBUFFERS_OVERRIDE; std::string Inf(double v) const FLATBUFFERS_OVERRIDE; std::string NaN(double v) const FLATBUFFERS_OVERRIDE; std::string Value(float v, const std::string &src) const FLATBUFFERS_OVERRIDE; std::string Inf(float v) const FLATBUFFERS_OVERRIDE; std::string NaN(float v) const FLATBUFFERS_OVERRIDE; std::string MakeNaN(const std::string &prefix) const; std::string MakeInf(bool neg, const std::string &prefix) const; const std::string double_prefix_; const std::string single_prefix_; const std::string nan_number_; const std::string pos_inf_number_; const std::string neg_inf_number_; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_CODE_GENERATORS_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/default_allocator.h000066400000000000000000000045741511405061000262240ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_DEFAULT_ALLOCATOR_H_ #define FLATBUFFERS_DEFAULT_ALLOCATOR_H_ #include "flatbuffers/allocator.h" #include "flatbuffers/base.h" namespace mapserver { namespace flatbuffers { // DefaultAllocator uses new/delete to allocate memory regions class DefaultAllocator : public Allocator { public: uint8_t *allocate(size_t size) FLATBUFFERS_OVERRIDE { return new uint8_t[size]; } void deallocate(uint8_t *p, size_t) FLATBUFFERS_OVERRIDE { delete[] p; } static void dealloc(void *p, size_t) { delete[] static_cast(p); } }; // These functions allow for a null allocator to mean use the default allocator, // as used by DetachedBuffer and vector_downward below. // This is to avoid having a statically or dynamically allocated default // allocator, or having to move it between the classes that may own it. inline uint8_t *Allocate(Allocator *allocator, size_t size) { return allocator ? allocator->allocate(size) : DefaultAllocator().allocate(size); } inline void Deallocate(Allocator *allocator, uint8_t *p, size_t size) { if (allocator) allocator->deallocate(p, size); else DefaultAllocator().deallocate(p, size); } inline uint8_t *ReallocateDownward(Allocator *allocator, uint8_t *old_p, size_t old_size, size_t new_size, size_t in_use_back, size_t in_use_front) { return allocator ? allocator->reallocate_downward(old_p, old_size, new_size, in_use_back, in_use_front) : DefaultAllocator().reallocate_downward( old_p, old_size, new_size, in_use_back, in_use_front); } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_DEFAULT_ALLOCATOR_H_mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/detached_buffer.h000066400000000000000000000060271511405061000256250ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_DETACHED_BUFFER_H_ #define FLATBUFFERS_DETACHED_BUFFER_H_ #include "flatbuffers/allocator.h" #include "flatbuffers/base.h" #include "flatbuffers/default_allocator.h" namespace mapserver { namespace flatbuffers { // DetachedBuffer is a finished flatbuffer memory region, detached from its // builder. The original memory region and allocator are also stored so that // the DetachedBuffer can manage the memory lifetime. class DetachedBuffer { public: DetachedBuffer() : allocator_(nullptr), own_allocator_(false), buf_(nullptr), reserved_(0), cur_(nullptr), size_(0) {} DetachedBuffer(Allocator *allocator, bool own_allocator, uint8_t *buf, size_t reserved, uint8_t *cur, size_t sz) : allocator_(allocator), own_allocator_(own_allocator), buf_(buf), reserved_(reserved), cur_(cur), size_(sz) {} DetachedBuffer(DetachedBuffer &&other) : allocator_(other.allocator_), own_allocator_(other.own_allocator_), buf_(other.buf_), reserved_(other.reserved_), cur_(other.cur_), size_(other.size_) { other.reset(); } DetachedBuffer &operator=(DetachedBuffer &&other) { if (this == &other) return *this; destroy(); allocator_ = other.allocator_; own_allocator_ = other.own_allocator_; buf_ = other.buf_; reserved_ = other.reserved_; cur_ = other.cur_; size_ = other.size_; other.reset(); return *this; } ~DetachedBuffer() { destroy(); } const uint8_t *data() const { return cur_; } uint8_t *data() { return cur_; } size_t size() const { return size_; } // These may change access mode, leave these at end of public section FLATBUFFERS_DELETE_FUNC(DetachedBuffer(const DetachedBuffer &other)); FLATBUFFERS_DELETE_FUNC( DetachedBuffer &operator=(const DetachedBuffer &other)); protected: Allocator *allocator_; bool own_allocator_; uint8_t *buf_; size_t reserved_; uint8_t *cur_; size_t size_; inline void destroy() { if (buf_) Deallocate(allocator_, buf_, reserved_); if (own_allocator_ && allocator_) { delete allocator_; } reset(); } inline void reset() { allocator_ = nullptr; own_allocator_ = false; buf_ = nullptr; reserved_ = 0; cur_ = nullptr; size_ = 0; } }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_DETACHED_BUFFER_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/flatbuffer_builder.h000066400000000000000000001433471511405061000263700ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_FLATBUFFER_BUILDER_H_ #define FLATBUFFERS_FLATBUFFER_BUILDER_H_ #include #include #include "flatbuffers/allocator.h" #include "flatbuffers/array.h" #include "flatbuffers/base.h" #include "flatbuffers/buffer_ref.h" #include "flatbuffers/default_allocator.h" #include "flatbuffers/detached_buffer.h" #include "flatbuffers/stl_emulation.h" #include "flatbuffers/string.h" #include "flatbuffers/struct.h" #include "flatbuffers/table.h" #include "flatbuffers/vector.h" #include "flatbuffers/vector_downward.h" #include "flatbuffers/verifier.h" namespace mapserver { namespace flatbuffers { // Converts a Field ID to a virtual table offset. inline voffset_t FieldIndexToOffset(voffset_t field_id) { // Should correspond to what EndTable() below builds up. const int fixed_fields = 2; // Vtable size and Object Size. return static_cast((field_id + fixed_fields) * sizeof(voffset_t)); } template> const T *data(const std::vector &v) { // Eventually the returned pointer gets passed down to memcpy, so // we need it to be non-null to avoid undefined behavior. static uint8_t t; return v.empty() ? reinterpret_cast(&t) : &v.front(); } template> T *data(std::vector &v) { // Eventually the returned pointer gets passed down to memcpy, so // we need it to be non-null to avoid undefined behavior. static uint8_t t; return v.empty() ? reinterpret_cast(&t) : &v.front(); } /// @addtogroup flatbuffers_cpp_api /// @{ /// @class FlatBufferBuilder /// @brief Helper class to hold data needed in creation of a FlatBuffer. /// To serialize data, you typically call one of the `Create*()` functions in /// the generated code, which in turn call a sequence of `StartTable`/ /// `PushElement`/`AddElement`/`EndTable`, or the builtin `CreateString`/ /// `CreateVector` functions. Do this is depth-first order to build up a tree to /// the root. `Finish()` wraps up the buffer ready for transport. class FlatBufferBuilder { public: /// @brief Default constructor for FlatBufferBuilder. /// @param[in] initial_size The initial size of the buffer, in bytes. Defaults /// to `1024`. /// @param[in] allocator An `Allocator` to use. If null will use /// `DefaultAllocator`. /// @param[in] own_allocator Whether the builder/vector should own the /// allocator. Defaults to / `false`. /// @param[in] buffer_minalign Force the buffer to be aligned to the given /// minimum alignment upon reallocation. Only needed if you intend to store /// types with custom alignment AND you wish to read the buffer in-place /// directly after creation. explicit FlatBufferBuilder( size_t initial_size = 1024, Allocator *allocator = nullptr, bool own_allocator = false, size_t buffer_minalign = AlignOf()) : buf_(initial_size, allocator, own_allocator, buffer_minalign), num_field_loc(0), max_voffset_(0), nested(false), finished(false), minalign_(1), force_defaults_(false), dedup_vtables_(true), string_pool(nullptr) { EndianCheck(); } /// @brief Move constructor for FlatBufferBuilder. FlatBufferBuilder(FlatBufferBuilder &&other) : buf_(1024, nullptr, false, AlignOf()), num_field_loc(0), max_voffset_(0), nested(false), finished(false), minalign_(1), force_defaults_(false), dedup_vtables_(true), string_pool(nullptr) { EndianCheck(); // Default construct and swap idiom. // Lack of delegating constructors in vs2010 makes it more verbose than // needed. Swap(other); } /// @brief Move assignment operator for FlatBufferBuilder. FlatBufferBuilder &operator=(FlatBufferBuilder &&other) { // Move construct a temporary and swap idiom FlatBufferBuilder temp(std::move(other)); Swap(temp); return *this; } void Swap(FlatBufferBuilder &other) { using std::swap; buf_.swap(other.buf_); swap(num_field_loc, other.num_field_loc); swap(max_voffset_, other.max_voffset_); swap(nested, other.nested); swap(finished, other.finished); swap(minalign_, other.minalign_); swap(force_defaults_, other.force_defaults_); swap(dedup_vtables_, other.dedup_vtables_); swap(string_pool, other.string_pool); } ~FlatBufferBuilder() { if (string_pool) delete string_pool; } void Reset() { Clear(); // clear builder state buf_.reset(); // deallocate buffer } /// @brief Reset all the state in this FlatBufferBuilder so it can be reused /// to construct another buffer. void Clear() { ClearOffsets(); buf_.clear(); nested = false; finished = false; minalign_ = 1; if (string_pool) string_pool->clear(); } /// @brief The current size of the serialized buffer, counting from the end. /// @return Returns an `uoffset_t` with the current size of the buffer. uoffset_t GetSize() const { return buf_.size(); } /// @brief Get the serialized buffer (after you call `Finish()`). /// @return Returns an `uint8_t` pointer to the FlatBuffer data inside the /// buffer. uint8_t *GetBufferPointer() const { Finished(); return buf_.data(); } /// @brief Get the serialized buffer (after you call `Finish()`) as a span. /// @return Returns a constructed flatbuffers::span that is a view over the /// FlatBuffer data inside the buffer. flatbuffers::span GetBufferSpan() const { Finished(); return flatbuffers::span(buf_.data(), buf_.size()); } /// @brief Get a pointer to an unfinished buffer. /// @return Returns a `uint8_t` pointer to the unfinished buffer. uint8_t *GetCurrentBufferPointer() const { return buf_.data(); } /// @brief Get the released pointer to the serialized buffer. /// @warning Do NOT attempt to use this FlatBufferBuilder afterwards! /// @return A `FlatBuffer` that owns the buffer and its allocator and /// behaves similar to a `unique_ptr` with a deleter. FLATBUFFERS_ATTRIBUTE([[deprecated("use Release() instead")]]) DetachedBuffer ReleaseBufferPointer() { Finished(); return buf_.release(); } /// @brief Get the released DetachedBuffer. /// @return A `DetachedBuffer` that owns the buffer and its allocator. DetachedBuffer Release() { Finished(); return buf_.release(); } /// @brief Get the released pointer to the serialized buffer. /// @param size The size of the memory block containing /// the serialized `FlatBuffer`. /// @param offset The offset from the released pointer where the finished /// `FlatBuffer` starts. /// @return A raw pointer to the start of the memory block containing /// the serialized `FlatBuffer`. /// @remark If the allocator is owned, it gets deleted when the destructor is /// called.. uint8_t *ReleaseRaw(size_t &size, size_t &offset) { Finished(); return buf_.release_raw(size, offset); } /// @brief get the minimum alignment this buffer needs to be accessed /// properly. This is only known once all elements have been written (after /// you call Finish()). You can use this information if you need to embed /// a FlatBuffer in some other buffer, such that you can later read it /// without first having to copy it into its own buffer. size_t GetBufferMinAlignment() const { Finished(); return minalign_; } /// @cond FLATBUFFERS_INTERNAL void Finished() const { // If you get this assert, you're attempting to get access a buffer // which hasn't been finished yet. Be sure to call // FlatBufferBuilder::Finish with your root table. // If you really need to access an unfinished buffer, call // GetCurrentBufferPointer instead. FLATBUFFERS_ASSERT(finished); } /// @endcond /// @brief In order to save space, fields that are set to their default value /// don't get serialized into the buffer. /// @param[in] fd When set to `true`, always serializes default values that /// are set. Optional fields which are not set explicitly, will still not be /// serialized. void ForceDefaults(bool fd) { force_defaults_ = fd; } /// @brief By default vtables are deduped in order to save space. /// @param[in] dedup When set to `true`, dedup vtables. void DedupVtables(bool dedup) { dedup_vtables_ = dedup; } /// @cond FLATBUFFERS_INTERNAL void Pad(size_t num_bytes) { buf_.fill(num_bytes); } void TrackMinAlign(size_t elem_size) { if (elem_size > minalign_) minalign_ = elem_size; } void Align(size_t elem_size) { TrackMinAlign(elem_size); buf_.fill(PaddingBytes(buf_.size(), elem_size)); } void PushFlatBuffer(const uint8_t *bytes, size_t size) { PushBytes(bytes, size); finished = true; } void PushBytes(const uint8_t *bytes, size_t size) { buf_.push(bytes, size); } void PopBytes(size_t amount) { buf_.pop(amount); } template void AssertScalarT() { // The code assumes power of 2 sizes and endian-swap-ability. static_assert(flatbuffers::is_scalar::value, "T must be a scalar type"); } // Write a single aligned scalar to the buffer template uoffset_t PushElement(T element) { AssertScalarT(); Align(sizeof(T)); buf_.push_small(EndianScalar(element)); return GetSize(); } template uoffset_t PushElement(Offset off) { // Special case for offsets: see ReferTo below. return PushElement(ReferTo(off.o)); } // When writing fields, we track where they are, so we can create correct // vtables later. void TrackField(voffset_t field, uoffset_t off) { FieldLoc fl = { off, field }; buf_.scratch_push_small(fl); num_field_loc++; if (field > max_voffset_) { max_voffset_ = field; } } // Like PushElement, but additionally tracks the field this represents. template void AddElement(voffset_t field, T e, T def) { // We don't serialize values equal to the default. if (IsTheSameAs(e, def) && !force_defaults_) return; TrackField(field, PushElement(e)); } template void AddElement(voffset_t field, T e) { TrackField(field, PushElement(e)); } template void AddOffset(voffset_t field, Offset off) { if (off.IsNull()) return; // Don't store. AddElement(field, ReferTo(off.o), static_cast(0)); } template void AddStruct(voffset_t field, const T *structptr) { if (!structptr) return; // Default, don't store. Align(AlignOf()); buf_.push_small(*structptr); TrackField(field, GetSize()); } void AddStructOffset(voffset_t field, uoffset_t off) { TrackField(field, off); } // Offsets initially are relative to the end of the buffer (downwards). // This function converts them to be relative to the current location // in the buffer (when stored here), pointing upwards. uoffset_t ReferTo(uoffset_t off) { // Align to ensure GetSize() below is correct. Align(sizeof(uoffset_t)); // Offset must refer to something already in buffer. const uoffset_t size = GetSize(); FLATBUFFERS_ASSERT(off && off <= size); return size - off + static_cast(sizeof(uoffset_t)); } void NotNested() { // If you hit this, you're trying to construct a Table/Vector/String // during the construction of its parent table (between the MyTableBuilder // and table.Finish(). // Move the creation of these sub-objects to above the MyTableBuilder to // not get this assert. // Ignoring this assert may appear to work in simple cases, but the reason // it is here is that storing objects in-line may cause vtable offsets // to not fit anymore. It also leads to vtable duplication. FLATBUFFERS_ASSERT(!nested); // If you hit this, fields were added outside the scope of a table. FLATBUFFERS_ASSERT(!num_field_loc); } // From generated code (or from the parser), we call StartTable/EndTable // with a sequence of AddElement calls in between. uoffset_t StartTable() { NotNested(); nested = true; return GetSize(); } // This finishes one serialized object by generating the vtable if it's a // table, comparing it against existing vtables, and writing the // resulting vtable offset. uoffset_t EndTable(uoffset_t start) { // If you get this assert, a corresponding StartTable wasn't called. FLATBUFFERS_ASSERT(nested); // Write the vtable offset, which is the start of any Table. // We fill it's value later. auto vtableoffsetloc = PushElement(0); // Write a vtable, which consists entirely of voffset_t elements. // It starts with the number of offsets, followed by a type id, followed // by the offsets themselves. In reverse: // Include space for the last offset and ensure empty tables have a // minimum size. max_voffset_ = (std::max)(static_cast(max_voffset_ + sizeof(voffset_t)), FieldIndexToOffset(0)); buf_.fill_big(max_voffset_); auto table_object_size = vtableoffsetloc - start; // Vtable use 16bit offsets. FLATBUFFERS_ASSERT(table_object_size < 0x10000); WriteScalar(buf_.data() + sizeof(voffset_t), static_cast(table_object_size)); WriteScalar(buf_.data(), max_voffset_); // Write the offsets into the table for (auto it = buf_.scratch_end() - num_field_loc * sizeof(FieldLoc); it < buf_.scratch_end(); it += sizeof(FieldLoc)) { auto field_location = reinterpret_cast(it); auto pos = static_cast(vtableoffsetloc - field_location->off); // If this asserts, it means you've set a field twice. FLATBUFFERS_ASSERT( !ReadScalar(buf_.data() + field_location->id)); WriteScalar(buf_.data() + field_location->id, pos); } ClearOffsets(); auto vt1 = reinterpret_cast(buf_.data()); auto vt1_size = ReadScalar(vt1); auto vt_use = GetSize(); // See if we already have generated a vtable with this exact same // layout before. If so, make it point to the old one, remove this one. if (dedup_vtables_) { for (auto it = buf_.scratch_data(); it < buf_.scratch_end(); it += sizeof(uoffset_t)) { auto vt_offset_ptr = reinterpret_cast(it); auto vt2 = reinterpret_cast(buf_.data_at(*vt_offset_ptr)); auto vt2_size = ReadScalar(vt2); if (vt1_size != vt2_size || 0 != memcmp(vt2, vt1, vt1_size)) continue; vt_use = *vt_offset_ptr; buf_.pop(GetSize() - vtableoffsetloc); break; } } // If this is a new vtable, remember it. if (vt_use == GetSize()) { buf_.scratch_push_small(vt_use); } // Fill the vtable offset we created above. // The offset points from the beginning of the object to where the // vtable is stored. // Offsets default direction is downward in memory for future format // flexibility (storing all vtables at the start of the file). WriteScalar(buf_.data_at(vtableoffsetloc), static_cast(vt_use) - static_cast(vtableoffsetloc)); nested = false; return vtableoffsetloc; } FLATBUFFERS_ATTRIBUTE([[deprecated("call the version above instead")]]) uoffset_t EndTable(uoffset_t start, voffset_t /*numfields*/) { return EndTable(start); } // This checks a required field has been set in a given table that has // just been constructed. template void Required(Offset table, voffset_t field); uoffset_t StartStruct(size_t alignment) { Align(alignment); return GetSize(); } uoffset_t EndStruct() { return GetSize(); } void ClearOffsets() { buf_.scratch_pop(num_field_loc * sizeof(FieldLoc)); num_field_loc = 0; max_voffset_ = 0; } // Aligns such that when "len" bytes are written, an object can be written // after it with "alignment" without padding. void PreAlign(size_t len, size_t alignment) { if (len == 0) return; TrackMinAlign(alignment); buf_.fill(PaddingBytes(GetSize() + len, alignment)); } template void PreAlign(size_t len) { AssertScalarT(); PreAlign(len, sizeof(T)); } /// @endcond /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const char pointer to the data to be stored as a string. /// @param[in] len The number of bytes that should be stored from `str`. /// @return Returns the offset in the buffer where the string starts. Offset CreateString(const char *str, size_t len) { NotNested(); PreAlign(len + 1); // Always 0-terminated. buf_.fill(1); PushBytes(reinterpret_cast(str), len); PushElement(static_cast(len)); return Offset(GetSize()); } /// @brief Store a string in the buffer, which is null-terminated. /// @param[in] str A const char pointer to a C-string to add to the buffer. /// @return Returns the offset in the buffer where the string starts. Offset CreateString(const char *str) { return CreateString(str, strlen(str)); } /// @brief Store a string in the buffer, which is null-terminated. /// @param[in] str A char pointer to a C-string to add to the buffer. /// @return Returns the offset in the buffer where the string starts. Offset CreateString(char *str) { return CreateString(str, strlen(str)); } /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const reference to a std::string to store in the buffer. /// @return Returns the offset in the buffer where the string starts. Offset CreateString(const std::string &str) { return CreateString(str.c_str(), str.length()); } // clang-format off #ifdef FLATBUFFERS_HAS_STRING_VIEW /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const string_view to copy in to the buffer. /// @return Returns the offset in the buffer where the string starts. Offset CreateString(flatbuffers::string_view str) { return CreateString(str.data(), str.size()); } #endif // FLATBUFFERS_HAS_STRING_VIEW // clang-format on /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const pointer to a `String` struct to add to the buffer. /// @return Returns the offset in the buffer where the string starts Offset CreateString(const String *str) { return str ? CreateString(str->c_str(), str->size()) : 0; } /// @brief Store a string in the buffer, which can contain any binary data. /// @param[in] str A const reference to a std::string like type with support /// of T::c_str() and T::length() to store in the buffer. /// @return Returns the offset in the buffer where the string starts. template Offset CreateString(const T &str) { return CreateString(str.c_str(), str.length()); } /// @brief Store a string in the buffer, which can contain any binary data. /// If a string with this exact contents has already been serialized before, /// instead simply returns the offset of the existing string. This uses a map /// stored on the heap, but only stores the numerical offsets. /// @param[in] str A const char pointer to the data to be stored as a string. /// @param[in] len The number of bytes that should be stored from `str`. /// @return Returns the offset in the buffer where the string starts. Offset CreateSharedString(const char *str, size_t len) { FLATBUFFERS_ASSERT(FLATBUFFERS_GENERAL_HEAP_ALLOC_OK); if (!string_pool) string_pool = new StringOffsetMap(StringOffsetCompare(buf_)); auto size_before_string = buf_.size(); // Must first serialize the string, since the set is all offsets into // buffer. auto off = CreateString(str, len); auto it = string_pool->find(off); // If it exists we reuse existing serialized data! if (it != string_pool->end()) { // We can remove the string we serialized. buf_.pop(buf_.size() - size_before_string); return *it; } // Record this string for future use. string_pool->insert(off); return off; } #ifdef FLATBUFFERS_HAS_STRING_VIEW /// @brief Store a string in the buffer, which can contain any binary data. /// If a string with this exact contents has already been serialized before, /// instead simply returns the offset of the existing string. This uses a map /// stored on the heap, but only stores the numerical offsets. /// @param[in] str A const std::string_view to store in the buffer. /// @return Returns the offset in the buffer where the string starts Offset CreateSharedString(const flatbuffers::string_view str) { return CreateSharedString(str.data(), str.size()); } #else /// @brief Store a string in the buffer, which null-terminated. /// If a string with this exact contents has already been serialized before, /// instead simply returns the offset of the existing string. This uses a map /// stored on the heap, but only stores the numerical offsets. /// @param[in] str A const char pointer to a C-string to add to the buffer. /// @return Returns the offset in the buffer where the string starts. Offset CreateSharedString(const char *str) { return CreateSharedString(str, strlen(str)); } /// @brief Store a string in the buffer, which can contain any binary data. /// If a string with this exact contents has already been serialized before, /// instead simply returns the offset of the existing string. This uses a map /// stored on the heap, but only stores the numerical offsets. /// @param[in] str A const reference to a std::string to store in the buffer. /// @return Returns the offset in the buffer where the string starts. Offset CreateSharedString(const std::string &str) { return CreateSharedString(str.c_str(), str.length()); } #endif /// @brief Store a string in the buffer, which can contain any binary data. /// If a string with this exact contents has already been serialized before, /// instead simply returns the offset of the existing string. This uses a map /// stored on the heap, but only stores the numerical offsets. /// @param[in] str A const pointer to a `String` struct to add to the buffer. /// @return Returns the offset in the buffer where the string starts Offset CreateSharedString(const String *str) { return CreateSharedString(str->c_str(), str->size()); } /// @cond FLATBUFFERS_INTERNAL uoffset_t EndVector(size_t len) { FLATBUFFERS_ASSERT(nested); // Hit if no corresponding StartVector. nested = false; return PushElement(static_cast(len)); } void StartVector(size_t len, size_t elemsize) { NotNested(); nested = true; PreAlign(len * elemsize); PreAlign(len * elemsize, elemsize); // Just in case elemsize > uoffset_t. } // Call this right before StartVector/CreateVector if you want to force the // alignment to be something different than what the element size would // normally dictate. // This is useful when storing a nested_flatbuffer in a vector of bytes, // or when storing SIMD floats, etc. void ForceVectorAlignment(size_t len, size_t elemsize, size_t alignment) { if (len == 0) return; FLATBUFFERS_ASSERT(VerifyAlignmentRequirements(alignment)); PreAlign(len * elemsize, alignment); } // Similar to ForceVectorAlignment but for String fields. void ForceStringAlignment(size_t len, size_t alignment) { if (len == 0) return; FLATBUFFERS_ASSERT(VerifyAlignmentRequirements(alignment)); PreAlign((len + 1) * sizeof(char), alignment); } /// @endcond /// @brief Serialize an array into a FlatBuffer `vector`. /// @tparam T The data type of the array elements. /// @param[in] v A pointer to the array of type `T` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVector(const T *v, size_t len) { // If this assert hits, you're specifying a template argument that is // causing the wrong overload to be selected, remove it. AssertScalarT(); StartVector(len, sizeof(T)); if (len == 0) { return Offset>(EndVector(len)); } // clang-format off #if FLATBUFFERS_LITTLEENDIAN PushBytes(reinterpret_cast(v), len * sizeof(T)); #else if (sizeof(T) == 1) { PushBytes(reinterpret_cast(v), len); } else { for (auto i = len; i > 0; ) { PushElement(v[--i]); } } #endif // clang-format on return Offset>(EndVector(len)); } /// @brief Serialize an array like object into a FlatBuffer `vector`. /// @tparam T The data type of the array elements. /// @tparam C The type of the array. /// @param[in] array A reference to an array like object of type `T` to /// serialize into the buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVector(const C &array) { return CreateVector(array.data(), array.size()); } /// @brief Serialize an initializer list into a FlatBuffer `vector`. /// @tparam T The data type of the initializer list elements. /// @param[in] v The value of the initializer list. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVector(std::initializer_list v) { return CreateVector(v.begin(), v.size()); } template Offset>> CreateVector(const Offset *v, size_t len) { StartVector(len, sizeof(Offset)); for (auto i = len; i > 0;) { PushElement(v[--i]); } return Offset>>(EndVector(len)); } /// @brief Serialize a `std::vector` into a FlatBuffer `vector`. /// @tparam T The data type of the `std::vector` elements. /// @param v A const reference to the `std::vector` to serialize into the /// buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset> CreateVector(const std::vector &v) { return CreateVector(data(v), v.size()); } // vector may be implemented using a bit-set, so we can't access it as // an array. Instead, read elements manually. // Background: https://isocpp.org/blog/2012/11/on-vectorbool Offset> CreateVector(const std::vector &v) { StartVector(v.size(), sizeof(uint8_t)); for (auto i = v.size(); i > 0;) { PushElement(static_cast(v[--i])); } return Offset>(EndVector(v.size())); } /// @brief Serialize values returned by a function into a FlatBuffer `vector`. /// This is a convenience function that takes care of iteration for you. /// @tparam T The data type of the `std::vector` elements. /// @param f A function that takes the current iteration 0..vector_size-1 and /// returns any type that you can construct a FlatBuffers vector out of. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVector(size_t vector_size, const std::function &f) { FLATBUFFERS_ASSERT(FLATBUFFERS_GENERAL_HEAP_ALLOC_OK); std::vector elems(vector_size); for (size_t i = 0; i < vector_size; i++) elems[i] = f(i); return CreateVector(elems); } /// @brief Serialize values returned by a function into a FlatBuffer `vector`. /// This is a convenience function that takes care of iteration for you. This /// uses a vector stored on the heap to store the intermediate results of the /// iteration. /// @tparam T The data type of the `std::vector` elements. /// @param f A function that takes the current iteration 0..vector_size-1, /// and the state parameter returning any type that you can construct a /// FlatBuffers vector out of. /// @param state State passed to f. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVector(size_t vector_size, F f, S *state) { FLATBUFFERS_ASSERT(FLATBUFFERS_GENERAL_HEAP_ALLOC_OK); std::vector elems(vector_size); for (size_t i = 0; i < vector_size; i++) elems[i] = f(i, state); return CreateVector(elems); } /// @brief Serialize a `std::vector` into a FlatBuffer `vector`. /// whereas StringType is any type that is accepted by the CreateString() /// overloads. /// This is a convenience function for a common case. /// @param v A const reference to the `std::vector` to serialize into the /// buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset>> CreateVectorOfStrings( const std::vector &v) { return CreateVectorOfStrings(v.cbegin(), v.cend()); } /// @brief Serialize a collection of Strings into a FlatBuffer `vector`. /// This is a convenience function for a common case. /// @param begin The beginning iterator of the collection /// @param end The ending iterator of the collection /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset>> CreateVectorOfStrings(It begin, It end) { auto size = std::distance(begin, end); auto scratch_buffer_usage = size * sizeof(Offset); // If there is not enough space to store the offsets, there definitely won't // be enough space to store all the strings. So ensuring space for the // scratch region is OK, for it it fails, it would have failed later. buf_.ensure_space(scratch_buffer_usage); for (auto it = begin; it != end; ++it) { buf_.scratch_push_small(CreateString(*it)); } StartVector(size, sizeof(Offset)); for (auto i = 1; i <= size; i++) { // Note we re-evaluate the buf location each iteration to account for any // underlying buffer resizing that may occur. PushElement(*reinterpret_cast *>( buf_.scratch_end() - i * sizeof(Offset))); } buf_.scratch_pop(scratch_buffer_usage); return Offset>>(EndVector(size)); } /// @brief Serialize an array of structs into a FlatBuffer `vector`. /// @tparam T The data type of the struct array elements. /// @param[in] v A pointer to the array of type `T` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVectorOfStructs(const T *v, size_t len) { StartVector(len * sizeof(T) / AlignOf(), AlignOf()); if (len > 0) { PushBytes(reinterpret_cast(v), sizeof(T) * len); } return Offset>(EndVector(len)); } /// @brief Serialize an array of native structs into a FlatBuffer `vector`. /// @tparam T The data type of the struct array elements. /// @tparam S The data type of the native struct array elements. /// @param[in] v A pointer to the array of type `S` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. /// @param[in] pack_func Pointer to a function to convert the native struct /// to the FlatBuffer struct. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVectorOfNativeStructs( const S *v, size_t len, T (*const pack_func)(const S &)) { FLATBUFFERS_ASSERT(pack_func); auto structs = StartVectorOfStructs(len); for (size_t i = 0; i < len; i++) { structs[i] = pack_func(v[i]); } return EndVectorOfStructs(len); } /// @brief Serialize an array of native structs into a FlatBuffer `vector`. /// @tparam T The data type of the struct array elements. /// @tparam S The data type of the native struct array elements. /// @param[in] v A pointer to the array of type `S` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVectorOfNativeStructs(const S *v, size_t len) { extern T Pack(const S &); return CreateVectorOfNativeStructs(v, len, Pack); } /// @brief Serialize an array of structs into a FlatBuffer `vector`. /// @tparam T The data type of the struct array elements. /// @param[in] filler A function that takes the current iteration /// 0..vector_size-1 and a pointer to the struct that must be filled. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. /// This is mostly useful when flatbuffers are generated with mutation /// accessors. template Offset> CreateVectorOfStructs( size_t vector_size, const std::function &filler) { T *structs = StartVectorOfStructs(vector_size); for (size_t i = 0; i < vector_size; i++) { filler(i, structs); structs++; } return EndVectorOfStructs(vector_size); } /// @brief Serialize an array of structs into a FlatBuffer `vector`. /// @tparam T The data type of the struct array elements. /// @param[in] f A function that takes the current iteration 0..vector_size-1, /// a pointer to the struct that must be filled and the state argument. /// @param[in] state Arbitrary state to pass to f. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. /// This is mostly useful when flatbuffers are generated with mutation /// accessors. template Offset> CreateVectorOfStructs(size_t vector_size, F f, S *state) { T *structs = StartVectorOfStructs(vector_size); for (size_t i = 0; i < vector_size; i++) { f(i, structs, state); structs++; } return EndVectorOfStructs(vector_size); } /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector`. /// @tparam T The data type of the `std::vector` struct elements. /// @param[in] v A const reference to the `std::vector` of structs to /// serialize into the buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset> CreateVectorOfStructs( const std::vector &v) { return CreateVectorOfStructs(data(v), v.size()); } /// @brief Serialize a `std::vector` of native structs into a FlatBuffer /// `vector`. /// @tparam T The data type of the `std::vector` struct elements. /// @tparam S The data type of the `std::vector` native struct elements. /// @param[in] v A const reference to the `std::vector` of structs to /// serialize into the buffer as a `vector`. /// @param[in] pack_func Pointer to a function to convert the native struct /// to the FlatBuffer struct. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset> CreateVectorOfNativeStructs( const std::vector &v, T (*const pack_func)(const S &)) { return CreateVectorOfNativeStructs(data(v), v.size(), pack_func); } /// @brief Serialize a `std::vector` of native structs into a FlatBuffer /// `vector`. /// @tparam T The data type of the `std::vector` struct elements. /// @tparam S The data type of the `std::vector` native struct elements. /// @param[in] v A const reference to the `std::vector` of structs to /// serialize into the buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset> CreateVectorOfNativeStructs( const std::vector &v) { return CreateVectorOfNativeStructs(data(v), v.size()); } /// @cond FLATBUFFERS_INTERNAL template struct StructKeyComparator { bool operator()(const T &a, const T &b) const { return a.KeyCompareLessThan(&b); } }; /// @endcond /// @brief Serialize a `std::vector` of structs into a FlatBuffer `vector` /// in sorted order. /// @tparam T The data type of the `std::vector` struct elements. /// @param[in] v A const reference to the `std::vector` of structs to /// serialize into the buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset> CreateVectorOfSortedStructs( std::vector *v) { return CreateVectorOfSortedStructs(data(*v), v->size()); } /// @brief Serialize a `std::vector` of native structs into a FlatBuffer /// `vector` in sorted order. /// @tparam T The data type of the `std::vector` struct elements. /// @tparam S The data type of the `std::vector` native struct elements. /// @param[in] v A const reference to the `std::vector` of structs to /// serialize into the buffer as a `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset> CreateVectorOfSortedNativeStructs( std::vector *v) { return CreateVectorOfSortedNativeStructs(data(*v), v->size()); } /// @brief Serialize an array of structs into a FlatBuffer `vector` in sorted /// order. /// @tparam T The data type of the struct array elements. /// @param[in] v A pointer to the array of type `T` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVectorOfSortedStructs(T *v, size_t len) { std::stable_sort(v, v + len, StructKeyComparator()); return CreateVectorOfStructs(v, len); } /// @brief Serialize an array of native structs into a FlatBuffer `vector` in /// sorted order. /// @tparam T The data type of the struct array elements. /// @tparam S The data type of the native struct array elements. /// @param[in] v A pointer to the array of type `S` to serialize into the /// buffer as a `vector`. /// @param[in] len The number of elements to serialize. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset> CreateVectorOfSortedNativeStructs(S *v, size_t len) { extern T Pack(const S &); auto structs = StartVectorOfStructs(len); for (size_t i = 0; i < len; i++) { structs[i] = Pack(v[i]); } std::stable_sort(structs, structs + len, StructKeyComparator()); return EndVectorOfStructs(len); } /// @cond FLATBUFFERS_INTERNAL template struct TableKeyComparator { TableKeyComparator(vector_downward &buf) : buf_(buf) {} TableKeyComparator(const TableKeyComparator &other) : buf_(other.buf_) {} bool operator()(const Offset &a, const Offset &b) const { auto table_a = reinterpret_cast(buf_.data_at(a.o)); auto table_b = reinterpret_cast(buf_.data_at(b.o)); return table_a->KeyCompareLessThan(table_b); } vector_downward &buf_; private: FLATBUFFERS_DELETE_FUNC( TableKeyComparator &operator=(const TableKeyComparator &other)); }; /// @endcond /// @brief Serialize an array of `table` offsets as a `vector` in the buffer /// in sorted order. /// @tparam T The data type that the offset refers to. /// @param[in] v An array of type `Offset` that contains the `table` /// offsets to store in the buffer in sorted order. /// @param[in] len The number of elements to store in the `vector`. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template Offset>> CreateVectorOfSortedTables(Offset *v, size_t len) { std::stable_sort(v, v + len, TableKeyComparator(buf_)); return CreateVector(v, len); } /// @brief Serialize an array of `table` offsets as a `vector` in the buffer /// in sorted order. /// @tparam T The data type that the offset refers to. /// @param[in] v An array of type `Offset` that contains the `table` /// offsets to store in the buffer in sorted order. /// @return Returns a typed `Offset` into the serialized data indicating /// where the vector is stored. template> Offset>> CreateVectorOfSortedTables( std::vector, Alloc> *v) { return CreateVectorOfSortedTables(data(*v), v->size()); } /// @brief Specialized version of `CreateVector` for non-copying use cases. /// Write the data any time later to the returned buffer pointer `buf`. /// @param[in] len The number of elements to store in the `vector`. /// @param[in] elemsize The size of each element in the `vector`. /// @param[out] buf A pointer to a `uint8_t` pointer that can be /// written to at a later time to serialize the data into a `vector` /// in the buffer. uoffset_t CreateUninitializedVector(size_t len, size_t elemsize, uint8_t **buf) { NotNested(); StartVector(len, elemsize); buf_.make_space(len * elemsize); auto vec_start = GetSize(); auto vec_end = EndVector(len); *buf = buf_.data_at(vec_start); return vec_end; } /// @brief Specialized version of `CreateVector` for non-copying use cases. /// Write the data any time later to the returned buffer pointer `buf`. /// @tparam T The data type of the data that will be stored in the buffer /// as a `vector`. /// @param[in] len The number of elements to store in the `vector`. /// @param[out] buf A pointer to a pointer of type `T` that can be /// written to at a later time to serialize the data into a `vector` /// in the buffer. template Offset> CreateUninitializedVector(size_t len, T **buf) { AssertScalarT(); return CreateUninitializedVector(len, sizeof(T), reinterpret_cast(buf)); } template Offset> CreateUninitializedVectorOfStructs(size_t len, T **buf) { return CreateUninitializedVector(len, sizeof(T), reinterpret_cast(buf)); } // @brief Create a vector of scalar type T given as input a vector of scalar // type U, useful with e.g. pre "enum class" enums, or any existing scalar // data of the wrong type. template Offset> CreateVectorScalarCast(const U *v, size_t len) { AssertScalarT(); AssertScalarT(); StartVector(len, sizeof(T)); for (auto i = len; i > 0;) { PushElement(static_cast(v[--i])); } return Offset>(EndVector(len)); } /// @brief Write a struct by itself, typically to be part of a union. template Offset CreateStruct(const T &structobj) { NotNested(); Align(AlignOf()); buf_.push_small(structobj); return Offset(GetSize()); } /// @brief Finish serializing a buffer by writing the root offset. /// @param[in] file_identifier If a `file_identifier` is given, the buffer /// will be prefixed with a standard FlatBuffers file header. template void Finish(Offset root, const char *file_identifier = nullptr) { Finish(root.o, file_identifier, false); } /// @brief Finish a buffer with a 32 bit size field pre-fixed (size of the /// buffer following the size field). These buffers are NOT compatible /// with standard buffers created by Finish, i.e. you can't call GetRoot /// on them, you have to use GetSizePrefixedRoot instead. /// All >32 bit quantities in this buffer will be aligned when the whole /// size pre-fixed buffer is aligned. /// These kinds of buffers are useful for creating a stream of FlatBuffers. template void FinishSizePrefixed(Offset root, const char *file_identifier = nullptr) { Finish(root.o, file_identifier, true); } void SwapBufAllocator(FlatBufferBuilder &other) { buf_.swap_allocator(other.buf_); } /// @brief The length of a FlatBuffer file header. static const size_t kFileIdentifierLength = ::mapserver::flatbuffers::kFileIdentifierLength; protected: // You shouldn't really be copying instances of this class. FlatBufferBuilder(const FlatBufferBuilder &); FlatBufferBuilder &operator=(const FlatBufferBuilder &); void Finish(uoffset_t root, const char *file_identifier, bool size_prefix) { NotNested(); buf_.clear_scratch(); // This will cause the whole buffer to be aligned. PreAlign((size_prefix ? sizeof(uoffset_t) : 0) + sizeof(uoffset_t) + (file_identifier ? kFileIdentifierLength : 0), minalign_); if (file_identifier) { FLATBUFFERS_ASSERT(strlen(file_identifier) == kFileIdentifierLength); PushBytes(reinterpret_cast(file_identifier), kFileIdentifierLength); } PushElement(ReferTo(root)); // Location of root. if (size_prefix) { PushElement(GetSize()); } finished = true; } struct FieldLoc { uoffset_t off; voffset_t id; }; vector_downward buf_; // Accumulating offsets of table members while it is being built. // We store these in the scratch pad of buf_, after the vtable offsets. uoffset_t num_field_loc; // Track how much of the vtable is in use, so we can output the most compact // possible vtable. voffset_t max_voffset_; // Ensure objects are not nested. bool nested; // Ensure the buffer is finished before it is being accessed. bool finished; size_t minalign_; bool force_defaults_; // Serialize values equal to their defaults anyway. bool dedup_vtables_; struct StringOffsetCompare { StringOffsetCompare(const vector_downward &buf) : buf_(&buf) {} bool operator()(const Offset &a, const Offset &b) const { auto stra = reinterpret_cast(buf_->data_at(a.o)); auto strb = reinterpret_cast(buf_->data_at(b.o)); return StringLessThan(stra->data(), stra->size(), strb->data(), strb->size()); } const vector_downward *buf_; }; // For use with CreateSharedString. Instantiated on first use only. typedef std::set, StringOffsetCompare> StringOffsetMap; StringOffsetMap *string_pool; private: // Allocates space for a vector of structures. // Must be completed with EndVectorOfStructs(). template T *StartVectorOfStructs(size_t vector_size) { StartVector(vector_size * sizeof(T) / AlignOf(), AlignOf()); return reinterpret_cast(buf_.make_space(vector_size * sizeof(T))); } // End the vector of structures in the flatbuffers. // Vector should have previously be started with StartVectorOfStructs(). template Offset> EndVectorOfStructs(size_t vector_size) { return Offset>(EndVector(vector_size)); } }; /// @} /// Helpers to get a typed pointer to objects that are currently being built. /// @warning Creating new objects will lead to reallocations and invalidates /// the pointer! template T *GetMutableTemporaryPointer(FlatBufferBuilder &fbb, Offset offset) { return reinterpret_cast(fbb.GetCurrentBufferPointer() + fbb.GetSize() - offset.o); } template const T *GetTemporaryPointer(FlatBufferBuilder &fbb, Offset offset) { return GetMutableTemporaryPointer(fbb, offset); } template void FlatBufferBuilder::Required(Offset table, voffset_t field) { auto table_ptr = reinterpret_cast(buf_.data_at(table.o)); bool ok = table_ptr->GetOptionalFieldOffset(field) != 0; // If this fails, the caller will show what field needs to be set. FLATBUFFERS_ASSERT(ok); (void)ok; } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_VECTOR_DOWNWARD_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/flatbuffers.h000066400000000000000000000242521511405061000250360ustar00rootroot00000000000000/* * Copyright 2014 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. */ #ifndef FLATBUFFERS_H_ #define FLATBUFFERS_H_ // TODO: These includes are for mitigating the pains of users editing their // source because they relied on flatbuffers.h to include everything for them. #include "flatbuffers/array.h" #include "flatbuffers/base.h" #include "flatbuffers/buffer.h" #include "flatbuffers/buffer_ref.h" #include "flatbuffers/detached_buffer.h" #include "flatbuffers/flatbuffer_builder.h" #include "flatbuffers/stl_emulation.h" #include "flatbuffers/string.h" #include "flatbuffers/struct.h" #include "flatbuffers/table.h" #include "flatbuffers/vector.h" #include "flatbuffers/vector_downward.h" #include "flatbuffers/verifier.h" namespace mapserver { namespace flatbuffers { /// @brief This can compute the start of a FlatBuffer from a root pointer, i.e. /// it is the opposite transformation of GetRoot(). /// This may be useful if you want to pass on a root and have the recipient /// delete the buffer afterwards. inline const uint8_t *GetBufferStartFromRootPointer(const void *root) { auto table = reinterpret_cast(root); auto vtable = table->GetVTable(); // Either the vtable is before the root or after the root. auto start = (std::min)(vtable, reinterpret_cast(root)); // Align to at least sizeof(uoffset_t). start = reinterpret_cast(reinterpret_cast(start) & ~(sizeof(uoffset_t) - 1)); // Additionally, there may be a file_identifier in the buffer, and the root // offset. The buffer may have been aligned to any size between // sizeof(uoffset_t) and FLATBUFFERS_MAX_ALIGNMENT (see "force_align"). // Sadly, the exact alignment is only known when constructing the buffer, // since it depends on the presence of values with said alignment properties. // So instead, we simply look at the next uoffset_t values (root, // file_identifier, and alignment padding) to see which points to the root. // None of the other values can "impersonate" the root since they will either // be 0 or four ASCII characters. static_assert(flatbuffers::kFileIdentifierLength == sizeof(uoffset_t), "file_identifier is assumed to be the same size as uoffset_t"); for (auto possible_roots = FLATBUFFERS_MAX_ALIGNMENT / sizeof(uoffset_t) + 1; possible_roots; possible_roots--) { start -= sizeof(uoffset_t); if (ReadScalar(start) + start == reinterpret_cast(root)) return start; } // We didn't find the root, either the "root" passed isn't really a root, // or the buffer is corrupt. // Assert, because calling this function with bad data may cause reads // outside of buffer boundaries. FLATBUFFERS_ASSERT(false); return nullptr; } /// @brief This return the prefixed size of a FlatBuffer. inline uoffset_t GetPrefixedSize(const uint8_t *buf) { return ReadScalar(buf); } // Base class for native objects (FlatBuffer data de-serialized into native // C++ data structures). // Contains no functionality, purely documentative. struct NativeTable {}; /// @brief Function types to be used with resolving hashes into objects and /// back again. The resolver gets a pointer to a field inside an object API /// object that is of the type specified in the schema using the attribute /// `cpp_type` (it is thus important whatever you write to this address /// matches that type). The value of this field is initially null, so you /// may choose to implement a delayed binding lookup using this function /// if you wish. The resolver does the opposite lookup, for when the object /// is being serialized again. typedef uint64_t hash_value_t; typedef std::function resolver_function_t; typedef std::function rehasher_function_t; // Helper function to test if a field is present, using any of the field // enums in the generated code. // `table` must be a generated table type. Since this is a template parameter, // this is not typechecked to be a subclass of Table, so beware! // Note: this function will return false for fields equal to the default // value, since they're not stored in the buffer (unless force_defaults was // used). template bool IsFieldPresent(const T *table, typename T::FlatBuffersVTableOffset field) { // Cast, since Table is a private baseclass of any table types. return reinterpret_cast(table)->CheckField( static_cast(field)); } // Utility function for reverse lookups on the EnumNames*() functions // (in the generated C++ code) // names must be NULL terminated. inline int LookupEnum(const char **names, const char *name) { for (const char **p = names; *p; p++) if (!strcmp(*p, name)) return static_cast(p - names); return -1; } // These macros allow us to layout a struct with a guarantee that they'll end // up looking the same on different compilers and platforms. // It does this by disallowing the compiler to do any padding, and then // does padding itself by inserting extra padding fields that make every // element aligned to its own size. // Additionally, it manually sets the alignment of the struct as a whole, // which is typically its largest element, or a custom size set in the schema // by the force_align attribute. // These are used in the generated code only. // clang-format off #if defined(_MSC_VER) #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \ __pragma(pack(1)) \ struct __declspec(align(alignment)) #define FLATBUFFERS_STRUCT_END(name, size) \ __pragma(pack()) \ static_assert(sizeof(name) == size, "compiler breaks packing rules") #elif defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__) #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \ _Pragma("pack(1)") \ struct __attribute__((aligned(alignment))) #define FLATBUFFERS_STRUCT_END(name, size) \ _Pragma("pack()") \ static_assert(sizeof(name) == size, "compiler breaks packing rules") #else #error Unknown compiler, please define structure alignment macros #endif // clang-format on // Minimal reflection via code generation. // Besides full-fat reflection (see reflection.h) and parsing/printing by // loading schemas (see idl.h), we can also have code generation for minimal // reflection data which allows pretty-printing and other uses without needing // a schema or a parser. // Generate code with --reflect-types (types only) or --reflect-names (names // also) to enable. // See minireflect.h for utilities using this functionality. // These types are organized slightly differently as the ones in idl.h. enum SequenceType { ST_TABLE, ST_STRUCT, ST_UNION, ST_ENUM }; // Scalars have the same order as in idl.h // clang-format off #define FLATBUFFERS_GEN_ELEMENTARY_TYPES(ET) \ ET(ET_UTYPE) \ ET(ET_BOOL) \ ET(ET_CHAR) \ ET(ET_UCHAR) \ ET(ET_SHORT) \ ET(ET_USHORT) \ ET(ET_INT) \ ET(ET_UINT) \ ET(ET_LONG) \ ET(ET_ULONG) \ ET(ET_FLOAT) \ ET(ET_DOUBLE) \ ET(ET_STRING) \ ET(ET_SEQUENCE) // See SequenceType. enum ElementaryType { #define FLATBUFFERS_ET(E) E, FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET) #undef FLATBUFFERS_ET }; inline const char * const *ElementaryTypeNames() { static const char * const names[] = { #define FLATBUFFERS_ET(E) #E, FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET) #undef FLATBUFFERS_ET }; return names; } // clang-format on // Basic type info cost just 16bits per field! // We're explicitly defining the signedness since the signedness of integer // bitfields is otherwise implementation-defined and causes warnings on older // GCC compilers. struct TypeCode { // ElementaryType unsigned short base_type : 4; // Either vector (in table) or array (in struct) unsigned short is_repeating : 1; // Index into type_refs below, or -1 for none. signed short sequence_ref : 11; }; static_assert(sizeof(TypeCode) == 2, "TypeCode"); struct TypeTable; // Signature of the static method present in each type. typedef const TypeTable *(*TypeFunction)(); struct TypeTable { SequenceType st; size_t num_elems; // of type_codes, values, names (but not type_refs). const TypeCode *type_codes; // num_elems count const TypeFunction *type_refs; // less than num_elems entries (see TypeCode). const int16_t *array_sizes; // less than num_elems entries (see TypeCode). const int64_t *values; // Only set for non-consecutive enum/union or structs. const char *const *names; // Only set if compiled with --reflect-names. }; // String which identifies the current version of FlatBuffers. inline const char *flatbuffers_version_string() { return "FlatBuffers " FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR) "." FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR) "." FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION); } // clang-format off #define FLATBUFFERS_DEFINE_BITMASK_OPERATORS(E, T)\ inline E operator | (E lhs, E rhs){\ return E(T(lhs) | T(rhs));\ }\ inline E operator & (E lhs, E rhs){\ return E(T(lhs) & T(rhs));\ }\ inline E operator ^ (E lhs, E rhs){\ return E(T(lhs) ^ T(rhs));\ }\ inline E operator ~ (E lhs){\ return E(~T(lhs));\ }\ inline E operator |= (E &lhs, E rhs){\ lhs = lhs | rhs;\ return lhs;\ }\ inline E operator &= (E &lhs, E rhs){\ lhs = lhs & rhs;\ return lhs;\ }\ inline E operator ^= (E &lhs, E rhs){\ lhs = lhs ^ rhs;\ return lhs;\ }\ inline bool operator !(E rhs) \ {\ return !bool(T(rhs)); \ } /// @endcond } // namespace flatbuffers } // namespace mapserver // clang-format on #endif // FLATBUFFERS_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/flatc.h000066400000000000000000000073271511405061000236300ustar00rootroot00000000000000/* * Copyright 2017 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. */ #ifndef FLATBUFFERS_FLATC_H_ #define FLATBUFFERS_FLATC_H_ #include #include #include #include "flatbuffers/bfbs_generator.h" #include "flatbuffers/flatbuffers.h" #include "flatbuffers/idl.h" #include "flatbuffers/util.h" namespace mapserver { namespace flatbuffers { extern void LogCompilerWarn(const std::string &warn); extern void LogCompilerError(const std::string &err); struct FlatCOption { std::string short_opt; std::string long_opt; std::string parameter; std::string description; }; class FlatCompiler { public: // Output generator for the various programming languages and formats we // support. struct Generator { typedef bool (*GenerateFn)(const flatbuffers::Parser &parser, const std::string &path, const std::string &file_name); typedef std::string (*MakeRuleFn)(const flatbuffers::Parser &parser, const std::string &path, const std::string &file_name); typedef bool (*ParsingCompletedFn)(const flatbuffers::Parser &parser, const std::string &output_path); GenerateFn generate; const char *lang_name; bool schema_only; GenerateFn generateGRPC; flatbuffers::IDLOptions::Language lang; FlatCOption option; MakeRuleFn make_rule; BfbsGenerator *bfbs_generator; ParsingCompletedFn parsing_completed; }; typedef void (*WarnFn)(const FlatCompiler *flatc, const std::string &warn, bool show_exe_name); typedef void (*ErrorFn)(const FlatCompiler *flatc, const std::string &err, bool usage, bool show_exe_name); // Parameters required to initialize the FlatCompiler. struct InitParams { InitParams() : generators(nullptr), num_generators(0), warn_fn(nullptr), error_fn(nullptr) {} const Generator *generators; size_t num_generators; WarnFn warn_fn; ErrorFn error_fn; }; explicit FlatCompiler(const InitParams ¶ms) : params_(params) {} int Compile(int argc, const char **argv); std::string GetShortUsageString(const char *program_name) const; std::string GetUsageString(const char *program_name) const; private: void ParseFile(flatbuffers::Parser &parser, const std::string &filename, const std::string &contents, std::vector &include_directories) const; void LoadBinarySchema(Parser &parser, const std::string &filename, const std::string &contents); void Warn(const std::string &warn, bool show_exe_name = true) const; void Error(const std::string &err, bool usage = true, bool show_exe_name = true) const; void AnnotateBinaries(const uint8_t *binary_schema, uint64_t binary_schema_size, const std::string & schema_filename, const std::vector &binary_files); InitParams params_; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_FLATC_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/flex_flat_util.h000066400000000000000000000023041511405061000255260ustar00rootroot00000000000000/* * Copyright 2022 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. */ #ifndef FLATBUFFERS_FLEX_FLAT_UTIL_H_ #define FLATBUFFERS_FLEX_FLAT_UTIL_H_ #include "flatbuffers/flatbuffers.h" #include "flatbuffers/flexbuffers.h" namespace flexbuffers { // Verifies the `nested` flexbuffer within a flatbuffer vector is valid. inline bool VerifyNestedFlexBuffer( const flatbuffers::Vector *const nested, flatbuffers::Verifier &verifier) { if (!nested) return true; return verifier.Check(flexbuffers::VerifyBuffer( nested->data(), nested->size(), verifier.GetFlexReuseTracker())); } } // namespace flexbuffers #endif // FLATBUFFERS_FLEX_FLAT_UTIL_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/flexbuffers.h000066400000000000000000001767761511405061000250710ustar00rootroot00000000000000/* * Copyright 2017 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. */ #ifndef FLATBUFFERS_FLEXBUFFERS_H_ #define FLATBUFFERS_FLEXBUFFERS_H_ #include // Used to select STL variant. #include "flatbuffers/base.h" // We use the basic binary writing functions from the regular FlatBuffers. #include "flatbuffers/util.h" #ifdef _MSC_VER # include #endif #if defined(_MSC_VER) # pragma warning(push) # pragma warning(disable : 4127) // C4127: conditional expression is constant #endif namespace flexbuffers { class Reference; class Map; // These are used in the lower 2 bits of a type field to determine the size of // the elements (and or size field) of the item pointed to (e.g. vector). enum BitWidth { BIT_WIDTH_8 = 0, BIT_WIDTH_16 = 1, BIT_WIDTH_32 = 2, BIT_WIDTH_64 = 3, }; // These are used as the upper 6 bits of a type field to indicate the actual // type. enum Type { FBT_NULL = 0, FBT_INT = 1, FBT_UINT = 2, FBT_FLOAT = 3, // Types above stored inline, types below (except FBT_BOOL) store an offset. FBT_KEY = 4, FBT_STRING = 5, FBT_INDIRECT_INT = 6, FBT_INDIRECT_UINT = 7, FBT_INDIRECT_FLOAT = 8, FBT_MAP = 9, FBT_VECTOR = 10, // Untyped. FBT_VECTOR_INT = 11, // Typed any size (stores no type table). FBT_VECTOR_UINT = 12, FBT_VECTOR_FLOAT = 13, FBT_VECTOR_KEY = 14, // DEPRECATED, use FBT_VECTOR or FBT_VECTOR_KEY instead. // Read test.cpp/FlexBuffersDeprecatedTest() for details on why. FBT_VECTOR_STRING_DEPRECATED = 15, FBT_VECTOR_INT2 = 16, // Typed tuple (no type table, no size field). FBT_VECTOR_UINT2 = 17, FBT_VECTOR_FLOAT2 = 18, FBT_VECTOR_INT3 = 19, // Typed triple (no type table, no size field). FBT_VECTOR_UINT3 = 20, FBT_VECTOR_FLOAT3 = 21, FBT_VECTOR_INT4 = 22, // Typed quad (no type table, no size field). FBT_VECTOR_UINT4 = 23, FBT_VECTOR_FLOAT4 = 24, FBT_BLOB = 25, FBT_BOOL = 26, FBT_VECTOR_BOOL = 36, // To Allow the same type of conversion of type to vector type FBT_MAX_TYPE = 37 }; inline bool IsInline(Type t) { return t <= FBT_FLOAT || t == FBT_BOOL; } inline bool IsTypedVectorElementType(Type t) { return (t >= FBT_INT && t <= FBT_STRING) || t == FBT_BOOL; } inline bool IsTypedVector(Type t) { return (t >= FBT_VECTOR_INT && t <= FBT_VECTOR_STRING_DEPRECATED) || t == FBT_VECTOR_BOOL; } inline bool IsFixedTypedVector(Type t) { return t >= FBT_VECTOR_INT2 && t <= FBT_VECTOR_FLOAT4; } inline Type ToTypedVector(Type t, size_t fixed_len = 0) { FLATBUFFERS_ASSERT(IsTypedVectorElementType(t)); switch (fixed_len) { case 0: return static_cast(t - FBT_INT + FBT_VECTOR_INT); case 2: return static_cast(t - FBT_INT + FBT_VECTOR_INT2); case 3: return static_cast(t - FBT_INT + FBT_VECTOR_INT3); case 4: return static_cast(t - FBT_INT + FBT_VECTOR_INT4); default: FLATBUFFERS_ASSERT(0); return FBT_NULL; } } inline Type ToTypedVectorElementType(Type t) { FLATBUFFERS_ASSERT(IsTypedVector(t)); return static_cast(t - FBT_VECTOR_INT + FBT_INT); } inline Type ToFixedTypedVectorElementType(Type t, uint8_t *len) { FLATBUFFERS_ASSERT(IsFixedTypedVector(t)); auto fixed_type = t - FBT_VECTOR_INT2; *len = static_cast(fixed_type / 3 + 2); // 3 types each, starting from length 2. return static_cast(fixed_type % 3 + FBT_INT); } // TODO: implement proper support for 8/16bit floats, or decide not to // support them. typedef int16_t half; typedef int8_t quarter; // TODO: can we do this without conditionals using intrinsics or inline asm // on some platforms? Given branch prediction the method below should be // decently quick, but it is the most frequently executed function. // We could do an (unaligned) 64-bit read if we ifdef out the platforms for // which that doesn't work (or where we'd read into un-owned memory). template R ReadSizedScalar(const uint8_t *data, uint8_t byte_width) { return byte_width < 4 ? (byte_width < 2 ? static_cast(flatbuffers::ReadScalar(data)) : static_cast(flatbuffers::ReadScalar(data))) : (byte_width < 8 ? static_cast(flatbuffers::ReadScalar(data)) : static_cast(flatbuffers::ReadScalar(data))); } inline int64_t ReadInt64(const uint8_t *data, uint8_t byte_width) { return ReadSizedScalar( data, byte_width); } inline uint64_t ReadUInt64(const uint8_t *data, uint8_t byte_width) { // This is the "hottest" function (all offset lookups use this), so worth // optimizing if possible. // TODO: GCC apparently replaces memcpy by a rep movsb, but only if count is a // constant, which here it isn't. Test if memcpy is still faster than // the conditionals in ReadSizedScalar. Can also use inline asm. // clang-format off #if defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC) // This is 64-bit Windows only, __movsb does not work on 32-bit Windows. uint64_t u = 0; __movsb(reinterpret_cast(&u), reinterpret_cast(data), byte_width); return flatbuffers::EndianScalar(u); #else return ReadSizedScalar( data, byte_width); #endif // clang-format on } inline double ReadDouble(const uint8_t *data, uint8_t byte_width) { return ReadSizedScalar(data, byte_width); } inline const uint8_t *Indirect(const uint8_t *offset, uint8_t byte_width) { return offset - ReadUInt64(offset, byte_width); } template const uint8_t *Indirect(const uint8_t *offset) { return offset - flatbuffers::ReadScalar(offset); } inline BitWidth WidthU(uint64_t u) { #define FLATBUFFERS_GET_FIELD_BIT_WIDTH(value, width) \ { \ if (!((u) & ~((1ULL << (width)) - 1ULL))) return BIT_WIDTH_##width; \ } FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 8); FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 16); FLATBUFFERS_GET_FIELD_BIT_WIDTH(u, 32); #undef FLATBUFFERS_GET_FIELD_BIT_WIDTH return BIT_WIDTH_64; } inline BitWidth WidthI(int64_t i) { auto u = static_cast(i) << 1; return WidthU(i >= 0 ? u : ~u); } inline BitWidth WidthF(double f) { return static_cast(static_cast(f)) == f ? BIT_WIDTH_32 : BIT_WIDTH_64; } // Base class of all types below. // Points into the data buffer and allows access to one type. class Object { public: Object(const uint8_t *data, uint8_t byte_width) : data_(data), byte_width_(byte_width) {} protected: const uint8_t *data_; uint8_t byte_width_; }; // Object that has a size, obtained either from size prefix, or elsewhere. class Sized : public Object { public: // Size prefix. Sized(const uint8_t *data, uint8_t byte_width) : Object(data, byte_width), size_(read_size()) {} // Manual size. Sized(const uint8_t *data, uint8_t byte_width, size_t sz) : Object(data, byte_width), size_(sz) {} size_t size() const { return size_; } // Access size stored in `byte_width_` bytes before data_ pointer. size_t read_size() const { return static_cast(ReadUInt64(data_ - byte_width_, byte_width_)); } protected: size_t size_; }; class String : public Sized { public: // Size prefix. String(const uint8_t *data, uint8_t byte_width) : Sized(data, byte_width) {} // Manual size. String(const uint8_t *data, uint8_t byte_width, size_t sz) : Sized(data, byte_width, sz) {} size_t length() const { return size(); } const char *c_str() const { return reinterpret_cast(data_); } std::string str() const { return std::string(c_str(), size()); } static String EmptyString() { static const char *empty_string = ""; return String(reinterpret_cast(empty_string), 1, 0); } bool IsTheEmptyString() const { return data_ == EmptyString().data_; } }; class Blob : public Sized { public: Blob(const uint8_t *data_buf, uint8_t byte_width) : Sized(data_buf, byte_width) {} static Blob EmptyBlob() { static const uint8_t empty_blob[] = { 0 /*len*/ }; return Blob(empty_blob + 1, 1); } bool IsTheEmptyBlob() const { return data_ == EmptyBlob().data_; } const uint8_t *data() const { return data_; } }; class Vector : public Sized { public: Vector(const uint8_t *data, uint8_t byte_width) : Sized(data, byte_width) {} Reference operator[](size_t i) const; static Vector EmptyVector() { static const uint8_t empty_vector[] = { 0 /*len*/ }; return Vector(empty_vector + 1, 1); } bool IsTheEmptyVector() const { return data_ == EmptyVector().data_; } }; class TypedVector : public Sized { public: TypedVector(const uint8_t *data, uint8_t byte_width, Type element_type) : Sized(data, byte_width), type_(element_type) {} Reference operator[](size_t i) const; static TypedVector EmptyTypedVector() { static const uint8_t empty_typed_vector[] = { 0 /*len*/ }; return TypedVector(empty_typed_vector + 1, 1, FBT_INT); } bool IsTheEmptyVector() const { return data_ == TypedVector::EmptyTypedVector().data_; } Type ElementType() { return type_; } friend Reference; private: Type type_; friend Map; }; class FixedTypedVector : public Object { public: FixedTypedVector(const uint8_t *data, uint8_t byte_width, Type element_type, uint8_t len) : Object(data, byte_width), type_(element_type), len_(len) {} Reference operator[](size_t i) const; static FixedTypedVector EmptyFixedTypedVector() { static const uint8_t fixed_empty_vector[] = { 0 /* unused */ }; return FixedTypedVector(fixed_empty_vector, 1, FBT_INT, 0); } bool IsTheEmptyFixedTypedVector() const { return data_ == FixedTypedVector::EmptyFixedTypedVector().data_; } Type ElementType() const { return type_; } uint8_t size() const { return len_; } private: Type type_; uint8_t len_; }; class Map : public Vector { public: Map(const uint8_t *data, uint8_t byte_width) : Vector(data, byte_width) {} Reference operator[](const char *key) const; Reference operator[](const std::string &key) const; Vector Values() const { return Vector(data_, byte_width_); } TypedVector Keys() const { const size_t num_prefixed_fields = 3; auto keys_offset = data_ - byte_width_ * num_prefixed_fields; return TypedVector(Indirect(keys_offset, byte_width_), static_cast( ReadUInt64(keys_offset + byte_width_, byte_width_)), FBT_KEY); } static Map EmptyMap() { static const uint8_t empty_map[] = { 0 /*keys_len*/, 0 /*keys_offset*/, 1 /*keys_width*/, 0 /*len*/ }; return Map(empty_map + 4, 1); } bool IsTheEmptyMap() const { return data_ == EmptyMap().data_; } }; template void AppendToString(std::string &s, T &&v, bool keys_quoted) { s += "[ "; for (size_t i = 0; i < v.size(); i++) { if (i) s += ", "; v[i].ToString(true, keys_quoted, s); } s += " ]"; } class Reference { public: Reference() : data_(nullptr), parent_width_(0), byte_width_(0), type_(FBT_NULL) {} Reference(const uint8_t *data, uint8_t parent_width, uint8_t byte_width, Type type) : data_(data), parent_width_(parent_width), byte_width_(byte_width), type_(type) {} Reference(const uint8_t *data, uint8_t parent_width, uint8_t packed_type) : data_(data), parent_width_(parent_width) { byte_width_ = 1U << static_cast(packed_type & 3); type_ = static_cast(packed_type >> 2); } Type GetType() const { return type_; } bool IsNull() const { return type_ == FBT_NULL; } bool IsBool() const { return type_ == FBT_BOOL; } bool IsInt() const { return type_ == FBT_INT || type_ == FBT_INDIRECT_INT; } bool IsUInt() const { return type_ == FBT_UINT || type_ == FBT_INDIRECT_UINT; } bool IsIntOrUint() const { return IsInt() || IsUInt(); } bool IsFloat() const { return type_ == FBT_FLOAT || type_ == FBT_INDIRECT_FLOAT; } bool IsNumeric() const { return IsIntOrUint() || IsFloat(); } bool IsString() const { return type_ == FBT_STRING; } bool IsKey() const { return type_ == FBT_KEY; } bool IsVector() const { return type_ == FBT_VECTOR || type_ == FBT_MAP; } bool IsUntypedVector() const { return type_ == FBT_VECTOR; } bool IsTypedVector() const { return flexbuffers::IsTypedVector(type_); } bool IsFixedTypedVector() const { return flexbuffers::IsFixedTypedVector(type_); } bool IsAnyVector() const { return (IsTypedVector() || IsFixedTypedVector() || IsVector()); } bool IsMap() const { return type_ == FBT_MAP; } bool IsBlob() const { return type_ == FBT_BLOB; } bool AsBool() const { return (type_ == FBT_BOOL ? ReadUInt64(data_, parent_width_) : AsUInt64()) != 0; } // Reads any type as a int64_t. Never fails, does most sensible conversion. // Truncates floats, strings are attempted to be parsed for a number, // vectors/maps return their size. Returns 0 if all else fails. int64_t AsInt64() const { if (type_ == FBT_INT) { // A fast path for the common case. return ReadInt64(data_, parent_width_); } else switch (type_) { case FBT_INDIRECT_INT: return ReadInt64(Indirect(), byte_width_); case FBT_UINT: return ReadUInt64(data_, parent_width_); case FBT_INDIRECT_UINT: return ReadUInt64(Indirect(), byte_width_); case FBT_FLOAT: return static_cast(ReadDouble(data_, parent_width_)); case FBT_INDIRECT_FLOAT: return static_cast(ReadDouble(Indirect(), byte_width_)); case FBT_NULL: return 0; case FBT_STRING: return flatbuffers::StringToInt(AsString().c_str()); case FBT_VECTOR: return static_cast(AsVector().size()); case FBT_BOOL: return ReadInt64(data_, parent_width_); default: // Convert other things to int. return 0; } } // TODO: could specialize these to not use AsInt64() if that saves // extension ops in generated code, and use a faster op than ReadInt64. int32_t AsInt32() const { return static_cast(AsInt64()); } int16_t AsInt16() const { return static_cast(AsInt64()); } int8_t AsInt8() const { return static_cast(AsInt64()); } uint64_t AsUInt64() const { if (type_ == FBT_UINT) { // A fast path for the common case. return ReadUInt64(data_, parent_width_); } else switch (type_) { case FBT_INDIRECT_UINT: return ReadUInt64(Indirect(), byte_width_); case FBT_INT: return ReadInt64(data_, parent_width_); case FBT_INDIRECT_INT: return ReadInt64(Indirect(), byte_width_); case FBT_FLOAT: return static_cast(ReadDouble(data_, parent_width_)); case FBT_INDIRECT_FLOAT: return static_cast(ReadDouble(Indirect(), byte_width_)); case FBT_NULL: return 0; case FBT_STRING: return flatbuffers::StringToUInt(AsString().c_str()); case FBT_VECTOR: return static_cast(AsVector().size()); case FBT_BOOL: return ReadUInt64(data_, parent_width_); default: // Convert other things to uint. return 0; } } uint32_t AsUInt32() const { return static_cast(AsUInt64()); } uint16_t AsUInt16() const { return static_cast(AsUInt64()); } uint8_t AsUInt8() const { return static_cast(AsUInt64()); } double AsDouble() const { if (type_ == FBT_FLOAT) { // A fast path for the common case. return ReadDouble(data_, parent_width_); } else switch (type_) { case FBT_INDIRECT_FLOAT: return ReadDouble(Indirect(), byte_width_); case FBT_INT: return static_cast(ReadInt64(data_, parent_width_)); case FBT_UINT: return static_cast(ReadUInt64(data_, parent_width_)); case FBT_INDIRECT_INT: return static_cast(ReadInt64(Indirect(), byte_width_)); case FBT_INDIRECT_UINT: return static_cast(ReadUInt64(Indirect(), byte_width_)); case FBT_NULL: return 0.0; case FBT_STRING: { double d; flatbuffers::StringToNumber(AsString().c_str(), &d); return d; } case FBT_VECTOR: return static_cast(AsVector().size()); case FBT_BOOL: return static_cast(ReadUInt64(data_, parent_width_)); default: // Convert strings and other things to float. return 0; } } float AsFloat() const { return static_cast(AsDouble()); } const char *AsKey() const { if (type_ == FBT_KEY || type_ == FBT_STRING) { return reinterpret_cast(Indirect()); } else { return ""; } } // This function returns the empty string if you try to read something that // is not a string or key. String AsString() const { if (type_ == FBT_STRING) { return String(Indirect(), byte_width_); } else if (type_ == FBT_KEY) { auto key = Indirect(); return String(key, byte_width_, strlen(reinterpret_cast(key))); } else { return String::EmptyString(); } } // Unlike AsString(), this will convert any type to a std::string. std::string ToString() const { std::string s; ToString(false, false, s); return s; } // Convert any type to a JSON-like string. strings_quoted determines if // string values at the top level receive "" quotes (inside other values // they always do). keys_quoted determines if keys are quoted, at any level. // TODO(wvo): add further options to have indentation/newlines. void ToString(bool strings_quoted, bool keys_quoted, std::string &s) const { if (type_ == FBT_STRING) { String str(Indirect(), byte_width_); if (strings_quoted) { flatbuffers::EscapeString(str.c_str(), str.length(), &s, true, false); } else { s.append(str.c_str(), str.length()); } } else if (IsKey()) { auto str = AsKey(); if (keys_quoted) { flatbuffers::EscapeString(str, strlen(str), &s, true, false); } else { s += str; } } else if (IsInt()) { s += flatbuffers::NumToString(AsInt64()); } else if (IsUInt()) { s += flatbuffers::NumToString(AsUInt64()); } else if (IsFloat()) { s += flatbuffers::NumToString(AsDouble()); } else if (IsNull()) { s += "null"; } else if (IsBool()) { s += AsBool() ? "true" : "false"; } else if (IsMap()) { s += "{ "; auto m = AsMap(); auto keys = m.Keys(); auto vals = m.Values(); for (size_t i = 0; i < keys.size(); i++) { bool kq = keys_quoted; if (!kq) { // FlexBuffers keys may contain arbitrary characters, only allow // unquoted if it looks like an "identifier": const char *p = keys[i].AsKey(); if (!flatbuffers::is_alpha(*p) && *p != '_') { kq = true; } else { while (*++p) { if (!flatbuffers::is_alnum(*p) && *p != '_') { kq = true; break; } } } } keys[i].ToString(true, kq, s); s += ": "; vals[i].ToString(true, keys_quoted, s); if (i < keys.size() - 1) s += ", "; } s += " }"; } else if (IsVector()) { AppendToString(s, AsVector(), keys_quoted); } else if (IsTypedVector()) { AppendToString(s, AsTypedVector(), keys_quoted); } else if (IsFixedTypedVector()) { AppendToString(s, AsFixedTypedVector(), keys_quoted); } else if (IsBlob()) { auto blob = AsBlob(); flatbuffers::EscapeString(reinterpret_cast(blob.data()), blob.size(), &s, true, false); } else { s += "(?)"; } } // This function returns the empty blob if you try to read a not-blob. // Strings can be viewed as blobs too. Blob AsBlob() const { if (type_ == FBT_BLOB || type_ == FBT_STRING) { return Blob(Indirect(), byte_width_); } else { return Blob::EmptyBlob(); } } // This function returns the empty vector if you try to read a not-vector. // Maps can be viewed as vectors too. Vector AsVector() const { if (type_ == FBT_VECTOR || type_ == FBT_MAP) { return Vector(Indirect(), byte_width_); } else { return Vector::EmptyVector(); } } TypedVector AsTypedVector() const { if (IsTypedVector()) { auto tv = TypedVector(Indirect(), byte_width_, ToTypedVectorElementType(type_)); if (tv.type_ == FBT_STRING) { // These can't be accessed as strings, since we don't know the bit-width // of the size field, see the declaration of // FBT_VECTOR_STRING_DEPRECATED above for details. // We change the type here to be keys, which are a subtype of strings, // and will ignore the size field. This will truncate strings with // embedded nulls. tv.type_ = FBT_KEY; } return tv; } else { return TypedVector::EmptyTypedVector(); } } FixedTypedVector AsFixedTypedVector() const { if (IsFixedTypedVector()) { uint8_t len = 0; auto vtype = ToFixedTypedVectorElementType(type_, &len); return FixedTypedVector(Indirect(), byte_width_, vtype, len); } else { return FixedTypedVector::EmptyFixedTypedVector(); } } Map AsMap() const { if (type_ == FBT_MAP) { return Map(Indirect(), byte_width_); } else { return Map::EmptyMap(); } } template T As() const; // Experimental: Mutation functions. // These allow scalars in an already created buffer to be updated in-place. // Since by default scalars are stored in the smallest possible space, // the new value may not fit, in which case these functions return false. // To avoid this, you can construct the values you intend to mutate using // Builder::ForceMinimumBitWidth. bool MutateInt(int64_t i) { if (type_ == FBT_INT) { return Mutate(data_, i, parent_width_, WidthI(i)); } else if (type_ == FBT_INDIRECT_INT) { return Mutate(Indirect(), i, byte_width_, WidthI(i)); } else if (type_ == FBT_UINT) { auto u = static_cast(i); return Mutate(data_, u, parent_width_, WidthU(u)); } else if (type_ == FBT_INDIRECT_UINT) { auto u = static_cast(i); return Mutate(Indirect(), u, byte_width_, WidthU(u)); } else { return false; } } bool MutateBool(bool b) { return type_ == FBT_BOOL && Mutate(data_, b, parent_width_, BIT_WIDTH_8); } bool MutateUInt(uint64_t u) { if (type_ == FBT_UINT) { return Mutate(data_, u, parent_width_, WidthU(u)); } else if (type_ == FBT_INDIRECT_UINT) { return Mutate(Indirect(), u, byte_width_, WidthU(u)); } else if (type_ == FBT_INT) { auto i = static_cast(u); return Mutate(data_, i, parent_width_, WidthI(i)); } else if (type_ == FBT_INDIRECT_INT) { auto i = static_cast(u); return Mutate(Indirect(), i, byte_width_, WidthI(i)); } else { return false; } } bool MutateFloat(float f) { if (type_ == FBT_FLOAT) { return MutateF(data_, f, parent_width_, BIT_WIDTH_32); } else if (type_ == FBT_INDIRECT_FLOAT) { return MutateF(Indirect(), f, byte_width_, BIT_WIDTH_32); } else { return false; } } bool MutateFloat(double d) { if (type_ == FBT_FLOAT) { return MutateF(data_, d, parent_width_, WidthF(d)); } else if (type_ == FBT_INDIRECT_FLOAT) { return MutateF(Indirect(), d, byte_width_, WidthF(d)); } else { return false; } } bool MutateString(const char *str, size_t len) { auto s = AsString(); if (s.IsTheEmptyString()) return false; // This is very strict, could allow shorter strings, but that creates // garbage. if (s.length() != len) return false; memcpy(const_cast(s.c_str()), str, len); return true; } bool MutateString(const char *str) { return MutateString(str, strlen(str)); } bool MutateString(const std::string &str) { return MutateString(str.data(), str.length()); } private: const uint8_t *Indirect() const { return flexbuffers::Indirect(data_, parent_width_); } template bool Mutate(const uint8_t *dest, T t, size_t byte_width, BitWidth value_width) { auto fits = static_cast(static_cast(1U) << value_width) <= byte_width; if (fits) { t = flatbuffers::EndianScalar(t); memcpy(const_cast(dest), &t, byte_width); } return fits; } template bool MutateF(const uint8_t *dest, T t, size_t byte_width, BitWidth value_width) { if (byte_width == sizeof(double)) return Mutate(dest, static_cast(t), byte_width, value_width); if (byte_width == sizeof(float)) return Mutate(dest, static_cast(t), byte_width, value_width); FLATBUFFERS_ASSERT(false); return false; } friend class Verifier; const uint8_t *data_; uint8_t parent_width_; uint8_t byte_width_; Type type_; }; // Template specialization for As(). template<> inline bool Reference::As() const { return AsBool(); } template<> inline int8_t Reference::As() const { return AsInt8(); } template<> inline int16_t Reference::As() const { return AsInt16(); } template<> inline int32_t Reference::As() const { return AsInt32(); } template<> inline int64_t Reference::As() const { return AsInt64(); } template<> inline uint8_t Reference::As() const { return AsUInt8(); } template<> inline uint16_t Reference::As() const { return AsUInt16(); } template<> inline uint32_t Reference::As() const { return AsUInt32(); } template<> inline uint64_t Reference::As() const { return AsUInt64(); } template<> inline double Reference::As() const { return AsDouble(); } template<> inline float Reference::As() const { return AsFloat(); } template<> inline String Reference::As() const { return AsString(); } template<> inline std::string Reference::As() const { return AsString().str(); } template<> inline Blob Reference::As() const { return AsBlob(); } template<> inline Vector Reference::As() const { return AsVector(); } template<> inline TypedVector Reference::As() const { return AsTypedVector(); } template<> inline FixedTypedVector Reference::As() const { return AsFixedTypedVector(); } template<> inline Map Reference::As() const { return AsMap(); } inline uint8_t PackedType(BitWidth bit_width, Type type) { return static_cast(bit_width | (type << 2)); } inline uint8_t NullPackedType() { return PackedType(BIT_WIDTH_8, FBT_NULL); } // Vector accessors. // Note: if you try to access outside of bounds, you get a Null value back // instead. Normally this would be an assert, but since this is "dynamically // typed" data, you may not want that (someone sends you a 2d vector and you // wanted 3d). // The Null converts seamlessly into a default value for any other type. // TODO(wvo): Could introduce an #ifdef that makes this into an assert? inline Reference Vector::operator[](size_t i) const { auto len = size(); if (i >= len) return Reference(nullptr, 1, NullPackedType()); auto packed_type = (data_ + len * byte_width_)[i]; auto elem = data_ + i * byte_width_; return Reference(elem, byte_width_, packed_type); } inline Reference TypedVector::operator[](size_t i) const { auto len = size(); if (i >= len) return Reference(nullptr, 1, NullPackedType()); auto elem = data_ + i * byte_width_; return Reference(elem, byte_width_, 1, type_); } inline Reference FixedTypedVector::operator[](size_t i) const { if (i >= len_) return Reference(nullptr, 1, NullPackedType()); auto elem = data_ + i * byte_width_; return Reference(elem, byte_width_, 1, type_); } template int KeyCompare(const void *key, const void *elem) { auto str_elem = reinterpret_cast( Indirect(reinterpret_cast(elem))); auto skey = reinterpret_cast(key); return strcmp(skey, str_elem); } inline Reference Map::operator[](const char *key) const { auto keys = Keys(); // We can't pass keys.byte_width_ to the comparison function, so we have // to pick the right one ahead of time. int (*comp)(const void *, const void *) = nullptr; switch (keys.byte_width_) { case 1: comp = KeyCompare; break; case 2: comp = KeyCompare; break; case 4: comp = KeyCompare; break; case 8: comp = KeyCompare; break; default: FLATBUFFERS_ASSERT(false); return Reference(); } auto res = std::bsearch(key, keys.data_, keys.size(), keys.byte_width_, comp); if (!res) return Reference(nullptr, 1, NullPackedType()); auto i = (reinterpret_cast(res) - keys.data_) / keys.byte_width_; return (*static_cast(this))[i]; } inline Reference Map::operator[](const std::string &key) const { return (*this)[key.c_str()]; } inline Reference GetRoot(const uint8_t *buffer, size_t size) { // See Finish() below for the serialization counterpart of this. // The root starts at the end of the buffer, so we parse backwards from there. auto end = buffer + size; auto byte_width = *--end; auto packed_type = *--end; end -= byte_width; // The root data item. return Reference(end, byte_width, packed_type); } inline Reference GetRoot(const std::vector &buffer) { return GetRoot(buffer.data(), buffer.size()); } // Flags that configure how the Builder behaves. // The "Share" flags determine if the Builder automatically tries to pool // this type. Pooling can reduce the size of serialized data if there are // multiple maps of the same kind, at the expense of slightly slower // serialization (the cost of lookups) and more memory use (std::set). // By default this is on for keys, but off for strings. // Turn keys off if you have e.g. only one map. // Turn strings on if you expect many non-unique string values. // Additionally, sharing key vectors can save space if you have maps with // identical field populations. enum BuilderFlag { BUILDER_FLAG_NONE = 0, BUILDER_FLAG_SHARE_KEYS = 1, BUILDER_FLAG_SHARE_STRINGS = 2, BUILDER_FLAG_SHARE_KEYS_AND_STRINGS = 3, BUILDER_FLAG_SHARE_KEY_VECTORS = 4, BUILDER_FLAG_SHARE_ALL = 7, }; class Builder FLATBUFFERS_FINAL_CLASS { public: Builder(size_t initial_size = 256, BuilderFlag flags = BUILDER_FLAG_SHARE_KEYS) : buf_(initial_size), finished_(false), has_duplicate_keys_(false), flags_(flags), force_min_bit_width_(BIT_WIDTH_8), key_pool(KeyOffsetCompare(buf_)), string_pool(StringOffsetCompare(buf_)) { buf_.clear(); } #ifdef FLATBUFFERS_DEFAULT_DECLARATION Builder(Builder &&) = default; Builder &operator=(Builder &&) = default; #endif /// @brief Get the serialized buffer (after you call `Finish()`). /// @return Returns a vector owned by this class. const std::vector &GetBuffer() const { Finished(); return buf_; } // Size of the buffer. Does not include unfinished values. size_t GetSize() const { return buf_.size(); } // Reset all state so we can re-use the buffer. void Clear() { buf_.clear(); stack_.clear(); finished_ = false; // flags_ remains as-is; force_min_bit_width_ = BIT_WIDTH_8; key_pool.clear(); string_pool.clear(); } // All value constructing functions below have two versions: one that // takes a key (for placement inside a map) and one that doesn't (for inside // vectors and elsewhere). void Null() { stack_.push_back(Value()); } void Null(const char *key) { Key(key); Null(); } void Int(int64_t i) { stack_.push_back(Value(i, FBT_INT, WidthI(i))); } void Int(const char *key, int64_t i) { Key(key); Int(i); } void UInt(uint64_t u) { stack_.push_back(Value(u, FBT_UINT, WidthU(u))); } void UInt(const char *key, uint64_t u) { Key(key); UInt(u); } void Float(float f) { stack_.push_back(Value(f)); } void Float(const char *key, float f) { Key(key); Float(f); } void Double(double f) { stack_.push_back(Value(f)); } void Double(const char *key, double d) { Key(key); Double(d); } void Bool(bool b) { stack_.push_back(Value(b)); } void Bool(const char *key, bool b) { Key(key); Bool(b); } void IndirectInt(int64_t i) { PushIndirect(i, FBT_INDIRECT_INT, WidthI(i)); } void IndirectInt(const char *key, int64_t i) { Key(key); IndirectInt(i); } void IndirectUInt(uint64_t u) { PushIndirect(u, FBT_INDIRECT_UINT, WidthU(u)); } void IndirectUInt(const char *key, uint64_t u) { Key(key); IndirectUInt(u); } void IndirectFloat(float f) { PushIndirect(f, FBT_INDIRECT_FLOAT, BIT_WIDTH_32); } void IndirectFloat(const char *key, float f) { Key(key); IndirectFloat(f); } void IndirectDouble(double f) { PushIndirect(f, FBT_INDIRECT_FLOAT, WidthF(f)); } void IndirectDouble(const char *key, double d) { Key(key); IndirectDouble(d); } size_t Key(const char *str, size_t len) { auto sloc = buf_.size(); WriteBytes(str, len + 1); if (flags_ & BUILDER_FLAG_SHARE_KEYS) { auto it = key_pool.find(sloc); if (it != key_pool.end()) { // Already in the buffer. Remove key we just serialized, and use // existing offset instead. buf_.resize(sloc); sloc = *it; } else { key_pool.insert(sloc); } } stack_.push_back(Value(static_cast(sloc), FBT_KEY, BIT_WIDTH_8)); return sloc; } size_t Key(const char *str) { return Key(str, strlen(str)); } size_t Key(const std::string &str) { return Key(str.c_str(), str.size()); } size_t String(const char *str, size_t len) { auto reset_to = buf_.size(); auto sloc = CreateBlob(str, len, 1, FBT_STRING); if (flags_ & BUILDER_FLAG_SHARE_STRINGS) { StringOffset so(sloc, len); auto it = string_pool.find(so); if (it != string_pool.end()) { // Already in the buffer. Remove string we just serialized, and use // existing offset instead. buf_.resize(reset_to); sloc = it->first; stack_.back().u_ = sloc; } else { string_pool.insert(so); } } return sloc; } size_t String(const char *str) { return String(str, strlen(str)); } size_t String(const std::string &str) { return String(str.c_str(), str.size()); } void String(const flexbuffers::String &str) { String(str.c_str(), str.length()); } void String(const char *key, const char *str) { Key(key); String(str); } void String(const char *key, const std::string &str) { Key(key); String(str); } void String(const char *key, const flexbuffers::String &str) { Key(key); String(str); } size_t Blob(const void *data, size_t len) { return CreateBlob(data, len, 0, FBT_BLOB); } size_t Blob(const std::vector &v) { return CreateBlob(v.data(), v.size(), 0, FBT_BLOB); } void Blob(const char *key, const void *data, size_t len) { Key(key); Blob(data, len); } void Blob(const char *key, const std::vector &v) { Key(key); Blob(v); } // TODO(wvo): support all the FlexBuffer types (like flexbuffers::String), // e.g. Vector etc. Also in overloaded versions. // Also some FlatBuffers types? size_t StartVector() { return stack_.size(); } size_t StartVector(const char *key) { Key(key); return stack_.size(); } size_t StartMap() { return stack_.size(); } size_t StartMap(const char *key) { Key(key); return stack_.size(); } // TODO(wvo): allow this to specify an alignment greater than the natural // alignment. size_t EndVector(size_t start, bool typed, bool fixed) { auto vec = CreateVector(start, stack_.size() - start, 1, typed, fixed); // Remove temp elements and return vector. stack_.resize(start); stack_.push_back(vec); return static_cast(vec.u_); } size_t EndMap(size_t start) { // We should have interleaved keys and values on the stack. // Make sure it is an even number: auto len = stack_.size() - start; FLATBUFFERS_ASSERT(!(len & 1)); len /= 2; // Make sure keys are all strings: for (auto key = start; key < stack_.size(); key += 2) { FLATBUFFERS_ASSERT(stack_[key].type_ == FBT_KEY); } // Now sort values, so later we can do a binary search lookup. // We want to sort 2 array elements at a time. struct TwoValue { Value key; Value val; }; // TODO(wvo): strict aliasing? // TODO(wvo): allow the caller to indicate the data is already sorted // for maximum efficiency? With an assert to check sortedness to make sure // we're not breaking binary search. // Or, we can track if the map is sorted as keys are added which would be // be quite cheap (cheaper than checking it here), so we can skip this // step automatically when appliccable, and encourage people to write in // sorted fashion. // std::sort is typically already a lot faster on sorted data though. auto dict = reinterpret_cast(stack_.data() + start); std::sort( dict, dict + len, [&](const TwoValue &a, const TwoValue &b) -> bool { auto as = reinterpret_cast(buf_.data() + a.key.u_); auto bs = reinterpret_cast(buf_.data() + b.key.u_); auto comp = strcmp(as, bs); // We want to disallow duplicate keys, since this results in a // map where values cannot be found. // But we can't assert here (since we don't want to fail on // random JSON input) or have an error mechanism. // Instead, we set has_duplicate_keys_ in the builder to // signal this. // TODO: Have to check for pointer equality, as some sort // implementation apparently call this function with the same // element?? Why? if (!comp && &a != &b) has_duplicate_keys_ = true; return comp < 0; }); // First create a vector out of all keys. // TODO(wvo): if kBuilderFlagShareKeyVectors is true, see if we can share // the first vector. auto keys = CreateVector(start, len, 2, true, false); auto vec = CreateVector(start + 1, len, 2, false, false, &keys); // Remove temp elements and return map. stack_.resize(start); stack_.push_back(vec); return static_cast(vec.u_); } // Call this after EndMap to see if the map had any duplicate keys. // Any map with such keys won't be able to retrieve all values. bool HasDuplicateKeys() const { return has_duplicate_keys_; } template size_t Vector(F f) { auto start = StartVector(); f(); return EndVector(start, false, false); } template size_t Vector(F f, T &state) { auto start = StartVector(); f(state); return EndVector(start, false, false); } template size_t Vector(const char *key, F f) { auto start = StartVector(key); f(); return EndVector(start, false, false); } template size_t Vector(const char *key, F f, T &state) { auto start = StartVector(key); f(state); return EndVector(start, false, false); } template void Vector(const T *elems, size_t len) { if (flatbuffers::is_scalar::value) { // This path should be a lot quicker and use less space. ScalarVector(elems, len, false); } else { auto start = StartVector(); for (size_t i = 0; i < len; i++) Add(elems[i]); EndVector(start, false, false); } } template void Vector(const char *key, const T *elems, size_t len) { Key(key); Vector(elems, len); } template void Vector(const std::vector &vec) { Vector(vec.data(), vec.size()); } template size_t TypedVector(F f) { auto start = StartVector(); f(); return EndVector(start, true, false); } template size_t TypedVector(F f, T &state) { auto start = StartVector(); f(state); return EndVector(start, true, false); } template size_t TypedVector(const char *key, F f) { auto start = StartVector(key); f(); return EndVector(start, true, false); } template size_t TypedVector(const char *key, F f, T &state) { auto start = StartVector(key); f(state); return EndVector(start, true, false); } template size_t FixedTypedVector(const T *elems, size_t len) { // We only support a few fixed vector lengths. Anything bigger use a // regular typed vector. FLATBUFFERS_ASSERT(len >= 2 && len <= 4); // And only scalar values. static_assert(flatbuffers::is_scalar::value, "Unrelated types"); return ScalarVector(elems, len, true); } template size_t FixedTypedVector(const char *key, const T *elems, size_t len) { Key(key); return FixedTypedVector(elems, len); } template size_t Map(F f) { auto start = StartMap(); f(); return EndMap(start); } template size_t Map(F f, T &state) { auto start = StartMap(); f(state); return EndMap(start); } template size_t Map(const char *key, F f) { auto start = StartMap(key); f(); return EndMap(start); } template size_t Map(const char *key, F f, T &state) { auto start = StartMap(key); f(state); return EndMap(start); } template void Map(const std::map &map) { auto start = StartMap(); for (auto it = map.begin(); it != map.end(); ++it) Add(it->first.c_str(), it->second); EndMap(start); } // If you wish to share a value explicitly (a value not shared automatically // through one of the BUILDER_FLAG_SHARE_* flags) you can do so with these // functions. Or if you wish to turn those flags off for performance reasons // and still do some explicit sharing. For example: // builder.IndirectDouble(M_PI); // auto id = builder.LastValue(); // Remember where we stored it. // .. more code goes here .. // builder.ReuseValue(id); // Refers to same double by offset. // LastValue works regardless of whether the value has a key or not. // Works on any data type. struct Value; Value LastValue() { return stack_.back(); } void ReuseValue(Value v) { stack_.push_back(v); } void ReuseValue(const char *key, Value v) { Key(key); ReuseValue(v); } // Overloaded Add that tries to call the correct function above. void Add(int8_t i) { Int(i); } void Add(int16_t i) { Int(i); } void Add(int32_t i) { Int(i); } void Add(int64_t i) { Int(i); } void Add(uint8_t u) { UInt(u); } void Add(uint16_t u) { UInt(u); } void Add(uint32_t u) { UInt(u); } void Add(uint64_t u) { UInt(u); } void Add(float f) { Float(f); } void Add(double d) { Double(d); } void Add(bool b) { Bool(b); } void Add(const char *str) { String(str); } void Add(const std::string &str) { String(str); } void Add(const flexbuffers::String &str) { String(str); } template void Add(const std::vector &vec) { Vector(vec); } template void Add(const char *key, const T &t) { Key(key); Add(t); } template void Add(const std::map &map) { Map(map); } template void operator+=(const T &t) { Add(t); } // This function is useful in combination with the Mutate* functions above. // It forces elements of vectors and maps to have a minimum size, such that // they can later be updated without failing. // Call with no arguments to reset. void ForceMinimumBitWidth(BitWidth bw = BIT_WIDTH_8) { force_min_bit_width_ = bw; } void Finish() { // If you hit this assert, you likely have objects that were never included // in a parent. You need to have exactly one root to finish a buffer. // Check your Start/End calls are matched, and all objects are inside // some other object. FLATBUFFERS_ASSERT(stack_.size() == 1); // Write root value. auto byte_width = Align(stack_[0].ElemWidth(buf_.size(), 0)); WriteAny(stack_[0], byte_width); // Write root type. Write(stack_[0].StoredPackedType(), 1); // Write root size. Normally determined by parent, but root has no parent :) Write(byte_width, 1); finished_ = true; } private: void Finished() const { // If you get this assert, you're attempting to get access a buffer // which hasn't been finished yet. Be sure to call // Builder::Finish with your root object. FLATBUFFERS_ASSERT(finished_); } // Align to prepare for writing a scalar with a certain size. uint8_t Align(BitWidth alignment) { auto byte_width = 1U << alignment; buf_.insert(buf_.end(), flatbuffers::PaddingBytes(buf_.size(), byte_width), 0); return static_cast(byte_width); } void WriteBytes(const void *val, size_t size) { buf_.insert(buf_.end(), reinterpret_cast(val), reinterpret_cast(val) + size); } template void Write(T val, size_t byte_width) { FLATBUFFERS_ASSERT(sizeof(T) >= byte_width); val = flatbuffers::EndianScalar(val); WriteBytes(&val, byte_width); } void WriteDouble(double f, uint8_t byte_width) { switch (byte_width) { case 8: Write(f, byte_width); break; case 4: Write(static_cast(f), byte_width); break; // case 2: Write(static_cast(f), byte_width); break; // case 1: Write(static_cast(f), byte_width); break; default: FLATBUFFERS_ASSERT(0); } } void WriteOffset(uint64_t o, uint8_t byte_width) { auto reloff = buf_.size() - o; FLATBUFFERS_ASSERT(byte_width == 8 || reloff < 1ULL << (byte_width * 8)); Write(reloff, byte_width); } template void PushIndirect(T val, Type type, BitWidth bit_width) { auto byte_width = Align(bit_width); auto iloc = buf_.size(); Write(val, byte_width); stack_.push_back(Value(static_cast(iloc), type, bit_width)); } static BitWidth WidthB(size_t byte_width) { switch (byte_width) { case 1: return BIT_WIDTH_8; case 2: return BIT_WIDTH_16; case 4: return BIT_WIDTH_32; case 8: return BIT_WIDTH_64; default: FLATBUFFERS_ASSERT(false); return BIT_WIDTH_64; } } template static Type GetScalarType() { static_assert(flatbuffers::is_scalar::value, "Unrelated types"); return flatbuffers::is_floating_point::value ? FBT_FLOAT : flatbuffers::is_same::value ? FBT_BOOL : (flatbuffers::is_unsigned::value ? FBT_UINT : FBT_INT); } public: // This was really intended to be private, except for LastValue/ReuseValue. struct Value { union { int64_t i_; uint64_t u_; double f_; }; Type type_; // For scalars: of itself, for vector: of its elements, for string: length. BitWidth min_bit_width_; Value() : i_(0), type_(FBT_NULL), min_bit_width_(BIT_WIDTH_8) {} Value(bool b) : u_(static_cast(b)), type_(FBT_BOOL), min_bit_width_(BIT_WIDTH_8) {} Value(int64_t i, Type t, BitWidth bw) : i_(i), type_(t), min_bit_width_(bw) {} Value(uint64_t u, Type t, BitWidth bw) : u_(u), type_(t), min_bit_width_(bw) {} Value(float f) : f_(static_cast(f)), type_(FBT_FLOAT), min_bit_width_(BIT_WIDTH_32) {} Value(double f) : f_(f), type_(FBT_FLOAT), min_bit_width_(WidthF(f)) {} uint8_t StoredPackedType(BitWidth parent_bit_width_ = BIT_WIDTH_8) const { return PackedType(StoredWidth(parent_bit_width_), type_); } BitWidth ElemWidth(size_t buf_size, size_t elem_index) const { if (IsInline(type_)) { return min_bit_width_; } else { // We have an absolute offset, but want to store a relative offset // elem_index elements beyond the current buffer end. Since whether // the relative offset fits in a certain byte_width depends on // the size of the elements before it (and their alignment), we have // to test for each size in turn. for (size_t byte_width = 1; byte_width <= sizeof(flatbuffers::largest_scalar_t); byte_width *= 2) { // Where are we going to write this offset? auto offset_loc = buf_size + flatbuffers::PaddingBytes(buf_size, byte_width) + elem_index * byte_width; // Compute relative offset. auto offset = offset_loc - u_; // Does it fit? auto bit_width = WidthU(offset); if (static_cast(static_cast(1U) << bit_width) == byte_width) return bit_width; } FLATBUFFERS_ASSERT(false); // Must match one of the sizes above. return BIT_WIDTH_64; } } BitWidth StoredWidth(BitWidth parent_bit_width_ = BIT_WIDTH_8) const { if (IsInline(type_)) { return (std::max)(min_bit_width_, parent_bit_width_); } else { return min_bit_width_; } } }; private: void WriteAny(const Value &val, uint8_t byte_width) { switch (val.type_) { case FBT_NULL: case FBT_INT: Write(val.i_, byte_width); break; case FBT_BOOL: case FBT_UINT: Write(val.u_, byte_width); break; case FBT_FLOAT: WriteDouble(val.f_, byte_width); break; default: WriteOffset(val.u_, byte_width); break; } } size_t CreateBlob(const void *data, size_t len, size_t trailing, Type type) { auto bit_width = WidthU(len); auto byte_width = Align(bit_width); Write(len, byte_width); auto sloc = buf_.size(); WriteBytes(data, len + trailing); stack_.push_back(Value(static_cast(sloc), type, bit_width)); return sloc; } template size_t ScalarVector(const T *elems, size_t len, bool fixed) { auto vector_type = GetScalarType(); auto byte_width = sizeof(T); auto bit_width = WidthB(byte_width); // If you get this assert, you're trying to write a vector with a size // field that is bigger than the scalars you're trying to write (e.g. a // byte vector > 255 elements). For such types, write a "blob" instead. // TODO: instead of asserting, could write vector with larger elements // instead, though that would be wasteful. FLATBUFFERS_ASSERT(WidthU(len) <= bit_width); Align(bit_width); if (!fixed) Write(len, byte_width); auto vloc = buf_.size(); for (size_t i = 0; i < len; i++) Write(elems[i], byte_width); stack_.push_back(Value(static_cast(vloc), ToTypedVector(vector_type, fixed ? len : 0), bit_width)); return vloc; } Value CreateVector(size_t start, size_t vec_len, size_t step, bool typed, bool fixed, const Value *keys = nullptr) { FLATBUFFERS_ASSERT( !fixed || typed); // typed=false, fixed=true combination is not supported. // Figure out smallest bit width we can store this vector with. auto bit_width = (std::max)(force_min_bit_width_, WidthU(vec_len)); auto prefix_elems = 1; if (keys) { // If this vector is part of a map, we will pre-fix an offset to the keys // to this vector. bit_width = (std::max)(bit_width, keys->ElemWidth(buf_.size(), 0)); prefix_elems += 2; } Type vector_type = FBT_KEY; // Check bit widths and types for all elements. for (size_t i = start; i < stack_.size(); i += step) { auto elem_width = stack_[i].ElemWidth(buf_.size(), i - start + prefix_elems); bit_width = (std::max)(bit_width, elem_width); if (typed) { if (i == start) { vector_type = stack_[i].type_; } else { // If you get this assert, you are writing a typed vector with // elements that are not all the same type. FLATBUFFERS_ASSERT(vector_type == stack_[i].type_); } } } // If you get this assert, your typed types are not one of: // Int / UInt / Float / Key. FLATBUFFERS_ASSERT(!typed || IsTypedVectorElementType(vector_type)); auto byte_width = Align(bit_width); // Write vector. First the keys width/offset if available, and size. if (keys) { WriteOffset(keys->u_, byte_width); Write(1ULL << keys->min_bit_width_, byte_width); } if (!fixed) Write(vec_len, byte_width); // Then the actual data. auto vloc = buf_.size(); for (size_t i = start; i < stack_.size(); i += step) { WriteAny(stack_[i], byte_width); } // Then the types. if (!typed) { for (size_t i = start; i < stack_.size(); i += step) { buf_.push_back(stack_[i].StoredPackedType(bit_width)); } } return Value(static_cast(vloc), keys ? FBT_MAP : (typed ? ToTypedVector(vector_type, fixed ? vec_len : 0) : FBT_VECTOR), bit_width); } // You shouldn't really be copying instances of this class. Builder(const Builder &); Builder &operator=(const Builder &); std::vector buf_; std::vector stack_; bool finished_; bool has_duplicate_keys_; BuilderFlag flags_; BitWidth force_min_bit_width_; struct KeyOffsetCompare { explicit KeyOffsetCompare(const std::vector &buf) : buf_(&buf) {} bool operator()(size_t a, size_t b) const { auto stra = reinterpret_cast(buf_->data() + a); auto strb = reinterpret_cast(buf_->data() + b); return strcmp(stra, strb) < 0; } const std::vector *buf_; }; typedef std::pair StringOffset; struct StringOffsetCompare { explicit StringOffsetCompare(const std::vector &buf) : buf_(&buf) {} bool operator()(const StringOffset &a, const StringOffset &b) const { auto stra = buf_->data() + a.first; auto strb = buf_->data() + b.first; auto cr = memcmp(stra, strb, (std::min)(a.second, b.second) + 1); return cr < 0 || (cr == 0 && a.second < b.second); } const std::vector *buf_; }; typedef std::set KeyOffsetMap; typedef std::set StringOffsetMap; KeyOffsetMap key_pool; StringOffsetMap string_pool; friend class Verifier; }; // Helper class to verify the integrity of a FlexBuffer class Verifier FLATBUFFERS_FINAL_CLASS { public: Verifier(const uint8_t *buf, size_t buf_len, // Supplying this vector likely results in faster verification // of larger buffers with many shared keys/strings, but // comes at the cost of using additional memory the same size of // the buffer being verified, so it is by default off. std::vector *reuse_tracker = nullptr, bool _check_alignment = true, size_t max_depth = 64) : buf_(buf), size_(buf_len), depth_(0), max_depth_(max_depth), num_vectors_(0), max_vectors_(buf_len), check_alignment_(_check_alignment), reuse_tracker_(reuse_tracker) { FLATBUFFERS_ASSERT(size_ < FLATBUFFERS_MAX_BUFFER_SIZE); if (reuse_tracker_) { reuse_tracker_->clear(); reuse_tracker_->resize(size_, PackedType(BIT_WIDTH_8, FBT_NULL)); } } private: // Central location where any verification failures register. bool Check(bool ok) const { // clang-format off #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE FLATBUFFERS_ASSERT(ok); #endif // clang-format on return ok; } // Verify any range within the buffer. bool VerifyFrom(size_t elem, size_t elem_len) const { return Check(elem_len < size_ && elem <= size_ - elem_len); } bool VerifyBefore(size_t elem, size_t elem_len) const { return Check(elem_len <= elem); } bool VerifyFromPointer(const uint8_t *p, size_t len) { auto o = static_cast(p - buf_); return VerifyFrom(o, len); } bool VerifyBeforePointer(const uint8_t *p, size_t len) { auto o = static_cast(p - buf_); return VerifyBefore(o, len); } bool VerifyByteWidth(size_t width) { return Check(width == 1 || width == 2 || width == 4 || width == 8); } bool VerifyType(int type) { return Check(type >= 0 && type < FBT_MAX_TYPE); } bool VerifyOffset(uint64_t off, const uint8_t *p) { return Check(off <= static_cast(size_)) && off <= static_cast(p - buf_); } bool VerifyAlignment(const uint8_t *p, size_t size) const { auto o = static_cast(p - buf_); return Check((o & (size - 1)) == 0 || !check_alignment_); } // Macro, since we want to escape from parent function & use lazy args. #define FLEX_CHECK_VERIFIED(P, PACKED_TYPE) \ if (reuse_tracker_) { \ auto packed_type = PACKED_TYPE; \ auto existing = (*reuse_tracker_)[P - buf_]; \ if (existing == packed_type) return true; \ /* Fail verification if already set with different type! */ \ if (!Check(existing == 0)) return false; \ (*reuse_tracker_)[P - buf_] = packed_type; \ } bool VerifyVector(Reference r, const uint8_t *p, Type elem_type) { // Any kind of nesting goes thru this function, so guard against that // here, both with simple nesting checks, and the reuse tracker if on. depth_++; num_vectors_++; if (!Check(depth_ <= max_depth_ && num_vectors_ <= max_vectors_)) return false; auto size_byte_width = r.byte_width_; FLEX_CHECK_VERIFIED(p, PackedType(Builder::WidthB(size_byte_width), r.type_)); if (!VerifyBeforePointer(p, size_byte_width)) return false; auto sized = Sized(p, size_byte_width); auto num_elems = sized.size(); auto elem_byte_width = r.type_ == FBT_STRING || r.type_ == FBT_BLOB ? uint8_t(1) : r.byte_width_; auto max_elems = SIZE_MAX / elem_byte_width; if (!Check(num_elems < max_elems)) return false; // Protect against byte_size overflowing. auto byte_size = num_elems * elem_byte_width; if (!VerifyFromPointer(p, byte_size)) return false; if (elem_type == FBT_NULL) { // Verify type bytes after the vector. if (!VerifyFromPointer(p + byte_size, num_elems)) return false; auto v = Vector(p, size_byte_width); for (size_t i = 0; i < num_elems; i++) if (!VerifyRef(v[i])) return false; } else if (elem_type == FBT_KEY) { auto v = TypedVector(p, elem_byte_width, FBT_KEY); for (size_t i = 0; i < num_elems; i++) if (!VerifyRef(v[i])) return false; } else { FLATBUFFERS_ASSERT(IsInline(elem_type)); } depth_--; return true; } bool VerifyKeys(const uint8_t *p, uint8_t byte_width) { // The vector part of the map has already been verified. const size_t num_prefixed_fields = 3; if (!VerifyBeforePointer(p, byte_width * num_prefixed_fields)) return false; p -= byte_width * num_prefixed_fields; auto off = ReadUInt64(p, byte_width); if (!VerifyOffset(off, p)) return false; auto key_byte_with = static_cast(ReadUInt64(p + byte_width, byte_width)); if (!VerifyByteWidth(key_byte_with)) return false; return VerifyVector(Reference(p, byte_width, key_byte_with, FBT_VECTOR_KEY), p - off, FBT_KEY); } bool VerifyKey(const uint8_t *p) { FLEX_CHECK_VERIFIED(p, PackedType(BIT_WIDTH_8, FBT_KEY)); while (p < buf_ + size_) if (*p++) return true; return false; } #undef FLEX_CHECK_VERIFIED bool VerifyTerminator(const String &s) { return VerifyFromPointer(reinterpret_cast(s.c_str()), s.size() + 1); } bool VerifyRef(Reference r) { // r.parent_width_ and r.data_ already verified. if (!VerifyByteWidth(r.byte_width_) || !VerifyType(r.type_)) { return false; } if (IsInline(r.type_)) { // Inline scalars, don't require further verification. return true; } // All remaining types are an offset. auto off = ReadUInt64(r.data_, r.parent_width_); if (!VerifyOffset(off, r.data_)) return false; auto p = r.Indirect(); if (!VerifyAlignment(p, r.byte_width_)) return false; switch (r.type_) { case FBT_INDIRECT_INT: case FBT_INDIRECT_UINT: case FBT_INDIRECT_FLOAT: return VerifyFromPointer(p, r.byte_width_); case FBT_KEY: return VerifyKey(p); case FBT_MAP: return VerifyVector(r, p, FBT_NULL) && VerifyKeys(p, r.byte_width_); case FBT_VECTOR: return VerifyVector(r, p, FBT_NULL); case FBT_VECTOR_INT: return VerifyVector(r, p, FBT_INT); case FBT_VECTOR_BOOL: case FBT_VECTOR_UINT: return VerifyVector(r, p, FBT_UINT); case FBT_VECTOR_FLOAT: return VerifyVector(r, p, FBT_FLOAT); case FBT_VECTOR_KEY: return VerifyVector(r, p, FBT_KEY); case FBT_VECTOR_STRING_DEPRECATED: // Use of FBT_KEY here intentional, see elsewhere. return VerifyVector(r, p, FBT_KEY); case FBT_BLOB: return VerifyVector(r, p, FBT_UINT); case FBT_STRING: return VerifyVector(r, p, FBT_UINT) && VerifyTerminator(String(p, r.byte_width_)); case FBT_VECTOR_INT2: case FBT_VECTOR_UINT2: case FBT_VECTOR_FLOAT2: case FBT_VECTOR_INT3: case FBT_VECTOR_UINT3: case FBT_VECTOR_FLOAT3: case FBT_VECTOR_INT4: case FBT_VECTOR_UINT4: case FBT_VECTOR_FLOAT4: { uint8_t len = 0; auto vtype = ToFixedTypedVectorElementType(r.type_, &len); if (!VerifyType(vtype)) return false; return VerifyFromPointer(p, r.byte_width_ * len); } default: return false; } } public: bool VerifyBuffer() { if (!Check(size_ >= 3)) return false; auto end = buf_ + size_; auto byte_width = *--end; auto packed_type = *--end; return VerifyByteWidth(byte_width) && Check(end - buf_ >= byte_width) && VerifyRef(Reference(end - byte_width, byte_width, packed_type)); } private: const uint8_t *buf_; size_t size_; size_t depth_; const size_t max_depth_; size_t num_vectors_; const size_t max_vectors_; bool check_alignment_; std::vector *reuse_tracker_; }; // Utility function that constructs the Verifier for you, see above for // parameters. inline bool VerifyBuffer(const uint8_t *buf, size_t buf_len, std::vector *reuse_tracker = nullptr) { Verifier verifier(buf, buf_len, reuse_tracker); return verifier.VerifyBuffer(); } } // namespace flexbuffers #if defined(_MSC_VER) # pragma warning(pop) #endif #endif // FLATBUFFERS_FLEXBUFFERS_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/grpc.h000066400000000000000000000234411511405061000234650ustar00rootroot00000000000000/* * Copyright 2014 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. */ #ifndef FLATBUFFERS_GRPC_H_ #define FLATBUFFERS_GRPC_H_ // Helper functionality to glue FlatBuffers and GRPC. #include "flatbuffers/flatbuffers.h" #include "grpc/byte_buffer_reader.h" #include "grpcpp/support/byte_buffer.h" #include "grpcpp/support/slice.h" namespace mapserver { namespace flatbuffers { namespace grpc { // Message is a typed wrapper around a buffer that manages the underlying // `grpc_slice` and also provides flatbuffers-specific helpers such as `Verify` // and `GetRoot`. Since it is backed by a `grpc_slice`, the underlying buffer // is refcounted and ownership is be managed automatically. template class Message { public: Message() {} Message(::grpc::Slice slice) : slice_(slice) {} Message &operator=(const Message &other) = delete; Message(Message &&other) = default; Message(const Message &other) = delete; Message &operator=(Message &&other) = default; const uint8_t *mutable_data() const { return slice_.begin(); } const uint8_t *data() const { return slice_.begin(); } size_t size() const { return slice_.size(); } bool Verify() const { Verifier verifier(data(), size()); return verifier.VerifyBuffer(nullptr); } T *GetMutableRoot() { return flatbuffers::GetMutableRoot(mutable_data()); } const T *GetRoot() const { return flatbuffers::GetRoot(data()); } // This is only intended for serializer use, or if you know what you're doing const ::grpc::Slice &BorrowSlice() const { return slice_; } private: ::grpc::Slice slice_; }; class MessageBuilder; // SliceAllocator is a gRPC-specific allocator that uses the `grpc_slice` // refcounted slices to manage memory ownership. This makes it easy and // efficient to transfer buffers to gRPC. class SliceAllocator : public Allocator { public: SliceAllocator() {} SliceAllocator(const SliceAllocator &other) = delete; SliceAllocator &operator=(const SliceAllocator &other) = delete; SliceAllocator(SliceAllocator &&other) { // default-construct and swap idiom swap(other); } SliceAllocator &operator=(SliceAllocator &&other) { // move-construct and swap idiom SliceAllocator temp(std::move(other)); swap(temp); return *this; } void swap(SliceAllocator &other) { using std::swap; swap(slice_, other.slice_); } virtual ~SliceAllocator() {} virtual uint8_t *allocate(size_t size) override { FLATBUFFERS_ASSERT(slice_.size() == 0); slice_ = ::grpc::Slice(size); return const_cast(slice_.begin()); } virtual void deallocate(uint8_t *p, size_t size) override { FLATBUFFERS_ASSERT(p == slice_.begin()); FLATBUFFERS_ASSERT(size == slice_.size()); slice_ = ::grpc::Slice(); } virtual uint8_t *reallocate_downward(uint8_t *old_p, size_t old_size, size_t new_size, size_t in_use_back, size_t in_use_front) override { FLATBUFFERS_ASSERT(old_p == slice_.begin()); FLATBUFFERS_ASSERT(old_size == slice_.size()); FLATBUFFERS_ASSERT(new_size > old_size); ::grpc::Slice old_slice = slice_; ::grpc::Slice new_slice = ::grpc::Slice(new_size); uint8_t *new_p = const_cast(new_slice.begin()); memcpy_downward(old_p, old_size, new_p, new_size, in_use_back, in_use_front); slice_ = new_slice; return new_p; } private: ::grpc::Slice &get_slice(uint8_t *p, size_t size) { FLATBUFFERS_ASSERT(p == slice_.begin()); FLATBUFFERS_ASSERT(size == slice_.size()); return slice_; } ::grpc::Slice slice_; friend class MessageBuilder; }; // SliceAllocatorMember is a hack to ensure that the MessageBuilder's // slice_allocator_ member is constructed before the FlatBufferBuilder, since // the allocator is used in the FlatBufferBuilder ctor. namespace detail { struct SliceAllocatorMember { SliceAllocator slice_allocator_; }; } // namespace detail // MessageBuilder is a gRPC-specific FlatBufferBuilder that uses SliceAllocator // to allocate gRPC buffers. class MessageBuilder : private detail::SliceAllocatorMember, public FlatBufferBuilder { public: explicit MessageBuilder(uoffset_t initial_size = 1024) : FlatBufferBuilder(initial_size, &slice_allocator_, false) {} MessageBuilder(const MessageBuilder &other) = delete; MessageBuilder &operator=(const MessageBuilder &other) = delete; MessageBuilder(MessageBuilder &&other) : FlatBufferBuilder(1024, &slice_allocator_, false) { // Default construct and swap idiom. Swap(other); } /// Create a MessageBuilder from a FlatBufferBuilder. explicit MessageBuilder(FlatBufferBuilder &&src, void (*dealloc)(void *, size_t) = &DefaultAllocator::dealloc) : FlatBufferBuilder(1024, &slice_allocator_, false) { src.Swap(*this); src.SwapBufAllocator(*this); if (buf_.capacity()) { uint8_t *buf = buf_.scratch_data(); // pointer to memory size_t capacity = buf_.capacity(); // size of memory slice_allocator_.slice_ = ::grpc::Slice(buf, capacity, dealloc); } else { slice_allocator_.slice_ = ::grpc::Slice(); } } /// Move-assign a FlatBufferBuilder to a MessageBuilder. /// Only FlatBufferBuilder with default allocator (basically, nullptr) is /// supported. MessageBuilder &operator=(FlatBufferBuilder &&src) { // Move construct a temporary and swap MessageBuilder temp(std::move(src)); Swap(temp); return *this; } MessageBuilder &operator=(MessageBuilder &&other) { // Move construct a temporary and swap MessageBuilder temp(std::move(other)); Swap(temp); return *this; } void Swap(MessageBuilder &other) { slice_allocator_.swap(other.slice_allocator_); FlatBufferBuilder::Swap(other); // After swapping the FlatBufferBuilder, we swap back the allocator, which // restores the original allocator back in place. This is necessary because // MessageBuilder's allocator is its own member (SliceAllocatorMember). The // allocator passed to FlatBufferBuilder::vector_downward must point to this // member. buf_.swap_allocator(other.buf_); } // Releases the ownership of the buffer pointer. // Returns the size, offset, and the original grpc_slice that // allocated the buffer. Also see grpc_slice_unref(). uint8_t *ReleaseRaw(size_t &size, size_t &offset, ::grpc::Slice &slice) { uint8_t *buf = FlatBufferBuilder::ReleaseRaw(size, offset); slice = slice_allocator_.slice_; slice_allocator_.slice_ = ::grpc::Slice(); return buf; } ~MessageBuilder() {} // GetMessage extracts the subslice of the buffer corresponding to the // flatbuffers-encoded region and wraps it in a `Message` to handle buffer // ownership. template Message GetMessage() { auto buf_data = buf_.scratch_data(); // pointer to memory auto buf_size = buf_.capacity(); // size of memory auto msg_data = buf_.data(); // pointer to msg auto msg_size = buf_.size(); // size of msg // Do some sanity checks on data/size FLATBUFFERS_ASSERT(msg_data); FLATBUFFERS_ASSERT(msg_size); FLATBUFFERS_ASSERT(msg_data >= buf_data); FLATBUFFERS_ASSERT(msg_data + msg_size <= buf_data + buf_size); // Calculate offsets from the buffer start auto begin = msg_data - buf_data; auto end = begin + msg_size; // Get the slice we are working with (no refcount change) ::grpc::Slice slice = slice_allocator_.get_slice(buf_data, buf_size); // Extract a subslice of the existing slice (increment refcount) ::grpc::Slice subslice = slice.sub(begin, end); // Wrap the subslice in a `Message`, but don't increment refcount Message msg(subslice); return msg; } template Message ReleaseMessage() { Message msg = GetMessage(); Reset(); return msg; } private: // SliceAllocator slice_allocator_; // part of SliceAllocatorMember }; } // namespace grpc } // namespace flatbuffers } // namespace mapserver namespace grpc { template class SerializationTraits> { public: static grpc::Status Serialize(const flatbuffers::grpc::Message &msg, ByteBuffer *buffer, bool *own_buffer) { // Package the single slice into a `ByteBuffer`, // incrementing the refcount in the process. *buffer = ByteBuffer(&msg.BorrowSlice(), 1); *own_buffer = true; return grpc::Status::OK; } // Deserialize by pulling the static grpc::Status Deserialize(ByteBuffer *buf, flatbuffers::grpc::Message *msg) { Slice slice; if (!buf->TrySingleSlice(&slice).ok()) { if (!buf->DumpToSingleSlice(&slice).ok()) { buf->Clear(); return ::grpc::Status(::grpc::StatusCode::INTERNAL, "No payload"); } } *msg = flatbuffers::grpc::Message(slice); buf->Clear(); #if FLATBUFFERS_GRPC_DISABLE_AUTO_VERIFICATION return ::grpc::Status::OK; #else if (msg->Verify()) { return ::grpc::Status::OK; } else { return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Message verification failed"); } #endif } }; } // namespace grpc #endif // FLATBUFFERS_GRPC_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/hash.h000066400000000000000000000071331511405061000234550ustar00rootroot00000000000000/* * 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. */ #ifndef FLATBUFFERS_HASH_H_ #define FLATBUFFERS_HASH_H_ #include #include #include "flatbuffers/flatbuffers.h" namespace mapserver { namespace flatbuffers { template struct FnvTraits { static const T kFnvPrime; static const T kOffsetBasis; }; template<> struct FnvTraits { static const uint32_t kFnvPrime = 0x01000193; static const uint32_t kOffsetBasis = 0x811C9DC5; }; template<> struct FnvTraits { static const uint64_t kFnvPrime = 0x00000100000001b3ULL; static const uint64_t kOffsetBasis = 0xcbf29ce484222645ULL; }; template T HashFnv1(const char *input) { T hash = FnvTraits::kOffsetBasis; for (const char *c = input; *c; ++c) { hash *= FnvTraits::kFnvPrime; hash ^= static_cast(*c); } return hash; } template T HashFnv1a(const char *input) { T hash = FnvTraits::kOffsetBasis; for (const char *c = input; *c; ++c) { hash ^= static_cast(*c); hash *= FnvTraits::kFnvPrime; } return hash; } template<> inline uint16_t HashFnv1(const char *input) { uint32_t hash = HashFnv1(input); return (hash >> 16) ^ (hash & 0xffff); } template<> inline uint16_t HashFnv1a(const char *input) { uint32_t hash = HashFnv1a(input); return (hash >> 16) ^ (hash & 0xffff); } template struct NamedHashFunction { const char *name; typedef T (*HashFunction)(const char *); HashFunction function; }; const NamedHashFunction kHashFunctions16[] = { { "fnv1_16", HashFnv1 }, { "fnv1a_16", HashFnv1a }, }; const NamedHashFunction kHashFunctions32[] = { { "fnv1_32", HashFnv1 }, { "fnv1a_32", HashFnv1a }, }; const NamedHashFunction kHashFunctions64[] = { { "fnv1_64", HashFnv1 }, { "fnv1a_64", HashFnv1a }, }; inline NamedHashFunction::HashFunction FindHashFunction16( const char *name) { std::size_t size = sizeof(kHashFunctions16) / sizeof(kHashFunctions16[0]); for (std::size_t i = 0; i < size; ++i) { if (std::strcmp(name, kHashFunctions16[i].name) == 0) { return kHashFunctions16[i].function; } } return nullptr; } inline NamedHashFunction::HashFunction FindHashFunction32( const char *name) { std::size_t size = sizeof(kHashFunctions32) / sizeof(kHashFunctions32[0]); for (std::size_t i = 0; i < size; ++i) { if (std::strcmp(name, kHashFunctions32[i].name) == 0) { return kHashFunctions32[i].function; } } return nullptr; } inline NamedHashFunction::HashFunction FindHashFunction64( const char *name) { std::size_t size = sizeof(kHashFunctions64) / sizeof(kHashFunctions64[0]); for (std::size_t i = 0; i < size; ++i) { if (std::strcmp(name, kHashFunctions64[i].name) == 0) { return kHashFunctions64[i].function; } } return nullptr; } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_HASH_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/idl.h000066400000000000000000001306471511405061000233110ustar00rootroot00000000000000/* * Copyright 2014 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. */ #ifndef FLATBUFFERS_IDL_H_ #define FLATBUFFERS_IDL_H_ #include #include #include #include #include "flatbuffers/base.h" #include "flatbuffers/flatbuffers.h" #include "flatbuffers/flexbuffers.h" #include "flatbuffers/hash.h" #include "flatbuffers/reflection.h" // This file defines the data types representing a parsed IDL (Interface // Definition Language) / schema file. // Limits maximum depth of nested objects. // Prevents stack overflow while parse scheme, or json, or flexbuffer. #if !defined(FLATBUFFERS_MAX_PARSING_DEPTH) # define FLATBUFFERS_MAX_PARSING_DEPTH 64 #endif namespace mapserver { namespace flatbuffers { // The order of these matters for Is*() functions below. // Additionally, Parser::ParseType assumes bool..string is a contiguous range // of type tokens. // clang-format off #define FLATBUFFERS_GEN_TYPES_SCALAR(TD) \ TD(NONE, "", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8) \ TD(UTYPE, "", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8) /* begin scalar/int */ \ TD(BOOL, "bool", uint8_t, boolean,bool, bool, bool, bool, Boolean, Bool) \ TD(CHAR, "byte", int8_t, byte, int8, sbyte, int8, i8, Byte, Int8) \ TD(UCHAR, "ubyte", uint8_t, byte, byte, byte, uint8, u8, UByte, UInt8) \ TD(SHORT, "short", int16_t, short, int16, short, int16, i16, Short, Int16) \ TD(USHORT, "ushort", uint16_t, short, uint16, ushort, uint16, u16, UShort, UInt16) \ TD(INT, "int", int32_t, int, int32, int, int32, i32, Int, Int32) \ TD(UINT, "uint", uint32_t, int, uint32, uint, uint32, u32, UInt, UInt32) \ TD(LONG, "long", int64_t, long, int64, long, int64, i64, Long, Int64) \ TD(ULONG, "ulong", uint64_t, long, uint64, ulong, uint64, u64, ULong, UInt64) /* end int */ \ TD(FLOAT, "float", float, float, float32, float, float32, f32, Float, Float32) /* begin float */ \ TD(DOUBLE, "double", double, double, float64, double, float64, f64, Double, Double) /* end float/scalar */ #define FLATBUFFERS_GEN_TYPES_POINTER(TD) \ TD(STRING, "string", Offset, int, int, StringOffset, int, unused, Int, Offset) \ TD(VECTOR, "", Offset, int, int, VectorOffset, int, unused, Int, Offset) \ TD(STRUCT, "", Offset, int, int, int, int, unused, Int, Offset) \ TD(UNION, "", Offset, int, int, int, int, unused, Int, Offset) #define FLATBUFFERS_GEN_TYPE_ARRAY(TD) \ TD(ARRAY, "", int, int, int, int, int, unused, Int, Offset) // The fields are: // - enum // - FlatBuffers schema type. // - C++ type. // - Java type. // - Go type. // - C# / .Net type. // - Python type. // - Kotlin type. // - Rust type. // using these macros, we can now write code dealing with types just once, e.g. /* switch (type) { #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, JTYPE, GTYPE, NTYPE, PTYPE, \ RTYPE, KTYPE) \ case BASE_TYPE_ ## ENUM: \ // do something specific to CTYPE here FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) #undef FLATBUFFERS_TD } */ // If not all FLATBUFFERS_GEN_() arguments are necessary for implementation // of FLATBUFFERS_TD, you can use a variadic macro (with __VA_ARGS__ if needed). // In the above example, only CTYPE is used to generate the code, it can be rewritten: /* switch (type) { #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \ case BASE_TYPE_ ## ENUM: \ // do something specific to CTYPE here FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) #undef FLATBUFFERS_TD } */ #define FLATBUFFERS_GEN_TYPES(TD) \ FLATBUFFERS_GEN_TYPES_SCALAR(TD) \ FLATBUFFERS_GEN_TYPES_POINTER(TD) \ FLATBUFFERS_GEN_TYPE_ARRAY(TD) // Create an enum for all the types above. #ifdef __GNUC__ __extension__ // Stop GCC complaining about trailing comma with -Wpendantic. #endif enum BaseType { #define FLATBUFFERS_TD(ENUM, ...) \ BASE_TYPE_ ## ENUM, FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) #undef FLATBUFFERS_TD }; #define FLATBUFFERS_TD(ENUM, IDLTYPE, CTYPE, ...) \ static_assert(sizeof(CTYPE) <= sizeof(largest_scalar_t), \ "define largest_scalar_t as " #CTYPE); FLATBUFFERS_GEN_TYPES(FLATBUFFERS_TD) #undef FLATBUFFERS_TD inline bool IsScalar (BaseType t) { return t >= BASE_TYPE_UTYPE && t <= BASE_TYPE_DOUBLE; } inline bool IsInteger(BaseType t) { return t >= BASE_TYPE_UTYPE && t <= BASE_TYPE_ULONG; } inline bool IsFloat (BaseType t) { return t == BASE_TYPE_FLOAT || t == BASE_TYPE_DOUBLE; } inline bool IsLong (BaseType t) { return t == BASE_TYPE_LONG || t == BASE_TYPE_ULONG; } inline bool IsBool (BaseType t) { return t == BASE_TYPE_BOOL; } inline bool IsOneByte(BaseType t) { return t >= BASE_TYPE_UTYPE && t <= BASE_TYPE_UCHAR; } inline bool IsUnsigned(BaseType t) { return (t == BASE_TYPE_UTYPE) || (t == BASE_TYPE_UCHAR) || (t == BASE_TYPE_USHORT) || (t == BASE_TYPE_UINT) || (t == BASE_TYPE_ULONG); } // clang-format on extern const char *const kTypeNames[]; extern const char kTypeSizes[]; inline size_t SizeOf(BaseType t) { return kTypeSizes[t]; } struct StructDef; struct EnumDef; class Parser; // Represents any type in the IDL, which is a combination of the BaseType // and additional information for vectors/structs_. struct Type { explicit Type(BaseType _base_type = BASE_TYPE_NONE, StructDef *_sd = nullptr, EnumDef *_ed = nullptr, uint16_t _fixed_length = 0) : base_type(_base_type), element(BASE_TYPE_NONE), struct_def(_sd), enum_def(_ed), fixed_length(_fixed_length) {} bool operator==(const Type &o) { return base_type == o.base_type && element == o.element && struct_def == o.struct_def && enum_def == o.enum_def; } Type VectorType() const { return Type(element, struct_def, enum_def, fixed_length); } Offset Serialize(FlatBufferBuilder *builder) const; bool Deserialize(const Parser &parser, const reflection::Type *type); BaseType base_type; BaseType element; // only set if t == BASE_TYPE_VECTOR StructDef *struct_def; // only set if t or element == BASE_TYPE_STRUCT EnumDef *enum_def; // set if t == BASE_TYPE_UNION / BASE_TYPE_UTYPE, // or for an integral type derived from an enum. uint16_t fixed_length; // only set if t == BASE_TYPE_ARRAY }; // Represents a parsed scalar value, it's type, and field offset. struct Value { Value() : constant("0"), offset(static_cast(~(static_cast(0U)))) {} Type type; std::string constant; voffset_t offset; }; // Helper class that retains the original order of a set of identifiers and // also provides quick lookup. template class SymbolTable { public: ~SymbolTable() { for (auto it = vec.begin(); it != vec.end(); ++it) { delete *it; } } bool Add(const std::string &name, T *e) { vec.emplace_back(e); auto it = dict.find(name); if (it != dict.end()) return true; dict[name] = e; return false; } void Move(const std::string &oldname, const std::string &newname) { auto it = dict.find(oldname); if (it != dict.end()) { auto obj = it->second; dict.erase(it); dict[newname] = obj; } else { FLATBUFFERS_ASSERT(false); } } T *Lookup(const std::string &name) const { auto it = dict.find(name); return it == dict.end() ? nullptr : it->second; } public: std::map dict; // quick lookup std::vector vec; // Used to iterate in order of insertion }; // A name space, as set in the schema. struct Namespace { Namespace() : from_table(0) {} // Given a (potentially unqualified) name, return the "fully qualified" name // which has a full namespaced descriptor. // With max_components you can request less than the number of components // the current namespace has. std::string GetFullyQualifiedName(const std::string &name, size_t max_components = 1000) const; std::vector components; size_t from_table; // Part of the namespace corresponds to a message/table. }; inline bool operator<(const Namespace &a, const Namespace &b) { size_t min_size = std::min(a.components.size(), b.components.size()); for (size_t i = 0; i < min_size; ++i) { if (a.components[i] != b.components[i]) return a.components[i] < b.components[i]; } return a.components.size() < b.components.size(); } // Base class for all definition types (fields, structs_, enums_). struct Definition { Definition() : generated(false), defined_namespace(nullptr), serialized_location(0), index(-1), refcount(1), declaration_file(nullptr) {} flatbuffers::Offset< flatbuffers::Vector>> SerializeAttributes(FlatBufferBuilder *builder, const Parser &parser) const; bool DeserializeAttributes(Parser &parser, const Vector> *attrs); std::string name; std::string file; std::vector doc_comment; SymbolTable attributes; bool generated; // did we already output code for this definition? Namespace *defined_namespace; // Where it was defined. // For use with Serialize() uoffset_t serialized_location; int index; // Inside the vector it is stored. int refcount; const std::string *declaration_file; }; struct FieldDef : public Definition { FieldDef() : deprecated(false), key(false), shared(false), native_inline(false), flexbuffer(false), presence(kDefault), nested_flatbuffer(NULL), padding(0) {} Offset Serialize(FlatBufferBuilder *builder, uint16_t id, const Parser &parser) const; bool Deserialize(Parser &parser, const reflection::Field *field); bool IsScalarOptional() const { return IsScalar(value.type.base_type) && IsOptional(); } bool IsOptional() const { return presence == kOptional; } bool IsRequired() const { return presence == kRequired; } bool IsDefault() const { return presence == kDefault; } Value value; bool deprecated; // Field is allowed to be present in old data, but can't be. // written in new data nor accessed in new code. bool key; // Field functions as a key for creating sorted vectors. bool shared; // Field will be using string pooling (i.e. CreateSharedString) // as default serialization behavior if field is a string. bool native_inline; // Field will be defined inline (instead of as a pointer) // for native tables if field is a struct. bool flexbuffer; // This field contains FlexBuffer data. enum Presence { // Field must always be present. kRequired, // Non-presence should be signalled to and controlled by users. kOptional, // Non-presence is hidden from users. // Implementations may omit writing default values. kDefault, }; Presence static MakeFieldPresence(bool optional, bool required) { FLATBUFFERS_ASSERT(!(required && optional)); // clang-format off return required ? FieldDef::kRequired : optional ? FieldDef::kOptional : FieldDef::kDefault; // clang-format on } Presence presence; StructDef *nested_flatbuffer; // This field contains nested FlatBuffer data. size_t padding; // Bytes to always pad after this field. }; struct StructDef : public Definition { StructDef() : fixed(false), predecl(true), sortbysize(true), has_key(false), minalign(1), bytesize(0) {} void PadLastField(size_t min_align) { auto padding = PaddingBytes(bytesize, min_align); bytesize += padding; if (fields.vec.size()) fields.vec.back()->padding = padding; } Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; bool Deserialize(Parser &parser, const reflection::Object *object); SymbolTable fields; bool fixed; // If it's struct, not a table. bool predecl; // If it's used before it was defined. bool sortbysize; // Whether fields come in the declaration or size order. bool has_key; // It has a key field. size_t minalign; // What the whole object needs to be aligned to. size_t bytesize; // Size if fixed. flatbuffers::unique_ptr original_location; }; struct EnumDef; struct EnumValBuilder; struct EnumVal { Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; bool Deserialize(const Parser &parser, const reflection::EnumVal *val); uint64_t GetAsUInt64() const { return static_cast(value); } int64_t GetAsInt64() const { return value; } bool IsZero() const { return 0 == value; } bool IsNonZero() const { return !IsZero(); } std::string name; std::vector doc_comment; Type union_type; private: friend EnumDef; friend EnumValBuilder; friend bool operator==(const EnumVal &lhs, const EnumVal &rhs); EnumVal(const std::string &_name, int64_t _val) : name(_name), value(_val) {} EnumVal() : value(0) {} int64_t value; }; struct EnumDef : public Definition { EnumDef() : is_union(false), uses_multiple_type_instances(false) {} Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; bool Deserialize(Parser &parser, const reflection::Enum *values); template void ChangeEnumValue(EnumVal *ev, T new_val); void SortByValue(); void RemoveDuplicates(); std::string AllFlags() const; const EnumVal *MinValue() const; const EnumVal *MaxValue() const; // Returns the number of integer steps from v1 to v2. uint64_t Distance(const EnumVal *v1, const EnumVal *v2) const; // Returns the number of integer steps from Min to Max. uint64_t Distance() const { return Distance(MinValue(), MaxValue()); } EnumVal *ReverseLookup(int64_t enum_idx, bool skip_union_default = false) const; EnumVal *FindByValue(const std::string &constant) const; std::string ToString(const EnumVal &ev) const { return IsUInt64() ? NumToString(ev.GetAsUInt64()) : NumToString(ev.GetAsInt64()); } size_t size() const { return vals.vec.size(); } const std::vector &Vals() const { return vals.vec; } const EnumVal *Lookup(const std::string &enum_name) const { return vals.Lookup(enum_name); } bool is_union; // Type is a union which uses type aliases where at least one type is // available under two different names. bool uses_multiple_type_instances; Type underlying_type; private: bool IsUInt64() const { return (BASE_TYPE_ULONG == underlying_type.base_type); } friend EnumValBuilder; SymbolTable vals; }; inline bool IsString(const Type &type) { return type.base_type == BASE_TYPE_STRING; } inline bool IsStruct(const Type &type) { return type.base_type == BASE_TYPE_STRUCT && type.struct_def->fixed; } inline bool IsUnion(const Type &type) { return type.enum_def != nullptr && type.enum_def->is_union; } inline bool IsUnionType(const Type &type) { return IsUnion(type) && IsInteger(type.base_type); } inline bool IsVector(const Type &type) { return type.base_type == BASE_TYPE_VECTOR; } inline bool IsArray(const Type &type) { return type.base_type == BASE_TYPE_ARRAY; } inline bool IsSeries(const Type &type) { return IsVector(type) || IsArray(type); } inline bool IsEnum(const Type &type) { return type.enum_def != nullptr && IsInteger(type.base_type); } inline size_t InlineSize(const Type &type) { return IsStruct(type) ? type.struct_def->bytesize : (IsArray(type) ? InlineSize(type.VectorType()) * type.fixed_length : SizeOf(type.base_type)); } inline size_t InlineAlignment(const Type &type) { if (IsStruct(type)) { return type.struct_def->minalign; } else if (IsArray(type)) { return IsStruct(type.VectorType()) ? type.struct_def->minalign : SizeOf(type.element); } else { return SizeOf(type.base_type); } } inline bool operator==(const EnumVal &lhs, const EnumVal &rhs) { return lhs.value == rhs.value; } inline bool operator!=(const EnumVal &lhs, const EnumVal &rhs) { return !(lhs == rhs); } inline bool EqualByName(const Type &a, const Type &b) { return a.base_type == b.base_type && a.element == b.element && (a.struct_def == b.struct_def || a.struct_def->name == b.struct_def->name) && (a.enum_def == b.enum_def || a.enum_def->name == b.enum_def->name); } struct RPCCall : public Definition { Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; bool Deserialize(Parser &parser, const reflection::RPCCall *call); StructDef *request, *response; }; struct ServiceDef : public Definition { Offset Serialize(FlatBufferBuilder *builder, const Parser &parser) const; bool Deserialize(Parser &parser, const reflection::Service *service); SymbolTable calls; }; // Container of options that may apply to any of the source/text generators. struct IDLOptions { // field case style options for C++ enum CaseStyle { CaseStyle_Unchanged = 0, CaseStyle_Upper, CaseStyle_Lower }; bool gen_jvmstatic; // Use flexbuffers instead for binary and text generation bool use_flexbuffers; bool strict_json; bool output_default_scalars_in_json; int indent_step; bool output_enum_identifiers; bool prefixed_enums; bool scoped_enums; bool swift_implementation_only; bool include_dependence_headers; bool mutable_buffer; bool one_file; bool proto_mode; bool proto_oneof_union; bool generate_all; bool skip_unexpected_fields_in_json; bool generate_name_strings; bool generate_object_based_api; bool gen_compare; std::string cpp_object_api_pointer_type; std::string cpp_object_api_string_type; bool cpp_object_api_string_flexible_constructor; CaseStyle cpp_object_api_field_case_style; bool cpp_direct_copy; bool gen_nullable; bool java_checkerframework; bool gen_generated; bool gen_json_coders; std::string object_prefix; std::string object_suffix; bool union_value_namespacing; bool allow_non_utf8; bool natural_utf8; std::string include_prefix; bool keep_include_path; bool binary_schema_comments; bool binary_schema_builtins; bool binary_schema_gen_embed; std::string go_import; std::string go_namespace; bool protobuf_ascii_alike; bool size_prefixed; std::string root_type; bool force_defaults; bool java_primitive_has_method; bool cs_gen_json_serializer; std::vector cpp_includes; std::string cpp_std; bool cpp_static_reflection; std::string proto_namespace_suffix; std::string filename_suffix; std::string filename_extension; bool no_warnings; bool warnings_as_errors; std::string project_root; bool cs_global_alias; bool json_nested_flatbuffers; bool json_nested_flexbuffers; bool json_nested_legacy_flatbuffers; bool ts_flat_file; // Possible options for the more general generator below. enum Language { kJava = 1 << 0, kCSharp = 1 << 1, kGo = 1 << 2, kCpp = 1 << 3, kPython = 1 << 5, kPhp = 1 << 6, kJson = 1 << 7, kBinary = 1 << 8, kTs = 1 << 9, kJsonSchema = 1 << 10, kDart = 1 << 11, kLua = 1 << 12, kLobster = 1 << 13, kRust = 1 << 14, kKotlin = 1 << 15, kSwift = 1 << 16, kMAX }; enum MiniReflect { kNone, kTypes, kTypesAndNames }; MiniReflect mini_reflect; // If set, require all fields in a table to be explicitly numbered. bool require_explicit_ids; // If set, implement serde::Serialize for generated Rust types bool rust_serialize; // If set, generate rust types in individual files with a root module file. bool rust_module_root_file; // The corresponding language bit will be set if a language is included // for code generation. unsigned long lang_to_generate; // If set (default behavior), empty string fields will be set to nullptr to // make the flatbuffer more compact. bool set_empty_strings_to_null; // If set (default behavior), empty vector fields will be set to nullptr to // make the flatbuffer more compact. bool set_empty_vectors_to_null; IDLOptions() : gen_jvmstatic(false), use_flexbuffers(false), strict_json(false), output_default_scalars_in_json(false), indent_step(2), output_enum_identifiers(true), prefixed_enums(true), scoped_enums(false), swift_implementation_only(false), include_dependence_headers(true), mutable_buffer(false), one_file(false), proto_mode(false), proto_oneof_union(false), generate_all(false), skip_unexpected_fields_in_json(false), generate_name_strings(false), generate_object_based_api(false), gen_compare(false), cpp_object_api_pointer_type("std::unique_ptr"), cpp_object_api_string_flexible_constructor(false), cpp_object_api_field_case_style(CaseStyle_Unchanged), cpp_direct_copy(true), gen_nullable(false), java_checkerframework(false), gen_generated(false), gen_json_coders(false), object_suffix("T"), union_value_namespacing(true), allow_non_utf8(false), natural_utf8(false), keep_include_path(false), binary_schema_comments(false), binary_schema_builtins(false), binary_schema_gen_embed(false), protobuf_ascii_alike(false), size_prefixed(false), force_defaults(false), java_primitive_has_method(false), cs_gen_json_serializer(false), cpp_static_reflection(false), filename_suffix("_generated"), filename_extension(), no_warnings(false), warnings_as_errors(false), project_root(""), cs_global_alias(false), json_nested_flatbuffers(true), json_nested_flexbuffers(true), json_nested_legacy_flatbuffers(false), ts_flat_file(false), mini_reflect(IDLOptions::kNone), require_explicit_ids(false), rust_serialize(false), rust_module_root_file(false), lang_to_generate(0), set_empty_strings_to_null(true), set_empty_vectors_to_null(true) {} }; // This encapsulates where the parser is in the current source file. struct ParserState { ParserState() : cursor_(nullptr), line_start_(nullptr), line_(0), token_(-1), attr_is_trivial_ascii_string_(true) {} protected: void ResetState(const char *source) { cursor_ = source; line_ = 0; MarkNewLine(); } void MarkNewLine() { line_start_ = cursor_; line_ += 1; } int64_t CursorPosition() const { FLATBUFFERS_ASSERT(cursor_ && line_start_ && cursor_ >= line_start_); return static_cast(cursor_ - line_start_); } const char *cursor_; const char *line_start_; int line_; // the current line being parsed int token_; // Flag: text in attribute_ is true ASCII string without escape // sequences. Only printable ASCII (without [\t\r\n]). // Used for number-in-string (and base64 string in future). bool attr_is_trivial_ascii_string_; std::string attribute_; std::vector doc_comment_; }; // A way to make error propagation less error prone by requiring values to be // checked. // Once you create a value of this type you must either: // - Call Check() on it. // - Copy or assign it to another value. // Failure to do so leads to an assert. // This guarantees that this as return value cannot be ignored. class CheckedError { public: explicit CheckedError(bool error) : is_error_(error), has_been_checked_(false) {} CheckedError &operator=(const CheckedError &other) { is_error_ = other.is_error_; has_been_checked_ = false; other.has_been_checked_ = true; return *this; } CheckedError(const CheckedError &other) { *this = other; // Use assignment operator. } ~CheckedError() { FLATBUFFERS_ASSERT(has_been_checked_); } bool Check() { has_been_checked_ = true; return is_error_; } private: bool is_error_; mutable bool has_been_checked_; }; // Additionally, in GCC we can get these errors statically, for additional // assurance: // clang-format off #ifdef __GNUC__ #define FLATBUFFERS_CHECKED_ERROR CheckedError \ __attribute__((warn_unused_result)) #else #define FLATBUFFERS_CHECKED_ERROR CheckedError #endif // clang-format on class Parser : public ParserState { public: explicit Parser(const IDLOptions &options = IDLOptions()) : current_namespace_(nullptr), empty_namespace_(nullptr), flex_builder_(256, flexbuffers::BUILDER_FLAG_SHARE_ALL), root_struct_def_(nullptr), opts(options), uses_flexbuffers_(false), has_warning_(false), advanced_features_(0), source_(nullptr), anonymous_counter_(0), parse_depth_counter_(0) { if (opts.force_defaults) { builder_.ForceDefaults(true); } // Start out with the empty namespace being current. empty_namespace_ = new Namespace(); namespaces_.push_back(empty_namespace_); current_namespace_ = empty_namespace_; known_attributes_["deprecated"] = true; known_attributes_["required"] = true; known_attributes_["key"] = true; known_attributes_["shared"] = true; known_attributes_["hash"] = true; known_attributes_["id"] = true; known_attributes_["force_align"] = true; known_attributes_["bit_flags"] = true; known_attributes_["original_order"] = true; known_attributes_["nested_flatbuffer"] = true; known_attributes_["csharp_partial"] = true; known_attributes_["streaming"] = true; known_attributes_["idempotent"] = true; known_attributes_["cpp_type"] = true; known_attributes_["cpp_ptr_type"] = true; known_attributes_["cpp_ptr_type_get"] = true; known_attributes_["cpp_str_type"] = true; known_attributes_["cpp_str_flex_ctor"] = true; known_attributes_["native_inline"] = true; known_attributes_["native_custom_alloc"] = true; known_attributes_["native_type"] = true; known_attributes_["native_type_pack_name"] = true; known_attributes_["native_default"] = true; known_attributes_["flexbuffer"] = true; known_attributes_["private"] = true; } ~Parser() { for (auto it = namespaces_.begin(); it != namespaces_.end(); ++it) { delete *it; } } // Parse the string containing either schema or JSON data, which will // populate the SymbolTable's or the FlatBufferBuilder above. // include_paths is used to resolve any include statements, and typically // should at least include the project path (where you loaded source_ from). // include_paths must be nullptr terminated if specified. // If include_paths is nullptr, it will attempt to load from the current // directory. // If the source was loaded from a file and isn't an include file, // supply its name in source_filename. // All paths specified in this call must be in posix format, if you accept // paths from user input, please call PosixPath on them first. bool Parse(const char *_source, const char **include_paths = nullptr, const char *source_filename = nullptr); bool ParseJson(const char *json, const char *json_filename = nullptr); // Set the root type. May override the one set in the schema. bool SetRootType(const char *name); // Mark all definitions as already having code generated. void MarkGenerated(); // Get the files recursively included by the given file. The returned // container will have at least the given file. std::set GetIncludedFilesRecursive( const std::string &file_name) const; // Fills builder_ with a binary version of the schema parsed. // See reflection/reflection.fbs void Serialize(); // Deserialize a schema buffer bool Deserialize(const uint8_t *buf, const size_t size); // Fills internal structure as if the schema passed had been loaded by parsing // with Parse except that included filenames will not be populated. bool Deserialize(const reflection::Schema *schema); Type *DeserializeType(const reflection::Type *type); // Checks that the schema represented by this parser is a safe evolution // of the schema provided. Returns non-empty error on any problems. std::string ConformTo(const Parser &base); // Similar to Parse(), but now only accepts JSON to be parsed into a // FlexBuffer. bool ParseFlexBuffer(const char *source, const char *source_filename, flexbuffers::Builder *builder); StructDef *LookupStruct(const std::string &id) const; StructDef *LookupStructThruParentNamespaces(const std::string &id) const; std::string UnqualifiedName(const std::string &fullQualifiedName); FLATBUFFERS_CHECKED_ERROR Error(const std::string &msg); // @brief Verify that any of 'opts.lang_to_generate' supports Optional scalars // in a schema. // @param opts Options used to parce a schema and generate code. static bool SupportsOptionalScalars(const flatbuffers::IDLOptions &opts); private: class ParseDepthGuard; void Message(const std::string &msg); void Warning(const std::string &msg); FLATBUFFERS_CHECKED_ERROR ParseHexNum(int nibbles, uint64_t *val); FLATBUFFERS_CHECKED_ERROR Next(); FLATBUFFERS_CHECKED_ERROR SkipByteOrderMark(); bool Is(int t) const; bool IsIdent(const char *id) const; FLATBUFFERS_CHECKED_ERROR Expect(int t); std::string TokenToStringId(int t) const; EnumDef *LookupEnum(const std::string &id); FLATBUFFERS_CHECKED_ERROR ParseNamespacing(std::string *id, std::string *last); FLATBUFFERS_CHECKED_ERROR ParseTypeIdent(Type &type); FLATBUFFERS_CHECKED_ERROR ParseType(Type &type); FLATBUFFERS_CHECKED_ERROR AddField(StructDef &struct_def, const std::string &name, const Type &type, FieldDef **dest); FLATBUFFERS_CHECKED_ERROR ParseField(StructDef &struct_def); FLATBUFFERS_CHECKED_ERROR ParseString(Value &val, bool use_string_pooling); FLATBUFFERS_CHECKED_ERROR ParseComma(); FLATBUFFERS_CHECKED_ERROR ParseAnyValue(Value &val, FieldDef *field, size_t parent_fieldn, const StructDef *parent_struct_def, uoffset_t count, bool inside_vector = false); template FLATBUFFERS_CHECKED_ERROR ParseTableDelimiters(size_t &fieldn, const StructDef *struct_def, F body); FLATBUFFERS_CHECKED_ERROR ParseTable(const StructDef &struct_def, std::string *value, uoffset_t *ovalue); void SerializeStruct(const StructDef &struct_def, const Value &val); void SerializeStruct(FlatBufferBuilder &builder, const StructDef &struct_def, const Value &val); template FLATBUFFERS_CHECKED_ERROR ParseVectorDelimiters(uoffset_t &count, F body); FLATBUFFERS_CHECKED_ERROR ParseVector(const Type &type, uoffset_t *ovalue, FieldDef *field, size_t fieldn); FLATBUFFERS_CHECKED_ERROR ParseArray(Value &array); FLATBUFFERS_CHECKED_ERROR ParseNestedFlatbuffer( Value &val, FieldDef *field, size_t fieldn, const StructDef *parent_struct_def); FLATBUFFERS_CHECKED_ERROR ParseMetaData(SymbolTable *attributes); FLATBUFFERS_CHECKED_ERROR TryTypedValue(const std::string *name, int dtoken, bool check, Value &e, BaseType req, bool *destmatch); FLATBUFFERS_CHECKED_ERROR ParseHash(Value &e, FieldDef *field); FLATBUFFERS_CHECKED_ERROR TokenError(); FLATBUFFERS_CHECKED_ERROR ParseSingleValue(const std::string *name, Value &e, bool check_now); FLATBUFFERS_CHECKED_ERROR ParseFunction(const std::string *name, Value &e); FLATBUFFERS_CHECKED_ERROR ParseEnumFromString(const Type &type, std::string *result); StructDef *LookupCreateStruct(const std::string &name, bool create_if_new = true, bool definition = false); FLATBUFFERS_CHECKED_ERROR ParseEnum(bool is_union, EnumDef **dest, const char *filename); FLATBUFFERS_CHECKED_ERROR ParseNamespace(); FLATBUFFERS_CHECKED_ERROR StartStruct(const std::string &name, StructDef **dest); FLATBUFFERS_CHECKED_ERROR StartEnum(const std::string &name, bool is_union, EnumDef **dest); FLATBUFFERS_CHECKED_ERROR ParseDecl(const char *filename); FLATBUFFERS_CHECKED_ERROR ParseService(const char *filename); FLATBUFFERS_CHECKED_ERROR ParseProtoFields(StructDef *struct_def, bool isextend, bool inside_oneof); FLATBUFFERS_CHECKED_ERROR ParseProtoOption(); FLATBUFFERS_CHECKED_ERROR ParseProtoKey(); FLATBUFFERS_CHECKED_ERROR ParseProtoDecl(); FLATBUFFERS_CHECKED_ERROR ParseProtoCurliesOrIdent(); FLATBUFFERS_CHECKED_ERROR ParseTypeFromProtoType(Type *type); FLATBUFFERS_CHECKED_ERROR SkipAnyJsonValue(); FLATBUFFERS_CHECKED_ERROR ParseFlexBufferNumericConstant( flexbuffers::Builder *builder); FLATBUFFERS_CHECKED_ERROR ParseFlexBufferValue(flexbuffers::Builder *builder); FLATBUFFERS_CHECKED_ERROR StartParseFile(const char *source, const char *source_filename); FLATBUFFERS_CHECKED_ERROR ParseRoot(const char *_source, const char **include_paths, const char *source_filename); FLATBUFFERS_CHECKED_ERROR DoParse(const char *_source, const char **include_paths, const char *source_filename, const char *include_filename); FLATBUFFERS_CHECKED_ERROR DoParseJson(); FLATBUFFERS_CHECKED_ERROR CheckClash(std::vector &fields, StructDef *struct_def, const char *suffix, BaseType baseType); FLATBUFFERS_CHECKED_ERROR ParseAlignAttribute( const std::string &align_constant, size_t min_align, size_t *align); bool SupportsAdvancedUnionFeatures() const; bool SupportsAdvancedArrayFeatures() const; bool SupportsOptionalScalars() const; bool SupportsDefaultVectorsAndStrings() const; Namespace *UniqueNamespace(Namespace *ns); FLATBUFFERS_CHECKED_ERROR RecurseError(); template CheckedError Recurse(F f); const std::string &GetPooledString(const std::string &s) const; public: SymbolTable types_; SymbolTable structs_; SymbolTable enums_; SymbolTable services_; std::vector namespaces_; Namespace *current_namespace_; Namespace *empty_namespace_; std::string error_; // User readable error_ if Parse() == false FlatBufferBuilder builder_; // any data contained in the file flexbuffers::Builder flex_builder_; flexbuffers::Reference flex_root_; StructDef *root_struct_def_; std::string file_identifier_; std::string file_extension_; std::map included_files_; std::map> files_included_per_file_; std::vector native_included_files_; std::map known_attributes_; IDLOptions opts; bool uses_flexbuffers_; bool has_warning_; uint64_t advanced_features_; private: const char *source_; std::string file_being_parsed_; std::vector> field_stack_; // TODO(cneo): Refactor parser to use string_cache more often to save // on memory usage. mutable std::set string_cache_; int anonymous_counter_; int parse_depth_counter_; // stack-overflow guard }; // Utility functions for multiple generators: // Generate text (JSON) from a given FlatBuffer, and a given Parser // object that has been populated with the corresponding schema. // If ident_step is 0, no indentation will be generated. Additionally, // if it is less than 0, no linefeeds will be generated either. // See idl_gen_text.cpp. // strict_json adds "quotes" around field names if true. // If the flatbuffer cannot be encoded in JSON (e.g., it contains non-UTF-8 // byte arrays in String values), returns false. extern bool GenerateTextFromTable(const Parser &parser, const void *table, const std::string &tablename, std::string *text); extern bool GenerateText(const Parser &parser, const void *flatbuffer, std::string *text); extern bool GenerateTextFile(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Json schema to string // See idl_gen_json_schema.cpp. extern bool GenerateJsonSchema(const Parser &parser, std::string *json); // Generate binary files from a given FlatBuffer, and a given Parser // object that has been populated with the corresponding schema. // See code_generators.cpp. extern bool GenerateBinary(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a C++ header from the definitions in the Parser object. // See idl_gen_cpp. extern bool GenerateCPP(const Parser &parser, const std::string &path, const std::string &file_name); // Generate C# files from the definitions in the Parser object. // See idl_gen_csharp.cpp. extern bool GenerateCSharp(const Parser &parser, const std::string &path, const std::string &file_name); extern bool GenerateDart(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Java files from the definitions in the Parser object. // See idl_gen_java.cpp. extern bool GenerateJava(const Parser &parser, const std::string &path, const std::string &file_name); // Generate JavaScript or TypeScript code from the definitions in the Parser // object. See idl_gen_js. extern bool GenerateTS(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Go files from the definitions in the Parser object. // See idl_gen_go.cpp. extern bool GenerateGo(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Php code from the definitions in the Parser object. // See idl_gen_php. extern bool GeneratePhp(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Python files from the definitions in the Parser object. // See idl_gen_python.cpp. extern bool GeneratePython(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Lobster files from the definitions in the Parser object. // See idl_gen_lobster.cpp. extern bool GenerateLobster(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Lua files from the definitions in the Parser object. // See idl_gen_lua.cpp. extern bool GenerateLua(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Rust files from the definitions in the Parser object. // See idl_gen_rust.cpp. extern bool GenerateRust(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Json schema file // See idl_gen_json_schema.cpp. extern bool GenerateJsonSchema(const Parser &parser, const std::string &path, const std::string &file_name); extern bool GenerateKotlin(const Parser &parser, const std::string &path, const std::string &file_name); // Generate Swift classes. // See idl_gen_swift.cpp extern bool GenerateSwift(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a schema file from the internal representation, useful after // parsing a .proto schema. extern std::string GenerateFBS(const Parser &parser, const std::string &file_name); extern bool GenerateFBS(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a make rule for the generated TypeScript code. // See idl_gen_ts.cpp. extern std::string TSMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a make rule for the generated C++ header. // See idl_gen_cpp.cpp. extern std::string CPPMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a make rule for the generated Dart code // see idl_gen_dart.cpp extern std::string DartMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a make rule for the generated Rust code. // See idl_gen_rust.cpp. extern std::string RustMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a make rule for generated Java or C# files. // See code_generators.cpp. extern std::string CSharpMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); extern std::string JavaMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); // Generate a make rule for the generated text (JSON) files. // See idl_gen_text.cpp. extern std::string TextMakeRule(const Parser &parser, const std::string &path, const std::string &file_names); // Generate a make rule for the generated binary files. // See code_generators.cpp. extern std::string BinaryMakeRule(const Parser &parser, const std::string &path, const std::string &file_name); // Generate GRPC Cpp interfaces. // See idl_gen_grpc.cpp. bool GenerateCppGRPC(const Parser &parser, const std::string &path, const std::string &file_name); // Generate GRPC Go interfaces. // See idl_gen_grpc.cpp. bool GenerateGoGRPC(const Parser &parser, const std::string &path, const std::string &file_name); // Generate GRPC Java classes. // See idl_gen_grpc.cpp bool GenerateJavaGRPC(const Parser &parser, const std::string &path, const std::string &file_name); // Generate GRPC Python interfaces. // See idl_gen_grpc.cpp. bool GeneratePythonGRPC(const Parser &parser, const std::string &path, const std::string &file_name); // Generate GRPC Swift interfaces. // See idl_gen_grpc.cpp. extern bool GenerateSwiftGRPC(const Parser &parser, const std::string &path, const std::string &file_name); extern bool GenerateTSGRPC(const Parser &parser, const std::string &path, const std::string &file_name); extern bool GenerateRustModuleRootFile(const Parser &parser, const std::string &path); } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_IDL_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/minireflect.h000066400000000000000000000324031511405061000250310ustar00rootroot00000000000000/* * Copyright 2017 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. */ #ifndef FLATBUFFERS_MINIREFLECT_H_ #define FLATBUFFERS_MINIREFLECT_H_ #include "flatbuffers/flatbuffers.h" #include "flatbuffers/util.h" namespace mapserver { namespace flatbuffers { // Utilities that can be used with the "mini reflection" tables present // in generated code with --reflect-types (only types) or --reflect-names // (also names). // This allows basic reflection functionality such as pretty-printing // that does not require the use of the schema parser or loading of binary // schema files at runtime (reflection.h). // For any of the functions below that take `const TypeTable *`, you pass // `FooTypeTable()` if the type of the root is `Foo`. // First, a generic iterator that can be used by multiple algorithms. struct IterationVisitor { // These mark the scope of a table or struct. virtual void StartSequence() {} virtual void EndSequence() {} // Called for each field regardless of whether it is present or not. // If not present, val == nullptr. set_idx is the index of all set fields. virtual void Field(size_t /*field_idx*/, size_t /*set_idx*/, ElementaryType /*type*/, bool /*is_vector*/, const TypeTable * /*type_table*/, const char * /*name*/, const uint8_t * /*val*/) {} // Called for a value that is actually present, after a field, or as part // of a vector. virtual void UType(uint8_t, const char *) {} virtual void Bool(bool) {} virtual void Char(int8_t, const char *) {} virtual void UChar(uint8_t, const char *) {} virtual void Short(int16_t, const char *) {} virtual void UShort(uint16_t, const char *) {} virtual void Int(int32_t, const char *) {} virtual void UInt(uint32_t, const char *) {} virtual void Long(int64_t) {} virtual void ULong(uint64_t) {} virtual void Float(float) {} virtual void Double(double) {} virtual void String(const String *) {} virtual void Unknown(const uint8_t *) {} // From a future version. // These mark the scope of a vector. virtual void StartVector() {} virtual void EndVector() {} virtual void Element(size_t /*i*/, ElementaryType /*type*/, const TypeTable * /*type_table*/, const uint8_t * /*val*/) {} virtual ~IterationVisitor() {} }; inline size_t InlineSize(ElementaryType type, const TypeTable *type_table) { switch (type) { case ET_UTYPE: case ET_BOOL: case ET_CHAR: case ET_UCHAR: return 1; case ET_SHORT: case ET_USHORT: return 2; case ET_INT: case ET_UINT: case ET_FLOAT: case ET_STRING: return 4; case ET_LONG: case ET_ULONG: case ET_DOUBLE: return 8; case ET_SEQUENCE: switch (type_table->st) { case ST_TABLE: case ST_UNION: return 4; case ST_STRUCT: return static_cast(type_table->values[type_table->num_elems]); default: FLATBUFFERS_ASSERT(false); return 1; } default: FLATBUFFERS_ASSERT(false); return 1; } } inline int64_t LookupEnum(int64_t enum_val, const int64_t *values, size_t num_values) { if (!values) return enum_val; for (size_t i = 0; i < num_values; i++) { if (enum_val == values[i]) return static_cast(i); } return -1; // Unknown enum value. } template const char *EnumName(T tval, const TypeTable *type_table) { if (!type_table || !type_table->names) return nullptr; auto i = LookupEnum(static_cast(tval), type_table->values, type_table->num_elems); if (i >= 0 && i < static_cast(type_table->num_elems)) { return type_table->names[i]; } return nullptr; } void IterateObject(const uint8_t *obj, const TypeTable *type_table, IterationVisitor *visitor); inline void IterateValue(ElementaryType type, const uint8_t *val, const TypeTable *type_table, const uint8_t *prev_val, soffset_t vector_index, IterationVisitor *visitor) { switch (type) { case ET_UTYPE: { auto tval = ReadScalar(val); visitor->UType(tval, EnumName(tval, type_table)); break; } case ET_BOOL: { visitor->Bool(ReadScalar(val) != 0); break; } case ET_CHAR: { auto tval = ReadScalar(val); visitor->Char(tval, EnumName(tval, type_table)); break; } case ET_UCHAR: { auto tval = ReadScalar(val); visitor->UChar(tval, EnumName(tval, type_table)); break; } case ET_SHORT: { auto tval = ReadScalar(val); visitor->Short(tval, EnumName(tval, type_table)); break; } case ET_USHORT: { auto tval = ReadScalar(val); visitor->UShort(tval, EnumName(tval, type_table)); break; } case ET_INT: { auto tval = ReadScalar(val); visitor->Int(tval, EnumName(tval, type_table)); break; } case ET_UINT: { auto tval = ReadScalar(val); visitor->UInt(tval, EnumName(tval, type_table)); break; } case ET_LONG: { visitor->Long(ReadScalar(val)); break; } case ET_ULONG: { visitor->ULong(ReadScalar(val)); break; } case ET_FLOAT: { visitor->Float(ReadScalar(val)); break; } case ET_DOUBLE: { visitor->Double(ReadScalar(val)); break; } case ET_STRING: { val += ReadScalar(val); visitor->String(reinterpret_cast(val)); break; } case ET_SEQUENCE: { switch (type_table->st) { case ST_TABLE: val += ReadScalar(val); IterateObject(val, type_table, visitor); break; case ST_STRUCT: IterateObject(val, type_table, visitor); break; case ST_UNION: { val += ReadScalar(val); FLATBUFFERS_ASSERT(prev_val); auto union_type = *prev_val; // Always a uint8_t. if (vector_index >= 0) { auto type_vec = reinterpret_cast *>(prev_val); union_type = type_vec->Get(static_cast(vector_index)); } auto type_code_idx = LookupEnum(union_type, type_table->values, type_table->num_elems); if (type_code_idx >= 0 && type_code_idx < static_cast(type_table->num_elems)) { auto type_code = type_table->type_codes[type_code_idx]; switch (type_code.base_type) { case ET_SEQUENCE: { auto ref = type_table->type_refs[type_code.sequence_ref](); IterateObject(val, ref, visitor); break; } case ET_STRING: visitor->String(reinterpret_cast(val)); break; default: visitor->Unknown(val); } } else { visitor->Unknown(val); } break; } case ST_ENUM: FLATBUFFERS_ASSERT(false); break; } break; } default: { visitor->Unknown(val); break; } } } inline void IterateObject(const uint8_t *obj, const TypeTable *type_table, IterationVisitor *visitor) { visitor->StartSequence(); const uint8_t *prev_val = nullptr; size_t set_idx = 0; size_t array_idx = 0; for (size_t i = 0; i < type_table->num_elems; i++) { auto type_code = type_table->type_codes[i]; auto type = static_cast(type_code.base_type); auto is_repeating = type_code.is_repeating != 0; auto ref_idx = type_code.sequence_ref; const TypeTable *ref = nullptr; if (ref_idx >= 0) { ref = type_table->type_refs[ref_idx](); } auto name = type_table->names ? type_table->names[i] : nullptr; const uint8_t *val = nullptr; if (type_table->st == ST_TABLE) { val = reinterpret_cast(obj)->GetAddressOf( FieldIndexToOffset(static_cast(i))); } else { val = obj + type_table->values[i]; } visitor->Field(i, set_idx, type, is_repeating, ref, name, val); if (val) { set_idx++; if (is_repeating) { auto elem_ptr = val; size_t size = 0; if (type_table->st == ST_TABLE) { // variable length vector val += ReadScalar(val); auto vec = reinterpret_cast *>(val); elem_ptr = vec->Data(); size = vec->size(); } else { // otherwise fixed size array size = type_table->array_sizes[array_idx]; ++array_idx; } visitor->StartVector(); for (size_t j = 0; j < size; j++) { visitor->Element(j, type, ref, elem_ptr); IterateValue(type, elem_ptr, ref, prev_val, static_cast(j), visitor); elem_ptr += InlineSize(type, ref); } visitor->EndVector(); } else { IterateValue(type, val, ref, prev_val, -1, visitor); } } prev_val = val; } visitor->EndSequence(); } inline void IterateFlatBuffer(const uint8_t *buffer, const TypeTable *type_table, IterationVisitor *callback) { IterateObject(GetRoot(buffer), type_table, callback); } // Outputting a Flatbuffer to a string. Tries to conform as close to JSON / // the output generated by idl_gen_text.cpp. struct ToStringVisitor : public IterationVisitor { std::string s; std::string d; bool q; std::string in; size_t indent_level; bool vector_delimited; ToStringVisitor(std::string delimiter, bool quotes, std::string indent, bool vdelimited = true) : d(delimiter), q(quotes), in(indent), indent_level(0), vector_delimited(vdelimited) {} ToStringVisitor(std::string delimiter) : d(delimiter), q(false), in(""), indent_level(0), vector_delimited(true) {} void append_indent() { for (size_t i = 0; i < indent_level; i++) { s += in; } } void StartSequence() { s += "{"; s += d; indent_level++; } void EndSequence() { s += d; indent_level--; append_indent(); s += "}"; } void Field(size_t /*field_idx*/, size_t set_idx, ElementaryType /*type*/, bool /*is_vector*/, const TypeTable * /*type_table*/, const char *name, const uint8_t *val) { if (!val) return; if (set_idx) { s += ","; s += d; } append_indent(); if (name) { if (q) s += "\""; s += name; if (q) s += "\""; s += ": "; } } template void Named(T x, const char *name) { if (name) { if (q) s += "\""; s += name; if (q) s += "\""; } else { s += NumToString(x); } } void UType(uint8_t x, const char *name) { Named(x, name); } void Bool(bool x) { s += x ? "true" : "false"; } void Char(int8_t x, const char *name) { Named(x, name); } void UChar(uint8_t x, const char *name) { Named(x, name); } void Short(int16_t x, const char *name) { Named(x, name); } void UShort(uint16_t x, const char *name) { Named(x, name); } void Int(int32_t x, const char *name) { Named(x, name); } void UInt(uint32_t x, const char *name) { Named(x, name); } void Long(int64_t x) { s += NumToString(x); } void ULong(uint64_t x) { s += NumToString(x); } void Float(float x) { s += NumToString(x); } void Double(double x) { s += NumToString(x); } void String(const struct String *str) { EscapeString(str->c_str(), str->size(), &s, true, false); } void Unknown(const uint8_t *) { s += "(?)"; } void StartVector() { s += "["; if (vector_delimited) { s += d; indent_level++; append_indent(); } else { s += " "; } } void EndVector() { if (vector_delimited) { s += d; indent_level--; append_indent(); } else { s += " "; } s += "]"; } void Element(size_t i, ElementaryType /*type*/, const TypeTable * /*type_table*/, const uint8_t * /*val*/) { if (i) { s += ","; if (vector_delimited) { s += d; append_indent(); } else { s += " "; } } } }; inline std::string FlatBufferToString(const uint8_t *buffer, const TypeTable *type_table, bool multi_line = false, bool vector_delimited = true) { ToStringVisitor tostring_visitor(multi_line ? "\n" : " ", false, "", vector_delimited); IterateFlatBuffer(buffer, type_table, &tostring_visitor); return tostring_visitor.s; } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_MINIREFLECT_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/pch/000077500000000000000000000000001511405061000231275ustar00rootroot00000000000000mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/pch/flatc_pch.h000066400000000000000000000021371511405061000252260ustar00rootroot00000000000000/* * Copyright 2017 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. */ #ifndef FLATBUFFERS_FLATC_PCH_H_ #define FLATBUFFERS_FLATC_PCH_H_ // stl #include #include #include #include #include #include #include #include #include #include // flatbuffers #include "flatbuffers/pch/pch.h" #include "flatbuffers/code_generators.h" #include "flatbuffers/flatbuffers.h" #include "flatbuffers/flexbuffers.h" #include "flatbuffers/idl.h" #endif // FLATBUFFERS_FLATC_PCH_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/pch/pch.h000066400000000000000000000017431511405061000240570ustar00rootroot00000000000000/* * Copyright 2017 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. */ #ifndef FLATBUFFERS_PCH_H_ #define FLATBUFFERS_PCH_H_ // stl #include #include #include #include #include #include #include #include #include #include #include #include #include // flatbuffers #include "flatbuffers/util.h" #endif // FLATBUFFERS_PCH_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/reflection.h000066400000000000000000000531421511405061000246650ustar00rootroot00000000000000/* * 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. */ #ifndef FLATBUFFERS_REFLECTION_H_ #define FLATBUFFERS_REFLECTION_H_ // This is somewhat of a circular dependency because flatc (and thus this // file) is needed to generate this header in the first place. // Should normally not be a problem since it can be generated by the // previous version of flatc whenever this code needs to change. // See scripts/generate_code.py for generation. #include "flatbuffers/reflection_generated.h" // Helper functionality for reflection. namespace mapserver { namespace flatbuffers { // ------------------------- GETTERS ------------------------- inline bool IsScalar(reflection::BaseType t) { return t >= reflection::UType && t <= reflection::Double; } inline bool IsInteger(reflection::BaseType t) { return t >= reflection::UType && t <= reflection::ULong; } inline bool IsFloat(reflection::BaseType t) { return t == reflection::Float || t == reflection::Double; } inline bool IsLong(reflection::BaseType t) { return t == reflection::Long || t == reflection::ULong; } // Size of a basic type, don't use with structs. inline size_t GetTypeSize(reflection::BaseType base_type) { // This needs to correspond to the BaseType enum. static size_t sizes[] = { 0, // None 1, // UType 1, // Bool 1, // Byte 1, // UByte 2, // Short 2, // UShort 4, // Int 4, // UInt 8, // Long 8, // ULong 4, // Float 8, // Double 4, // String 4, // Vector 4, // Obj 4, // Union 0, // Array. Only used in structs. 0 was chosen to prevent out-of-bounds // errors. 0 // MaxBaseType. This must be kept the last entry in this array. }; static_assert(sizeof(sizes) / sizeof(size_t) == reflection::MaxBaseType + 1, "Size of sizes[] array does not match the count of BaseType " "enum values."); return sizes[base_type]; } // Same as above, but now correctly returns the size of a struct if // the field (or vector element) is a struct. inline size_t GetTypeSizeInline(reflection::BaseType base_type, int type_index, const reflection::Schema &schema) { if (base_type == reflection::Obj && schema.objects()->Get(type_index)->is_struct()) { return schema.objects()->Get(type_index)->bytesize(); } else { return GetTypeSize(base_type); } } // Get the root, regardless of what type it is. inline Table *GetAnyRoot(uint8_t *const flatbuf) { return GetMutableRoot(flatbuf); } inline const Table *GetAnyRoot(const uint8_t *const flatbuf) { return GetRoot
(flatbuf); } inline Table *GetAnySizePrefixedRoot(uint8_t *const flatbuf) { return GetMutableSizePrefixedRoot
(flatbuf); } inline const Table *GetAnySizePrefixedRoot(const uint8_t *const flatbuf) { return GetSizePrefixedRoot
(flatbuf); } // Get a field's default, if you know it's an integer, and its exact type. template T GetFieldDefaultI(const reflection::Field &field) { FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); return static_cast(field.default_integer()); } // Get a field's default, if you know it's floating point and its exact type. template T GetFieldDefaultF(const reflection::Field &field) { FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); return static_cast(field.default_real()); } // Get a field, if you know it's an integer, and its exact type. template T GetFieldI(const Table &table, const reflection::Field &field) { FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); return table.GetField(field.offset(), static_cast(field.default_integer())); } // Get a field, if you know it's floating point and its exact type. template T GetFieldF(const Table &table, const reflection::Field &field) { FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(field.type()->base_type())); return table.GetField(field.offset(), static_cast(field.default_real())); } // Get a field, if you know it's a string. inline const String *GetFieldS(const Table &table, const reflection::Field &field) { FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::String); return table.GetPointer(field.offset()); } // Get a field, if you know it's a vector. template Vector *GetFieldV(const Table &table, const reflection::Field &field) { FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Vector && sizeof(T) == GetTypeSize(field.type()->element())); return table.GetPointer *>(field.offset()); } // Get a field, if you know it's a vector, generically. // To actually access elements, use the return value together with // field.type()->element() in any of GetAnyVectorElemI below etc. inline VectorOfAny *GetFieldAnyV(const Table &table, const reflection::Field &field) { return table.GetPointer(field.offset()); } // Get a field, if you know it's a table. inline Table *GetFieldT(const Table &table, const reflection::Field &field) { FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj || field.type()->base_type() == reflection::Union); return table.GetPointer
(field.offset()); } // Get a field, if you know it's a struct. inline const Struct *GetFieldStruct(const Table &table, const reflection::Field &field) { // TODO: This does NOT check if the field is a table or struct, but we'd need // access to the schema to check the is_struct flag. FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj); return table.GetStruct(field.offset()); } // Get a structure's field, if you know it's a struct. inline const Struct *GetFieldStruct(const Struct &structure, const reflection::Field &field) { FLATBUFFERS_ASSERT(field.type()->base_type() == reflection::Obj); return structure.GetStruct(field.offset()); } // Raw helper functions used below: get any value in memory as a 64bit int, a // double or a string. // All scalars get static_cast to an int64_t, strings use strtoull, every other // data type returns 0. int64_t GetAnyValueI(reflection::BaseType type, const uint8_t *data); // All scalars static cast to double, strings use strtod, every other data // type is 0.0. double GetAnyValueF(reflection::BaseType type, const uint8_t *data); // All scalars converted using stringstream, strings as-is, and all other // data types provide some level of debug-pretty-printing. std::string GetAnyValueS(reflection::BaseType type, const uint8_t *data, const reflection::Schema *schema, int type_index); // Get any table field as a 64bit int, regardless of what type it is. inline int64_t GetAnyFieldI(const Table &table, const reflection::Field &field) { auto field_ptr = table.GetAddressOf(field.offset()); return field_ptr ? GetAnyValueI(field.type()->base_type(), field_ptr) : field.default_integer(); } // Get any table field as a double, regardless of what type it is. inline double GetAnyFieldF(const Table &table, const reflection::Field &field) { auto field_ptr = table.GetAddressOf(field.offset()); return field_ptr ? GetAnyValueF(field.type()->base_type(), field_ptr) : field.default_real(); } // Get any table field as a string, regardless of what type it is. // You may pass nullptr for the schema if you don't care to have fields that // are of table type pretty-printed. inline std::string GetAnyFieldS(const Table &table, const reflection::Field &field, const reflection::Schema *schema) { auto field_ptr = table.GetAddressOf(field.offset()); return field_ptr ? GetAnyValueS(field.type()->base_type(), field_ptr, schema, field.type()->index()) : ""; } // Get any struct field as a 64bit int, regardless of what type it is. inline int64_t GetAnyFieldI(const Struct &st, const reflection::Field &field) { return GetAnyValueI(field.type()->base_type(), st.GetAddressOf(field.offset())); } // Get any struct field as a double, regardless of what type it is. inline double GetAnyFieldF(const Struct &st, const reflection::Field &field) { return GetAnyValueF(field.type()->base_type(), st.GetAddressOf(field.offset())); } // Get any struct field as a string, regardless of what type it is. inline std::string GetAnyFieldS(const Struct &st, const reflection::Field &field) { return GetAnyValueS(field.type()->base_type(), st.GetAddressOf(field.offset()), nullptr, -1); } // Get any vector element as a 64bit int, regardless of what type it is. inline int64_t GetAnyVectorElemI(const VectorOfAny *vec, reflection::BaseType elem_type, size_t i) { return GetAnyValueI(elem_type, vec->Data() + GetTypeSize(elem_type) * i); } // Get any vector element as a double, regardless of what type it is. inline double GetAnyVectorElemF(const VectorOfAny *vec, reflection::BaseType elem_type, size_t i) { return GetAnyValueF(elem_type, vec->Data() + GetTypeSize(elem_type) * i); } // Get any vector element as a string, regardless of what type it is. inline std::string GetAnyVectorElemS(const VectorOfAny *vec, reflection::BaseType elem_type, size_t i) { return GetAnyValueS(elem_type, vec->Data() + GetTypeSize(elem_type) * i, nullptr, -1); } // Get a vector element that's a table/string/vector from a generic vector. // Pass Table/String/VectorOfAny as template parameter. // Warning: does no typechecking. template T *GetAnyVectorElemPointer(const VectorOfAny *vec, size_t i) { auto elem_ptr = vec->Data() + sizeof(uoffset_t) * i; return reinterpret_cast(elem_ptr + ReadScalar(elem_ptr)); } // Get the inline-address of a vector element. Useful for Structs (pass Struct // as template arg), or being able to address a range of scalars in-line. // Get elem_size from GetTypeSizeInline(). // Note: little-endian data on all platforms, use EndianScalar() instead of // raw pointer access with scalars). template T *GetAnyVectorElemAddressOf(const VectorOfAny *vec, size_t i, size_t elem_size) { return reinterpret_cast(vec->Data() + elem_size * i); } // Similarly, for elements of tables. template T *GetAnyFieldAddressOf(const Table &table, const reflection::Field &field) { return reinterpret_cast(table.GetAddressOf(field.offset())); } // Similarly, for elements of structs. template T *GetAnyFieldAddressOf(const Struct &st, const reflection::Field &field) { return reinterpret_cast(st.GetAddressOf(field.offset())); } // Loop over all the fields of the provided `object` and call `func` on each one // in increasing order by their field->id(). If `reverse` is true, `func` is // called in descending order void ForAllFields(const reflection::Object *object, bool reverse, std::function func); // ------------------------- SETTERS ------------------------- // Set any scalar field, if you know its exact type. template bool SetField(Table *table, const reflection::Field &field, T val) { reflection::BaseType type = field.type()->base_type(); if (!IsScalar(type)) { return false; } FLATBUFFERS_ASSERT(sizeof(T) == GetTypeSize(type)); T def; if (IsInteger(type)) { def = GetFieldDefaultI(field); } else { FLATBUFFERS_ASSERT(IsFloat(type)); def = GetFieldDefaultF(field); } return table->SetField(field.offset(), val, def); } // Raw helper functions used below: set any value in memory as a 64bit int, a // double or a string. // These work for all scalar values, but do nothing for other data types. // To set a string, see SetString below. void SetAnyValueI(reflection::BaseType type, uint8_t *data, int64_t val); void SetAnyValueF(reflection::BaseType type, uint8_t *data, double val); void SetAnyValueS(reflection::BaseType type, uint8_t *data, const char *val); // Set any table field as a 64bit int, regardless of type what it is. inline bool SetAnyFieldI(Table *table, const reflection::Field &field, int64_t val) { auto field_ptr = table->GetAddressOf(field.offset()); if (!field_ptr) return val == GetFieldDefaultI(field); SetAnyValueI(field.type()->base_type(), field_ptr, val); return true; } // Set any table field as a double, regardless of what type it is. inline bool SetAnyFieldF(Table *table, const reflection::Field &field, double val) { auto field_ptr = table->GetAddressOf(field.offset()); if (!field_ptr) return val == GetFieldDefaultF(field); SetAnyValueF(field.type()->base_type(), field_ptr, val); return true; } // Set any table field as a string, regardless of what type it is. inline bool SetAnyFieldS(Table *table, const reflection::Field &field, const char *val) { auto field_ptr = table->GetAddressOf(field.offset()); if (!field_ptr) return false; SetAnyValueS(field.type()->base_type(), field_ptr, val); return true; } // Set any struct field as a 64bit int, regardless of type what it is. inline void SetAnyFieldI(Struct *st, const reflection::Field &field, int64_t val) { SetAnyValueI(field.type()->base_type(), st->GetAddressOf(field.offset()), val); } // Set any struct field as a double, regardless of type what it is. inline void SetAnyFieldF(Struct *st, const reflection::Field &field, double val) { SetAnyValueF(field.type()->base_type(), st->GetAddressOf(field.offset()), val); } // Set any struct field as a string, regardless of type what it is. inline void SetAnyFieldS(Struct *st, const reflection::Field &field, const char *val) { SetAnyValueS(field.type()->base_type(), st->GetAddressOf(field.offset()), val); } // Set any vector element as a 64bit int, regardless of type what it is. inline void SetAnyVectorElemI(VectorOfAny *vec, reflection::BaseType elem_type, size_t i, int64_t val) { SetAnyValueI(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); } // Set any vector element as a double, regardless of type what it is. inline void SetAnyVectorElemF(VectorOfAny *vec, reflection::BaseType elem_type, size_t i, double val) { SetAnyValueF(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); } // Set any vector element as a string, regardless of type what it is. inline void SetAnyVectorElemS(VectorOfAny *vec, reflection::BaseType elem_type, size_t i, const char *val) { SetAnyValueS(elem_type, vec->Data() + GetTypeSize(elem_type) * i, val); } // ------------------------- RESIZING SETTERS ------------------------- // "smart" pointer for use with resizing vectors: turns a pointer inside // a vector into a relative offset, such that it is not affected by resizes. template class pointer_inside_vector { public: pointer_inside_vector(T *ptr, std::vector &vec) : offset_(reinterpret_cast(ptr) - reinterpret_cast(vec.data())), vec_(vec) {} T *operator*() const { return reinterpret_cast(reinterpret_cast(vec_.data()) + offset_); } T *operator->() const { return operator*(); } private: size_t offset_; std::vector &vec_; }; // Helper to create the above easily without specifying template args. template pointer_inside_vector piv(T *ptr, std::vector &vec) { return pointer_inside_vector(ptr, vec); } inline const char *UnionTypeFieldSuffix() { return "_type"; } // Helper to figure out the actual table type a union refers to. inline const reflection::Object &GetUnionType( const reflection::Schema &schema, const reflection::Object &parent, const reflection::Field &unionfield, const Table &table) { auto enumdef = schema.enums()->Get(unionfield.type()->index()); // TODO: this is clumsy and slow, but no other way to find it? auto type_field = parent.fields()->LookupByKey( (unionfield.name()->str() + UnionTypeFieldSuffix()).c_str()); FLATBUFFERS_ASSERT(type_field); auto union_type = GetFieldI(table, *type_field); auto enumval = enumdef->values()->LookupByKey(union_type); return *schema.objects()->Get(enumval->union_type()->index()); } // Changes the contents of a string inside a FlatBuffer. FlatBuffer must // live inside a std::vector so we can resize the buffer if needed. // "str" must live inside "flatbuf" and may be invalidated after this call. // If your FlatBuffer's root table is not the schema's root table, you should // pass in your root_table type as well. void SetString(const reflection::Schema &schema, const std::string &val, const String *str, std::vector *flatbuf, const reflection::Object *root_table = nullptr); // Resizes a flatbuffers::Vector inside a FlatBuffer. FlatBuffer must // live inside a std::vector so we can resize the buffer if needed. // "vec" must live inside "flatbuf" and may be invalidated after this call. // If your FlatBuffer's root table is not the schema's root table, you should // pass in your root_table type as well. uint8_t *ResizeAnyVector(const reflection::Schema &schema, uoffset_t newsize, const VectorOfAny *vec, uoffset_t num_elems, uoffset_t elem_size, std::vector *flatbuf, const reflection::Object *root_table = nullptr); template void ResizeVector(const reflection::Schema &schema, uoffset_t newsize, T val, const Vector *vec, std::vector *flatbuf, const reflection::Object *root_table = nullptr) { auto delta_elem = static_cast(newsize) - static_cast(vec->size()); auto newelems = ResizeAnyVector( schema, newsize, reinterpret_cast(vec), vec->size(), static_cast(sizeof(T)), flatbuf, root_table); // Set new elements to "val". for (int i = 0; i < delta_elem; i++) { auto loc = newelems + i * sizeof(T); auto is_scalar = flatbuffers::is_scalar::value; if (is_scalar) { WriteScalar(loc, val); } else { // struct *reinterpret_cast(loc) = val; } } } // Adds any new data (in the form of a new FlatBuffer) to an existing // FlatBuffer. This can be used when any of the above methods are not // sufficient, in particular for adding new tables and new fields. // This is potentially slightly less efficient than a FlatBuffer constructed // in one piece, since the new FlatBuffer doesn't share any vtables with the // existing one. // The return value can now be set using Vector::MutateOffset or SetFieldT // below. const uint8_t *AddFlatBuffer(std::vector &flatbuf, const uint8_t *newbuf, size_t newlen); inline bool SetFieldT(Table *table, const reflection::Field &field, const uint8_t *val) { FLATBUFFERS_ASSERT(sizeof(uoffset_t) == GetTypeSize(field.type()->base_type())); return table->SetPointer(field.offset(), val); } // ------------------------- COPYING ------------------------- // Generic copying of tables from a FlatBuffer into a FlatBuffer builder. // Can be used to do any kind of merging/selecting you may want to do out // of existing buffers. Also useful to reconstruct a whole buffer if the // above resizing functionality has introduced garbage in a buffer you want // to remove. // Note: this does not deal with DAGs correctly. If the table passed forms a // DAG, the copy will be a tree instead (with duplicates). Strings can be // shared however, by passing true for use_string_pooling. Offset CopyTable(FlatBufferBuilder &fbb, const reflection::Schema &schema, const reflection::Object &objectdef, const Table &table, bool use_string_pooling = false); // Verifies the provided flatbuffer using reflection. // root should point to the root type for this flatbuffer. // buf should point to the start of flatbuffer data. // length specifies the size of the flatbuffer data. bool Verify(const reflection::Schema &schema, const reflection::Object &root, const uint8_t *buf, size_t length, uoffset_t max_depth = 64, uoffset_t max_tables = 1000000); bool VerifySizePrefixed(const reflection::Schema &schema, const reflection::Object &root, const uint8_t *buf, size_t length, uoffset_t max_depth = 64, uoffset_t max_tables = 1000000); } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_REFLECTION_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/reflection_generated.h000066400000000000000000001527221511405061000267070ustar00rootroot00000000000000// automatically generated by the FlatBuffers compiler, do not modify #ifndef FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_ #define FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_ #include "flatbuffers/flatbuffers.h" // Ensure the included flatbuffers.h is the same version as when this file was // generated, otherwise it may not be compatible. static_assert(FLATBUFFERS_VERSION_MAJOR == 2 && FLATBUFFERS_VERSION_MINOR == 0 && FLATBUFFERS_VERSION_REVISION == 6, "Non-compatible flatbuffers version included"); namespace reflection { struct Type; struct TypeBuilder; struct KeyValue; struct KeyValueBuilder; struct EnumVal; struct EnumValBuilder; struct Enum; struct EnumBuilder; struct Field; struct FieldBuilder; struct Object; struct ObjectBuilder; struct RPCCall; struct RPCCallBuilder; struct Service; struct ServiceBuilder; struct SchemaFile; struct SchemaFileBuilder; struct Schema; struct SchemaBuilder; enum BaseType { None = 0, UType = 1, Bool = 2, Byte = 3, UByte = 4, Short = 5, UShort = 6, Int = 7, UInt = 8, Long = 9, ULong = 10, Float = 11, Double = 12, String = 13, Vector = 14, Obj = 15, Union = 16, Array = 17, MaxBaseType = 18 }; inline const BaseType (&EnumValuesBaseType())[19] { static const BaseType values[] = { None, UType, Bool, Byte, UByte, Short, UShort, Int, UInt, Long, ULong, Float, Double, String, Vector, Obj, Union, Array, MaxBaseType }; return values; } inline const char * const *EnumNamesBaseType() { static const char * const names[20] = { "None", "UType", "Bool", "Byte", "UByte", "Short", "UShort", "Int", "UInt", "Long", "ULong", "Float", "Double", "String", "Vector", "Obj", "Union", "Array", "MaxBaseType", nullptr }; return names; } inline const char *EnumNameBaseType(BaseType e) { if (flatbuffers::IsOutRange(e, None, MaxBaseType)) return ""; const size_t index = static_cast(e); return EnumNamesBaseType()[index]; } /// New schema language features that are not supported by old code generators. enum AdvancedFeatures { AdvancedArrayFeatures = 1ULL, AdvancedUnionFeatures = 2ULL, OptionalScalars = 4ULL, DefaultVectorsAndStrings = 8ULL }; inline const AdvancedFeatures (&EnumValuesAdvancedFeatures())[4] { static const AdvancedFeatures values[] = { AdvancedArrayFeatures, AdvancedUnionFeatures, OptionalScalars, DefaultVectorsAndStrings }; return values; } inline const char * const *EnumNamesAdvancedFeatures() { static const char * const names[9] = { "AdvancedArrayFeatures", "AdvancedUnionFeatures", "", "OptionalScalars", "", "", "", "DefaultVectorsAndStrings", nullptr }; return names; } inline const char *EnumNameAdvancedFeatures(AdvancedFeatures e) { if (flatbuffers::IsOutRange(e, AdvancedArrayFeatures, DefaultVectorsAndStrings)) return ""; const size_t index = static_cast(e) - static_cast(AdvancedArrayFeatures); return EnumNamesAdvancedFeatures()[index]; } struct Type FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef TypeBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_BASE_TYPE = 4, VT_ELEMENT = 6, VT_INDEX = 8, VT_FIXED_LENGTH = 10, VT_BASE_SIZE = 12, VT_ELEMENT_SIZE = 14 }; reflection::BaseType base_type() const { return static_cast(GetField(VT_BASE_TYPE, 0)); } reflection::BaseType element() const { return static_cast(GetField(VT_ELEMENT, 0)); } int32_t index() const { return GetField(VT_INDEX, -1); } uint16_t fixed_length() const { return GetField(VT_FIXED_LENGTH, 0); } /// The size (octets) of the `base_type` field. uint32_t base_size() const { return GetField(VT_BASE_SIZE, 4); } /// The size (octets) of the `element` field, if present. uint32_t element_size() const { return GetField(VT_ELEMENT_SIZE, 0); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyField(verifier, VT_BASE_TYPE, 1) && VerifyField(verifier, VT_ELEMENT, 1) && VerifyField(verifier, VT_INDEX, 4) && VerifyField(verifier, VT_FIXED_LENGTH, 2) && VerifyField(verifier, VT_BASE_SIZE, 4) && VerifyField(verifier, VT_ELEMENT_SIZE, 4) && verifier.EndTable(); } }; struct TypeBuilder { typedef Type Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_base_type(reflection::BaseType base_type) { fbb_.AddElement(Type::VT_BASE_TYPE, static_cast(base_type), 0); } void add_element(reflection::BaseType element) { fbb_.AddElement(Type::VT_ELEMENT, static_cast(element), 0); } void add_index(int32_t index) { fbb_.AddElement(Type::VT_INDEX, index, -1); } void add_fixed_length(uint16_t fixed_length) { fbb_.AddElement(Type::VT_FIXED_LENGTH, fixed_length, 0); } void add_base_size(uint32_t base_size) { fbb_.AddElement(Type::VT_BASE_SIZE, base_size, 4); } void add_element_size(uint32_t element_size) { fbb_.AddElement(Type::VT_ELEMENT_SIZE, element_size, 0); } explicit TypeBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); return o; } }; inline flatbuffers::Offset CreateType( flatbuffers::FlatBufferBuilder &_fbb, reflection::BaseType base_type = reflection::None, reflection::BaseType element = reflection::None, int32_t index = -1, uint16_t fixed_length = 0, uint32_t base_size = 4, uint32_t element_size = 0) { TypeBuilder builder_(_fbb); builder_.add_element_size(element_size); builder_.add_base_size(base_size); builder_.add_index(index); builder_.add_fixed_length(fixed_length); builder_.add_element(element); builder_.add_base_type(base_type); return builder_.Finish(); } struct KeyValue FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef KeyValueBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_KEY = 4, VT_VALUE = 6 }; const flatbuffers::String *key() const { return GetPointer(VT_KEY); } bool KeyCompareLessThan(const KeyValue *o) const { return *key() < *o->key(); } int KeyCompareWithValue(const char *_key) const { return strcmp(key()->c_str(), _key); } const flatbuffers::String *value() const { return GetPointer(VT_VALUE); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_KEY) && verifier.VerifyString(key()) && VerifyOffset(verifier, VT_VALUE) && verifier.VerifyString(value()) && verifier.EndTable(); } }; struct KeyValueBuilder { typedef KeyValue Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_key(flatbuffers::Offset key) { fbb_.AddOffset(KeyValue::VT_KEY, key); } void add_value(flatbuffers::Offset value) { fbb_.AddOffset(KeyValue::VT_VALUE, value); } explicit KeyValueBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, KeyValue::VT_KEY); return o; } }; inline flatbuffers::Offset CreateKeyValue( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset key = 0, flatbuffers::Offset value = 0) { KeyValueBuilder builder_(_fbb); builder_.add_value(value); builder_.add_key(key); return builder_.Finish(); } inline flatbuffers::Offset CreateKeyValueDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *key = nullptr, const char *value = nullptr) { auto key__ = key ? _fbb.CreateString(key) : 0; auto value__ = value ? _fbb.CreateString(value) : 0; return reflection::CreateKeyValue( _fbb, key__, value__); } struct EnumVal FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef EnumValBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_VALUE = 6, VT_UNION_TYPE = 10, VT_DOCUMENTATION = 12 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } int64_t value() const { return GetField(VT_VALUE, 0); } bool KeyCompareLessThan(const EnumVal *o) const { return value() < o->value(); } int KeyCompareWithValue(int64_t _value) const { return static_cast(value() > _value) - static_cast(value() < _value); } const reflection::Type *union_type() const { return GetPointer(VT_UNION_TYPE); } const flatbuffers::Vector> *documentation() const { return GetPointer> *>(VT_DOCUMENTATION); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyField(verifier, VT_VALUE, 8) && VerifyOffset(verifier, VT_UNION_TYPE) && verifier.VerifyTable(union_type()) && VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && verifier.EndTable(); } }; struct EnumValBuilder { typedef EnumVal Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(EnumVal::VT_NAME, name); } void add_value(int64_t value) { fbb_.AddElement(EnumVal::VT_VALUE, value, 0); } void add_union_type(flatbuffers::Offset union_type) { fbb_.AddOffset(EnumVal::VT_UNION_TYPE, union_type); } void add_documentation(flatbuffers::Offset>> documentation) { fbb_.AddOffset(EnumVal::VT_DOCUMENTATION, documentation); } explicit EnumValBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, EnumVal::VT_NAME); return o; } }; inline flatbuffers::Offset CreateEnumVal( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, int64_t value = 0, flatbuffers::Offset union_type = 0, flatbuffers::Offset>> documentation = 0) { EnumValBuilder builder_(_fbb); builder_.add_value(value); builder_.add_documentation(documentation); builder_.add_union_type(union_type); builder_.add_name(name); return builder_.Finish(); } inline flatbuffers::Offset CreateEnumValDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, int64_t value = 0, flatbuffers::Offset union_type = 0, const std::vector> *documentation = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; return reflection::CreateEnumVal( _fbb, name__, value, union_type, documentation__); } struct Enum FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef EnumBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_VALUES = 6, VT_IS_UNION = 8, VT_UNDERLYING_TYPE = 10, VT_ATTRIBUTES = 12, VT_DOCUMENTATION = 14, VT_DECLARATION_FILE = 16 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } bool KeyCompareLessThan(const Enum *o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } const flatbuffers::Vector> *values() const { return GetPointer> *>(VT_VALUES); } bool is_union() const { return GetField(VT_IS_UNION, 0) != 0; } const reflection::Type *underlying_type() const { return GetPointer(VT_UNDERLYING_TYPE); } const flatbuffers::Vector> *attributes() const { return GetPointer> *>(VT_ATTRIBUTES); } const flatbuffers::Vector> *documentation() const { return GetPointer> *>(VT_DOCUMENTATION); } /// File that this Enum is declared in. const flatbuffers::String *declaration_file() const { return GetPointer(VT_DECLARATION_FILE); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffsetRequired(verifier, VT_VALUES) && verifier.VerifyVector(values()) && verifier.VerifyVectorOfTables(values()) && VerifyField(verifier, VT_IS_UNION, 1) && VerifyOffsetRequired(verifier, VT_UNDERLYING_TYPE) && verifier.VerifyTable(underlying_type()) && VerifyOffset(verifier, VT_ATTRIBUTES) && verifier.VerifyVector(attributes()) && verifier.VerifyVectorOfTables(attributes()) && VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && VerifyOffset(verifier, VT_DECLARATION_FILE) && verifier.VerifyString(declaration_file()) && verifier.EndTable(); } }; struct EnumBuilder { typedef Enum Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Enum::VT_NAME, name); } void add_values(flatbuffers::Offset>> values) { fbb_.AddOffset(Enum::VT_VALUES, values); } void add_is_union(bool is_union) { fbb_.AddElement(Enum::VT_IS_UNION, static_cast(is_union), 0); } void add_underlying_type(flatbuffers::Offset underlying_type) { fbb_.AddOffset(Enum::VT_UNDERLYING_TYPE, underlying_type); } void add_attributes(flatbuffers::Offset>> attributes) { fbb_.AddOffset(Enum::VT_ATTRIBUTES, attributes); } void add_documentation(flatbuffers::Offset>> documentation) { fbb_.AddOffset(Enum::VT_DOCUMENTATION, documentation); } void add_declaration_file(flatbuffers::Offset declaration_file) { fbb_.AddOffset(Enum::VT_DECLARATION_FILE, declaration_file); } explicit EnumBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, Enum::VT_NAME); fbb_.Required(o, Enum::VT_VALUES); fbb_.Required(o, Enum::VT_UNDERLYING_TYPE); return o; } }; inline flatbuffers::Offset CreateEnum( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, flatbuffers::Offset>> values = 0, bool is_union = false, flatbuffers::Offset underlying_type = 0, flatbuffers::Offset>> attributes = 0, flatbuffers::Offset>> documentation = 0, flatbuffers::Offset declaration_file = 0) { EnumBuilder builder_(_fbb); builder_.add_declaration_file(declaration_file); builder_.add_documentation(documentation); builder_.add_attributes(attributes); builder_.add_underlying_type(underlying_type); builder_.add_values(values); builder_.add_name(name); builder_.add_is_union(is_union); return builder_.Finish(); } inline flatbuffers::Offset CreateEnumDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, std::vector> *values = nullptr, bool is_union = false, flatbuffers::Offset underlying_type = 0, std::vector> *attributes = nullptr, const std::vector> *documentation = nullptr, const char *declaration_file = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto values__ = values ? _fbb.CreateVectorOfSortedTables(values) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; auto declaration_file__ = declaration_file ? _fbb.CreateString(declaration_file) : 0; return reflection::CreateEnum( _fbb, name__, values__, is_union, underlying_type, attributes__, documentation__, declaration_file__); } struct Field FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef FieldBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_TYPE = 6, VT_ID = 8, VT_OFFSET = 10, VT_DEFAULT_INTEGER = 12, VT_DEFAULT_REAL = 14, VT_DEPRECATED = 16, VT_REQUIRED = 18, VT_KEY = 20, VT_ATTRIBUTES = 22, VT_DOCUMENTATION = 24, VT_OPTIONAL = 26, VT_PADDING = 28 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } bool KeyCompareLessThan(const Field *o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } const reflection::Type *type() const { return GetPointer(VT_TYPE); } uint16_t id() const { return GetField(VT_ID, 0); } uint16_t offset() const { return GetField(VT_OFFSET, 0); } int64_t default_integer() const { return GetField(VT_DEFAULT_INTEGER, 0); } double default_real() const { return GetField(VT_DEFAULT_REAL, 0.0); } bool deprecated() const { return GetField(VT_DEPRECATED, 0) != 0; } bool required() const { return GetField(VT_REQUIRED, 0) != 0; } bool key() const { return GetField(VT_KEY, 0) != 0; } const flatbuffers::Vector> *attributes() const { return GetPointer> *>(VT_ATTRIBUTES); } const flatbuffers::Vector> *documentation() const { return GetPointer> *>(VT_DOCUMENTATION); } bool optional() const { return GetField(VT_OPTIONAL, 0) != 0; } /// Number of padding octets to always add after this field. Structs only. uint16_t padding() const { return GetField(VT_PADDING, 0); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffsetRequired(verifier, VT_TYPE) && verifier.VerifyTable(type()) && VerifyField(verifier, VT_ID, 2) && VerifyField(verifier, VT_OFFSET, 2) && VerifyField(verifier, VT_DEFAULT_INTEGER, 8) && VerifyField(verifier, VT_DEFAULT_REAL, 8) && VerifyField(verifier, VT_DEPRECATED, 1) && VerifyField(verifier, VT_REQUIRED, 1) && VerifyField(verifier, VT_KEY, 1) && VerifyOffset(verifier, VT_ATTRIBUTES) && verifier.VerifyVector(attributes()) && verifier.VerifyVectorOfTables(attributes()) && VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && VerifyField(verifier, VT_OPTIONAL, 1) && VerifyField(verifier, VT_PADDING, 2) && verifier.EndTable(); } }; struct FieldBuilder { typedef Field Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Field::VT_NAME, name); } void add_type(flatbuffers::Offset type) { fbb_.AddOffset(Field::VT_TYPE, type); } void add_id(uint16_t id) { fbb_.AddElement(Field::VT_ID, id, 0); } void add_offset(uint16_t offset) { fbb_.AddElement(Field::VT_OFFSET, offset, 0); } void add_default_integer(int64_t default_integer) { fbb_.AddElement(Field::VT_DEFAULT_INTEGER, default_integer, 0); } void add_default_real(double default_real) { fbb_.AddElement(Field::VT_DEFAULT_REAL, default_real, 0.0); } void add_deprecated(bool deprecated) { fbb_.AddElement(Field::VT_DEPRECATED, static_cast(deprecated), 0); } void add_required(bool required) { fbb_.AddElement(Field::VT_REQUIRED, static_cast(required), 0); } void add_key(bool key) { fbb_.AddElement(Field::VT_KEY, static_cast(key), 0); } void add_attributes(flatbuffers::Offset>> attributes) { fbb_.AddOffset(Field::VT_ATTRIBUTES, attributes); } void add_documentation(flatbuffers::Offset>> documentation) { fbb_.AddOffset(Field::VT_DOCUMENTATION, documentation); } void add_optional(bool optional) { fbb_.AddElement(Field::VT_OPTIONAL, static_cast(optional), 0); } void add_padding(uint16_t padding) { fbb_.AddElement(Field::VT_PADDING, padding, 0); } explicit FieldBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, Field::VT_NAME); fbb_.Required(o, Field::VT_TYPE); return o; } }; inline flatbuffers::Offset CreateField( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, flatbuffers::Offset type = 0, uint16_t id = 0, uint16_t offset = 0, int64_t default_integer = 0, double default_real = 0.0, bool deprecated = false, bool required = false, bool key = false, flatbuffers::Offset>> attributes = 0, flatbuffers::Offset>> documentation = 0, bool optional = false, uint16_t padding = 0) { FieldBuilder builder_(_fbb); builder_.add_default_real(default_real); builder_.add_default_integer(default_integer); builder_.add_documentation(documentation); builder_.add_attributes(attributes); builder_.add_type(type); builder_.add_name(name); builder_.add_padding(padding); builder_.add_offset(offset); builder_.add_id(id); builder_.add_optional(optional); builder_.add_key(key); builder_.add_required(required); builder_.add_deprecated(deprecated); return builder_.Finish(); } inline flatbuffers::Offset CreateFieldDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, flatbuffers::Offset type = 0, uint16_t id = 0, uint16_t offset = 0, int64_t default_integer = 0, double default_real = 0.0, bool deprecated = false, bool required = false, bool key = false, std::vector> *attributes = nullptr, const std::vector> *documentation = nullptr, bool optional = false, uint16_t padding = 0) { auto name__ = name ? _fbb.CreateString(name) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; return reflection::CreateField( _fbb, name__, type, id, offset, default_integer, default_real, deprecated, required, key, attributes__, documentation__, optional, padding); } struct Object FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ObjectBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_FIELDS = 6, VT_IS_STRUCT = 8, VT_MINALIGN = 10, VT_BYTESIZE = 12, VT_ATTRIBUTES = 14, VT_DOCUMENTATION = 16, VT_DECLARATION_FILE = 18 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } bool KeyCompareLessThan(const Object *o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } const flatbuffers::Vector> *fields() const { return GetPointer> *>(VT_FIELDS); } bool is_struct() const { return GetField(VT_IS_STRUCT, 0) != 0; } int32_t minalign() const { return GetField(VT_MINALIGN, 0); } int32_t bytesize() const { return GetField(VT_BYTESIZE, 0); } const flatbuffers::Vector> *attributes() const { return GetPointer> *>(VT_ATTRIBUTES); } const flatbuffers::Vector> *documentation() const { return GetPointer> *>(VT_DOCUMENTATION); } /// File that this Object is declared in. const flatbuffers::String *declaration_file() const { return GetPointer(VT_DECLARATION_FILE); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffsetRequired(verifier, VT_FIELDS) && verifier.VerifyVector(fields()) && verifier.VerifyVectorOfTables(fields()) && VerifyField(verifier, VT_IS_STRUCT, 1) && VerifyField(verifier, VT_MINALIGN, 4) && VerifyField(verifier, VT_BYTESIZE, 4) && VerifyOffset(verifier, VT_ATTRIBUTES) && verifier.VerifyVector(attributes()) && verifier.VerifyVectorOfTables(attributes()) && VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && VerifyOffset(verifier, VT_DECLARATION_FILE) && verifier.VerifyString(declaration_file()) && verifier.EndTable(); } }; struct ObjectBuilder { typedef Object Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Object::VT_NAME, name); } void add_fields(flatbuffers::Offset>> fields) { fbb_.AddOffset(Object::VT_FIELDS, fields); } void add_is_struct(bool is_struct) { fbb_.AddElement(Object::VT_IS_STRUCT, static_cast(is_struct), 0); } void add_minalign(int32_t minalign) { fbb_.AddElement(Object::VT_MINALIGN, minalign, 0); } void add_bytesize(int32_t bytesize) { fbb_.AddElement(Object::VT_BYTESIZE, bytesize, 0); } void add_attributes(flatbuffers::Offset>> attributes) { fbb_.AddOffset(Object::VT_ATTRIBUTES, attributes); } void add_documentation(flatbuffers::Offset>> documentation) { fbb_.AddOffset(Object::VT_DOCUMENTATION, documentation); } void add_declaration_file(flatbuffers::Offset declaration_file) { fbb_.AddOffset(Object::VT_DECLARATION_FILE, declaration_file); } explicit ObjectBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, Object::VT_NAME); fbb_.Required(o, Object::VT_FIELDS); return o; } }; inline flatbuffers::Offset CreateObject( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, flatbuffers::Offset>> fields = 0, bool is_struct = false, int32_t minalign = 0, int32_t bytesize = 0, flatbuffers::Offset>> attributes = 0, flatbuffers::Offset>> documentation = 0, flatbuffers::Offset declaration_file = 0) { ObjectBuilder builder_(_fbb); builder_.add_declaration_file(declaration_file); builder_.add_documentation(documentation); builder_.add_attributes(attributes); builder_.add_bytesize(bytesize); builder_.add_minalign(minalign); builder_.add_fields(fields); builder_.add_name(name); builder_.add_is_struct(is_struct); return builder_.Finish(); } inline flatbuffers::Offset CreateObjectDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, std::vector> *fields = nullptr, bool is_struct = false, int32_t minalign = 0, int32_t bytesize = 0, std::vector> *attributes = nullptr, const std::vector> *documentation = nullptr, const char *declaration_file = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto fields__ = fields ? _fbb.CreateVectorOfSortedTables(fields) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; auto declaration_file__ = declaration_file ? _fbb.CreateString(declaration_file) : 0; return reflection::CreateObject( _fbb, name__, fields__, is_struct, minalign, bytesize, attributes__, documentation__, declaration_file__); } struct RPCCall FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef RPCCallBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_REQUEST = 6, VT_RESPONSE = 8, VT_ATTRIBUTES = 10, VT_DOCUMENTATION = 12 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } bool KeyCompareLessThan(const RPCCall *o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } const reflection::Object *request() const { return GetPointer(VT_REQUEST); } const reflection::Object *response() const { return GetPointer(VT_RESPONSE); } const flatbuffers::Vector> *attributes() const { return GetPointer> *>(VT_ATTRIBUTES); } const flatbuffers::Vector> *documentation() const { return GetPointer> *>(VT_DOCUMENTATION); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffsetRequired(verifier, VT_REQUEST) && verifier.VerifyTable(request()) && VerifyOffsetRequired(verifier, VT_RESPONSE) && verifier.VerifyTable(response()) && VerifyOffset(verifier, VT_ATTRIBUTES) && verifier.VerifyVector(attributes()) && verifier.VerifyVectorOfTables(attributes()) && VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && verifier.EndTable(); } }; struct RPCCallBuilder { typedef RPCCall Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(RPCCall::VT_NAME, name); } void add_request(flatbuffers::Offset request) { fbb_.AddOffset(RPCCall::VT_REQUEST, request); } void add_response(flatbuffers::Offset response) { fbb_.AddOffset(RPCCall::VT_RESPONSE, response); } void add_attributes(flatbuffers::Offset>> attributes) { fbb_.AddOffset(RPCCall::VT_ATTRIBUTES, attributes); } void add_documentation(flatbuffers::Offset>> documentation) { fbb_.AddOffset(RPCCall::VT_DOCUMENTATION, documentation); } explicit RPCCallBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, RPCCall::VT_NAME); fbb_.Required(o, RPCCall::VT_REQUEST); fbb_.Required(o, RPCCall::VT_RESPONSE); return o; } }; inline flatbuffers::Offset CreateRPCCall( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, flatbuffers::Offset request = 0, flatbuffers::Offset response = 0, flatbuffers::Offset>> attributes = 0, flatbuffers::Offset>> documentation = 0) { RPCCallBuilder builder_(_fbb); builder_.add_documentation(documentation); builder_.add_attributes(attributes); builder_.add_response(response); builder_.add_request(request); builder_.add_name(name); return builder_.Finish(); } inline flatbuffers::Offset CreateRPCCallDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, flatbuffers::Offset request = 0, flatbuffers::Offset response = 0, std::vector> *attributes = nullptr, const std::vector> *documentation = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; return reflection::CreateRPCCall( _fbb, name__, request, response, attributes__, documentation__); } struct Service FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef ServiceBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_NAME = 4, VT_CALLS = 6, VT_ATTRIBUTES = 8, VT_DOCUMENTATION = 10, VT_DECLARATION_FILE = 12 }; const flatbuffers::String *name() const { return GetPointer(VT_NAME); } bool KeyCompareLessThan(const Service *o) const { return *name() < *o->name(); } int KeyCompareWithValue(const char *_name) const { return strcmp(name()->c_str(), _name); } const flatbuffers::Vector> *calls() const { return GetPointer> *>(VT_CALLS); } const flatbuffers::Vector> *attributes() const { return GetPointer> *>(VT_ATTRIBUTES); } const flatbuffers::Vector> *documentation() const { return GetPointer> *>(VT_DOCUMENTATION); } /// File that this Service is declared in. const flatbuffers::String *declaration_file() const { return GetPointer(VT_DECLARATION_FILE); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_NAME) && verifier.VerifyString(name()) && VerifyOffset(verifier, VT_CALLS) && verifier.VerifyVector(calls()) && verifier.VerifyVectorOfTables(calls()) && VerifyOffset(verifier, VT_ATTRIBUTES) && verifier.VerifyVector(attributes()) && verifier.VerifyVectorOfTables(attributes()) && VerifyOffset(verifier, VT_DOCUMENTATION) && verifier.VerifyVector(documentation()) && verifier.VerifyVectorOfStrings(documentation()) && VerifyOffset(verifier, VT_DECLARATION_FILE) && verifier.VerifyString(declaration_file()) && verifier.EndTable(); } }; struct ServiceBuilder { typedef Service Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_name(flatbuffers::Offset name) { fbb_.AddOffset(Service::VT_NAME, name); } void add_calls(flatbuffers::Offset>> calls) { fbb_.AddOffset(Service::VT_CALLS, calls); } void add_attributes(flatbuffers::Offset>> attributes) { fbb_.AddOffset(Service::VT_ATTRIBUTES, attributes); } void add_documentation(flatbuffers::Offset>> documentation) { fbb_.AddOffset(Service::VT_DOCUMENTATION, documentation); } void add_declaration_file(flatbuffers::Offset declaration_file) { fbb_.AddOffset(Service::VT_DECLARATION_FILE, declaration_file); } explicit ServiceBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, Service::VT_NAME); return o; } }; inline flatbuffers::Offset CreateService( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset name = 0, flatbuffers::Offset>> calls = 0, flatbuffers::Offset>> attributes = 0, flatbuffers::Offset>> documentation = 0, flatbuffers::Offset declaration_file = 0) { ServiceBuilder builder_(_fbb); builder_.add_declaration_file(declaration_file); builder_.add_documentation(documentation); builder_.add_attributes(attributes); builder_.add_calls(calls); builder_.add_name(name); return builder_.Finish(); } inline flatbuffers::Offset CreateServiceDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *name = nullptr, std::vector> *calls = nullptr, std::vector> *attributes = nullptr, const std::vector> *documentation = nullptr, const char *declaration_file = nullptr) { auto name__ = name ? _fbb.CreateString(name) : 0; auto calls__ = calls ? _fbb.CreateVectorOfSortedTables(calls) : 0; auto attributes__ = attributes ? _fbb.CreateVectorOfSortedTables(attributes) : 0; auto documentation__ = documentation ? _fbb.CreateVector>(*documentation) : 0; auto declaration_file__ = declaration_file ? _fbb.CreateString(declaration_file) : 0; return reflection::CreateService( _fbb, name__, calls__, attributes__, documentation__, declaration_file__); } /// File specific information. /// Symbols declared within a file may be recovered by iterating over all /// symbols and examining the `declaration_file` field. struct SchemaFile FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef SchemaFileBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_FILENAME = 4, VT_INCLUDED_FILENAMES = 6 }; /// Filename, relative to project root. const flatbuffers::String *filename() const { return GetPointer(VT_FILENAME); } bool KeyCompareLessThan(const SchemaFile *o) const { return *filename() < *o->filename(); } int KeyCompareWithValue(const char *_filename) const { return strcmp(filename()->c_str(), _filename); } /// Names of included files, relative to project root. const flatbuffers::Vector> *included_filenames() const { return GetPointer> *>(VT_INCLUDED_FILENAMES); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_FILENAME) && verifier.VerifyString(filename()) && VerifyOffset(verifier, VT_INCLUDED_FILENAMES) && verifier.VerifyVector(included_filenames()) && verifier.VerifyVectorOfStrings(included_filenames()) && verifier.EndTable(); } }; struct SchemaFileBuilder { typedef SchemaFile Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_filename(flatbuffers::Offset filename) { fbb_.AddOffset(SchemaFile::VT_FILENAME, filename); } void add_included_filenames(flatbuffers::Offset>> included_filenames) { fbb_.AddOffset(SchemaFile::VT_INCLUDED_FILENAMES, included_filenames); } explicit SchemaFileBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, SchemaFile::VT_FILENAME); return o; } }; inline flatbuffers::Offset CreateSchemaFile( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset filename = 0, flatbuffers::Offset>> included_filenames = 0) { SchemaFileBuilder builder_(_fbb); builder_.add_included_filenames(included_filenames); builder_.add_filename(filename); return builder_.Finish(); } inline flatbuffers::Offset CreateSchemaFileDirect( flatbuffers::FlatBufferBuilder &_fbb, const char *filename = nullptr, const std::vector> *included_filenames = nullptr) { auto filename__ = filename ? _fbb.CreateString(filename) : 0; auto included_filenames__ = included_filenames ? _fbb.CreateVector>(*included_filenames) : 0; return reflection::CreateSchemaFile( _fbb, filename__, included_filenames__); } struct Schema FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { typedef SchemaBuilder Builder; enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { VT_OBJECTS = 4, VT_ENUMS = 6, VT_FILE_IDENT = 8, VT_FILE_EXT = 10, VT_ROOT_TABLE = 12, VT_SERVICES = 14, VT_ADVANCED_FEATURES = 16, VT_FBS_FILES = 18 }; const flatbuffers::Vector> *objects() const { return GetPointer> *>(VT_OBJECTS); } const flatbuffers::Vector> *enums() const { return GetPointer> *>(VT_ENUMS); } const flatbuffers::String *file_ident() const { return GetPointer(VT_FILE_IDENT); } const flatbuffers::String *file_ext() const { return GetPointer(VT_FILE_EXT); } const reflection::Object *root_table() const { return GetPointer(VT_ROOT_TABLE); } const flatbuffers::Vector> *services() const { return GetPointer> *>(VT_SERVICES); } reflection::AdvancedFeatures advanced_features() const { return static_cast(GetField(VT_ADVANCED_FEATURES, 0)); } /// All the files used in this compilation. Files are relative to where /// flatc was invoked. const flatbuffers::Vector> *fbs_files() const { return GetPointer> *>(VT_FBS_FILES); } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffsetRequired(verifier, VT_OBJECTS) && verifier.VerifyVector(objects()) && verifier.VerifyVectorOfTables(objects()) && VerifyOffsetRequired(verifier, VT_ENUMS) && verifier.VerifyVector(enums()) && verifier.VerifyVectorOfTables(enums()) && VerifyOffset(verifier, VT_FILE_IDENT) && verifier.VerifyString(file_ident()) && VerifyOffset(verifier, VT_FILE_EXT) && verifier.VerifyString(file_ext()) && VerifyOffset(verifier, VT_ROOT_TABLE) && verifier.VerifyTable(root_table()) && VerifyOffset(verifier, VT_SERVICES) && verifier.VerifyVector(services()) && verifier.VerifyVectorOfTables(services()) && VerifyField(verifier, VT_ADVANCED_FEATURES, 8) && VerifyOffset(verifier, VT_FBS_FILES) && verifier.VerifyVector(fbs_files()) && verifier.VerifyVectorOfTables(fbs_files()) && verifier.EndTable(); } }; struct SchemaBuilder { typedef Schema Table; flatbuffers::FlatBufferBuilder &fbb_; flatbuffers::uoffset_t start_; void add_objects(flatbuffers::Offset>> objects) { fbb_.AddOffset(Schema::VT_OBJECTS, objects); } void add_enums(flatbuffers::Offset>> enums) { fbb_.AddOffset(Schema::VT_ENUMS, enums); } void add_file_ident(flatbuffers::Offset file_ident) { fbb_.AddOffset(Schema::VT_FILE_IDENT, file_ident); } void add_file_ext(flatbuffers::Offset file_ext) { fbb_.AddOffset(Schema::VT_FILE_EXT, file_ext); } void add_root_table(flatbuffers::Offset root_table) { fbb_.AddOffset(Schema::VT_ROOT_TABLE, root_table); } void add_services(flatbuffers::Offset>> services) { fbb_.AddOffset(Schema::VT_SERVICES, services); } void add_advanced_features(reflection::AdvancedFeatures advanced_features) { fbb_.AddElement(Schema::VT_ADVANCED_FEATURES, static_cast(advanced_features), 0); } void add_fbs_files(flatbuffers::Offset>> fbs_files) { fbb_.AddOffset(Schema::VT_FBS_FILES, fbs_files); } explicit SchemaBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); } flatbuffers::Offset Finish() { const auto end = fbb_.EndTable(start_); auto o = flatbuffers::Offset(end); fbb_.Required(o, Schema::VT_OBJECTS); fbb_.Required(o, Schema::VT_ENUMS); return o; } }; inline flatbuffers::Offset CreateSchema( flatbuffers::FlatBufferBuilder &_fbb, flatbuffers::Offset>> objects = 0, flatbuffers::Offset>> enums = 0, flatbuffers::Offset file_ident = 0, flatbuffers::Offset file_ext = 0, flatbuffers::Offset root_table = 0, flatbuffers::Offset>> services = 0, reflection::AdvancedFeatures advanced_features = static_cast(0), flatbuffers::Offset>> fbs_files = 0) { SchemaBuilder builder_(_fbb); builder_.add_advanced_features(advanced_features); builder_.add_fbs_files(fbs_files); builder_.add_services(services); builder_.add_root_table(root_table); builder_.add_file_ext(file_ext); builder_.add_file_ident(file_ident); builder_.add_enums(enums); builder_.add_objects(objects); return builder_.Finish(); } inline flatbuffers::Offset CreateSchemaDirect( flatbuffers::FlatBufferBuilder &_fbb, std::vector> *objects = nullptr, std::vector> *enums = nullptr, const char *file_ident = nullptr, const char *file_ext = nullptr, flatbuffers::Offset root_table = 0, std::vector> *services = nullptr, reflection::AdvancedFeatures advanced_features = static_cast(0), std::vector> *fbs_files = nullptr) { auto objects__ = objects ? _fbb.CreateVectorOfSortedTables(objects) : 0; auto enums__ = enums ? _fbb.CreateVectorOfSortedTables(enums) : 0; auto file_ident__ = file_ident ? _fbb.CreateString(file_ident) : 0; auto file_ext__ = file_ext ? _fbb.CreateString(file_ext) : 0; auto services__ = services ? _fbb.CreateVectorOfSortedTables(services) : 0; auto fbs_files__ = fbs_files ? _fbb.CreateVectorOfSortedTables(fbs_files) : 0; return reflection::CreateSchema( _fbb, objects__, enums__, file_ident__, file_ext__, root_table, services__, advanced_features, fbs_files__); } inline const reflection::Schema *GetSchema(const void *buf) { return flatbuffers::GetRoot(buf); } inline const reflection::Schema *GetSizePrefixedSchema(const void *buf) { return flatbuffers::GetSizePrefixedRoot(buf); } inline const char *SchemaIdentifier() { return "BFBS"; } inline bool SchemaBufferHasIdentifier(const void *buf) { return flatbuffers::BufferHasIdentifier( buf, SchemaIdentifier()); } inline bool SizePrefixedSchemaBufferHasIdentifier(const void *buf) { return flatbuffers::BufferHasIdentifier( buf, SchemaIdentifier(), true); } inline bool VerifySchemaBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifyBuffer(SchemaIdentifier()); } inline bool VerifySizePrefixedSchemaBuffer( flatbuffers::Verifier &verifier) { return verifier.VerifySizePrefixedBuffer(SchemaIdentifier()); } inline const char *SchemaExtension() { return "bfbs"; } inline void FinishSchemaBuffer( flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset root) { fbb.Finish(root, SchemaIdentifier()); } inline void FinishSizePrefixedSchemaBuffer( flatbuffers::FlatBufferBuilder &fbb, flatbuffers::Offset root) { fbb.FinishSizePrefixed(root, SchemaIdentifier()); } } // namespace reflection #endif // FLATBUFFERS_GENERATED_REFLECTION_REFLECTION_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/registry.h000066400000000000000000000106531511405061000244030ustar00rootroot00000000000000/* * Copyright 2017 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. */ #ifndef FLATBUFFERS_REGISTRY_H_ #define FLATBUFFERS_REGISTRY_H_ #include "flatbuffers/base.h" #include "flatbuffers/idl.h" namespace mapserver { namespace flatbuffers { // Convenience class to easily parse or generate text for arbitrary FlatBuffers. // Simply pre-populate it with all schema filenames that may be in use, and // This class will look them up using the file_identifier declared in the // schema. class Registry { public: // Call this for all schemas that may be in use. The identifier has // a function in the generated code, e.g. MonsterIdentifier(). void Register(const char *file_identifier, const char *schema_path) { Schema schema; schema.path_ = schema_path; schemas_[file_identifier] = schema; } // Generate text from an arbitrary FlatBuffer by looking up its // file_identifier in the registry. bool FlatBufferToText(const uint8_t *flatbuf, size_t len, std::string *dest) { // Get the identifier out of the buffer. // If the buffer is truncated, exit. if (len < sizeof(uoffset_t) + kFileIdentifierLength) { lasterror_ = "buffer truncated"; return false; } std::string ident( reinterpret_cast(flatbuf) + sizeof(uoffset_t), kFileIdentifierLength); // Load and parse the schema. Parser parser; if (!LoadSchema(ident, &parser)) return false; // Now we're ready to generate text. if (!GenerateText(parser, flatbuf, dest)) { lasterror_ = "unable to generate text for FlatBuffer binary"; return false; } return true; } // Converts a binary buffer to text using one of the schemas in the registry, // use the file_identifier to indicate which. // If DetachedBuffer::data() is null then parsing failed. DetachedBuffer TextToFlatBuffer(const char *text, const char *file_identifier) { // Load and parse the schema. Parser parser; if (!LoadSchema(file_identifier, &parser)) return DetachedBuffer(); // Parse the text. if (!parser.Parse(text)) { lasterror_ = parser.error_; return DetachedBuffer(); } // We have a valid FlatBuffer. Detach it from the builder and return. return parser.builder_.Release(); } // Modify any parsing / output options used by the other functions. void SetOptions(const IDLOptions &opts) { opts_ = opts; } // If schemas used contain include statements, call this function for every // directory the parser should search them for. void AddIncludeDirectory(const char *path) { include_paths_.push_back(path); } // Returns a human readable error if any of the above functions fail. const std::string &GetLastError() { return lasterror_; } private: bool LoadSchema(const std::string &ident, Parser *parser) { // Find the schema, if not, exit. auto it = schemas_.find(ident); if (it == schemas_.end()) { // Don't attach the identifier, since it may not be human readable. lasterror_ = "identifier for this buffer not in the registry"; return false; } auto &schema = it->second; // Load the schema from disk. If not, exit. std::string schematext; if (!LoadFile(schema.path_.c_str(), false, &schematext)) { lasterror_ = "could not load schema: " + schema.path_; return false; } // Parse schema. parser->opts = opts_; if (!parser->Parse(schematext.c_str(), include_paths_.data(), schema.path_.c_str())) { lasterror_ = parser->error_; return false; } return true; } struct Schema { std::string path_; // TODO(wvo) optionally cache schema file or parsed schema here. }; std::string lasterror_; IDLOptions opts_; std::vector include_paths_; std::map schemas_; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_REGISTRY_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/stl_emulation.h000066400000000000000000000445461511405061000254220ustar00rootroot00000000000000/* * Copyright 2017 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. */ #ifndef FLATBUFFERS_STL_EMULATION_H_ #define FLATBUFFERS_STL_EMULATION_H_ // clang-format off #include "flatbuffers/base.h" #include #include #include #include #include #ifndef FLATBUFFERS_USE_STD_OPTIONAL // Detect C++17 compatible compiler. // __cplusplus >= 201703L - a compiler has support of 'static inline' variables. #if (defined(__cplusplus) && __cplusplus >= 201703L) \ || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) #define FLATBUFFERS_USE_STD_OPTIONAL 1 #else #define FLATBUFFERS_USE_STD_OPTIONAL 0 #endif // (defined(__cplusplus) && __cplusplus >= 201703L) ... #endif // FLATBUFFERS_USE_STD_OPTIONAL #if FLATBUFFERS_USE_STD_OPTIONAL #include #endif // The __cpp_lib_span is the predefined feature macro. #if defined(FLATBUFFERS_USE_STD_SPAN) #include #elif defined(__cpp_lib_span) && defined(__has_include) #if __has_include() #include #define FLATBUFFERS_USE_STD_SPAN #endif #else // Disable non-trivial ctors if FLATBUFFERS_SPAN_MINIMAL defined. #if !defined(FLATBUFFERS_TEMPLATES_ALIASES) #define FLATBUFFERS_SPAN_MINIMAL #else // Enable implicit construction of a span from a std::array. #include #endif #endif // defined(FLATBUFFERS_USE_STD_SPAN) // This header provides backwards compatibility for older versions of the STL. namespace mapserver { namespace flatbuffers { #if defined(FLATBUFFERS_TEMPLATES_ALIASES) template using numeric_limits = std::numeric_limits; #else template class numeric_limits : public std::numeric_limits {}; #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) #if defined(FLATBUFFERS_TEMPLATES_ALIASES) template using is_scalar = std::is_scalar; template using is_same = std::is_same; template using is_floating_point = std::is_floating_point; template using is_unsigned = std::is_unsigned; template using is_enum = std::is_enum; template using make_unsigned = std::make_unsigned; template using conditional = std::conditional; template using integral_constant = std::integral_constant; template using bool_constant = integral_constant; using true_type = std::true_type; using false_type = std::false_type; #else // MSVC 2010 doesn't support C++11 aliases. template struct is_scalar : public std::is_scalar {}; template struct is_same : public std::is_same {}; template struct is_floating_point : public std::is_floating_point {}; template struct is_unsigned : public std::is_unsigned {}; template struct is_enum : public std::is_enum {}; template struct make_unsigned : public std::make_unsigned {}; template struct conditional : public std::conditional {}; template struct integral_constant : public std::integral_constant {}; template struct bool_constant : public integral_constant {}; typedef bool_constant true_type; typedef bool_constant false_type; #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) #if defined(FLATBUFFERS_TEMPLATES_ALIASES) template using unique_ptr = std::unique_ptr; #else // MSVC 2010 doesn't support C++11 aliases. // We're manually "aliasing" the class here as we want to bring unique_ptr // into the flatbuffers namespace. We have unique_ptr in the flatbuffers // namespace we have a completely independent implementation (see below) // for C++98 STL implementations. template class unique_ptr : public std::unique_ptr { public: unique_ptr() {} explicit unique_ptr(T* p) : std::unique_ptr(p) {} unique_ptr(std::unique_ptr&& u) { *this = std::move(u); } unique_ptr(unique_ptr&& u) { *this = std::move(u); } unique_ptr& operator=(std::unique_ptr&& u) { std::unique_ptr::reset(u.release()); return *this; } unique_ptr& operator=(unique_ptr&& u) { std::unique_ptr::reset(u.release()); return *this; } unique_ptr& operator=(T* p) { return std::unique_ptr::operator=(p); } }; #endif // defined(FLATBUFFERS_TEMPLATES_ALIASES) #if FLATBUFFERS_USE_STD_OPTIONAL template using Optional = std::optional; using nullopt_t = std::nullopt_t; inline constexpr nullopt_t nullopt = std::nullopt; #else // Limited implementation of Optional type for a scalar T. // This implementation limited by trivial types compatible with // std::is_arithmetic or std::is_enum type traits. // A tag to indicate an empty flatbuffers::optional. struct nullopt_t { explicit FLATBUFFERS_CONSTEXPR_CPP11 nullopt_t(int) {} }; #if defined(FLATBUFFERS_CONSTEXPR_DEFINED) namespace internal { template struct nullopt_holder { static constexpr nullopt_t instance_ = nullopt_t(0); }; template constexpr nullopt_t nullopt_holder::instance_; } static constexpr const nullopt_t &nullopt = internal::nullopt_holder::instance_; #else namespace internal { template struct nullopt_holder { static const nullopt_t instance_; }; template const nullopt_t nullopt_holder::instance_ = nullopt_t(0); } static const nullopt_t &nullopt = internal::nullopt_holder::instance_; #endif template class Optional FLATBUFFERS_FINAL_CLASS { // Non-scalar 'T' would extremely complicated Optional. // Use is_scalar checking because flatbuffers flatbuffers::is_arithmetic // isn't implemented. static_assert(flatbuffers::is_scalar::value, "unexpected type T"); public: ~Optional() {} FLATBUFFERS_CONSTEXPR_CPP11 Optional() FLATBUFFERS_NOEXCEPT : value_(), has_value_(false) {} FLATBUFFERS_CONSTEXPR_CPP11 Optional(nullopt_t) FLATBUFFERS_NOEXCEPT : value_(), has_value_(false) {} FLATBUFFERS_CONSTEXPR_CPP11 Optional(T val) FLATBUFFERS_NOEXCEPT : value_(val), has_value_(true) {} FLATBUFFERS_CONSTEXPR_CPP11 Optional(const Optional &other) FLATBUFFERS_NOEXCEPT : value_(other.value_), has_value_(other.has_value_) {} FLATBUFFERS_CONSTEXPR_CPP14 Optional &operator=(const Optional &other) FLATBUFFERS_NOEXCEPT { value_ = other.value_; has_value_ = other.has_value_; return *this; } FLATBUFFERS_CONSTEXPR_CPP14 Optional &operator=(nullopt_t) FLATBUFFERS_NOEXCEPT { value_ = T(); has_value_ = false; return *this; } FLATBUFFERS_CONSTEXPR_CPP14 Optional &operator=(T val) FLATBUFFERS_NOEXCEPT { value_ = val; has_value_ = true; return *this; } void reset() FLATBUFFERS_NOEXCEPT { *this = nullopt; } void swap(Optional &other) FLATBUFFERS_NOEXCEPT { std::swap(value_, other.value_); std::swap(has_value_, other.has_value_); } FLATBUFFERS_CONSTEXPR_CPP11 FLATBUFFERS_EXPLICIT_CPP11 operator bool() const FLATBUFFERS_NOEXCEPT { return has_value_; } FLATBUFFERS_CONSTEXPR_CPP11 bool has_value() const FLATBUFFERS_NOEXCEPT { return has_value_; } FLATBUFFERS_CONSTEXPR_CPP11 const T& operator*() const FLATBUFFERS_NOEXCEPT { return value_; } const T& value() const { FLATBUFFERS_ASSERT(has_value()); return value_; } T value_or(T default_value) const FLATBUFFERS_NOEXCEPT { return has_value() ? value_ : default_value; } private: T value_; bool has_value_; }; template FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const Optional& opt, nullopt_t) FLATBUFFERS_NOEXCEPT { return !opt; } template FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(nullopt_t, const Optional& opt) FLATBUFFERS_NOEXCEPT { return !opt; } template FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const Optional& lhs, const U& rhs) FLATBUFFERS_NOEXCEPT { return static_cast(lhs) && (*lhs == rhs); } template FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const T& lhs, const Optional& rhs) FLATBUFFERS_NOEXCEPT { return static_cast(rhs) && (lhs == *rhs); } template FLATBUFFERS_CONSTEXPR_CPP11 bool operator==(const Optional& lhs, const Optional& rhs) FLATBUFFERS_NOEXCEPT { return static_cast(lhs) != static_cast(rhs) ? false : !static_cast(lhs) ? false : (*lhs == *rhs); } #endif // FLATBUFFERS_USE_STD_OPTIONAL // Very limited and naive partial implementation of C++20 std::span. #if defined(FLATBUFFERS_USE_STD_SPAN) inline constexpr std::size_t dynamic_extent = std::dynamic_extent; template using span = std::span; #else // !defined(FLATBUFFERS_USE_STD_SPAN) FLATBUFFERS_CONSTEXPR std::size_t dynamic_extent = static_cast(-1); // Exclude this code if MSVC2010 or non-STL Android is active. // The non-STL Android doesn't have `std::is_convertible` required for SFINAE. #if !defined(FLATBUFFERS_SPAN_MINIMAL) namespace internal { // This is SFINAE helper class for checking of a common condition: // > This overload only participates in overload resolution // > Check whether a pointer to an array of U can be converted // > to a pointer to an array of E. // This helper is used for checking of 'U -> const U'. template struct is_span_convertable { using type = typename std::conditional::value && (Extent == dynamic_extent || N == Extent), int, void>::type; }; template struct SpanIterator { // TODO: upgrade to std::random_access_iterator_tag. using iterator_category = std::forward_iterator_tag; using difference_type = std::ptrdiff_t; using value_type = typename std::remove_cv::type; using reference = T&; using pointer = T*; // Convince MSVC compiler that this iterator is trusted (it is verified). #ifdef _MSC_VER using _Unchecked_type = pointer; #endif // _MSC_VER SpanIterator(pointer ptr) : ptr_(ptr) {} reference operator*() const { return *ptr_; } pointer operator->() { return ptr_; } SpanIterator& operator++() { ptr_++; return *this; } SpanIterator operator++(int) { auto tmp = *this; ++(*this); return tmp; } friend bool operator== (const SpanIterator& lhs, const SpanIterator& rhs) { return lhs.ptr_ == rhs.ptr_; } friend bool operator!= (const SpanIterator& lhs, const SpanIterator& rhs) { return lhs.ptr_ != rhs.ptr_; } private: pointer ptr_; }; } // namespace internal #endif // !defined(FLATBUFFERS_SPAN_MINIMAL) // T - element type; must be a complete type that is not an abstract // class type. // Extent - the number of elements in the sequence, or dynamic. template class span FLATBUFFERS_FINAL_CLASS { public: typedef T element_type; typedef T& reference; typedef const T& const_reference; typedef T* pointer; typedef const T* const_pointer; typedef std::size_t size_type; static FLATBUFFERS_CONSTEXPR size_type extent = Extent; // Returns the number of elements in the span. FLATBUFFERS_CONSTEXPR_CPP11 size_type size() const FLATBUFFERS_NOEXCEPT { return count_; } // Returns the size of the sequence in bytes. FLATBUFFERS_CONSTEXPR_CPP11 size_type size_bytes() const FLATBUFFERS_NOEXCEPT { return size() * sizeof(element_type); } // Checks if the span is empty. FLATBUFFERS_CONSTEXPR_CPP11 bool empty() const FLATBUFFERS_NOEXCEPT { return size() == 0; } // Returns a pointer to the beginning of the sequence. FLATBUFFERS_CONSTEXPR_CPP11 pointer data() const FLATBUFFERS_NOEXCEPT { return data_; } #if !defined(FLATBUFFERS_SPAN_MINIMAL) using Iterator = internal::SpanIterator; using ConstIterator = internal::SpanIterator; Iterator begin() const { return Iterator(data()); } Iterator end() const { return Iterator(data() + size()); } ConstIterator cbegin() const { return ConstIterator(data()); } ConstIterator cend() const { return ConstIterator(data() + size()); } #endif // Returns a reference to the idx-th element of the sequence. // The behavior is undefined if the idx is greater than or equal to size(). FLATBUFFERS_CONSTEXPR_CPP11 reference operator[](size_type idx) const { return data()[idx]; } FLATBUFFERS_CONSTEXPR_CPP11 span(const span &other) FLATBUFFERS_NOEXCEPT : data_(other.data_), count_(other.count_) {} FLATBUFFERS_CONSTEXPR_CPP14 span &operator=(const span &other) FLATBUFFERS_NOEXCEPT { data_ = other.data_; count_ = other.count_; } // Limited implementation of // `template constexpr std::span(It first, size_type count);`. // // Constructs a span that is a view over the range [first, first + count); // the resulting span has: data() == first and size() == count. // The behavior is undefined if [first, first + count) is not a valid range, // or if (extent != flatbuffers::dynamic_extent && count != extent). FLATBUFFERS_CONSTEXPR_CPP11 explicit span(pointer first, size_type count) FLATBUFFERS_NOEXCEPT : data_ (Extent == dynamic_extent ? first : (Extent == count ? first : nullptr)), count_(Extent == dynamic_extent ? count : (Extent == count ? Extent : 0)) { // Make span empty if the count argument is incompatible with span. } // Exclude this code if MSVC2010 is active. The MSVC2010 isn't C++11 // compliant, it doesn't support default template arguments for functions. #if defined(FLATBUFFERS_SPAN_MINIMAL) FLATBUFFERS_CONSTEXPR_CPP11 span() FLATBUFFERS_NOEXCEPT : data_(nullptr), count_(0) { static_assert(extent == 0 || extent == dynamic_extent, "invalid span"); } #else // Constructs an empty span whose data() == nullptr and size() == 0. // This overload only participates in overload resolution if // extent == 0 || extent == flatbuffers::dynamic_extent. // A dummy template argument N is need dependency for SFINAE. template::type = 0> FLATBUFFERS_CONSTEXPR_CPP11 span() FLATBUFFERS_NOEXCEPT : data_(nullptr), count_(0) { static_assert(extent == 0 || extent == dynamic_extent, "invalid span"); } // Constructs a span that is a view over the array arr; the resulting span // has size() == N and data() == std::data(arr). These overloads only // participate in overload resolution if // extent == std::dynamic_extent || N == extent is true and // std::remove_pointer_t(*)[] // is convertible to element_type (*)[]. template::type = 0> FLATBUFFERS_CONSTEXPR_CPP11 span(element_type (&arr)[N]) FLATBUFFERS_NOEXCEPT : data_(arr), count_(N) {} template::type = 0> FLATBUFFERS_CONSTEXPR_CPP11 span(std::array &arr) FLATBUFFERS_NOEXCEPT : data_(arr.data()), count_(N) {} //template //FLATBUFFERS_CONSTEXPR_CPP11 span(std::array &arr) FLATBUFFERS_NOEXCEPT // : data_(arr.data()), count_(N) {} template::type = 0> FLATBUFFERS_CONSTEXPR_CPP11 span(const std::array &arr) FLATBUFFERS_NOEXCEPT : data_(arr.data()), count_(N) {} // Converting constructor from another span s; // the resulting span has size() == s.size() and data() == s.data(). // This overload only participates in overload resolution // if extent == std::dynamic_extent || N == extent is true and U (*)[] // is convertible to element_type (*)[]. template::type = 0> FLATBUFFERS_CONSTEXPR_CPP11 span(const flatbuffers::span &s) FLATBUFFERS_NOEXCEPT : span(s.data(), s.size()) { } #endif // !defined(FLATBUFFERS_SPAN_MINIMAL) private: // This is a naive implementation with 'count_' member even if (Extent != dynamic_extent). pointer const data_; size_type count_; }; #endif // defined(FLATBUFFERS_USE_STD_SPAN) #if !defined(FLATBUFFERS_SPAN_MINIMAL) template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(U(&arr)[N]) FLATBUFFERS_NOEXCEPT { return span(arr); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(const U(&arr)[N]) FLATBUFFERS_NOEXCEPT { return span(arr); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(std::array &arr) FLATBUFFERS_NOEXCEPT { return span(arr); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(const std::array &arr) FLATBUFFERS_NOEXCEPT { return span(arr); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(U *first, std::size_t count) FLATBUFFERS_NOEXCEPT { return span(first, count); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(const U *first, std::size_t count) FLATBUFFERS_NOEXCEPT { return span(first, count); } #endif // !defined(FLATBUFFERS_SPAN_MINIMAL) } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_STL_EMULATION_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/string.h000066400000000000000000000041131511405061000240330ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_STRING_H_ #define FLATBUFFERS_STRING_H_ #include "flatbuffers/base.h" #include "flatbuffers/vector.h" namespace mapserver { namespace flatbuffers { struct String : public Vector { const char *c_str() const { return reinterpret_cast(Data()); } std::string str() const { return std::string(c_str(), size()); } // clang-format off #ifdef FLATBUFFERS_HAS_STRING_VIEW flatbuffers::string_view string_view() const { return flatbuffers::string_view(c_str(), size()); } #endif // FLATBUFFERS_HAS_STRING_VIEW // clang-format on bool operator<(const String &o) const { return StringLessThan(this->data(), this->size(), o.data(), o.size()); } }; // Convenience function to get std::string from a String returning an empty // string on null pointer. static inline std::string GetString(const String *str) { return str ? str->str() : ""; } // Convenience function to get char* from a String returning an empty string on // null pointer. static inline const char *GetCstring(const String *str) { return str ? str->c_str() : ""; } #ifdef FLATBUFFERS_HAS_STRING_VIEW // Convenience function to get string_view from a String returning an empty // string_view on null pointer. static inline flatbuffers::string_view GetStringView(const String *str) { return str ? str->string_view() : flatbuffers::string_view(); } #endif // FLATBUFFERS_HAS_STRING_VIEW } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_STRING_H_mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/struct.h000066400000000000000000000031301511405061000240470ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_STRUCT_H_ #define FLATBUFFERS_STRUCT_H_ #include "flatbuffers/base.h" namespace mapserver { namespace flatbuffers { // "structs" are flat structures that do not have an offset table, thus // always have all members present and do not support forwards/backwards // compatible extensions. class Struct FLATBUFFERS_FINAL_CLASS { public: template T GetField(uoffset_t o) const { return ReadScalar(&data_[o]); } template T GetStruct(uoffset_t o) const { return reinterpret_cast(&data_[o]); } const uint8_t *GetAddressOf(uoffset_t o) const { return &data_[o]; } uint8_t *GetAddressOf(uoffset_t o) { return &data_[o]; } private: // private constructor & copy constructor: you obtain instances of this // class by pointing to existing data only Struct(); Struct(const Struct &); Struct &operator=(const Struct &); uint8_t data_[1]; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_STRUCT_H_mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/table.h000066400000000000000000000137451511405061000236270ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_TABLE_H_ #define FLATBUFFERS_TABLE_H_ #include "flatbuffers/base.h" #include "flatbuffers/verifier.h" namespace mapserver { namespace flatbuffers { // "tables" use an offset table (possibly shared) that allows fields to be // omitted and added at will, but uses an extra indirection to read. class Table { public: const uint8_t *GetVTable() const { return data_ - ReadScalar(data_); } // This gets the field offset for any of the functions below it, or 0 // if the field was not present. voffset_t GetOptionalFieldOffset(voffset_t field) const { // The vtable offset is always at the start. auto vtable = GetVTable(); // The first element is the size of the vtable (fields + type id + itself). auto vtsize = ReadScalar(vtable); // If the field we're accessing is outside the vtable, we're reading older // data, so it's the same as if the offset was 0 (not present). return field < vtsize ? ReadScalar(vtable + field) : 0; } template T GetField(voffset_t field, T defaultval) const { auto field_offset = GetOptionalFieldOffset(field); return field_offset ? ReadScalar(data_ + field_offset) : defaultval; } template P GetPointer(voffset_t field) { auto field_offset = GetOptionalFieldOffset(field); auto p = data_ + field_offset; return field_offset ? reinterpret_cast

(p + ReadScalar(p)) : nullptr; } template P GetPointer(voffset_t field) const { return const_cast

(this)->GetPointer

(field); } template P GetStruct(voffset_t field) const { auto field_offset = GetOptionalFieldOffset(field); auto p = const_cast(data_ + field_offset); return field_offset ? reinterpret_cast

(p) : nullptr; } template flatbuffers::Optional GetOptional(voffset_t field) const { auto field_offset = GetOptionalFieldOffset(field); auto p = data_ + field_offset; return field_offset ? Optional(static_cast(ReadScalar(p))) : Optional(); } template bool SetField(voffset_t field, T val, T def) { auto field_offset = GetOptionalFieldOffset(field); if (!field_offset) return IsTheSameAs(val, def); WriteScalar(data_ + field_offset, val); return true; } template bool SetField(voffset_t field, T val) { auto field_offset = GetOptionalFieldOffset(field); if (!field_offset) return false; WriteScalar(data_ + field_offset, val); return true; } bool SetPointer(voffset_t field, const uint8_t *val) { auto field_offset = GetOptionalFieldOffset(field); if (!field_offset) return false; WriteScalar(data_ + field_offset, static_cast(val - (data_ + field_offset))); return true; } uint8_t *GetAddressOf(voffset_t field) { auto field_offset = GetOptionalFieldOffset(field); return field_offset ? data_ + field_offset : nullptr; } const uint8_t *GetAddressOf(voffset_t field) const { return const_cast

(this)->GetAddressOf(field); } bool CheckField(voffset_t field) const { return GetOptionalFieldOffset(field) != 0; } // Verify the vtable of this table. // Call this once per table, followed by VerifyField once per field. bool VerifyTableStart(Verifier &verifier) const { return verifier.VerifyTableStart(data_); } // Verify a particular field. template bool VerifyField(const Verifier &verifier, voffset_t field, size_t align) const { // Calling GetOptionalFieldOffset should be safe now thanks to // VerifyTable(). auto field_offset = GetOptionalFieldOffset(field); // Check the actual field. return !field_offset || verifier.VerifyField(data_, field_offset, align); } // VerifyField for required fields. template bool VerifyFieldRequired(const Verifier &verifier, voffset_t field, size_t align) const { auto field_offset = GetOptionalFieldOffset(field); return verifier.Check(field_offset != 0) && verifier.VerifyField(data_, field_offset, align); } // Versions for offsets. bool VerifyOffset(const Verifier &verifier, voffset_t field) const { auto field_offset = GetOptionalFieldOffset(field); return !field_offset || verifier.VerifyOffset(data_, field_offset); } bool VerifyOffsetRequired(const Verifier &verifier, voffset_t field) const { auto field_offset = GetOptionalFieldOffset(field); return verifier.Check(field_offset != 0) && verifier.VerifyOffset(data_, field_offset); } private: // private constructor & copy constructor: you obtain instances of this // class by pointing to existing data only Table(); Table(const Table &other); Table &operator=(const Table &); uint8_t data_[1]; }; // This specialization allows avoiding warnings like: // MSVC C4800: type: forcing value to bool 'true' or 'false'. template<> inline flatbuffers::Optional Table::GetOptional( voffset_t field) const { auto field_offset = GetOptionalFieldOffset(field); auto p = data_ + field_offset; return field_offset ? Optional(ReadScalar(p) != 0) : Optional(); } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_TABLE_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/util.h000066400000000000000000000625361511405061000235170ustar00rootroot00000000000000/* * Copyright 2014 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. */ #ifndef FLATBUFFERS_UTIL_H_ #define FLATBUFFERS_UTIL_H_ #include #include #include "flatbuffers/base.h" #include "flatbuffers/stl_emulation.h" #ifndef FLATBUFFERS_PREFER_PRINTF # include # include #else // FLATBUFFERS_PREFER_PRINTF # include # include #endif // FLATBUFFERS_PREFER_PRINTF #include namespace mapserver { namespace flatbuffers { // @locale-independent functions for ASCII characters set. // Fast checking that character lies in closed range: [a <= x <= b] // using one compare (conditional branch) operator. inline bool check_ascii_range(char x, char a, char b) { FLATBUFFERS_ASSERT(a <= b); // (Hacker's Delight): `a <= x <= b` <=> `(x-a) <={u} (b-a)`. // The x, a, b will be promoted to int and subtracted without overflow. return static_cast(x - a) <= static_cast(b - a); } // Case-insensitive isalpha inline bool is_alpha(char c) { // ASCII only: alpha to upper case => reset bit 0x20 (~0x20 = 0xDF). return check_ascii_range(c & 0xDF, 'a' & 0xDF, 'z' & 0xDF); } // Check for uppercase alpha inline bool is_alpha_upper(char c) { return check_ascii_range(c, 'A', 'Z'); } // Check (case-insensitive) that `c` is equal to alpha. inline bool is_alpha_char(char c, char alpha) { FLATBUFFERS_ASSERT(is_alpha(alpha)); // ASCII only: alpha to upper case => reset bit 0x20 (~0x20 = 0xDF). return ((c & 0xDF) == (alpha & 0xDF)); } // https://en.cppreference.com/w/cpp/string/byte/isxdigit // isdigit and isxdigit are the only standard narrow character classification // functions that are not affected by the currently installed C locale. although // some implementations (e.g. Microsoft in 1252 codepage) may classify // additional single-byte characters as digits. inline bool is_digit(char c) { return check_ascii_range(c, '0', '9'); } inline bool is_xdigit(char c) { // Replace by look-up table. return is_digit(c) || check_ascii_range(c & 0xDF, 'a' & 0xDF, 'f' & 0xDF); } // Case-insensitive isalnum inline bool is_alnum(char c) { return is_alpha(c) || is_digit(c); } inline char CharToUpper(char c) { return static_cast(::toupper(static_cast(c))); } inline char CharToLower(char c) { return static_cast(::tolower(static_cast(c))); } // @end-locale-independent functions for ASCII character set #ifdef FLATBUFFERS_PREFER_PRINTF template size_t IntToDigitCount(T t) { size_t digit_count = 0; // Count the sign for negative numbers if (t < 0) digit_count++; // Count a single 0 left of the dot for fractional numbers if (-1 < t && t < 1) digit_count++; // Count digits until fractional part T eps = std::numeric_limits::epsilon(); while (t <= (-1 + eps) || (1 - eps) <= t) { t /= 10; digit_count++; } return digit_count; } template size_t NumToStringWidth(T t, int precision = 0) { size_t string_width = IntToDigitCount(t); // Count the dot for floating point numbers if (precision) string_width += (precision + 1); return string_width; } template std::string NumToStringImplWrapper(T t, const char *fmt, int precision = 0) { size_t string_width = NumToStringWidth(t, precision); std::string s(string_width, 0x00); // Allow snprintf to use std::string trailing null to detect buffer overflow snprintf(const_cast(s.data()), (s.size() + 1), fmt, string_width, t); return s; } #endif // FLATBUFFERS_PREFER_PRINTF // Convert an integer or floating point value to a string. // In contrast to std::stringstream, "char" values are // converted to a string of digits, and we don't use scientific notation. template std::string NumToString(T t) { // clang-format off #ifndef FLATBUFFERS_PREFER_PRINTF std::stringstream ss; ss << t; return ss.str(); #else // FLATBUFFERS_PREFER_PRINTF auto v = static_cast(t); return NumToStringImplWrapper(v, "%.*lld"); #endif // FLATBUFFERS_PREFER_PRINTF // clang-format on } // Avoid char types used as character data. template<> inline std::string NumToString(signed char t) { return NumToString(static_cast(t)); } template<> inline std::string NumToString(unsigned char t) { return NumToString(static_cast(t)); } template<> inline std::string NumToString(char t) { return NumToString(static_cast(t)); } // Special versions for floats/doubles. template std::string FloatToString(T t, int precision) { // clang-format off #ifndef FLATBUFFERS_PREFER_PRINTF // to_string() prints different numbers of digits for floats depending on // platform and isn't available on Android, so we use stringstream std::stringstream ss; // Use std::fixed to suppress scientific notation. ss << std::fixed; // Default precision is 6, we want that to be higher for doubles. ss << std::setprecision(precision); ss << t; auto s = ss.str(); #else // FLATBUFFERS_PREFER_PRINTF auto v = static_cast(t); auto s = NumToStringImplWrapper(v, "%0.*f", precision); #endif // FLATBUFFERS_PREFER_PRINTF // clang-format on // Sadly, std::fixed turns "1" into "1.00000", so here we undo that. auto p = s.find_last_not_of('0'); if (p != std::string::npos) { // Strip trailing zeroes. If it is a whole number, keep one zero. s.resize(p + (s[p] == '.' ? 2 : 1)); } return s; } template<> inline std::string NumToString(double t) { return FloatToString(t, 12); } template<> inline std::string NumToString(float t) { return FloatToString(t, 6); } // Convert an integer value to a hexadecimal string. // The returned string length is always xdigits long, prefixed by 0 digits. // For example, IntToStringHex(0x23, 8) returns the string "00000023". inline std::string IntToStringHex(int i, int xdigits) { FLATBUFFERS_ASSERT(i >= 0); // clang-format off #ifndef FLATBUFFERS_PREFER_PRINTF std::stringstream ss; ss << std::setw(xdigits) << std::setfill('0') << std::hex << std::uppercase << i; return ss.str(); #else // FLATBUFFERS_PREFER_PRINTF return NumToStringImplWrapper(i, "%.*X", xdigits); #endif // FLATBUFFERS_PREFER_PRINTF // clang-format on } // clang-format off // Use locale independent functions {strtod_l, strtof_l, strtoll_l, strtoull_l}. #if defined(FLATBUFFERS_LOCALE_INDEPENDENT) && (FLATBUFFERS_LOCALE_INDEPENDENT > 0) class ClassicLocale { #ifdef _MSC_VER typedef _locale_t locale_type; #else typedef locale_t locale_type; // POSIX.1-2008 locale_t type #endif ClassicLocale(); ~ClassicLocale(); locale_type locale_; static ClassicLocale instance_; public: static locale_type Get() { return instance_.locale_; } }; #ifdef _MSC_VER #define __strtoull_impl(s, pe, b) _strtoui64_l(s, pe, b, ClassicLocale::Get()) #define __strtoll_impl(s, pe, b) _strtoi64_l(s, pe, b, ClassicLocale::Get()) #define __strtod_impl(s, pe) _strtod_l(s, pe, ClassicLocale::Get()) #define __strtof_impl(s, pe) _strtof_l(s, pe, ClassicLocale::Get()) #else #define __strtoull_impl(s, pe, b) strtoull_l(s, pe, b, ClassicLocale::Get()) #define __strtoll_impl(s, pe, b) strtoll_l(s, pe, b, ClassicLocale::Get()) #define __strtod_impl(s, pe) strtod_l(s, pe, ClassicLocale::Get()) #define __strtof_impl(s, pe) strtof_l(s, pe, ClassicLocale::Get()) #endif #else #define __strtod_impl(s, pe) strtod(s, pe) #define __strtof_impl(s, pe) static_cast(strtod(s, pe)) #ifdef _MSC_VER #define __strtoull_impl(s, pe, b) _strtoui64(s, pe, b) #define __strtoll_impl(s, pe, b) _strtoi64(s, pe, b) #else #define __strtoull_impl(s, pe, b) strtoull(s, pe, b) #define __strtoll_impl(s, pe, b) strtoll(s, pe, b) #endif #endif inline void strtoval_impl(int64_t *val, const char *str, char **endptr, int base) { *val = __strtoll_impl(str, endptr, base); } inline void strtoval_impl(uint64_t *val, const char *str, char **endptr, int base) { *val = __strtoull_impl(str, endptr, base); } inline void strtoval_impl(double *val, const char *str, char **endptr) { *val = __strtod_impl(str, endptr); } // UBSAN: double to float is safe if numeric_limits::is_iec559 is true. __supress_ubsan__("float-cast-overflow") inline void strtoval_impl(float *val, const char *str, char **endptr) { *val = __strtof_impl(str, endptr); } #undef __strtoull_impl #undef __strtoll_impl #undef __strtod_impl #undef __strtof_impl // clang-format on // Adaptor for strtoull()/strtoll(). // Flatbuffers accepts numbers with any count of leading zeros (-009 is -9), // while strtoll with base=0 interprets first leading zero as octal prefix. // In future, it is possible to add prefixed 0b0101. // 1) Checks errno code for overflow condition (out of range). // 2) If base <= 0, function try to detect base of number by prefix. // // Return value (like strtoull and strtoll, but reject partial result): // - If successful, an integer value corresponding to the str is returned. // - If full string conversion can't be performed, 0 is returned. // - If the converted value falls out of range of corresponding return type, a // range error occurs. In this case value MAX(T)/MIN(T) is returned. template inline bool StringToIntegerImpl(T *val, const char *const str, const int base = 0, const bool check_errno = true) { // T is int64_t or uint64_T FLATBUFFERS_ASSERT(str); if (base <= 0) { auto s = str; while (*s && !is_digit(*s)) s++; if (s[0] == '0' && is_alpha_char(s[1], 'X')) return StringToIntegerImpl(val, str, 16, check_errno); // if a prefix not match, try base=10 return StringToIntegerImpl(val, str, 10, check_errno); } else { if (check_errno) errno = 0; // clear thread-local errno auto endptr = str; strtoval_impl(val, str, const_cast(&endptr), base); if ((*endptr != '\0') || (endptr == str)) { *val = 0; // erase partial result return false; // invalid string } // errno is out-of-range, return MAX/MIN if (check_errno && errno) return false; return true; } } template inline bool StringToFloatImpl(T *val, const char *const str) { // Type T must be either float or double. FLATBUFFERS_ASSERT(str && val); auto end = str; strtoval_impl(val, str, const_cast(&end)); auto done = (end != str) && (*end == '\0'); if (!done) *val = 0; // erase partial result return done; } // Convert a string to an instance of T. // Return value (matched with StringToInteger64Impl and strtod): // - If successful, a numeric value corresponding to the str is returned. // - If full string conversion can't be performed, 0 is returned. // - If the converted value falls out of range of corresponding return type, a // range error occurs. In this case value MAX(T)/MIN(T) is returned. template inline bool StringToNumber(const char *s, T *val) { // Assert on `unsigned long` and `signed long` on LP64. // If it is necessary, it could be solved with flatbuffers::enable_if. static_assert(sizeof(T) < sizeof(int64_t), "unexpected type T"); FLATBUFFERS_ASSERT(s && val); int64_t i64; // The errno check isn't needed, will return MAX/MIN on overflow. if (StringToIntegerImpl(&i64, s, 0, false)) { const int64_t max = (flatbuffers::numeric_limits::max)(); const int64_t min = flatbuffers::numeric_limits::lowest(); if (i64 > max) { *val = static_cast(max); return false; } if (i64 < min) { // For unsigned types return max to distinguish from // "no conversion can be performed" when 0 is returned. *val = static_cast(flatbuffers::is_unsigned::value ? max : min); return false; } *val = static_cast(i64); return true; } *val = 0; return false; } template<> inline bool StringToNumber(const char *str, int64_t *val) { return StringToIntegerImpl(val, str); } template<> inline bool StringToNumber(const char *str, uint64_t *val) { if (!StringToIntegerImpl(val, str)) return false; // The strtoull accepts negative numbers: // If the minus sign was part of the input sequence, the numeric value // calculated from the sequence of digits is negated as if by unary minus // in the result type, which applies unsigned integer wraparound rules. // Fix this behavior (except -0). if (*val) { auto s = str; while (*s && !is_digit(*s)) s++; s = (s > str) ? (s - 1) : s; // step back to one symbol if (*s == '-') { // For unsigned types return the max to distinguish from // "no conversion can be performed". *val = (flatbuffers::numeric_limits::max)(); return false; } } return true; } template<> inline bool StringToNumber(const char *s, float *val) { return StringToFloatImpl(val, s); } template<> inline bool StringToNumber(const char *s, double *val) { return StringToFloatImpl(val, s); } inline int64_t StringToInt(const char *s, int base = 10) { int64_t val; return StringToIntegerImpl(&val, s, base) ? val : 0; } inline uint64_t StringToUInt(const char *s, int base = 10) { uint64_t val; return StringToIntegerImpl(&val, s, base) ? val : 0; } typedef bool (*LoadFileFunction)(const char *filename, bool binary, std::string *dest); typedef bool (*FileExistsFunction)(const char *filename); LoadFileFunction SetLoadFileFunction(LoadFileFunction load_file_function); FileExistsFunction SetFileExistsFunction( FileExistsFunction file_exists_function); // Check if file "name" exists. bool FileExists(const char *name); // Check if "name" exists and it is also a directory. bool DirExists(const char *name); // Load file "name" into "buf" returning true if successful // false otherwise. If "binary" is false data is read // using ifstream's text mode, otherwise data is read with // no transcoding. bool LoadFile(const char *name, bool binary, std::string *buf); // Save data "buf" of length "len" bytes into a file // "name" returning true if successful, false otherwise. // If "binary" is false data is written using ifstream's // text mode, otherwise data is written with no // transcoding. bool SaveFile(const char *name, const char *buf, size_t len, bool binary); // Save data "buf" into file "name" returning true if // successful, false otherwise. If "binary" is false // data is written using ifstream's text mode, otherwise // data is written with no transcoding. inline bool SaveFile(const char *name, const std::string &buf, bool binary) { return SaveFile(name, buf.c_str(), buf.size(), binary); } // Functionality for minimalistic portable path handling. // The functions below behave correctly regardless of whether posix ('/') or // Windows ('/' or '\\') separators are used. // Any new separators inserted are always posix. FLATBUFFERS_CONSTEXPR char kPathSeparator = '/'; // Returns the path with the extension, if any, removed. std::string StripExtension(const std::string &filepath); // Returns the extension, if any. std::string GetExtension(const std::string &filepath); // Return the last component of the path, after the last separator. std::string StripPath(const std::string &filepath); // Strip the last component of the path + separator. std::string StripFileName(const std::string &filepath); // Concatenates a path with a filename, regardless of whether the path // ends in a separator or not. std::string ConCatPathFileName(const std::string &path, const std::string &filename); // Replaces any '\\' separators with '/' std::string PosixPath(const char *path); std::string PosixPath(const std::string &path); // This function ensure a directory exists, by recursively // creating dirs for any parts of the path that don't exist yet. void EnsureDirExists(const std::string &filepath); // Obtains the absolute path from any other path. // Returns the input path if the absolute path couldn't be resolved. std::string AbsolutePath(const std::string &filepath); // Returns files relative to the --project_root path, prefixed with `//`. std::string RelativeToRootPath(const std::string &project, const std::string &filepath); // To and from UTF-8 unicode conversion functions // Convert a unicode code point into a UTF-8 representation by appending it // to a string. Returns the number of bytes generated. inline int ToUTF8(uint32_t ucc, std::string *out) { FLATBUFFERS_ASSERT(!(ucc & 0x80000000)); // Top bit can't be set. // 6 possible encodings: http://en.wikipedia.org/wiki/UTF-8 for (int i = 0; i < 6; i++) { // Max bits this encoding can represent. uint32_t max_bits = 6 + i * 5 + static_cast(!i); if (ucc < (1u << max_bits)) { // does it fit? // Remaining bits not encoded in the first byte, store 6 bits each uint32_t remain_bits = i * 6; // Store first byte: (*out) += static_cast((0xFE << (max_bits - remain_bits)) | (ucc >> remain_bits)); // Store remaining bytes: for (int j = i - 1; j >= 0; j--) { (*out) += static_cast(((ucc >> (j * 6)) & 0x3F) | 0x80); } return i + 1; // Return the number of bytes added. } } FLATBUFFERS_ASSERT(0); // Impossible to arrive here. return -1; } // Converts whatever prefix of the incoming string corresponds to a valid // UTF-8 sequence into a unicode code. The incoming pointer will have been // advanced past all bytes parsed. // returns -1 upon corrupt UTF-8 encoding (ignore the incoming pointer in // this case). inline int FromUTF8(const char **in) { int len = 0; // Count leading 1 bits. for (int mask = 0x80; mask >= 0x04; mask >>= 1) { if (**in & mask) { len++; } else { break; } } if ((static_cast(**in) << len) & 0x80) return -1; // Bit after leading 1's must be 0. if (!len) return *(*in)++; // UTF-8 encoded values with a length are between 2 and 4 bytes. if (len < 2 || len > 4) { return -1; } // Grab initial bits of the code. int ucc = *(*in)++ & ((1 << (7 - len)) - 1); for (int i = 0; i < len - 1; i++) { if ((**in & 0xC0) != 0x80) return -1; // Upper bits must 1 0. ucc <<= 6; ucc |= *(*in)++ & 0x3F; // Grab 6 more bits of the code. } // UTF-8 cannot encode values between 0xD800 and 0xDFFF (reserved for // UTF-16 surrogate pairs). if (ucc >= 0xD800 && ucc <= 0xDFFF) { return -1; } // UTF-8 must represent code points in their shortest possible encoding. switch (len) { case 2: // Two bytes of UTF-8 can represent code points from U+0080 to U+07FF. if (ucc < 0x0080 || ucc > 0x07FF) { return -1; } break; case 3: // Three bytes of UTF-8 can represent code points from U+0800 to U+FFFF. if (ucc < 0x0800 || ucc > 0xFFFF) { return -1; } break; case 4: // Four bytes of UTF-8 can represent code points from U+10000 to U+10FFFF. if (ucc < 0x10000 || ucc > 0x10FFFF) { return -1; } break; } return ucc; } #ifndef FLATBUFFERS_PREFER_PRINTF // Wraps a string to a maximum length, inserting new lines where necessary. Any // existing whitespace will be collapsed down to a single space. A prefix or // suffix can be provided, which will be inserted before or after a wrapped // line, respectively. inline std::string WordWrap(const std::string in, size_t max_length, const std::string wrapped_line_prefix, const std::string wrapped_line_suffix) { std::istringstream in_stream(in); std::string wrapped, line, word; in_stream >> word; line = word; while (in_stream >> word) { if ((line.length() + 1 + word.length() + wrapped_line_suffix.length()) < max_length) { line += " " + word; } else { wrapped += line + wrapped_line_suffix + "\n"; line = wrapped_line_prefix + word; } } wrapped += line; return wrapped; } #endif // !FLATBUFFERS_PREFER_PRINTF inline bool EscapeString(const char *s, size_t length, std::string *_text, bool allow_non_utf8, bool natural_utf8) { std::string &text = *_text; text += "\""; for (uoffset_t i = 0; i < length; i++) { char c = s[i]; switch (c) { case '\n': text += "\\n"; break; case '\t': text += "\\t"; break; case '\r': text += "\\r"; break; case '\b': text += "\\b"; break; case '\f': text += "\\f"; break; case '\"': text += "\\\""; break; case '\\': text += "\\\\"; break; default: if (c >= ' ' && c <= '~') { text += c; } else { // Not printable ASCII data. Let's see if it's valid UTF-8 first: const char *utf8 = s + i; int ucc = FromUTF8(&utf8); if (ucc < 0) { if (allow_non_utf8) { text += "\\x"; text += IntToStringHex(static_cast(c), 2); } else { // There are two cases here: // // 1) We reached here by parsing an IDL file. In that case, // we previously checked for non-UTF-8, so we shouldn't reach // here. // // 2) We reached here by someone calling GenerateText() // on a previously-serialized flatbuffer. The data might have // non-UTF-8 Strings, or might be corrupt. // // In both cases, we have to give up and inform the caller // they have no JSON. return false; } } else { if (natural_utf8) { // utf8 points to past all utf-8 bytes parsed text.append(s + i, static_cast(utf8 - s - i)); } else if (ucc <= 0xFFFF) { // Parses as Unicode within JSON's \uXXXX range, so use that. text += "\\u"; text += IntToStringHex(ucc, 4); } else if (ucc <= 0x10FFFF) { // Encode Unicode SMP values to a surrogate pair using two \u // escapes. uint32_t base = ucc - 0x10000; auto high_surrogate = (base >> 10) + 0xD800; auto low_surrogate = (base & 0x03FF) + 0xDC00; text += "\\u"; text += IntToStringHex(high_surrogate, 4); text += "\\u"; text += IntToStringHex(low_surrogate, 4); } // Skip past characters recognized. i = static_cast(utf8 - s - 1); } } break; } } text += "\""; return true; } inline std::string BufferToHexText(const void *buffer, size_t buffer_size, size_t max_length, const std::string &wrapped_line_prefix, const std::string &wrapped_line_suffix) { std::string text = wrapped_line_prefix; size_t start_offset = 0; const char *s = reinterpret_cast(buffer); for (size_t i = 0; s && i < buffer_size; i++) { // Last iteration or do we have more? bool have_more = i + 1 < buffer_size; text += "0x"; text += IntToStringHex(static_cast(s[i]), 2); if (have_more) { text += ','; } // If we have more to process and we reached max_length if (have_more && text.size() + wrapped_line_suffix.size() >= start_offset + max_length) { text += wrapped_line_suffix; text += '\n'; start_offset = text.size(); text += wrapped_line_prefix; } } text += wrapped_line_suffix; return text; } // Remove paired quotes in a string: "text"|'text' -> text. std::string RemoveStringQuotes(const std::string &s); // Change th global C-locale to locale with name . // Returns an actual locale name in <_value>, useful if locale_name is "" or // null. bool SetGlobalTestLocale(const char *locale_name, std::string *_value = nullptr); // Read (or test) a value of environment variable. bool ReadEnvironmentVariable(const char *var_name, std::string *_value = nullptr); // MSVC specific: Send all assert reports to STDOUT to prevent CI hangs. void SetupDefaultCRTReportMode(); enum class Case { kUnknown = 0, // TheQuickBrownFox kUpperCamel = 1, // theQuickBrownFox kLowerCamel = 2, // the_quick_brown_fox kSnake = 3, // THE_QUICK_BROWN_FOX kScreamingSnake = 4, // THEQUICKBROWNFOX kAllUpper = 5, // thequickbrownfox kAllLower = 6, // the-quick-brown-fox kDasher = 7, // THEQuiCKBr_ownFox (or whatever you want, we won't change it) kKeep = 8, // the_quick_brown_fox123 (as opposed to the_quick_brown_fox_123) kSnake2 = 9, }; // Convert the `input` string of case `input_case` to the specified `output_case`. std::string ConvertCase(const std::string &input, Case output_case, Case input_case = Case::kSnake); } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_UTIL_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/vector.h000066400000000000000000000277351511405061000240460ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_VECTOR_H_ #define FLATBUFFERS_VECTOR_H_ #include "flatbuffers/base.h" #include "flatbuffers/buffer.h" #include "flatbuffers/stl_emulation.h" namespace mapserver { namespace flatbuffers { struct String; // An STL compatible iterator implementation for Vector below, effectively // calling Get() for every element. template struct VectorIterator { typedef std::random_access_iterator_tag iterator_category; typedef IT value_type; typedef ptrdiff_t difference_type; typedef IT *pointer; typedef IT &reference; VectorIterator(const uint8_t *data, uoffset_t i) : data_(data + IndirectHelper::element_stride * i) {} VectorIterator(const VectorIterator &other) : data_(other.data_) {} VectorIterator() : data_(nullptr) {} VectorIterator &operator=(const VectorIterator &other) { data_ = other.data_; return *this; } VectorIterator &operator=(VectorIterator &&other) { data_ = other.data_; return *this; } bool operator==(const VectorIterator &other) const { return data_ == other.data_; } bool operator<(const VectorIterator &other) const { return data_ < other.data_; } bool operator!=(const VectorIterator &other) const { return data_ != other.data_; } difference_type operator-(const VectorIterator &other) const { return (data_ - other.data_) / IndirectHelper::element_stride; } // Note: return type is incompatible with the standard // `reference operator*()`. IT operator*() const { return IndirectHelper::Read(data_, 0); } // Note: return type is incompatible with the standard // `pointer operator->()`. IT operator->() const { return IndirectHelper::Read(data_, 0); } VectorIterator &operator++() { data_ += IndirectHelper::element_stride; return *this; } VectorIterator operator++(int) { VectorIterator temp(data_, 0); data_ += IndirectHelper::element_stride; return temp; } VectorIterator operator+(const uoffset_t &offset) const { return VectorIterator(data_ + offset * IndirectHelper::element_stride, 0); } VectorIterator &operator+=(const uoffset_t &offset) { data_ += offset * IndirectHelper::element_stride; return *this; } VectorIterator &operator--() { data_ -= IndirectHelper::element_stride; return *this; } VectorIterator operator--(int) { VectorIterator temp(data_, 0); data_ -= IndirectHelper::element_stride; return temp; } VectorIterator operator-(const uoffset_t &offset) const { return VectorIterator(data_ - offset * IndirectHelper::element_stride, 0); } VectorIterator &operator-=(const uoffset_t &offset) { data_ -= offset * IndirectHelper::element_stride; return *this; } private: const uint8_t *data_; }; template struct VectorReverseIterator : public std::reverse_iterator { explicit VectorReverseIterator(Iterator iter) : std::reverse_iterator(iter) {} // Note: return type is incompatible with the standard // `reference operator*()`. typename Iterator::value_type operator*() const { auto tmp = std::reverse_iterator::current; return *--tmp; } // Note: return type is incompatible with the standard // `pointer operator->()`. typename Iterator::value_type operator->() const { auto tmp = std::reverse_iterator::current; return *--tmp; } }; // This is used as a helper type for accessing vectors. // Vector::data() assumes the vector elements start after the length field. template class Vector { public: typedef VectorIterator::mutable_return_type> iterator; typedef VectorIterator::return_type> const_iterator; typedef VectorReverseIterator reverse_iterator; typedef VectorReverseIterator const_reverse_iterator; typedef typename flatbuffers::bool_constant::value> scalar_tag; static FLATBUFFERS_CONSTEXPR bool is_span_observable = scalar_tag::value && (FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1); uoffset_t size() const { return EndianScalar(length_); } // Deprecated: use size(). Here for backwards compatibility. FLATBUFFERS_ATTRIBUTE([[deprecated("use size() instead")]]) uoffset_t Length() const { return size(); } typedef typename IndirectHelper::return_type return_type; typedef typename IndirectHelper::mutable_return_type mutable_return_type; typedef return_type value_type; return_type Get(uoffset_t i) const { FLATBUFFERS_ASSERT(i < size()); return IndirectHelper::Read(Data(), i); } return_type operator[](uoffset_t i) const { return Get(i); } // If this is a Vector of enums, T will be its storage type, not the enum // type. This function makes it convenient to retrieve value with enum // type E. template E GetEnum(uoffset_t i) const { return static_cast(Get(i)); } // If this a vector of unions, this does the cast for you. There's no check // to make sure this is the right type! template const U *GetAs(uoffset_t i) const { return reinterpret_cast(Get(i)); } // If this a vector of unions, this does the cast for you. There's no check // to make sure this is actually a string! const String *GetAsString(uoffset_t i) const { return reinterpret_cast(Get(i)); } const void *GetStructFromOffset(size_t o) const { return reinterpret_cast(Data() + o); } iterator begin() { return iterator(Data(), 0); } const_iterator begin() const { return const_iterator(Data(), 0); } iterator end() { return iterator(Data(), size()); } const_iterator end() const { return const_iterator(Data(), size()); } reverse_iterator rbegin() { return reverse_iterator(end()); } const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); } const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } const_iterator cbegin() const { return begin(); } const_iterator cend() const { return end(); } const_reverse_iterator crbegin() const { return rbegin(); } const_reverse_iterator crend() const { return rend(); } // Change elements if you have a non-const pointer to this object. // Scalars only. See reflection.h, and the documentation. void Mutate(uoffset_t i, const T &val) { FLATBUFFERS_ASSERT(i < size()); WriteScalar(data() + i, val); } // Change an element of a vector of tables (or strings). // "val" points to the new table/string, as you can obtain from // e.g. reflection::AddFlatBuffer(). void MutateOffset(uoffset_t i, const uint8_t *val) { FLATBUFFERS_ASSERT(i < size()); static_assert(sizeof(T) == sizeof(uoffset_t), "Unrelated types"); WriteScalar(data() + i, static_cast(val - (Data() + i * sizeof(uoffset_t)))); } // Get a mutable pointer to tables/strings inside this vector. mutable_return_type GetMutableObject(uoffset_t i) const { FLATBUFFERS_ASSERT(i < size()); return const_cast(IndirectHelper::Read(Data(), i)); } // The raw data in little endian format. Use with care. const uint8_t *Data() const { return reinterpret_cast(&length_ + 1); } uint8_t *Data() { return reinterpret_cast(&length_ + 1); } // Similarly, but typed, much like std::vector::data const T *data() const { return reinterpret_cast(Data()); } T *data() { return reinterpret_cast(Data()); } template return_type LookupByKey(K key) const { void *search_result = std::bsearch( &key, Data(), size(), IndirectHelper::element_stride, KeyCompare); if (!search_result) { return nullptr; // Key not found. } const uint8_t *element = reinterpret_cast(search_result); return IndirectHelper::Read(element, 0); } template mutable_return_type MutableLookupByKey(K key) { return const_cast(LookupByKey(key)); } protected: // This class is only used to access pre-existing data. Don't ever // try to construct these manually. Vector(); uoffset_t length_; private: // This class is a pointer. Copying will therefore create an invalid object. // Private and unimplemented copy constructor. Vector(const Vector &); Vector &operator=(const Vector &); template static int KeyCompare(const void *ap, const void *bp) { const K *key = reinterpret_cast(ap); const uint8_t *data = reinterpret_cast(bp); auto table = IndirectHelper::Read(data, 0); // std::bsearch compares with the operands transposed, so we negate the // result here. return -table->KeyCompareWithValue(*key); } }; template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span(Vector &vec) FLATBUFFERS_NOEXCEPT { static_assert(Vector::is_span_observable, "wrong type U, only LE-scalar, or byte types are allowed"); return span(vec.data(), vec.size()); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_span( const Vector &vec) FLATBUFFERS_NOEXCEPT { static_assert(Vector::is_span_observable, "wrong type U, only LE-scalar, or byte types are allowed"); return span(vec.data(), vec.size()); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_bytes_span( Vector &vec) FLATBUFFERS_NOEXCEPT { static_assert(Vector::scalar_tag::value, "wrong type U, only LE-scalar, or byte types are allowed"); return span(vec.Data(), vec.size() * sizeof(U)); } template FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span make_bytes_span( const Vector &vec) FLATBUFFERS_NOEXCEPT { static_assert(Vector::scalar_tag::value, "wrong type U, only LE-scalar, or byte types are allowed"); return span(vec.Data(), vec.size() * sizeof(U)); } // Represent a vector much like the template above, but in this case we // don't know what the element types are (used with reflection.h). class VectorOfAny { public: uoffset_t size() const { return EndianScalar(length_); } const uint8_t *Data() const { return reinterpret_cast(&length_ + 1); } uint8_t *Data() { return reinterpret_cast(&length_ + 1); } protected: VectorOfAny(); uoffset_t length_; private: VectorOfAny(const VectorOfAny &); VectorOfAny &operator=(const VectorOfAny &); }; template Vector> *VectorCast(Vector> *ptr) { static_assert(std::is_base_of::value, "Unrelated types"); return reinterpret_cast> *>(ptr); } template const Vector> *VectorCast(const Vector> *ptr) { static_assert(std::is_base_of::value, "Unrelated types"); return reinterpret_cast> *>(ptr); } // Convenient helper function to get the length of any vector, regardless // of whether it is null or not (the field is not set). template static inline size_t VectorLength(const Vector *v) { return v ? v->size() : 0; } } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_VERIFIER_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/vector_downward.h000066400000000000000000000176251511405061000257500ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_VECTOR_DOWNWARD_H_ #define FLATBUFFERS_VECTOR_DOWNWARD_H_ #include "flatbuffers/base.h" #include "flatbuffers/default_allocator.h" #include "flatbuffers/detached_buffer.h" namespace mapserver { namespace flatbuffers { // This is a minimal replication of std::vector functionality, // except growing from higher to lower addresses. i.e push_back() inserts data // in the lowest address in the vector. // Since this vector leaves the lower part unused, we support a "scratch-pad" // that can be stored there for temporary data, to share the allocated space. // Essentially, this supports 2 std::vectors in a single buffer. class vector_downward { public: explicit vector_downward(size_t initial_size, Allocator *allocator, bool own_allocator, size_t buffer_minalign) : allocator_(allocator), own_allocator_(own_allocator), initial_size_(initial_size), buffer_minalign_(buffer_minalign), reserved_(0), size_(0), buf_(nullptr), cur_(nullptr), scratch_(nullptr) {} vector_downward(vector_downward &&other) // clang-format on : allocator_(other.allocator_), own_allocator_(other.own_allocator_), initial_size_(other.initial_size_), buffer_minalign_(other.buffer_minalign_), reserved_(other.reserved_), size_(other.size_), buf_(other.buf_), cur_(other.cur_), scratch_(other.scratch_) { // No change in other.allocator_ // No change in other.initial_size_ // No change in other.buffer_minalign_ other.own_allocator_ = false; other.reserved_ = 0; other.buf_ = nullptr; other.cur_ = nullptr; other.scratch_ = nullptr; } vector_downward &operator=(vector_downward &&other) { // Move construct a temporary and swap idiom vector_downward temp(std::move(other)); swap(temp); return *this; } ~vector_downward() { clear_buffer(); clear_allocator(); } void reset() { clear_buffer(); clear(); } void clear() { if (buf_) { cur_ = buf_ + reserved_; } else { reserved_ = 0; cur_ = nullptr; } size_ = 0; clear_scratch(); } void clear_scratch() { scratch_ = buf_; } void clear_allocator() { if (own_allocator_ && allocator_) { delete allocator_; } allocator_ = nullptr; own_allocator_ = false; } void clear_buffer() { if (buf_) Deallocate(allocator_, buf_, reserved_); buf_ = nullptr; } // Relinquish the pointer to the caller. uint8_t *release_raw(size_t &allocated_bytes, size_t &offset) { auto *buf = buf_; allocated_bytes = reserved_; offset = static_cast(cur_ - buf_); // release_raw only relinquishes the buffer ownership. // Does not deallocate or reset the allocator. Destructor will do that. buf_ = nullptr; clear(); return buf; } // Relinquish the pointer to the caller. DetachedBuffer release() { // allocator ownership (if any) is transferred to DetachedBuffer. DetachedBuffer fb(allocator_, own_allocator_, buf_, reserved_, cur_, size()); if (own_allocator_) { allocator_ = nullptr; own_allocator_ = false; } buf_ = nullptr; clear(); return fb; } size_t ensure_space(size_t len) { FLATBUFFERS_ASSERT(cur_ >= scratch_ && scratch_ >= buf_); if (len > static_cast(cur_ - scratch_)) { reallocate(len); } // Beyond this, signed offsets may not have enough range: // (FlatBuffers > 2GB not supported). FLATBUFFERS_ASSERT(size() < FLATBUFFERS_MAX_BUFFER_SIZE); return len; } inline uint8_t *make_space(size_t len) { if (len) { ensure_space(len); cur_ -= len; size_ += static_cast(len); } return cur_; } // Returns nullptr if using the DefaultAllocator. Allocator *get_custom_allocator() { return allocator_; } inline uoffset_t size() const { return size_; } uoffset_t scratch_size() const { return static_cast(scratch_ - buf_); } size_t capacity() const { return reserved_; } uint8_t *data() const { FLATBUFFERS_ASSERT(cur_); return cur_; } uint8_t *scratch_data() const { FLATBUFFERS_ASSERT(buf_); return buf_; } uint8_t *scratch_end() const { FLATBUFFERS_ASSERT(scratch_); return scratch_; } uint8_t *data_at(size_t offset) const { return buf_ + reserved_ - offset; } void push(const uint8_t *bytes, size_t num) { if (num > 0) { memcpy(make_space(num), bytes, num); } } // Specialized version of push() that avoids memcpy call for small data. template void push_small(const T &little_endian_t) { make_space(sizeof(T)); *reinterpret_cast(cur_) = little_endian_t; } template void scratch_push_small(const T &t) { ensure_space(sizeof(T)); *reinterpret_cast(scratch_) = t; scratch_ += sizeof(T); } // fill() is most frequently called with small byte counts (<= 4), // which is why we're using loops rather than calling memset. void fill(size_t zero_pad_bytes) { make_space(zero_pad_bytes); for (size_t i = 0; i < zero_pad_bytes; i++) cur_[i] = 0; } // Version for when we know the size is larger. // Precondition: zero_pad_bytes > 0 void fill_big(size_t zero_pad_bytes) { memset(make_space(zero_pad_bytes), 0, zero_pad_bytes); } void pop(size_t bytes_to_remove) { cur_ += bytes_to_remove; size_ -= static_cast(bytes_to_remove); } void scratch_pop(size_t bytes_to_remove) { scratch_ -= bytes_to_remove; } void swap(vector_downward &other) { using std::swap; swap(allocator_, other.allocator_); swap(own_allocator_, other.own_allocator_); swap(initial_size_, other.initial_size_); swap(buffer_minalign_, other.buffer_minalign_); swap(reserved_, other.reserved_); swap(size_, other.size_); swap(buf_, other.buf_); swap(cur_, other.cur_); swap(scratch_, other.scratch_); } void swap_allocator(vector_downward &other) { using std::swap; swap(allocator_, other.allocator_); swap(own_allocator_, other.own_allocator_); } private: // You shouldn't really be copying instances of this class. FLATBUFFERS_DELETE_FUNC(vector_downward(const vector_downward &)); FLATBUFFERS_DELETE_FUNC(vector_downward &operator=(const vector_downward &)); Allocator *allocator_; bool own_allocator_; size_t initial_size_; size_t buffer_minalign_; size_t reserved_; uoffset_t size_; uint8_t *buf_; uint8_t *cur_; // Points at location between empty (below) and used (above). uint8_t *scratch_; // Points to the end of the scratchpad in use. void reallocate(size_t len) { auto old_reserved = reserved_; auto old_size = size(); auto old_scratch_size = scratch_size(); reserved_ += (std::max)(len, old_reserved ? old_reserved / 2 : initial_size_); reserved_ = (reserved_ + buffer_minalign_ - 1) & ~(buffer_minalign_ - 1); if (buf_) { buf_ = ReallocateDownward(allocator_, buf_, old_reserved, reserved_, old_size, old_scratch_size); } else { buf_ = Allocate(allocator_, reserved_); } cur_ = buf_ + reserved_ - old_size; scratch_ = buf_ + old_scratch_size; } }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_VECTOR_DOWNWARD_H_ mapserver-8.6.0/src/flatgeobuf/include/flatbuffers/verifier.h000066400000000000000000000231161511405061000243440ustar00rootroot00000000000000/* * Copyright 2021 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. */ #ifndef FLATBUFFERS_VERIFIER_H_ #define FLATBUFFERS_VERIFIER_H_ #include "flatbuffers/base.h" #include "flatbuffers/vector.h" namespace mapserver { namespace flatbuffers { // Helper class to verify the integrity of a FlatBuffer class Verifier FLATBUFFERS_FINAL_CLASS { public: Verifier(const uint8_t *buf, size_t buf_len, uoffset_t _max_depth = 64, uoffset_t _max_tables = 1000000, bool _check_alignment = true) : buf_(buf), size_(buf_len), depth_(0), max_depth_(_max_depth), num_tables_(0), max_tables_(_max_tables), upper_bound_(0), check_alignment_(_check_alignment), flex_reuse_tracker_(nullptr) { FLATBUFFERS_ASSERT(size_ < FLATBUFFERS_MAX_BUFFER_SIZE); } // Central location where any verification failures register. bool Check(bool ok) const { // clang-format off #ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE FLATBUFFERS_ASSERT(ok); #endif #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE if (!ok) upper_bound_ = 0; #endif // clang-format on return ok; } // Verify any range within the buffer. bool Verify(size_t elem, size_t elem_len) const { // clang-format off #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE auto upper_bound = elem + elem_len; if (upper_bound_ < upper_bound) upper_bound_ = upper_bound; #endif // clang-format on return Check(elem_len < size_ && elem <= size_ - elem_len); } bool VerifyAlignment(size_t elem, size_t align) const { return Check((elem & (align - 1)) == 0 || !check_alignment_); } // Verify a range indicated by sizeof(T). template bool Verify(size_t elem) const { return VerifyAlignment(elem, sizeof(T)) && Verify(elem, sizeof(T)); } bool VerifyFromPointer(const uint8_t *p, size_t len) { auto o = static_cast(p - buf_); return Verify(o, len); } // Verify relative to a known-good base pointer. bool VerifyFieldStruct(const uint8_t *base, voffset_t elem_off, size_t elem_len, size_t align) const { auto f = static_cast(base - buf_) + elem_off; return VerifyAlignment(f, align) && Verify(f, elem_len); } template bool VerifyField(const uint8_t *base, voffset_t elem_off, size_t align) const { auto f = static_cast(base - buf_) + elem_off; return VerifyAlignment(f, align) && Verify(f, sizeof(T)); } // Verify a pointer (may be NULL) of a table type. template bool VerifyTable(const T *table) { return !table || table->Verify(*this); } // Verify a pointer (may be NULL) of any vector type. template bool VerifyVector(const Vector *vec) const { return !vec || VerifyVectorOrString(reinterpret_cast(vec), sizeof(T)); } // Verify a pointer (may be NULL) of a vector to struct. template bool VerifyVector(const Vector *vec) const { return VerifyVector(reinterpret_cast *>(vec)); } // Verify a pointer (may be NULL) to string. bool VerifyString(const String *str) const { size_t end; return !str || (VerifyVectorOrString(reinterpret_cast(str), 1, &end) && Verify(end, 1) && // Must have terminator Check(buf_[end] == '\0')); // Terminating byte must be 0. } // Common code between vectors and strings. bool VerifyVectorOrString(const uint8_t *vec, size_t elem_size, size_t *end = nullptr) const { auto veco = static_cast(vec - buf_); // Check we can read the size field. if (!Verify(veco)) return false; // Check the whole array. If this is a string, the byte past the array // must be 0. auto size = ReadScalar(vec); auto max_elems = FLATBUFFERS_MAX_BUFFER_SIZE / elem_size; if (!Check(size < max_elems)) return false; // Protect against byte_size overflowing. auto byte_size = sizeof(size) + elem_size * size; if (end) *end = veco + byte_size; return Verify(veco, byte_size); } // Special case for string contents, after the above has been called. bool VerifyVectorOfStrings(const Vector> *vec) const { if (vec) { for (uoffset_t i = 0; i < vec->size(); i++) { if (!VerifyString(vec->Get(i))) return false; } } return true; } // Special case for table contents, after the above has been called. template bool VerifyVectorOfTables(const Vector> *vec) { if (vec) { for (uoffset_t i = 0; i < vec->size(); i++) { if (!vec->Get(i)->Verify(*this)) return false; } } return true; } __supress_ubsan__("unsigned-integer-overflow") bool VerifyTableStart( const uint8_t *table) { // Check the vtable offset. auto tableo = static_cast(table - buf_); if (!Verify(tableo)) return false; // This offset may be signed, but doing the subtraction unsigned always // gives the result we want. auto vtableo = tableo - static_cast(ReadScalar(table)); // Check the vtable size field, then check vtable fits in its entirety. return VerifyComplexity() && Verify(vtableo) && VerifyAlignment(ReadScalar(buf_ + vtableo), sizeof(voffset_t)) && Verify(vtableo, ReadScalar(buf_ + vtableo)); } template bool VerifyBufferFromStart(const char *identifier, size_t start) { if (identifier && !Check((size_ >= 2 * sizeof(flatbuffers::uoffset_t) && BufferHasIdentifier(buf_ + start, identifier)))) { return false; } // Call T::Verify, which must be in the generated code for this type. auto o = VerifyOffset(start); return o && reinterpret_cast(buf_ + start + o)->Verify(*this) // clang-format off #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE && GetComputedSize() #endif ; // clang-format on } template bool VerifyNestedFlatBuffer(const Vector *buf, const char *identifier) { if (!buf) return true; Verifier nested_verifier(buf->data(), buf->size()); return nested_verifier.VerifyBuffer(identifier); } // Verify this whole buffer, starting with root type T. template bool VerifyBuffer() { return VerifyBuffer(nullptr); } template bool VerifyBuffer(const char *identifier) { return VerifyBufferFromStart(identifier, 0); } template bool VerifySizePrefixedBuffer(const char *identifier) { return Verify(0U) && ReadScalar(buf_) == size_ - sizeof(uoffset_t) && VerifyBufferFromStart(identifier, sizeof(uoffset_t)); } uoffset_t VerifyOffset(size_t start) const { if (!Verify(start)) return 0; auto o = ReadScalar(buf_ + start); // May not point to itself. if (!Check(o != 0)) return 0; // Can't wrap around / buffers are max 2GB. if (!Check(static_cast(o) >= 0)) return 0; // Must be inside the buffer to create a pointer from it (pointer outside // buffer is UB). if (!Verify(start + o, 1)) return 0; return o; } uoffset_t VerifyOffset(const uint8_t *base, voffset_t start) const { return VerifyOffset(static_cast(base - buf_) + start); } // Called at the start of a table to increase counters measuring data // structure depth and amount, and possibly bails out with false if // limits set by the constructor have been hit. Needs to be balanced // with EndTable(). bool VerifyComplexity() { depth_++; num_tables_++; return Check(depth_ <= max_depth_ && num_tables_ <= max_tables_); } // Called at the end of a table to pop the depth count. bool EndTable() { depth_--; return true; } // Returns the message size in bytes size_t GetComputedSize() const { // clang-format off #ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE uintptr_t size = upper_bound_; // Align the size to uoffset_t size = (size - 1 + sizeof(uoffset_t)) & ~(sizeof(uoffset_t) - 1); return (size > size_) ? 0 : size; #else // Must turn on FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE for this to work. (void)upper_bound_; FLATBUFFERS_ASSERT(false); return 0; #endif // clang-format on } std::vector *GetFlexReuseTracker() { return flex_reuse_tracker_; } void SetFlexReuseTracker(std::vector *rt) { flex_reuse_tracker_ = rt; } private: const uint8_t *buf_; size_t size_; uoffset_t depth_; uoffset_t max_depth_; uoffset_t num_tables_; uoffset_t max_tables_; mutable size_t upper_bound_; bool check_alignment_; std::vector *flex_reuse_tracker_; }; } // namespace flatbuffers } // namespace mapserver #endif // FLATBUFFERS_VERIFIER_H_ mapserver-8.6.0/src/flatgeobuf/packedrtree.cpp000066400000000000000000000352551511405061000214360ustar00rootroot00000000000000/****************************************************************************** * * Project: FlatGeobuf * Purpose: Packed RTree management * Author: Björn Harrtell * ****************************************************************************** * Copyright (c) 2018-2020, Björn Harrtell * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ // NOTE: The upstream of this file is in https://github.com/bjornharrtell/flatgeobuf/tree/master/src/cpp #ifdef GDAL_COMPILATION #include "cpl_port.h" #else #define CPL_IS_LSB 1 #endif #include "packedrtree.h" #include #include #include namespace mapserver { namespace FlatGeobuf { const NodeItem &NodeItem::expand(const NodeItem &r) { if (r.minX < minX) minX = r.minX; if (r.minY < minY) minY = r.minY; if (r.maxX > maxX) maxX = r.maxX; if (r.maxY > maxY) maxY = r.maxY; return *this; } NodeItem NodeItem::create(uint64_t offset) { return { std::numeric_limits::infinity(), std::numeric_limits::infinity(), -1 * std::numeric_limits::infinity(), -1 * std::numeric_limits::infinity(), offset }; } bool NodeItem::intersects(const NodeItem &r) const { if (maxX < r.minX) return false; if (maxY < r.minY) return false; if (minX > r.maxX) return false; if (minY > r.maxY) return false; return true; } std::vector NodeItem::toVector() { return std::vector { minX, minY, maxX, maxY }; } // Based on public domain code at https://github.com/rawrunprotected/hilbert_curves uint32_t hilbert(uint32_t x, uint32_t y) { uint32_t a = x ^ y; uint32_t b = 0xFFFF ^ a; uint32_t c = 0xFFFF ^ (x | y); uint32_t d = x & (y ^ 0xFFFF); uint32_t A = a | (b >> 1); uint32_t B = (a >> 1) ^ a; uint32_t C = ((c >> 1) ^ (b & (d >> 1))) ^ c; uint32_t D = ((a & (c >> 1)) ^ (d >> 1)) ^ d; a = A; b = B; c = C; d = D; A = ((a & (a >> 2)) ^ (b & (b >> 2))); B = ((a & (b >> 2)) ^ (b & ((a ^ b) >> 2))); C ^= ((a & (c >> 2)) ^ (b & (d >> 2))); D ^= ((b & (c >> 2)) ^ ((a ^ b) & (d >> 2))); a = A; b = B; c = C; d = D; A = ((a & (a >> 4)) ^ (b & (b >> 4))); B = ((a & (b >> 4)) ^ (b & ((a ^ b) >> 4))); C ^= ((a & (c >> 4)) ^ (b & (d >> 4))); D ^= ((b & (c >> 4)) ^ ((a ^ b) & (d >> 4))); a = A; b = B; c = C; d = D; C ^= ((a & (c >> 8)) ^ (b & (d >> 8))); D ^= ((b & (c >> 8)) ^ ((a ^ b) & (d >> 8))); a = C ^ (C >> 1); b = D ^ (D >> 1); uint32_t i0 = x ^ y; uint32_t i1 = b | (0xFFFF ^ (i0 | a)); i0 = (i0 | (i0 << 8)) & 0x00FF00FF; i0 = (i0 | (i0 << 4)) & 0x0F0F0F0F; i0 = (i0 | (i0 << 2)) & 0x33333333; i0 = (i0 | (i0 << 1)) & 0x55555555; i1 = (i1 | (i1 << 8)) & 0x00FF00FF; i1 = (i1 | (i1 << 4)) & 0x0F0F0F0F; i1 = (i1 | (i1 << 2)) & 0x33333333; i1 = (i1 | (i1 << 1)) & 0x55555555; uint32_t value = ((i1 << 1) | i0); return value; } uint32_t hilbert(const NodeItem &r, uint32_t hilbertMax, const double minX, const double minY, const double width, const double height) { uint32_t x = 0; uint32_t y = 0; uint32_t v; if (width != 0.0) x = static_cast(floor(hilbertMax * ((r.minX + r.maxX) / 2 - minX) / width)); if (height != 0.0) y = static_cast(floor(hilbertMax * ((r.minY + r.maxY) / 2 - minY) / height)); v = hilbert(x, y); return v; } const uint32_t hilbertMax = (1 << 16) - 1; void hilbertSort(std::vector> &items) { NodeItem extent = calcExtent(items); const double minX = extent.minX; const double minY = extent.minY; const double width = extent.width(); const double height = extent.height(); std::sort(items.begin(), items.end(), [minX, minY, width, height] (std::shared_ptr a, std::shared_ptr b) { uint32_t ha = hilbert(a->nodeItem, hilbertMax, minX, minY, width, height); uint32_t hb = hilbert(b->nodeItem, hilbertMax, minX, minY, width, height); return ha > hb; }); } void hilbertSort(std::vector &items) { NodeItem extent = calcExtent(items); const double minX = extent.minX; const double minY = extent.minY; const double width = extent.width(); const double height = extent.height(); std::sort(items.begin(), items.end(), [minX, minY, width, height] (const NodeItem &a, const NodeItem &b) { uint32_t ha = hilbert(a, hilbertMax, minX, minY, width, height); uint32_t hb = hilbert(b, hilbertMax, minX, minY, width, height); return ha > hb; }); } NodeItem calcExtent(const std::vector> &items) { return std::accumulate(items.begin(), items.end(), NodeItem::create(0), [] (NodeItem a, const std::shared_ptr& b) { return a.expand(b->nodeItem); }); } NodeItem calcExtent(const std::vector &nodes) { return std::accumulate(nodes.begin(), nodes.end(), NodeItem::create(0), [] (NodeItem a, const NodeItem &b) { return a.expand(b); }); } void PackedRTree::init(const uint16_t nodeSize) { if (nodeSize < 2) throw std::invalid_argument("Node size must be at least 2"); if (_numItems == 0) throw std::invalid_argument("Cannot create empty tree"); _nodeSize = std::min(std::max(nodeSize, static_cast(2)), static_cast(65535)); _levelBounds = generateLevelBounds(_numItems, _nodeSize); _numNodes = _levelBounds.front().second; _nodeItems = new NodeItem[static_cast(_numNodes)]; } std::vector> PackedRTree::generateLevelBounds(const uint64_t numItems, const uint16_t nodeSize) { if (nodeSize < 2) throw std::invalid_argument("Node size must be at least 2"); if (numItems == 0) throw std::invalid_argument("Number of items must be greater than 0"); if (numItems > std::numeric_limits::max() - ((numItems / nodeSize) * 2)) throw std::overflow_error("Number of items too large"); // number of nodes per level in bottom-up order std::vector levelNumNodes; uint64_t n = numItems; uint64_t numNodes = n; levelNumNodes.push_back(n); do { n = (n + nodeSize - 1) / nodeSize; numNodes += n; levelNumNodes.push_back(n); } while (n != 1); // bounds per level in reversed storage order (top-down) std::vector levelOffsets; n = numNodes; for (auto size : levelNumNodes) levelOffsets.push_back(n -= size); std::reverse(levelOffsets.begin(), levelOffsets.end()); std::reverse(levelNumNodes.begin(), levelNumNodes.end()); std::vector> levelBounds; for (size_t i = 0; i < levelNumNodes.size(); i++) levelBounds.push_back(std::pair(levelOffsets[i], levelOffsets[i] + levelNumNodes[i])); std::reverse(levelBounds.begin(), levelBounds.end()); return levelBounds; } void PackedRTree::generateNodes() { for (uint32_t i = 0; i < _levelBounds.size() - 1; i++) { auto pos = _levelBounds[i].first; auto end = _levelBounds[i].second; auto newpos = _levelBounds[i + 1].first; while (pos < end) { NodeItem node = NodeItem::create(pos); for (uint32_t j = 0; j < _nodeSize && pos < end; j++) node.expand(_nodeItems[pos++]); _nodeItems[newpos++] = node; } } } void PackedRTree::fromData(const void *data) { auto buf = reinterpret_cast(data); const NodeItem *pn = reinterpret_cast(buf); for (uint64_t i = 0; i < _numNodes; i++) { NodeItem n = *pn++; _nodeItems[i] = n; _extent.expand(n); } } PackedRTree::PackedRTree(const std::vector> &items, const NodeItem &extent, const uint16_t nodeSize) : _extent(extent), _numItems(items.size()) { init(nodeSize); for (size_t i = 0; i < _numItems; i++) _nodeItems[_numNodes - _numItems + i] = items[i]->nodeItem; generateNodes(); } PackedRTree::PackedRTree(const std::vector &nodes, const NodeItem &extent, const uint16_t nodeSize) : _extent(extent), _numItems(nodes.size()) { init(nodeSize); for (size_t i = 0; i < _numItems; i++) _nodeItems[_numNodes - _numItems + i] = nodes[i]; generateNodes(); } PackedRTree::PackedRTree(const void *data, const uint64_t numItems, const uint16_t nodeSize) : _extent(NodeItem::create(0)), _numItems(numItems) { init(nodeSize); fromData(data); } std::vector PackedRTree::search(double minX, double minY, double maxX, double maxY) const { uint64_t leafNodesOffset = _levelBounds.front().first; NodeItem n { minX, minY, maxX, maxY, 0 }; std::vector results; std::unordered_map queue; queue.insert(std::pair(0, _levelBounds.size() - 1)); while(queue.size() != 0) { auto next = queue.begin(); uint64_t nodeIndex = next->first; uint64_t level = next->second; queue.erase(next); bool isLeafNode = nodeIndex >= _numNodes - _numItems; // find the end index of the node uint64_t end = std::min(static_cast(nodeIndex + _nodeSize), _levelBounds[static_cast(level)].second); // search through child nodes for (uint64_t pos = nodeIndex; pos < end; pos++) { auto nodeItem = _nodeItems[static_cast(pos)]; if (!n.intersects(nodeItem)) continue; if (isLeafNode) results.push_back({ nodeItem.offset, pos - leafNodesOffset }); else queue.insert(std::pair(nodeItem.offset, level - 1)); } } return results; } std::vector PackedRTree::streamSearch( const uint64_t numItems, const uint16_t nodeSize, const NodeItem &item, const std::function &readNode) { auto levelBounds = generateLevelBounds(numItems, nodeSize); uint64_t leafNodesOffset = levelBounds.front().first; uint64_t numNodes = levelBounds.front().second; auto nodeItems = std::vector(nodeSize); uint8_t *nodesBuf = reinterpret_cast(nodeItems.data()); // use ordered search queue to make index traversal in sequential order std::map queue; std::vector results; queue.insert(std::pair(0, levelBounds.size() - 1)); while(queue.size() != 0) { auto next = queue.begin(); uint64_t nodeIndex = next->first; uint64_t level = next->second; queue.erase(next); bool isLeafNode = nodeIndex >= numNodes - numItems; // find the end index of the node uint64_t end = std::min(static_cast(nodeIndex + nodeSize), levelBounds[static_cast(level)].second); uint64_t length = end - nodeIndex; readNode(nodesBuf, static_cast(nodeIndex * sizeof(NodeItem)), static_cast(length * sizeof(NodeItem))); #if !CPL_IS_LSB for( size_t i = 0; i < static_cast(length); i++ ) { CPL_LSBPTR64(&nodeItems[i].minX); CPL_LSBPTR64(&nodeItems[i].minY); CPL_LSBPTR64(&nodeItems[i].maxX); CPL_LSBPTR64(&nodeItems[i].maxY); CPL_LSBPTR64(&nodeItems[i].offset); } #endif // search through child nodes for (uint64_t pos = nodeIndex; pos < end; pos++) { uint64_t nodePos = pos - nodeIndex; auto nodeItem = nodeItems[static_cast(nodePos)]; if (!item.intersects(nodeItem)) continue; if (isLeafNode) results.push_back({ nodeItem.offset, pos - leafNodesOffset }); else queue.insert(std::pair(nodeItem.offset, level - 1)); } } return results; } uint64_t PackedRTree::size() const { return _numNodes * sizeof(NodeItem); } uint64_t PackedRTree::size(const uint64_t numItems, const uint16_t nodeSize) { if (nodeSize < 2) throw std::invalid_argument("Node size must be at least 2"); if (numItems == 0) throw std::invalid_argument("Number of items must be greater than 0"); const uint16_t nodeSizeMin = std::min(std::max(nodeSize, static_cast(2)), static_cast(65535)); // limit so that resulting size in bytes can be represented by uint64_t if (numItems > static_cast(1) << 56) throw std::overflow_error("Number of items must be less than 2^56"); uint64_t n = numItems; uint64_t numNodes = n; do { n = (n + nodeSizeMin - 1) / nodeSizeMin; numNodes += n; } while (n != 1); return numNodes * sizeof(NodeItem); } void PackedRTree::streamWrite(const std::function &writeData) { #if !CPL_IS_LSB for( size_t i = 0; i < static_cast(_numNodes); i++ ) { CPL_LSBPTR64(&_nodeItems[i].minX); CPL_LSBPTR64(&_nodeItems[i].minY); CPL_LSBPTR64(&_nodeItems[i].maxX); CPL_LSBPTR64(&_nodeItems[i].maxY); CPL_LSBPTR64(&_nodeItems[i].offset); } #endif writeData(reinterpret_cast(_nodeItems), static_cast(_numNodes * sizeof(NodeItem))); #if !CPL_IS_LSB for( size_t i = 0; i < static_cast(_numNodes); i++ ) { CPL_LSBPTR64(&_nodeItems[i].minX); CPL_LSBPTR64(&_nodeItems[i].minY); CPL_LSBPTR64(&_nodeItems[i].maxX); CPL_LSBPTR64(&_nodeItems[i].maxY); CPL_LSBPTR64(&_nodeItems[i].offset); } #endif } NodeItem PackedRTree::getExtent() const { return _extent; } } }mapserver-8.6.0/src/flatgeobuf/packedrtree.h000066400000000000000000000104161511405061000210730ustar00rootroot00000000000000/****************************************************************************** * * Project: FlatGeobuf * Purpose: Packed RTree management * Author: Björn Harrtell * ****************************************************************************** * Copyright (c) 2018-2020, Björn Harrtell * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ // NOTE: The upstream of this file is in https://github.com/bjornharrtell/flatgeobuf/tree/master/src/cpp #ifndef FLATGEOBUF_PACKEDRTREE_H_ #define FLATGEOBUF_PACKEDRTREE_H_ #include #include #include "flatbuffers/flatbuffers.h" namespace mapserver { namespace FlatGeobuf { struct NodeItem { double minX; double minY; double maxX; double maxY; uint64_t offset; double width() const { return maxX - minX; } double height() const { return maxY - minY; } static NodeItem sum(NodeItem a, const NodeItem &b) { a.expand(b); return a; } static NodeItem create(uint64_t offset = 0); const NodeItem &expand(const NodeItem &r); bool intersects(const NodeItem &r) const; std::vector toVector(); }; struct Item { NodeItem nodeItem; }; struct SearchResultItem { uint64_t offset; uint64_t index; }; std::ostream& operator << (std::ostream& os, NodeItem const& value); uint32_t hilbert(uint32_t x, uint32_t y); uint32_t hilbert(const NodeItem &n, uint32_t hilbertMax, const double minX, const double minY, const double width, const double height); void hilbertSort(std::vector> &items); void hilbertSort(std::vector &items); NodeItem calcExtent(const std::vector> &items); NodeItem calcExtent(const std::vector &rects); /** * Packed R-Tree * Based on https://github.com/mourner/flatbush */ class PackedRTree { NodeItem _extent; NodeItem *_nodeItems = nullptr; uint64_t _numItems; uint64_t _numNodes; uint16_t _nodeSize; std::vector> _levelBounds; void init(const uint16_t nodeSize); void generateNodes(); void fromData(const void *data); public: ~PackedRTree() { if (_nodeItems != nullptr) delete[] _nodeItems; } PackedRTree(const std::vector> &items, const NodeItem &extent, const uint16_t nodeSize = 16); PackedRTree(const std::vector &nodes, const NodeItem &extent, const uint16_t nodeSize = 16); PackedRTree(const void *data, const uint64_t numItems, const uint16_t nodeSize = 16); std::vector search(double minX, double minY, double maxX, double maxY) const; static std::vector streamSearch( const uint64_t numItems, const uint16_t nodeSize, const NodeItem &item, const std::function &readNode); static std::vector> generateLevelBounds(const uint64_t numItems, const uint16_t nodeSize); uint64_t size() const; static uint64_t size(const uint64_t numItems, const uint16_t nodeSize = 16); NodeItem getExtent() const; void streamWrite(const std::function &writeData); }; } } #endif mapserver-8.6.0/src/fontcache.c000066400000000000000000000321151511405061000164110ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: Freetype Font helper functions * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2013 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include "mapthread.h" #include "fontcache.h" #include "dejavu-sans-condensed.h" #include "cpl_conv.h" typedef struct { FT_Library library; face_element *face_cache; glyph_element *bitmap_glyph_cache; } ft_cache; #ifdef USE_THREAD typedef struct ft_thread_cache ft_thread_cache; struct ft_thread_cache { void *thread_id; ft_thread_cache *next; ft_cache cache; }; ft_thread_cache *ft_caches; int use_global_ft_cache; #else ft_cache global_ft_cache; #endif void msInitFontCache(ft_cache *c) { memset(c, 0, sizeof(ft_cache)); FT_Init_FreeType(&c->library); } void msFreeFontCache(ft_cache *c) { /* ... TODO ... */ face_element *cur_face, *tmp_face; glyph_element *cur_bitmap, *tmp_bitmap; UT_HASH_ITER(hh, c->face_cache, cur_face, tmp_face) { index_element *cur_index, *tmp_index; outline_element *cur_outline, *tmp_outline; glyph_element *cur_glyph, *tmp_glyph; UT_HASH_ITER(hh, cur_face->index_cache, cur_index, tmp_index) { UT_HASH_DEL(cur_face->index_cache, cur_index); free(cur_index); } UT_HASH_ITER(hh, cur_face->outline_cache, cur_outline, tmp_outline) { UT_HASH_DEL(cur_face->outline_cache, cur_outline); FT_Outline_Done(c->library, &cur_outline->outline); free(cur_outline); } UT_HASH_ITER(hh, cur_face->glyph_cache, cur_glyph, tmp_glyph) { UT_HASH_DEL(cur_face->glyph_cache, cur_glyph); free(cur_glyph); } #ifdef USE_HARFBUZZ if (cur_face->hbfont) { hb_font_destroy(cur_face->hbfont->hbfont); hb_font_destroy(cur_face->hbfont->hbparentfont); hb_font_funcs_destroy(cur_face->hbfont->funcs); free(cur_face->hbfont); } #endif FT_Done_Face(cur_face->face); free(cur_face->font); UT_HASH_DEL(c->face_cache, cur_face); free(cur_face); } FT_Done_FreeType(c->library); UT_HASH_ITER(hh, c->bitmap_glyph_cache, cur_bitmap, tmp_bitmap) { UT_HASH_DEL(c->bitmap_glyph_cache, cur_bitmap); free(cur_bitmap); } memset(c, 0, sizeof(ft_cache)); } ft_cache *msGetFontCache() { #ifndef USE_THREAD return &global_ft_cache; #else void *nThreadId = 0; ft_thread_cache *prev = NULL, *cur = ft_caches; if (!use_global_ft_cache) nThreadId = msGetThreadId(); if (cur != NULL && cur->thread_id == nThreadId) return &cur->cache; /* -------------------------------------------------------------------- */ /* Search for cache for this thread */ /* -------------------------------------------------------------------- */ msAcquireLock(TLOCK_TTF); cur = ft_caches; while (cur != NULL && cur->thread_id != nThreadId) { prev = cur; cur = cur->next; } /* -------------------------------------------------------------------- */ /* If we found it, make sure it is pushed to the front of the */ /* link for faster finding next time, and return it. */ /* -------------------------------------------------------------------- */ if (cur != NULL) { if (prev != NULL) { prev->next = cur->next; cur->next = ft_caches; ft_caches = cur; } msReleaseLock(TLOCK_TTF); return &cur->cache; } /* -------------------------------------------------------------------- */ /* Create a new context group for this thread. */ /* -------------------------------------------------------------------- */ cur = msSmallMalloc(sizeof(ft_thread_cache)); cur->next = NULL; cur->thread_id = nThreadId; msInitFontCache(&cur->cache); cur->next = ft_caches; ft_caches = cur; msReleaseLock(TLOCK_TTF); return &cur->cache; #endif } void msFontCacheSetup() { #ifndef USE_THREAD ft_cache *c = msGetFontCache(); msInitFontCache(c); #else const char *use_global_cache = CPLGetConfigOption("MS_USE_GLOBAL_FT_CACHE", NULL); if (use_global_cache) use_global_ft_cache = atoi(use_global_cache); else use_global_ft_cache = 0; ft_caches = NULL; #endif } void msFontCacheCleanup() { #ifndef USE_THREAD ft_cache *c = msGetFontCache(); msFreeFontCache(c); #else ft_thread_cache *cur, *next; msAcquireLock(TLOCK_TTF); cur = ft_caches; while (cur != NULL) { msFreeFontCache(&cur->cache); next = cur->next; free(cur); cur = next; } ft_caches = NULL; msReleaseLock(TLOCK_TTF); #endif } unsigned int msGetGlyphIndex(face_element *face, unsigned int unicode) { index_element *ic; if (face->face->charmap && face->face->charmap->encoding == FT_ENCODING_MS_SYMBOL) { unicode |= 0xf000; /* why? */ } #ifdef USE_THREAD if (use_global_ft_cache) msAcquireLock(TLOCK_TTF); #endif UT_HASH_FIND_INT(face->index_cache, &unicode, ic); if (!ic) { ic = msSmallMalloc(sizeof(index_element)); ic->codepoint = FT_Get_Char_Index(face->face, unicode); ic->unicode = unicode; UT_HASH_ADD_INT(face->index_cache, unicode, ic); } #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return ic->codepoint; } #define MS_DEFAULT_FONT_KEY "_ms_default_" face_element *msGetFontFace(const char *key, fontSetObj *fontset) { face_element *fc; int error; ft_cache *cache = msGetFontCache(); if (!key) { key = MS_DEFAULT_FONT_KEY; } #ifdef USE_THREAD if (use_global_ft_cache) msAcquireLock(TLOCK_TTF); #endif UT_HASH_FIND_STR(cache->face_cache, key, fc); if (!fc) { const char *fontfile = NULL; fc = msSmallCalloc(1, sizeof(face_element)); if (fontset && strcmp(key, MS_DEFAULT_FONT_KEY)) { fontfile = msLookupHashTable(&(fontset->fonts), key); if (!fontfile) { msSetError(MS_MISCERR, "Could not find font with key \"%s\" in fontset", "msGetFontFace()", key); free(fc); #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return NULL; } error = FT_New_Face(cache->library, fontfile, 0, &(fc->face)); } else { error = FT_New_Memory_Face(cache->library, dejavu_sans_condensed_ttf, dejavu_sans_condensed_ttf_len, 0, &(fc->face)); } if (error) { msSetError(MS_MISCERR, "Freetype was unable to load font file \"%s\" for key \"%s\"", "msGetFontFace()", fontfile, key); free(fc); #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return NULL; } if (!fc->face->charmap) { /* The font file has no unicode charmap, select an alternate one */ if (FT_Select_Charmap(fc->face, FT_ENCODING_MS_SYMBOL)) FT_Select_Charmap(fc->face, FT_ENCODING_APPLE_ROMAN); /* the previous calls may have failed, we ignore as there's nothing much * left to do */ } fc->font = msStrdup(key); UT_HASH_ADD_KEYPTR(hh, cache->face_cache, fc->font, strlen(key), fc); } #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return fc; } glyph_element *msGetGlyphByIndex(face_element *face, unsigned int size, unsigned int codepoint) { glyph_element *gc; glyph_element_key key; memset(&key, 0, sizeof(glyph_element_key)); key.codepoint = codepoint; key.size = size; #ifdef USE_THREAD if (use_global_ft_cache) msAcquireLock(TLOCK_TTF); #endif UT_HASH_FIND(hh, face->glyph_cache, &key, sizeof(glyph_element_key), gc); if (!gc) { FT_Error error; gc = msSmallMalloc(sizeof(glyph_element)); if (MS_NINT(size * 96.0 / 72.0) != face->face->size->metrics.x_ppem) { FT_Set_Pixel_Sizes(face->face, 0, MS_NINT(size * 96 / 72.0)); } error = FT_Load_Glyph(face->face, key.codepoint, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); if (error) { msDebug("Unable to load glyph %u for font \"%s\". Using ? as fallback.\n", key.codepoint, face->font); // If we can't find a glyph then try to fallback to a question mark. unsigned int fallbackCodepoint = msGetGlyphIndex(face, 0x3F); error = FT_Load_Glyph(face->face, fallbackCodepoint, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); } if (error) { msSetError(MS_MISCERR, "unable to load glyph %u for font \"%s\"", "msGetGlyphByIndex()", key.codepoint, face->font); free(gc); #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return NULL; } gc->metrics.minx = face->face->glyph->metrics.horiBearingX / 64.0; gc->metrics.maxx = gc->metrics.minx + face->face->glyph->metrics.width / 64.0; gc->metrics.maxy = face->face->glyph->metrics.horiBearingY / 64.0; gc->metrics.miny = gc->metrics.maxy - face->face->glyph->metrics.height / 64.0; gc->metrics.advance = face->face->glyph->metrics.horiAdvance / 64.0; gc->key = key; UT_HASH_ADD(hh, face->glyph_cache, key, sizeof(glyph_element_key), gc); } #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return gc; } outline_element *msGetGlyphOutline(face_element *face, glyph_element *glyph) { outline_element *oc; outline_element_key key; ft_cache *cache = msGetFontCache(); memset(&key, 0, sizeof(outline_element_key)); key.glyph = glyph; #ifdef USE_THREAD if (use_global_ft_cache) msAcquireLock(TLOCK_TTF); #endif UT_HASH_FIND(hh, face->outline_cache, &key, sizeof(outline_element_key), oc); if (!oc) { FT_Matrix matrix; FT_Vector pen; FT_Error error; oc = msSmallMalloc(sizeof(outline_element)); if (MS_NINT(glyph->key.size * 96.0 / 72.0) != face->face->size->metrics.x_ppem) { FT_Set_Pixel_Sizes(face->face, 0, MS_NINT(glyph->key.size * 96 / 72.0)); } matrix.xx = matrix.yy = 0x10000L; matrix.xy = matrix.yx = 0x00000L; pen.x = pen.y = 0; FT_Set_Transform(face->face, &matrix, &pen); error = FT_Load_Glyph( face->face, glyph->key.codepoint, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP /*|FT_LOAD_IGNORE_TRANSFORM*/ | FT_LOAD_NO_HINTING | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); if (error) { msDebug("Unable to load glyph %u for font \"%s\". Using ? as fallback.\n", glyph->key.codepoint, face->font); // If we can't find a glyph then try to fallback to a question mark. unsigned int fallbackCodepoint = msGetGlyphIndex(face, 0x3F); error = FT_Load_Glyph( face->face, fallbackCodepoint, FT_LOAD_DEFAULT | FT_LOAD_NO_BITMAP /*|FT_LOAD_IGNORE_TRANSFORM*/ | FT_LOAD_NO_HINTING | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); } if (error) { msSetError(MS_MISCERR, "unable to load glyph %u for font \"%s\"", "msGetGlyphOutline()", glyph->key.codepoint, face->font); #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return NULL; } error = FT_Outline_New(cache->library, face->face->glyph->outline.n_points, face->face->glyph->outline.n_contours, &oc->outline); (void)error; FT_Outline_Copy(&face->face->glyph->outline, &oc->outline); oc->key = key; UT_HASH_ADD(hh, face->outline_cache, key, sizeof(outline_element_key), oc); } #ifdef USE_THREAD if (use_global_ft_cache) msReleaseLock(TLOCK_TTF); #endif return oc; } int msIsGlyphASpace(glyphObj *glyph) { /* space or tab, for now */ unsigned int space, tab; space = msGetGlyphIndex(glyph->face, 0x20); tab = msGetGlyphIndex(glyph->face, 0x9); return glyph->glyph->key.codepoint == space || glyph->glyph->key.codepoint == tab; } mapserver-8.6.0/src/fontcache.h000066400000000000000000000035101511405061000164130ustar00rootroot00000000000000#include "mapserver.h" #include "uthash.h" #include #include FT_FREETYPE_H #include FT_GLYPH_H #include FT_OUTLINE_H #ifdef USE_FRIBIDI #if (defined(_WIN32) && !defined(__CYGWIN__)) || defined(HAVE_FRIBIDI2) #include "fribidi.h" #else #include #endif #include #endif #ifdef __cplusplus extern "C" { #endif typedef struct { /* this one can remain private */ unsigned int unicode; unsigned int codepoint; UT_hash_handle hh; } index_element; typedef struct { void *hbparentfont; void *hbfont; void *funcs; int cursize; } hb_font_element; typedef struct { unsigned int codepoint; unsigned int size; } glyph_element_key; struct glyph_element { glyph_element_key key; glyph_metrics metrics; UT_hash_handle hh; }; typedef struct { glyph_element *glyph; } outline_element_key; typedef struct { outline_element_key key; FT_Outline outline; UT_hash_handle hh; } outline_element; typedef struct { glyph_element *glyph; } bitmap_element_key; typedef struct { bitmap_element_key key; void *bitmap; UT_hash_handle hh; } bitmap_element; struct face_element { char *font; FT_Face face; index_element *index_cache; glyph_element *glyph_cache; outline_element *outline_cache; hb_font_element *hbfont; UT_hash_handle hh; }; face_element *msGetFontFace(const char *key, fontSetObj *fontset); outline_element *msGetGlyphOutline(face_element *face, glyph_element *glyph); glyph_element *msGetBitmapGlyph(rendererVTableObj *renderer, unsigned int size, unsigned int unicode); unsigned int msGetGlyphIndex(face_element *face, unsigned int unicode); glyph_element *msGetGlyphByIndex(face_element *face, unsigned int size, unsigned int codepoint); int msIsGlyphASpace(glyphObj *glyph); #ifdef __cplusplus } #endif mapserver-8.6.0/src/hittest.c000066400000000000000000000234221511405061000161440ustar00rootroot00000000000000/***************************************************************************** * * Project: MapServer * Purpose: Content Dependent Legend rendering support * Author: Thomas Bonfort (tbonfort@terriscope.fr) * ****************************************************************************** * Copyright (c) 1996-2013 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" void initStyleHitTests(styleObj *s, style_hittest *sh, int default_status) { (void)s; sh->status = default_status; } void initLabelHitTests(labelObj *l, label_hittest *lh, int default_status) { int i; lh->stylehits = msSmallCalloc(l->numstyles, sizeof(style_hittest)); lh->status = default_status; for (i = 0; i < l->numstyles; i++) { initStyleHitTests(l->styles[i], &lh->stylehits[i], default_status); } } void initClassHitTests(classObj *c, class_hittest *ch, int default_status) { int i; ch->stylehits = msSmallCalloc(c->numstyles, sizeof(style_hittest)); ch->labelhits = msSmallCalloc(c->numlabels, sizeof(label_hittest)); ch->status = default_status; for (i = 0; i < c->numstyles; i++) { initStyleHitTests(c->styles[i], &ch->stylehits[i], default_status); } for (i = 0; i < c->numlabels; i++) { initLabelHitTests(c->labels[i], &ch->labelhits[i], default_status); } } void initLayerHitTests(layerObj *l, layer_hittest *lh) { int i, default_status; lh->classhits = msSmallCalloc(l->numclasses, sizeof(class_hittest)); switch (l->type) { case MS_LAYER_POLYGON: case MS_LAYER_POINT: case MS_LAYER_LINE: case MS_LAYER_ANNOTATION: default_status = 0; /* needs testing */ break; default: default_status = 1; /* no hittesting needed, use traditional mode */ break; } lh->status = default_status; for (i = 0; i < l->numclasses; i++) { initClassHitTests(l->class[i], &lh -> classhits[i], default_status); } } void initMapHitTests(mapObj *map, map_hittest *mh) { int i; mh->layerhits = msSmallCalloc(map->numlayers, sizeof(layer_hittest)); for (i = 0; i < map->numlayers; i++) { initLayerHitTests(GET_LAYER(map, i), &mh->layerhits[i]); } } void freeLabelHitTests(labelObj *l, label_hittest *lh) { (void)l; free(lh->stylehits); } void freeClassHitTests(classObj *c, class_hittest *ch) { int i; for (i = 0; i < c->numlabels; i++) { freeLabelHitTests(c->labels[i], &ch->labelhits[i]); } free(ch->stylehits); free(ch->labelhits); } void freeLayerHitTests(layerObj *l, layer_hittest *lh) { int i; for (i = 0; i < l->numclasses; i++) { freeClassHitTests(l->class[i], &lh -> classhits[i]); } free(lh->classhits); } void freeMapHitTests(mapObj *map, map_hittest *mh) { int i; for (i = 0; i < map->numlayers; i++) { freeLayerHitTests(GET_LAYER(map, i), &mh->layerhits[i]); } free(mh->layerhits); } int msHitTestShape(mapObj *map, layerObj *layer, shapeObj *shape, int drawmode, class_hittest *hittest) { int i; classObj *cp = layer->class[shape->classindex]; if (MS_DRAW_FEATURES(drawmode)) { for (i = 0; i < cp->numstyles; i++) { styleObj *sp = cp->styles[i]; if (msScaleInBounds(map->scaledenom, sp->minscaledenom, sp->maxscaledenom)) { hittest->stylehits[i].status = 1; } } } if (MS_DRAW_LABELS(drawmode)) { for (i = 0; i < cp->numlabels; i++) { labelObj *l = cp->labels[i]; if (msGetLabelStatus(map, layer, shape, l) == MS_ON) { int s; hittest->labelhits[i].status = 1; for (s = 0; s < l->numstyles; s++) { hittest->labelhits[i].stylehits[s].status = 1; } } } } return MS_SUCCESS; } int msHitTestLayer(mapObj *map, layerObj *layer, layer_hittest *hittest) { int status; #ifdef USE_GEOS shapeObj searchpoly; #endif if (!msLayerIsVisible(map, layer)) { hittest->status = 0; return MS_SUCCESS; } if (layer->type == MS_LAYER_LINE || layer->type == MS_LAYER_POLYGON || layer->type == MS_LAYER_POINT || layer->type == MS_LAYER_ANNOTATION) { int maxfeatures = msLayerGetMaxFeaturesToDraw(layer, NULL); int annotate = msEvalContext(map, layer, layer->labelrequires); shapeObj shape; int nclasses, featuresdrawn = 0; int *classgroup; rectObj searchrect; int minfeaturesize = -1; if (map->scaledenom > 0) { if ((layer->labelmaxscaledenom != -1) && (map->scaledenom >= layer->labelmaxscaledenom)) annotate = MS_FALSE; if ((layer->labelminscaledenom != -1) && (map->scaledenom < layer->labelminscaledenom)) annotate = MS_FALSE; } status = msLayerOpen(layer); if (status != MS_SUCCESS) return MS_FAILURE; /* build item list */ status = msLayerWhichItems(layer, MS_FALSE, NULL); if (status != MS_SUCCESS) { msLayerClose(layer); return MS_FAILURE; } /* identify target shapes */ if (layer->transform == MS_TRUE) { searchrect = map->extent; if ((map->projection.numargs > 0) && (layer->projection.numargs > 0)) msProjectRect( &map->projection, &layer->projection, &searchrect); /* project the searchrect to source coords */ } else { searchrect.minx = searchrect.miny = 0; searchrect.maxx = map->width - 1; searchrect.maxy = map->height - 1; } #ifdef USE_GEOS msInitShape(&searchpoly); msRectToPolygon(searchrect, &searchpoly); #endif status = msLayerWhichShapes(layer, searchrect, MS_FALSE); if (status == MS_DONE) { /* no overlap */ #ifdef USE_GEOS msFreeShape(&searchpoly); #endif msLayerClose(layer); hittest->status = 0; return MS_SUCCESS; } else if (status != MS_SUCCESS) { #ifdef USE_GEOS msFreeShape(&searchpoly); #endif msLayerClose(layer); return MS_FAILURE; } /* step through the target shapes */ msInitShape(&shape); nclasses = 0; classgroup = NULL; if (layer->classgroup && layer->numclasses > 0) classgroup = msAllocateValidClassGroups(layer, &nclasses); if (layer->minfeaturesize > 0) minfeaturesize = Pix2LayerGeoref(map, layer, layer->minfeaturesize); while ((status = msLayerNextShape(layer, &shape)) == MS_SUCCESS) { int drawmode = MS_DRAWMODE_FEATURES; #ifdef USE_GEOS if (!msGEOSIntersects(&shape, &searchpoly)) { msFreeShape(&shape); continue; } #else if (shape.type == MS_SHAPE_POLYGON) { msClipPolygonRect(&shape, map->extent); } else { msClipPolylineRect(&shape, map->extent); } if (shape.numlines == 0) { msFreeShape(&shape); continue; } #endif /* Check if the shape size is ok to be drawn, we need to clip */ if ((shape.type == MS_SHAPE_LINE || shape.type == MS_SHAPE_POLYGON) && (minfeaturesize > 0)) { msTransformShape(&shape, map->extent, map->cellsize, NULL); msComputeBounds(&shape); if (msShapeCheckSize(&shape, minfeaturesize) == MS_FALSE) { msFreeShape(&shape); continue; } } shape.classindex = msShapeGetClass(layer, map, &shape, classgroup, nclasses); if ((shape.classindex == -1) || (layer->class[shape.classindex] -> status == MS_OFF)) { msFreeShape(&shape); continue; } hittest->classhits[shape.classindex].status = 1; hittest->status = 1; if (maxfeatures >= 0 && featuresdrawn >= maxfeatures) { msFreeShape(&shape); status = MS_DONE; break; } featuresdrawn++; if (annotate && layer->class[shape.classindex] -> numlabels > 0) { drawmode |= MS_DRAWMODE_LABELS; } status = msHitTestShape( map, layer, &shape, drawmode, &hittest->classhits[shape.classindex]); /* all styles */ msFreeShape(&shape); } #ifdef USE_GEOS msFreeShape(&searchpoly); #endif if (classgroup) msFree(classgroup); if (status != MS_DONE) { msLayerClose(layer); return MS_FAILURE; } msLayerClose(layer); return MS_SUCCESS; } else { /* we don't hittest these layers, skip as they already have been initialized */ return MS_SUCCESS; } } int msHitTestMap(mapObj *map, map_hittest *hittest) { int i, status; map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); status = msCalculateScale(map->extent, map->units, map->width, map->height, map->resolution, &map->scaledenom); if (status != MS_SUCCESS) { return MS_FAILURE; } for (i = 0; i < map->numlayers; i++) { layerObj *lp = map->layers[i]; status = msHitTestLayer(map, lp, &hittest->layerhits[i]); if (status != MS_SUCCESS) { return MS_FAILURE; } } return MS_SUCCESS; } mapserver-8.6.0/src/hittest.h000066400000000000000000000051211511405061000161450ustar00rootroot00000000000000/***************************************************************************** * * Project: MapServer * Purpose: Content Dependent Legend rendering support * Author: Thomas Bonfort (tbonfort@terriscope.fr) * ****************************************************************************** * Copyright (c) 1996-2013 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef HITTEST_H #define HITTEST_H typedef struct { int status; } style_hittest; typedef struct { style_hittest *stylehits; int status; } label_hittest; typedef struct { style_hittest *stylehits; label_hittest *labelhits; int status; } class_hittest; typedef struct { class_hittest *classhits; int status; } layer_hittest; typedef struct map_hittest { layer_hittest *layerhits; } map_hittest; int msHitTestMap(mapObj *map, map_hittest *hittest); int msHitTestLayer(mapObj *map, layerObj *layer, layer_hittest *hittest); void initStyleHitTests(styleObj *s, style_hittest *sh, int default_status); void initLabelHitTests(labelObj *l, label_hittest *lh, int default_status); void initClassHitTests(classObj *c, class_hittest *ch, int default_status); void initLayerHitTests(layerObj *l, layer_hittest *lh); void initMapHitTests(mapObj *map, map_hittest *mh); void freeLabelHitTests(labelObj *l, label_hittest *lh); void freeClassHitTests(classObj *c, class_hittest *ch); void freeLayerHitTests(layerObj *l, layer_hittest *lh); void freeMapHitTests(mapObj *map, map_hittest *mh); #endif mapserver-8.6.0/src/idw.c000066400000000000000000000062631511405061000152470ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: Inverse Distance Weighted layer interpolation. * Author: Hermes L. Herrera Martinez and the MapServer team. * Thanks: Thomas Bonfort * ****************************************************************************** * Copyright (c) 2014 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include #define EPSILON 0.000000001 #include void msIdw(float *xyz, int width, int height, int npoints, interpolationProcessingParams *interpParams, unsigned char *iValues) { int i, j, index; int radius = interpParams->radius; float power = interpParams->power; for (j = 0; j < height; j++) { for (i = 0; i < width; i++) { double den = EPSILON, num = 0; for (index = 0; index < npoints * 3; index += 3) { double d = (xyz[index] - i) * (xyz[index] - i) + (xyz[index + 1] - j) * (xyz[index + 1] - j); if (radius * radius > d) { double w = 1.0 / (pow(d, power) + EPSILON); num += w * xyz[index + 2]; den += w; } } iValues[j * width + i] = num / den; } } } void msIdwProcessing(layerObj *layer, interpolationProcessingParams *interpParams) { const char *interpParamsProcessing = msLayerGetProcessingKey(layer, "IDW_POWER"); if (interpParamsProcessing) { interpParams->power = atof(interpParamsProcessing); } else { interpParams->power = 1.0; } interpParamsProcessing = msLayerGetProcessingKey(layer, "IDW_RADIUS"); if (interpParamsProcessing) { interpParams->radius = atof(interpParamsProcessing); } else { interpParams->radius = MAX(layer->map->width, layer->map->height); } interpParamsProcessing = msLayerGetProcessingKey(layer, "IDW_COMPUTE_BORDERS"); if (interpParamsProcessing && strcasecmp(interpParamsProcessing, "OFF")) { interpParams->expand_searchrect = 1; } else { interpParams->expand_searchrect = 0; } } mapserver-8.6.0/src/interpolation.c000066400000000000000000000266631511405061000173610ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: KernelDensity layer implementation and related functions. * Author: Hermes L. Herrera and the MapServer team. * ****************************************************************************** * Copyright (c) 2014 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include #include "gdal.h" #include "cpl_string.h" /****************************************************************************** * kernel density. ******************************************************************************/ void msKernelDensity(imageObj *image, float *values, int width, int height, int npoints, interpolationProcessingParams *interpParams, unsigned char *iValues); void msKernelDensityProcessing(layerObj *layer, interpolationProcessingParams *interpParams); /****************************************************************************** * kernel density. ******************************************************************************/ void msIdw(float *xyz, int width, int height, int npoints, interpolationProcessingParams *interpParams, unsigned char *iValues); void msIdwProcessing(layerObj *layer, interpolationProcessingParams *interpParams); //---------------------------------------------------------------------------// int msInterpolationDataset(mapObj *map, imageObj *image, layerObj *interpolation_layer, void **hDSvoid, void **cleanup_ptr) { int status, layer_idx, i, npoints = 0, length = 0; rectObj searchrect; shapeObj shape; layerObj *layer = NULL; float *values = NULL, *xyz_values = NULL; int im_width = image->width, im_height = image->height; double invcellsize = 1.0 / map->cellsize, georadius = 0; unsigned char *iValues; GDALDatasetH hDS; interpolationProcessingParams interpParams; memset(&interpParams, 0, sizeof(interpParams)); assert(interpolation_layer->connectiontype == MS_KERNELDENSITY || interpolation_layer->connectiontype == MS_IDW); *cleanup_ptr = NULL; if (!interpolation_layer->connection || !*interpolation_layer->connection) { msSetError(MS_MISCERR, "msInterpolationDataset()", "Interpolation layer has no CONNECTION defined"); return MS_FAILURE; } if (interpolation_layer->connectiontype == MS_KERNELDENSITY) { msKernelDensityProcessing(interpolation_layer, &interpParams); } else if (interpolation_layer->connectiontype == MS_IDW) { msIdwProcessing(interpolation_layer, &interpParams); } layer_idx = msGetLayerIndex(map, interpolation_layer->connection); if (layer_idx == -1) { int nLayers, *aLayers; aLayers = msGetLayersIndexByGroup(map, interpolation_layer->connection, &nLayers); if (!aLayers || !nLayers) { msSetError(MS_MISCERR, "Interpolation layer (%s) references unknown layer (%s)", "msInterpolationDataset()", interpolation_layer->name, interpolation_layer->connection); return (MS_FAILURE); } for (i = 0; i < nLayers; i++) { layer_idx = aLayers[i]; layer = GET_LAYER(map, layer_idx); if (msScaleInBounds(map->scaledenom, layer->minscaledenom, layer->maxscaledenom)) break; } free(aLayers); if (i == nLayers) { msSetError( MS_MISCERR, "Interpolation layer (%s) references no layer for current scale", "msInterpolationDataset()", interpolation_layer->name); return (MS_FAILURE); } } else { layer = GET_LAYER(map, layer_idx); } /* open the linked layer */ status = msLayerOpen(layer); if (status != MS_SUCCESS) return MS_FAILURE; status = msLayerWhichItems(layer, MS_FALSE, NULL); if (status != MS_SUCCESS) { msLayerClose(layer); return MS_FAILURE; } /* identify target shapes */ if (layer->transform == MS_TRUE) { searchrect = map->extent; if (interpParams.expand_searchrect) { georadius = interpParams.radius * map->cellsize; searchrect.minx -= georadius; searchrect.miny -= georadius; searchrect.maxx += georadius; searchrect.maxy += georadius; im_width += 2 * interpParams.radius; im_height += 2 * interpParams.radius; } } else { searchrect.minx = searchrect.miny = 0; searchrect.maxx = map->width - 1; searchrect.maxy = map->height - 1; } layer->project = msProjectionsDiffer(&(layer->projection), &(map->projection)); if (layer->project) msProjectRect(&map->projection, &layer->projection, &searchrect); /* project the searchrect to source coords */ status = msLayerWhichShapes(layer, searchrect, MS_FALSE); /* nothing to do */ if (status == MS_SUCCESS) { /* at least one sample may have overlapped */ int nclasses = 0; int *classgroup = NULL; if (layer->classgroup && layer->numclasses > 0) classgroup = msAllocateValidClassGroups(layer, &nclasses); msInitShape(&shape); while ((status = msLayerNextShape(layer, &shape)) == MS_SUCCESS) { int l, p, s, c; double weight = 1.0; if (!values) { /* defer allocation until we effectively have a feature */ values = (float *)msSmallCalloc(((size_t)im_width) * im_height, sizeof(float)); xyz_values = (float *)msSmallCalloc(((size_t)im_width) * im_height, sizeof(float)); } if (layer->project) msProjectShape(&layer->projection, &map->projection, &shape); /* the weight for the sample is set to 1.0 by default. If the * layer has some classes defined, we will read the weight from * the class->style->size (which can be binded to an attribute) */ if (layer->numclasses > 0) { c = msShapeGetClass(layer, map, &shape, classgroup, nclasses); if ((c == -1) || (layer->class[c] -> status == MS_OFF)) { goto nextshape; /* no class matched, skip */ } for (s = 0; s < layer->class[c] -> numstyles; s++) { if (msScaleInBounds( map->scaledenom, layer->class[c] -> styles[s] -> minscaledenom, layer -> class[c] -> styles[s] -> maxscaledenom)) { if (layer->class[c] -> styles[s] -> bindings[MS_STYLE_BINDING_SIZE].index != -1) { weight = atof(shape.values[layer->class[c] -> styles[s] -> bindings[MS_STYLE_BINDING_SIZE].index]); } else { weight = layer->class[c]->styles[s]->size; } break; } } if (s == layer->class[c] -> numstyles) { /* no style in scale bounds */ goto nextshape; } } for (l = 0; l < shape.numlines; l++) { for (p = 0; p < shape.line[l].numpoints; p++) { int x = MS_MAP2IMAGE_XCELL_IC(shape.line[l].point[p].x, map->extent.minx - georadius, invcellsize); int y = MS_MAP2IMAGE_YCELL_IC(shape.line[l].point[p].y, map->extent.maxy + georadius, invcellsize); if (x >= 0 && y >= 0 && x < im_width && y < im_height) { float *value = values + y * im_width + x; (*value) += weight; xyz_values[length++] = x; xyz_values[length++] = y; xyz_values[length++] = (*value); } } } nextshape: msFreeShape(&shape); } msFree(classgroup); // number of layer points. npoints = length / 3; } else if (status != MS_DONE) { msLayerClose(layer); return MS_FAILURE; } /* status == MS_DONE */ msLayerClose(layer); status = MS_SUCCESS; if (npoints > 0 && interpParams.expand_searchrect) { iValues = msSmallMalloc(sizeof(unsigned char) * image->width * image->height); } else { iValues = msSmallCalloc(1, sizeof(unsigned char) * image->width * image->height); } if (npoints > 0) { /* no use applying the filtering kernel if we have no samples */ if (interpolation_layer->connectiontype == MS_KERNELDENSITY) { msKernelDensity(image, values, im_width, im_height, npoints, &interpParams, iValues); } else if (interpolation_layer->connectiontype == MS_IDW) { msIdw(xyz_values, image->width, image->height, npoints, &interpParams, iValues); } } free(values); free(xyz_values); GDALDriverH hMemDRV = GDALGetDriverByName("MEM"); if (!hMemDRV) { msSetError(MS_IOERR, "GDAL MEM driver not available", "msInterpolationDataset()"); free(iValues); return MS_FAILURE; } hDS = GDALCreate(hMemDRV, "", image->width, image->height, 0, 0, NULL); if (hDS == NULL) { msSetError(MS_IMGERR, "Unable to create GDAL Memory dataset.", "msInterpolationDataset()"); free(iValues); return MS_FAILURE; } char pointer[64]; memset(pointer, 0, sizeof(pointer)); CPLPrintPointer(pointer, iValues, sizeof(pointer)); char **papszOptions = CSLSetNameValue(NULL, "DATAPOINTER", pointer); CPLErr eErr = GDALAddBand(hDS, GDT_Byte, papszOptions); CSLDestroy(papszOptions); if (eErr != CE_None) { msSetError(MS_IMGERR, "Unable to add band to GDAL Memory dataset.", "msInterpolationDataset()"); free(iValues); GDALClose(hDS); return MS_FAILURE; } double adfGeoTransform[6]; adfGeoTransform[0] = map->extent.minx - map->cellsize * 0.5; /* top left x */ adfGeoTransform[1] = map->cellsize; /* w-e pixel resolution */ adfGeoTransform[2] = 0; /* 0 */ adfGeoTransform[3] = map->extent.maxy + map->cellsize * 0.5; /* top left y */ adfGeoTransform[4] = 0; /* 0 */ adfGeoTransform[5] = -map->cellsize; /* n-s pixel resolution (negative value) */ GDALSetGeoTransform(hDS, adfGeoTransform); *hDSvoid = hDS; *cleanup_ptr = (void *)iValues; return status; } int msCleanupInterpolationDataset(mapObj *map, imageObj *image, layerObj *layer, void *cleanup_ptr) { (void)map; (void)image; (void)layer; free(cleanup_ptr); return MS_SUCCESS; } mapserver-8.6.0/src/kerneldensity.c000066400000000000000000000130431511405061000173360ustar00rootroot00000000000000 /****************************************************************************** * * Project: MapServer * Purpose: KernelDensity layer implementation and related functions. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 2014 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include #include "gdal.h" static void gaussian_blur(float *values, int width, int height, int radius) { float *tmp = (float *)msSmallMalloc(sizeof(float) * width * height); int length = radius * 2 + 1; float *kernel = (float *)msSmallMalloc(length * sizeof(float)); float sigma = radius / 3.0; float a = 1.0 / sqrt(2.0 * M_PI * sigma * sigma); float den = 2.0 * sigma * sigma; int i, x, y; for (i = 0; i < length; i++) { float x = i - radius; float v = a * exp(-(x * x) / den); kernel[i] = v; } memset(tmp, 0, sizeof(float) * width * height); for (y = 0; y < height; y++) { float *src_row = values + width * y; float *dst_row = tmp + width * y; for (x = radius; x < width - radius; x++) { float accum = 0; for (i = 0; i < length; i++) { accum += src_row[x + i - radius] * kernel[i]; } dst_row[x] = accum; } } for (x = 0; x < width; x++) { float *src_col = tmp + x; float *dst_col = values + x; for (y = radius; y < height - radius; y++) { float accum = 0; for (i = 0; i < length; i++) { accum += src_col[width * (y + i - radius)] * kernel[i]; } dst_col[y * width] = accum; } } free(tmp); free(kernel); } void msKernelDensityProcessing(layerObj *layer, interpolationProcessingParams *interpParams) { const char *interpParamsProcessing = msLayerGetProcessingKey(layer, "KERNELDENSITY_RADIUS"); if (interpParamsProcessing) { interpParams->radius = atoi(interpParamsProcessing); } else { interpParams->radius = 10; } interpParamsProcessing = msLayerGetProcessingKey(layer, "KERNELDENSITY_COMPUTE_BORDERS"); if (interpParamsProcessing && strcasecmp(interpParamsProcessing, "OFF")) { interpParams->expand_searchrect = 1; } else { interpParams->expand_searchrect = 0; } interpParamsProcessing = msLayerGetProcessingKey(layer, "KERNELDENSITY_NORMALIZATION"); if (!interpParamsProcessing || !strcasecmp(interpParamsProcessing, "AUTO")) { interpParams->normalization_scale = 0.0; } else { interpParams->normalization_scale = atof(interpParamsProcessing); if (interpParams->normalization_scale != 0) { interpParams->normalization_scale = 1.0 / interpParams->normalization_scale; } else { interpParams->normalization_scale = 1.0; } } } void msKernelDensity(imageObj *image, float *values, int width, int height, int npoints, interpolationProcessingParams *interpParams, unsigned char *iValues) { int i, j; float valmax = FLT_MIN, valmin = FLT_MAX; int radius = interpParams->radius; float normalization_scale = interpParams->normalization_scale; int expand_searchrect = interpParams->expand_searchrect; gaussian_blur(values, width, height, radius); if (normalization_scale == 0.0) { /* auto normalization */ for (j = radius; j < height - radius; j++) { for (i = radius; i < width - radius; i++) { float val = values[j * width + i]; if (val > 0 && val > valmax) { valmax = val; } if (val > 0 && val < valmin) { valmin = val; } } } } else { valmin = 0; valmax = normalization_scale; } if (expand_searchrect) { for (j = 0; j < image->height; j++) { for (i = 0; i < image->width; i++) { float norm = (values[(j + radius) * width + i + radius] - valmin) / valmax; int v = 255 * norm; if (v < 0) v = 0; else if (v > 255) v = 255; iValues[j * image->width + i] = v; } } } else { if (npoints > 0) { for (j = radius; j < image->height - radius; j++) { for (i = radius; i < image->width - radius; i++) { float norm = (values[j * width + i] - valmin) / valmax; int v = 255 * norm; if (v < 0) v = 0; else if (v > 255) v = 255; iValues[j * image->width + i] = v; } } } } } mapserver-8.6.0/src/layerobject.c000066400000000000000000000141711511405061000167640ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Functions for operating on a layerObj that don't belong in a * more specific file such as mapfile.c. * Adapted from mapobject.c. * Author: Sean Gillies, sgillies@frii.com * ****************************************************************************** * Copyright (c) 2004, Sean Gillies * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" /* =========================================================================== msInsertClass Returns the index at which the class was inserted. ======================================================================== */ int msInsertClass(layerObj *layer, classObj *classobj, int nIndex) { int i; if (!classobj) { msSetError(MS_CHILDERR, "Cannot insert NULL class", "msInsertClass()"); return -1; } /* Ensure there is room for a new class */ if (msGrowLayerClasses(layer) == NULL) { return -1; } /* Catch attempt to insert past end of styles array */ else if (nIndex >= layer->numclasses) { msSetError(MS_CHILDERR, "Cannot insert class beyond index %d", "msInsertClass()", layer->numclasses - 1); return -1; } else if (nIndex < 0) { /* Insert at the end by default */ #ifndef __cplusplus layer->class[layer->numclasses] = classobj; #else layer->_class[layer->numclasses] = classobj; #endif /* set parent pointer */ classobj->layer = layer; MS_REFCNT_INCR(classobj); layer->numclasses++; return layer->numclasses - 1; } else { /* Copy classes existing at the specified nIndex or greater */ /* to an index one higher */ #ifndef __cplusplus for (i = layer->numclasses - 1; i >= nIndex; i--) layer->class[i + 1] = layer->class[i]; layer->class[nIndex] = classobj; #else for (i = layer->numclasses - 1; i >= nIndex; i--) layer->_class[i + 1] = layer->_class[i]; layer->_class[nIndex] = classobj; #endif /* set parent pointer */ classobj->layer = layer; MS_REFCNT_INCR(classobj); /* increment number of classes and return */ layer->numclasses++; return nIndex; } } /* =========================================================================== msRemoveClass remove the class at an index from a layer, returning a copy ======================================================================== */ classObj *msRemoveClass(layerObj *layer, int nIndex) { int i; classObj *classobj; if (nIndex < 0 || nIndex >= layer->numclasses) { msSetError(MS_CHILDERR, "Cannot remove class, invalid index %d", "removeClass()", nIndex); return NULL; } else { #ifndef __cplusplus classobj = layer->class[nIndex]; #else classobj = layer->_class[nIndex]; #endif classobj->layer = NULL; MS_REFCNT_DECR(classobj); /* Iteratively copy the higher index classes down one index */ for (i = nIndex; i < layer->numclasses - 1; i++) { #ifndef __cplusplus layer->class[i] = layer->class[i + 1]; #else layer->_class[i] = layer->_class[i + 1]; #endif } #ifndef __cplusplus layer->class[i] = NULL; #else layer->_class[i] = NULL; #endif /* decrement number of layers and return copy of removed layer */ layer->numclasses--; return classobj; } } /** * Move the class up inside the array of classes. */ int msMoveClassUp(layerObj *layer, int nClassIndex) { classObj *psTmpClass = NULL; if (layer && nClassIndex < layer->numclasses && nClassIndex > 0) { psTmpClass = layer->class[nClassIndex]; layer->class[nClassIndex] = layer->class[nClassIndex - 1]; layer->class[nClassIndex - 1] = psTmpClass; return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveClassUp()", nClassIndex); return (MS_FAILURE); } /** * Move the class down inside the array of classes. */ int msMoveClassDown(layerObj *layer, int nClassIndex) { classObj *psTmpClass = NULL; if (layer && nClassIndex < layer->numclasses - 1 && nClassIndex >= 0) { psTmpClass = layer->class[nClassIndex]; layer->class[nClassIndex] = layer->class[nClassIndex + 1]; layer->class[nClassIndex + 1] = psTmpClass; return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveClassDown()", nClassIndex); return (MS_FAILURE); } /** * Set the extent of a layer. */ int msLayerSetExtent(layerObj *layer, double minx, double miny, double maxx, double maxy) { layer->extent.minx = minx; layer->extent.miny = miny; layer->extent.maxx = maxx; layer->extent.maxy = maxy; if (minx == -1.0 && miny == -1.0 && maxx == -1.0 && maxy == -1.0) return (MS_SUCCESS); if (!MS_VALID_EXTENT(layer->extent)) { msSetError(MS_MISCERR, "Given layer extent is invalid. minx=%lf, miny=%lf, maxx=%lf, " "maxy=%lf.", "msLayerSetExtent()", layer->extent.minx, layer->extent.miny, layer->extent.maxx, layer->extent.maxy); return (MS_FAILURE); } return (MS_SUCCESS); } mapserver-8.6.0/src/mapagg.cpp000066400000000000000000001420601511405061000162540ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: AGG rendering and other AGG related functions. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2007 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include "fontcache.h" #include "mapagg.h" #include #include "renderers/agg/include/agg_color_rgba.h" #include "renderers/agg/include/agg_pixfmt_rgba.h" #include "renderers/agg/include/agg_renderer_base.h" #include "renderers/agg/include/agg_renderer_scanline.h" #include "renderers/agg/include/agg_math_stroke.h" #include "renderers/agg/include/agg_scanline_p.h" #include "renderers/agg/include/agg_scanline_u.h" #include "renderers/agg/include/agg_rasterizer_scanline_aa.h" #include "renderers/agg/include/agg_span_pattern_rgba.h" #include "renderers/agg/include/agg_span_allocator.h" #include "renderers/agg/include/agg_span_interpolator_linear.h" #include "renderers/agg/include/agg_pattern_filters_rgba.h" #include "renderers/agg/include/agg_image_accessors.h" #include "renderers/agg/include/agg_conv_stroke.h" #include "renderers/agg/include/agg_conv_dash.h" #include "renderers/agg/include/agg_font_freetype.h" #include "renderers/agg/include/agg_conv_contour.h" #include "renderers/agg/include/agg_ellipse.h" #include "renderers/agg/include/agg_gamma_functions.h" #include "renderers/agg/include/agg_blur.h" #include "renderers/agg/include/agg_rasterizer_outline_aa.h" #include "renderers/agg/include/agg_renderer_outline_aa.h" #include "renderers/agg/include/agg_renderer_outline_image.h" #include "renderers/agg/include/agg_span_pattern_rgba.h" #include "renderers/agg/include/agg_span_image_filter_rgba.h" #include "renderers/agg/include/agg_glyph_raster_bin.h" #include "renderers/agg/include/agg_renderer_raster_text.h" #include "renderers/agg/include/agg_path_storage_integer.h" #include "renderers/agg/include/agg_conv_clipper.h" #include "cpl_conv.h" // CPLGetConfigOption #include "cpl_string.h" // CPLTestBool #ifdef USE_PIXMAN #include #endif #include #include #include #include typedef mapserver::order_bgra band_order; #define AGG_LINESPACE 1.33 typedef mapserver::int8u band_type; typedef mapserver::rgba8 color_type; typedef mapserver::pixel32_type pixel_type; typedef mapserver::blender_rgba_pre blender_pre; typedef mapserver::comp_op_adaptor_rgba_pre compop_blender_pre; typedef mapserver::pixfmt_alpha_blend_rgba< blender_pre, mapserver::rendering_buffer, pixel_type> pixel_format; typedef mapserver::pixfmt_custom_blend_rgba compop_pixel_format; typedef mapserver::rendering_buffer rendering_buffer; typedef mapserver::renderer_base renderer_base; typedef mapserver::renderer_base compop_renderer_base; typedef mapserver::renderer_scanline_aa_solid renderer_scanline; typedef mapserver::renderer_scanline_bin_solid renderer_scanline_aliased; typedef mapserver::rasterizer_scanline_aa<> rasterizer_scanline; typedef mapserver::font_engine_freetype_int16 font_engine_type; typedef mapserver::font_cache_manager font_manager_type; typedef mapserver::conv_curve font_curve_type; typedef mapserver::glyph_raster_bin glyph_gen; static const color_type AGG_NO_COLOR = color_type(0, 0, 0, 0); #define aggColor(c) \ mapserver::rgba8_pre((c)->red, (c)->green, (c)->blue, (c)->alpha) class aggRendererCache { public: font_engine_type m_feng; font_manager_type m_fman; aggRendererCache() : m_fman(m_feng) {} }; class AGG2Renderer { public: std::vector buffer{}; rendering_buffer m_rendering_buffer; pixel_format m_pixel_format; compop_pixel_format m_compop_pixel_format; renderer_base m_renderer_base; compop_renderer_base m_compop_renderer_base; renderer_scanline m_renderer_scanline; renderer_scanline_aliased m_renderer_scanline_aliased; rasterizer_scanline m_rasterizer_aa; rasterizer_scanline m_rasterizer_aa_gamma; mapserver::scanline_p8 sl_poly; /*packed scanlines, works faster when the area is larger than the perimeter, in number of pixels*/ mapserver::scanline_u8 sl_line; /*unpacked scanlines, works faster if the area is roughly equal to the perimeter, in number of pixels*/ bool use_alpha = false; std::unique_ptr> stroke{}; std::unique_ptr> dash{}; std::unique_ptr>> stroke_dash{}; double default_gamma = 0.0; mapserver::gamma_linear gamma_function; }; #define AGG_RENDERER(image) ((AGG2Renderer *)(image)->img.plugin) template static void applyCJC(VertexSource &stroke, int caps, int joins) { switch (joins) { case MS_CJC_ROUND: stroke.line_join(mapserver::round_join); break; case MS_CJC_MITER: stroke.line_join(mapserver::miter_join); break; case MS_CJC_BEVEL: case MS_CJC_NONE: stroke.line_join(mapserver::bevel_join); break; } switch (caps) { case MS_CJC_BUTT: case MS_CJC_NONE: stroke.line_cap(mapserver::butt_cap); break; case MS_CJC_ROUND: stroke.line_cap(mapserver::round_cap); break; case MS_CJC_SQUARE: stroke.line_cap(mapserver::square_cap); break; } } int agg2RenderLine(imageObj *img, shapeObj *p, strokeStyleObj *style) { AGG2Renderer *r = AGG_RENDERER(img); line_adaptor lines = line_adaptor(p); r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); if (style->antialiased == MS_FALSE) { r->m_renderer_scanline_aliased.color(aggColor(style->color)); } else { r->m_renderer_scanline.color(aggColor(style->color)); } if (style->patternlength <= 0) { if (!r->stroke) { r->stroke.reset(new mapserver::conv_stroke(lines)); } else { r->stroke->attach(lines); } r->stroke->width(style->width); if (style->width > 1) { applyCJC(*r->stroke, style->linecap, style->linejoin); } else { r->stroke->inner_join(mapserver::inner_bevel); r->stroke->line_join(mapserver::bevel_join); } r->m_rasterizer_aa.add_path(*r->stroke); } else { if (!r->dash) { r->dash.reset(new mapserver::conv_dash(lines)); } else { r->dash->remove_all_dashes(); r->dash->dash_start(0.0); r->dash->attach(lines); } if (!r->stroke_dash) { r->stroke_dash.reset( new mapserver::conv_stroke>( *r->dash)); } else { r->stroke_dash->attach(*r->dash); } int patt_length = 0; for (int i = 0; i < style->patternlength; i += 2) { if (i < style->patternlength - 1) { r->dash->add_dash(MS_MAX(1, MS_NINT(style->pattern[i])), MS_MAX(1, MS_NINT(style->pattern[i + 1]))); if (style->patternoffset) { patt_length += MS_MAX(1, MS_NINT(style->pattern[i])) + MS_MAX(1, MS_NINT(style->pattern[i + 1])); } } } if (style->patternoffset > 0) { r->dash->dash_start(patt_length - style->patternoffset); } r->stroke_dash->width(style->width); if (style->width > 1) { applyCJC(*r->stroke_dash, style->linecap, style->linejoin); } else { r->stroke_dash->inner_join(mapserver::inner_bevel); r->stroke_dash->line_join(mapserver::bevel_join); } r->m_rasterizer_aa.add_path(*r->stroke_dash); } if (style->antialiased == MS_FALSE) mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_line, r->m_renderer_scanline_aliased); else mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_line, r->m_renderer_scanline); return MS_SUCCESS; } int agg2RenderLineTiled(imageObj *img, shapeObj *p, imageObj *tile) { mapserver::pattern_filter_bilinear_rgba8 fltr; typedef mapserver::line_image_pattern< mapserver::pattern_filter_bilinear_rgba8> pattern_type; typedef mapserver::renderer_outline_image renderer_img_type; typedef mapserver::rasterizer_outline_aa rasterizer_img_type; pattern_type patt(fltr); AGG2Renderer *r = AGG_RENDERER(img); AGG2Renderer *tileRenderer = AGG_RENDERER(tile); line_adaptor lines(p); patt.create(tileRenderer->m_pixel_format); renderer_img_type ren_img(r->m_renderer_base, patt); rasterizer_img_type ras_img(ren_img); ras_img.add_path(lines); return MS_SUCCESS; } int agg2RenderPolygon(imageObj *img, shapeObj *p, colorObj *color) { AGG2Renderer *r = AGG_RENDERER(img); polygon_adaptor polygons(p); r->m_rasterizer_aa_gamma.reset(); r->m_rasterizer_aa_gamma.filling_rule(mapserver::fill_even_odd); r->m_rasterizer_aa_gamma.add_path(polygons); r->m_renderer_scanline.color(aggColor(color)); mapserver::render_scanlines(r->m_rasterizer_aa_gamma, r->sl_poly, r->m_renderer_scanline); return MS_SUCCESS; } static inline double int26p6_to_dbl(int p) { return double(p) / 64.0; } template bool decompose_ft_outline(const FT_Outline &outline, bool flip_y, const mapserver::trans_affine &mtx, PathStorage &path) { double x1, y1, x2, y2, x3, y3; FT_Vector *point; FT_Vector *limit; unsigned n; // index of contour in outline unsigned first; // index of first point in contour char tag; // current point's state first = 0; for (n = 0; n < (unsigned)outline.n_contours; n++) { int last; // index of last point in contour last = outline.contours[n]; limit = outline.points + last; FT_Vector v_start = outline.points[first]; FT_Vector v_control = v_start; point = outline.points + first; auto tags = outline.tags + first; tag = FT_CURVE_TAG(tags[0]); // A contour cannot start with a cubic control point! if (tag == FT_CURVE_TAG_CUBIC) return false; // check first point to determine origin if (tag == FT_CURVE_TAG_CONIC) { const FT_Vector v_last = outline.points[last]; // first point is conic control. Yes, this happens. if (FT_CURVE_TAG(outline.tags[last]) == FT_CURVE_TAG_ON) { // start at last point if it is on the curve v_start = v_last; limit--; } else { // if both first and last points are conic, // start at their middle and record its position // for closure v_start.x = (v_start.x + v_last.x) / 2; v_start.y = (v_start.y + v_last.y) / 2; } point--; tags--; } x1 = int26p6_to_dbl(v_start.x); y1 = int26p6_to_dbl(v_start.y); if (flip_y) y1 = -y1; mtx.transform(&x1, &y1); path.move_to(x1, y1); while (point < limit) { point++; tags++; tag = FT_CURVE_TAG(tags[0]); switch (tag) { case FT_CURVE_TAG_ON: // emit a single line_to { x1 = int26p6_to_dbl(point->x); y1 = int26p6_to_dbl(point->y); if (flip_y) y1 = -y1; mtx.transform(&x1, &y1); path.line_to(x1, y1); // path.line_to(conv(point->x), flip_y ? -conv(point->y) : // conv(point->y)); continue; } case FT_CURVE_TAG_CONIC: // consume conic arcs { v_control.x = point->x; v_control.y = point->y; Do_Conic: if (point < limit) { FT_Vector vec; FT_Vector v_middle; point++; tags++; tag = FT_CURVE_TAG(tags[0]); vec.x = point->x; vec.y = point->y; if (tag == FT_CURVE_TAG_ON) { x1 = int26p6_to_dbl(v_control.x); y1 = int26p6_to_dbl(v_control.y); x2 = int26p6_to_dbl(vec.x); y2 = int26p6_to_dbl(vec.y); if (flip_y) { y1 = -y1; y2 = -y2; } mtx.transform(&x1, &y1); mtx.transform(&x2, &y2); path.curve3(x1, y1, x2, y2); continue; } if (tag != FT_CURVE_TAG_CONIC) return false; v_middle.x = (v_control.x + vec.x) / 2; v_middle.y = (v_control.y + vec.y) / 2; x1 = int26p6_to_dbl(v_control.x); y1 = int26p6_to_dbl(v_control.y); x2 = int26p6_to_dbl(v_middle.x); y2 = int26p6_to_dbl(v_middle.y); if (flip_y) { y1 = -y1; y2 = -y2; } mtx.transform(&x1, &y1); mtx.transform(&x2, &y2); path.curve3(x1, y1, x2, y2); // path.curve3(conv(v_control.x), // flip_y ? -conv(v_control.y) : conv(v_control.y), // conv(v_middle.x), // flip_y ? -conv(v_middle.y) : conv(v_middle.y)); v_control = vec; goto Do_Conic; } x1 = int26p6_to_dbl(v_control.x); y1 = int26p6_to_dbl(v_control.y); x2 = int26p6_to_dbl(v_start.x); y2 = int26p6_to_dbl(v_start.y); if (flip_y) { y1 = -y1; y2 = -y2; } mtx.transform(&x1, &y1); mtx.transform(&x2, &y2); path.curve3(x1, y1, x2, y2); // path.curve3(conv(v_control.x), // flip_y ? -conv(v_control.y) : conv(v_control.y), // conv(v_start.x), // flip_y ? -conv(v_start.y) : conv(v_start.y)); goto Close; } default: // FT_CURVE_TAG_CUBIC { FT_Vector vec1, vec2; if (point + 1 > limit || FT_CURVE_TAG(tags[1]) != FT_CURVE_TAG_CUBIC) { return false; } vec1.x = point[0].x; vec1.y = point[0].y; vec2.x = point[1].x; vec2.y = point[1].y; point += 2; tags += 2; if (point <= limit) { FT_Vector vec; vec.x = point->x; vec.y = point->y; x1 = int26p6_to_dbl(vec1.x); y1 = int26p6_to_dbl(vec1.y); x2 = int26p6_to_dbl(vec2.x); y2 = int26p6_to_dbl(vec2.y); x3 = int26p6_to_dbl(vec.x); y3 = int26p6_to_dbl(vec.y); if (flip_y) { y1 = -y1; y2 = -y2; y3 = -y3; } mtx.transform(&x1, &y1); mtx.transform(&x2, &y2); mtx.transform(&x3, &y3); path.curve4(x1, y1, x2, y2, x3, y3); // path.curve4(conv(vec1.x), // flip_y ? -conv(vec1.y) : conv(vec1.y), // conv(vec2.x), // flip_y ? -conv(vec2.y) : conv(vec2.y), // conv(vec.x), // flip_y ? -conv(vec.y) : conv(vec.y)); continue; } x1 = int26p6_to_dbl(vec1.x); y1 = int26p6_to_dbl(vec1.y); x2 = int26p6_to_dbl(vec2.x); y2 = int26p6_to_dbl(vec2.y); x3 = int26p6_to_dbl(v_start.x); y3 = int26p6_to_dbl(v_start.y); if (flip_y) { y1 = -y1; y2 = -y2; y3 = -y3; } mtx.transform(&x1, &y1); mtx.transform(&x2, &y2); mtx.transform(&x3, &y3); path.curve4(x1, y1, x2, y2, x3, y3); // path.curve4(conv(vec1.x), // flip_y ? -conv(vec1.y) : conv(vec1.y), // conv(vec2.x), // flip_y ? -conv(vec2.y) : conv(vec2.y), // conv(v_start.x), // flip_y ? -conv(v_start.y) : conv(v_start.y)); goto Close; } } } path.close_polygon(); Close: first = last + 1; } return true; } int agg2RenderPolygonTiled(imageObj *img, shapeObj *p, imageObj *tile) { assert(img->format->renderer == tile->format->renderer); AGG2Renderer *r = AGG_RENDERER(img); AGG2Renderer *tileRenderer = AGG_RENDERER(tile); polygon_adaptor polygons(p); typedef mapserver::wrap_mode_repeat wrap_type; typedef mapserver::image_accessor_wrap img_source_type; typedef mapserver::span_pattern_rgba span_gen_type; mapserver::span_allocator sa; r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_even_odd); img_source_type img_src(tileRenderer->m_pixel_format); span_gen_type sg(img_src, 0, 0); r->m_rasterizer_aa.add_path(polygons); mapserver::render_scanlines_aa(r->m_rasterizer_aa, r->sl_poly, r->m_renderer_base, sa, sg); return MS_SUCCESS; } int agg2RenderGlyphsPath(imageObj *img, const textSymbolObj *ts, colorObj *c, colorObj *oc, int ow, int /*isMarker*/) { const textPathObj *tp = ts->textpath; mapserver::path_storage glyphs; mapserver::trans_affine trans; AGG2Renderer *r = AGG_RENDERER(img); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); for (int i = 0; i < tp->numglyphs; i++) { glyphObj *gl = tp->glyphs + i; trans.reset(); trans.rotate(-gl->rot); trans.translate(gl->pnt.x, gl->pnt.y); outline_element *ol = msGetGlyphOutline(gl->face, gl->glyph); if (!ol) { return MS_FAILURE; } decompose_ft_outline(ol->outline, true, trans, glyphs); } mapserver::conv_curve m_curves(glyphs); if (oc) { r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); mapserver::conv_contour> cc( m_curves); cc.width(ow + 1); r->m_rasterizer_aa.add_path(cc); r->m_renderer_scanline.color(aggColor(oc)); mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_line, r->m_renderer_scanline); } if (c) { r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); r->m_rasterizer_aa.add_path(m_curves); r->m_renderer_scanline.color(aggColor(c)); mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_line, r->m_renderer_scanline); } return MS_SUCCESS; } mapserver::path_storage imageVectorSymbol(symbolObj *symbol) { mapserver::path_storage path; int is_new = 1; for (int i = 0; i < symbol->numpoints; i++) { if ((symbol->points[i].x == -99) && (symbol->points[i].y == -99)) is_new = 1; else { if (is_new) { path.move_to(symbol->points[i].x, symbol->points[i].y); is_new = 0; } else { path.line_to(symbol->points[i].x, symbol->points[i].y); } } } return path; } int agg2RenderVectorSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { AGG2Renderer *r = AGG_RENDERER(img); double ox = symbol->sizex * 0.5; double oy = symbol->sizey * 0.5; mapserver::path_storage path = imageVectorSymbol(symbol); mapserver::trans_affine mtx; mtx *= mapserver::trans_affine_translation(-ox, -oy); mtx *= mapserver::trans_affine_scaling(style->scale); mtx *= mapserver::trans_affine_rotation(-style->rotation); mtx *= mapserver::trans_affine_translation(x, y); path.transform(mtx); if (style->color) { r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_even_odd); r->m_rasterizer_aa.add_path(path); r->m_renderer_scanline.color(aggColor(style->color)); mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_poly, r->m_renderer_scanline); } if (style->outlinecolor) { r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); r->m_renderer_scanline.color(aggColor(style->outlinecolor)); mapserver::conv_stroke stroke(path); stroke.width(style->outlinewidth); r->m_rasterizer_aa.add_path(stroke); mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_poly, r->m_renderer_scanline); } return MS_SUCCESS; } int agg2RenderPixmapSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { AGG2Renderer *r = AGG_RENDERER(img); rasterBufferObj *pixmap = symbol->pixmap_buffer; assert(pixmap->type == MS_BUFFER_BYTE_RGBA); rendering_buffer b(pixmap->data.rgba.pixels, pixmap->width, pixmap->height, pixmap->data.rgba.row_step); pixel_format pf(b); r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); if ((style->rotation != 0 && style->rotation != MS_PI * 2.) || style->scale != 1) { mapserver::trans_affine image_mtx; image_mtx *= mapserver::trans_affine_translation(-(pf.width() / 2.), -(pf.height() / 2.)); /*agg angles are antitrigonometric*/ image_mtx *= mapserver::trans_affine_rotation(-style->rotation); image_mtx *= mapserver::trans_affine_scaling(style->scale); image_mtx *= mapserver::trans_affine_translation(x, y); image_mtx.invert(); typedef mapserver::span_interpolator_linear<> interpolator_type; interpolator_type interpolator(image_mtx); mapserver::span_allocator sa; // "hardcoded" bilinear filter //------------------------------------------ typedef mapserver::span_image_filter_rgba_bilinear_clip span_gen_type; span_gen_type sg(pf, mapserver::rgba(0, 0, 0, 0), interpolator); mapserver::path_storage pixmap_bbox; int ims_2 = MS_NINT(MS_MAX(pixmap->width, pixmap->height) * style->scale * 1.415) / 2 + 1; pixmap_bbox.move_to(x - ims_2, y - ims_2); pixmap_bbox.line_to(x + ims_2, y - ims_2); pixmap_bbox.line_to(x + ims_2, y + ims_2); pixmap_bbox.line_to(x - ims_2, y + ims_2); r->m_rasterizer_aa.add_path(pixmap_bbox); mapserver::render_scanlines_aa(r->m_rasterizer_aa, r->sl_poly, r->m_renderer_base, sa, sg); } else { // just copy the image at the correct location (we place the pixmap on // the nearest integer pixel to avoid blurring) unsigned alpha = mapserver::cover_full; if (style && style->color) { alpha = style->color->alpha; } r->m_renderer_base.blend_from(pf, 0, MS_NINT(x - pixmap->width / 2.), MS_NINT(y - pixmap->height / 2.), alpha); } return MS_SUCCESS; } int agg2RenderEllipseSymbol(imageObj *image, double x, double y, symbolObj *symbol, symbolStyleObj *style) { AGG2Renderer *r = AGG_RENDERER(image); mapserver::path_storage path; mapserver::ellipse ellipse(x, y, symbol->sizex * style->scale / 2, symbol->sizey * style->scale / 2); path.concat_path(ellipse); if (style->rotation != 0) { mapserver::trans_affine mtx; mtx *= mapserver::trans_affine_translation(-x, -y); /*agg angles are antitrigonometric*/ mtx *= mapserver::trans_affine_rotation(-style->rotation); mtx *= mapserver::trans_affine_translation(x, y); path.transform(mtx); } if (style->color) { r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_even_odd); r->m_rasterizer_aa.add_path(path); r->m_renderer_scanline.color(aggColor(style->color)); mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_line, r->m_renderer_scanline); } if (style->outlinewidth) { r->m_rasterizer_aa.reset(); r->m_rasterizer_aa.filling_rule(mapserver::fill_non_zero); mapserver::conv_stroke stroke(path); stroke.width(style->outlinewidth); r->m_rasterizer_aa.add_path(stroke); r->m_renderer_scanline.color(aggColor(style->outlinecolor)); mapserver::render_scanlines(r->m_rasterizer_aa, r->sl_poly, r->m_renderer_scanline); } return MS_SUCCESS; } int agg2RenderTile(imageObj * /*img*/, imageObj * /*tile*/, double /*x*/, double /*y*/) { /* AGG2Renderer *imgRenderer = agg2GetRenderer(img); AGG2Renderer *tileRenderer = agg2GetRenderer(tile); */ return MS_FAILURE; } int aggInitializeRasterBuffer(rasterBufferObj *rb, int width, int height, int mode) { rb->type = MS_BUFFER_BYTE_RGBA; rb->data.rgba.pixel_step = 4; rb->data.rgba.row_step = rb->data.rgba.pixel_step * width; rb->width = width; rb->height = height; int nBytes = rb->data.rgba.row_step * height; rb->data.rgba.pixels = (band_type *)msSmallCalloc(nBytes, sizeof(band_type)); rb->data.rgba.r = &(rb->data.rgba.pixels[band_order::R]); rb->data.rgba.g = &(rb->data.rgba.pixels[band_order::G]); rb->data.rgba.b = &(rb->data.rgba.pixels[band_order::B]); if (mode == MS_IMAGEMODE_RGBA) { rb->data.rgba.a = &(rb->data.rgba.pixels[band_order::A]); } return MS_SUCCESS; } int aggGetRasterBufferHandle(imageObj *img, rasterBufferObj *rb) { AGG2Renderer *r = AGG_RENDERER(img); rb->type = MS_BUFFER_BYTE_RGBA; rb->data.rgba.pixels = r->buffer.data(); rb->data.rgba.row_step = r->m_rendering_buffer.stride(); rb->data.rgba.pixel_step = 4; rb->width = r->m_rendering_buffer.width(); rb->height = r->m_rendering_buffer.height(); rb->data.rgba.r = &(r->buffer[band_order::R]); rb->data.rgba.g = &(r->buffer[band_order::G]); rb->data.rgba.b = &(r->buffer[band_order::B]); if (r->use_alpha) rb->data.rgba.a = &(r->buffer[band_order::A]); else rb->data.rgba.a = NULL; return MS_SUCCESS; } int aggGetRasterBufferCopy(imageObj *img, rasterBufferObj *rb) { AGG2Renderer *r = AGG_RENDERER(img); aggInitializeRasterBuffer(rb, img->width, img->height, MS_IMAGEMODE_RGBA); int nBytes = r->m_rendering_buffer.stride() * r->m_rendering_buffer.height(); memcpy(rb->data.rgba.pixels, r->buffer.data(), nBytes); return MS_SUCCESS; } int agg2MergeRasterBuffer(imageObj *dest, rasterBufferObj *overlay, double opacity, int srcX, int srcY, int dstX, int dstY, int width, int height) { assert(overlay->type == MS_BUFFER_BYTE_RGBA); rendering_buffer b(overlay->data.rgba.pixels, overlay->width, overlay->height, overlay->data.rgba.row_step); pixel_format pf(b); AGG2Renderer *r = AGG_RENDERER(dest); mapserver::rect_base src_rect(srcX, srcY, srcX + width, srcY + height); r->m_renderer_base.blend_from(pf, &src_rect, dstX - srcX, dstY - srcY, unsigned(opacity * 255)); return MS_SUCCESS; } /* image i/o */ imageObj *agg2CreateImage(int width, int height, outputFormatObj *format, colorObj *bg) { imageObj *image = NULL; if (format->imagemode != MS_IMAGEMODE_RGB && format->imagemode != MS_IMAGEMODE_RGBA) { msSetError(MS_MISCERR, "AGG2 driver only supports RGB or RGBA pixel models.", "agg2CreateImage()"); return image; } if (width > 0 && height > 0) { image = (imageObj *)calloc(1, sizeof(imageObj)); MS_CHECK_ALLOC(image, sizeof(imageObj), NULL); AGG2Renderer *r = new AGG2Renderer(); /* Compute size on 64bit and check that it is compatible of the platform * size_t */ const AGG_INT64U bufSize64 = (AGG_INT64U)width * height * 4 * sizeof(band_type); if (bufSize64 > std::numeric_limits::max() / 2) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating " AGG_INT64U_FRMT " bytes.\n", "agg2CreateImage()", __FILE__, __LINE__, bufSize64); free(image); delete r; return NULL; } const size_t bufSize = (size_t)bufSize64; try { r->buffer.resize(bufSize / sizeof(band_type)); } catch (const std::bad_alloc &) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating " AGG_INT64U_FRMT " bytes.\n", "agg2CreateImage()", __FILE__, __LINE__, bufSize64); free(image); delete r; return NULL; } r->m_rendering_buffer.attach(r->buffer.data(), width, height, width * 4); r->m_pixel_format.attach(r->m_rendering_buffer); r->m_compop_pixel_format.attach(r->m_rendering_buffer); r->m_renderer_base.attach(r->m_pixel_format); r->m_compop_renderer_base.attach(r->m_compop_pixel_format); r->m_renderer_scanline.attach(r->m_renderer_base); r->m_renderer_scanline_aliased.attach(r->m_renderer_base); r->default_gamma = atof(msGetOutputFormatOption(format, "GAMMA", "0.75")); if (r->default_gamma <= 0.0 || r->default_gamma >= 1.0) { r->default_gamma = 0.75; } r->gamma_function.set(0, r->default_gamma); r->m_rasterizer_aa_gamma.gamma(r->gamma_function); if (bg && !format->transparent) r->m_renderer_base.clear(aggColor(bg)); else r->m_renderer_base.clear(AGG_NO_COLOR); if (!bg || format->transparent || format->imagemode == MS_IMAGEMODE_RGBA) { r->use_alpha = true; } else { r->use_alpha = false; } image->img.plugin = (void *)r; } else { msSetError(MS_RENDERERERR, "Cannot create cairo image of size %dx%d.", "msImageCreateCairo()", width, height); } return image; } int agg2SaveImage(imageObj * /*img*/, mapObj * /*map*/, FILE * /*fp*/, outputFormatObj * /*format*/) { return MS_FAILURE; } int agg2StartNewLayer(imageObj *img, mapObj * /*map*/, layerObj *layer) { AGG2Renderer *r = AGG_RENDERER(img); const char *sgamma = msLayerGetProcessingKey(layer, "GAMMA"); double gamma; if (sgamma) { gamma = atof(sgamma); if (gamma <= 0 || gamma >= 1) gamma = 0.75; } else { gamma = r->default_gamma; } if (r->gamma_function.end() != gamma) { r->gamma_function.end(gamma); r->m_rasterizer_aa_gamma.gamma(r->gamma_function); } return MS_SUCCESS; } int agg2CloseNewLayer(imageObj * /*img*/, mapObj * /*map*/, layerObj * /*layer*/) { return MS_SUCCESS; } int agg2FreeImage(imageObj *image) { AGG2Renderer *r = AGG_RENDERER(image); delete r; image->img.plugin = NULL; return MS_SUCCESS; } int agg2FreeSymbol(symbolObj * /*symbol*/) { return MS_SUCCESS; } int agg2InitCache(void **vcache) { aggRendererCache *cache = new aggRendererCache(); *vcache = (void *)cache; return MS_SUCCESS; } int agg2Cleanup(void *vcache) { aggRendererCache *cache = (aggRendererCache *)vcache; delete cache; return MS_SUCCESS; } // ------------------------------------------------------------------------ // Function to create a custom hatch symbol based on an arbitrary angle. // ------------------------------------------------------------------------ static mapserver::path_storage createHatch(double ox, double oy, double rx, double ry, int sx, int sy, double angle, double step) { mapserver::path_storage path; // restrict the angle to [0 180[, i.e ]-pi/2,pi/2] in radians angle = fmod(angle, 360.0); if (angle < 0) angle += 360; if (angle >= 180) angle -= 180; // treat 2 easy cases which would cause divide by 0 in generic case if (angle == 0) { double y0 = step - fmod(oy - ry, step); if ((oy - ry) < 0) { y0 -= step; } for (double y = y0; y < sy; y += step) { path.move_to(0, y); path.line_to(sx, y); } return path; } if (angle == 90) { double x0 = step - fmod(ox - rx, step); if ((ox - rx) < 0) { x0 -= step; } for (double x = x0; x < sx; x += step) { path.move_to(x, 0); path.line_to(x, sy); } return path; } double theta = (90 - angle) * MS_DEG_TO_RAD; /* theta in ]-pi/2 , pi/2] */ double ct = cos(theta); double st = sin(theta); double invct = 1.0 / ct; double invst = 1.0 / st; double r0; /* distance from first hatch line to the top-left (if angle in 0,pi/2) or bottom-left (if angle in -pi/2,0) corner of the hatch bbox */ double rmax = sqrt(( double)(sx * sx + sy * sy)); /* distance to the furthest hatch we will have to create TODO: this could be optimized for bounding boxes where width is very different than height for certain hatch angles */ double rref = rx * ct + ry * st; /* distance to the line passing through the refpoint, origin is (0,0) of the imageObj */ double rcorner; /* distance to the line passing through the topleft or bottomleft corner of the hatch bbox (origin is (0,0) of imageObj) */ /* calculate the distance from the refpoint to the top right of the path */ if (angle < 90) { rcorner = ox * ct + oy * st; r0 = step - fmod(rcorner - rref, step); if (rcorner - rref < 0) r0 -= step; } else { rcorner = ox * ct + (oy + sy) * st; r0 = step - fmod(rcorner - rref, step); if (rcorner - rref < 0) r0 -= step; st = -st; invst = -invst; } // parametrize each line as r = x.cos(theta) + y.sin(theta) for (double r = r0; r < rmax; r += step) { int inter = 0; double x, y; double pt[4]; // array to store the coordinates of intersection of the line // with the sides // in the general case there will only be two intersections // so pt[4] should be sufficient to store the coordinates of the // intersection, but we allocate pt[8] to treat the special and // rare/unfortunate case when the line is a perfect diagonal (and therefore // intersects all four sides) note that the order for testing is important // in this case so that the first two intersection points actually // correspond to the diagonal and not a degenerate line // test for intersection with each side y = r * invst; x = 0; // test for intersection with left of image if (y >= 0 && y <= sy) { pt[2 * inter] = x; pt[2 * inter + 1] = y; inter++; } x = sx; y = (r - sx * ct) * invst; // test for intersection with right of image if (y >= 0 && y <= sy) { pt[2 * inter] = x; pt[2 * inter + 1] = y; inter++; } if (inter < 2) { y = 0; x = r * invct; // test for intersection with top of image if (x >= 0 && x <= sx) { pt[2 * inter] = x; pt[2 * inter + 1] = y; inter++; } } if (inter < 2) { y = sy; x = (r - sy * st) * invct; // test for intersection with bottom of image if (x >= 0 && x <= sx) { pt[2 * inter] = x; pt[2 * inter + 1] = y; inter++; } } if (inter == 2 && (pt[0] != pt[2] || pt[1] != pt[3])) { // the line intersects with two sides of the image, it should therefore be // drawn if (angle < 90) { path.move_to(pt[0], pt[1]); path.line_to(pt[2], pt[3]); } else { path.move_to(pt[0], sy - pt[1]); path.line_to(pt[2], sy - pt[3]); } } } return path; } template int renderPolygonHatches(imageObj *img, VertexSource &clipper, colorObj *color) { if (img->format->renderer == MS_RENDER_WITH_AGG) { AGG2Renderer *r = AGG_RENDERER(img); r->m_rasterizer_aa_gamma.reset(); r->m_rasterizer_aa_gamma.filling_rule(mapserver::fill_non_zero); r->m_rasterizer_aa_gamma.add_path(clipper); r->m_renderer_scanline.color(aggColor(color)); mapserver::render_scanlines(r->m_rasterizer_aa_gamma, r->sl_poly, r->m_renderer_scanline); } else { shapeObj shape; msInitShape(&shape); int allocated = 20; lineObj line; shape.line = &line; shape.numlines = 1; shape.line[0].point = (pointObj *)msSmallCalloc(allocated, sizeof(pointObj)); shape.line[0].numpoints = 0; double x = 0, y = 0; unsigned int cmd; clipper.rewind(0); while ((cmd = clipper.vertex(&x, &y)) != mapserver::path_cmd_stop) { switch (cmd) { case mapserver::path_cmd_line_to: if (shape.line[0].numpoints == allocated) { allocated *= 2; shape.line[0].point = (pointObj *)msSmallRealloc( shape.line[0].point, allocated * sizeof(pointObj)); } shape.line[0].point[shape.line[0].numpoints].x = x; shape.line[0].point[shape.line[0].numpoints].y = y; shape.line[0].numpoints++; break; case mapserver::path_cmd_move_to: shape.line[0].point[0].x = x; shape.line[0].point[0].y = y; shape.line[0].numpoints = 1; break; case mapserver::path_cmd_end_poly | mapserver::path_flags_close: if (shape.line[0].numpoints > 2) { if (MS_UNLIKELY(MS_FAILURE == MS_IMAGE_RENDERER(img)->renderPolygon( img, &shape, color))) { free(shape.line[0].point); shape.numlines = 0; shape.line = nullptr; return MS_FAILURE; } } break; default: assert(0); // WTF? } } free(shape.line[0].point); shape.numlines = 0; shape.line = nullptr; } return MS_SUCCESS; } int msHatchPolygon(imageObj *img, shapeObj *poly, double spacing, double width, double *pattern, int patternlength, double angle, colorObj *color) { assert(MS_RENDERER_PLUGIN(img->format)); msComputeBounds(poly); /* amount we should expand the bounding box by */ double exp = width * 0.7072; /* width and height of the bounding box we will be creating the hatch in */ int pw = (int)(poly->bounds.maxx - poly->bounds.minx + exp * 2) + 1; int ph = (int)(poly->bounds.maxy - poly->bounds.miny + exp * 2) + 1; /* position of the top-left corner of the bounding box */ double ox = poly->bounds.minx - exp; double oy = poly->bounds.miny - exp; // create a rectangular hatch of size pw,ph starting at 0,0 // the created hatch is of the size of the shape's bounding box mapserver::path_storage hatch = createHatch(ox, oy, img->refpt.x, img->refpt.y, pw, ph, angle, spacing); if (hatch.total_vertices() <= 0) return MS_SUCCESS; // translate the hatch so it overlaps the current shape hatch.transform(mapserver::trans_affine_translation(ox, oy)); polygon_adaptor polygons(poly); if (patternlength > 1) { // dash the color-hatch and render it clipped by the shape mapserver::conv_dash dash(hatch); mapserver::conv_stroke> stroke(dash); for (int i = 0; i < patternlength; i += 2) { if (i < patternlength - 1) { dash.add_dash(pattern[i], pattern[i + 1]); } } stroke.width(width); stroke.line_cap(mapserver::butt_cap); mapserver::conv_clipper< polygon_adaptor, mapserver::conv_stroke>> clipper(polygons, stroke, mapserver::clipper_and); renderPolygonHatches(img, clipper, color); } else { // render the hatch clipped by the shape mapserver::conv_stroke stroke(hatch); stroke.width(width); stroke.line_cap(mapserver::butt_cap); mapserver::conv_clipper> clipper(polygons, stroke, mapserver::clipper_and); renderPolygonHatches(img, clipper, color); } // assert(prevCmd == mapserver::path_cmd_line_to); // delete lines; return MS_SUCCESS; } #ifdef USE_PIXMAN static pixman_op_t ms2pixman_compop(CompositingOperation c) { switch (c) { case MS_COMPOP_CLEAR: return PIXMAN_OP_CLEAR; case MS_COMPOP_SRC: return PIXMAN_OP_SRC; case MS_COMPOP_DST: return PIXMAN_OP_DST; case MS_COMPOP_SRC_OVER: return PIXMAN_OP_OVER; case MS_COMPOP_DST_OVER: return PIXMAN_OP_OVER_REVERSE; case MS_COMPOP_SRC_IN: return PIXMAN_OP_IN; case MS_COMPOP_DST_IN: return PIXMAN_OP_IN_REVERSE; case MS_COMPOP_SRC_OUT: return PIXMAN_OP_OUT; case MS_COMPOP_DST_OUT: return PIXMAN_OP_OUT_REVERSE; case MS_COMPOP_SRC_ATOP: return PIXMAN_OP_ATOP; case MS_COMPOP_DST_ATOP: return PIXMAN_OP_ATOP_REVERSE; case MS_COMPOP_XOR: return PIXMAN_OP_XOR; case MS_COMPOP_PLUS: return PIXMAN_OP_ADD; case MS_COMPOP_MULTIPLY: return PIXMAN_OP_MULTIPLY; case MS_COMPOP_SCREEN: return PIXMAN_OP_SCREEN; case MS_COMPOP_OVERLAY: return PIXMAN_OP_OVERLAY; case MS_COMPOP_DARKEN: return PIXMAN_OP_DARKEN; case MS_COMPOP_LIGHTEN: return PIXMAN_OP_LIGHTEN; case MS_COMPOP_COLOR_DODGE: return PIXMAN_OP_COLOR_DODGE; case MS_COMPOP_COLOR_BURN: return PIXMAN_OP_COLOR_DODGE; case MS_COMPOP_HARD_LIGHT: return PIXMAN_OP_HARD_LIGHT; case MS_COMPOP_SOFT_LIGHT: return PIXMAN_OP_SOFT_LIGHT; case MS_COMPOP_DIFFERENCE: return PIXMAN_OP_DIFFERENCE; case MS_COMPOP_EXCLUSION: return PIXMAN_OP_EXCLUSION; case MS_COMPOP_HSL_HUE: return PIXMAN_OP_HSL_HUE; case MS_COMPOP_HSL_LUMINOSITY: return PIXMAN_OP_HSL_LUMINOSITY; case MS_COMPOP_HSL_SATURATION: return PIXMAN_OP_HSL_SATURATION; case MS_COMPOP_HSL_COLOR: return PIXMAN_OP_HSL_COLOR; case MS_COMPOP_INVERT: case MS_COMPOP_INVERT_RGB: case MS_COMPOP_MINUS: case MS_COMPOP_CONTRAST: default: return PIXMAN_OP_OVER; } } #endif static mapserver::comp_op_e ms2agg_compop(CompositingOperation c) { switch (c) { case MS_COMPOP_CLEAR: return mapserver::comp_op_clear; case MS_COMPOP_SRC: return mapserver::comp_op_src; case MS_COMPOP_DST: return mapserver::comp_op_dst; case MS_COMPOP_SRC_OVER: return mapserver::comp_op_src_over; case MS_COMPOP_DST_OVER: return mapserver::comp_op_dst_over; case MS_COMPOP_SRC_IN: return mapserver::comp_op_src_in; case MS_COMPOP_DST_IN: return mapserver::comp_op_dst_in; case MS_COMPOP_SRC_OUT: return mapserver::comp_op_src_out; case MS_COMPOP_DST_OUT: return mapserver::comp_op_dst_out; case MS_COMPOP_SRC_ATOP: return mapserver::comp_op_src_atop; case MS_COMPOP_DST_ATOP: return mapserver::comp_op_dst_atop; case MS_COMPOP_XOR: return mapserver::comp_op_xor; case MS_COMPOP_PLUS: return mapserver::comp_op_plus; case MS_COMPOP_MINUS: return mapserver::comp_op_minus; case MS_COMPOP_MULTIPLY: return mapserver::comp_op_multiply; case MS_COMPOP_SCREEN: return mapserver::comp_op_screen; case MS_COMPOP_OVERLAY: return mapserver::comp_op_overlay; case MS_COMPOP_DARKEN: return mapserver::comp_op_darken; case MS_COMPOP_LIGHTEN: return mapserver::comp_op_lighten; case MS_COMPOP_COLOR_DODGE: return mapserver::comp_op_color_dodge; case MS_COMPOP_COLOR_BURN: return mapserver::comp_op_color_burn; case MS_COMPOP_HARD_LIGHT: return mapserver::comp_op_hard_light; case MS_COMPOP_SOFT_LIGHT: return mapserver::comp_op_soft_light; case MS_COMPOP_DIFFERENCE: return mapserver::comp_op_difference; case MS_COMPOP_EXCLUSION: return mapserver::comp_op_exclusion; case MS_COMPOP_CONTRAST: return mapserver::comp_op_contrast; case MS_COMPOP_INVERT: return mapserver::comp_op_invert; case MS_COMPOP_INVERT_RGB: return mapserver::comp_op_invert_rgb; case MS_COMPOP_HSL_HUE: return mapserver::comp_op_hsl_hue; case MS_COMPOP_HSL_LUMINOSITY: return mapserver::comp_op_hsl_luminosity; case MS_COMPOP_HSL_SATURATION: return mapserver::comp_op_hsl_saturation; case MS_COMPOP_HSL_COLOR: return mapserver::comp_op_hsl_color; default: return mapserver::comp_op_src_over; } } #ifdef USE_PIXMAN static int aggCompositeRasterBufferPixman(imageObj *dest, rasterBufferObj *overlay, CompositingOperation comp, int opacity) { assert(overlay->type == MS_BUFFER_BYTE_RGBA); AGG2Renderer *r = AGG_RENDERER(dest); pixman_image_t *si = pixman_image_create_bits( PIXMAN_a8r8g8b8, overlay->width, overlay->height, (uint32_t *)overlay->data.rgba.pixels, overlay->data.rgba.row_step); pixman_image_t *bi = pixman_image_create_bits( PIXMAN_a8r8g8b8, dest->width, dest->height, reinterpret_cast(&(r->buffer[0])), dest->width * 4); pixman_image_t *alpha_mask_i = NULL, *alpha_mask_i_ptr; pixman_image_set_filter(si, PIXMAN_FILTER_NEAREST, NULL, 0); unsigned char *alpha_mask = NULL; if (opacity > 0) { if (opacity == 100) { alpha_mask_i_ptr = NULL; } else { unsigned char alpha = (unsigned char)(MS_NINT(opacity * 2.55)); if (!alpha_mask_i) { alpha_mask = (unsigned char *)msSmallMalloc(dest->width * dest->height); alpha_mask_i = pixman_image_create_bits(PIXMAN_a8, dest->width, dest->height, (uint32_t *)alpha_mask, dest->width); } memset(alpha_mask, alpha, dest->width * dest->height); alpha_mask_i_ptr = alpha_mask_i; } pixman_image_composite(ms2pixman_compop(comp), si, alpha_mask_i_ptr, bi, 0, 0, 0, 0, 0, 0, dest->width, dest->height); } pixman_image_unref(si); pixman_image_unref(bi); if (alpha_mask_i) { pixman_image_unref(alpha_mask_i); msFree(alpha_mask); } return MS_SUCCESS; } #endif static int aggCompositeRasterBufferNoPixman(imageObj *dest, rasterBufferObj *overlay, CompositingOperation comp, int opacity) { assert(overlay->type == MS_BUFFER_BYTE_RGBA); AGG2Renderer *r = AGG_RENDERER(dest); rendering_buffer b(overlay->data.rgba.pixels, overlay->width, overlay->height, overlay->data.rgba.row_step); pixel_format pf(b); mapserver::comp_op_e comp_op = ms2agg_compop(comp); if (comp_op == mapserver::comp_op_src_over) { r->m_renderer_base.blend_from(pf, 0, 0, 0, unsigned(MS_NINT(opacity * 2.55))); } else { compop_pixel_format pixf(r->m_rendering_buffer); compop_renderer_base ren(pixf); pixf.comp_op(comp_op); ren.blend_from(pf, 0, 0, 0, unsigned(MS_NINT(opacity * 2.55))); } return MS_SUCCESS; } void msApplyBlurringCompositingFilter(rasterBufferObj *rb, unsigned int radius) { rendering_buffer b(rb->data.rgba.pixels, rb->width, rb->height, rb->data.rgba.row_step); pixel_format pf(b); mapserver::stack_blur_rgba32(pf, radius, radius); } int msPopulateRendererVTableAGG(rendererVTableObj *renderer) { renderer->compositeRasterBuffer = &aggCompositeRasterBufferNoPixman; #ifdef USE_PIXMAN const char *pszUsePixman = CPLGetConfigOption("MS_USE_PIXMAN", "YES"); if (CPLTestBool(pszUsePixman)) { renderer->compositeRasterBuffer = &aggCompositeRasterBufferPixman; } #endif renderer->supports_pixel_buffer = 1; renderer->use_imagecache = 0; renderer->supports_clipping = 0; renderer->supports_svg = 0; renderer->default_transform_mode = MS_TRANSFORM_SIMPLIFY; agg2InitCache(&(MS_RENDERER_CACHE(renderer))); renderer->cleanup = agg2Cleanup; renderer->renderLine = &agg2RenderLine; renderer->renderPolygon = &agg2RenderPolygon; renderer->renderPolygonTiled = &agg2RenderPolygonTiled; renderer->renderLineTiled = &agg2RenderLineTiled; renderer->renderGlyphs = &agg2RenderGlyphsPath; renderer->renderVectorSymbol = &agg2RenderVectorSymbol; renderer->renderPixmapSymbol = &agg2RenderPixmapSymbol; renderer->renderEllipseSymbol = &agg2RenderEllipseSymbol; renderer->renderTile = &agg2RenderTile; renderer->getRasterBufferHandle = &aggGetRasterBufferHandle; renderer->getRasterBufferCopy = aggGetRasterBufferCopy; renderer->initializeRasterBuffer = aggInitializeRasterBuffer; renderer->mergeRasterBuffer = &agg2MergeRasterBuffer; renderer->loadImageFromFile = msLoadMSRasterBufferFromFile; renderer->createImage = &agg2CreateImage; renderer->saveImage = &agg2SaveImage; renderer->startLayer = &agg2StartNewLayer; renderer->endLayer = &agg2CloseNewLayer; renderer->freeImage = &agg2FreeImage; renderer->freeSymbol = &agg2FreeSymbol; return MS_SUCCESS; } mapserver-8.6.0/src/mapagg.h000066400000000000000000000150101511405061000157130ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: AGG template library types. * Author: John Novak (jnovak@novacell.com) * Author: Thomas Bonfort (tbonfort@terriscope.fr) * ****************************************************************************** * Copyright (c) 1996-2007 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ******************************************************************************/ #include "renderers/agg/include/agg_path_storage.h" /* * interface to a shapeObj representing lines, providing the functions * needed by the agg rasterizer. treats shapeObjs with multiple linestrings. */ class line_adaptor { public: explicit line_adaptor(shapeObj *shape) : s(shape) { m_line = s->line; /*first line*/ m_point = m_line->point; /*current vertex is first vertex of first line*/ m_lend = &(s->line[s->numlines]); /*pointer to after last line*/ m_pend = &(m_line->point[m_line->numpoints]); /*pointer to after last vertex of first line*/ } /* a class with virtual functions should also provide a virtual destructor */ virtual ~line_adaptor() {} void rewind(unsigned) { m_line = s->line; /*first line*/ m_point = m_line->point; /*current vertex is first vertex of first line*/ m_pend = &(m_line->point[m_line->numpoints]); /*pointer to after last vertex of first line*/ } virtual unsigned vertex(double *x, double *y) { if (m_point < m_pend) { /*here we treat the case where a real vertex is returned*/ bool first = m_point == m_line->point; /*is this the first vertex of a line*/ *x = m_point->x; *y = m_point->y; m_point++; return first ? mapserver::path_cmd_move_to : mapserver::path_cmd_line_to; } /*if here, we're at the end of a line*/ m_line++; *x = *y = 0.0; if (m_line >= m_lend) /*is this the last line of the shapObj. normally, (m_line==m_lend) should be a sufficient test, as the caller should not call this function if a previous call returned path_cmd_stop.*/ return mapserver::path_cmd_stop; /*no more points to process*/ /*if here, there are more lines in the shapeObj, continue with next one*/ m_point = m_line->point; /*pointer to first point of next line*/ m_pend = &(m_line->point[m_line->numpoints]); /*pointer to after last point of next line*/ return vertex(x, y); /*this will return the first point of the next line*/ } protected: shapeObj *s; lineObj *m_line, /*current line pointer*/ *m_lend; /*points to after the last line*/ pointObj *m_point, /*current point*/ *m_pend; /*points to after last point of current line*/ }; class polygon_adaptor { public: explicit polygon_adaptor(shapeObj *shape) : s(shape) { m_line = s->line; /*first lines*/ m_point = m_line->point; /*first vertex of first line*/ m_lend = &(s->line[s->numlines]); /*pointer to after last line*/ m_pend = &(m_line->point[m_line->numpoints]); /*pointer to after last vertex of first line*/ } /* a class with virtual functions should also provide a virtual destructor */ virtual ~polygon_adaptor() {} void rewind(unsigned) { /*reset pointers*/ m_stop = false; m_line = s->line; m_point = m_line->point; m_pend = &(m_line->point[m_line->numpoints]); } virtual unsigned vertex(double *x, double *y) { if (m_point < m_pend) { /*if here, we have a real vertex*/ bool first = m_point == m_line->point; *x = m_point->x; *y = m_point->y; m_point++; return first ? mapserver::path_cmd_move_to : mapserver::path_cmd_line_to; } *x = *y = 0.0; if (!m_stop) { /*if here, we're after the last vertex of the current line * we return the command to close the current polygon*/ m_line++; if (m_line >= m_lend) { /*if here, we've finished all the vertices of the shape. * we still return the command to close the current polygon, * but set m_stop so the subsequent call to vertex() will return * the stop command*/ m_stop = true; return mapserver::path_cmd_end_poly; } /*if here, there's another line in the shape, so we set the pointers * accordingly and return the command to close the current polygon*/ m_point = m_line->point; /*first vertex of next line*/ m_pend = &(m_line->point[m_line->numpoints]); /*pointer to after last vertex of next line*/ return mapserver::path_cmd_end_poly; } /*if here, a previous call to vertex informed us that we'd consumed all the * vertices of the shape. return the command to stop processing this shape*/ return mapserver::path_cmd_stop; } protected: shapeObj *s; double ox = 0.0; double oy = 0.0; lineObj *m_line, /*pointer to current line*/ *m_lend; /*pointer to after last line of the shape*/ pointObj *m_point, /*pointer to current vertex*/ *m_pend; /*pointer to after last vertex of current line*/ bool m_stop = false; /*should next call return stop command*/ }; mapserver::path_storage imageVectorSymbol(symbolObj *); mapserver-8.6.0/src/mapaxisorder.h000066400000000000000000011332361511405061000171710ustar00rootroot00000000000000/****************************************************************************** * $Id: $ * * Project: MapServer * Purpose: Axis lookup table * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ /* * Generated file * * This file was generated from by means of a script. Do not edit manually. */ #ifdef __cplusplus extern "C" { #endif static const unsigned char axisOrientationEpsgCodes[] = { 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 1 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 1 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 1 << 7 | 1 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 1 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0, 0 << 7 | 0 << 6 | 0 << 5 | 0 << 4 | 0 << 3 | 0 << 2 | 1 << 1 | 0 << 0}; #ifdef __cplusplus } #endif mapserver-8.6.0/src/mapbits.c000066400000000000000000000072431511405061000161220ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of bit array functions. * Author: Steve Lime and the MapServer team. * * Notes: Derived from code placed in the public domain by Bob Stout, for more * information see http://c.snippets.org/snip_lister.php?fname=bitarray.c. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include /* * Hardcoded size of our bit array. * See function msGetNextBit for another hardcoded value. */ /* #define msGetBit(array, index) (*((array) + (index)/MS_ARRAY_BIT) & ( 1 << * ((index) % MS_ARRAY_BIT))) */ size_t msGetBitArraySize(int numbits) { return ((numbits + MS_ARRAY_BIT - 1) / MS_ARRAY_BIT); } ms_bitarray msAllocBitArray(int numbits) { ms_bitarray array = calloc((numbits + MS_ARRAY_BIT - 1) / MS_ARRAY_BIT, MS_ARRAY_BIT); return (array); } int msGetBit(ms_const_bitarray array, int index) { array += index / MS_ARRAY_BIT; return (*array & (1U << (index % MS_ARRAY_BIT))) != 0; /* 0 or 1 */ } /* ** msGetNextBit( status, start, size) ** ** Quickly find the next bit set. If start == 0 and 0 is set, will return 0. ** If hits end of bitmap without finding set bit, will return -1. ** */ int msGetNextBit(ms_const_bitarray array, int i, int size) { register ms_uint32 b; while (i < size) { b = *(array + (i / MS_ARRAY_BIT)); if (b && (b >> (i % MS_ARRAY_BIT))) { /* There is something in this byte */ /* And it is not to the right of us */ if (b & (1U << (i % MS_ARRAY_BIT))) { /* There is something at this bit! */ return i; } else { i++; } } else { /* Nothing in this byte, move to start of next byte */ i += MS_ARRAY_BIT - (i % MS_ARRAY_BIT); } } /* Got to the last byte with no hits! */ return -1; } void msSetBit(ms_bitarray array, int index, int value) { array += index / MS_ARRAY_BIT; if (value) *array |= 1U << (index % MS_ARRAY_BIT); /* set bit */ else *array &= ~(1U << (index % MS_ARRAY_BIT)); /* clear bit */ } void msSetAllBits(ms_bitarray array, int numbits, int value) { if (value) memset(array, 0xff, ((numbits + 7) / 8)); /* set bit */ else memset(array, 0x0, ((numbits + 7) / 8)); /* clear bit */ } void msFlipBit(ms_bitarray array, int index) { array += index / MS_ARRAY_BIT; *array ^= 1U << (index % MS_ARRAY_BIT); /* flip bit */ } mapserver-8.6.0/src/mapcairo.c000066400000000000000000001170221511405061000162530ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Cairo Rendering functions * Author: Thomas Bonfort * ****************************************************************************** * Copyright (c) 1996-2009 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #ifdef USE_CAIRO #include #if defined(_WIN32) && !defined(__CYGWIN__) #include #include #include #else #include #include #endif #ifdef USE_SVG_CAIRO #include #else #ifdef USE_RSVG #include #ifndef LIBRSVG_CHECK_VERSION #include #endif #ifndef RSVG_CAIRO_H #include #endif #include #endif #endif #include #include "cpl_conv.h" #include #include "fontcache.h" #include /* #include #include */ #include /* #include #include FT_FREETYPE_H */ typedef struct cairoFaceCache cairoFaceCache; struct cairoFaceCache { cairo_font_face_t *face; FT_Face ftface; cairo_font_options_t *options; cairoFaceCache *next; }; void freeCairoFaceCache(cairoFaceCache *fc) { cairo_font_face_destroy(fc->face); cairo_font_options_destroy(fc->options); } typedef struct { cairoFaceCache *cairofacecache; /* dummy surface and context */ unsigned char dummydata[4]; cairo_surface_t *dummysurface; cairo_t *dummycr; } cairoCacheData; void initializeCache(void **vcache) { cairoCacheData *cache = (cairoCacheData *)malloc(sizeof(cairoCacheData)); *vcache = cache; cache->cairofacecache = NULL; /* dummy surface and context */ cache->dummysurface = cairo_image_surface_create_for_data( cache->dummydata, CAIRO_FORMAT_ARGB32, 1, 1, 4); cache->dummycr = cairo_create(cache->dummysurface); } int cleanupCairo(void *cache) { cairoCacheData *ccache = (cairoCacheData *)cache; if (ccache->dummycr) { cairo_destroy(ccache->dummycr); } if (ccache->dummysurface) { cairo_surface_destroy(ccache->dummysurface); } if (ccache->cairofacecache) { cairoFaceCache *next, *cur; cur = ccache->cairofacecache; do { next = cur->next; freeCairoFaceCache(cur); free(cur); cur = next; } while (cur); } free(ccache); return MS_SUCCESS; } typedef struct { cairo_surface_t *surface; cairo_t *cr; bufferObj *outputStream; int use_alpha; } cairo_renderer; #define CAIRO_RENDERER(im) ((cairo_renderer *)(im->img.plugin)) int freeImageCairo(imageObj *img) { cairo_renderer *r = CAIRO_RENDERER(img); if (r) { cairo_destroy(r->cr); cairo_surface_finish(r->surface); cairo_surface_destroy(r->surface); if (r->outputStream) { msBufferFree(r->outputStream); free(r->outputStream); } free(r); } return MS_SUCCESS; } static cairoFaceCache *getCairoFontFace(cairoCacheData *cache, FT_Face ftface) { cairoFaceCache *cur = cache->cairofacecache; while (cur) { if (cur->ftface == ftface) return cur; cur = cur->next; } cur = msSmallMalloc(sizeof(cairoFaceCache)); cur->next = cache->cairofacecache; cache->cairofacecache = cur; cur->ftface = ftface; cur->face = cairo_ft_font_face_create_for_ft_face(ftface, 0); cur->options = cairo_font_options_create(); cairo_font_options_set_hint_style(cur->options, CAIRO_HINT_STYLE_NONE); return cur; } #define msCairoSetSourceColor(cr, c) \ cairo_set_source_rgba((cr), (c)->red / 255.0, (c)->green / 255.0, \ (c)->blue / 255.0, (c)->alpha / 255.0); int renderLineCairo(imageObj *img, shapeObj *p, strokeStyleObj *stroke) { int i, j; cairo_renderer *r = CAIRO_RENDERER(img); assert(stroke->color); cairo_new_path(r->cr); msCairoSetSourceColor(r->cr, stroke->color); for (i = 0; i < p->numlines; i++) { lineObj *l = &(p->line[i]); if (l->numpoints == 0) continue; cairo_move_to(r->cr, l->point[0].x, l->point[0].y); for (j = 1; j < l->numpoints; j++) { cairo_line_to(r->cr, l->point[j].x, l->point[j].y); } } if (stroke->patternlength > 0) { cairo_set_dash(r->cr, stroke->pattern, stroke->patternlength, -stroke->patternoffset); } switch (stroke->linecap) { case MS_CJC_BUTT: cairo_set_line_cap(r->cr, CAIRO_LINE_CAP_BUTT); break; case MS_CJC_SQUARE: cairo_set_line_cap(r->cr, CAIRO_LINE_CAP_SQUARE); break; case MS_CJC_ROUND: case MS_CJC_NONE: default: cairo_set_line_cap(r->cr, CAIRO_LINE_CAP_ROUND); } cairo_set_line_width(r->cr, stroke->width); cairo_stroke(r->cr); if (stroke->patternlength > 0) { cairo_set_dash(r->cr, stroke->pattern, 0, 0); } return MS_SUCCESS; } int renderPolygonCairo(imageObj *img, shapeObj *p, colorObj *c) { cairo_renderer *r = CAIRO_RENDERER(img); int i, j; cairo_new_path(r->cr); cairo_set_fill_rule(r->cr, CAIRO_FILL_RULE_EVEN_ODD); msCairoSetSourceColor(r->cr, c); for (i = 0; i < p->numlines; i++) { lineObj *l = &(p->line[i]); cairo_move_to(r->cr, l->point[0].x, l->point[0].y); for (j = 1; j < l->numpoints; j++) { cairo_line_to(r->cr, l->point[j].x, l->point[j].y); } cairo_close_path(r->cr); } cairo_fill(r->cr); return MS_SUCCESS; } int renderPolygonTiledCairo(imageObj *img, shapeObj *p, imageObj *tile) { int i, j; cairo_renderer *r = CAIRO_RENDERER(img); cairo_renderer *tileRenderer = CAIRO_RENDERER(tile); cairo_pattern_t *pattern = cairo_pattern_create_for_surface(tileRenderer->surface); cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT); cairo_set_source(r->cr, pattern); for (i = 0; i < p->numlines; i++) { lineObj *l = &(p->line[i]); cairo_move_to(r->cr, l->point[0].x, l->point[0].y); for (j = 1; j < l->numpoints; j++) { cairo_line_to(r->cr, l->point[j].x, l->point[j].y); } /* cairo_close_path(r->cr); */ } cairo_fill(r->cr); cairo_pattern_destroy(pattern); return MS_SUCCESS; } cairo_surface_t *createSurfaceFromBuffer(rasterBufferObj *b) { assert(b->type == MS_BUFFER_BYTE_RGBA); return cairo_image_surface_create_for_data(b->data.rgba.pixels, CAIRO_FORMAT_ARGB32, b->width, b->height, b->data.rgba.row_step); } int renderPixmapSymbolCairo(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { cairo_renderer *r = CAIRO_RENDERER(img); cairo_surface_t *im; rasterBufferObj *b = symbol->pixmap_buffer; assert(b); if (!symbol->renderer_cache) { symbol->renderer_cache = (void *)createSurfaceFromBuffer(b); } assert(symbol->renderer_cache); im = (cairo_surface_t *)symbol->renderer_cache; cairo_save(r->cr); if (style->rotation != 0 || style->scale != 1) { cairo_translate(r->cr, x, y); cairo_rotate(r->cr, -style->rotation); cairo_scale(r->cr, style->scale, style->scale); cairo_translate(r->cr, -0.5 * b->width, -0.5 * b->height); } else { cairo_translate(r->cr, MS_NINT(x - 0.5 * b->width), MS_NINT(y - 0.5 * b->height)); } cairo_set_source_surface(r->cr, im, 0, 0); cairo_paint(r->cr); cairo_restore(r->cr); return MS_SUCCESS; } int renderVectorSymbolCairo(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { cairo_renderer *r = CAIRO_RENDERER(img); double ox = symbol->sizex * 0.5, oy = symbol->sizey * 0.5; int is_new = 1, i; cairo_new_path(r->cr); cairo_save(r->cr); cairo_translate(r->cr, x, y); cairo_scale(r->cr, style->scale, style->scale); cairo_rotate(r->cr, -style->rotation); cairo_translate(r->cr, -ox, -oy); for (i = 0; i < symbol->numpoints; i++) { if ((symbol->points[i].x == -99) && (symbol->points[i].y == -99)) { /* (PENUP) */ is_new = 1; } else { if (is_new) { cairo_move_to(r->cr, symbol->points[i].x, symbol->points[i].y); is_new = 0; } else { cairo_line_to(r->cr, symbol->points[i].x, symbol->points[i].y); } } } cairo_restore(r->cr); if (style->color) { msCairoSetSourceColor(r->cr, style->color); cairo_fill_preserve(r->cr); } if (style->outlinewidth > 0) { msCairoSetSourceColor(r->cr, style->outlinecolor); cairo_set_line_width(r->cr, style->outlinewidth); cairo_stroke_preserve(r->cr); } cairo_new_path(r->cr); return MS_SUCCESS; } #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) struct svg_symbol_cache { rasterBufferObj *pixmap_buffer; #ifdef USE_RSVG RsvgHandle *svgc; #else svg_cairo_t *svgc; #endif double scale, rotation; }; #endif int renderSVGSymbolCairo(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) struct svg_symbol_cache *cache; cairo_renderer *r = CAIRO_RENDERER(img); msPreloadSVGSymbol(symbol); assert(symbol->renderer_cache); cache = symbol->renderer_cache; cairo_save(r->cr); cairo_translate(r->cr, x, y); cairo_scale(r->cr, style->scale, style->scale); if (style->rotation != 0) { cairo_rotate(r->cr, -style->rotation); cairo_translate(r->cr, -(int)(symbol->sizex / 2), -(int)(symbol->sizey / 2)); } else cairo_translate(r->cr, -(int)(symbol->sizex / 2), -(int)(symbol->sizey / 2)); #ifdef USE_SVG_CAIRO { svg_cairo_status_t status; status = svg_cairo_render(cache->svgc, r->cr); if (status != SVG_CAIRO_STATUS_SUCCESS) { cairo_restore(r->cr); return MS_FAILURE; } } #else RsvgRectangle viewport = {0, 0, symbol->sizex, symbol->sizey}; rsvg_handle_render_document(cache->svgc, r->cr, &viewport, NULL); #endif cairo_restore(r->cr); return MS_SUCCESS; #else (void)img; (void)x; (void)y; (void)symbol; (void)style; msSetError(MS_MISCERR, "SVG Symbols requested but is not built with libsvgcairo", "renderSVGSymbolCairo()"); return MS_FAILURE; #endif } int renderTileCairo(imageObj *img, imageObj *tile, double x, double y) { cairo_renderer *r = CAIRO_RENDERER(img); cairo_surface_t *im = CAIRO_RENDERER(tile)->surface; int w = cairo_image_surface_get_width(im); int h = cairo_image_surface_get_height(im); cairo_save(r->cr); cairo_translate(r->cr, MS_NINT(x - 0.5 * w), MS_NINT(y - 0.5 * h)); cairo_set_source_surface(r->cr, im, 0, 0); cairo_pattern_set_filter(cairo_get_source(r->cr), CAIRO_FILTER_NEAREST); cairo_paint(r->cr); cairo_restore(r->cr); return MS_SUCCESS; } int renderGlyphs2Cairo(imageObj *img, const textSymbolObj *ts, colorObj *c, colorObj *oc, int ow, int isMarker) { const textPathObj *tp = ts->textpath; cairo_renderer *r = CAIRO_RENDERER(img); cairoCacheData *cache = MS_IMAGE_RENDERER_CACHE(img); cairoFaceCache *cairo_face = NULL; FT_Face prevface = NULL; int g; (void)isMarker; cairo_set_font_size(r->cr, MS_NINT(tp->glyph_size * 96.0 / 72.0)); for (g = 0; g < tp->numglyphs; g++) { glyphObj *gl = &tp->glyphs[g]; cairo_glyph_t glyph; /* load the glyph's face into cairo, if not already present */ if (gl->face->face != prevface) { cairo_face = getCairoFontFace(cache, gl->face->face); cairo_set_font_face(r->cr, cairo_face->face); cairo_set_font_options(r->cr, cairo_face->options); prevface = gl->face->face; cairo_set_font_size(r->cr, MS_NINT(tp->glyph_size * 96.0 / 72.0)); } cairo_save(r->cr); cairo_translate(r->cr, gl->pnt.x, gl->pnt.y); if (gl->rot != 0.0) cairo_rotate(r->cr, -gl->rot); glyph.x = glyph.y = 0; glyph.index = gl->glyph->key.codepoint; cairo_glyph_path(r->cr, &glyph, 1); cairo_restore(r->cr); } if (oc) { cairo_save(r->cr); msCairoSetSourceColor(r->cr, oc); cairo_set_line_width(r->cr, ow + 1); cairo_stroke_preserve(r->cr); cairo_restore(r->cr); } if (c) { msCairoSetSourceColor(r->cr, c); cairo_fill(r->cr); } cairo_new_path(r->cr); return MS_SUCCESS; } cairo_status_t _stream_write_fn(void *b, const unsigned char *data, unsigned int length) { msBufferAppend((bufferObj *)b, (void *)data, length); return CAIRO_STATUS_SUCCESS; } imageObj *createImageCairo(int width, int height, outputFormatObj *format, colorObj *bg) { imageObj *image = NULL; cairo_renderer *r = NULL; if (format->imagemode != MS_IMAGEMODE_RGB && format->imagemode != MS_IMAGEMODE_RGBA) { msSetError(MS_MISCERR, "Cairo driver only supports RGB or RGBA pixel models.", "msImageCreateCairo()"); return image; } if (width > 0 && height > 0) { image = (imageObj *)calloc(1, sizeof(imageObj)); r = (cairo_renderer *)calloc(1, sizeof(cairo_renderer)); if (!strcasecmp(format->driver, "cairo/pdf")) { r->outputStream = (bufferObj *)malloc(sizeof(bufferObj)); msBufferInit(r->outputStream); r->surface = cairo_pdf_surface_create_for_stream( _stream_write_fn, r->outputStream, width, height); #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 15, 10) { const char *msPDFCreationDate = CPLGetConfigOption("MS_PDF_CREATION_DATE", NULL); if (msPDFCreationDate) { cairo_pdf_surface_set_metadata( r->surface, CAIRO_PDF_METADATA_CREATE_DATE, msPDFCreationDate); } } #endif } else if (!strcasecmp(format->driver, "cairo/svg")) { r->outputStream = (bufferObj *)malloc(sizeof(bufferObj)); msBufferInit(r->outputStream); r->surface = cairo_svg_surface_create_for_stream( _stream_write_fn, r->outputStream, width, height); } else if (!strcasecmp(format->driver, "cairo/winGDI") && format->device) { #if CAIRO_HAS_WIN32_SURFACE r->outputStream = NULL; r->surface = cairo_win32_surface_create(format->device); #else msSetError(MS_RENDERERERR, "Cannot create cairo image. Cairo was not compiled with " "support for the win32 backend.", "msImageCreateCairo()"); #endif } else if (!strcasecmp(format->driver, "cairo/winGDIPrint") && format->device) { #if CAIRO_HAS_WIN32_SURFACE r->outputStream = NULL; r->surface = cairo_win32_printing_surface_create(format->device); #else msSetError(MS_RENDERERERR, "Cannot create cairo image. Cairo was not compiled with " "support for the win32 backend.", "msImageCreateCairo()"); #endif } else { r->outputStream = NULL; r->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); } r->cr = cairo_create(r->surface); if (format->transparent || !bg || !MS_VALID_COLOR(*bg)) { r->use_alpha = 1; cairo_set_source_rgba(r->cr, 0, 0, 0, 0); } else { r->use_alpha = 0; msCairoSetSourceColor(r->cr, bg); } cairo_save(r->cr); cairo_set_operator(r->cr, CAIRO_OPERATOR_SOURCE); cairo_paint(r->cr); cairo_restore(r->cr); cairo_set_line_cap(r->cr, CAIRO_LINE_CAP_ROUND); cairo_set_line_join(r->cr, CAIRO_LINE_JOIN_ROUND); image->img.plugin = (void *)r; } else { msSetError(MS_RENDERERERR, "Cannot create cairo image of size %dx%d.", "msImageCreateCairo()", width, height); } return image; } /* msSaveImagePostPDFProcessing() will call the GDAL PDF driver to add * geospatial */ /* information to the regular PDF generated by cairo. This is only triggered if * the */ /* GEO_ENCODING outputformat option is set (to ISO32000 or OGC_BP). Additional */ /* options can be provided by specifying outputformat options starting with */ /* METADATA_ITEM: prefix. For example METADATA_ITEM:PRODUCER=MapServer */ /* Those options are AUTHOR, CREATOR, CREATION_DATE, KEYWORDS, PRODUCER, * SUBJECT, TITLE */ /* See http://gdal.org/frmt_pdf.html documentation. */ static void msTransformToGeospatialPDF(imageObj *img, mapObj *map, cairo_renderer *r) { GDALDatasetH hDS = NULL; const char *pszGEO_ENCODING = NULL; GDALDriverH hPDFDriver = NULL; const char *pszVirtualIO = NULL; int bVirtualIO = FALSE; char *pszTmpFilename = NULL; VSILFILE *fp = NULL; if (map == NULL) return; pszGEO_ENCODING = msGetOutputFormatOption(img->format, "GEO_ENCODING", NULL); if (pszGEO_ENCODING == NULL) return; msGDALInitialize(); hPDFDriver = GDALGetDriverByName("PDF"); if (hPDFDriver == NULL) return; /* When compiled against libpoppler, the PDF driver is VirtualIO capable */ /* but not, when it is compiled against libpodofo. */ pszVirtualIO = GDALGetMetadataItem(hPDFDriver, GDAL_DCAP_VIRTUALIO, NULL); if (pszVirtualIO) bVirtualIO = CSLTestBoolean(pszVirtualIO); if (bVirtualIO) pszTmpFilename = msTmpFile(map, NULL, "/vsimem/mscairopdf/", "pdf"); else pszTmpFilename = msTmpFile(map, map->mappath, NULL, "pdf"); /* Copy content of outputStream buffer into file */ fp = VSIFOpenL(pszTmpFilename, "wb"); if (fp == NULL) { msFree(pszTmpFilename); return; } VSIFWriteL(r->outputStream->data, 1, r->outputStream->size, fp); VSIFCloseL(fp); fp = NULL; hDS = GDALOpen(pszTmpFilename, GA_Update); if (hDS != NULL) { char *pszWKT = msProjectionObj2OGCWKT(&(map->projection)); if (pszWKT != NULL) { double adfGeoTransform[6]; int i; /* Add user-specified options */ for (i = 0; i < img->format->numformatoptions; i++) { const char *pszOption = img->format->formatoptions[i]; if (strncasecmp(pszOption, "METADATA_ITEM:", 14) == 0) { char *pszKey = NULL; const char *pszValue = CPLParseNameValue(pszOption + 14, &pszKey); if (pszKey != NULL) { GDALSetMetadataItem(hDS, pszKey, pszValue, NULL); CPLFree(pszKey); } } } /* We need to rescale the geotransform because GDAL will not necessary */ /* open the PDF with the DPI that was used to generate it */ memcpy(adfGeoTransform, map->gt.geotransform, 6 * sizeof(double)); adfGeoTransform[1] = adfGeoTransform[1] * map->width / GDALGetRasterXSize(hDS); adfGeoTransform[5] = adfGeoTransform[5] * map->height / GDALGetRasterYSize(hDS); GDALSetGeoTransform(hDS, adfGeoTransform); GDALSetProjection(hDS, pszWKT); msFree(pszWKT); pszWKT = NULL; CPLSetThreadLocalConfigOption("GDAL_PDF_GEO_ENCODING", pszGEO_ENCODING); GDALClose(hDS); hDS = NULL; CPLSetThreadLocalConfigOption("GDAL_PDF_GEO_ENCODING", NULL); /* We need to replace the buffer with the content of the GDAL file */ fp = VSIFOpenL(pszTmpFilename, "rb"); if (fp != NULL) { int nFileSize; VSIFSeekL(fp, 0, SEEK_END); nFileSize = (int)VSIFTellL(fp); msBufferResize(r->outputStream, nFileSize); VSIFSeekL(fp, 0, SEEK_SET); r->outputStream->size = VSIFReadL(r->outputStream->data, 1, nFileSize, fp); VSIFCloseL(fp); fp = NULL; } } } if (hDS != NULL) GDALClose(hDS); VSIUnlink(pszTmpFilename); msFree(pszTmpFilename); } int saveImageCairo(imageObj *img, mapObj *map, FILE *fp, outputFormatObj *format_unused) { (void)format_unused; cairo_renderer *r = CAIRO_RENDERER(img); if (!strcasecmp(img->format->driver, "cairo/pdf") || !strcasecmp(img->format->driver, "cairo/svg")) { cairo_surface_finish(r->surface); if (map != NULL && !strcasecmp(img->format->driver, "cairo/pdf")) msTransformToGeospatialPDF(img, map, r); msIO_fwrite(r->outputStream->data, r->outputStream->size, 1, fp); } else { /* not supported */ } return MS_SUCCESS; } unsigned char *saveImageBufferCairo(imageObj *img, int *size_ptr, outputFormatObj *format_unused) { (void)format_unused; cairo_renderer *r = CAIRO_RENDERER(img); unsigned char *data; assert(!strcasecmp(img->format->driver, "cairo/pdf") || !strcasecmp(img->format->driver, "cairo/svg")); cairo_surface_finish(r->surface); data = msSmallMalloc(r->outputStream->size); memcpy(data, r->outputStream->data, r->outputStream->size); *size_ptr = (int)r->outputStream->size; return data; } int renderEllipseSymbolCairo(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { cairo_renderer *r = CAIRO_RENDERER(img); cairo_save(r->cr); cairo_set_line_cap(r->cr, CAIRO_LINE_CAP_BUTT); cairo_set_line_join(r->cr, CAIRO_LINE_JOIN_MITER); cairo_translate(r->cr, x, y); cairo_rotate(r->cr, -style->rotation); cairo_scale(r->cr, symbol->sizex * style->scale / 2, symbol->sizey * style->scale / 2); cairo_arc(r->cr, 0, 0, 1, 0, 2 * MS_PI); cairo_restore(r->cr); if (style->color) { msCairoSetSourceColor(r->cr, style->color); cairo_fill_preserve(r->cr); } if (style->outlinewidth > 0) { cairo_set_line_width(r->cr, style->outlinewidth); msCairoSetSourceColor(r->cr, style->outlinecolor); cairo_stroke_preserve(r->cr); } cairo_new_path(r->cr); return MS_SUCCESS; } int startLayerVectorCairo(imageObj *img, mapObj *map, layerObj *layer) { (void)map; if (layer->compositer && layer->compositer->opacity < 100) { cairo_renderer *r = CAIRO_RENDERER(img); cairo_push_group(r->cr); } return MS_SUCCESS; } int closeLayerVectorCairo(imageObj *img, mapObj *map, layerObj *layer) { (void)map; if (layer->compositer && layer->compositer->opacity < 100) { cairo_renderer *r = CAIRO_RENDERER(img); cairo_pop_group_to_source(r->cr); cairo_paint_with_alpha(r->cr, layer->compositer->opacity * 0.01); } return MS_SUCCESS; } int startLayerRasterCairo(imageObj *img, mapObj *map, layerObj *layer) { (void)img; (void)map; (void)layer; return MS_SUCCESS; } int closeLayerRasterCairo(imageObj *img, mapObj *map, layerObj *layer) { (void)img; (void)map; (void)layer; return MS_SUCCESS; } int getRasterBufferHandleCairo(imageObj *img, rasterBufferObj *rb) { unsigned char *pb; cairo_renderer *r = CAIRO_RENDERER(img); rb->type = MS_BUFFER_BYTE_RGBA; pb = cairo_image_surface_get_data(r->surface); rb->data.rgba.pixels = pb; rb->data.rgba.row_step = cairo_image_surface_get_stride(r->surface); rb->data.rgba.pixel_step = 4; rb->width = cairo_image_surface_get_width(r->surface); rb->height = cairo_image_surface_get_height(r->surface); rb->data.rgba.r = &(pb[2]); rb->data.rgba.g = &(pb[1]); rb->data.rgba.b = &(pb[0]); if (r->use_alpha) rb->data.rgba.a = &(pb[3]); else rb->data.rgba.a = NULL; return MS_SUCCESS; } int getRasterBufferCopyCairo(imageObj *img, rasterBufferObj *rb) { cairo_renderer *r = CAIRO_RENDERER(img); unsigned char *pb; rb->type = MS_BUFFER_BYTE_RGBA; rb->data.rgba.row_step = cairo_image_surface_get_stride(r->surface); rb->data.rgba.pixel_step = 4; rb->width = cairo_image_surface_get_width(r->surface); rb->height = cairo_image_surface_get_height(r->surface); pb = (unsigned char *)malloc(sizeof(unsigned char) * rb->height * rb->data.rgba.row_step); memcpy(pb, cairo_image_surface_get_data(r->surface), ((size_t)rb->height) * rb->data.rgba.row_step); rb->data.rgba.pixels = pb; rb->data.rgba.r = &(pb[2]); rb->data.rgba.g = &(pb[1]); rb->data.rgba.b = &(pb[0]); if (r->use_alpha) rb->data.rgba.a = &(pb[3]); else rb->data.rgba.a = NULL; return MS_SUCCESS; } static cairo_operator_t ms2cairo_compop(CompositingOperation op) { switch (op) { case MS_COMPOP_CLEAR: return CAIRO_OPERATOR_CLEAR; case MS_COMPOP_SRC: return CAIRO_OPERATOR_SOURCE; case MS_COMPOP_DST: return CAIRO_OPERATOR_DEST; case MS_COMPOP_SRC_OVER: return CAIRO_OPERATOR_OVER; case MS_COMPOP_DST_OVER: return CAIRO_OPERATOR_DEST_OVER; case MS_COMPOP_SRC_IN: return CAIRO_OPERATOR_IN; case MS_COMPOP_DST_IN: return CAIRO_OPERATOR_DEST_IN; case MS_COMPOP_SRC_OUT: return CAIRO_OPERATOR_OUT; case MS_COMPOP_DST_OUT: return CAIRO_OPERATOR_DEST_OUT; case MS_COMPOP_SRC_ATOP: return CAIRO_OPERATOR_ATOP; case MS_COMPOP_DST_ATOP: return CAIRO_OPERATOR_DEST_ATOP; case MS_COMPOP_XOR: return CAIRO_OPERATOR_XOR; case MS_COMPOP_PLUS: return CAIRO_OPERATOR_ADD; case MS_COMPOP_MULTIPLY: return CAIRO_OPERATOR_MULTIPLY; case MS_COMPOP_SCREEN: return CAIRO_OPERATOR_SCREEN; case MS_COMPOP_OVERLAY: return CAIRO_OPERATOR_OVERLAY; case MS_COMPOP_DARKEN: return CAIRO_OPERATOR_DARKEN; case MS_COMPOP_LIGHTEN: return CAIRO_OPERATOR_LIGHTEN; case MS_COMPOP_COLOR_DODGE: return CAIRO_OPERATOR_COLOR_DODGE; case MS_COMPOP_COLOR_BURN: return CAIRO_OPERATOR_COLOR_BURN; case MS_COMPOP_HARD_LIGHT: return CAIRO_OPERATOR_HARD_LIGHT; case MS_COMPOP_SOFT_LIGHT: return CAIRO_OPERATOR_SOFT_LIGHT; case MS_COMPOP_DIFFERENCE: return CAIRO_OPERATOR_DIFFERENCE; case MS_COMPOP_EXCLUSION: return CAIRO_OPERATOR_EXCLUSION; case MS_COMPOP_HSL_HUE: return CAIRO_OPERATOR_HSL_HUE; case MS_COMPOP_HSL_LUMINOSITY: return CAIRO_OPERATOR_HSL_LUMINOSITY; case MS_COMPOP_HSL_SATURATION: return CAIRO_OPERATOR_HSL_SATURATION; case MS_COMPOP_HSL_COLOR: return CAIRO_OPERATOR_HSL_COLOR; case MS_COMPOP_INVERT: case MS_COMPOP_INVERT_RGB: case MS_COMPOP_MINUS: case MS_COMPOP_CONTRAST: default: return CAIRO_OPERATOR_OVER; } } int cairoCompositeRasterBuffer(imageObj *img, rasterBufferObj *rb, CompositingOperation comp, int opacity) { cairo_surface_t *src; cairo_renderer *r; if (rb->type != MS_BUFFER_BYTE_RGBA) { return MS_FAILURE; } r = CAIRO_RENDERER(img); src = cairo_image_surface_create_for_data(rb->data.rgba.pixels, CAIRO_FORMAT_ARGB32, rb->width, rb->height, rb->data.rgba.row_step); cairo_set_source_surface(r->cr, src, 0, 0); cairo_set_operator(r->cr, ms2cairo_compop(comp)); cairo_paint_with_alpha(r->cr, opacity / 100.0); cairo_surface_finish(src); cairo_surface_destroy(src); cairo_set_operator(r->cr, CAIRO_OPERATOR_OVER); return MS_SUCCESS; } int mergeRasterBufferCairo(imageObj *img, rasterBufferObj *rb, double opacity, int srcX, int srcY, int dstX, int dstY, int width, int height) { cairo_surface_t *src; cairo_renderer *r; /* not implemented for src,dst,width and height */ if (rb->type != MS_BUFFER_BYTE_RGBA) { return MS_FAILURE; } r = CAIRO_RENDERER(img); src = cairo_image_surface_create_for_data(rb->data.rgba.pixels, CAIRO_FORMAT_ARGB32, rb->width, rb->height, rb->data.rgba.row_step); if (dstX || dstY || srcX || srcY || width != img->width || height != img->height) { cairo_set_source_surface(r->cr, src, dstX - srcX, dstY - srcY); cairo_rectangle(r->cr, dstX, dstY, width, height); cairo_fill(r->cr); } else { cairo_set_source_surface(r->cr, src, 0, 0); cairo_paint_with_alpha(r->cr, opacity); } cairo_surface_finish(src); cairo_surface_destroy(src); return MS_SUCCESS; } void freeSVGCache(symbolObj *s) { #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) struct svg_symbol_cache *cache = s->renderer_cache; if (!cache) return; assert(cache->svgc); #ifdef USE_SVG_CAIRO svg_cairo_destroy(cache->svgc); #else #if LIBRSVG_CHECK_VERSION(2, 35, 0) g_object_unref(cache->svgc); #else rsvg_handle_free(cache->svgc); #endif #endif if (cache->pixmap_buffer) { msFreeRasterBuffer(cache->pixmap_buffer); free(cache->pixmap_buffer); } msFree(s->renderer_cache); s->renderer_cache = NULL; #else (void)s; #endif } int freeSymbolCairo(symbolObj *s) { if (!s->renderer_cache) return MS_SUCCESS; switch (s->type) { case MS_SYMBOL_VECTOR: cairo_path_destroy(s->renderer_cache); break; case MS_SYMBOL_PIXMAP: cairo_surface_destroy(s->renderer_cache); break; case MS_SYMBOL_SVG: freeSVGCache(s); break; } s->renderer_cache = NULL; return MS_SUCCESS; } int initializeRasterBufferCairo(rasterBufferObj *rb, int width, int height, int mode) { (void)mode; rb->type = MS_BUFFER_BYTE_RGBA; rb->width = width; rb->height = height; rb->data.rgba.pixel_step = 4; rb->data.rgba.row_step = width * 4; rb->data.rgba.pixels = (unsigned char *)calloc(((size_t)width) * height * 4, sizeof(unsigned char)); rb->data.rgba.r = &(rb->data.rgba.pixels[2]); rb->data.rgba.g = &(rb->data.rgba.pixels[1]); rb->data.rgba.b = &(rb->data.rgba.pixels[0]); rb->data.rgba.a = &(rb->data.rgba.pixels[3]); return MS_SUCCESS; } int msPreloadSVGSymbol(symbolObj *symbol) { #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) struct svg_symbol_cache *cache; if (!symbol->renderer_cache) { cache = msSmallCalloc(1, sizeof(struct svg_symbol_cache)); symbol->renderer_free_func = &freeSVGCache; } else { cache = symbol->renderer_cache; } if (cache->svgc) return MS_SUCCESS; #ifdef USE_SVG_CAIRO { unsigned int svg_width, svg_height; int status; status = svg_cairo_create(&cache->svgc); if (status) { msSetError(MS_RENDERERERR, "problem creating cairo svg", "msPreloadSVGSymbol()"); return MS_FAILURE; } status = svg_cairo_parse(cache->svgc, symbol->full_pixmap_path); if (status) { msSetError(MS_RENDERERERR, "problem parsing svg symbol", "msPreloadSVGSymbol()"); return MS_FAILURE; } svg_cairo_get_size(cache->svgc, &svg_width, &svg_height); if (svg_width == 0 || svg_height == 0) { msSetError(MS_RENDERERERR, "problem parsing svg symbol", "msPreloadSVGSymbol()"); return MS_FAILURE; } symbol->sizex = svg_width; symbol->sizey = svg_height; } #else { cache->svgc = rsvg_handle_new_from_file(symbol->full_pixmap_path, NULL); if (!cache->svgc) { msSetError(MS_RENDERERERR, "failed to load svg file %s", "msPreloadSVGSymbol()", symbol->full_pixmap_path); return MS_FAILURE; } #if LIBRSVG_CHECK_VERSION(2, 46, 0) /* rsvg_handle_get_dimensions_sub() is deprecated since librsvg 2.46 */ /* It seems rsvg_handle_get_intrinsic_dimensions() is the best equivalent */ /* when the root node includes a width and height attributes in pixels */ gboolean has_width = FALSE; RsvgLength width = {0, RSVG_UNIT_PX}; gboolean has_height = FALSE; RsvgLength height = {0, RSVG_UNIT_PX}; gboolean has_viewbox = FALSE; RsvgRectangle viewbox; rsvg_handle_get_intrinsic_dimensions(cache->svgc, &has_width, &width, &has_height, &height, &has_viewbox, &viewbox); if (has_width && width.unit == RSVG_UNIT_PX && has_height && height.unit == RSVG_UNIT_PX) { symbol->sizex = width.length; symbol->sizey = height.length; } else if (!has_viewbox) { RsvgRectangle ink_rect = {0, 0, 0, 0}; rsvg_handle_get_geometry_for_element(cache->svgc, NULL, &ink_rect, NULL, NULL); symbol->sizex = ink_rect.width; symbol->sizey = ink_rect.height; } else { symbol->sizex = viewbox.width; symbol->sizey = viewbox.height; } #else RsvgDimensionData dim; rsvg_handle_get_dimensions_sub(cache->svgc, &dim, NULL); symbol->sizex = dim.width; symbol->sizey = dim.height; #endif } #endif symbol->renderer_cache = cache; return MS_SUCCESS; #else (void)symbol; msSetError(MS_MISCERR, "SVG Symbols requested but is not built with libsvgcairo", "msPreloadSVGSymbol()"); return MS_FAILURE; #endif } int msRenderRasterizedSVGSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) struct svg_symbol_cache *svg_cache; symbolStyleObj pixstyle; symbolObj pixsymbol; int status; if (MS_SUCCESS != msPreloadSVGSymbol(symbol)) return MS_FAILURE; svg_cache = (struct svg_symbol_cache *)symbol->renderer_cache; // already rendered at the right size and scale? return if (svg_cache->scale != style->scale || svg_cache->rotation != style->rotation) { cairo_t *cr; cairo_surface_t *surface; unsigned char *pb; int width, height, surface_w, surface_h; /* need to recompute the pixmap */ if (svg_cache->pixmap_buffer) { msFreeRasterBuffer(svg_cache->pixmap_buffer); } else { svg_cache->pixmap_buffer = msSmallCalloc(1, sizeof(rasterBufferObj)); } // increase pixmap size to accommodate scaling/rotation if (style->scale != 1.0) { width = surface_w = (symbol->sizex * style->scale + 0.5); height = surface_h = (symbol->sizey * style->scale + 0.5); } else { width = surface_w = symbol->sizex; height = surface_h = symbol->sizey; } if (style->rotation != 0) { surface_w = surface_h = MS_NINT(MS_MAX(height, width) * 1.415); } surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, surface_w, surface_h); cr = cairo_create(surface); if (style->rotation != 0) { cairo_translate(cr, surface_w / 2, surface_h / 2); cairo_rotate(cr, -style->rotation); cairo_translate(cr, -width / 2, -height / 2); } if (style->scale != 1.0) { cairo_scale(cr, style->scale, style->scale); } #ifdef USE_SVG_CAIRO if (svg_cairo_render(svg_cache->svgc, cr) != SVG_CAIRO_STATUS_SUCCESS) { return MS_FAILURE; } #else RsvgRectangle viewport = {0, 0, width, height}; rsvg_handle_render_document(svg_cache->svgc, cr, &viewport, NULL); #endif pb = cairo_image_surface_get_data(surface); // set up raster initializeRasterBufferCairo(svg_cache->pixmap_buffer, surface_w, surface_h, 0); memcpy(svg_cache->pixmap_buffer->data.rgba.pixels, pb, sizeof(unsigned char) * surface_w * surface_h * 4); svg_cache->scale = style->scale; svg_cache->rotation = style->rotation; cairo_destroy(cr); cairo_surface_destroy(surface); } pixstyle = *style; pixstyle.rotation = 0.0; pixstyle.scale = 1.0; pixsymbol.pixmap_buffer = svg_cache->pixmap_buffer; pixsymbol.type = MS_SYMBOL_PIXMAP; if (svg_cache->pixmap_buffer->height && svg_cache->pixmap_buffer->width) status = MS_IMAGE_RENDERER(img)->renderPixmapSymbol(img, x, y, &pixsymbol, &pixstyle); else { msDebug("SVG symbol with too small size to be rendered"); status = MS_SUCCESS; } MS_IMAGE_RENDERER(img)->freeSymbol(&pixsymbol); return status; #else (void)img; (void)x; (void)y; (void)symbol; (void)style; msSetError( MS_MISCERR, "SVG Symbols requested but MapServer is not built with libsvgcairo", "renderSVGSymbolCairo()"); return MS_FAILURE; #endif } void msCairoCleanup() { cairo_debug_reset_static_data(); } #endif /*USE_CAIRO*/ int msPopulateRendererVTableCairoRaster(rendererVTableObj *renderer) { #ifdef USE_CAIRO renderer->supports_pixel_buffer = 1; renderer->compositeRasterBuffer = cairoCompositeRasterBuffer; renderer->supports_svg = 1; renderer->default_transform_mode = MS_TRANSFORM_SIMPLIFY; initializeCache(&MS_RENDERER_CACHE(renderer)); renderer->startLayer = startLayerRasterCairo; renderer->endLayer = closeLayerRasterCairo; renderer->renderLineTiled = NULL; renderer->renderLine = &renderLineCairo; renderer->createImage = &createImageCairo; renderer->saveImage = &saveImageCairo; renderer->getRasterBufferHandle = &getRasterBufferHandleCairo; renderer->getRasterBufferCopy = &getRasterBufferCopyCairo; renderer->renderPolygon = &renderPolygonCairo; renderer->renderGlyphs = &renderGlyphs2Cairo; renderer->freeImage = &freeImageCairo; renderer->renderEllipseSymbol = &renderEllipseSymbolCairo; renderer->renderVectorSymbol = &renderVectorSymbolCairo; renderer->renderSVGSymbol = &renderSVGSymbolCairo; renderer->renderPixmapSymbol = &renderPixmapSymbolCairo; renderer->mergeRasterBuffer = &mergeRasterBufferCairo; renderer->renderTile = &renderTileCairo; renderer->loadImageFromFile = &msLoadMSRasterBufferFromFile; renderer->renderPolygonTiled = &renderPolygonTiledCairo; renderer->freeSymbol = &freeSymbolCairo; renderer->cleanup = &cleanupCairo; return MS_SUCCESS; #else (void)renderer; msSetError(MS_MISCERR, "Cairo Driver requested but MapServer is not built in", "msPopulateRendererVTableCairoRaster()"); return MS_FAILURE; #endif } int populateRendererVTableCairoVector(rendererVTableObj *renderer) { #ifdef USE_CAIRO renderer->use_imagecache = 0; renderer->supports_pixel_buffer = 0; renderer->compositeRasterBuffer = NULL; renderer->supports_svg = 1; renderer->default_transform_mode = MS_TRANSFORM_SIMPLIFY; initializeCache(&MS_RENDERER_CACHE(renderer)); renderer->startLayer = startLayerVectorCairo; renderer->endLayer = closeLayerVectorCairo; renderer->renderLine = &renderLineCairo; renderer->renderLineTiled = NULL; renderer->createImage = &createImageCairo; renderer->saveImage = &saveImageCairo; renderer->saveImageBuffer = &saveImageBufferCairo; renderer->getRasterBufferHandle = &getRasterBufferHandleCairo; renderer->renderPolygon = &renderPolygonCairo; renderer->renderGlyphs = &renderGlyphs2Cairo; renderer->freeImage = &freeImageCairo; renderer->renderEllipseSymbol = &renderEllipseSymbolCairo; renderer->renderVectorSymbol = &renderVectorSymbolCairo; renderer->renderSVGSymbol = &renderSVGSymbolCairo; renderer->renderPixmapSymbol = &renderPixmapSymbolCairo; renderer->loadImageFromFile = &msLoadMSRasterBufferFromFile; renderer->mergeRasterBuffer = &mergeRasterBufferCairo; renderer->initializeRasterBuffer = initializeRasterBufferCairo; renderer->renderTile = &renderTileCairo; renderer->renderPolygonTiled = &renderPolygonTiledCairo; renderer->freeSymbol = &freeSymbolCairo; renderer->cleanup = &cleanupCairo; return MS_SUCCESS; #else (void)renderer; msSetError(MS_MISCERR, "Cairo Driver requested but MapServer is not built in", "msPopulateRendererVTableCairoRaster()"); return MS_FAILURE; #endif } int msPopulateRendererVTableCairoSVG(rendererVTableObj *renderer) { return populateRendererVTableCairoVector(renderer); } int msPopulateRendererVTableCairoPDF(rendererVTableObj *renderer) { return populateRendererVTableCairoVector(renderer); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.6.0/src/mapchart.c����������������������������������������������������������������������0000664�0000000�0000000�00000061133�15114050610�0016260�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of dynamic charting (MS-RFC-29) * Author: Thomas Bonfort ( thomas.bonfort[at]gmail.com ) * ****************************************************************************** * Copyright (c) 1996-2007 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #define MS_CHART_TYPE_PIE 1 #define MS_CHART_TYPE_BAR 2 #define MS_CHART_TYPE_VBAR 3 /* ** check if an object of width w and height h placed at point x,y can fit in an *image of width mw and height mh */ #define MS_CHART_FITS(x, y, w, h, mw, mh) \ (((x) - (w) / 2. > 0.) && ((x) + (w) / 2. < (mw)) && \ ((y) - (h) / 2. > 0.) && ((y) + (h) / 2.) < (mh)) /* ** find a point on a shape. check if it fits in image ** returns ** MS_SUCCESS and point coordinates in 'p' if chart fits in image ** MS_FAILURE if no point could be found */ int findChartPoint(mapObj *map, shapeObj *shape, int width, int height, pointObj *center) { int middle, numpoints; double invcellsize = 1.0 / map->cellsize; /*speed up MAP2IMAGE_X/Y_IC_DBL*/ switch (shape->type) { case MS_SHAPE_POINT: center->x = MS_MAP2IMAGE_X_IC_DBL(shape->line[0].point[0].x, map->extent.minx, invcellsize); center->y = MS_MAP2IMAGE_Y_IC_DBL(shape->line[0].point[0].y, map->extent.maxy, invcellsize); if (MS_CHART_FITS(center->x, center->y, width, height, map->width, map->height)) return MS_SUCCESS; else return MS_FAILURE; break; case MS_SHAPE_LINE: /*loop through line segments starting from middle (alternate between before *and after middle point) *first segment that fits is chosen */ middle = shape->line[0].numpoints / 2; /*start with middle segment of line*/ numpoints = shape->line[0].numpoints; if (1 <= middle) { int idx = middle + 1; if (idx < numpoints) { center->x = (shape->line[0].point[idx - 1].x + shape->line[0].point[idx].x) / 2.; center->y = (shape->line[0].point[idx - 1].y + shape->line[0].point[idx].y) / 2.; center->x = MS_MAP2IMAGE_X_IC_DBL(center->x, map->extent.minx, invcellsize); center->y = MS_MAP2IMAGE_Y_IC_DBL(center->y, map->extent.maxy, invcellsize); if (MS_CHART_FITS(center->x, center->y, width, height, map->width, map->height)) return MS_SUCCESS; return MS_FAILURE; } idx = middle - 1; center->x = (shape->line[0].point[idx].x + shape->line[0].point[idx + 1].x) / 2; center->y = (shape->line[0].point[idx].y + shape->line[0].point[idx + 1].y) / 2; center->x = MS_MAP2IMAGE_X_IC_DBL(center->x, map->extent.minx, invcellsize); center->y = MS_MAP2IMAGE_Y_IC_DBL(center->y, map->extent.maxy, invcellsize); if (MS_CHART_FITS(center->x, center->y, width, height, map->width, map->height)) return MS_SUCCESS; return MS_FAILURE; } return MS_FAILURE; break; case MS_SHAPE_POLYGON: msPolygonLabelPoint(shape, center, -1); center->x = MS_MAP2IMAGE_X_IC_DBL(center->x, map->extent.minx, invcellsize); center->y = MS_MAP2IMAGE_Y_IC_DBL(center->y, map->extent.maxy, invcellsize); if (MS_CHART_FITS(center->x, center->y, width, height, map->width, map->height)) return MS_SUCCESS; else return MS_FAILURE; break; default: return MS_FAILURE; } } int WARN_UNUSED drawRectangle(mapObj *map, imageObj *image, double mx, double my, double Mx, double My, styleObj *style) { shapeObj shape; lineObj line; pointObj point[5]; line.point = point; line.numpoints = 5; shape.line = &line; shape.numlines = 1; point[0].x = point[4].x = point[3].x = mx; point[0].y = point[4].y = point[1].y = my; /* cppcheck-suppress unreadVariable */ point[1].x = point[2].x = Mx; /* cppcheck-suppress unreadVariable */ point[2].y = point[3].y = My; return msDrawShadeSymbol(map, image, &shape, style, 1.0); } int WARN_UNUSED msDrawVBarChart(mapObj *map, imageObj *image, pointObj *center, double *values, styleObj **styles, int numvalues, double barWidth) { int c; double left, cur; /*shortcut to pixel boundaries of the chart*/ double height = 0; for (c = 0; c < numvalues; c++) { height += values[c]; } cur = center->y + height / 2.; left = center->x - barWidth / 2.; for (c = 0; c < numvalues; c++) { if (MS_UNLIKELY(MS_FAILURE == drawRectangle(map, image, left, cur, left + barWidth, cur - values[c], styles[c]))) return MS_FAILURE; cur -= values[c]; } return MS_SUCCESS; } int msDrawBarChart(mapObj *map, imageObj *image, pointObj *center, double *values, styleObj **styles, int numvalues, double width, double height, double *maxVal, double *minVal, double barWidth) { double upperLimit, lowerLimit; double shapeMaxVal, shapeMinVal, pixperval; int c; double vertOrigin, vertOriginClipped, horizStart, y; double left, top, bottom; /*shortcut to pixel boundaries of the chart*/ top = center->y - height / 2.; bottom = center->y + height / 2.; left = center->x - width / 2.; shapeMaxVal = shapeMinVal = values[0]; for (c = 1; c < numvalues; c++) { if (maxVal == NULL || minVal == NULL) { /*compute bounds if not specified*/ if (values[c] > shapeMaxVal) shapeMaxVal = values[c]; if (values[c] < shapeMinVal) shapeMinVal = values[c]; } } /* * use specified bounds if wanted * if not, always show the origin */ upperLimit = (maxVal != NULL) ? *maxVal : MS_MAX(shapeMaxVal, 0); lowerLimit = (minVal != NULL) ? *minVal : MS_MIN(shapeMinVal, 0); if (upperLimit == lowerLimit) { /* treat the case where we would have an unspecified behavior */ upperLimit += 0.5; lowerLimit -= 0.5; } pixperval = height / (upperLimit - lowerLimit); vertOrigin = bottom + lowerLimit * pixperval; vertOriginClipped = (vertOrigin < top) ? top : (vertOrigin > bottom) ? bottom : vertOrigin; horizStart = left; for (c = 0; c < numvalues; c++) { double barHeight = values[c] * pixperval; /*clip bars*/ y = ((vertOrigin - barHeight) < top) ? top : (vertOrigin - barHeight > bottom) ? bottom : vertOrigin - barHeight; if (y != vertOriginClipped) { /*don't draw bars of height == 0 (i.e. either values==0, or clipped)*/ if (values[c] > 0) { if (MS_UNLIKELY(MS_FAILURE == drawRectangle(map, image, horizStart, y, horizStart + barWidth - 1, vertOriginClipped, styles[c]))) return MS_FAILURE; } else { if (MS_UNLIKELY(MS_FAILURE == drawRectangle(map, image, horizStart, vertOriginClipped, horizStart + barWidth - 1, y, styles[c]))) return MS_FAILURE; } } horizStart += barWidth; } return MS_SUCCESS; } int WARN_UNUSED msDrawPieChart(mapObj *map, imageObj *image, pointObj *center, double diameter, double *values, styleObj **styles, int numvalues) { int i; double dTotal = 0., start = 0; for (i = 0; i < numvalues; i++) { if (values[i] < 0.) { msSetError(MS_MISCERR, "cannot draw pie charts for negative values", "msDrawPieChart()"); return MS_FAILURE; } dTotal += values[i]; } for (i = 0; i < numvalues; i++) { double angle = values[i]; if (angle == 0) continue; /*no need to draw. causes artifacts with outlines*/ angle *= 360.0 / dTotal; if (MS_UNLIKELY(MS_FAILURE == msDrawPieSlice(map, image, center, styles[i], diameter / 2., start, start + angle))) return MS_FAILURE; start += angle; } return MS_SUCCESS; } int getNextShape(mapObj *map, layerObj *layer, double *values, int *nvalues, styleObj **styles, shapeObj *shape) { int status; int c; status = msLayerNextShape(layer, shape); if (status == MS_SUCCESS) { if (layer->project) { if (layer->reprojectorLayerToMap == NULL) { layer->reprojectorLayerToMap = msProjectCreateReprojector(&layer->projection, &map->projection); if (layer->reprojectorLayerToMap == NULL) { return MS_FAILURE; } } msProjectShapeEx(layer->reprojectorLayerToMap, shape); } if (msBindLayerToShape(layer, shape, MS_DRAWMODE_FEATURES | MS_DRAWMODE_LABELS) != MS_SUCCESS) return MS_FAILURE; /* error message is set in msBindLayerToShape() */ *nvalues = 0; for (c = 0; c < layer->numclasses; c++) { if (msEvalExpression(layer, shape, &(layer->class[c] -> expression), layer->classitemindex) == MS_TRUE) { values[*nvalues] = (layer->class[c] -> styles[0] -> size); styles[*nvalues] = layer->class[c]->styles[0]; (*nvalues)++; } } } return status; } /* eventually add a class to the layer to get the diameter from an attribute */ int pieLayerProcessDynamicDiameter(layerObj *layer) { const char *chartRangeProcessingKey = NULL; char *attrib; double mindiameter = -1, maxdiameter, minvalue, maxvalue; classObj *newclass; styleObj *newstyle; const char *chartSizeProcessingKey = msLayerGetProcessingKey(layer, "CHART_SIZE"); if (chartSizeProcessingKey != NULL) return MS_FALSE; chartRangeProcessingKey = msLayerGetProcessingKey(layer, "CHART_SIZE_RANGE"); if (chartRangeProcessingKey == NULL) return MS_FALSE; attrib = msStrdup(chartRangeProcessingKey); char *space = strchr(attrib, ' '); if (space) { *space = '\0'; if (sscanf(space + 1, "%lf %lf %lf %lf", &mindiameter, &maxdiameter, &minvalue, &maxvalue) != 4) { /*we don't have the attribute and the four range values*/ free(attrib); msSetError(MS_MISCERR, "Chart Layer format error for processing key \"CHART_RANGE\"", "msDrawChartLayer()"); return MS_FAILURE; } } /*create a new class in the layer containing the wanted attribute * as the SIZE of its first STYLE*/ newclass = msGrowLayerClasses(layer); if (newclass == NULL) { free(attrib); return MS_FAILURE; } initClass(newclass); layer->numclasses++; /*create and attach a new styleObj to our temp class * and bind the wanted attribute to its SIZE */ newstyle = msGrowClassStyles(newclass); if (newstyle == NULL) { free(attrib); return MS_FAILURE; } initStyle(newstyle); newclass->numstyles++; newclass->name = (char *)msStrdup("__MS_SIZE_ATTRIBUTE_"); newstyle->bindings[MS_STYLE_BINDING_SIZE].item = msStrdup(attrib); newstyle->numbindings++; free(attrib); return MS_TRUE; } /* clean up the class added temporarily */ static void pieLayerCleanupDynamicDiameter(layerObj *layer) { if (layer->numclasses > 0 && EQUALN(layer->class[layer->numclasses - 1] -> name, "__MS_SIZE_ATTRIBUTE_", 20)) { classObj *c = msRemoveClass(layer, layer->numclasses - 1); freeClass(c); msFree(c); } } int msDrawPieChartLayer(mapObj *map, layerObj *layer, imageObj *image) { shapeObj shape; int status = MS_SUCCESS; const char *chartRangeProcessingKey = NULL; const char *chartSizeProcessingKey = msLayerGetProcessingKey(layer, "CHART_SIZE"); double diameter = 0, mindiameter = -1, maxdiameter = 0, minvalue = 0, maxvalue = 0, exponent = 0; double *values; styleObj **styles; pointObj center; int numvalues = layer->numclasses; /* the number of classes to represent in the graph */ int numvalues_for_shape = 0; if (chartSizeProcessingKey == NULL) { chartRangeProcessingKey = msLayerGetProcessingKey(layer, "CHART_SIZE_RANGE"); if (chartRangeProcessingKey == NULL) diameter = 20; else { const int nvalues = sscanf(chartRangeProcessingKey, "%*s %lf %lf %lf %lf %lf", &mindiameter, &maxdiameter, &minvalue, &maxvalue, &exponent); if (nvalues != 4 && nvalues != 5) { msSetError( MS_MISCERR, "msDrawChart format error for processing key \"CHART_SIZE_RANGE\": " "itemname minsize maxsize minval maxval [exponent] is expected", "msDrawPieChartLayer()"); return MS_FAILURE; } } } else { if (sscanf(chartSizeProcessingKey, "%lf", &diameter) != 1) { msSetError(MS_MISCERR, "msDrawChart format error for processing key \"CHART_SIZE\"", "msDrawPieChartLayer()"); return MS_FAILURE; } } layer->project = msProjectionsDiffer(&(layer->projection), &(map->projection)); /* step through the target shapes */ msInitShape(&shape); values = (double *)calloc(numvalues, sizeof(double)); MS_CHECK_ALLOC(values, numvalues * sizeof(double), MS_FAILURE); styles = (styleObj **)malloc((numvalues) * sizeof(styleObj *)); if (styles == NULL) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msDrawPieChartLayer()", __FILE__, __LINE__, (unsigned int)(numvalues * sizeof(styleObj *))); free(values); return MS_FAILURE; } while (MS_SUCCESS == getNextShape(map, layer, values, &numvalues_for_shape, styles, &shape)) { if (chartRangeProcessingKey != NULL) numvalues_for_shape--; if (numvalues_for_shape == 0) { msFreeShape(&shape); continue; } msDrawStartShape(map, layer, image, &shape); if (chartRangeProcessingKey != NULL) { diameter = values[numvalues_for_shape]; if (mindiameter >= 0) { if (diameter <= minvalue) diameter = mindiameter; else if (diameter >= maxvalue) diameter = maxdiameter; else { if (exponent <= 0) diameter = MS_NINT(mindiameter + ((diameter - minvalue) / (maxvalue - minvalue)) * (maxdiameter - mindiameter)); else diameter = MS_NINT( mindiameter + pow((diameter - minvalue) / (maxvalue - minvalue), 1.0 / exponent) * (maxdiameter - mindiameter)); } } } if (findChartPoint(map, &shape, diameter, diameter, ¢er) == MS_SUCCESS) { status = msDrawPieChart(map, image, ¢er, diameter, values, styles, numvalues_for_shape); } msDrawEndShape(map, layer, image, &shape); msFreeShape(&shape); } free(values); free(styles); return status; } int msDrawVBarChartLayer(mapObj *map, layerObj *layer, imageObj *image) { shapeObj shape; int status = MS_SUCCESS; const char *chartSizeProcessingKey = msLayerGetProcessingKey(layer, "CHART_SIZE"); const char *chartScaleProcessingKey = msLayerGetProcessingKey(layer, "CHART_SCALE"); double barWidth, scale = 1.0; double *values; styleObj **styles; pointObj center; int numvalues = layer->numclasses; int numvalues_for_shape; if (chartSizeProcessingKey == NULL) { barWidth = 20; } else { if (sscanf(chartSizeProcessingKey, "%lf", &barWidth) != 1) { msSetError(MS_MISCERR, "msDrawChart format error for processing key \"CHART_SIZE\"", "msDrawVBarChartLayer()"); return MS_FAILURE; } } if (chartScaleProcessingKey) { if (sscanf(chartScaleProcessingKey, "%lf", &scale) != 1) { msSetError(MS_MISCERR, "Error reading value for processing key \"CHART_SCALE\"", "msDrawVBarChartLayer()"); return MS_FAILURE; } } msInitShape(&shape); values = (double *)calloc(numvalues, sizeof(double)); MS_CHECK_ALLOC(values, numvalues * sizeof(double), MS_FAILURE); styles = (styleObj **)malloc(numvalues * sizeof(styleObj *)); if (styles == NULL) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msDrawVBarChartLayer()", __FILE__, __LINE__, (unsigned int)(numvalues * sizeof(styleObj *))); free(values); return MS_FAILURE; } while (MS_SUCCESS == getNextShape(map, layer, values, &numvalues_for_shape, styles, &shape)) { int i; double h = 0; if (numvalues_for_shape == 0) { continue; } for (i = 0; i < numvalues_for_shape; i++) { values[i] *= scale; h += values[i]; } msDrawStartShape(map, layer, image, &shape); if (findChartPoint(map, &shape, barWidth, h, ¢er) == MS_SUCCESS) { status = msDrawVBarChart(map, image, ¢er, values, styles, numvalues_for_shape, barWidth); } msDrawEndShape(map, layer, image, &shape); msFreeShape(&shape); } free(values); free(styles); return status; } int msDrawBarChartLayer(mapObj *map, layerObj *layer, imageObj *image) { shapeObj shape; int status = MS_SUCCESS; const char *chartSizeProcessingKey = msLayerGetProcessingKey(layer, "CHART_SIZE"); const char *barMax = msLayerGetProcessingKey(layer, "CHART_BAR_MAXVAL"); const char *barMin = msLayerGetProcessingKey(layer, "CHART_BAR_MINVAL"); double width, height; double barWidth; double *values; styleObj **styles; pointObj center; double barMaxVal = 0.0, barMinVal = 0.0; int numvalues = layer->numclasses; int numvalues_for_shape; if (chartSizeProcessingKey == NULL) { width = height = 20; } else { const int ret = sscanf(chartSizeProcessingKey, "%lf %lf", &width, &height); if (ret == 1) { height = width; } else if (ret != 2) { msSetError(MS_MISCERR, "msDrawChart format error for processing key \"CHART_SIZE\"", "msDrawBarChartLayer()"); return MS_FAILURE; } } if (barMax) { if (sscanf(barMax, "%lf", &barMaxVal) != 1) { msSetError(MS_MISCERR, "Error reading value for processing key \"CHART_BAR_MAXVAL\"", "msDrawBarChartLayer()"); return MS_FAILURE; } } if (barMin) { if (sscanf(barMin, "%lf", &barMinVal) != 1) { msSetError(MS_MISCERR, "Error reading value for processing key \"CHART_BAR_MINVAL\"", "msDrawBarChartLayer()"); return MS_FAILURE; } } if (barMin && barMax && barMinVal >= barMaxVal) { msSetError(MS_MISCERR, "\"CHART_BAR_MINVAL\" must be less than \"CHART_BAR_MAXVAL\"", "msDrawBarChartLayer()"); return MS_FAILURE; } barWidth = (double)width / (double)layer->numclasses; if (!barWidth) { msSetError( MS_MISCERR, "Specified width of chart too small to fit given number of classes", "msDrawBarChartLayer()"); return MS_FAILURE; } msInitShape(&shape); values = (double *)calloc(numvalues, sizeof(double)); MS_CHECK_ALLOC(values, numvalues * sizeof(double), MS_FAILURE); styles = (styleObj **)malloc(numvalues * sizeof(styleObj *)); if (styles == NULL) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msDrawBarChartLayer()", __FILE__, __LINE__, (unsigned int)(numvalues * sizeof(styleObj *))); free(values); return MS_FAILURE; } while (MS_SUCCESS == getNextShape(map, layer, values, &numvalues_for_shape, styles, &shape)) { if (numvalues_for_shape == 0) continue; msDrawStartShape(map, layer, image, &shape); if (findChartPoint(map, &shape, width, height, ¢er) == MS_SUCCESS) { status = msDrawBarChart(map, image, ¢er, values, styles, numvalues_for_shape, width, height, (barMax != NULL) ? &barMaxVal : NULL, (barMin != NULL) ? &barMinVal : NULL, barWidth); } msDrawEndShape(map, layer, image, &shape); msFreeShape(&shape); } free(values); free(styles); return status; } /** * Generic function to render chart layers. */ int msDrawChartLayer(mapObj *map, layerObj *layer, imageObj *image) { rectObj searchrect; const char *chartTypeProcessingKey = msLayerGetProcessingKey(layer, "CHART_TYPE"); int chartType = MS_CHART_TYPE_PIE; int status = MS_FAILURE; if (image && map) { if (!(MS_RENDERER_PLUGIN(image->format))) { msSetError(MS_MISCERR, "chart drawing currently only supports GD and AGG renderers", "msDrawChartLayer()"); return MS_FAILURE; } if (chartTypeProcessingKey != NULL) { if (strcasecmp(chartTypeProcessingKey, "PIE") == 0) { chartType = MS_CHART_TYPE_PIE; } else if (strcasecmp(chartTypeProcessingKey, "BAR") == 0) { chartType = MS_CHART_TYPE_BAR; } else if (strcasecmp(chartTypeProcessingKey, "VBAR") == 0) { chartType = MS_CHART_TYPE_VBAR; } else { msSetError(MS_MISCERR, "unknown chart type for processing key \"CHART_TYPE\", must " "be one of \"PIE\" or \"BAR\"", "msDrawChartLayer()"); return MS_FAILURE; } } if (chartType == MS_CHART_TYPE_PIE) { pieLayerProcessDynamicDiameter(layer); } /* open this layer */ status = msLayerOpen(layer); if (status != MS_SUCCESS) return MS_FAILURE; status = msLayerWhichItems(layer, MS_FALSE, NULL); if (status != MS_SUCCESS) { msLayerClose(layer); return MS_FAILURE; } /* identify target shapes */ if (layer->transform == MS_TRUE) searchrect = map->extent; else { searchrect.minx = searchrect.miny = 0; searchrect.maxx = map->width - 1; searchrect.maxy = map->height - 1; } if ((map->projection.numargs > 0) && (layer->projection.numargs > 0)) msProjectRect(&map->projection, &layer->projection, &searchrect); /* project the searchrect to source coords */ status = msLayerWhichShapes(layer, searchrect, MS_FALSE); if (status == MS_DONE) { /* no overlap */ msLayerClose(layer); if (chartType == MS_CHART_TYPE_PIE) pieLayerCleanupDynamicDiameter(layer); return MS_SUCCESS; } else if (status != MS_SUCCESS) { msLayerClose(layer); if (chartType == MS_CHART_TYPE_PIE) pieLayerCleanupDynamicDiameter(layer); return MS_FAILURE; } switch (chartType) { case MS_CHART_TYPE_PIE: status = msDrawPieChartLayer(map, layer, image); break; case MS_CHART_TYPE_BAR: status = msDrawBarChartLayer(map, layer, image); break; case MS_CHART_TYPE_VBAR: status = msDrawVBarChartLayer(map, layer, image); break; default: return MS_FAILURE; /*shouldn't be here anyways*/ } msLayerClose(layer); if (chartType == MS_CHART_TYPE_PIE) pieLayerCleanupDynamicDiameter(layer); } return status; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.6.0/src/mapcluster.c��������������������������������������������������������������������0000664�0000000�0000000�00000165037�15114050610�0016650�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of the cluster layer data provider (RFC-69). * Author: Tamas Szekeres (szekerest@gmail.com). * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #define _CRT_SECURE_NO_WARNINGS 1 /* $Id$ */ #include #include "mapserver.h" #ifdef USE_CLUSTER_PLUGIN #define USE_CLUSTER_EXTERNAL #endif /* custom attributes provided by this layer data source */ #define MSCLUSTER_NUMITEMS 3 #define MSCLUSTER_FEATURECOUNT "Cluster_FeatureCount" #define MSCLUSTER_FEATURECOUNTINDEX -100 #define MSCLUSTER_GROUP "Cluster_Group" #define MSCLUSTER_GROUPINDEX -101 #define MSCLUSTER_BASEFID "Cluster_BaseFID" #define MSCLUSTER_BASEFIDINDEX -102 typedef struct cluster_tree_node clusterTreeNode; typedef struct cluster_info clusterInfo; typedef struct cluster_layer_info msClusterLayerInfo; /* forward declarations */ void msClusterLayerCopyVirtualTable(layerVTableObj *vtable); static void clusterTreeNodeDestroy(msClusterLayerInfo *layerinfo, clusterTreeNode *node); /* cluster compare func */ typedef int (*clusterCompareRegionFunc)(clusterInfo *current, clusterInfo *other); /* quadtree constants */ #define SPLITRATIO 0.55 #define TREE_MAX_DEPTH 10 /* cluster algorithm */ #define MSCLUSTER_ALGORITHM_FULL 0 #define MSCLUSTER_ALGORITHM_SIMPLE 1 /* cluster data */ struct cluster_info { double x; /* x position of the current point */ double y; /* y position of the current point */ double avgx; /* average x positions of this cluster */ double avgy; /* average y positions of this cluster */ double varx; /* variance of the x positions of this cluster */ double vary; /* variance of the y positions of this cluster */ shapeObj shape; /* current shape */ rectObj bounds; /* clustering region */ /* number of the neighbouring shapes */ int numsiblings; /* diagnostics */ int numcollected; int numremoved; int index; clusterTreeNode *node; /* collection of the siblings */ clusterInfo *siblings; /* next shape in the linked list */ clusterInfo *next; /* current group */ char *group; int filter; }; /* quadtree node */ struct cluster_tree_node { /* area covered by this node */ rectObj rect; /* linked list of the shapes stored at this node. */ int numshapes; int index; int position; clusterInfo *shapes; /* quad tree subnodes */ clusterTreeNode *subnode[4]; }; /* layerinfo */ struct cluster_layer_info { /* array of features (finalized clusters) */ clusterInfo *finalized; clusterInfo *finalizedSiblings; clusterInfo *filtered; int numFeatures; int numFinalized; int numFinalizedSiblings; int numFiltered; /* variables for collecting the best cluster and iterating with NextShape */ clusterInfo *current; /* check whether all shapes should be returned behind a cluster */ int get_all_shapes; /* check whether the location of the shapes should be preserved (no averaging) */ int keep_locations; /* the maxdistance and the buffer parameters are specified in map units (scale * independent clustering) */ int use_map_units; double rank; /* root node of the quad tree */ clusterTreeNode *root; int numNodes; clusterTreeNode *finalizedNodes; int numFinalizedNodes; /* map extent used for building cluster data */ rectObj searchRect; /* source layer parameters */ layerObj srcLayer; /* distance comparator function */ clusterCompareRegionFunc fnCompare; /* diagnostics */ int depth; /* processing algorithm */ int algorithm; }; extern int yyparse(parseObj *p); /* evaluate the filter expression */ int msClusterEvaluateFilter(expressionObj *expression, shapeObj *shape) { if (expression->type == MS_EXPRESSION) { int status; parseObj p; p.shape = shape; p.expr = expression; p.expr->curtoken = p.expr->tokens; /* reset */ p.type = MS_PARSE_TYPE_BOOLEAN; status = yyparse(&p); if (status != 0) { msSetError(MS_PARSEERR, "Failed to parse expression: %s", "msClusterEvaluateFilter", expression->string); return 0; } return p.result.intval; } return 0; } /* get the group text when creating the clusters */ char *msClusterGetGroupText(expressionObj *expression, shapeObj *shape) { char *tmpstr = NULL; if (expression->string) { switch (expression->type) { case (MS_STRING): tmpstr = msStrdup(expression->string); break; case (MS_EXPRESSION): { int status; parseObj p; p.shape = shape; p.expr = expression; p.expr->curtoken = p.expr->tokens; /* reset */ p.type = MS_PARSE_TYPE_STRING; status = yyparse(&p); if (status != 0) { msSetError(MS_PARSEERR, "Failed to process text expression: %s", "msClusterGetGroupText", expression->string); return NULL; } tmpstr = p.result.strval; break; } default: break; } } return (tmpstr); } int CompareEllipseRegion(clusterInfo *current, clusterInfo *other) { if (current->group && other->group && !EQUAL(current->group, other->group)) return MS_FALSE; if ((other->x - current->x) * (other->x - current->x) / ((current->bounds.maxx - current->x) * (current->bounds.maxx - current->x)) + (other->y - current->y) * (other->y - current->y) / ((current->bounds.maxy - current->y) * (current->bounds.maxy - current->y)) > 1) return MS_FALSE; return MS_TRUE; } int CompareRectangleRegion(clusterInfo *current, clusterInfo *other) { if (current->group && other->group && !EQUAL(current->group, other->group)) return MS_FALSE; if (other->x < current->bounds.minx) return MS_FALSE; if (other->x > current->bounds.maxx) return MS_FALSE; if (other->y < current->bounds.miny) return MS_FALSE; if (other->y > current->bounds.maxy) return MS_FALSE; return MS_TRUE; } static void treeSplitBounds(rectObj *in, rectObj *out1, rectObj *out2) { double range; /* -------------------------------------------------------------------- */ /* The output bounds will be very similar to the input bounds, */ /* so just copy over to start. */ /* -------------------------------------------------------------------- */ memcpy(out1, in, sizeof(rectObj)); memcpy(out2, in, sizeof(rectObj)); /* -------------------------------------------------------------------- */ /* Split in X direction. */ /* -------------------------------------------------------------------- */ if ((in->maxx - in->minx) > (in->maxy - in->miny)) { range = in->maxx - in->minx; out1->maxx = in->minx + range * SPLITRATIO; out2->minx = in->maxx - range * SPLITRATIO; } /* -------------------------------------------------------------------- */ /* Otherwise split in Y direction. */ /* -------------------------------------------------------------------- */ else { range = in->maxy - in->miny; out1->maxy = in->miny + range * SPLITRATIO; out2->miny = in->maxy - range * SPLITRATIO; } } /* alloc memory for a new tentative cluster */ static clusterInfo *clusterInfoCreate(msClusterLayerInfo *layerinfo) { clusterInfo *feature = (clusterInfo *)msSmallMalloc(sizeof(clusterInfo)); msInitShape(&feature->shape); feature->numsiblings = 0; feature->numcollected = 0; feature->numremoved = 0; feature->next = NULL; feature->group = NULL; feature->node = NULL; feature->siblings = NULL; feature->index = layerinfo->numFeatures; feature->filter = -1; /* not yet calculated */ ++layerinfo->numFeatures; return feature; } /* destroy memory of the cluster list */ static void clusterInfoDestroyList(msClusterLayerInfo *layerinfo, clusterInfo *feature) { clusterInfo *s = feature; clusterInfo *next; /* destroy the shapes added to this node */ while (s) { next = s->next; if (s->siblings) { clusterInfoDestroyList(layerinfo, s->siblings); } msFreeShape(&s->shape); msFree(s->group); msFree(s); --layerinfo->numFeatures; s = next; } } /* alloc memory for a new treenode */ static clusterTreeNode *clusterTreeNodeCreate(msClusterLayerInfo *layerinfo, rectObj rect) { clusterTreeNode *node = (clusterTreeNode *)msSmallMalloc(sizeof(clusterTreeNode)); node->rect = rect; node->numshapes = 0; node->shapes = NULL; node->subnode[0] = node->subnode[1] = node->subnode[2] = node->subnode[3] = NULL; node->index = layerinfo->numNodes; node->position = 0; ++layerinfo->numNodes; return node; } /* traverse the quadtree and destroy all sub elements */ static void clusterTreeNodeDestroy(msClusterLayerInfo *layerinfo, clusterTreeNode *node) { int i; /* destroy the shapes added to this node */ clusterInfoDestroyList(layerinfo, node->shapes); /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i]) clusterTreeNodeDestroy(layerinfo, node->subnode[i]); } msFree(node); --layerinfo->numNodes; } /* destroy memory of the cluster finalized list (without recursion) */ static void clusterTreeNodeDestroyList(msClusterLayerInfo *layerinfo, clusterTreeNode *node) { clusterTreeNode *n = node; clusterTreeNode *next; /* destroy the list of nodes */ while (n) { next = n->subnode[0]; n->subnode[0] = NULL; clusterTreeNodeDestroy(layerinfo, n); --layerinfo->numFinalizedNodes; n = next; } } void clusterDestroyData(msClusterLayerInfo *layerinfo) { if (layerinfo->finalized) { clusterInfoDestroyList(layerinfo, layerinfo->finalized); layerinfo->finalized = NULL; } layerinfo->numFinalized = 0; if (layerinfo->finalizedSiblings) { clusterInfoDestroyList(layerinfo, layerinfo->finalizedSiblings); layerinfo->finalizedSiblings = NULL; } layerinfo->numFinalizedSiblings = 0; if (layerinfo->filtered) { clusterInfoDestroyList(layerinfo, layerinfo->filtered); layerinfo->filtered = NULL; } layerinfo->numFiltered = 0; if (layerinfo->finalizedNodes) { clusterTreeNodeDestroyList(layerinfo, layerinfo->finalizedNodes); layerinfo->finalizedNodes = NULL; } layerinfo->numFinalizedNodes = 0; if (layerinfo->root) { clusterTreeNodeDestroy(layerinfo, layerinfo->root); layerinfo->root = NULL; } layerinfo->numNodes = 0; } /* traverse the quadtree to find the neighbouring shapes and update some data on the related shapes (when adding a new feature)*/ static void findRelatedShapes(msClusterLayerInfo *layerinfo, clusterTreeNode *node, clusterInfo *current) { int i; clusterInfo *s; /* -------------------------------------------------------------------- */ /* Does this node overlap the area of interest at all? If not, */ /* return without adding to the list at all. */ /* -------------------------------------------------------------------- */ if (!msRectOverlap(&node->rect, ¤t->bounds)) return; /* Modify the feature count of the related shapes */ s = node->shapes; while (s) { if (layerinfo->fnCompare(current, s)) { ++current->numsiblings; /* calculating the average positions */ current->avgx = (current->avgx * current->numsiblings + s->x) / (current->numsiblings + 1); current->avgy = (current->avgy * current->numsiblings + s->y) / (current->numsiblings + 1); /* calculating the variance */ current->varx = current->varx * current->numsiblings / (current->numsiblings + 1) + (s->x - current->avgx) * (s->x - current->avgx) / (current->numsiblings + 1); current->vary = current->vary * current->numsiblings / (current->numsiblings + 1) + (s->y - current->avgy) * (s->y - current->avgy) / (current->numsiblings + 1); if (layerinfo->fnCompare(s, current)) { /* this feature falls into the region of the other as well */ ++s->numsiblings; /* calculating the average positions */ s->avgx = (s->avgx * s->numsiblings + current->x) / (s->numsiblings + 1); s->avgy = (s->avgy * s->numsiblings + current->y) / (s->numsiblings + 1); /* calculating the variance */ s->varx = s->varx * s->numsiblings / (s->numsiblings + 1) + (current->x - s->avgx) * (current->x - s->avgx) / (s->numsiblings + 1); s->vary = s->vary * s->numsiblings / (s->numsiblings + 1) + (current->y - s->avgy) * (current->y - s->avgy) / (s->numsiblings + 1); } } s = s->next; } if (node->subnode[0] == NULL) return; /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i]) findRelatedShapes(layerinfo, node->subnode[i], current); } } /* traverse the quadtree to find the neighbouring clusters and update data on * the cluster*/ static void findRelatedShapes2(msClusterLayerInfo *layerinfo, clusterTreeNode *node, clusterInfo *current) { int i; clusterInfo *s; /* -------------------------------------------------------------------- */ /* Does this node overlap the area of interest at all? If not, */ /* return without adding to the list at all. */ /* -------------------------------------------------------------------- */ if (!msRectOverlap(&node->rect, ¤t->bounds)) return; /* Modify the feature count of the related shapes */ s = node->shapes; while (s) { if (layerinfo->fnCompare(s, current)) { if (layerinfo->rank > 0) { double r = (current->x - s->x) * (current->x - s->x) + (current->y - s->y) * (current->y - s->y); if (r < layerinfo->rank) { layerinfo->current = s; layerinfo->rank = r; } } else { /* no rank was specified, return immediately */ layerinfo->current = s; return; } } s = s->next; } if (node->subnode[0] == NULL) return; /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i]) findRelatedShapes2(layerinfo, node->subnode[i], current); } } /* traverse the quadtree to find the neighbouring shapes and update some data on the related shapes (when removing a feature) */ static void findRelatedShapesRemove(msClusterLayerInfo *layerinfo, clusterTreeNode *node, clusterInfo *current) { int i; clusterInfo *s; /* -------------------------------------------------------------------- */ /* Does this node overlap the area of interest at all? If not, */ /* return without adding to the list at all. */ /* -------------------------------------------------------------------- */ if (!msRectOverlap(&node->rect, ¤t->bounds)) return; /* Modify the feature count of the related shapes */ s = node->shapes; while (s) { if (layerinfo->fnCompare(current, s)) { if (s->numsiblings > 0) { /* calculating the average positions */ s->avgx = (s->avgx * (s->numsiblings + 1) - current->x) / s->numsiblings; s->avgy = (s->avgy * (s->numsiblings + 1) - current->y) / s->numsiblings; /* calculating the variance */ s->varx = (s->varx - (current->x - s->avgx) * (current->x - s->avgx) / s->numsiblings) * (s->numsiblings + 1) / s->numsiblings; s->vary = (s->vary - (current->y - s->avgy) * (current->y - s->avgy) / s->numsiblings) * (s->numsiblings + 1) / s->numsiblings; --s->numsiblings; ++s->numremoved; } } s = s->next; } /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i]) findRelatedShapesRemove(layerinfo, node->subnode[i], current); } } /* setting the aggregated attributes */ static void InitShapeAttributes(layerObj *layer, clusterInfo *base) { int i; int *itemindexes = layer->iteminfo; for (i = 0; i < layer->numitems; i++) { if (base->shape.numvalues <= i) break; if (itemindexes[i] == MSCLUSTER_FEATURECOUNTINDEX) { if (base->shape.values[i]) msFree(base->shape.values[i]); base->shape.values[i] = msIntToString(base->numsiblings + 1); } else if (itemindexes[i] == MSCLUSTER_GROUPINDEX) { if (base->shape.values[i]) msFree(base->shape.values[i]); if (base->group) base->shape.values[i] = msStrdup(base->group); else base->shape.values[i] = msStrdup(""); } else if (itemindexes[i] == MSCLUSTER_BASEFIDINDEX) { if (base->shape.values[i]) msFree(base->shape.values[i]); base->shape.values[i] = msIntToString(base->shape.index); } else if (EQUALN(layer->items[i], "Count:", 6)) { if (base->shape.values[i]) msFree(base->shape.values[i]); base->shape.values[i] = msStrdup("1"); /* initial count */ } } } /* update the shape attributes (aggregate) */ static void UpdateShapeAttributes(layerObj *layer, clusterInfo *base, clusterInfo *current) { int i; int *itemindexes = layer->iteminfo; for (i = 0; i < layer->numitems; i++) { if (base->shape.numvalues <= i) break; if (itemindexes[i] == MSCLUSTER_FEATURECOUNTINDEX || itemindexes[i] == MSCLUSTER_GROUPINDEX) continue; if (current->shape.numvalues <= i) break; /* setting the base feature index for each cluster member */ if (itemindexes[i] == MSCLUSTER_BASEFIDINDEX) { msFree(current->shape.values[i]); current->shape.values[i] = msIntToString(base->shape.index); } if (current->shape.values[i]) { if (EQUALN(layer->items[i], "Min:", 4)) { if (strcasecmp(base->shape.values[i], current->shape.values[i]) > 0) { msFree(base->shape.values[i]); base->shape.values[i] = msStrdup(current->shape.values[i]); } } else if (EQUALN(layer->items[i], "Max:", 4)) { if (strcasecmp(base->shape.values[i], current->shape.values[i]) < 0) { msFree(base->shape.values[i]); base->shape.values[i] = msStrdup(current->shape.values[i]); } } else if (EQUALN(layer->items[i], "Sum:", 4)) { double sum = atof(base->shape.values[i]) + atof(current->shape.values[i]); msFree(base->shape.values[i]); base->shape.values[i] = msDoubleToString(sum, MS_FALSE); } else if (EQUALN(layer->items[i], "Count:", 6)) { int count = atoi(base->shape.values[i]) + 1; msFree(base->shape.values[i]); base->shape.values[i] = msIntToString(count); } } } } static int BuildFeatureAttributes(layerObj *layer, msClusterLayerInfo *layerinfo, shapeObj *shape) { char **values; int i; int *itemindexes = layer->iteminfo; if (layer->numitems == layerinfo->srcLayer.numitems) return MS_SUCCESS; /* we don't have custom attributes, no need to reconstruct the array */ values = msSmallMalloc(sizeof(char *) * (layer->numitems)); for (i = 0; i < layer->numitems; i++) { if (itemindexes[i] == MSCLUSTER_FEATURECOUNTINDEX) { values[i] = NULL; /* not yet assigned */ } else if (itemindexes[i] == MSCLUSTER_GROUPINDEX) { values[i] = NULL; /* not yet assigned */ } else if (itemindexes[i] == MSCLUSTER_BASEFIDINDEX) { values[i] = NULL; /* not yet assigned */ } else if (shape->values[itemindexes[i]]) values[i] = msStrdup(shape->values[itemindexes[i]]); else values[i] = msStrdup(""); } if (shape->values) msFreeCharArray(shape->values, shape->numvalues); shape->values = values; shape->numvalues = layer->numitems; return MS_SUCCESS; } /* traverse the quadtree to find the best renking cluster */ static void findBestCluster(layerObj *layer, msClusterLayerInfo *layerinfo, clusterTreeNode *node) { int i; double rank; clusterInfo *s = node->shapes; while (s) { if (s->filter < 0 && layer->cluster.filter.string != NULL) { InitShapeAttributes(layer, s); s->filter = msClusterEvaluateFilter(&layer->cluster.filter, &s->shape); } if (s->numsiblings == 0 || s->filter == 0) { /* individual or filtered shapes must be removed for sure */ layerinfo->current = s; return; } /* calculating the rank */ rank = (s->x - s->avgx) * (s->x - s->avgx) + (s->y - s->avgy) * (s->y - s->avgy) /*+ s->varx + s->vary*/ + (double)1 / (1 + s->numsiblings); if (rank < layerinfo->rank) { layerinfo->current = s; layerinfo->rank = rank; } s = s->next; } /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i]) findBestCluster(layer, layerinfo, node->subnode[i]); } } /* adding the shape based on the shape bounds (point) */ static int treeNodeAddShape(msClusterLayerInfo *layerinfo, clusterTreeNode *node, clusterInfo *shape, int depth) { int i; /* -------------------------------------------------------------------- */ /* If there are subnodes, then consider whether this object */ /* will fit in them. */ /* -------------------------------------------------------------------- */ if (depth > 1 && node->subnode[0] != NULL) { for (i = 0; i < 4; i++) { if (msRectContained(&shape->shape.bounds, &node->subnode[i]->rect)) { return treeNodeAddShape(layerinfo, node->subnode[i], shape, depth - 1); } } } /* -------------------------------------------------------------------- */ /* Otherwise, consider creating four subnodes if could fit into */ /* them, and adding to the appropriate subnode. */ /* -------------------------------------------------------------------- */ else if (depth > 1 && node->subnode[0] == NULL) { rectObj half1, half2, quad1, quad2, quad3, quad4; int subnode = -1; treeSplitBounds(&node->rect, &half1, &half2); treeSplitBounds(&half1, &quad1, &quad2); treeSplitBounds(&half2, &quad3, &quad4); if (msRectContained(&shape->shape.bounds, &quad1)) subnode = 0; else if (msRectContained(&shape->shape.bounds, &quad2)) subnode = 1; else if (msRectContained(&shape->shape.bounds, &quad3)) subnode = 2; else if (msRectContained(&shape->shape.bounds, &quad4)) subnode = 3; if (subnode >= 0) { if ((node->subnode[0] = clusterTreeNodeCreate(layerinfo, quad1)) == NULL) return MS_FAILURE; node->subnode[0]->position = node->position * 4; if ((node->subnode[1] = clusterTreeNodeCreate(layerinfo, quad2)) == NULL) return MS_FAILURE; node->subnode[1]->position = node->position * 4 + 1; if ((node->subnode[2] = clusterTreeNodeCreate(layerinfo, quad3)) == NULL) return MS_FAILURE; node->subnode[2]->position = node->position * 4 + 2; if ((node->subnode[3] = clusterTreeNodeCreate(layerinfo, quad4)) == NULL) return MS_FAILURE; node->subnode[3]->position = node->position * 4 + 3; /* add to subnode */ return treeNodeAddShape(layerinfo, node->subnode[subnode], shape, depth - 1); } } /* found the right place, add this shape to the node */ node->numshapes++; shape->next = node->shapes; node->shapes = shape; shape->node = node; return MS_SUCCESS; } /* collecting the cluster shapes, returns true if this subnode must be removed */ static int collectClusterShapes(msClusterLayerInfo *layerinfo, clusterTreeNode *node, clusterInfo *current) { int i; clusterInfo *prev = NULL; clusterInfo *s = node->shapes; if (!msRectOverlap(&node->rect, ¤t->bounds)) return (!node->shapes && !node->subnode[0] && !node->subnode[1] && !node->subnode[2] && !node->subnode[3]); /* removing the shapes from this node if overlap with the cluster */ while (s) { if (s == current || layerinfo->fnCompare(current, s)) { if (s != current && current->filter == 0) { /* skip siblings of the filtered shapes */ prev = s; s = prev->next; continue; } /* removing from the list */ if (!prev) node->shapes = s->next; else prev->next = s->next; ++current->numcollected; /* adding the shape to the finalization list */ if (s == current) { if (s->filter) { s->next = layerinfo->finalized; layerinfo->finalized = s; ++layerinfo->numFinalized; } else { /* this shape is filtered */ s->next = layerinfo->filtered; layerinfo->filtered = s; ++layerinfo->numFiltered; } } else { s->next = layerinfo->finalizedSiblings; layerinfo->finalizedSiblings = s; ++layerinfo->numFinalizedSiblings; } if (!prev) s = node->shapes; else s = prev->next; } else { prev = s; s = prev->next; } } /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i] && collectClusterShapes(layerinfo, node->subnode[i], current)) { /* placing this empty node to the finalization queue */ node->subnode[i]->subnode[0] = layerinfo->finalizedNodes; layerinfo->finalizedNodes = node->subnode[i]; node->subnode[i] = NULL; ++layerinfo->numFinalizedNodes; } } /* returns true is this subnode must be removed */ return (!node->shapes && !node->subnode[0] && !node->subnode[1] && !node->subnode[2] && !node->subnode[3]); } /* collecting the cluster shapes, returns true if this subnode must be removed */ static int collectClusterShapes2(layerObj *layer, msClusterLayerInfo *layerinfo, clusterTreeNode *node) { int i; clusterInfo *current = NULL; clusterInfo *s; while (node->shapes) { s = node->shapes; /* removing from the list */ node->shapes = s->next; InitShapeAttributes(layer, s); if (s->filter) { s->next = layerinfo->finalized; layerinfo->finalized = s; ++layerinfo->numFinalized; } else { /* this shape is filtered */ s->next = layerinfo->filtered; layerinfo->filtered = s; ++layerinfo->numFiltered; } /* update the parameters of the related shapes if any */ if (s->siblings) { current = s->siblings; while (current) { UpdateShapeAttributes(layer, s, current); /* setting the average position to the cluster position */ current->avgx = s->x; current->avgy = s->y; if (current->next == NULL) { if (layerinfo->get_all_shapes == MS_TRUE) { /* insert the siblings into the finalization list */ current->next = layerinfo->finalized; layerinfo->finalized = s->siblings; s->siblings = NULL; } break; } current = current->next; } } } /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i] && collectClusterShapes2(layer, layerinfo, node->subnode[i])) { /* placing this empty node to the finalization queue */ node->subnode[i]->subnode[0] = layerinfo->finalizedNodes; layerinfo->finalizedNodes = node->subnode[i]; node->subnode[i] = NULL; ++layerinfo->numFinalizedNodes; } } /* returns true is this subnode must be removed */ return (!node->shapes && !node->subnode[0] && !node->subnode[1] && !node->subnode[2] && !node->subnode[3]); } int selectClusterShape(layerObj *layer, long shapeindex) { int i; clusterInfo *current; msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer not open: %s", "selectClusterShape()", layer->name); return MS_FAILURE; } i = 0; current = layerinfo->finalized; while (current && i < shapeindex) { ++i; current = current->next; } assert(current); current->next = current->siblings; layerinfo->current = current; if (layerinfo->keep_locations == MS_FALSE) { current->shape.line[0].point[0].x = current->shape.bounds.minx = current->shape.bounds.maxx = current->avgx; current->shape.line[0].point[0].y = current->shape.bounds.miny = current->shape.bounds.maxy = current->avgy; } return MS_SUCCESS; } /* update the parameters from the related shapes */ #ifdef ms_notused static void UpdateClusterParameters(msClusterLayerInfo *layerinfo, clusterTreeNode *node, clusterInfo *shape) { int i; clusterInfo *s = node->shapes; while (s) { if (layerinfo->fnCompare(shape, s)) { shape->avgx += s->x; shape->avgy += s->y; ++shape->numsiblings; } s = s->next; } /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i]) UpdateClusterParameters(layerinfo, node->subnode[i], shape); } } /* check for the validity of the clusters added to the tree (for debug purposes) */ static int ValidateTree(msClusterLayerInfo *layerinfo, clusterTreeNode *node) { int i; int isValid = MS_TRUE; clusterInfo *s = node->shapes; while (s) { double avgx = s->avgx; double avgy = s->avgy; int numsiblings = s->numsiblings; s->avgx = 0; s->avgy = 0; s->numsiblings = 0; UpdateClusterParameters(layerinfo, layerinfo->root, s); if (numsiblings + 1 != s->numsiblings) isValid = MS_FALSE; else if ((avgx * s->numsiblings - s->avgx) / s->avgx > 0.000001) isValid = MS_FALSE; else if ((avgy * s->numsiblings - s->avgy) / s->avgy > 0.000001) isValid = MS_FALSE; s->avgx = avgx; s->avgy = avgy; s->numsiblings = numsiblings; if (isValid == MS_FALSE) return MS_FALSE; s = s->next; } /* Recurse to subnodes if they exist */ for (i = 0; i < 4; i++) { if (node->subnode[i] && ValidateTree(layerinfo, node->subnode[i]) == MS_FALSE) return MS_FALSE; } /* returns true if this node contains only valid clusters */ return MS_TRUE; } #endif /* rebuild the clusters according to the current extent */ int RebuildClusters(layerObj *layer, int isQuery) { mapObj *map; layerObj *srcLayer; double distance, maxDistanceX, maxDistanceY, cellSizeX, cellSizeY; rectObj searchrect; int status; clusterInfo *current; int depth; const char *pszProcessing; #ifdef USE_CLUSTER_EXTERNAL int layerIndex; #endif reprojectionObj *reprojector = NULL; msClusterLayerInfo *layerinfo = layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer is not open: %s", "RebuildClusters()", layer->name); return MS_FAILURE; } if (!layer->map) { msSetError(MS_MISCERR, "No map associated with this layer: %s", "RebuildClusters()", layer->name); return MS_FAILURE; } if (layer->debug >= MS_DEBUGLEVEL_VVV) msDebug("Clustering started.\n"); map = layer->map; layerinfo->current = layerinfo->finalized; /* restart */ /* check whether the simplified algorithm was selected */ pszProcessing = msLayerGetProcessingKey(layer, "CLUSTER_ALGORITHM"); if (pszProcessing && !strncasecmp(pszProcessing, "SIMPLE", 6)) layerinfo->algorithm = MSCLUSTER_ALGORITHM_SIMPLE; else layerinfo->algorithm = MSCLUSTER_ALGORITHM_FULL; /* check whether all shapes should be returned from a query */ if (msLayerGetProcessingKey(layer, "CLUSTER_GET_ALL_SHAPES") != NULL) layerinfo->get_all_shapes = MS_TRUE; else layerinfo->get_all_shapes = MS_FALSE; /* check whether the location of the shapes should be preserved */ if (msLayerGetProcessingKey(layer, "CLUSTER_KEEP_LOCATIONS") != NULL) layerinfo->keep_locations = MS_TRUE; else layerinfo->keep_locations = MS_FALSE; /* check whether the maxdistance and the buffer parameters are specified in map units (scale independent clustering) */ if (msLayerGetProcessingKey(layer, "CLUSTER_USE_MAP_UNITS") != NULL) layerinfo->use_map_units = MS_TRUE; else layerinfo->use_map_units = MS_FALSE; /* identify the current extent */ if (layer->transform == MS_TRUE) searchrect = map->extent; else { searchrect.minx = searchrect.miny = 0; searchrect.maxx = map->width - 1; searchrect.maxy = map->height - 1; } if (searchrect.minx == layerinfo->searchRect.minx && searchrect.miny == layerinfo->searchRect.miny && searchrect.maxx == layerinfo->searchRect.maxx && searchrect.maxy == layerinfo->searchRect.maxy) { /* already built */ return MS_SUCCESS; } /* destroy previous data*/ clusterDestroyData(layerinfo); layerinfo->searchRect = searchrect; /* reproject the rectangle to layer coordinates */ if ((map->projection.numargs > 0) && (layer->projection.numargs > 0)) msProjectRect(&map->projection, &layer->projection, &searchrect); /* project the searchrect to source coords */ /* determine the compare method */ layerinfo->fnCompare = CompareRectangleRegion; if (layer->cluster.region) { if (EQUAL(layer->cluster.region, "ellipse")) layerinfo->fnCompare = CompareEllipseRegion; } /* trying to find a reasonable quadtree depth */ depth = 0; distance = layer->cluster.maxdistance; if (layerinfo->use_map_units == MS_TRUE) { while ((distance < (searchrect.maxx - searchrect.minx) || distance < (searchrect.maxy - searchrect.miny)) && depth <= TREE_MAX_DEPTH) { distance *= 2; ++depth; } cellSizeX = 1; cellSizeY = 1; } else { while ((distance < map->width || distance < map->height) && depth <= TREE_MAX_DEPTH) { distance *= 2; ++depth; } cellSizeX = MS_CELLSIZE(searchrect.minx, searchrect.maxx, map->width); cellSizeY = MS_CELLSIZE(searchrect.miny, searchrect.maxy, map->height); } layerinfo->depth = depth; maxDistanceX = layer->cluster.maxdistance * cellSizeX; maxDistanceY = layer->cluster.maxdistance * cellSizeY; /* increase the search rectangle so that the neighbouring shapes are also * retrieved */ searchrect.minx -= layer->cluster.buffer * cellSizeX; searchrect.maxx += layer->cluster.buffer * cellSizeX; searchrect.miny -= layer->cluster.buffer * cellSizeY; searchrect.maxy += layer->cluster.buffer * cellSizeY; /* create the root node */ if (layerinfo->root) clusterTreeNodeDestroy(layerinfo, layerinfo->root); layerinfo->root = clusterTreeNodeCreate(layerinfo, searchrect); srcLayer = &layerinfo->srcLayer; /* start retrieving the shapes */ status = msLayerWhichShapes(srcLayer, searchrect, isQuery); if (status == MS_DONE) { /* no overlap */ return MS_SUCCESS; } else if (status != MS_SUCCESS) { return MS_FAILURE; } /* step through the source shapes and populate the quadtree with the tentative * clusters */ if ((current = clusterInfoCreate(layerinfo)) == NULL) return MS_FAILURE; #if defined(USE_CLUSTER_EXTERNAL) if (srcLayer->transform == MS_TRUE && srcLayer->project && layer->transform == MS_TRUE && layer->project && msProjectionsDiffer(&(srcLayer->projection), &(layer->projection))) { reprojector = msProjectCreateReprojector(&srcLayer->projection, &layer->projection); } #endif while ((status = msLayerNextShape(srcLayer, ¤t->shape)) == MS_SUCCESS) { #if defined(USE_CLUSTER_EXTERNAL) /* transform the shape to the projection of this layer */ if (reprojector) msProjectShapeEx(reprojector, ¤t->shape); #endif /* set up positions and variance */ current->avgx = current->x = current->shape.bounds.minx; current->avgy = current->y = current->shape.bounds.miny; current->varx = current->vary = 0; /* set up the area of interest when searching for the neighboring shapes */ current->bounds.minx = current->x - maxDistanceX; current->bounds.miny = current->y - maxDistanceY; current->bounds.maxx = current->x + maxDistanceX; current->bounds.maxy = current->y + maxDistanceY; /* if the shape doesn't overlap we must skip it to avoid further issues */ if (!msRectOverlap(&searchrect, ¤t->bounds)) { msFreeShape(¤t->shape); msInitShape(¤t->shape); msDebug( "Skipping an invalid shape falling outside of the given extent\n"); continue; } /* construct the item array */ if (layer->iteminfo) BuildFeatureAttributes(layer, layerinfo, ¤t->shape); /* evaluate the group expression */ if (layer->cluster.group.string) current->group = msClusterGetGroupText(&layer->cluster.group, ¤t->shape); if (layerinfo->algorithm == MSCLUSTER_ALGORITHM_FULL) { /*start a query for the related shapes */ findRelatedShapes(layerinfo, layerinfo->root, current); /* add this shape to the tree */ if (treeNodeAddShape(layerinfo, layerinfo->root, current, depth) != MS_SUCCESS) { clusterInfoDestroyList(layerinfo, current); msProjectDestroyReprojector(reprojector); return MS_FAILURE; } } else if (layerinfo->algorithm == MSCLUSTER_ALGORITHM_SIMPLE) { /* find a related cluster and try to assign */ layerinfo->rank = 0; layerinfo->current = NULL; findRelatedShapes2(layerinfo, layerinfo->root, current); if (layerinfo->current) { /* store these points until all clusters are created */ current->next = layerinfo->finalizedSiblings; layerinfo->finalizedSiblings = current; } else { /* if not found add this shape as a new cluster */ if (treeNodeAddShape(layerinfo, layerinfo->root, current, depth) != MS_SUCCESS) { clusterInfoDestroyList(layerinfo, current); msProjectDestroyReprojector(reprojector); return MS_FAILURE; } } } if ((current = clusterInfoCreate(layerinfo)) == NULL) { clusterInfoDestroyList(layerinfo, current); msProjectDestroyReprojector(reprojector); return MS_FAILURE; } } msProjectDestroyReprojector(reprojector); clusterInfoDestroyList(layerinfo, current); if (layerinfo->algorithm == MSCLUSTER_ALGORITHM_FULL) { while (layerinfo->root) { #ifdef TESTCOUNT int n; double avgx, avgy; #endif /* pick up the best cluster from the tree and do the finalization */ /* the initial rank must be big enough */ layerinfo->rank = (searchrect.maxx - searchrect.minx) * (searchrect.maxx - searchrect.minx) + (searchrect.maxy - searchrect.miny) * (searchrect.maxy - searchrect.miny) + 1; layerinfo->current = NULL; findBestCluster(layer, layerinfo, layerinfo->root); if (layerinfo->current == NULL) { if (layer->debug >= MS_DEBUGLEVEL_VVV) msDebug("Clustering terminated.\n"); break; /* completed */ } /* Update the feature count of the shape */ InitShapeAttributes(layer, layerinfo->current); /* collecting the shapes of the cluster */ collectClusterShapes(layerinfo, layerinfo->root, layerinfo->current); if (layer->debug >= MS_DEBUGLEVEL_VVV) { msDebug( "processing cluster %p: rank=%lf fcount=%d ncoll=%d nfin=%d " "nfins=%d nflt=%d bounds={%lf %lf %lf %lf}\n", layerinfo->current, layerinfo->rank, layerinfo->current->numsiblings + 1, layerinfo->current->numcollected, layerinfo->numFinalized, layerinfo->numFinalizedSiblings, layerinfo->numFiltered, layerinfo->current->bounds.minx, layerinfo->current->bounds.miny, layerinfo->current->bounds.maxx, layerinfo->current->bounds.maxy); if (layerinfo->current->node) { char pszBuffer[TREE_MAX_DEPTH + 1]; clusterTreeNode *node = layerinfo->current->node; int position = node->position; int i = 1; while (position > 0 && i <= TREE_MAX_DEPTH) { pszBuffer[TREE_MAX_DEPTH - i] = '0' + (position % 4); position = position >> 2; ++i; } pszBuffer[TREE_MAX_DEPTH] = 0; msDebug(" ->node %p: count=%d index=%d pos=%s subn={%p %p %p %p} " "rect={%lf %lf %lf %lf}\n", node, node->numshapes, node->index, pszBuffer + TREE_MAX_DEPTH - i + 1, node->subnode[0], node->subnode[1], node->subnode[2], node->subnode[3], node->rect.minx, node->rect.miny, node->rect.maxx, node->rect.maxy); } } #ifdef TESTCOUNT avgx = layerinfo->current->x; avgy = layerinfo->current->y; n = 0; #endif if (layerinfo->current->numsiblings > 0) { /* update the parameters due to the shape removal */ findRelatedShapesRemove(layerinfo, layerinfo->root, layerinfo->current); if (layerinfo->current->filter == 0) { /* filtered shapes has no siblings */ layerinfo->current->numsiblings = 0; layerinfo->current->avgx = layerinfo->current->x; layerinfo->current->avgy = layerinfo->current->y; } /* update the parameters of the related shapes if any */ if (layerinfo->finalizedSiblings) { current = layerinfo->finalizedSiblings; while (current) { /* update the parameters due to the shape removal */ findRelatedShapesRemove(layerinfo, layerinfo->root, current); UpdateShapeAttributes(layer, layerinfo->current, current); #ifdef TESTCOUNT avgx += current->x; avgy += current->y; ++n; #endif /* setting the average position to the same value */ current->avgx = layerinfo->current->avgx; current->avgy = layerinfo->current->avgy; if (current->next == NULL) { if (layerinfo->get_all_shapes == MS_TRUE) { /* insert the siblings into the finalization list */ current->next = layerinfo->finalized; layerinfo->finalized = layerinfo->finalizedSiblings; } else { /* preserve the clustered siblings for later use */ layerinfo->current->siblings = layerinfo->finalizedSiblings; } break; } current = current->next; } layerinfo->finalizedSiblings = NULL; } } #ifdef TESTCOUNT avgx /= (n + 1); avgy /= (n + 1); if (layerinfo->current->numsiblings != n) layerinfo->current->numsiblings = n; if (fabs(layerinfo->current->avgx - avgx) / avgx > 0.000000001 || fabs(layerinfo->current->avgy - avgy) / avgy > 0.000000001) { layerinfo->current->avgx = avgx; layerinfo->current->avgy = avgy; } #endif } } else if (layerinfo->algorithm == MSCLUSTER_ALGORITHM_SIMPLE) { /* assingn stired points to clusters */ while (layerinfo->finalizedSiblings) { current = layerinfo->finalizedSiblings; layerinfo->rank = maxDistanceX * maxDistanceX + maxDistanceY * maxDistanceY; layerinfo->current = NULL; findRelatedShapes2(layerinfo, layerinfo->root, current); if (layerinfo->current) { clusterInfo *s = layerinfo->current; /* found a matching cluster */ ++s->numsiblings; /* assign to cluster */ layerinfo->finalizedSiblings = current->next; current->next = s->siblings; s->siblings = current; } else { /* this appears to be a bug */ layerinfo->finalizedSiblings = current->next; current->next = layerinfo->filtered; layerinfo->filtered = current; ++layerinfo->numFiltered; } } /* collecting the shapes of the cluster */ collectClusterShapes2(layer, layerinfo, layerinfo->root); } /* set the pointer to the first shape */ layerinfo->current = layerinfo->finalized; return MS_SUCCESS; } /* Close the combined layer */ int msClusterLayerClose(layerObj *layer) { msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (!layerinfo) return MS_SUCCESS; clusterDestroyData(layerinfo); msLayerClose(&layerinfo->srcLayer); freeLayer(&layerinfo->srcLayer); msFree(layerinfo); layer->layerinfo = NULL; #ifndef USE_CLUSTER_EXTERNAL /* switch back to the source layer vtable */ if (msInitializeVirtualTable(layer) != MS_SUCCESS) return MS_FAILURE; #endif return MS_SUCCESS; } /* Return MS_TRUE if layer is open, MS_FALSE otherwise. */ int msClusterLayerIsOpen(layerObj *layer) { if (layer->layerinfo) return (MS_TRUE); else return (MS_FALSE); } /* Free the itemindexes array in a layer. */ void msClusterLayerFreeItemInfo(layerObj *layer) { msFree(layer->iteminfo); layer->iteminfo = NULL; } /* allocate the iteminfo index array - same order as the item list */ int msClusterLayerInitItemInfo(layerObj *layer) { int i, numitems; int *itemindexes; msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (layer->numitems == 0) { return MS_SUCCESS; } if (!layerinfo) return MS_FAILURE; /* Cleanup any previous item selection */ msClusterLayerFreeItemInfo(layer); layer->iteminfo = (int *)msSmallMalloc(sizeof(int) * layer->numitems); itemindexes = layer->iteminfo; /* check whether we require attributes from the source layers also */ numitems = 0; for (i = 0; i < layer->numitems; i++) { if (EQUAL(layer->items[i], MSCLUSTER_FEATURECOUNT)) itemindexes[i] = MSCLUSTER_FEATURECOUNTINDEX; else if (EQUAL(layer->items[i], MSCLUSTER_GROUP)) itemindexes[i] = MSCLUSTER_GROUPINDEX; else if (EQUAL(layer->items[i], MSCLUSTER_BASEFID)) itemindexes[i] = MSCLUSTER_BASEFIDINDEX; else itemindexes[i] = numitems++; } msLayerFreeItemInfo(&layerinfo->srcLayer); if (layerinfo->srcLayer.items) { msFreeCharArray(layerinfo->srcLayer.items, layerinfo->srcLayer.numitems); layerinfo->srcLayer.items = NULL; layerinfo->srcLayer.numitems = 0; } if (numitems > 0) { /* now allocate and set the layer item parameters */ layerinfo->srcLayer.items = (char **)msSmallMalloc(sizeof(char *) * numitems); layerinfo->srcLayer.numitems = numitems; for (i = 0; i < layer->numitems; i++) { if (itemindexes[i] >= 0) { if (EQUALN(layer->items[i], "Min:", 4)) layerinfo->srcLayer.items[itemindexes[i]] = msStrdup(layer->items[i] + 4); else if (EQUALN(layer->items[i], "Max:", 4)) layerinfo->srcLayer.items[itemindexes[i]] = msStrdup(layer->items[i] + 4); else if (EQUALN(layer->items[i], "Sum:", 4)) layerinfo->srcLayer.items[itemindexes[i]] = msStrdup(layer->items[i] + 4); else if (EQUALN(layer->items[i], "Count:", 6)) layerinfo->srcLayer.items[itemindexes[i]] = msStrdup(layer->items[i] + 6); else layerinfo->srcLayer.items[itemindexes[i]] = msStrdup(layer->items[i]); } } if (msLayerInitItemInfo(&layerinfo->srcLayer) != MS_SUCCESS) return MS_FAILURE; } return MS_SUCCESS; } /* Execute a query for this layer */ int msClusterLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { (void)rect; /* rebuild the cluster database */ return RebuildClusters(layer, isQuery); } static int prepareShape(layerObj *layer, msClusterLayerInfo *layerinfo, clusterInfo *current, shapeObj *shape) { (void)layer; if (msCopyShape(&(current->shape), shape) != MS_SUCCESS) { msSetError( MS_SHPERR, "Cannot retrieve inline shape. There some problem with the shape", "msClusterLayerNextShape()"); return MS_FAILURE; } /* update the positions of the cluster shape */ if (layerinfo->keep_locations == MS_FALSE) { shape->line[0].point[0].x = shape->bounds.minx = shape->bounds.maxx = current->avgx; shape->line[0].point[0].y = shape->bounds.miny = shape->bounds.maxy = current->avgy; } return MS_SUCCESS; } /* Execute a query on the DB based on fid. */ int msClusterLayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { clusterInfo *current; msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer not open: %s", "msClusterLayerGetShape()", layer->name); return MS_FAILURE; } current = layerinfo->finalized; while (current) { if (record->shapeindex == current->shape.index && record->tileindex == current->shape.tileindex) break; current = current->next; } if (current == NULL) { msSetError(MS_SHPERR, "No feature with this index.", "msClusterLayerGetShape()"); return MS_FAILURE; } return prepareShape(layer, layerinfo, current, shape); } int msClusterLayerGetExtent(layerObj *layer, rectObj *extent) { msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer not open: %s", "msClusterLayerGetExtent()", layer->name); return MS_FAILURE; } int status = layerinfo->srcLayer.vtable->LayerGetExtent(&layerinfo->srcLayer, extent); return status; } /* find the next shape with the appropriate shape type */ /* also, load in the attribute data */ /* MS_DONE => no more data */ int msClusterLayerNextShape(layerObj *layer, shapeObj *shape) { int rv; msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer not open: %s", "msClusterLayerNextShape()", layer->name); return MS_FAILURE; } if (!layerinfo->current) return MS_DONE; rv = prepareShape(layer, layerinfo, layerinfo->current, shape); layerinfo->current = layerinfo->current->next; return rv; } /* Query for the items collection */ int msClusterLayerGetItems(layerObj *layer) { /* we support certain built in attributes */ layer->numitems = MSCLUSTER_NUMITEMS; layer->items = msSmallMalloc(sizeof(char *) * (layer->numitems)); layer->items[0] = msStrdup(MSCLUSTER_FEATURECOUNT); layer->items[1] = msStrdup(MSCLUSTER_GROUP); layer->items[2] = msStrdup(MSCLUSTER_BASEFID); return msClusterLayerInitItemInfo(layer); } int msClusterLayerGetNumFeatures(layerObj *layer) { msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)layer->layerinfo; if (!layerinfo) return -1; return layerinfo->numFinalized; } static int msClusterLayerGetAutoStyle(mapObj *map, layerObj *layer, classObj *c, shapeObj *shape) { (void)map; (void)layer; (void)c; (void)shape; /* TODO */ return MS_SUCCESS; } msClusterLayerInfo *msClusterInitialize(layerObj *layer) { msClusterLayerInfo *layerinfo = (msClusterLayerInfo *)msSmallMalloc(sizeof(msClusterLayerInfo)); layer->layerinfo = layerinfo; layerinfo->searchRect.minx = -1; layerinfo->searchRect.miny = -1; layerinfo->searchRect.maxx = -1; layerinfo->searchRect.maxy = -1; layerinfo->root = NULL; layerinfo->get_all_shapes = MS_FALSE; layerinfo->numFeatures = 0; layerinfo->numNodes = 0; layerinfo->finalized = NULL; layerinfo->numFinalized = 0; layerinfo->finalizedSiblings = NULL; layerinfo->numFinalizedSiblings = 0; layerinfo->filtered = NULL; layerinfo->numFiltered = 0; layerinfo->finalizedNodes = NULL; layerinfo->numFinalizedNodes = 0; return layerinfo; } int msClusterLayerOpen(layerObj *layer) { msClusterLayerInfo *layerinfo; if (layer->type != MS_LAYER_POINT) { msSetError(MS_MISCERR, "Only point layers are supported for clustering: %s", "msClusterLayerOpen()", layer->name); return MS_FAILURE; } if (!layer->map) return MS_FAILURE; if (layer->layerinfo) { if (layer->vtable->LayerOpen != msClusterLayerOpen) msLayerClose(layer); else return MS_SUCCESS; /* already open */ } layerinfo = msClusterInitialize(layer); if (!layer->layerinfo) return MS_FAILURE; /* prepare the source layer */ if (initLayer(&layerinfo->srcLayer, layer->map) == -1) return MS_FAILURE; #ifdef USE_CLUSTER_EXTERNAL if (!layer->map) return MS_FAILURE; layerIndex = msGetLayerIndex(layer->map, layer->connection); if (layerIndex < 0 && layerIndex >= layer->map->numlayers) { msSetError(MS_MISCERR, "No source layers specified in layer: %s", "msClusterLayerOpen()", layer->name); return MS_FAILURE; } if (layer->map->layers[layerIndex]->type != MS_LAYER_POINT) { msSetError(MS_MISCERR, "Only point layers are supported for cluster data source: %s", "msClusterLayerOpen()", layer->name); return MS_FAILURE; } if (msCopyLayer(&layerinfo->srcLayer, layer->map->layers[layerIndex]) != MS_SUCCESS) return (MS_FAILURE); #else /* hook the vtable to this driver, will be restored in LayerClose*/ if (!layer->vtable) { if (msInitializeVirtualTable(layer) != MS_SUCCESS) return MS_FAILURE; } assert(layer->vtable); msClusterLayerCopyVirtualTable(layer->vtable); if (msCopyLayer(&layerinfo->srcLayer, layer) != MS_SUCCESS) return (MS_FAILURE); #endif /* disable the connection pool for this layer */ msLayerSetProcessingKey(&layerinfo->srcLayer, "CLOSE_CONNECTION", "ALWAYS"); /* open the source layer */ if (!layerinfo->srcLayer.vtable) { if (msInitializeVirtualTable(&layerinfo->srcLayer) != MS_SUCCESS) return MS_FAILURE; } if (layerinfo->srcLayer.vtable->LayerOpen(&layerinfo->srcLayer) != MS_SUCCESS) { return MS_FAILURE; } return MS_SUCCESS; } int msClusterLayerTranslateFilter(layerObj *layer, expressionObj *filter, char *filteritem) { (void)filter; msClusterLayerInfo *layerinfo = layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer is not open: %s", "msClusterLayerTranslateFilter()", layer->name); return MS_FAILURE; } if (layerinfo->srcLayer.filter.type == MS_EXPRESSION && layerinfo->srcLayer.filter.tokens == NULL) msTokenizeExpression(&(layerinfo->srcLayer.filter), layer->items, &(layer->numitems)); return layerinfo->srcLayer.vtable->LayerTranslateFilter( &layerinfo->srcLayer, &layerinfo->srcLayer.filter, filteritem); } char *msClusterLayerEscapeSQLParam(layerObj *layer, const char *pszString) { msClusterLayerInfo *layerinfo = layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer is not open: %s", "msClusterLayerEscapeSQLParam()", layer->name); return msStrdup(""); } return layerinfo->srcLayer.vtable->LayerEscapeSQLParam(&layerinfo->srcLayer, pszString); } int msClusterLayerGetAutoProjection(layerObj *layer, projectionObj *projection) { msClusterLayerInfo *layerinfo = layer->layerinfo; if (!layerinfo) { msSetError(MS_MISCERR, "Layer is not open: %s", "msClusterLayerGetAutoProjection()", layer->name); return MS_FAILURE; } return layerinfo->srcLayer.vtable->LayerGetAutoProjection( &layerinfo->srcLayer, projection); } int msClusterLayerGetPaging(layerObj *layer) { (void)layer; return MS_FALSE; } void msClusterLayerEnablePaging(layerObj *layer, int value) { (void)layer; (void)value; } void msClusterLayerCopyVirtualTable(layerVTableObj *vtable) { vtable->LayerInitItemInfo = msClusterLayerInitItemInfo; vtable->LayerFreeItemInfo = msClusterLayerFreeItemInfo; vtable->LayerOpen = msClusterLayerOpen; vtable->LayerIsOpen = msClusterLayerIsOpen; vtable->LayerWhichShapes = msClusterLayerWhichShapes; vtable->LayerNextShape = msClusterLayerNextShape; vtable->LayerGetShape = msClusterLayerGetShape; vtable->LayerGetExtent = msClusterLayerGetExtent; /* layer->vtable->LayerGetShapeCount, use default */ vtable->LayerClose = msClusterLayerClose; vtable->LayerGetItems = msClusterLayerGetItems; vtable->LayerCloseConnection = msClusterLayerClose; vtable->LayerGetNumFeatures = msClusterLayerGetNumFeatures; vtable->LayerGetAutoStyle = msClusterLayerGetAutoStyle; vtable->LayerTranslateFilter = msClusterLayerTranslateFilter; /* vtable->LayerSupportsCommonFilters, use driver implementation */ vtable->LayerEscapeSQLParam = msClusterLayerEscapeSQLParam; /* vtable->LayerEscapePropertyName, use driver implementation */ vtable->LayerEnablePaging = msClusterLayerEnablePaging; vtable->LayerGetPaging = msClusterLayerGetPaging; vtable->LayerGetAutoProjection = msClusterLayerGetAutoProjection; } #ifdef USE_CLUSTER_PLUGIN MS_DLL_EXPORT int PluginInitializeVirtualTable(layerVTableObj *vtable, layerObj *layer) { assert(layer != NULL); assert(vtable != NULL); msClusterLayerCopyVirtualTable(vtable); return MS_SUCCESS; } #endif int msClusterLayerInitializeVirtualTable(layerObj *layer) { assert(layer != NULL); assert(layer->vtable != NULL); msClusterLayerCopyVirtualTable(layer->vtable); return MS_SUCCESS; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.6.0/src/mapcompositingfilter.c����������������������������������������������������������0000664�0000000�0000000�00000021277�15114050610�0020725�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************************** * * Project: MapServer * Purpose: RFC 113 Layer compositing * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2015 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #ifdef USE_PCRE2 #include #else #include #endif #define pixmove(rb, srcx, srcy, dstx, dsty) \ memcpy(rb->data.rgba.pixels + dsty * rb->data.rgba.row_step + dstx * 4, \ rb->data.rgba.pixels + srcy * rb->data.rgba.row_step + srcx * 4, 4) #define pixerase(rb, x, y) \ memset(rb->data.rgba.pixels + y * rb->data.rgba.row_step + x * 4, 0, 4) void msApplyTranslationCompositingFilter(rasterBufferObj *rb, int xtrans, int ytrans) { int src_sx, src_sy, dst_sx, dst_sy; if ((unsigned)abs(xtrans) >= rb->width || (unsigned)abs(ytrans) >= rb->height) { for (unsigned y = 0; y < rb->height; y++) for (unsigned x = 0; x < rb->width; x++) pixerase(rb, x, y); } if (xtrans == 0 && ytrans == 0) return; if (xtrans >= 0) { if (ytrans >= 0) { src_sx = rb->width - xtrans - 1; src_sy = rb->height - ytrans - 1; dst_sx = rb->width - 1; dst_sy = rb->height - 1; for (int y = src_sy, dst_y = dst_sy; y >= 0; y--, dst_y--) { for (int x = src_sx, dst_x = dst_sx; x >= 0; x--, dst_x--) { pixmove(rb, x, y, dst_x, dst_y); } } for (int y = 0; y < ytrans; y++) for (unsigned x = 0; x < rb->width; x++) pixerase(rb, x, y); for (unsigned y = ytrans; y < rb->height; y++) for (int x = 0; x < xtrans; x++) pixerase(rb, x, y); } else { src_sx = rb->width - xtrans - 1; src_sy = -ytrans; dst_sx = rb->width - 1; dst_sy = 0; for (unsigned y = src_sy, dst_y = dst_sy; y < rb->height; y++, dst_y++) { for (int x = src_sx, dst_x = dst_sx; x >= 0; x--, dst_x--) { pixmove(rb, x, y, dst_x, dst_y); } } for (unsigned y = 0; y < rb->height + ytrans; y++) for (int x = 0; x < xtrans; x++) pixerase(rb, x, y); for (unsigned y = rb->height + ytrans; y < rb->height; y++) for (unsigned x = 0; x < rb->width; x++) pixerase(rb, x, y); } } else { if (ytrans >= 0) { src_sx = -xtrans; src_sy = rb->height - ytrans - 1; dst_sx = 0; dst_sy = rb->height - 1; for (int y = src_sy, dst_y = dst_sy; y >= 0; y--, dst_y--) { for (unsigned x = src_sx, dst_x = dst_sx; x < rb->width; x++, dst_x++) { pixmove(rb, x, y, dst_x, dst_y); } } for (int y = 0; y < ytrans; y++) for (unsigned x = 0; x < rb->width; x++) pixerase(rb, x, y); for (unsigned y = ytrans; y < rb->height; y++) for (unsigned x = rb->width + xtrans; x < rb->width; x++) pixerase(rb, x, y); } else { src_sx = -xtrans; src_sy = -ytrans; dst_sx = 0; dst_sy = 0; for (unsigned y = src_sy, dst_y = dst_sy; y < rb->height; y++, dst_y++) { for (unsigned x = src_sx, dst_x = dst_sx; x < rb->width; x++, dst_x++) { pixmove(rb, x, y, dst_x, dst_y); } } for (unsigned y = 0; y < rb->height + ytrans; y++) for (unsigned x = rb->width + xtrans; x < rb->width; x++) pixerase(rb, x, y); for (unsigned y = rb->height + ytrans; y < rb->height; y++) for (unsigned x = 0; x < rb->width; x++) pixerase(rb, x, y); } } } void msApplyBlackeningCompositingFilter(rasterBufferObj *rb) { unsigned char *r, *g, *b; for (unsigned row = 0; row < rb->height; row++) { r = rb->data.rgba.r + row * rb->data.rgba.row_step; g = rb->data.rgba.g + row * rb->data.rgba.row_step; b = rb->data.rgba.b + row * rb->data.rgba.row_step; for (unsigned col = 0; col < rb->width; col++) { *r = *g = *b = 0; r += 4; g += 4; b += 4; } } } void msApplyWhiteningCompositingFilter(rasterBufferObj *rb) { unsigned char *r, *g, *b, *a; for (unsigned row = 0; row < rb->height; row++) { r = rb->data.rgba.r + row * rb->data.rgba.row_step; g = rb->data.rgba.g + row * rb->data.rgba.row_step; b = rb->data.rgba.b + row * rb->data.rgba.row_step; a = rb->data.rgba.a + row * rb->data.rgba.row_step; for (unsigned col = 0; col < rb->width; col++) { *r = *g = *b = *a; r += 4; g += 4; b += 4; a += 4; } } } void msApplyGrayscaleCompositingFilter(rasterBufferObj *rb) { unsigned char *r, *g, *b; for (unsigned row = 0; row < rb->height; row++) { r = rb->data.rgba.r + row * rb->data.rgba.row_step; g = rb->data.rgba.g + row * rb->data.rgba.row_step; b = rb->data.rgba.b + row * rb->data.rgba.row_step; for (unsigned col = 0; col < rb->width; col++) { unsigned int mix = (unsigned int)*r + (unsigned int)*g + (unsigned int)*b; mix /= 3; *r = *g = *b = (unsigned char)mix; r += 4; g += 4; b += 4; } } } int msApplyCompositingFilter(mapObj *map, rasterBufferObj *rb, CompositingFilter *filter) { int rstatus; regex_t regex; regmatch_t pmatch[3]; /* test for blurring filter */ regcomp(®ex, "blur\\(([0-9]+)\\)", REG_EXTENDED); rstatus = regexec(®ex, filter->filter, 2, pmatch, 0); regfree(®ex); if (!rstatus) { char *rad = malloc(pmatch[1].rm_eo - pmatch[1].rm_so + 1); unsigned int irad; strncpy(rad, filter->filter + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so); rad[pmatch[1].rm_eo - pmatch[1].rm_so] = 0; // msDebug("got blur filter with radius %s\n",rad); irad = atoi(rad); free(rad); irad = MS_NINT(irad * map->resolution / map->defresolution); msApplyBlurringCompositingFilter(rb, irad); return MS_SUCCESS; } /* test for translation filter */ regcomp(®ex, "translate\\((-?[0-9]+),(-?[0-9]+)\\)", REG_EXTENDED); rstatus = regexec(®ex, filter->filter, 3, pmatch, 0); regfree(®ex); if (!rstatus) { char *num; int xtrans, ytrans; num = malloc(pmatch[1].rm_eo - pmatch[1].rm_so + 1); strncpy(num, filter->filter + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so); num[pmatch[1].rm_eo - pmatch[1].rm_so] = 0; xtrans = atoi(num); free(num); num = malloc(pmatch[2].rm_eo - pmatch[2].rm_so + 1); strncpy(num, filter->filter + pmatch[2].rm_so, pmatch[2].rm_eo - pmatch[2].rm_so); num[pmatch[2].rm_eo - pmatch[2].rm_so] = 0; ytrans = atoi(num); free(num); // msDebug("got translation filter of radius %d,%d\n",xtrans,ytrans); xtrans = MS_NINT(xtrans * map->resolution / map->defresolution); ytrans = MS_NINT(ytrans * map->resolution / map->defresolution); msApplyTranslationCompositingFilter(rb, xtrans, ytrans); return MS_SUCCESS; } /* test for grayscale filter */ if (!strncmp(filter->filter, "grayscale()", strlen("grayscale()"))) { msApplyGrayscaleCompositingFilter(rb); return MS_SUCCESS; } if (!strncmp(filter->filter, "blacken()", strlen("blacken()"))) { msApplyBlackeningCompositingFilter(rb); return MS_SUCCESS; } if (!strncmp(filter->filter, "whiten()", strlen("whiten()"))) { msApplyWhiteningCompositingFilter(rb); return MS_SUCCESS; } msSetError(MS_MISCERR, "unknown compositing filter (%s)", "msApplyCompositingFilter()", filter->filter); return MS_FAILURE; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.6.0/src/mapcontext.c��������������������������������������������������������������������0000664�0000000�0000000�00000206430�15114050610�0016644�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/********************************************************************** * $Id$ * * Project: MapServer * Purpose: OGC Web Map Context implementation * Author: Julien-Samuel Lacroix, DM Solutions Group (lacroix@dmsolutions.ca) * ********************************************************************** * Copyright (c) 2002-2003, Julien-Samuel Lacroix, DM Solutions Group Inc * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapserver.h" #include "mapows.h" #include "cpl_vsi.h" #include "cpl_conv.h" #if defined(USE_WMS_LYR) /* There is a dependency to GDAL/OGR for the GML driver and MiniXML parser */ #include "cpl_minixml.h" #endif /* msGetMapContextFileText() ** ** Read a file and return is content ** ** Take the filename in argument ** Return value must be freed by caller */ static char *msGetMapContextFileText(const char *filename) { char *pszBuffer; VSILFILE *stream; vsi_l_offset nLength; /* open file */ if (filename != NULL && strlen(filename) > 0) { stream = VSIFOpenL(filename, "rb"); if (!stream) { msSetError(MS_IOERR, "(%s)", "msGetMapContextFileText()", filename); return NULL; } } else { msSetError(MS_IOERR, "(%s)", "msGetMapContextFileText()", filename); return NULL; } VSIFSeekL(stream, 0, SEEK_END); nLength = VSIFTellL(stream); VSIFSeekL(stream, 0, SEEK_SET); if (nLength > 100 * 1024 * 1024U) { msSetError(MS_MEMERR, "(%s): too big file", "msGetMapContextFileText()", filename); VSIFCloseL(stream); return NULL; } pszBuffer = (char *)malloc((size_t)nLength + 1); if (pszBuffer == NULL) { msSetError(MS_MEMERR, "(%s)", "msGetMapContextFileText()", filename); VSIFCloseL(stream); return NULL; } if (VSIFReadL(pszBuffer, nLength, 1, stream) == 0) { free(pszBuffer); VSIFCloseL(stream); msSetError(MS_IOERR, "(%s)", "msGetMapContextFileText()", filename); return NULL; } pszBuffer[nLength] = '\0'; VSIFCloseL(stream); return pszBuffer; } #if defined(USE_WMS_LYR) /* **msGetMapContextXMLHashValue() ** **Get the xml value and put it in the hash table ** */ int msGetMapContextXMLHashValue(CPLXMLNode *psRoot, const char *pszXMLPath, hashTableObj *metadata, char *pszMetadata) { char *pszValue; pszValue = (char *)CPLGetXMLValue(psRoot, pszXMLPath, NULL); if (pszValue != NULL) { if (metadata != NULL) { msInsertHashTable(metadata, pszMetadata, pszValue); } else { return MS_FAILURE; } } else { return MS_FAILURE; } return MS_SUCCESS; } /* **msGetMapContextXMLHashValue() ** **Get the xml value and put it in the hash table ** */ int msGetMapContextXMLHashValueDecode(CPLXMLNode *psRoot, const char *pszXMLPath, hashTableObj *metadata, char *pszMetadata) { char *pszValue; pszValue = (char *)CPLGetXMLValue(psRoot, pszXMLPath, NULL); if (pszValue != NULL) { if (metadata != NULL) { msDecodeHTMLEntities(pszValue); msInsertHashTable(metadata, pszMetadata, pszValue); } else { return MS_FAILURE; } } else { return MS_FAILURE; } return MS_SUCCESS; } /* **msGetMapContextXMLStringValue() ** **Get the xml value and put it in the string field ** */ int msGetMapContextXMLStringValue(CPLXMLNode *psRoot, char *pszXMLPath, char **pszField) { char *pszValue; pszValue = (char *)CPLGetXMLValue(psRoot, pszXMLPath, NULL); if (pszValue != NULL) { if (pszField != NULL) { *pszField = msStrdup(pszValue); } else { return MS_FAILURE; } } else { return MS_FAILURE; } return MS_SUCCESS; } /* **msGetMapContextXMLStringValue() ** **Get the xml value and put it in the string field ** */ int msGetMapContextXMLStringValueDecode(CPLXMLNode *psRoot, char *pszXMLPath, char **pszField) { char *pszValue; pszValue = (char *)CPLGetXMLValue(psRoot, pszXMLPath, NULL); if (pszValue != NULL) { if (pszField != NULL) { msDecodeHTMLEntities(pszValue); *pszField = msStrdup(pszValue); } else { return MS_FAILURE; } } else { return MS_FAILURE; } return MS_SUCCESS; } /* **msGetMapContextXMLFloatValue() ** **Get the xml value and put it in the string field ** */ int msGetMapContextXMLFloatValue(CPLXMLNode *psRoot, char *pszXMLPath, double *pszField) { char *pszValue; pszValue = (char *)CPLGetXMLValue(psRoot, pszXMLPath, NULL); if (pszValue != NULL) { if (pszField != NULL) { *pszField = atof(pszValue); } else { return MS_FAILURE; } } else { return MS_FAILURE; } return MS_SUCCESS; } /* ** msLoadMapContextURLELements ** ** Take a Node and get the width, height, format and href from it. ** Then put this info in metadatas. */ int msLoadMapContextURLELements(CPLXMLNode *psRoot, hashTableObj *metadata, const char *pszMetadataRoot) { char *pszMetadataName; if (psRoot == NULL || metadata == NULL || pszMetadataRoot == NULL) return MS_FAILURE; pszMetadataName = (char *)malloc(strlen(pszMetadataRoot) + 10); sprintf(pszMetadataName, "%s_width", pszMetadataRoot); msGetMapContextXMLHashValue(psRoot, "width", metadata, pszMetadataName); sprintf(pszMetadataName, "%s_height", pszMetadataRoot); msGetMapContextXMLHashValue(psRoot, "height", metadata, pszMetadataName); sprintf(pszMetadataName, "%s_format", pszMetadataRoot); msGetMapContextXMLHashValue(psRoot, "format", metadata, pszMetadataName); sprintf(pszMetadataName, "%s_href", pszMetadataRoot); msGetMapContextXMLHashValue(psRoot, "OnlineResource.xlink:href", metadata, pszMetadataName); free(pszMetadataName); return MS_SUCCESS; } /* msLoadMapContextKeyword ** ** Put the keywords from a XML node and put them in a metadata. ** psRoot should be set to keywordlist */ int msLoadMapContextListInMetadata(CPLXMLNode *psRoot, hashTableObj *metadata, char *pszXMLName, char *pszMetadataName, char *pszHashDelimiter) { const char *pszHash, *pszXMLValue; char *pszMetadata; if (psRoot == NULL || psRoot->psChild == NULL || metadata == NULL || pszMetadataName == NULL || pszXMLName == NULL) return MS_FAILURE; /* Pass from KeywordList to Keyword level */ psRoot = psRoot->psChild; /* Loop on all elements and append keywords to the hash table */ while (psRoot) { if (psRoot->psChild && strcasecmp(psRoot->pszValue, pszXMLName) == 0) { pszXMLValue = psRoot->psChild->pszValue; pszHash = msLookupHashTable(metadata, pszMetadataName); if (pszHash != NULL) { pszMetadata = (char *)malloc(strlen(pszHash) + strlen(pszXMLValue) + 2); if (pszHashDelimiter == NULL) sprintf(pszMetadata, "%s%s", pszHash, pszXMLValue); else sprintf(pszMetadata, "%s%s%s", pszHash, pszHashDelimiter, pszXMLValue); msInsertHashTable(metadata, pszMetadataName, pszMetadata); free(pszMetadata); } else msInsertHashTable(metadata, pszMetadataName, pszXMLValue); } psRoot = psRoot->psNext; } return MS_SUCCESS; } /* msLoadMapContextContactInfo ** ** Put the Contact information from a XML node and put them in a metadata. ** */ int msLoadMapContextContactInfo(CPLXMLNode *psRoot, hashTableObj *metadata) { if (psRoot == NULL || metadata == NULL) return MS_FAILURE; /* Contact Person primary */ msGetMapContextXMLHashValue(psRoot, "ContactPersonPrimary.ContactPerson", metadata, "wms_contactperson"); msGetMapContextXMLHashValue(psRoot, "ContactPersonPrimary.ContactOrganization", metadata, "wms_contactorganization"); /* Contact Position */ msGetMapContextXMLHashValue(psRoot, "ContactPosition", metadata, "wms_contactposition"); /* Contact Address */ msGetMapContextXMLHashValue(psRoot, "ContactAddress.AddressType", metadata, "wms_addresstype"); msGetMapContextXMLHashValue(psRoot, "ContactAddress.Address", metadata, "wms_address"); msGetMapContextXMLHashValue(psRoot, "ContactAddress.City", metadata, "wms_city"); msGetMapContextXMLHashValue(psRoot, "ContactAddress.StateOrProvince", metadata, "wms_stateorprovince"); msGetMapContextXMLHashValue(psRoot, "ContactAddress.PostCode", metadata, "wms_postcode"); msGetMapContextXMLHashValue(psRoot, "ContactAddress.Country", metadata, "wms_country"); /* Others */ msGetMapContextXMLHashValue(psRoot, "ContactVoiceTelephone", metadata, "wms_contactvoicetelephone"); msGetMapContextXMLHashValue(psRoot, "ContactFacsimileTelephone", metadata, "wms_contactfacsimiletelephone"); msGetMapContextXMLHashValue(psRoot, "ContactElectronicMailAddress", metadata, "wms_contactelectronicmailaddress"); return MS_SUCCESS; } /* ** msLoadMapContextLayerFormat ** ** */ int msLoadMapContextLayerFormat(CPLXMLNode *psFormat, layerObj *layer) { const char *pszValue; char *pszValue1; const char *pszHash; if (psFormat->psChild != NULL && strcasecmp(psFormat->pszValue, "Format") == 0) { if (psFormat->psChild->psNext == NULL) pszValue = psFormat->psChild->pszValue; else pszValue = psFormat->psChild->psNext->pszValue; } else pszValue = NULL; if (pszValue != NULL && strcasecmp(pszValue, "") != 0) { /* wms_format */ pszValue1 = (char *)CPLGetXMLValue(psFormat, "current", NULL); if (pszValue1 != NULL && (strcasecmp(pszValue1, "1") == 0 || strcasecmp(pszValue1, "true") == 0)) msInsertHashTable(&(layer->metadata), "wms_format", pszValue); /* wms_formatlist */ pszHash = msLookupHashTable(&(layer->metadata), "wms_formatlist"); if (pszHash != NULL) { pszValue1 = (char *)malloc(strlen(pszHash) + strlen(pszValue) + 2); sprintf(pszValue1, "%s,%s", pszHash, pszValue); msInsertHashTable(&(layer->metadata), "wms_formatlist", pszValue1); free(pszValue1); } else msInsertHashTable(&(layer->metadata), "wms_formatlist", pszValue); } /* Make sure selected format is supported or select another * supported format. Note that we can efficiently do this * only for GIF/PNG/JPEG, can't try to handle all GDAL * formats. */ pszValue = msLookupHashTable(&(layer->metadata), "wms_format"); if (pszValue && ( #if !(defined USE_PNG) strcasecmp(pszValue, "image/png") == 0 || strcasecmp(pszValue, "PNG") == 0 || #endif #if !(defined USE_JPEG) strcasecmp(pszValue, "image/jpeg") == 0 || strcasecmp(pszValue, "JPEG") == 0 || #endif 0)) { char **papszList = NULL; int i, numformats = 0; pszValue = msLookupHashTable(&(layer->metadata), "wms_formatlist"); papszList = msStringSplit(pszValue, ',', &numformats); for (i = 0; i < numformats; i++) { if ( #if (defined USE_PNG) strcasecmp(papszList[i], "image/png") == 0 || strcasecmp(papszList[i], "PNG") == 0 || #endif #if (defined USE_JPEG) strcasecmp(papszList[i], "image/jpeg") == 0 || strcasecmp(papszList[i], "JPEG") == 0 || #endif #ifdef USE_GD_GIF strcasecmp(papszList[i], "image/gif") == 0 || strcasecmp(papszList[i], "GIF") == 0 || #endif 0) { /* Found a match */ msInsertHashTable(&(layer->metadata), "wms_format", papszList[i]); break; } } if (papszList) msFreeCharArray(papszList, numformats); } /* end if unsupported format */ return MS_SUCCESS; } int msLoadMapContextLayerStyle(CPLXMLNode *psStyle, layerObj *layer, int nStyle) { char *pszValue, *pszValue1, *pszValue2; const char *pszHash; char *pszStyle = NULL; char *pszStyleName; CPLXMLNode *psStyleSLDBody; pszStyleName = (char *)CPLGetXMLValue(psStyle, "Name", NULL); if (pszStyleName == NULL) { pszStyleName = (char *)malloc(20); sprintf(pszStyleName, "Style{%d}", nStyle); } else pszStyleName = msStrdup(pszStyleName); /* wms_style */ pszValue = (char *)CPLGetXMLValue(psStyle, "current", NULL); if (pszValue != NULL && (strcasecmp(pszValue, "1") == 0 || strcasecmp(pszValue, "true") == 0)) msInsertHashTable(&(layer->metadata), "wms_style", pszStyleName); /* wms_stylelist */ pszHash = msLookupHashTable(&(layer->metadata), "wms_stylelist"); if (pszHash != NULL) { pszValue1 = (char *)malloc(strlen(pszHash) + strlen(pszStyleName) + 2); sprintf(pszValue1, "%s,%s", pszHash, pszStyleName); msInsertHashTable(&(layer->metadata), "wms_stylelist", pszValue1); free(pszValue1); } else msInsertHashTable(&(layer->metadata), "wms_stylelist", pszStyleName); /* Title */ pszStyle = (char *)malloc(strlen(pszStyleName) + 20); sprintf(pszStyle, "wms_style_%s_title", pszStyleName); if (msGetMapContextXMLHashValue(psStyle, "Title", &(layer->metadata), pszStyle) == MS_FAILURE) msInsertHashTable(&(layer->metadata), pszStyle, layer->name); free(pszStyle); /* SLD */ pszStyle = (char *)malloc(strlen(pszStyleName) + 15); sprintf(pszStyle, "wms_style_%s_sld", pszStyleName); msGetMapContextXMLHashValueDecode(psStyle, "SLD.OnlineResource.xlink:href", &(layer->metadata), pszStyle); free(pszStyle); /* SLDBODY */ pszStyle = (char *)malloc(strlen(pszStyleName) + 20); sprintf(pszStyle, "wms_style_%s_sld_body", pszStyleName); psStyleSLDBody = CPLGetXMLNode(psStyle, "SLD.StyledLayerDescriptor"); /*some clients such as OpenLayers add a name space, which I believe is wrong but added this additional test for compatibility #3115*/ if (psStyleSLDBody == NULL) psStyleSLDBody = CPLGetXMLNode(psStyle, "SLD.sld:StyledLayerDescriptor"); if (psStyleSLDBody != NULL) { pszValue = CPLSerializeXMLTree(psStyleSLDBody); if (pszValue != NULL) { /* Before including SLDBody in the mapfile, we must replace the */ /* double quote for single quote. This is to prevent having this: */ /* "metadata" "" */ char *c; for (c = pszValue; *c != '\0'; c++) if (*c == '"') *c = '\''; msInsertHashTable(&(layer->metadata), pszStyle, pszValue); msFree(pszValue); } } free(pszStyle); /* LegendURL */ pszStyle = (char *)malloc(strlen(pszStyleName) + 25); sprintf(pszStyle, "wms_style_%s_legendurl", pszStyleName); msLoadMapContextURLELements(CPLGetXMLNode(psStyle, "LegendURL"), &(layer->metadata), pszStyle); free(pszStyle); free(pszStyleName); /* */ /* Add the stylelist to the layer connection */ /* */ if (msLookupHashTable(&(layer->metadata), "wms_stylelist") == NULL) { if (layer->connection) pszValue = msStrdup(layer->connection); else pszValue = msStrdup(""); pszValue1 = strstr(pszValue, "STYLELIST="); if (pszValue1 != NULL) { pszValue1 += 10; pszValue2 = strchr(pszValue, '&'); if (pszValue2 != NULL) pszValue1[pszValue2 - pszValue1] = '\0'; msInsertHashTable(&(layer->metadata), "wms_stylelist", pszValue1); } free(pszValue); } /* */ /* Add the style to the layer connection */ /* */ if (msLookupHashTable(&(layer->metadata), "wms_style") == NULL) { if (layer->connection) pszValue = msStrdup(layer->connection); else pszValue = msStrdup(""); pszValue1 = strstr(pszValue, "STYLE="); if (pszValue1 != NULL) { pszValue1 += 6; pszValue2 = strchr(pszValue, '&'); if (pszValue2 != NULL) pszValue1[pszValue2 - pszValue1] = '\0'; msInsertHashTable(&(layer->metadata), "wms_style", pszValue1); } free(pszValue); } return MS_SUCCESS; } int msLoadMapContextLayerDimension(CPLXMLNode *psDimension, layerObj *layer) { char *pszValue; const char *pszHash; char *pszDimension = NULL, *pszDimensionName = NULL; pszDimensionName = (char *)CPLGetXMLValue(psDimension, "name", NULL); if (pszDimensionName == NULL) { return MS_FALSE; } else pszDimensionName = msStrdup(pszDimensionName); pszDimension = (char *)malloc(strlen(pszDimensionName) + 50); /* wms_dimension: This is the current dimension */ pszValue = (char *)CPLGetXMLValue(psDimension, "current", NULL); if (pszValue != NULL && (strcasecmp(pszValue, "1") == 0 || strcasecmp(pszValue, "true") == 0)) msInsertHashTable(&(layer->metadata), "wms_dimension", pszDimensionName); /* wms_dimensionlist */ pszHash = msLookupHashTable(&(layer->metadata), "wms_dimensionlist"); if (pszHash != NULL) { pszValue = (char *)malloc(strlen(pszHash) + strlen(pszDimensionName) + 2); sprintf(pszValue, "%s,%s", pszHash, pszDimensionName); msInsertHashTable(&(layer->metadata), "wms_dimensionlist", pszValue); free(pszValue); } else msInsertHashTable(&(layer->metadata), "wms_dimensionlist", pszDimensionName); /* Units */ sprintf(pszDimension, "wms_dimension_%s_units", pszDimensionName); msGetMapContextXMLHashValue(psDimension, "units", &(layer->metadata), pszDimension); /* UnitSymbol */ sprintf(pszDimension, "wms_dimension_%s_unitsymbol", pszDimensionName); msGetMapContextXMLHashValue(psDimension, "unitSymbol", &(layer->metadata), pszDimension); /* userValue */ sprintf(pszDimension, "wms_dimension_%s_uservalue", pszDimensionName); msGetMapContextXMLHashValue(psDimension, "userValue", &(layer->metadata), pszDimension); if (strcasecmp(pszDimensionName, "time") == 0) msGetMapContextXMLHashValue(psDimension, "userValue", &(layer->metadata), "wms_time"); /* default */ sprintf(pszDimension, "wms_dimension_%s_default", pszDimensionName); msGetMapContextXMLHashValue(psDimension, "default", &(layer->metadata), pszDimension); /* multipleValues */ sprintf(pszDimension, "wms_dimension_%s_multiplevalues", pszDimensionName); msGetMapContextXMLHashValue(psDimension, "multipleValues", &(layer->metadata), pszDimension); /* nearestValue */ sprintf(pszDimension, "wms_dimension_%s_nearestvalue", pszDimensionName); msGetMapContextXMLHashValue(psDimension, "nearestValue", &(layer->metadata), pszDimension); free(pszDimension); free(pszDimensionName); return MS_SUCCESS; } /* ** msLoadMapContextGeneral ** ** Load the General block of the mapcontext document */ int msLoadMapContextGeneral(mapObj *map, CPLXMLNode *psGeneral, CPLXMLNode *psMapContext, int nVersion, const char *filename) { char *pszProj = NULL; char *pszValue, *pszValue1, *pszValue2; int nTmp; /* Projection */ pszValue = (char *)CPLGetXMLValue(psGeneral, "BoundingBox.SRS", NULL); if (pszValue != NULL && !EQUAL(pszValue, "(null)")) { if (strncasecmp(pszValue, "AUTO:", 5) == 0) { pszProj = msStrdup(pszValue); } else { pszProj = (char *)malloc(sizeof(char) * (strlen(pszValue) + 10)); sprintf(pszProj, "init=epsg:%s", pszValue + 5); } msFreeProjection(&map->projection); msInitProjection(&map->projection); map->projection.args[map->projection.numargs] = msStrdup(pszProj); map->projection.numargs++; msProcessProjection(&map->projection); if ((nTmp = GetMapserverUnitUsingProj(&(map->projection))) == -1) { msSetError(MS_MAPCONTEXTERR, "Unable to set units for projection '%s'", "msLoadMapContext()", pszProj); free(pszProj); return MS_FAILURE; } else { map->units = nTmp; } free(pszProj); } else { msDebug("Mandatory data General.BoundingBox.SRS missing in %s.", filename); } /* Extent */ if (msGetMapContextXMLFloatValue(psGeneral, "BoundingBox.minx", &(map->extent.minx)) == MS_FAILURE) { msDebug("Mandatory data General.BoundingBox.minx missing in %s.", filename); } if (msGetMapContextXMLFloatValue(psGeneral, "BoundingBox.miny", &(map->extent.miny)) == MS_FAILURE) { msDebug("Mandatory data General.BoundingBox.miny missing in %s.", filename); } if (msGetMapContextXMLFloatValue(psGeneral, "BoundingBox.maxx", &(map->extent.maxx)) == MS_FAILURE) { msDebug("Mandatory data General.BoundingBox.maxx missing in %s.", filename); } if (msGetMapContextXMLFloatValue(psGeneral, "BoundingBox.maxy", &(map->extent.maxy)) == MS_FAILURE) { msDebug("Mandatory data General.BoundingBox.maxy missing in %s.", filename); } /* Title */ if (msGetMapContextXMLHashValue(psGeneral, "Title", &(map->web.metadata), "wms_title") == MS_FAILURE) { if (nVersion >= OWS_1_0_0) msDebug("Mandatory data General.Title missing in %s.", filename); else { if (msGetMapContextXMLHashValue(psGeneral, "gml:name", &(map->web.metadata), "wms_title") == MS_FAILURE) { if (nVersion < OWS_0_1_7) msDebug("Mandatory data General.Title missing in %s.", filename); else msDebug("Mandatory data General.gml:name missing in %s.", filename); } } } /* Name */ if (nVersion >= OWS_1_0_0) { pszValue = (char *)CPLGetXMLValue(psMapContext, "id", NULL); if (pszValue) { msFree(map->name); map->name = msStrdup(pszValue); } } else { char *pszMapName = NULL; if (msGetMapContextXMLStringValue(psGeneral, "Name", &pszMapName) == MS_FAILURE) { msGetMapContextXMLStringValue(psGeneral, "gml:name", &pszMapName); } if (pszMapName) { msFree(map->name); map->name = pszMapName; } } /* Keyword */ if (nVersion >= OWS_1_0_0) { msLoadMapContextListInMetadata(CPLGetXMLNode(psGeneral, "KeywordList"), &(map->web.metadata), "KEYWORD", "wms_keywordlist", ","); } else msGetMapContextXMLHashValue(psGeneral, "Keywords", &(map->web.metadata), "wms_keywordlist"); /* Window */ pszValue1 = (char *)CPLGetXMLValue(psGeneral, "Window.width", NULL); pszValue2 = (char *)CPLGetXMLValue(psGeneral, "Window.height", NULL); if (pszValue1 != NULL && pszValue2 != NULL) { map->width = atoi(pszValue1); map->height = atoi(pszValue2); } /* Abstract */ if (msGetMapContextXMLHashValue(psGeneral, "Abstract", &(map->web.metadata), "wms_abstract") == MS_FAILURE) { msGetMapContextXMLHashValue(psGeneral, "gml:description", &(map->web.metadata), "wms_abstract"); } /* DataURL */ msGetMapContextXMLHashValueDecode(psGeneral, "DataURL.OnlineResource.xlink:href", &(map->web.metadata), "wms_dataurl"); /* LogoURL */ /* The logourl have a width, height, format and an URL */ msLoadMapContextURLELements(CPLGetXMLNode(psGeneral, "LogoURL"), &(map->web.metadata), "wms_logourl"); /* DescriptionURL */ /* The descriptionurl have a width, height, format and an URL */ msLoadMapContextURLELements(CPLGetXMLNode(psGeneral, "DescriptionURL"), &(map->web.metadata), "wms_descriptionurl"); /* Contact Info */ msLoadMapContextContactInfo(CPLGetXMLNode(psGeneral, "ContactInformation"), &(map->web.metadata)); return MS_SUCCESS; } /* ** msLoadMapContextLayer ** ** Load a Layer block from a MapContext document */ int msLoadMapContextLayer(mapObj *map, CPLXMLNode *psLayer, int nVersion, const char *filename, int unique_layer_names) { char *pszValue; const char *pszHash; char *pszName = NULL; CPLXMLNode *psFormatList, *psFormat, *psStyleList, *psStyle, *psExtension; CPLXMLNode *psDimensionList, *psDimension; int nStyle; layerObj *layer; /* Init new layer */ if (msGrowMapLayers(map) == NULL) return MS_FAILURE; layer = (GET_LAYER(map, map->numlayers)); initLayer(layer, map); layer->map = (mapObj *)map; layer->type = MS_LAYER_RASTER; /* save the index */ GET_LAYER(map, map->numlayers)->index = map->numlayers; map->layerorder[map->numlayers] = map->numlayers; map->numlayers++; /* Status */ pszValue = (char *)CPLGetXMLValue(psLayer, "hidden", "1"); if ((pszValue != NULL) && (atoi(pszValue) == 0 && strcasecmp(pszValue, "true") != 0)) layer->status = MS_ON; else layer->status = MS_OFF; /* Queryable */ pszValue = (char *)CPLGetXMLValue(psLayer, "queryable", "0"); if (pszValue != NULL && (atoi(pszValue) == 1 || strcasecmp(pszValue, "true") == 0)) layer->template = msStrdup("ttt"); /* Name and Title */ pszValue = (char *)CPLGetXMLValue(psLayer, "Name", NULL); if (pszValue != NULL) { msInsertHashTable(&(layer->metadata), "wms_name", pszValue); if (unique_layer_names) { pszName = (char *)malloc(sizeof(char) * (strlen(pszValue) + 15)); sprintf(pszName, "l%d:%s", layer->index, pszValue); layer->name = msStrdup(pszName); free(pszName); } else layer->name = msStrdup(pszValue); } else { pszName = (char *)malloc(sizeof(char) * 15); sprintf(pszName, "l%d:", layer->index); layer->name = msStrdup(pszName); free(pszName); } if (msGetMapContextXMLHashValue(psLayer, "Title", &(layer->metadata), "wms_title") == MS_FAILURE) { if (msGetMapContextXMLHashValue(psLayer, "Server.title", &(layer->metadata), "wms_title") == MS_FAILURE) { msDebug("Mandatory data Layer.Title missing in %s.", filename); } } /* Server Title */ msGetMapContextXMLHashValue(psLayer, "Server.title", &(layer->metadata), "wms_server_title"); /* Abstract */ msGetMapContextXMLHashValue(psLayer, "Abstract", &(layer->metadata), "wms_abstract"); /* DataURL */ if (nVersion <= OWS_0_1_4) { msGetMapContextXMLHashValueDecode(psLayer, "DataURL.OnlineResource.xlink:href", &(layer->metadata), "wms_dataurl"); } else { /* The DataURL have a width, height, format and an URL */ /* Width and height are not used, but they are included to */ /* be consistent with the spec. */ msLoadMapContextURLELements(CPLGetXMLNode(psLayer, "DataURL"), &(layer->metadata), "wms_dataurl"); } /* The MetadataURL have a width, height, format and an URL */ /* Width and height are not used, but they are included to */ /* be consistent with the spec. */ msLoadMapContextURLELements(CPLGetXMLNode(psLayer, "MetadataURL"), &(layer->metadata), "wms_metadataurl"); /* MinScale && MaxScale */ pszValue = (char *)CPLGetXMLValue(psLayer, "sld:MinScaleDenominator", NULL); if (pszValue != NULL) { layer->minscaledenom = atof(pszValue); } pszValue = (char *)CPLGetXMLValue(psLayer, "sld:MaxScaleDenominator", NULL); if (pszValue != NULL) { layer->maxscaledenom = atof(pszValue); } /* */ /* Server */ /* */ if (nVersion >= OWS_0_1_4) { if (msGetMapContextXMLStringValueDecode( psLayer, "Server.OnlineResource.xlink:href", &(layer->connection)) == MS_FAILURE) { msSetError( MS_MAPCONTEXTERR, "Mandatory data Server.OnlineResource.xlink:href missing in %s.", "msLoadMapContext()", filename); return MS_FAILURE; } else { msGetMapContextXMLHashValueDecode( psLayer, "Server.OnlineResource.xlink:href", &(layer->metadata), "wms_onlineresource"); layer->connectiontype = MS_WMS; } } else { if (msGetMapContextXMLStringValueDecode(psLayer, "Server.onlineResource", &(layer->connection)) == MS_FAILURE) { msSetError(MS_MAPCONTEXTERR, "Mandatory data Server.onlineResource missing in %s.", "msLoadMapContext()", filename); return MS_FAILURE; } else { msGetMapContextXMLHashValueDecode(psLayer, "Server.onlineResource", &(layer->metadata), "wms_onlineresource"); layer->connectiontype = MS_WMS; } } if (nVersion >= OWS_0_1_4) { if (msGetMapContextXMLHashValue(psLayer, "Server.version", &(layer->metadata), "wms_server_version") == MS_FAILURE) { msSetError(MS_MAPCONTEXTERR, "Mandatory data Server.version missing in %s.", "msLoadMapContext()", filename); return MS_FAILURE; } } else { if (msGetMapContextXMLHashValue(psLayer, "Server.wmtver", &(layer->metadata), "wms_server_version") == MS_FAILURE) { msSetError(MS_MAPCONTEXTERR, "Mandatory data Server.wmtver missing in %s.", "msLoadMapContext()", filename); return MS_FAILURE; } } /* Projection */ msLoadMapContextListInMetadata(psLayer, &(layer->metadata), "SRS", "wms_srs", " "); pszHash = msLookupHashTable(&(layer->metadata), "wms_srs"); if (((pszHash == NULL) || (strcasecmp(pszHash, "") == 0)) && map->projection.numargs != 0) { const char *pszLastProjArg = map->projection.args[map->projection.numargs - 1]; if (pszLastProjArg != NULL) { if (strncasecmp(pszLastProjArg, "AUTO:", 5) == 0) { msInsertHashTable(&(layer->metadata), "wms_srs", pszLastProjArg); } else { if (strncasecmp(pszLastProjArg, "+init=epsg:", strlen("+init=epsg:")) == 0) { const size_t nSRSSize = strlen("EPSG:") + strlen(pszLastProjArg + strlen("+init=epsg:")) + 1; char *pszSRS = (char *)malloc(nSRSSize); snprintf(pszSRS, nSRSSize, "EPSG:%s", pszLastProjArg + strlen("+init=epsg:")); msInsertHashTable(&(layer->metadata), "wms_srs", pszSRS); msFree(pszSRS); } else { msDebug("Unable to set data for layer wms_srs from this" " value %s.", pszLastProjArg); } } } } /* */ /* Format */ /* */ if (nVersion >= OWS_0_1_4) { psFormatList = CPLGetXMLNode(psLayer, "FormatList"); } else { psFormatList = psLayer; } if (psFormatList != NULL) { for (psFormat = psFormatList->psChild; psFormat != NULL; psFormat = psFormat->psNext) { msLoadMapContextLayerFormat(psFormat, layer); } } /* end FormatList parsing */ /* Style */ if (nVersion >= OWS_0_1_4) { psStyleList = CPLGetXMLNode(psLayer, "StyleList"); } else { psStyleList = psLayer; } if (psStyleList != NULL) { nStyle = 0; for (psStyle = psStyleList->psChild; psStyle != NULL; psStyle = psStyle->psNext) { if (strcasecmp(psStyle->pszValue, "Style") == 0) { nStyle++; msLoadMapContextLayerStyle(psStyle, layer, nStyle); } } } /* Dimension */ psDimensionList = CPLGetXMLNode(psLayer, "DimensionList"); if (psDimensionList != NULL) { for (psDimension = psDimensionList->psChild; psDimension != NULL; psDimension = psDimension->psNext) { if (strcasecmp(psDimension->pszValue, "Dimension") == 0) { msLoadMapContextLayerDimension(psDimension, layer); } } } /* Extension */ psExtension = CPLGetXMLNode(psLayer, "Extension"); if (psExtension != NULL) { pszValue = (char *)CPLGetXMLValue(psExtension, "ol:opacity", NULL); if (pszValue != NULL) { if (!layer->compositer) { layer->compositer = msSmallMalloc(sizeof(LayerCompositer)); initLayerCompositer(layer->compositer); } layer->compositer->opacity = atof(pszValue) * 100; } } return MS_SUCCESS; } #endif /* msLoadMapContextURL() ** ** load an OGC Web Map Context format from an URL ** ** Take a map object and a URL to a connect file in arguments */ int msLoadMapContextURL(mapObj *map, char *urlfilename, int unique_layer_names) { #if defined(USE_WMS_LYR) char *pszTmpFile = NULL; int status = 0; if (!map || !urlfilename) { msSetError(MS_MAPCONTEXTERR, "Invalid map or url given.", "msGetMapContextURL()"); return MS_FAILURE; } pszTmpFile = msTmpFile(map, map->mappath, NULL, "context.xml"); if (msHTTPGetFile(urlfilename, pszTmpFile, &status, -1, 0, 0, 0) == MS_SUCCESS) { return msLoadMapContext(map, pszTmpFile, unique_layer_names); } else { msSetError(MS_MAPCONTEXTERR, "Could not open context file %s.", "msGetMapContextURL()", urlfilename); return MS_FAILURE; } #else msSetError(MS_MAPCONTEXTERR, "Not implemented since Map Context is not enabled.", "msGetMapContextURL()"); return MS_FAILURE; #endif } /* msLoadMapContext() ** ** Get a mapfile from a OGC Web Map Context format ** ** Take as first map object and a file in arguments ** If The 2nd aregument unique_layer_names is set to MS_TRUE, the layer ** name created would be unique and be prefixed with an l plus the layers's *index ** (eg l:1:park. l:2:road ...). If It is set to MS_FALSE, the layer name ** would be the same name as the layer name in the context */ int msLoadMapContext(mapObj *map, const char *filename, int unique_layer_names) { #if defined(USE_WMS_LYR) char *pszWholeText, *pszValue; CPLXMLNode *psRoot, *psMapContext, *psLayer, *psLayerList, *psChild; char szPath[MS_MAXPATHLEN]; int nVersion = -1; char szVersionBuf[OWS_VERSION_MAXLEN]; const char *ms_contextfile_pattern = CPLGetConfigOption( "MS_CONTEXTFILE_PATTERN", MS_DEFAULT_CONTEXTFILE_PATTERN); if (msEvalRegex(ms_contextfile_pattern, filename) != MS_TRUE) { msSetError(MS_REGEXERR, "Filename validation failed.", "msLoadMapContext()"); return MS_FAILURE; } /* */ /* Load the raw XML file */ /* */ pszWholeText = msGetMapContextFileText(msBuildPath(szPath, map->mappath, filename)); if (pszWholeText == NULL) { msSetError(MS_MAPCONTEXTERR, "Unable to read %s", "msLoadMapContext()", filename); return MS_FAILURE; } if ((strstr(pszWholeText, "eType == CXT_Element && (EQUAL(psChild->pszValue, "WMS_Viewer_Context") || EQUAL(psChild->pszValue, "View_Context") || EQUAL(psChild->pszValue, "ViewContext"))) { psMapContext = psChild; break; } else { psChild = psChild->psNext; } } if (psMapContext == NULL) { CPLDestroyXMLNode(psRoot); msSetError(MS_MAPCONTEXTERR, "Invalid Map Context File (%s)", "msLoadMapContext()", filename); return MS_FAILURE; } /* Fetch document version number */ pszValue = (char *)CPLGetXMLValue(psMapContext, "version", NULL); if (!pszValue) { msDebug("msLoadMapContext(): Mandatory data version missing in %s, " "assuming 0.1.4.", filename); pszValue = "0.1.4"; } nVersion = msOWSParseVersionString(pszValue); /* Make sure this is a supported version */ switch (nVersion) { case OWS_0_1_2: case OWS_0_1_4: case OWS_0_1_7: case OWS_1_0_0: case OWS_1_1_0: /* All is good, this is a supported version. */ break; default: /* Not a supported version */ msSetError(MS_MAPCONTEXTERR, "This version of Map Context is not supported (%s).", "msLoadMapContext()", pszValue); CPLDestroyXMLNode(psRoot); return MS_FAILURE; } /* Reformat and save Version in metadata */ msInsertHashTable(&(map->web.metadata), "wms_context_version", msOWSGetVersionString(nVersion, szVersionBuf)); if (nVersion >= OWS_0_1_7 && nVersion < OWS_1_0_0) { if (msGetMapContextXMLHashValue(psMapContext, "fid", &(map->web.metadata), "wms_context_fid") == MS_FAILURE) { msDebug("Mandatory data fid missing in %s.", filename); } } /* */ /* Load the General bloc */ /* */ psChild = CPLGetXMLNode(psMapContext, "General"); if (psChild == NULL) { CPLDestroyXMLNode(psRoot); msSetError(MS_MAPCONTEXTERR, "The Map Context document provided (%s) does not contain any " "General elements.", "msLoadMapContext()", filename); return MS_FAILURE; } if (msLoadMapContextGeneral(map, psChild, psMapContext, nVersion, filename) == MS_FAILURE) { CPLDestroyXMLNode(psRoot); return MS_FAILURE; } /* */ /* Load the bloc LayerList */ /* */ psLayerList = CPLGetXMLNode(psMapContext, "LayerList"); if (psLayerList != NULL) { for (psLayer = psLayerList->psChild; psLayer != NULL; psLayer = psLayer->psNext) { if (EQUAL(psLayer->pszValue, "Layer")) { if (msLoadMapContextLayer(map, psLayer, nVersion, filename, unique_layer_names) == MS_FAILURE) { CPLDestroyXMLNode(psRoot); return MS_FAILURE; } } /* end Layer parsing */ } /* for */ } CPLDestroyXMLNode(psRoot); return MS_SUCCESS; #else msSetError(MS_MAPCONTEXTERR, "Not implemented since Map Context is not enabled.", "msGetMapContext()"); return MS_FAILURE; #endif } /* msSaveMapContext() ** ** Save a mapfile into the OGC Web Map Context format ** ** Take a map object and a file in arguments */ int msSaveMapContext(mapObj *map, char *filename) { #if defined(USE_WMS_LYR) FILE *stream; char szPath[MS_MAXPATHLEN]; int nStatus; /* open file */ if (filename != NULL && strlen(filename) > 0) { stream = fopen(msBuildPath(szPath, map->mappath, filename), "wb"); if (!stream) { msSetError(MS_IOERR, "(%s)", "msSaveMapContext()", filename); return (MS_FAILURE); } } else { msSetError(MS_IOERR, "Filename is undefined.", "msSaveMapContext()"); return MS_FAILURE; } nStatus = msWriteMapContext(map, stream); fclose(stream); return nStatus; #else msSetError(MS_MAPCONTEXTERR, "Not implemented since Map Context is not enabled.", "msSaveMapContext()"); return MS_FAILURE; #endif } int msWriteMapContext(mapObj *map, FILE *stream) { #if defined(USE_WMS_LYR) const char *version; char *pszEPSG; char *tabspace = NULL, *pszChar, *pszSLD = NULL, *pszSLD2 = NULL; char *pszStyleItem, *pszSLDBody; char *pszEncodedVal; int i, nValue, nVersion = OWS_VERSION_NOTSET; /* Dimension element */ char *pszDimension; const char *pszDimUserValue = NULL, *pszDimUnits = NULL, *pszDimDefault = NULL; const char *pszDimNearValue = NULL, *pszDimUnitSymbol = NULL; const char *pszDimMultiValue = NULL; int bDimensionList = 0; /* Decide which version we're going to return... */ version = msLookupHashTable(&(map->web.metadata), "wms_context_version"); if (version == NULL) version = "1.1.0"; nVersion = msOWSParseVersionString(version); if (nVersion == OWS_VERSION_BADFORMAT) return MS_FAILURE; /* msSetError() already called. */ /* Make sure this is a supported version */ /* Note that we don't write 0.1.2 even if we read it. */ switch (nVersion) { case OWS_0_1_4: case OWS_0_1_7: case OWS_1_0_0: case OWS_1_1_0: /* All is good, this is a supported version. */ break; default: /* Not a supported version */ msSetError(MS_MAPCONTEXTERR, "This version of Map Context is not supported (%s).", "msSaveMapContext()", version); return MS_FAILURE; } /* file header */ msIO_fprintf(stream, "\n"); /* set the WMS_Viewer_Context information */ pszEncodedVal = msEncodeHTMLEntities(version); if (nVersion >= OWS_1_0_0) { msIO_fprintf(stream, "= OWS_0_1_7) { msIO_fprintf(stream, "= OWS_0_1_7 && nVersion < OWS_1_0_0) { msOWSPrintEncodeMetadata(stream, &(map->web.metadata), NULL, "wms_context_fid", OWS_NOERR, " fid=\"%s\"", "0"); } if (nVersion >= OWS_1_0_0) msOWSPrintEncodeParam(stream, "MAP.NAME", map->name, OWS_NOERR, " id=\"%s\"", NULL); msIO_fprintf(stream, " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""); msIO_fprintf(stream, " xmlns:ogc=\"http://www.opengis.net/ogc\""); if (nVersion >= OWS_0_1_7 && nVersion < OWS_1_0_0) { msIO_fprintf(stream, " xmlns:gml=\"http://www.opengis.net/gml\""); } if (nVersion >= OWS_1_0_0) { msIO_fprintf(stream, " xmlns:xlink=\"http://www.w3.org/1999/xlink\""); msIO_fprintf(stream, " xmlns=\"http://www.opengis.net/context\""); msIO_fprintf(stream, " xmlns:sld=\"http://www.opengis.net/sld\""); pszEncodedVal = msEncodeHTMLEntities(msOWSGetSchemasLocation(map)); if (nVersion >= OWS_1_1_0) msIO_fprintf(stream, " xsi:schemaLocation=\"http://www.opengis.net/context " "%s/context/1.1.0/context.xsd\">\n", pszEncodedVal); else msIO_fprintf(stream, " xsi:schemaLocation=\"http://www.opengis.net/context " "%s/context/1.0.0/context.xsd\">\n", pszEncodedVal); msFree(pszEncodedVal); } else { msIO_fprintf(stream, " xmlns:xlink=\"http://www.w3.org/TR/xlink\""); pszEncodedVal = msEncodeHTMLEntities(msOWSGetSchemasLocation(map)); msIO_fprintf(stream, " xsi:noNamespaceSchemaLocation=\"%s/contexts/", pszEncodedVal); msFree(pszEncodedVal); pszEncodedVal = msEncodeHTMLEntities(msOWSGetSchemasLocation(map)); msIO_fprintf(stream, "%s/context.xsd\">\n", pszEncodedVal); msFree(pszEncodedVal); } /* set the General information */ msIO_fprintf(stream, " \n"); /* Window */ if (map->width != -1 || map->height != -1) msIO_fprintf(stream, " \n", map->width, map->height); /* Bounding box corners and spatial reference system */ if (tabspace) free(tabspace); tabspace = msStrdup(" "); msOWSGetEPSGProj(&(map->projection), &(map->web.metadata), "MO", MS_TRUE, &pszEPSG); msIO_fprintf(stream, "%s\n", tabspace); if (!pszEPSG || (strcasecmp(pszEPSG, "(null)") == 0)) msIO_fprintf(stream, "\n"); pszEncodedVal = msEncodeHTMLEntities(pszEPSG); msIO_fprintf(stream, "%s\n", tabspace, pszEncodedVal, map->extent.minx, map->extent.miny, map->extent.maxx, map->extent.maxy); msFree(pszEncodedVal); msFree(pszEPSG); /* Title, name */ if (nVersion >= OWS_0_1_7 && nVersion < OWS_1_0_0) { msOWSPrintEncodeParam(stream, "MAP.NAME", map->name, OWS_NOERR, " %s\n", NULL); } else { if (nVersion < OWS_0_1_7) msOWSPrintEncodeParam(stream, "MAP.NAME", map->name, OWS_NOERR, " %s\n", NULL); msIO_fprintf(stream, "%s\n", tabspace); msOWSPrintEncodeMetadata(stream, &(map->web.metadata), NULL, "wms_title", OWS_WARN, " %s\n", map->name); } /* keyword */ if (nVersion >= OWS_1_0_0) { if (msLookupHashTable(&(map->web.metadata), "wms_keywordlist") != NULL) { char **papszKeywords; int nKeywords, iKey; const char *pszValue = msLookupHashTable(&(map->web.metadata), "wms_keywordlist"); papszKeywords = msStringSplit(pszValue, ',', &nKeywords); if (nKeywords > 0 && papszKeywords) { msIO_fprintf(stream, " \n"); for (iKey = 0; iKey < nKeywords; iKey++) { pszEncodedVal = msEncodeHTMLEntities(papszKeywords[iKey]); msIO_fprintf(stream, " %s\n", pszEncodedVal); msFree(pszEncodedVal); } msIO_fprintf(stream, " \n"); } } } else msOWSPrintEncodeMetadataList(stream, &(map->web.metadata), NULL, "wms_keywordlist", " \n", " \n", " %s\n", NULL); /* abstract */ if (nVersion >= OWS_0_1_7 && nVersion < OWS_1_0_0) { msOWSPrintEncodeMetadata( stream, &(map->web.metadata), NULL, "wms_abstract", OWS_NOERR, " %s\n", NULL); } else { msOWSPrintEncodeMetadata(stream, &(map->web.metadata), NULL, "wms_abstract", OWS_NOERR, " %s\n", NULL); } /* LogoURL */ /* The LogoURL have a width, height, format and an URL */ msOWSPrintURLType( stream, &(map->web.metadata), "MO", "logourl", OWS_NOERR, NULL, "LogoURL", NULL, " width=\"%s\"", " height=\"%s\"", " format=\"%s\"", " \n", MS_FALSE, MS_FALSE, MS_FALSE, MS_FALSE, MS_TRUE, NULL, NULL, NULL, NULL, NULL, " "); /* DataURL */ msOWSPrintEncodeMetadata( stream, &(map->web.metadata), NULL, "wms_dataurl", OWS_NOERR, " \n \n \n", NULL); /* DescriptionURL */ /* The DescriptionURL have a width, height, format and an URL */ /* The metadata is structured like this: "width height format url" */ msOWSPrintURLType( stream, &(map->web.metadata), "MO", "descriptionurl", OWS_NOERR, NULL, "DescriptionURL", NULL, " width=\"%s\"", " height=\"%s\"", " format=\"%s\"", " \n", MS_FALSE, MS_FALSE, MS_FALSE, MS_FALSE, MS_TRUE, NULL, NULL, NULL, NULL, NULL, " "); /* Contact Info */ msOWSPrintContactInfo(stream, tabspace, OWS_1_1_0, &(map->web.metadata), "MO"); /* Close General */ msIO_fprintf(stream, " \n"); free(tabspace); /* Set the layer list */ msIO_fprintf(stream, " \n"); /* Loop on all layer */ for (i = 0; i < map->numlayers; i++) { if (GET_LAYER(map, i)->status != MS_DELETE && GET_LAYER(map, i)->connectiontype == MS_WMS) { const char *pszValue; char *pszValueMod; const char *pszCurrent; if (GET_LAYER(map, i)->status == MS_OFF) nValue = 1; else nValue = 0; msIO_fprintf(stream, " \n"); } } /* Close layer list */ msIO_fprintf(stream, " \n"); /* Close Map Context */ if (nVersion >= OWS_1_0_0) { msIO_fprintf(stream, "\n"); } else if (nVersion >= OWS_0_1_7) { msIO_fprintf(stream, "\n"); } else { /* 0.1.4 */ msIO_fprintf(stream, "\n"); } return MS_SUCCESS; #else msSetError(MS_MAPCONTEXTERR, "Not implemented since Map Context is not enabled.", "msWriteMapContext()"); return MS_FAILURE; #endif } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.6.0/src/mapcontour.c��������������������������������������������������������������������0000664�0000000�0000000�00000106672�15114050610�0016660�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/********************************************************************** * $Id: mapcontour.c 12629 2011-10-06 18:06:34Z aboudreault $ * * Project: MapServer * Purpose: Contour Layer * Author: Alan Boudreault (aboudreault@mapgears.com) * Author: Daniel Morissette (dmorissette@mapgears.com) * ********************************************************************** * Copyright (c) 2011, Alan Boudreault, MapGears * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. **********************************************************************/ #include "mapserver.h" #include "mapcopy.h" #include "mapresample.h" #include "ogr_api.h" #include "ogr_srs_api.h" #include "gdal.h" #include "gdal_alg.h" #include "mapows.h" #include "mapthread.h" #include "mapraster.h" #include "cpl_string.h" #define GEO_TRANS(tr, x, y) ((tr)[0] + (tr)[1] * (x) + (tr)[2] * (y)) extern int InvGeoTransform(double *gt_in, double *gt_out); typedef struct { /* OGR DataSource */ layerObj ogrLayer; /* internal use */ GDALDatasetH hOrigDS; GDALDatasetH hDS; double *buffer; /* memory dataset buffer */ rectObj extent; /* original dataset extent */ OGRDataSourceH hOGRDS; double cellsize; } contourLayerInfo; static int msContourLayerInitItemInfo(layerObj *layer) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerInitItemInfo()"); return MS_FAILURE; } return msLayerInitItemInfo(&clinfo->ogrLayer); } static void msContourLayerFreeItemInfo(layerObj *layer) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerFreeItemInfo()"); return; } msLayerFreeItemInfo(&clinfo->ogrLayer); } static void msContourLayerInfoInitialize(layerObj *layer) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (clinfo != NULL) return; clinfo = (contourLayerInfo *)msSmallCalloc(1, sizeof(contourLayerInfo)); layer->layerinfo = clinfo; clinfo->hOrigDS = NULL; clinfo->hDS = NULL; clinfo->extent.minx = -1.0; clinfo->extent.miny = -1.0; clinfo->extent.maxx = -1.0; clinfo->extent.maxy = -1.0; initLayer(&clinfo->ogrLayer, layer->map); clinfo->ogrLayer.type = layer->type; clinfo->ogrLayer.debug = layer->debug; clinfo->ogrLayer.connectiontype = MS_OGR; clinfo->ogrLayer.name = msStrdup(layer->name); clinfo->ogrLayer.connection = (char *)msSmallMalloc(strlen(clinfo->ogrLayer.name) + 13); sprintf(clinfo->ogrLayer.connection, "__%s_CONTOUR__", clinfo->ogrLayer.name); clinfo->ogrLayer.units = layer->units; if (msOWSLookupMetadata(&(layer->metadata), "OFG", "ID_type") == NULL) { msInsertHashTable(&(layer->metadata), "gml_ID_type", "Integer"); } { const char *elevItem = CSLFetchNameValue(layer->processing, "CONTOUR_ITEM"); if (elevItem && strlen(elevItem) > 0) { char szTmp[100]; snprintf(szTmp, sizeof(szTmp), "%s_type", elevItem); if (msOWSLookupMetadata(&(layer->metadata), "OFG", szTmp) == NULL) { snprintf(szTmp, sizeof(szTmp), "gml_%s_type", elevItem); msInsertHashTable(&(layer->metadata), szTmp, "Real"); } } } } static void msContourLayerInfoFree(layerObj *layer) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (clinfo == NULL) return; freeLayer(&clinfo->ogrLayer); free(clinfo); layer->layerinfo = NULL; } static int msContourLayerReadRaster(layerObj *layer, rectObj rect) { mapObj *map = layer->map; char **bands; int band = 1; double adfGeoTransform[6], adfInvGeoTransform[6]; double llx, lly, urx, ury; rectObj copyRect, mapRect; int dst_xsize, dst_ysize; int virtual_grid_step_x, virtual_grid_step_y; int src_xoff, src_yoff, src_xsize, src_ysize; double map_cellsize_x, map_cellsize_y, dst_cellsize_x, dst_cellsize_y; GDALRasterBandH hBand = NULL; CPLErr eErr; contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->debug) msDebug("Entering msContourLayerReadRaster().\n"); if (clinfo == NULL || clinfo->hOrigDS == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerReadRaster()"); return MS_FAILURE; } bands = CSLTokenizeStringComplex( CSLFetchNameValue(layer->processing, "BANDS"), " ,", FALSE, FALSE); if (CSLCount(bands) > 0) { band = atoi(bands[0]); if (band < 1 || band > GDALGetRasterCount(clinfo->hOrigDS)) { msSetError(MS_IMGERR, "BANDS PROCESSING directive includes illegal band '%d', " "should be from 1 to %d.", "msContourLayerReadRaster()", band, GDALGetRasterCount(clinfo->hOrigDS)); CSLDestroy(bands); return MS_FAILURE; } } CSLDestroy(bands); hBand = GDALGetRasterBand(clinfo->hOrigDS, band); if (hBand == NULL) { msSetError(MS_IMGERR, "Band %d does not exist on dataset.", "msContourLayerReadRaster()", band); return MS_FAILURE; } if (layer->projection.numargs > 0 && EQUAL(layer->projection.args[0], "auto")) { const char *wkt; wkt = GDALGetProjectionRef(clinfo->hOrigDS); if (wkt != NULL && strlen(wkt) > 0) { if (msOGCWKT2ProjectionObj(wkt, &(layer->projection), layer->debug) != MS_SUCCESS) { char msg[MESSAGELENGTH * 2]; errorObj *ms_error = msGetErrorObj(); snprintf(msg, sizeof(msg), "%s\n" "PROJECTION AUTO cannot be used for this " "GDAL raster (`%s').", ms_error->message, layer->data); msg[MESSAGELENGTH - 1] = '\0'; msSetError(MS_OGRERR, "%s", "msDrawRasterLayer()", msg); return MS_FAILURE; } } } /* * Compute the georeferenced window of overlap, and read the source data * downsampled to match output resolution, or at full resolution if * output resolution is lower than the source resolution. * * A large portion of this overlap calculation code was borrowed from * msDrawRasterLayerGDAL(). * Would be possible to move some of this to a reusable function? * * Note: This code works only if no reprojection is involved. It would * need rework to support cases where output projection differs from source * data file projection. */ src_xsize = GDALGetRasterXSize(clinfo->hOrigDS); src_ysize = GDALGetRasterYSize(clinfo->hOrigDS); /* set the Dataset extent */ msGetGDALGeoTransform(clinfo->hOrigDS, map, layer, adfGeoTransform); clinfo->extent.minx = adfGeoTransform[0]; clinfo->extent.maxy = adfGeoTransform[3]; clinfo->extent.maxx = adfGeoTransform[0] + src_xsize * adfGeoTransform[1]; clinfo->extent.miny = adfGeoTransform[3] + src_ysize * adfGeoTransform[5]; if (layer->transform) { if (layer->debug) msDebug("msContourLayerReadRaster(): Entering transform.\n"); InvGeoTransform(adfGeoTransform, adfInvGeoTransform); mapRect = rect; if (map->cellsize == 0) { map->cellsize = msAdjustExtent(&mapRect, map->width, map->height); } map_cellsize_x = map_cellsize_y = map->cellsize; /* if necessary, project the searchrect to source coords */ if (msProjectionsDiffer(&(map->projection), &(layer->projection))) { if (msProjectRect(&map->projection, &layer->projection, &mapRect) != MS_SUCCESS) { msDebug("msContourLayerReadRaster(%s): unable to reproject map request " "rectangle into layer projection, canceling.\n", layer->name); return MS_FAILURE; } map_cellsize_x = MS_CELLSIZE(mapRect.minx, mapRect.maxx, map->width); map_cellsize_y = MS_CELLSIZE(mapRect.miny, mapRect.maxy, map->height); /* if the projection failed to project the extent requested, we need to calculate the cellsize to preserve the initial map cellsize ratio */ if ((mapRect.minx < GEO_TRANS(adfGeoTransform, 0, src_ysize)) || (mapRect.maxx > GEO_TRANS(adfGeoTransform, src_xsize, 0)) || (mapRect.miny < GEO_TRANS(adfGeoTransform + 3, 0, src_ysize)) || (mapRect.maxy > GEO_TRANS(adfGeoTransform + 3, src_xsize, 0))) { int src_unit, dst_unit; src_unit = GetMapserverUnitUsingProj(&map->projection); dst_unit = GetMapserverUnitUsingProj(&layer->projection); if (src_unit == -1 || dst_unit == -1) { msDebug("msContourLayerReadRaster(%s): unable to reproject map " "request rectangle into layer projection, canceling.\n", layer->name); return MS_FAILURE; } map_cellsize_x = MS_CONVERT_UNIT( src_unit, dst_unit, MS_CELLSIZE(rect.minx, rect.maxx, map->width)); map_cellsize_y = MS_CONVERT_UNIT( src_unit, dst_unit, MS_CELLSIZE(rect.miny, rect.maxy, map->height)); } } if (map_cellsize_x == 0 || map_cellsize_y == 0) { if (layer->debug) msDebug("msContourLayerReadRaster(): Cellsize can't be 0.\n"); return MS_FAILURE; } /* Adjust MapServer pixel model to GDAL pixel model */ mapRect.minx -= map_cellsize_x * 0.5; mapRect.maxx += map_cellsize_x * 0.5; mapRect.miny -= map_cellsize_y * 0.5; mapRect.maxy += map_cellsize_y * 0.5; /* * If raw data cellsize (from geotransform) is larger than output * map_cellsize then we want to extract only enough data to match the output * map resolution which means that GDAL will automatically sample the data * on read. * * To prevent bad contour effects on tile edges, we adjust the target * cellsize to align the extracted window with a virtual grid based on the * origin of the raw data and a virtual grid step size corresponding to an * integer sampling step. * * If source data has a greater cellsize (i.e. lower res) that requested * output map then we use the raw data cellsize as target cellsize since * there is no point in interpolating the data for contours in this case. */ virtual_grid_step_x = (int)floor(map_cellsize_x / ABS(adfGeoTransform[1])); if (virtual_grid_step_x < 1) virtual_grid_step_x = 1; /* Do not interpolate data if grid sampling step < 1 */ virtual_grid_step_y = (int)floor(map_cellsize_y / ABS(adfGeoTransform[5])); if (virtual_grid_step_y < 1) virtual_grid_step_y = 1; /* Do not interpolate data if grid sampling step < 1 */ /* target cellsize is a multiple of raw data cellsize based on grid step*/ dst_cellsize_x = ABS(adfGeoTransform[1]) * virtual_grid_step_x; dst_cellsize_y = ABS(adfGeoTransform[5]) * virtual_grid_step_y; /* Compute overlap between source and target views */ copyRect = mapRect; if (copyRect.minx < GEO_TRANS(adfGeoTransform, 0, src_ysize)) copyRect.minx = GEO_TRANS(adfGeoTransform, 0, src_ysize); if (copyRect.maxx > GEO_TRANS(adfGeoTransform, src_xsize, 0)) copyRect.maxx = GEO_TRANS(adfGeoTransform, src_xsize, 0); if (copyRect.miny < GEO_TRANS(adfGeoTransform + 3, 0, src_ysize)) copyRect.miny = GEO_TRANS(adfGeoTransform + 3, 0, src_ysize); if (copyRect.maxy > GEO_TRANS(adfGeoTransform + 3, src_xsize, 0)) copyRect.maxy = GEO_TRANS(adfGeoTransform + 3, src_xsize, 0); if (copyRect.minx >= copyRect.maxx || copyRect.miny >= copyRect.maxy) { if (layer->debug) msDebug("msContourLayerReadRaster(): No overlap.\n"); return MS_SUCCESS; } /* * Convert extraction window to raster coordinates */ llx = GEO_TRANS(adfInvGeoTransform + 0, copyRect.minx, copyRect.miny); lly = GEO_TRANS(adfInvGeoTransform + 3, copyRect.minx, copyRect.miny); urx = GEO_TRANS(adfInvGeoTransform + 0, copyRect.maxx, copyRect.maxy); ury = GEO_TRANS(adfInvGeoTransform + 3, copyRect.maxx, copyRect.maxy); /* * Align extraction window with virtual grid * (keep in mind raster coordinates origin is at upper-left) * We also add an extra buffer to fix tile boundarie issues when zoomed */ llx = floor(llx / virtual_grid_step_x) * virtual_grid_step_x - (virtual_grid_step_x * 5); urx = ceil(urx / virtual_grid_step_x) * virtual_grid_step_x + (virtual_grid_step_x * 5); ury = floor(ury / virtual_grid_step_y) * virtual_grid_step_y - (virtual_grid_step_x * 5); lly = ceil(lly / virtual_grid_step_y) * virtual_grid_step_y + (virtual_grid_step_x * 5); src_xoff = MS_MAX(0, (int)floor(llx + 0.5)); src_yoff = MS_MAX(0, (int)floor(ury + 0.5)); src_xsize = MS_MIN(MS_MAX(0, (int)(urx - llx + 0.5)), GDALGetRasterXSize(clinfo->hOrigDS) - src_xoff); src_ysize = MS_MIN(MS_MAX(0, (int)(lly - ury + 0.5)), GDALGetRasterYSize(clinfo->hOrigDS) - src_yoff); /* Update the geographic extent (buffer added) */ /* TODO: a better way to go the geo_trans */ copyRect.minx = GEO_TRANS(adfGeoTransform + 0, src_xoff, 0); copyRect.maxx = GEO_TRANS(adfGeoTransform + 0, src_xoff + src_xsize, 0); copyRect.miny = GEO_TRANS(adfGeoTransform + 3, 0, src_yoff + src_ysize); copyRect.maxy = GEO_TRANS(adfGeoTransform + 3, 0, src_yoff); /* * If input window is to small then stop here */ if (src_xsize < 2 || src_ysize < 2) { if (layer->debug) msDebug("msContourLayerReadRaster(): input window too small, or no " "apparent overlap between map view and this window(1).\n"); return MS_SUCCESS; } /* Target buffer size */ dst_xsize = (int)ceil((copyRect.maxx - copyRect.minx) / dst_cellsize_x); dst_ysize = (int)ceil((copyRect.maxy - copyRect.miny) / dst_cellsize_y); if (dst_xsize == 0 || dst_ysize == 0) { if (layer->debug) msDebug("msContourLayerReadRaster(): no apparent overlap between map " "view and this window(2).\n"); return MS_SUCCESS; } if (layer->debug) msDebug("msContourLayerReadRaster(): src=%d,%d,%d,%d, dst=%d,%d,%d,%d\n", src_xoff, src_yoff, src_xsize, src_ysize, 0, 0, dst_xsize, dst_ysize); } else { src_xoff = 0; src_yoff = 0; dst_xsize = src_xsize = MS_MIN(map->width, src_xsize); dst_ysize = src_ysize = MS_MIN(map->height, src_ysize); copyRect.minx = 0; copyRect.miny = 0; (void)copyRect.miny; copyRect.maxx = map->width; copyRect.maxy = map->height; (void)copyRect.maxx; dst_cellsize_y = dst_cellsize_x = 1; } /* -------------------------------------------------------------------- */ /* Allocate buffer, and read data into it. */ /* -------------------------------------------------------------------- */ clinfo->buffer = (double *)malloc(sizeof(double) * dst_xsize * dst_ysize); if (clinfo->buffer == NULL) { msSetError(MS_MEMERR, "Malloc(): Out of memory.", "msContourLayerReadRaster()"); return MS_FAILURE; } eErr = GDALRasterIO(hBand, GF_Read, src_xoff, src_yoff, src_xsize, src_ysize, clinfo->buffer, dst_xsize, dst_ysize, GDT_Float64, 0, 0); if (eErr != CE_None) { msSetError(MS_IOERR, "GDALRasterIO() failed: %s", "msContourLayerReadRaster()", CPLGetLastErrorMsg()); free(clinfo->buffer); clinfo->buffer = NULL; return MS_FAILURE; } GDALDriverH hMemDRV = GDALGetDriverByName("MEM"); if (!hMemDRV) { msSetError(MS_IOERR, "GDAL MEM driver not available", "msContourLayerReadRaster()"); free(clinfo->buffer); clinfo->buffer = NULL; return MS_FAILURE; } char pointer[64]; memset(pointer, 0, sizeof(pointer)); CPLPrintPointer(pointer, clinfo->buffer, sizeof(pointer)); clinfo->hDS = GDALCreate(hMemDRV, "", dst_xsize, dst_ysize, 0, 0, NULL); if (clinfo->hDS == NULL) { msSetError(MS_IMGERR, "Unable to create GDAL Memory dataset.", "msContourLayerReadRaster()"); free(clinfo->buffer); clinfo->buffer = NULL; return MS_FAILURE; } char **papszOptions = CSLSetNameValue(NULL, "DATAPOINTER", pointer); eErr = GDALAddBand(clinfo->hDS, GDT_Float64, papszOptions); CSLDestroy(papszOptions); if (eErr != CE_None) { msSetError(MS_IMGERR, "Unable to add band to GDAL Memory dataset.", "msContourLayerReadRaster()"); free(clinfo->buffer); clinfo->buffer = NULL; return MS_FAILURE; } { // Copy nodata value from source dataset to memory dataset int bHasNoData = FALSE; double dfNoDataValue = GDALGetRasterNoDataValue(hBand, &bHasNoData); if (bHasNoData) { GDALSetRasterNoDataValue(GDALGetRasterBand(clinfo->hDS, 1), dfNoDataValue); } } adfGeoTransform[0] = copyRect.minx; adfGeoTransform[1] = dst_cellsize_x; adfGeoTransform[2] = 0; adfGeoTransform[3] = copyRect.maxy; adfGeoTransform[4] = 0; adfGeoTransform[5] = -dst_cellsize_y; clinfo->cellsize = MS_MAX(dst_cellsize_x, dst_cellsize_y); { char buf[64]; sprintf(buf, "%lf", clinfo->cellsize); msInsertHashTable(&layer->metadata, "__data_cellsize__", buf); } GDALSetGeoTransform(clinfo->hDS, adfGeoTransform); return MS_SUCCESS; } static void msContourOGRCloseConnection(void *conn_handle) { OGRDataSourceH hDS = (OGRDataSourceH)conn_handle; msAcquireLock(TLOCK_OGR); OGR_DS_Destroy(hDS); msReleaseLock(TLOCK_OGR); } /* Function that parses multiple options in the a list. It also supports min/maxscaledenom checks. ie. "CONTOUR_INTERVAL=0,3842942:10" */ static char *msContourGetOption(layerObj *layer, const char *name) { int c, i, found = MS_FALSE; char **values, **tmp, **options; double maxscaledenom, minscaledenom; char *value = NULL; options = CSLFetchNameValueMultiple(layer->processing, name); c = CSLCount(options); /* First pass to find the value among options that have min/maxscaledenom */ /* specified */ for (i = 0; i < c && found == MS_FALSE; ++i) { values = CSLTokenizeStringComplex(options[i], ":", FALSE, FALSE); if (CSLCount(values) == 2) { tmp = CSLTokenizeStringComplex(values[0], ",", FALSE, FALSE); if (CSLCount(tmp) == 2) { minscaledenom = atof(tmp[0]); maxscaledenom = atof(tmp[1]); if (layer->map->scaledenom <= 0 || (((maxscaledenom <= 0) || (layer->map->scaledenom <= maxscaledenom)) && ((minscaledenom <= 0) || (layer->map->scaledenom > minscaledenom)))) { value = msStrdup(values[1]); found = MS_TRUE; } } CSLDestroy(tmp); } CSLDestroy(values); } /* Second pass to find the value among options that do NOT have */ /* min/maxscaledenom specified */ for (i = 0; i < c && found == MS_FALSE; ++i) { values = CSLTokenizeStringComplex(options[i], ":", FALSE, FALSE); if (CSLCount(values) == 1) { value = msStrdup(values[0]); found = MS_TRUE; } CSLDestroy(values); } CSLDestroy(options); return value; } static int msContourLayerGenerateContour(layerObj *layer) { OGRSFDriverH hDriver; OGRFieldDefnH hFld; OGRLayerH hLayer; const char *elevItem; char *option; double interval = 1.0, levels[1000]; int levelCount = 0; GDALRasterBandH hBand = NULL; CPLErr eErr; int bHasNoData = FALSE; double dfNoDataValue; contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; OGRRegisterAll(); if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerCreateOGRDataSource()"); return MS_FAILURE; } if (!clinfo->hDS) { /* no overlap */ return MS_SUCCESS; } hBand = GDALGetRasterBand(clinfo->hDS, 1); if (hBand == NULL) { msSetError(MS_IMGERR, "Band %d does not exist on dataset.", "msContourLayerGenerateContour()", 1); return MS_FAILURE; } /* Create the OGR DataSource */ #if GDAL_VERSION_MAJOR > 3 || \ (GDAL_VERSION_MAJOR == 3 && GDAL_VERSION_MINOR >= 11) const char *pszDrvName = "MEM"; #else const char *pszDrvName = "Memory"; #endif hDriver = OGRGetDriverByName(pszDrvName); if (hDriver == NULL) { msSetError(MS_OGRERR, "Unable to get OGR driver '%s'.", "msContourLayerCreateOGRDataSource()", pszDrvName); return MS_FAILURE; } clinfo->hOGRDS = OGR_Dr_CreateDataSource(hDriver, "", NULL); if (clinfo->hOGRDS == NULL) { msSetError(MS_OGRERR, "Unable to create OGR DataSource.", "msContourLayerCreateOGRDataSource()"); return MS_FAILURE; } hLayer = OGR_DS_CreateLayer(clinfo->hOGRDS, clinfo->ogrLayer.name, NULL, wkbLineString, NULL); hFld = OGR_Fld_Create("ID", OFTInteger); OGR_Fld_SetWidth(hFld, 8); OGR_L_CreateField(hLayer, hFld, FALSE); OGR_Fld_Destroy(hFld); /* Check if we have a coutour item specified */ elevItem = CSLFetchNameValue(layer->processing, "CONTOUR_ITEM"); if (elevItem && strlen(elevItem) > 0) { hFld = OGR_Fld_Create(elevItem, OFTReal); OGR_Fld_SetWidth(hFld, 12); OGR_Fld_SetPrecision(hFld, 3); OGR_L_CreateField(hLayer, hFld, FALSE); OGR_Fld_Destroy(hFld); } else { elevItem = NULL; } option = msContourGetOption(layer, "CONTOUR_INTERVAL"); if (option) { interval = atof(option); free(option); } option = msContourGetOption(layer, "CONTOUR_LEVELS"); if (option) { int i, c; char **levelsTmp; levelsTmp = CSLTokenizeStringComplex(option, ",", FALSE, FALSE); c = CSLCount(levelsTmp); for (i = 0; i < c && i < (int)(sizeof(levels) / sizeof(double)); ++i) levels[levelCount++] = atof(levelsTmp[i]); CSLDestroy(levelsTmp); free(option); } dfNoDataValue = GDALGetRasterNoDataValue(hBand, &bHasNoData); eErr = GDALContourGenerate( hBand, interval, 0.0, levelCount, levels, bHasNoData, dfNoDataValue, hLayer, OGR_FD_GetFieldIndex(OGR_L_GetLayerDefn(hLayer), "ID"), (elevItem == NULL) ? -1 : OGR_FD_GetFieldIndex(OGR_L_GetLayerDefn(hLayer), elevItem), NULL, NULL); if (eErr != CE_None) { msSetError(MS_IOERR, "GDALContourGenerate() failed: %s", "msContourLayerGenerateContour()", CPLGetLastErrorMsg()); return MS_FAILURE; } msConnPoolRegister(&clinfo->ogrLayer, clinfo->hOGRDS, msContourOGRCloseConnection); return MS_SUCCESS; } int msContourLayerOpen(layerObj *layer) { char *decrypted_path; char szPath[MS_MAXPATHLEN]; contourLayerInfo *clinfo; if (layer->debug) msDebug("Entering msContourLayerOpen().\n"); /* If we don't have info, initialize an empty one now */ if (layer->layerinfo == NULL) msContourLayerInfoInitialize(layer); clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->data == NULL && layer->tileindex == NULL) { msSetError(MS_MISCERR, "Layer %s has neither DATA nor TILEINDEX defined.", "msContourLayerOpen()", layer->name); return MS_FAILURE; } if (layer->tileindex != NULL) { char szTilename[MS_MAXPATHLEN]; int status; int tilelayerindex, tileitemindex, tilesrsindex; rectObj searchrect; layerObj *tlp; shapeObj tshp; char tilesrsname[1]; msInitShape(&tshp); searchrect = layer->map->extent; status = msDrawRasterSetupTileLayer(layer->map, layer, &searchrect, MS_FALSE, &tilelayerindex, &tileitemindex, &tilesrsindex, &tlp); if (status == MS_FAILURE) { return MS_FAILURE; } status = msDrawRasterIterateTileIndex(layer, tlp, &tshp, tileitemindex, -1, szTilename, sizeof(szTilename), tilesrsname, sizeof(tilesrsname)); if (status == MS_FAILURE || status == MS_DONE) { if (status == MS_DONE) { if (layer->debug) msDebug("No raster matching filter.\n"); } msDrawRasterCleanupTileLayer(tlp, tilelayerindex); return MS_FAILURE; } msDrawRasterCleanupTileLayer(tlp, tilelayerindex); msDrawRasterBuildRasterPath(layer->map, layer, szTilename, szPath); decrypted_path = msStrdup(szPath); /* Cancel the time filter that might have been set on ours in case of */ /* a inline tileindex */ msFreeExpression(&layer->filter); msInitExpression(&layer->filter); } else { msTryBuildPath3(szPath, layer->map->mappath, layer->map->shapepath, layer->data); decrypted_path = msDecryptStringTokens(layer->map, szPath); } GDALAllRegister(); /* Open the original Dataset */ msAcquireLock(TLOCK_GDAL); if (decrypted_path) { clinfo->hOrigDS = GDALOpen(decrypted_path, GA_ReadOnly); msFree(decrypted_path); } else clinfo->hOrigDS = NULL; msReleaseLock(TLOCK_GDAL); if (clinfo->hOrigDS == NULL) { msSetError(MS_IMGERR, "Unable to open GDAL dataset.", "msContourLayerOpen()"); return MS_FAILURE; } /* Open the raster source */ if (msContourLayerReadRaster(layer, layer->map->extent) != MS_SUCCESS) return MS_FAILURE; /* Generate Contour Dataset */ if (msContourLayerGenerateContour(layer) != MS_SUCCESS) return MS_FAILURE; if (clinfo->hDS) { GDALClose(clinfo->hDS); clinfo->hDS = NULL; free(clinfo->buffer); } /* Open our virtual ogr layer */ if (clinfo->hOGRDS && (msLayerOpen(&clinfo->ogrLayer) != MS_SUCCESS)) return MS_FAILURE; return MS_SUCCESS; } int msContourLayerIsOpen(layerObj *layer) { if (layer->layerinfo) return MS_TRUE; return MS_FALSE; } int msContourLayerClose(layerObj *layer) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->debug) msDebug("Entering msContourLayerClose().\n"); if (clinfo) { if (clinfo->hOGRDS) msConnPoolRelease(&clinfo->ogrLayer, clinfo->hOGRDS); msLayerClose(&clinfo->ogrLayer); if (clinfo->hDS) { GDALClose(clinfo->hDS); clinfo->hDS = NULL; free(clinfo->buffer); } if (clinfo->hOrigDS) { GDALClose(clinfo->hOrigDS); clinfo->hOrigDS = NULL; } msContourLayerInfoFree(layer); } return MS_SUCCESS; } int msContourLayerGetItems(layerObj *layer) { const char *elevItem; contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerGetItems()"); return MS_FAILURE; } layer->numitems = 0; layer->items = (char **)msSmallCalloc(sizeof(char *), 2); layer->items[layer->numitems++] = msStrdup("ID"); elevItem = CSLFetchNameValue(layer->processing, "CONTOUR_ITEM"); if (elevItem && strlen(elevItem) > 0) { layer->items[layer->numitems++] = msStrdup(elevItem); } return msLayerGetItems(&clinfo->ogrLayer); } int msContourLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { int i; rectObj newRect; contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->debug) msDebug("Entering msContourLayerWhichShapes().\n"); if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerWhichShapes()"); return MS_FAILURE; } if (isQuery) { newRect = layer->map->extent; } else { newRect = rect; /* if necessary, project the searchrect to source coords */ if (msProjectionsDiffer(&(layer->map->projection), &(layer->projection))) { if (msProjectRect(&layer->projection, &layer->map->projection, &newRect) != MS_SUCCESS) { msDebug("msContourLayerWhichShapes(%s): unable to reproject map " "request rectangle into layer projection, canceling.\n", layer->name); return MS_FAILURE; } } } /* regenerate the raster io */ if (clinfo->hOGRDS) msConnPoolRelease(&clinfo->ogrLayer, clinfo->hOGRDS); msLayerClose(&clinfo->ogrLayer); /* Open the raster source */ if (msContourLayerReadRaster(layer, newRect) != MS_SUCCESS) return MS_FAILURE; /* Generate Contour Dataset */ if (msContourLayerGenerateContour(layer) != MS_SUCCESS) return MS_FAILURE; if (clinfo->hDS) { GDALClose(clinfo->hDS); clinfo->hDS = NULL; free(clinfo->buffer); } if (!clinfo->hOGRDS) /* no overlap */ return MS_DONE; /* Open our virtual ogr layer */ if (msLayerOpen(&clinfo->ogrLayer) != MS_SUCCESS) return MS_FAILURE; clinfo->ogrLayer.numitems = layer->numitems; clinfo->ogrLayer.items = (char **)msSmallMalloc(sizeof(char *) * layer->numitems); for (i = 0; i < layer->numitems; ++i) { clinfo->ogrLayer.items[i] = msStrdup(layer->items[i]); } return msLayerWhichShapes(&clinfo->ogrLayer, rect, isQuery); } int msContourLayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->debug) msDebug("Entering msContourLayerGetShape().\n"); if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerGetShape()"); return MS_FAILURE; } return msLayerGetShape(&clinfo->ogrLayer, shape, record); } int msContourLayerNextShape(layerObj *layer, shapeObj *shape) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->debug) msDebug("Entering msContourLayerNextShape().\n"); if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerNextShape()"); return MS_FAILURE; } return msLayerNextShape(&clinfo->ogrLayer, shape); } /************************************************************************/ /* msContourLayerGetExtent() */ /* Simple copy of the maprasterquery.c file. might change in the future */ /************************************************************************/ int msContourLayerGetExtent(layerObj *layer, rectObj *extent) { contourLayerInfo *clinfo = (contourLayerInfo *)layer->layerinfo; if (layer->debug) msDebug("Entering msContourLayerGetExtent().\n"); if (clinfo == NULL) { msSetError(MS_MISCERR, "Assertion failed: Contour layer not opened!!!", "msContourLayerGetExtent()"); return MS_FAILURE; } MS_COPYRECT(extent, &clinfo->extent); return MS_SUCCESS; } /************************************************************************/ /* msContourLayerSetTimeFilter() */ /* */ /* This function is actually just used in the context of */ /* setting a filter on the tileindex for time based queries. */ /* For instance via WMS requests. */ /* */ /* If a local shapefile tileindex is in use, we will set a */ /* backtics filter (shapefile compatible). If another layer is */ /* being used as the tileindex then we will forward the */ /* SetTimeFilter call to it. If there is no tileindex in */ /* place, we do nothing. */ /************************************************************************/ int msContourLayerSetTimeFilter(layerObj *layer, const char *timestring, const char *timefield) { int tilelayerindex; if (layer->debug) msDebug("msContourLayerSetTimeFilter(%s,%s).\n", timestring, timefield); /* -------------------------------------------------------------------- */ /* If we don't have a tileindex the time filter has no effect. */ /* -------------------------------------------------------------------- */ if (layer->tileindex == NULL) { if (layer->debug) msDebug("msContourLayerSetTimeFilter(): time filter without effect on " "layers without tileindex.\n"); return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* Find the tileindex layer. */ /* -------------------------------------------------------------------- */ tilelayerindex = msGetLayerIndex(layer->map, layer->tileindex); /* -------------------------------------------------------------------- */ /* If we are using a local shapefile as our tileindex (that is */ /* to say, the tileindex name is not of another layer), then we */ /* just install a backtics style filter on the current layer. */ /* -------------------------------------------------------------------- */ if (tilelayerindex == -1) return msLayerMakeBackticsTimeFilter(layer, timestring, timefield); /* -------------------------------------------------------------------- */ /* Otherwise we invoke the tileindex layers SetTimeFilter */ /* method. */ /* -------------------------------------------------------------------- */ if (msCheckParentPointer(layer->map, "map") == MS_FAILURE) return MS_FAILURE; return msLayerSetTimeFilter(layer->GET_LAYER(map, tilelayerindex), timestring, timefield); } /************************************************************************/ /* msRASTERLayerInitializeVirtualTable() */ /************************************************************************/ int msContourLayerInitializeVirtualTable(layerObj *layer) { assert(layer != NULL); assert(layer->vtable != NULL); layer->vtable->LayerInitItemInfo = msContourLayerInitItemInfo; layer->vtable->LayerFreeItemInfo = msContourLayerFreeItemInfo; layer->vtable->LayerOpen = msContourLayerOpen; layer->vtable->LayerIsOpen = msContourLayerIsOpen; layer->vtable->LayerWhichShapes = msContourLayerWhichShapes; layer->vtable->LayerNextShape = msContourLayerNextShape; layer->vtable->LayerGetShape = msContourLayerGetShape; /* layer->vtable->LayerGetShapeCount, use default */ layer->vtable->LayerClose = msContourLayerClose; layer->vtable->LayerGetItems = msContourLayerGetItems; layer->vtable->LayerGetExtent = msContourLayerGetExtent; /* layer->vtable->LayerGetAutoStyle, use default */ /* layer->vtable->LayerApplyFilterToLayer, use default */ /*layer->vtable->LayerCloseConnection = msContourLayerClose;*/ /* we use backtics for proper tileindex shapefile functioning */ layer->vtable->LayerSetTimeFilter = msContourLayerSetTimeFilter; /* layer->vtable->LayerCreateItems, use default */ /* layer->vtable->LayerGetNumFeatures, use default */ return MS_SUCCESS; } ����������������������������������������������������������������������mapserver-8.6.0/src/mapcopy.c�����������������������������������������������������������������������0000664�0000000�0000000�00000122756�15114050610�0016142�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Functions to allow copying/cloning of maps * Author: Sean Gillies, sgillies@frii.com * * Notes: * These functions are not in mapfile.c because that file is * cumbersome enough as it is. There is agreement that this code and * that in mapfile.c should eventually be split up by object into * mapobj.c, layerobj.c, etc. Or something like that. * * Unit tests are written in Python using PyUnit and are in * mapscript/python/tests/testCopyMap.py. The tests can be * executed from the python directory as * * python2 tests/testCopyMap.py * * I just find Python to be very handy for unit testing, that's all. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include "mapserver.h" #include "mapsymbol.h" #include "mapcopy.h" #include "cpl_string.h" /*********************************************************************** * msCopyProjectionExtended() * * * * Copy a projectionObj while adding additional arguments * **********************************************************************/ int msCopyProjectionExtended(projectionObj *dst, const projectionObj *src, char **args, int num_args) { MS_COPYSTELEM(numargs); MS_COPYSTELEM(gt); for (int i = 0; i < dst->numargs; i++) { /* Our destination consists of unallocated pointers */ dst->args[i] = msStrdup(src->args[i]); } if (args) { for (int i = 0; i < num_args; i++) { dst->args[dst->numargs++] = msStrdup(args[i]); } } msProjectionInheritContextFrom(dst, src); if (dst->numargs != 0) { if (msProcessProjection(dst) != MS_SUCCESS) return MS_FAILURE; } MS_COPYSTELEM(wellknownprojection); return MS_SUCCESS; } /*********************************************************************** * msCopyProjection() * * * * Copy a projectionObj * **********************************************************************/ int msCopyProjection(projectionObj *dst, const projectionObj *src) { return msCopyProjectionExtended(dst, src, NULL, 0); } /*********************************************************************** * msCopyLine() * * * * Copy a lineObj, using msCopyPoint() * **********************************************************************/ int msCopyLine(lineObj *dst, const lineObj *src) { int i; dst->numpoints = src->numpoints; for (i = 0; i < dst->numpoints; i++) { MS_COPYPOINT(&(dst->point[i]), &(src->point[i])); } return MS_SUCCESS; } /*********************************************************************** * msCopyShape() * * * * Copy a shapeObj, using msCopyLine(), msCopyRect() * * Not completely implemented or tested. * **********************************************************************/ /* int msCopyShapeObj(shapeObj *dst, shapeObj *src) { int i; copyProperty(&(dst->numlines), &(src->numlines), sizeof(int)); for (i = 0; i < dst->numlines; i++) { msCopyLine(&(dst->line[i]), &(src->line[i])); } msCopyRect(&(dst->bounds), &(src->bounds)); copyProperty(&(dst->type), &(src->type), sizeof(int)); copyProperty(&(dst->index), &(src->index), sizeof(long)); copyProperty(&(dst->tileindex), &(src->tileindex), sizeof(int)); copyProperty(&(dst->classindex), &(src->classindex), sizeof(int)); copyStringPropertyRealloc(&(dst->text), src->text); copyProperty(&(dst->numvalues), &(src->numvalues), sizeof(int)); for (i = 0; i < dst->numvalues; i++) { copyStringPropertyRealloc(&(dst->values[i]), src->values[i]); } return(0); } */ /********************************************************************** * msCopyItem() * * * * Copy an itemObj * **********************************************************************/ int msCopyItem(itemObj *dst, const itemObj *src) { MS_COPYSTRING(dst->name, src->name); MS_COPYSTELEM(type); MS_COPYSTELEM(index); MS_COPYSTELEM(size); MS_COPYSTELEM(numdecimals); return MS_SUCCESS; } /*********************************************************************** * msCopyHashTable() * * * * Copy a hashTableObj, using msInsertHashTable() * **********************************************************************/ int msCopyHashTable(hashTableObj *dst, const hashTableObj *src) { const char *key = NULL; while (1) { key = msNextKeyFromHashTable(src, key); if (!key) break; else msInsertHashTable(dst, key, msLookupHashTable(src, key)); } return MS_SUCCESS; } /*********************************************************************** * msCopyFontSet() * * * * Copy a fontSetObj, using msCreateHashTable() and msCopyHashTable() * **********************************************************************/ int msCopyFontSet(fontSetObj *dst, const fontSetObj *src, mapObj *map) { MS_COPYSTRING(dst->filename, src->filename); MS_COPYSTELEM(numfonts); if (msCopyHashTable(&(dst->fonts), &(src->fonts)) != MS_SUCCESS) return MS_FAILURE; dst->map = map; return MS_SUCCESS; } /*********************************************************************** * msCopyExpression() * * * * Copy an expressionObj, but only its string, type and flags * **********************************************************************/ int msCopyExpression(expressionObj *dst, const expressionObj *src) { if ((dst->type == MS_REGEX) && dst->compiled) ms_regfree(&(dst->regex)); dst->compiled = MS_FALSE; MS_COPYSTRING(dst->string, src->string); MS_COPYSTELEM(type); MS_COPYSTELEM(flags); return MS_SUCCESS; } /*********************************************************************** * msCopyJoin() * * * * Copy a joinObj * **********************************************************************/ int msCopyJoin(joinObj *dst, const joinObj *src) { MS_COPYSTRING(dst->name, src->name); /* makes no sense to copy the items or values since they are runtime additions to the mapfile */ MS_COPYSTRING(dst->table, src->table); MS_COPYSTRING(dst->from, src->from); MS_COPYSTRING(dst->to, src->to); MS_COPYSTRING(dst->header, src->header); #ifndef __cplusplus MS_COPYSTRING(dst->template, src->template); #else MS_COPYSTRING(dst->_template, src->_template); #endif MS_COPYSTRING(dst->footer, src->footer); dst->type = src->type; MS_COPYSTRING(dst->connection, src->connection); MS_COPYSTELEM(connectiontype); /* TODO: need to handle joininfo (probably should be just set to NULL) */ dst->joininfo = NULL; return MS_SUCCESS; } /*********************************************************************** * msCopyQueryMap() * * * * Copy a queryMapObj, using msCopyColor() * **********************************************************************/ int msCopyQueryMap(queryMapObj *dst, const queryMapObj *src) { MS_COPYSTELEM(height); MS_COPYSTELEM(width); MS_COPYSTELEM(status); MS_COPYSTELEM(style); MS_COPYCOLOR(&(dst->color), &(src->color)); return MS_SUCCESS; } /*********************************************************************** * msCopyLeader() * * * * Copy a labelLeaderObj, using msCopyStyle() * **********************************************************************/ int msCopyLabelLeader(labelLeaderObj *dst, const labelLeaderObj *src) { int i; assert(dst && src); MS_COPYSTELEM(gridstep); MS_COPYSTELEM(maxdistance); /* ** now the styles */ /* free any previous styles on the dst label */ for (i = 0; i < dst->numstyles; i++) { /* each style */ if (dst->styles[i] != NULL) { if (freeStyle(dst->styles[i]) == MS_SUCCESS) msFree(dst->styles[i]); } } dst->numstyles = 0; for (i = 0; i < src->numstyles; i++) { if (msGrowLeaderStyles(dst) == NULL) return MS_FAILURE; if (initStyle(dst->styles[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to init style.", "msCopyLabel()"); return MS_FAILURE; } if (msCopyStyle(dst->styles[i], src->styles[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy style.", "msCopyLabel()"); return MS_FAILURE; } dst->numstyles++; } return MS_SUCCESS; } /*********************************************************************** * msCopyLabel() * * * * Copy a labelObj, using msCopyColor() and msCopyStyle() * **********************************************************************/ int msCopyLabel(labelObj *dst, const labelObj *src) { int i; for (i = 0; i < MS_LABEL_BINDING_LENGTH; i++) { MS_COPYSTRING(dst->bindings[i].item, src->bindings[i].item); dst->bindings[i].index = src->bindings[i].index; /* no way to use the macros */ MS_COPYSTRING(dst->exprBindings[i].string, src->exprBindings[i].string); dst->exprBindings[i].type = src->exprBindings[i].type; } MS_COPYSTELEM(numbindings); MS_COPYSTELEM(nexprbindings); MS_COPYSTRING(dst->font, src->font); MS_COPYCOLOR(&(dst->color), &(src->color)); MS_COPYCOLOR(&(dst->outlinecolor), &(src->outlinecolor)); MS_COPYCOLOR(&(dst->shadowcolor), &(src->shadowcolor)); MS_COPYSTELEM(shadowsizex); MS_COPYSTELEM(shadowsizey); MS_COPYSTELEM(size); MS_COPYSTELEM(minsize); MS_COPYSTELEM(maxsize); MS_COPYSTELEM(position); MS_COPYSTELEM(offsetx); MS_COPYSTELEM(offsety); MS_COPYSTELEM(angle); MS_COPYSTELEM(anglemode); MS_COPYSTELEM(buffer); MS_COPYSTELEM(wrap); MS_COPYSTELEM(align); MS_COPYSTELEM(maxlength); MS_COPYSTELEM(minfeaturesize); MS_COPYSTELEM(minscaledenom); MS_COPYSTELEM(maxscaledenom); MS_COPYSTELEM(autominfeaturesize); MS_COPYSTELEM(mindistance); MS_COPYSTELEM(partials); MS_COPYSTELEM(force); MS_COPYSTELEM(priority); MS_COPYSTELEM(repeatdistance); MS_COPYSTELEM(maxoverlapangle); MS_COPYSTRING(dst->encoding, src->encoding); MS_COPYSTELEM(outlinewidth); MS_COPYSTELEM(space_size_10); if (msCopyExpression(&(dst->expression), &(src->expression)) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy expression.", "msCopyLabel()"); return MS_FAILURE; } if (msCopyExpression(&(dst->text), &(src->text)) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy text.", "msCopyLabel()"); return MS_FAILURE; } /* ** now the styles */ /* free any previous styles on the dst label */ for (i = 0; i < dst->numstyles; i++) { /* each style */ if (dst->styles[i] != NULL) { if (freeStyle(dst->styles[i]) == MS_SUCCESS) msFree(dst->styles[i]); } } dst->numstyles = 0; for (i = 0; i < src->numstyles; i++) { if (msGrowLabelStyles(dst) == NULL) return MS_FAILURE; if (initStyle(dst->styles[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to init style.", "msCopyLabel()"); return MS_FAILURE; } if (msCopyStyle(dst->styles[i], src->styles[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy style.", "msCopyLabel()"); return MS_FAILURE; } dst->numstyles++; } if (src->leader) { dst->leader = msSmallMalloc(sizeof(labelLeaderObj)); initLeader(dst->leader); msCopyLabelLeader(dst->leader, src->leader); } else { if (dst->leader) { freeLabelLeader(dst->leader); msFree(dst->leader); } dst->leader = NULL; } MS_COPYSTELEM(sizeunits); MS_COPYSTELEM(scalefactor); return MS_SUCCESS; } /*********************************************************************** * msCopyWeb() * * * * Copy webObj, using msCopyRect(), msCreateHashTable(), and * * msCopyHashTable() * **********************************************************************/ int msCopyWeb(webObj *dst, const webObj *src, mapObj *map) { MS_COPYSTRING(dst->imagepath, src->imagepath); MS_COPYSTRING(dst->imageurl, src->imageurl); dst->map = map; #ifndef __cplusplus MS_COPYSTRING(dst->template, src->template); #else MS_COPYSTRING(dst->_template, src->_template); #endif MS_COPYSTRING(dst->header, src->header); MS_COPYSTRING(dst->footer, src->footer); MS_COPYSTRING(dst->empty, src->empty); MS_COPYSTRING(dst->error, src->error); MS_COPYSTELEM(minscaledenom); MS_COPYSTELEM(maxscaledenom); MS_COPYSTRING(dst->mintemplate, src->mintemplate); MS_COPYSTRING(dst->maxtemplate, src->maxtemplate); if (msCopyHashTable(&(dst->metadata), &(src->metadata)) != MS_SUCCESS) return MS_FAILURE; msCopyHashTable(&dst->validation, &src->validation); MS_COPYSTRING(dst->queryformat, src->queryformat); MS_COPYSTRING(dst->legendformat, src->legendformat); MS_COPYSTRING(dst->browseformat, src->browseformat); return MS_SUCCESS; } /*********************************************************************** * msCopyStyle() * * * * Copy a styleObj, using msCopyColor() * **********************************************************************/ int msCopyStyle(styleObj *dst, const styleObj *src) { int i; for (i = 0; i < MS_STYLE_BINDING_LENGTH; i++) { MS_COPYSTRING(dst->bindings[i].item, src->bindings[i].item); dst->bindings[i].index = src->bindings[i].index; /* no way to use the macros */ MS_COPYSTRING(dst->exprBindings[i].string, src->exprBindings[i].string); dst->exprBindings[i].type = src->exprBindings[i].type; } MS_COPYSTELEM(numbindings); MS_COPYSTELEM(nexprbindings); MS_COPYCOLOR(&(dst->color), &(src->color)); MS_COPYCOLOR(&(dst->outlinecolor), &(src->outlinecolor)); MS_COPYCOLOR(&(dst->mincolor), &(src->mincolor)); MS_COPYCOLOR(&(dst->maxcolor), &(src->maxcolor)); MS_COPYSTRING(dst->symbolname, src->symbolname); MS_COPYSTELEM(patternlength); for (i = 0; i < src->patternlength; i++) dst->pattern[i] = src->pattern[i]; MS_COPYSTELEM(initialgap); MS_COPYSTELEM(gap); MS_COPYSTELEM(linejoin); MS_COPYSTELEM(linejoinmaxsize); MS_COPYSTELEM(antialiased); MS_COPYSTELEM(linecap); MS_COPYSTELEM(symbol); MS_COPYSTELEM(size); MS_COPYSTELEM(minsize); MS_COPYSTELEM(maxsize); MS_COPYSTELEM(width); MS_COPYSTELEM(minwidth); MS_COPYSTELEM(maxwidth); MS_COPYSTELEM(offsetx); MS_COPYSTELEM(offsety); MS_COPYSTELEM(angle); MS_COPYSTELEM(autoangle); MS_COPYSTELEM(minvalue); MS_COPYSTELEM(maxvalue); MS_COPYSTELEM(opacity); MS_COPYSTRING(dst->_geomtransform.string, src->_geomtransform.string); MS_COPYSTELEM(_geomtransform.type); MS_COPYSTRING(dst->rangeitem, src->rangeitem); MS_COPYSTELEM(rangeitemindex); MS_COPYSTELEM(outlinewidth); MS_COPYSTELEM(minscaledenom); MS_COPYSTELEM(maxscaledenom); /* TODO: add copy for bindings */ MS_COPYSTELEM(sizeunits); MS_COPYSTELEM(scalefactor); return MS_SUCCESS; } /*********************************************************************** * msCopyClass() * * * * Copy a classObj, using msCopyExpression(), msCopyStyle(), * * msCopyLabel(), msCreateHashTable(), msCopyHashTable() * **********************************************************************/ int msCopyClass(classObj *dst, const classObj *src, layerObj *layer_unused) { int i, return_value; (void)layer_unused; return_value = msCopyExpression(&(dst->expression), &(src->expression)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy expression.", "msCopyClass()"); return MS_FAILURE; } MS_COPYSTELEM(status); MS_COPYSTELEM(isfallback); /* free any previous styles on the dst layer */ for (i = 0; i < dst->numstyles; i++) { /* each style */ if (dst->styles[i] != NULL) { if (freeStyle(dst->styles[i]) == MS_SUCCESS) { msFree(dst->styles[i]); } } } dst->numstyles = 0; for (i = 0; i < src->numstyles; i++) { if (msGrowClassStyles(dst) == NULL) return MS_FAILURE; if (initStyle(dst->styles[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to init style.", "msCopyClass()"); return MS_FAILURE; } if (msCopyStyle(dst->styles[i], src->styles[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy style.", "msCopyClass()"); return MS_FAILURE; } dst->numstyles++; } for (i = 0; i < src->numlabels; i++) { if (msGrowClassLabels(dst) == NULL) return MS_FAILURE; initLabel(dst->labels[i]); if (msCopyLabel(dst->labels[i], src->labels[i]) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy label.", "msCopyClass()"); return MS_FAILURE; } dst->numlabels++; } MS_COPYSTELEM(numlabels); if (src->leader) { if (dst->leader) { freeLabelLeader(dst->leader); } if (!dst->leader) { dst->leader = msSmallMalloc(sizeof(labelLeaderObj)); initLeader(dst->leader); } msCopyLabelLeader(dst->leader, src->leader); } MS_COPYSTRING(dst->keyimage, src->keyimage); MS_COPYSTRING(dst->name, src->name); MS_COPYSTRING(dst->title, src->title); MS_COPYSTRING(dst->group, src->group); if (msCopyExpression(&(dst->text), &(src->text)) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy text.", "msCopyClass()"); return MS_FAILURE; } #ifndef __cplusplus MS_COPYSTRING(dst->template, src->template); #else MS_COPYSTRING(dst->_template, src->_template); #endif msCopyHashTable(&(dst->metadata), &(src->metadata)); msCopyHashTable(&dst->validation, &src->validation); MS_COPYSTELEM(minscaledenom); MS_COPYSTELEM(maxscaledenom); MS_COPYSTELEM(layer); MS_COPYSTELEM(debug); MS_COPYSTELEM(sizeunits); MS_COPYSTELEM(scalefactor); return MS_SUCCESS; } int msCopyCluster(clusterObj *dst, const clusterObj *src) { int return_value; MS_COPYSTELEM(maxdistance); MS_COPYSTELEM(buffer); MS_COPYSTRING(dst->region, src->region); return_value = msCopyExpression(&(dst->group), &(src->group)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy cluster group.", "msCopyCluster()"); return MS_FAILURE; } return_value = msCopyExpression(&(dst->filter), &(src->filter)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy cluster filter.", "msCopyCluster()"); return MS_FAILURE; } return MS_SUCCESS; } /*********************************************************************** * msCopyGrid() * **********************************************************************/ int msCopyGrid(graticuleObj *dst, const graticuleObj *src) { MS_COPYSTELEM(dwhichlatitude); MS_COPYSTELEM(dwhichlongitude); MS_COPYSTELEM(dstartlatitude); MS_COPYSTELEM(dstartlongitude); MS_COPYSTELEM(dendlatitude); MS_COPYSTELEM(dendlongitude); MS_COPYSTELEM(dincrementlatitude); MS_COPYSTELEM(dincrementlongitude); MS_COPYSTELEM(minarcs); MS_COPYSTELEM(maxarcs); MS_COPYSTELEM(minincrement); MS_COPYSTELEM(maxincrement); MS_COPYSTELEM(minsubdivides); MS_COPYSTELEM(maxsubdivides); MS_COPYSTELEM(bvertical); MS_COPYSTELEM(blabelaxes); MS_COPYSTELEM(ilabelstate); MS_COPYSTELEM(ilabeltype); MS_COPYRECT(&(dst->extent), &(src->extent)); MS_COPYSTRING(dst->labelformat, src->labelformat); return MS_SUCCESS; } #ifdef why_on_earth_would_you_copy_a_labelcache /*********************************************************************** * msCopyLabelCacheMember() * * * * Copy a labelCacheMemberObj using msCopyStyle(), msCopyPoint() * * * * Note: since it seems most users will want to clone maps rather than * * make exact copies, this method might not get much use. * **********************************************************************/ int msCopyLabelCacheMember(labelCacheMemberObj *dst, const labelCacheMemberObj *src) { int i; MS_COPYSTELEM(featuresize); MS_COPYSTELEM(numstyles); for (i = 0; i < dst->numstyles; i++) { msCopyStyle(&(dst->styles[i]), &(src->styles[i])); } MS_COPYSTELEM(numlabels); dst->labels = (labelObj *)msSmallMalloc(sizeof(labelObj) * dst->numlabels); for (i = 0; i < dst->numlabels; i++) { msCopyLabel(&(dst->labels[i]), &(src->labels[i])); } MS_COPYSTELEM(layerindex); MS_COPYSTELEM(classindex); MS_COPYSTELEM(tileindex); MS_COPYSTELEM(shapeindex); MS_COPYPOINT(&(dst->point), &(src->point)); /* msCopyShape(&(dst->poly), &(src->poly)); */ MS_COPYSTELEM(status); return MS_SUCCESS; } /*********************************************************************** * msCopyMarkerCacheMember() * * * * Copy a markerCacheMemberObj * **********************************************************************/ int msCopyMarkerCacheMember(markerCacheMemberObj *dst, const markerCacheMemberObj *src) { MS_COPYSTELEM(id); /* msCopyShape(&(dst->poly), &(src->poly)); */ return MS_SUCCESS; } /*********************************************************************** * msCopyLabelCacheSlot() * **********************************************************************/ int msCopyLabelCacheSlot(labelCacheSlotObj *dst, const labelCacheSlotObj *src) { int i; for (i = 0; i < dst->numlabels; i++) { msCopyLabelCacheMember(&(dst->labels[i]), &(src->labels[i])); } MS_COPYSTELEM(cachesize); MS_COPYSTELEM(nummarkers); for (i = 0; i < dst->nummarkers; i++) { msCopyMarkerCacheMember(&(dst->markers[i]), &(src->markers[i])); } MS_COPYSTELEM(markercachesize); return MS_SUCCESS; } /*********************************************************************** * msCopyLabelCache() * **********************************************************************/ int msCopyLabelCache(labelCacheObj *dst, const labelCacheObj *src) { int p; MS_COPYSTELEM(numlabels); for (p = 0; p < MS_MAX_LABEL_PRIORITY; p++) { msCopyLabelCacheSlot(&(dst->slots[p]), &(src->slots[p])); } return MS_SUCCESS; } #endif /*********************************************************************** * msCopyResult() * **********************************************************************/ int msCopyResult(resultObj *dst, const resultObj *src) { MS_COPYSTELEM(shapeindex); MS_COPYSTELEM(tileindex); MS_COPYSTELEM(classindex); MS_COPYSTELEM(resultindex); return MS_SUCCESS; } /*********************************************************************** * msCopyResultCache() * **********************************************************************/ int msCopyResultCache(resultCacheObj *dst, const resultCacheObj *src) { int i; MS_COPYSTELEM(cachesize); MS_COPYSTELEM(numresults); for (i = 0; i < dst->numresults; i++) { msCopyResult(&(dst->results[i]), &(src->results[i])); } MS_COPYRECT(&(dst->bounds), &(src->bounds)); return MS_SUCCESS; } /*********************************************************************** * msCopyReferenceMap() * * * * Copy a referenceMapObj using mapfile.c:initReferenceMap(), * * msCopyRect(), msCopyColor() * **********************************************************************/ int msCopyReferenceMap(referenceMapObj *dst, const referenceMapObj *src, mapObj *map) { initReferenceMap(dst); MS_COPYRECT(&(dst->extent), &(src->extent)); MS_COPYSTELEM(height); MS_COPYSTELEM(width); MS_COPYCOLOR(&(dst->color), &(src->color)); MS_COPYCOLOR(&(dst->outlinecolor), &(src->outlinecolor)); MS_COPYSTRING(dst->image, src->image); MS_COPYSTELEM(status); MS_COPYSTELEM(marker); MS_COPYSTRING(dst->markername, src->markername); MS_COPYSTELEM(markersize); MS_COPYSTELEM(minboxsize); MS_COPYSTELEM(maxboxsize); dst->map = map; return MS_SUCCESS; } /*********************************************************************** * msCopyScalebar() * * * * Copy a scalebarObj, using initScalebar(), msCopyColor(), * * and msCopyLabel() * **********************************************************************/ int msCopyScalebar(scalebarObj *dst, const scalebarObj *src) { initScalebar(dst); MS_COPYCOLOR(&(dst->imagecolor), &(src->imagecolor)); MS_COPYSTELEM(height); MS_COPYSTELEM(width); MS_COPYSTELEM(style); MS_COPYSTELEM(intervals); if (msCopyLabel(&(dst->label), &(src->label)) != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy label.", "msCopyScalebar()"); return MS_FAILURE; } MS_COPYCOLOR(&(dst->color), &(src->color)); MS_COPYCOLOR(&(dst->backgroundcolor), &(src->backgroundcolor)); MS_COPYCOLOR(&(dst->outlinecolor), &(src->outlinecolor)); MS_COPYSTELEM(units); MS_COPYSTELEM(status); MS_COPYSTELEM(position); MS_COPYSTELEM(transparent); MS_COPYSTELEM(postlabelcache); MS_COPYSTELEM(align); return MS_SUCCESS; } /*********************************************************************** * msCopyLegend() * * * * Copy a legendObj, using msCopyColor() * **********************************************************************/ int msCopyLegend(legendObj *dst, const legendObj *src, mapObj *map) { int return_value; MS_COPYCOLOR(&(dst->imagecolor), &(src->imagecolor)); return_value = msCopyLabel(&(dst->label), &(src->label)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy label.", "msCopyLegend()"); return MS_FAILURE; } MS_COPYSTELEM(keysizex); MS_COPYSTELEM(keysizey); MS_COPYSTELEM(keyspacingx); MS_COPYSTELEM(keyspacingy); MS_COPYCOLOR(&(dst->outlinecolor), &(src->outlinecolor)); MS_COPYSTELEM(status); MS_COPYSTELEM(height); MS_COPYSTELEM(width); MS_COPYSTELEM(position); MS_COPYSTELEM(transparent); MS_COPYSTELEM(postlabelcache); #ifndef __cplusplus MS_COPYSTRING(dst->template, src->template); #else MS_COPYSTRING(dst->_template, src->_template); #endif dst->map = map; return MS_SUCCESS; } int msCopyScaleTokenEntry(const scaleTokenEntryObj *src, scaleTokenEntryObj *dst) { MS_COPYSTRING(dst->value, src->value); MS_COPYSTELEM(minscale); MS_COPYSTELEM(maxscale); return MS_SUCCESS; } int msCopyScaleToken(const scaleTokenObj *src, scaleTokenObj *dst) { int i; MS_COPYSTRING(dst->name, src->name); MS_COPYSTELEM(n_entries); dst->tokens = (scaleTokenEntryObj *)msSmallCalloc(src->n_entries, sizeof(scaleTokenEntryObj)); for (i = 0; i < src->n_entries; i++) { msCopyScaleTokenEntry(&src->tokens[i], &dst->tokens[i]); } return MS_SUCCESS; } int msCopyCompositingFilter(CompositingFilter **pdst, const CompositingFilter *src) { CompositingFilter *dst = NULL; if (!src) { *pdst = NULL; return MS_SUCCESS; } while (src) { if (!dst) { dst = *pdst = msSmallMalloc(sizeof(CompositingFilter)); } else { dst->next = msSmallMalloc(sizeof(CompositingFilter)); dst = dst->next; } dst->filter = msStrdup(src->filter); dst->next = NULL; src = src->next; } return MS_SUCCESS; } int msCopyCompositer(LayerCompositer **ldst, const LayerCompositer *src) { LayerCompositer *dst = NULL; if (!src) { *ldst = NULL; return MS_SUCCESS; } while (src) { if (!dst) { dst = *ldst = msSmallMalloc(sizeof(LayerCompositer)); } else { dst->next = msSmallMalloc(sizeof(LayerCompositer)); dst = dst->next; } dst->comp_op = src->comp_op; dst->opacity = src->opacity; dst->next = NULL; msCopyCompositingFilter(&dst->filter, src->filter); src = src->next; } return MS_SUCCESS; } /*********************************************************************** * msCopyLayer() * * * * Copy a layerObj, using mapfile.c:initClass(), msCopyClass(), * * msCopyColor(), msCopyProjection(), msShapefileOpen(), * * msCreateHashTable(), msCopyHashTable(), msCopyExpression() * * * * As it stands, we are not copying a layer's resultcache * **********************************************************************/ int msCopyLayer(layerObj *dst, const layerObj *src) { int i, return_value; featureListNodeObjPtr current; MS_COPYSTELEM(index); MS_COPYSTRING(dst->classitem, src->classitem); MS_COPYSTELEM(classitemindex); for (i = 0; i < src->numscaletokens; i++) { if (msGrowLayerScaletokens(dst) == NULL) return MS_FAILURE; initScaleToken(&dst->scaletokens[i]); msCopyScaleToken(&src->scaletokens[i], &dst->scaletokens[i]); dst->numscaletokens++; } for (i = 0; i < src->numclasses; i++) { if (msGrowLayerClasses(dst) == NULL) return MS_FAILURE; #ifndef __cplusplus initClass(dst->class[i]); return_value = msCopyClass(dst->class[i], src -> class[i], dst); #else initClass(dst->_class[i]); return_value = msCopyClass(dst->_class[i], src->_class[i], dst); #endif if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy class.", "msCopyLayer()"); return MS_FAILURE; } dst->numclasses++; } MS_COPYSTRING(dst->header, src->header); MS_COPYSTRING(dst->footer, src->footer); #ifndef __cplusplus MS_COPYSTRING(dst->template, src->template); #else MS_COPYSTRING(dst->_template, src->_template); #endif MS_COPYSTRING(dst->name, src->name); MS_COPYSTRING(dst->group, src->group); MS_COPYSTRING(dst->data, src->data); MS_COPYSTRING(dst->encoding, src->encoding); MS_COPYSTELEM(rendermode); MS_COPYSTELEM(status); MS_COPYSTELEM(type); MS_COPYSTELEM(tolerance); MS_COPYSTELEM(toleranceunits); MS_COPYSTELEM(identificationclassauto); MS_COPYSTRING(dst->identificationclassgroup, src->identificationclassgroup); MS_COPYSTELEM(symbolscaledenom); MS_COPYSTELEM(scalefactor); MS_COPYSTELEM(minscaledenom); MS_COPYSTELEM(maxscaledenom); MS_COPYSTELEM(labelminscaledenom); MS_COPYSTELEM(labelmaxscaledenom); MS_COPYSTELEM(mingeowidth); MS_COPYSTELEM(maxgeowidth); MS_COPYSTELEM(sizeunits); MS_COPYSTELEM(maxfeatures); MS_COPYCOLOR(&(dst->offsite), &(src->offsite)); MS_COPYSTELEM(transform); MS_COPYSTELEM(labelcache); MS_COPYSTELEM(postlabelcache); MS_COPYSTRING(dst->labelitem, src->labelitem); MS_COPYSTELEM(labelitemindex); MS_COPYSTRING(dst->tileitem, src->tileitem); MS_COPYSTELEM(tileitemindex); MS_COPYSTRING(dst->tilesrs, src->tilesrs); MS_COPYSTRING(dst->tileindex, src->tileindex); return_value = msCopyProjection(&(dst->projection), &(src->projection)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy projection.", "msCopyLayer()"); return MS_FAILURE; } return_value = msCopyCluster(&(dst->cluster), &(src->cluster)); if (return_value != MS_SUCCESS) { return MS_FAILURE; } MS_COPYSTELEM(project); MS_COPYSTELEM(units); current = src->features; while (current != NULL) { insertFeatureList(&(dst->features), &(current->shape)); current = current->next; } MS_COPYSTRING(dst->connection, src->connection); MS_COPYSTELEM(connectiontype); MS_COPYSTRING(dst->plugin_library, src->plugin_library); MS_COPYSTRING(dst->plugin_library_original, src->plugin_library_original); /* Do not copy *layerinfo, items, or iteminfo. these are all initialized when the copied layer is opened */ return_value = msCopyExpression(&(dst->filter), &(src->filter)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy filter.", "msCopyLayer()"); return MS_FAILURE; } MS_COPYSTRING(dst->filteritem, src->filteritem); MS_COPYSTELEM(filteritemindex); MS_COPYSTRING(dst->styleitem, src->styleitem); MS_COPYSTELEM(styleitemindex); MS_COPYSTRING(dst->requires, src->requires); MS_COPYSTRING(dst->labelrequires, src->labelrequires); msCopyHashTable(&(dst->metadata), &(src->metadata)); msCopyHashTable(&dst->validation, &src->validation); msCopyHashTable(&dst->connectionoptions, &src->connectionoptions); MS_COPYSTELEM(debug); dst->processing = CSLDuplicate(src->processing); MS_COPYSTELEM(numjoins); for (i = 0; i < dst->numjoins; i++) { initJoin(&(dst->joins[i])); return_value = msCopyJoin(&(dst->joins[i]), &(src->joins[i])); if (return_value != MS_SUCCESS) return MS_FAILURE; } MS_COPYRECT(&(dst->extent), &(src->extent)); MS_COPYSTRING(dst->classgroup, src->classgroup); MS_COPYSTRING(dst->mask, src->mask); if (src->grid) { if (dst->grid) { freeGrid(dst->grid); msFree(dst->grid); } dst->grid = (void *)malloc(sizeof(graticuleObj)); MS_CHECK_ALLOC(dst->grid, sizeof(graticuleObj), -1); initGrid(dst->grid); msCopyGrid(dst->grid, src->grid); } if (src->compositer) { msCopyCompositer(&dst->compositer, src->compositer); } return MS_SUCCESS; } /*********************************************************************** * msCopyMap() * * * * Copy a mapObj, using mapfile.c:initLayer(), msCopyLayer(), * * msCopyLegend(), msCopyScalebar(), msCopyProjection() * * msCopyOutputFormat(), msCopyWeb(), msCopyReferenceMap() * **********************************************************************/ int msCopyMap(mapObj *dst, const mapObj *src) { int i, return_value; outputFormatObj *format; MS_COPYSTRING(dst->name, src->name); MS_COPYSTELEM(status); MS_COPYSTELEM(height); MS_COPYSTELEM(width); MS_COPYSTELEM(maxsize); for (i = 0; i < src->numlayers; i++) { if (msGrowMapLayers(dst) == NULL) return MS_FAILURE; initLayer((GET_LAYER(dst, i)), dst); return_value = msCopyLayer((GET_LAYER(dst, i)), (GET_LAYER(src, i))); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy layer.", "msCopyMap()"); return MS_FAILURE; } dst->numlayers++; } return_value = msCopyFontSet(&(dst->fontset), &(src->fontset), dst); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy fontset.", "msCopyMap()"); return MS_FAILURE; } return_value = msCopySymbolSet(&(dst->symbolset), &(src->symbolset), dst); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy symbolset.", "msCopyMap()"); return MS_FAILURE; } /* msCopyLabelCache(&(dst->labelcache), &(src->labelcache)); */ MS_COPYRECT(&(dst->extent), &(src->extent)); MS_COPYSTELEM(cellsize); MS_COPYSTELEM(units); MS_COPYSTELEM(scaledenom); MS_COPYSTELEM(defresolution); MS_COPYSTELEM(resolution); MS_COPYSTRING(dst->shapepath, src->shapepath); MS_COPYSTRING(dst->mappath, src->mappath); MS_COPYSTELEM(sldurl); MS_COPYCOLOR(&(dst->imagecolor), &(src->imagecolor)); /* clear existing destination format list */ if (dst->outputformat && --dst->outputformat->refcount < 1) { msFreeOutputFormat(dst->outputformat); dst->outputformat = NULL; } for (i = 0; i < dst->numoutputformats; i++) { if (--dst->outputformatlist[i]->refcount < 1) msFreeOutputFormat(dst->outputformatlist[i]); } if (dst->outputformatlist != NULL) msFree(dst->outputformatlist); dst->outputformatlist = NULL; dst->outputformat = NULL; dst->numoutputformats = 0; for (i = 0; i < src->numoutputformats; i++) msAppendOutputFormat(dst, msCloneOutputFormat(src->outputformatlist[i])); /* set the active output format */ MS_COPYSTRING(dst->imagetype, src->imagetype); format = msSelectOutputFormat(dst, dst->imagetype); msApplyOutputFormat(&(dst->outputformat), format, MS_NOOVERRIDE); return_value = msCopyProjection(&(dst->projection), &(src->projection)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy projection.", "msCopyMap()"); return MS_FAILURE; } /* No need to copy latlon projection */ return_value = msCopyReferenceMap(&(dst->reference), &(src->reference), dst); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy reference.", "msCopyMap()"); return MS_FAILURE; } return_value = msCopyScalebar(&(dst->scalebar), &(src->scalebar)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy scalebar.", "msCopyMap()"); return MS_FAILURE; } return_value = msCopyLegend(&(dst->legend), &(src->legend), dst); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy legend.", "msCopyMap()"); return MS_FAILURE; } return_value = msCopyQueryMap(&(dst->querymap), &(src->querymap)); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy querymap.", "msCopyMap()"); return MS_FAILURE; } return_value = msCopyWeb(&(dst->web), &(src->web), dst); if (return_value != MS_SUCCESS) { msSetError(MS_MEMERR, "Failed to copy web.", "msCopyMap()"); return MS_FAILURE; } if (src->layerorder) { for (i = 0; i < dst->numlayers; i++) { MS_COPYSTELEM(layerorder[i]); } } MS_COPYSTELEM(debug); MS_COPYSTRING(dst->datapattern, src->datapattern); MS_COPYSTRING(dst->templatepattern, src->templatepattern); if (msCopyHashTable(&(dst->configoptions), &(src->configoptions)) != MS_SUCCESS) return MS_FAILURE; return MS_SUCCESS; } int msCopyRasterBuffer(rasterBufferObj *dst, const rasterBufferObj *src) { *dst = *src; if (src->type == MS_BUFFER_BYTE_RGBA) { dst->data.rgba = src->data.rgba; dst->data.rgba.pixels = msSmallMalloc(((size_t)src->height) * src->data.rgba.row_step); memcpy(dst->data.rgba.pixels, src->data.rgba.pixels, ((size_t)src->data.rgba.row_step) * src->height); dst->data.rgba.r = dst->data.rgba.pixels + (src->data.rgba.r - src->data.rgba.pixels); dst->data.rgba.g = dst->data.rgba.pixels + (src->data.rgba.g - src->data.rgba.pixels); dst->data.rgba.b = dst->data.rgba.pixels + (src->data.rgba.b - src->data.rgba.pixels); if (src->data.rgba.a) { dst->data.rgba.a = dst->data.rgba.pixels + (src->data.rgba.a - src->data.rgba.pixels); } else { dst->data.rgba.a = NULL; } } return MS_SUCCESS; } ������������������mapserver-8.6.0/src/mapcopy.h�����������������������������������������������������������������������0000664�0000000�0000000�00000007451�15114050610�0016141�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Declarations related to copyng mapObjs. Provided by Mladen Turk * for resolution of bug 701 * http://mapserver.gis.umn.edu/bugs/show_bug.cgi?id=701. * Author: Mladen Turk (and Sean Gilles?) * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ /* Following works for GCC and MSVC. That's ~98% of our users, if Tyler * Mitchell's survey is correct */ #define MS_COPYSTELEM(_name) (dst)->/**/ _name = (src)->/**/ _name #define MS_MACROBEGIN do { #define MS_MACROEND \ } \ while (0) #define MS_COPYRECT(_dst, _src) \ MS_MACROBEGIN(_dst)->minx = (_src)->minx; \ (_dst)->miny = (_src)->miny; \ (_dst)->maxx = (_src)->maxx; \ (_dst)->maxy = (_src)->maxy; \ MS_MACROEND #define MS_COPYPOINT(_dst, _src) \ MS_MACROBEGIN(_dst)->x = (_src)->x; \ (_dst)->y = (_src)->y; \ (_dst)->m = (_src)->m; \ MS_MACROEND #define MS_COPYCOLOR(_dst, _src) \ MS_MACROBEGIN(_dst)->red = (_src)->red; \ (_dst)->green = (_src)->green; \ (_dst)->blue = (_src)->blue; \ (_dst)->alpha = (_src)->alpha; \ MS_MACROEND #define MS_COPYSTRING(_dst, _src) \ MS_MACROBEGIN \ if ((_dst) != NULL) \ msFree((_dst)); \ if ((_src)) \ (_dst) = msStrdup((_src)); \ else \ (_dst) = NULL; \ MS_MACROEND �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mapserver-8.6.0/src/mapcpl.c������������������������������������������������������������������������0000664�0000000�0000000�00000021752�15114050610�0015740�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Functions copied from GDAL's CPL. This file contain utility * functions that come from the GDAL/OGR cpl library. The idea * behind it is to have access in mapserver to all these * utilities, without being constrained to link with GDAL/OGR. * Author: Y. Assefa, DM Solutions Group (assefa@dmsolutions.ca) * * * Note: * Names of functions used here are the same as those in the cpl * library with the exception the the CPL prefix is changed to ms * (eg : CPLGetBasename() would become msGetBasename()) * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ /* $Id$ */ #include #include "mapserver.h" /* should be size of largest possible filename */ #define MS_PATH_BUF_SIZE 2048 static char szStaticResult[MS_PATH_BUF_SIZE]; /************************************************************************/ /* msFindFilenameStart() */ /************************************************************************/ static int msFindFilenameStart(const char *pszFilename) { int iFileStart; for (iFileStart = strlen(pszFilename); iFileStart > 0 && pszFilename[iFileStart - 1] != '/' && pszFilename[iFileStart - 1] != '\\'; iFileStart--) { } return iFileStart; } /************************************************************************/ /* msGetBasename() */ /************************************************************************/ /** * Extract basename (non-directory, non-extension) portion of filename. * * Returns a string containing the file basename portion of the passed * name. If there is no basename (passed value ends in trailing directory * separator, or filename starts with a dot) an empty string is returned. * *
 * msGetBasename( "abc/def.xyz" ) == "def"
 * msGetBasename( "abc/def" ) == "def"
 * msGetBasename( "abc/def/" ) == ""
 * 
* * @param pszFullFilename the full filename potentially including a path. * * @return just the non-directory, non-extension portion of the path in * an internal string which must not be freed. The string * may be destroyed by the next ms filename handling call. */ const char *msGetBasename(const char *pszFullFilename) { int iFileStart = msFindFilenameStart(pszFullFilename); int iExtStart, nLength; for (iExtStart = strlen(pszFullFilename); iExtStart > iFileStart && pszFullFilename[iExtStart] != '.'; iExtStart--) { } if (iExtStart == iFileStart) iExtStart = strlen(pszFullFilename); nLength = iExtStart - iFileStart; assert(nLength < MS_PATH_BUF_SIZE); strlcpy(szStaticResult, pszFullFilename + iFileStart, nLength + 1); return szStaticResult; } /* Id: GDAL/port/cplgetsymbol.cpp,v 1.14 2004/11/11 20:40:38 fwarmerdam Exp */ /* ==================================================================== */ /* Unix Implementation */ /* ==================================================================== */ #if defined(HAVE_DLFCN_H) #define GOT_GETSYMBOL #include /************************************************************************/ /* msGetSymbol() */ /************************************************************************/ /** * Fetch a function pointer from a shared library / DLL. * * This function is meant to abstract access to shared libraries and * DLLs and performs functions similar to dlopen()/dlsym() on Unix and * LoadLibrary() / GetProcAddress() on Windows. * * If no support for loading entry points from a shared library is available * this function will always return NULL. Rules on when this function * issues a msError() or not are not currently well defined, and will have * to be resolved in the future. * * Currently msGetSymbol() doesn't try to: *
    *
  • prevent the reference count on the library from going up * for every request, or given any opportunity to unload * the library. *
  • Attempt to look for the library in non-standard * locations. *
  • Attempt to try variations on the symbol name, like * pre-prending or post-pending an underscore. *
* * Some of these issues may be worked on in the future. * * @param pszLibrary the name of the shared library or DLL containing * the function. May contain path to file. If not system supplies search * paths will be used. * @param pszSymbolName the name of the function to fetch a pointer to. * @return A pointer to the function if found, or NULL if the function isn't * found, or the shared library can't be loaded. */ void *msGetSymbol(const char *pszLibrary, const char *pszSymbolName) { void *pLibrary; void *pSymbol; pLibrary = dlopen(pszLibrary, RTLD_LAZY); if (pLibrary == NULL) { msSetError(MS_MISCERR, "Dynamic loading failed: %s", "msGetSymbol()", dlerror()); return NULL; } pSymbol = dlsym(pLibrary, pszSymbolName); #if (defined(__APPLE__) && defined(__MACH__)) /* On mach-o systems, C symbols have a leading underscore and depending * on how dlcompat is configured it may or may not add the leading * underscore. So if dlsym() fails add an underscore and try again. */ if (pSymbol == NULL) { char withUnder[strlen(pszSymbolName) + 2]; withUnder[0] = '_'; withUnder[1] = 0; strcat(withUnder, pszSymbolName); pSymbol = dlsym(pLibrary, withUnder); } #endif if (pSymbol == NULL) { msSetError(MS_MISCERR, "Dynamic loading failed: %s", "msGetSymbol()", dlerror()); return NULL; } /* We accept leakage of pLibrary */ /* coverity[leaked_storage] */ return (pSymbol); } #endif /* def __unix__ && defined(HAVE_DLFCN_H) */ /* ==================================================================== */ /* Windows Implementation */ /* ==================================================================== */ #ifdef WIN32 #define GOT_GETSYMBOL #include /************************************************************************/ /* msGetSymbol() */ /************************************************************************/ void *msGetSymbol(const char *pszLibrary, const char *pszSymbolName) { void *pLibrary; void *pSymbol; pLibrary = LoadLibrary(pszLibrary); if (pLibrary == NULL) { msSetError(MS_MISCERR, "Can't load requested dynamic library: %s", "msGetSymbol()", pszLibrary); return NULL; } pSymbol = (void *)GetProcAddress((HINSTANCE)pLibrary, pszSymbolName); if (pSymbol == NULL) { msSetError(MS_MISCERR, "Can't find requested entry point: %s in lib %s", "msGetSymbol()", pszSymbolName, pLibrary); return NULL; } return (pSymbol); } #endif /* def _WIN32 */ /* ==================================================================== */ /* Dummy implementation. */ /* ==================================================================== */ #ifndef GOT_GETSYMBOL /************************************************************************/ /* msGetSymbol() */ /* */ /* Dummy implementation. */ /************************************************************************/ void *msGetSymbol(const char *pszLibrary, const char *pszEntryPoint) { msSetError( MS_MISCERR, "msGetSymbol(%s,%s) called. Failed as this is stub implementation.", "msGetSymbol()", pszLibrary, pszEntryPoint); return NULL; } #endif mapserver-8.6.0/src/mapcrypto.c000066400000000000000000000462231511405061000165020ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Encryption functions (see MS-RFC-18) * Author: Daniel Morissette * ****************************************************************************** * Copyright (c) 1996-2006 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include /* isxdigit() */ #include /* rand() */ #include /* time() */ #include "mapserver.h" #include "cpl_conv.h" /********************************************************************** * encipher() and decipher() from the Tiny Encryption Algorithm (TEA) * website at: * http://www.simonshepherd.supanet.com/tea.htm * * TEA was developed and placed in the public domain by David Wheeler * and Roger Needham at the Computer Laboratory of Cambridge University. * * The source below came with the following public domain notice: * * "Please feel free to use any of this code in your applications. * The TEA algorithm (including new-variant TEA) has been placed * in the public domain, as have my assembly language implementations." * * ... and the following usage notes: * * All the routines have the general form * * void encipher(const unsigned long *const v,unsigned long *const w, * const unsigned long * const k); * * void decipher(const unsigned long *const v,unsigned long *const w, * const unsigned long * const k); * * TEA takes 64 bits of data in v[0] and v[1], and 128 bits of key in * k[0] - k[3]. The result is returned in w[0] and w[1]. Returning the * result separately makes implementation of cipher modes other than * Electronic Code Book a little bit easier. * * TEA can be operated in any of the modes of DES. * * n is the number of iterations. 32 is ample, 16 is sufficient, as few * as eight should be OK for most applications, especially ones where * the data age quickly (real-time video, for example). The algorithm * achieves good dispersion after six iterations. The iteration count * can be made variable if required. * * Note this algorithm is optimised for 32-bit CPUs with fast shift * capabilities. It can very easily be ported to assembly language * on most CPUs. * * delta is chosen to be the Golden ratio ((5/4)1/2 - 1/2 ~ 0.618034) * multiplied by 232. On entry to decipher(), sum is set to be delta * n. * Which way round you call the functions is arbitrary: DK(EK(P)) = EK(DK(P)) * where EK and DK are encryption and decryption under key K respectively. * **********************************************************************/ static void encipher(const ms_uint32 *const v, ms_uint32 *const w, const ms_uint32 *const k) { register ms_uint32 y = v[0], z = v[1], sum = 0, delta = 0x9E3779B9, n = 32; while (n-- > 0) { y += ((z << 4 ^ z >> 5) + z) ^ (sum + k[sum & 3]); sum += delta; z += ((y << 4 ^ y >> 5) + y) ^ (sum + k[sum >> 11 & 3]); } w[0] = y; w[1] = z; } static void decipher(const ms_uint32 *const v, ms_uint32 *const w, const ms_uint32 *const k) { register ms_uint32 y = v[0], z = v[1], sum = 0xC6EF3720, delta = 0x9E3779B9, n = 32; /* sum = delta<<5, in general sum = delta * n */ while (n-- > 0) { z -= ((y << 4 ^ y >> 5) + y) ^ (sum + k[sum >> 11 & 3]); sum -= delta; y -= ((z << 4 ^ z >> 5) + z) ^ (sum + k[sum & 3]); } w[0] = y; w[1] = z; } /********************************************************************** * msHexEncode() * * Hex-encode numbytes from in[] and return the result in out[]. * * out[] should be preallocated by the caller to be at least 2*numbytes+1 * (+1 for the terminating '\0') **********************************************************************/ void msHexEncode(const unsigned char *in, char *out, int numbytes) { char *hex = "0123456789ABCDEF"; while (numbytes-- > 0) { *out++ = hex[*in / 16]; *out++ = hex[*in % 16]; in++; } *out = '\0'; } /********************************************************************** * msHexDecode() * * Hex-decode numchars from in[] and return the result in out[]. * * If numchars > 0 then only up to this number of chars from in[] are * processed, otherwise the full in[] string up to the '\0' is processed. * * out[] should be preallocated by the caller to be large enough to hold * the resulting bytes. * * Returns the number of bytes written to out[] which may be different from * numchars/2 if an error or a '\0' is encountered. **********************************************************************/ int msHexDecode(const char *in, unsigned char *out, int numchars) { int numbytes_out = 0; /* Make sure numchars is even */ numchars = (numchars / 2) * 2; if (numchars < 2) numchars = -1; /* Will result in this value being ignored in the loop*/ while (*in != '\0' && *(in + 1) != '\0' && numchars != 0) { *out = 0x10 * (*in >= 'A' ? ((*in & 0xdf) - 'A') + 10 : (*in - '0')); in++; *out += (*in >= 'A' ? ((*in & 0xdf) - 'A') + 10 : (*in - '0')); in++; out++; numbytes_out++; numchars -= 2; } return numbytes_out; } /********************************************************************** * msGenerateEncryptionKey() * * Create a new encryption key. * * The output buffer should be at least MS_ENCRYPTION_KEY_SIZE bytes. **********************************************************************/ int msGenerateEncryptionKey(unsigned char *k) { int i; /* Use current time as seed for rand() */ srand((unsigned int)time(NULL)); for (i = 0; i < MS_ENCRYPTION_KEY_SIZE; i++) { /* coverity[dont_call] */ k[i] = (unsigned char)rand(); } return MS_SUCCESS; } /********************************************************************** * msReadEncryptionKeyFromFile() * * Read and decode hex-encoded encryption key from file and returns the * key in the 'unsigned char k[MS_ENCRYPTION_KEY_SIZE]' buffer that is * provided by the caller. * * Returns MS_SUCCESS/MS_FAILURE. **********************************************************************/ int msReadEncryptionKeyFromFile(const char *keyfile, unsigned char *k, const char *pszRelToPath) { FILE *fp; char extended_path[MS_MAXPATHLEN]; char szBuf[100]; int numchars; /* Try to make the path relative */ if (msBuildPath(extended_path, pszRelToPath, keyfile) == NULL) return MS_FAILURE; keyfile = extended_path; if ((fp = fopen(keyfile, "rt")) == NULL) { msSetError(MS_MISCERR, "Cannot open key file.", "msReadEncryptionKeyFromFile()"); return MS_FAILURE; } numchars = fread(szBuf, sizeof(unsigned char), MS_ENCRYPTION_KEY_SIZE * 2, fp); fclose(fp); szBuf[MS_ENCRYPTION_KEY_SIZE * 2] = '\0'; if (numchars != MS_ENCRYPTION_KEY_SIZE * 2) { msSetError(MS_MISCERR, "Invalid key file, got %d chars, expected %d.", "msReadEncryptionKeyFromFile()", numchars, MS_ENCRYPTION_KEY_SIZE * 2); return MS_FAILURE; } msHexDecode(szBuf, k, MS_ENCRYPTION_KEY_SIZE * 2); return MS_SUCCESS; } /********************************************************************** * msLoadEncryptionKey() * * Load and decode hex-encoded encryption key from file and returns the * key in the 'unsigned char k[MS_ENCRYPTION_KEY_SIZE]' buffer that is * provided by the caller. * * The first time that msLoadEncryptionKey() is called for a given mapObj * it will load the encryption key and cache it in mapObj->encryption_key. * If the key is already set in the mapObj then it does nothing and returns. * * The location of the encryption key can be specified in two ways, * either by setting the environment variable MS_ENCRYPTION_KEY or using * a CONFIG directive: * CONFIG MS_ENCRYPTION_KEY "/path/to/mykey.txt" * Returns MS_SUCCESS/MS_FAILURE. **********************************************************************/ static int msLoadEncryptionKey(mapObj *map) { const char *keyfile; if (map == NULL) { msSetError(MS_MISCERR, "NULL MapObj.", "msLoadEncryptionKey()"); return MS_FAILURE; } if (map->encryption_key_loaded) return MS_SUCCESS; /* Already loaded */ keyfile = msGetConfigOption(map, "MS_ENCRYPTION_KEY"); if (!keyfile) keyfile = CPLGetConfigOption("MS_ENCRYPTION_KEY", NULL); if (keyfile && msReadEncryptionKeyFromFile(keyfile, map->encryption_key, map->mappath) == MS_SUCCESS) { map->encryption_key_loaded = MS_TRUE; } else { msSetError(MS_MISCERR, "Failed reading encryption key. Make sure " "MS_ENCRYPTION_KEY is set and points to a valid key file.", "msLoadEncryptionKey()"); return MS_FAILURE; } return MS_SUCCESS; } /********************************************************************** * msEncryptStringWithKey() * * Encrypts and hex-encodes the contents of string in[] and returns the * result in out[] which should have been pre-allocated by the caller * to be at least twice the size of in[] + 16+1 bytes (for padding + '\0'). * **********************************************************************/ void msEncryptStringWithKey(const unsigned char *key, const char *in, char *out) { ms_uint32 v[4], w[4]; const ms_uint32 *k; int last_block = MS_FALSE; /* Casting the key this way is safe only as long as longs are 4 bytes * on this platform */ assert(sizeof(ms_uint32) == 4); k = (const ms_uint32 *)key; while (!last_block) { int i, j; /* encipher() takes v[2] (64 bits) as input. * Copy bytes from in[] to the v[2] input array (pair of 4 bytes) * v[] is padded with zeros if string doesn't align with 8 bytes */ v[0] = 0; v[1] = 0; for (i = 0; !last_block && i < 2; i++) { for (j = 0; j < 4; j++) { if (*in == '\0') { last_block = MS_TRUE; break; } v[i] |= *in << (j * 8); in++; } } if (*in == '\0') last_block = MS_TRUE; /* Do the actual encryption */ encipher(v, w, k); /* Append hex-encoded bytes to output, 4 bytes at a time */ msHexEncode((unsigned char *)w, out, 4); out += 8; msHexEncode((unsigned char *)(w + 1), out, 4); out += 8; } /* Make sure output is 0-terminated */ *out = '\0'; } /********************************************************************** * msDecryptStringWithKey() * * Hex-decodes and then decrypts the contents of string in[] and returns the * result in out[] which should have been pre-allocated by the caller * to be at least half the size of in[]. * **********************************************************************/ void msDecryptStringWithKey(const unsigned char *key, const char *in, char *out) { ms_uint32 v[4], w[4]; const ms_uint32 *k; int last_block = MS_FALSE; /* Casting the key this way is safe only as long as longs are 4 bytes * on this platform */ assert(sizeof(ms_uint32) == 4); k = (const ms_uint32 *)key; while (!last_block) { int i; /* decipher() takes v[2] (64 bits) as input. * Copy bytes from in[] to the v[2] input array (pair of 4 bytes) * v[] is padded with zeros if string doesn't align with 8 bytes */ v[0] = 0; v[1] = 0; if (msHexDecode(in, (unsigned char *)v, 8) != 4) last_block = MS_TRUE; else { in += 8; if (msHexDecode(in, (unsigned char *)(v + 1), 8) != 4) last_block = MS_TRUE; else in += 8; } /* Do the actual decryption */ decipher(v, w, k); /* Copy the results to out[] */ for (i = 0; i < 2; i++) { *out++ = (w[i] & 0x000000ff); *out++ = (w[i] & 0x0000ff00) >> 8; *out++ = (w[i] & 0x00ff0000) >> 16; *out++ = (w[i] & 0xff000000) >> 24; } if (*in == '\0') last_block = MS_TRUE; } /* Make sure output is 0-terminated */ *out = '\0'; } /********************************************************************** * msDecryptStringTokens() * * Returns a newly allocated string (to be msFree'd by the caller) in * which all occurrences of encrypted strings delimited by {...} have * been decrypted. * **********************************************************************/ char *msDecryptStringTokens(mapObj *map, const char *in) { char *outbuf, *out; if (map == NULL) { msSetError(MS_MISCERR, "NULL MapObj.", "msLoadEncryptionKey()"); return NULL; } /* Start with a copy of the string. Decryption can only result in * a string with the same or shorter length */ if ((outbuf = (char *)malloc((strlen(in) + 1) * sizeof(char))) == NULL) { msSetError(MS_MEMERR, NULL, "msDecryptStringTokens()"); return NULL; } out = outbuf; while (*in != '\0') { if (*in == '{') { /* Possibly beginning of a token, look for closing bracket ** and make sure all chars in between are valid hex encoding chars */ const char *pszStart, *pszEnd; int valid_token = MS_FALSE; pszStart = in + 1; if ((pszEnd = strchr(pszStart, '}')) != NULL && pszEnd - pszStart > 1) { const char *pszTmp; valid_token = MS_TRUE; for (pszTmp = pszStart; pszTmp < pszEnd; pszTmp++) { if (!isxdigit(*pszTmp)) { valid_token = MS_FALSE; break; } } } if (valid_token) { /* Go ahead and decrypt the token */ char *pszTmp; /* Make sure encryption key is loaded. We do this here instead * of at the beginning of the function to avoid loading the * key unless ready necessary. This is a very cheap call if * the key is already loaded */ if (msLoadEncryptionKey(map) != MS_SUCCESS) return NULL; pszTmp = (char *)malloc((pszEnd - pszStart + 1) * sizeof(char)); strlcpy(pszTmp, pszStart, (pszEnd - pszStart) + 1); msDecryptStringWithKey(map->encryption_key, pszTmp, out); out += strlen(out); in = pszEnd + 1; free(pszTmp); } else { /* Not a valid token, just copy the '{' and keep going */ *out++ = *in++; } } else { /* Just copy any other chars */ *out++ = *in++; } } *out = '\0'; return outbuf; } #ifdef TEST_MAPCRYPTO /* Test for mapcrypto.c functions. To run these tests, use the following ** Makefile directive: test_mapcrypto: $(LIBMAP_STATIC) mapcrypto.c $(CC) $(CFLAGS) mapcrypto.c -DTEST_MAPCRYPTO $(EXE_LDFLAGS) -o test_mapcrypto ** */ int main(int argc, char *argv[]) { const unsigned char bytes_in[] = {0x12, 0x34, 0xff, 0x00, 0x44, 0x22}; unsigned char bytes_out[8], encryption_key[MS_ENCRYPTION_KEY_SIZE * 2 + 1]; char string_buf[256], string_buf2[256]; int numbytes = 0; /* ** Test msHexEncode() */ msHexEncode(bytes_in, string_buf, 6); printf("msHexEncode returned '%s'\n", string_buf); /* ** Test msHexDecode() */ memset(bytes_out, 0, 8); numbytes = msHexDecode(string_buf, bytes_out, -1); printf( "msHexDecode(%s, -1) = %d, bytes_out = %x, %x, %x, %x, %x, %x, %x, %x\n", string_buf, numbytes, bytes_out[0], bytes_out[1], bytes_out[2], bytes_out[3], bytes_out[4], bytes_out[5], bytes_out[6], bytes_out[7]); memset(bytes_out, 0, 8); numbytes = msHexDecode(string_buf, bytes_out, 4); printf( "msHexDecode(%s, 4) = %d, bytes_out = %x, %x, %x, %x, %x, %x, %x, %x\n", string_buf, numbytes, bytes_out[0], bytes_out[1], bytes_out[2], bytes_out[3], bytes_out[4], bytes_out[5], bytes_out[6], bytes_out[7]); memset(bytes_out, 0, 8); numbytes = msHexDecode(string_buf, bytes_out, 20); printf( "msHexDecode(%s, 20) = %d, bytes_out = %x, %x, %x, %x, %x, %x, %x, %x\n", string_buf, numbytes, bytes_out[0], bytes_out[1], bytes_out[2], bytes_out[3], bytes_out[4], bytes_out[5], bytes_out[6], bytes_out[7]); /* ** Test loading encryption key */ if (msReadEncryptionKeyFromFile("/tmp/test.key", encryption_key, NULL) != MS_SUCCESS) { printf("msReadEncryptionKeyFromFile() = MS_FAILURE\n"); printf("Aborting tests!\n"); msWriteError(stderr); return -1; } else { msHexEncode(encryption_key, string_buf, MS_ENCRYPTION_KEY_SIZE); printf("msReadEncryptionKeyFromFile() returned '%s'\n", string_buf); } /* ** Test Encryption/Decryption */ /* First with an 8 bytes input string (test boundaries) */ msEncryptStringWithKey(encryption_key, "test1234", string_buf); printf("msEncryptStringWithKey('test1234') returned '%s'\n", string_buf); msDecryptStringWithKey(encryption_key, string_buf, string_buf2); printf("msDecryptStringWithKey('%s') returned '%s'\n", string_buf, string_buf2); /* Next with an 1 byte input string */ msEncryptStringWithKey(encryption_key, "t", string_buf); printf("msEncryptStringWithKey('t') returned '%s'\n", string_buf); msDecryptStringWithKey(encryption_key, string_buf, string_buf2); printf("msDecryptStringWithKey('%s') returned '%s'\n", string_buf, string_buf2); /* Next with an 12 bytes input string */ msEncryptStringWithKey(encryption_key, "test123456", string_buf); printf("msEncryptStringWithKey('test123456') returned '%s'\n", string_buf); msDecryptStringWithKey(encryption_key, string_buf, string_buf2); printf("msDecryptStringWithKey('%s') returned '%s'\n", string_buf, string_buf2); /* ** Test decryption with tokens */ { char *pszBuf; mapObj *map; /* map = msNewMapObj(); */ map = msLoadMap("/tmp/test.map", NULL); sprintf(string_buf2, "string with a {%s} encrypted token", string_buf); pszBuf = msDecryptStringTokens(map, string_buf2); if (pszBuf == NULL) { printf("msDecryptStringTokens() failed.\n"); printf("Aborting tests!\n"); msWriteError(stderr); return -1; } else { printf("msDecryptStringTokens('%s') returned '%s'\n", string_buf2, pszBuf); } msFree(pszBuf); msFreeMap(map); } return 0; } #endif /* TEST_MAPCRYPTO */ mapserver-8.6.0/src/mapdebug.c000066400000000000000000000234331511405061000162460ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of debug/logging, msDebug() and related functions. * Author: Daniel Morissette * ****************************************************************************** * Copyright (c) 1996-2007 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "maperror.h" #include "mapthread.h" #include "maptime.h" #include "cpl_conv.h" #include #ifndef _WIN32 #include #include #endif #include #ifdef NEED_NONBLOCKING_STDERR #include #endif #ifdef _WIN32 #include /* OutputDebugStringA() */ #endif #ifndef USE_THREAD debugInfoObj *msGetDebugInfoObj() { static debugInfoObj debuginfo = { MS_DEBUGLEVEL_ERRORSONLY, MS_DEBUGMODE_OFF, NULL, NULL, 0, NULL}; return &debuginfo; } #else static debugInfoObj *debuginfo_list = NULL; debugInfoObj *msGetDebugInfoObj() { debugInfoObj *link; void *thread_id; debugInfoObj *ret_obj; msAcquireLock(TLOCK_DEBUGOBJ); thread_id = msGetThreadId(); /* find link for this thread */ for (link = debuginfo_list; link != NULL && link->thread_id != thread_id && link->next != NULL && link->next->thread_id != thread_id; link = link->next) { } /* If the target thread link is already at the head of the list were ok */ if (debuginfo_list != NULL && debuginfo_list->thread_id == thread_id) { } /* We don't have one ... initialize one. */ else if (link == NULL || link->next == NULL) { debugInfoObj *new_link; new_link = (debugInfoObj *)msSmallMalloc(sizeof(debugInfoObj)); new_link->next = debuginfo_list; new_link->thread_id = thread_id; new_link->global_debug_level = MS_DEBUGLEVEL_ERRORSONLY; new_link->debug_mode = MS_DEBUGMODE_OFF; new_link->errorfile = NULL; new_link->fp = NULL; debuginfo_list = new_link; } /* If the link is not already at the head of the list, promote it */ else { debugInfoObj *target = link->next; link->next = link->next->next; target->next = debuginfo_list; debuginfo_list = target; } ret_obj = debuginfo_list; msReleaseLock(TLOCK_DEBUGOBJ); return ret_obj; } #endif /* msSetErrorFile() ** ** Set output target, ready to write to it, open file if necessary ** ** If pszRelToPath != NULL then we will try to make the value relative to ** this path if it is not absolute already and it's not one of the special ** values (stderr, stdout, windowsdebug) ** ** Returns MS_SUCCESS/MS_FAILURE */ int msSetErrorFile(const char *pszErrorFile, const char *pszRelToPath) { char extended_path[MS_MAXPATHLEN]; debugInfoObj *debuginfo = msGetDebugInfoObj(); if (strcmp(pszErrorFile, "stderr") != 0 && strcmp(pszErrorFile, "stdout") != 0 && strcmp(pszErrorFile, "windowsdebug") != 0) { /* Try to make the path relative */ if (msBuildPath(extended_path, pszRelToPath, pszErrorFile) == NULL) return MS_FAILURE; pszErrorFile = extended_path; } if (debuginfo->errorfile && pszErrorFile && strcmp(debuginfo->errorfile, pszErrorFile) == 0) { /* Nothing to do, already writing to the right place */ return MS_SUCCESS; } /* Close current output file if any */ msCloseErrorFile(); /* NULL or empty target will just close current output and return */ if (pszErrorFile == NULL || *pszErrorFile == '\0') return MS_SUCCESS; if (strcmp(pszErrorFile, "stderr") == 0) { debuginfo->fp = stderr; debuginfo->errorfile = msStrdup(pszErrorFile); debuginfo->debug_mode = MS_DEBUGMODE_STDERR; } else if (strcmp(pszErrorFile, "stdout") == 0) { debuginfo->fp = stdout; debuginfo->errorfile = msStrdup(pszErrorFile); debuginfo->debug_mode = MS_DEBUGMODE_STDOUT; } else if (strcmp(pszErrorFile, "windowsdebug") == 0) { #ifdef _WIN32 debuginfo->errorfile = msStrdup(pszErrorFile); debuginfo->fp = NULL; debuginfo->debug_mode = MS_DEBUGMODE_WINDOWSDEBUG; #else msSetError( MS_MISCERR, "'MS_ERRORFILE windowsdebug' is available only on Windows platforms.", "msSetErrorFile()"); return MS_FAILURE; #endif } else { debuginfo->fp = fopen(pszErrorFile, "a"); if (debuginfo->fp == NULL) { msSetError(MS_MISCERR, "Failed to open MS_ERRORFILE %s", "msSetErrorFile()", pszErrorFile); return MS_FAILURE; } debuginfo->errorfile = msStrdup(pszErrorFile); debuginfo->debug_mode = MS_DEBUGMODE_FILE; } return MS_SUCCESS; } /* msCloseErrorFile() ** ** Close current output file (if one is open) and reset related members */ void msCloseErrorFile() { debugInfoObj *debuginfo = msGetDebugInfoObj(); if (debuginfo && debuginfo->debug_mode != MS_DEBUGMODE_OFF) { if (debuginfo->fp && debuginfo->debug_mode == MS_DEBUGMODE_FILE) fclose(debuginfo->fp); if (debuginfo->fp && (debuginfo->debug_mode == MS_DEBUGMODE_STDERR || debuginfo->debug_mode == MS_DEBUGMODE_STDOUT)) fflush(debuginfo->fp); /* just flush stderr or stdout */ debuginfo->fp = NULL; msFree(debuginfo->errorfile); debuginfo->errorfile = NULL; debuginfo->debug_mode = MS_DEBUGMODE_OFF; } } /* msGetErrorFile() ** ** Returns name of current error file ** ** Returns NULL if not set. */ const char *msGetErrorFile() { debugInfoObj *debuginfo = msGetDebugInfoObj(); if (debuginfo) return debuginfo->errorfile; return NULL; } /* Set/Get the current global debug level value, used as default value for ** new map and layer objects and to control msDebug() calls outside of ** the context of mapObj or layerObj. ** */ void msSetGlobalDebugLevel(int level) { debugInfoObj *debuginfo = msGetDebugInfoObj(); if (debuginfo) debuginfo->global_debug_level = (debugLevel)level; } debugLevel msGetGlobalDebugLevel() { debugInfoObj *debuginfo = msGetDebugInfoObj(); if (debuginfo) return debuginfo->global_debug_level; return MS_DEBUGLEVEL_ERRORSONLY; } /* msDebugInitFromEnv() ** ** Init debug state from MS_ERRORFILE and MS_DEBUGLEVEL env vars if set ** ** Returns MS_SUCCESS/MS_FAILURE */ int msDebugInitFromEnv() { const char *val; if ((val = CPLGetConfigOption("MS_ERRORFILE", NULL)) != NULL) { if (msSetErrorFile(val, NULL) != MS_SUCCESS) return MS_FAILURE; } if ((val = CPLGetConfigOption("MS_DEBUGLEVEL", NULL)) != NULL) msSetGlobalDebugLevel(atoi(val)); return MS_SUCCESS; } /* msDebugCleanup() ** ** Called by msCleanup to remove info related to this thread. */ void msDebugCleanup() { /* make sure file is closed */ msCloseErrorFile(); #ifdef USE_THREAD { void *thread_id = msGetThreadId(); debugInfoObj *link; msAcquireLock(TLOCK_DEBUGOBJ); /* find link for this thread */ for (link = debuginfo_list; link != NULL && link->thread_id != thread_id && link->next != NULL && link->next->thread_id != thread_id; link = link->next) { } if (link->thread_id == thread_id) { /* presumably link is at head of list. */ if (debuginfo_list == link) debuginfo_list = link->next; free(link); } else if (link->next != NULL && link->next->thread_id == thread_id) { debugInfoObj *next_link = link->next; link->next = link->next->next; free(next_link); } msReleaseLock(TLOCK_DEBUGOBJ); } #endif } /* msDebug() ** ** Outputs/logs messages to the MS_ERRORFILE if one is set ** (see msSetErrorFile()) ** */ void msDebug(const char *pszFormat, ...) { va_list args; debugInfoObj *debuginfo = msGetDebugInfoObj(); char szMessage[MESSAGELENGTH]; if (debuginfo == NULL || debuginfo->debug_mode == MS_DEBUGMODE_OFF) return; /* Don't waste time here! */ va_start(args, pszFormat); vsnprintf(szMessage, MESSAGELENGTH, pszFormat, args); va_end(args); szMessage[MESSAGELENGTH - 1] = '\0'; msRedactCredentials(szMessage); if (debuginfo->fp) { /* Writing to a stdio file handle */ #if defined(USE_FASTCGI) /* It seems the FastCGI stuff inserts a timestamp anyways, so */ /* we might as well skip this one if writing to stderr w/ FastCGI. */ if (debuginfo->debug_mode != MS_DEBUGMODE_STDERR) #endif { struct mstimeval tv; time_t t; msGettimeofday(&tv, NULL); t = tv.tv_sec; msIO_fprintf(debuginfo->fp, "[%s].%ld ", msStringChop(ctime(&t)), (long)tv.tv_usec); } msIO_fprintf(debuginfo->fp, "%s", szMessage); } #ifdef _WIN32 else if (debuginfo->debug_mode == MS_DEBUGMODE_WINDOWSDEBUG) { /* Writing to Windows Debug Console */ OutputDebugStringA(szMessage); } #endif } /* msDebug2() ** ** Variadic function with no operation ** */ void msDebug2(int level, ...) { (void)level; } mapserver-8.6.0/src/mapdraw.c000066400000000000000000005075261511405061000161270ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: High level msDrawMap() implementation and related functions. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include #include #include "mapserver.h" #include "maptime.h" #include "mapcopy.h" #include "mapfile.h" #include "mapows.h" #include "cpl_port.h" /* msGetGeoCellSize * * A helper function to get the first parameter for msUpdateClassScaleFactor() */ double msGetGeoCellSize(const mapObj *map) { double geo_cellsize; /* We will need a cellsize that represents a real georeferenced */ /* coordinate cellsize here, so compute it from saved extents. */ geo_cellsize = map->cellsize; if (map->gt.need_geotransform == MS_TRUE) { double cellsize_x = (map->saved_extent.maxx - map->saved_extent.minx) / map->width; double cellsize_y = (map->saved_extent.maxy - map->saved_extent.miny) / map->height; geo_cellsize = sqrt(cellsize_x * cellsize_x + cellsize_y * cellsize_y) / sqrt(2.0); } return geo_cellsize; } /* msUpdateClassScaleFactor * * Provides correct scale factor inheritance for Class and all of its * styles and labels. */ void msUpdateClassScaleFactor(double geo_cellsize, const mapObj *map, const layerObj *layer, classObj *c) { if (c->sizeunits == MS_INHERIT) c->scalefactor = layer->scalefactor; else if (c->sizeunits != MS_PIXELS) c->scalefactor = (msInchesPerUnit(c->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / geo_cellsize; else if (layer->symbolscaledenom > 0 && map->scaledenom > 0) c->scalefactor = layer->symbolscaledenom / map->scaledenom * map->resolution / map->defresolution; else c->scalefactor = map->resolution / map->defresolution; for (int sid = 0; sid < c->numstyles; sid++) { styleObj *style = c->styles[sid]; if (style->sizeunits == MS_INHERIT) style->scalefactor = c->scalefactor; else if (style->sizeunits != MS_PIXELS) style->scalefactor = (msInchesPerUnit(style->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / geo_cellsize; else if (layer->symbolscaledenom > 0 && map->scaledenom > 0) style->scalefactor = layer->symbolscaledenom / map->scaledenom * map->resolution / map->defresolution; else style->scalefactor = map->resolution / map->defresolution; } for (int sid = 0; sid < c->numlabels; sid++) { labelObj *label = c->labels[sid]; if (label->sizeunits == MS_INHERIT) label->scalefactor = c->scalefactor; else if (label->sizeunits != MS_PIXELS) label->scalefactor = (msInchesPerUnit(label->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / geo_cellsize; else if (layer->symbolscaledenom > 0 && map->scaledenom > 0) label->scalefactor = layer->symbolscaledenom / map->scaledenom * map->resolution / map->defresolution; else label->scalefactor = map->resolution / map->defresolution; for (int lsid = 0; lsid < label->numstyles; lsid++) { styleObj *lstyle = label->styles[lsid]; if (lstyle->sizeunits == MS_INHERIT) lstyle->scalefactor = label->scalefactor; else if (lstyle->sizeunits != MS_PIXELS) lstyle->scalefactor = (msInchesPerUnit(lstyle->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / geo_cellsize; else if (layer->symbolscaledenom > 0 && map->scaledenom > 0) lstyle->scalefactor = layer->symbolscaledenom / map->scaledenom * map->resolution / map->defresolution; else lstyle->scalefactor = map->resolution / map->defresolution; } } } /* msPrepareImage() * * Returns a new imageObj ready for rendering the current map. * * If allow_nonsquare is set to MS_TRUE then the caller should call * msMapRestoreRealExtent() once they are done with the image. * This should be set to MS_TRUE only when called from msDrawMap(), see bug 945. */ imageObj *msPrepareImage(mapObj *map, int allow_nonsquare) { int i, status; imageObj *image = NULL; double geo_cellsize; if (map->width == -1 || map->height == -1) { msSetError(MS_MISCERR, "Image dimensions not specified.", "msPrepareImage()"); return (NULL); } msFreeLabelCache(&(map->labelcache)); msInitLabelCache( &(map->labelcache)); /* this clears any previously allocated cache */ /* clear any previously created mask layer images */ for (i = 0; i < map->numlayers; i++) { if (GET_LAYER(map, i)->maskimage) { msFreeImage(GET_LAYER(map, i)->maskimage); GET_LAYER(map, i)->maskimage = NULL; } } status = msValidateContexts(map); /* make sure there are no recursive REQUIRES or LABELREQUIRES expressions */ if (status != MS_SUCCESS) return NULL; if (!map->outputformat) { msSetError(MS_IMGERR, "Map outputformat not set!", "msPrepareImage()"); return (NULL); } else if (MS_RENDERER_PLUGIN(map->outputformat)) { rendererVTableObj *renderer = map->outputformat->vtable; colorObj *bg = &map->imagecolor; map->imagecolor.alpha = 255; image = renderer->createImage(map->width, map->height, map->outputformat, bg); if (image == NULL) return (NULL); image->format = map->outputformat; image->format->refcount++; image->width = map->width; image->height = map->height; image->resolution = map->resolution; image->resolutionfactor = map->resolution / map->defresolution; if (map->web.imagepath) image->imagepath = msStrdup(map->web.imagepath); if (map->web.imageurl) image->imageurl = msStrdup(map->web.imageurl); } else if (MS_RENDERER_IMAGEMAP(map->outputformat)) { image = msImageCreateIM(map->width, map->height, map->outputformat, map->web.imagepath, map->web.imageurl, map->resolution, map->defresolution); } else if (MS_RENDERER_RAWDATA(map->outputformat)) { image = msImageCreate(map->width, map->height, map->outputformat, map->web.imagepath, map->web.imageurl, map->resolution, map->defresolution, &map->imagecolor); } else { image = NULL; } if (!image) { msSetError(MS_IMGERR, "Unable to initialize image.", "msPrepareImage()"); return (NULL); } image->map = map; /* * If we want to support nonsquare pixels, note that now, otherwise * adjust the extent size to have square pixels. * * If allow_nonsquare is set to MS_TRUE then the caller should call * msMapRestoreRealExtent() once they are done with the image. * This should be set to MS_TRUE only when called from msDrawMap(), see bug * 945. */ if (allow_nonsquare && msTestConfigOption(map, "MS_NONSQUARE", MS_FALSE)) { double cellsize_x = (map->extent.maxx - map->extent.minx) / map->width; double cellsize_y = (map->extent.maxy - map->extent.miny) / map->height; if (cellsize_y != 0.0 && (fabs(cellsize_x / cellsize_y) > 1.00001 || fabs(cellsize_x / cellsize_y) < 0.99999)) { map->gt.need_geotransform = MS_TRUE; if (map->debug) msDebug( "msDrawMap(): kicking into non-square pixel preserving mode.\n"); } map->cellsize = (cellsize_x * 0.5 + cellsize_y * 0.5); } else map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); status = msCalculateScale(map->extent, map->units, map->width, map->height, map->resolution, &map->scaledenom); if (status != MS_SUCCESS) { msFreeImage(image); return (NULL); } /* update geotransform based on adjusted extent. */ msMapComputeGeotransform(map); /* Do we need to fake out stuff for rotated support? */ if (map->gt.need_geotransform) msMapSetFakedExtent(map); geo_cellsize = msGetGeoCellSize(map); /* compute layer/class/style/label scale factors now */ for (int lid = 0; lid < map->numlayers; lid++) { layerObj *layer = GET_LAYER(map, lid); if (layer->sizeunits != MS_PIXELS) layer->scalefactor = (msInchesPerUnit(layer->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / geo_cellsize; else if (layer->symbolscaledenom > 0 && map->scaledenom > 0) layer->scalefactor = layer->symbolscaledenom / map->scaledenom * map->resolution / map->defresolution; else layer->scalefactor = map->resolution / map->defresolution; for (int cid = 0; cid < layer->numclasses; cid++) { classObj *class = GET_CLASS(map, lid, cid); msUpdateClassScaleFactor(geo_cellsize, map, layer, class); } } image->refpt.x = MS_MAP2IMAGE_X_IC_DBL(0, map->extent.minx, 1.0 / map->cellsize); image->refpt.y = MS_MAP2IMAGE_Y_IC_DBL(0, map->extent.maxy, 1.0 / map->cellsize); return image; } static int msCompositeRasterBuffer(mapObj *map, imageObj *img, rasterBufferObj *rb, LayerCompositer *comp) { int ret = MS_SUCCESS; if (MS_IMAGE_RENDERER(img)->compositeRasterBuffer) { while (comp && ret == MS_SUCCESS) { rasterBufferObj *rb_ptr = rb; CompositingFilter *filter = comp->filter; if (filter && comp->next) { /* if we have another compositor to apply, then we need to copy the * rasterBufferObj. Otherwise we can work on it directly */ rb_ptr = (rasterBufferObj *)msSmallCalloc(sizeof(rasterBufferObj), 1); msCopyRasterBuffer(rb_ptr, rb); } while (filter && ret == MS_SUCCESS) { ret = msApplyCompositingFilter(map, rb_ptr, filter); filter = filter->next; } if (ret == MS_SUCCESS) ret = MS_IMAGE_RENDERER(img)->compositeRasterBuffer( img, rb_ptr, comp->comp_op, comp->opacity); if (rb_ptr != rb) { msFreeRasterBuffer(rb_ptr); msFree(rb_ptr); } comp = comp->next; } } else { ret = MS_FAILURE; } return ret; } /* * Generic function to render the map file. * The type of the image created is based on the imagetype parameter in the map * file. * * mapObj *map - map object loaded in MapScript or via a mapfile to use * int querymap - is this map the result of a query operation, MS_TRUE|MS_FALSE */ imageObj *msDrawMap(mapObj *map, int querymap) { int i; layerObj *lp = NULL; int status = MS_FAILURE; imageObj *image = NULL; struct mstimeval mapstarttime = {0}, mapendtime = {0}; struct mstimeval starttime = {0}, endtime = {0}; #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) enum MS_CONNECTION_TYPE lastconnectiontype; httpRequestObj *pasOWSReqInfo = NULL; int numOWSLayers = 0; int numOWSRequests = 0; wmsParamsObj sLastWMSParams; #endif if (map->debug >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&mapstarttime, NULL); if (querymap) { /* use queryMapObj image dimensions */ if (map->querymap.width > 0 && map->querymap.width <= map->maxsize) map->width = map->querymap.width; if (map->querymap.height > 0 && map->querymap.height <= map->maxsize) map->height = map->querymap.height; } msApplyMapConfigOptions(map); image = msPrepareImage(map, MS_TRUE); if (!image) { msSetError(MS_IMGERR, "Unable to initialize image.", "msDrawMap()"); return (NULL); } if (map->debug >= MS_DEBUGLEVEL_DEBUG) msDebug("msDrawMap(): rendering using outputformat named %s (%s).\n", map->outputformat->name, map->outputformat->driver); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) /* Time the OWS query phase */ if (map->debug >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&starttime, NULL); /* How many OWS (WMS/WFS) layers do we have to draw? * Note: numOWSLayers is the number of actual layers and numOWSRequests is * the number of HTTP requests which could be lower if multiple layers * are merged into the same request. */ numOWSLayers = 0; for (i = 0; i < map->numlayers; i++) { if (map->layerorder[i] == -1) continue; lp = GET_LAYER(map, map->layerorder[i]); if (lp->connectiontype != MS_WMS && lp->connectiontype != MS_WFS) { continue; } numOWSLayers++; } if (numOWSLayers > 0) { /* Alloc and init pasOWSReqInfo... */ pasOWSReqInfo = (httpRequestObj *)malloc(numOWSLayers * sizeof(httpRequestObj)); if (pasOWSReqInfo == NULL) { msSetError(MS_MEMERR, "Allocation of httpRequestObj failed.", "msDrawMap()"); return NULL; } msHTTPInitRequestObj(pasOWSReqInfo, numOWSLayers); msInitWmsParamsObj(&sLastWMSParams); /* Pre-download all WMS/WFS layers in parallel before starting to draw map */ lastconnectiontype = MS_SHAPEFILE; for (i = 0; i < map->numlayers; i++) { if (map->layerorder[i] == -1) continue; lp = GET_LAYER(map, map->layerorder[i]); if (lp->connectiontype != MS_WMS && lp->connectiontype != MS_WFS) { continue; } if (!msLayerIsVisible(map, lp)) continue; #ifdef USE_WMS_LYR if (lp->connectiontype == MS_WMS) { if (msPrepareWMSLayerRequest(map->layerorder[i], map, lp, 1, lastconnectiontype, &sLastWMSParams, 0, 0, 0, NULL, pasOWSReqInfo, &numOWSRequests) == MS_FAILURE) { msFreeWmsParamsObj(&sLastWMSParams); msFreeImage(image); msFree(pasOWSReqInfo); return NULL; } } #endif #ifdef USE_WFS_LYR if (lp->connectiontype == MS_WFS) { if (msPrepareWFSLayerRequest(map->layerorder[i], map, lp, pasOWSReqInfo, &numOWSRequests) == MS_FAILURE) { msFreeWmsParamsObj(&sLastWMSParams); msFreeImage(image); msFree(pasOWSReqInfo); return NULL; } } #endif lastconnectiontype = lp->connectiontype; } msFreeWmsParamsObj(&sLastWMSParams); } /* if numOWSLayers > 0 */ if (numOWSRequests && msOWSExecuteRequests(pasOWSReqInfo, numOWSRequests, map, MS_TRUE) == MS_FAILURE) { msFreeImage(image); msFree(pasOWSReqInfo); return NULL; } if (map->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&endtime, NULL); msDebug("msDrawMap(): WMS/WFS set-up and query, %.3fs\n", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } #endif /* USE_WMS_LYR || USE_WFS_LYR */ /* OK, now we can start drawing */ for (i = 0; i < map->numlayers; i++) { if (map->layerorder[i] != -1) { const char *force_draw_label_cache = NULL; lp = (GET_LAYER(map, map->layerorder[i])); if (lp->postlabelcache) /* wait to draw */ continue; if (map->debug >= MS_DEBUGLEVEL_TUNING || lp->debug >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&starttime, NULL); if (!msLayerIsVisible(map, lp)) continue; if (lp->connectiontype == MS_WMS) { #ifdef USE_WMS_LYR if (MS_RENDERER_PLUGIN(image->format) || MS_RENDERER_RAWDATA(image->format)) { assert(pasOWSReqInfo); status = msDrawWMSLayerLow(map->layerorder[i], pasOWSReqInfo, numOWSRequests, map, lp, image); } else { msSetError(MS_WMSCONNERR, "Output format '%s' doesn't support WMS layers.", "msDrawMap()", image->format->name); status = MS_FAILURE; } if (status == MS_FAILURE) { msSetError(MS_WMSCONNERR, "Failed to draw WMS layer named '%s'. This most likely " "happened because " "the remote WMS server returned an invalid image, and XML " "exception " "or another unexpected result in response to the GetMap " "request. Also check " "and make sure that the layer's connection URL is valid.", "msDrawMap()", lp->name); msFreeImage(image); msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); return (NULL); } #else /* ndef USE_WMS_LYR */ msSetError(MS_WMSCONNERR, "MapServer not built with WMS Client support, unable to " "render layer '%s'.", "msDrawMap()", lp->name); msFreeImage(image); return (NULL); #endif } else { /* Default case: anything but WMS layers */ if (querymap) status = msDrawQueryLayer(map, lp, image); else status = msDrawLayer(map, lp, image); if (status == MS_FAILURE) { msSetError(MS_IMGERR, "Failed to draw layer named '%s'.", "msDrawMap()", lp->name); msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif /* USE_WMS_LYR || USE_WFS_LYR */ return (NULL); } } if (map->debug >= MS_DEBUGLEVEL_TUNING || lp->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&endtime, NULL); msDebug("msDrawMap(): Layer %d (%s), %.3fs\n", map->layerorder[i], lp->name ? lp->name : "(null)", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } /* Flush layer cache in-between layers if requested by PROCESSING * directive*/ force_draw_label_cache = msLayerGetProcessingKey(lp, "FORCE_DRAW_LABEL_CACHE"); if (force_draw_label_cache && strncasecmp(force_draw_label_cache, "FLUSH", 5) == 0) { if (map->debug >= MS_DEBUGLEVEL_V) msDebug( "msDrawMap(): PROCESSING FORCE_DRAW_LABEL_CACHE=FLUSH found.\n"); if (msDrawLabelCache(map, image) != MS_SUCCESS) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif /* USE_WMS_LYR || USE_WFS_LYR */ return (NULL); } msFreeLabelCache(&(map->labelcache)); msInitLabelCache(&(map->labelcache)); } /* PROCESSING FORCE_DRAW_LABEL_CACHE */ } } if (map->scalebar.status == MS_EMBED && !map->scalebar.postlabelcache) { /* We need to temporarily restore the original extent for drawing */ /* the scalebar as it uses the extent to recompute cellsize. */ if (map->gt.need_geotransform) msMapRestoreRealExtent(map); if (MS_SUCCESS != msEmbedScalebar(map, image)) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) /* Cleanup WMS/WFS Request stuff */ if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif return NULL; } if (map->gt.need_geotransform) msMapSetFakedExtent(map); } if (map->legend.status == MS_EMBED && !map->legend.postlabelcache) { if (msEmbedLegend(map, image) != MS_SUCCESS) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) /* Cleanup WMS/WFS Request stuff */ if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif return NULL; } } if (msDrawLabelCache(map, image) != MS_SUCCESS) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif /* USE_WMS_LYR || USE_WFS_LYR */ return (NULL); } for (i = 0; i < map->numlayers; i++) { /* for each layer, check for postlabelcache layers */ lp = (GET_LAYER(map, map->layerorder[i])); if (!lp->postlabelcache) continue; if (!msLayerIsVisible(map, lp)) continue; if (map->debug >= MS_DEBUGLEVEL_TUNING || lp->debug >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&starttime, NULL); if (lp->connectiontype == MS_WMS) { #ifdef USE_WMS_LYR if (MS_RENDERER_PLUGIN(image->format) || MS_RENDERER_RAWDATA(image->format)) { assert(pasOWSReqInfo); status = msDrawWMSLayerLow(map->layerorder[i], pasOWSReqInfo, numOWSRequests, map, lp, image); } #else status = MS_FAILURE; #endif } else { if (querymap) status = msDrawQueryLayer(map, lp, image); else status = msDrawLayer(map, lp, image); } if (status == MS_FAILURE) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif /* USE_WMS_LYR || USE_WFS_LYR */ return (NULL); } if (map->debug >= MS_DEBUGLEVEL_TUNING || lp->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&endtime, NULL); msDebug("msDrawMap(): Layer %d (%s), %.3fs\n", map->layerorder[i], lp->name ? lp->name : "(null)", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } } /* Do we need to fake out stuff for rotated support? */ /* This really needs to be done on every preceding exit point too... */ if (map->gt.need_geotransform) msMapRestoreRealExtent(map); if (map->legend.status == MS_EMBED && map->legend.postlabelcache) if (MS_UNLIKELY(MS_FAILURE == msEmbedLegend(map, image))) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) /* Cleanup WMS/WFS Request stuff */ if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif return NULL; } if (map->scalebar.status == MS_EMBED && map->scalebar.postlabelcache) { /* We need to temporarily restore the original extent for drawing */ /* the scalebar as it uses the extent to recompute cellsize. */ if (map->gt.need_geotransform) msMapRestoreRealExtent(map); if (MS_SUCCESS != msEmbedScalebar(map, image)) { msFreeImage(image); #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) /* Cleanup WMS/WFS Request stuff */ if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif return NULL; } if (map->gt.need_geotransform) msMapSetFakedExtent(map); } #if defined(USE_WMS_LYR) || defined(USE_WFS_LYR) /* Cleanup WMS/WFS Request stuff */ if (pasOWSReqInfo) { msHTTPFreeRequestObj(pasOWSReqInfo, numOWSRequests); msFree(pasOWSReqInfo); } #endif if (map->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&mapendtime, NULL); msDebug("msDrawMap() total time: %.3fs\n", (mapendtime.tv_sec + mapendtime.tv_usec / 1.0e6) - (mapstarttime.tv_sec + mapstarttime.tv_usec / 1.0e6)); } return (image); } /* * Test whether a layer should be drawn or not in the current map view and * at the current scale. * Returns TRUE if layer is visible, FALSE if not. */ int msLayerIsVisible(mapObj *map, layerObj *layer) { int i; if (!layer->data && !layer->tileindex && !layer->connection && !layer->features && !layer->grid) return (MS_FALSE); /* no data associated with this layer, not an error since layer may be used as a template from MapScript */ if (layer->type == MS_LAYER_QUERY || layer->type == MS_LAYER_TILEINDEX) return (MS_FALSE); if ((layer->status != MS_ON) && (layer->status != MS_DEFAULT)) return (MS_FALSE); /* Do comparisons of layer scale vs map scale now, since msExtentsOverlap() */ /* can be slow */ if (map->scaledenom > 0) { /* layer scale boundaries should be checked first */ if ((layer->maxscaledenom > 0) && (map->scaledenom > layer->maxscaledenom)) { if (layer->debug >= MS_DEBUGLEVEL_V) { msDebug("msLayerIsVisible(): Skipping layer (%s) because " "LAYER.MAXSCALE is too small for this MAP scale\n", layer->name); } return (MS_FALSE); } if (/*(layer->minscaledenom > 0) &&*/ (map->scaledenom <= layer->minscaledenom)) { if (layer->debug >= MS_DEBUGLEVEL_V) { msDebug("msLayerIsVisible(): Skipping layer (%s) because " "LAYER.MINSCALE is too large for this MAP scale\n", layer->name); } return (MS_FALSE); } } /* Only return MS_FALSE if it is definitely false. Sometimes it will return *MS_UNKNOWN, which we ** consider true, for this use case (it might be visible, try and draw it, *see what happens). */ if (msExtentsOverlap(map, layer) == MS_FALSE) { if (layer->debug >= MS_DEBUGLEVEL_V) { msDebug("msLayerIsVisible(): Skipping layer (%s) because LAYER.EXTENT " "does not intersect MAP.EXTENT\n", layer->name); } return (MS_FALSE); } if (msEvalContext(map, layer, layer->requires) == MS_FALSE) return (MS_FALSE); if (map->scaledenom > 0) { /* now check class scale boundaries (all layers *must* pass these tests) */ if (layer->numclasses > 0) { for (i = 0; i < layer->numclasses; i++) { if ((layer->class[i] -> maxscaledenom > 0) && (map->scaledenom > layer->class[i] -> maxscaledenom)) continue; /* can skip this one, next class */ if ((layer->class[i] -> minscaledenom > 0) && (map->scaledenom <= layer->class[i] -> minscaledenom)) continue; /* can skip this one, next class */ break; /* can't skip this class (or layer for that matter) */ } if (i == layer->numclasses) { if (layer->debug >= MS_DEBUGLEVEL_V) { msDebug("msLayerIsVisible(): Skipping layer (%s) because no CLASS in " "the layer is in-scale for this MAP scale\n", layer->name); } return (MS_FALSE); } } } if (layer->maxscaledenom <= 0 && layer->minscaledenom <= 0) { if ((layer->maxgeowidth > 0) && ((map->extent.maxx - map->extent.minx) > layer->maxgeowidth)) { if (layer->debug >= MS_DEBUGLEVEL_V) { msDebug("msLayerIsVisible(): Skipping layer (%s) because LAYER width " "is much smaller than map width\n", layer->name); } return (MS_FALSE); } if ((layer->mingeowidth > 0) && ((map->extent.maxx - map->extent.minx) < layer->mingeowidth)) { if (layer->debug >= MS_DEBUGLEVEL_V) { msDebug("msLayerIsVisible(): Skipping layer (%s) because LAYER width " "is much larger than map width\n", layer->name); } return (MS_FALSE); } } return MS_TRUE; /* All tests passed. Layer is visible. */ } #define LAYER_NEEDS_COMPOSITING(layer) \ (((layer)->compositer != NULL) && \ ((layer)->compositer->next || (layer)->compositor->opacity < 100 || \ (layer)->compositor->compop != MS_COMPOP_SRC_OVER || \ (layer)->compositer->filter)) /* * Generic function to render a layer object. */ int msDrawLayer(mapObj *map, layerObj *layer, imageObj *image) { imageObj *image_draw = image; outputFormatObj *altFormat = NULL; int retcode = MS_SUCCESS; const char *alternativeFormatString = NULL; layerObj *maskLayer = NULL; if (!msLayerIsVisible(map, layer)) return MS_SUCCESS; if (layer->compositer && !layer->compositer->next && layer->compositer->opacity == 0) return MS_SUCCESS; /* layer is completely transparent, skip it */ /* conditions may have changed since this layer last drawn, so retest layer->project (Bug #673) */ layer->project = msProjectionsDiffer(&(layer->projection), &(map->projection)); /* make sure labelcache setting is set correctly if postlabelcache is set. This is done by the parser but may have been altered by a mapscript. see #5142 */ if (layer->postlabelcache) { layer->labelcache = MS_FALSE; } if (layer->mask) { int maskLayerIdx; /* render the mask layer in its own imageObj */ if (!MS_IMAGE_RENDERER(image)->supports_pixel_buffer) { msSetError(MS_MISCERR, "Layer (%s) references references a mask layer, but the " "selected renderer does not support them", "msDrawLayer()", layer->name); return (MS_FAILURE); } maskLayerIdx = msGetLayerIndex(map, layer->mask); if (maskLayerIdx == -1) { msSetError(MS_MISCERR, "Layer (%s) references unknown mask layer (%s)", "msDrawLayer()", layer->name, layer->mask); return (MS_FAILURE); } maskLayer = GET_LAYER(map, maskLayerIdx); if (!maskLayer->maskimage) { int i; int origstatus, origlabelcache; altFormat = msSelectOutputFormat(map, "png24"); msInitializeRendererVTable(altFormat); /* TODO: check the png24 format hasn't been tampered with, i.e. it's agg */ maskLayer->maskimage = msImageCreate( image->width, image->height, altFormat, image->imagepath, image->imageurl, map->resolution, map->defresolution, NULL); if (!maskLayer->maskimage) { msSetError(MS_MISCERR, "Unable to initialize mask image.", "msDrawLayer()"); return (MS_FAILURE); } /* * force the masked layer to status on, and turn off the labelcache so * that eventual labels are added to the temporary image instead of being * added to the labelcache */ origstatus = maskLayer->status; origlabelcache = maskLayer->labelcache; maskLayer->status = MS_ON; maskLayer->labelcache = MS_OFF; /* draw the mask layer in the temporary image */ retcode = msDrawLayer(map, maskLayer, maskLayer->maskimage); maskLayer->status = origstatus; maskLayer->labelcache = origlabelcache; if (retcode != MS_SUCCESS) { return MS_FAILURE; } /* * hack to work around bug #3834: if we have use an alternate renderer, * the symbolset may contain symbols that reference it. We want to remove * those references before the altFormat is destroyed to avoid a segfault * and/or a leak, and so the the main renderer doesn't pick the cache up * thinking it's for him. */ for (i = 0; i < map->symbolset.numsymbols; i++) { if (map->symbolset.symbol[i] != NULL) { symbolObj *s = map->symbolset.symbol[i]; if (s->renderer == MS_IMAGE_RENDERER(maskLayer->maskimage)) { MS_IMAGE_RENDERER(maskLayer->maskimage)->freeSymbol(s); s->renderer = NULL; } } } /* set the imagetype from the original outputformat back (it was removed * by msSelectOutputFormat() */ msFree(map->imagetype); map->imagetype = msStrdup(image->format->name); } } altFormat = NULL; /* inform the rendering device that layer draw is starting. */ msImageStartLayer(map, layer, image); /*check if an alternative renderer should be used for this layer*/ alternativeFormatString = msLayerGetProcessingKey(layer, "RENDERER"); if (MS_RENDERER_PLUGIN(image_draw->format) && alternativeFormatString != NULL && (altFormat = msSelectOutputFormat(map, alternativeFormatString))) { rendererVTableObj *renderer = NULL; msInitializeRendererVTable(altFormat); image_draw = msImageCreate( image->width, image->height, altFormat, image->imagepath, image->imageurl, map->resolution, map->defresolution, &map->imagecolor); renderer = MS_IMAGE_RENDERER(image_draw); renderer->startLayer(image_draw, map, layer); } else if (MS_RENDERER_PLUGIN(image_draw->format)) { rendererVTableObj *renderer = MS_IMAGE_RENDERER(image_draw); if ((layer->mask && layer->connectiontype != MS_WMS && layer->type != MS_LAYER_RASTER) || layer->compositer) { /* masking occurs at the pixel/layer level for raster images, so we don't need to create a temporary image in these cases */ if (layer->mask || renderer->compositeRasterBuffer) { image_draw = msImageCreate(image->width, image->height, image->format, image->imagepath, image->imageurl, map->resolution, map->defresolution, NULL); if (!image_draw) { msSetError(MS_MISCERR, "Unable to initialize temporary transparent image.", "msDrawLayer()"); return (MS_FAILURE); } image_draw->map = map; renderer->startLayer(image_draw, map, layer); } } } /* ** redirect processing of some layer types. */ if (layer->connectiontype == MS_WMS) { #ifdef USE_WMS_LYR retcode = msDrawWMSLayer(map, layer, image_draw); #else retcode = MS_FAILURE; #endif } else if (layer->type == MS_LAYER_RASTER) { retcode = msDrawRasterLayer(map, layer, image_draw); } else if (layer->type == MS_LAYER_CHART) { retcode = msDrawChartLayer(map, layer, image_draw); } else { /* must be a Vector layer */ retcode = msDrawVectorLayer(map, layer, image_draw); } if (altFormat) { rendererVTableObj *renderer = MS_IMAGE_RENDERER(image); rendererVTableObj *altrenderer = MS_IMAGE_RENDERER(image_draw); rasterBufferObj rb; int i; memset(&rb, 0, sizeof(rasterBufferObj)); altrenderer->endLayer(image_draw, map, layer); retcode = altrenderer->getRasterBufferHandle(image_draw, &rb); if (MS_UNLIKELY(retcode == MS_FAILURE)) { goto altformat_cleanup; } retcode = renderer->mergeRasterBuffer( image, &rb, ((layer->compositer) ? (layer->compositer->opacity * 0.01) : (1.0)), 0, 0, 0, 0, rb.width, rb.height); if (MS_UNLIKELY(retcode == MS_FAILURE)) { goto altformat_cleanup; } altformat_cleanup: /* * hack to work around bug #3834: if we have use an alternate renderer, the * symbolset may contain symbols that reference it. We want to remove those * references before the altFormat is destroyed to avoid a segfault and/or a * leak, and so the main renderer doesn't pick the cache up thinking * it's for him. */ for (i = 0; i < map->symbolset.numsymbols; i++) { if (map->symbolset.symbol[i] != NULL) { symbolObj *s = map->symbolset.symbol[i]; if (s->renderer == altrenderer) { altrenderer->freeSymbol(s); s->renderer = NULL; } } } msFreeImage(image_draw); /* set the imagetype from the original outputformat back (it was removed by * msSelectOutputFormat() */ msFree(map->imagetype); map->imagetype = msStrdup(image->format->name); } else if (image != image_draw) { rendererVTableObj *renderer = MS_IMAGE_RENDERER(image_draw); rasterBufferObj rb; memset(&rb, 0, sizeof(rasterBufferObj)); renderer->endLayer(image_draw, map, layer); retcode = renderer->getRasterBufferHandle(image_draw, &rb); if (MS_UNLIKELY(retcode == MS_FAILURE)) { goto imagedraw_cleanup; } if (maskLayer && maskLayer->maskimage) { rasterBufferObj mask; unsigned int row, col; memset(&mask, 0, sizeof(rasterBufferObj)); retcode = MS_IMAGE_RENDERER(maskLayer->maskimage) ->getRasterBufferHandle(maskLayer->maskimage, &mask); if (MS_UNLIKELY(retcode == MS_FAILURE)) { goto imagedraw_cleanup; } /* modify the pixels of the overlay */ if (rb.type == MS_BUFFER_BYTE_RGBA) { for (row = 0; row < rb.height; row++) { unsigned char *ma, *a, *r, *g, *b; r = rb.data.rgba.r + row * rb.data.rgba.row_step; g = rb.data.rgba.g + row * rb.data.rgba.row_step; b = rb.data.rgba.b + row * rb.data.rgba.row_step; a = rb.data.rgba.a + row * rb.data.rgba.row_step; ma = mask.data.rgba.a + row * mask.data.rgba.row_step; for (col = 0; col < rb.width; col++) { if (*ma == 0) { *a = *r = *g = *b = 0; } a += rb.data.rgba.pixel_step; r += rb.data.rgba.pixel_step; g += rb.data.rgba.pixel_step; b += rb.data.rgba.pixel_step; ma += mask.data.rgba.pixel_step; } } } } if (!layer->compositer) { /*we have a mask layer with no composition configured, do a nomral blend */ retcode = renderer->mergeRasterBuffer(image, &rb, 1.0, 0, 0, 0, 0, rb.width, rb.height); } else { retcode = msCompositeRasterBuffer(map, image, &rb, layer->compositer); } if (MS_UNLIKELY(retcode == MS_FAILURE)) { goto imagedraw_cleanup; } imagedraw_cleanup: msFreeImage(image_draw); } msImageEndLayer(map, layer, image); return (retcode); } int msDrawVectorLayer(mapObj *map, layerObj *layer, imageObj *image) { int status, retcode = MS_SUCCESS; int drawmode = MS_DRAWMODE_FEATURES; char annotate = MS_TRUE; shapeObj shape; shapeObj savedShape; rectObj searchrect; char cache = MS_FALSE; int maxnumstyles = 1; featureListNodeObjPtr shpcache = NULL, current = NULL; int nclasses = 0; int *classgroup = NULL; double minfeaturesize = -1; int maxfeatures = -1; int featuresdrawn = 0; if (image) maxfeatures = msLayerGetMaxFeaturesToDraw(layer, image->format); /* TODO TBT: draw as raster layer in vector renderers */ annotate = msEvalContext(map, layer, layer->labelrequires); if (map->scaledenom > 0) { if ((layer->labelmaxscaledenom != -1) && (map->scaledenom >= layer->labelmaxscaledenom)) annotate = MS_FALSE; if ((layer->labelminscaledenom != -1) && (map->scaledenom < layer->labelminscaledenom)) annotate = MS_FALSE; } /* open this layer */ status = msLayerOpen(layer); if (status != MS_SUCCESS) return MS_FAILURE; /* build item list. STYLEITEM javascript needs the shape attributes */ if (layer->styleitem && (STARTS_WITH_CI(layer->styleitem, "javascript://") || STARTS_WITH_CI(layer->styleitem, "sld://"))) { status = msLayerWhichItems(layer, MS_TRUE, NULL); } else { status = msLayerWhichItems(layer, MS_FALSE, NULL); } if (status != MS_SUCCESS) { msLayerClose(layer); return MS_FAILURE; } /* identify target shapes */ if (layer->transform == MS_TRUE) { searchrect = map->extent; if ((map->projection.numargs > 0) && (layer->projection.numargs > 0)) { int bDone = MS_FALSE; if (layer->connectiontype == MS_UVRASTER) { /* Nasty hack to make msUVRASTERLayerWhichShapes() aware that the */ /* original area of interest is (map->extent, map->projection)... */ /* Useful when dealing with UVRASTER that extend beyond 180 deg */ msUVRASTERLayerUseMapExtentAndProjectionForNextWhichShapes(layer, map); searchrect = msUVRASTERGetSearchRect(layer, map); bDone = MS_TRUE; } else if (layer->connectiontype == MS_RASTER_LABEL) { /* Nasty hack to make msRasterLabelLayerWhichShapes() aware that the */ /* original area of interest is (map->extent, map->projection)... */ /* Useful when dealing with RasterLabel that extend beyond 180 deg */ msRasterLabelLayerUseMapExtentAndProjectionForNextWhichShapes(layer, map); searchrect = msUVRASTERGetSearchRect(layer, map); bDone = MS_TRUE; } if (!bDone) msProjectRect( &map->projection, &layer->projection, &searchrect); /* project the searchrect to source coords */ } } else { searchrect.minx = searchrect.miny = 0; searchrect.maxx = map->width - 1; searchrect.maxy = map->height - 1; } status = msLayerWhichShapes(layer, searchrect, MS_FALSE); if (layer->connectiontype == MS_UVRASTER) { msUVRASTERLayerUseMapExtentAndProjectionForNextWhichShapes(layer, NULL); } else if (layer->connectiontype == MS_RASTER_LABEL) { msRasterLabelLayerUseMapExtentAndProjectionForNextWhichShapes(layer, NULL); } if (status == MS_DONE) { /* no overlap */ msLayerClose(layer); return MS_SUCCESS; } else if (status != MS_SUCCESS) { msLayerClose(layer); return MS_FAILURE; } nclasses = 0; classgroup = NULL; if (layer->classgroup && layer->numclasses > 0) classgroup = msAllocateValidClassGroups(layer, &nclasses); if (layer->minfeaturesize > 0) minfeaturesize = Pix2LayerGeoref(map, layer, layer->minfeaturesize); // Select how to render classes // MS_FIRST_MATCHING_CLASS: Default and historic MapServer behavior // MS_ALL_MATCHING_CLASSES: SLD behavior int ref_rendermode; const char *rendermodestr = msLayerGetProcessingKey(layer, "RENDERMODE"); if (layer->rendermode == MS_ALL_MATCHING_CLASSES) { // SLD takes precedence ref_rendermode = MS_ALL_MATCHING_CLASSES; } else if (!rendermodestr) { // Default Mapfile ref_rendermode = MS_FIRST_MATCHING_CLASS; } else if (!strcmp(rendermodestr, "FIRST_MATCHING_CLASS")) { // Explicit default Mapfile ref_rendermode = MS_FIRST_MATCHING_CLASS; } else if (!strcmp(rendermodestr, "ALL_MATCHING_CLASSES")) { // SLD-like Mapfile ref_rendermode = MS_ALL_MATCHING_CLASSES; } else { msLayerClose(layer); msSetError(MS_MISCERR, "Unknown RENDERMODE: %s, should be one of: " "FIRST_MATCHING_CLASS, ALL_MATCHING_CLASSES.", "msDrawVectorLayer()", rendermodestr); return MS_FAILURE; } /* step through the target shapes and their classes */ msInitShape(&shape); int classindex = -1; int classcount = 0; for (;;) { int rendermode; if (classindex == -1) { msFreeShape(&shape); status = msLayerNextShape(layer, &shape); if (status != MS_SUCCESS) { break; } /* Check if the shape size is ok to be drawn */ if ((shape.type == MS_SHAPE_LINE || shape.type == MS_SHAPE_POLYGON) && (minfeaturesize > 0) && (msShapeCheckSize(&shape, minfeaturesize) == MS_FALSE)) { if (layer->debug >= MS_DEBUGLEVEL_V) msDebug("msDrawVectorLayer(): Skipping shape (%ld) because " "LAYER::MINFEATURESIZE is bigger than shape size\n", shape.index); continue; } classcount = 0; } classindex = msShapeGetNextClass(classindex, layer, map, &shape, classgroup, nclasses); if ((classindex == -1) || (layer->class[classindex] -> status == MS_OFF)) { continue; } shape.classindex = classindex; // When only one class is applicable, rendering mode is forced to its // default, i.e. only the first applicable class is actually applied. As a // consequence, cache can be enabled when relevant. classcount++; rendermode = ref_rendermode; if ((classcount == 1) && (msShapeGetNextClass(classindex, layer, map, &shape, classgroup, nclasses) == -1)) { rendermode = MS_FIRST_MATCHING_CLASS; } if (rendermode == MS_FIRST_MATCHING_CLASS) { classindex = -1; } if (maxfeatures >= 0 && featuresdrawn >= maxfeatures) { status = MS_DONE; break; } featuresdrawn++; cache = MS_FALSE; if (layer->type == MS_LAYER_LINE && (layer->class[shape.classindex] -> numstyles > 1 || (layer->class[shape.classindex] -> numstyles == 1 && (layer->class[shape.classindex] -> styles[0] -> outlinewidth > 0 || layer -> class[shape.classindex] -> styles[0] -> bindings[MS_STYLE_BINDING_OUTLINEWIDTH].index != -1)))) { cache = MS_TRUE; /* only line layers with multiple styles need be cached (I don't think POLYLINE layers need caching - SDL) */ // we also cache line layers with outlinewidths } /* With 'STYLEITEM AUTO', we will have the datasource fill the class' */ /* style parameters for this shape. */ if (layer->styleitem) { if (strcasecmp(layer->styleitem, "AUTO") == 0) { if (msLayerGetAutoStyle(map, layer, layer->class[shape.classindex], &shape) != MS_SUCCESS) { retcode = MS_FAILURE; break; } } else { /* Generic feature style handling as per RFC-61 */ if (msLayerGetFeatureStyle(map, layer, layer->class[shape.classindex], &shape) != MS_SUCCESS) { retcode = MS_FAILURE; break; } } /* __TODO__ For now, we can't cache features with 'AUTO' style */ cache = MS_FALSE; } if (rendermode == MS_ALL_MATCHING_CLASSES) { // Cache is designed to handle only one class. Therefore it is // disabled when using SLD "painters model" rendering mode. cache = MS_FALSE; } /* RFC77 TODO: check return value, may need a more sophisticated if-then * test. */ if (annotate && layer->class[shape.classindex] -> numlabels > 0) { drawmode |= MS_DRAWMODE_LABELS; if (msLayerGetProcessingKey(layer, "LABEL_NO_CLIP")) { drawmode |= MS_DRAWMODE_UNCLIPPEDLABELS; } } if (layer->type == MS_LAYER_LINE && msLayerGetProcessingKey(layer, "POLYLINE_NO_CLIP")) { drawmode |= MS_DRAWMODE_UNCLIPPEDLINES; } if (rendermode == MS_ALL_MATCHING_CLASSES) { // In SLD "painters model" rendering mode, all applicable classes are // actually applied. Coordinates stored in the shape must keep their // original values for the shape to be drawn multiple times. Here the // original shape is saved. msInitShape(&savedShape); msCopyShape(&shape, &savedShape); } if (cache) { styleObj *pStyle = layer->class[shape.classindex]->styles[0]; // first ensure the style properties are bound to the shape // any outlinewidth bindings will then be set if (msBindLayerToShape(layer, &shape, drawmode) != MS_SUCCESS) { retcode = MS_FAILURE; break; } if (pStyle->outlinewidth > 0) { /* * RFC 49 implementation * if an outlinewidth is used: * - augment the style's width to account for the outline width * - swap the style color and outlinecolor * - draw the shape (the outline) in the first pass of the * caching mechanism */ msOutlineRenderingPrepareStyle(pStyle, map, layer, image); } /* draw a single style */ status = msDrawShape(map, layer, &shape, image, 0, drawmode | MS_DRAWMODE_SINGLESTYLE); if (pStyle->outlinewidth > 0) { /* * RFC 49 implementation: switch back the styleobj to its * original state, so the line fill will be drawn in the * second pass of the caching mechanism */ msOutlineRenderingRestoreStyle(pStyle, map, layer, image); } } else { status = msDrawShape(map, layer, &shape, image, -1, drawmode); /* all styles */ } if (rendermode == MS_ALL_MATCHING_CLASSES) { // In SLD "painters model" rendering mode, all applicable classes are // actually applied. Coordinates stored in the shape must keep their // original values for the shape to be drawn multiple times. Here the // original shape is restored. msFreeShape(&shape); msCopyShape(&savedShape, &shape); msFreeShape(&savedShape); } if (status != MS_SUCCESS) { retcode = MS_FAILURE; break; } if (shape.numlines == 0) { /* once clipped the shape didn't need to be drawn */ continue; } if (cache) { if (insertFeatureList(&shpcache, &shape) == NULL) { retcode = MS_FAILURE; /* problem adding to the cache */ break; } } maxnumstyles = MS_MAX(maxnumstyles, layer->class[shape.classindex] -> numstyles); } msFreeShape(&shape); if (classgroup) msFree(classgroup); if (status != MS_DONE || retcode == MS_FAILURE) { msLayerClose(layer); if (shpcache) { freeFeatureList(shpcache); shpcache = NULL; } return MS_FAILURE; } if (shpcache && MS_DRAW_FEATURES(drawmode)) { int s; for (s = 0; s < maxnumstyles; s++) { for (current = shpcache; current; current = current->next) { if (layer->class[current->shape.classindex] -> numstyles > s) { styleObj *pStyle = layer->class[current->shape.classindex]->styles[s]; if (pStyle->_geomtransform.type != MS_GEOMTRANSFORM_NONE) continue; /*skip this as it has already been rendered*/ if (map->scaledenom > 0) { if ((pStyle->maxscaledenom != -1) && (map->scaledenom >= pStyle->maxscaledenom)) continue; if ((pStyle->minscaledenom != -1) && (map->scaledenom < pStyle->minscaledenom)) continue; } if (s == 0 && (pStyle->outlinewidth > 0 || pStyle->bindings[MS_STYLE_BINDING_OUTLINEWIDTH].index != -1) && MS_VALID_COLOR(pStyle->color)) { if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol(map, image, ¤t->shape, pStyle, pStyle->scalefactor))) { return MS_FAILURE; } } else if (s > 0) { if ((pStyle->outlinewidth > 0 || pStyle->bindings[MS_STYLE_BINDING_OUTLINEWIDTH].index != -1) && MS_VALID_COLOR(pStyle->outlinecolor)) { /* * RFC 49 implementation * if an outlinewidth is used: * - augment the style's width to account for the outline width * - swap the style color and outlinecolor * - draw the shape (the outline) in the first pass of the * caching mechanism */ msOutlineRenderingPrepareStyle(pStyle, map, layer, image); if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol(map, image, ¤t->shape, pStyle, pStyle->scalefactor))) { return MS_FAILURE; } /* * RFC 49 implementation: switch back the styleobj to its * original state, so the line fill will be drawn in the * second pass of the caching mechanism */ msOutlineRenderingRestoreStyle(pStyle, map, layer, image); } /* draw a valid line, i.e. one with a color defined or of type * pixmap*/ if (MS_VALID_COLOR(pStyle->color) || (pStyle->symbol < map->symbolset.numsymbols && (map->symbolset.symbol[pStyle->symbol]->type == MS_SYMBOL_PIXMAP || map->symbolset.symbol[pStyle->symbol]->type == MS_SYMBOL_SVG))) { if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol(map, image, ¤t->shape, pStyle, pStyle->scalefactor))) return MS_FAILURE; } } } } } freeFeatureList(shpcache); shpcache = NULL; } msLayerClose(layer); return MS_SUCCESS; } /* ** Function to draw a layer IF it already has a result cache associated with it. *Called by msDrawMap and via MapScript. */ int msDrawQueryLayer(mapObj *map, layerObj *layer, imageObj *image) { int i, status; char annotate = MS_TRUE, cache = MS_FALSE; int drawmode = MS_DRAWMODE_FEATURES; shapeObj shape; int maxnumstyles = 1; featureListNodeObjPtr shpcache = NULL, current = NULL; colorObj *colorbuffer = NULL; int *mindistancebuffer = NULL; if (!layer->resultcache) return (msDrawLayer(map, layer, image)); if (!msLayerIsVisible(map, layer)) return (MS_SUCCESS); /* not an error, just nothing to do */ /* conditions may have changed since this layer last drawn, so reset layer->project to recheck projection needs (Bug #673) */ layer->project = msProjectionsDiffer(&(layer->projection), &(map->projection)); /* set annotation status */ annotate = msEvalContext(map, layer, layer->labelrequires); if (map->scaledenom > 0) { if ((layer->labelmaxscaledenom != -1) && (map->scaledenom >= layer->labelmaxscaledenom)) annotate = MS_FALSE; if ((layer->labelminscaledenom != -1) && (map->scaledenom < layer->labelminscaledenom)) annotate = MS_FALSE; } /* ** Certain query map styles require us to render all features only (MS_NORMAL) *or first (MS_HILITE). With ** single-pass queries we have to make a copy of the layer and work from it *instead. */ if (map->querymap.style == MS_NORMAL || map->querymap.style == MS_HILITE) { layerObj tmp_layer; if (initLayer(&tmp_layer, map) == -1) return (MS_FAILURE); if (msCopyLayer(&tmp_layer, layer) != MS_SUCCESS) return (MS_FAILURE); /* disable the connection pool for this layer */ msLayerSetProcessingKey(&tmp_layer, "CLOSE_CONNECTION", "ALWAYS"); status = msDrawLayer(map, &tmp_layer, image); freeLayer(&tmp_layer); if (map->querymap.style == MS_NORMAL || status != MS_SUCCESS) return (status); } /* if MS_HILITE, alter the one style (always at least 1 style), and set a * MINDISTANCE for the labelObj to avoid duplicates */ if (map->querymap.style == MS_HILITE) { drawmode |= MS_DRAWMODE_QUERY; if (layer->numclasses > 0) { colorbuffer = (colorObj *)msSmallMalloc(layer->numclasses * sizeof(colorObj)); mindistancebuffer = (int *)msSmallMalloc(layer->numclasses * sizeof(int)); } for (i = 0; i < layer->numclasses; i++) { if (layer->type == MS_LAYER_POLYGON && layer->class[i] -> numstyles > 0) { /* alter BOTTOM style since that's almost always the fill */ if (layer->class[i] -> styles == NULL) { msSetError(MS_MISCERR, "Don't know how to draw class %s of layer %s without a " "style definition.", "msDrawQueryLayer()", layer->class[i] -> name, layer -> name); msFree(colorbuffer); msFree(mindistancebuffer); return (MS_FAILURE); } if (MS_VALID_COLOR(layer->class[i] -> styles[0] -> color)) { colorbuffer[i] = layer->class[i] ->styles[0] ->color; /* save the color from the BOTTOM style */ layer->class[i]->styles[0]->color = map->querymap.color; } else if (MS_VALID_COLOR( layer->class[i] -> styles[0] -> outlinecolor)) { colorbuffer[i] = layer->class[i] ->styles[0] ->outlinecolor; /* if no color, save the outlinecolor from the BOTTOM style */ layer->class[i]->styles[0]->outlinecolor = map->querymap.color; } } else if (layer->type == MS_LAYER_LINE && layer->class[i] -> numstyles > 0 && layer -> class[i] -> styles[0] -> outlinewidth > 0) { /* alter BOTTOM style for lines with outlines */ if (MS_VALID_COLOR(layer->class[i] -> styles[0] -> color)) { colorbuffer[i] = layer->class[i] ->styles[0] ->color; /* save the color from the BOTTOM style */ layer->class[i]->styles[0]->color = map->querymap.color; } /* else ??? */ } else if (layer->class[i] -> numstyles > 0) { if (MS_VALID_COLOR( layer->class[i] -> styles[layer->class[i] -> numstyles - 1] -> color)) { colorbuffer[i] = layer->class[i] ->styles[layer->class[i] -> numstyles - 1] ->color; /* save the color from the TOP style */ layer->class[i]->styles[layer->class[i] -> numstyles - 1]->color = map->querymap.color; } else if (MS_VALID_COLOR(layer->class[i] -> styles[layer->class[i] -> numstyles - 1] -> outlinecolor)) { colorbuffer[i] = layer->class[i] ->styles[layer->class[i] -> numstyles - 1] ->outlinecolor; /* if no color, save the outlinecolor from the TOP style */ layer->class[i] ->styles[layer->class[i] -> numstyles - 1] ->outlinecolor = map->querymap.color; } } else if (layer->class[i] -> numlabels > 0) { colorbuffer[i] = layer->class[i]->labels[0]->color; layer->class[i]->labels[0]->color = map->querymap.color; } /* else ??? */ mindistancebuffer[i] = -1; /* RFC77 TODO: only using the first label, is that cool? */ if (layer->class[i] -> numlabels > 0) { mindistancebuffer[i] = layer->class[i]->labels[0]->mindistance; layer->class[i]->labels[0]->mindistance = MS_MAX(0, layer->class[i] -> labels[0] -> mindistance); } } } /* ** Layer was opened as part of the query process, msLayerWhichItems() has also *been run, shapes have been classified - start processing! */ msInitShape(&shape); for (i = 0; i < layer->resultcache->numresults; i++) { status = msLayerGetShape(layer, &shape, &(layer->resultcache->results[i])); if (status != MS_SUCCESS) { msFree(colorbuffer); msFree(mindistancebuffer); return (MS_FAILURE); } shape.classindex = layer->resultcache->results[i].classindex; /* classindex may be -1 here if there was a template at the top level * in this layer and the current shape selected even if it didn't * match any class * * FrankW: classindex is also sometimes 0 even if there are no classes, so * we are careful not to use out of range class values as an index. */ if (shape.classindex == -1 || shape.classindex >= layer->numclasses || layer->class[shape.classindex] -> status == MS_OFF) { msFreeShape(&shape); continue; } cache = MS_FALSE; if (layer->type == MS_LAYER_LINE && (layer->class[shape.classindex] -> numstyles > 1 || (layer->class[shape.classindex] -> numstyles == 1 && (layer->class[shape.classindex] -> styles[0] -> outlinewidth > 0 || layer -> class[shape.classindex] -> styles[0] -> bindings[MS_STYLE_BINDING_OUTLINEWIDTH].index != -1)))) { cache = MS_TRUE; /* only line layers with multiple styles need be cached (I don't think POLYLINE layers need caching - SDL) */ } if (annotate && layer->class[shape.classindex] -> numlabels > 0) { drawmode |= MS_DRAWMODE_LABELS; } if (cache) { styleObj *pStyle = layer->class[shape.classindex]->styles[0]; if (msBindLayerToShape(layer, &shape, drawmode) == MS_SUCCESS) { if (pStyle->outlinewidth > 0) { msOutlineRenderingPrepareStyle(pStyle, map, layer, image); } /* draw only the first style */ status = msDrawShape(map, layer, &shape, image, 0, drawmode | MS_DRAWMODE_SINGLESTYLE); if (pStyle->outlinewidth > 0) { msOutlineRenderingRestoreStyle(pStyle, map, layer, image); } } } else { /* all styles */ status = msDrawShape(map, layer, &shape, image, -1, drawmode); } if (status != MS_SUCCESS) { msLayerClose(layer); msFree(colorbuffer); msFree(mindistancebuffer); return (MS_FAILURE); } if (shape.numlines == 0) { /* once clipped the shape didn't need to be drawn */ msFreeShape(&shape); continue; } if (cache) { if (insertFeatureList(&shpcache, &shape) == NULL) { msFree(colorbuffer); msFree(mindistancebuffer); return (MS_FAILURE); /* problem adding to the cache */ } } maxnumstyles = MS_MAX(maxnumstyles, layer->class[shape.classindex] -> numstyles); msFreeShape(&shape); } if (shpcache) { int s; for (s = 0; s < maxnumstyles; s++) { for (current = shpcache; current; current = current->next) { if (layer->class[current->shape.classindex] -> numstyles > s) { styleObj *pStyle = layer->class[current->shape.classindex]->styles[s]; if (pStyle->_geomtransform.type != MS_GEOMTRANSFORM_NONE) continue; /* skip this as it has already been rendered */ if (map->scaledenom > 0) { if ((pStyle->maxscaledenom != -1) && (map->scaledenom >= pStyle->maxscaledenom)) continue; if ((pStyle->minscaledenom != -1) && (map->scaledenom < pStyle->minscaledenom)) continue; } if (s == 0 && pStyle->outlinewidth > 0 && MS_VALID_COLOR(pStyle->color)) { if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol(map, image, ¤t->shape, pStyle, pStyle->scalefactor))) { return MS_FAILURE; } } else if (s > 0) { if (pStyle->outlinewidth > 0 && MS_VALID_COLOR(pStyle->outlinecolor)) { msOutlineRenderingPrepareStyle(pStyle, map, layer, image); if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol(map, image, ¤t->shape, pStyle, pStyle->scalefactor))) { return MS_FAILURE; } msOutlineRenderingRestoreStyle(pStyle, map, layer, image); } /* draw a valid line, i.e. one with a color defined or of type * pixmap */ if (MS_VALID_COLOR(pStyle->color) || (pStyle->symbol < map->symbolset.numsymbols && (map->symbolset.symbol[pStyle->symbol]->type == MS_SYMBOL_PIXMAP || map->symbolset.symbol[pStyle->symbol]->type == MS_SYMBOL_SVG))) { if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol(map, image, ¤t->shape, pStyle, pStyle->scalefactor))) return MS_FAILURE; } } } } } freeFeatureList(shpcache); shpcache = NULL; } /* if MS_HILITE, restore color and mindistance values */ if (map->querymap.style == MS_HILITE) { for (i = 0; i < layer->numclasses; i++) { if (layer->type == MS_LAYER_POLYGON && layer->class[i] -> numstyles > 0) { if (MS_VALID_COLOR(layer->class[i] -> styles[0] -> color)) layer->class[i]->styles[0]->color = colorbuffer[i]; else if (MS_VALID_COLOR(layer->class[i] -> styles[0] -> outlinecolor)) layer->class[i]->styles[0]->outlinecolor = colorbuffer[i]; /* if no color, restore outlinecolor for the BOTTOM style */ } else if (layer->type == MS_LAYER_LINE && layer->class[i] -> numstyles > 0 && layer -> class[i] -> styles[0] -> outlinewidth > 0) { if (MS_VALID_COLOR(layer->class[i] -> styles[0] -> color)) layer->class[i]->styles[0]->color = colorbuffer[i]; } else if (layer->class[i] -> numstyles > 0) { if (MS_VALID_COLOR( layer->class[i] -> styles[layer->class[i] -> numstyles - 1] -> color)) layer->class[i]->styles[layer->class[i] -> numstyles - 1]->color = colorbuffer[i]; else if (MS_VALID_COLOR( layer->class[i] -> styles[layer->class[i] -> numstyles - 1] -> outlinecolor)) layer->class[i] ->styles[layer->class[i] -> numstyles - 1] ->outlinecolor = colorbuffer[i]; /* if no color, restore outlinecolor for the TOP style */ } else if (layer->class[i] -> numlabels > 0) { if (MS_VALID_COLOR(layer->class[i] -> labels[0] -> color)) layer->class[i]->labels[0]->color = colorbuffer[i]; } if (layer->class[i] -> numlabels > 0) layer->class[i]->labels[0]->mindistance = mindistancebuffer[i]; /* RFC77 TODO: again, only using the first label, is that cool? */ } msFree(colorbuffer); msFree(mindistancebuffer); } return (MS_SUCCESS); } /** * msDrawRasterLayerPlugin() */ static int msDrawRasterLayerPlugin(mapObj *map, layerObj *layer, imageObj *image) { rendererVTableObj *renderer = MS_IMAGE_RENDERER(image); rasterBufferObj *rb = msSmallCalloc(1, sizeof(rasterBufferObj)); int ret; if (renderer->supports_pixel_buffer) { if (MS_SUCCESS != renderer->getRasterBufferHandle(image, rb)) { msSetError(MS_MISCERR, "renderer failed to extract raster buffer", "msDrawRasterLayer()"); return MS_FAILURE; } ret = msDrawRasterLayerLow(map, layer, image, rb); } else { if (MS_SUCCESS != renderer->initializeRasterBuffer( rb, image->width, image->height, MS_IMAGEMODE_RGBA)) { msSetError(MS_MISCERR, "renderer failed to create raster buffer", "msDrawRasterLayer()"); return MS_FAILURE; } ret = msDrawRasterLayerLow(map, layer, image, rb); if (ret == 0) { ret = renderer->mergeRasterBuffer(image, rb, 1.0, 0, 0, 0, 0, rb->width, rb->height); } msFreeRasterBuffer(rb); } #define RB_GET_R(rb, x, y) \ *((rb)->data.rgba.r + (x) * (rb)->data.rgba.pixel_step + \ (y) * (rb)->data.rgba.row_step) #define RB_GET_G(rb, x, y) \ *((rb)->data.rgba.g + (x) * (rb)->data.rgba.pixel_step + \ (y) * (rb)->data.rgba.row_step) #define RB_GET_B(rb, x, y) \ *((rb)->data.rgba.b + (x) * (rb)->data.rgba.pixel_step + \ (y) * (rb)->data.rgba.row_step) #define RB_GET_A(rb, x, y) \ *((rb)->data.rgba.a + (x) * (rb)->data.rgba.pixel_step + \ (y) * (rb)->data.rgba.row_step) free(rb); return ret; } /** * Generic function to render raster layers. */ int msDrawRasterLayer(mapObj *map, layerObj *layer, imageObj *image) { int rv = MS_FAILURE; if (!image || !map || !layer) { return rv; } /* RFC-86 Scale dependent token replacements*/ rv = msLayerApplyScaletokens(layer, (layer->map) ? layer->map->scaledenom : -1); if (rv != MS_SUCCESS) return rv; if (MS_RENDERER_PLUGIN(image->format)) rv = msDrawRasterLayerPlugin(map, layer, image); else if (MS_RENDERER_RAWDATA(image->format)) rv = msDrawRasterLayerLow(map, layer, image, NULL); msLayerRestoreFromScaletokens(layer); return rv; } /** * msDrawWMSLayer() * * Draw a single WMS layer. * Multiple WMS layers in a map are preloaded and then drawn using * msDrawWMSLayerLow() */ #ifdef USE_WMS_LYR int msDrawWMSLayer(mapObj *map, layerObj *layer, imageObj *image) { int nStatus = MS_FAILURE; if (image && map && layer) { /* ------------------------------------------------------------------ * Start by downloading the layer * ------------------------------------------------------------------ */ httpRequestObj asReqInfo[2]; int numReq = 0; msHTTPInitRequestObj(asReqInfo, 2); if (msPrepareWMSLayerRequest(1, map, layer, 1, 0, NULL, 0, 0, 0, NULL, asReqInfo, &numReq) == MS_FAILURE || msOWSExecuteRequests(asReqInfo, numReq, map, MS_TRUE) == MS_FAILURE) { return MS_FAILURE; } /* ------------------------------------------------------------------ * Then draw layer based on output format * ------------------------------------------------------------------ */ if (MS_RENDERER_PLUGIN(image->format)) nStatus = msDrawWMSLayerLow(1, asReqInfo, numReq, map, layer, image); else if (MS_RENDERER_RAWDATA(image->format)) nStatus = msDrawWMSLayerLow(1, asReqInfo, numReq, map, layer, image); else { msSetError(MS_WMSCONNERR, "Output format '%s' doesn't support WMS layers.", "msDrawWMSLayer()", image->format->name); nStatus = MS_SUCCESS; /* Should we fail if output doesn't support WMS? */ } /* Cleanup */ msHTTPFreeRequestObj(asReqInfo, numReq); } return nStatus; } #endif int circleLayerDrawShape(mapObj *map, imageObj *image, layerObj *layer, shapeObj *shape) { pointObj center; double r; int s; int c = shape->classindex; if (shape->numlines != 1) return (MS_SUCCESS); /* invalid shape */ if (shape->line[0].numpoints != 2) return (MS_SUCCESS); /* invalid shape */ center.x = (shape->line[0].point[0].x + shape->line[0].point[1].x) / 2.0; center.y = (shape->line[0].point[0].y + shape->line[0].point[1].y) / 2.0; r = MS_ABS(center.x - shape->line[0].point[0].x); if (r == 0) r = MS_ABS(center.y - shape->line[0].point[0].y); if (r == 0) return (MS_SUCCESS); if (layer->transform == MS_TRUE) { if (layer->project) msProjectPoint(&layer->projection, &map->projection, ¢er); center.x = MS_MAP2IMAGE_X(center.x, map->extent.minx, map->cellsize); center.y = MS_MAP2IMAGE_Y(center.y, map->extent.maxy, map->cellsize); r /= map->cellsize; } else msOffsetPointRelativeTo(¢er, layer); for (s = 0; s < layer->class[c] -> numstyles; s++) { if (msScaleInBounds(map->scaledenom, layer->class[c] -> styles[s] -> minscaledenom, layer -> class[c] -> styles[s] -> maxscaledenom)) if (MS_UNLIKELY(MS_FAILURE == msCircleDrawShadeSymbol( map, image, ¢er, r, layer->class[c] -> styles[s], layer -> class[c] -> styles[s] -> scalefactor))) { return MS_FAILURE; } } return MS_SUCCESS; /* TODO: need to handle circle annotation */ } static int pointLayerDrawShape(mapObj *map, imageObj *image, layerObj *layer, shapeObj *shape, int drawmode) { int l, c = shape->classindex, j, i, s; pointObj *point; int ret = MS_FAILURE; if (layer->project && layer->transform == MS_TRUE) { reprojectionObj *reprojector = msLayerGetReprojectorToMap(layer, map); if (reprojector == NULL) { return MS_FAILURE; } msProjectShapeEx(reprojector, shape); } // Only take into account map rotation if the label and style angles are // non-zero. if (map->gt.rotation_angle) { for (l = 0; l < layer->class[c] -> numlabels; l++) { if (layer->class[c] -> labels[l] -> angle != 0) layer->class[c]->labels[l]->angle -= map->gt.rotation_angle; } for (s = 0; s < layer->class[c] -> numstyles; s++) { if (layer->class[c] -> styles[s] -> angle != 0) layer->class[c]->styles[s]->angle -= map->gt.rotation_angle; } } for (j = 0; j < shape->numlines; j++) { for (i = 0; i < shape->line[j].numpoints; i++) { point = &(shape->line[j].point[i]); if (layer->transform == MS_TRUE) { if (!msPointInRect(point, &map->extent)) continue; /* next point */ msTransformPoint(point, &map->extent, map->cellsize, image); } else msOffsetPointRelativeTo(point, layer); if (MS_DRAW_FEATURES(drawmode)) { for (s = 0; s < layer->class[c] -> numstyles; s++) { if (msScaleInBounds(map->scaledenom, layer->class[c] -> styles[s] -> minscaledenom, layer -> class[c] -> styles[s] -> maxscaledenom)) if (MS_UNLIKELY( MS_FAILURE == msDrawMarkerSymbol( map, image, point, layer->class[c] -> styles[s], layer -> class[c] -> styles[s] -> scalefactor))) { goto end; } } } if (MS_DRAW_LABELS(drawmode)) { if (layer->labelcache) { if (msAddLabelGroup(map, image, layer, c, shape, point, -1) != MS_SUCCESS) goto end; } else { for (l = 0; l < layer->class[c] -> numlabels; l++) if (msGetLabelStatus(map, layer, shape, layer->class[c] -> labels[l]) == MS_ON) { char *annotext = msShapeGetLabelAnnotation( layer, shape, layer->class[c] -> labels[l]); if (MS_UNLIKELY(MS_FAILURE == msDrawLabel(map, image, *point, annotext, layer->class[c] -> labels[l], layer -> class[c] -> labels[l] -> scalefactor))) { goto end; } } } } } } ret = MS_SUCCESS; end: if (map->gt.rotation_angle) { for (l = 0; l < layer->class[c] -> numlabels; l++) { if (layer->class[c] -> labels[l] -> angle != 0) layer->class[c]->labels[l]->angle += map->gt.rotation_angle; } for (s = 0; s < layer->class[c] -> numstyles; s++) { if (layer->class[c] -> styles[s] -> angle != 0) layer->class[c]->styles[s]->angle += map->gt.rotation_angle; } } return ret; } int lineLayerDrawShape(mapObj *map, imageObj *image, layerObj *layer, shapeObj *shape, shapeObj *anno_shape, shapeObj *unclipped_shape, int style, int drawmode) { int c = shape->classindex; int ret = MS_SUCCESS; /* RFC48: loop through the styles, and pass off to the type-specific function if the style has an appropriate type */ if (MS_DRAW_FEATURES(drawmode)) { for (int s = 0; s < layer->class[c] -> numstyles; s++) { if (msScaleInBounds(map->scaledenom, layer->class[c] -> styles[s] -> minscaledenom, layer -> class[c] -> styles[s] -> maxscaledenom)) { if (layer->class[c] -> styles[s] -> _geomtransform.type != MS_GEOMTRANSFORM_NONE) { if (MS_UNLIKELY(MS_FAILURE == msDrawTransformedShape( map, image, unclipped_shape, layer->class[c] -> styles[s], layer -> class[c] -> styles[s] -> scalefactor))) { return MS_FAILURE; } } else if (!MS_DRAW_SINGLESTYLE(drawmode) || s == style) { if (MS_UNLIKELY(MS_FAILURE == msDrawLineSymbol( map, image, shape, layer->class[c] -> styles[s], layer -> class[c] -> styles[s] -> scalefactor))) { return MS_FAILURE; } } } } } if (MS_DRAW_LABELS(drawmode)) { for (int l = 0; l < layer->class[c] -> numlabels; l++) { labelObj *label = layer->class[c]->labels[l]; textSymbolObj ts; char *annotext; if (!msGetLabelStatus(map, layer, shape, label)) { continue; } annotext = msShapeGetLabelAnnotation(layer, anno_shape, label); if (!annotext) continue; initTextSymbol(&ts); msPopulateTextSymbolForLabelAndString( &ts, label, annotext, label->scalefactor, image->resolutionfactor, layer->labelcache); if (label->anglemode == MS_FOLLOW) { /* bug #1620 implementation */ struct label_follow_result lfr; if (!layer->labelcache) { msSetError(MS_MISCERR, "Angle mode 'FOLLOW' is supported only with labelcache on", "msDrawShape()"); ret = MS_FAILURE; goto line_cleanup; } memset(&lfr, 0, sizeof(lfr)); msPolylineLabelPath(map, image, anno_shape, &ts, label, &lfr); for (int i = 0; i < lfr.num_follow_labels; i++) { if (msAddLabel(map, image, label, layer->index, c, anno_shape, NULL, -1, lfr.follow_labels[i]) != MS_SUCCESS) { ret = MS_FAILURE; goto line_cleanup; } } free(lfr.follow_labels); for (int i = 0; i < lfr.lar.num_label_points; i++) { textSymbolObj *ts_auto = msSmallMalloc(sizeof(textSymbolObj)); initTextSymbol(ts_auto); msCopyTextSymbol(ts_auto, &ts); ts_auto->rotation = lfr.lar.angles[i]; { if (msAddLabel(map, image, label, layer->index, c, anno_shape, &lfr.lar.label_points[i], -1, ts_auto) != MS_SUCCESS) { ret = MS_FAILURE; free(lfr.lar.angles); free(lfr.lar.label_points); goto line_cleanup; } } } free(lfr.lar.angles); free(lfr.lar.label_points); } else { struct label_auto_result lar; memset(&lar, 0, sizeof(struct label_auto_result)); ret = msPolylineLabelPoint(map, anno_shape, &ts, label, &lar, image->resolutionfactor); if (MS_UNLIKELY(MS_FAILURE == ret)) goto line_cleanup; if (label->angle != 0) label->angle -= map->gt.rotation_angle; /* apply rotation angle */ for (int i = 0; i < lar.num_label_points; i++) { textSymbolObj *ts_auto = msSmallMalloc(sizeof(textSymbolObj)); initTextSymbol(ts_auto); msCopyTextSymbol(ts_auto, &ts); ts_auto->rotation = lar.angles[i]; if (layer->labelcache) { if (msAddLabel(map, image, label, layer->index, c, anno_shape, &lar.label_points[i], -1, ts_auto) != MS_SUCCESS) { ret = MS_FAILURE; free(lar.angles); free(lar.label_points); freeTextSymbol(ts_auto); free(ts_auto); goto line_cleanup; } } else { if (!ts_auto->textpath) { if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, ts_auto))) { ret = MS_FAILURE; free(lar.angles); free(lar.label_points); freeTextSymbol(ts_auto); free(ts_auto); goto line_cleanup; } } ret = msDrawTextSymbol(map, image, lar.label_points[i], ts_auto); freeTextSymbol(ts_auto); free(ts_auto); /* TODO RFC98: could we not re-use the original ts * instead of duplicating into ts_auto ? we cannot * for now, as the rendering code will modify the * glyph positions to apply the labelpoint and * rotation offsets */ ts_auto = NULL; if (MS_UNLIKELY(MS_FAILURE == ret)) goto line_cleanup; } } free(lar.angles); free(lar.label_points); } line_cleanup: /* clean up and reset */ if (ret == MS_FAILURE) { break; /* from the label looping */ } freeTextSymbol(&ts); } /* next label */ } return ret; } int polygonLayerDrawShape(mapObj *map, imageObj *image, layerObj *layer, shapeObj *shape, shapeObj *anno_shape, shapeObj *unclipped_shape, int drawmode) { int c = shape->classindex; pointObj annopnt = {0}; // initialize int i; if (MS_DRAW_FEATURES(drawmode)) { for (i = 0; i < layer->class[c] -> numstyles; i++) { if (msScaleInBounds(map->scaledenom, layer->class[c] -> styles[i] -> minscaledenom, layer -> class[c] -> styles[i] -> maxscaledenom)) { if (layer->class[c] -> styles[i] -> _geomtransform.type == MS_GEOMTRANSFORM_NONE) { if (MS_UNLIKELY(MS_FAILURE == msDrawShadeSymbol( map, image, shape, layer->class[c] -> styles[i], layer -> class[c] -> styles[i] -> scalefactor))) { return MS_FAILURE; } } else { if (MS_UNLIKELY(MS_FAILURE == msDrawTransformedShape( map, image, unclipped_shape, layer->class[c] -> styles[i], layer -> class[c] -> styles[i] -> scalefactor))) { return MS_FAILURE; } } } } } if (MS_DRAW_LABELS(drawmode)) { if (layer->class[c] -> numlabels > 0) { double minfeaturesize = layer->class[c]->labels[0]->minfeaturesize * image->resolutionfactor; if (msPolygonLabelPoint(anno_shape, &annopnt, minfeaturesize) == MS_SUCCESS) { for (i = 0; i < layer->class[c] -> numlabels; i++) if (layer->class[c] -> labels[i] -> angle != 0) layer->class[c]->labels[i]->angle -= map->gt.rotation_angle; /* TODO: is this correct ??? */ if (layer->labelcache) { if (msAddLabelGroup(map, image, layer, c, anno_shape, &annopnt, MS_MIN(shape->bounds.maxx - shape->bounds.minx, shape->bounds.maxy - shape->bounds.miny)) != MS_SUCCESS) { return MS_FAILURE; } } else { for (i = 0; i < layer->class[c] -> numlabels; i++) if (msGetLabelStatus(map, layer, shape, layer->class[c] -> labels[i]) == MS_ON) { char *annotext = msShapeGetLabelAnnotation( layer, shape, layer->class[c] -> labels[i]); /*ownership taken by msDrawLabel, no need to free */ if (MS_UNLIKELY(MS_FAILURE == msDrawLabel(map, image, annopnt, annotext, layer->class[c] -> labels[i], layer -> class[c] -> labels[i] -> scalefactor))) { return MS_FAILURE; } } } } } } return MS_SUCCESS; } /* ** Function to render an individual shape, the style variable enables/disables *the drawing of a single style ** versus a single style. This is necessary when drawing entire layers as proper *overlay can only be achieved ** through caching. "querymapMode" parameter is used to tell msBindLayerToShape *to not override the ** QUERYMAP HILITE color. */ int msDrawShape(mapObj *map, layerObj *layer, shapeObj *shape, imageObj *image, int style, int drawmode) { int c, s, ret = MS_SUCCESS; shapeObj *anno_shape, *unclipped_shape = shape; int bNeedUnclippedShape = MS_FALSE; int bNeedUnclippedAnnoShape = MS_FALSE; int bShapeNeedsClipping = MS_TRUE; if (shape->numlines == 0 || shape->type == MS_SHAPE_NULL) return MS_SUCCESS; c = shape->classindex; /* Before we do anything else, we will check for a rangeitem. If its there, we need to change the style's color to map the range to the shape */ for (s = 0; s < layer->class[c] -> numstyles; s++) { styleObj *style = layer->class[c]->styles[s]; if (style->rangeitem != NULL) msShapeToRange((layer->class[c] -> styles[s]), shape); } /* circle and point layers go through their own treatment */ if (layer->type == MS_LAYER_CIRCLE) { if (msBindLayerToShape(layer, shape, drawmode) != MS_SUCCESS) return MS_FAILURE; msDrawStartShape(map, layer, image, shape); ret = circleLayerDrawShape(map, image, layer, shape); msDrawEndShape(map, layer, image, shape); return ret; } else if (layer->type == MS_LAYER_POINT || layer->type == MS_LAYER_RASTER) { if (msBindLayerToShape(layer, shape, drawmode) != MS_SUCCESS) return MS_FAILURE; msDrawStartShape(map, layer, image, shape); ret = pointLayerDrawShape(map, image, layer, shape, drawmode); msDrawEndShape(map, layer, image, shape); return ret; } if (layer->type == MS_LAYER_POLYGON && shape->type != MS_SHAPE_POLYGON) { msSetError( MS_MISCERR, "Only polygon shapes can be drawn using a polygon layer definition.", "polygonLayerDrawShape()"); return (MS_FAILURE); } if (layer->type == MS_LAYER_LINE && shape->type != MS_SHAPE_POLYGON && shape->type != MS_SHAPE_LINE) { msSetError(MS_MISCERR, "Only polygon or line shapes can be drawn using a line layer " "definition.", "msDrawShape()"); return (MS_FAILURE); } if (layer->project && layer->transform == MS_TRUE) { reprojectionObj *reprojector = msLayerGetReprojectorToMap(layer, map); if (reprojector == NULL) { return MS_FAILURE; } msProjectShapeEx(reprojector, shape); } /* check if we'll need the unclipped shape */ if (shape->type != MS_SHAPE_POINT) { if (MS_DRAW_FEATURES(drawmode)) { for (s = 0; s < layer->class[c] -> numstyles; s++) { styleObj *style = layer->class[c]->styles[s]; if (style->_geomtransform.type != MS_GEOMTRANSFORM_NONE) bNeedUnclippedShape = MS_TRUE; } } /* check if we need to clip the shape */ if (shape->bounds.minx < map->extent.minx || shape->bounds.miny < map->extent.miny || shape->bounds.maxx > map->extent.maxx || shape->bounds.maxy > map->extent.maxy) { bShapeNeedsClipping = MS_TRUE; } if (MS_DRAW_LABELS(drawmode) && MS_DRAW_UNCLIPPED_LABELS(drawmode)) { bNeedUnclippedAnnoShape = MS_TRUE; bNeedUnclippedShape = MS_TRUE; } if (MS_DRAW_UNCLIPPED_LINES(drawmode)) { bShapeNeedsClipping = MS_FALSE; } } else { bShapeNeedsClipping = MS_FALSE; } if (layer->transform == MS_TRUE && bShapeNeedsClipping) { /* compute the size of the clipping buffer, in pixels. This buffer must account for the size of symbols drawn to avoid artifacts around the image edges */ int clip_buf = 0; int s; rectObj cliprect; for (s = 0; s < layer->class[c] -> numstyles; s++) { double maxsize, maxunscaledsize; symbolObj *symbol; styleObj *style = layer->class[c]->styles[s]; if (!MS_IS_VALID_ARRAY_INDEX(style->symbol, map->symbolset.numsymbols)) { msSetError(MS_SYMERR, "Invalid symbol index: %d", "msDrawShape()", style->symbol); return MS_FAILURE; } symbol = map->symbolset.symbol[style->symbol]; if (symbol->type == MS_SYMBOL_PIXMAP) { if (MS_SUCCESS != msPreloadImageSymbol(MS_MAP_RENDERER(map), symbol)) return MS_FAILURE; } else if (symbol->type == MS_SYMBOL_SVG) { #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) if (MS_SUCCESS != msPreloadSVGSymbol(symbol)) return MS_FAILURE; #else msSetError(MS_SYMERR, "SVG symbol support is not enabled.", "msDrawShape()"); return MS_FAILURE; #endif } maxsize = MS_MAX(msSymbolGetDefaultSize(symbol), MS_MAX(style->size, style->width)); maxunscaledsize = MS_MAX(style->minsize * image->resolutionfactor, style->minwidth * image->resolutionfactor); if (shape->type == MS_SHAPE_POLYGON && !IS_PARALLEL_OFFSET(style->offsety)) { maxsize += MS_MAX(fabs(style->offsety), fabs(style->offsetx)); } clip_buf = MS_MAX( clip_buf, MS_NINT(MS_MAX(maxsize * style->scalefactor, maxunscaledsize) + 1)); } /* if we need a copy of the unclipped shape, transform first, then clip to * avoid transforming twice */ if (bNeedUnclippedShape) { msTransformShape(shape, map->extent, map->cellsize, image); if (shape->numlines == 0) return MS_SUCCESS; msComputeBounds(shape); /* TODO: there's an optimization here that can be implemented: - no need to allocate unclipped_shape for each call to this function - the calls to msClipXXXRect will discard the original lineObjs, whereas we have just copied them because they where needed. These two functions could be changed so they are instructed not to free the original lineObjs. */ unclipped_shape = (shapeObj *)msSmallMalloc(sizeof(shapeObj)); msInitShape(unclipped_shape); msCopyShape(shape, unclipped_shape); if (shape->type == MS_SHAPE_POLYGON) { /* #179: additional buffer for polygons */ clip_buf += 2; } cliprect.minx = cliprect.miny = -clip_buf; cliprect.maxx = image->width + clip_buf; cliprect.maxy = image->height + clip_buf; if (shape->type == MS_SHAPE_POLYGON) { msClipPolygonRect(shape, cliprect); } else { assert(shape->type == MS_SHAPE_LINE); msClipPolylineRect(shape, cliprect); } if (bNeedUnclippedAnnoShape) { anno_shape = unclipped_shape; } else { anno_shape = shape; } } else { /* clip first, then transform. This means we are clipping in geographical * space */ double clip_buf_d; if (shape->type == MS_SHAPE_POLYGON) { /* * add a small buffer around the cliping rectangle to * avoid lines around the edges : #179 */ clip_buf += 2; } clip_buf_d = clip_buf * map->cellsize; cliprect.minx = map->extent.minx - clip_buf_d; cliprect.miny = map->extent.miny - clip_buf_d; cliprect.maxx = map->extent.maxx + clip_buf_d; cliprect.maxy = map->extent.maxy + clip_buf_d; if (shape->type == MS_SHAPE_POLYGON) { msClipPolygonRect(shape, cliprect); } else { assert(shape->type == MS_SHAPE_LINE); msClipPolylineRect(shape, cliprect); } msTransformShape(shape, map->extent, map->cellsize, image); msComputeBounds(shape); anno_shape = shape; } } else { /* the shape is fully in the map extent, * or is a point type layer where out of bounds points are treated * differently*/ if (layer->transform == MS_TRUE) { msTransformShape(shape, map->extent, map->cellsize, image); msComputeBounds(shape); } else { msOffsetShapeRelativeTo(shape, layer); } anno_shape = shape; } if (shape->numlines == 0) { ret = MS_SUCCESS; /* error message is set in msBindLayerToShape() */ goto draw_shape_cleanup; } // if we are only drawing a single style then it may have been modified // outside this function by msOutlineRenderingPrepareStyle and we don't want // to rebind the style to the layer if (style != 0) { if (msBindLayerToShape(layer, shape, drawmode) != MS_SUCCESS) { ret = MS_FAILURE; /* error message is set in msBindLayerToShape() */ goto draw_shape_cleanup; } } switch (layer->type) { case MS_LAYER_LINE: msDrawStartShape(map, layer, image, shape); ret = lineLayerDrawShape(map, image, layer, shape, anno_shape, unclipped_shape, style, drawmode); break; case MS_LAYER_POLYGON: msDrawStartShape(map, layer, image, shape); ret = polygonLayerDrawShape(map, image, layer, shape, anno_shape, unclipped_shape, drawmode); break; case MS_LAYER_POINT: case MS_LAYER_RASTER: assert(0); // bug ! default: msSetError(MS_MISCERR, "Unknown layer type.", "msDrawShape()"); ret = MS_FAILURE; } draw_shape_cleanup: msDrawEndShape(map, layer, image, shape); if (unclipped_shape != shape) { msFreeShape(unclipped_shape); msFree(unclipped_shape); } return ret; } /* ** Function to render an individual point, used as a helper function for *mapscript only. Since a point ** can't carry attributes you can't do attribute based font size or angle. */ int msDrawPoint(mapObj *map, layerObj *layer, pointObj *point, imageObj *image, int classindex, char *labeltext) { int s, ret; classObj *theclass = NULL; labelObj *label = NULL; if (layer->transform == MS_TRUE && layer->project && msProjectionsDiffer(&(layer->projection), &(map->projection))) { msProjectPoint(&(layer->projection), &(map->projection), point); } if (classindex > layer->numclasses) { msSetError(MS_MISCERR, "Invalid classindex (%d)", "msDrawPoint()", classindex); return MS_FAILURE; } theclass = layer->class[classindex]; if (labeltext && theclass->numlabels > 0) { label = theclass->labels[0]; } switch (layer->type) { case MS_LAYER_POINT: if (layer->transform == MS_TRUE) { if (!msPointInRect(point, &map->extent)) return (0); point->x = MS_MAP2IMAGE_X(point->x, map->extent.minx, map->cellsize); point->y = MS_MAP2IMAGE_Y(point->y, map->extent.maxy, map->cellsize); } else msOffsetPointRelativeTo(point, layer); for (s = 0; s < theclass->numstyles; s++) { if (msScaleInBounds(map->scaledenom, theclass->styles[s]->minscaledenom, theclass->styles[s]->maxscaledenom)) if (MS_UNLIKELY(MS_FAILURE == msDrawMarkerSymbol(map, image, point, theclass->styles[s], theclass->styles[s]->scalefactor))) { return MS_FAILURE; } } if (label && labeltext && *labeltext) { textSymbolObj *ts = msSmallMalloc(sizeof(textSymbolObj)); initTextSymbol(ts); msPopulateTextSymbolForLabelAndString( ts, label, msStrdup(labeltext), label->scalefactor, image->resolutionfactor, layer->labelcache); if (layer->labelcache) { if (msAddLabel(map, image, label, layer->index, classindex, NULL, point, -1, ts) != MS_SUCCESS) { return (MS_FAILURE); } } else { if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, ts))) { freeTextSymbol(ts); free(ts); return MS_FAILURE; } ret = msDrawTextSymbol(map, image, *point, ts); freeTextSymbol(ts); free(ts); if (MS_UNLIKELY(ret == MS_FAILURE)) return MS_FAILURE; } } break; default: break; /* don't do anything with layer of other types */ } return (MS_SUCCESS); /* all done, no cleanup */ } /* ** Draws a single label independently of the label cache. No collision avoidance *is performed. */ int msDrawLabel(mapObj *map, imageObj *image, pointObj labelPnt, char *string, labelObj *label, double scalefactor) { shapeObj labelPoly; label_bounds lbounds = {0}; lineObj labelPolyLine; pointObj labelPolyPoints[5]; textSymbolObj ts = {0}; int needLabelPoly = MS_TRUE; int needLabelPoint = MS_TRUE; int haveLabelText = MS_TRUE; if (!string || !*string) haveLabelText = MS_FALSE; if (haveLabelText) { initTextSymbol(&ts); msPopulateTextSymbolForLabelAndString(&ts, label, string, scalefactor, image->resolutionfactor, 0); if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, &ts))) { freeTextSymbol(&ts); return MS_FAILURE; } } labelPoly.line = &labelPolyLine; /* setup the label polygon structure */ labelPoly.numlines = 1; lbounds.poly = &labelPolyLine; /* setup the label polygon structure */ labelPoly.line->point = labelPolyPoints; labelPoly.line->numpoints = 5; if (label->position != MS_XY) { pointObj p = {0}; if (label->numstyles > 0) { int i; for (i = 0; i < label->numstyles; i++) { if (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT || label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_NONE) { if (MS_UNLIKELY(MS_FAILURE == msDrawMarkerSymbol(map, image, &labelPnt, label->styles[i], scalefactor))) { if (haveLabelText) freeTextSymbol(&ts); return MS_FAILURE; } } else if (haveLabelText && (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY || label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELCENTER)) { if (needLabelPoly) { p = get_metrics(&labelPnt, label->position, ts.textpath, label->offsetx * ts.scalefactor, label->offsety * ts.scalefactor, ts.rotation, 1, &lbounds); if (!lbounds.poly) { /* we need the full shape to draw the label background */ labelPolyPoints[0].x = labelPolyPoints[4].x = lbounds.bbox.minx; labelPolyPoints[0].y = labelPolyPoints[4].y = lbounds.bbox.miny; labelPolyPoints[1].x = lbounds.bbox.minx; labelPolyPoints[1].y = lbounds.bbox.maxy; labelPolyPoints[2].x = lbounds.bbox.maxx; labelPolyPoints[2].y = lbounds.bbox.maxy; labelPolyPoints[3].x = lbounds.bbox.maxx; labelPolyPoints[3].y = lbounds.bbox.miny; } needLabelPoint = MS_FALSE; /* don't re-compute */ needLabelPoly = MS_FALSE; } if (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY) { if (MS_UNLIKELY(MS_FAILURE == msDrawShadeSymbol(map, image, &labelPoly, label->styles[i], ts.scalefactor))) { freeTextSymbol(&ts); return MS_FAILURE; } } else { pointObj labelCenter; labelCenter.x = (lbounds.bbox.maxx + lbounds.bbox.minx) / 2; labelCenter.y = (lbounds.bbox.maxy + lbounds.bbox.miny) / 2; if (MS_UNLIKELY(MS_FAILURE == msDrawMarkerSymbol( map, image, &labelCenter, label->styles[i], scalefactor))) { freeTextSymbol(&ts); return MS_FAILURE; } } } else { msSetError(MS_MISCERR, "Unknown label geomtransform %s", "msDrawLabel()", label->styles[i]->_geomtransform.string); if (haveLabelText) freeTextSymbol(&ts); return MS_FAILURE; } } } if (haveLabelText) { if (needLabelPoint) p = get_metrics(&labelPnt, label->position, ts.textpath, label->offsetx * ts.scalefactor, label->offsety * ts.scalefactor, ts.rotation, 0, &lbounds); /* draw the label text */ if (MS_UNLIKELY(MS_FAILURE == msDrawTextSymbol(map, image, p, &ts))) { freeTextSymbol(&ts); return MS_FAILURE; } } } else { labelPnt.x += label->offsetx * ts.scalefactor; labelPnt.y += label->offsety * ts.scalefactor; if (label->numstyles > 0) { int i; for (i = 0; i < label->numstyles; i++) { if (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT || label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_NONE) { if (MS_UNLIKELY(MS_FAILURE == msDrawMarkerSymbol(map, image, &labelPnt, label->styles[i], scalefactor))) { freeTextSymbol(&ts); return MS_FAILURE; } } else if (haveLabelText && (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY || label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELCENTER)) { if (needLabelPoly) { get_metrics(&labelPnt, label->position, ts.textpath, label->offsetx * ts.scalefactor, label->offsety * ts.scalefactor, ts.rotation, 1, &lbounds); needLabelPoly = MS_FALSE; /* don't re-compute */ if (!lbounds.poly) { /* we need the full shape to draw the label background */ labelPolyPoints[0].x = labelPolyPoints[4].x = lbounds.bbox.minx; labelPolyPoints[0].y = labelPolyPoints[4].y = lbounds.bbox.miny; labelPolyPoints[1].x = lbounds.bbox.minx; labelPolyPoints[1].y = lbounds.bbox.maxy; labelPolyPoints[2].x = lbounds.bbox.maxx; labelPolyPoints[2].y = lbounds.bbox.maxy; labelPolyPoints[3].x = lbounds.bbox.maxx; labelPolyPoints[3].y = lbounds.bbox.miny; } } if (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY) { if (MS_UNLIKELY(MS_FAILURE == msDrawShadeSymbol(map, image, &labelPoly, label->styles[i], scalefactor))) { freeTextSymbol(&ts); return MS_FAILURE; } } else { pointObj labelCenter; labelCenter.x = (lbounds.bbox.maxx + lbounds.bbox.minx) / 2; labelCenter.y = (lbounds.bbox.maxy + lbounds.bbox.miny) / 2; if (MS_UNLIKELY(MS_FAILURE == msDrawMarkerSymbol( map, image, &labelCenter, label->styles[i], scalefactor))) { freeTextSymbol(&ts); return MS_FAILURE; } } } else { msSetError(MS_MISCERR, "Unknown label geomtransform %s", "msDrawLabel()", label->styles[i]->_geomtransform.string); if (haveLabelText) freeTextSymbol(&ts); return MS_FAILURE; } } } if (haveLabelText) { /* draw the label text */ if (MS_UNLIKELY(MS_FAILURE == msDrawTextSymbol(map, image, labelPnt, &ts))) { freeTextSymbol(&ts); return MS_FAILURE; } } } if (haveLabelText) freeTextSymbol(&ts); return MS_SUCCESS; } static inline void offset_bbox(const rectObj *from, rectObj *to, double ox, double oy) { to->minx = from->minx + ox; to->miny = from->miny + oy; to->maxx = from->maxx + ox; to->maxy = from->maxy + oy; } static inline void offset_label_bounds(const label_bounds *from, label_bounds *to, double ox, double oy) { if (from->poly) { int i; for (i = 0; i < from->poly->numpoints; i++) { to->poly->point[i].x = from->poly->point[i].x + ox; to->poly->point[i].y = from->poly->point[i].y + oy; } to->poly->numpoints = from->poly->numpoints; } else { to->poly = NULL; } offset_bbox(&from->bbox, &to->bbox, ox, oy); } /* private shortcut function to try a leader offsetted label * the caller must ensure that scratch->poly->points has been sufficiently * allocated to hold the points from the cachePtr's label_bounds */ void offsetAndTest(mapObj *map, labelCacheMemberObj *cachePtr, double ox, double oy, int priority, int label_idx, label_bounds *scratch) { int i, j, status; pointObj leaderpt; lineObj *scratch_line = scratch->poly; for (i = 0; i < cachePtr->numtextsymbols; i++) { textSymbolObj *ts = cachePtr->textsymbols[i]; if (ts->textpath) { offset_label_bounds(&ts->textpath->bounds, scratch, ox, oy); status = msTestLabelCacheCollisions(map, cachePtr, scratch, priority, label_idx); if (!status) { return; } } for (j = 0; j < ts->label->numstyles; j++) { if (ts->label->styles[j]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { scratch->poly = scratch_line; offset_label_bounds(ts->style_bounds[j], scratch, ox, oy); status = msTestLabelCacheCollisions(map, cachePtr, scratch, priority, label_idx); if (!status) { return; } } } } leaderpt.x = cachePtr->point.x + ox; leaderpt.y = cachePtr->point.y + oy; leaderpt.z = 0; leaderpt.m = 0; status = msTestLabelCacheLeaderCollision(map, &cachePtr->point, &leaderpt); if (!status) { return; } /* the current offset is ok */ cachePtr->leaderbbox = msSmallMalloc(sizeof(rectObj)); cachePtr->leaderline = msSmallMalloc(sizeof(lineObj)); cachePtr->leaderline->point = msSmallMalloc(2 * sizeof(pointObj)); cachePtr->leaderline->numpoints = 2; cachePtr->leaderline->point[0] = cachePtr->point; cachePtr->leaderline->point[1] = leaderpt; cachePtr->leaderbbox->minx = MS_MIN(leaderpt.x, cachePtr->point.x); cachePtr->leaderbbox->maxx = MS_MAX(leaderpt.x, cachePtr->point.x); cachePtr->leaderbbox->miny = MS_MIN(leaderpt.y, cachePtr->point.y); cachePtr->leaderbbox->maxy = MS_MAX(leaderpt.y, cachePtr->point.y); cachePtr->status = MS_ON; offset_bbox(&cachePtr->bbox, &cachePtr->bbox, ox, oy); for (i = 0; i < cachePtr->numtextsymbols; i++) { textSymbolObj *ts = cachePtr->textsymbols[i]; if (ts->textpath) { offset_label_bounds(&ts->textpath->bounds, &ts->textpath->bounds, ox, oy); ts->annopoint.x += ox; ts->annopoint.y += oy; } if (ts->style_bounds) { for (j = 0; j < ts->label->numstyles; j++) { if (ts->label->styles[j]->_geomtransform.type != MS_GEOMTRANSFORM_NONE) offset_label_bounds(ts->style_bounds[j], ts->style_bounds[j], ox, oy); } } } } int msDrawOffsettedLabels(imageObj *image, mapObj *map, int priority) { int retval = MS_SUCCESS; int l; labelCacheObj *labelcache = &(map->labelcache); labelCacheSlotObj *cacheslot; labelCacheMemberObj *cachePtr; label_bounds scratch; lineObj scratch_line; pointObj *scratch_points = NULL; int num_allocated_scratch_points = 0; assert(MS_RENDERER_PLUGIN(image->format)); cacheslot = &(labelcache->slots[priority]); scratch.poly = &scratch_line; for (l = cacheslot->numlabels - 1; l >= 0; l--) { cachePtr = &(cacheslot->labels[l]); /* point to right spot in the label cache */ if (cachePtr->status == MS_OFF) { /* only test regular labels that have had their bounding box computed and that haven't been rendered */ classObj *classPtr = (GET_CLASS(map, cachePtr->layerindex, cachePtr->classindex)); layerObj *layerPtr = (GET_LAYER(map, cachePtr->layerindex)); int steps, i, num_scratch_points_to_allocate = 0; assert(classPtr->leader); /* cachePtrs that don't need to be tested have been marked as status on or delete */ if (cachePtr->point.x < labelcache->gutter || cachePtr->point.y < labelcache->gutter || cachePtr->point.x >= image->width - labelcache->gutter || cachePtr->point.y >= image->height - labelcache->gutter) { /* don't look for leaders if point is in edge buffer as the leader line * would end up chopped off */ continue; } for (i = 0; i < cachePtr->numtextsymbols; i++) { int j; textSymbolObj *ts = cachePtr->textsymbols[i]; if (ts->textpath && ts->textpath->bounds.poly) { num_scratch_points_to_allocate = MS_MAX(num_scratch_points_to_allocate, ts->textpath->bounds.poly->numpoints); } if (ts->style_bounds) { for (j = 0; j < ts->label->numstyles; j++) { if (ts->label->styles[j]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT && ts->style_bounds[j]->poly) { num_scratch_points_to_allocate = MS_MAX(num_scratch_points_to_allocate, ts->style_bounds[j]->poly->numpoints); } } } } if (num_scratch_points_to_allocate > num_allocated_scratch_points) { scratch_points = msSmallRealloc( scratch_points, num_scratch_points_to_allocate * sizeof(pointObj)); num_allocated_scratch_points = num_scratch_points_to_allocate; } steps = classPtr->leader->maxdistance / classPtr->leader->gridstep; #define x0 (cachePtr->point.x) #define y0 (cachePtr->point.y) #define gridstepsc (classPtr->leader->gridstep) #define otest(ox, oy) \ if ((x0 + (ox)) >= labelcache->gutter && \ (y0 + (oy)) >= labelcache->gutter && \ (x0 + (ox)) < image->width - labelcache->gutter && \ (y0 + (oy)) < image->height - labelcache->gutter) { \ scratch_line.point = scratch_points; \ scratch.poly = &scratch_line; \ offsetAndTest(map, cachePtr, (ox), (oy), priority, l, &scratch); \ if (cachePtr->status == MS_ON) \ break; \ } /* loop through possible offsetted positions */ for (i = 1; i <= steps; i++) { /* test the intermediate points on the ring */ /* (points marked "0" are the ones being tested) X00X00X 0XXXXX0 0XXXXX0 XXX.XXX 0XXXXX0 0XXXXX0 X00X00X */ int j; for (j = 1; j < i - 1; j++) { /* test the right positions */ otest(i * gridstepsc, j * gridstepsc); otest(i * gridstepsc, -j * gridstepsc); /* test the left positions */ otest(-i * gridstepsc, j * gridstepsc); otest(-i * gridstepsc, -j * gridstepsc); /* test the top positions */ otest(j * gridstepsc, -i * gridstepsc); otest(-j * gridstepsc, -i * gridstepsc); /* test the bottom positions */ otest(j * gridstepsc, i * gridstepsc); otest(-j * gridstepsc, i * gridstepsc); } if (j < (i - 1)) break; otest(i * gridstepsc, i * gridstepsc); otest(-i * gridstepsc, -i * gridstepsc); otest(i * gridstepsc, -i * gridstepsc); otest(-i * gridstepsc, i * gridstepsc); /* test the intermediate points on the ring */ /* (points marked "0" are the ones being tested) X00X00X 0XXXXX0 0XXXXX0 XXX.XXX 0XXXXX0 0XXXXX0 X00X00X */ /* test the extreme diagonal points */ /* (points marked "0" are the ones being tested) 0XXXXX0 XXXXXXX XXXXXXX XXX.XXX XXXXXXX XXXXXXX 0XXXXX0 (x0+i*gridstep, y0+i*gridstep), pos lr (x0-i*gridstep, y0-i*gridstep), pos ul (x0+i*gridstep, y0-i*gridstep), pos ur (x0-i*gridstep, y0+i*gridstep), pos ll */ /* test the 4 cardinal points on the ring */ /* (points marked "0" are the ones being tested) XXX0XXX XXXXXXX XXXXXXX 0XX.XX0 XXXXXXX XXXXXXX XXX0XXX * (x0+i*gridtep,y0), pos cr * (x0-i*gridstep,y0), pos cl * (x0,y0-i*gridstep), pos uc * (x0,y0+i*gridstep), pos lc */ otest(i * gridstepsc, 0); otest(-i * gridstepsc, 0); otest(0, -i * gridstepsc); otest(0, i * gridstepsc); } if (cachePtr->status == MS_ON) { int ll; shapeObj labelLeader; /* label polygon (bounding box, possibly rotated) */ labelLeader.line = cachePtr->leaderline; /* setup the label polygon structure */ labelLeader.numlines = 1; insertRenderedLabelMember(map, cachePtr); for (ll = 0; ll < classPtr->leader->numstyles; ll++) { retval = msDrawLineSymbol(map, image, &labelLeader, classPtr->leader->styles[ll], layerPtr->scalefactor); if (MS_UNLIKELY(retval == MS_FAILURE)) { goto offset_cleanup; } } for (ll = 0; ll < cachePtr->numtextsymbols; ll++) { textSymbolObj *ts = cachePtr->textsymbols[ll]; if (ts->style_bounds) { /* here's where we draw the label styles */ for (i = 0; i < ts->label->numstyles; i++) { if (ts->label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { retval = msDrawMarkerSymbol( map, image, &(labelLeader.line->point[1]), ts->label->styles[i], layerPtr->scalefactor); if (MS_UNLIKELY(retval == MS_FAILURE)) { goto offset_cleanup; } } else if (ts->label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY) { retval = msDrawLabelBounds(map, image, ts->style_bounds[i], ts->label->styles[i], ts->scalefactor); if (MS_UNLIKELY(retval == MS_FAILURE)) { goto offset_cleanup; } } else if (ts->label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELCENTER) { pointObj labelCenter; labelCenter.x = (ts->style_bounds[i]->bbox.maxx + ts->style_bounds[i]->bbox.minx) / 2; labelCenter.y = (ts->style_bounds[i]->bbox.maxy + ts->style_bounds[i]->bbox.miny) / 2; retval = msDrawMarkerSymbol(map, image, &labelCenter, ts->label->styles[i], layerPtr->scalefactor); if (MS_UNLIKELY(retval == MS_FAILURE)) { goto offset_cleanup; } } else { msSetError(MS_MISCERR, "Labels only support LABELPNT, LABELPOLY and " "LABELCENTER GEOMTRANSFORMS", "msDrawOffsettedLabels()"); retval = MS_FAILURE; } } } if (ts->annotext) { retval = msDrawTextSymbol(map, image, ts->annopoint, ts); if (MS_UNLIKELY(retval == MS_FAILURE)) { goto offset_cleanup; } } } /* TODO: draw cachePtr->marker, but where ? */ /* styleObj tstyle; static int foo =0; if(!foo) { srand(time(NULL)); foo = 1; initStyle(&tstyle); tstyle.width = 1; tstyle.color.alpha = 255; } tstyle.color.red = random()%255; tstyle.color.green = random()%255; tstyle.color.blue =random()%255; msDrawLineSymbol(&map->symbolset, image, cachePtr->poly, &tstyle, layerPtr->scalefactor); */ } } } offset_cleanup: free(scratch_points); return retval; } void fastComputeBounds(lineObj *line, rectObj *bounds) { int j; bounds->minx = bounds->maxx = line->point[0].x; bounds->miny = bounds->maxy = line->point[0].y; for (j = 0; j < line->numpoints; j++) { bounds->minx = MS_MIN(bounds->minx, line->point[j].x); bounds->maxx = MS_MAX(bounds->maxx, line->point[j].x); bounds->miny = MS_MIN(bounds->miny, line->point[j].y); bounds->maxy = MS_MAX(bounds->maxy, line->point[j].y); } } int computeMarkerBounds(mapObj *map, pointObj *annopoint, textSymbolObj *ts, label_bounds *poly) { int i; for (i = 0; i < ts->label->numstyles; i++) { styleObj *style = ts->label->styles[i]; if (style->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT && style->symbol < map->symbolset.numsymbols && style->symbol >= 0) { double sx, sy; int p; double aox, aoy; symbolObj *symbol = map->symbolset.symbol[style->symbol]; if (msGetMarkerSize(map, style, &sx, &sy, ts->scalefactor) != MS_SUCCESS) return -1; /* real error, different from MS_FALSE, return -1 so we can trap it */ if (style->angle) { pointObj *point = poly->poly->point; point[0].x = sx / 2.0; point[0].y = sy / 2.0; point[1].x = point[0].x; point[1].y = -point[0].y; point[2].x = -point[0].x; point[2].y = -point[0].y; point[3].x = -point[0].x; point[3].y = point[0].y; point[4].x = point[0].x; point[4].y = point[0].y; if (symbol->anchorpoint_x != 0.5 || symbol->anchorpoint_y != 0.5) { aox = (0.5 - symbol->anchorpoint_x) * sx; aoy = (0.5 - symbol->anchorpoint_y) * sy; for (p = 0; p < 5; p++) { point[p].x += aox; point[p].y += aoy; } } { double rot = -style->angle * MS_DEG_TO_RAD; double sina = sin(rot); double cosa = cos(rot); for (p = 0; p < 5; p++) { double tmpx = point[p].x; point[p].x = point[p].x * cosa - point[p].y * sina; point[p].y = tmpx * sina + point[p].y * cosa; } } aox = annopoint->x + style->offsetx * ts->scalefactor; aoy = annopoint->y + style->offsety * ts->scalefactor; for (p = 0; p < 5; p++) { point[p].x += aox; point[p].y += aoy; } fastComputeBounds(poly->poly, &poly->bbox); } else { double aox = (0.5 - symbol->anchorpoint_x) * sx + annopoint->x + style->offsetx * ts->scalefactor; double aoy = (0.5 - symbol->anchorpoint_y) * sy + annopoint->y + style->offsety * ts->scalefactor; poly->poly = NULL; poly->bbox.maxx = sx / 2.0 + aox; poly->bbox.minx = -sx / 2.0 + aox; poly->bbox.maxy = sy / 2.0 + aoy; poly->bbox.miny = -sy / 2.0 + aoy; } break; } } if (i == ts->label->numstyles) return MS_FALSE; /* the label has no marker styles */ else return MS_TRUE; } /* check that the current entry does not fall close to a label with identical * text, if configured so. Currently only checks the first label/text */ int msCheckLabelMinDistance(mapObj *map, labelCacheMemberObj *lc) { int i; textSymbolObj *s; /* shortcut */ textSymbolObj *ts; rectObj buffered; if (lc->numtextsymbols == 0) return MS_FALSE; /* no label with text */ s = lc->textsymbols[0]; if (!s->annotext || s->label->mindistance <= 0.0 || s->label->force == MS_TRUE) return MS_FALSE; /* min distance is not checked */ /* we buffer the label and check for intersection instead of calculating the distance of two textpaths. we also buffer only the bbox of lc for faster computation (it is still compared to the full textpath of the label cache members). */ buffered = lc->bbox; buffered.minx -= s->label->mindistance * s->resolutionfactor; buffered.miny -= s->label->mindistance * s->resolutionfactor; buffered.maxx += s->label->mindistance * s->resolutionfactor; buffered.maxy += s->label->mindistance * s->resolutionfactor; for (i = 0; i < map->labelcache.num_rendered_members; i++) { labelCacheMemberObj *ilc = map->labelcache.rendered_text_symbols[i]; if (ilc->numtextsymbols == 0 || !ilc->textsymbols[0]->annotext) continue; ts = ilc->textsymbols[0]; if (strcmp(s->annotext, ts->annotext) != 0) { /* only check min distance against same label */ continue; } if (msPointInRect(&ilc->point, &buffered) == MS_TRUE) { return MS_TRUE; } if (ts->textpath && ts->textpath->absolute) { if (intersectLabelPolygons(ts->textpath->bounds.poly, &ilc->bbox, NULL, &buffered) == MS_TRUE) { return MS_TRUE; } continue; } if (intersectLabelPolygons(NULL, &ilc->bbox, NULL, &buffered) == MS_TRUE) { return MS_TRUE; } } return MS_FALSE; } void copyLabelBounds(label_bounds *dst, label_bounds *src) { *dst = *src; if (src->poly) { int i; dst->poly = msSmallMalloc(sizeof(lineObj)); dst->poly->numpoints = src->poly->numpoints; dst->poly->point = msSmallMalloc(dst->poly->numpoints * sizeof(pointObj)); for (i = 0; i < dst->poly->numpoints; i++) { dst->poly->point[i] = src->poly->point[i]; } } } static int getLabelPositionFromString(char *pszString) { if (strcasecmp(pszString, "UL") == 0) return MS_UL; else if (strcasecmp(pszString, "LR") == 0) return MS_LR; else if (strcasecmp(pszString, "UR") == 0) return MS_UR; else if (strcasecmp(pszString, "LL") == 0) return MS_LL; else if (strcasecmp(pszString, "CR") == 0) return MS_CR; else if (strcasecmp(pszString, "CL") == 0) return MS_CL; else if (strcasecmp(pszString, "UC") == 0) return MS_UC; else if (strcasecmp(pszString, "LC") == 0) return MS_LC; else return MS_CC; } int msDrawLabelCache(mapObj *map, imageObj *image) { int nReturnVal = MS_SUCCESS; struct mstimeval starttime = {0}, endtime = {0}; if (map->debug >= MS_DEBUGLEVEL_TUNING) msGettimeofday(&starttime, NULL); if (image) { if (MS_RENDERER_PLUGIN(image->format)) { int i, l, ll, priority, its; double marker_offset_x, marker_offset_y; int label_offset_x, label_offset_y; const char *value; labelCacheMemberObj *cachePtr = NULL; layerObj *layerPtr = NULL; classObj *classPtr = NULL; textSymbolObj *textSymbolPtr = NULL; /* * some statically allocated containers for storing label bounds before * copying them into the cachePtr: we avoid allocating these structures * at runtime, except for the labels that are actually rendered. */ lineObj labelpoly_line; pointObj labelpoly_points[5]; label_bounds labelpoly_bounds = {0}; lineObj label_marker_line; pointObj label_marker_points[5]; label_bounds label_marker_bounds; lineObj metrics_line; pointObj metrics_points[5]; label_bounds metrics_bounds; label_marker_line.point = label_marker_points; label_marker_line.numpoints = 5; metrics_line.point = metrics_points; metrics_line.numpoints = 5; labelpoly_line.point = labelpoly_points; labelpoly_line.numpoints = 5; /* Look for labelcache_map_edge_buffer map metadata * If set then the value defines a buffer (in pixels) along the edge of * the map image where labels can't fall */ if ((value = msLookupHashTable(&(map->web.metadata), "labelcache_map_edge_buffer")) != NULL) { map->labelcache.gutter = MS_ABS(atoi(value)); if (map->debug) msDebug("msDrawLabelCache(): labelcache_map_edge_buffer = %d\n", map->labelcache.gutter); } for (priority = MS_MAX_LABEL_PRIORITY - 1; priority >= 0; priority--) { labelCacheSlotObj *cacheslot; cacheslot = &(map->labelcache.slots[priority]); for (l = cacheslot->numlabels - 1; l >= 0; l--) { cachePtr = &(cacheslot ->labels[l]); /* point to right spot in the label cache */ layerPtr = (GET_LAYER( map, cachePtr->layerindex)); /* set a couple of other pointers, avoids nasty references */ classPtr = (GET_CLASS(map, cachePtr->layerindex, cachePtr->classindex)); if (cachePtr->textsymbols[0]->textpath && cachePtr->textsymbols[0]->textpath->absolute) { /* we have an angle follow label */ cachePtr->bbox = cachePtr->textsymbols[0]->textpath->bounds.bbox; /* before going any further, check that mindistance is respected */ if (cachePtr->numtextsymbols && cachePtr->textsymbols[0]->label->mindistance > 0.0 && cachePtr->textsymbols[0]->annotext) { if (msCheckLabelMinDistance(map, cachePtr) == MS_TRUE) { cachePtr->status = MS_DELETE; MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping labelgroup %d \"%s\" in layer \"%s\": too " "close to an identical label (mindistance)\n", l, cachePtr->textsymbols[0]->annotext, layerPtr->name); continue; /* move on to next entry, this one is too close to an already placed one */ } } if (!cachePtr->textsymbols[0]->label->force) cachePtr->status = msTestLabelCacheCollisions( map, cachePtr, &cachePtr->textsymbols[0]->textpath->bounds, priority, l); else cachePtr->status = MS_ON; if (cachePtr->status) { if (MS_UNLIKELY( MS_FAILURE == msDrawTextSymbol( map, image, cachePtr->textsymbols[0]->annopoint /*not used*/, cachePtr->textsymbols[0]))) { return MS_FAILURE; } insertRenderedLabelMember(map, cachePtr); } else { MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping follow labelgroup %d \"%s\" in layer \"%s\": " "text collided\n", l, cachePtr->textsymbols[0]->annotext, layerPtr->name); } cachePtr->status = MS_DELETE; /* we're done with this label, it won't even have a second chance in the leader phase */ } else { marker_offset_x = marker_offset_y = 0; /* assume no marker */ if (layerPtr->type == MS_LAYER_POINT && cachePtr->markerid != -1) { /* there is a marker already in the image that we need to account for */ markerCacheMemberObj *markerPtr = &( cacheslot ->markers[cachePtr->markerid]); /* point to the right spot in the marker cache*/ marker_offset_x = (markerPtr->bounds.maxx - markerPtr->bounds.minx) / 2.0; marker_offset_y = (markerPtr->bounds.maxy - markerPtr->bounds.miny) / 2.0; } /* ** all other cases *could* have multiple labels defined */ cachePtr->status = MS_ON; /* assume this cache element can be placed */ for (ll = 0; ll < cachePtr->numtextsymbols; ll++) { /* RFC 77 TODO: Still may want to step through backwards... */ int label_marker_status = MS_ON, have_label_marker, metrics_status = MS_ON; int need_labelpoly = 0; /* reset the lineObj which may have been unset by a previous call * to get_metrics() */ label_marker_bounds.poly = &label_marker_line; labelpoly_bounds.poly = &labelpoly_line; textSymbolPtr = cachePtr->textsymbols[ll]; for (i = 0; i < textSymbolPtr->label->numstyles; i++) { if (textSymbolPtr->label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY || textSymbolPtr->label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELCENTER) { need_labelpoly = 1; break; } } /* compute the poly of the label styles */ if ((have_label_marker = computeMarkerBounds(map, &cachePtr->point, textSymbolPtr, &label_marker_bounds)) == MS_TRUE) { if (cachePtr->numtextsymbols > 1) { /* FIXME this test doesn't seem right, should probably check if we have an annotation layer with a regular style defined */ marker_offset_x = (label_marker_bounds.bbox.maxx - label_marker_bounds.bbox.minx) / 2.0; marker_offset_y = (label_marker_bounds.bbox.maxy - label_marker_bounds.bbox.miny) / 2.0; } else { /* we might be using an old style behavior with a markerPtr */ marker_offset_x = MS_MAX(marker_offset_x, (label_marker_bounds.bbox.maxx - label_marker_bounds.bbox.minx) / 2.0); marker_offset_y = MS_MAX(marker_offset_y, (label_marker_bounds.bbox.maxy - label_marker_bounds.bbox.miny) / 2.0); } /* add marker to cachePtr->poly */ if (textSymbolPtr->label->force != MS_TRUE) { label_marker_status = msTestLabelCacheCollisions( map, cachePtr, &label_marker_bounds, priority, l); } if (label_marker_status == MS_OFF && !(textSymbolPtr->label->force == MS_ON || classPtr->leader)) { cachePtr->status = MS_DELETE; MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping label %d of labelgroup %d of class %d in " "layer \"%s\": marker collided\n", ll, l, cachePtr->classindex, layerPtr->name); break; /* the marker collided, break from multi-label loop */ } } if (have_label_marker == -1) return MS_FAILURE; /* error occurred (symbol not found, etc...) */ if (textSymbolPtr->annotext) { /* * if we don't have an offset defined, first check that the * labelpoint itself does not collide this helps speed things up * in dense labeling, as if the labelpoint collides there's no * use in computing the labeltext bounds (i.e. going into * shaping+freetype). We do however skip collision testing * against the marker cache, as we want to allow rendering a * label for points that overlap each other: this is done by * setting priority to MAX_PRIORITY in the call to * msTestLabelCacheCollisions (which is a hack!!) */ if (!have_label_marker && textSymbolPtr->label->force != MS_TRUE && !classPtr->leader && !textSymbolPtr->label->offsetx && !textSymbolPtr->label->offsety) { label_bounds labelpoint_bounds; labelpoint_bounds.poly = NULL; labelpoint_bounds.bbox.minx = cachePtr->point.x - 0.1; labelpoint_bounds.bbox.maxx = cachePtr->point.x + 0.1; labelpoint_bounds.bbox.miny = cachePtr->point.y - 0.1; labelpoint_bounds.bbox.maxy = cachePtr->point.y + 0.1; if (MS_OFF == msTestLabelCacheCollisions( map, cachePtr, &labelpoint_bounds, MS_MAX_LABEL_PRIORITY, l)) { cachePtr->status = MS_DELETE; /* we won't check for leader offsetted positions, as the anchor point colided */ MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping label %d \"%s\" of labelgroup %d of " "class %d in layer \"%s\": labelpoint collided\n", ll, textSymbolPtr->annotext, l, cachePtr->classindex, layerPtr->name); break; } } /* compute label size */ if (!textSymbolPtr->textpath) { if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, textSymbolPtr))) { return MS_FAILURE; } } /* if our label has an outline, adjust the marker offset so the * outlinecolor does not bleed into the marker */ if (marker_offset_x && MS_VALID_COLOR(textSymbolPtr->label->outlinecolor)) { marker_offset_x += textSymbolPtr->label->outlinewidth / 2.0 * textSymbolPtr->scalefactor; marker_offset_y += textSymbolPtr->label->outlinewidth / 2.0 * textSymbolPtr->scalefactor; } /* apply offset and buffer settings */ if (textSymbolPtr->label->anglemode != MS_FOLLOW) { label_offset_x = textSymbolPtr->label->offsetx * textSymbolPtr->scalefactor; label_offset_y = textSymbolPtr->label->offsety * textSymbolPtr->scalefactor; } else { label_offset_x = 0; label_offset_y = 0; } if (textSymbolPtr->label->position == MS_AUTO) { /* no point in using auto positioning if the marker cannot be * placed */ int positions[MS_POSITIONS_LENGTH], npositions = 0; /* ** (Note: might be able to re-order this for more speed.) */ if (msLayerGetProcessingKey(layerPtr, "LABEL_POSITIONS")) { int p, ncustom_positions = 0; char **custom_positions = msStringSplitComplex( msLayerGetProcessingKey(layerPtr, "LABEL_POSITIONS"), ",", &ncustom_positions, MS_STRIPLEADSPACES | MS_STRIPENDSPACES); for (p = 0; p < MS_MIN(9, ncustom_positions); p++) positions[p] = getLabelPositionFromString(custom_positions[p]); npositions = p; msFree(custom_positions); } else if (layerPtr->type == MS_LAYER_POLYGON && marker_offset_x == 0) { positions[0] = MS_CC; positions[1] = MS_UC; positions[2] = MS_LC; positions[3] = MS_CL; positions[4] = MS_CR; npositions = 5; } else if (layerPtr->type == MS_LAYER_LINE && marker_offset_x == 0) { positions[0] = MS_UC; positions[1] = MS_LC; positions[2] = MS_CC; npositions = 3; } else { positions[0] = MS_UL; positions[1] = MS_LR; positions[2] = MS_UR; positions[3] = MS_LL; positions[4] = MS_CR; positions[5] = MS_CL; positions[6] = MS_UC; positions[7] = MS_LC; npositions = 8; } for (i = 0; i < npositions; i++) { // RFC 77 TODO: take label_marker_offset_x/y into account metrics_bounds.poly = &metrics_line; textSymbolPtr->annopoint = get_metrics(&(cachePtr->point), positions[i], textSymbolPtr->textpath, marker_offset_x + label_offset_x, marker_offset_y + label_offset_y, textSymbolPtr->rotation, textSymbolPtr->label->buffer * textSymbolPtr->scalefactor, &metrics_bounds); if (textSymbolPtr->label->force == MS_OFF) { for (its = 0; its < ll; its++) { /* check for collisions inside the label group */ if (intersectTextSymbol(cachePtr->textsymbols[its], &metrics_bounds) == MS_TRUE) { /* there was a self intersection */ break; /* next position, will break out to next position in containing loop*/ } if (its != ll) continue; /* goto next position, this one had an intersection with our own label group */ } } metrics_status = msTestLabelCacheCollisions( map, cachePtr, &metrics_bounds, priority, l); /* found a suitable place for this label */ if (metrics_status == MS_TRUE || (i == (npositions - 1) && textSymbolPtr->label->force == MS_ON)) { metrics_status = MS_TRUE; /* set to true in case we are forcing it */ /* compute anno poly for label background if needed */ if (need_labelpoly) get_metrics(&(cachePtr->point), positions[i], textSymbolPtr->textpath, marker_offset_x + label_offset_x, marker_offset_y + label_offset_y, textSymbolPtr->rotation, 1, &labelpoly_bounds); break; /* ...out of position loop */ } } /* next position */ /* if position auto didn't manage to find a position, but we * have leader configured for the class, then we want to * compute the label poly anyway, placed as MS_CC */ if (classPtr->leader && metrics_status == MS_FALSE) { metrics_bounds.poly = &metrics_line; textSymbolPtr->annopoint = get_metrics( &(cachePtr->point), MS_CC, textSymbolPtr->textpath, label_offset_x, label_offset_y, textSymbolPtr->rotation, textSymbolPtr->label->buffer * textSymbolPtr->scalefactor, &metrics_bounds); if (need_labelpoly) get_metrics(&(cachePtr->point), MS_CC, textSymbolPtr->textpath, label_offset_x, label_offset_y, textSymbolPtr->rotation, 1, &labelpoly_bounds); } } else { /* explicit position */ if (textSymbolPtr->label->position == MS_CC) { /* don't need the marker_offset */ metrics_bounds.poly = &metrics_line; textSymbolPtr->annopoint = get_metrics( &(cachePtr->point), MS_CC, textSymbolPtr->textpath, label_offset_x, label_offset_y, textSymbolPtr->rotation, textSymbolPtr->label->buffer * textSymbolPtr->scalefactor, &metrics_bounds); if (need_labelpoly) get_metrics(&(cachePtr->point), MS_CC, textSymbolPtr->textpath, label_offset_x, label_offset_y, textSymbolPtr->rotation, 1, &labelpoly_bounds); } else { metrics_bounds.poly = &metrics_line; textSymbolPtr->annopoint = get_metrics( &(cachePtr->point), textSymbolPtr->label->position, textSymbolPtr->textpath, marker_offset_x + label_offset_x, marker_offset_y + label_offset_y, textSymbolPtr->rotation, textSymbolPtr->label->buffer * textSymbolPtr->scalefactor, &metrics_bounds); if (need_labelpoly) get_metrics( &(cachePtr->point), textSymbolPtr->label->position, textSymbolPtr->textpath, marker_offset_x + label_offset_x, marker_offset_y + label_offset_y, textSymbolPtr->rotation, 1, &labelpoly_bounds); } if (textSymbolPtr->label->force == MS_ON) { metrics_status = MS_ON; } else { if (textSymbolPtr->label->force == MS_OFF) { /* check for collisions inside the label group unless the * label is FORCE GROUP */ for (its = 0; its < ll; its++) { /* check for collisions inside the label group */ if (intersectTextSymbol(cachePtr->textsymbols[its], &metrics_bounds) == MS_TRUE) { /* there was a self intersection */ break; /* will break out to next position in containing loop*/ } if (its != ll) { cachePtr->status = MS_DELETE; /* TODO RFC98: check if this is correct */ MS_DEBUG( MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping label %d (\"%s\") of labelgroup %d of " "class %d in layer \"%s\": intercollision with " "label text inside labelgroup\n", ll, textSymbolPtr->annotext, l, cachePtr->classindex, layerPtr->name); break; /* collision within the group, break out of textSymbol loop */ } } } /* TODO: in case we have leader lines and multiple labels, * there's no use in testing for labelcache collisions once * a first collision has been found. we only need to know * that the label group has collided, and the poly of the * whole label group: if(label_group) * testLabelCacheCollisions */ metrics_status = msTestLabelCacheCollisions( map, cachePtr, &metrics_bounds, priority, l); } } /* end POSITION AUTO vs Fixed POSITION */ if (!metrics_status && classPtr->leader == 0) { cachePtr->status = MS_DELETE; MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping label %d \"%s\" of labelgroup %d of class " "%d in layer \"%s\": text collided\n", ll, textSymbolPtr->annotext, l, cachePtr->classindex, layerPtr->name); break; /* no point looking at more labels, unless their is a leader defined */ } } /* if we're here, we can either fit the label directly, or we need * to put it in the leader queue */ assert((metrics_status && label_marker_status) || classPtr->leader); if (textSymbolPtr->annotext) { copyLabelBounds(&textSymbolPtr->textpath->bounds, &metrics_bounds); } if (have_label_marker) { if (!textSymbolPtr->style_bounds) textSymbolPtr->style_bounds = msSmallCalloc( textSymbolPtr->label->numstyles, sizeof(label_bounds *)); for (its = 0; its < textSymbolPtr->label->numstyles; its++) { if (textSymbolPtr->label->styles[its]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { textSymbolPtr->style_bounds[its] = msSmallMalloc(sizeof(label_bounds)); copyLabelBounds(textSymbolPtr->style_bounds[its], &label_marker_bounds); } } } if (!label_marker_status || !metrics_status) { MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Putting label %d of labelgroup %d of class %d , " "layer \"%s\" in leader queue\n", ll, l, cachePtr->classindex, layerPtr->name); cachePtr->status = MS_OFF; /* we have a collision, but this entry is a candidate for leader testing */ } /* do we need to copy the labelpoly, or can we use the static one * ?*/ if (cachePtr->numtextsymbols > 1 || (cachePtr->status == MS_OFF && classPtr->leader)) { /* * if we have more than one label, or if we have a single one * which didn't fit but needs to go through leader offset * testing */ if (!textSymbolPtr->style_bounds) textSymbolPtr->style_bounds = msSmallCalloc( textSymbolPtr->label->numstyles, sizeof(label_bounds *)); for (its = 0; its < textSymbolPtr->label->numstyles; its++) { if (textSymbolPtr->label->styles[its]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY || textSymbolPtr->label->styles[its]->_geomtransform.type == MS_GEOMTRANSFORM_LABELCENTER) { textSymbolPtr->style_bounds[its] = msSmallMalloc(sizeof(label_bounds)); copyLabelBounds(textSymbolPtr->style_bounds[its], &labelpoly_bounds); } } } /* else: we'll use labelpoly_bounds directly below */ } /* next label in the group */ if (cachePtr->status != MS_DELETE) { /* compute the global label bbox */ int inited = 0, s; for (its = 0; its < cachePtr->numtextsymbols; its++) { if (cachePtr->textsymbols[its]->annotext) { if (inited == 0) { cachePtr->bbox = cachePtr->textsymbols[its]->textpath->bounds.bbox; inited = 1; } else { cachePtr->bbox.minx = MS_MIN( cachePtr->bbox.minx, cachePtr->textsymbols[its]->textpath->bounds.bbox.minx); cachePtr->bbox.miny = MS_MIN( cachePtr->bbox.miny, cachePtr->textsymbols[its]->textpath->bounds.bbox.miny); cachePtr->bbox.maxx = MS_MAX( cachePtr->bbox.maxx, cachePtr->textsymbols[its]->textpath->bounds.bbox.maxx); cachePtr->bbox.maxy = MS_MAX( cachePtr->bbox.maxy, cachePtr->textsymbols[its]->textpath->bounds.bbox.maxy); } } for (s = 0; s < cachePtr->textsymbols[its]->label->numstyles; s++) { if (cachePtr->textsymbols[its] ->label->styles[s] ->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { if (inited == 0) { cachePtr->bbox = cachePtr->textsymbols[its]->style_bounds[s]->bbox; inited = 1; break; } else { cachePtr->bbox.minx = MS_MIN(cachePtr->bbox.minx, cachePtr->textsymbols[its] ->style_bounds[s] ->bbox.minx); cachePtr->bbox.miny = MS_MIN(cachePtr->bbox.miny, cachePtr->textsymbols[its] ->style_bounds[s] ->bbox.miny); cachePtr->bbox.maxx = MS_MAX(cachePtr->bbox.maxx, cachePtr->textsymbols[its] ->style_bounds[s] ->bbox.maxx); cachePtr->bbox.maxy = MS_MAX(cachePtr->bbox.maxy, cachePtr->textsymbols[its] ->style_bounds[s] ->bbox.maxy); break; } } } } } /* check that mindistance is respected */ if (cachePtr->numtextsymbols && cachePtr->textsymbols[0]->label->mindistance > 0.0 && cachePtr->textsymbols[0]->annotext) { if (msCheckLabelMinDistance(map, cachePtr) == MS_TRUE) { cachePtr->status = MS_DELETE; MS_DEBUG(MS_DEBUGLEVEL_DEVDEBUG, map, "Skipping labelgroup %d \"%s\" in layer \"%s\": too " "close to an identical label (mindistance)\n", l, cachePtr->textsymbols[0]->annotext, layerPtr->name); } } if (cachePtr->status == MS_OFF || cachePtr->status == MS_DELETE) continue; /* next labelCacheMemberObj, as we had a collision */ /* insert the rendered label */ insertRenderedLabelMember(map, cachePtr); for (ll = 0; ll < cachePtr->numtextsymbols; ll++) { textSymbolPtr = cachePtr->textsymbols[ll]; /* here's where we draw the label styles */ for (i = 0; i < textSymbolPtr->label->numstyles; i++) { if (textSymbolPtr->label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { if (MS_UNLIKELY( MS_FAILURE == msDrawMarkerSymbol(map, image, &(cachePtr->point), textSymbolPtr->label->styles[i], textSymbolPtr->scalefactor))) { return MS_FAILURE; } } else if (textSymbolPtr->annotext && textSymbolPtr->label->styles[i] ->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY) { if (textSymbolPtr->style_bounds && textSymbolPtr->style_bounds[i]) { if (MS_UNLIKELY( MS_FAILURE == msDrawLabelBounds(map, image, textSymbolPtr->style_bounds[i], textSymbolPtr->label->styles[i], textSymbolPtr->scalefactor))) { return MS_FAILURE; } } else { if (MS_UNLIKELY( MS_FAILURE == msDrawLabelBounds(map, image, &labelpoly_bounds, textSymbolPtr->label->styles[i], textSymbolPtr->scalefactor))) { return MS_FAILURE; } } } else if (textSymbolPtr->annotext && textSymbolPtr->label->styles[i] ->_geomtransform.type == MS_GEOMTRANSFORM_LABELCENTER) { pointObj labelCenter; if (textSymbolPtr->style_bounds && textSymbolPtr->style_bounds[i]) { labelCenter.x = (textSymbolPtr->style_bounds[i]->bbox.maxx + textSymbolPtr->style_bounds[i]->bbox.minx) / 2; labelCenter.y = (textSymbolPtr->style_bounds[i]->bbox.maxy + textSymbolPtr->style_bounds[i]->bbox.miny) / 2; if (MS_UNLIKELY( MS_FAILURE == msDrawMarkerSymbol(map, image, &labelCenter, textSymbolPtr->label->styles[i], textSymbolPtr->scalefactor))) { return MS_FAILURE; } } else { labelCenter.x = (labelpoly_bounds.bbox.maxx + labelpoly_bounds.bbox.minx) / 2; labelCenter.y = (labelpoly_bounds.bbox.maxy + labelpoly_bounds.bbox.miny) / 2; if (MS_UNLIKELY( MS_FAILURE == msDrawMarkerSymbol(map, image, &labelCenter, textSymbolPtr->label->styles[i], textSymbolPtr->scalefactor))) { return MS_FAILURE; } } } else { msSetError(MS_MISCERR, "Labels only support LABELPNT, LABELPOLY and " "LABELCENTER GEOMTRANSFORMS", "msDrawLabelCache()"); return MS_FAILURE; } } if (textSymbolPtr->annotext) { if (MS_UNLIKELY(MS_FAILURE == msDrawTextSymbol(map, image, textSymbolPtr->annopoint, textSymbolPtr))) { return MS_FAILURE; } } } } } /* next label(group) from cacheslot */ if (MS_UNLIKELY(MS_FAILURE == msDrawOffsettedLabels(image, map, priority))) { return MS_FAILURE; } } /* next priority */ #ifdef TBDEBUG styleObj tstyle; initStyle(&tstyle); tstyle.width = 1; tstyle.color.alpha = 255; tstyle.color.red = 255; tstyle.color.green = 0; tstyle.color.blue = 0; for (priority = MS_MAX_LABEL_PRIORITY - 1; priority >= 0; priority--) { labelCacheSlotObj *cacheslot; cacheslot = &(map->labelcache.slots[priority]); for (l = cacheslot->numlabels - 1; l >= 0; l--) { cachePtr = &(cacheslot ->labels[l]); /* point to right spot in the label cache */ /* assert((cachePtr->poly == NULL && cachePtr->status == MS_OFF) || (cachePtr->poly && (cachePtr->status == MS_ON)); */ if (cachePtr->status) { msDrawLineSymbol(map, image, cachePtr->poly, &tstyle, layerPtr->scalefactor); } } } #endif nReturnVal = MS_SUCCESS; /* necessary? */ } } if (map->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&endtime, NULL); msDebug("msDrawMap(): Drawing Label Cache, %.3fs\n", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } return nReturnVal; } /** * Generic function to tell the underline device that layer * drawing is stating */ void msImageStartLayer(mapObj *map, layerObj *layer, imageObj *image) { if (image) { if (MS_RENDERER_PLUGIN(image->format)) { const char *approximation_scale = msLayerGetProcessingKey(layer, "APPROXIMATION_SCALE"); if (approximation_scale) { if (!strncasecmp(approximation_scale, "ROUND", 5)) { MS_IMAGE_RENDERER(image)->transform_mode = MS_TRANSFORM_ROUND; } else if (!strncasecmp(approximation_scale, "FULL", 4)) { MS_IMAGE_RENDERER(image)->transform_mode = MS_TRANSFORM_FULLRESOLUTION; } else if (!strncasecmp(approximation_scale, "SIMPLIFY", 8)) { MS_IMAGE_RENDERER(image)->transform_mode = MS_TRANSFORM_SIMPLIFY; } else { MS_IMAGE_RENDERER(image)->transform_mode = MS_TRANSFORM_SNAPTOGRID; MS_IMAGE_RENDERER(image)->approximation_scale = atof(approximation_scale); } } else { MS_IMAGE_RENDERER(image)->transform_mode = MS_IMAGE_RENDERER(image)->default_transform_mode; MS_IMAGE_RENDERER(image)->approximation_scale = MS_IMAGE_RENDERER(image)->default_approximation_scale; } MS_IMAGE_RENDERER(image)->startLayer(image, map, layer); } else if (MS_RENDERER_IMAGEMAP(image->format)) msImageStartLayerIM(map, layer, image); } } /** * Generic function to tell the underline device that layer * drawing is ending */ void msImageEndLayer(mapObj *map, layerObj *layer, imageObj *image) { if (image) { if (MS_RENDERER_PLUGIN(image->format)) { MS_IMAGE_RENDERER(image)->endLayer(image, map, layer); } } } /** * Generic function to tell the underline device that shape * drawing is starting */ void msDrawStartShape(mapObj *map, layerObj *layer, imageObj *image, shapeObj *shape) { (void)map; (void)layer; if (image) { if (MS_RENDERER_PLUGIN(image->format)) { if (image->format->vtable->startShape) image->format->vtable->startShape(image, shape); } } } /** * Generic function to tell the underline device that shape * drawing is ending */ void msDrawEndShape(mapObj *map, layerObj *layer, imageObj *image, shapeObj *shape) { (void)map; (void)layer; if (MS_RENDERER_PLUGIN(image->format)) { if (image->format->vtable->endShape) image->format->vtable->endShape(image, shape); } } /** * take the value from the shape and use it to change the * color in the style to match the range map */ int msShapeToRange(styleObj *style, shapeObj *shape) { /*first, get the value of the rangeitem, which should*/ /*evaluate to a double*/ const char *fieldStr = shape->values[style->rangeitemindex]; if (fieldStr == NULL) { /*if there's not value, bail*/ return MS_FAILURE; } double fieldVal = atof(fieldStr); /*faith that it's ok -- */ /*should switch to strtod*/ return msValueToRange(style, fieldVal, MS_COLORSPACE_RGB); } /** * Allow direct mapping of a value so that mapscript can use the * Ranges. The styls passed in is updated to reflect the right color * based on the fieldVal */ int msValueToRange(styleObj *style, double fieldVal, colorspace cs) { double range; double scaledVal; range = style->maxvalue - style->minvalue; scaledVal = (fieldVal - style->minvalue) / range; if (cs == MS_COLORSPACE_RGB) { /*At this point, we know where on the range we need to be*/ /*However, we don't know how to map it yet, since RGB(A) can */ /*Go up or down*/ style->color.red = (int)(MS_MAX( 0, (MS_MIN(255, (style->mincolor.red + ((style->maxcolor.red - style->mincolor.red) * scaledVal)))))); style->color.green = (int)(MS_MAX( 0, (MS_MIN(255, (style->mincolor.green + ((style->maxcolor.green - style->mincolor.green) * scaledVal)))))); style->color.blue = (int)(MS_MAX( 0, (MS_MIN(255, (style->mincolor.blue + ((style->maxcolor.blue - style->mincolor.blue) * scaledVal)))))); style->color.alpha = (int)(MS_MAX( 0, (MS_MIN(255, (style->mincolor.alpha + ((style->maxcolor.alpha - style->mincolor.alpha) * scaledVal)))))); } else { /* HSL */ assert(cs == MS_COLORSPACE_HSL); if (fieldVal <= style->minvalue) style->color = style->mincolor; else if (fieldVal >= style->maxvalue) style->color = style->maxcolor; else { double mh, ms, ml, Mh, Ms, Ml; msRGBtoHSL(&style->mincolor, &mh, &ms, &ml); msRGBtoHSL(&style->maxcolor, &Mh, &Ms, &Ml); mh += (Mh - mh) * scaledVal; ms += (Ms - ms) * scaledVal; ml += (Ml - ml) * scaledVal; msHSLtoRGB(mh, ms, ml, &style->color); style->color.alpha = style->mincolor.alpha + (style->maxcolor.alpha - style->mincolor.alpha) * scaledVal; } } /*( "msMapRange(): %i %i %i", style->color.red , style->color.green, * style->color.blue);*/ #if ALPHACOLOR_ENABLED /*NO ALPHA RANGE YET style->color.alpha = style->mincolor.alpha + * ((style->maxcolor.alpha - style->mincolor.alpha) * scaledVal);*/ #endif return MS_SUCCESS; } mapserver-8.6.0/src/mapdrawgdal.c000066400000000000000000002523341511405061000167510ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Code for drawing GDAL raster layers. Called from * msDrawRasterLayerLow() in mapraster.c. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include #include #include "mapserver.h" #include "mapresample.h" #include "mapthread.h" #include "maptime.h" extern int InvGeoTransform(double *gt_in, double *gt_out); #define MAXCOLORS 256 #define GEO_TRANS(tr, x, y) ((tr)[0] + (tr)[1] * (x) + (tr)[2] * (y)) #define SKIP_MASK(x, y) \ (mask_rb && !*(mask_rb->data.rgba.a + (y)*mask_rb->data.rgba.row_step + \ (x)*mask_rb->data.rgba.pixel_step)) #include "gdal.h" #include "cpl_string.h" #include "gdal_alg.h" static bool IsNoData(double dfValue, double dfNoDataValue); static int LoadGDALImages(GDALDatasetH hDS, int band_numbers[4], int band_count, layerObj *layer, int src_xoff, int src_yoff, int src_xsize, int src_ysize, GByte *pabyBuffer, int dst_xsize, int dst_ysize, int *pbHaveRGBNoData, int *pnNoData1, int *pnNoData2, int *pnNoData3, bool *pbScaled, double *pdfScaleMin, double *pdfScaleRatio, bool **ppbIsNoDataBuffer); static int msDrawRasterLayerGDAL_RawMode(mapObj *map, layerObj *layer, imageObj *image, GDALDatasetH hDS, int src_xoff, int src_yoff, int src_xsize, int src_ysize, int dst_xoff, int dst_yoff, int dst_xsize, int dst_ysize); static int msDrawRasterLayerGDAL_16BitClassification( mapObj *map, layerObj *layer, rasterBufferObj *rb, GDALRasterBandH hBand, int src_xoff, int src_yoff, int src_xsize, int src_ysize, int dst_xoff, int dst_yoff, int dst_xsize, int dst_ysize); /* * rasterBufferObj setting macros. */ #define GAMMA_CORRECT(color, gamma) \ (int)(0.5 + 255 * pow((color) / 255.0, (gamma))) /************************************************************************/ /* msDrawRasterLayerGDAL() */ /************************************************************************/ int msDrawRasterLayerGDAL(mapObj *map, layerObj *layer, imageObj *image, rasterBufferObj *rb, void *hDSVoid) { int i; /* loop counters */ int cmap[MAXCOLORS]; #ifndef NDEBUG int cmap_set = FALSE; #endif unsigned char rb_cmap[4][MAXCOLORS]; double adfGeoTransform[6], adfInvGeoTransform[6]; int dst_xoff, dst_yoff, dst_xsize, dst_ysize; int src_xoff, src_yoff, src_xsize, src_ysize; double llx, lly, urx, ury; rectObj copyRect, mapRect; unsigned char *pabyRaw1 = NULL, *pabyRaw2 = NULL, *pabyRaw3 = NULL, *pabyRawAlpha = NULL; int classified = FALSE; int red_band = 0, green_band = 0, blue_band = 0, alpha_band = 0; int band_count, band_numbers[4]; GDALDatasetH hDS = hDSVoid; GDALColorTableH hColorMap = NULL; GDALRasterBandH hBand1 = NULL, hBand2 = NULL, hBand3 = NULL, hBandAlpha = NULL; int bHaveRGBNoData = FALSE; int nNoData1 = -1, nNoData2 = -1, nNoData3 = -1; rasterBufferObj *mask_rb = NULL; rasterBufferObj s_mask_rb; if (layer->mask) { int ret; layerObj *maskLayer = GET_LAYER(map, msGetLayerIndex(map, layer->mask)); mask_rb = &s_mask_rb; memset(mask_rb, 0, sizeof(s_mask_rb)); ret = MS_IMAGE_RENDERER(maskLayer->maskimage) ->getRasterBufferHandle(maskLayer->maskimage, mask_rb); if (ret != MS_SUCCESS) return -1; } /*only support rawdata and pluggable renderers*/ assert(MS_RENDERER_RAWDATA(image->format) || (MS_RENDERER_PLUGIN(image->format) && rb)); memset(cmap, 0xff, MAXCOLORS * sizeof(int)); memset(rb_cmap, 0, sizeof(rb_cmap)); /* -------------------------------------------------------------------- */ /* Test the image format instead of the map format. */ /* Normally the map format and the image format should be the */ /* same but In some cases like swf and pdf support, a temporary */ /* GD image object is created and used to render raster layers */ /* and then dumped into the SWF or the PDF file. */ /* -------------------------------------------------------------------- */ src_xsize = GDALGetRasterXSize(hDS); src_ysize = GDALGetRasterYSize(hDS); /* * If the RAW_WINDOW attribute is set, use that to establish what to * load. This is normally just set by the mapresample.c module to avoid * problems with rotated maps. */ if (CSLFetchNameValue(layer->processing, "RAW_WINDOW") != NULL) { char **papszTokens = CSLTokenizeString(CSLFetchNameValue(layer->processing, "RAW_WINDOW")); if (layer->debug) msDebug("msDrawGDAL(%s): using RAW_WINDOW=%s, dst=0,0,%d,%d\n", layer->name, CSLFetchNameValue(layer->processing, "RAW_WINDOW"), image->width, image->height); if (CSLCount(papszTokens) != 4) { CSLDestroy(papszTokens); msSetError(MS_IMGERR, "RAW_WINDOW PROCESSING directive corrupt.", "msDrawGDAL()"); return -1; } src_xoff = atoi(papszTokens[0]); src_yoff = atoi(papszTokens[1]); src_xsize = atoi(papszTokens[2]); src_ysize = atoi(papszTokens[3]); dst_xoff = 0; dst_yoff = 0; dst_xsize = image->width; dst_ysize = image->height; CSLDestroy(papszTokens); } /* * Compute the georeferenced window of overlap, and do nothing if there * is no overlap between the map extents, and the file we are operating on. */ else if (layer->transform) { int dst_lrx, dst_lry; if (layer->debug) msDebug("msDrawRasterLayerGDAL(): Entering transform.\n"); msGetGDALGeoTransform(hDS, map, layer, adfGeoTransform); InvGeoTransform(adfGeoTransform, adfInvGeoTransform); mapRect = map->extent; mapRect.minx -= map->cellsize * 0.5; mapRect.maxx += map->cellsize * 0.5; mapRect.miny -= map->cellsize * 0.5; mapRect.maxy += map->cellsize * 0.5; copyRect = mapRect; if (copyRect.minx < GEO_TRANS(adfGeoTransform, 0, src_ysize)) copyRect.minx = GEO_TRANS(adfGeoTransform, 0, src_ysize); if (copyRect.maxx > GEO_TRANS(adfGeoTransform, src_xsize, 0)) copyRect.maxx = GEO_TRANS(adfGeoTransform, src_xsize, 0); if (copyRect.miny < GEO_TRANS(adfGeoTransform + 3, 0, src_ysize)) copyRect.miny = GEO_TRANS(adfGeoTransform + 3, 0, src_ysize); if (copyRect.maxy > GEO_TRANS(adfGeoTransform + 3, src_xsize, 0)) copyRect.maxy = GEO_TRANS(adfGeoTransform + 3, src_xsize, 0); if (copyRect.minx >= copyRect.maxx || copyRect.miny >= copyRect.maxy) { if (layer->debug) msDebug("msDrawRasterLayerGDAL(): Error in overlap calculation.\n"); return 0; } /* * Copy the source and destination raster coordinates. */ llx = GEO_TRANS(adfInvGeoTransform + 0, copyRect.minx, copyRect.miny); lly = GEO_TRANS(adfInvGeoTransform + 3, copyRect.minx, copyRect.miny); urx = GEO_TRANS(adfInvGeoTransform + 0, copyRect.maxx, copyRect.maxy); ury = GEO_TRANS(adfInvGeoTransform + 3, copyRect.maxx, copyRect.maxy); src_xoff = MS_MAX(0, (int)floor(llx + 0.5)); src_yoff = MS_MAX(0, (int)floor(ury + 0.5)); src_xsize = MS_MIN(MS_MAX(0, (int)(urx - llx + 0.5)), GDALGetRasterXSize(hDS) - src_xoff); src_ysize = MS_MIN(MS_MAX(0, (int)(lly - ury + 0.5)), GDALGetRasterYSize(hDS) - src_yoff); /* We want very small windows to use at least one source pixel (#4172) */ if (src_xsize == 0 && (urx - llx) > 0.0) { src_xsize = 1; src_xoff = MS_MIN(src_xoff, GDALGetRasterXSize(hDS) - 1); } if (src_ysize == 0 && (lly - ury) > 0.0) { src_ysize = 1; src_yoff = MS_MIN(src_yoff, GDALGetRasterYSize(hDS) - 1); } if (src_xsize == 0 || src_ysize == 0) { if (layer->debug) msDebug("msDrawRasterLayerGDAL(): no apparent overlap between map view " "and this window(1).\n"); return 0; } if (map->cellsize == 0) { if (layer->debug) msDebug("msDrawRasterLayerGDAL(): Cellsize can't be 0.\n"); return 0; } dst_xoff = (int)((copyRect.minx - mapRect.minx) / map->cellsize); dst_yoff = (int)((mapRect.maxy - copyRect.maxy) / map->cellsize); dst_lrx = (int)((copyRect.maxx - mapRect.minx) / map->cellsize + 0.5); dst_lry = (int)((mapRect.maxy - copyRect.miny) / map->cellsize + 0.5); dst_lrx = MS_MAX(0, MS_MIN(image->width, dst_lrx)); dst_lry = MS_MAX(0, MS_MIN(image->height, dst_lry)); dst_xsize = MS_MAX(0, MS_MIN(image->width, dst_lrx - dst_xoff)); dst_ysize = MS_MAX(0, MS_MIN(image->height, dst_lry - dst_yoff)); if (dst_xsize == 0 || dst_ysize == 0) { if (layer->debug) msDebug("msDrawRasterLayerGDAL(): no apparent overlap between map view " "and this window(2).\n"); return 0; } if (layer->debug) msDebug("msDrawRasterLayerGDAL(): src=%d,%d,%d,%d, dst=%d,%d,%d,%d\n", src_xoff, src_yoff, src_xsize, src_ysize, dst_xoff, dst_yoff, dst_xsize, dst_ysize); #ifndef notdef if (layer->debug) { double d_src_xoff, d_src_yoff, geo_x, geo_y; geo_x = mapRect.minx + dst_xoff * map->cellsize; geo_y = mapRect.maxy - dst_yoff * map->cellsize; d_src_xoff = (geo_x - adfGeoTransform[0]) / adfGeoTransform[1]; d_src_yoff = (geo_y - adfGeoTransform[3]) / adfGeoTransform[5]; msDebug("msDrawRasterLayerGDAL(): source raster PL (%.3f,%.3f) for dst " "PL (%d,%d).\n", d_src_xoff, d_src_yoff, dst_xoff, dst_yoff); } #endif } /* * If layer transforms are turned off, just map 1:1. */ else { dst_xoff = src_xoff = 0; dst_yoff = src_yoff = 0; dst_xsize = src_xsize = MS_MIN(image->width, src_xsize); dst_ysize = src_ysize = MS_MIN(image->height, src_ysize); } /* * In RAWDATA mode we don't fool with colors. Do the raw processing, * and return from the function early. */ if (MS_RENDERER_RAWDATA(image->format)) { return msDrawRasterLayerGDAL_RawMode( map, layer, image, hDS, src_xoff, src_yoff, src_xsize, src_ysize, dst_xoff, dst_yoff, dst_xsize, dst_ysize); } /* * Is this image classified? We consider it classified if there are * classes with an expression string *or* a color range. We don't want * to treat the raster as classified if there is just a bogus class here * to force inclusion in the legend. */ for (i = 0; i < layer->numclasses; i++) { int s; /* change colour based on colour range? */ for (s = 0; s < layer->class[i] -> numstyles; s++) { if (MS_VALID_COLOR(layer->class[i] -> styles[s] -> mincolor) && MS_VALID_COLOR(layer->class[i] -> styles[s] -> maxcolor)) { classified = TRUE; break; } } if (layer->class[i] -> expression.string != NULL) { classified = TRUE; break; } } /* * Set up the band selection. We look for a BANDS directive in the * the PROCESSING options. If not found we default to grey=1, grey=1,alpha=2, * red=1,green=2,blue=3 or red=1,green=2,blue=3,alpha>=4. */ if (CSLFetchNameValue(layer->processing, "BANDS") == NULL) { const int gdal_band_count = GDALGetRasterCount(hDS); red_band = 1; if (gdal_band_count >= 4) { /* The alpha band is not necessarily the 4th one */ for (i = 4; i <= gdal_band_count; i++) { if (GDALGetRasterColorInterpretation(GDALGetRasterBand(hDS, i)) == GCI_AlphaBand) { alpha_band = i; break; } } } if (gdal_band_count >= 3) { green_band = 2; blue_band = 3; } if (gdal_band_count == 2 && GDALGetRasterColorInterpretation( GDALGetRasterBand(hDS, 2)) == GCI_AlphaBand) alpha_band = 2; hBand1 = GDALGetRasterBand(hDS, red_band); if (classified || GDALGetRasterColorTable(hBand1) != NULL) { alpha_band = 0; green_band = 0; blue_band = 0; } } else { int *band_list; band_list = msGetGDALBandList(layer, hDS, 4, &band_count); if (band_list == NULL) return -1; if (band_count > 0) red_band = band_list[0]; else red_band = 0; if (band_count > 2) { green_band = band_list[1]; blue_band = band_list[2]; } else { green_band = 0; blue_band = 0; } if (band_count > 3) alpha_band = band_list[3]; else alpha_band = 0; free(band_list); } band_numbers[0] = red_band; band_numbers[1] = green_band; band_numbers[2] = blue_band; band_numbers[3] = 0; if (blue_band != 0 && alpha_band != 0) { band_numbers[3] = alpha_band; band_count = 4; } else if (blue_band != 0 && alpha_band == 0) band_count = 3; else if (alpha_band != 0) { band_numbers[1] = alpha_band; band_count = 2; } else band_count = 1; if (layer->debug > 1 || (layer->debug > 0 && green_band != 0)) { msDebug( "msDrawRasterLayerGDAL(): red,green,blue,alpha bands = %d,%d,%d,%d\n", red_band, green_band, blue_band, alpha_band); } /* * Get band handles for PC256, RGB or RGBA cases. */ hBand1 = GDALGetRasterBand(hDS, red_band); if (hBand1 == NULL) return -1; hBand2 = hBand3 = hBandAlpha = NULL; if (green_band != 0) { hBand1 = GDALGetRasterBand(hDS, red_band); hBand2 = GDALGetRasterBand(hDS, green_band); hBand3 = GDALGetRasterBand(hDS, blue_band); if (hBand1 == NULL || hBand2 == NULL || hBand3 == NULL) return -1; } if (alpha_band != 0) hBandAlpha = GDALGetRasterBand(hDS, alpha_band); /* * The logic for a classification rendering of non-8bit raster bands * is sufficiently different than the normal mechanism of loading * into an 8bit buffer, that we isolate it into it's own subfunction. */ if (classified && hBand1 != NULL && GDALGetRasterDataType(hBand1) != GDT_Byte) { return msDrawRasterLayerGDAL_16BitClassification( map, layer, rb, hBand1, src_xoff, src_yoff, src_xsize, src_ysize, dst_xoff, dst_yoff, dst_xsize, dst_ysize); } /* * Get colormap for this image. If there isn't one, and we have only * one band create a greyscale colormap. */ bool isDefaultGreyscale = false; if (hBand2 != NULL) hColorMap = NULL; else { hColorMap = GDALGetRasterColorTable(hBand1); if (hColorMap != NULL) hColorMap = GDALCloneColorTable(hColorMap); else { hColorMap = GDALCreateColorTable(GPI_RGB); isDefaultGreyscale = true; for (i = 0; i < 256; i++) { colorObj pixel = {i, i, i, 0}; GDALColorEntry sEntry; if (MS_COMPARE_COLORS(pixel, layer->offsite)) { sEntry.c1 = 0; sEntry.c2 = 0; sEntry.c3 = 0; sEntry.c4 = 0; /* alpha set to zero */ } else { sEntry.c1 = i; sEntry.c2 = i; sEntry.c3 = i; sEntry.c4 = 255; } GDALSetColorEntry(hColorMap, i, &sEntry); } } /* ** If we have a known NODATA value, mark it now as transparent. */ { int bGotNoData; double dfNoDataValue = msGetGDALNoDataValue(layer, hBand1, &bGotNoData); if (bGotNoData && dfNoDataValue >= 0 && dfNoDataValue < GDALGetColorEntryCount(hColorMap)) { GDALColorEntry sEntry; memcpy(&sEntry, GDALGetColorEntry(hColorMap, (int)dfNoDataValue), sizeof(GDALColorEntry)); sEntry.c4 = 0; GDALSetColorEntry(hColorMap, (int)dfNoDataValue, &sEntry); } } } /* * Allocate imagery buffers. */ pabyRaw1 = (unsigned char *)malloc(((size_t)dst_xsize) * dst_ysize * band_count); if (pabyRaw1 == NULL) { msSetError(MS_MEMERR, "Allocating work image of size %dx%dx%d failed.", "msDrawRasterLayerGDAL()", dst_xsize, dst_ysize, band_count); return -1; } if (hBand2 != NULL && hBand3 != NULL) { pabyRaw2 = pabyRaw1 + dst_xsize * dst_ysize * 1; pabyRaw3 = pabyRaw1 + dst_xsize * dst_ysize * 2; } if (hBandAlpha != NULL) { if (hBand2 != NULL) pabyRawAlpha = pabyRaw1 + dst_xsize * dst_ysize * 3; else pabyRawAlpha = pabyRaw1 + dst_xsize * dst_ysize * 1; } /* * Load image data into buffers with scaling, etc. */ bool bScaled = false; double dfScaleMin = 0; double dfScaleRatio = 0; bool *pbIsNoDataBuffer = NULL; if (LoadGDALImages(hDS, band_numbers, band_count, layer, src_xoff, src_yoff, src_xsize, src_ysize, pabyRaw1, dst_xsize, dst_ysize, &bHaveRGBNoData, &nNoData1, &nNoData2, &nNoData3, &bScaled, &dfScaleMin, &dfScaleRatio, &pbIsNoDataBuffer) == -1) { free(pabyRaw1); free(pbIsNoDataBuffer); return -1; } const char *sgamma = msLayerGetProcessingKey(layer, "GAMMA"); const double gamma = sgamma ? CPLAtof(sgamma) : 1.0; /* * Setup the mapping between source eight bit pixel values, and the * output images color table. There are two general cases, where the * class colors are provided by the MAP file, or where we use the native * color table. */ if (classified) { int c; const char *pszRangeColorspace = msLayerGetProcessingKey(layer, "RANGE_COLORSPACE"); colorspace iRangeColorspace; #ifndef NDEBUG cmap_set = TRUE; #endif if (hColorMap == NULL) { msSetError(MS_IOERR, "Attempt to classify 24bit image, this is unsupported.", "drawGDAL()"); free(pabyRaw1); free(pbIsNoDataBuffer); return -1; } if (!pszRangeColorspace || !strcasecmp(pszRangeColorspace, "RGB")) { iRangeColorspace = MS_COLORSPACE_RGB; } else if (!strcasecmp(pszRangeColorspace, "HSL")) { iRangeColorspace = MS_COLORSPACE_HSL; } else { msSetError(MS_MISCERR, "Unknown RANGE_COLORSPACE \"%s\", expecting RGB or HSL", "drawGDAL()", pszRangeColorspace); GDALDestroyColorTable(hColorMap); free(pabyRaw1); free(pbIsNoDataBuffer); return -1; } int color_count = GDALGetColorEntryCount(hColorMap); const bool bScaleColors = bScaled && !isDefaultGreyscale; if (!bScaleColors && color_count > 256) color_count = 256; for (i = 0; i < color_count; i++) { colorObj pixel; int colormap_index; GDALColorEntry sEntry; GDALGetColorEntryAsRGB(hColorMap, i, &sEntry); const int j = bScaleColors ? MAX(0, MIN(255, (int)((i - dfScaleMin) * dfScaleRatio))) : i; pixel.red = sEntry.c1; pixel.green = sEntry.c2; pixel.blue = sEntry.c3; colormap_index = i; if (!MS_COMPARE_COLORS(pixel, layer->offsite)) { c = msGetClass(layer, &pixel, colormap_index); if (c != -1) { /* belongs to any class */ int s; /* change colour based on colour range? Currently we only address the greyscale case properly. */ if (MS_VALID_COLOR(layer->class[c] -> styles[0] -> mincolor)) { for (s = 0; s < layer->class[c] -> numstyles; s++) { if (MS_VALID_COLOR(layer->class[c] -> styles[s] -> mincolor) && MS_VALID_COLOR(layer->class[c] -> styles[s] -> maxcolor)) { if (sEntry.c1 >= layer->class[c] -> styles[s] -> minvalue && sEntry.c1 <= layer->class[c] -> styles[s] -> maxvalue) { msValueToRange(layer->class[c] -> styles[s], sEntry.c1, iRangeColorspace); if (MS_VALID_COLOR(layer->class[c] -> styles[s] -> color)) { rb_cmap[0][j] = layer->class[c]->styles[s]->color.red; rb_cmap[1][j] = layer->class[c]->styles[s]->color.green; rb_cmap[2][j] = layer->class[c]->styles[s]->color.blue; rb_cmap[3][j] = (layer->class[c] -> styles[s] -> color.alpha != 255) ? (layer->class[c] -> styles[s] -> color.alpha) : (255 * layer->class[c] -> styles[0] -> opacity / 100); break; } } } } } else if (MS_TRANSPARENT_COLOR( layer->class[c] -> styles[0] -> color)) /* leave it transparent */; else if (MS_VALID_COLOR(layer->class[c] -> styles[0] -> color)) { rb_cmap[0][j] = layer->class[c]->styles[0]->color.red; rb_cmap[1][j] = layer->class[c]->styles[0]->color.green; rb_cmap[2][j] = layer->class[c]->styles[0]->color.blue; rb_cmap[3][j] = (255 * layer->class[c] -> styles[0] -> opacity / 100); } else { /* Use raster color */ rb_cmap[0][j] = pixel.red; rb_cmap[1][j] = pixel.green; rb_cmap[2][j] = pixel.blue; rb_cmap[3][j] = 255; } if (gamma != 1.0) { rb_cmap[0][j] = GAMMA_CORRECT(rb_cmap[0][j], gamma); rb_cmap[1][j] = GAMMA_CORRECT(rb_cmap[1][j], gamma); rb_cmap[2][j] = GAMMA_CORRECT(rb_cmap[2][j], gamma); } } } } } else if (hBand2 == NULL && hColorMap != NULL && rb->type == MS_BUFFER_BYTE_RGBA) { int color_count; #ifndef NDEBUG cmap_set = TRUE; #endif color_count = MS_MIN(256, GDALGetColorEntryCount(hColorMap)); const bool bScaleColors = bScaled && !isDefaultGreyscale; for (i = 0; i < color_count; i++) { GDALColorEntry sEntry; GDALGetColorEntryAsRGB(hColorMap, i, &sEntry); const int j = bScaleColors ? MAX(0, MIN(255, (int)((i - dfScaleMin) * dfScaleRatio))) : i; if (sEntry.c4 != 0 && (!MS_VALID_COLOR(layer->offsite) || layer->offsite.red != sEntry.c1 || layer->offsite.green != sEntry.c2 || layer->offsite.blue != sEntry.c3)) { rb_cmap[0][j] = sEntry.c1; rb_cmap[1][j] = sEntry.c2; rb_cmap[2][j] = sEntry.c3; rb_cmap[3][j] = sEntry.c4; if (gamma != 1.0) { rb_cmap[0][j] = GAMMA_CORRECT(rb_cmap[0][j], gamma); rb_cmap[1][j] = GAMMA_CORRECT(rb_cmap[1][j], gamma); rb_cmap[2][j] = GAMMA_CORRECT(rb_cmap[2][j], gamma); } } } } if (bHaveRGBNoData && layer->debug) msDebug("msDrawGDAL(): using RGB nodata values from GDAL dataset.\n"); /* -------------------------------------------------------------------- */ /* If there was no alpha band, but we have a dataset level mask */ /* load it as massage it so it will function as our alpha for */ /* transparency purposes. */ /* -------------------------------------------------------------------- */ if (hBandAlpha == NULL) { int nMaskFlags = GDALGetMaskFlags(hBand1); if (CSLTestBoolean( CSLFetchNameValueDef(layer->processing, "USE_MASK_BAND", "YES")) && (nMaskFlags & GMF_PER_DATASET) != 0 && (nMaskFlags & (GMF_NODATA | GMF_ALL_VALID)) == 0) { CPLErr eErr; unsigned char *pabyOrig = pabyRaw1; if (layer->debug) msDebug("msDrawGDAL(): using GDAL mask band for alpha.\n"); band_count++; pabyRaw1 = (unsigned char *)realloc(pabyOrig, ((size_t)dst_xsize) * dst_ysize * band_count); if (pabyRaw1 == NULL) { msSetError(MS_MEMERR, "Allocating work image of size %dx%dx%d failed.", "msDrawRasterLayerGDAL()", dst_xsize, dst_ysize, band_count); free(pabyOrig); if (hColorMap != NULL) GDALDestroyColorTable(hColorMap); free(pbIsNoDataBuffer); return -1; } if (hBand2 != NULL) { pabyRaw2 = pabyRaw1 + dst_xsize * dst_ysize * 1; pabyRaw3 = pabyRaw1 + dst_xsize * dst_ysize * 2; pabyRawAlpha = pabyRaw1 + dst_xsize * dst_ysize * 3; } else { pabyRawAlpha = pabyRaw1 + dst_xsize * dst_ysize * 1; } hBandAlpha = GDALGetMaskBand(hBand1); eErr = GDALRasterIO(hBandAlpha, GF_Read, src_xoff, src_yoff, src_xsize, src_ysize, pabyRawAlpha, dst_xsize, dst_ysize, GDT_Byte, 0, 0); if (eErr != CE_None) { msSetError(MS_IOERR, "GDALRasterIO() failed: %s", "drawGDAL()", CPLGetLastErrorMsg()); if (hColorMap != NULL) GDALDestroyColorTable(hColorMap); free(pabyRaw1); free(pbIsNoDataBuffer); return -1; } /* In case the mask is not an alpha channel, expand values of 1 to 255, */ /* so we can deal as it was an alpha band afterwards */ if ((nMaskFlags & GMF_ALPHA) == 0) { for (i = 0; i < dst_xsize * dst_ysize; i++) if (pabyRawAlpha[i]) pabyRawAlpha[i] = 255; } } } /* -------------------------------------------------------------------- */ /* Single band plus colormap and alpha to truecolor. (RB) */ /* -------------------------------------------------------------------- */ if (hBand2 == NULL && rb->type == MS_BUFFER_BYTE_RGBA && hBandAlpha != NULL) { assert(cmap_set); int k = 0; for (i = dst_yoff; i < dst_yoff + dst_ysize; i++) { for (int j = dst_xoff; j < dst_xoff + dst_xsize; j++, k++) { int src_pixel, src_alpha, cmap_alpha, merged_alpha; if (SKIP_MASK(j, i) || (pbIsNoDataBuffer && pbIsNoDataBuffer[k])) continue; src_pixel = pabyRaw1[k]; src_alpha = pabyRawAlpha[k]; cmap_alpha = rb_cmap[3][src_pixel]; merged_alpha = (src_alpha * cmap_alpha) / 255; if (merged_alpha < 2) /* do nothing - transparent */; else if (merged_alpha > 253) { RB_SET_PIXEL(rb, j, i, rb_cmap[0][src_pixel], rb_cmap[1][src_pixel], rb_cmap[2][src_pixel], cmap_alpha); } else { RB_MIX_PIXEL(rb, j, i, rb_cmap[0][src_pixel], rb_cmap[1][src_pixel], rb_cmap[2][src_pixel], merged_alpha); } } } } /* -------------------------------------------------------------------- */ /* Single band plus colormap (no alpha) to truecolor (RB) */ /* -------------------------------------------------------------------- */ else if (hBand2 == NULL && rb->type == MS_BUFFER_BYTE_RGBA) { assert(cmap_set); int k = 0; for (i = dst_yoff; i < dst_yoff + dst_ysize; i++) { for (int j = dst_xoff; j < dst_xoff + dst_xsize; j++, k++) { int src_pixel = pabyRaw1[k]; if (SKIP_MASK(j, i) || (pbIsNoDataBuffer && pbIsNoDataBuffer[k])) continue; if (rb_cmap[3][src_pixel] > 253) { RB_SET_PIXEL(rb, j, i, rb_cmap[0][src_pixel], rb_cmap[1][src_pixel], rb_cmap[2][src_pixel], rb_cmap[3][src_pixel]); } else if (rb_cmap[3][src_pixel] > 1) { RB_MIX_PIXEL(rb, j, i, rb_cmap[0][src_pixel], rb_cmap[1][src_pixel], rb_cmap[2][src_pixel], rb_cmap[3][src_pixel]); } } } } /* -------------------------------------------------------------------- */ /* Input is 3 band RGB. Alpha blending is mixed into the loop */ /* since this case is less commonly used and has lots of other */ /* overhead. (RB) */ /* -------------------------------------------------------------------- */ else if (hBand3 != NULL && rb->type == MS_BUFFER_BYTE_RGBA) { int k = 0; for (i = dst_yoff; i < dst_yoff + dst_ysize; i++) { for (int j = dst_xoff; j < dst_xoff + dst_xsize; j++, k++) { if (SKIP_MASK(j, i) || (pbIsNoDataBuffer && pbIsNoDataBuffer[k])) continue; int red = pabyRaw1[k]; int green = pabyRaw2[k]; int blue = pabyRaw3[k]; if (MS_VALID_COLOR(layer->offsite) && red == layer->offsite.red && green == layer->offsite.green && blue == layer->offsite.blue) continue; if (bHaveRGBNoData && red == nNoData1 && green == nNoData2 && blue == nNoData3) continue; if (pabyRawAlpha == NULL || pabyRawAlpha[k] == 255) { if (gamma != 1.0) { red = GAMMA_CORRECT(red, gamma); green = GAMMA_CORRECT(green, gamma); blue = GAMMA_CORRECT(blue, gamma); } RB_SET_PIXEL(rb, j, i, red, green, blue, 255); } else if (pabyRawAlpha[k] != 0) { if (gamma != 1.0) { red = GAMMA_CORRECT(red, gamma); green = GAMMA_CORRECT(green, gamma); blue = GAMMA_CORRECT(blue, gamma); } RB_MIX_PIXEL(rb, j, i, red, green, blue, pabyRawAlpha[k]); } } } } /* ** Cleanup */ free(pabyRaw1); free(pbIsNoDataBuffer); if (hColorMap != NULL) GDALDestroyColorTable(hColorMap); return 0; } /************************************************************************/ /* ParseDefaultLUT() */ /************************************************************************/ static int ParseDefaultLUT(const char *lut_def, GByte *lut, int nMaxValIn) { const char *lut_read; int last_in = 0, last_out = 0, all_done = FALSE; /* -------------------------------------------------------------------- */ /* Parse definition, applying to lut on the fly. */ /* -------------------------------------------------------------------- */ lut_read = lut_def; while (!all_done) { int this_in = 0, this_out = 0; int lut_i; while (isspace(*lut_read)) lut_read++; /* if we are at end, assume nMaxValIn:255 */ if (*lut_read == '\0') { all_done = TRUE; if (last_in != nMaxValIn) { this_in = nMaxValIn; this_out = 255; } } /* otherwise read "in:out", and skip past */ else { this_in = atoi(lut_read); while (*lut_read != ':' && *lut_read) lut_read++; if (*lut_read == ':') lut_read++; while (isspace(*lut_read)) lut_read++; this_out = atoi(lut_read); while (*lut_read && *lut_read != ',' && *lut_read != '\n') lut_read++; if (*lut_read == ',' || *lut_read == '\n') lut_read++; while (isspace(*lut_read)) lut_read++; } this_in = MS_MAX(0, MS_MIN(nMaxValIn, this_in)); this_out = MS_MAX(0, MS_MIN(255, this_out)); /* apply linear values from last in:out to this in:out */ for (lut_i = last_in; lut_i <= this_in; lut_i++) { double ratio; if (last_in == this_in) ratio = 1.0; else ratio = (lut_i - last_in) / (double)(this_in - last_in); lut[lut_i] = (int)floor(((1.0 - ratio) * last_out + ratio * this_out) + 0.5); } last_in = this_in; last_out = this_out; } return 0; } /************************************************************************/ /* LutFromGimpLine() */ /************************************************************************/ static int LutFromGimpLine(char *lut_line, GByte *lut) { char wrkLUTDef[1000]; int i, count = 0; char **tokens; /* cleanup white space at end of line (DOS LF, etc) */ i = strlen(lut_line) - 1; while (i > 0 && isspace(lut_line[i])) lut_line[i--] = '\0'; while (*lut_line == 10 || *lut_line == 13) lut_line++; /* tokenize line */ tokens = CSLTokenizeString(lut_line); if (CSLCount(tokens) != 17 * 2) { CSLDestroy(tokens); msSetError(MS_MISCERR, "GIMP curve file appears corrupt.", "LutFromGimpLine()"); return -1; } /* Convert to our own format */ wrkLUTDef[0] = '\0'; for (i = 0; i < 17; i++) { if (atoi(tokens[i * 2]) >= 0) { if (count++ > 0) strlcat(wrkLUTDef, ",", sizeof(wrkLUTDef)); snprintf(wrkLUTDef + strlen(wrkLUTDef), sizeof(wrkLUTDef) - strlen(wrkLUTDef), "%s:%s", tokens[i * 2], tokens[i * 2 + 1]); } } CSLDestroy(tokens); return ParseDefaultLUT(wrkLUTDef, lut, 255); } /************************************************************************/ /* ParseGimpLUT() */ /* */ /* Parse a Gimp style LUT. */ /************************************************************************/ static int ParseGimpLUT(const char *lut_def, GByte *lut, int iColorIndex) { int i; GByte lutValue[256]; GByte lutColorBand[256]; char **lines = CSLTokenizeStringComplex(lut_def, "\n", FALSE, FALSE); if (!EQUALN(lines[0], "# GIMP Curves File", 18) || CSLCount(lines) < 6) { msSetError(MS_MISCERR, "GIMP curve file appears corrupt.", "ParseGimpLUT()"); CSLDestroy(lines); return -1; } /* * Convert the overall curve, and the color band specific curve into LUTs. */ if (LutFromGimpLine(lines[1], lutValue) != 0 || LutFromGimpLine(lines[iColorIndex + 1], lutColorBand) != 0) { CSLDestroy(lines); return -1; } CSLDestroy(lines); /* * Compose the two luts as if the raw value passed through the color band * specific lut, and then the general value lut. Usually one or the * other will be the identity mapping, but not always. */ for (i = 0; i < 256; i++) { lut[i] = lutValue[lutColorBand[i]]; } return 0; } /************************************************************************/ /* LoadLUT() */ /* */ /* Load a LUT according to RFC 21. */ /************************************************************************/ static int LoadLUT(layerObj *layer, int iColorIndex, char **ppszLutDef) { const char *lut_def; char key[20], lut_def_fromfile[2500]; *ppszLutDef = NULL; /* -------------------------------------------------------------------- */ /* Get lut specifier from processing directives. Do nothing if */ /* none are found. */ /* -------------------------------------------------------------------- */ sprintf(key, "LUT_%d", iColorIndex); lut_def = msLayerGetProcessingKey(layer, key); if (lut_def == NULL) lut_def = msLayerGetProcessingKey(layer, "LUT"); if (lut_def == NULL) return 0; /* -------------------------------------------------------------------- */ /* Does this look like a file? If so, read it into memory. */ /* -------------------------------------------------------------------- */ if (strspn(lut_def, "0123456789:, ") != strlen(lut_def)) { FILE *fp; char path[MS_MAXPATHLEN]; int len; msBuildPath(path, layer->map->mappath, lut_def); fp = fopen(path, "rb"); if (fp == NULL) { msSetError(MS_IOERR, "Failed to open LUT file '%s'.", "drawGDAL()", path); return -1; } len = fread(lut_def_fromfile, 1, sizeof(lut_def_fromfile), fp); fclose(fp); if (len == sizeof(lut_def_fromfile)) { msSetError(MS_IOERR, "LUT definition from file %s longer than maximum buffer size " "(%d bytes).", "drawGDAL()", path, (int)sizeof(lut_def_fromfile)); return -1; } lut_def_fromfile[len] = '\0'; lut_def = lut_def_fromfile; } *ppszLutDef = msStrdup(lut_def); return 0; } /************************************************************************/ /* FreeLUTs() */ /************************************************************************/ static void FreeLUTs(char **apszLUTs) { int i; for (i = 0; i < 4; i++) msFree(apszLUTs[i]); msFree(apszLUTs); } /************************************************************************/ /* LoadLUTs() */ /* */ /* Return an array of 4 strings (some possibly NULL) with loaded LUTs */ /* or NULL in case of failure. */ /************************************************************************/ static char **LoadLUTs(layerObj *layer, int band_count) { int i; char **apszLUTs; assert(band_count <= 4); apszLUTs = (char **)msSmallCalloc(4, sizeof(char *)); for (i = 0; i < band_count; i++) { if (LoadLUT(layer, i + 1, &apszLUTs[i]) != 0) { FreeLUTs(apszLUTs); return NULL; } } return apszLUTs; } /************************************************************************/ /* GetDataTypeAppropriateForLUTS() */ /* */ /* This does a quick examination of the LUT strings to determine */ /* if they have input values > 255, in which case the raster data */ /* must be queries on 16-bits. */ /************************************************************************/ static GDALDataType GetDataTypeAppropriateForLUTS(char **apszLUTs) { GDALDataType eDT = GDT_Byte; int i; for (i = 0; i < 4; i++) { const char *pszLastTuple; int nLastInValue; if (apszLUTs[i] == NULL) continue; if (EQUALN(apszLUTs[i], "# GIMP", 6)) continue; /* Find last in:out tuple in string */ pszLastTuple = strrchr(apszLUTs[i], ','); if (pszLastTuple == NULL) pszLastTuple = apszLUTs[i]; else pszLastTuple++; while (*pszLastTuple == ' ') pszLastTuple++; nLastInValue = atoi(pszLastTuple); if (nLastInValue > 255) { eDT = GDT_UInt16; break; } } return eDT; } /************************************************************************/ /* ApplyLUT() */ /************************************************************************/ static int ApplyLUT(int iColorIndex, const char *lut_def, const void *pInBuffer, GDALDataType eDT, GByte *pabyOutBuffer, int nPixelCount) { int i, err; GByte byteLut[256]; GByte *uint16Lut = NULL; assert(eDT == GDT_Byte || eDT == GDT_UInt16); if (lut_def == NULL) { if (pInBuffer != pabyOutBuffer) { GDALCopyWords(pInBuffer, eDT, GDALGetDataTypeSizeBytes(eDT), pabyOutBuffer, GDT_Byte, 1, nPixelCount); } return 0; } /* -------------------------------------------------------------------- */ /* Parse the LUT description. */ /* -------------------------------------------------------------------- */ if (EQUALN(lut_def, "# GIMP", 6)) { if (eDT != GDT_Byte) { msSetError(MS_MISCERR, "Cannot apply a GIMP LUT on a 16-bit buffer", "ApplyLUT()"); return -1; } err = ParseGimpLUT(lut_def, byteLut, iColorIndex); } else { if (eDT == GDT_Byte) err = ParseDefaultLUT(lut_def, byteLut, 255); else { uint16Lut = (GByte *)malloc(65536); if (uint16Lut == NULL) { msSetError(MS_MEMERR, "Cannot allocate 16-bit LUT", "ApplyLUT()"); return -1; } err = ParseDefaultLUT(lut_def, uint16Lut, 65535); } } /* -------------------------------------------------------------------- */ /* Apply LUT. */ /* -------------------------------------------------------------------- */ if (eDT == GDT_Byte) { for (i = 0; i < nPixelCount; i++) pabyOutBuffer[i] = byteLut[((GByte *)pInBuffer)[i]]; } else { for (i = 0; i < nPixelCount; i++) pabyOutBuffer[i] = uint16Lut[((GUInt16 *)pInBuffer)[i]]; free(uint16Lut); } return err; } /************************************************************************/ /* LoadGDALImages() */ /* */ /* This call will load and process 1-4 bands of input for the */ /* selected rectangle, loading the result into the passed 8bit */ /* buffer. The processing options include scaling. */ /************************************************************************/ static int LoadGDALImages(GDALDatasetH hDS, int band_numbers[4], int band_count, layerObj *layer, int src_xoff, int src_yoff, int src_xsize, int src_ysize, GByte *pabyWholeBuffer, int dst_xsize, int dst_ysize, int *pbHaveRGBNoData, int *pnNoData1, int *pnNoData2, int *pnNoData3, bool *pbScaled, double *pdfScaleMin, double *pdfScaleRatio, bool **ppbIsNoDataBuffer) { int iColorIndex, result_code = 0; CPLErr eErr; float *pafWholeRawData; char **papszLUTs; *pbScaled = false; *pdfScaleMin = 0; *pdfScaleRatio = 0; *ppbIsNoDataBuffer = NULL; /* -------------------------------------------------------------------- */ /* If we have no alpha band, but we do have three input */ /* bands, then check for nodata values. If we only have one */ /* input band, then nodata will already have been adderssed as */ /* part of the real or manufactured color table. */ /* -------------------------------------------------------------------- */ if (band_count == 3) { *pnNoData1 = (int)msGetGDALNoDataValue( layer, GDALGetRasterBand(hDS, band_numbers[0]), pbHaveRGBNoData); if (*pbHaveRGBNoData) *pnNoData2 = (int)msGetGDALNoDataValue( layer, GDALGetRasterBand(hDS, band_numbers[1]), pbHaveRGBNoData); if (*pbHaveRGBNoData) *pnNoData3 = (int)msGetGDALNoDataValue( layer, GDALGetRasterBand(hDS, band_numbers[2]), pbHaveRGBNoData); } /* -------------------------------------------------------------------- */ /* Are we doing a simple, non-scaling case? If so, read directly */ /* and return. */ /* -------------------------------------------------------------------- */ if (CSLFetchNameValue(layer->processing, "SCALE") == NULL && CSLFetchNameValue(layer->processing, "SCALE_1") == NULL && CSLFetchNameValue(layer->processing, "SCALE_2") == NULL && CSLFetchNameValue(layer->processing, "SCALE_3") == NULL && CSLFetchNameValue(layer->processing, "SCALE_4") == NULL) { GDALDataType eDT; GUInt16 *panBuffer = NULL; void *pBuffer; papszLUTs = LoadLUTs(layer, band_count); if (papszLUTs == NULL) { return -1; } eDT = GetDataTypeAppropriateForLUTS(papszLUTs); if (eDT == GDT_UInt16) { panBuffer = (GUInt16 *)malloc(sizeof(GUInt16) * dst_xsize * dst_ysize * band_count); if (panBuffer == NULL) { msSetError(MS_MEMERR, "Allocating work uint16 image of size %dx%dx%d failed.", "msDrawRasterLayerGDAL()", dst_xsize, dst_ysize, band_count); FreeLUTs(papszLUTs); return -1; } pBuffer = panBuffer; } else pBuffer = pabyWholeBuffer; eErr = GDALDatasetRasterIO(hDS, GF_Read, src_xoff, src_yoff, src_xsize, src_ysize, pBuffer, dst_xsize, dst_ysize, eDT, band_count, band_numbers, 0, 0, 0); if (eErr != CE_None) { msSetError(MS_IOERR, "GDALDatasetRasterIO() failed: %s", "drawGDAL()", CPLGetLastErrorMsg()); FreeLUTs(papszLUTs); msFree(panBuffer); return -1; } for (iColorIndex = 0; iColorIndex < band_count && result_code == 0; iColorIndex++) { result_code = ApplyLUT(iColorIndex + 1, papszLUTs[iColorIndex], (GByte *)pBuffer + dst_xsize * dst_ysize * iColorIndex * GDALGetDataTypeSizeBytes(eDT), eDT, pabyWholeBuffer + dst_xsize * dst_ysize * iColorIndex, dst_xsize * dst_ysize); } FreeLUTs(papszLUTs); msFree(panBuffer); return result_code; } /* -------------------------------------------------------------------- */ /* Disable use of nodata if we are doing scaling. */ /* -------------------------------------------------------------------- */ *pbHaveRGBNoData = FALSE; /* -------------------------------------------------------------------- */ /* We need to do some scaling. Will load into either a 16bit */ /* unsigned or a floating point buffer depending on the source */ /* data. We offer a special case for 16U data because it is */ /* common and it is a substantial win to avoid a lot of floating */ /* point operations on it. */ /* -------------------------------------------------------------------- */ /* TODO */ /* -------------------------------------------------------------------- */ /* Allocate the raw imagery buffer, and load into it (band */ /* interleaved). */ /* -------------------------------------------------------------------- */ pafWholeRawData = (float *)malloc(sizeof(float) * dst_xsize * dst_ysize * band_count); if (pafWholeRawData == NULL) { msSetError(MS_MEMERR, "Allocating work float image of size %dx%dx%d failed.", "msDrawRasterLayerGDAL()", dst_xsize, dst_ysize, band_count); return -1; } eErr = GDALDatasetRasterIO(hDS, GF_Read, src_xoff, src_yoff, src_xsize, src_ysize, pafWholeRawData, dst_xsize, dst_ysize, GDT_Float32, band_count, band_numbers, 0, 0, 0); if (eErr != CE_None) { msSetError(MS_IOERR, "GDALDatasetRasterIO() failed: %s", "drawGDAL()", CPLGetLastErrorMsg()); free(pafWholeRawData); return -1; } papszLUTs = LoadLUTs(layer, band_count); if (papszLUTs == NULL) { free(pafWholeRawData); return -1; } if (GetDataTypeAppropriateForLUTS(papszLUTs) != GDT_Byte) { msDebug("LoadGDALImage(%s): One of the LUT contains a input value > 255.\n" "This is not properly supported in combination with SCALE\n", layer->name); } /* -------------------------------------------------------------------- */ /* Fetch the scale processing option. */ /* -------------------------------------------------------------------- */ for (iColorIndex = 0; iColorIndex < band_count; iColorIndex++) { unsigned char *pabyBuffer; double dfScaleMin = 0.0, dfScaleMax = 255.0, dfScaleRatio = 0, dfNoDataValue; const char *pszScaleInfo; float *pafRawData; int nPixelCount = dst_xsize * dst_ysize, i, bGotNoData = FALSE; GDALRasterBandH hBand = GDALGetRasterBand(hDS, band_numbers[iColorIndex]); pszScaleInfo = CSLFetchNameValue(layer->processing, "SCALE"); const bool bIsAllBandScale = pszScaleInfo != NULL; if (pszScaleInfo == NULL) { char szBandScalingName[20]; sprintf(szBandScalingName, "SCALE_%d", iColorIndex + 1); pszScaleInfo = CSLFetchNameValue(layer->processing, szBandScalingName); } if (pszScaleInfo != NULL) { char **papszTokens; papszTokens = CSLTokenizeStringComplex(pszScaleInfo, " ,", FALSE, FALSE); if (CSLCount(papszTokens) == 1 && EQUAL(papszTokens[0], "AUTO")) { if (bIsAllBandScale && GDALGetRasterColorInterpretation(hBand) == GCI_AlphaBand && GDALGetRasterDataType(hBand) == GDT_Byte) { // Do not try to scale the alpha band, as it is going to produce // wrong results dfScaleMin = 0.0; dfScaleMax = 255.0; dfScaleRatio = 1.0; } else { dfScaleMin = dfScaleMax = 0.0; } } else if (CSLCount(papszTokens) != 2) { free(pafWholeRawData); CSLDestroy(papszTokens); FreeLUTs(papszLUTs); msSetError(MS_MISCERR, "SCALE PROCESSING option unparsable for layer %s.", "msDrawGDAL()", layer->name); return -1; } else { dfScaleMin = atof(papszTokens[0]); dfScaleMax = atof(papszTokens[1]); } CSLDestroy(papszTokens); } /* -------------------------------------------------------------------- */ /* If we are using autoscaling, then compute the max and min */ /* now. Perhaps we should eventually honour the offsite value */ /* as a nodata value, or get it from GDAL. */ /* -------------------------------------------------------------------- */ pafRawData = pafWholeRawData + iColorIndex * dst_xsize * dst_ysize; dfNoDataValue = msGetGDALNoDataValue(layer, hBand, &bGotNoData); /* we force assignment to a float rather than letting pafRawData[i] get promoted to double later to avoid float precision issues. */ float fNoDataValue = (float)dfNoDataValue; if (dfScaleMin == dfScaleMax) { int bMinMaxSet = 0; /* we force assignment to a float rather than letting pafRawData[i] get promoted to double later to avoid float precision issues. */ float fNoDataValue = (float)dfNoDataValue; for (i = 0; i < nPixelCount; i++) { if (bGotNoData && IsNoData(pafRawData[i], fNoDataValue)) continue; if (CPLIsNan(pafRawData[i])) continue; if (!bMinMaxSet) { dfScaleMin = dfScaleMax = pafRawData[i]; bMinMaxSet = TRUE; } dfScaleMin = MS_MIN(dfScaleMin, pafRawData[i]); dfScaleMax = MS_MAX(dfScaleMax, pafRawData[i]); } if (dfScaleMin == dfScaleMax) dfScaleMax = dfScaleMin + 1.0; } if (layer->debug > 0) msDebug("msDrawGDAL(%s): scaling to 8bit, src range=%g,%g\n", layer->name, dfScaleMin, dfScaleMax); /* -------------------------------------------------------------------- */ /* Now process the data. */ /* -------------------------------------------------------------------- */ if (dfScaleRatio == 0.0) dfScaleRatio = 256.0 / (dfScaleMax - dfScaleMin); pabyBuffer = pabyWholeBuffer + iColorIndex * nPixelCount; if (iColorIndex == 0 && bGotNoData) *ppbIsNoDataBuffer = (bool *)calloc(nPixelCount, 1); for (i = 0; i < nPixelCount; i++) { float fScaledValue; if (bGotNoData && IsNoData(pafRawData[i], fNoDataValue)) { if (iColorIndex == 0) (*ppbIsNoDataBuffer)[i] = true; continue; } fScaledValue = (float)((pafRawData[i] - dfScaleMin) * dfScaleRatio); if (fScaledValue < 0.0) pabyBuffer[i] = 0; else if (fScaledValue > 255.0) pabyBuffer[i] = 255; else pabyBuffer[i] = (int)fScaledValue; } if (iColorIndex == 0) { *pbScaled = true; *pdfScaleMin = dfScaleMin; *pdfScaleRatio = dfScaleRatio; } /* -------------------------------------------------------------------- */ /* Report a warning if NODATA keyword was applied. We are */ /* unable to utilize it since we can't return any pixels marked */ /* as nodata from this function. Need to fix someday. */ /* -------------------------------------------------------------------- */ if (bGotNoData) msDebug("LoadGDALImage(%s): NODATA value %g in GDAL\n" "file or PROCESSING directive largely ignored. Not yet fully " "supported for\n" "unclassified scaled data. The NODATA value is excluded from " "auto-scaling\n" "min/max computation, but will not be transparent.\n", layer->name, dfNoDataValue); /* -------------------------------------------------------------------- */ /* Apply LUT if there is one. */ /* -------------------------------------------------------------------- */ result_code = ApplyLUT(iColorIndex + 1, papszLUTs[iColorIndex], pabyBuffer, GDT_Byte, pabyBuffer, dst_xsize * dst_ysize); if (result_code == -1) { free(pafWholeRawData); FreeLUTs(papszLUTs); return result_code; } } free(pafWholeRawData); FreeLUTs(papszLUTs); return result_code; } /************************************************************************/ /* msGetGDALGeoTransform() */ /* */ /* Cover function that tries GDALGetGeoTransform(), a world */ /* file or OWS extents. It is assumed that TLOCK_GDAL is held */ /* before this function is called. */ /************************************************************************/ int msGetGDALGeoTransform(GDALDatasetH hDS, mapObj *map, layerObj *layer, double *padfGeoTransform) { const char *extent_priority = NULL; const char *value; const char *gdalDesc; const char *fullPath; char *fileExtension = NULL; char szPath[MS_MAXPATHLEN]; int fullPathLen; int success = 0; rectObj rect; /* -------------------------------------------------------------------- */ /* some GDAL drivers (ie. GIF) don't set geotransform on failure. */ /* -------------------------------------------------------------------- */ padfGeoTransform[0] = 0.0; padfGeoTransform[1] = 1.0; padfGeoTransform[2] = 0.0; padfGeoTransform[3] = GDALGetRasterYSize(hDS); padfGeoTransform[4] = 0.0; padfGeoTransform[5] = -1.0; /* -------------------------------------------------------------------- */ /* Do we want to override GDAL with a worldfile if one is present? */ /* -------------------------------------------------------------------- */ extent_priority = CSLFetchNameValue(layer->processing, "EXTENT_PRIORITY"); if (extent_priority != NULL && EQUALN(extent_priority, "WORLD", 5)) { /* is there a user configured worldfile? */ value = CSLFetchNameValue(layer->processing, "WORLDFILE"); if (value != NULL) { /* at this point, fullPath may be a filePath or path only */ fullPath = msBuildPath(szPath, map->mappath, value); /* fullPath is a path only, so let's append the dataset filename */ if (strrchr(szPath, '.') == NULL) { fullPathLen = strlen(fullPath); gdalDesc = msStripPath((char *)GDALGetDescription(hDS)); if ((fullPathLen + strlen(gdalDesc)) < MS_MAXPATHLEN) { strcpy((char *)(fullPath + fullPathLen), gdalDesc); } else { msDebug( "Path length to alternative worldfile exceeds MS_MAXPATHLEN.\n"); fullPath = NULL; } } /* fullPath has a filename included, so get the extension */ else { fileExtension = msStrdup(strrchr(szPath, '.') + 1); } } /* common behavior with worldfile generated from basename + .wld */ else { fullPath = GDALGetDescription(hDS); fileExtension = msStrdup("wld"); } if (fullPath) success = GDALReadWorldFile(fullPath, fileExtension, padfGeoTransform); if (success && layer->debug >= MS_DEBUGLEVEL_VVV) { msDebug("Worldfile location: %s.\n", fullPath); } else if (layer->debug >= MS_DEBUGLEVEL_VVV) { msDebug("Failed using worldfile location: %s.\n", fullPath ? fullPath : "(null)"); } msFree(fileExtension); if (success) return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* Try GDAL. */ /* */ /* Make sure that ymax is always at the top, and ymin at the */ /* bottom ... that is flip any files without the usual */ /* orientation. This is intended to enable display of "raw" */ /* files with no coordinate system otherwise they break down in */ /* many ways. */ /* -------------------------------------------------------------------- */ if (GDALGetGeoTransform(hDS, padfGeoTransform) == CE_None) { if (padfGeoTransform[5] == 1.0 && padfGeoTransform[3] == 0.0) { padfGeoTransform[5] = -1.0; padfGeoTransform[3] = GDALGetRasterYSize(hDS); } return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* Try worldfile. */ /* -------------------------------------------------------------------- */ if (GDALGetDescription(hDS) != NULL && GDALReadWorldFile(GDALGetDescription(hDS), "wld", padfGeoTransform)) { return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* Do we have the extent keyword on the layer? We only use */ /* this if we have a single raster associated with the layer as */ /* opposed to a tile index. */ /* */ /* Arguably this ought to take priority over all the other */ /* stuff. */ /* -------------------------------------------------------------------- */ if (MS_VALID_EXTENT(layer->extent) && layer->data != NULL) { rect = layer->extent; padfGeoTransform[0] = rect.minx; padfGeoTransform[1] = (rect.maxx - rect.minx) / (double)GDALGetRasterXSize(hDS); padfGeoTransform[2] = 0; padfGeoTransform[3] = rect.maxy; padfGeoTransform[4] = 0; padfGeoTransform[5] = (rect.miny - rect.maxy) / (double)GDALGetRasterYSize(hDS); return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* We didn't find any info ... use the default. */ /* Reset our default geotransform. GDALGetGeoTransform() may */ /* have altered it even if GDALGetGeoTransform() failed. */ /* -------------------------------------------------------------------- */ padfGeoTransform[0] = 0.0; padfGeoTransform[1] = 1.0; padfGeoTransform[2] = 0.0; padfGeoTransform[3] = GDALGetRasterYSize(hDS); padfGeoTransform[4] = 0.0; padfGeoTransform[5] = -1.0; return MS_FAILURE; } /************************************************************************/ /* msDrawRasterLayerGDAL_RawMode() */ /* */ /* Handle the loading and application of data in rawmode. */ /************************************************************************/ static int msDrawRasterLayerGDAL_RawMode(mapObj *map, layerObj *layer, imageObj *image, GDALDatasetH hDS, int src_xoff, int src_yoff, int src_xsize, int src_ysize, int dst_xoff, int dst_yoff, int dst_xsize, int dst_ysize) { void *pBuffer; GDALDataType eDataType; int *band_list, band_count; int i, j, k, band; CPLErr eErr; double *d_nodatas = NULL; unsigned char *b_nodatas = NULL; GInt16 *i_nodatas = NULL; int got_nodata = FALSE; rasterBufferObj *mask_rb = NULL; rasterBufferObj s_mask_rb; if (layer->mask) { int ret; layerObj *maskLayer = GET_LAYER(map, msGetLayerIndex(map, layer->mask)); mask_rb = &s_mask_rb; memset(mask_rb, 0, sizeof(s_mask_rb)); ret = MS_IMAGE_RENDERER(maskLayer->maskimage) ->getRasterBufferHandle(maskLayer->maskimage, mask_rb); if (ret != MS_SUCCESS) return -1; } if (image->format->bands > 256) { msSetError(MS_IMGERR, "Too many bands (more than 256).", "msDrawRasterLayerGDAL_RawMode()"); return -1; } /* -------------------------------------------------------------------- */ /* What data type do we need? */ /* -------------------------------------------------------------------- */ if (image->format->imagemode == MS_IMAGEMODE_INT16) eDataType = GDT_Int16; else if (image->format->imagemode == MS_IMAGEMODE_FLOAT32) eDataType = GDT_Float32; else if (image->format->imagemode == MS_IMAGEMODE_FLOAT64) eDataType = GDT_Float64; else if (image->format->imagemode == MS_IMAGEMODE_BYTE) eDataType = GDT_Byte; else return -1; /* -------------------------------------------------------------------- */ /* Work out the band list. */ /* -------------------------------------------------------------------- */ band_list = msGetGDALBandList(layer, hDS, image->format->bands, &band_count); if (band_list == NULL) return -1; if (band_count != image->format->bands) { free(band_list); msSetError(MS_IMGERR, "BANDS PROCESSING directive has wrong number of bands, expected " "%d, got %d.", "msDrawRasterLayerGDAL_RawMode()", image->format->bands, band_count); return -1; } /* -------------------------------------------------------------------- */ /* Do we have nodata values? */ /* -------------------------------------------------------------------- */ d_nodatas = (double *)calloc(band_count, sizeof(double)); if (d_nodatas == NULL) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msDrawRasterLayerGDAL_RawMode()", __FILE__, __LINE__, (unsigned int)(sizeof(double) * band_count)); free(band_list); return -1; } if (band_count <= 3 && (layer->offsite.red != -1 || layer->offsite.green != -1 || layer->offsite.blue != -1)) { if (band_count > 0) d_nodatas[0] = layer->offsite.red; if (band_count > 1) d_nodatas[1] = layer->offsite.green; if (band_count > 2) d_nodatas[2] = layer->offsite.blue; got_nodata = TRUE; } if (!got_nodata) { got_nodata = TRUE; for (band = 0; band < band_count && got_nodata; band++) { d_nodatas[band] = msGetGDALNoDataValue( layer, GDALGetRasterBand(hDS, band_list[band]), &got_nodata); } } if (!got_nodata) { free(d_nodatas); d_nodatas = NULL; } else if (eDataType == GDT_Byte) { b_nodatas = (unsigned char *)d_nodatas; for (band = 0; band < band_count; band++) b_nodatas[band] = (unsigned char)d_nodatas[band]; } else if (eDataType == GDT_Int16) { i_nodatas = (GInt16 *)d_nodatas; for (band = 0; band < band_count; band++) i_nodatas[band] = (GInt16)d_nodatas[band]; } /* -------------------------------------------------------------------- */ /* Allocate buffer, and read data into it. */ /* -------------------------------------------------------------------- */ pBuffer = malloc(((size_t)dst_xsize) * dst_ysize * image->format->bands * GDALGetDataTypeSizeBytes(eDataType)); if (pBuffer == NULL) { msSetError(MS_MEMERR, "Allocating work image of size %dx%d failed.", "msDrawRasterLayerGDAL()", dst_xsize, dst_ysize); free(band_list); free(d_nodatas); return -1; } eErr = GDALDatasetRasterIO(hDS, GF_Read, src_xoff, src_yoff, src_xsize, src_ysize, pBuffer, dst_xsize, dst_ysize, eDataType, image->format->bands, band_list, 0, 0, 0); free(band_list); if (eErr != CE_None) { msSetError(MS_IOERR, "GDALRasterIO() failed: %s", "msDrawRasterLayerGDAL_RawMode()", CPLGetLastErrorMsg()); free(pBuffer); free(d_nodatas); return -1; } /* -------------------------------------------------------------------- */ /* Transfer the data to the imageObj. */ /* -------------------------------------------------------------------- */ k = 0; for (band = 0; band < image->format->bands; band++) { for (i = dst_yoff; i < dst_yoff + dst_ysize; i++) { if (image->format->imagemode == MS_IMAGEMODE_INT16) { for (j = dst_xoff; j < dst_xoff + dst_xsize; j++) { int off = j + i * image->width + band * image->width * image->height; int off_mask = j + i * image->width; if ((i_nodatas && ((GInt16 *)pBuffer)[k] == i_nodatas[band]) || SKIP_MASK(j, i)) { k++; continue; } image->img.raw_16bit[off] = ((GInt16 *)pBuffer)[k++]; MS_SET_BIT(image->img_mask, off_mask); } } else if (image->format->imagemode == MS_IMAGEMODE_FLOAT32) { for (j = dst_xoff; j < dst_xoff + dst_xsize; j++) { int off = j + i * image->width + band * image->width * image->height; int off_mask = j + i * image->width; if ((d_nodatas && ((float *)pBuffer)[k] == d_nodatas[band]) || SKIP_MASK(j, i)) { k++; continue; } image->img.raw_float[off] = ((float *)pBuffer)[k++]; MS_SET_BIT(image->img_mask, off_mask); } } else if (image->format->imagemode == MS_IMAGEMODE_FLOAT64) { for (j = dst_xoff; j < dst_xoff + dst_xsize; j++) { int off = j + i * image->width + band * image->width * image->height; int off_mask = j + i * image->width; if ((d_nodatas && ((double *)pBuffer)[k] == d_nodatas[band]) || SKIP_MASK(j, i)) { k++; continue; } image->img.raw_double[off] = ((double *)pBuffer)[k++]; MS_SET_BIT(image->img_mask, off_mask); } } else if (image->format->imagemode == MS_IMAGEMODE_BYTE) { for (j = dst_xoff; j < dst_xoff + dst_xsize; j++) { int off = j + i * image->width + band * image->width * image->height; int off_mask = j + i * image->width; if ((b_nodatas && ((unsigned char *)pBuffer)[k] == b_nodatas[band]) || SKIP_MASK(j, i)) { k++; continue; } image->img.raw_byte[off] = ((unsigned char *)pBuffer)[k++]; MS_SET_BIT(image->img_mask, off_mask); } } } } free(pBuffer); free(d_nodatas); return 0; } /************************************************************************/ /* msDrawRasterLayerGDAL_16BitClassifcation() */ /* */ /* Handle the rendering of rasters going through a 16bit */ /* classification lookup instead of the more common 8bit one. */ /* */ /* Currently we are using one data path where we load the */ /* raster into a floating point buffer, and then scale to */ /* 16bit. Eventually we could add optimizations for some of */ /* the 16bit cases at the cost of some complication. */ /************************************************************************/ static int msDrawRasterLayerGDAL_16BitClassification( mapObj *map, layerObj *layer, rasterBufferObj *rb, GDALRasterBandH hBand, int src_xoff, int src_yoff, int src_xsize, int src_ysize, int dst_xoff, int dst_yoff, int dst_xsize, int dst_ysize) { float *pafRawData; double dfScaleMin = 0.0, dfScaleMax = 0.0, dfScaleRatio; int nPixelCount = dst_xsize * dst_ysize, i, nBucketCount = 0; GDALDataType eDataType; float fDataMin = 0.0, fDataMax = 255.0, fNoDataValue; const char *pszScaleInfo; const char *pszBuckets; int *cmap, c, j, k, bGotNoData = FALSE, bGotFirstValue; unsigned char *rb_cmap[4]; CPLErr eErr; rasterBufferObj *mask_rb = NULL; rasterBufferObj s_mask_rb; int lastC; struct mstimeval starttime = {0}, endtime = {0}; const char *pszClassifyScaled; int bClassifyScaled = FALSE; if (layer->mask) { int ret; layerObj *maskLayer = GET_LAYER(map, msGetLayerIndex(map, layer->mask)); mask_rb = &s_mask_rb; memset(mask_rb, 0, sizeof(s_mask_rb)); ret = MS_IMAGE_RENDERER(maskLayer->maskimage) ->getRasterBufferHandle(maskLayer->maskimage, mask_rb); if (ret != MS_SUCCESS) return -1; } assert(rb->type == MS_BUFFER_BYTE_RGBA); /* ==================================================================== */ /* Read the requested data in one gulp into a floating point */ /* buffer. */ /* ==================================================================== */ pafRawData = (float *)malloc(sizeof(float) * dst_xsize * dst_ysize); if (pafRawData == NULL) { msSetError(MS_MEMERR, "Out of memory allocating working buffer.", "msDrawRasterLayerGDAL_16BitClassification()"); return -1; } eErr = GDALRasterIO(hBand, GF_Read, src_xoff, src_yoff, src_xsize, src_ysize, pafRawData, dst_xsize, dst_ysize, GDT_Float32, 0, 0); if (eErr != CE_None) { free(pafRawData); msSetError(MS_IOERR, "GDALRasterIO() failed: %s", "msDrawRasterLayerGDAL_16BitClassification()", CPLGetLastErrorMsg()); return -1; } fNoDataValue = (float)msGetGDALNoDataValue(layer, hBand, &bGotNoData); /* ==================================================================== */ /* Determine scaling. */ /* ==================================================================== */ eDataType = GDALGetRasterDataType(hBand); /* -------------------------------------------------------------------- */ /* Scan for absolute min/max of this block. */ /* -------------------------------------------------------------------- */ bGotFirstValue = FALSE; for (i = 1; i < nPixelCount; i++) { if (bGotNoData && IsNoData(pafRawData[i], fNoDataValue)) continue; if (CPLIsNan(pafRawData[i])) continue; if (!bGotFirstValue) { fDataMin = fDataMax = pafRawData[i]; bGotFirstValue = TRUE; } else { fDataMin = MS_MIN(fDataMin, pafRawData[i]); fDataMax = MS_MAX(fDataMax, pafRawData[i]); } } /* -------------------------------------------------------------------- */ /* Fetch the scale classification option. */ /* -------------------------------------------------------------------- */ pszClassifyScaled = CSLFetchNameValue(layer->processing, "CLASSIFY_SCALED"); if (pszClassifyScaled != NULL) bClassifyScaled = CSLTestBoolean(pszClassifyScaled); /* -------------------------------------------------------------------- */ /* Fetch the scale processing option. */ /* -------------------------------------------------------------------- */ pszBuckets = CSLFetchNameValue(layer->processing, "SCALE_BUCKETS"); pszScaleInfo = CSLFetchNameValue(layer->processing, "SCALE"); if (pszScaleInfo != NULL) { char **papszTokens; papszTokens = CSLTokenizeStringComplex(pszScaleInfo, " ,", FALSE, FALSE); if (CSLCount(papszTokens) == 1 && EQUAL(papszTokens[0], "AUTO")) { dfScaleMin = dfScaleMax = 0.0; } else if (CSLCount(papszTokens) != 2) { free(pafRawData); CSLDestroy(papszTokens); msSetError(MS_MISCERR, "SCALE PROCESSING option unparsable for layer %s.", "msDrawGDAL()", layer->name); return -1; } else { dfScaleMin = atof(papszTokens[0]); dfScaleMax = atof(papszTokens[1]); } CSLDestroy(papszTokens); } /* -------------------------------------------------------------------- */ /* Special integer cases for scaling. */ /* */ /* TODO: Treat Int32 and UInt32 case the same way *if* the min */ /* and max are less than 65536 apart. */ /* -------------------------------------------------------------------- */ if (eDataType == GDT_Byte || eDataType == GDT_Int16 || eDataType == GDT_UInt16) { if (pszScaleInfo == NULL) { dfScaleMin = fDataMin - 0.5; dfScaleMax = fDataMax + 0.5; } if (pszBuckets == NULL) { nBucketCount = (int)floor(fDataMax - fDataMin + 1.1); } } /* -------------------------------------------------------------------- */ /* General case if no scaling values provided in mapfile. */ /* -------------------------------------------------------------------- */ else if (dfScaleMin == 0.0 && dfScaleMax == 0.0) { double dfEpsilon = (fDataMax - fDataMin) / (65536 * 2); dfScaleMin = fDataMin - dfEpsilon; dfScaleMax = fDataMax + dfEpsilon; } /* -------------------------------------------------------------------- */ /* How many buckets? Only set if we don't already have a value. */ /* -------------------------------------------------------------------- */ if (pszBuckets == NULL) { if (nBucketCount == 0) nBucketCount = 65536; } else { nBucketCount = atoi(pszBuckets); if (nBucketCount < 2) { free(pafRawData); msSetError( MS_MISCERR, "SCALE_BUCKETS PROCESSING option is not a value of 2 or more: %s.", "msDrawRasterLayerGDAL_16BitClassification()", pszBuckets); return -1; } } /* -------------------------------------------------------------------- */ /* Compute scaling ratio. */ /* -------------------------------------------------------------------- */ if (dfScaleMax == dfScaleMin) dfScaleMax = dfScaleMin + 1.0; dfScaleRatio = nBucketCount / (dfScaleMax - dfScaleMin); if (layer->debug > 0) msDebug("msDrawRasterGDAL_16BitClassification(%s):\n" " scaling to %d buckets from range=%g,%g.\n", layer->name, nBucketCount, dfScaleMin, dfScaleMax); /* ==================================================================== */ /* Compute classification lookup table. */ /* ==================================================================== */ cmap = (int *)msSmallCalloc(sizeof(int), nBucketCount); rb_cmap[0] = (unsigned char *)msSmallCalloc(1, nBucketCount); rb_cmap[1] = (unsigned char *)msSmallCalloc(1, nBucketCount); rb_cmap[2] = (unsigned char *)msSmallCalloc(1, nBucketCount); rb_cmap[3] = (unsigned char *)msSmallCalloc(1, nBucketCount); if (layer->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&starttime, NULL); } const char *sgamma = msLayerGetProcessingKey(layer, "GAMMA"); const double gamma = sgamma ? CPLAtof(sgamma) : 1.0; lastC = -1; for (i = 0; i < nBucketCount; i++) { double dfOriginalValue; cmap[i] = -1; // i = (int) ((dfOriginalValue - dfScaleMin) * dfScaleRatio+1)-1; dfOriginalValue = (i + 0.5) / dfScaleRatio + dfScaleMin; /* The creation of buckets takes a significant time when they are many, and many classes as well. When iterating over buckets, a faster strategy is to reuse first the last used class index. */ if (bClassifyScaled == TRUE) c = msGetClass_FloatRGB_WithFirstClassToTry(layer, (float)i, -1, -1, -1, lastC); else c = msGetClass_FloatRGB_WithFirstClassToTry(layer, (float)dfOriginalValue, -1, -1, -1, lastC); lastC = c; if (c != -1) { int s; int styleindex = 0; /* change colour based on colour range? */ if (MS_VALID_COLOR(layer->class[c] -> styles[0] -> mincolor)) { styleindex = -1; for (s = 0; s < layer->class[c] -> numstyles; s++) { if (MS_VALID_COLOR(layer->class[c] -> styles[s] -> mincolor) && MS_VALID_COLOR(layer->class[c] -> styles[s] -> maxcolor) && dfOriginalValue + 0.5 / dfScaleRatio >= layer->class[c] -> styles[s] -> minvalue && dfOriginalValue - 0.5 / dfScaleRatio <= layer -> class[c] -> styles[s] -> maxvalue) { msValueToRange(layer->class[c] -> styles[s], dfOriginalValue, MS_COLORSPACE_RGB); styleindex = s; break; } } } if (styleindex >= 0) { if (MS_TRANSPARENT_COLOR( layer->class[c] -> styles[styleindex] -> color)) { /* leave it transparent */ } else if (MS_VALID_COLOR( layer->class[c] -> styles[styleindex] -> color)) { /* use class color */ rb_cmap[0][i] = layer->class[c]->styles[styleindex]->color.red; rb_cmap[1][i] = layer->class[c]->styles[styleindex]->color.green; rb_cmap[2][i] = layer->class[c]->styles[styleindex]->color.blue; rb_cmap[3][i] = (255 * layer->class[c] -> styles[styleindex] -> opacity / 100); if (gamma != 1.0) { rb_cmap[0][i] = GAMMA_CORRECT(rb_cmap[0][i], gamma); rb_cmap[1][i] = GAMMA_CORRECT(rb_cmap[1][i], gamma); rb_cmap[2][i] = GAMMA_CORRECT(rb_cmap[2][i], gamma); } } } } } if (layer->debug >= MS_DEBUGLEVEL_TUNING) { msGettimeofday(&endtime, NULL); msDebug( "msDrawRasterGDAL_16BitClassification() bucket creation time: %.3fs\n", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } /* ==================================================================== */ /* Now process the data, applying to the working imageObj. */ /* ==================================================================== */ k = 0; for (i = dst_yoff; i < dst_yoff + dst_ysize; i++) { for (j = dst_xoff; j < dst_xoff + dst_xsize; j++) { float fRawValue = pafRawData[k++]; int iMapIndex; /* * Skip nodata pixels ... no processing. */ if (bGotNoData && IsNoData(fRawValue, fNoDataValue)) continue; if (CPLIsNan(fRawValue)) continue; if (SKIP_MASK(j, i)) continue; /* * The funny +1/-1 is to avoid odd rounding around zero. * We could use floor() but sometimes it is expensive. */ iMapIndex = (int)((fRawValue - dfScaleMin) * dfScaleRatio + 1) - 1; if (iMapIndex >= nBucketCount || iMapIndex < 0) { continue; } /* currently we never have partial alpha so keep simple */ if (rb_cmap[3][iMapIndex] > 0) RB_SET_PIXEL(rb, j, i, rb_cmap[0][iMapIndex], rb_cmap[1][iMapIndex], rb_cmap[2][iMapIndex], rb_cmap[3][iMapIndex]); } } /* -------------------------------------------------------------------- */ /* Cleanup */ /* -------------------------------------------------------------------- */ free(pafRawData); free(cmap); free(rb_cmap[0]); free(rb_cmap[1]); free(rb_cmap[2]); free(rb_cmap[3]); assert(k == dst_xsize * dst_ysize); return 0; } /************************************************************************/ /* IsNoData() */ /************************************************************************/ static bool IsNoData(double dfValue, double dfNoDataValue) { return isnan(dfValue) || dfValue == dfNoDataValue; } /************************************************************************/ /* msGetGDALNoDataValue() */ /************************************************************************/ double msGetGDALNoDataValue(layerObj *layer, void *hBand, int *pbGotNoData) { const char *pszNODATAOpt; *pbGotNoData = FALSE; /* -------------------------------------------------------------------- */ /* Check for a NODATA setting in the .map file. */ /* -------------------------------------------------------------------- */ pszNODATAOpt = CSLFetchNameValue(layer->processing, "NODATA"); if (pszNODATAOpt != NULL) { if (EQUAL(pszNODATAOpt, "OFF") || strlen(pszNODATAOpt) == 0) return -1234567.0; if (!EQUAL(pszNODATAOpt, "AUTO")) { *pbGotNoData = TRUE; return atof(pszNODATAOpt); } } /* -------------------------------------------------------------------- */ /* Check for a NODATA setting on the raw file. */ /* -------------------------------------------------------------------- */ if (hBand == NULL) return -1234567.0; else return GDALGetRasterNoDataValue(hBand, pbGotNoData); } /************************************************************************/ /* msGetGDALBandList() */ /* */ /* max_bands - pass zero for no limit. */ /* band_count - location in which length of the return band */ /* list is placed. */ /* */ /* returns malloc() list of band numbers (*band_count long). */ /************************************************************************/ int *msGetGDALBandList(layerObj *layer, void *hDS, int max_bands, int *band_count) { int i, file_bands; int *band_list = NULL; file_bands = GDALGetRasterCount(hDS); if (file_bands == 0) { msSetError(MS_IMGERR, "Attempt to operate on GDAL file with no bands, layer=%s.", "msGetGDALBandList()", layer->name); return NULL; } /* -------------------------------------------------------------------- */ /* Use all (or first) bands. */ /* -------------------------------------------------------------------- */ if (CSLFetchNameValue(layer->processing, "BANDS") == NULL) { if (max_bands > 0) *band_count = MS_MIN(file_bands, max_bands); else *band_count = file_bands; band_list = (int *)malloc(sizeof(int) * *band_count); /* FIXME MS_CHECK_ALLOC leaks papszItems */ MS_CHECK_ALLOC(band_list, sizeof(int) * *band_count, NULL); for (i = 0; i < *band_count; i++) band_list[i] = i + 1; return band_list; } /* -------------------------------------------------------------------- */ /* get bands from BANDS processing directive. */ /* -------------------------------------------------------------------- */ else { char **papszItems = CSLTokenizeStringComplex( CSLFetchNameValue(layer->processing, "BANDS"), " ,", FALSE, FALSE); if (CSLCount(papszItems) == 0) { CSLDestroy(papszItems); msSetError(MS_IMGERR, "BANDS PROCESSING directive has no items.", "msGetGDALBandList()"); return NULL; } else if (max_bands != 0 && CSLCount(papszItems) > max_bands) { msSetError(MS_IMGERR, "BANDS PROCESSING directive has wrong number of bands, " "expected at most %d, got %d.", "msGetGDALBandList()", max_bands, CSLCount(papszItems)); CSLDestroy(papszItems); return NULL; } *band_count = CSLCount(papszItems); band_list = (int *)malloc(sizeof(int) * *band_count); MS_CHECK_ALLOC(band_list, sizeof(int) * *band_count, NULL); for (i = 0; i < *band_count; i++) { band_list[i] = atoi(papszItems[i]); if (band_list[i] < 1 || band_list[i] > GDALGetRasterCount(hDS)) { msSetError(MS_IMGERR, "BANDS PROCESSING directive includes illegal band '%s', " "should be from 1 to %d.", "msGetGDALBandList()", papszItems[i], GDALGetRasterCount(hDS)); CSLDestroy(papszItems); free(band_list); return NULL; } } CSLDestroy(papszItems); return band_list; } } mapserver-8.6.0/src/mapdummyrenderer.c000066400000000000000000000270001511405061000200340ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Dummy functions to implement when using a pluggable renderer * Author: Thomas Bonfort, thomas.bonfort@gmail.com * ****************************************************************************** * Copyright (c) 2010, Thomas Bonfort * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" int renderLineDummy(imageObj *img, shapeObj *p, strokeStyleObj *style) { (void)img; (void)p; (void)style; msSetError(MS_RENDERERERR, "renderLine not implemented", "renderLine()"); return MS_FAILURE; } int renderPolygonDummy(imageObj *img, shapeObj *p, colorObj *color) { (void)img; (void)p; (void)color; msSetError(MS_RENDERERERR, "renderPolygon not implemented", "renderPolygon()"); return MS_FAILURE; } int renderPolygonTiledDummy(imageObj *img, shapeObj *p, imageObj *tile) { (void)img; (void)p; (void)tile; msSetError(MS_RENDERERERR, "renderPolygonTiled not implemented", "renderPolygonTiled()"); return MS_FAILURE; } int renderLineTiledDummy(imageObj *img, shapeObj *p, imageObj *tile) { (void)img; (void)p; (void)tile; msSetError(MS_RENDERERERR, "renderLineTiled not implemented", "renderLineTiled()"); return MS_FAILURE; } int renderRasterGlyphsDummy(imageObj *img, double x, double y, int fontIndex, colorObj *color, char *text) { (void)img; (void)x; (void)y; (void)fontIndex; (void)color; (void)text; msSetError(MS_RENDERERERR, "renderRasterGlyphs not implemented", "renderRasterGlyphs()"); return MS_FAILURE; } int renderGlyphsLineDummy(imageObj *img, labelPathObj *labelpath, labelStyleObj *style, char *text) { (void)img; (void)labelpath; (void)style; (void)text; msSetError(MS_RENDERERERR, "renderGlyphsLine not implemented", "renderGlyphsLine()"); return MS_FAILURE; } int renderVectorSymbolDummy(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { (void)img; (void)x; (void)y; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "renderVectorSymbol not implemented", "renderVectorSymbol()"); return MS_FAILURE; } void *createVectorSymbolTileDummy(int width, int height, symbolObj *symbol, symbolStyleObj *style) { (void)width; (void)height; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "createVectorSymbolTile not implemented", "createVectorSymbolTile()"); return NULL; } int renderPixmapSymbolDummy(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { (void)img; (void)x; (void)y; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "renderPixmapSymbol not implemented", "renderPixmapSymbol()"); return MS_FAILURE; } void *createPixmapSymbolTileDummy(int width, int height, symbolObj *symbol, symbolStyleObj *style) { (void)width; (void)height; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "createPixmapSymbolTile not implemented", "createPixmapSymbolTile()"); return NULL; } int renderEllipseSymbolDummy(imageObj *image, double x, double y, symbolObj *symbol, symbolStyleObj *style) { (void)image; (void)x; (void)y; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "renderEllipseSymbol not implemented", "renderEllipseSymbol()"); return MS_FAILURE; } void *createEllipseSymbolTileDummy(int width, int height, symbolObj *symbol, symbolStyleObj *style) { (void)width; (void)height; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "createEllipseSymbolTile not implemented", "createEllipseSymbolTile()"); return NULL; } int renderTruetypeSymbolDummy(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { (void)img; (void)x; (void)y; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "renderTruetypeSymbol not implemented", "renderTruetypeSymbol()"); return MS_FAILURE; } void *createTruetypeSymbolTileDummy(int width, int height, symbolObj *symbol, symbolStyleObj *style) { (void)width; (void)height; (void)symbol; (void)style; msSetError(MS_RENDERERERR, "createTruetypeSymbolTile not implemented", "createTruetypeSymbolTile()"); return NULL; } int renderTileDummy(imageObj *img, imageObj *tile, double x, double y) { (void)img; (void)tile; (void)x; (void)y; msSetError(MS_RENDERERERR, "renderTile not implemented", "renderTile()"); return MS_FAILURE; } rasterBufferObj *loadImageFromFileDummy(char *path) { (void)path; msSetError(MS_RENDERERERR, "loadImageFromFile not implemented", "loadImageFromFile()"); return NULL; } int getRasterBufferHandleDummy(imageObj *img, rasterBufferObj *rb) { (void)img; (void)rb; msSetError(MS_RENDERERERR, "getRasterBufferHandle not implemented", "getRasterBufferHandle()"); return MS_FAILURE; } int getRasterBufferCopyDummy(imageObj *img, rasterBufferObj *rb) { (void)img; (void)rb; msSetError(MS_RENDERERERR, "getRasterBufferCopy not implemented", "getRasterBufferCopy()"); return MS_FAILURE; } rasterBufferObj *createRasterBufferDummy(int width, int height) { (void)width; (void)height; msSetError(MS_RENDERERERR, "createRasterBuffer not implemented", "createRasterBuffer()"); return NULL; } int mergeRasterBufferDummy(imageObj *dest, rasterBufferObj *overlay, double opacity, int srcX, int srcY, int dstX, int dstY, int width, int height) { (void)dest; (void)overlay; (void)opacity; (void)srcX; (void)srcY; (void)dstX; (void)dstY; (void)width; (void)height; msSetError(MS_RENDERERERR, "mergeRasterBuffer not implemented", "mergeRasterBuffer()"); return MS_FAILURE; } int initializeRasterBufferDummy(rasterBufferObj *rb, int width, int height, int mode) { (void)rb; (void)width; (void)height; (void)mode; msSetError(MS_RENDERERERR, "initializeRasterBuffer not implemented", "initializeRasterBuffer()"); return MS_FAILURE; } /* image i/o */ imageObj *createImageDummy(int width, int height, outputFormatObj *format, colorObj *bg) { (void)width; (void)height; (void)format; (void)bg; msSetError(MS_RENDERERERR, "createImage not implemented", "createImage()"); return NULL; } int saveImageDummy(imageObj *img, mapObj *map, FILE *fp, outputFormatObj *format) { (void)img; (void)map; (void)fp; (void)format; msSetError(MS_RENDERERERR, "saveImage not implemented", "saveImage()"); return MS_FAILURE; } /*...*/ /* helper functions */ int getTruetypeTextBBoxDummy(rendererVTableObj *renderer, char **fonts, int numfonts, double size, char *string, rectObj *rect, double **advances, int bAdjustBaseline) { (void)renderer; (void)fonts; (void)numfonts; (void)size; (void)string; (void)rect; (void)advances; (void)bAdjustBaseline; msSetError(MS_RENDERERERR, "getTruetypeTextBBox not implemented", "getTruetypeTextBBox()"); return MS_FAILURE; } int startLayerDummy(imageObj *img, mapObj *map, layerObj *layer) { (void)img; (void)map; (void)layer; msSetError(MS_RENDERERERR, "startLayer not implemented", "startLayer()"); return MS_FAILURE; } int endLayerDummy(imageObj *img, mapObj *map, layerObj *layer) { (void)img; (void)map; (void)layer; msSetError(MS_RENDERERERR, "endLayer not implemented", "endLayer()"); return MS_FAILURE; } int startShapeDummy(imageObj *img, shapeObj *shape) { (void)img; (void)shape; msSetError(MS_RENDERERERR, "startShape not implemented", "startShape()"); return MS_FAILURE; } int endShapeDummy(imageObj *img, shapeObj *shape) { (void)img; (void)shape; msSetError(MS_RENDERERERR, "endShape not implemented", "endShape()"); return MS_FAILURE; } int setClipDummy(imageObj *img, rectObj clipRect) { (void)img; (void)clipRect; msSetError(MS_RENDERERERR, "setClip not implemented", "setClip()"); return MS_FAILURE; } int resetClipDummy(imageObj *img) { (void)img; msSetError(MS_RENDERERERR, "resetClip not implemented", "resetClip()"); return MS_FAILURE; } int freeImageDummy(imageObj *image) { (void)image; msSetError(MS_RENDERERERR, "freeImage not implemented", "freeImage()"); return MS_FAILURE; } int freeTileDummy(imageObj *tile) { (void)tile; msSetError(MS_RENDERERERR, "freeTile not implemented", "freeTile()"); return MS_FAILURE; } int freeSymbolDummy(symbolObj *symbol) { (void)symbol; msSetError(MS_RENDERERERR, "freeSymbol not implemented", "freeSymbol()"); return MS_FAILURE; } int cleanupDummy(void *renderer_data) { (void)renderer_data; return MS_SUCCESS; } int msInitializeDummyRenderer(rendererVTableObj *renderer) { renderer->use_imagecache = 0; renderer->supports_pixel_buffer = 0; renderer->compositeRasterBuffer = NULL; renderer->supports_clipping = 0; renderer->supports_svg = 0; renderer->renderer_data = NULL; renderer->transform_mode = MS_TRANSFORM_SIMPLIFY; renderer->startLayer = &startLayerDummy; renderer->endLayer = &endLayerDummy; renderer->renderLine = &renderLineDummy; renderer->renderLineTiled = NULL; renderer->createImage = &createImageDummy; renderer->saveImage = &saveImageDummy; renderer->getRasterBufferHandle = &getRasterBufferHandleDummy; renderer->getRasterBufferCopy = getRasterBufferCopyDummy; renderer->initializeRasterBuffer = initializeRasterBufferDummy; renderer->renderPolygon = &renderPolygonDummy; renderer->freeImage = &freeImageDummy; renderer->renderEllipseSymbol = &renderEllipseSymbolDummy; renderer->renderVectorSymbol = &renderVectorSymbolDummy; renderer->renderPixmapSymbol = &renderPixmapSymbolDummy; renderer->mergeRasterBuffer = &mergeRasterBufferDummy; renderer->renderTile = &renderTileDummy; renderer->renderPolygonTiled = &renderPolygonTiledDummy; renderer->freeSymbol = &freeSymbolDummy; renderer->cleanup = &cleanupDummy; renderer->startShape = NULL; renderer->endShape = NULL; renderer->renderGlyphs = NULL; return MS_SUCCESS; } mapserver-8.6.0/src/mapentities.h000066400000000000000000000151521511405061000170100ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: HTML entity to unicode lookup table * Author: Thomas Bonfort * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ /* * Generated file * * This file was generated from: * http://www.w3.org/TR/REC-html40/sgml/entities.html * by means of the libgd script: * entities.tcl * and modified to avoid namespace collisions */ #ifdef __cplusplus extern "C" { #endif static const struct mapentities_s { const char *name; int value; } mapentities[] = { {"AElig", 198}, {"Aacute", 193}, {"Acirc", 194}, {"Agrave", 192}, {"Alpha", 913}, {"Aring", 197}, {"Atilde", 195}, {"Auml", 196}, {"Beta", 914}, {"Ccedil", 199}, {"Chi", 935}, {"Dagger", 8225}, {"Delta", 916}, {"ETH", 208}, {"Eacute", 201}, {"Ecirc", 202}, {"Egrave", 200}, {"Epsilon", 917}, {"Eta", 919}, {"Euml", 203}, {"Gamma", 915}, {"Iacute", 205}, {"Icirc", 206}, {"Igrave", 204}, {"Iota", 921}, {"Iuml", 207}, {"Kappa", 922}, {"Lambda", 923}, {"Mu", 924}, {"Ntilde", 209}, {"Nu", 925}, {"OElig", 338}, {"Oacute", 211}, {"Ocirc", 212}, {"Ograve", 210}, {"Omega", 937}, {"Omicron", 927}, {"Oslash", 216}, {"Otilde", 213}, {"Ouml", 214}, {"Phi", 934}, {"Pi", 928}, {"Prime", 8243}, {"Psi", 936}, {"Rho", 929}, {"Scaron", 352}, {"Sigma", 931}, {"THORN", 222}, {"Tau", 932}, {"Theta", 920}, {"Uacute", 218}, {"Ucirc", 219}, {"Ugrave", 217}, {"Upsilon", 933}, {"Uuml", 220}, {"Xi", 926}, {"Yacute", 221}, {"Yuml", 376}, {"Zeta", 918}, {"aacute", 225}, {"acirc", 226}, {"acute", 180}, {"aelig", 230}, {"agrave", 224}, {"alefsym", 8501}, {"alpha", 945}, {"amp", 38}, {"and", 8743}, {"ang", 8736}, {"aring", 229}, {"asymp", 8776}, {"atilde", 227}, {"auml", 228}, {"bdquo", 8222}, {"beta", 946}, {"brvbar", 166}, {"bull", 8226}, {"cap", 8745}, {"ccedil", 231}, {"cedil", 184}, {"cent", 162}, {"chi", 967}, {"circ", 710}, {"clubs", 9827}, {"cong", 8773}, {"copy", 169}, {"crarr", 8629}, {"cup", 8746}, {"curren", 164}, {"dArr", 8659}, {"dagger", 8224}, {"darr", 8595}, {"deg", 176}, {"delta", 948}, {"diams", 9830}, {"divide", 247}, {"eacute", 233}, {"ecirc", 234}, {"egrave", 232}, {"empty", 8709}, {"emsp", 8195}, {"ensp", 8194}, {"epsilon", 949}, {"equiv", 8801}, {"eta", 951}, {"eth", 240}, {"euml", 235}, {"euro", 8364}, {"exist", 8707}, {"fnof", 402}, {"forall", 8704}, {"frac12", 189}, {"frac14", 188}, {"frac34", 190}, {"frasl", 8260}, {"gamma", 947}, {"ge", 8805}, {"gt", 62}, {"hArr", 8660}, {"harr", 8596}, {"hearts", 9829}, {"hellip", 8230}, {"iacute", 237}, {"icirc", 238}, {"iexcl", 161}, {"igrave", 236}, {"image", 8465}, {"infin", 8734}, {"int", 8747}, {"iota", 953}, {"iquest", 191}, {"isin", 8712}, {"iuml", 239}, {"kappa", 954}, {"lArr", 8656}, {"lambda", 955}, {"lang", 9001}, {"laquo", 171}, {"larr", 8592}, {"lceil", 8968}, {"ldquo", 8220}, {"le", 8804}, {"lfloor", 8970}, {"lowast", 8727}, {"loz", 9674}, {"lrm", 8206}, {"lsaquo", 8249}, {"lsquo", 8216}, {"lt", 60}, {"macr", 175}, {"mdash", 8212}, {"micro", 181}, {"middot", 183}, {"minus", 8722}, {"mu", 956}, {"nabla", 8711}, {"nbsp", 160}, {"ndash", 8211}, {"ne", 8800}, {"ni", 8715}, {"not", 172}, {"notin", 8713}, {"nsub", 8836}, {"ntilde", 241}, {"nu", 957}, {"oacute", 243}, {"ocirc", 244}, {"oelig", 339}, {"ograve", 242}, {"oline", 8254}, {"omega", 969}, {"omicron", 959}, {"oplus", 8853}, {"or", 8744}, {"ordf", 170}, {"ordm", 186}, {"oslash", 248}, {"otilde", 245}, {"otimes", 8855}, {"ouml", 246}, {"para", 182}, {"part", 8706}, {"permil", 8240}, {"perp", 8869}, {"phi", 966}, {"pi", 960}, {"piv", 982}, {"plusmn", 177}, {"pound", 163}, {"prime", 8242}, {"prod", 8719}, {"prop", 8733}, {"psi", 968}, {"quot", 34}, {"rArr", 8658}, {"radic", 8730}, {"rang", 9002}, {"raquo", 187}, {"rarr", 8594}, {"rceil", 8969}, {"rdquo", 8221}, {"real", 8476}, {"reg", 174}, {"rfloor", 8971}, {"rho", 961}, {"rlm", 8207}, {"rsaquo", 8250}, {"rsquo", 8217}, {"sbquo", 8218}, {"scaron", 353}, {"sdot", 8901}, {"sect", 167}, {"shy", 173}, {"sigma", 963}, {"sigmaf", 962}, {"sim", 8764}, {"spades", 9824}, {"sub", 8834}, {"sube", 8838}, {"sum", 8721}, {"sup", 8835}, {"sup1", 185}, {"sup2", 178}, {"sup3", 179}, {"supe", 8839}, {"szlig", 223}, {"tau", 964}, {"there4", 8756}, {"theta", 952}, {"thetasym", 977}, {"thinsp", 8201}, {"thorn", 254}, {"tilde", 732}, {"times", 215}, {"trade", 8482}, {"uArr", 8657}, {"uacute", 250}, {"uarr", 8593}, {"ucirc", 251}, {"ugrave", 249}, {"uml", 168}, {"upsih", 978}, {"upsilon", 965}, {"uuml", 252}, {"weierp", 8472}, {"xi", 958}, {"yacute", 253}, {"yen", 165}, {"yuml", 255}, {"zeta", 950}, {"zwj", 8205}, {"zwnj", 8204}, }; #define MAP_ENTITY_NAME_LENGTH_MAX 8 #define MAP_NR_OF_ENTITIES 252 #ifdef __cplusplus } #endif mapserver-8.6.0/src/maperror.c000066400000000000000000000520431511405061000163100ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of msSetError(), msDebug() and related functions. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "maperror.h" #include "mapthread.h" #include "maptime.h" #include #ifndef _WIN32 #include #include #endif #include #include "cpl_conv.h" #include "cpl_string.h" static char *const ms_errorCodes[MS_NUMERRORCODES] = { "", "Unable to access file.", "Memory allocation error.", "Incorrect data type.", "Symbol definition error.", "Regular expression error.", "TrueType Font error.", "DBASE file error.", "GD library error.", "Unknown identifier.", "Premature End-of-File.", "Projection library error.", "General error message.", "CGI error.", "Web application error.", "Image handling error.", "Hash table error.", "Join error.", "Search returned no results.", "Shapefile error.", "Expression parser error.", "SDE error.", "OGR error.", "Query error.", "WMS server error.", "WMS connection error.", "OracleSpatial error.", "WFS server error.", "WFS connection error.", "WMS Map Context error.", "HTTP request error.", "Child array error.", "WCS server error.", "GEOS library error.", "Invalid rectangle.", "Date/time error.", "GML encoding error.", "SOS server error.", "NULL parent pointer error.", "AGG library error.", "OWS error.", "OpenGL renderer error.", "Renderer error.", "V8 engine error.", "OCG API error.", "Flatgeobuf error."}; #ifndef USE_THREAD // Get the MapServer error object errorObj *msGetErrorObj() { static errorObj ms_error = {MS_NOERR, "", "", "", MS_FALSE, 0, NULL, 0}; return &ms_error; } #endif #ifdef USE_THREAD typedef struct te_info { struct te_info *next; void *thread_id; errorObj ms_error; } te_info_t; static te_info_t *error_list = NULL; errorObj *msGetErrorObj() { te_info_t *link; void *thread_id; errorObj *ret_obj; msAcquireLock(TLOCK_ERROROBJ); thread_id = msGetThreadId(); /* find link for this thread */ for (link = error_list; link != NULL && link->thread_id != thread_id && link->next != NULL && link->next->thread_id != thread_id; link = link->next) { } /* If the target thread link is already at the head of the list were ok */ if (error_list != NULL && error_list->thread_id == thread_id) { } /* We don't have one ... initialize one. */ else if (link == NULL || link->next == NULL) { te_info_t *new_link; errorObj error_obj = {MS_NOERR, "", "", "", 0, 0, NULL, 0}; new_link = (te_info_t *)malloc(sizeof(te_info_t)); new_link->next = error_list; new_link->thread_id = thread_id; new_link->ms_error = error_obj; error_list = new_link; } /* If the link is not already at the head of the list, promote it */ else { te_info_t *target = link->next; link->next = link->next->next; target->next = error_list; error_list = target; } ret_obj = &(error_list->ms_error); msReleaseLock(TLOCK_ERROROBJ); return ret_obj; } #endif /* msInsertErrorObj() ** ** We maintain a chained list of errorObj in which the first errorObj is ** the most recent (i.e. a stack). msErrorReset() should be used to clear ** the list. ** ** Note that since some code in MapServer will fetch the head of the list and ** keep a handle on it for a while, the head of the chained list is static ** and never changes. ** A new errorObj is always inserted after the head, and only if the ** head of the list already contains some information. i.e. If the static ** errorObj at the head of the list is empty then it is returned directly, ** otherwise a new object is inserted after the head and the data that was in ** the head is moved to the new errorObj, freeing the head errorObj to receive ** the new error information. */ static errorObj *msInsertErrorObj(void) { errorObj *ms_error; ms_error = msGetErrorObj(); if (ms_error->code != MS_NOERR && ms_error->totalerrorcount < 100) { /* Head of the list already in use, insert a new errorObj after the head * and move head contents to this new errorObj, freeing the errorObj * for reuse. */ errorObj *new_error; new_error = (errorObj *)malloc(sizeof(errorObj)); /* Note: if malloc() failed then we simply do nothing and the head will * be overwritten by the caller... we cannot produce an error here * since we are already inside a msSetError() call. */ if (new_error) { new_error->next = ms_error->next; new_error->code = ms_error->code; new_error->isreported = ms_error->isreported; strlcpy(new_error->routine, ms_error->routine, sizeof(new_error->routine)); strlcpy(new_error->message, ms_error->message, sizeof(new_error->message)); new_error->errorcount = ms_error->errorcount; ms_error->next = new_error; ms_error->code = MS_NOERR; ms_error->isreported = MS_FALSE; ms_error->routine[0] = '\0'; ms_error->message[0] = '\0'; ms_error->errorcount = 0; } ms_error->totalerrorcount++; } return ms_error; } /* msResetErrorList() ** ** Clear the list of error objects. */ void msResetErrorList() { errorObj *ms_error, *this_error; ms_error = msGetErrorObj(); this_error = ms_error->next; while (this_error != NULL) { errorObj *next_error; next_error = this_error->next; msFree(this_error); this_error = next_error; } ms_error->next = NULL; ms_error->code = MS_NOERR; ms_error->isreported = MS_FALSE; ms_error->routine[0] = '\0'; ms_error->message[0] = '\0'; ms_error->errorcount = 0; ms_error->totalerrorcount = 0; /* -------------------------------------------------------------------- */ /* Cleanup our entry in the thread list. This is mainly */ /* imprortant when msCleanup() calls msResetErrorList(). */ /* -------------------------------------------------------------------- */ #ifdef USE_THREAD { void *thread_id = msGetThreadId(); te_info_t *link; msAcquireLock(TLOCK_ERROROBJ); /* find link for this thread */ for (link = error_list; link != NULL && link->thread_id != thread_id && link->next != NULL && link->next->thread_id != thread_id; link = link->next) { } if (link->thread_id == thread_id) { /* presumably link is at head of list. */ if (error_list == link) error_list = link->next; free(link); } else if (link->next != NULL && link->next->thread_id == thread_id) { te_info_t *next_link = link->next; link->next = link->next->next; free(next_link); } msReleaseLock(TLOCK_ERROROBJ); } #endif } char *msGetErrorCodeString(int code) { if (code < 0 || code > MS_NUMERRORCODES - 1) return ("Invalid error code."); return (ms_errorCodes[code]); } /* -------------------------------------------------------------------- */ /* Adding the displayable error string to a given string */ /* and reallocates the memory enough to hold the characters. */ /* If source is null returns a newly allocated string */ /* -------------------------------------------------------------------- */ char *msAddErrorDisplayString(char *source, errorObj *error) { if ((source = msStringConcatenate(source, error->routine)) == NULL) return (NULL); if ((source = msStringConcatenate(source, ": ")) == NULL) return (NULL); if ((source = msStringConcatenate(source, ms_errorCodes[error->code])) == NULL) return (NULL); if ((source = msStringConcatenate(source, " ")) == NULL) return (NULL); if ((source = msStringConcatenate(source, error->message)) == NULL) return (NULL); if (error->errorcount > 0) { char *pszTmp; if ((source = msStringConcatenate(source, " (message repeated ")) == NULL) return (NULL); pszTmp = msIntToString(error->errorcount); if ((source = msStringConcatenate(source, pszTmp)) == NULL) { msFree(pszTmp); return (NULL); } msFree(pszTmp); if ((source = msStringConcatenate(source, " times)")) == NULL) return (NULL); } return source; } char *msGetErrorString(const char *delimiter) { char *errstr = NULL; errorObj *error = msGetErrorObj(); if (!delimiter || !error) return (NULL); while (error && error->code != MS_NOERR) { if ((errstr = msAddErrorDisplayString(errstr, error)) == NULL) return (NULL); if (error->next && error->next->code != MS_NOERR) { /* (peek ahead) more errors, use delimiter */ if ((errstr = msStringConcatenate(errstr, delimiter)) == NULL) return (NULL); } error = error->next; } return (errstr); } static void msRedactString(char *str, const char *keyword) { char *password = strstr(str, keyword); if (password != NULL) { const char chOptionDelimiter = password - str > 0 ? password[-1] : 0; char *ptr = password + strlen(keyword); char chStringSep = *ptr; if (chStringSep == '\'' || chStringSep == '"') { ++ptr; } else if (chOptionDelimiter == ';' && chStringSep == '{' && strcmp(keyword, "pwd=") == 0) { // Handle cases like "\\SQL2019;DATABASE=msautotest;Driver={ODBC Driver 17 // for SQL Server};pwd={Password;12!};uid=sa;" ++ptr; chStringSep = '}'; } else { chStringSep = '\0'; } /* Replace all characters from after equal sign to end of line, end of * string, or end of quoted string. */ char *ptr_first_redacted_char = NULL; while (*ptr != '\0' && *ptr != '\r' && *ptr != '\n') { if (chStringSep == '\0') { if (*ptr == chOptionDelimiter) break; } else { if (*ptr == chStringSep) { break; } if (*ptr == '\\' && ptr[1] == chStringSep) { ptr++; } } if (!ptr_first_redacted_char) { ptr_first_redacted_char = ptr; *ptr = '*'; } ptr++; } if (ptr_first_redacted_char) { memmove(ptr_first_redacted_char + 1, ptr, strlen(ptr) + 1); } } } void msRedactCredentials(char *str) { // postgres or mssql formats msRedactString(str, "password="); // ODBC connections can use pwd rather than password msRedactString(str, "pwd="); } static void msSetErrorInternal(int ms_errcode, const char *http_status, const char *message, const char *routine) { errorObj *ms_error = msGetErrorObj(); /* Insert the error to the list if it is not the same as the previous error*/ if (ms_error->code != ms_errcode || !EQUAL(message, ms_error->message) || !EQUAL(routine, ms_error->routine)) { ms_error = msInsertErrorObj(); if (!routine) strcpy(ms_error->routine, ""); else { strlcpy(ms_error->routine, routine, sizeof(ms_error->routine)); } if (!http_status) strcpy(ms_error->http_status, ""); else { strlcpy(ms_error->http_status, http_status, sizeof(ms_error->http_status)); } strlcpy(ms_error->message, message, sizeof(ms_error->message)); ms_error->code = ms_errcode; ms_error->errorcount = 0; } else ++ms_error->errorcount; msRedactCredentials(ms_error->message); /* Log a copy of errors to MS_ERRORFILE if set (handled automatically inside * msDebug()) */ msDebug("%s: %s %s\n", ms_error->routine, ms_errorCodes[ms_error->code], ms_error->message); } void msSetError(int code, const char *message_fmt, const char *routine, ...) { va_list args; char message[MESSAGELENGTH]; if (!message_fmt) strcpy(message, ""); else { va_start(args, routine); vsnprintf(message, MESSAGELENGTH, message_fmt, args); va_end(args); } msSetErrorInternal(code, NULL, message, routine); } #ifdef _MSC_VER __declspec(thread) int gIsWMS = MS_FALSE; #else static _Thread_local int gIsWMS = MS_FALSE; #endif void msSetErrorSetIsWMS(int is_wms) { gIsWMS = is_wms; } void msSetErrorWithStatus(int ms_errcode, const char *http_status, const char *message_fmt, const char *routine, ...) { va_list args; char message[MESSAGELENGTH]; if (!message_fmt) strcpy(message, ""); else { va_start(args, routine); vsnprintf(message, MESSAGELENGTH, message_fmt, args); va_end(args); } if (http_status) { if (gIsWMS) { if (!CPLTestBoolean( CPLGetConfigOption("MS_WMS_ERROR_STATUS_CODE", "OFF"))) http_status = NULL; } else { http_status = NULL; } } msSetErrorInternal(ms_errcode, http_status, message, routine); } void msWriteError(FILE *stream) { errorObj *ms_error = msGetErrorObj(); while (ms_error && ms_error->code != MS_NOERR) { msIO_fprintf(stream, "%s: %s %s
\n", ms_error->routine, ms_errorCodes[ms_error->code], ms_error->message); ms_error->isreported = MS_TRUE; ms_error = ms_error->next; } } void msWriteErrorXML(FILE *stream) { char *message; errorObj *ms_error = msGetErrorObj(); while (ms_error && ms_error->code != MS_NOERR) { message = msEncodeHTMLEntities(ms_error->message); msIO_fprintf(stream, "%s: %s %s\n", ms_error->routine, ms_errorCodes[ms_error->code], message); ms_error->isreported = MS_TRUE; ms_error = ms_error->next; msFree(message); } } void msWriteErrorImage(mapObj *map, char *filename, int blank) { imageObj *img; int width = 400, height = 300; const int nMargin = 5; char **papszLines = NULL; pointObj pnt = {0}; outputFormatObj *format = NULL; char *errormsg = msGetErrorString("; "); errorObj *error = msGetErrorObj(); char *imagepath = NULL, *imageurl = NULL; colorObj imagecolor, *imagecolorptr = NULL; textSymbolObj ts; labelObj label; int charWidth = 5, charHeight = 8; /* hardcoded, should be looked up from ft face */ if (!errormsg) { errormsg = msStrdup("No error found sorry. This is likely a bug"); } if (map) { if (map->width > 0 && map->height > 0) { width = map->width; height = map->height; } format = map->outputformat; imagepath = map->web.imagepath; imageurl = map->web.imageurl; } /* Default to GIF if no suitable GD output format set */ if (format == NULL || !MS_RENDERER_PLUGIN(format)) format = msCreateDefaultOutputFormat(NULL, "AGG/PNG8", "png", NULL); if (!format->transparent) { if (map && MS_VALID_COLOR(map->imagecolor)) { imagecolorptr = &map->imagecolor; } else { MS_INIT_COLOR(imagecolor, 255, 255, 255, 255); imagecolorptr = &imagecolor; } } img = msImageCreate(width, height, format, imagepath, imageurl, MS_DEFAULT_RESOLUTION, MS_DEFAULT_RESOLUTION, imagecolorptr); const int nTextLength = strlen(errormsg); const int nWidthTxt = nTextLength * charWidth; const int nUsableWidth = width - (nMargin * 2); /* Check to see if it all fits on one line. If not, split the text on several * lines. */ if (!blank) { int nLines; if (nWidthTxt > nUsableWidth) { const int nMaxCharsPerLine = nUsableWidth / charWidth; nLines = (int)ceil((double)nTextLength / (double)nMaxCharsPerLine); if (nLines > 0) { papszLines = (char **)malloc(nLines * sizeof(char *)); for (int i = 0; i < nLines; i++) { papszLines[i] = (char *)malloc((nMaxCharsPerLine + 1) * sizeof(char)); papszLines[i][0] = '\0'; } } for (int i = 0; i < nLines; i++) { const int nStart = i * nMaxCharsPerLine; int nEnd = nStart + nMaxCharsPerLine; if (nStart < nTextLength) { if (nEnd > nTextLength) nEnd = nTextLength; const int nLength = nEnd - nStart; strncpy(papszLines[i], errormsg + nStart, nLength); papszLines[i][nLength] = '\0'; } } } else { nLines = 1; papszLines = (char **)malloc(nLines * sizeof(char *)); papszLines[0] = msStrdup(errormsg); } initLabel(&label); MS_INIT_COLOR(label.color, 0, 0, 0, 255); MS_INIT_COLOR(label.outlinecolor, 255, 255, 255, 255); label.outlinewidth = 1; label.size = MS_SMALL; MS_REFCNT_INCR((&label)); for (int i = 0; i < nLines; i++) { pnt.y = charHeight * ((i * 2) + 1); pnt.x = charWidth; initTextSymbol(&ts); msPopulateTextSymbolForLabelAndString(&ts, &label, papszLines[i], 1, 1, 0); if (MS_LIKELY(MS_SUCCESS == msComputeTextPath(map, &ts))) { if (MS_SUCCESS != msDrawTextSymbol(NULL, img, pnt, &ts)) { /* an error occurred, but there's nothing much we can do about it here * as we are already handling an error condition */ } freeTextSymbol(&ts); } } if (papszLines) { free(papszLines); } } /* actually write the image */ if (!filename) { msIO_setHeader("Content-Type", "%s", MS_IMAGE_MIME_TYPE(format)); msIO_sendHeaders(); } msSaveImage(NULL, img, filename); msFreeImage(img); /* the errors are reported */ while (error && error->code != MS_NOERR) { error->isreported = MS_TRUE; error = error->next; } if (format->refcount == 0) msFreeOutputFormat(format); msFree(errormsg); } char *msGetVersion() { static char version[2048]; sprintf(version, "MapServer version %s", MS_VERSION); // add versions of required dependencies static char PROJVersion[20]; sprintf(PROJVersion, " PROJ version %d.%d", PROJ_VERSION_MAJOR, PROJ_VERSION_MINOR); strcat(version, PROJVersion); static char GDALVersion[20]; sprintf(GDALVersion, " GDAL version %d.%d", GDAL_VERSION_MAJOR, GDAL_VERSION_MINOR); strcat(version, GDALVersion); #if (defined USE_PNG) strcat(version, " OUTPUT=PNG"); #endif #if (defined USE_JPEG) strcat(version, " OUTPUT=JPEG"); #endif #ifdef USE_KML strcat(version, " OUTPUT=KML"); #endif strcat(version, " SUPPORTS=PROJ"); strcat(version, " SUPPORTS=AGG"); strcat(version, " SUPPORTS=FREETYPE"); #ifdef USE_CAIRO strcat(version, " SUPPORTS=CAIRO"); #endif #if defined(USE_SVG_CAIRO) || defined(USE_RSVG) strcat(version, " SUPPORTS=SVG_SYMBOLS"); #ifdef USE_SVG_CAIRO strcat(version, " SUPPORTS=SVGCAIRO"); #else strcat(version, " SUPPORTS=RSVG"); #endif #endif #ifdef USE_OGL strcat(version, " SUPPORTS=OPENGL"); #endif #ifdef USE_ICONV strcat(version, " SUPPORTS=ICONV"); #endif #ifdef USE_EXEMPI strcat(version, " SUPPORTS=XMP"); #endif #ifdef USE_FRIBIDI strcat(version, " SUPPORTS=FRIBIDI"); #endif #ifdef USE_WMS_SVR strcat(version, " SUPPORTS=WMS_SERVER"); #endif #ifdef USE_WMS_LYR strcat(version, " SUPPORTS=WMS_CLIENT"); #endif #ifdef USE_WFS_SVR strcat(version, " SUPPORTS=WFS_SERVER"); #endif #ifdef USE_WFS_LYR strcat(version, " SUPPORTS=WFS_CLIENT"); #endif #ifdef USE_WCS_SVR strcat(version, " SUPPORTS=WCS_SERVER"); #endif #ifdef USE_SOS_SVR strcat(version, " SUPPORTS=SOS_SERVER"); #endif #ifdef USE_OGCAPI_SVR strcat(version, " SUPPORTS=OGCAPI_SERVER"); #endif #ifdef USE_FASTCGI strcat(version, " SUPPORTS=FASTCGI"); #endif #ifdef USE_THREAD strcat(version, " SUPPORTS=THREADS"); #endif #ifdef USE_GEOS strcat(version, " SUPPORTS=GEOS"); #endif #ifdef USE_V8_MAPSCRIPT strcat(version, " SUPPORTS=V8"); #endif #ifdef USE_PBF strcat(version, " SUPPORTS=PBF"); #endif #ifdef USE_JPEG strcat(version, " INPUT=JPEG"); #endif #ifdef USE_SDE strcat(version, " INPUT=SDE"); #endif #ifdef USE_POSTGIS strcat(version, " INPUT=POSTGIS"); #endif #ifdef USE_ORACLESPATIAL strcat(version, " INPUT=ORACLESPATIAL"); #endif strcat(version, " INPUT=OGR"); strcat(version, " INPUT=GDAL"); strcat(version, " INPUT=SHAPEFILE"); strcat(version, " INPUT=FLATGEOBUF"); return (version); } int msGetVersionInt() { return MS_VERSION_NUM; } mapserver-8.6.0/src/maperror.h000066400000000000000000000171761511405061000163250ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Declarations for Error and Debug functions. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPERROR_H #define MAPERROR_H #include "mapthread.h" #ifdef __cplusplus extern "C" { #endif /*==================================================================== * maperror.c *====================================================================*/ #define MS_NOERR 0 /* general error codes */ #define MS_IOERR 1 #define MS_MEMERR 2 #define MS_TYPEERR 3 #define MS_SYMERR 4 #define MS_REGEXERR 5 #define MS_TTFERR 6 #define MS_DBFERR 7 #define MS_IDENTERR 9 #define MS_EOFERR 10 #define MS_PROJERR 11 #define MS_MISCERR 12 #define MS_CGIERR 13 #define MS_WEBERR 14 #define MS_IMGERR 15 #define MS_HASHERR 16 #define MS_JOINERR 17 #define MS_NOTFOUND 18 /* empty search results */ #define MS_SHPERR 19 #define MS_PARSEERR 20 #define MS_UNUSEDERR 21 #define MS_OGRERR 22 #define MS_QUERYERR 23 #define MS_WMSERR 24 /* WMS server error */ #define MS_WMSCONNERR 25 /* WMS connectiontype error */ #define MS_ORACLESPATIALERR 26 #define MS_WFSERR 27 /* WFS server error */ #define MS_WFSCONNERR 28 /* WFS connectiontype error */ #define MS_MAPCONTEXTERR 29 /* Map Context error */ #define MS_HTTPERR 30 #define MS_CHILDERR 31 /* Errors involving arrays of child objects */ #define MS_WCSERR 32 #define MS_GEOSERR 33 #define MS_RECTERR 34 #define MS_TIMEERR 35 #define MS_GMLERR 36 #define MS_SOSERR 37 #define MS_NULLPARENTERR 38 #define MS_AGGERR 39 #define MS_OWSERR 40 #define MS_OGLERR 41 #define MS_RENDERERERR 42 #define MS_V8ERR 43 #define MS_OGCAPIERR 44 #define MS_FGBERR 45 /* NOTE to developers: if adding a new constant, increment MS_NUMERRORCODES and * add a new string in ms_errorCodes[] */ #define MS_NUMERRORCODES 46 #define MESSAGELENGTH 2048 #define ROUTINELENGTH 64 #define HTTPSTATUSLENGTH 128 #define MS_ERROR_LANGUAGE "en-US" #define MS_HTTP_400_BAD_REQUEST "400 Bad Request" #define MS_HTTP_500_INTERNAL_SERVER_ERROR "500 Internal Server Error" #if defined(_WIN32) && !defined(__CYGWIN__) #define MS_DLL_EXPORT __declspec(dllexport) #else #define MS_DLL_EXPORT #endif #ifndef MS_PRINT_FUNC_FORMAT #if defined(__GNUC__) && __GNUC__ >= 3 && !defined(DOXYGEN_SKIP) #define MS_PRINT_FUNC_FORMAT(format_idx, arg_idx) \ __attribute__((__format__(__printf__, format_idx, arg_idx))) #else #define MS_PRINT_FUNC_FORMAT(format_idx, arg_idx) #endif #endif /** This class allows inspection of the MapServer error stack. Instances of errorObj are created internally by MapServer as errors happen. Errors are managed as a chained list with the first item being the most recent error. */ typedef struct errorObj { int code; ///< MapServer error code such as :data:`MS_IMGERR` char routine[ROUTINELENGTH]; ///< MapServer function in which the error was set char message[MESSAGELENGTH]; ///< Context-dependent error message char http_status[HTTPSTATUSLENGTH]; ////< HTTP status int isreported; ///< :data:`MS_TRUE` or :data:`MS_FALSE` flag indicating if ///< the error has been output int errorcount; ///< Number of subsequent errors #ifndef SWIG struct errorObj *next; int totalerrorcount; #endif } errorObj; /* ** Function prototypes */ /** Get the MapServer error object */ MS_DLL_EXPORT errorObj *msGetErrorObj(void); /** Clear the list of error objects */ MS_DLL_EXPORT void msResetErrorList(void); /** Returns a string containing MapServer version information, and details on what optional components are built in - the same report as produced by ``mapserv -v`` */ MS_DLL_EXPORT char *msGetVersion(void); /** Returns the MapServer version number (x.y.z) as an integer (x*10000 + y*100 + z) e.g. V7.4.2 would return 70402 */ MS_DLL_EXPORT int msGetVersionInt(void); /** Return a string of all errors */ MS_DLL_EXPORT char *msGetErrorString(const char *delimiter); #ifndef SWIG MS_DLL_EXPORT void msRedactCredentials(char *str); MS_DLL_EXPORT void msSetError(int code, const char *message, const char *routine, ...) MS_PRINT_FUNC_FORMAT(2, 4); void msSetErrorSetIsWMS(int is_wms); void msSetErrorWithStatus(int ms_errcode, const char *http_status, const char *message, const char *routine, ...) MS_PRINT_FUNC_FORMAT(3, 5); MS_DLL_EXPORT void msWriteError(FILE *stream); MS_DLL_EXPORT void msWriteErrorXML(FILE *stream); MS_DLL_EXPORT char *msGetErrorCodeString(int code); MS_DLL_EXPORT char *msAddErrorDisplayString(char *source, errorObj *error); struct mapObj; MS_DLL_EXPORT void msWriteErrorImage(struct mapObj *map, char *filename, int blank); #endif /* SWIG */ /*==================================================================== * mapdebug.c (See also MS-RFC-28) *====================================================================*/ typedef enum { MS_DEBUGLEVEL_ERRORSONLY = 0, /* DEBUG OFF, log fatal errors */ MS_DEBUGLEVEL_DEBUG = 1, /* DEBUG ON */ MS_DEBUGLEVEL_TUNING = 2, /* Reports timing info */ MS_DEBUGLEVEL_V = 3, /* Verbose */ MS_DEBUGLEVEL_VV = 4, /* Very verbose */ MS_DEBUGLEVEL_VVV = 5, /* Very very verbose */ MS_DEBUGLEVEL_DEVDEBUG = 20, /* Undocumented, will trigger debug messages only useful for developers */ } debugLevel; #ifndef SWIG typedef enum { MS_DEBUGMODE_OFF, MS_DEBUGMODE_FILE, MS_DEBUGMODE_STDERR, MS_DEBUGMODE_STDOUT, MS_DEBUGMODE_WINDOWSDEBUG } debugMode; typedef struct debug_info_obj { debugLevel global_debug_level; debugMode debug_mode; char *errorfile; FILE *fp; /* The following 2 members are used only with USE_THREAD (but we won't #ifndef * them) */ void *thread_id; struct debug_info_obj *next; } debugInfoObj; MS_DLL_EXPORT void msDebug(const char *pszFormat, ...) MS_PRINT_FUNC_FORMAT(1, 2); MS_DLL_EXPORT int msSetErrorFile(const char *pszErrorFile, const char *pszRelToPath); MS_DLL_EXPORT void msCloseErrorFile(void); MS_DLL_EXPORT const char *msGetErrorFile(void); MS_DLL_EXPORT void msSetGlobalDebugLevel(int level); MS_DLL_EXPORT debugLevel msGetGlobalDebugLevel(void); MS_DLL_EXPORT int msDebugInitFromEnv(void); MS_DLL_EXPORT void msDebugCleanup(void); #endif /* SWIG */ #ifdef __cplusplus } #endif #endif /* MAPERROR_H */ mapserver-8.6.0/src/mapfile.c000066400000000000000000007272171511405061000161120ustar00rootroot00000000000000/****************************************************************************** * $id: mapfile.c 7854 2008-08-14 19:22:48Z dmorissette $ * * Project: MapServer * Purpose: High level Map file parsing code. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #include "mapserver.h" #include "mapfile.h" #include "mapthread.h" #include "maptime.h" #include "mapogcsld.h" #include "cpl_conv.h" #include "cpl_port.h" #include "cpl_string.h" extern int msyylex(void); extern void msyyrestart(FILE *); extern int msyylex_destroy(void); extern void msyycleanup_includes(); extern double msyynumber; extern int msyylineno; extern FILE *msyyin; extern int msyysource; extern int msyystate; extern const char *msyystring; extern char *msyybasepath; extern int msyyreturncomments; extern char *msyystring_buffer; extern int msyystring_icase; extern int loadSymbol(symbolObj *s, char *symbolpath); /* in mapsymbol.c */ extern void writeSymbol(symbolObj *s, FILE *stream); /* in mapsymbol.c */ static int loadGrid(layerObj *pLayer); static int loadStyle(styleObj *style); static void writeStyle(FILE *stream, int indent, styleObj *style); static int resolveSymbolNames(mapObj *map); static int loadExpression(expressionObj *exp); static void writeExpression(FILE *stream, int indent, const char *name, expressionObj *exp); /* ** Symbol to string static arrays needed for writing map files. ** Must be kept in sync with enumerations and defines found in mapserver.h. */ /* static char *msUnits[9]={"INCHES", "FEET", "MILES", "METERS", "KILOMETERS", * "DD", "PIXELS", "PERCENTAGES", "NAUTICALMILES"}; */ /* static char *msLayerTypes[10]={"POINT", "LINE", "POLYGON", "RASTER", * "ANNOTATION", "QUERY", "CIRCLE", "TILEINDEX","CHART"}; */ char *msPositionsText[MS_POSITIONS_LENGTH] = { "UL", "LR", "UR", "LL", "CR", "CL", "UC", "LC", "CC", "AUTO", "XY", "FOLLOW"}; /* msLabelPositions[] also used in mapsymbols.c (not static) */ /* static char *msBitmapFontSizes[5]={"TINY", "SMALL", "MEDIUM", "LARGE", * "GIANT"}; */ /* static char *msQueryMapStyles[4]={"NORMAL", "HILITE", "SELECTED", * "INVERTED"}; */ /* static char *msStatus[4]={"OFF", "ON", "DEFAULT", "EMBED"}; */ /* static char *msOnOff[2]={"OFF", "ON"}; */ /* static char *msTrueFalse[2]={"FALSE", "TRUE"}; */ /* static char *msYesNo[2]={"NO", "YES"}; */ /* static char *msJoinType[2]={"ONE-TO-ONE", "ONE-TO-MANY"}; */ /* static char *msAlignValue[3]={"LEFT","CENTER","RIGHT"}; */ /* ** Validates a string (value) against a series of patterns. We support up to *four to allow cascading from classObj to ** layerObj to webObj plus a legacy pattern like TEMPLATEPATTERN. */ int msValidateParameter(const char *value, const char *pattern1, const char *pattern2, const char *pattern3, const char *pattern4) { if (msEvalRegex(pattern1, value) == MS_TRUE) return MS_SUCCESS; if (msEvalRegex(pattern2, value) == MS_TRUE) return MS_SUCCESS; if (msEvalRegex(pattern3, value) == MS_TRUE) return MS_SUCCESS; if (msEvalRegex(pattern4, value) == MS_TRUE) return MS_SUCCESS; return (MS_FAILURE); } int msIsValidRegex(const char *e) { ms_regex_t re; int errcode = ms_regcomp(&re, e, MS_REG_EXTENDED | MS_REG_NOSUB); if (errcode != 0) { char szErrbuf[256]; ms_regerror(errcode, &re, szErrbuf, sizeof(szErrbuf)); msSetError(MS_REGEXERR, "Failed to compile expression (%s): %s.", "msIsValidRegex()", e, szErrbuf); return (MS_FALSE); } ms_regfree(&re); return MS_TRUE; } int msEvalRegex(const char *e, const char *s) { ms_regex_t re; if (!e || !s) return (MS_FALSE); int errcode = ms_regcomp(&re, e, MS_REG_EXTENDED | MS_REG_NOSUB); if (errcode != 0) { char szErrbuf[256]; ms_regerror(errcode, &re, szErrbuf, sizeof(szErrbuf)); msSetError(MS_REGEXERR, "Failed to compile expression (%s): %s.", "msEvalRegex()", e, szErrbuf); return (MS_FALSE); } if (ms_regexec(&re, s, 0, NULL, 0) != 0) { /* no match */ ms_regfree(&re); return (MS_FALSE); } ms_regfree(&re); return (MS_TRUE); } int msCaseEvalRegex(const char *e, const char *s) { ms_regex_t re; if (!e || !s) return (MS_FALSE); if (ms_regcomp(&re, e, MS_REG_EXTENDED | MS_REG_ICASE | MS_REG_NOSUB) != 0) { msSetError(MS_REGEXERR, "Failed to compile expression (%s).", "msEvalRegex()", e); return (MS_FALSE); } if (ms_regexec(&re, s, 0, NULL, 0) != 0) { /* no match */ ms_regfree(&re); return (MS_FALSE); } ms_regfree(&re); return (MS_TRUE); } #ifdef USE_MSFREE void msFree(void *p) { if (p) free(p); } #endif /* ** Free memory allocated for a character array */ void msFreeCharArray(char **array, int num_items) { int i; if (!array) return; for (i = 0; i < num_items; i++) msFree(array[i]); msFree(array); } /* ** Checks symbol from lexer against variable length list of ** legal symbols. */ int getSymbol(int n, ...) { int symbol; va_list argp; int i = 0; symbol = msyylex(); va_start(argp, n); while (i < n) { /* check each symbol in the list */ if (symbol == va_arg(argp, int)) { va_end(argp); return (symbol); } i++; } va_end(argp); msSetError(MS_SYMERR, "Parsing error near (%s):(line %d)", "getSymbol()", msyystring_buffer, msyylineno); return (-1); } /* ** Same as getSymbol, except no error message is set on failure */ int getSymbol2(int n, ...) { int symbol; va_list argp; int i = 0; symbol = msyylex(); va_start(argp, n); while (i < n) { /* check each symbol in the list */ if (symbol == va_arg(argp, int)) { va_end(argp); return (symbol); } i++; } va_end(argp); return (-1); } /* ** Get a string or symbol as a string. Operates like getString(), but also ** supports symbols. */ static char *getToken(void) { msyylex(); return msStrdup(msyystring_buffer); } /* ** Load a string from the map file. A "string" is defined in lexer.l. */ int getString(char **s) { /* if (*s) msSetError(MS_SYMERR, "Duplicate item (%s):(line %d)", "getString()", msyystring_buffer, msyylineno); return(MS_FAILURE); } else */ if (msyylex() == MS_STRING) { if (*s) free(*s); /* avoid leak */ *s = msStrdup(msyystring_buffer); return (MS_SUCCESS); } msSetError(MS_SYMERR, "Parsing error near (%s):(line %d)", "getString()", msyystring_buffer, msyylineno); return (MS_FAILURE); } int msCheckNumber(double number, int num_check_type, double value1, double value2) { if (num_check_type == MS_NUM_CHECK_NONE) { return MS_SUCCESS; } else if (num_check_type == MS_NUM_CHECK_RANGE && number >= value1 && number <= value2) { return MS_SUCCESS; } else if (num_check_type == MS_NUM_CHECK_GT && number > value1) { return MS_SUCCESS; } else if (num_check_type == MS_NUM_CHECK_GTE && number >= value1) { return MS_SUCCESS; } return MS_FAILURE; } /* ** Load a floating point number from the map file. (see lexer.l) */ int getDouble(double *d, int num_check_type, double value1, double value2) { if (msyylex() == MS_NUMBER) { if (msCheckNumber(msyynumber, num_check_type, value1, value2) == MS_SUCCESS) { *d = msyynumber; return (0); } } msSetError(MS_SYMERR, "Parsing error near (%s):(line %d)", "getDouble()", msyystring_buffer, msyylineno); return (-1); } /* ** Load a integer from the map file. (see lexer.l) */ int getInteger(int *i, int num_check_type, int value1, int value2) { if (msyylex() == MS_NUMBER) { if (msCheckNumber(msyynumber, num_check_type, value1, value2) == MS_SUCCESS) { *i = (int)msyynumber; return (0); } } msSetError(MS_SYMERR, "Parsing error near (%s):(line %d)", "getInteger()", msyystring_buffer, msyylineno); return (-1); } int getCharacter(char *c) { if (msyylex() == MS_STRING) { *c = msyystring_buffer[0]; return (0); } msSetError(MS_SYMERR, "Parsing error near (%s):(line %d)", "getCharacter()", msyystring_buffer, msyylineno); return (-1); } /* ** Try to load as an integer, then try as a named symbol. ** Part of work on bug 490. */ int getIntegerOrSymbol(int *i, int n, ...) { int symbol; va_list argp; int j = 0; symbol = msyylex(); if (symbol == MS_NUMBER) { *i = (int)msyynumber; return MS_SUCCESS; /* success */ } va_start(argp, n); while (j < n) { /* check each symbol in the list */ if (symbol == va_arg(argp, int)) { va_end(argp); *i = symbol; return MS_SUCCESS; } j++; } va_end(argp); msSetError(MS_SYMERR, "Parsing error near (%s):(line %d)", "getIntegerOrSymbol()", msyystring_buffer, msyylineno); return (-1); } /* ** msBuildPluginLibraryPath ** ** This function builds a path to be used dynamically to load plugin library. */ int msBuildPluginLibraryPath(char **dest, const char *lib_str, mapObj *map) { char szLibPath[MS_MAXPATHLEN] = {'\0'}; char szLibPathExt[MS_MAXPATHLEN] = {'\0'}; const char *plugin_dir = NULL; if (map) plugin_dir = msLookupHashTable(&(map->configoptions), "MS_PLUGIN_DIR"); /* do nothing on windows, filename without .dll will be loaded by default*/ #if !defined(_WIN32) if (lib_str) { size_t len = strlen(lib_str); if (3 < len && strcmp(lib_str + len - 3, ".so")) { strlcpy(szLibPathExt, lib_str, MS_MAXPATHLEN); strlcat(szLibPathExt, ".so", MS_MAXPATHLEN); lib_str = szLibPathExt; } } #endif /* !defined(_WIN32) */ if (NULL == msBuildPath(szLibPath, plugin_dir, lib_str)) { return MS_FAILURE; } msFree(*dest); *dest = msStrdup(szLibPath); return MS_SUCCESS; } /* ** Returns the index of specified symbol or -1 if not found. ** ** If try_addimage_if_notfound==MS_TRUE then msAddImageSymbol() will be called ** to try to allocate the symbol as an image symbol. */ int msGetSymbolIndex(symbolSetObj *symbols, const char *name, int try_addimage_if_notfound) { int i; if (!symbols || !name) return (-1); /* symbol 0 has no name */ for (i = 1; i < symbols->numsymbols; i++) { if (symbols->symbol[i]->name) if (strcasecmp(symbols->symbol[i]->name, name) == 0) return (i); } if (try_addimage_if_notfound) return ( msAddImageSymbol(symbols, name)); /* make sure it's not a filename */ return (-1); } /* ** Return the index number for a given layer based on its name. */ int msGetLayerIndex(mapObj *map, const char *name) { int i; if (!name) return (-1); for (i = 0; i < map->numlayers; i++) { if (!GET_LAYER(map, i)->name) /* skip it */ continue; if (strcmp(name, GET_LAYER(map, i)->name) == 0) return (i); } return (-1); } int loadColor(colorObj *color, attributeBindingObj *binding) { int symbol; char hex[2]; /* ** Note that negative color values can be used to suppress or change behavior. *For example, referenceObj uses ** a negative color component to suppress rectangle fills. */ if (binding) { if ((symbol = getSymbol(3, MS_NUMBER, MS_BINDING, MS_STRING)) == -1) return MS_FAILURE; } else { if ((symbol = getSymbol(2, MS_NUMBER, MS_STRING)) == -1) return MS_FAILURE; } color->alpha = 255; if (symbol == MS_NUMBER) { if (msyynumber >= -255 && msyynumber <= 255) { color->red = (int)msyynumber; } else { return MS_FAILURE; } if (getInteger(&(color->green), MS_NUM_CHECK_RANGE, -255, 255) == -1) return MS_FAILURE; if (getInteger(&(color->blue), MS_NUM_CHECK_RANGE, -255, 255) == -1) return MS_FAILURE; } else if (symbol == MS_STRING) { int len = strlen(msyystring_buffer); if (msyystring_buffer[0] == '#' && (len == 7 || len == 9)) { /* got a hex color w/optional alpha */ hex[0] = msyystring_buffer[1]; hex[1] = msyystring_buffer[2]; color->red = msHexToInt(hex); hex[0] = msyystring_buffer[3]; hex[1] = msyystring_buffer[4]; color->green = msHexToInt(hex); hex[0] = msyystring_buffer[5]; hex[1] = msyystring_buffer[6]; color->blue = msHexToInt(hex); if (len == 9) { hex[0] = msyystring_buffer[7]; hex[1] = msyystring_buffer[8]; color->alpha = msHexToInt(hex); } } else { /* TODO: consider named colors here */ msSetError(MS_SYMERR, "Invalid hex color (%s):(line %d)", "loadColor()", msyystring_buffer, msyylineno); return MS_FAILURE; } } else { assert(binding); msFree(binding->item); binding->item = msStrdup(msyystring_buffer); binding->index = -1; } return MS_SUCCESS; } #if ALPHACOLOR_ENABLED int loadColorWithAlpha(colorObj *color) { char hex[2]; /* ** Note that negative color values can be used to suppress or change behavior. *For example, referenceObj uses ** a negative color component to suppress rectangle fills. */ if (getInteger(&(color->red), MS_NUM_CHECK_RANGE, -255, 255) == -1) { if (msyystring_buffer[0] == '#' && strlen(msyystring_buffer) == 7) { /* got a hex color */ hex[0] = msyystring_buffer[1]; hex[1] = msyystring_buffer[2]; color->red = msHexToInt(hex); hex[0] = msyystring_buffer[3]; hex[1] = msyystring_buffer[4]; color->green = msHexToInt(hex); hex[0] = msyystring_buffer[5]; hex[1] = msyystring_buffer[6]; color->blue = msHexToInt(hex); color->alpha = 0; return (MS_SUCCESS); } else if (msyystring_buffer[0] == '#' && strlen(msyystring_buffer) == 9) { /* got a hex color with alpha */ hex[0] = msyystring_buffer[1]; hex[1] = msyystring_buffer[2]; color->red = msHexToInt(hex); hex[0] = msyystring_buffer[3]; hex[1] = msyystring_buffer[4]; color->green = msHexToInt(hex); hex[0] = msyystring_buffer[5]; hex[1] = msyystring_buffer[6]; color->blue = msHexToInt(hex); hex[0] = msyystring_buffer[7]; hex[1] = msyystring_buffer[8]; color->alpha = msHexToInt(hex); return (MS_SUCCESS); } return (MS_FAILURE); } if (getInteger(&(color->green), MS_NUM_CHECK_RANGE, -255, 255) == -1) return (MS_FAILURE); if (getInteger(&(color->blue), MS_NUM_CHECK_RANGE, -255, 255) == -1) return (MS_FAILURE); if (getInteger(&(color->alpha), MS_NUM_CHECK_RANGE, 0, 255) == -1) return (MS_FAILURE); return (MS_SUCCESS); } #endif /* ** Helper functions for writing mapfiles. */ static void writeLineFeed(FILE *stream) { msIO_fprintf(stream, "\n"); } static void writeIndent(FILE *stream, int indent) { const char *str = " "; /* change this string to define the indent */ int i; for (i = 0; i < indent; i++) msIO_fprintf(stream, "%s", str); } static void writeBlockBegin(FILE *stream, int indent, const char *name) { writeIndent(stream, indent); msIO_fprintf(stream, "%s\n", name); } static void writeBlockEnd(FILE *stream, int indent, const char *name) { writeIndent(stream, indent); msIO_fprintf(stream, "END # %s\n", name); } static void writeKeyword(FILE *stream, int indent, const char *name, int value, int size, ...) { va_list argp; int i, j = 0; const char *s; va_start(argp, size); while (j < size) { /* check each value/keyword mapping in the list, values with no match are ignored */ i = va_arg(argp, int); s = va_arg(argp, const char *); if (value == i) { writeIndent(stream, ++indent); msIO_fprintf(stream, "%s %s\n", name, s); va_end(argp); return; } j++; } va_end(argp); } static void writeDimension(FILE *stream, int indent, const char *name, double x, double y, char *bind_x, char *bind_y) { writeIndent(stream, ++indent); if (bind_x) msIO_fprintf(stream, "%s [%s] ", name, bind_x); else msIO_fprintf(stream, "%s %.15g ", name, x); if (bind_y) msIO_fprintf(stream, "[%s]\n", bind_y); else msIO_fprintf(stream, "%.15g\n", y); } static void writeDoubleRange(FILE *stream, int indent, const char *name, double x, double y) { writeIndent(stream, ++indent); msIO_fprintf(stream, "%s %f %f\n", name, x, y); } static void writeExtent(FILE *stream, int indent, const char *name, rectObj extent) { if (!MS_VALID_EXTENT(extent)) return; writeIndent(stream, ++indent); msIO_fprintf(stream, "%s %.15g %.15g %.15g %.15g\n", name, extent.minx, extent.miny, extent.maxx, extent.maxy); } static void writeNumber(FILE *stream, int indent, const char *name, double defaultNumber, double number) { if (number == defaultNumber) return; /* don't output default */ writeIndent(stream, ++indent); msIO_fprintf(stream, "%s %.15g\n", name, number); } static void writeCharacter(FILE *stream, int indent, const char *name, const char defaultCharacter, char character) { if (defaultCharacter == character) return; writeIndent(stream, ++indent); msIO_fprintf(stream, "%s '%c'\n", name, character); } static void writeStringElement(FILE *stream, const char *string) { char *string_to_free = NULL; const char *string_escaped; if (strchr(string, '\\')) { string_to_free = msStrdup(string); string_to_free = msReplaceSubstring(string_to_free, "\\", "\\\\"); string_escaped = string_to_free; } else { string_escaped = string; } if ((strchr(string_escaped, '\'') == NULL) && (strchr(string_escaped, '\"') == NULL)) msIO_fprintf(stream, "\"%s\"", string_escaped); else if ((strchr(string_escaped, '\"') != NULL) && (strchr(string_escaped, '\'') == NULL)) msIO_fprintf(stream, "'%s'", string_escaped); else if ((strchr(string_escaped, '\'') != NULL) && (strchr(string_escaped, '\"') == NULL)) msIO_fprintf(stream, "\"%s\"", string_escaped); else { char *string_tmp = msStringEscape(string_escaped); msIO_fprintf(stream, "\"%s\"", string_tmp); if (string_escaped != string_tmp) free(string_tmp); } if (string_to_free) free(string_to_free); } static void writeString(FILE *stream, int indent, const char *name, const char *defaultString, const char *string) { if (!string) return; if (defaultString && strcmp(string, defaultString) == 0) return; writeIndent(stream, ++indent); if (name) msIO_fprintf(stream, "%s ", name); writeStringElement(stream, string); writeLineFeed(stream); } static void writeNumberOrString(FILE *stream, int indent, const char *name, double defaultNumber, double number, char *string) { if (string) writeString(stream, indent, name, NULL, string); else writeNumber(stream, indent, name, defaultNumber, number); } static void writeNumberOrKeyword(FILE *stream, int indent, const char *name, double defaultNumber, double number, int value, int size, ...) { va_list argp; int i, j = 0; const char *s; va_start(argp, size); while (j < size) { /* check each value/keyword mapping in the list */ i = va_arg(argp, int); s = va_arg(argp, const char *); if (value == i) { writeIndent(stream, ++indent); msIO_fprintf(stream, "%s %s\n", name, s); va_end(argp); return; } j++; } va_end(argp); writeNumber(stream, indent, name, defaultNumber, number); } static void writeNameValuePair(FILE *stream, int indent, const char *name, const char *value) { if (!name || !value) return; writeIndent(stream, ++indent); writeStringElement(stream, (char *)name); msIO_fprintf(stream, "\t"); writeStringElement(stream, (char *)value); writeLineFeed(stream); } static void writeAttributeBinding(FILE *stream, int indent, const char *name, attributeBindingObj *binding) { if (!binding || !binding->item) return; writeIndent(stream, ++indent); msIO_fprintf(stream, "%s [%s]\n", name, binding->item); } static void writeColor(FILE *stream, int indent, const char *name, colorObj *defaultColor, colorObj *color) { if (!defaultColor && !MS_VALID_COLOR(*color)) return; else if (defaultColor && MS_COMPARE_COLOR(*defaultColor, *color)) return; /* if defaultColor has the same value than the color, return.*/ writeIndent(stream, ++indent); #if ALPHACOLOR_ENABLED msIO_fprintf(stream, "%s %d %d %d\n", name, color->red, color->green, color->blue, color->alpha); #else if (color->alpha != 255) { char buffer[9]; sprintf(buffer, "%02x", color->red); sprintf(buffer + 2, "%02x", color->green); sprintf(buffer + 4, "%02x", color->blue); sprintf(buffer + 6, "%02x", color->alpha); *(buffer + 8) = 0; msIO_fprintf(stream, "%s \"#%s\"\n", name, buffer); } else { msIO_fprintf(stream, "%s %d %d %d\n", name, color->red, color->green, color->blue); } #endif } /* todo: deal with alpha's... */ static void writeColorRange(FILE *stream, int indent, const char *name, colorObj *mincolor, colorObj *maxcolor) { if (!MS_VALID_COLOR(*mincolor) || !MS_VALID_COLOR(*maxcolor)) return; writeIndent(stream, ++indent); msIO_fprintf(stream, "%s %d %d %d %d %d %d\n", name, mincolor->red, mincolor->green, mincolor->blue, maxcolor->red, maxcolor->green, maxcolor->blue); } /* ** Initialize, load and free a single join */ void initJoin(joinObj *join) { join->numitems = 0; join->name = NULL; /* unique join name, used for variable substitution */ join->items = NULL; /* array to hold item names for the joined table */ join->values = NULL; /* arrays of strings to holds one record worth of data */ join->table = NULL; join->joininfo = NULL; join->from = NULL; /* join items */ join->to = NULL; join->header = NULL; join->template = NULL; /* only html type templates are supported */ join->footer = NULL; join->type = MS_JOIN_ONE_TO_ONE; join->connection = NULL; join->connectiontype = MS_DB_XBASE; } void freeJoin(joinObj *join) { msFree(join->name); msFree(join->table); msFree(join->from); msFree(join->to); msFree(join->header); msFree(join->template); msFree(join->footer); msFreeCharArray(join->items, join->numitems); /* these may have been free'd elsewhere */ msFreeCharArray(join->values, join->numitems); join->numitems = 0; msJoinClose(join); msFree(join->connection); } int loadJoin(joinObj *join) { int nTmp; initJoin(join); for (;;) { switch (msyylex()) { case (CONNECTION): if (getString(&join->connection) == MS_FAILURE) return (-1); break; case (CONNECTIONTYPE): if ((nTmp = getSymbol(5, MS_DB_XBASE, MS_DB_MYSQL, MS_DB_ORACLE, MS_DB_POSTGRES, MS_DB_CSV)) == -1) return (-1); join->connectiontype = nTmp; break; case (EOF): msSetError(MS_EOFERR, NULL, "loadJoin()"); return (-1); case (END): if ((join->from == NULL) || (join->to == NULL) || (join->table == NULL)) { msSetError(MS_EOFERR, "Join must define table, name, from and to properties.", "loadJoin()"); return (-1); } if ((join->type == MS_MULTIPLE) && ((join->template == NULL) || (join->name == NULL))) { msSetError( MS_EOFERR, "One-to-many joins must define template and name properties.", "loadJoin()"); return (-1); } return (0); case (FOOTER): if (getString(&join->footer) == MS_FAILURE) return (-1); break; case (FROM): if (getString(&join->from) == MS_FAILURE) return (-1); break; case (HEADER): if (getString(&join->header) == MS_FAILURE) return (-1); break; case (JOIN): break; /* for string loads */ case (NAME): if (getString(&join->name) == MS_FAILURE) return (-1); break; case (TABLE): if (getString(&join->table) == MS_FAILURE) return (-1); break; case (TEMPLATE): if (getString(&join->template) == MS_FAILURE) return (-1); break; case (TO): if (getString(&join->to) == MS_FAILURE) return (-1); break; case (TYPE): if ((nTmp = getSymbol(2, MS_JOIN_ONE_TO_ONE, MS_JOIN_ONE_TO_MANY)) == -1) return (-1); join->type = nTmp; break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadJoin()", msyystring_buffer, msyylineno); return (-1); } } /* next token */ } static void writeScaleToken(FILE *stream, int indent, scaleTokenObj *token) { int i; indent++; writeBlockBegin(stream, indent, "SCALETOKEN"); writeString(stream, indent, "NAME", NULL, token->name); indent++; writeBlockBegin(stream, indent, "VALUES"); for (i = 0; i < token->n_entries; i++) { char minscale[32]; sprintf(minscale, "%g", token->tokens[i].minscale); writeNameValuePair(stream, indent, minscale, token->tokens[i].value); } writeBlockEnd(stream, indent, "VALUES"); indent--; writeBlockEnd(stream, indent, "SCALETOKEN"); } static void writeJoin(FILE *stream, int indent, joinObj *join) { indent++; writeBlockBegin(stream, indent, "JOIN"); writeString(stream, indent, "FOOTER", NULL, join->footer); writeString(stream, indent, "FROM", NULL, join->from); writeString(stream, indent, "HEADER", NULL, join->header); writeString(stream, indent, "NAME", NULL, join->name); writeString(stream, indent, "TABLE", NULL, join->table); writeString(stream, indent, "TEMPLATE", NULL, join->template); writeString(stream, indent, "TO", NULL, join->to); writeKeyword(stream, indent, "CONNECTIONTYPE", join->connectiontype, 3, MS_DB_CSV, "CSV", MS_DB_POSTGRES, "POSTGRESQL", MS_DB_MYSQL, "MYSQL"); writeKeyword(stream, indent, "TYPE", join->type, 1, MS_JOIN_ONE_TO_MANY, "ONE-TO-MANY"); writeBlockEnd(stream, indent, "JOIN"); } /* inserts a feature at the end of the list, can create a new list */ featureListNodeObjPtr insertFeatureList(featureListNodeObjPtr *list, shapeObj *shape) { featureListNodeObjPtr node; node = (featureListNodeObjPtr)msSmallMalloc(sizeof(featureListNodeObj)); msInitShape(&(node->shape)); if (msCopyShape(shape, &(node->shape)) == -1) { msFree(node); return (NULL); } /* AJS - alans@wunderground.com O(n^2) -> O(n) conversion, keep a pointer to * the end */ /* set the tailifhead to NULL, since it is only set for the head of the list */ node->tailifhead = NULL; node->next = NULL; /* if we are at the head of the list, we need to set the list to node, before * pointing tailifhead somewhere */ if (*list == NULL) { *list = node; } else { if ((*list)->tailifhead != NULL) /* this should never be NULL, but just in case */ (*list)->tailifhead->next = node; /* put the node at the end of the list */ } /* repoint the head of the list to the end - our new element this causes a loop if we are at the head, be careful not to walk in a loop */ (*list)->tailifhead = node; return (node); /* a pointer to last object in the list */ } void freeFeatureList(featureListNodeObjPtr list) { featureListNodeObjPtr listNext = NULL; while (list != NULL) { listNext = list->next; msFreeShape(&(list->shape)); msFree(list); list = listNext; } } /* lineObj = multipointObj */ static int loadFeaturePoints(lineObj *points) { int ret = -1; int buffer_size = 0; points->point = (pointObj *)malloc(sizeof(pointObj) * MS_FEATUREINITSIZE); MS_CHECK_ALLOC(points->point, sizeof(pointObj) * MS_FEATUREINITSIZE, MS_FAILURE); points->numpoints = 0; buffer_size = MS_FEATUREINITSIZE; while (ret < 0) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadFeaturePoints()"); ret = MS_FAILURE; break; case (END): ret = MS_SUCCESS; break; case (MS_NUMBER): if (points->numpoints == buffer_size) { /* just add it to the end */ pointObj *newPoints = (pointObj *)realloc( points->point, sizeof(pointObj) * (buffer_size + MS_FEATUREINCREMENT)); if (newPoints == NULL) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", __FUNCTION__, __FILE__, __LINE__, (unsigned int)(sizeof(pointObj) * (buffer_size + MS_FEATUREINCREMENT))); ret = MS_FAILURE; break; } points->point = newPoints; buffer_size += MS_FEATUREINCREMENT; } points->point[points->numpoints].x = atof(msyystring_buffer); if (getDouble(&(points->point[points->numpoints].y), MS_NUM_CHECK_NONE, -1, -1) == -1) { ret = MS_FAILURE; break; } points->numpoints++; break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadFeaturePoints()", msyystring_buffer, msyylineno); ret = MS_FAILURE; break; } } if (ret == MS_FAILURE) { msFree(points->point); /* clean up */ points->point = NULL; points->numpoints = 0; } return ret; } static int loadFeature(layerObj *player, int type) { int status = MS_SUCCESS; featureListNodeObjPtr *list = &(player->features); multipointObj points = {0, NULL}; shapeObj *shape = NULL; shape = (shapeObj *)malloc(sizeof(shapeObj)); MS_CHECK_ALLOC(shape, sizeof(shapeObj), MS_FAILURE); msInitShape(shape); shape->type = type; for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadFeature()"); msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); case (END): if (player->features != NULL && player->features->tailifhead != NULL) shape->index = player->features->tailifhead->shape.index + 1; else shape->index = 0; if (insertFeatureList(list, shape) == NULL) status = MS_FAILURE; msFreeShape(shape); /* clean up */ msFree(shape); return (status); case (FEATURE): break; /* for string loads */ case (POINTS): if (loadFeaturePoints(&points) == MS_FAILURE) { msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); } status = msAddLine(shape, &points); msFree(points.point); /* clean up */ points.numpoints = 0; if (status == MS_FAILURE) { msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); } break; case (ITEMS): { char *string = NULL; if (getString(&string) == MS_FAILURE) { msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); } if (string) { if (shape->values) msFreeCharArray(shape->values, shape->numvalues); shape->values = msStringSplitComplex(string, ";", &shape->numvalues, MS_ALLOWEMPTYTOKENS); msFree(string); /* clean up */ } break; } case (TEXT): if (getString(&shape->text) == MS_FAILURE) { msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); } break; case (WKT): { char *string = NULL; /* todo, what do we do with multiple WKT property occurrences? */ msFreeShape(shape); msFree(shape); if (getString(&string) == MS_FAILURE) return (MS_FAILURE); if ((shape = msShapeFromWKT(string)) == NULL) status = MS_FAILURE; msFree(string); /* clean up */ if (status == MS_FAILURE) { msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); } break; } default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadfeature()", msyystring_buffer, msyylineno); msFreeShape(shape); /* clean up */ msFree(shape); return (MS_FAILURE); } } /* next token */ } static void writeFeature(FILE *stream, int indent, shapeObj *feature) { int i, j; indent++; writeBlockBegin(stream, indent, "FEATURE"); indent++; for (i = 0; i < feature->numlines; i++) { writeBlockBegin(stream, indent, "POINTS"); for (j = 0; j < feature->line[i].numpoints; j++) { writeIndent(stream, indent); msIO_fprintf(stream, "%.15g %.15g\n", feature->line[i].point[j].x, feature->line[i].point[j].y); } writeBlockEnd(stream, indent, "POINTS"); } indent--; if (feature->numvalues) { writeIndent(stream, indent); msIO_fprintf(stream, "ITEMS \""); for (i = 0; i < feature->numvalues; i++) { if (i == 0) msIO_fprintf(stream, "%s", feature->values[i]); else msIO_fprintf(stream, ";%s", feature->values[i]); } msIO_fprintf(stream, "\"\n"); } writeString(stream, indent, "TEXT", NULL, feature->text); writeBlockEnd(stream, indent, "FEATURE"); } void initGrid(graticuleObj *pGraticule) { memset(pGraticule, 0, sizeof(graticuleObj)); } void freeGrid(graticuleObj *pGraticule) { msFree(pGraticule->labelformat); msFree(pGraticule->pboundingpoints); msFree(pGraticule->pboundinglines); } static int loadGrid(layerObj *pLayer) { for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadGrid()"); return (-1); case (END): return (0); case (GRID): break; /* for string loads */ case (LABELFORMAT): if (getString(&(pLayer->grid->labelformat)) == MS_FAILURE) { if (strcasecmp(msyystring_buffer, "DD") == 0) /* DD triggers a symbol to be returned instead of a string so check for this special case */ { msFree(pLayer->grid->labelformat); pLayer->grid->labelformat = msStrdup("DD"); } else return (-1); } break; case (MINARCS): if (getDouble(&(pLayer->grid->minarcs), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXARCS): if (getDouble(&(pLayer->grid->maxarcs), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MININTERVAL): if (getDouble(&(pLayer->grid->minincrement), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXINTERVAL): if (getDouble(&(pLayer->grid->maxincrement), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MINSUBDIVIDE): if (getDouble(&(pLayer->grid->minsubdivides), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXSUBDIVIDE): if (getDouble(&(pLayer->grid->maxsubdivides), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadGrid()", msyystring_buffer, msyylineno); return (-1); } } } static void writeGrid(FILE *stream, int indent, graticuleObj *pGraticule) { if (!pGraticule) return; indent++; writeBlockBegin(stream, indent, "GRID"); writeString(stream, indent, "LABELFORMAT", NULL, pGraticule->labelformat); writeNumber(stream, indent, "MAXARCS", 0, pGraticule->maxarcs); writeNumber(stream, indent, "MAXSUBDIVIDE", 0, pGraticule->maxsubdivides); writeNumber(stream, indent, "MAXINTERVAL", 0, pGraticule->maxincrement); writeNumber(stream, indent, "MINARCS", 0, pGraticule->minarcs); writeNumber(stream, indent, "MININTERVAL", 0, pGraticule->minincrement); writeNumber(stream, indent, "MINSUBDIVIDE", 0, pGraticule->minsubdivides); writeBlockEnd(stream, indent, "GRID"); } static int loadProjection(projectionObj *p) { p->gt.need_geotransform = MS_FALSE; if (p->proj != NULL || p->numargs != 0) { msSetError(MS_MISCERR, "Projection is already initialized. Multiple projection " "definitions are not allowed in this object. (line %d)", "loadProjection()", msyylineno); return (-1); } for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadProjection()"); return (-1); case (END): if (p->numargs == 1 && strstr(p->args[0], "+") != NULL) { char *one_line_def = p->args[0]; int result; p->args[0] = NULL; p->numargs = 0; result = msLoadProjectionString(p, one_line_def); free(one_line_def); return result; } else { if (p->numargs != 0) return msProcessProjection(p); else return 0; } break; case (MS_STRING): case (MS_AUTO): if (p->numargs == MS_MAXPROJARGS) { msSetError(MS_MISCERR, "Parsing error near (%s):(line %d): Too many arguments in " "projection string", "loadProjection()", msyystring_buffer, msyylineno); return -1; } p->args[p->numargs] = msStrdup(msyystring_buffer); p->numargs++; break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadProjection()", msyystring_buffer, msyylineno); return (-1); } } /* next token */ } /************************************************************************/ /* msLoadProjectionStringEPSGLike */ /************************************************************************/ static int msLoadProjectionStringEPSGLike(projectionObj *p, const char *value, const char *pszPrefix, int bFollowEPSGAxisOrder) { size_t buffer_size = 0; char *init_string = NULL; const char *code; const char *next_sep; size_t prefix_len; prefix_len = strlen(pszPrefix); if (strncasecmp(value, pszPrefix, prefix_len) != 0) return -1; code = value + prefix_len; next_sep = strchr(code, pszPrefix[prefix_len - 1]); if (next_sep != NULL) code = next_sep + 1; buffer_size = 10 + strlen(code) + 1; init_string = (char *)msSmallMalloc(buffer_size); /* translate into PROJ.4 format. */ snprintf(init_string, buffer_size, "init=epsg:%s", code); p->args = (char **)msSmallMalloc(sizeof(char *) * 2); p->args[0] = init_string; p->numargs = 1; if (bFollowEPSGAxisOrder && msIsAxisInverted(atoi(code))) { p->args[1] = msStrdup("+epsgaxis=ne"); p->numargs = 2; } return 0; } /************************************************************************/ /* msLoadProjectionStringCRSLike */ /************************************************************************/ static int msLoadProjectionStringCRSLike(projectionObj *p, const char *value, const char *pszPrefix) { char init_string[100]; const char *id; const char *next_sep; size_t prefix_len; prefix_len = strlen(pszPrefix); if (strncasecmp(value, pszPrefix, prefix_len) != 0) return -1; id = value + prefix_len; next_sep = strchr(id, pszPrefix[prefix_len - 1]); if (next_sep != NULL) id = next_sep + 1; init_string[0] = '\0'; if (strcasecmp(id, "84") == 0 || strcasecmp(id, "CRS84") == 0) strncpy(init_string, "init=epsg:4326", sizeof(init_string)); else if (strcasecmp(id, "83") == 0 || strcasecmp(id, "CRS83") == 0) strncpy(init_string, "init=epsg:4269", sizeof(init_string)); else if (strcasecmp(id, "27") == 0 || strcasecmp(id, "CRS27") == 0) strncpy(init_string, "init=epsg:4267", sizeof(init_string)); else { msSetError(MS_PROJERR, "Unrecognised OGC CRS def '%s'.", "msLoadProjectionString()", value); return -1; } p->args = (char **)msSmallMalloc(sizeof(char *) * 2); p->args[0] = msStrdup(init_string); p->numargs = 1; return 0; } /************************************************************************/ /* msLoadProjectionStringEPSG */ /* */ /* Checks for EPSG type projection and set the axes for a */ /* certain code ranges. */ /* Use for now in WMS 1.3.0 and WFS >= 1.1.0 */ /************************************************************************/ int msLoadProjectionStringEPSG(projectionObj *p, const char *value) { assert(p); msFreeProjectionExceptContext(p); p->gt.need_geotransform = MS_FALSE; #ifdef USE_PROJ_FASTPATHS if (strcasestr(value, "epsg:4326")) { p->wellknownprojection = wkp_lonlat; } else if (strcasestr(value, "epsg:3857")) { p->wellknownprojection = wkp_gmerc; } else { p->wellknownprojection = wkp_none; } #endif if (msLoadProjectionStringEPSGLike(p, value, "EPSG:", MS_TRUE) == 0) { return msProcessProjection(p); } return msLoadProjectionString(p, value); } int msLoadProjectionCodeString(projectionObj *p, const char *value) { int num_params = 0; // exit if init= is already at the start of the string e.g. from // msOGRSpatialRef2ProjectionObj if (strncasecmp(value, "init=", 5) == 0) { return -1; } if (!strchr(value, ':')) { return -1; } char **papszList = msStringSplit(value, ':', &(num_params)); if (num_params != 2) { msFreeCharArray(papszList, num_params); return -1; } const size_t buffer_size = 5 + strlen(value) + 1; char *init_string = (char *)msSmallMalloc(buffer_size); /* translate into PROJ format. */ snprintf(init_string, buffer_size, "init=%s:%s", papszList[0], papszList[1]); p->args = (char **)msSmallMalloc(sizeof(char *)); p->args[0] = init_string; p->numargs = 1; msFreeCharArray(papszList, num_params); return 0; } int msLoadProjectionString(projectionObj *p, const char *value) { assert(p); p->gt.need_geotransform = MS_FALSE; msFreeProjectionExceptContext(p); /* * Handle new style definitions, the same as they would be given to * the proj program. * eg. * "+proj=utm +zone=11 +ellps=WGS84" */ if (value[0] == '+') { char *trimmed; int i, i_out = 0; trimmed = msStrdup(value + 1); for (i = 1; value[i] != '\0'; i++) { if (!isspace(value[i])) trimmed[i_out++] = value[i]; } trimmed[i_out] = '\0'; p->args = msStringSplit(trimmed, '+', &p->numargs); free(trimmed); } else if (strncasecmp(value, "AUTO:", 5) == 0 || strncasecmp(value, "AUTO2:", 6) == 0) { /* WMS/WFS AUTO projection: "AUTO:proj_id,units_id,lon0,lat0" */ /* WMS 1.3.0 projection: "AUTO2:auto_crs_id,factor,lon0,lat0"*/ /* Keep the projection defn into a single token for writeProjection() */ /* to work fine. */ p->args = (char **)msSmallMalloc(sizeof(char *)); p->args[0] = msStrdup(value); p->numargs = 1; } else if (msLoadProjectionStringEPSGLike(p, value, "EPSG:", MS_FALSE) == 0) { /* Assume long/lat ordering. Use msLoadProjectionStringEPSG() if wanting to * follow EPSG axis */ } else if (msLoadProjectionStringEPSGLike( p, value, "urn:ogc:def:crs:EPSG:", MS_TRUE) == 0) { } else if (msLoadProjectionStringEPSGLike( p, value, "urn:EPSG:geographicCRS:", MS_TRUE) == 0) { } else if (msLoadProjectionStringEPSGLike( p, value, "urn:x-ogc:def:crs:EPSG:", MS_TRUE) == 0) { /*this case is to account for OGC CITE tests where x-ogc was used before the ogc name became an official NID. Note also we also account for the fact that a space for the version of the espg is not used with CITE tests. (Syntax used could be urn:ogc:def:objectType:authority:code)*/ } else if (msLoadProjectionStringCRSLike(p, value, "urn:ogc:def:crs:OGC:") == 0) { } else if (msLoadProjectionStringEPSGLike( p, value, "http://www.opengis.net/def/crs/EPSG/", MS_TRUE) == 0) { /* URI projection support */ } else if (msLoadProjectionStringCRSLike( p, value, "http://www.opengis.net/def/crs/OGC/") == 0) { /* Mandatory support for this URI format specified in WFS1.1 (also in 1.0?) */ } else if (msLoadProjectionStringEPSGLike( p, value, "http://www.opengis.net/gml/srs/epsg.xml#", MS_FALSE) == 0) { /* We assume always long/lat ordering, as that is what GeoServer does... */ } else if (msLoadProjectionStringCRSLike(p, value, "CRS:") == 0) { } else if (msLoadProjectionCodeString(p, value) == 0) { /* allow strings in the form AUTH:XXXX */ } /* * Handle old style comma delimited. eg. "proj=utm,zone=11,ellps=WGS84". */ else { p->args = msStringSplit(value, ',', &p->numargs); } return msProcessProjection(p); } static void writeProjection(FILE *stream, int indent, projectionObj *p) { int i; if (!p || p->numargs <= 0) return; indent++; writeBlockBegin(stream, indent, "PROJECTION"); for (i = 0; i < p->numargs; i++) writeString(stream, indent, NULL, NULL, p->args[i]); writeBlockEnd(stream, indent, "PROJECTION"); } void initLeader(labelLeaderObj *leader) { leader->gridstep = 5; leader->maxdistance = 0; /* Set maxstyles = 0, styles[] will be allocated as needed on first call * to msGrowLabelLeaderStyles() */ leader->numstyles = leader->maxstyles = 0; leader->styles = NULL; } /* ** Initialize, load and free a labelObj structure */ void initLabel(labelObj *label) { int i; MS_REFCNT_INIT(label); label->align = MS_ALIGN_DEFAULT; MS_INIT_COLOR(label->color, 0, 0, 0, 255); MS_INIT_COLOR(label->outlinecolor, -1, -1, -1, 255); /* don't use it */ label->outlinewidth = 1; MS_INIT_COLOR(label->shadowcolor, -1, -1, -1, 255); /* don't use it */ label->shadowsizex = label->shadowsizey = 1; label->font = NULL; label->size = MS_MEDIUM; label->position = MS_CC; label->angle = 0; label->anglemode = MS_NONE; label->minsize = MS_MINFONTSIZE; label->maxsize = MS_MAXFONTSIZE; label->buffer = 0; label->offsetx = label->offsety = 0; label->minscaledenom = -1; label->maxscaledenom = -1; label->minfeaturesize = -1; /* no limit */ label->autominfeaturesize = MS_FALSE; label->mindistance = -1; /* no limit */ label->repeatdistance = 0; /* no repeat */ label->maxoverlapangle = 22.5; /* default max overlap angle */ label->partials = MS_FALSE; label->wrap = '\0'; label->maxlength = 0; label->space_size_10 = 0.0; label->encoding = NULL; label->force = MS_OFF; label->priority = MS_DEFAULT_LABEL_PRIORITY; /* Set maxstyles = 0, styles[] will be allocated as needed on first call * to msGrowLabelStyles() */ label->numstyles = label->maxstyles = 0; label->styles = NULL; label->numbindings = 0; label->nexprbindings = 0; for (i = 0; i < MS_LABEL_BINDING_LENGTH; i++) { label->bindings[i].item = NULL; label->bindings[i].index = -1; msInitExpression(&(label->exprBindings[i])); } msInitExpression(&(label->expression)); msInitExpression(&(label->text)); label->leader = NULL; label->sizeunits = MS_INHERIT; label->scalefactor = 1.0; return; } int freeLabelLeader(labelLeaderObj *leader) { int i; for (i = 0; i < leader->numstyles; i++) { if (freeStyle(leader->styles[i]) == MS_SUCCESS) { msFree(leader->styles[i]); } } msFree(leader->styles); return MS_SUCCESS; } int freeLabel(labelObj *label) { int i; if (MS_REFCNT_DECR_IS_NOT_ZERO(label)) { return MS_FAILURE; } msFree(label->font); msFree(label->encoding); for (i = 0; i < label->numstyles; i++) { /* each style */ if (label->styles[i] != NULL) { if (freeStyle(label->styles[i]) == MS_SUCCESS) { msFree(label->styles[i]); } } } msFree(label->styles); for (i = 0; i < MS_LABEL_BINDING_LENGTH; i++) { msFree(label->bindings[i].item); msFreeExpression(&(label->exprBindings[i])); } msFreeExpression(&(label->expression)); msFreeExpression(&(label->text)); if (label->leader) { freeLabelLeader(label->leader); msFree(label->leader); label->leader = NULL; } return MS_SUCCESS; } static int loadLeader(labelLeaderObj *leader) { for (;;) { switch (msyylex()) { case (END): return (0); break; case (EOF): msSetError(MS_EOFERR, NULL, "loadLeader()"); return (-1); case GRIDSTEP: if (getInteger(&(leader->gridstep), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case MAXDISTANCE: if (getInteger(&(leader->maxdistance), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case STYLE: if (msGrowLeaderStyles(leader) == NULL) return (-1); initStyle(leader->styles[leader->numstyles]); if (loadStyle(leader->styles[leader->numstyles]) != MS_SUCCESS) { freeStyle(leader->styles[leader->numstyles]); free(leader->styles[leader->numstyles]); leader->styles[leader->numstyles] = NULL; return -1; } leader->numstyles++; break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadLeader()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } } static int loadLabel(labelObj *label) { int symbol; for (;;) { switch (msyylex()) { case (ANGLE): if ((symbol = getSymbol(5, MS_NUMBER, MS_AUTO, MS_AUTO2, MS_FOLLOW, MS_BINDING)) == -1) return (-1); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_RANGE, -360.0, 360.0) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid ANGLE, must be between -360 and 360 (line %d)", "loadLabel()", msyylineno); return (MS_FAILURE); } label->angle = (double)msyynumber; } else if (symbol == MS_BINDING) { if (label->bindings[MS_LABEL_BINDING_ANGLE].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_ANGLE].item); label->bindings[MS_LABEL_BINDING_ANGLE].item = msStrdup(msyystring_buffer); label->numbindings++; } else { label->anglemode = symbol; } break; case (ALIGN): if ((symbol = getSymbol(4, MS_ALIGN_LEFT, MS_ALIGN_CENTER, MS_ALIGN_RIGHT, MS_BINDING)) == -1) return (-1); if ((symbol == MS_ALIGN_LEFT) || (symbol == MS_ALIGN_CENTER) || (symbol == MS_ALIGN_RIGHT)) { label->align = symbol; } else { if (label->bindings[MS_LABEL_BINDING_ALIGN].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_ALIGN].item); label->bindings[MS_LABEL_BINDING_ALIGN].item = msStrdup(msyystring_buffer); label->numbindings++; } break; case (ANTIALIAS): /*ignore*/ msyylex(); break; case (BUFFER): if (getInteger(&(label->buffer), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); break; case (COLOR): if (loadColor(&(label->color), &(label->bindings[MS_LABEL_BINDING_COLOR])) != MS_SUCCESS) return (-1); if (label->bindings[MS_LABEL_BINDING_COLOR].item) label->numbindings++; break; case (ENCODING): if ((getString(&label->encoding)) == MS_FAILURE) return (-1); break; case (END): return (0); break; case (EOF): msSetError(MS_EOFERR, NULL, "loadLabel()"); return (-1); case (EXPRESSION): if (loadExpression(&(label->expression)) == -1) return (-1); /* loadExpression() cleans up previously allocated expression */ break; case (FONT): if ((symbol = getSymbol(2, MS_STRING, MS_BINDING)) == -1) return (-1); if (symbol == MS_STRING) { if (label->font != NULL) msFree(label->font); label->font = msStrdup(msyystring_buffer); } else { if (label->bindings[MS_LABEL_BINDING_FONT].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_FONT].item); label->bindings[MS_LABEL_BINDING_FONT].item = msStrdup(msyystring_buffer); label->numbindings++; } break; case (FORCE): switch (msyylex()) { case MS_ON: label->force = MS_ON; break; case MS_OFF: label->force = MS_OFF; break; case GROUP: label->force = MS_LABEL_FORCE_GROUP; break; default: msSetError(MS_MISCERR, "Invalid FORCE, must be ON,OFF,or GROUP (line %d)", "loadLabel()", msyylineno); return (-1); } break; case (LABEL): break; /* for string loads */ case (LEADER): msSetError(MS_MISCERR, "LABEL LEADER not implemented. LEADER goes at the CLASS level " "(line %d)", "loadLabel()", msyylineno); return (-1); case (MAXSIZE): if (getInteger(&(label->maxsize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXSCALEDENOM): if (getDouble(&(label->maxscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MAXLENGTH): if (getInteger(&(label->maxlength), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MINDISTANCE): if (getInteger(&(label->mindistance), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (REPEATDISTANCE): if (getInteger(&(label->repeatdistance), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXOVERLAPANGLE): if (getDouble(&(label->maxoverlapangle), MS_NUM_CHECK_RANGE, 0, 360) == -1) return (-1); break; case (MINFEATURESIZE): if ((symbol = getSymbol(2, MS_NUMBER, MS_AUTO)) == -1) return (-1); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GT, 0, -1) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid MINFEATURESIZE, must be greater than 0 (line %d)", "loadLabel()", msyylineno); return (MS_FAILURE); } label->minfeaturesize = (int)msyynumber; } else label->autominfeaturesize = MS_TRUE; break; case (MINSCALEDENOM): if (getDouble(&(label->minscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MINSIZE): if (getInteger(&(label->minsize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (OFFSET): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) label->offsetx = (int)msyynumber; // any integer ok else { if (label->bindings[MS_LABEL_BINDING_OFFSET_X].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_OFFSET_X].item); label->bindings[MS_LABEL_BINDING_OFFSET_X].item = msStrdup(msyystring_buffer); label->numbindings++; } if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) label->offsety = (int)msyynumber; // any integer ok else { if (label->bindings[MS_LABEL_BINDING_OFFSET_Y].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_OFFSET_Y].item); label->bindings[MS_LABEL_BINDING_OFFSET_Y].item = msStrdup(msyystring_buffer); label->numbindings++; } break; case (OUTLINECOLOR): if (loadColor(&(label->outlinecolor), &(label->bindings[MS_LABEL_BINDING_OUTLINECOLOR])) != MS_SUCCESS) return (-1); if (label->bindings[MS_LABEL_BINDING_OUTLINECOLOR].item) label->numbindings++; break; case (OUTLINEWIDTH): if (getInteger(&(label->outlinewidth), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (PARTIALS): if ((label->partials = getSymbol(2, MS_TRUE, MS_FALSE)) == -1) return (-1); break; case (POSITION): if ((label->position = getSymbol(11, MS_UL, MS_UC, MS_UR, MS_CL, MS_CC, MS_CR, MS_LL, MS_LC, MS_LR, MS_AUTO, MS_BINDING)) == -1) return (-1); if (label->position == MS_BINDING) { if (label->bindings[MS_LABEL_BINDING_POSITION].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_POSITION].item); label->bindings[MS_LABEL_BINDING_POSITION].item = msStrdup(msyystring_buffer); label->numbindings++; } break; case (PRIORITY): if (label->exprBindings[MS_LABEL_BINDING_PRIORITY].string) { msFreeExpression(&label->exprBindings[MS_LABEL_BINDING_PRIORITY]); label->nexprbindings--; } if ((symbol = getSymbol(3, MS_EXPRESSION, MS_NUMBER, MS_BINDING)) == -1) return (-1); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_RANGE, 1, MS_MAX_LABEL_PRIORITY) == MS_FAILURE) { msSetError( MS_MISCERR, "Invalid PRIORITY, must be an integer between 1 and %d (line %d)", "loadLabel()", MS_MAX_LABEL_PRIORITY, msyylineno); return (-1); } label->priority = (int)msyynumber; } else if (symbol == MS_EXPRESSION) { msFree(label->exprBindings[MS_LABEL_BINDING_PRIORITY].string); label->exprBindings[MS_LABEL_BINDING_PRIORITY].string = msStrdup(msyystring_buffer); label->exprBindings[MS_LABEL_BINDING_PRIORITY].type = MS_EXPRESSION; label->nexprbindings++; } else { if (label->bindings[MS_LABEL_BINDING_PRIORITY].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_PRIORITY].item); label->bindings[MS_LABEL_BINDING_PRIORITY].item = msStrdup(msyystring_buffer); label->numbindings++; } break; case (SHADOWCOLOR): if (loadColor(&(label->shadowcolor), NULL) != MS_SUCCESS) return (-1); break; case (SHADOWSIZE): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (-1); if (symbol == MS_NUMBER) { label->shadowsizex = (int)msyynumber; // x offset, any int ok } else { if (label->bindings[MS_LABEL_BINDING_SHADOWSIZEX].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_SHADOWSIZEX].item); label->bindings[MS_LABEL_BINDING_SHADOWSIZEX].item = msStrdup(msyystring_buffer); label->numbindings++; } if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (-1); if (symbol == MS_NUMBER) { label->shadowsizey = (int)msyynumber; // y offset, any int ok } else { if (label->bindings[MS_LABEL_BINDING_SHADOWSIZEY].item != NULL) msFree(label->bindings[MS_LABEL_BINDING_SHADOWSIZEY].item); label->bindings[MS_LABEL_BINDING_SHADOWSIZEY].item = msStrdup(msyystring_buffer); label->numbindings++; } break; case (SIZE): if (label->bindings[MS_LABEL_BINDING_SIZE].item) { msFree(label->bindings[MS_LABEL_BINDING_SIZE].item); label->bindings[MS_LABEL_BINDING_SIZE].item = NULL; label->numbindings--; } if (label->exprBindings[MS_LABEL_BINDING_SIZE].string) { msFreeExpression(&label->exprBindings[MS_LABEL_BINDING_SIZE]); label->nexprbindings--; } if ((symbol = getSymbol(8, MS_EXPRESSION, MS_NUMBER, MS_BINDING, MS_TINY, MS_SMALL, MS_MEDIUM, MS_LARGE, MS_GIANT)) == -1) return (-1); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GT, 0, -1) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid SIZE, must be greater than 0 (line %d)", "loadLabel()", msyylineno); return (-1); } label->size = (double)msyynumber; } else if (symbol == MS_BINDING) { label->bindings[MS_LABEL_BINDING_SIZE].item = msStrdup(msyystring_buffer); label->numbindings++; } else if (symbol == MS_EXPRESSION) { msFree(label->exprBindings[MS_LABEL_BINDING_SIZE].string); label->exprBindings[MS_LABEL_BINDING_SIZE].string = msStrdup(msyystring_buffer); label->exprBindings[MS_LABEL_BINDING_SIZE].type = MS_EXPRESSION; label->nexprbindings++; } else label->size = symbol; break; case (STYLE): if (msGrowLabelStyles(label) == NULL) return (-1); initStyle(label->styles[label->numstyles]); if (loadStyle(label->styles[label->numstyles]) != MS_SUCCESS) { freeStyle(label->styles[label->numstyles]); free(label->styles[label->numstyles]); label->styles[label->numstyles] = NULL; return (-1); } if (label->styles[label->numstyles]->_geomtransform.type == MS_GEOMTRANSFORM_NONE) label->styles[label->numstyles]->_geomtransform.type = MS_GEOMTRANSFORM_LABELPOINT; /* set a default, a marker? */ label->numstyles++; break; case (TEXT): if (loadExpression(&(label->text)) == -1) return (-1); /* loadExpression() cleans up previously allocated expression */ if ((label->text.type != MS_STRING) && (label->text.type != MS_EXPRESSION)) { msSetError( MS_MISCERR, "Text expressions support constant or tagged replacement strings.", "loadLabel()"); return (-1); } break; case (TYPE): if (getSymbol(2, MS_TRUETYPE, MS_BITMAP) == -1) return (-1); /* ignore TYPE */ break; case (WRAP): if (getCharacter(&(label->wrap)) == -1) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadLabel()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } /* next token */ } int msUpdateLabelFromString(labelObj *label, char *string) { if (!label || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadLabel(label) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } static void writeLeader(FILE *stream, int indent, labelLeaderObj *leader) { int i; if (leader->maxdistance == 0 && leader->numstyles == 0) { return; } indent++; writeBlockBegin(stream, indent, "LEADER"); writeNumber(stream, indent, "MAXDISTANCE", 0, leader->maxdistance); writeNumber(stream, indent, "GRIDSTEP", 5, leader->gridstep); for (i = 0; i < leader->numstyles; i++) writeStyle(stream, indent, leader->styles[i]); writeBlockEnd(stream, indent, "LEADER"); } static void writeLabel(FILE *stream, int indent, labelObj *label) { int i; colorObj c; if (label->size == -1) return; /* there is no default label anymore */ indent++; writeBlockBegin(stream, indent, "LABEL"); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_ANGLE].item) writeAttributeBinding(stream, indent, "ANGLE", &(label->bindings[MS_LABEL_BINDING_ANGLE])); else writeNumberOrKeyword(stream, indent, "ANGLE", 0, label->angle, label->anglemode, 3, MS_FOLLOW, "FOLLOW", MS_AUTO, "AUTO", MS_AUTO2, "AUTO2"); writeExpression(stream, indent, "EXPRESSION", &(label->expression)); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_FONT].item) writeAttributeBinding(stream, indent, "FONT", &(label->bindings[MS_LABEL_BINDING_FONT])); else writeString(stream, indent, "FONT", NULL, label->font); writeNumber(stream, indent, "MAXSIZE", MS_MAXFONTSIZE, label->maxsize); writeNumber(stream, indent, "MINSIZE", MS_MINFONTSIZE, label->minsize); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_SIZE].item) writeAttributeBinding(stream, indent, "SIZE", &(label->bindings[MS_LABEL_BINDING_SIZE])); else writeNumber(stream, indent, "SIZE", -1, label->size); writeKeyword(stream, indent, "ALIGN", label->align, 3, MS_ALIGN_LEFT, "LEFT", MS_ALIGN_CENTER, "CENTER", MS_ALIGN_RIGHT, "RIGHT"); writeNumber(stream, indent, "BUFFER", 0, label->buffer); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_COLOR].item) writeAttributeBinding(stream, indent, "COLOR", &(label->bindings[MS_LABEL_BINDING_COLOR])); else { MS_INIT_COLOR(c, 0, 0, 0, 255); writeColor(stream, indent, "COLOR", &c, &(label->color)); } writeString(stream, indent, "ENCODING", NULL, label->encoding); if (label->leader) writeLeader(stream, indent, label->leader); writeKeyword(stream, indent, "FORCE", label->force, 2, MS_TRUE, "TRUE", MS_LABEL_FORCE_GROUP, "GROUP"); writeNumber(stream, indent, "MAXLENGTH", 0, label->maxlength); writeNumber(stream, indent, "MAXSCALEDENOM", -1, label->maxscaledenom); writeNumber(stream, indent, "MINDISTANCE", -1, label->mindistance); writeNumberOrKeyword(stream, indent, "MINFEATURESIZE", -1, label->minfeaturesize, 1, label->autominfeaturesize, MS_TRUE, "AUTO"); writeNumber(stream, indent, "MINSCALEDENOM", -1, label->minscaledenom); writeDimension(stream, indent, "OFFSET", label->offsetx, label->offsety, NULL, NULL); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_OUTLINECOLOR].item) writeAttributeBinding(stream, indent, "OUTLINECOLOR", &(label->bindings[MS_LABEL_BINDING_OUTLINECOLOR])); else writeColor(stream, indent, "OUTLINECOLOR", NULL, &(label->outlinecolor)); writeNumber(stream, indent, "OUTLINEWIDTH", 1, label->outlinewidth); writeKeyword(stream, indent, "PARTIALS", label->partials, 1, MS_TRUE, "TRUE"); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_POSITION].item) writeAttributeBinding(stream, indent, "POSITION", &(label->bindings[MS_LABEL_BINDING_POSITION])); else writeKeyword(stream, indent, "POSITION", label->position, 10, MS_UL, "UL", MS_UC, "UC", MS_UR, "UR", MS_CL, "CL", MS_CC, "CC", MS_CR, "CR", MS_LL, "LL", MS_LC, "LC", MS_LR, "LR", MS_AUTO, "AUTO"); if (label->numbindings > 0 && label->bindings[MS_LABEL_BINDING_PRIORITY].item) writeAttributeBinding(stream, indent, "PRIORITY", &(label->bindings[MS_LABEL_BINDING_PRIORITY])); else if (label->nexprbindings > 0 && label->exprBindings[MS_LABEL_BINDING_PRIORITY].string) writeExpression(stream, indent, "PRIORITY", &(label->exprBindings[MS_LABEL_BINDING_PRIORITY])); else writeNumber(stream, indent, "PRIORITY", MS_DEFAULT_LABEL_PRIORITY, label->priority); writeNumber(stream, indent, "REPEATDISTANCE", 0, label->repeatdistance); writeColor(stream, indent, "SHADOWCOLOR", NULL, &(label->shadowcolor)); writeDimension(stream, indent, "SHADOWSIZE", label->shadowsizex, label->shadowsizey, label->bindings[MS_LABEL_BINDING_SHADOWSIZEX].item, label->bindings[MS_LABEL_BINDING_SHADOWSIZEY].item); writeNumber(stream, indent, "MAXOVERLAPANGLE", 22.5, label->maxoverlapangle); for (i = 0; i < label->numstyles; i++) writeStyle(stream, indent, label->styles[i]); writeExpression(stream, indent, "TEXT", &(label->text)); writeCharacter(stream, indent, "WRAP", '\0', label->wrap); writeBlockEnd(stream, indent, "LABEL"); } char *msWriteLabelToString(labelObj *label) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeLabel(stdout, -1, label); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } void msInitExpression(expressionObj *exp) { memset(exp, 0, sizeof(*exp)); exp->type = MS_STRING; } void msFreeExpressionTokens(expressionObj *exp) { tokenListNodeObjPtr node = NULL; tokenListNodeObjPtr nextNode = NULL; if (!exp) return; if (exp->tokens) { node = exp->tokens; while (node != NULL) { nextNode = node->next; msFree(node->tokensrc); /* not set very often */ switch (node->token) { case MS_TOKEN_BINDING_DOUBLE: case MS_TOKEN_BINDING_INTEGER: case MS_TOKEN_BINDING_STRING: case MS_TOKEN_BINDING_TIME: msFree(node->tokenval.bindval.item); break; case MS_TOKEN_LITERAL_TIME: /* anything to do? */ break; case MS_TOKEN_LITERAL_STRING: msFree(node->tokenval.strval); break; case MS_TOKEN_LITERAL_SHAPE: msFreeShape(node->tokenval.shpval); free(node->tokenval.shpval); break; } msFree(node); node = nextNode; } exp->tokens = exp->curtoken = NULL; } } void msFreeExpression(expressionObj *exp) { if (!exp) return; msFree(exp->string); msFree(exp->native_string); if ((exp->type == MS_REGEX) && exp->compiled) ms_regfree(&(exp->regex)); msFreeExpressionTokens(exp); msInitExpression(exp); /* re-initialize */ } int loadExpression(expressionObj *exp) { /* TODO: should we call msFreeExpression if exp->string != NULL? We do some * checking to avoid a leak but is it enough... */ msyystring_icase = MS_TRUE; if ((exp->type = getSymbol(6, MS_STRING, MS_EXPRESSION, MS_REGEX, MS_ISTRING, MS_IREGEX, MS_LIST)) == -1) return (-1); if (exp->string != NULL) { msFree(exp->string); msFree(exp->native_string); } exp->string = msStrdup(msyystring_buffer); exp->native_string = NULL; if (exp->type == MS_ISTRING) { exp->flags = exp->flags | MS_EXP_INSENSITIVE; exp->type = MS_STRING; } else if (exp->type == MS_IREGEX) { exp->flags = exp->flags | MS_EXP_INSENSITIVE; exp->type = MS_REGEX; } return (0); } /* --------------------------------------------------------------------------- msLoadExpressionString and loadExpressionString msLoadExpressionString wraps call to loadExpressionString with mutex acquisition and release. This function should be used everywhere outside the mapfile loading phase of an application. loadExpressionString does not check for a mutex! It should be used only within code that has properly acquired a mutex. See bug 339 for more details -- SG. ------------------------------------------------------------------------ */ int msLoadExpressionString(expressionObj *exp, const char *value) { int retval = MS_FAILURE; msAcquireLock(TLOCK_PARSER); retval = loadExpressionString(exp, value); msReleaseLock(TLOCK_PARSER); return retval; } int loadExpressionString(expressionObj *exp, const char *value) { msyystate = MS_TOKENIZE_STRING; msyystring = value; msyylex(); /* sets things up but processes no tokens */ msFreeExpression(exp); /* we're totally replacing the old expression so free (which re-inits) to start over */ msyystring_icase = MS_TRUE; if ((exp->type = getSymbol2(5, MS_EXPRESSION, MS_REGEX, MS_IREGEX, MS_ISTRING, MS_LIST)) != -1) { exp->string = msStrdup(msyystring_buffer); if (exp->type == MS_ISTRING) { exp->type = MS_STRING; exp->flags = exp->flags | MS_EXP_INSENSITIVE; } else if (exp->type == MS_IREGEX) { exp->type = MS_REGEX; exp->flags = exp->flags | MS_EXP_INSENSITIVE; } } else { /* failure above is not an error since we'll consider anything not matching * (like an unquoted number) as a STRING) */ exp->type = MS_STRING; if ((strlen(value) - strlen(msyystring_buffer)) == 2) exp->string = msStrdup(msyystring_buffer); /* value was quoted */ else exp->string = msStrdup(value); /* use the whole value */ } return (0); } /* msGetExpressionString() * * Returns the string representation of this expression, including delimiters * and any flags (e.g. i = case-insensitive). * * Returns a newly allocated buffer that should be freed by the caller or NULL. */ char *msGetExpressionString(expressionObj *exp) { if (exp->string) { char *exprstring; size_t buffer_size; const char *case_insensitive = ""; if (exp->flags & MS_EXP_INSENSITIVE) case_insensitive = "i"; /* Alloc buffer big enough for string + 2 delimiters + 'i' + \0 */ buffer_size = strlen(exp->string) + 4; exprstring = (char *)msSmallMalloc(buffer_size); switch (exp->type) { case (MS_REGEX): snprintf(exprstring, buffer_size, "/%s/%s", exp->string, case_insensitive); return exprstring; case (MS_STRING): snprintf(exprstring, buffer_size, "\"%s\"%s", exp->string, case_insensitive); return exprstring; case (MS_EXPRESSION): snprintf(exprstring, buffer_size, "(%s)", exp->string); return exprstring; case (MS_LIST): snprintf(exprstring, buffer_size, "{%s}", exp->string); return exprstring; default: /* We should never get to here really! */ free(exprstring); return NULL; } } return NULL; } static void writeExpression(FILE *stream, int indent, const char *name, expressionObj *exp) { if (!exp || !exp->string) return; writeIndent(stream, ++indent); switch (exp->type) { case (MS_LIST): fprintf(stream, "%s {%s}", name, exp->string); break; case (MS_REGEX): msIO_fprintf(stream, "%s /%s/", name, exp->string); break; case (MS_STRING): msIO_fprintf(stream, "%s ", name); writeStringElement(stream, exp->string); break; case (MS_EXPRESSION): msIO_fprintf(stream, "%s (%s)", name, exp->string); break; } if ((exp->type == MS_STRING || exp->type == MS_REGEX) && (exp->flags & MS_EXP_INSENSITIVE)) msIO_fprintf(stream, "i"); writeLineFeed(stream); } int loadHashTable(hashTableObj *ptable) { assert(ptable); for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadHashTable()"); return (MS_FAILURE); case (END): return (MS_SUCCESS); case (MS_STRING): { char *data = NULL; char *key = msStrdup(msyystring_buffer); /* the key is *always* a string */ if (getString(&data) == MS_FAILURE) { free(key); return (MS_FAILURE); } msInsertHashTable(ptable, key, data); free(key); free(data); break; } default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadHashTable()", msyystring_buffer, msyylineno); return (MS_FAILURE); } } return (MS_SUCCESS); } static void writeHashTable(FILE *stream, int indent, const char *title, hashTableObj *table) { struct hashObj *tp; int i; if (!table) return; if (msHashIsEmpty(table)) return; indent++; writeBlockBegin(stream, indent, title); for (i = 0; i < MS_HASHSIZE; i++) { if (table->items[i] != NULL) { for (tp = table->items[i]; tp != NULL; tp = tp->next) writeNameValuePair(stream, indent, tp->key, tp->data); } } writeBlockEnd(stream, indent, title); } static void writeHashTableInline(FILE *stream, int indent, char *name, hashTableObj *table) { struct hashObj *tp = NULL; int i; if (!table) return; if (msHashIsEmpty(table)) return; ++indent; for (i = 0; i < MS_HASHSIZE; ++i) { if (table->items[i] != NULL) { for (tp = table->items[i]; tp != NULL; tp = tp->next) { writeIndent(stream, indent); msIO_fprintf(stream, "%s ", name); writeStringElement(stream, tp->key); msIO_fprintf(stream, " "); writeStringElement(stream, tp->data); writeLineFeed(stream); } } } } /* ** Initialize, load and free a cluster object */ void initCluster(clusterObj *cluster) { cluster->maxdistance = 10; cluster->buffer = 0; cluster->region = NULL; msInitExpression(&(cluster->group)); msInitExpression(&(cluster->filter)); } void freeCluster(clusterObj *cluster) { msFree(cluster->region); msFreeExpression(&(cluster->group)); msFreeExpression(&(cluster->filter)); } int loadCluster(clusterObj *cluster) { for (;;) { switch (msyylex()) { case (CLUSTER): break; /* for string loads */ case (MAXDISTANCE): if (getDouble(&(cluster->maxdistance), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (BUFFER): if (getDouble(&(cluster->buffer), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (REGION): if (getString(&cluster->region) == MS_FAILURE) return (-1); break; case (END): return (0); break; case (GROUP): if (loadExpression(&(cluster->group)) == -1) return (-1); break; case (FILTER): if (loadExpression(&(cluster->filter)) == -1) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadCluster()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } return (MS_SUCCESS); } int msUpdateClusterFromString(clusterObj *cluster, char *string) { if (!cluster || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadCluster(cluster) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } static void writeCluster(FILE *stream, int indent, clusterObj *cluster) { if (cluster->maxdistance == 10 && cluster->buffer == 0.0 && cluster->region == NULL && cluster->group.string == NULL && cluster->filter.string == NULL) return; /* Nothing to write */ indent++; writeBlockBegin(stream, indent, "CLUSTER"); writeNumber(stream, indent, "MAXDISTANCE", 10, cluster->maxdistance); writeNumber(stream, indent, "BUFFER", 0, cluster->buffer); writeString(stream, indent, "REGION", NULL, cluster->region); writeExpression(stream, indent, "GROUP", &(cluster->group)); writeExpression(stream, indent, "FILTER", &(cluster->filter)); writeBlockEnd(stream, indent, "CLUSTER"); } char *msWriteClusterToString(clusterObj *cluster) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeCluster(stdout, -1, cluster); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } /* ** Initialize, load and free a single style */ int initStyle(styleObj *style) { int i; MS_REFCNT_INIT(style); MS_INIT_COLOR(style->color, -1, -1, -1, 255); /* must explicitly set colors */ MS_INIT_COLOR(style->outlinecolor, -1, -1, -1, 255); /* New Color Range fields*/ MS_INIT_COLOR(style->mincolor, -1, -1, -1, 255); MS_INIT_COLOR(style->maxcolor, -1, -1, -1, 255); style->minvalue = 0.0; style->maxvalue = 1.0; style->rangeitem = NULL; /* End Color Range fields*/ style->symbol = 0; /* there is always a default symbol*/ style->symbolname = NULL; style->size = -1; /* in SIZEUNITS (layerObj) */ style->minsize = MS_MINSYMBOLSIZE; style->maxsize = MS_MAXSYMBOLSIZE; style->width = 1; /* in pixels */ style->outlinewidth = 0; /* in pixels */ style->minwidth = MS_MINSYMBOLWIDTH; style->maxwidth = MS_MAXSYMBOLWIDTH; style->minscaledenom = style->maxscaledenom = -1.0; style->offsetx = style->offsety = 0; /* no offset */ style->polaroffsetpixel = style->polaroffsetangle = 0; /* no polar offset */ style->angle = 0; style->autoangle = MS_FALSE; style->antialiased = MS_TRUE; style->opacity = 100; /* fully opaque */ msInitExpression(&(style->_geomtransform)); style->_geomtransform.type = MS_GEOMTRANSFORM_NONE; style->patternlength = 0; /* solid line */ style->gap = 0; style->initialgap = -1; style->linecap = MS_CJC_DEFAULT_CAPS; style->linejoin = MS_CJC_DEFAULT_JOINS; style->linejoinmaxsize = MS_CJC_DEFAULT_JOIN_MAXSIZE; style->numbindings = 0; style->nexprbindings = 0; for (i = 0; i < MS_STYLE_BINDING_LENGTH; i++) { style->bindings[i].item = NULL; style->bindings[i].index = -1; msInitExpression(&(style->exprBindings[i])); } style->sizeunits = MS_INHERIT; style->scalefactor = 1.0; return MS_SUCCESS; } int loadStyle(styleObj *style) { int symbol; for (;;) { switch (msyylex()) { /* New Color Range fields*/ case (COLORRANGE): /*These are both in one line now*/ if (loadColor(&(style->mincolor), NULL) != MS_SUCCESS) return (MS_FAILURE); if (loadColor(&(style->maxcolor), NULL) != MS_SUCCESS) return (MS_FAILURE); break; case (DATARANGE): /*These are both in one line now*/ if (getDouble(&(style->minvalue), MS_NUM_CHECK_NONE, -1, -1) == -1) return (MS_FAILURE); if (getDouble(&(style->maxvalue), MS_NUM_CHECK_NONE, -1, -1) == -1) return (MS_FAILURE); break; case (RANGEITEM): if (getString(&style->rangeitem) == MS_FAILURE) return (MS_FAILURE); break; /* End Range fields*/ case (ANGLE): if ((symbol = getSymbol(3, MS_NUMBER, MS_BINDING, MS_AUTO)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_RANGE, -360.0, 360.0) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid ANGLE, must be between -360 and 360 (line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } style->angle = (double)msyynumber; } else if (symbol == MS_BINDING) { if (style->bindings[MS_STYLE_BINDING_ANGLE].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_ANGLE].item); style->bindings[MS_STYLE_BINDING_ANGLE].item = msStrdup(msyystring_buffer); style->numbindings++; } else { style->autoangle = MS_TRUE; } break; case (ANTIALIAS): if ((symbol = getSymbol(2, MS_TRUE, MS_FALSE)) == -1) return (MS_FAILURE); if (symbol == MS_FALSE) { style->antialiased = MS_FALSE; } break; case (COLOR): if (loadColor(&(style->color), &(style->bindings[MS_STYLE_BINDING_COLOR])) != MS_SUCCESS) return (MS_FAILURE); if (style->bindings[MS_STYLE_BINDING_COLOR].item) style->numbindings++; break; case (EOF): msSetError(MS_EOFERR, NULL, "loadStyle()"); return (MS_FAILURE); /* missing END (probably) */ case (END): { int alpha; /* apply opacity as the alpha channel color(s) */ if (style->opacity < 100) { alpha = MS_NINT(style->opacity * 2.55); style->color.alpha = alpha; style->outlinecolor.alpha = alpha; style->mincolor.alpha = alpha; style->maxcolor.alpha = alpha; } return (MS_SUCCESS); } break; case (GAP): if (getDouble(&(style->gap), MS_NUM_CHECK_NONE, -1, -1) == -1) return (MS_FAILURE); break; case (INITIALGAP): if (getDouble(&(style->initialgap), MS_NUM_CHECK_GTE, 0, -1) == -1) { // zero is ok msSetError(MS_MISCERR, "INITIALGAP requires a positive values (line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } break; case (MAXSCALEDENOM): if (getDouble(&(style->maxscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (MS_FAILURE); break; case (MINSCALEDENOM): if (getDouble(&(style->minscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (MS_FAILURE); break; case (GEOMTRANSFORM): { int s; if ((s = getSymbol(2, MS_STRING, MS_EXPRESSION)) == -1) return (MS_FAILURE); if (s == MS_STRING) msStyleSetGeomTransform(style, msyystring_buffer); else { /* handle expression case here for the moment */ msFree(style->_geomtransform.string); style->_geomtransform.string = msStrdup(msyystring_buffer); style->_geomtransform.type = MS_GEOMTRANSFORM_EXPRESSION; } } break; case (LINECAP): if ((style->linecap = getSymbol(4, MS_CJC_BUTT, MS_CJC_ROUND, MS_CJC_SQUARE, MS_CJC_TRIANGLE)) == -1) return (MS_FAILURE); break; case (LINEJOIN): if ((style->linejoin = getSymbol(4, MS_CJC_NONE, MS_CJC_ROUND, MS_CJC_MITER, MS_CJC_BEVEL)) == -1) return (MS_FAILURE); break; case (LINEJOINMAXSIZE): if (getDouble(&(style->linejoinmaxsize), MS_NUM_CHECK_GT, 0, -1) == -1) return (MS_FAILURE); break; case (MAXSIZE): if (getDouble(&(style->maxsize), MS_NUM_CHECK_GT, 0, -1) == -1) return (MS_FAILURE); break; case (MINSIZE): if (getDouble(&(style->minsize), MS_NUM_CHECK_GTE, 0, -1) == -1) return (MS_FAILURE); break; case (MAXWIDTH): if (getDouble(&(style->maxwidth), MS_NUM_CHECK_GT, 0, -1) == -1) return (MS_FAILURE); break; case (MINWIDTH): if (getDouble(&(style->minwidth), MS_NUM_CHECK_GTE, 0, -1) == -1) return (MS_FAILURE); break; case (OFFSET): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) style->offsetx = (double)msyynumber; // any double ok else { if (style->bindings[MS_STYLE_BINDING_OFFSET_X].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_OFFSET_X].item); style->bindings[MS_STYLE_BINDING_OFFSET_X].item = msStrdup(msyystring_buffer); style->numbindings++; } if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) style->offsety = (double)msyynumber; // any double ok else { if (style->bindings[MS_STYLE_BINDING_OFFSET_Y].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_OFFSET_Y].item); style->bindings[MS_STYLE_BINDING_OFFSET_Y].item = msStrdup(msyystring_buffer); style->numbindings++; } break; case (OPACITY): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) style->opacity = MS_MAX(MS_MIN((int)msyynumber, 100), 0); /* force opacity to between 0 and 100 */ else { if (style->bindings[MS_STYLE_BINDING_OPACITY].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_OPACITY].item); style->bindings[MS_STYLE_BINDING_OPACITY].item = msStrdup(msyystring_buffer); style->numbindings++; } break; case (OUTLINECOLOR): if (loadColor(&(style->outlinecolor), &(style->bindings[MS_STYLE_BINDING_OUTLINECOLOR])) != MS_SUCCESS) return (MS_FAILURE); if (style->bindings[MS_STYLE_BINDING_OUTLINECOLOR].item) style->numbindings++; break; case (PATTERN): { int done = MS_FALSE; for (;;) { /* read till the next END */ switch (msyylex()) { case (END): if (style->patternlength < 2) { msSetError(MS_SYMERR, "Not enough pattern elements. A minimum of 2 are " "required (line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } done = MS_TRUE; break; case (MS_NUMBER): /* read the pattern values */ if (style->patternlength == MS_MAXPATTERNLENGTH) { msSetError(MS_SYMERR, "Pattern too long.", "loadStyle()"); return (MS_FAILURE); } style->pattern[style->patternlength] = atof(msyystring_buffer); // good enough? style->patternlength++; break; default: msSetError(MS_TYPEERR, "Parsing error near (%s):(line %d)", "loadStyle()", msyystring_buffer, msyylineno); return (MS_FAILURE); } if (done == MS_TRUE) break; } break; } case (OUTLINEWIDTH): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GTE, 0, -1) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid OUTLINEWIDTH, must be greater then or equal to 0 " "(line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } style->outlinewidth = (double)msyynumber; } else { if (style->bindings[MS_STYLE_BINDING_OUTLINEWIDTH].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_OUTLINEWIDTH].item); style->bindings[MS_STYLE_BINDING_OUTLINEWIDTH].item = msStrdup(msyystring_buffer); style->numbindings++; } break; case (SIZE): if (style->exprBindings[MS_STYLE_BINDING_SIZE].string) { msFreeExpression(&style->exprBindings[MS_STYLE_BINDING_SIZE]); style->nexprbindings--; } if ((symbol = getSymbol(3, MS_EXPRESSION, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GT, 0, -1) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid SIZE, must be greater than 0 (line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } style->size = (double)msyynumber; } else if (symbol == MS_EXPRESSION) { msFree(style->exprBindings[MS_STYLE_BINDING_SIZE].string); style->exprBindings[MS_STYLE_BINDING_SIZE].string = msStrdup(msyystring_buffer); style->exprBindings[MS_STYLE_BINDING_SIZE].type = MS_EXPRESSION; style->nexprbindings++; } else { if (style->bindings[MS_STYLE_BINDING_SIZE].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_SIZE].item); style->bindings[MS_STYLE_BINDING_SIZE].item = msStrdup(msyystring_buffer); style->numbindings++; } break; case (STYLE): break; /* for string loads */ case (SYMBOL): if ((symbol = getSymbol(3, MS_NUMBER, MS_STRING, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GTE, 0, -1) == MS_FAILURE) { msSetError( MS_MISCERR, "Invalid SYMBOL id, must be greater than or equal to 0 (line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } if (style->symbolname != NULL) { msFree(style->symbolname); style->symbolname = NULL; } style->symbol = (int)msyynumber; } else if (symbol == MS_STRING) { if (style->symbolname != NULL) msFree(style->symbolname); style->symbolname = msStrdup(msyystring_buffer); } else { if (style->bindings[MS_STYLE_BINDING_SYMBOL].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_SYMBOL].item); style->bindings[MS_STYLE_BINDING_SYMBOL].item = msStrdup(msyystring_buffer); style->numbindings++; } break; case (WIDTH): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GTE, 0, -1) == MS_FAILURE) { msSetError( MS_MISCERR, "Invalid WIDTH, must be greater than or equal to 0 (line %d)", "loadStyle()", msyylineno); return (MS_FAILURE); } style->width = (double)msyynumber; } else { if (style->bindings[MS_STYLE_BINDING_WIDTH].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_WIDTH].item); style->bindings[MS_STYLE_BINDING_WIDTH].item = msStrdup(msyystring_buffer); style->numbindings++; } break; case (POLAROFFSET): if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { style->polaroffsetpixel = (double)msyynumber; // ok? } else { if (style->bindings[MS_STYLE_BINDING_POLAROFFSET_PIXEL].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_POLAROFFSET_PIXEL].item); style->bindings[MS_STYLE_BINDING_POLAROFFSET_PIXEL].item = msStrdup(msyystring_buffer); style->numbindings++; } if ((symbol = getSymbol(2, MS_NUMBER, MS_BINDING)) == -1) return (MS_FAILURE); if (symbol == MS_NUMBER) { style->polaroffsetangle = (double)msyynumber; // ok? } else { if (style->bindings[MS_STYLE_BINDING_POLAROFFSET_ANGLE].item != NULL) msFree(style->bindings[MS_STYLE_BINDING_POLAROFFSET_ANGLE].item); style->bindings[MS_STYLE_BINDING_POLAROFFSET_ANGLE].item = msStrdup(msyystring_buffer); style->numbindings++; } break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadStyle()", msyystring_buffer, msyylineno); return (MS_FAILURE); } else { return (MS_SUCCESS); /* end of a string, not an error */ } } } } int msUpdateStyleFromString(styleObj *style, char *string) { if (!style || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadStyle(style) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } int freeStyle(styleObj *style) { int i; if (MS_REFCNT_DECR_IS_NOT_ZERO(style)) { return MS_FAILURE; } msFree(style->symbolname); msFreeExpression(&style->_geomtransform); msFree(style->rangeitem); for (i = 0; i < MS_STYLE_BINDING_LENGTH; i++) { msFree(style->bindings[i].item); msFreeExpression(&(style->exprBindings[i])); } return MS_SUCCESS; } void writeStyle(FILE *stream, int indent, styleObj *style) { indent++; writeBlockBegin(stream, indent, "STYLE"); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_ANGLE].item) writeAttributeBinding(stream, indent, "ANGLE", &(style->bindings[MS_STYLE_BINDING_ANGLE])); else writeNumberOrKeyword(stream, indent, "ANGLE", 0, style->angle, style->autoangle, 1, MS_TRUE, "AUTO"); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_COLOR].item) writeAttributeBinding(stream, indent, "COLOR", &(style->bindings[MS_STYLE_BINDING_COLOR])); else writeColor(stream, indent, "COLOR", NULL, &(style->color)); writeNumber(stream, indent, "GAP", 0, style->gap); writeNumber(stream, indent, "INITIALGAP", -1, style->initialgap); if (style->_geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) { writeIndent(stream, indent + 1); msIO_fprintf(stream, "GEOMTRANSFORM (%s)\n", style->_geomtransform.string); } else if (style->_geomtransform.type != MS_GEOMTRANSFORM_NONE) { writeKeyword(stream, indent, "GEOMTRANSFORM", style->_geomtransform.type, 8, MS_GEOMTRANSFORM_BBOX, "\"bbox\"", MS_GEOMTRANSFORM_END, "\"end\"", MS_GEOMTRANSFORM_LABELPOINT, "\"labelpnt\"", MS_GEOMTRANSFORM_LABELPOLY, "\"labelpoly\"", MS_GEOMTRANSFORM_LABELCENTER, "\"labelcenter\"", MS_GEOMTRANSFORM_START, "\"start\"", MS_GEOMTRANSFORM_VERTICES, "\"vertices\"", MS_GEOMTRANSFORM_CENTROID, "\"centroid\""); } if (style->linecap != MS_CJC_DEFAULT_CAPS) { writeKeyword(stream, indent, "LINECAP", (int)style->linecap, 5, MS_CJC_NONE, "NONE", MS_CJC_ROUND, "ROUND", MS_CJC_SQUARE, "SQUARE", MS_CJC_BUTT, "BUTT", MS_CJC_TRIANGLE, "TRIANGLE"); } if (style->linejoin != MS_CJC_DEFAULT_JOINS) { writeKeyword(stream, indent, "LINEJOIN", (int)style->linejoin, 5, MS_CJC_NONE, "NONE", MS_CJC_ROUND, "ROUND", MS_CJC_BEVEL, "BEVEL", MS_CJC_MITER, "MITER"); } writeNumber(stream, indent, "LINEJOINMAXSIZE", MS_CJC_DEFAULT_JOIN_MAXSIZE, style->linejoinmaxsize); writeNumber(stream, indent, "MAXSCALEDENOM", -1, style->maxscaledenom); writeNumber(stream, indent, "MAXSIZE", MS_MAXSYMBOLSIZE, style->maxsize); writeNumber(stream, indent, "MAXWIDTH", MS_MAXSYMBOLWIDTH, style->maxwidth); writeNumber(stream, indent, "MINSCALEDENOM", -1, style->minscaledenom); writeNumber(stream, indent, "MINSIZE", MS_MINSYMBOLSIZE, style->minsize); writeNumber(stream, indent, "MINWIDTH", MS_MINSYMBOLWIDTH, style->minwidth); if ((style->numbindings > 0 && (style->bindings[MS_STYLE_BINDING_OFFSET_X].item || style->bindings[MS_STYLE_BINDING_OFFSET_Y].item)) || style->offsetx != 0 || style->offsety != 0) writeDimension(stream, indent, "OFFSET", style->offsetx, style->offsety, style->bindings[MS_STYLE_BINDING_OFFSET_X].item, style->bindings[MS_STYLE_BINDING_OFFSET_Y].item); if ((style->numbindings > 0 && (style->bindings[MS_STYLE_BINDING_POLAROFFSET_PIXEL].item || style->bindings[MS_STYLE_BINDING_POLAROFFSET_ANGLE].item)) || style->polaroffsetangle != 0 || style->polaroffsetpixel != 0) writeDimension(stream, indent, "POLAROFFSET", style->polaroffsetpixel, style->polaroffsetangle, style->bindings[MS_STYLE_BINDING_POLAROFFSET_PIXEL].item, style->bindings[MS_STYLE_BINDING_POLAROFFSET_ANGLE].item); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_OPACITY].item) writeAttributeBinding(stream, indent, "OPACITY", &(style->bindings[MS_STYLE_BINDING_OPACITY])); else writeNumber(stream, indent, "OPACITY", 100, style->opacity); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_OUTLINECOLOR].item) writeAttributeBinding(stream, indent, "OUTLINECOLOR", &(style->bindings[MS_STYLE_BINDING_OUTLINECOLOR])); else writeColor(stream, indent, "OUTLINECOLOR", NULL, &(style->outlinecolor)); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_OUTLINEWIDTH].item) writeAttributeBinding(stream, indent, "OUTLINEWIDTH", &(style->bindings[MS_STYLE_BINDING_OUTLINEWIDTH])); else writeNumber(stream, indent, "OUTLINEWIDTH", 0, style->outlinewidth); /* PATTERN */ if (style->patternlength != 0) { int i; indent++; writeBlockBegin(stream, indent, "PATTERN"); writeIndent(stream, indent); for (i = 0; i < style->patternlength; i++) msIO_fprintf(stream, " %.2f", style->pattern[i]); msIO_fprintf(stream, "\n"); writeBlockEnd(stream, indent, "PATTERN"); indent--; } if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_SIZE].item) writeAttributeBinding(stream, indent, "SIZE", &(style->bindings[MS_STYLE_BINDING_SIZE])); else writeNumber(stream, indent, "SIZE", -1, style->size); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_SYMBOL].item) writeAttributeBinding(stream, indent, "SYMBOL", &(style->bindings[MS_STYLE_BINDING_SYMBOL])); else writeNumberOrString(stream, indent, "SYMBOL", 0, style->symbol, style->symbolname); if (style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_WIDTH].item) writeAttributeBinding(stream, indent, "WIDTH", &(style->bindings[MS_STYLE_BINDING_WIDTH])); else writeNumber(stream, indent, "WIDTH", 1, style->width); writeString(stream, indent, "RANGEITEM", NULL, style->rangeitem); /* If COLORRANGE is valid, assume DATARANGE also needs to be written */ if (MS_VALID_COLOR(style->mincolor) && MS_VALID_COLOR(style->maxcolor)) { writeColorRange(stream, indent, "COLORRANGE", &(style->mincolor), &(style->maxcolor)); writeDoubleRange(stream, indent, "DATARANGE", style->minvalue, style->maxvalue); } writeBlockEnd(stream, indent, "STYLE"); } char *msWriteStyleToString(styleObj *style) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeStyle(stdout, -1, style); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } /* ** Initialize, load and free a single class */ int initClass(classObj *class) { class->status = MS_ON; class->debug = MS_OFF; MS_REFCNT_INIT(class); class->isfallback = FALSE; msInitExpression(&(class->expression)); class->name = NULL; class->title = NULL; msInitExpression(&(class->text)); class->template = NULL; initHashTable(&(class->metadata)); initHashTable(&(class->validation)); class->maxscaledenom = class->minscaledenom = -1.0; class->minfeaturesize = -1; /* no limit */ /* Set maxstyles = 0, styles[] will be allocated as needed on first call * to msGrowClassStyles() */ class->numstyles = class->maxstyles = 0; class->styles = NULL; class->numlabels = class->maxlabels = 0; class->labels = NULL; class->keyimage = NULL; class->group = NULL; class->leader = NULL; class->sizeunits = MS_INHERIT; class->scalefactor = 1.0; return (0); } int freeClass(classObj *class) { int i; if (MS_REFCNT_DECR_IS_NOT_ZERO(class)) { return MS_FAILURE; } msFreeExpression(&(class->expression)); msFreeExpression(&(class->text)); msFree(class->name); msFree(class->title); msFree(class->template); msFree(class->group); msFreeHashItems(&(class->metadata)); msFreeHashItems(&(class->validation)); for (i = 0; i < class->numstyles; i++) { /* each style */ if (class->styles[i] != NULL) { if (freeStyle(class->styles[i]) == MS_SUCCESS) { msFree(class->styles[i]); } } } msFree(class->styles); for (i = 0; i < class->numlabels; i++) { /* each label */ if (class->labels[i] != NULL) { if (freeLabel(class->labels[i]) == MS_SUCCESS) { msFree(class->labels[i]); } } } msFree(class->labels); msFree(class->keyimage); if (class->leader) { freeLabelLeader(class->leader); msFree(class->leader); class->leader = NULL; } return MS_SUCCESS; } /* ** Ensure there is at least one free entry in the sttyles array of this ** classObj. Grow the allocated styles array if necessary and allocate ** a new style for styles[numstyles] if there is not already one, ** setting its contents to all zero bytes (i.e. does not call initStyle() ** on it). ** ** This function is safe to use for the initial allocation of the styles[] ** array as well (i.e. when maxstyles==0 and styles==NULL) ** ** Returns a reference to the new styleObj on success, NULL on error. */ styleObj *msGrowClassStyles(classObj *class) { /* Do we need to increase the size of styles[] by MS_STYLE_ALLOCSIZE? */ if (class->numstyles == class->maxstyles) { styleObj **newStylePtr; int i, newsize; newsize = class->maxstyles + MS_STYLE_ALLOCSIZE; /* Alloc/realloc styles */ newStylePtr = (styleObj **)realloc(class->styles, newsize * sizeof(styleObj *)); MS_CHECK_ALLOC(newStylePtr, newsize * sizeof(styleObj *), NULL); class->styles = newStylePtr; class->maxstyles = newsize; for (i = class->numstyles; i < class->maxstyles; i++) { class->styles[i] = NULL; } } if (class->styles[class->numstyles] == NULL) { class->styles[class->numstyles] = (styleObj *)calloc(1, sizeof(styleObj)); MS_CHECK_ALLOC(class->styles[class->numstyles], sizeof(styleObj), NULL); } return class->styles[class->numstyles]; } /* exactly the same as for a classObj */ styleObj *msGrowLabelStyles(labelObj *label) { /* Do we need to increase the size of styles[] by MS_STYLE_ALLOCSIZE? */ if (label->numstyles == label->maxstyles) { styleObj **newStylePtr; int i, newsize; newsize = label->maxstyles + MS_STYLE_ALLOCSIZE; /* Alloc/realloc styles */ newStylePtr = (styleObj **)realloc(label->styles, newsize * sizeof(styleObj *)); MS_CHECK_ALLOC(newStylePtr, newsize * sizeof(styleObj *), NULL); label->styles = newStylePtr; label->maxstyles = newsize; for (i = label->numstyles; i < label->maxstyles; i++) { label->styles[i] = NULL; } } if (label->styles[label->numstyles] == NULL) { label->styles[label->numstyles] = (styleObj *)calloc(1, sizeof(styleObj)); MS_CHECK_ALLOC(label->styles[label->numstyles], sizeof(styleObj), NULL); } return label->styles[label->numstyles]; } /* exactly the same as for a labelLeaderObj, needs refactoring */ styleObj *msGrowLeaderStyles(labelLeaderObj *leader) { /* Do we need to increase the size of styles[] by MS_STYLE_ALLOCSIZE? */ if (leader->numstyles == leader->maxstyles) { styleObj **newStylePtr; int i, newsize; newsize = leader->maxstyles + MS_STYLE_ALLOCSIZE; /* Alloc/realloc styles */ newStylePtr = (styleObj **)realloc(leader->styles, newsize * sizeof(styleObj *)); MS_CHECK_ALLOC(newStylePtr, newsize * sizeof(styleObj *), NULL); leader->styles = newStylePtr; leader->maxstyles = newsize; for (i = leader->numstyles; i < leader->maxstyles; i++) { leader->styles[i] = NULL; } } if (leader->styles[leader->numstyles] == NULL) { leader->styles[leader->numstyles] = (styleObj *)calloc(1, sizeof(styleObj)); MS_CHECK_ALLOC(leader->styles[leader->numstyles], sizeof(styleObj), NULL); } return leader->styles[leader->numstyles]; } /* msMaybeAllocateClassStyle() ** ** Ensure that requested style index exists and has been initialized. ** ** Returns MS_SUCCESS/MS_FAILURE. */ int msMaybeAllocateClassStyle(classObj *c, int idx) { if (c == NULL) return MS_FAILURE; if (idx < 0) { msSetError(MS_MISCERR, "Invalid style index: %d", "msMaybeAllocateClassStyle()", idx); return MS_FAILURE; } /* Alloc empty styles as needed up to idx. * Nothing to do if requested style already exists */ while (c->numstyles <= idx) { if (msGrowClassStyles(c) == NULL) return MS_FAILURE; if (initStyle(c->styles[c->numstyles]) == MS_FAILURE) { msSetError(MS_MISCERR, "Failed to init new styleObj", "msMaybeAllocateClassStyle()"); freeStyle(c->styles[c->numstyles]); free(c->styles[c->numstyles]); c->styles[c->numstyles] = NULL; return (MS_FAILURE); } c->numstyles++; } return MS_SUCCESS; } /* * Reset style info in the class to defaults * the only members we don't touch are name, expression, and join/query stuff * This is used with STYLEITEM before overwriting the contents of a class. */ void resetClassStyle(classObj *class) { int i; /* reset labels */ for (i = 0; i < class->numlabels; i++) { if (class->labels[i] != NULL) { if (freeLabel(class->labels[i]) == MS_SUCCESS) { msFree(class->labels[i]); } class->labels[i] = NULL; } } class->numlabels = 0; msFreeExpression(&(class->text)); msInitExpression(&(class->text)); /* reset styles */ for (i = 0; i < class->numstyles; i++) { if (class->styles[i] != NULL) { if (freeStyle(class->styles[i]) == MS_SUCCESS) { msFree(class->styles[i]); } class->styles[i] = NULL; } } class->numstyles = 0; class->layer = NULL; } labelObj *msGrowClassLabels(classObj *class) { /* Do we need to increase the size of labels[] by MS_LABEL_ALLOCSIZE? */ if (class->numlabels == class->maxlabels) { labelObj **newLabelPtr; int i, newsize; newsize = class->maxlabels + MS_LABEL_ALLOCSIZE; /* Alloc/realloc labels */ newLabelPtr = (labelObj **)realloc(class->labels, newsize * sizeof(labelObj *)); MS_CHECK_ALLOC(newLabelPtr, newsize * sizeof(labelObj *), NULL); class->labels = newLabelPtr; class->maxlabels = newsize; for (i = class->numlabels; i < class->maxlabels; i++) { class->labels[i] = NULL; } } if (class->labels[class->numlabels] == NULL) { class->labels[class->numlabels] = (labelObj *)calloc(1, sizeof(labelObj)); MS_CHECK_ALLOC(class->labels[class->numlabels], sizeof(labelObj), NULL); } return class->labels[class->numlabels]; } int loadClass(classObj *class, layerObj *layer) { if (!class || !layer) return (-1); class->layer = (layerObj *)layer; for (;;) { switch (msyylex()) { case (CLASS): break; /* for string loads */ case (DEBUG): if ((class->debug = getSymbol(3, MS_ON, MS_OFF, MS_NUMBER)) == -1) return (-1); if (class->debug == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_RANGE, 0, 5) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid DEBUG level, must be between 0 and 5 (line %d)", "loadClass()", msyylineno); return (-1); } class->debug = (int)msyynumber; } break; case (EOF): msSetError(MS_EOFERR, NULL, "loadClass()"); return (-1); case (END): return (0); break; case (EXPRESSION): if (loadExpression(&(class->expression)) == -1) return (-1); /* loadExpression() cleans up previously allocated expression */ break; case (GROUP): if (getString(&class->group) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (KEYIMAGE): if (getString(&class->keyimage) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (LABEL): if (msGrowClassLabels(class) == NULL) return (-1); initLabel(class->labels[class->numlabels]); class->labels[class->numlabels]->size = MS_MEDIUM; /* only set a default if the LABEL section is present */ if (loadLabel(class->labels[class->numlabels]) == -1) { freeLabel(class->labels[class->numlabels]); free(class->labels[class->numlabels]); class->labels[class->numlabels] = NULL; return (-1); } class->numlabels++; break; case (LEADER): if (!class->leader) { class->leader = msSmallMalloc(sizeof(labelLeaderObj)); initLeader(class->leader); } if (loadLeader(class->leader) == -1) return (-1); break; case (MAXSCALE): case (MAXSCALEDENOM): if (getDouble(&(class->maxscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (METADATA): if (loadHashTable(&(class->metadata)) != MS_SUCCESS) return (-1); break; case (MINSCALE): case (MINSCALEDENOM): if (getDouble(&(class->minscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MINFEATURESIZE): if (getInteger(&(class->minfeaturesize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (NAME): if (getString(&class->name) == MS_FAILURE) return (-1); break; case (STATUS): if ((class->status = getSymbol(2, MS_ON, MS_OFF)) == -1) return (-1); break; case (STYLE): if (msGrowClassStyles(class) == NULL) return (-1); initStyle(class->styles[class->numstyles]); if (loadStyle(class->styles[class->numstyles]) != MS_SUCCESS) { freeStyle(class->styles[class->numstyles]); free(class->styles[class->numstyles]); class->styles[class->numstyles] = NULL; return (-1); } class->numstyles++; break; case (TEMPLATE): if (getString(&class->template) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (TEXT): if (loadExpression(&(class->text)) == -1) return (-1); /* loadExpression() cleans up previously allocated expression */ if ((class->text.type != MS_STRING) && (class->text.type != MS_EXPRESSION)) { msSetError( MS_MISCERR, "Text expressions support constant or tagged replacement strings.", "loadClass()"); return (-1); } break; case (TITLE): if (getString(&class->title) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (VALIDATION): if (loadHashTable(&(class->validation)) != MS_SUCCESS) return (-1); break; case (FALLBACK): if ((class->isfallback = getSymbol(2, MS_TRUE, MS_FALSE)) == -1) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadClass()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } } static int classResolveSymbolNames(classObj *class) { int i, j; int try_addimage_if_notfound = MS_TRUE; /* step through styles and labels to resolve symbol names */ /* class styles */ for (i = 0; i < class->numstyles; i++) { if (class->styles[i]->symbolname) { if ((class->styles[i]->symbol = msGetSymbolIndex( &(class->layer->map->symbolset), class->styles[i]->symbolname, try_addimage_if_notfound)) == -1) { msSetError(MS_MISCERR, "Undefined symbol \"%s\" in class, style %d of layer %s.", "classResolveSymbolNames()", class->styles[i]->symbolname, i, class->layer->name); return MS_FAILURE; } } } /* label styles */ for (i = 0; i < class->numlabels; i++) { for (j = 0; j < class->labels[i]->numstyles; j++) { if (class->labels[i]->styles[j]->symbolname) { if ((class->labels[i]->styles[j]->symbol = msGetSymbolIndex(&(class->layer->map->symbolset), class->labels[i]->styles[j]->symbolname, try_addimage_if_notfound)) == -1) { msSetError( MS_MISCERR, "Undefined symbol \"%s\" in class, label style %d of layer %s.", "classResolveSymbolNames()", class->labels[i]->styles[j]->symbolname, j, class->layer->name); return MS_FAILURE; } } } } return MS_SUCCESS; } int msUpdateClassFromString(classObj *class, char *string) { if (!class || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadClass(class, class->layer) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); if (classResolveSymbolNames(class) != MS_SUCCESS) return MS_FAILURE; return MS_SUCCESS; } static void writeClass(FILE *stream, int indent, classObj *class) { int i; if (class->status == MS_DELETE) return; indent++; writeBlockBegin(stream, indent, "CLASS"); writeString(stream, indent, "NAME", NULL, class->name); writeString(stream, indent, "GROUP", NULL, class->group); writeNumber(stream, indent, "DEBUG", 0, class->debug); writeExpression(stream, indent, "EXPRESSION", &(class->expression)); writeString(stream, indent, "KEYIMAGE", NULL, class->keyimage); for (i = 0; i < class->numlabels; i++) writeLabel(stream, indent, class->labels[i]); if (class->leader) writeLeader(stream, indent, class->leader); writeNumber(stream, indent, "MAXSCALEDENOM", -1, class->maxscaledenom); writeHashTable(stream, indent, "METADATA", &(class->metadata)); writeNumber(stream, indent, "MINSCALEDENOM", -1, class->minscaledenom); writeNumber(stream, indent, "MINFEATURESIZE", -1, class->minfeaturesize); writeKeyword(stream, indent, "STATUS", class->status, 1, MS_OFF, "OFF"); for (i = 0; i < class->numstyles; i++) writeStyle(stream, indent, class->styles[i]); writeString(stream, indent, "TEMPLATE", NULL, class->template); writeExpression(stream, indent, "TEXT", &(class->text)); writeString(stream, indent, "TITLE", NULL, class->title); writeHashTable(stream, indent, "VALIDATION", &(class->validation)); writeKeyword(stream, indent, "FALLBACK", class->isfallback, 1, MS_TRUE, "TRUE"); writeBlockEnd(stream, indent, "CLASS"); } static void writeIdentify(FILE *stream, int indent, layerObj *layer) { if (layer->identificationclassauto || layer->identificationclassgroup) { indent++; writeBlockBegin(stream, indent, "IDENTIFY"); if (layer->identificationclassauto) { writeIndent(stream, indent + 1); msIO_fprintf(stream, "CLASSAUTO\n"); } if (layer->identificationclassgroup) writeString(stream, indent, "CLASSGROUP", NULL, layer->identificationclassgroup); writeBlockEnd(stream, indent, "IDENTIFY"); } } char *msWriteClassToString(classObj *class) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeClass(stdout, -1, class); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } int initCompositingFilter(CompositingFilter *filter) { filter->filter = NULL; filter->next = NULL; return MS_SUCCESS; } void freeCompositingFilter(CompositingFilter *filter) { if (!filter) return; if (filter->next) freeCompositingFilter(filter->next); free(filter->filter); free(filter); } int initLayerCompositer(LayerCompositer *compositer) { compositer->comp_op = MS_COMPOP_SRC_OVER; compositer->opacity = 100; compositer->next = NULL; compositer->filter = NULL; return MS_SUCCESS; } void freeLayerCompositer(LayerCompositer *compositer) { if (!compositer) return; if (compositer->next) freeLayerCompositer(compositer->next); freeCompositingFilter(compositer->filter); free(compositer); } /* ** Initialize, load and free a single layer structure */ int initLayer(layerObj *layer, mapObj *map) { if (layer == NULL) { msSetError(MS_MEMERR, "Layer is null", "initLayer()"); return (-1); } layer->debug = (int)msGetGlobalDebugLevel(); MS_REFCNT_INIT(layer); /* Set maxclasses = 0, class[] will be allocated as needed on first call * to msGrowLayerClasses() */ layer->numclasses = 0; layer->maxclasses = 0; layer->class = NULL; layer->name = NULL; layer->group = NULL; layer->status = MS_OFF; layer->data = NULL; layer->rendermode = MS_FIRST_MATCHING_CLASS; layer->map = map; /* point back to the encompassing structure */ layer->type = -1; layer->toleranceunits = MS_PIXELS; layer->tolerance = -1; /* perhaps this should have a different value based on type */ layer->identificationclassauto = MS_FALSE; layer->identificationclassgroup = NULL; layer->symbolscaledenom = -1.0; /* -1 means nothing is set */ layer->scalefactor = 1.0; layer->maxscaledenom = -1.0; layer->minscaledenom = -1.0; layer->minfeaturesize = -1; /* no limit */ layer->maxgeowidth = -1.0; layer->mingeowidth = -1.0; layer->sizeunits = MS_PIXELS; layer->maxfeatures = -1; /* no quota */ layer->startindex = -1; /*used for pagination*/ layer->scaletokens = NULL; layer->numscaletokens = 0; layer->template = layer->header = layer->footer = NULL; layer->transform = MS_TRUE; layer->classitem = NULL; layer->classitemindex = -1; layer->units = MS_METERS; if (msInitProjection(&(layer->projection)) == -1) return (-1); if (map) { msProjectionInheritContextFrom(&(layer->projection), &(map->projection)); } layer->project = MS_TRUE; layer->reprojectorLayerToMap = NULL; layer->reprojectorMapToLayer = NULL; initCluster(&layer->cluster); MS_INIT_COLOR(layer->offsite, -1, -1, -1, 255); layer->labelcache = MS_ON; layer->postlabelcache = MS_FALSE; layer->labelitem = NULL; layer->labelitemindex = -1; layer->labelmaxscaledenom = -1; layer->labelminscaledenom = -1; layer->tileitem = msStrdup("location"); layer->tileitemindex = -1; layer->tileindex = NULL; layer->tilesrs = NULL; layer->bandsitem = NULL; layer->bandsitemindex = -1; layer->currentfeature = layer->features = NULL; layer->connection = NULL; layer->plugin_library = NULL; layer->plugin_library_original = NULL; layer->connectiontype = MS_SHAPEFILE; layer->vtable = NULL; layer->classgroup = NULL; layer->layerinfo = NULL; layer->wfslayerinfo = NULL; layer->items = NULL; layer->iteminfo = NULL; layer->numitems = 0; layer->resultcache = NULL; msInitExpression(&(layer->filter)); layer->filteritem = NULL; layer->filteritemindex = -1; layer-> requires = layer->labelrequires = NULL; initHashTable(&(layer->metadata)); initHashTable(&(layer->bindvals)); initHashTable(&(layer->validation)); layer->styleitem = NULL; layer->styleitemindex = -1; layer->processing = NULL; layer->numjoins = 0; layer->joins = (joinObj *)malloc(MS_MAXJOINS * sizeof(joinObj)); MS_CHECK_ALLOC(layer->joins, MS_MAXJOINS * sizeof(joinObj), -1); layer->extent.minx = -1.0; layer->extent.miny = -1.0; layer->extent.maxx = -1.0; layer->extent.maxy = -1.0; layer->mask = NULL; layer->maskimage = NULL; layer->grid = NULL; msInitExpression(&(layer->_geomtransform)); layer->_geomtransform.type = MS_GEOMTRANSFORM_NONE; msInitExpression(&(layer->utfdata)); layer->utfitem = NULL; layer->utfitemindex = -1; layer->encoding = NULL; layer->sortBy.nProperties = 0; layer->sortBy.properties = NULL; layer->orig_st = NULL; layer->compositer = NULL; initHashTable(&(layer->connectionoptions)); return (0); } int initScaleToken(scaleTokenObj *token) { token->n_entries = 0; token->name = NULL; token->tokens = NULL; return MS_SUCCESS; } int freeScaleTokenEntry(scaleTokenEntryObj *token) { msFree(token->value); return MS_SUCCESS; } int freeScaleToken(scaleTokenObj *scaletoken) { int i; msFree(scaletoken->name); for (i = 0; i < scaletoken->n_entries; i++) { freeScaleTokenEntry(&scaletoken->tokens[i]); } msFree(scaletoken->tokens); return MS_SUCCESS; } int freeLayer(layerObj *layer) { int i; if (!layer) return MS_FAILURE; if (MS_REFCNT_DECR_IS_NOT_ZERO(layer)) { return MS_FAILURE; } if (layer->debug >= MS_DEBUGLEVEL_VVV) msDebug("freeLayer(): freeing layer at %p.\n", layer); if (msLayerIsOpen(layer)) msLayerClose(layer); msFree(layer->name); msFree(layer->encoding); msFree(layer->group); msFree(layer->data); msFree(layer->classitem); msFree(layer->labelitem); msFree(layer->header); msFree(layer->footer); msFree(layer->template); msFree(layer->tileindex); msFree(layer->tileitem); msFree(layer->tilesrs); msFree(layer->bandsitem); msFree(layer->plugin_library); msFree(layer->plugin_library_original); msFree(layer->connection); msFree(layer->vtable); msFree(layer->classgroup); msProjectDestroyReprojector(layer->reprojectorLayerToMap); msProjectDestroyReprojector(layer->reprojectorMapToLayer); msFreeProjection(&(layer->projection)); msFreeExpression(&layer->_geomtransform); freeCluster(&layer->cluster); for (i = 0; i < layer->maxclasses; i++) { if (layer->class[i] != NULL) { layer->class[i]->layer = NULL; if (freeClass(layer->class[i]) == MS_SUCCESS) { msFree(layer->class[i]); } } } msFree(layer->class); if (layer->numscaletokens > 0) { for (i = 0; i < layer->numscaletokens; i++) { freeScaleToken(&layer->scaletokens[i]); } msFree(layer->scaletokens); } if (layer->features) freeFeatureList(layer->features); if (layer->resultcache) { cleanupResultCache(layer->resultcache); msFree(layer->resultcache); } msFree(layer->identificationclassgroup); msFree(layer->styleitem); msFree(layer->filteritem); msFreeExpression(&(layer->filter)); msFree(layer->requires); msFree(layer->labelrequires); msFreeHashItems(&(layer->metadata)); msFreeHashItems(&(layer->validation)); msFreeHashItems(&layer->bindvals); CSLDestroy(layer->processing); for (i = 0; i < layer->numjoins; i++) /* each join */ freeJoin(&(layer->joins[i])); msFree(layer->joins); layer->numjoins = 0; layer->classgroup = NULL; msFree(layer->mask); if (layer->maskimage) { msFreeImage(layer->maskimage); } if (layer->compositer) { freeLayerCompositer(layer->compositer); } if (layer->grid) { freeGrid(layer->grid); msFree(layer->grid); } msFreeExpression(&(layer->utfdata)); msFree(layer->utfitem); for (i = 0; i < layer->sortBy.nProperties; i++) msFree(layer->sortBy.properties[i].item); msFree(layer->sortBy.properties); msFreeHashItems(&layer->connectionoptions); return MS_SUCCESS; } /* ** Ensure there is at least one free entry in the class array of this ** layerObj. Grow the allocated class array if necessary and allocate ** a new class for class[numclasses] if there is not already one, ** setting its contents to all zero bytes (i.e. does not call initClass() ** on it). ** ** This function is safe to use for the initial allocation of the class[] ** array as well (i.e. when maxclasses==0 and class==NULL) ** ** Returns a reference to the new classObj on success, NULL on error. */ classObj *msGrowLayerClasses(layerObj *layer) { /* Do we need to increase the size of class[] by MS_CLASS_ALLOCSIZE? */ if (layer->numclasses == layer->maxclasses) { classObj **newClassPtr; int i, newsize; newsize = layer->maxclasses + MS_CLASS_ALLOCSIZE; /* Alloc/realloc classes */ newClassPtr = (classObj **)realloc(layer->class, newsize * sizeof(classObj *)); MS_CHECK_ALLOC(newClassPtr, newsize * sizeof(classObj *), NULL); layer->class = newClassPtr; layer->maxclasses = newsize; for (i = layer->numclasses; i < layer->maxclasses; i++) { layer->class[i] = NULL; } } if (layer->class[layer->numclasses] == NULL) { layer->class[layer->numclasses] = (classObj *)calloc(1, sizeof(classObj)); MS_CHECK_ALLOC(layer->class[layer->numclasses], sizeof(classObj), NULL); } return layer->class[layer->numclasses]; } scaleTokenObj *msGrowLayerScaletokens(layerObj *layer) { layer->scaletokens = msSmallRealloc( layer->scaletokens, (layer->numscaletokens + 1) * sizeof(scaleTokenObj)); memset(&layer->scaletokens[layer->numscaletokens], 0, sizeof(scaleTokenObj)); return &layer->scaletokens[layer->numscaletokens]; } int loadScaletoken(scaleTokenObj *token, layerObj *layer) { (void)layer; for (;;) { int stop = 0; switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadScaletoken()"); return (MS_FAILURE); case (NAME): if (getString(&token->name) == MS_FAILURE) return (MS_FAILURE); break; case (VALUES): for (;;) { if (stop) break; switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadScaletoken()"); return (MS_FAILURE); case (END): stop = 1; if (token->n_entries == 0) { msSetError(MS_PARSEERR, "Scaletoken (line:%d) has no VALUES defined", "loadScaleToken()", msyylineno); return (MS_FAILURE); } token->tokens[token->n_entries - 1].maxscale = DBL_MAX; break; case (MS_STRING): /* we have a key */ token->tokens = msSmallRealloc(token->tokens, (token->n_entries + 1) * sizeof(scaleTokenEntryObj)); if (1 != sscanf(msyystring_buffer, "%lf", &token->tokens[token->n_entries].minscale)) { msSetError(MS_PARSEERR, "failed to parse SCALETOKEN VALUE (%s):(line %d), " "expecting \"minscale\"", "loadScaletoken()", msyystring_buffer, msyylineno); return (MS_FAILURE); } if (token->n_entries == 0) { /* check supplied value was 0*/ if (token->tokens[0].minscale != 0) { msSetError(MS_PARSEERR, "First SCALETOKEN VALUE (%s):(line %d) must be zero, " "expecting \"0\"", "loadScaletoken()", msyystring_buffer, msyylineno); return (MS_FAILURE); } } else { /* set max scale of previous token */ token->tokens[token->n_entries - 1].maxscale = token->tokens[token->n_entries].minscale; } token->tokens[token->n_entries].value = NULL; if (getString(&(token->tokens[token->n_entries].value)) == MS_FAILURE) return (MS_FAILURE); token->n_entries++; break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadScaletoken()", msyystring_buffer, msyylineno); return (MS_FAILURE); } } break; case (END): if (!token->name || !*(token->name)) { msSetError(MS_PARSEERR, "ScaleToken missing mandatory NAME entry (line %d)", "loadScaleToken()", msyylineno); return MS_FAILURE; } if (token->n_entries == 0) { msSetError(MS_PARSEERR, "ScaleToken missing at least one VALUES entry (line %d)", "loadScaleToken()", msyylineno); return MS_FAILURE; } return MS_SUCCESS; default: msSetError(MS_IDENTERR, "Parsing error 2 near (%s):(line %d)", "loadScaletoken()", msyystring_buffer, msyylineno); return (MS_FAILURE); } } /* next token*/ } static const struct { CompositingOperation eOp; const char *pszName; } CompOps[] = { {MS_COMPOP_CLEAR, "clear"}, {MS_COMPOP_COLOR_BURN, "color-burn"}, {MS_COMPOP_COLOR_DODGE, "color-dodge"}, {MS_COMPOP_CONTRAST, "contrast"}, {MS_COMPOP_DARKEN, "darken"}, {MS_COMPOP_DIFFERENCE, "difference"}, {MS_COMPOP_DST, "dst"}, {MS_COMPOP_DST_ATOP, "dst-atop"}, {MS_COMPOP_DST_IN, "dst-in"}, {MS_COMPOP_DST_OUT, "dst-out"}, {MS_COMPOP_DST_OVER, "dst-over"}, {MS_COMPOP_EXCLUSION, "exclusion"}, {MS_COMPOP_HARD_LIGHT, "hard-light"}, {MS_COMPOP_HSL_COLOR, "hsl-color"}, {MS_COMPOP_HSL_HUE, "hsl-hue"}, {MS_COMPOP_HSL_LUMINOSITY, "hsl-luminosity"}, {MS_COMPOP_HSL_SATURATION, "hsl-saturation"}, {MS_COMPOP_INVERT, "invert"}, {MS_COMPOP_INVERT_RGB, "invert-rgb"}, {MS_COMPOP_LIGHTEN, "lighten"}, {MS_COMPOP_MINUS, "minus"}, {MS_COMPOP_MULTIPLY, "multiply"}, {MS_COMPOP_OVERLAY, "overlay"}, {MS_COMPOP_PLUS, "plus"}, {MS_COMPOP_SCREEN, "screen"}, {MS_COMPOP_SOFT_LIGHT, "soft-light"}, {MS_COMPOP_SRC, "src"}, {MS_COMPOP_SRC_ATOP, "src-atop"}, {MS_COMPOP_SRC_IN, "src-in"}, {MS_COMPOP_SRC_OUT, "src-out"}, {MS_COMPOP_SRC_OVER, "src-over"}, {MS_COMPOP_XOR, "xor"}, }; #define SIZEOF_COMP_OPS ((int)(sizeof(CompOps) / sizeof(CompOps[0]))) int loadLayerCompositer(LayerCompositer *compositer) { for (;;) { switch (msyylex()) { case COMPFILTER: { CompositingFilter **filter = &compositer->filter; while (*filter) { filter = &((*filter)->next); } *filter = msSmallMalloc(sizeof(CompositingFilter)); initCompositingFilter(*filter); if (getString(&((*filter)->filter)) == MS_FAILURE) return (MS_FAILURE); } break; case COMPOP: { char *compop = NULL; if (getString(&compop) == MS_FAILURE) return (MS_FAILURE); bool bFound = false; for (int i = 0; i < SIZEOF_COMP_OPS; ++i) { if (strcmp(compop, CompOps[i].pszName) == 0) { bFound = true; compositer->comp_op = CompOps[i].eOp; break; } } if (!bFound) { msSetError(MS_PARSEERR, "Unknown COMPOP \"%s\"", "loadLayerCompositer()", compop); free(compop); return MS_FAILURE; } free(compop); } break; case END: return MS_SUCCESS; case OPACITY: if (getInteger(&(compositer->opacity), MS_NUM_CHECK_RANGE, 0, 100) == -1) { msSetError(MS_PARSEERR, "OPACITY must be between 0 and 100 (line %d)", "loadLayerCompositer()", msyylineno); return MS_FAILURE; } break; default: msSetError(MS_IDENTERR, "Parsing error 2 near (%s):(line %d)", "loadLayerCompositer()", msyystring_buffer, msyylineno); return (MS_FAILURE); } } } static int loadIdentification(layerObj *layer) { for (;;) { switch (msyylex()) { case TOLERANCE: if (getDouble(&(layer->tolerance), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case TOLERANCEUNITS: if ((layer->toleranceunits = getSymbol( 8, MS_INCHES, MS_FEET, MS_MILES, MS_METERS, MS_KILOMETERS, MS_NAUTICALMILES, MS_DD, MS_PIXELS)) == -1) return (-1); break; case CLASSGROUP: if (getString(&layer->identificationclassgroup) == MS_FAILURE) return (-1); break; case CLASSAUTO: layer->identificationclassauto = MS_TRUE; break; case END: return MS_SUCCESS; default: msSetError(MS_IDENTERR, "Parsing error 2 near (%s):(line %d)", "loadIdentification()", msyystring_buffer, msyylineno); return (MS_FAILURE); } } } int loadLayer(layerObj *layer, mapObj *map) { int type; layer->map = (mapObj *)map; for (;;) { switch (msyylex()) { case (BINDVALS): if (loadHashTable(&(layer->bindvals)) != MS_SUCCESS) return (-1); break; case (CLASS): if (msGrowLayerClasses(layer) == NULL) return (-1); initClass(layer->class[layer->numclasses]); if (loadClass(layer->class[layer->numclasses], layer) == -1) { freeClass(layer->class[layer->numclasses]); free(layer->class[layer->numclasses]); layer->class[layer->numclasses] = NULL; return (-1); } layer->numclasses++; break; case (CLUSTER): if (loadCluster(&layer->cluster) == -1) return (-1); break; case (CLASSGROUP): if (getString(&layer->classgroup) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (CLASSITEM): if (getString(&layer->classitem) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (COMPOSITE): { LayerCompositer *compositer = msSmallMalloc(sizeof(LayerCompositer)); initLayerCompositer(compositer); if (MS_FAILURE == loadLayerCompositer(compositer)) { freeLayerCompositer(compositer); return -1; } if (!layer->compositer) { layer->compositer = compositer; } else { LayerCompositer *lctmp = layer->compositer; while (lctmp->next) lctmp = lctmp->next; lctmp->next = compositer; } break; } case (CONNECTION): if (getString(&layer->connection) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (CONNECTIONTYPE): if ((type = getSymbol(14, MS_OGR, MS_POSTGIS, MS_WMS, MS_ORACLESPATIAL, MS_WFS, MS_GRATICULE, MS_PLUGIN, MS_UNION, MS_UVRASTER, MS_CONTOUR, MS_KERNELDENSITY, MS_IDW, MS_FLATGEOBUF, MS_RASTER_LABEL)) == -1) return (-1); layer->connectiontype = type; break; case (DATA): if (getString(&layer->data) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (DEBUG): if ((layer->debug = getSymbol(3, MS_ON, MS_OFF, MS_NUMBER)) == -1) return (-1); if (layer->debug == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_RANGE, 0, 5) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid DEBUG level, must be between 0 and 5 (line %d)", "loadLayer()", msyylineno); return (-1); } layer->debug = (int)msyynumber; } break; case (EOF): msSetError(MS_EOFERR, NULL, "loadLayer()"); return (-1); break; case (ENCODING): if (getString(&layer->encoding) == MS_FAILURE) return (-1); break; case (END): if ((int)layer->type == -1) { msSetError(MS_MISCERR, "Layer type not set.", "loadLayer()"); return (-1); } return (0); break; case (EXTENT): { if (getDouble(&(layer->extent.minx), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (getDouble(&(layer->extent.miny), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (getDouble(&(layer->extent.maxx), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (getDouble(&(layer->extent.maxy), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (!MS_VALID_EXTENT(layer->extent)) { msSetError(MS_MISCERR, "Given layer extent is invalid. Check that it is in the " "form: minx, miny, maxx, maxy", "loadLayer()"); return (-1); } break; } case (FEATURE): if ((int)layer->type == -1) { msSetError(MS_MISCERR, "Layer type must be set before defining inline features.", "loadLayer()"); return (-1); } if (layer->type == MS_LAYER_POLYGON) type = MS_SHAPE_POLYGON; else if (layer->type == MS_LAYER_LINE) type = MS_SHAPE_LINE; else type = MS_SHAPE_POINT; layer->connectiontype = MS_INLINE; if (loadFeature(layer, type) == MS_FAILURE) return (-1); break; case (FILTER): if (loadExpression(&(layer->filter)) == -1) return (-1); /* loadExpression() cleans up previously allocated expression */ break; case (FILTERITEM): if (getString(&layer->filteritem) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (FOOTER): if (getString(&layer->footer) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (GRID): layer->connectiontype = MS_GRATICULE; if (layer->grid) { freeGrid(layer->grid); msFree(layer->grid); } layer->grid = (void *)malloc(sizeof(graticuleObj)); MS_CHECK_ALLOC(layer->grid, sizeof(graticuleObj), -1); initGrid(layer->grid); loadGrid(layer); break; case (GROUP): if (getString(&layer->group) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (GEOMTRANSFORM): { if (getSymbol(1, MS_EXPRESSION) == -1) return (MS_FAILURE); /* handle expression case here for the moment */ msFree(layer->_geomtransform.string); layer->_geomtransform.string = msStrdup(msyystring_buffer); layer->_geomtransform.type = MS_GEOMTRANSFORM_EXPRESSION; } break; case (HEADER): if (getString(&layer->header) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (JOIN): if (layer->numjoins == MS_MAXJOINS) { /* no room */ msSetError(MS_IDENTERR, "Maximum number of joins reached.", "loadLayer()"); return (-1); } if (loadJoin(&(layer->joins[layer->numjoins])) == -1) { freeJoin(&(layer->joins[layer->numjoins])); return (-1); } layer->numjoins++; break; case (LABELCACHE): if ((layer->labelcache = getSymbol(2, MS_ON, MS_OFF)) == -1) return (-1); break; case (LABELITEM): if (getString(&layer->labelitem) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (LABELMAXSCALE): case (LABELMAXSCALEDENOM): if (getDouble(&(layer->labelmaxscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (LABELMINSCALE): case (LABELMINSCALEDENOM): if (getDouble(&(layer->labelminscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (LABELREQUIRES): if (getString(&layer->labelrequires) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (LAYER): break; /* for string loads */ case (MASK): if (getString(&layer->mask) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (MAXFEATURES): if (getInteger(&(layer->maxfeatures), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXSCALE): case (MAXSCALEDENOM): if (getDouble(&(layer->maxscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MAXGEOWIDTH): if (getDouble(&(layer->maxgeowidth), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (METADATA): if (loadHashTable(&(layer->metadata)) != MS_SUCCESS) return (-1); break; case (MINSCALE): case (MINSCALEDENOM): if (getDouble(&(layer->minscaledenom), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MINGEOWIDTH): if (getDouble(&(layer->mingeowidth), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MINFEATURESIZE): if (getInteger(&(layer->minfeaturesize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (NAME): if (getString(&layer->name) == MS_FAILURE) return (-1); break; case (OFFSITE): if (loadColor(&(layer->offsite), NULL) != MS_SUCCESS) return (-1); break; case (CONNECTIONOPTIONS): if (loadHashTable(&(layer->connectionoptions)) != MS_SUCCESS) return (-1); break; case (MS_PLUGIN): { int rv; if (map->config) { // value *must* represent a config key char *value = NULL; const char *plugin_library = NULL; if (getString(&value) == MS_FAILURE) return (-1); plugin_library = msConfigGetPlugin(map->config, value); msFree(value); if (!plugin_library) { msSetError(MS_MISCERR, "Plugin value not found in config file. See " "mapserver.org/mapfile/config.html for more information.", "loadLayer()"); return (-1); } msFree(layer->plugin_library_original); layer->plugin_library_original = strdup(plugin_library); } else { if (getString(&layer->plugin_library_original) == MS_FAILURE) return (-1); } rv = msBuildPluginLibraryPath(&layer->plugin_library, layer->plugin_library_original, map); if (rv == MS_FAILURE) return (-1); } break; case (PROCESSING): { /* NOTE: processing array maintained as size+1 with NULL terminator. This ensure that CSL (GDAL string list) functions can be used on the list for easy processing. */ char *value = NULL; if (getString(&value) == MS_FAILURE) return (-1); msLayerAddProcessing(layer, value); free(value); value = NULL; } break; case (POSTLABELCACHE): if ((layer->postlabelcache = getSymbol(2, MS_TRUE, MS_FALSE)) == -1) return (-1); if (layer->postlabelcache) layer->labelcache = MS_OFF; break; case (PROJECTION): if (loadProjection(&(layer->projection)) == -1) return (-1); layer->project = MS_TRUE; break; case (REQUIRES): if (getString(&layer->requires) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (SCALETOKEN): if (msGrowLayerScaletokens(layer) == NULL) return (-1); initScaleToken(&layer->scaletokens[layer->numscaletokens]); if (loadScaletoken(&layer->scaletokens[layer->numscaletokens], layer) == -1) { freeScaleToken(&layer->scaletokens[layer->numscaletokens]); return (-1); } layer->numscaletokens++; break; case (SIZEUNITS): if ((layer->sizeunits = getSymbol( 8, MS_INCHES, MS_FEET, MS_MILES, MS_METERS, MS_KILOMETERS, MS_NAUTICALMILES, MS_DD, MS_PIXELS)) == -1) return (-1); break; case (STATUS): if ((layer->status = getSymbol(3, MS_ON, MS_OFF, MS_DEFAULT)) == -1) return (-1); break; case (STYLEITEM): if (getString(&layer->styleitem) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (SYMBOLSCALE): case (SYMBOLSCALEDENOM): if (getDouble(&(layer->symbolscaledenom), MS_NUM_CHECK_GTE, 1, -1) == -1) return (-1); break; case (TEMPLATE): if (getString(&layer->template) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (TILEINDEX): if (getString(&layer->tileindex) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (TILEITEM): if (getString(&layer->tileitem) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (TILESRS): if (getString(&layer->tilesrs) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (IDENTIFY): if (loadIdentification(layer) == MS_FAILURE) return (-1); break; case (TOLERANCE): if (getDouble(&(layer->tolerance), MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (TOLERANCEUNITS): if ((layer->toleranceunits = getSymbol( 8, MS_INCHES, MS_FEET, MS_MILES, MS_METERS, MS_KILOMETERS, MS_NAUTICALMILES, MS_DD, MS_PIXELS)) == -1) return (-1); break; case (TRANSFORM): if ((layer->transform = getSymbol(11, MS_TRUE, MS_FALSE, MS_UL, MS_UC, MS_UR, MS_CL, MS_CC, MS_CR, MS_LL, MS_LC, MS_LR)) == -1) return (-1); break; case (TYPE): if ((type = getSymbol(9, MS_LAYER_POINT, MS_LAYER_LINE, MS_LAYER_RASTER, MS_LAYER_POLYGON, MS_LAYER_ANNOTATION, MS_LAYER_QUERY, MS_LAYER_CIRCLE, MS_LAYER_CHART, TILEINDEX)) == -1) return (-1); if (type == TILEINDEX) type = MS_LAYER_TILEINDEX; /* TILEINDEX is also a parameter */ if (type == MS_LAYER_ANNOTATION) { msSetError(MS_IDENTERR, "Annotation Layers have been removed. To obtain same " "functionality, use a layer with label->styles and no " "class->styles", "loadLayer()"); return -1; } layer->type = type; break; case (UNITS): if ((layer->units = getSymbol(9, MS_INCHES, MS_FEET, MS_MILES, MS_METERS, MS_KILOMETERS, MS_NAUTICALMILES, MS_DD, MS_PIXELS, MS_PERCENTAGES)) == -1) return (-1); break; case (UTFDATA): if (loadExpression(&(layer->utfdata)) == -1) return (-1); /* loadExpression() cleans up previously allocated expression */ break; case (UTFITEM): if (getString(&layer->utfitem) == MS_FAILURE) return (-1); break; case (VALIDATION): if (loadHashTable(&(layer->validation)) != MS_SUCCESS) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadLayer()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } /* next token */ } int msUpdateLayerFromString(layerObj *layer, char *string) { int i; if (!layer || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadLayer(layer, layer->map) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); /* step through classes to resolve symbol names */ for (i = 0; i < layer->numclasses; i++) { if (classResolveSymbolNames(layer->class[i]) != MS_SUCCESS) return MS_FAILURE; } return MS_SUCCESS; } static void writeCompositingFilter(FILE *stream, int indent, CompositingFilter *filter) { while (filter) { writeString(stream, indent, "COMPFILTER", "", filter->filter); filter = filter->next; } } static void writeLayerCompositer(FILE *stream, int indent, LayerCompositer *compositor) { indent++; while (compositor) { writeBlockBegin(stream, indent, "COMPOSITE"); writeCompositingFilter(stream, indent, compositor->filter); if (compositor->comp_op != MS_COMPOP_SRC_OVER) { bool bFound = false; for (int i = 0; i < SIZEOF_COMP_OPS; ++i) { if (compositor->comp_op == CompOps[i].eOp) { bFound = true; writeString(stream, indent, "COMPOP", NULL, CompOps[i].pszName); break; } } if (!bFound) { assert(0); } } writeNumber(stream, indent, "OPACITY", 100, compositor->opacity); writeBlockEnd(stream, indent, "COMPOSITE"); compositor = compositor->next; } } static void writeLayer(FILE *stream, int indent, layerObj *layer) { int i; featureListNodeObjPtr current = NULL; if (layer->status == MS_DELETE) return; indent++; writeBlockBegin(stream, indent, "LAYER"); writeHashTable(stream, indent, "BINDVALS", &(layer->bindvals)); /* class - see below */ writeString(stream, indent, "CLASSGROUP", NULL, layer->classgroup); writeString(stream, indent, "CLASSITEM", NULL, layer->classitem); writeCluster(stream, indent, &(layer->cluster)); writeLayerCompositer(stream, indent, layer->compositer); writeString(stream, indent, "CONNECTION", NULL, layer->connection); writeKeyword(stream, indent, "CONNECTIONTYPE", layer->connectiontype, 12, MS_OGR, "OGR", MS_POSTGIS, "POSTGIS", MS_WMS, "WMS", MS_ORACLESPATIAL, "ORACLESPATIAL", MS_WFS, "WFS", MS_PLUGIN, "PLUGIN", MS_UNION, "UNION", MS_UVRASTER, "UVRASTER", MS_CONTOUR, "CONTOUR", MS_KERNELDENSITY, "KERNELDENSITY", MS_IDW, "IDW", MS_FLATGEOBUF, "FLATGEOBUF"); writeHashTable(stream, indent, "CONNECTIONOPTIONS", &(layer->connectionoptions)); writeString(stream, indent, "DATA", NULL, layer->data); writeNumber(stream, indent, "DEBUG", 0, layer->debug); /* is this right? see loadLayer() */ writeString(stream, indent, "ENCODING", NULL, layer->encoding); writeExtent(stream, indent, "EXTENT", layer->extent); writeExpression(stream, indent, "FILTER", &(layer->filter)); writeString(stream, indent, "FILTERITEM", NULL, layer->filteritem); writeString(stream, indent, "FOOTER", NULL, layer->footer); writeString(stream, indent, "GROUP", NULL, layer->group); if (layer->_geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) { writeIndent(stream, indent + 1); fprintf(stream, "GEOMTRANSFORM (%s)\n", layer->_geomtransform.string); } writeString(stream, indent, "HEADER", NULL, layer->header); /* join - see below */ writeKeyword(stream, indent, "LABELCACHE", layer->labelcache, 1, MS_OFF, "OFF"); writeString(stream, indent, "LABELITEM", NULL, layer->labelitem); writeNumber(stream, indent, "LABELMAXSCALEDENOM", -1, layer->labelmaxscaledenom); writeNumber(stream, indent, "LABELMINSCALEDENOM", -1, layer->labelminscaledenom); writeString(stream, indent, "LABELREQUIRES", NULL, layer->labelrequires); writeNumber(stream, indent, "MAXFEATURES", -1, layer->maxfeatures); writeNumber(stream, indent, "MAXGEOWIDTH", -1, layer->maxgeowidth); writeNumber(stream, indent, "MAXSCALEDENOM", -1, layer->maxscaledenom); writeString(stream, indent, "MASK", NULL, layer->mask); writeHashTable(stream, indent, "METADATA", &(layer->metadata)); writeNumber(stream, indent, "MINGEOWIDTH", -1, layer->mingeowidth); writeNumber(stream, indent, "MINSCALEDENOM", -1, layer->minscaledenom); writeNumber(stream, indent, "MINFEATURESIZE", -1, layer->minfeaturesize); writeString(stream, indent, "NAME", NULL, layer->name); writeColor(stream, indent, "OFFSITE", NULL, &(layer->offsite)); writeString(stream, indent, "PLUGIN", NULL, layer->plugin_library_original); writeKeyword(stream, indent, "POSTLABELCACHE", layer->postlabelcache, 1, MS_TRUE, "TRUE"); for (i = 0; layer->processing && layer->processing[i]; i++) writeString(stream, indent, "PROCESSING", NULL, layer->processing[i]); writeKeyword(stream, indent, "PROCESSING", layer->rendermode, 1, MS_ALL_MATCHING_CLASSES, "\"RENDERMODE=ALL_MATCHING_CLASSES\""); writeProjection(stream, indent, &(layer->projection)); writeString(stream, indent, "REQUIRES", NULL, layer->requires); writeKeyword(stream, indent, "SIZEUNITS", layer->sizeunits, 7, MS_INCHES, "INCHES", MS_FEET, "FEET", MS_MILES, "MILES", MS_METERS, "METERS", MS_KILOMETERS, "KILOMETERS", MS_NAUTICALMILES, "NAUTICALMILES", MS_DD, "DD"); writeKeyword(stream, indent, "STATUS", layer->status, 3, MS_ON, "ON", MS_OFF, "OFF", MS_DEFAULT, "DEFAULT"); writeString(stream, indent, "STYLEITEM", NULL, layer->styleitem); writeNumber(stream, indent, "SYMBOLSCALEDENOM", -1, layer->symbolscaledenom); writeString(stream, indent, "TEMPLATE", NULL, layer->template); writeString(stream, indent, "TILEINDEX", NULL, layer->tileindex); writeString(stream, indent, "TILEITEM", NULL, layer->tileitem); writeString(stream, indent, "TILESRS", NULL, layer->tilesrs); writeNumber(stream, indent, "TOLERANCE", -1, layer->tolerance); writeKeyword(stream, indent, "TOLERANCEUNITS", layer->toleranceunits, 7, MS_INCHES, "INCHES", MS_FEET, "FEET", MS_MILES, "MILES", MS_METERS, "METERS", MS_KILOMETERS, "KILOMETERS", MS_NAUTICALMILES, "NAUTICALMILES", MS_DD, "DD"); writeIdentify(stream, indent, layer); writeKeyword(stream, indent, "TRANSFORM", layer->transform, 10, MS_FALSE, "FALSE", MS_UL, "UL", MS_UC, "UC", MS_UR, "UR", MS_CL, "CL", MS_CC, "CC", MS_CR, "CR", MS_LL, "LL", MS_LC, "LC", MS_LR, "LR"); writeKeyword(stream, indent, "TYPE", layer->type, 9, MS_LAYER_POINT, "POINT", MS_LAYER_LINE, "LINE", MS_LAYER_POLYGON, "POLYGON", MS_LAYER_RASTER, "RASTER", MS_LAYER_ANNOTATION, "ANNOTATION", MS_LAYER_QUERY, "QUERY", MS_LAYER_CIRCLE, "CIRCLE", MS_LAYER_TILEINDEX, "TILEINDEX", MS_LAYER_CHART, "CHART"); writeKeyword(stream, indent, "UNITS", layer->units, 9, MS_INCHES, "INCHES", MS_FEET, "FEET", MS_MILES, "MILES", MS_METERS, "METERS", MS_KILOMETERS, "KILOMETERS", MS_NAUTICALMILES, "NAUTICALMILES", MS_DD, "DD", MS_PIXELS, "PIXELS", MS_PERCENTAGES, "PERCENTATGES"); writeExpression(stream, indent, "UTFDATA", &(layer->utfdata)); writeString(stream, indent, "UTFITEM", NULL, layer->utfitem); writeHashTable(stream, indent, "VALIDATION", &(layer->validation)); /* write potentially multiply occurring objects last */ for (i = 0; i < layer->numscaletokens; i++) writeScaleToken(stream, indent, &(layer->scaletokens[i])); for (i = 0; i < layer->numjoins; i++) writeJoin(stream, indent, &(layer->joins[i])); for (i = 0; i < layer->numclasses; i++) writeClass(stream, indent, layer->class[i]); if (layer->grid && layer->connectiontype == MS_GRATICULE) writeGrid(stream, indent, layer->grid); else { current = layer->features; while (current != NULL) { writeFeature(stream, indent, &(current->shape)); current = current->next; } } writeBlockEnd(stream, indent, "LAYER"); writeLineFeed(stream); } char *msWriteLayerToString(layerObj *layer) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeLayer(stdout, -1, layer); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } /* ** Initialize, load and free a referenceMapObj structure */ void initReferenceMap(referenceMapObj *ref) { ref->height = ref->width = 0; ref->extent.minx = ref->extent.miny = ref->extent.maxx = ref->extent.maxy = -1.0; ref->image = NULL; MS_INIT_COLOR(ref->color, 255, 0, 0, 255); MS_INIT_COLOR(ref->outlinecolor, 0, 0, 0, 255); ref->status = MS_OFF; ref->marker = 0; ref->markername = NULL; ref->markersize = 0; ref->minboxsize = 3; ref->maxboxsize = 0; ref->map = NULL; } void freeReferenceMap(referenceMapObj *ref) { msFree(ref->image); msFree(ref->markername); } int loadReferenceMap(referenceMapObj *ref, mapObj *map) { int state; ref->map = (mapObj *)map; for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadReferenceMap()"); return (-1); case (END): if (!ref->image) { msSetError(MS_MISCERR, "No image defined for the reference map.", "loadReferenceMap()"); return (-1); } if (ref->width == 0 || ref->height == 0) { msSetError(MS_MISCERR, "No image size defined for the reference map.", "loadReferenceMap()"); return (-1); } return (0); break; case (COLOR): if (loadColor(&(ref->color), NULL) != MS_SUCCESS) return (-1); break; case (EXTENT): if (getDouble(&(ref->extent.minx), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (getDouble(&(ref->extent.miny), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (getDouble(&(ref->extent.maxx), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (getDouble(&(ref->extent.maxy), MS_NUM_CHECK_NONE, -1, -1) == -1) return (-1); if (!MS_VALID_EXTENT(ref->extent)) { msSetError(MS_MISCERR, "Given reference extent is invalid. Check that it " "is in the form: minx, miny, maxx, maxy", "loadReferenceMap()"); return (-1); } break; case (IMAGE): if (getString(&ref->image) == MS_FAILURE) return (-1); break; case (OUTLINECOLOR): if (loadColor(&(ref->outlinecolor), NULL) != MS_SUCCESS) return (-1); break; case (SIZE): if (getInteger(&(ref->width), MS_NUM_CHECK_RANGE, 5, ref->map->maxsize) == -1) return (-1); // is 5 reasonable? if (getInteger(&(ref->height), MS_NUM_CHECK_RANGE, 5, ref->map->maxsize) == -1) return (-1); break; case (STATUS): if ((ref->status = getSymbol(2, MS_ON, MS_OFF)) == -1) return (-1); break; case (MARKER): if ((state = getSymbol(2, MS_NUMBER, MS_STRING)) == -1) return (-1); if (state == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_GTE, 0, -1) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid MARKER, must be greater than 0 (line %d)", "loadReferenceMap()", msyylineno); return (-1); } ref->marker = (int)msyynumber; } else { if (ref->markername != NULL) msFree(ref->markername); ref->markername = msStrdup(msyystring_buffer); } break; case (MARKERSIZE): if (getInteger(&(ref->markersize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MINBOXSIZE): if (getInteger(&(ref->minboxsize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (MAXBOXSIZE): if (getInteger(&(ref->maxboxsize), MS_NUM_CHECK_GT, 0, -1) == -1) return (-1); break; case (REFERENCE): break; /* for string loads */ default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadReferenceMap()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } /* next token */ } int msUpdateReferenceMapFromString(referenceMapObj *ref, char *string) { if (!ref || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadReferenceMap(ref, ref->map) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } static void writeReferenceMap(FILE *stream, int indent, referenceMapObj *ref) { colorObj c; if (!ref->image) return; indent++; writeBlockBegin(stream, indent, "REFERENCE"); MS_INIT_COLOR(c, 255, 0, 0, 255); writeColor(stream, indent, "COLOR", &c, &(ref->color)); writeExtent(stream, indent, "EXTENT", ref->extent); writeString(stream, indent, "IMAGE", NULL, ref->image); MS_INIT_COLOR(c, 0, 0, 0, 255); writeColor(stream, indent, "OUTLINECOLOR", &c, &(ref->outlinecolor)); writeDimension(stream, indent, "SIZE", ref->width, ref->height, NULL, NULL); writeKeyword(stream, indent, "STATUS", ref->status, 2, MS_ON, "ON", MS_OFF, "OFF"); writeNumberOrString(stream, indent, "MARKER", 0, ref->marker, ref->markername); writeNumber(stream, indent, "MARKERSIZE", -1, ref->markersize); writeNumber(stream, indent, "MAXBOXSIZE", -1, ref->maxboxsize); writeNumber(stream, indent, "MINBOXSIZE", -1, ref->minboxsize); writeBlockEnd(stream, indent, "REFERENCE"); writeLineFeed(stream); } char *msWriteReferenceMapToString(referenceMapObj *ref) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeReferenceMap(stdout, -1, ref); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } #define MAX_FORMATOPTIONS 100 static int loadOutputFormat(mapObj *map) { char *name = NULL; char *mimetype = NULL; char *driver = NULL; char *extension = NULL; int imagemode = MS_NOOVERRIDE; int transparent = MS_NOOVERRIDE; char *formatoptions[MAX_FORMATOPTIONS]; int numformatoptions = 0; char *value = NULL; for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadOutputFormat()"); goto load_output_error; case (END): { outputFormatObj *format; if (driver == NULL) { msSetError(MS_MISCERR, "OUTPUTFORMAT clause lacks DRIVER keyword near (%s):(%d)", "loadOutputFormat()", msyystring_buffer, msyylineno); goto load_output_error; } format = msCreateDefaultOutputFormat(map, driver, name, NULL); if (format == NULL) { msSetError(MS_MISCERR, "OUTPUTFORMAT (%s) clause references driver (%s), but this " "driver isn't configured.", "loadOutputFormat()", name, driver); goto load_output_error; } msFree(name); name = NULL; msFree(driver); driver = NULL; if (transparent != MS_NOOVERRIDE) format->transparent = transparent; if (extension != NULL) { msFree(format->extension); format->extension = extension; extension = NULL; } if (mimetype != NULL) { msFree(format->mimetype); format->mimetype = mimetype; mimetype = NULL; } if (imagemode != MS_NOOVERRIDE) { if (format->renderer != MS_RENDER_WITH_AGG || imagemode != MS_IMAGEMODE_PC256) { /* don't force to PC256 with agg, this can happen when using mapfile * defined GD outputformats that are now falling back to agg/png8 */ format->imagemode = imagemode; } if (transparent == MS_NOOVERRIDE) { if (imagemode == MS_IMAGEMODE_RGB) format->transparent = MS_FALSE; else if (imagemode == MS_IMAGEMODE_RGBA) format->transparent = MS_TRUE; } if (format->imagemode == MS_IMAGEMODE_INT16 || format->imagemode == MS_IMAGEMODE_FLOAT32 || format->imagemode == MS_IMAGEMODE_BYTE) format->renderer = MS_RENDER_WITH_RAWDATA; } while (numformatoptions--) { char *key = strchr(formatoptions[numformatoptions], '='); if (!key || !*(key + 1)) { msSetError( MS_MISCERR, "Failed to parse FORMATOPTION, expecting \"KEY=VALUE\" syntax.", "loadOutputFormat()"); goto load_output_error; } *key = 0; key++; msSetOutputFormatOption(format, formatoptions[numformatoptions], key); free(formatoptions[numformatoptions]); } format->inmapfile = MS_TRUE; msOutputFormatValidate(format, MS_FALSE); return (0); } case (NAME): msFree(name); if ((name = getToken()) == NULL) goto load_output_error; break; case (MIMETYPE): if (getString(&mimetype) == MS_FAILURE) goto load_output_error; break; case (DRIVER): { int s; if ((s = getSymbol(2, MS_STRING, TEMPLATE)) == -1) /* allow the template to be quoted or not in the mapfile */ goto load_output_error; free(driver); if (s == MS_STRING) driver = msStrdup(msyystring_buffer); else driver = msStrdup("TEMPLATE"); } break; case (EXTENSION): if (getString(&extension) == MS_FAILURE) goto load_output_error; if (extension[0] == '.') { char *temp = msStrdup(extension + 1); free(extension); extension = temp; } break; case (FORMATOPTION): if (getString(&value) == MS_FAILURE) goto load_output_error; if (numformatoptions < MAX_FORMATOPTIONS) formatoptions[numformatoptions++] = value; value = NULL; break; case (IMAGEMODE): value = getToken(); if (strcasecmp(value, "PC256") == 0) imagemode = MS_IMAGEMODE_PC256; else if (strcasecmp(value, "RGB") == 0) imagemode = MS_IMAGEMODE_RGB; else if (strcasecmp(value, "RGBA") == 0) imagemode = MS_IMAGEMODE_RGBA; else if (strcasecmp(value, "INT16") == 0) imagemode = MS_IMAGEMODE_INT16; else if (strcasecmp(value, "FLOAT32") == 0) imagemode = MS_IMAGEMODE_FLOAT32; else if (strcasecmp(value, "BYTE") == 0) imagemode = MS_IMAGEMODE_BYTE; else if (strcasecmp(value, "FEATURE") == 0) imagemode = MS_IMAGEMODE_FEATURE; else { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d), expected PC256, RGB, " "RGBA, FEATURE, BYTE, INT16, or FLOAT32 for IMAGEMODE.", "loadOutputFormat()", msyystring_buffer, msyylineno); goto load_output_error; } free(value); value = NULL; break; case (TRANSPARENT): if ((transparent = getSymbol(2, MS_ON, MS_OFF)) == -1) goto load_output_error; break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadOutputFormat()", msyystring_buffer, msyylineno); goto load_output_error; } } /* next token */ load_output_error: msFree(driver); msFree(extension); msFree(mimetype); msFree(name); msFree(value); return -1; } /* ** utility function to write an output format structure to file */ static void writeOutputformatobject(FILE *stream, int indent, outputFormatObj *outputformat) { int i = 0; if (!outputformat) return; indent++; writeBlockBegin(stream, indent, "OUTPUTFORMAT"); writeString(stream, indent, "NAME", NULL, outputformat->name); writeString(stream, indent, "MIMETYPE", NULL, outputformat->mimetype); writeString(stream, indent, "DRIVER", NULL, outputformat->driver); writeString(stream, indent, "EXTENSION", NULL, outputformat->extension); writeKeyword(stream, indent, "IMAGEMODE", outputformat->imagemode, 7, MS_IMAGEMODE_PC256, "PC256", MS_IMAGEMODE_RGB, "RGB", MS_IMAGEMODE_RGBA, "RGBA", MS_IMAGEMODE_INT16, "INT16", MS_IMAGEMODE_FLOAT32, "FLOAT32", MS_IMAGEMODE_BYTE, "BYTE", MS_IMAGEMODE_FEATURE, "FEATURE"); writeKeyword(stream, indent, "TRANSPARENT", outputformat->transparent, 2, MS_TRUE, "TRUE", MS_FALSE, "FALSE"); for (i = 0; i < outputformat->numformatoptions; i++) writeString(stream, indent, "FORMATOPTION", NULL, outputformat->formatoptions[i]); writeBlockEnd(stream, indent, "OUTPUTFORMAT"); writeLineFeed(stream); } /* ** Write the output formats to file */ static void writeOutputformat(FILE *stream, int indent, mapObj *map) { int i = 0; if (!map->outputformat) return; writeOutputformatobject(stream, indent, map->outputformat); for (i = 0; i < map->numoutputformats; i++) { if (map->outputformatlist[i]->inmapfile == MS_TRUE && strcmp(map->outputformatlist[i]->name, map->outputformat->name) != 0) writeOutputformatobject(stream, indent, map->outputformatlist[i]); } } /* ** Initialize, load and free a legendObj structure */ void initLegend(legendObj *legend) { legend->height = legend->width = 0; MS_INIT_COLOR(legend->imagecolor, 255, 255, 255, 255); /* white */ MS_INIT_COLOR(legend->outlinecolor, -1, -1, -1, 255); initLabel(&legend->label); legend->label.position = MS_XY; /* override */ legend->keysizex = 20; legend->keysizey = 10; legend->keyspacingx = 5; legend->keyspacingy = 5; legend->status = MS_OFF; legend->transparent = MS_NOOVERRIDE; legend->position = MS_LL; legend->postlabelcache = MS_FALSE; /* draw with labels */ legend->template = NULL; legend->map = NULL; } void freeLegend(legendObj *legend) { if (legend->template) free(legend->template); freeLabel(&(legend->label)); } int loadLegend(legendObj *legend, mapObj *map) { legend->map = (mapObj *)map; for (;;) { switch (msyylex()) { case (EOF): msSetError(MS_EOFERR, NULL, "loadLegend()"); return (-1); case (END): legend->label.position = MS_XY; /* overrides go here */ return (0); break; case (IMAGECOLOR): if (loadColor(&(legend->imagecolor), NULL) != MS_SUCCESS) return (-1); break; case (KEYSIZE): if (getInteger(&(legend->keysizex), MS_NUM_CHECK_RANGE, MS_LEGEND_KEYSIZE_MIN, MS_LEGEND_KEYSIZE_MAX) == -1) return (-1); if (getInteger(&(legend->keysizey), MS_NUM_CHECK_RANGE, MS_LEGEND_KEYSIZE_MIN, MS_LEGEND_KEYSIZE_MAX) == -1) return (-1); break; case (KEYSPACING): if (getInteger(&(legend->keyspacingx), MS_NUM_CHECK_RANGE, MS_LEGEND_KEYSPACING_MIN, MS_LEGEND_KEYSPACING_MAX) == -1) return (-1); if (getInteger(&(legend->keyspacingy), MS_NUM_CHECK_RANGE, MS_LEGEND_KEYSPACING_MIN, MS_LEGEND_KEYSPACING_MAX) == -1) return (-1); break; case (LABEL): if (loadLabel(&(legend->label)) == -1) return (-1); legend->label.angle = 0; /* force */ break; case (LEGEND): break; /* for string loads */ case (OUTLINECOLOR): if (loadColor(&(legend->outlinecolor), NULL) != MS_SUCCESS) return (-1); break; case (POSITION): if ((legend->position = getSymbol(6, MS_UL, MS_UR, MS_LL, MS_LR, MS_UC, MS_LC)) == -1) return (-1); break; case (POSTLABELCACHE): if ((legend->postlabelcache = getSymbol(2, MS_TRUE, MS_FALSE)) == -1) return (-1); break; case (STATUS): if ((legend->status = getSymbol(3, MS_ON, MS_OFF, MS_EMBED)) == -1) return (-1); break; case (TRANSPARENT): if ((legend->transparent = getSymbol(2, MS_ON, MS_OFF)) == -1) return (-1); break; case (TEMPLATE): if (getString(&legend->template) == MS_FAILURE) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadLegend()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } /* next token */ } int msUpdateLegendFromString(legendObj *legend, char *string) { if (!legend || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadLegend(legend, legend->map) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } static void writeLegend(FILE *stream, int indent, legendObj *legend) { colorObj c; indent++; writeBlockBegin(stream, indent, "LEGEND"); MS_INIT_COLOR(c, 255, 255, 255, 255); writeColor(stream, indent, "IMAGECOLOR", &c, &(legend->imagecolor)); writeDimension(stream, indent, "KEYSIZE", legend->keysizex, legend->keysizey, NULL, NULL); writeDimension(stream, indent, "KEYSPACING", legend->keyspacingx, legend->keyspacingy, NULL, NULL); writeLabel(stream, indent, &(legend->label)); writeColor(stream, indent, "OUTLINECOLOR", NULL, &(legend->outlinecolor)); if (legend->status == MS_EMBED) writeKeyword(stream, indent, "POSITION", legend->position, 6, MS_LL, "LL", MS_UL, "UL", MS_UR, "UR", MS_LR, "LR", MS_UC, "UC", MS_LC, "LC"); writeKeyword(stream, indent, "POSTLABELCACHE", legend->postlabelcache, 1, MS_TRUE, "TRUE"); writeKeyword(stream, indent, "STATUS", legend->status, 3, MS_ON, "ON", MS_OFF, "OFF", MS_EMBED, "EMBED"); writeKeyword(stream, indent, "TRANSPARENT", legend->transparent, 2, MS_TRUE, "TRUE", MS_FALSE, "FALSE"); writeString(stream, indent, "TEMPLATE", NULL, legend->template); writeBlockEnd(stream, indent, "LEGEND"); writeLineFeed(stream); } char *msWriteLegendToString(legendObj *legend) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeLegend(stdout, -1, legend); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } /* ** Initialize, load and free a scalebarObj structure */ void initScalebar(scalebarObj *scalebar) { MS_INIT_COLOR(scalebar->imagecolor, -1, -1, -1, 255); scalebar->width = 200; scalebar->height = 3; scalebar->style = 0; /* only 2 styles at this point */ scalebar->intervals = 4; initLabel(&scalebar->label); scalebar->label.position = MS_XY; /* override */ MS_INIT_COLOR(scalebar->backgroundcolor, -1, -1, -1, 255); /* if not set, scalebar creation needs to set this to match the background color */ MS_INIT_COLOR(scalebar->color, 0, 0, 0, 255); /* default to black */ MS_INIT_COLOR(scalebar->outlinecolor, -1, -1, -1, 255); scalebar->units = MS_MILES; scalebar->status = MS_OFF; scalebar->position = MS_LL; scalebar->transparent = MS_NOOVERRIDE; /* no transparency */ scalebar->postlabelcache = MS_FALSE; /* draw with labels */ scalebar->align = MS_ALIGN_CENTER; scalebar->offsetx = 0; scalebar->offsety = 0; } void freeScalebar(scalebarObj *scalebar) { freeLabel(&(scalebar->label)); } int loadScalebar(scalebarObj *scalebar) { for (;;) { switch (msyylex()) { case (ALIGN): if ((scalebar->align = getSymbol(3, MS_ALIGN_LEFT, MS_ALIGN_CENTER, MS_ALIGN_RIGHT)) == -1) return (-1); break; case (BACKGROUNDCOLOR): if (loadColor(&(scalebar->backgroundcolor), NULL) != MS_SUCCESS) return (-1); break; case (COLOR): if (loadColor(&(scalebar->color), NULL) != MS_SUCCESS) return (-1); break; case (EOF): msSetError(MS_EOFERR, NULL, "loadScalebar()"); return (-1); case (END): return (0); break; case (IMAGECOLOR): if (loadColor(&(scalebar->imagecolor), NULL) != MS_SUCCESS) return (-1); break; case (INTERVALS): if (getInteger(&(scalebar->intervals), MS_NUM_CHECK_RANGE, MS_SCALEBAR_INTERVALS_MIN, MS_SCALEBAR_INTERVALS_MAX) == -1) return (-1); break; case (LABEL): if (loadLabel(&(scalebar->label)) == -1) return (-1); scalebar->label.angle = 0; break; case (OUTLINECOLOR): if (loadColor(&(scalebar->outlinecolor), NULL) != MS_SUCCESS) return (-1); break; case (POSITION): if ((scalebar->position = getSymbol(6, MS_UL, MS_UR, MS_LL, MS_LR, MS_UC, MS_LC)) == -1) return (-1); break; case (POSTLABELCACHE): if ((scalebar->postlabelcache = getSymbol(2, MS_TRUE, MS_FALSE)) == -1) return (-1); break; case (SCALEBAR): break; /* for string loads */ case (SIZE): if (getInteger(&(scalebar->width), MS_NUM_CHECK_RANGE, MS_SCALEBAR_WIDTH_MIN, MS_SCALEBAR_WIDTH_MAX) == -1) return (-1); if (getInteger(&(scalebar->height), MS_NUM_CHECK_RANGE, MS_SCALEBAR_HEIGHT_MIN, MS_SCALEBAR_HEIGHT_MAX) == -1) return (-1); break; case (STATUS): if ((scalebar->status = getSymbol(3, MS_ON, MS_OFF, MS_EMBED)) == -1) return (-1); break; case (STYLE): if (getInteger(&(scalebar->style), MS_NUM_CHECK_RANGE, 0, 1) == -1) return (-1); // only 2 styles: 0 and 1 break; case (TRANSPARENT): if ((scalebar->transparent = getSymbol(2, MS_ON, MS_OFF)) == -1) return (-1); break; case (UNITS): if ((scalebar->units = getSymbol(6, MS_INCHES, MS_FEET, MS_MILES, MS_METERS, MS_KILOMETERS, MS_NAUTICALMILES)) == -1) return (-1); break; case (OFFSET): if (getInteger(&(scalebar->offsetx), MS_NUM_CHECK_RANGE, MS_SCALEBAR_OFFSET_MIN, MS_SCALEBAR_OFFSET_MAX) == -1) return (-1); if (getInteger(&(scalebar->offsety), MS_NUM_CHECK_RANGE, MS_SCALEBAR_OFFSET_MIN, MS_SCALEBAR_OFFSET_MAX) == -1) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadScalebar()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } /* next token */ } int msUpdateScalebarFromString(scalebarObj *scalebar, char *string) { if (!scalebar || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadScalebar(scalebar) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } static void writeScalebar(FILE *stream, int indent, scalebarObj *scalebar) { colorObj c; indent++; writeBlockBegin(stream, indent, "SCALEBAR"); writeKeyword(stream, indent, "ALIGN", scalebar->align, 2, MS_ALIGN_LEFT, "LEFT", MS_ALIGN_RIGHT, "RIGHT"); writeColor(stream, indent, "BACKGROUNDCOLOR", NULL, &(scalebar->backgroundcolor)); MS_INIT_COLOR(c, 0, 0, 0, 255); writeColor(stream, indent, "COLOR", &c, &(scalebar->color)); writeColor(stream, indent, "IMAGECOLOR", NULL, &(scalebar->imagecolor)); writeNumber(stream, indent, "INTERVALS", -1, scalebar->intervals); writeLabel(stream, indent, &(scalebar->label)); writeColor(stream, indent, "OUTLINECOLOR", NULL, &(scalebar->outlinecolor)); if (scalebar->status == MS_EMBED) writeKeyword(stream, indent, "POSITION", scalebar->position, 6, MS_LL, "LL", MS_UL, "UL", MS_UR, "UR", MS_LR, "LR", MS_UC, "UC", MS_LC, "LC"); writeKeyword(stream, indent, "POSTLABELCACHE", scalebar->postlabelcache, 1, MS_TRUE, "TRUE"); writeDimension(stream, indent, "SIZE", scalebar->width, scalebar->height, NULL, NULL); writeKeyword(stream, indent, "STATUS", scalebar->status, 3, MS_ON, "ON", MS_OFF, "OFF", MS_EMBED, "EMBED"); writeNumber(stream, indent, "STYLE", 0, scalebar->style); writeKeyword(stream, indent, "TRANSPARENT", scalebar->transparent, 2, MS_TRUE, "TRUE", MS_FALSE, "FALSE"); writeKeyword(stream, indent, "UNITS", scalebar->units, 6, MS_INCHES, "INCHES", MS_FEET, "FEET", MS_MILES, "MILES", MS_METERS, "METERS", MS_KILOMETERS, "KILOMETERS", MS_NAUTICALMILES, "NAUTICALMILES"); writeBlockEnd(stream, indent, "SCALEBAR"); writeLineFeed(stream); } char *msWriteScalebarToString(scalebarObj *scalebar) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeScalebar(stdout, -1, scalebar); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } /* ** Initialize a queryMapObj structure */ void initQueryMap(queryMapObj *querymap) { querymap->width = querymap->height = -1; querymap->style = MS_HILITE; querymap->status = MS_OFF; MS_INIT_COLOR(querymap->color, 255, 255, 0, 255); /* yellow */ } int loadQueryMap(queryMapObj *querymap, mapObj *map) { querymap->map = (mapObj *)map; for (;;) { switch (msyylex()) { case (QUERYMAP): break; /* for string loads */ case (COLOR): if (loadColor(&(querymap->color), NULL) != MS_SUCCESS) return MS_FAILURE; break; case (EOF): msSetError(MS_EOFERR, NULL, "loadQueryMap()"); return (-1); case (END): return (0); break; case (SIZE): /* ** we do -1 (and avoid 0) here to maintain backwards compatibility as *older versions write "SIZE -1 -1" when saving a mapfile */ if (getInteger(&(querymap->width), MS_NUM_CHECK_RANGE, -1, querymap->map->maxsize) == -1 || querymap->width == 0) { msSetError(MS_MISCERR, "Invalid SIZE value (line %d)", "loadQueryMap()", msyylineno); return (-1); } if (getInteger(&(querymap->height), MS_NUM_CHECK_RANGE, -1, querymap->map->maxsize) == -1 || querymap->height == 0) { msSetError(MS_MISCERR, "Invalid SIZE value (line %d)", "loadQueryMap()", msyylineno); return (-1); } break; case (STATUS): if ((querymap->status = getSymbol(2, MS_ON, MS_OFF)) == -1) return (-1); break; case (STYLE): case (TYPE): if ((querymap->style = getSymbol(3, MS_NORMAL, MS_HILITE, MS_SELECTED)) == -1) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadQueryMap()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } } int msUpdateQueryMapFromString(queryMapObj *querymap, char *string) { if (!querymap || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadQueryMap(querymap, querymap->map) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } static void writeQueryMap(FILE *stream, int indent, queryMapObj *querymap) { colorObj c; indent++; writeBlockBegin(stream, indent, "QUERYMAP"); MS_INIT_COLOR(c, 255, 255, 0, 255); writeColor(stream, indent, "COLOR", &c, &(querymap->color)); if (querymap->width != -1 && querymap->height != -1) // don't write SIZE if not explicitly set writeDimension(stream, indent, "SIZE", querymap->width, querymap->height, NULL, NULL); writeKeyword(stream, indent, "STATUS", querymap->status, 2, MS_ON, "ON", MS_OFF, "OFF"); writeKeyword(stream, indent, "STYLE", querymap->style, 3, MS_NORMAL, "NORMAL", MS_HILITE, "HILITE", MS_SELECTED, "SELECTED"); writeBlockEnd(stream, indent, "QUERYMAP"); writeLineFeed(stream); } char *msWriteQueryMapToString(queryMapObj *querymap) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeQueryMap(stdout, -1, querymap); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } /* ** Initialize a webObj structure */ void initWeb(webObj *web) { web->template = NULL; web->header = web->footer = NULL; web->error = web->empty = NULL; web->mintemplate = web->maxtemplate = NULL; web->minscaledenom = web->maxscaledenom = -1; web->imagepath = msStrdup(""); web->temppath = NULL; web->imageurl = msStrdup(""); initHashTable(&(web->metadata)); initHashTable(&(web->validation)); web->map = NULL; web->queryformat = msStrdup("text/html"); web->legendformat = msStrdup("text/html"); web->browseformat = msStrdup("text/html"); } void freeWeb(webObj *web) { msFree(web->template); msFree(web->header); msFree(web->footer); msFree(web->error); msFree(web->empty); msFree(web->maxtemplate); msFree(web->mintemplate); msFree(web->imagepath); msFree(web->temppath); msFree(web->imageurl); msFree(web->queryformat); msFree(web->legendformat); msFree(web->browseformat); msFreeHashItems(&(web->metadata)); msFreeHashItems(&(web->validation)); } static void writeWeb(FILE *stream, int indent, webObj *web) { indent++; writeBlockBegin(stream, indent, "WEB"); writeString(stream, indent, "BROWSEFORMAT", "text/html", web->browseformat); writeString(stream, indent, "EMPTY", NULL, web->empty); writeString(stream, indent, "ERROR", NULL, web->error); writeString(stream, indent, "FOOTER", NULL, web->footer); writeString(stream, indent, "HEADER", NULL, web->header); writeString(stream, indent, "IMAGEPATH", "", web->imagepath); writeString(stream, indent, "TEMPPATH", NULL, web->temppath); writeString(stream, indent, "IMAGEURL", "", web->imageurl); writeString(stream, indent, "LEGENDFORMAT", "text/html", web->legendformat); writeNumber(stream, indent, "MAXSCALEDENOM", -1, web->maxscaledenom); writeString(stream, indent, "MAXTEMPLATE", NULL, web->maxtemplate); writeHashTable(stream, indent, "METADATA", &(web->metadata)); writeNumber(stream, indent, "MINSCALEDENOM", -1, web->minscaledenom); writeString(stream, indent, "MINTEMPLATE", NULL, web->mintemplate); writeString(stream, indent, "QUERYFORMAT", "text/html", web->queryformat); writeString(stream, indent, "TEMPLATE", NULL, web->template); writeHashTable(stream, indent, "VALIDATION", &(web->validation)); writeBlockEnd(stream, indent, "WEB"); writeLineFeed(stream); } char *msWriteWebToString(webObj *web) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeWeb(stdout, -1, web); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } int loadWeb(webObj *web, mapObj *map) { web->map = (mapObj *)map; for (;;) { switch (msyylex()) { case (BROWSEFORMAT): /* change to use validation in 6.0 */ free(web->browseformat); web->browseformat = NULL; /* there is a default */ if (getString(&web->browseformat) == MS_FAILURE) return (-1); break; case (EMPTY): if (getString(&web->empty) == MS_FAILURE) return (-1); break; case (WEB): break; /* for string loads */ case (EOF): msSetError(MS_EOFERR, NULL, "loadWeb()"); return (-1); case (END): return (0); break; case (ERROR): if (getString(&web->error) == MS_FAILURE) return (-1); break; case (FOOTER): if (getString(&web->footer) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (HEADER): if (getString(&web->header) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (IMAGEPATH): if (getString(&web->imagepath) == MS_FAILURE) return (-1); break; case (TEMPPATH): if (getString(&web->temppath) == MS_FAILURE) return (-1); break; case (IMAGEURL): if (getString(&web->imageurl) == MS_FAILURE) return (-1); break; case (LEGENDFORMAT): /* change to use validation in 6.0 */ free(web->legendformat); web->legendformat = NULL; /* there is a default */ if (getString(&web->legendformat) == MS_FAILURE) return (-1); break; case (MAXSCALEDENOM): if (getDouble(&web->maxscaledenom, MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MAXTEMPLATE): if (getString(&web->maxtemplate) == MS_FAILURE) return (-1); break; case (METADATA): if (loadHashTable(&(web->metadata)) != MS_SUCCESS) return (-1); break; case (MINSCALEDENOM): if (getDouble(&web->minscaledenom, MS_NUM_CHECK_GTE, 0, -1) == -1) return (-1); break; case (MINTEMPLATE): if (getString(&web->mintemplate) == MS_FAILURE) return (-1); break; case (QUERYFORMAT): /* change to use validation in 6.0 */ free(web->queryformat); web->queryformat = NULL; /* there is a default */ if (getString(&web->queryformat) == MS_FAILURE) return (-1); break; case (TEMPLATE): if (getString(&web->template) == MS_FAILURE) return (-1); /* getString() cleans up previously allocated string */ break; case (VALIDATION): if (loadHashTable(&(web->validation)) != MS_SUCCESS) return (-1); break; default: if (strlen(msyystring_buffer) > 0) { msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "loadWeb()", msyystring_buffer, msyylineno); return (-1); } else { return (0); /* end of a string, not an error */ } } } } int msUpdateWebFromString(webObj *web, char *string) { if (!web || !string) return MS_FAILURE; msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_STRING; msyystring = string; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 */ if (loadWeb(web, web->map) == -1) { msReleaseLock(TLOCK_PARSER); return MS_FAILURE; /* parse error */ ; } msyylex_destroy(); msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; } /* ** Initialize, load and free a mapObj structure ** ** This really belongs in mapobject.c, but currently it also depends on ** lots of other init methods in this file. */ int initMap(mapObj *map) { int i = 0; MS_REFCNT_INIT(map); map->debug = (int)msGetGlobalDebugLevel(); /* Set maxlayers = 0, layers[] and layerorder[] will be allocated as needed, * on the first call to msGrowMapLayers() */ map->numlayers = 0; map->maxlayers = 0; map->layers = NULL; map->layerorder = NULL; /* used to modify the order in which the layers are drawn */ map->status = MS_ON; map->name = msStrdup("MS"); map->extent.minx = map->extent.miny = map->extent.maxx = map->extent.maxy = -1.0; map->scaledenom = -1.0; map->resolution = MS_DEFAULT_RESOLUTION; /* pixels per inch */ map->defresolution = MS_DEFAULT_RESOLUTION; /* pixels per inch */ map->height = map->width = -1; map->maxsize = MS_MAXIMAGESIZE_DEFAULT; map->gt.need_geotransform = MS_FALSE; map->gt.rotation_angle = 0.0; map->units = MS_METERS; map->cellsize = 0; map->shapepath = NULL; map->mappath = NULL; map->sldurl = NULL; MS_INIT_COLOR(map->imagecolor, 255, 255, 255, 255); /* white */ map->numoutputformats = 0; map->outputformatlist = NULL; map->outputformat = NULL; /* map->configoptions = msCreateHashTable();; */ initHashTable(&(map->configoptions)); map->imagetype = NULL; map->palette.numcolors = 0; for (i = 0; i < MS_MAX_LABEL_PRIORITY; i++) { map->labelcache.slots[i].labels = NULL; /* cache is initialize at draw time */ map->labelcache.slots[i].cachesize = 0; map->labelcache.slots[i].numlabels = 0; map->labelcache.slots[i].markers = NULL; map->labelcache.slots[i].markercachesize = 0; map->labelcache.slots[i].nummarkers = 0; } map->fontset.filename = NULL; map->fontset.numfonts = 0; /* map->fontset.fonts = NULL; */ initHashTable(&(map->fontset.fonts)); msInitSymbolSet(&map->symbolset); map->symbolset.fontset = &(map->fontset); map->symbolset.map = map; initLegend(&map->legend); initScalebar(&map->scalebar); initWeb(&map->web); initReferenceMap(&map->reference); initQueryMap(&map->querymap); map->projContext = msProjectionContextGetFromPool(); if (msInitProjection(&(map->projection)) == -1) return (-1); if (msInitProjection(&(map->latlon)) == -1) return (-1); msProjectionSetContext(&(map->projection), map->projContext); msProjectionSetContext(&(map->latlon), map->projContext); /* initialize a default "geographic" projection */ map->latlon.numargs = 2; map->latlon.args[0] = msStrdup("proj=latlong"); map->latlon.args[1] = msStrdup("ellps=WGS84"); /* probably want a different ellipsoid */ if (msProcessProjection(&(map->latlon)) == -1) return (-1); map->templatepattern = map->datapattern = NULL; /* Encryption key information - see mapcrypto.c */ map->encryption_key_loaded = MS_FALSE; msInitQuery(&(map->query)); #ifdef USE_V8_MAPSCRIPT map->v8context = NULL; #endif map->config = NULL; return (0); } /* ** Ensure there is at least one free entry in the layers and layerorder ** arrays of this mapObj. Grow the allocated layers/layerorder arrays if ** necessary and allocate a new layer for layers[numlayers] if there is ** not already one, setting its contents to all zero bytes (i.e. does not ** call initLayer() on it). ** ** This function is safe to use for the initial allocation of the layers[] ** and layerorder[] arrays as well (i.e. when maxlayers==0 and layers==NULL) ** ** Returns a reference to the new layerObj on success, NULL on error. */ layerObj *msGrowMapLayers(mapObj *map) { /* Do we need to increase the size of layers/layerorder by * MS_LAYER_ALLOCSIZE? */ if (map->numlayers == map->maxlayers) { layerObj **newLayersPtr; int *newLayerorderPtr; int i, newsize; newsize = map->maxlayers + MS_LAYER_ALLOCSIZE; /* Alloc/realloc layers */ newLayersPtr = (layerObj **)realloc(map->layers, newsize * sizeof(layerObj *)); MS_CHECK_ALLOC(newLayersPtr, newsize * sizeof(layerObj *), NULL); map->layers = newLayersPtr; /* Alloc/realloc layerorder */ newLayerorderPtr = (int *)realloc(map->layerorder, newsize * sizeof(int)); MS_CHECK_ALLOC(newLayerorderPtr, newsize * sizeof(int), NULL); map->layerorder = newLayerorderPtr; map->maxlayers = newsize; for (i = map->numlayers; i < map->maxlayers; i++) { map->layers[i] = NULL; map->layerorder[i] = 0; } } if (map->layers[map->numlayers] == NULL) { map->layers[map->numlayers] = (layerObj *)calloc(1, sizeof(layerObj)); MS_CHECK_ALLOC(map->layers[map->numlayers], sizeof(layerObj), NULL); } return map->layers[map->numlayers]; } int msFreeLabelCacheSlot(labelCacheSlotObj *cacheslot) { int i, j; /* free the labels */ if (cacheslot->labels) { for (i = 0; i < cacheslot->numlabels; i++) { for (j = 0; j < cacheslot->labels[i].numtextsymbols; j++) { freeTextSymbol(cacheslot->labels[i].textsymbols[j]); free(cacheslot->labels[i].textsymbols[j]); } msFree(cacheslot->labels[i].textsymbols); if (cacheslot->labels[i].leaderline) { msFree(cacheslot->labels[i].leaderline->point); msFree(cacheslot->labels[i].leaderline); msFree(cacheslot->labels[i].leaderbbox); } } } msFree(cacheslot->labels); cacheslot->labels = NULL; cacheslot->cachesize = 0; cacheslot->numlabels = 0; msFree(cacheslot->markers); cacheslot->markers = NULL; cacheslot->markercachesize = 0; cacheslot->nummarkers = 0; return (MS_SUCCESS); } int msFreeLabelCache(labelCacheObj *cache) { int p; for (p = 0; p < MS_MAX_LABEL_PRIORITY; p++) { if (msFreeLabelCacheSlot(&(cache->slots[p])) != MS_SUCCESS) return MS_FAILURE; } cache->num_allocated_rendered_members = cache->num_rendered_members = 0; msFree(cache->rendered_text_symbols); return MS_SUCCESS; } int msInitLabelCacheSlot(labelCacheSlotObj *cacheslot) { if (cacheslot->labels || cacheslot->markers) msFreeLabelCacheSlot(cacheslot); cacheslot->labels = (labelCacheMemberObj *)malloc( sizeof(labelCacheMemberObj) * MS_LABELCACHEINITSIZE); MS_CHECK_ALLOC(cacheslot->labels, sizeof(labelCacheMemberObj) * MS_LABELCACHEINITSIZE, MS_FAILURE); cacheslot->cachesize = MS_LABELCACHEINITSIZE; cacheslot->numlabels = 0; cacheslot->markers = (markerCacheMemberObj *)malloc( sizeof(markerCacheMemberObj) * MS_LABELCACHEINITSIZE); MS_CHECK_ALLOC(cacheslot->markers, sizeof(markerCacheMemberObj) * MS_LABELCACHEINITSIZE, MS_FAILURE); cacheslot->markercachesize = MS_LABELCACHEINITSIZE; cacheslot->nummarkers = 0; return (MS_SUCCESS); } int msInitLabelCache(labelCacheObj *cache) { int p; for (p = 0; p < MS_MAX_LABEL_PRIORITY; p++) { if (msInitLabelCacheSlot(&(cache->slots[p])) != MS_SUCCESS) return MS_FAILURE; } cache->gutter = 0; cache->num_allocated_rendered_members = cache->num_rendered_members = 0; cache->rendered_text_symbols = NULL; return MS_SUCCESS; } static void writeMap(FILE *stream, int indent, mapObj *map) { int i; colorObj c; writeBlockBegin(stream, indent, "MAP"); writeNumber(stream, indent, "ANGLE", 0, map->gt.rotation_angle); writeHashTableInline(stream, indent, "CONFIG", &(map->configoptions)); writeNumber(stream, indent, "DEBUG", 0, map->debug); writeNumber(stream, indent, "DEFRESOLUTION", 72.0, map->defresolution); writeExtent(stream, indent, "EXTENT", map->extent); writeString(stream, indent, "FONTSET", NULL, map->fontset.filename); MS_INIT_COLOR(c, 255, 255, 255, 255); writeColor(stream, indent, "IMAGECOLOR", &c, &(map->imagecolor)); writeString(stream, indent, "IMAGETYPE", NULL, map->imagetype); writeNumber(stream, indent, "MAXSIZE", MS_MAXIMAGESIZE_DEFAULT, map->maxsize); writeString(stream, indent, "NAME", NULL, map->name); writeNumber(stream, indent, "RESOLUTION", 72.0, map->resolution); writeString(stream, indent, "SHAPEPATH", NULL, map->shapepath); writeDimension(stream, indent, "SIZE", map->width, map->height, NULL, NULL); writeKeyword(stream, indent, "STATUS", map->status, 2, MS_ON, "ON", MS_OFF, "OFF"); writeString(stream, indent, "SYMBOLSET", NULL, map->symbolset.filename); writeKeyword(stream, indent, "UNITS", map->units, 7, MS_INCHES, "INCHES", MS_FEET, "FEET", MS_MILES, "MILES", MS_METERS, "METERS", MS_KILOMETERS, "KILOMETERS", MS_NAUTICALMILES, "NAUTICALMILES", MS_DD, "DD"); writeLineFeed(stream); writeOutputformat(stream, indent, map); /* write symbol with INLINE tag in mapfile */ for (i = 0; i < map->symbolset.numsymbols; i++) { if (map->symbolset.symbol[i]->inmapfile) writeSymbol(map->symbolset.symbol[i], stream); } writeProjection(stream, indent, &(map->projection)); writeLegend(stream, indent, &(map->legend)); writeQueryMap(stream, indent, &(map->querymap)); writeReferenceMap(stream, indent, &(map->reference)); writeScalebar(stream, indent, &(map->scalebar)); writeWeb(stream, indent, &(map->web)); for (i = 0; i < map->numlayers; i++) writeLayer(stream, indent, GET_LAYER(map, map->layerorder[i])); writeBlockEnd(stream, indent, "MAP"); } char *msWriteMapToString(mapObj *map) { msIOContext context; msIOBuffer buffer; context.label = NULL; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = &buffer; buffer.data = NULL; buffer.data_len = 0; buffer.data_offset = 0; msIO_installHandlers(NULL, &context, NULL); writeMap(stdout, 0, map); msIO_bufferWrite(&buffer, "", 1); msIO_installHandlers(NULL, NULL, NULL); return (char *)buffer.data; } int msSaveMap(mapObj *map, char *filename) { FILE *stream; char szPath[MS_MAXPATHLEN]; if (!map) { msSetError(MS_MISCERR, "Map is undefined.", "msSaveMap()"); return (-1); } if (!filename) { msSetError(MS_MISCERR, "Filename is undefined.", "msSaveMap()"); return (-1); } stream = fopen(msBuildPath(szPath, map->mappath, filename), "w"); if (!stream) { msSetErrorWithStatus(MS_IOERR, MS_HTTP_500_INTERNAL_SERVER_ERROR, "(%s)", "msSaveMap()", filename); return (-1); } writeMap(stream, 0, map); fclose(stream); return (0); } static void writeConfig(FILE *stream, int indent, configObj *config) { writeBlockBegin(stream, indent, "CONFIG"); writeHashTable(stream, indent, "ENV", &(config->env)); writeHashTable(stream, indent, "MAPS", &(config->maps)); writeBlockEnd(stream, indent, "CONFIG"); } int msSaveConfig(configObj *config, const char *filename) { FILE *stream; if (!config) { msSetError(MS_MISCERR, "Config is undefined.", "msSaveConfigMap()"); return (-1); } if (!filename) { msSetError(MS_MISCERR, "Filename is undefined.", "msSaveConfigMap()"); return (-1); } stream = fopen(filename, "w"); if (!stream) { msSetErrorWithStatus(MS_IOERR, MS_HTTP_500_INTERNAL_SERVER_ERROR, "(%s)", "msSaveConfig()", filename); return (-1); } writeConfig(stream, 0, config); fclose(stream); return (0); } static int loadMapInternal(mapObj *map) { int foundMapToken = MS_FALSE; int foundBomToken = MS_FALSE; int token; for (;;) { token = msyylex(); if (!foundBomToken && token == BOM) { foundBomToken = MS_TRUE; if (!foundMapToken) { continue; /*skip a leading bom*/ } } if (!foundMapToken && token != MAP) { msSetError(MS_IDENTERR, "First token must be MAP, this doesn't look like a mapfile.", "msLoadMap()"); return (MS_FAILURE); } switch (token) { case (CONFIG): { char *key = NULL, *value = NULL; if (getString(&key) == MS_FAILURE) return MS_FAILURE; if (getString(&value) == MS_FAILURE) { free(key); return MS_FAILURE; } if (msSetConfigOption(map, key, value) == MS_FAILURE) { free(key); free(value); return MS_FAILURE; } free(key); free(value); } break; case (DEBUG): if ((map->debug = getSymbol(3, MS_ON, MS_OFF, MS_NUMBER)) == -1) return MS_FAILURE; if (map->debug == MS_NUMBER) { if (msCheckNumber(msyynumber, MS_NUM_CHECK_RANGE, 0, 5) == MS_FAILURE) { msSetError(MS_MISCERR, "Invalid DEBUG level, must be between 0 and 5 (line %d)", "msLoadMap()", msyylineno); return (-1); } map->debug = (int)msyynumber; } break; case (END): if (msyyin) { fclose(msyyin); msyyin = NULL; } /*** Make config options current ***/ msApplyMapConfigOptions(map); /*** Compute rotated extent info if applicable ***/ msMapComputeGeotransform(map); /*** OUTPUTFORMAT related setup ***/ if (msPostMapParseOutputFormatSetup(map) == MS_FAILURE) return MS_FAILURE; if (loadSymbolSet(&(map->symbolset), map) == -1) return MS_FAILURE; if (resolveSymbolNames(map) == MS_FAILURE) return MS_FAILURE; if (msLoadFontSet(&(map->fontset), map) == -1) return MS_FAILURE; return MS_SUCCESS; break; case (EOF): msSetError(MS_EOFERR, NULL, "msLoadMap()"); return MS_FAILURE; case (EXTENT): { if (getDouble(&(map->extent.minx), MS_NUM_CHECK_NONE, -1, -1) == -1) return MS_FAILURE; if (getDouble(&(map->extent.miny), MS_NUM_CHECK_NONE, -1, -1) == -1) return MS_FAILURE; if (getDouble(&(map->extent.maxx), MS_NUM_CHECK_NONE, -1, -1) == -1) return MS_FAILURE; if (getDouble(&(map->extent.maxy), MS_NUM_CHECK_NONE, -1, -1) == -1) return MS_FAILURE; if (!MS_VALID_EXTENT(map->extent)) { msSetError(MS_MISCERR, "Given map extent is invalid. Check that it " "is in the form: minx, miny, maxx, maxy", "loadMapInternal()"); return MS_FAILURE; } } break; case (ANGLE): { double rotation_angle; if (getDouble(&(rotation_angle), MS_NUM_CHECK_RANGE, -360, 360) == -1) return MS_FAILURE; msMapSetRotation(map, rotation_angle); } break; case (FONTSET): if (getString(&map->fontset.filename) == MS_FAILURE) return MS_FAILURE; break; case (IMAGECOLOR): if (loadColor(&(map->imagecolor), NULL) != MS_SUCCESS) return MS_FAILURE; break; case (IMAGETYPE): msFree(map->imagetype); map->imagetype = getToken(); break; case (LATLON): if (loadProjection(&map->latlon) == -1) return MS_FAILURE; break; case (LAYER): if (msGrowMapLayers(map) == NULL) return MS_FAILURE; if (initLayer((GET_LAYER(map, map->numlayers)), map) == -1) return MS_FAILURE; if (loadLayer((GET_LAYER(map, map->numlayers)), map) == -1) return MS_FAILURE; GET_LAYER(map, map->numlayers)->index = map->numlayers; /* save the index */ /* Update the layer order list with the layer's index. */ map->layerorder[map->numlayers] = map->numlayers; map->numlayers++; break; case (OUTPUTFORMAT): if (loadOutputFormat(map) == -1) return MS_FAILURE; break; case (LEGEND): if (loadLegend(&(map->legend), map) == -1) return MS_FAILURE; break; case (MAP): foundMapToken = MS_TRUE; break; case (MAXSIZE): if (getInteger(&(map->maxsize), MS_NUM_CHECK_GT, 0, -1) == -1) return MS_FAILURE; break; case (NAME): free(map->name); map->name = NULL; /* erase default */ if (getString(&map->name) == MS_FAILURE) return MS_FAILURE; break; case (PROJECTION): if (loadProjection(&map->projection) == -1) return MS_FAILURE; break; case (QUERYMAP): if (loadQueryMap(&(map->querymap), map) == -1) return MS_FAILURE; break; case (REFERENCE): if (loadReferenceMap(&(map->reference), map) == -1) return MS_FAILURE; break; case (RESOLUTION): if (getDouble(&(map->resolution), MS_NUM_CHECK_RANGE, MS_RESOLUTION_MIN, MS_RESOLUTION_MAX) == -1) return MS_FAILURE; break; case (DEFRESOLUTION): if (getDouble(&(map->defresolution), MS_NUM_CHECK_RANGE, MS_RESOLUTION_MIN, MS_RESOLUTION_MAX) == -1) return MS_FAILURE; break; case (SCALE): case (SCALEDENOM): if (getDouble(&(map->scaledenom), MS_NUM_CHECK_GTE, 1, -1) == -1) return MS_FAILURE; break; case (SCALEBAR): if (loadScalebar(&(map->scalebar)) == -1) return MS_FAILURE; break; case (SHAPEPATH): if (getString(&map->shapepath) == MS_FAILURE) return MS_FAILURE; break; case (SIZE): if (getInteger(&(map->width), MS_NUM_CHECK_RANGE, 1, map->maxsize) == -1) return MS_FAILURE; if (getInteger(&(map->height), MS_NUM_CHECK_RANGE, 1, map->maxsize) == -1) return MS_FAILURE; break; case (STATUS): if ((map->status = getSymbol(2, MS_ON, MS_OFF)) == -1) return MS_FAILURE; break; case (SYMBOL): if (msGrowSymbolSet(&(map->symbolset)) == NULL) return MS_FAILURE; if ((loadSymbol(map->symbolset.symbol[map->symbolset.numsymbols], map->mappath) == -1)) { msFreeSymbol(map->symbolset.symbol[map->symbolset.numsymbols]); free(map->symbolset.symbol[map->symbolset.numsymbols]); map->symbolset.symbol[map->symbolset.numsymbols] = NULL; return MS_FAILURE; } map->symbolset.symbol[map->symbolset.numsymbols]->inmapfile = MS_TRUE; map->symbolset.numsymbols++; break; case (SYMBOLSET): if (getString(&map->symbolset.filename) == MS_FAILURE) return MS_FAILURE; break; case (UNITS): if ((int)(map->units = getSymbol(7, MS_INCHES, MS_FEET, MS_MILES, MS_METERS, MS_KILOMETERS, MS_NAUTICALMILES, MS_DD)) == -1) return MS_FAILURE; break; case (WEB): if (loadWeb(&(map->web), map) == -1) return MS_FAILURE; break; default: msSetError(MS_IDENTERR, "Parsing error near (%s):(line %d)", "msLoadMap()", msyystring_buffer, msyylineno); return MS_FAILURE; } } /* next token */ } static bool msGetCWD(char *szBuffer, size_t nBufferSize, const char *pszFunctionName) { if (NULL == getcwd(szBuffer, nBufferSize)) { #ifndef _WIN32 if (errno == EACCES) msSetError(MS_MISCERR, "getcwd() failed with EACCES: you may need to force the " "current directory in the mapserver launcher " "(e.g -d option of spawn-fcgi)", pszFunctionName); else if (errno == ENAMETOOLONG) msSetError(MS_MISCERR, "getcwd() returned a too long path", pszFunctionName); else msSetError(MS_MISCERR, "getcwd() failed with errno code %d", pszFunctionName, errno); #else msSetError(MS_MISCERR, "getcwd() returned a too long path", pszFunctionName); #endif return FALSE; } return TRUE; } /* * Apply any SLD styles referenced in a LAYER's STYLEITEM */ static void applyStyleItemToLayer(mapObj *map) { // applying SLD can create cloned layers so store the original layer count int layerCount = map->numlayers; for (int i = 0; i < layerCount; i++) { layerObj *layer = GET_LAYER(map, i); if (layer->styleitem && STARTS_WITH_CI(layer->styleitem, "sld://")) { const char *filename = layer->styleitem + strlen("sld://"); if (*filename == '\0') { msSetErrorWithStatus(MS_IOERR, MS_HTTP_500_INTERNAL_SERVER_ERROR, "Empty SLD filename: \"%s\".", "applyLayerDefaultSubstitutions()", layer->styleitem); } else { msSLDApplyFromFile(map, layer, filename); } } } } /* ** Sets up string-based mapfile loading and calls loadMapInternal to do the *work. */ mapObj *msLoadMapFromString(char *buffer, char *new_mappath, const configObj *config) { mapObj *map; struct mstimeval starttime = {0}, endtime = {0}; char szPath[MS_MAXPATHLEN], szCWDPath[MS_MAXPATHLEN]; char *mappath = NULL; int debuglevel; debuglevel = (int)msGetGlobalDebugLevel(); if (debuglevel >= MS_DEBUGLEVEL_TUNING) { /* In debug mode, track time spent loading/parsing mapfile. */ msGettimeofday(&starttime, NULL); } if (!buffer) { msSetError(MS_MISCERR, "No buffer to load.", "msLoadMapFromString()"); return (NULL); } /* ** Allocate mapObj structure */ map = (mapObj *)calloc(1, sizeof(mapObj)); MS_CHECK_ALLOC(map, sizeof(mapObj), NULL); if (initMap(map) == -1) { /* initialize this map */ msFreeMap(map); return (NULL); } map->config = config; // create a read-only reference msAcquireLock(TLOCK_PARSER); /* might need to move this lock a bit higher, yup (bug 2108) */ msyystate = MS_TOKENIZE_STRING; msyystring = buffer; msyylex(); /* sets things up, but doesn't process any tokens */ msyylineno = 1; /* start at line 1 (do lines mean anything here?) */ /* If new_mappath is provided then use it, otherwise use the CWD */ if (!msGetCWD(szCWDPath, MS_MAXPATHLEN, "msLoadMapFromString()")) { msFreeMap(map); msReleaseLock(TLOCK_PARSER); return (NULL); } if (new_mappath) { mappath = msStrdup(new_mappath); map->mappath = msStrdup(msBuildPath(szPath, szCWDPath, mappath)); } else map->mappath = msStrdup(szCWDPath); msyybasepath = map->mappath; /* for INCLUDEs */ if (loadMapInternal(map) != MS_SUCCESS) { msFreeMap(map); msReleaseLock(TLOCK_PARSER); if (mappath != NULL) free(mappath); return NULL; } if (mappath != NULL) free(mappath); msyylex_destroy(); msReleaseLock(TLOCK_PARSER); applyStyleItemToLayer(map); if (debuglevel >= MS_DEBUGLEVEL_TUNING) { /* In debug mode, report time spent loading/parsing mapfile. */ msGettimeofday(&endtime, NULL); msDebug("msLoadMapFromString(): %.3fs\n", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } if (resolveSymbolNames(map) == MS_FAILURE) return NULL; return map; } /* ** Sets up file-based mapfile loading and calls loadMapInternal to do the work. */ mapObj *msLoadMap(const char *filename, const char *new_mappath, const configObj *config) { mapObj *map; struct mstimeval starttime = {0}, endtime = {0}; char szPath[MS_MAXPATHLEN], szCWDPath[MS_MAXPATHLEN]; int debuglevel; debuglevel = (int)msGetGlobalDebugLevel(); if (debuglevel >= MS_DEBUGLEVEL_TUNING) { /* In debug mode, track time spent loading/parsing mapfile. */ msGettimeofday(&starttime, NULL); } if (!filename) { msSetError(MS_MISCERR, "Filename is undefined.", "msLoadMap()"); return (NULL); } const char *ms_mapfile_pattern = CPLGetConfigOption("MS_MAPFILE_PATTERN", MS_DEFAULT_MAPFILE_PATTERN); if (msEvalRegex(ms_mapfile_pattern, filename) != MS_TRUE) { msSetError(MS_REGEXERR, "Filename validation failed.", "msLoadMap()"); return (NULL); } /* ** Allocate mapObj structure */ map = (mapObj *)calloc(1, sizeof(mapObj)); MS_CHECK_ALLOC(map, sizeof(mapObj), NULL); if (initMap(map) == -1) { /* initialize this map */ msFreeMap(map); return (NULL); } map->config = config; // create a read-only reference msAcquireLock(TLOCK_PARSER); /* Steve: might need to move this lock a bit higher; Umberto: done */ #ifdef USE_XMLMAPFILE /* If the mapfile is an xml mapfile, transform it */ const char *ms_xmlmapfile_xslt = CPLGetConfigOption("MS_XMLMAPFILE_XSLT", NULL); if (ms_xmlmapfile_xslt && (msEvalRegex(MS_DEFAULT_XMLMAPFILE_PATTERN, filename) == MS_TRUE)) { msyyin = tmpfile(); if (msyyin == NULL) { msSetErrorWithStatus(MS_IOERR, MS_HTTP_500_INTERNAL_SERVER_ERROR, "tmpfile() failed to create temporary file", "msLoadMap()"); msReleaseLock(TLOCK_PARSER); msFreeMap(map); return NULL; } if (msTransformXmlMapfile(ms_xmlmapfile_xslt, filename, msyyin) != MS_SUCCESS) { fclose(msyyin); msFreeMap(map); return NULL; } fseek(msyyin, 0, SEEK_SET); } else { #endif if ((msyyin = fopen(filename, "r")) == NULL) { msSetErrorWithStatus(MS_IOERR, MS_HTTP_500_INTERNAL_SERVER_ERROR, "(%s)", "msLoadMap()", filename); msReleaseLock(TLOCK_PARSER); msFreeMap(map); return NULL; } #ifdef USE_XMLMAPFILE } #endif msyystate = MS_TOKENIZE_FILE; msyylex(); /* sets things up, but doesn't process any tokens */ msyyrestart(msyyin); /* start at line beginning, line 1 */ msyylineno = 1; /* If new_mappath is provided then use it, otherwise use the location */ /* of the mapfile as the default path */ if (!msGetCWD(szCWDPath, MS_MAXPATHLEN, "msLoadMap()")) { msReleaseLock(TLOCK_PARSER); msFreeMap(map); return NULL; } if (new_mappath) map->mappath = msStrdup(msBuildPath(szPath, szCWDPath, new_mappath)); else { char *path = msGetPath(filename); map->mappath = msStrdup(msBuildPath(szPath, szCWDPath, path)); free(path); } msyybasepath = map->mappath; /* for INCLUDEs */ if (loadMapInternal(map) != MS_SUCCESS) { msFreeMap(map); if (msyyin) { msyycleanup_includes(); fclose(msyyin); msyyin = NULL; } msReleaseLock(TLOCK_PARSER); return NULL; } msReleaseLock(TLOCK_PARSER); applyStyleItemToLayer(map); if (debuglevel >= MS_DEBUGLEVEL_TUNING) { /* In debug mode, report time spent loading/parsing mapfile. */ msGettimeofday(&endtime, NULL); msDebug("msLoadMap(): %.3fs\n", (endtime.tv_sec + endtime.tv_usec / 1.0e6) - (starttime.tv_sec + starttime.tv_usec / 1.0e6)); } return map; } static void hashTableSubstituteString(hashTableObj *hash, const char *from, const char *to) { const char *key, *val; char *new_val; key = msFirstKeyFromHashTable(hash); while (key != NULL) { val = msLookupHashTable(hash, key); if (strcasestr(val, from)) { new_val = msCaseReplaceSubstring(msStrdup(val), from, to); msInsertHashTable(hash, key, new_val); msFree(new_val); } key = msNextKeyFromHashTable(hash, key); } } static void classSubstituteString(classObj *class, const char *from, const char *to) { if (class->expression.string) class->expression.string = msCaseReplaceSubstring(class->expression.string, from, to); if (class->text.string) class->text.string = msCaseReplaceSubstring(class->text.string, from, to); if (class->title) class->title = msCaseReplaceSubstring(class->title, from, to); } static void layerSubstituteString(layerObj *layer, const char *from, const char *to) { int c; if (layer->data) layer->data = msCaseReplaceSubstring(layer->data, from, to); if (layer->tileindex) layer->tileindex = msCaseReplaceSubstring(layer->tileindex, from, to); if (layer->connection) layer->connection = msCaseReplaceSubstring(layer->connection, from, to); if (layer->filter.string) layer->filter.string = msCaseReplaceSubstring(layer->filter.string, from, to); if (layer->mask) layer->mask = msCaseReplaceSubstring(layer->mask, from, to); // new for 8.0 /* The bindvalues are most useful when able to substitute values from the URL */ hashTableSubstituteString(&layer->bindvals, from, to); hashTableSubstituteString(&layer->metadata, from, to); msLayerSubstituteProcessing(layer, from, to); for (c = 0; c < layer->numclasses; c++) { classSubstituteString(layer->class[c], from, to); } } static void mapSubstituteString(mapObj *map, const char *from, const char *to) { int l; for (l = 0; l < map->numlayers; l++) { layerSubstituteString(GET_LAYER(map, l), from, to); } /* output formats (#3751) */ for (l = 0; l < map->numoutputformats; l++) { int o; for (o = 0; o < map->outputformatlist[l]->numformatoptions; o++) { map->outputformatlist[l]->formatoptions[o] = msCaseReplaceSubstring( map->outputformatlist[l]->formatoptions[o], from, to); } } hashTableSubstituteString(&map->web.metadata, from, to); if (map->web.template) map->web.template = msCaseReplaceSubstring(map->web.template, from, to); } static void applyOutputFormatDefaultSubstitutions(outputFormatObj *format, const char *option, hashTableObj *table) { const char *filename; filename = msGetOutputFormatOption(format, option, NULL); if (filename && strlen(filename) > 0) { char *tmpfilename = msStrdup(filename); const char *default_key = msFirstKeyFromHashTable(table); while (default_key) { if (!strncasecmp(default_key, "default_", 8)) { char *new_filename = NULL; size_t buffer_size = (strlen(default_key) - 5); char *tag = (char *)msSmallMalloc(buffer_size); snprintf(tag, buffer_size, "%%%s%%", &(default_key[8])); new_filename = msStrdup(tmpfilename); new_filename = msCaseReplaceSubstring( new_filename, tag, msLookupHashTable(table, default_key)); free(tag); msSetOutputFormatOption(format, option, new_filename); free(new_filename); } default_key = msNextKeyFromHashTable(table, default_key); } msFree(tmpfilename); } return; } static void applyClassDefaultSubstitutions(classObj *class, hashTableObj *table) { const char *default_key = msFirstKeyFromHashTable(table); while (default_key) { if (!strncasecmp(default_key, "default_", 8)) { size_t buffer_size = (strlen(default_key) - 5); char *tag = (char *)msSmallMalloc(buffer_size); snprintf(tag, buffer_size, "%%%s%%", &(default_key[8])); classSubstituteString(class, tag, msLookupHashTable(table, default_key)); free(tag); } default_key = msNextKeyFromHashTable(table, default_key); } return; } static void applyLayerDefaultSubstitutions(layerObj *layer, hashTableObj *table) { int i; const char *default_key = msFirstKeyFromHashTable(table); while (default_key) { if (!strncasecmp(default_key, "default_", 8)) { size_t buffer_size = (strlen(default_key) - 5); const char *to = msLookupHashTable(table, default_key); char *tag = (char *)msSmallMalloc(buffer_size); snprintf(tag, buffer_size, "%%%s%%", &(default_key[8])); for (i = 0; i < layer->numclasses; i++) { classSubstituteString(layer->class[i], tag, to); } layerSubstituteString(layer, tag, to); free(tag); } default_key = msNextKeyFromHashTable(table, default_key); } return; } static void applyHashTableDefaultSubstitutions(hashTableObj *hashTab, hashTableObj *table) { const char *default_key = msFirstKeyFromHashTable(table); while (default_key) { if (!strncasecmp(default_key, "default_", 8)) { size_t buffer_size = (strlen(default_key) - 5); const char *to = msLookupHashTable(table, default_key); char *tag = (char *)msSmallMalloc(buffer_size); snprintf(tag, buffer_size, "%%%s%%", &(default_key[8])); hashTableSubstituteString(hashTab, tag, to); free(tag); } default_key = msNextKeyFromHashTable(table, default_key); } return; } /* ** Loop through layer metadata for keys that have a default_%key% pattern to *replace ** remaining %key% entries by their default value. */ void msApplyDefaultSubstitutions(mapObj *map) { int i, j; /* output formats (#3751) */ for (i = 0; i < map->numoutputformats; i++) { applyOutputFormatDefaultSubstitutions(map->outputformatlist[i], "filename", &(map->web.validation)); applyOutputFormatDefaultSubstitutions(map->outputformatlist[i], "JSONP", &(map->web.validation)); } for (i = 0; i < map->numlayers; i++) { layerObj *layer = GET_LAYER(map, i); for (j = 0; j < layer->numclasses; j++) { /* class settings take precedence... */ classObj *class = GET_CLASS(map, i, j); applyClassDefaultSubstitutions(class, &(class->validation)); } applyLayerDefaultSubstitutions( layer, &(layer->validation)); /* ...then layer settings... */ applyLayerDefaultSubstitutions( layer, &(map->web.validation)); /* ...and finally web settings */ } applyHashTableDefaultSubstitutions(&map->web.metadata, &(map->web.validation)); } char *_get_param_value(const char *key, char **names, char **values, int npairs) { if (npairs <= 0) return NULL; // bail, no point searching if (getenv(key)) { /* environment override */ return getenv(key); } while (npairs) { npairs--; if (strcasecmp(key, names[npairs]) == 0) { return values[npairs]; } } return NULL; } void msApplySubstitutions(mapObj *map, char **names, char **values, int npairs) { int l; const char *key, *value, *validation; char *tag; for (l = 0; l < map->numlayers; l++) { int c; layerObj *lp = GET_LAYER(map, l); for (c = 0; c < lp->numclasses; c++) { classObj *cp = lp->class[c]; key = NULL; while ((key = msNextKeyFromHashTable(&cp->validation, key))) { value = _get_param_value(key, names, values, npairs); if (!value) continue; /*parameter was not in url*/ validation = msLookupHashTable(&cp->validation, key); if (msEvalRegex(validation, value)) { /* we've found a substitution and it validates correctly, now let's * apply it */ tag = msSmallMalloc(strlen(key) + 3); sprintf(tag, "%%%s%%", key); classSubstituteString(cp, tag, value); free(tag); } else { msSetError(MS_REGEXERR, "Parameter pattern validation failed.", "msApplySubstitutions()"); if (map->debug || lp->debug) { msDebug("layer (%s), class %d: failed to validate (%s=%s) for " "regex (%s)\n", lp->name, c, key, value, validation); } } } } key = NULL; while ((key = msNextKeyFromHashTable(&lp->validation, key))) { value = _get_param_value(key, names, values, npairs); if (!value) continue; /*parameter was not in url*/ validation = msLookupHashTable(&lp->validation, key); if (msEvalRegex(validation, value)) { /* we've found a substitution and it validates correctly, now let's * apply it */ tag = msSmallMalloc(strlen(key) + 3); sprintf(tag, "%%%s%%", key); layerSubstituteString(lp, tag, value); free(tag); } else { msSetError(MS_REGEXERR, "Parameter pattern validation failed.", "msApplySubstitutions()"); if (map->debug || lp->debug) { msDebug("layer (%s): failed to validate (%s=%s) for regex (%s)\n", lp->name, key, value, validation); } } } } key = NULL; while ((key = msNextKeyFromHashTable(&map->web.validation, key))) { value = _get_param_value(key, names, values, npairs); if (!value) continue; /*parameter was not in url*/ validation = msLookupHashTable(&map->web.validation, key); if (msEvalRegex(validation, value)) { /* we've found a substitution and it validates correctly, now let's apply * it */ tag = msSmallMalloc(strlen(key) + 3); sprintf(tag, "%%%s%%", key); mapSubstituteString(map, tag, value); free(tag); } else { msSetError(MS_REGEXERR, "Parameter pattern validation failed.", "msApplySubstitutions()"); if (map->debug) { msDebug("failed to validate (%s=%s) for regex (%s)\n", key, value, validation); } } } } /* ** Returns an array with one entry per mapfile token. Useful to manipulate ** mapfiles in MapScript. ** ** The returned array should be freed using msFreeCharArray(). */ static char **tokenizeMapInternal(char *filename, int *ret_numtokens) { char **tokens = NULL; int numtokens = 0, numtokens_allocated = 0; size_t buffer_size = 0; *ret_numtokens = 0; if (!filename) { msSetError(MS_MISCERR, "Filename is undefined.", "msTokenizeMap()"); return NULL; } /* ** Check map filename to make sure it's legal */ const char *ms_mapfile_pattern = CPLGetConfigOption("MS_MAPFILE_PATTERN", MS_DEFAULT_MAPFILE_PATTERN); if (msEvalRegex(ms_mapfile_pattern, filename) != MS_TRUE) { msSetError(MS_REGEXERR, "Filename validation failed.", "msTokenizeMap()"); return (NULL); } if ((msyyin = fopen(filename, "r")) == NULL) { msSetErrorWithStatus(MS_IOERR, MS_HTTP_500_INTERNAL_SERVER_ERROR, "(%s)", "msTokenizeMap()", filename); return NULL; } msyystate = MS_TOKENIZE_FILE; /* restore lexer state to INITIAL, and do return comments */ msyylex(); msyyreturncomments = 1; /* want all tokens, including comments */ msyyrestart(msyyin); /* start at line beginning, line 1 */ msyylineno = 1; numtokens = 0; numtokens_allocated = 256; tokens = (char **)malloc(numtokens_allocated * sizeof(char *)); if (tokens == NULL) { msSetError(MS_MEMERR, NULL, "msTokenizeMap()"); fclose(msyyin); return NULL; } for (;;) { if (numtokens_allocated <= numtokens) { numtokens_allocated *= 2; /* double size of the array every time we reach the limit */ char **tokensNew = (char **)realloc(tokens, numtokens_allocated * sizeof(char *)); if (tokensNew == NULL) { msSetError(MS_MEMERR, "Realloc() error.", "msTokenizeMap()"); fclose(msyyin); for (int i = 0; i < numtokens; i++) msFree(tokens[i]); msFree(tokens); return NULL; } tokens = tokensNew; } switch (msyylex()) { case (EOF): /* This is the normal way out... cleanup and exit */ fclose(msyyin); *ret_numtokens = numtokens; return (tokens); break; case (MS_STRING): buffer_size = strlen(msyystring_buffer) + 2 + 1; tokens[numtokens] = (char *)msSmallMalloc(buffer_size); snprintf(tokens[numtokens], buffer_size, "\"%s\"", msyystring_buffer); break; case (MS_EXPRESSION): buffer_size = strlen(msyystring_buffer) + 2 + 1; tokens[numtokens] = (char *)msSmallMalloc(buffer_size); snprintf(tokens[numtokens], buffer_size, "(%s)", msyystring_buffer); break; case (MS_REGEX): buffer_size = strlen(msyystring_buffer) + 2 + 1; tokens[numtokens] = (char *)msSmallMalloc(buffer_size); snprintf(tokens[numtokens], buffer_size, "/%s/", msyystring_buffer); break; default: tokens[numtokens] = msStrdup(msyystring_buffer); break; } if (tokens[numtokens] == NULL) { int i; msSetError(MS_MEMERR, NULL, "msTokenizeMap()"); fclose(msyyin); for (i = 0; i < numtokens; i++) msFree(tokens[i]); msFree(tokens); return NULL; } numtokens++; } return NULL; /* should never get here */ } /* ** Wraps tokenizeMapInternal */ char **msTokenizeMap(char *filename, int *numtokens) { char **tokens; msAcquireLock(TLOCK_PARSER); tokens = tokenizeMapInternal(filename, numtokens); msReleaseLock(TLOCK_PARSER); return tokens; } void msCloseConnections(mapObj *map) { int i; layerObj *lp; for (i = 0; i < map->numlayers; i++) { lp = (GET_LAYER(map, i)); /* If the vtable is null, then the layer is never accessed or used -> skip * it */ if (lp->vtable) { lp->vtable->LayerCloseConnection(lp); } } } void initResultCache(resultCacheObj *resultcache) { if (resultcache) { resultcache->results = NULL; resultcache->numresults = 0; resultcache->hasnext = MS_UNKNOWN; resultcache->cachesize = 0; resultcache->bounds.minx = resultcache->bounds.miny = resultcache->bounds.maxx = resultcache->bounds.maxy = -1; resultcache->previousBounds = resultcache->bounds; } } void cleanupResultCache(resultCacheObj *resultcache) { if (resultcache) { if (resultcache->results) { int i; for (i = 0; i < resultcache->numresults; i++) { if (resultcache->results[i].shape) { msFreeShape(resultcache->results[i].shape); msFree(resultcache->results[i].shape); } } free(resultcache->results); } resultcache->results = NULL; initResultCache(resultcache); } } static int resolveSymbolNames(mapObj *map) { int i, j; /* step through layers and classes to resolve symbol names */ for (i = 0; i < map->numlayers; i++) { for (j = 0; j < GET_LAYER(map, i)->numclasses; j++) { if (classResolveSymbolNames(GET_LAYER(map, i)->class[j]) != MS_SUCCESS) return MS_FAILURE; } } return MS_SUCCESS; } mapserver-8.6.0/src/mapfile.dtd000066400000000000000000000154241511405061000164310ustar00rootroot00000000000000 mapserver-8.6.0/src/mapfile.h000066400000000000000000000155411511405061000161050ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Keyword definitions for the mapfiles and symbolfiles. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPFILE_H #define MAPFILE_H enum MS_LEXER_STATES { MS_TOKENIZE_DEFAULT = 0, MS_TOKENIZE_FILE, MS_TOKENIZE_STRING, MS_TOKENIZE_EXPRESSION, MS_TOKENIZE_VALUE, MS_TOKENIZE_NAME, MS_TOKENIZE_CONFIG }; enum MS_TOKEN_SOURCES { MS_FILE_TOKENS = 0, MS_STRING_TOKENS }; /* ** Keyword definitions for the mapfiles and symbolfiles (used by lexer) */ #define ANGLE 1000 #define ANTIALIAS 1001 #define BACKGROUNDCOLOR 1002 #define BUFFER 1003 #define CLASS 1004 #define CLASSITEM 1005 #define COLOR 1006 #define DATA 1007 #define DD 1008 #define EMPTY 1010 #define END 1011 #define ERROR 1012 #define EXPRESSION 1013 #define EXTENT 1014 #define FEATURE 1015 #define FILLED 1016 #define FOOTER 1017 #define FONT 1018 #define FONTSET 1019 #define FROM 1020 #define GROUP 1021 #define HEADER 1022 #define IMAGE 1023 #define IMAGECOLOR 1024 #define IMAGEPATH 1025 #define IMAGEURL 1026 #define INDEX 1027 #define INTERLACE 1028 #define INTERVALS 1029 #define JOIN 1030 #define KEYSIZE 1031 #define KEYSPACING 1032 #define LABEL 1033 #define LABELCACHE 1035 #define LABELITEM 1036 #define LABELMAXSCALE 1037 #define LABELMINSCALE 1038 #define LAYER 1040 #define LEGEND 1041 #define LOG 1043 #define MAP 1044 #define MAXFEATURES 1047 #define MAXSCALE 1048 #define MAXSIZE 1049 #define MAXTEMPLATE 1050 #define MINDISTANCE 1051 #define MINFEATURESIZE 1053 #define MINSCALE 1054 #define MINSIZE 1055 #define MINTEMPLATE 1056 #define NAME 1057 #define NFTEMPLATE 1058 #define OFFSET 1060 #define OFFSITE 1061 #define OUTLINECOLOR 1062 #define PARTIALS 1063 #define POINTS 1064 #define POSITION 1065 #define POSTLABELCACHE 1098 #define PROJECTION 1066 #define QUERY 1067 #define QUERYITEM 1068 #define QUERYMAP 1069 #define REFERENCE 1070 #define SCALE 1071 #define SCALEBAR 1072 #define SHADOWCOLOR 1074 #define SHADOWSIZE 1075 #define SHAPEPATH 1076 #define SIZE 1077 #define STATUS 1078 #define STYLE 1080 #define SYMBOL 1081 #define SYMBOLSCALE 1082 #define TABLE 1083 #define TEMPLATE 1084 #define TEXT 1085 #define TEXTITEM 1086 #define TILEINDEX 1088 #define TILEITEM 1089 #define TOLERANCE 1090 #define TO 1091 #define TRANSPARENT 1092 #define TRANSFORM 1093 #define TYPE 1094 #define UNITS 1095 #define WEB 1096 #define WRAP 1097 #define FORCE 1098 #define TOLERANCEUNITS 1099 #define IDENTIFY 1103 #define CLASSAUTO 1104 #define CHARACTER 1100 #define CONNECTION 1101 #define CONNECTIONTYPE 1102 #define SYMBOLSET 1105 #define IMAGETYPE 1113 #define IMAGEQUALITY 1114 #define GAP 1115 #define FILTER 1116 #define FILTERITEM 1117 #define REQUIRES 1118 #define LABELREQUIRES 1119 #define METADATA 1120 #define LATLON 1121 #define RESOLUTION 1122 #define SIZEUNITS 1123 #define STYLEITEM 1124 #define FALLBACK 1125 #define TITLE 1126 #define LINECAP 1127 #define LINEJOIN 1128 #define LINEJOINMAXSIZE 1129 #define TRANSPARENCY 1130 #define MARKER 1131 #define MARKERSIZE 1132 #define MINBOXSIZE 1133 #define MAXBOXSIZE 1134 #define OUTPUTFORMAT 1135 #define MIMETYPE 1136 #define DRIVER 1137 #define IMAGEMODE 1138 #define FORMATOPTION 1139 #define GRATICULE 1140 #define GRID 1141 #define MAXARCS 1142 #define MINARCS 1143 #define MAXINTERVAL 1144 #define MININTERVAL 1145 #define MAXSUBDIVIDE 1146 #define MINSUBDIVIDE 1147 #define LABELFORMAT 1148 #define PROCESSING 1153 /* The DEBUG macro is also used to request debugging output. Redefine for keyword purposes. */ #ifdef DEBUG #undef DEBUG #endif #define DEBUG 1154 #define EXTENSION 1155 #define KEYIMAGE 1156 #define QUERYFORMAT 1157 #define CONFIG 1158 #define BANDSITEM 1159 #define ENCODING 1162 #define WIDTH 1163 #define MINWIDTH 1164 #define MAXWIDTH 1165 #define OUTLINEWIDTH 1166 /* Color Range support (was Gradient Support)*/ #define COLORRANGE 1170 #define DATARANGE 1172 #define RANGEITEM 1173 /* WKT support (bug 1466) */ #define WKT 1180 #define LEGENDFORMAT 1190 /* bug 1518 */ #define BROWSEFORMAT 1191 #define RELATIVETO 1192 #define OPACITY 1193 #define PRIORITY 1194 #define PATTERN 1195 #define MAXSCALEDENOM 1196 #define MINSCALEDENOM 1197 #define LABELMAXSCALEDENOM 1198 #define LABELMINSCALEDENOM 1199 #define SYMBOLSCALEDENOM 1200 #define SCALEDENOM 1201 #define CLASSGROUP 1202 #define ALIGN 1203 /* bug 2468 */ #define MAXGEOWIDTH 1204 #define MINGEOWIDTH 1205 #define ITEMS 1206 /* rfc40 label wrapping */ #define MAXLENGTH 1210 /* rfc44 URL configuration support */ #define VALIDATION 1212 /* rfc48 geometry transforms */ #define GEOMTRANSFORM 1220 /* rfc55 output resolution */ #define DEFRESOLUTION 1221 /* label repeat enhancement */ #define REPEATDISTANCE 1222 /* rfc60 label collision detection */ #define MAXOVERLAPANGLE 1223 /* rfc66 temporary path */ #define TEMPPATH 1224 /* rfc68 union connection type */ #define UNION 1225 /* rfc69 cluster */ #define CLUSTER 1226 #define MAXDISTANCE 1227 #define REGION 1228 #define INITIALGAP 1229 #define ANCHORPOINT 1230 #define MASK 1250 #define POLAROFFSET 1251 /* rfc78 leader-lines labels */ #define LEADER 1260 #define GRIDSTEP 1261 /* rfc 86 scale-dependant token substitutions */ #define SCALETOKEN 1270 #define VALUES 1271 #define TILESRS 1272 /* rfc 93 support for utfgrid */ #define UTFDATA 1280 #define UTFITEM 1281 /* rfc 113 layer compositing */ #define COMPOSITE 1290 #define COMPOP 1291 #define COMPFILTER 1292 #define BOM 1300 /* rfc59 bindvals objects */ #define BINDVALS 2000 #define CONNECTIONOPTIONS 2001 #endif /* MAPFILE_H */ mapserver-8.6.0/src/mapflatgeobuf.c000066400000000000000000000257461511405061000173070ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implements support for FlatGeobuf access. * Authors: Björn Harrtell * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #define NEED_IGNORE_RET_VAL #include #include #include "mapserver.h" #include "mapows.h" #include "flatgeobuf/flatgeobuf_c.h" #include #include static void msFGBPassThroughFieldDefinitions(layerObj *layer, flatgeobuf_ctx *ctx) { for (int i = 0; i < ctx->columns_len; i++) { char item[255]; char gml_width[32], gml_precision[32]; const char *gml_type = NULL; const flatgeobuf_column *column = &(ctx->columns[i]); strncpy(item, column->name, 255 - 1); gml_width[0] = '\0'; gml_precision[0] = '\0'; switch (column->type) { case flatgeobuf_column_type_byte: case flatgeobuf_column_type_ubyte: case flatgeobuf_column_type_bool: case flatgeobuf_column_type_short: case flatgeobuf_column_type_ushort: case flatgeobuf_column_type_int: case flatgeobuf_column_type_uint: gml_type = "Integer"; sprintf(gml_width, "%d", 4); break; case flatgeobuf_column_type_long: case flatgeobuf_column_type_ulong: gml_type = "Long"; sprintf(gml_width, "%d", 8); break; case flatgeobuf_column_type_float: case flatgeobuf_column_type_double: gml_type = "Real"; sprintf(gml_width, "%d", 8); sprintf(gml_precision, "%d", 15); break; case flatgeobuf_column_type_string: case flatgeobuf_column_type_json: case flatgeobuf_column_type_datetime: default: gml_type = "Character"; sprintf(gml_width, "%d", 4096); break; } msUpdateGMLFieldMetadata(layer, item, gml_type, gml_width, gml_precision, 0); } } void msFlatGeobufLayerFreeItemInfo(layerObj *layer) { if (layer->iteminfo) { free(layer->iteminfo); layer->iteminfo = NULL; } } int msFlatGeobufLayerInitItemInfo(layerObj *layer) { if (!layer->layerinfo) { msSetError(MS_FGBERR, "FlatGeobuf layer has not been opened.", "msFlatGeobufLayerInitItemInfo()"); return MS_FAILURE; } msFlatGeobufLayerFreeItemInfo(layer); flatgeobuf_ctx *ctx; ctx = layer->layerinfo; if (!ctx) return MS_FAILURE; for (int j = 0; j < ctx->columns_len; j++) { ctx->columns[j].itemindex = -1; for (int i = 0; i < layer->numitems; i++) { if (strcasecmp(layer->items[i], ctx->columns[j].name) == 0) { ctx->columns[j].itemindex = i; break; } } } return MS_SUCCESS; } int msFlatGeobufLayerOpen(layerObj *layer) { char szPath[MS_MAXPATHLEN]; int ret; if (layer->layerinfo) return MS_SUCCESS; if (msCheckParentPointer(layer->map, "map") == MS_FAILURE) return MS_FAILURE; flatgeobuf_ctx *ctx = flatgeobuf_init_ctx(); layer->layerinfo = ctx; ctx->file = VSIFOpenL(msBuildPath(szPath, layer->map->mappath, layer->data), "rb"); if (!ctx->file) ctx->file = VSIFOpenL(msBuildPath3(szPath, layer->map->mappath, layer->map->shapepath, layer->data), "rb"); if (!ctx->file) { layer->layerinfo = NULL; flatgeobuf_free_ctx(ctx); return MS_FAILURE; } ret = flatgeobuf_check_magicbytes(ctx); if (ret == -1) { layer->layerinfo = NULL; flatgeobuf_free_ctx(ctx); return MS_FAILURE; } ret = flatgeobuf_decode_header(ctx); if (ret == -1) { layer->layerinfo = NULL; flatgeobuf_free_ctx(ctx); return MS_FAILURE; } if (layer->projection.numargs > 0 && EQUAL(layer->projection.args[0], "auto")) { OGRSpatialReferenceH hSRS = OSRNewSpatialReference(NULL); char *pszWKT = NULL; if (ctx->srid > 0) { if (OSRImportFromEPSG(hSRS, ctx->srid) != OGRERR_NONE) { OSRDestroySpatialReference(hSRS); flatgeobuf_free_ctx(ctx); return MS_FAILURE; } if (OSRExportToWkt(hSRS, &pszWKT) != OGRERR_NONE) { OSRDestroySpatialReference(hSRS); flatgeobuf_free_ctx(ctx); return MS_FAILURE; } } else if (ctx->wkt == NULL) { OSRDestroySpatialReference(hSRS); return MS_SUCCESS; } int bOK = MS_FALSE; if (msOGCWKT2ProjectionObj(ctx->wkt ? ctx->wkt : pszWKT, &(layer->projection), layer->debug) == MS_SUCCESS) bOK = MS_TRUE; CPLFree(pszWKT); OSRDestroySpatialReference(hSRS); if (bOK != MS_TRUE) if (layer->debug || layer->map->debug) msDebug("Unable to get SRS from FlatGeobuf '%s' for layer '%s'.\n", szPath, layer->name); } return MS_SUCCESS; } int msFlatGeobufLayerIsOpen(layerObj *layer) { if (layer->layerinfo) return MS_TRUE; else return MS_FALSE; } int msFlatGeobufLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { (void)isQuery; flatgeobuf_ctx *ctx; ctx = layer->layerinfo; if (!ctx) return MS_FAILURE; if (!ctx->has_extent || !ctx->index_node_size) return MS_SUCCESS; if (msRectOverlap(&ctx->bounds, &rect) != MS_TRUE) return MS_DONE; if (msRectContained(&ctx->bounds, &rect) == MS_FALSE && ctx->index_node_size > 0) { flatgeobuf_index_search(ctx, &rect); if (ctx->search_result_len == 0) return MS_DONE; } else { flatgeobuf_index_skip(ctx); } return MS_SUCCESS; } int msFlatGeobufLayerNextShape(layerObj *layer, shapeObj *shape) { flatgeobuf_ctx *ctx; ctx = layer->layerinfo; if (!ctx) return MS_FAILURE; do { if (ctx->search_result) { if (ctx->search_index >= ctx->search_result_len) return MS_DONE; flatgeobuf_search_item item = ctx->search_result[ctx->search_index]; if (VSIFSeekL(ctx->file, ctx->feature_offset + item.offset, SEEK_SET) == -1) { msSetError(MS_FGBERR, "Unable to seek in file", "msFlatGeobufLayerNextShape"); return MS_FAILURE; } ctx->offset = ctx->feature_offset + item.offset; ctx->search_index++; ctx->feature_index = item.index; } int ret = flatgeobuf_decode_feature(ctx, layer, shape); if (ret == -1) return MS_FAILURE; shape->index = ctx->feature_index; if (!ctx->search_result) ctx->feature_index++; if (ctx->done) return MS_DONE; if (ctx->is_null_geom) { msFreeCharArray(shape->values, shape->numvalues); shape->values = NULL; } } while (ctx->is_null_geom); return MS_SUCCESS; } int msFlatGeobufLayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { (void)shape; (void)record; flatgeobuf_ctx *ctx; ctx = layer->layerinfo; if (!ctx) return MS_FAILURE; long i = record->shapeindex; if (i < 0 || (uint64_t)i >= ctx->features_count) { msSetError(MS_MISCERR, "Invalid feature id", "msFlatGeobufLayerGetShape"); return MS_FAILURE; } uint64_t offset; flatgeobuf_read_feature_offset(ctx, i, &offset); if (VSIFSeekL(ctx->file, ctx->feature_offset + offset, SEEK_SET) == -1) { msSetError(MS_FGBERR, "Unable to seek in file", "msFlatGeobufLayerGetShape"); return MS_FAILURE; } int ret = flatgeobuf_decode_feature(ctx, layer, shape); if (ret == -1) return MS_FAILURE; return MS_SUCCESS; } int msFlatGeobufLayerClose(layerObj *layer) { flatgeobuf_ctx *ctx; ctx = layer->layerinfo; if (!ctx) return MS_SUCCESS; VSIFCloseL(ctx->file); flatgeobuf_free_ctx(ctx); layer->layerinfo = NULL; return MS_SUCCESS; } int msFlatGeobufLayerGetItems(layerObj *layer) { const char *value; flatgeobuf_ctx *ctx; ctx = layer->layerinfo; if (!ctx) return MS_FAILURE; layer->numitems = ctx->columns_len; char **items = (char **)malloc(sizeof(char *) * ctx->columns_len); for (int i = 0; i < ctx->columns_len; i++) items[i] = msStrdup(ctx->columns[i].name); layer->items = items; if ((value = msOWSLookupMetadata(&(layer->metadata), "G", "types")) != NULL && strcasecmp(value, "auto") == 0) msFGBPassThroughFieldDefinitions(layer, ctx); return msLayerInitItemInfo(layer); } int msFlatGeobufLayerGetExtent(layerObj *layer, rectObj *extent) { flatgeobuf_ctx *ctx; ctx = layer->layerinfo; extent->minx = ctx->xmin; extent->miny = ctx->ymin; extent->maxx = ctx->xmax; extent->maxy = ctx->ymax; return MS_SUCCESS; } int msFlatGeobufLayerSupportsCommonFilters(layerObj *layer) { (void)layer; return MS_TRUE; } int msFlatGeobufLayerInitializeVirtualTable(layerObj *layer) { assert(layer != NULL); assert(layer->vtable != NULL); layer->vtable->LayerSupportsCommonFilters = msFlatGeobufLayerSupportsCommonFilters; layer->vtable->LayerInitItemInfo = msFlatGeobufLayerInitItemInfo; layer->vtable->LayerFreeItemInfo = msFlatGeobufLayerFreeItemInfo; layer->vtable->LayerOpen = msFlatGeobufLayerOpen; layer->vtable->LayerIsOpen = msFlatGeobufLayerIsOpen; layer->vtable->LayerWhichShapes = msFlatGeobufLayerWhichShapes; layer->vtable->LayerNextShape = msFlatGeobufLayerNextShape; layer->vtable->LayerGetShape = msFlatGeobufLayerGetShape; /* layer->vtable->LayerGetShapeCount, use default */ layer->vtable->LayerClose = msFlatGeobufLayerClose; layer->vtable->LayerGetItems = msFlatGeobufLayerGetItems; layer->vtable->LayerGetExtent = msFlatGeobufLayerGetExtent; /* layer->vtable->LayerGetAutoStyle, use default */ /* layer->vtable->LayerCloseConnection, use default */ layer->vtable->LayerSetTimeFilter = msLayerMakeBackticsTimeFilter; /* layer->vtable->LayerTranslateFilter, use default */ /* layer->vtable->LayerApplyFilterToLayer, use default */ /* layer->vtable->LayerCreateItems, use default */ /* layer->vtable->LayerGetNumFeatures, use default */ return MS_SUCCESS; } mapserver-8.6.0/src/mapflatgeobuf.h000066400000000000000000000033101511405061000172730ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: FlatGeobuf access API * Author: Björn Harrtell. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPFLATGEOBUF_H #define MAPFLATGEOBUF_H #include #include "mapprimitive.h" #include "mapproject.h" #include "cpl_vsi.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif /* MAPFLATGEOBUF_H */ mapserver-8.6.0/src/mapgdal.cpp000066400000000000000000000636531511405061000164370ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of support for output using GDAL. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2002, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "mapthread.h" #include "mapgdal.h" #include #include "cpl_conv.h" #include "cpl_string.h" #include "ogr_srs_api.h" #include "gdal.h" static int bGDALInitialized = 0; /************************************************************************/ /* msGDALInitialize() */ /************************************************************************/ void msGDALInitialize(void) { if (!bGDALInitialized) { msAcquireLock(TLOCK_GDAL); GDALAllRegister(); CPLPushErrorHandler(CPLQuietErrorHandler); msReleaseLock(TLOCK_GDAL); bGDALInitialized = 1; } } /************************************************************************/ /* msGDALCleanup() */ /************************************************************************/ void msGDALCleanup(void) { if (bGDALInitialized) { int iRepeat = 5; /* ** Cleanup any unreferenced but open datasets as will tend ** to exist due to deferred close requests. We are careful ** to only close one file at a time before reflecting the ** list as closing some datasets may cause others to be ** closed (subdatasets in a VRT for instance). */ GDALDatasetH *pahDSList = NULL; int nDSCount = 0; int bDidSomething; msAcquireLock(TLOCK_GDAL); do { int i; GDALGetOpenDatasets(&pahDSList, &nDSCount); bDidSomething = FALSE; for (i = 0; i < nDSCount && !bDidSomething; i++) { if (GDALReferenceDataset(pahDSList[i]) == 1) { GDALClose(pahDSList[i]); bDidSomething = TRUE; } else GDALDereferenceDataset(pahDSList[i]); } } while (bDidSomething); while (iRepeat--) CPLPopErrorHandler(); msReleaseLock(TLOCK_GDAL); bGDALInitialized = 0; } } /************************************************************************/ /* msCleanVSIDir() */ /* */ /* For the temporary /vsimem/msout directory we need to be sure */ /* things are clean before we start, and after we are done. */ /************************************************************************/ void msCleanVSIDir(const char *pszDir) { char **papszFiles = CPLReadDir(pszDir); int i, nFileCount = CSLCount(papszFiles); for (i = 0; i < nFileCount; i++) { if (strcasecmp(papszFiles[i], ".") == 0 || strcasecmp(papszFiles[i], "..") == 0) continue; VSIUnlink(CPLFormFilename(pszDir, papszFiles[i], NULL)); } CSLDestroy(papszFiles); } /************************************************************************/ /* msSaveImageGDAL() */ /************************************************************************/ int msSaveImageGDAL(mapObj *map, imageObj *image, const char *filenameIn) { int bFileIsTemporary = MS_FALSE; GDALDatasetH hMemDS, hOutputDS; GDALDriverH hMemDriver, hOutputDriver; int nBands = 1; int iLine; outputFormatObj *format = image->format; rasterBufferObj rb; GDALDataType eDataType = GDT_Byte; int bUseXmp = MS_FALSE; const char *filename = NULL; char *filenameToFree = NULL; const char *gdal_driver_shortname = format->driver + 5; msGDALInitialize(); memset(&rb, 0, sizeof(rasterBufferObj)); #ifdef USE_EXEMPI if (map != NULL) { bUseXmp = msXmpPresent(map); } #endif /* -------------------------------------------------------------------- */ /* Identify the proposed output driver. */ /* -------------------------------------------------------------------- */ msAcquireLock(TLOCK_GDAL); hOutputDriver = GDALGetDriverByName(gdal_driver_shortname); if (hOutputDriver == NULL) { msReleaseLock(TLOCK_GDAL); msSetError(MS_MISCERR, "Failed to find %s driver.", "msSaveImageGDAL()", gdal_driver_shortname); return MS_FAILURE; } /* -------------------------------------------------------------------- */ /* We will need to write the output to a temporary file and */ /* then stream to stdout if no filename is passed. If the */ /* driver supports virtualio then we hold the temporary file in */ /* memory, otherwise we try to put it in a reasonable temporary */ /* file location. */ /* -------------------------------------------------------------------- */ if (filenameIn == NULL) { const char *pszExtension = format->extension; if (pszExtension == NULL) pszExtension = "img.tmp"; if (bUseXmp == MS_FALSE && msGDALDriverSupportsVirtualIOOutput(hOutputDriver)) { msCleanVSIDir("/vsimem/msout"); filenameToFree = msTmpFile(map, NULL, "/vsimem/msout/", pszExtension); } if (filenameToFree == NULL && map != NULL) filenameToFree = msTmpFile(map, map->mappath, NULL, pszExtension); else if (filenameToFree == NULL) { filenameToFree = msTmpFile(map, NULL, NULL, pszExtension); } filename = filenameToFree; bFileIsTemporary = MS_TRUE; } else { filename = filenameIn; } /* -------------------------------------------------------------------- */ /* Establish the characteristics of our memory, and final */ /* dataset. */ /* -------------------------------------------------------------------- */ if (format->imagemode == MS_IMAGEMODE_RGB) { nBands = 3; assert(MS_RENDERER_PLUGIN(format) && format->vtable->supports_pixel_buffer); if (MS_UNLIKELY(MS_FAILURE == format->vtable->getRasterBufferHandle(image, &rb))) { msReleaseLock(TLOCK_GDAL); msFree(filenameToFree); return MS_FAILURE; } } else if (format->imagemode == MS_IMAGEMODE_RGBA) { nBands = 4; assert(MS_RENDERER_PLUGIN(format) && format->vtable->supports_pixel_buffer); if (MS_UNLIKELY(MS_FAILURE == format->vtable->getRasterBufferHandle(image, &rb))) { msReleaseLock(TLOCK_GDAL); msFree(filenameToFree); return MS_FAILURE; } } else if (format->imagemode == MS_IMAGEMODE_INT16) { nBands = format->bands; eDataType = GDT_Int16; } else if (format->imagemode == MS_IMAGEMODE_FLOAT32) { nBands = format->bands; eDataType = GDT_Float32; } else if (format->imagemode == MS_IMAGEMODE_BYTE) { nBands = format->bands; eDataType = GDT_Byte; } else { msReleaseLock(TLOCK_GDAL); msSetError(MS_MEMERR, "Unknown format. This is a bug.", "msSaveImageGDAL()"); msFree(filenameToFree); return MS_FAILURE; } /* -------------------------------------------------------------------- */ /* Create a memory dataset which we can use as a source for a */ /* CreateCopy(). */ /* -------------------------------------------------------------------- */ hMemDriver = GDALGetDriverByName("MEM"); if (hMemDriver == NULL) { msReleaseLock(TLOCK_GDAL); msSetError(MS_MISCERR, "Failed to find MEM driver.", "msSaveImageGDAL()"); msFree(filenameToFree); return MS_FAILURE; } hMemDS = GDALCreate(hMemDriver, "msSaveImageGDAL_temp", image->width, image->height, nBands, eDataType, NULL); if (hMemDS == NULL) { msReleaseLock(TLOCK_GDAL); msSetError(MS_MISCERR, "Failed to create MEM dataset.", "msSaveImageGDAL()"); msFree(filenameToFree); return MS_FAILURE; } /* -------------------------------------------------------------------- */ /* Copy the gd image into the memory dataset. */ /* -------------------------------------------------------------------- */ for (iLine = 0; iLine < image->height; iLine++) { int iBand; for (iBand = 0; iBand < nBands; iBand++) { CPLErr eErr; GDALRasterBandH hBand = GDALGetRasterBand(hMemDS, iBand + 1); if (format->imagemode == MS_IMAGEMODE_INT16) { eErr = GDALRasterIO(hBand, GF_Write, 0, iLine, image->width, 1, image->img.raw_16bit + iLine * image->width + iBand * image->width * image->height, image->width, 1, GDT_Int16, 2, 0); } else if (format->imagemode == MS_IMAGEMODE_FLOAT32) { eErr = GDALRasterIO(hBand, GF_Write, 0, iLine, image->width, 1, image->img.raw_float + iLine * image->width + iBand * image->width * image->height, image->width, 1, GDT_Float32, 4, 0); } else if (format->imagemode == MS_IMAGEMODE_BYTE) { eErr = GDALRasterIO(hBand, GF_Write, 0, iLine, image->width, 1, image->img.raw_byte + iLine * image->width + iBand * image->width * image->height, image->width, 1, GDT_Byte, 1, 0); } else { GByte *pabyData; unsigned char *pixptr = NULL; assert(rb.type == MS_BUFFER_BYTE_RGBA); switch (iBand) { case 0: pixptr = rb.data.rgba.r; break; case 1: pixptr = rb.data.rgba.g; break; case 2: pixptr = rb.data.rgba.b; break; case 3: pixptr = rb.data.rgba.a; break; } assert(pixptr); if (pixptr == NULL) { msReleaseLock(TLOCK_GDAL); msSetError(MS_MISCERR, "Missing RGB or A buffer.\n", "msSaveImageGDAL()"); GDALClose(hMemDS); msFree(filenameToFree); return MS_FAILURE; } pabyData = (GByte *)(pixptr + iLine * rb.data.rgba.row_step); if (rb.data.rgba.a == NULL || iBand == 3) { eErr = GDALRasterIO(hBand, GF_Write, 0, iLine, image->width, 1, pabyData, image->width, 1, GDT_Byte, rb.data.rgba.pixel_step, 0); } else { /* We need to un-pre-multiple RGB by alpha. */ GByte *pabyUPM = (GByte *)malloc(image->width); GByte *pabyAlpha = (GByte *)(rb.data.rgba.a + iLine * rb.data.rgba.row_step); int i; for (i = 0; i < image->width; i++) { int alpha = pabyAlpha[i * rb.data.rgba.pixel_step]; if (alpha == 0) pabyUPM[i] = 0; else { int result = (pabyData[i * rb.data.rgba.pixel_step] * 255) / alpha; if (result > 255) result = 255; pabyUPM[i] = result; } } eErr = GDALRasterIO(hBand, GF_Write, 0, iLine, image->width, 1, pabyUPM, image->width, 1, GDT_Byte, 1, 0); free(pabyUPM); } } if (eErr != CE_None) { msReleaseLock(TLOCK_GDAL); msSetError(MS_MISCERR, "GDALRasterIO() failed.\n", "msSaveImageGDAL()"); GDALClose(hMemDS); msFree(filenameToFree); return MS_FAILURE; } } } /* -------------------------------------------------------------------- */ /* Attach the palette if appropriate. */ /* -------------------------------------------------------------------- */ if (format->imagemode == MS_IMAGEMODE_RGB) { GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 1), GCI_RedBand); GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 2), GCI_GreenBand); GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 3), GCI_BlueBand); } else if (format->imagemode == MS_IMAGEMODE_RGBA) { GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 1), GCI_RedBand); GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 2), GCI_GreenBand); GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 3), GCI_BlueBand); GDALSetRasterColorInterpretation(GDALGetRasterBand(hMemDS, 4), GCI_AlphaBand); } /* -------------------------------------------------------------------- */ /* Assign the projection and coordinate system to the memory */ /* dataset. */ /* -------------------------------------------------------------------- */ if (map != NULL) { char *pszWKT; GDALSetGeoTransform(hMemDS, map->gt.geotransform); pszWKT = msProjectionObj2OGCWKT(&(map->projection)); if (pszWKT != NULL) { GDALSetProjection(hMemDS, pszWKT); msFree(pszWKT); } } /* -------------------------------------------------------------------- */ /* Possibly assign a nodata value. */ /* -------------------------------------------------------------------- */ const char *nullvalue = msGetOutputFormatOption(format, "NULLVALUE", NULL); if (nullvalue != NULL) { const double dfNullValue = atof(nullvalue); for (int iBand = 0; iBand < nBands; iBand++) { GDALRasterBandH hBand = GDALGetRasterBand(hMemDS, iBand + 1); GDALSetRasterNoDataValue(hBand, dfNullValue); } } /* -------------------------------------------------------------------- */ /* Try to save resolution in the output file. */ /* -------------------------------------------------------------------- */ if (image->resolution > 0) { char res[30]; snprintf(res, sizeof(res), "%lf", image->resolution); GDALSetMetadataItem(hMemDS, "TIFFTAG_XRESOLUTION", res, NULL); GDALSetMetadataItem(hMemDS, "TIFFTAG_YRESOLUTION", res, NULL); GDALSetMetadataItem(hMemDS, "TIFFTAG_RESOLUTIONUNIT", "2", NULL); } /* -------------------------------------------------------------------- */ /* Separate creation options from metadata items. */ /* -------------------------------------------------------------------- */ std::vector apszCreationOptions; for (int i = 0; i < format->numformatoptions; i++) { char *option = format->formatoptions[i]; // MDI stands for MetaDataItem if (STARTS_WITH(option, "mdi_")) { const char *option_without_band = option + strlen("mdi_"); GDALMajorObjectH hObject = (GDALMajorObjectH)hMemDS; if (STARTS_WITH(option_without_band, "BAND_")) { int nBandNumber = atoi(option_without_band + strlen("BAND_")); if (nBandNumber > 0 && nBandNumber <= nBands) { const char *pszAfterBand = strchr(option_without_band + strlen("BAND_"), '_'); if (pszAfterBand != NULL) { hObject = (GDALMajorObjectH)GDALGetRasterBand(hMemDS, nBandNumber); option_without_band = pszAfterBand + 1; } } else { msDebug("Invalid band number %d in metadata item option %s", nBandNumber, option); } } if (hObject) { std::string osDomain(option_without_band); size_t nUnderscorePos = osDomain.find('_'); if (nUnderscorePos != std::string::npos) { std::string osKeyValue = osDomain.substr(nUnderscorePos + 1); osDomain.resize(nUnderscorePos); if (osDomain == "default") osDomain.clear(); size_t nEqualPos = osKeyValue.find('='); if (nEqualPos != std::string::npos) { GDALSetMetadataItem( hObject, osKeyValue.substr(0, nEqualPos).c_str(), osKeyValue.substr(nEqualPos + 1).c_str(), osDomain.c_str()); } } else { msDebug("Invalid format in metadata item option %s", option); } } } else { apszCreationOptions.emplace_back(option); } } apszCreationOptions.emplace_back(nullptr); /* -------------------------------------------------------------------- */ /* Create a disk image in the selected output format from the */ /* memory image. */ /* -------------------------------------------------------------------- */ hOutputDS = GDALCreateCopy(hOutputDriver, filename, hMemDS, FALSE, &apszCreationOptions[0], NULL, NULL); if (hOutputDS == NULL) { GDALClose(hMemDS); msReleaseLock(TLOCK_GDAL); msSetError(MS_MISCERR, "Failed to create output %s file.\n%s", "msSaveImageGDAL()", format->driver + 5, CPLGetLastErrorMsg()); msFree(filenameToFree); return MS_FAILURE; } /* closing the memory DS also frees all associated resources. */ GDALClose(hMemDS); GDALClose(hOutputDS); msReleaseLock(TLOCK_GDAL); /* -------------------------------------------------------------------- */ /* Are we writing license info into the image? */ /* If so, add it to the temp file on disk now. */ /* -------------------------------------------------------------------- */ #ifdef USE_EXEMPI if (bUseXmp == MS_TRUE) { if (msXmpWrite(map, filename) == MS_FAILURE) { /* Something bad happened. */ msSetError(MS_MISCERR, "XMP write to %s failed.\n", "msSaveImageGDAL()", filename); msFree(filenameToFree); return MS_FAILURE; } } #endif /* -------------------------------------------------------------------- */ /* Is this supposed to be a temporary file? If so, stream to */ /* stdout and delete the file. */ /* -------------------------------------------------------------------- */ if (bFileIsTemporary) { VSILFILE *fp; unsigned char block[4000]; int bytes_read; if (msIO_needBinaryStdout() == MS_FAILURE) { msFree(filenameToFree); return MS_FAILURE; } /* We aren't sure how far back GDAL exports the VSI*L API, so we only use it if we suspect we need it. But we do need it if holding temporary file in memory. */ fp = VSIFOpenL(filename, "rb"); if (fp == NULL) { msSetError(MS_MISCERR, "Failed to open %s for streaming to stdout.", "msSaveImageGDAL()", filename); msFree(filenameToFree); return MS_FAILURE; } while ((bytes_read = VSIFReadL(block, 1, sizeof(block), fp)) > 0) msIO_fwrite(block, 1, bytes_read, stdout); VSIFCloseL(fp); VSIUnlink(filename); msCleanVSIDir("/vsimem/msout"); } msFree(filenameToFree); return MS_SUCCESS; } /************************************************************************/ /* msInitGDALOutputFormat() */ /************************************************************************/ int msInitDefaultGDALOutputFormat(outputFormatObj *format) { GDALDriverH hDriver; msGDALInitialize(); /* -------------------------------------------------------------------- */ /* check that this driver exists. Note visiting drivers should */ /* be pretty threadsafe so don't bother acquiring the GDAL */ /* lock. */ /* -------------------------------------------------------------------- */ hDriver = GDALGetDriverByName(format->driver + 5); if (hDriver == NULL) { msSetError(MS_MISCERR, "No GDAL driver named `%s' available.", "msInitGDALOutputFormat()", format->driver + 5); return MS_FAILURE; } if (GDALGetMetadataItem(hDriver, GDAL_DCAP_CREATE, NULL) == NULL && GDALGetMetadataItem(hDriver, GDAL_DCAP_CREATECOPY, NULL) == NULL) { msSetError(MS_MISCERR, "GDAL `%s' driver does not support output.", "msInitGDALOutputFormat()", format->driver + 5); return MS_FAILURE; } /* -------------------------------------------------------------------- */ /* Initialize the object. */ /* -------------------------------------------------------------------- */ format->imagemode = MS_IMAGEMODE_RGB; format->renderer = MS_RENDER_WITH_AGG; if (GDALGetMetadataItem(hDriver, GDAL_DMD_MIMETYPE, NULL) != NULL) format->mimetype = msStrdup(GDALGetMetadataItem(hDriver, GDAL_DMD_MIMETYPE, NULL)); if (GDALGetMetadataItem(hDriver, GDAL_DMD_EXTENSION, NULL) != NULL) format->extension = msStrdup(GDALGetMetadataItem(hDriver, GDAL_DMD_EXTENSION, NULL)); return MS_SUCCESS; } char **msGetStringListFromHashTable(hashTableObj *table) { struct hashObj *tp = NULL; int i; char **papszRet = NULL; if (!table) return NULL; if (msHashIsEmpty(table)) return NULL; for (i = 0; i < MS_HASHSIZE; ++i) { if (table->items[i] != NULL) { for (tp = table->items[i]; tp != NULL; tp = tp->next) { papszRet = CSLSetNameValue(papszRet, tp->key, tp->data); } } } return papszRet; } /************************************************************************/ /* msProjectionObj2OGCWKT() */ /* */ /* We stick to the C API for OGRSpatialReference object access */ /* to allow MapServer+GDAL to be built without C++ */ /* complications. */ /* */ /* Note that this function will return NULL on failure, and the */ /* returned string should be freed with msFree(). */ /************************************************************************/ char *msProjectionObj2OGCWKT(projectionObj *projection) { OGRSpatialReferenceH hSRS; char *pszWKT = NULL, *pszProj4, *pszInitEpsg = NULL; int nLength = 0, i; OGRErr eErr; if (projection->proj == NULL) return NULL; hSRS = OSRNewSpatialReference(NULL); /* -------------------------------------------------------------------- */ /* Look for an EPSG-like projection argument */ /* -------------------------------------------------------------------- */ if ((projection->numargs == 1 || (projection->numargs == 2 && strstr(projection->args[1], "epsgaxis=") != NULL)) && (pszInitEpsg = strcasestr(projection->args[0], "init=epsg:"))) { const int nEpsgCode = atoi(pszInitEpsg + strlen("init=epsg:")); eErr = OSRImportFromEPSG(hSRS, nEpsgCode); if (eErr != OGRERR_NONE) { // In case this is a pseudo EPSG code only defined in a text 'epsg' // file and not in proj.db eErr = OSRSetFromUserInput( hSRS, std::string("+").append(projection->args[0]).c_str()); } } else { /* -------------------------------------------------------------------- */ /* Form arguments into a full Proj.4 definition string. */ /* -------------------------------------------------------------------- */ for (i = 0; i < projection->numargs; i++) nLength += strlen(projection->args[i]) + 2; pszProj4 = (char *)CPLMalloc(nLength + 2); pszProj4[0] = '\0'; for (i = 0; i < projection->numargs; i++) { strcat(pszProj4, "+"); strcat(pszProj4, projection->args[i]); strcat(pszProj4, " "); } /* -------------------------------------------------------------------- */ /* Ingest the string into OGRSpatialReference. */ /* -------------------------------------------------------------------- */ eErr = OSRImportFromProj4(hSRS, pszProj4); CPLFree(pszProj4); } /* -------------------------------------------------------------------- */ /* Export as a WKT string. */ /* -------------------------------------------------------------------- */ if (eErr == OGRERR_NONE) OSRExportToWkt(hSRS, &pszWKT); OSRDestroySpatialReference(hSRS); if (pszWKT) { char *pszWKT2 = msStrdup(pszWKT); CPLFree(pszWKT); return pszWKT2; } else return NULL; } /************************************************************************/ /* msGDALDriverSupportsVirtualIOOutput() */ /************************************************************************/ int msGDALDriverSupportsVirtualIOOutput(GDALDriverH hDriver) { /* We need special testing here for the netCDF driver, since recent */ /* GDAL versions advertise VirtualIO support, but this is only for the */ /* read-side of the driver, not the write-side. */ return GDALGetMetadataItem(hDriver, GDAL_DCAP_VIRTUALIO, NULL) != NULL && !EQUAL(GDALGetDescription(hDriver), "netCDF"); } mapserver-8.6.0/src/mapgdal.h000066400000000000000000000033311511405061000160670ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: GDAL interface * Author: Even Rouault * ****************************************************************************** * Copyright (c) 2020, Even Rouault * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPGDAL_H #define MAPGDAL_H #include "mapserver.h" #include "gdal.h" #ifdef __cplusplus extern "C" { #endif int msGDALDriverSupportsVirtualIOOutput(GDALDriverH hDriver); #ifdef __cplusplus } #endif #endif /* MAPGDAL_H */ mapserver-8.6.0/src/mapgeomtransform.c000066400000000000000000000263351511405061000200470ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: RFC48 implementation of geometry transformations for styling * Author: Thomas Bonfort , Camptocamp (thomas.bonfort at camptocamp.com) * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include "mapthread.h" extern int yyparse(parseObj *p); void msStyleSetGeomTransform(styleObj *s, const char *transform) { if (!transform) { msFree(s->_geomtransform.string); s->_geomtransform.string = NULL; s->_geomtransform.type = MS_GEOMTRANSFORM_NONE; return; } if (!strncasecmp("start", transform, 5)) { s->_geomtransform.type = MS_GEOMTRANSFORM_START; } else if (!strncasecmp("end", transform, 3)) { s->_geomtransform.type = MS_GEOMTRANSFORM_END; } else if (!strncasecmp("vertices", transform, 8)) { s->_geomtransform.type = MS_GEOMTRANSFORM_VERTICES; } else if (!strncasecmp("bbox", transform, 4)) { s->_geomtransform.type = MS_GEOMTRANSFORM_BBOX; } else if (!strncasecmp("labelpnt", transform, 8)) { s->_geomtransform.type = MS_GEOMTRANSFORM_LABELPOINT; } else if (!strncasecmp("labelpoly", transform, 9)) { s->_geomtransform.type = MS_GEOMTRANSFORM_LABELPOLY; } else if (!strncasecmp("labelcenter", transform, 11)) { s->_geomtransform.type = MS_GEOMTRANSFORM_LABELCENTER; } else if (!strncasecmp("centroid", transform, 8)) { s->_geomtransform.type = MS_GEOMTRANSFORM_CENTROID; } else { s->_geomtransform.type = MS_GEOMTRANSFORM_NONE; msSetError(MS_MISCERR, "unknown transform expression", "msStyleSetGeomTransform()"); msFree(s->_geomtransform.string); s->_geomtransform.string = NULL; return; } msFree(s->_geomtransform.string); s->_geomtransform.string = msStrdup(transform); } /* * return a copy of the geometry transform expression * returned char* must be freed by the caller */ char *msStyleGetGeomTransform(styleObj *s) { return msStrdup(s->_geomtransform.string); } double calcOrientation(pointObj *p1, pointObj *p2) { double theta; theta = atan2(p2->x - p1->x, p2->y - p1->y); return MS_RAD_TO_DEG * (theta - MS_PI2); } double calcMidAngle(pointObj *p1, pointObj *p2, pointObj *p3) { pointObj p1n; double dx12, dy12, dx23, dy23, l12, l23; /* We treat both segments as vector 1-2 and vector 2-3 and * compute their dx,dy and length */ dx12 = p2->x - p1->x; dy12 = p2->y - p1->y; l12 = sqrt(dx12 * dx12 + dy12 * dy12); dx23 = p3->x - p2->x; dy23 = p3->y - p2->y; l23 = sqrt(dx23 * dx23 + dy23 * dy23); /* Normalize length of vector 1-2 to same as length of vector 2-3 */ if (l12 > 0.0) { p1n.x = p2->x - dx12 * (l23 / l12); p1n.y = p2->y - dy12 * (l23 / l12); } else p1n = *p2; /* segment 1-2 is 0-length, use segment 2-3 for orientation */ /* Return the orientation defined by the sum of the normalized vectors */ return calcOrientation(&p1n, p3); } /* * RFC48 implementation: * - transform the original shapeobj * - use the styleObj to render the transformed shapeobj */ int msDrawTransformedShape(mapObj *map, imageObj *image, shapeObj *shape, styleObj *style, double scalefactor) { int type = style->_geomtransform.type; int i, j, status = MS_SUCCESS; switch (type) { case MS_GEOMTRANSFORM_END: /*render point on last vertex only*/ for (j = 0; j < shape->numlines; j++) { lineObj *line = &(shape->line[j]); pointObj *p = &(line->point[line->numpoints - 1]); if (p->x < 0 || p->x > image->width || p->y < 0 || p->y > image->height) continue; if (style->autoangle == MS_TRUE && line->numpoints > 1) { style->angle = calcOrientation(&(line->point[line->numpoints - 2]), p); } status = msDrawMarkerSymbol(map, image, p, style, scalefactor); } break; case MS_GEOMTRANSFORM_START: /*render point on first vertex only*/ for (j = 0; j < shape->numlines; j++) { lineObj *line = &(shape->line[j]); pointObj *p = &(line->point[0]); /*skip if outside image*/ if (p->x < 0 || p->x > image->width || p->y < 0 || p->y > image->height) continue; if (style->autoangle == MS_TRUE && line->numpoints > 1) { style->angle = calcOrientation(p, &(line->point[1])); } status = msDrawMarkerSymbol(map, image, p, style, scalefactor); } break; case MS_GEOMTRANSFORM_VERTICES: for (j = 0; j < shape->numlines; j++) { lineObj *line = &(shape->line[j]); for (i = 1; i < line->numpoints - 1; i++) { pointObj *p = &(line->point[i]); /*skip points outside image*/ if (p->x < 0 || p->x > image->width || p->y < 0 || p->y > image->height) continue; if (style->autoangle == MS_TRUE) { style->angle = calcMidAngle(&(line->point[i - 1]), &(line->point[i]), &(line->point[i + 1])); } status = msDrawMarkerSymbol(map, image, p, style, scalefactor); } } break; case MS_GEOMTRANSFORM_BBOX: { shapeObj bbox; lineObj bbox_line; pointObj bbox_points[5]; int padding = MS_MAX(style->width, style->size) + 3; /* so clipped shape does not extent into image */ /*create a shapeObj representing the bounding box (clipped by the image * size)*/ bbox.numlines = 1; bbox.line = &bbox_line; bbox.line->numpoints = 5; bbox.line->point = bbox_points; msComputeBounds(shape); bbox_points[0].x = bbox_points[4].x = bbox_points[1].x = (shape->bounds.minx < -padding) ? -padding : shape->bounds.minx; /* cppcheck-suppress unreadVariable */ bbox_points[2].x = bbox_points[3].x = (shape->bounds.maxx > image->width + padding) ? image->width + padding : shape->bounds.maxx; bbox_points[0].y = bbox_points[4].y = bbox_points[3].y = (shape->bounds.miny < -padding) ? -padding : shape->bounds.miny; /* cppcheck-suppress unreadVariable */ bbox_points[1].y = bbox_points[2].y = (shape->bounds.maxy > image->height + padding) ? image->height + padding : shape->bounds.maxy; status = msDrawShadeSymbol(map, image, &bbox, style, scalefactor); } break; case MS_GEOMTRANSFORM_CENTROID: { double unused; /*used by centroid function*/ pointObj centroid; if (MS_SUCCESS == msGetPolygonCentroid(shape, ¢roid, &unused, &unused)) { status = msDrawMarkerSymbol(map, image, ¢roid, style, scalefactor); } } break; case MS_GEOMTRANSFORM_EXPRESSION: { int status; shapeObj *tmpshp; parseObj p; p.shape = shape; /* set a few parser globals (hence the lock) */ p.expr = &(style->_geomtransform); if (p.expr->tokens == NULL) { /* this could happen if drawing originates from legend code (#5193) */ status = msTokenizeExpression(p.expr, NULL, NULL); if (status != MS_SUCCESS) { msSetError(MS_MISCERR, "Unable to tokenize expression.", "msDrawTransformedShape()"); return MS_FAILURE; } } p.expr->curtoken = p.expr->tokens; /* reset */ p.type = MS_PARSE_TYPE_SHAPE; status = yyparse(&p); if (status != 0) { msSetError(MS_PARSEERR, "Failed to process shape expression: %s", "msDrawTransformedShape", style->_geomtransform.string); return MS_FAILURE; } tmpshp = p.result.shpval; switch (tmpshp->type) { case MS_SHAPE_POINT: case MS_SHAPE_POLYGON: /* cppcheck-suppress unreadVariable */ status = msDrawShadeSymbol(map, image, tmpshp, style, scalefactor); break; case MS_SHAPE_LINE: /* cppcheck-suppress unreadVariable */ status = msDrawLineSymbol(map, image, tmpshp, style, scalefactor); break; } msFreeShape(tmpshp); msFree(tmpshp); } break; case MS_GEOMTRANSFORM_LABELPOINT: case MS_GEOMTRANSFORM_LABELPOLY: break; default: msSetError(MS_MISCERR, "unknown geomtransform", "msDrawTransformedShape()"); return MS_FAILURE; } return status; } /* * RFC89 implementation: * - transform directly the shapeobj */ int msGeomTransformShape(mapObj *map, layerObj *layer, shapeObj *shape) { int i; expressionObj *e = &layer->_geomtransform; #ifdef USE_V8_MAPSCRIPT if (!map->v8context) { msV8CreateContext(map); if (!map->v8context) { msSetError(MS_V8ERR, "Unable to create v8 context.", "msGeomTransformShape()"); return MS_FAILURE; } } msV8ContextSetLayer(map, layer); #endif switch (e->type) { case MS_GEOMTRANSFORM_EXPRESSION: { int status; shapeObj *tmpshp; parseObj p; p.shape = shape; /* set a few parser globals (hence the lock) */ p.expr = e; p.expr->curtoken = p.expr->tokens; /* reset */ p.type = MS_PARSE_TYPE_SHAPE; p.dblval = map->cellsize * (msInchesPerUnit(map->units, 0) / msInchesPerUnit(layer->units, 0)); p.dblval2 = 0; /* data_cellsize is only set with contour layer */ if (layer->connectiontype == MS_CONTOUR) { const char *value = msLookupHashTable(&layer->metadata, "__data_cellsize__"); if (value) p.dblval2 = atof(value); } status = yyparse(&p); if (status != 0) { msSetError(MS_PARSEERR, "Failed to process shape expression: %s", "msGeomTransformShape()", e->string); return MS_FAILURE; } tmpshp = p.result.shpval; for (i = 0; i < shape->numlines; i++) free(shape->line[i].point); shape->numlines = 0; if (shape->line) free(shape->line); shape->line = NULL; shape->type = tmpshp->type; /* might have been a change (e.g. centerline) */ for (i = 0; i < tmpshp->numlines; i++) msAddLine(shape, &(tmpshp->line[i])); /* copy each line */ msFreeShape(tmpshp); msFree(tmpshp); } break; default: msSetError(MS_MISCERR, "unknown geomtransform", "msGeomTransformShape()"); return MS_FAILURE; } return MS_SUCCESS; } mapserver-8.6.0/src/mapgeomutil.cpp000066400000000000000000000100521511405061000173360ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Rendering utility functions * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2011 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include "renderers/agg/include/agg_arc.h" #include "renderers/agg/include/agg_basics.h" shapeObj *msRasterizeArc(double x0, double y0, double radius, double startAngle, double endAngle, int isSlice) { static int allocated_size = 100; shapeObj *shape = (shapeObj *)calloc(1, sizeof(shapeObj)); MS_CHECK_ALLOC(shape, sizeof(shapeObj), NULL); mapserver::arc arc(x0, y0, radius, radius, startAngle * MS_DEG_TO_RAD, endAngle * MS_DEG_TO_RAD, true); arc.approximation_scale(1); arc.rewind(1); msInitShape(shape); lineObj *line = (lineObj *)calloc(1, sizeof(lineObj)); if (!line) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msRasterizeArc()", __FILE__, __LINE__, (unsigned int)sizeof(lineObj)); free(shape); return NULL; } shape->line = line; shape->numlines = 1; line->point = (pointObj *)calloc(allocated_size, sizeof(pointObj)); if (!line->point) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msRasterizeArc()", __FILE__, __LINE__, (unsigned int)(allocated_size * sizeof(pointObj))); free(line); free(shape); return NULL; } line->numpoints = 0; double x, y; // first segment from center to first point of arc if (isSlice) { line->point[0].x = x0; line->point[0].y = y0; line->numpoints = 1; } while (arc.vertex(&x, &y) != mapserver::path_cmd_stop) { if (line->numpoints == allocated_size) { allocated_size *= 2; line->point = (pointObj *)realloc(line->point, allocated_size * sizeof(pointObj)); if (!line->point) { msSetError(MS_MEMERR, "%s: %d: Out of memory allocating %u bytes.\n", "msRasterizeArc()", __FILE__, __LINE__, (unsigned int)(allocated_size * sizeof(pointObj))); free(line); free(shape); return NULL; } } line->point[line->numpoints].x = x; line->point[line->numpoints].y = y; line->numpoints++; } // make sure the shape is closed if (line->point[line->numpoints - 1].x != line->point[0].x || line->point[line->numpoints - 1].y != line->point[0].y) { if (line->numpoints == allocated_size) { allocated_size *= 2; line->point = (pointObj *)msSmallRealloc( line->point, allocated_size * sizeof(pointObj)); } line->point[line->numpoints].x = line->point[0].x; line->point[line->numpoints].y = line->point[0].y; line->numpoints++; } return shape; } mapserver-8.6.0/src/mapgeos.c000066400000000000000000001405431511405061000161170ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapServer-GEOS integration. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include "mapgraph.h" #ifdef USE_GEOS // To avoid accidental use of non reentrant GEOS API. // (check only effective in GEOS >= 3.5) #define GEOS_USE_ONLY_R_API #include /* ** Error handling... */ static void msGEOSError(const char *format, ...) { va_list args; va_start(args, format); msSetError(MS_GEOSERR, format, "msGEOSError()", args); /* just pass along to MapServer error handling */ va_end(args); return; } static void msGEOSNotice(const char *fmt, ...) { (void)fmt; /* do nothing with notices at this point */ } #ifndef USE_THREAD static GEOSContextHandle_t geos_handle; static inline GEOSContextHandle_t msGetGeosContextHandle() { return geos_handle; } #else #include "mapthread.h" typedef struct geos_thread_info { struct geos_thread_info *next; void *thread_id; GEOSContextHandle_t geos_handle; } geos_thread_info_t; static geos_thread_info_t *geos_list = NULL; static GEOSContextHandle_t msGetGeosContextHandle() { geos_thread_info_t *link; GEOSContextHandle_t ret_obj; void *thread_id; msAcquireLock(TLOCK_GEOS); thread_id = msGetThreadId(); /* find link for this thread */ for (link = geos_list; link != NULL && link->thread_id != thread_id && link->next != NULL && link->next->thread_id != thread_id; link = link->next) { } /* If the target thread link is already at the head of the list were ok */ if (geos_list != NULL && geos_list->thread_id == thread_id) { } /* We don't have one ... initialize one. */ else if (link == NULL || link->next == NULL) { geos_thread_info_t *new_link; new_link = (geos_thread_info_t *)malloc(sizeof(geos_thread_info_t)); new_link->next = geos_list; new_link->thread_id = thread_id; new_link->geos_handle = initGEOS_r(msGEOSNotice, msGEOSError); geos_list = new_link; } /* If the link is not already at the head of the list, promote it */ else { geos_thread_info_t *target = link->next; link->next = link->next->next; target->next = geos_list; geos_list = target; } ret_obj = geos_list->geos_handle; msReleaseLock(TLOCK_GEOS); return ret_obj; } #endif /* ** Setup/Cleanup wrappers */ void msGEOSSetup() { #ifndef USE_THREAD geos_handle = initGEOS_r(msGEOSNotice, msGEOSError); #endif } void msGEOSCleanup() { #ifndef USE_THREAD finishGEOS_r(geos_handle); geos_handle = NULL; #else geos_thread_info_t *link; msAcquireLock(TLOCK_GEOS); for (link = geos_list; link != NULL;) { geos_thread_info_t *cur = link; link = link->next; finishGEOS_r(cur->geos_handle); free(cur); } geos_list = NULL; msReleaseLock(TLOCK_GEOS); #endif } /* ** Translation functions */ static GEOSGeom msGEOSShape2Geometry_point(pointObj *point) { GEOSCoordSeq coords; GEOSGeom g; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!point) return NULL; coords = GEOSCoordSeq_create_r(handle, 1, 2); /* todo handle z's */ if (!coords) return NULL; GEOSCoordSeq_setX_r(handle, coords, 0, point->x); GEOSCoordSeq_setY_r(handle, coords, 0, point->y); /* GEOSCoordSeq_setY(coords, 0, point->z); */ g = GEOSGeom_createPoint_r(handle, coords); /* g owns the coordinate in coords */ return g; } static GEOSGeom msGEOSShape2Geometry_multipoint(lineObj *multipoint) { int i; GEOSGeom g; GEOSGeom *points; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!multipoint) return NULL; points = malloc(multipoint->numpoints * sizeof(GEOSGeom)); if (!points) return NULL; for (i = 0; i < multipoint->numpoints; i++) points[i] = msGEOSShape2Geometry_point(&(multipoint->point[i])); g = GEOSGeom_createCollection_r(handle, GEOS_MULTIPOINT, points, multipoint->numpoints); free(points); return g; } static GEOSGeom msGEOSShape2Geometry_line(lineObj *line) { int i; GEOSGeom g; GEOSCoordSeq coords; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!line) return NULL; coords = GEOSCoordSeq_create_r(handle, line->numpoints, 2); /* todo handle z's */ if (!coords) return NULL; for (i = 0; i < line->numpoints; i++) { GEOSCoordSeq_setX_r(handle, coords, i, line->point[i].x); GEOSCoordSeq_setY_r(handle, coords, i, line->point[i].y); /* GEOSCoordSeq_setZ(coords, i, line->point[i].z); */ } g = GEOSGeom_createLineString_r( handle, coords); /* g owns the coordinates in coords */ return g; } static GEOSGeom msGEOSShape2Geometry_multiline(shapeObj *multiline) { int i; GEOSGeom g; GEOSGeom *lines; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!multiline) return NULL; lines = malloc(multiline->numlines * sizeof(GEOSGeom)); if (!lines) return NULL; for (i = 0; i < multiline->numlines; i++) lines[i] = msGEOSShape2Geometry_line(&(multiline->line[i])); g = GEOSGeom_createCollection_r(handle, GEOS_MULTILINESTRING, lines, multiline->numlines); free(lines); return g; } static GEOSGeom msGEOSShape2Geometry_simplepolygon(shapeObj *shape, int r, int *outerList) { int i, j, k; GEOSCoordSeq coords; GEOSGeom g; GEOSGeom outerRing; GEOSGeom *innerRings = NULL; int numInnerRings = 0, *innerList; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape || !outerList) return NULL; /* build the outer shell */ coords = GEOSCoordSeq_create_r(handle, shape->line[r].numpoints, 2); /* todo handle z's */ if (!coords) return NULL; for (i = 0; i < shape->line[r].numpoints; i++) { GEOSCoordSeq_setX_r(handle, coords, i, shape->line[r].point[i].x); GEOSCoordSeq_setY_r(handle, coords, i, shape->line[r].point[i].y); /* GEOSCoordSeq_setZ(coords, i, shape->line[r].point[i].z); */ } outerRing = GEOSGeom_createLinearRing_r( handle, coords); /* outerRing owns the coordinates in coords */ /* build the holes */ innerList = msGetInnerList(shape, r, outerList); for (j = 0; j < shape->numlines; j++) if (innerList[j] == MS_TRUE) numInnerRings++; if (numInnerRings > 0) { k = 0; /* inner ring counter */ innerRings = msSmallMalloc(numInnerRings * sizeof(GEOSGeom)); for (j = 0; j < shape->numlines; j++) { if (innerList[j] == MS_FALSE) continue; coords = GEOSCoordSeq_create_r(handle, shape->line[j].numpoints, 2); /* todo handle z's */ if (!coords) { free(innerRings); free(innerList); return NULL; /* todo, this will leak memory (shell + allocated holes) */ } for (i = 0; i < shape->line[j].numpoints; i++) { GEOSCoordSeq_setX_r(handle, coords, i, shape->line[j].point[i].x); GEOSCoordSeq_setY_r(handle, coords, i, shape->line[j].point[i].y); /* GEOSCoordSeq_setZ(coords, i, shape->line[j].point[i].z); */ } innerRings[k] = GEOSGeom_createLinearRing_r( handle, coords); /* innerRings[k] owns the coordinates in coords */ k++; } } g = GEOSGeom_createPolygon_r(handle, outerRing, innerRings, numInnerRings); free(innerList); /* clean up */ free(innerRings); /* clean up */ return g; } static GEOSGeom msGEOSShape2Geometry_polygon(shapeObj *shape) { int i, j; GEOSGeom *polygons; int *outerList, numOuterRings = 0, lastOuterRing = 0; GEOSGeom g; GEOSContextHandle_t handle = msGetGeosContextHandle(); outerList = msGetOuterList(shape); for (i = 0; i < shape->numlines; i++) { if (outerList[i] == MS_TRUE) { numOuterRings++; lastOuterRing = i; /* save for the simple case */ } } if (numOuterRings == 1) { g = msGEOSShape2Geometry_simplepolygon(shape, lastOuterRing, outerList); } else { /* a true multipolygon */ polygons = msSmallMalloc(numOuterRings * sizeof(GEOSGeom)); j = 0; /* part counter */ for (i = 0; i < shape->numlines; i++) { if (outerList[i] == MS_FALSE) continue; polygons[j] = msGEOSShape2Geometry_simplepolygon( shape, i, outerList); /* TODO: account for NULL return values */ j++; } g = GEOSGeom_createCollection_r(handle, GEOS_MULTIPOLYGON, polygons, numOuterRings); free(polygons); } free(outerList); return g; } GEOSGeom msGEOSShape2Geometry(shapeObj *shape) { if (!shape) return NULL; /* a NULL shape generates a NULL geometry */ switch (shape->type) { case MS_SHAPE_POINT: if (shape->numlines == 0 || shape->line[0].numpoints == 0) /* not enough info for a point */ return NULL; if (shape->line[0].numpoints == 1) /* simple point */ return msGEOSShape2Geometry_point(&(shape->line[0].point[0])); else /* multi-point */ return msGEOSShape2Geometry_multipoint(&(shape->line[0])); break; case MS_SHAPE_LINE: if (shape->numlines == 0 || shape->line[0].numpoints < 2) /* not enough info for a line */ return NULL; if (shape->numlines == 1) /* simple line */ return msGEOSShape2Geometry_line(&(shape->line[0])); else /* multi-line */ return msGEOSShape2Geometry_multiline(shape); break; case MS_SHAPE_POLYGON: if (shape->numlines == 0 || shape->line[0].numpoints < 4) /* not enough info for a polygon (first=last) */ return NULL; return msGEOSShape2Geometry_polygon( shape); /* simple and multipolygon cases are addressed */ break; default: break; } return NULL; /* should not get here */ } static shapeObj *msGEOSGeometry2Shape_point(GEOSGeom g) { GEOSCoordSeq coords; shapeObj *shape = NULL; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!g) return NULL; shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_POINT; shape->line = (lineObj *)malloc(sizeof(lineObj)); shape->numlines = 1; shape->line[0].point = (pointObj *)malloc(sizeof(pointObj)); shape->line[0].numpoints = 1; shape->geometry = (GEOSGeom)g; coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, g); GEOSCoordSeq_getX_r(handle, coords, 0, &(shape->line[0].point[0].x)); GEOSCoordSeq_getY_r(handle, coords, 0, &(shape->line[0].point[0].y)); /* GEOSCoordSeq_getZ(coords, 0, &(shape->line[0].point[0].z)); */ shape->bounds.minx = shape->bounds.maxx = shape->line[0].point[0].x; shape->bounds.miny = shape->bounds.maxy = shape->line[0].point[0].y; return shape; } static shapeObj *msGEOSGeometry2Shape_multipoint(GEOSGeom g) { int i; int numPoints; GEOSCoordSeq coords; GEOSGeom point; shapeObj *shape = NULL; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!g) return NULL; numPoints = GEOSGetNumGeometries_r(handle, g); /* each geometry has 1 point */ shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_POINT; shape->line = (lineObj *)malloc(sizeof(lineObj)); shape->numlines = 1; shape->line[0].point = (pointObj *)malloc(sizeof(pointObj) * numPoints); shape->line[0].numpoints = numPoints; shape->geometry = (GEOSGeom)g; for (i = 0; i < numPoints; i++) { point = (GEOSGeom)GEOSGetGeometryN_r(handle, g, i); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, point); GEOSCoordSeq_getX_r(handle, coords, 0, &(shape->line[0].point[i].x)); GEOSCoordSeq_getY_r(handle, coords, 0, &(shape->line[0].point[i].y)); /* GEOSCoordSeq_getZ(coords, 0, &(shape->line[0].point[i].z)); */ } msComputeBounds(shape); return shape; } static shapeObj *msGEOSGeometry2Shape_line(GEOSGeom g) { shapeObj *shape = NULL; GEOSContextHandle_t handle = msGetGeosContextHandle(); int i; int numPoints; GEOSCoordSeq coords; if (!g) return NULL; numPoints = GEOSGetNumCoordinates_r(handle, g); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, g); shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_LINE; shape->line = (lineObj *)malloc(sizeof(lineObj)); shape->numlines = 1; shape->line[0].point = (pointObj *)malloc(sizeof(pointObj) * numPoints); shape->line[0].numpoints = numPoints; shape->geometry = (GEOSGeom)g; for (i = 0; i < numPoints; i++) { GEOSCoordSeq_getX_r(handle, coords, i, &(shape->line[0].point[i].x)); GEOSCoordSeq_getY_r(handle, coords, i, &(shape->line[0].point[i].y)); /* GEOSCoordSeq_getZ(coords, i, &(shape->line[0].point[i].z)); */ } msComputeBounds(shape); return shape; } static void msGEOSGeometry2Shape_multiline_part(GEOSContextHandle_t handle, GEOSGeom part, shapeObj *shape) { int i; int type, numGeometries, numPoints; GEOSCoordSeq coords; lineObj line; type = GEOSGeomTypeId_r(handle, part); if (type == GEOS_MULTILINESTRING) { numGeometries = GEOSGetNumGeometries_r(handle, part); for (i = 0; i < numGeometries; i++) { GEOSGeom subPart = (GEOSGeom)GEOSGetGeometryN_r(handle, part, i); msGEOSGeometry2Shape_multiline_part(handle, subPart, shape); } } else { numPoints = GEOSGetNumCoordinates_r(handle, part); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, part); line.point = (pointObj *)malloc(sizeof(pointObj) * numPoints); line.numpoints = numPoints; for (i = 0; i < numPoints; i++) { GEOSCoordSeq_getX_r(handle, coords, i, &(line.point[i].x)); GEOSCoordSeq_getY_r(handle, coords, i, &(line.point[i].y)); /* GEOSCoordSeq_getZ(coords, i, &(line.point[i].z)); */ } msAddLineDirectly(shape, &line); } } static shapeObj *msGEOSGeometry2Shape_multiline(GEOSGeom g) { int i; int numGeometries; GEOSGeom part; shapeObj *shape = NULL; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!g) return NULL; numGeometries = GEOSGetNumGeometries_r(handle, g); shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_LINE; shape->geometry = (GEOSGeom)g; for (i = 0; i < numGeometries; i++) { part = (GEOSGeom)GEOSGetGeometryN_r(handle, g, i); msGEOSGeometry2Shape_multiline_part(handle, part, shape); } msComputeBounds(shape); return shape; } static shapeObj *msGEOSGeometry2Shape_polygon(GEOSGeom g) { shapeObj *shape = NULL; lineObj line; int numPoints, numRings; int i, j; GEOSCoordSeq coords; GEOSGeom ring; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!g) return NULL; shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_POLYGON; shape->geometry = (GEOSGeom)g; /* exterior ring */ ring = (GEOSGeom)GEOSGetExteriorRing_r(handle, g); numPoints = GEOSGetNumCoordinates_r(handle, ring); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, ring); line.point = (pointObj *)malloc(sizeof(pointObj) * numPoints); line.numpoints = numPoints; for (i = 0; i < numPoints; i++) { GEOSCoordSeq_getX_r(handle, coords, i, &(line.point[i].x)); GEOSCoordSeq_getY_r(handle, coords, i, &(line.point[i].y)); /* GEOSCoordSeq_getZ(coords, i, &(line.point[i].z)); */ } msAddLineDirectly(shape, &line); /* interior rings */ numRings = GEOSGetNumInteriorRings_r(handle, g); for (j = 0; j < numRings; j++) { ring = (GEOSGeom)GEOSGetInteriorRingN_r(handle, g, j); if (GEOSisRing_r(handle, ring) != 1) continue; /* skip it */ numPoints = GEOSGetNumCoordinates_r(handle, ring); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, ring); line.point = (pointObj *)malloc(sizeof(pointObj) * numPoints); line.numpoints = numPoints; for (i = 0; i < numPoints; i++) { GEOSCoordSeq_getX_r(handle, coords, i, &(line.point[i].x)); GEOSCoordSeq_getY_r(handle, coords, i, &(line.point[i].y)); /* GEOSCoordSeq_getZ(coords, i, &(line.point[i].z)); */ } msAddLineDirectly(shape, &line); } msComputeBounds(shape); return shape; } static shapeObj *msGEOSGeometry2Shape_multipolygon(GEOSGeom g) { int i, j, k; shapeObj *shape = NULL; lineObj line; int numPoints, numRings, numPolygons; GEOSCoordSeq coords; GEOSGeom polygon, ring; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!g) return NULL; numPolygons = GEOSGetNumGeometries_r(handle, g); shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_POLYGON; shape->geometry = (GEOSGeom)g; for (k = 0; k < numPolygons; k++) { /* for each polygon */ polygon = (GEOSGeom)GEOSGetGeometryN_r(handle, g, k); /* exterior ring */ ring = (GEOSGeom)GEOSGetExteriorRing_r(handle, polygon); numPoints = GEOSGetNumCoordinates_r(handle, ring); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, ring); line.point = (pointObj *)malloc(sizeof(pointObj) * numPoints); line.numpoints = numPoints; for (i = 0; i < numPoints; i++) { GEOSCoordSeq_getX_r(handle, coords, i, &(line.point[i].x)); GEOSCoordSeq_getY_r(handle, coords, i, &(line.point[i].y)); /* GEOSCoordSeq_getZ(coords, i, &(line.point[i].z)); */ } msAddLineDirectly(shape, &line); /* interior rings */ numRings = GEOSGetNumInteriorRings_r(handle, polygon); for (j = 0; j < numRings; j++) { ring = (GEOSGeom)GEOSGetInteriorRingN_r(handle, polygon, j); if (GEOSisRing_r(handle, ring) != 1) continue; /* skip it */ numPoints = GEOSGetNumCoordinates_r(handle, ring); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, ring); line.point = (pointObj *)malloc(sizeof(pointObj) * numPoints); line.numpoints = numPoints; for (i = 0; i < numPoints; i++) { GEOSCoordSeq_getX_r(handle, coords, i, &(line.point[i].x)); GEOSCoordSeq_getY_r(handle, coords, i, &(line.point[i].y)); /* GEOSCoordSeq_getZ(coords, i, &(line.point[i].z)); */ } msAddLineDirectly(shape, &line); } } /* next polygon */ msComputeBounds(shape); return shape; } shapeObj *msGEOSGeometry2Shape(GEOSGeom g) { int type; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!g) return NULL; /* a NULL geometry generates a NULL shape */ type = GEOSGeomTypeId_r(handle, g); switch (type) { case GEOS_POINT: return msGEOSGeometry2Shape_point(g); break; case GEOS_MULTIPOINT: return msGEOSGeometry2Shape_multipoint(g); break; case GEOS_LINESTRING: return msGEOSGeometry2Shape_line(g); break; case GEOS_MULTILINESTRING: return msGEOSGeometry2Shape_multiline(g); break; case GEOS_POLYGON: return msGEOSGeometry2Shape_polygon(g); break; case GEOS_MULTIPOLYGON: return msGEOSGeometry2Shape_multipolygon(g); break; case GEOS_GEOMETRYCOLLECTION: if (!GEOSisEmpty_r(handle, g)) { shapeObj *shape = (shapeObj *)malloc(sizeof(shapeObj)); msInitShape(shape); shape->type = MS_SHAPE_LINE; shape->geometry = (GEOSGeom)g; const int numGeoms = GEOSGetNumGeometries_r(handle, g); for (int i = 0; i < numGeoms; i++) { /* for each geometry */ shapeObj *shape2 = msGEOSGeometry2Shape((GEOSGeom)GEOSGetGeometryN_r(handle, g, i)); if (shape2) { for (int j = 0; j < shape2->numlines; j++) msAddLineDirectly(shape, &shape2->line[j]); shape2->numlines = 0; shape2->geometry = NULL; /* not owned */ msFreeShape(shape2); } } msComputeBounds(shape); return shape; } break; default: msSetError(MS_GEOSERR, "Unsupported GEOS geometry type (%d).", "msGEOSGeometry2Shape()", type); } return NULL; } #endif /* ** Maintenance functions exposed to MapServer/MapScript. */ void msGEOSFreeGeometry(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g = NULL; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape || !shape->geometry) return; g = (GEOSGeom)shape->geometry; GEOSGeom_destroy_r(handle, g); shape->geometry = NULL; #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSFreeGEOSGeom()"); return; #endif } /* ** WKT input and output functions */ shapeObj *msGEOSShapeFromWKT(const char *wkt) { #ifdef USE_GEOS GEOSGeom g; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!wkt) return NULL; g = GEOSGeomFromWKT_r(handle, wkt); if (!g) { msSetError(MS_GEOSERR, "Error reading WKT geometry \"%s\".", "msGEOSShapeFromWKT()", wkt); return NULL; } else { return msGEOSGeometry2Shape(g); } #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSShapeFromWKT()"); return NULL; #endif } /* Return should be freed with msGEOSFreeWKT */ char *msGEOSShapeToWKT(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; /* if we have a geometry, we should update it*/ msGEOSFreeGeometry(shape); shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g = (GEOSGeom)shape->geometry; if (!g) return NULL; return GEOSGeomToWKT_r(handle, g); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSShapeToWKT()"); return NULL; #endif } void msGEOSFreeWKT(char *pszGEOSWKT) { #ifdef USE_GEOS GEOSContextHandle_t handle = msGetGeosContextHandle(); #if GEOS_VERSION_MAJOR > 3 || \ (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR >= 2) GEOSFree_r(handle, pszGEOSWKT); #endif #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSFreeWKT()"); #endif } shapeObj *msGEOSOffsetCurve(shapeObj *p, double offset) { #if defined USE_GEOS && (GEOS_VERSION_MAJOR > 3 || \ (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR >= 3)) int typeChanged = 0; GEOSGeom g1, g2 = NULL; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!p) return NULL; /* * GEOSOffsetCurve_r() uses BufferBuilder.bufferLineSingleSided(), which * works with lines, naturally. In order to allow offsets for a MapServer * polygonObj, it has to be processed as line and afterwards reverted. */ if (p->type == MS_SHAPE_POLYGON) { p->type = MS_SHAPE_LINE; typeChanged = 1; msGEOSFreeGeometry(p); } if (typeChanged || !p->geometry) p->geometry = (GEOSGeom)msGEOSShape2Geometry(p); g1 = (GEOSGeom)p->geometry; if (!g1) return NULL; if (GEOSGeomTypeId_r(handle, g1) == GEOS_MULTILINESTRING) { GEOSGeom *lines = malloc(p->numlines * sizeof(GEOSGeom)); if (!lines) return NULL; for (int i = 0; i < p->numlines; i++) { lines[i] = GEOSOffsetCurve_r(handle, GEOSGetGeometryN_r(handle, g1, i), offset, 4, GEOSBUF_JOIN_MITRE, fabs(offset * 1.5)); } g2 = GEOSGeom_createCollection_r(handle, GEOS_MULTILINESTRING, lines, p->numlines); free(lines); } else { g2 = GEOSOffsetCurve_r(handle, g1, offset, 4, GEOSBUF_JOIN_MITRE, fabs(offset * 1.5)); } /* * Undo change of geometry type. We won't re-create the geos gemotry here, * it's up to each geos function to create it. */ if (typeChanged) { msGEOSFreeGeometry(p); p->type = MS_SHAPE_POLYGON; } if (g2) return msGEOSGeometry2Shape(g2); return NULL; #else msSetError(MS_GEOSERR, "GEOS Offset Curve support is not available.", "msGEOSingleSidedBuffer()"); return NULL; #endif } /* ** Analytical functions exposed to MapServer/MapScript. */ shapeObj *msGEOSBuffer(shapeObj *shape, double width) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSBuffer_r(handle, g1, width, 30); return msGEOSGeometry2Shape(g2); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSBuffer()"); return NULL; #endif } shapeObj *msGEOSSimplify(shapeObj *shape, double tolerance) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSSimplify_r(handle, g1, tolerance); return msGEOSGeometry2Shape(g2); #else msSetError(MS_GEOSERR, "GEOS Simplify support is not available.", "msGEOSSimplify()"); return NULL; #endif } shapeObj *msGEOSTopologyPreservingSimplify(shapeObj *shape, double tolerance) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSTopologyPreserveSimplify_r(handle, g1, tolerance); return msGEOSGeometry2Shape(g2); #else msSetError(MS_GEOSERR, "GEOS Simplify support is not available.", "msGEOSTopologyPreservingSimplify()"); return NULL; #endif } shapeObj *msGEOSConvexHull(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSConvexHull_r(handle, g1); return msGEOSGeometry2Shape(g2); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSConvexHull()"); return NULL; #endif } shapeObj *msGEOSBoundary(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSBoundary_r(handle, g1); return msGEOSGeometry2Shape(g2); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSBoundary()"); return NULL; #endif } pointObj *msGEOSGetCentroid(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSCoordSeq coords; pointObj *point; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSGetCentroid_r(handle, g1); if (!g2) return NULL; point = (pointObj *)malloc(sizeof(pointObj)); coords = (GEOSCoordSeq)GEOSGeom_getCoordSeq_r(handle, g2); GEOSCoordSeq_getX_r(handle, coords, 0, &(point->x)); GEOSCoordSeq_getY_r(handle, coords, 0, &(point->y)); /* GEOSCoordSeq_getZ(coords, 0, &(point->z)); */ GEOSGeom_destroy_r(handle, g2); return point; #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSGetCentroid()"); return NULL; #endif } shapeObj *msGEOSUnion(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2, g3; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return NULL; if (!shape1->geometry) /* if no geometry for the shape then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return NULL; if (!shape2->geometry) /* if no geometry for the shape then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return NULL; g3 = GEOSUnion_r(handle, g1, g2); return msGEOSGeometry2Shape(g3); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSUnion()"); return NULL; #endif } shapeObj *msGEOSIntersection(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2, g3; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return NULL; if (!shape1->geometry) /* if no geometry for the shape then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return NULL; if (!shape2->geometry) /* if no geometry for the shape then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return NULL; g3 = GEOSIntersection_r(handle, g1, g2); return msGEOSGeometry2Shape(g3); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSIntersection()"); return NULL; #endif } shapeObj *msGEOSDifference(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2, g3; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return NULL; if (!shape1->geometry) /* if no geometry for the shape then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return NULL; if (!shape2->geometry) /* if no geometry for the shape then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return NULL; g3 = GEOSDifference_r(handle, g1, g2); return msGEOSGeometry2Shape(g3); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSDifference()"); return NULL; #endif } shapeObj *msGEOSSymDifference(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2, g3; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return NULL; if (!shape1->geometry) /* if no geometry for the shape then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return NULL; if (!shape2->geometry) /* if no geometry for the shape then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return NULL; g3 = GEOSSymDifference_r(handle, g1, g2); return msGEOSGeometry2Shape(g3); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSSymDifference()"); return NULL; #endif } shapeObj *msGEOSLineMerge(shapeObj *shape) { #ifdef USE_GEOS GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (shape->type != MS_SHAPE_LINE) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSLineMerge_r(handle, g1); return msGEOSGeometry2Shape(g2); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSLineMerge()"); return NULL; #endif } shapeObj *msGEOSVoronoiDiagram(shapeObj *shape, double tolerance, int onlyEdges) { #if defined(USE_GEOS) && \ (GEOS_VERSION_MAJOR > 3 || \ (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR >= 5)) GEOSGeom g1, g2; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return NULL; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g1 = (GEOSGeom)shape->geometry; if (!g1) return NULL; g2 = GEOSVoronoiDiagram_r(handle, g1, NULL, tolerance, onlyEdges); return msGEOSGeometry2Shape(g2); #else msSetError( MS_GEOSERR, "GEOS support is not available or GEOS version is not 3.5 or higher.", "msGEOSVoronoiDiagram()"); return NULL; #endif } static int keepEdge(lineObj *segment, shapeObj *polygon) { int i, j; if (segment->numpoints < 2) return MS_FALSE; if (msIntersectPointPolygon(&segment->point[0], polygon) != MS_TRUE) return MS_FALSE; if (msIntersectPointPolygon(&segment->point[1], polygon) != MS_TRUE) return MS_FALSE; for (i = 0; i < polygon->numlines; i++) for (j = 1; j < polygon->line[i].numpoints; j++) if (msIntersectSegments(&(segment->point[0]), &(segment->point[1]), &(polygon->line[i].point[j - 1]), &(polygon->line[i].point[j])) == MS_TRUE) return (MS_FALSE); return (MS_TRUE); } #define ARE_SAME_POINTS(a, b) \ (((a).x != (b).x || (a).y != (b).y) ? MS_FALSE : MS_TRUE) // returns the index of the node, we use z to store a count of points at the // same coordinate static int buildNodes(multipointObj *nodes, pointObj *point) { int i; for (i = 0; i < nodes->numpoints; i++) { if (ARE_SAME_POINTS(nodes->point[i], *point)) { // found it nodes->point[i].z++; return i; } } // not found, add it nodes->point[i].x = point->x; nodes->point[i].y = point->y; nodes->point[i].z = 1; nodes->numpoints++; return i; } shapeObj *msGEOSCenterline(shapeObj *shape) { #if defined(USE_GEOS) && \ (GEOS_VERSION_MAJOR > 3 || \ (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR >= 5)) int i; shapeObj *shape2 = NULL; multipointObj nodes; graphObj *graph; int *path = NULL; // array of node indexes int path_size = 0; double path_dist = -1, max_path_dist = -1; if (!shape) return NULL; if (shape->type != MS_SHAPE_POLYGON) { msSetError(MS_GEOSERR, "Centerlines can only be computed for polygon shapes.", "msGEOSCenterline()"); return NULL; } shape2 = msGEOSVoronoiDiagram(shape, 0.0, MS_TRUE); if (!shape2) { msSetError(MS_GEOSERR, "Voronoi diagram generation failed.", "msGEOSCenterline()"); return NULL; } // process the edges and build a graph representation nodes.point = (pointObj *)malloc(shape2->numlines * sizeof(pointObj) * 2); nodes.numpoints = 0; if (!nodes.point) { msFreeShape(shape2); free(shape2); return NULL; } graph = msCreateGraph(shape2->numlines * 2); if (!graph) { msFreeShape(shape2); free(shape2); free(nodes.point); return NULL; } for (i = 0; i < shape2->numlines; i++) { if (keepEdge(&shape2->line[i], shape) == MS_TRUE) { int src = buildNodes(&nodes, &shape2->line[i].point[0]); int dest = buildNodes(&nodes, &shape2->line[i].point[1]); msGraphAddEdge(graph, src, dest, msDistancePointToPoint(&shape2->line[i].point[0], &shape2->line[i].point[1])); } } msFreeShape(shape2); // done with voronoi geometry, shape2 is still allocated // though, just empty shape2->type = MS_SHAPE_LINE; // will fill with centerline if (nodes.numpoints == 0) { msSetError(MS_GEOSERR, "Centerline generation failed, try densifying the shapes.", "msGEOSCenterline()"); free(shape2); msFreeGraph(graph); free(nodes.point); return NULL; } // step through edge nodes (z=1) for (i = 0; i < nodes.numpoints; i++) { if (nodes.point[i].z != 1) continue; // skip if (!path) { // first one, keep this path path = msGraphGetLongestShortestPath(graph, i, &path_size, &path_dist); max_path_dist = path_dist; } else { int *tmp_path = NULL; int tmp_path_size = 0; double tmp_path_dist = -1; if (i == path[path_size - 1]) continue; // skip, graph is bi-directional so it can't be any longer tmp_path = msGraphGetLongestShortestPath(graph, i, &tmp_path_size, &tmp_path_dist); if (tmp_path_dist > max_path_dist) { free(path); path = tmp_path; path_size = tmp_path_size; path_dist = tmp_path_dist; max_path_dist = tmp_path_dist; } else { // skip path msFree(tmp_path); } } } msFreeGraph(graph); // done with graph // transform the path into a shape if (!path) { msSetError(MS_GEOSERR, "Centerline generation failed.", "msGEOSCenterline()"); free(shape2); free(nodes.point); return NULL; } else { lineObj line; line.point = (pointObj *)malloc(path_size * sizeof(pointObj)); if (!line.point) { free(shape2); free(path); free(nodes.point); return NULL; } line.numpoints = path_size; for (i = 0; i < path_size; i++) { line.point[i].x = nodes.point[path[i]].x; line.point[i].y = nodes.point[path[i]].y; } msAddLineDirectly(shape2, &line); } free(path); // clean up free(nodes.point); return shape2; #else msSetError( MS_GEOSERR, "GEOS support is not available or GEOS version is not 3.5 or higher.", "msGEOSCenterline()"); return NULL; #endif } /* ** Binary predicates exposed to MapServer/MapScript */ /* ** Does shape1 contain shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSContains(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = shape2->geometry; if (!g2) return -1; result = GEOSContains_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSContains()"); return -1; #endif } /* ** Does shape1 overlap shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSOverlaps(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = shape2->geometry; if (!g2) return -1; result = GEOSOverlaps_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSOverlaps()"); return -1; #endif } /* ** Is shape1 within shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSWithin(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = shape2->geometry; if (!g2) return -1; result = GEOSWithin_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSWithin()"); return -1; #endif } /* ** Does shape1 cross shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSCrosses(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = shape2->geometry; if (!g2) return -1; result = GEOSCrosses_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSCrosses()"); return -1; #endif } /* ** Does shape1 intersect shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSIntersects(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return -1; result = GEOSIntersects_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else if (!shape1 || !shape2) return -1; switch (shape1->type) { /* todo: deal with point shapes */ case (MS_SHAPE_LINE): switch (shape2->type) { case (MS_SHAPE_LINE): return msIntersectPolylines(shape1, shape2); case (MS_SHAPE_POLYGON): return msIntersectPolylinePolygon(shape1, shape2); } break; case (MS_SHAPE_POLYGON): switch (shape2->type) { case (MS_SHAPE_LINE): return msIntersectPolylinePolygon(shape2, shape1); case (MS_SHAPE_POLYGON): return msIntersectPolygons(shape1, shape2); } break; } return -1; #endif } /* ** Does shape1 touch shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSTouches(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return -1; result = GEOSTouches_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSTouches()"); return -1; #endif } /* ** Does shape1 equal shape2, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSEquals(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return -1; result = GEOSEquals_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSEquals()"); return -1; #endif } /* ** Are shape1 and shape2 disjoint, returns MS_TRUE/MS_FALSE or -1 for an error. */ int msGEOSDisjoint(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return -1; result = GEOSDisjoint_r(handle, g1, g2); return ((result == 2) ? -1 : result); #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSDisjoint()"); return -1; #endif } /* ** Useful misc. functions that return -1 on failure. */ double msGEOSArea(shapeObj *shape) { #if defined(USE_GEOS) && defined(GEOS_CAPI_VERSION_MAJOR) && \ defined(GEOS_CAPI_VERSION_MINOR) && \ (GEOS_CAPI_VERSION_MAJOR > 1 || GEOS_CAPI_VERSION_MINOR >= 1) GEOSGeom g; double area; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return -1; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g = (GEOSGeom)shape->geometry; if (!g) return -1; result = GEOSArea_r(handle, g, &area); return ((result == 0) ? -1 : area); #elif defined(USE_GEOS) msSetError(MS_GEOSERR, "GEOS support enabled, but old version lacks GEOSArea().", "msGEOSArea()"); return -1; #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSArea()"); return -1; #endif } double msGEOSLength(shapeObj *shape) { #if defined(USE_GEOS) && defined(GEOS_CAPI_VERSION_MAJOR) && \ defined(GEOS_CAPI_VERSION_MINOR) && \ (GEOS_CAPI_VERSION_MAJOR > 1 || GEOS_CAPI_VERSION_MINOR >= 1) GEOSGeom g; double length; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape) return -1; if (!shape->geometry) /* if no geometry for the shape then build one */ shape->geometry = (GEOSGeom)msGEOSShape2Geometry(shape); g = (GEOSGeom)shape->geometry; if (!g) return -1; result = GEOSLength_r(handle, g, &length); return ((result == 0) ? -1 : length); #elif defined(USE_GEOS) msSetError(MS_GEOSERR, "GEOS support enabled, but old version lacks GEOSLength().", "msGEOSLength()"); return -1; #else msSetError(MS_GEOSERR, "GEOS support is not available.", "msGEOSLength()"); return -1; #endif } double msGEOSDistance(shapeObj *shape1, shapeObj *shape2) { #ifdef USE_GEOS GEOSGeom g1, g2; double distance; int result; GEOSContextHandle_t handle = msGetGeosContextHandle(); if (!shape1 || !shape2) return -1; if (!shape1->geometry) /* if no geometry for shape1 then build one */ shape1->geometry = (GEOSGeom)msGEOSShape2Geometry(shape1); g1 = (GEOSGeom)shape1->geometry; if (!g1) return -1; if (!shape2->geometry) /* if no geometry for shape2 then build one */ shape2->geometry = (GEOSGeom)msGEOSShape2Geometry(shape2); g2 = (GEOSGeom)shape2->geometry; if (!g2) return -1; result = GEOSDistance_r(handle, g1, g2, &distance); return ((result == 0) ? -1 : distance); #else return msDistanceShapeToShape( shape1, shape2); /* fall back on brute force method (for MapScript) */ #endif } mapserver-8.6.0/src/mapgml.c000066400000000000000000002647621511405061000157530ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: shapeObj to GML output via MapServer queries. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "maperror.h" #include "mapows.h" #include "mapgml.h" #include "maptime.h" /* Use only mapgml.c if WMS or WFS is available (with minor exceptions at end) */ #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) static int msGMLGeometryLookup(gmlGeometryListObj *geometryList, const char *type); /* ** Functions that write the feature boundary geometry (i.e. a rectObj). */ /* GML 2.1.2 */ static int gmlWriteBounds_GML2(FILE *stream, rectObj *rect, const char *srsname, const char *tab, const char *pszTopPrefix) { char *srsname_encoded; if (!stream) return (MS_FAILURE); if (!rect) return (MS_FAILURE); if (!tab) return (MS_FAILURE); msIO_fprintf(stream, "%s<%s:boundedBy>\n", tab, pszTopPrefix); if (srsname) { srsname_encoded = msEncodeHTMLEntities(srsname); msIO_fprintf(stream, "%s\t\n", tab, srsname_encoded); msFree(srsname_encoded); } else msIO_fprintf(stream, "%s\t\n", tab); msIO_fprintf(stream, "%s\t\t", tab); msIO_fprintf(stream, "%.6f,%.6f %.6f,%.6f", rect->minx, rect->miny, rect->maxx, rect->maxy); msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s\t\n", tab); msIO_fprintf(stream, "%s\n", tab, pszTopPrefix); return MS_SUCCESS; } /* GML 3.1 or GML 3.2 (MapServer limits GML encoding to the level 0 profile) */ static int gmlWriteBounds_GML3(FILE *stream, rectObj *rect, const char *srsname, const char *tab, const char *pszTopPrefix) { char *srsname_encoded; if (!stream) return (MS_FAILURE); if (!rect) return (MS_FAILURE); if (!tab) return (MS_FAILURE); msIO_fprintf(stream, "%s<%s:boundedBy>\n", tab, pszTopPrefix); if (srsname) { srsname_encoded = msEncodeHTMLEntities(srsname); msIO_fprintf(stream, "%s\t\n", tab, srsname_encoded); msFree(srsname_encoded); } else msIO_fprintf(stream, "%s\t\n", tab); msIO_fprintf(stream, "%s\t\t%.6f %.6f\n", tab, rect->minx, rect->miny); msIO_fprintf(stream, "%s\t\t%.6f %.6f\n", tab, rect->maxx, rect->maxy); msIO_fprintf(stream, "%s\t\n", tab); msIO_fprintf(stream, "%s\n", tab, pszTopPrefix); return MS_SUCCESS; } static void gmlStartGeometryContainer(FILE *stream, const char *name, const char *namespace, const char *tab) { const char *tag_name = OWS_GML_DEFAULT_GEOMETRY_NAME; if (name) tag_name = name; if (namespace) msIO_fprintf(stream, "%s<%s:%s>\n", tab, namespace, tag_name); else msIO_fprintf(stream, "%s<%s>\n", tab, tag_name); } static void gmlEndGeometryContainer(FILE *stream, const char *name, const char *namespace, const char *tab) { const char *tag_name = OWS_GML_DEFAULT_GEOMETRY_NAME; if (name) tag_name = name; if (namespace) msIO_fprintf(stream, "%s\n", tab, namespace, tag_name); else msIO_fprintf(stream, "%s\n", tab, tag_name); } /* GML 2.1.2 */ static int gmlWriteGeometry_GML2(FILE *stream, gmlGeometryListObj *geometryList, shapeObj *shape, const char *srsname, const char *namespace, const char *tab, int nSRSDimension, int geometry_precision) { int i, j, k; int *innerlist, *outerlist = NULL, numouters; char *srsname_encoded = NULL; int geometry_aggregate_index, geometry_simple_index; char *geometry_aggregate_name = NULL, *geometry_simple_name = NULL; if (!stream) return (MS_FAILURE); if (!shape) return (MS_FAILURE); if (!tab) return (MS_FAILURE); if (!geometryList) return (MS_FAILURE); if (shape->numlines <= 0) return (MS_SUCCESS); /* empty shape, nothing to output */ if (srsname) srsname_encoded = msEncodeHTMLEntities(srsname); /* feature geometry */ switch (shape->type) { case (MS_SHAPE_POINT): geometry_simple_index = msGMLGeometryLookup(geometryList, "point"); geometry_aggregate_index = msGMLGeometryLookup(geometryList, "multipoint"); if (geometry_simple_index >= 0) geometry_simple_name = geometryList->geometries[geometry_simple_index].name; if (geometry_aggregate_index >= 0) geometry_aggregate_name = geometryList->geometries[geometry_aggregate_index].name; if ((geometry_simple_index != -1 && shape->line[0].numpoints == 1 && shape->numlines == 1) || (geometry_simple_index != -1 && geometry_aggregate_index == -1) || (geometryList->numgeometries == 0 && shape->line[0].numpoints == 1 && shape->numlines == 1)) { /* write a Point(s) */ for (i = 0; i < shape->numlines; i++) { for (j = 0; j < shape->line[i].numpoints; j++) { gmlStartGeometryContainer(stream, geometry_simple_name, namespace, tab); /* Point */ if (srsname_encoded) msIO_fprintf(stream, "%s\n", tab, srsname_encoded); else msIO_fprintf(stream, "%s\n", tab); if (nSRSDimension == 3) msIO_fprintf( stream, "%s %.*f,%.*f,%.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%s %.*f,%.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); msIO_fprintf(stream, "%s\n", tab); gmlEndGeometryContainer(stream, geometry_simple_name, namespace, tab); } } } else if ((geometry_aggregate_index != -1) || (geometryList->numgeometries == 0)) { /* write a MultiPoint */ gmlStartGeometryContainer(stream, geometry_aggregate_name, namespace, tab); /* MultiPoint */ if (srsname_encoded) msIO_fprintf(stream, "%s\n", tab, srsname_encoded); else msIO_fprintf(stream, "%s\n", tab); for (i = 0; i < shape->numlines; i++) { for (j = 0; j < shape->line[i].numpoints; j++) { msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); if (nSRSDimension == 3) msIO_fprintf( stream, "%s %.*f,%.*f,%.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf( stream, "%s %f,%f\n", tab, shape->line[i].point[j].x, shape->line[i].point[j].y); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s\n", tab); gmlEndGeometryContainer(stream, geometry_aggregate_name, namespace, tab); } else { msIO_fprintf(stream, "\n"); } break; case (MS_SHAPE_LINE): geometry_simple_index = msGMLGeometryLookup(geometryList, "line"); geometry_aggregate_index = msGMLGeometryLookup(geometryList, "multiline"); if (geometry_simple_index >= 0) geometry_simple_name = geometryList->geometries[geometry_simple_index].name; if (geometry_aggregate_index >= 0) geometry_aggregate_name = geometryList->geometries[geometry_aggregate_index].name; if ((geometry_simple_index != -1 && shape->numlines == 1) || (geometry_simple_index != -1 && geometry_aggregate_index == -1) || (geometryList->numgeometries == 0 && shape->numlines == 1)) { /* write a LineStrings(s) */ for (i = 0; i < shape->numlines; i++) { gmlStartGeometryContainer(stream, geometry_simple_name, namespace, tab); /* LineString */ if (srsname_encoded) msIO_fprintf(stream, "%s\n", tab, srsname_encoded); else msIO_fprintf(stream, "%s\n", tab); msIO_fprintf(stream, "%s ", tab); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f,%.*f,%.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f,%.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s\n", tab); gmlEndGeometryContainer(stream, geometry_simple_name, namespace, tab); } } else if (geometry_aggregate_index != -1 || (geometryList->numgeometries == 0)) { /* write a MultiCurve */ gmlStartGeometryContainer(stream, geometry_aggregate_name, namespace, tab); /* MultiLineString */ if (srsname_encoded) msIO_fprintf(stream, "%s\n", tab, srsname_encoded); else msIO_fprintf(stream, "%s\n", tab); for (j = 0; j < shape->numlines; j++) { msIO_fprintf(stream, "%s \n", tab); /* no srsname at this point */ msIO_fprintf(stream, "%s \n", tab); /* no srsname at this point */ msIO_fprintf(stream, "%s ", tab); for (i = 0; i < shape->line[j].numpoints; i++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f,%.*f,%.*f ", geometry_precision, shape->line[j].point[i].x, geometry_precision, shape->line[j].point[i].y, geometry_precision, shape->line[j].point[i].z); else /* fall-through */ msIO_fprintf(stream, "%.*f,%.*f ", geometry_precision, shape->line[j].point[i].x, geometry_precision, shape->line[j].point[i].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } msIO_fprintf(stream, "%s\n", tab); gmlEndGeometryContainer(stream, geometry_aggregate_name, namespace, tab); } else { msIO_fprintf(stream, "\n"); } break; case ( MS_SHAPE_POLYGON): /* this gets nasty, since our shapes are so flexible */ geometry_simple_index = msGMLGeometryLookup(geometryList, "polygon"); geometry_aggregate_index = msGMLGeometryLookup(geometryList, "multipolygon"); if (geometry_simple_index >= 0) geometry_simple_name = geometryList->geometries[geometry_simple_index].name; if (geometry_aggregate_index >= 0) geometry_aggregate_name = geometryList->geometries[geometry_aggregate_index].name; /* get a list of outer rings for this polygon */ outerlist = msGetOuterList(shape); numouters = 0; for (i = 0; i < shape->numlines; i++) if (outerlist[i] == MS_TRUE) numouters++; if ((geometry_simple_index != -1 && numouters == 1) || (geometry_simple_index != -1 && geometry_aggregate_index == -1) || (geometryList->numgeometries == 0 && shape->numlines == 1)) { /* write a Polygon(s) */ for (i = 0; i < shape->numlines; i++) { if (outerlist[i] == MS_FALSE) break; /* skip non-outer rings, each outer ring is a new polygon */ /* get a list of inner rings for this polygon */ innerlist = msGetInnerList(shape, i, outerlist); gmlStartGeometryContainer(stream, geometry_simple_name, namespace, tab); /* Polygon */ if (srsname_encoded) msIO_fprintf(stream, "%s\n", tab, srsname_encoded); else msIO_fprintf(stream, "%s\n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f,%.*f,%.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f,%.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); for (k = 0; k < shape->numlines; k++) { /* now step through all the inner rings */ if (innerlist[k] == MS_TRUE) { msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab); for (j = 0; j < shape->line[k].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f,%.*f,%.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y, geometry_precision, shape->line[k].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f,%.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s\n", tab); free(innerlist); gmlEndGeometryContainer(stream, geometry_simple_name, namespace, tab); } free(outerlist); outerlist = NULL; } else if (geometry_aggregate_index != -1 || (geometryList->numgeometries == 0)) { /* write a MultiPolygon */ gmlStartGeometryContainer(stream, geometry_aggregate_name, namespace, tab); /* MultiPolygon */ if (srsname_encoded) msIO_fprintf(stream, "%s\n", tab, srsname_encoded); else msIO_fprintf(stream, "%s\n", tab); for (i = 0; i < shape->numlines; i++) { /* step through the outer rings */ if (outerlist[i] == MS_TRUE) { innerlist = msGetInnerList(shape, i, outerlist); msIO_fprintf(stream, "%s\n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f,%.*f,%.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f,%.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); for (k = 0; k < shape->numlines; k++) { /* now step through all the inner rings */ if (innerlist[k] == MS_TRUE) { msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab); for (j = 0; j < shape->line[k].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f,%.*f,%.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y, geometry_precision, shape->line[k].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f,%.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s\n", tab); free(innerlist); } } msIO_fprintf(stream, "%s\n", tab); free(outerlist); outerlist = NULL; gmlEndGeometryContainer(stream, geometry_aggregate_name, namespace, tab); } else { msIO_fprintf(stream, "\n"); } break; default: break; } /* clean-up */ msFree(srsname_encoded); msFree(outerlist); return (MS_SUCCESS); } static char *gmlCreateGeomId(OWSGMLVersion nGMLVersion, const char *pszFID, int *p_id) { char *pszGMLId; if (nGMLVersion == OWS_GML32) { pszGMLId = (char *)msSmallMalloc(strlen(pszFID) + 1 + strlen(" gml:id=\"\"") + 10); sprintf(pszGMLId, " gml:id=\"%s.%d\"", pszFID, *p_id); (*p_id)++; } else pszGMLId = msStrdup(""); return pszGMLId; } /* GML 3.1 or GML 3.2 (MapServer limits GML encoding to the level 0 profile) */ static int gmlWriteGeometry_GML3(FILE *stream, gmlGeometryListObj *geometryList, shapeObj *shape, const char *srsname, const char *namespace, const char *tab, const char *pszFID, OWSGMLVersion nGMLVersion, int nSRSDimension, int geometry_precision) { int i, j, k, id = 1; int *innerlist, *outerlist = NULL, numouters; char *srsname_encoded = NULL; char *pszGMLId; int geometry_aggregate_index, geometry_simple_index; char *geometry_aggregate_name = NULL, *geometry_simple_name = NULL; if (!stream) return (MS_FAILURE); if (!shape) return (MS_FAILURE); if (!tab) return (MS_FAILURE); if (!geometryList) return (MS_FAILURE); if (shape->numlines <= 0) return (MS_SUCCESS); /* empty shape, nothing to output */ if (srsname) srsname_encoded = msEncodeHTMLEntities(srsname); /* feature geometry */ switch (shape->type) { case (MS_SHAPE_POINT): geometry_simple_index = msGMLGeometryLookup(geometryList, "point"); geometry_aggregate_index = msGMLGeometryLookup(geometryList, "multipoint"); if (geometry_simple_index >= 0) geometry_simple_name = geometryList->geometries[geometry_simple_index].name; if (geometry_aggregate_index >= 0) geometry_aggregate_name = geometryList->geometries[geometry_aggregate_index].name; if ((geometry_simple_index != -1 && shape->line[0].numpoints == 1 && shape->numlines == 1) || (geometry_simple_index != -1 && geometry_aggregate_index == -1) || (geometryList->numgeometries == 0 && shape->line[0].numpoints == 1 && shape->numlines == 1)) { /* write a Point(s) */ for (i = 0; i < shape->numlines; i++) { for (j = 0; j < shape->line[i].numpoints; j++) { gmlStartGeometryContainer(stream, geometry_simple_name, namespace, tab); /* Point */ pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); if (srsname_encoded) msIO_fprintf(stream, "%s \n", tab, pszGMLId, srsname_encoded); else msIO_fprintf(stream, "%s \n", tab, pszGMLId); if (nSRSDimension == 3) msIO_fprintf( stream, "%s %.*f %.*f %.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%s %.*f %.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); msIO_fprintf(stream, "%s \n", tab); gmlEndGeometryContainer(stream, geometry_simple_name, namespace, tab); msFree(pszGMLId); } } } else if ((geometry_aggregate_index != -1) || (geometryList->numgeometries == 0)) { /* write a MultiPoint */ pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); gmlStartGeometryContainer(stream, geometry_aggregate_name, namespace, tab); /* MultiPoint */ if (srsname_encoded) msIO_fprintf(stream, "%s \n", tab, pszGMLId, srsname_encoded); else msIO_fprintf(stream, "%s \n", tab, pszGMLId); msFree(pszGMLId); for (i = 0; i < shape->numlines; i++) { for (j = 0; j < shape->line[i].numpoints; j++) { msIO_fprintf(stream, "%s \n", tab); pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); msIO_fprintf(stream, "%s \n", tab, pszGMLId); if (nSRSDimension == 3) msIO_fprintf(stream, "%s %.*f %.*f " "%.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%s %.*f %.*f\n", tab, geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); msIO_fprintf(stream, "%s \n", tab); msFree(pszGMLId); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s \n", tab); gmlEndGeometryContainer(stream, geometry_aggregate_name, namespace, tab); } else { msIO_fprintf(stream, "\n"); } break; case (MS_SHAPE_LINE): geometry_simple_index = msGMLGeometryLookup(geometryList, "line"); geometry_aggregate_index = msGMLGeometryLookup(geometryList, "multiline"); if (geometry_simple_index >= 0) geometry_simple_name = geometryList->geometries[geometry_simple_index].name; if (geometry_aggregate_index >= 0) geometry_aggregate_name = geometryList->geometries[geometry_aggregate_index].name; if ((geometry_simple_index != -1 && shape->numlines == 1) || (geometry_simple_index != -1 && geometry_aggregate_index == -1) || (geometryList->numgeometries == 0 && shape->numlines == 1)) { /* write a LineStrings(s) */ for (i = 0; i < shape->numlines; i++) { gmlStartGeometryContainer(stream, geometry_simple_name, namespace, tab); /* LineString (should be Curve?) */ pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); if (srsname_encoded) msIO_fprintf(stream, "%s \n", tab, pszGMLId, srsname_encoded); else msIO_fprintf(stream, "%s \n", tab, pszGMLId); msFree(pszGMLId); msIO_fprintf(stream, "%s ", tab, nSRSDimension); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f %.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); gmlEndGeometryContainer(stream, geometry_simple_name, namespace, tab); } } else if (geometry_aggregate_index != -1 || (geometryList->numgeometries == 0)) { /* write a MultiCurve */ gmlStartGeometryContainer(stream, geometry_aggregate_name, namespace, tab); /* MultiCurve */ pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); if (srsname_encoded) msIO_fprintf(stream, "%s \n", tab, pszGMLId, srsname_encoded); else msIO_fprintf(stream, "%s \n", tab, pszGMLId); msFree(pszGMLId); for (i = 0; i < shape->numlines; i++) { msIO_fprintf(stream, "%s \n", tab); pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); msIO_fprintf(stream, "%s \n", tab, pszGMLId); /* no srsname at this point */ msFree(pszGMLId); msIO_fprintf(stream, "%s ", tab, nSRSDimension); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f %.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } msIO_fprintf(stream, "%s \n", tab); gmlEndGeometryContainer(stream, geometry_aggregate_name, namespace, tab); } else { msIO_fprintf(stream, "\n"); } break; case ( MS_SHAPE_POLYGON): /* this gets nasty, since our shapes are so flexible */ geometry_simple_index = msGMLGeometryLookup(geometryList, "polygon"); geometry_aggregate_index = msGMLGeometryLookup(geometryList, "multipolygon"); if (geometry_simple_index >= 0) geometry_simple_name = geometryList->geometries[geometry_simple_index].name; if (geometry_aggregate_index >= 0) geometry_aggregate_name = geometryList->geometries[geometry_aggregate_index].name; /* get a list of outer rings for this polygon */ outerlist = msGetOuterList(shape); numouters = 0; for (i = 0; i < shape->numlines; i++) if (outerlist[i] == MS_TRUE) numouters++; if ((geometry_simple_index != -1 && numouters == 1) || (geometry_simple_index != -1 && geometry_aggregate_index == -1) || (geometryList->numgeometries == 0 && shape->numlines == 1)) { /* write a Polygon(s) */ for (i = 0; i < shape->numlines; i++) { if (outerlist[i] == MS_FALSE) break; /* skip non-outer rings, each outer ring is a new polygon */ /* get a list of inner rings for this polygon */ innerlist = msGetInnerList(shape, i, outerlist); gmlStartGeometryContainer(stream, geometry_simple_name, namespace, tab); pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); /* Polygon (should be Surface?) */ if (srsname_encoded) msIO_fprintf(stream, "%s \n", tab, pszGMLId, srsname_encoded); else msIO_fprintf(stream, "%s \n", tab, pszGMLId); msFree(pszGMLId); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab, nSRSDimension); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f %.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); for (k = 0; k < shape->numlines; k++) { /* now step through all the inner rings */ if (innerlist[k] == MS_TRUE) { msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab, nSRSDimension); for (j = 0; j < shape->line[k].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f %.*f %.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y, geometry_precision, shape->line[k].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f %.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s \n", tab); free(innerlist); gmlEndGeometryContainer(stream, geometry_simple_name, namespace, tab); } free(outerlist); outerlist = NULL; } else if (geometry_aggregate_index != -1 || (geometryList->numgeometries == 0)) { /* write a MultiSurface */ gmlStartGeometryContainer(stream, geometry_aggregate_name, namespace, tab); pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); /* MultiSurface */ if (srsname_encoded) msIO_fprintf(stream, "%s \n", tab, pszGMLId, srsname_encoded); else msIO_fprintf(stream, "%s \n", tab, pszGMLId); msFree(pszGMLId); for (i = 0; i < shape->numlines; i++) { /* step through the outer rings */ if (outerlist[i] == MS_TRUE) { msIO_fprintf(stream, "%s \n", tab); /* get a list of inner rings for this polygon */ innerlist = msGetInnerList(shape, i, outerlist); pszGMLId = gmlCreateGeomId(nGMLVersion, pszFID, &id); msIO_fprintf(stream, "%s \n", tab, pszGMLId); msFree(pszGMLId); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab, nSRSDimension); for (j = 0; j < shape->line[i].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f %.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y, geometry_precision, shape->line[i].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f %.*f ", geometry_precision, shape->line[i].point[j].x, geometry_precision, shape->line[i].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); for (k = 0; k < shape->numlines; k++) { /* now step through all the inner rings */ if (innerlist[k] == MS_TRUE) { msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s ", tab, nSRSDimension); for (j = 0; j < shape->line[k].numpoints; j++) { if (nSRSDimension == 3) msIO_fprintf(stream, "%.*f %.*f %.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y, geometry_precision, shape->line[k].point[j].z); else /* fall-through */ msIO_fprintf(stream, "%.*f %.*f ", geometry_precision, shape->line[k].point[j].x, geometry_precision, shape->line[k].point[j].y); } msIO_fprintf(stream, "\n"); msIO_fprintf(stream, "%s \n", tab); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s \n", tab); free(innerlist); msIO_fprintf(stream, "%s \n", tab); } } msIO_fprintf(stream, "%s \n", tab); free(outerlist); outerlist = NULL; gmlEndGeometryContainer(stream, geometry_aggregate_name, namespace, tab); } else { msIO_fprintf(stream, "\n"); } break; default: break; } /* clean-up */ msFree(outerlist); msFree(srsname_encoded); return (MS_SUCCESS); } /* ** Wrappers for the format specific encoding functions. */ static int gmlWriteBounds(FILE *stream, OWSGMLVersion format, rectObj *rect, const char *srsname, const char *tab, const char *pszTopPrefix) { switch (format) { case (OWS_GML2): return gmlWriteBounds_GML2(stream, rect, srsname, tab, pszTopPrefix); break; case (OWS_GML3): case (OWS_GML32): return gmlWriteBounds_GML3(stream, rect, srsname, tab, pszTopPrefix); break; default: msSetError(MS_IOERR, "Unsupported GML format.", "gmlWriteBounds()"); } return (MS_FAILURE); } static int gmlWriteGeometry(FILE *stream, gmlGeometryListObj *geometryList, OWSGMLVersion format, shapeObj *shape, const char *srsname, const char *namespace, const char *tab, const char *pszFID, int nSRSDimension, int geometry_precision) { switch (format) { case (OWS_GML2): return gmlWriteGeometry_GML2(stream, geometryList, shape, srsname, namespace, tab, nSRSDimension, geometry_precision); break; case (OWS_GML3): case (OWS_GML32): return gmlWriteGeometry_GML3(stream, geometryList, shape, srsname, namespace, tab, pszFID, format, nSRSDimension, geometry_precision); break; default: msSetError(MS_IOERR, "Unsupported GML format.", "gmlWriteGeometry()"); } return (MS_FAILURE); } /* ** GML specific metadata handling functions. */ int msItemInGroups(const char *name, gmlGroupListObj *groupList) { int i, j; gmlGroupObj *group; if (!groupList) return MS_FALSE; /* no groups */ for (i = 0; i < groupList->numgroups; i++) { group = &(groupList->groups[i]); for (j = 0; j < group->numitems; j++) { if (strcasecmp(name, group->items[j]) == 0) return MS_TRUE; } } return MS_FALSE; } static int msGMLGeometryLookup(gmlGeometryListObj *geometryList, const char *type) { int i; if (!geometryList || !type) return -1; /* nothing to look for */ for (i = 0; i < geometryList->numgeometries; i++) if (geometryList->geometries[i].type && (strcasecmp(geometryList->geometries[i].type, type) == 0)) return i; if (geometryList->numgeometries == 1 && geometryList->geometries[0].type == NULL) return 0; return -1; /* not found */ } gmlGeometryListObj *msGMLGetGeometries(layerObj *layer, const char *metadata_namespaces, int bWithDefaultGeom) { int i; const char *value = NULL; char tag[64]; char **names = NULL; int numnames = 0; gmlGeometryListObj *geometryList = NULL; gmlGeometryObj *geometry = NULL; /* allocate memory and initialize the item collection */ geometryList = (gmlGeometryListObj *)malloc(sizeof(gmlGeometryListObj)); MS_CHECK_ALLOC(geometryList, sizeof(gmlGeometryListObj), NULL); geometryList->geometries = NULL; geometryList->numgeometries = 0; if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "geometries")) != NULL) { names = msStringSplit(value, ',', &numnames); /* allocation an array of gmlGeometryObj's */ geometryList->numgeometries = numnames; geometryList->geometries = (gmlGeometryObj *)malloc( sizeof(gmlGeometryObj) * geometryList->numgeometries); if (geometryList->geometries == NULL) { msSetError( MS_MEMERR, "Out of memory allocating %u bytes.\n", "msGMLGetGeometries()", (unsigned int)(sizeof(gmlGeometryObj) * geometryList->numgeometries)); free(geometryList); return NULL; } for (i = 0; i < geometryList->numgeometries; i++) { geometry = &(geometryList->geometries[i]); geometry->name = msStrdup(names[i]); /* initialize a few things */ geometry->type = NULL; geometry->occurmin = 0; geometry->occurmax = 1; snprintf(tag, 64, "%s_type", names[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) geometry->type = msStrdup(value); /* TODO: validate input value */ snprintf(tag, 64, "%s_occurances", names[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) { char **occur; int numoccur; occur = msStringSplit(value, ',', &numoccur); if (numoccur == 2) { /* continue (TODO: throw an error if != 2) */ geometry->occurmin = atof(occur[0]); if (strcasecmp(occur[1], "UNBOUNDED") == 0) geometry->occurmax = OWS_GML_OCCUR_UNBOUNDED; else geometry->occurmax = atof(occur[1]); } msFreeCharArray(occur, numoccur); } } msFreeCharArray(names, numnames); } else if (bWithDefaultGeom) { geometryList->numgeometries = 1; geometryList->geometries = (gmlGeometryObj *)calloc(1, sizeof(gmlGeometryObj)); geometryList->geometries[0].name = msStrdup(OWS_GML_DEFAULT_GEOMETRY_NAME); geometryList->geometries[0].type = NULL; geometryList->geometries[0].occurmin = 0; geometryList->geometries[0].occurmax = 1; } return geometryList; } void msGMLFreeGeometries(gmlGeometryListObj *geometryList) { int i; if (!geometryList) return; for (i = 0; i < geometryList->numgeometries; i++) { msFree(geometryList->geometries[i].name); msFree(geometryList->geometries[i].type); } free(geometryList->geometries); free(geometryList); } static void msGMLWriteItem(FILE *stream, gmlItemObj *item, const char *value, const char *namespace, const char *tab, OWSGMLVersion outputformat, const char *pszFID) { char *encoded_value = NULL, *tag_name; int add_namespace = MS_TRUE; char gmlid[256]; gmlid[0] = 0; if (!stream || !item) return; if (!item->visible) return; if (!namespace) add_namespace = MS_FALSE; if (item->alias) tag_name = item->alias; else tag_name = item->name; if (strchr(tag_name, ':') != NULL) add_namespace = MS_FALSE; if (item->type && (EQUAL(item->type, "Date") || EQUAL(item->type, "DateTime") || EQUAL(item->type, "Time"))) { struct tm tm; if (msParseTime(value, &tm) == MS_TRUE) { const char *pszStartTag = ""; const char *pszEndTag = ""; encoded_value = (char *)msSmallMalloc(256); if (outputformat == OWS_GML32) { if (pszFID != NULL) snprintf(gmlid, 256, " gml:id=\"%s.%s\"", pszFID, tag_name); pszStartTag = ""; pszEndTag = ""; } if (EQUAL(item->type, "Date")) snprintf(encoded_value, 256, "%s%04d-%02d-%02d%s", pszStartTag, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, pszEndTag); else if (EQUAL(item->type, "Time")) snprintf(encoded_value, 256, "%s%02d:%02d:%02dZ%s", pszStartTag, tm.tm_hour, tm.tm_min, tm.tm_sec, pszEndTag); else { // Detected date time already formatted as YYYY-MM-DDTHH:mm:SS+ab:cd // because msParseTime() can't handle time zones. if (strlen(value) == 4 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 + 1 + 2 && value[4] == '-' && value[7] == '-' && value[10] == 'T' && value[13] == ':' && value[16] == ':' && (value[19] == '+' || value[19] == '-') && value[22] == ':') { snprintf(encoded_value, 256, "%s%s%s", pszStartTag, value, pszEndTag); } else { snprintf(encoded_value, 256, "%s%04d-%02d-%02dT%02d:%02d:%02dZ%s", pszStartTag, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, pszEndTag); } } } } if (encoded_value == NULL) { if (item->encode == MS_TRUE) encoded_value = msEncodeHTMLEntities(value); else encoded_value = msStrdup(value); } if (!item->template) { /* build the tag from pieces */ if (add_namespace == MS_TRUE && msIsXMLTagValid(tag_name) == MS_FALSE) msIO_fprintf(stream, "\n", tag_name); if (add_namespace == MS_TRUE) msIO_fprintf(stream, "%s<%s:%s%s>%s\n", tab, namespace, tag_name, gmlid, encoded_value, namespace, tag_name); else msIO_fprintf(stream, "%s<%s%s>%s\n", tab, tag_name, gmlid, encoded_value, tag_name); } else { char *tag = NULL; tag = msStrdup(item->template); tag = msReplaceSubstring(tag, "$value", encoded_value); if (namespace) tag = msReplaceSubstring(tag, "$namespace", namespace); msIO_fprintf(stream, "%s%s\n", tab, tag); free(tag); } free(encoded_value); return; } gmlNamespaceListObj *msGMLGetNamespaces(webObj *web, const char *metadata_namespaces) { int i; const char *value = NULL; char tag[64]; char **prefixes = NULL; int numprefixes = 0; gmlNamespaceListObj *namespaceList = NULL; gmlNamespaceObj *namespace = NULL; /* allocate the collection */ namespaceList = (gmlNamespaceListObj *)malloc(sizeof(gmlNamespaceListObj)); MS_CHECK_ALLOC(namespaceList, sizeof(gmlNamespaceListObj), NULL); namespaceList->namespaces = NULL; namespaceList->numnamespaces = 0; /* list of namespaces (TODO: make this automatic by parsing metadata) */ if ((value = msOWSLookupMetadata(&(web->metadata), metadata_namespaces, "external_namespace_prefixes")) != NULL) { prefixes = msStringSplit(value, ',', &numprefixes); /* allocation an array of gmlNamespaceObj's */ namespaceList->numnamespaces = numprefixes; namespaceList->namespaces = (gmlNamespaceObj *)malloc( sizeof(gmlNamespaceObj) * namespaceList->numnamespaces); if (namespaceList->namespaces == NULL) { msSetError(MS_MEMERR, "Out of memory allocating %u bytes.\n", "msGMLGetNamespaces()", (unsigned int)(sizeof(gmlNamespaceObj) * namespaceList->numnamespaces)); free(namespaceList); return NULL; } for (i = 0; i < namespaceList->numnamespaces; i++) { namespace = &(namespaceList->namespaces[i]); namespace->prefix = msStrdup(prefixes[i]); /* initialize a few things */ namespace->uri = NULL; namespace->schemalocation = NULL; snprintf(tag, 64, "%s_uri", namespace->prefix); if ((value = msOWSLookupMetadata(&(web->metadata), metadata_namespaces, tag)) != NULL) namespace->uri = msStrdup(value); snprintf(tag, 64, "%s_schema_location", namespace->prefix); if ((value = msOWSLookupMetadata(&(web->metadata), metadata_namespaces, tag)) != NULL) namespace->schemalocation = msStrdup(value); } msFreeCharArray(prefixes, numprefixes); } return namespaceList; } void msGMLFreeNamespaces(gmlNamespaceListObj *namespaceList) { int i; if (!namespaceList) return; for (i = 0; i < namespaceList->numnamespaces; i++) { msFree(namespaceList->namespaces[i].prefix); msFree(namespaceList->namespaces[i].uri); msFree(namespaceList->namespaces[i].schemalocation); } free(namespaceList); } gmlConstantListObj *msGMLGetConstants(layerObj *layer, const char *metadata_namespaces) { int i; const char *value = NULL; char tag[64]; char **names = NULL; int numnames = 0; gmlConstantListObj *constantList = NULL; gmlConstantObj *constant = NULL; /* allocate the collection */ constantList = (gmlConstantListObj *)malloc(sizeof(gmlConstantListObj)); MS_CHECK_ALLOC(constantList, sizeof(gmlConstantListObj), NULL); constantList->constants = NULL; constantList->numconstants = 0; /* list of constants (TODO: make this automatic by parsing metadata) */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "constants")) != NULL) { names = msStringSplit(value, ',', &numnames); /* allocation an array of gmlConstantObj's */ constantList->numconstants = numnames; constantList->constants = (gmlConstantObj *)malloc( sizeof(gmlConstantObj) * constantList->numconstants); if (constantList->constants == NULL) { msSetError( MS_MEMERR, "Out of memory allocating %u bytes.\n", "msGMLGetConstants()", (unsigned int)(sizeof(gmlConstantObj) * constantList->numconstants)); free(constantList); return NULL; } for (i = 0; i < constantList->numconstants; i++) { constant = &(constantList->constants[i]); constant->name = msStrdup(names[i]); /* initialize a few things */ constant->value = NULL; constant->type = NULL; snprintf(tag, 64, "%s_value", constant->name); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) constant->value = msStrdup(value); snprintf(tag, 64, "%s_type", constant->name); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) constant->type = msStrdup(value); } msFreeCharArray(names, numnames); } return constantList; } void msGMLFreeConstants(gmlConstantListObj *constantList) { int i; if (!constantList) return; for (i = 0; i < constantList->numconstants; i++) { msFree(constantList->constants[i].name); msFree(constantList->constants[i].value); msFree(constantList->constants[i].type); } free(constantList); } static void msGMLWriteConstant(FILE *stream, gmlConstantObj *constant, const char *namespace, const char *tab) { int add_namespace = MS_TRUE; if (!stream || !constant) return; if (!constant->value) return; if (!namespace) add_namespace = MS_FALSE; if (strchr(constant->name, ':') != NULL) add_namespace = MS_FALSE; if (add_namespace == MS_TRUE && msIsXMLTagValid(constant->name) == MS_FALSE) msIO_fprintf( stream, "\n", constant->name); if (add_namespace == MS_TRUE) msIO_fprintf(stream, "%s<%s:%s>%s\n", tab, namespace, constant->name, constant->value, namespace, constant->name); else msIO_fprintf(stream, "%s<%s>%s\n", tab, constant->name, constant->value, constant->name); return; } static void msGMLWriteGroup(FILE *stream, gmlGroupObj *group, shapeObj *shape, gmlItemListObj *itemList, gmlConstantListObj *constantList, const char *namespace, const char *tab, OWSGMLVersion outputformat, const char *pszFID) { int i, j; int add_namespace = MS_TRUE; char *itemtab; gmlItemObj *item = NULL; gmlConstantObj *constant = NULL; if (!stream || !group) return; /* setup the item/constant tab */ itemtab = (char *)msSmallMalloc(sizeof(char) * strlen(tab) + 3); sprintf(itemtab, "%s ", tab); if (!namespace || strchr(group->name, ':') != NULL) add_namespace = MS_FALSE; /* start the group */ if (add_namespace == MS_TRUE) msIO_fprintf(stream, "%s<%s:%s>\n", tab, namespace, group->name); else msIO_fprintf(stream, "%s<%s>\n", tab, group->name); /* now the items/constants in the group */ for (i = 0; i < group->numitems; i++) { for (j = 0; j < constantList->numconstants; j++) { constant = &(constantList->constants[j]); if (strcasecmp(constant->name, group->items[i]) == 0) { msGMLWriteConstant(stream, constant, namespace, itemtab); break; } } if (j != constantList->numconstants) continue; /* found this one */ for (j = 0; j < itemList->numitems; j++) { item = &(itemList->items[j]); if (strcasecmp(item->name, group->items[i]) == 0) { /* the number of items matches the number of values exactly */ msGMLWriteItem(stream, item, shape->values[j], namespace, itemtab, outputformat, pszFID); break; } } } /* end the group */ if (add_namespace == MS_TRUE) msIO_fprintf(stream, "%s\n", tab, namespace, group->name); else msIO_fprintf(stream, "%s\n", tab, group->name); msFree(itemtab); return; } #endif gmlGroupListObj *msGMLGetGroups(layerObj *layer, const char *metadata_namespaces) { int i; const char *value = NULL; char tag[64]; char **names = NULL; int numnames = 0; gmlGroupListObj *groupList = NULL; gmlGroupObj *group = NULL; /* allocate the collection */ groupList = (gmlGroupListObj *)malloc(sizeof(gmlGroupListObj)); MS_CHECK_ALLOC(groupList, sizeof(gmlGroupListObj), NULL); groupList->groups = NULL; groupList->numgroups = 0; /* list of groups (TODO: make this automatic by parsing metadata) */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "groups")) != NULL && value[0] != '\0') { names = msStringSplit(value, ',', &numnames); /* allocation an array of gmlGroupObj's */ groupList->numgroups = numnames; groupList->groups = (gmlGroupObj *)malloc(sizeof(gmlGroupObj) * groupList->numgroups); if (groupList->groups == NULL) { msSetError(MS_MEMERR, "Out of memory allocating %u bytes.\n", "msGMLGetGroups()", (unsigned int)(sizeof(gmlGroupObj) * groupList->numgroups)); free(groupList); return NULL; } for (i = 0; i < groupList->numgroups; i++) { group = &(groupList->groups[i]); group->name = msStrdup(names[i]); /* initialize a few things */ group->items = NULL; group->numitems = 0; group->type = NULL; snprintf(tag, 64, "%s_group", group->name); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) group->items = msStringSplit(value, ',', &group->numitems); snprintf(tag, 64, "%s_type", group->name); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) group->type = msStrdup(value); } msFreeCharArray(names, numnames); } return groupList; } void msGMLFreeGroups(gmlGroupListObj *groupList) { int i; if (!groupList) return; for (i = 0; i < groupList->numgroups; i++) { msFree(groupList->groups[i].name); msFreeCharArray(groupList->groups[i].items, groupList->groups[i].numitems); msFree(groupList->groups[i].type); } msFree(groupList->groups); free(groupList); } /* Dump GML query results for WMS GetFeatureInfo */ int msGMLWriteQuery(mapObj *map, char *filename, const char *namespaces) { #if defined(USE_WMS_SVR) int status; int i, j, k; layerObj *lp = NULL; shapeObj shape; FILE *stream_to_free = NULL; FILE *stream = stdout; /* defaults to stdout */ char szPath[MS_MAXPATHLEN]; char *value; char *pszMapSRS = NULL; gmlGroupListObj *groupList = NULL; gmlItemListObj *itemList = NULL; gmlConstantListObj *constantList = NULL; gmlGeometryListObj *geometryList = NULL; gmlItemObj *item = NULL; gmlConstantObj *constant = NULL; msInitShape(&shape); if (filename && strlen(filename) > 0) { /* deal with the filename if present */ stream_to_free = fopen(msBuildPath(szPath, map->mappath, filename), "w"); if (!stream_to_free) { msSetError(MS_IOERR, "(%s)", "msGMLWriteQuery()", filename); return (MS_FAILURE); } stream = stream_to_free; } msIO_fprintf(stream, "\n\n"); msOWSPrintValidateMetadata(stream, &(map->web.metadata), namespaces, "rootname", OWS_NOERR, "<%s ", "msGMLOutput"); msOWSPrintEncodeMetadata(stream, &(map->web.metadata), namespaces, "uri", OWS_NOERR, "xmlns=\"%s\"", NULL); msIO_fprintf(stream, "\n\t xmlns:gml=\"http://www.opengis.net/gml\""); msIO_fprintf(stream, "\n\t xmlns:xlink=\"http://www.w3.org/1999/xlink\""); msIO_fprintf(stream, "\n\t xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""); msOWSPrintEncodeMetadata(stream, &(map->web.metadata), namespaces, "schema", OWS_NOERR, "\n\t xsi:schemaLocation=\"%s\"", NULL); msIO_fprintf(stream, ">\n"); /* a schema *should* be required */ msOWSPrintEncodeMetadata(stream, &(map->web.metadata), namespaces, "description", OWS_NOERR, "\t%s\n", NULL); /* Look up map SRS. We need an EPSG code for GML, if not then we get null and * we'll fall back on the layer's SRS */ msOWSGetEPSGProj(&(map->projection), NULL, namespaces, MS_TRUE, &pszMapSRS); /* step through the layers looking for query results */ for (i = 0; i < map->numlayers; i++) { char *pszOutputSRS = NULL; int nSRSDimension = 2; const char *geomtype; lp = (GET_LAYER(map, map->layerorder[i])); if (lp->resultcache && lp->resultcache->numresults > 0) { /* found results */ reprojectionObj *reprojector = NULL; /* Determine output SRS, if map has none, then try using layer's native * SRS */ if ((pszOutputSRS = pszMapSRS) == NULL) { msOWSGetEPSGProj(&(lp->projection), NULL, namespaces, MS_TRUE, &pszOutputSRS); if (pszOutputSRS == NULL) { msSetError( MS_WMSERR, "No valid EPSG code in map or layer projection for GML output", "msGMLWriteQuery()"); continue; /* No EPSG code, cannot output this layer */ } } /* start this collection (layer) */ /* if no layer name provided fall back on the layer name + "_layer" */ value = (char *)msSmallMalloc(strlen(lp->name) + 7); sprintf(value, "%s_layer", lp->name); msOWSPrintValidateMetadata(stream, &(lp->metadata), namespaces, "layername", OWS_NOERR, "\t<%s>\n", value); msFree(value); value = (char *)msOWSLookupMetadata(&(lp->metadata), "OM", "title"); if (value) { msOWSPrintEncodeMetadata(stream, &(lp->metadata), namespaces, "title", OWS_NOERR, "\t%s\n", value); } geomtype = msOWSLookupMetadata(&(lp->metadata), "OFG", "geomtype"); if (geomtype != NULL && (strstr(geomtype, "25d") != NULL || strstr(geomtype, "25D") != NULL)) { nSRSDimension = 3; } /* populate item and group metadata structures */ itemList = msGMLGetItems(lp, namespaces); constantList = msGMLGetConstants(lp, namespaces); groupList = msGMLGetGroups(lp, namespaces); geometryList = msGMLGetGeometries(lp, namespaces, MS_FALSE); if (itemList == NULL || constantList == NULL || groupList == NULL || geometryList == NULL) { msSetError(MS_MISCERR, "Unable to populate item and group metadata structures", "msGMLWriteQuery()"); if (stream_to_free != NULL) fclose(stream_to_free); return MS_FAILURE; } if (pszOutputSRS == pszMapSRS && msProjectionsDiffer(&(lp->projection), &(map->projection))) { reprojector = msProjectCreateReprojector(&(lp->projection), &(map->projection)); if (reprojector == NULL) { msGMLFreeGroups(groupList); msGMLFreeConstants(constantList); msGMLFreeItems(itemList); msGMLFreeGeometries(geometryList); msFree(pszOutputSRS); if (stream_to_free != NULL) fclose(stream_to_free); return MS_FAILURE; } } for (j = 0; j < lp->resultcache->numresults; j++) { status = msLayerGetShape(lp, &shape, &(lp->resultcache->results[j])); if (status != MS_SUCCESS) { msGMLFreeGroups(groupList); msGMLFreeConstants(constantList); msGMLFreeItems(itemList); msGMLFreeGeometries(geometryList); msProjectDestroyReprojector(reprojector); msFree(pszOutputSRS); if (stream_to_free != NULL) fclose(stream_to_free); return MS_FAILURE; } /* project the shape into the map projection (if necessary), note that * this projects the bounds as well */ if (reprojector) { status = msProjectShapeEx(reprojector, &shape); if (status != MS_SUCCESS) { msIO_fprintf(stream, "\n", msGetErrorString(",")); msFreeShape(&shape); continue; } } /* start this feature */ /* specify a feature name, if nothing provided fall back on the layer * name + "_feature" */ value = (char *)msSmallMalloc(strlen(lp->name) + 9); sprintf(value, "%s_feature", lp->name); msOWSPrintValidateMetadata(stream, &(lp->metadata), namespaces, "featurename", OWS_NOERR, "\t\t<%s>\n", value); msFree(value); /* Write the feature geometry and bounding box unless 'none' was * requested. */ /* Default to bbox only if nothing specified and output full geometry * only if explicitly requested */ if (!(geometryList && geometryList->numgeometries == 1 && strcasecmp(geometryList->geometries[0].name, "none") == 0)) { gmlWriteBounds(stream, OWS_GML2, &(shape.bounds), pszOutputSRS, "\t\t\t", "gml"); if (geometryList && geometryList->numgeometries > 0) gmlWriteGeometry(stream, geometryList, OWS_GML2, &(shape), pszOutputSRS, NULL, "\t\t\t", "", nSRSDimension, 6); } /* write any item/values */ for (k = 0; k < itemList->numitems; k++) { item = &(itemList->items[k]); if (msItemInGroups(item->name, groupList) == MS_FALSE) msGMLWriteItem(stream, item, shape.values[k], NULL, "\t\t\t", OWS_GML2, NULL); } /* write any constants */ for (k = 0; k < constantList->numconstants; k++) { constant = &(constantList->constants[k]); if (msItemInGroups(constant->name, groupList) == MS_FALSE) msGMLWriteConstant(stream, constant, NULL, "\t\t\t"); } /* write any groups */ for (k = 0; k < groupList->numgroups; k++) msGMLWriteGroup(stream, &(groupList->groups[k]), &shape, itemList, constantList, NULL, "\t\t\t", OWS_GML2, NULL); /* end this feature */ /* specify a feature name if nothing provided */ /* fall back on the layer name + "Feature" */ value = (char *)msSmallMalloc(strlen(lp->name) + 9); sprintf(value, "%s_feature", lp->name); msOWSPrintValidateMetadata(stream, &(lp->metadata), namespaces, "featurename", OWS_NOERR, "\t\t\n", value); msFree(value); msFreeShape(&shape); /* init too */ } msProjectDestroyReprojector(reprojector); /* end this collection (layer) */ /* if no layer name provided fall back on the layer name + "_layer" */ value = (char *)msSmallMalloc(strlen(lp->name) + 7); sprintf(value, "%s_layer", lp->name); msOWSPrintValidateMetadata(stream, &(lp->metadata), namespaces, "layername", OWS_NOERR, "\t\n", value); msFree(value); msGMLFreeGroups(groupList); msGMLFreeConstants(constantList); msGMLFreeItems(itemList); msGMLFreeGeometries(geometryList); /* msLayerClose(lp); */ } if (pszOutputSRS != pszMapSRS) { msFree(pszOutputSRS); } } /* next layer */ /* end this document */ msOWSPrintValidateMetadata(stream, &(map->web.metadata), namespaces, "rootname", OWS_NOERR, "\n", "msGMLOutput"); if (stream_to_free != NULL) fclose(stream_to_free); msFree(pszMapSRS); return (MS_SUCCESS); #else /* Stub for mapscript */ msSetError(MS_MISCERR, "WMS server support not enabled", "msGMLWriteQuery()"); return MS_FAILURE; #endif } #ifdef USE_WFS_SVR void msGMLWriteWFSBounds(mapObj *map, FILE *stream, const char *tab, OWSGMLVersion outputformat, int nWFSVersion, int bUseURN) { rectObj resultBounds = {-1.0, -1.0, -1.0, -1.0}; /*add a check to see if the map projection is set to be north-east*/ int bSwapAxis = msIsAxisInvertedProj(&(map->projection)); /* Need to start with BBOX of the whole resultset */ if (msGetQueryResultBounds(map, &resultBounds) > 0) { char *srs = NULL; if (bSwapAxis) { double tmp; tmp = resultBounds.minx; resultBounds.minx = resultBounds.miny; resultBounds.miny = tmp; tmp = resultBounds.maxx; resultBounds.maxx = resultBounds.maxy; resultBounds.maxy = tmp; } if (bUseURN) { srs = msOWSGetProjURN(&(map->projection), NULL, "FGO", MS_TRUE); if (!srs) srs = msOWSGetProjURN(&(map->projection), &(map->web.metadata), "FGO", MS_TRUE); } else { msOWSGetEPSGProj(&(map->projection), NULL, "FGO", MS_TRUE, &srs); if (!srs) msOWSGetEPSGProj(&(map->projection), &(map->web.metadata), "FGO", MS_TRUE, &srs); } gmlWriteBounds(stream, outputformat, &resultBounds, srs, tab, (nWFSVersion == OWS_2_0_0) ? "wfs" : "gml"); msFree(srs); } } #endif /* ** msGMLWriteWFSQuery() ** ** Similar to msGMLWriteQuery() but tuned for use with WFS */ int msGMLWriteWFSQuery(mapObj *map, FILE *stream, const char *default_namespace_prefix, OWSGMLVersion outputformat, int nWFSVersion, int bUseURN, int bGetPropertyValueRequest) { #ifdef USE_WFS_SVR int status; int i, j, k; layerObj *lp = NULL; shapeObj shape; gmlGroupListObj *groupList = NULL; gmlItemListObj *itemList = NULL; gmlConstantListObj *constantList = NULL; gmlGeometryListObj *geometryList = NULL; gmlItemObj *item = NULL; gmlConstantObj *constant = NULL; const char *namespace_prefix = NULL; int bSwapAxis; msInitShape(&shape); /*add a check to see if the map projection is set to be north-east*/ bSwapAxis = msIsAxisInvertedProj(&(map->projection)); /* Need to start with BBOX of the whole resultset */ if (!bGetPropertyValueRequest) { msGMLWriteWFSBounds(map, stream, " ", outputformat, nWFSVersion, bUseURN); } /* step through the layers looking for query results */ for (i = 0; i < map->numlayers; i++) { lp = GET_LAYER(map, map->layerorder[i]); if (lp->resultcache && lp->resultcache->numresults > 0) { /* found results */ char *layerName; const char *value; int featureIdIndex = -1; /* no feature id */ char *srs = NULL; int bOutputGMLIdOnly = MS_FALSE; int nSRSDimension = 2; const char *geomtype; reprojectionObj *reprojector = NULL; int geometry_precision = 6; /* setup namespace, a layer can override the default */ namespace_prefix = msOWSLookupMetadata(&(lp->metadata), "OFG", "namespace_prefix"); if (!namespace_prefix) namespace_prefix = default_namespace_prefix; geomtype = msOWSLookupMetadata(&(lp->metadata), "OFG", "geomtype"); if (geomtype != NULL && (strstr(geomtype, "25d") != NULL || strstr(geomtype, "25D") != NULL)) { nSRSDimension = 3; } value = msOWSLookupMetadata(&(lp->metadata), "OFG", "featureid"); if (value) { /* find the featureid amongst the items for this layer */ for (j = 0; j < lp->numitems; j++) { if (strcasecmp(lp->items[j], value) == 0) { /* found it */ featureIdIndex = j; break; } } /* Produce a warning if a featureid was set but the corresponding item * is not found. */ if (featureIdIndex == -1) msIO_fprintf(stream, "\n", value, lp->name); } else if (outputformat == OWS_GML32) msIO_fprintf(stream, "\n", lp->name); /* populate item and group metadata structures */ itemList = msGMLGetItems(lp, "G"); constantList = msGMLGetConstants(lp, "G"); groupList = msGMLGetGroups(lp, "G"); geometryList = msGMLGetGeometries(lp, "GFO", MS_FALSE); if (itemList == NULL || constantList == NULL || groupList == NULL || geometryList == NULL) { msSetError(MS_MISCERR, "Unable to populate item and group metadata structures", "msGMLWriteWFSQuery()"); return MS_FAILURE; } if (bGetPropertyValueRequest) { const char *value = msOWSLookupMetadata(&(lp->metadata), "G", "include_items"); if (value != NULL && strcmp(value, "@gml:id") == 0) bOutputGMLIdOnly = MS_TRUE; } if (namespace_prefix) { layerName = (char *)msSmallMalloc(strlen(namespace_prefix) + strlen(lp->name) + 2); sprintf(layerName, "%s:%s", namespace_prefix, lp->name); } else { layerName = msStrdup(lp->name); } if (bUseURN) { srs = msOWSGetProjURN(&(map->projection), NULL, "FGO", MS_TRUE); if (!srs) srs = msOWSGetProjURN(&(map->projection), &(map->web.metadata), "FGO", MS_TRUE); if (!srs) srs = msOWSGetProjURN(&(lp->projection), &(lp->metadata), "FGO", MS_TRUE); } else { msOWSGetEPSGProj(&(map->projection), NULL, "FGO", MS_TRUE, &srs); if (!srs) msOWSGetEPSGProj(&(map->projection), &(map->web.metadata), "FGO", MS_TRUE, &srs); if (!srs) msOWSGetEPSGProj(&(lp->projection), &(lp->metadata), "FGO", MS_TRUE, &srs); } if (msProjectionsDiffer(&(lp->projection), &(map->projection))) { reprojector = msProjectCreateReprojector(&(lp->projection), &(map->projection)); if (reprojector == NULL) { msGMLFreeGroups(groupList); msGMLFreeConstants(constantList); msGMLFreeItems(itemList); msGMLFreeGeometries(geometryList); msFree(layerName); msFree(srs); return MS_FAILURE; } } for (j = 0; j < lp->resultcache->numresults; j++) { char *pszFID; if (lp->resultcache->results[j].shape) { /* msDebug("Using cached shape %ld\n", * lp->resultcache->results[j].shapeindex); */ msCopyShape(lp->resultcache->results[j].shape, &shape); } else { status = msLayerGetShape(lp, &shape, &(lp->resultcache->results[j])); if (status != MS_SUCCESS) { msGMLFreeGroups(groupList); msGMLFreeConstants(constantList); msGMLFreeItems(itemList); msGMLFreeGeometries(geometryList); msFree(layerName); msProjectDestroyReprojector(reprojector); msFree(srs); return (status); } } /* project the shape into the map projection (if necessary), note that * this projects the bounds as well */ if (reprojector) msProjectShapeEx(reprojector, &shape); if (featureIdIndex != -1) { pszFID = (char *)msSmallMalloc( strlen(lp->name) + 1 + strlen(shape.values[featureIdIndex]) + 1); sprintf(pszFID, "%s.%s", lp->name, shape.values[featureIdIndex]); } else pszFID = msStrdup(""); if (bOutputGMLIdOnly) { msIO_fprintf(stream, " %s\n", pszFID); msFree(pszFID); msFreeShape(&shape); /* init too */ continue; } /* ** start this feature */ if (nWFSVersion == OWS_2_0_0) msIO_fprintf(stream, " \n"); else msIO_fprintf(stream, " \n"); if (msIsXMLTagValid(layerName) == MS_FALSE) msIO_fprintf(stream, "\n", layerName); if (featureIdIndex != -1) { if (!bGetPropertyValueRequest) { if (outputformat == OWS_GML2) msIO_fprintf(stream, " <%s fid=\"%s\">\n", layerName, pszFID); else /* OWS_GML3 or OWS_GML32 */ msIO_fprintf(stream, " <%s gml:id=\"%s\">\n", layerName, pszFID); } } else { if (!bGetPropertyValueRequest) msIO_fprintf(stream, " <%s>\n", layerName); } if (bSwapAxis) msAxisSwapShape(&shape); /* write the feature geometry and bounding box */ if (!(geometryList && geometryList->numgeometries == 1 && strcasecmp(geometryList->geometries[0].name, "none") == 0)) { if (!bGetPropertyValueRequest) gmlWriteBounds(stream, outputformat, &(shape.bounds), srs, " ", "gml"); if (msOWSLookupMetadata(&(lp->metadata), "F", "geometry_precision")) { geometry_precision = atoi(msOWSLookupMetadata( &(lp->metadata), "F", "geometry_precision")); } else if (msOWSLookupMetadata(&map->web.metadata, "F", "geometry_precision")) { geometry_precision = atoi(msOWSLookupMetadata( &map->web.metadata, "F", "geometry_precision")); } gmlWriteGeometry(stream, geometryList, outputformat, &(shape), srs, namespace_prefix, " ", pszFID, nSRSDimension, geometry_precision); } /* write any item/values */ for (k = 0; k < itemList->numitems; k++) { item = &(itemList->items[k]); if (msItemInGroups(item->name, groupList) == MS_FALSE) msGMLWriteItem(stream, item, shape.values[k], namespace_prefix, " ", outputformat, pszFID); } /* write any constants */ for (k = 0; k < constantList->numconstants; k++) { constant = &(constantList->constants[k]); if (msItemInGroups(constant->name, groupList) == MS_FALSE) msGMLWriteConstant(stream, constant, namespace_prefix, " "); } /* write any groups */ for (k = 0; k < groupList->numgroups; k++) msGMLWriteGroup(stream, &(groupList->groups[k]), &shape, itemList, constantList, namespace_prefix, " ", outputformat, pszFID); if (!bGetPropertyValueRequest) /* end this feature */ msIO_fprintf(stream, " \n", layerName); if (nWFSVersion == OWS_2_0_0) msIO_fprintf(stream, " \n"); else msIO_fprintf(stream, " \n"); msFree(pszFID); pszFID = NULL; msFreeShape(&shape); /* init too */ } msProjectDestroyReprojector(reprojector); msFree(srs); /* done with this layer, do a little clean-up */ msFree(layerName); msGMLFreeGroups(groupList); msGMLFreeConstants(constantList); msGMLFreeItems(itemList); msGMLFreeGeometries(geometryList); /* msLayerClose(lp); */ } } /* next layer */ return (MS_SUCCESS); #else /* Stub for mapscript */ (void)map; (void)stream; (void)default_namespace_prefix; (void)outputformat; (void)nWFSVersion; (void)bUseURN; (void)bGetPropertyValueRequest; msSetError(MS_MISCERR, "WFS server support not enabled", "msGMLWriteWFSQuery()"); return MS_FAILURE; #endif /* USE_WFS_SVR */ } #ifdef USE_LIBXML2 /** * msGML3BoundedBy() * * returns an object of BoundedBy as per GML 3 * * @param xmlNsPtr psNs the namespace object * @param minx minx * @param miny miny * @param maxx maxx * @param mayy mayy * @param psEpsg epsg code * @param dimension number of dimensions * * @return psNode xmlNodePtr of XML construct * */ xmlNodePtr msGML3BoundedBy(xmlNsPtr psNs, double minx, double miny, double maxx, double maxy, const char *psEpsg) { xmlNodePtr psNode = NULL, psSubNode = NULL; char *pszTmp = NULL; char *pszTmp2 = NULL; char *pszEpsg = NULL; psNode = xmlNewNode(psNs, BAD_CAST "boundedBy"); psSubNode = xmlNewChild(psNode, NULL, BAD_CAST "Envelope", NULL); if (psEpsg) { const size_t bufferSize = strlen(psEpsg) + 1; pszEpsg = (char *)msSmallMalloc(bufferSize); snprintf(pszEpsg, bufferSize, "%s", psEpsg); msStringToLower(pszEpsg); pszTmp = msStringConcatenate(pszTmp, "urn:ogc:crs:"); pszTmp = msStringConcatenate(pszTmp, pszEpsg); xmlNewProp(psSubNode, BAD_CAST "srsName", BAD_CAST pszTmp); free(pszEpsg); free(pszTmp); pszTmp = msIntToString(2); xmlNewProp(psSubNode, BAD_CAST "srsDimension", BAD_CAST pszTmp); free(pszTmp); } pszTmp = msDoubleToString(minx, MS_TRUE); pszTmp = msStringConcatenate(pszTmp, " "); pszTmp2 = msDoubleToString(miny, MS_TRUE); pszTmp = msStringConcatenate(pszTmp, pszTmp2); xmlNewChild(psSubNode, NULL, BAD_CAST "lowerCorner", BAD_CAST pszTmp); free(pszTmp); free(pszTmp2); pszTmp = msDoubleToString(maxx, MS_TRUE); pszTmp = msStringConcatenate(pszTmp, " "); pszTmp2 = msDoubleToString(maxy, MS_TRUE); pszTmp = msStringConcatenate(pszTmp, pszTmp2); xmlNewChild(psSubNode, NULL, BAD_CAST "upperCorner", BAD_CAST pszTmp); free(pszTmp); free(pszTmp2); return psNode; } /** *msGML3Point() * * returns an object of Point as per GML 3 * * @param xmlNsPtr psNs the gml namespace object * @param pszSrsName EPSG code of geometry * @param id * @param x x coordinate * @param y y coordinate * @param z z coordinate * * @return psNode xmlNodePtr of XML construct * */ xmlNodePtr msGML3Point(xmlNsPtr psNs, const char *psSrsName, const char *id, double x, double y) { xmlNodePtr psNode = xmlNewNode(psNs, BAD_CAST "Point"); if (id) { xmlNewNsProp(psNode, psNs, BAD_CAST "id", BAD_CAST id); } if (psSrsName) { const size_t bufferSize = strlen(psSrsName) + 1; char *pszSrsName = (char *)msSmallMalloc(bufferSize); snprintf(pszSrsName, bufferSize, "%s", psSrsName); msStringToLower(pszSrsName); char *pszTmp = NULL; pszTmp = msStringConcatenate(pszTmp, "urn:ogc:crs:"); pszTmp = msStringConcatenate(pszTmp, pszSrsName); xmlNewProp(psNode, BAD_CAST "srsName", BAD_CAST pszTmp); free(pszSrsName); free(pszTmp); const int dimension = 2; pszTmp = msIntToString(dimension); xmlNewProp(psNode, BAD_CAST "srsDimension", BAD_CAST pszTmp); free(pszTmp); } char *pszTmp = msDoubleToString(x, MS_TRUE); pszTmp = msStringConcatenate(pszTmp, " "); char *pszTmp2 = msDoubleToString(y, MS_TRUE); pszTmp = msStringConcatenate(pszTmp, pszTmp2); xmlNewChild(psNode, NULL, BAD_CAST "pos", BAD_CAST pszTmp); free(pszTmp); free(pszTmp2); return psNode; } /** * msGML3TimePeriod() * * returns an object of TimePeriod as per GML 3 * * @param xmlNsPtr psNs the gml namespace object * @param pszStart start time * @param pszEnd end time * * @return psNode xmlNodePtr of XML construct * */ xmlNodePtr msGML3TimePeriod(xmlNsPtr psNs, char *pszStart, char *pszEnd) { xmlNodePtr psNode = NULL; psNode = xmlNewNode(psNs, BAD_CAST "TimePeriod"); xmlNewChild(psNode, NULL, BAD_CAST "beginPosition", BAD_CAST pszStart); if (pszEnd) xmlNewChild(psNode, NULL, BAD_CAST "endPosition", BAD_CAST pszEnd); else { xmlNewChild(psNode, NULL, BAD_CAST "endPosition", NULL); xmlNewProp(psNode, BAD_CAST "indeterminatePosition", BAD_CAST "now"); } return psNode; } /** * msGML3TimeInstant() * * returns an object of TimeInstant as per GML 3 * * @param xmlNsPtr psNs the gml namespace object * @param timeInstant time instant * * @return psNode xmlNodePtr of XML construct * */ xmlNodePtr msGML3TimeInstant(xmlNsPtr psNs, char *pszTime) { xmlNodePtr psNode = NULL; psNode = xmlNewNode(psNs, BAD_CAST "TimeInstant"); xmlNewChild(psNode, NULL, BAD_CAST "timePosition", BAD_CAST pszTime); return psNode; } #endif /* USE_LIBXML2 */ /************************************************************************/ /* The following functions are enabled in all cases, even if */ /* WMS and WFS are not available. */ /************************************************************************/ gmlItemListObj *msGMLGetItems(layerObj *layer, const char *metadata_namespaces) { int i, j; char **xmlitems = NULL; int numxmlitems = 0; char **incitems = NULL; int numincitems = 0; char **excitems = NULL; int numexcitems = 0; char **optionalitems = NULL; int numoptionalitems = 0; char **mandatoryitems = NULL; int nummandatoryitems = 0; char **defaultitems = NULL; int numdefaultitems = 0; const char *value = NULL; char tag[64]; gmlItemListObj *itemList = NULL; gmlItemObj *item = NULL; /* get a list of items that might be included in output */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "include_items")) != NULL) incitems = msStringSplit(value, ',', &numincitems); /* get a list of items that should be excluded in output */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "exclude_items")) != NULL) excitems = msStringSplit(value, ',', &numexcitems); /* get a list of items that should not be XML encoded */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "xml_items")) != NULL) xmlitems = msStringSplit(value, ',', &numxmlitems); /* get a list of items that should be indicated as optional in * DescribeFeatureType */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "optional_items")) != NULL) optionalitems = msStringSplit(value, ',', &numoptionalitems); /* get a list of items that should be indicated as mandatory in * DescribeFeatureType */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "mandatory_items")) != NULL) mandatoryitems = msStringSplit(value, ',', &nummandatoryitems); /* get a list of items that should be presented by default in GetFeature */ if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, "default_items")) != NULL) defaultitems = msStringSplit(value, ',', &numdefaultitems); /* allocate memory and iinitialize the item collection */ itemList = (gmlItemListObj *)malloc(sizeof(gmlItemListObj)); if (itemList == NULL) { msSetError(MS_MEMERR, "Error allocating a collection GML item structures.", "msGMLGetItems()"); return NULL; } itemList->numitems = layer->numitems; itemList->items = (gmlItemObj *)malloc(sizeof(gmlItemObj) * itemList->numitems); if (!itemList->items) { msSetError(MS_MEMERR, "Error allocating a collection GML item structures.", "msGMLGetItems()"); free(itemList); return NULL; } for (i = 0; i < layer->numitems; i++) { item = &(itemList->items[i]); item->name = msStrdup(layer->items[i]); /* initialize the item */ item->alias = NULL; item->type = NULL; item->template = NULL; item->encode = MS_TRUE; item->visible = MS_FALSE; item->width = 0; item->precision = 0; item->outputByDefault = (numdefaultitems == 0); item->minOccurs = 0; /* check visibility, included items first... */ if (numincitems == 1 && strcasecmp("all", incitems[0]) == 0) { item->visible = MS_TRUE; } else { for (j = 0; j < numincitems; j++) { if (strcasecmp(layer->items[i], incitems[j]) == 0) item->visible = MS_TRUE; } } /* ...and now excluded items */ for (j = 0; j < numexcitems; j++) { if (strcasecmp(layer->items[i], excitems[j]) == 0) item->visible = MS_FALSE; } /* check encoding */ for (j = 0; j < numxmlitems; j++) { if (strcasecmp(layer->items[i], xmlitems[j]) == 0) item->encode = MS_FALSE; } /* check optional */ if (numoptionalitems == 1 && strcasecmp("all", optionalitems[0]) == 0) { item->minOccurs = 0; } else if (numoptionalitems > 0) { item->minOccurs = 1; for (j = 0; j < numoptionalitems; j++) { if (strcasecmp(layer->items[i], optionalitems[j]) == 0) item->minOccurs = 0; } } /* check mandatory */ if (nummandatoryitems == 1 && strcasecmp("all", mandatoryitems[0]) == 0) { item->minOccurs = 1; } else if (nummandatoryitems > 0) { item->minOccurs = 0; for (j = 0; j < nummandatoryitems; j++) { if (strcasecmp(layer->items[i], mandatoryitems[j]) == 0) item->minOccurs = 1; } } /* check default */ for (j = 0; j < numdefaultitems; j++) { if (strcasecmp(layer->items[i], defaultitems[j]) == 0) item->outputByDefault = 1; } snprintf(tag, sizeof(tag), "%s_alias", layer->items[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) item->alias = msStrdup(value); snprintf(tag, sizeof(tag), "%s_type", layer->items[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) item->type = msStrdup(value); snprintf(tag, sizeof(tag), "%s_template", layer->items[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) item->template = msStrdup(value); snprintf(tag, sizeof(tag), "%s_width", layer->items[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) item->width = atoi(value); snprintf(tag, sizeof(tag), "%s_precision", layer->items[i]); if ((value = msOWSLookupMetadata(&(layer->metadata), metadata_namespaces, tag)) != NULL) item->precision = atoi(value); } msFreeCharArray(incitems, numincitems); msFreeCharArray(excitems, numexcitems); msFreeCharArray(xmlitems, numxmlitems); msFreeCharArray(optionalitems, numoptionalitems); msFreeCharArray(mandatoryitems, nummandatoryitems); msFreeCharArray(defaultitems, numdefaultitems); return itemList; } void msGMLFreeItems(gmlItemListObj *itemList) { int i; if (!itemList) return; for (i = 0; i < itemList->numitems; i++) { msFree(itemList->items[i].name); msFree(itemList->items[i].alias); msFree(itemList->items[i].type); msFree(itemList->items[i].template); } if (itemList->items != NULL) free(itemList->items); free(itemList); } mapserver-8.6.0/src/mapgml.h000066400000000000000000000041051511405061000157370ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Headers for mapgml.c. shapeObj to GML output via MapServer * queries. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPGML_H #define MAPGML_H #ifdef USE_LIBXML2 #include #include xmlNodePtr msGML3BoundedBy(xmlNsPtr psNs, double minx, double miny, double maxx, double maxy, const char *psEpsg); xmlNodePtr msGML3TimePeriod(xmlNsPtr psNs, char *pszStart, char *pszEnd); xmlNodePtr msGML3TimeInstant(xmlNsPtr psNs, char *timeInstant); xmlNodePtr msGML3Point(xmlNsPtr psNs, const char *psSrsName, const char *id, double x, double y); #endif /* USE_LIBXML2 */ #endif mapserver-8.6.0/src/mapgraph.cpp000066400000000000000000000241421511405061000166170ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Functions for basic undirected, weighted graph support. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "mapgraph.h" #include // for std::swap graphObj *msCreateGraph(signed int numnodes) { graphObj *graph = nullptr; if (numnodes <= 0) return nullptr; graph = (graphObj *)malloc(sizeof(graphObj)); if (!graph) return nullptr; graph->head = (graphNodeObj **)calloc(numnodes, sizeof(graphNodeObj *)); if (!graph->head) { free(graph); return nullptr; } graph->numnodes = numnodes; return graph; } void msFreeGraph(graphObj *graph) { if (!graph) return; graphNodeObj *tmp = nullptr; for (int i = 0; i < graph->numnodes; i++) { while (graph->head[i] != nullptr) { tmp = graph->head[i]; graph->head[i] = graph->head[i]->next; free(tmp); } } free(graph->head); free(graph); } int msGraphAddEdge(graphObj *graph, int src, int dest, double weight) { graphNodeObj *node = nullptr; if (!graph) return MS_FAILURE; // src -> dest node = (graphNodeObj *)malloc(sizeof(graphNodeObj)); if (!node) return MS_FAILURE; node->dest = dest; node->weight = weight; node->next = graph->head[src]; graph->head[src] = node; // dest -> src node = (graphNodeObj *)malloc(sizeof(graphNodeObj)); if (!node) return MS_FAILURE; node->dest = src; node->weight = weight; node->next = graph->head[dest]; graph->head[dest] = node; return MS_SUCCESS; } void msPrintGraph(graphObj *graph) { int i; if (!graph) return; for (i = 0; i < graph->numnodes; i++) { graphNodeObj *node = graph->head[i]; if (node != nullptr) { do { msDebug("%d -> %d (%.6f)\t", i, node->dest, node->weight); node = node->next; } while (node != nullptr); msDebug("\n"); } } } /* ** Derived from an number web resources including: ** ** *https://www.geeksforgeeks.org/dijkstras-algorithm-for-adjacency-list-representation-greedy-algo-8/ ** https://youtube.com/watch?v=pSqmAO-m7Lk ** https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm ** ** Much of the bulk here is for min-heap (key,value) management. */ typedef struct { int idx; double dist; } minHeapNodeObj; typedef struct { int size; int capacity; int *pos; minHeapNodeObj **nodes; } minHeapObj; static minHeapNodeObj *newMinHeapNode(int idx, double dist) { minHeapNodeObj *node = (minHeapNodeObj *)malloc(sizeof(minHeapNodeObj)); if (!node) return nullptr; node->idx = idx; node->dist = dist; return node; } static void freeMinHeap(minHeapObj *minHeap) { if (!minHeap) return; free(minHeap->pos); for (int i = 0; i < minHeap->size; i++) { free(minHeap->nodes[i]); } free(minHeap->nodes); free(minHeap); } static minHeapObj *createMinHeap(signed int capacity) { minHeapObj *minHeap = (minHeapObj *)malloc(sizeof(minHeapObj)); if (!minHeap) return nullptr; minHeap->pos = (int *)malloc(capacity * sizeof(int)); if (!minHeap->pos) { free(minHeap); return nullptr; } minHeap->size = 0; minHeap->capacity = capacity; minHeap->nodes = (minHeapNodeObj **)malloc(capacity * sizeof(minHeapNodeObj *)); if (!minHeap->nodes) { free(minHeap->pos); free(minHeap); return nullptr; } return minHeap; } static void minHeapify(minHeapObj *minHeap, int idx) { int smallest = idx; const int left = 2 * idx + 1; const int right = 2 * idx + 2; if (left < minHeap->size && minHeap->nodes[left]->dist < minHeap->nodes[smallest]->dist) smallest = left; if (right < minHeap->size && minHeap->nodes[right]->dist < minHeap->nodes[smallest]->dist) smallest = right; if (smallest != idx) { minHeapNodeObj *smallestNode = minHeap->nodes[smallest]; minHeapNodeObj *idxNode = minHeap->nodes[idx]; minHeap->pos[smallestNode->idx] = idx; // swap positions minHeap->pos[idxNode->idx] = smallest; std::swap(minHeap->nodes[smallest], minHeap->nodes[idx]); // swap nodes minHeapify(minHeap, smallest); } } static bool isEmpty(const minHeapObj *minHeap) { return minHeap->size == 0; } static minHeapNodeObj *extractMin(minHeapObj *minHeap) { if (isEmpty(minHeap)) return nullptr; // store root node minHeapNodeObj *root = minHeap->nodes[0]; // replace root node with last node minHeapNodeObj *lastNode = minHeap->nodes[minHeap->size - 1]; minHeap->nodes[0] = lastNode; // update position of last node minHeap->pos[root->idx] = minHeap->size - 1; minHeap->pos[lastNode->idx] = 0; // Reduce heap size and heapify root --minHeap->size; minHeapify(minHeap, 0); return root; } static void decreaseKey(minHeapObj *minHeap, int idx, int dist) { // get the index of idx in min heap nodes int i = minHeap->pos[idx]; // get the node and update its dist value minHeap->nodes[i]->dist = dist; // travel up while the complete tree is not hepified (this is a O(Logn) loop) while (i && minHeap->nodes[i]->dist < minHeap->nodes[(i - 1) / 2]->dist) { // swap this node with its parent minHeap->pos[minHeap->nodes[i]->idx] = (i - 1) / 2; minHeap->pos[minHeap->nodes[(i - 1) / 2]->idx] = i; std::swap(minHeap->nodes[i], minHeap->nodes[(i - 1) / 2]); // move to parent index i = (i - 1) / 2; } } static bool isInMinHeap(const minHeapObj *minHeap, int idx) { return minHeap->pos[idx] < minHeap->size; } typedef struct { double *dist; int *prev; } dijkstraOutputObj; static dijkstraOutputObj *dijkstra(graphObj *graph, int src) { int n = graph->numnodes; minHeapObj *minHeap = createMinHeap(n); // priority queue implemented as a min heap structure if (!minHeap) return nullptr; dijkstraOutputObj *output = nullptr; output = (dijkstraOutputObj *)malloc(sizeof(dijkstraOutputObj)); output->dist = (double *)malloc(n * sizeof(double)); output->prev = (int *)malloc(n * sizeof(int)); if (!output->dist || !output->prev) { msFree(output->dist); msFree(output->prev); free(output); freeMinHeap(minHeap); return nullptr; } // initialize for (int i = 0; i < n; i++) { output->dist[i] = HUGE_VAL; output->prev[i] = -1; minHeap->nodes[i] = newMinHeapNode( i, output->dist[i]); // allocate a min heap node for each graph node minHeap->pos[i] = i; } // make dist value of src vertex as 0 so that it is extracted first minHeap->pos[src] = src; output->dist[src] = 0; decreaseKey(minHeap, src, output->dist[src]); // initially size of min heap is equal to graph->numnodes (n) minHeap->size = n; // In the following loop, minHeap contains all nodes // whose shortest distance is not yet finalized. while (!isEmpty(minHeap)) { // extract the vertex with minimum distance value and store the node index minHeapNodeObj *minHeapNode = extractMin(minHeap); int u = minHeapNode->idx; free(minHeapNode); // done with this node // traverse through all adjacent nodes of u and update their distance values graphNodeObj *node = graph->head[u]; while (node != nullptr) { int v = node->dest; // if shortest distance to v is not finalized yet, and distance to v // through u is less than its previously calculated distance if (isInMinHeap(minHeap, v) && output->dist[u] != HUGE_VAL && node->weight + output->dist[u] < output->dist[v]) { output->dist[v] = output->dist[u] + node->weight; output->prev[v] = u; decreaseKey(minHeap, v, output->dist[v]); } node = node->next; } } freeMinHeap(minHeap); return output; } int *msGraphGetLongestShortestPath(graphObj *graph, int src, int *path_size, double *path_dist) { if (!graph || src < 0 || src > graph->numnodes) return nullptr; int *path = (int *)malloc((graph->numnodes) * sizeof(int)); // worst case is path traverses all nodes if (!path) return nullptr; dijkstraOutputObj *output = dijkstra(graph, src); if (!output) { free(path); return nullptr; // algorithm failed for some reason } // get longest shortest distance from src to another node (our dest) *path_dist = -1; int dest = -1; for (int i = 0; i < graph->numnodes; i++) { if (output->dist[i] != HUGE_VAL && *path_dist < output->dist[i]) { *path_dist = output->dist[i]; dest = i; } } if (dest == -1) { // unable to determine destination node free(path); free(output->dist); free(output->prev); free(output); return nullptr; } // construct the path from src to dest int j = 0; for (int i = dest; i != -1; i = output->prev[i], j++) path[j] = i; std::reverse(path, path + j); *path_size = j; // clean up dijkstra output free(output->dist); free(output->prev); free(output); return path; } mapserver-8.6.0/src/mapgraph.h000066400000000000000000000042041511405061000162610ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Declarations for basic undirected, weighted graph support. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPGRAPH_H #define MAPGRAPH_H #ifdef __cplusplus extern "C" { #endif typedef struct graphNodeObj { int dest; double weight; struct graphNodeObj *next; } graphNodeObj; typedef struct { int numnodes; struct graphNodeObj **head; } graphObj; graphObj *msCreateGraph(int numnodes); void msFreeGraph(graphObj *graph); int msGraphAddEdge(graphObj *graph, int src, int dest, double weight); void msPrintGraph(graphObj *graph); int *msGraphGetLongestShortestPath(graphObj *graph, int src, int *path_size, double *path_dist); #ifdef __cplusplus } #endif #endif /* MAPGRAPH_H */ mapserver-8.6.0/src/mapgraticule.c000066400000000000000000001342631511405061000171430ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: Graticule Renderer * Author: John Novak, Novacell Technologies (jnovak@novacell.com) * ********************************************************************** * Copyright (c) 2003, John Novak, Novacell Technologies * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapserver.h" #include #include "mapproject.h" /********************************************************************************************************************** * */ typedef enum { posBottom = 1, posTop, posLeft, posRight } msGraticulePosition; typedef enum { lpDefault = 0, lpDDMMSS = 1, lpDDMM, lpDD } msLabelProcessingType; void DefineAxis(int iTickCountTarget, double *Min, double *Max, double *Inc); static int _AdjustLabelPosition(layerObj *pLayer, shapeObj *pShape, msGraticulePosition ePosition); static void _FormatLabel(layerObj *pLayer, shapeObj *pShape, double dDataToFormat); int msGraticuleLayerInitItemInfo(layerObj *layer); #define MAPGRATICULE_ARC_SUBDIVISION_DEFAULT (256) #define MAPGRATICULE_ARC_MINIMUM (16) #define MAPGRATICULE_FORMAT_STRING_DEFAULT "%5.2g" #define MAPGRATICULE_FORMAT_STRING_DDMMSS "%3d %02d %02d" #define MAPGRATICULE_FORMAT_STRING_DDMM "%3d %02d" #define MAPGRATICULE_FORMAT_STRING_DD "%3d" /********************************************************************************************************************** * */ int msGraticuleLayerOpen(layerObj *layer) { graticuleObj *pInfo = layer->grid; if (pInfo == NULL) return MS_FAILURE; pInfo->dincrementlatitude = 15.0; pInfo->dincrementlongitude = 15.0; pInfo->dwhichlatitude = -90.0; pInfo->dwhichlongitude = -180.0; pInfo->bvertical = 1; if (layer->numclasses == 0) msDebug("GRID layer has no classes, nothing will be rendered.\n"); if (layer->numclasses > 0 && layer->class[0] -> numlabels > 0) pInfo->blabelaxes = 1; else pInfo->blabelaxes = 0; if (pInfo->labelformat == NULL) { pInfo->labelformat = (char *)msSmallMalloc(strlen(MAPGRATICULE_FORMAT_STRING_DEFAULT) + 1); pInfo->ilabeltype = (int)lpDefault; strcpy(pInfo->labelformat, MAPGRATICULE_FORMAT_STRING_DEFAULT); } else if (strcmp(pInfo->labelformat, "DDMMSS") == 0) { msFree(pInfo->labelformat); pInfo->labelformat = (char *)msSmallMalloc(strlen(MAPGRATICULE_FORMAT_STRING_DDMMSS) + 1); pInfo->ilabeltype = (int)lpDDMMSS; strcpy(pInfo->labelformat, MAPGRATICULE_FORMAT_STRING_DDMMSS); } else if (strcmp(pInfo->labelformat, "DDMM") == 0) { msFree(pInfo->labelformat); pInfo->labelformat = (char *)msSmallMalloc(strlen(MAPGRATICULE_FORMAT_STRING_DDMM) + 1); pInfo->ilabeltype = (int)lpDDMM; strcpy(pInfo->labelformat, MAPGRATICULE_FORMAT_STRING_DDMM); } else if (strcmp(pInfo->labelformat, "DD") == 0) { msFree(pInfo->labelformat); pInfo->labelformat = (char *)msSmallMalloc(strlen(MAPGRATICULE_FORMAT_STRING_DD) + 1); pInfo->ilabeltype = (int)lpDD; strcpy(pInfo->labelformat, MAPGRATICULE_FORMAT_STRING_DD); } return MS_SUCCESS; } /********************************************************************************************************************** * Return MS_TRUE if layer is open, MS_FALSE otherwise. */ int msGraticuleLayerIsOpen(layerObj *layer) { if (layer->grid) return MS_TRUE; return MS_FALSE; } /********************************************************************************************************************** * */ int msGraticuleLayerClose(layerObj *layer) { (void)layer; return MS_SUCCESS; } /********************************************************************************************************************** * */ int msGraticuleLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { (void)isQuery; graticuleObj *pInfo = layer->grid; int iAxisTickCount = 0; rectObj rectMapCoordinates; if (msCheckParentPointer(layer->map, "map") == MS_FAILURE) return MS_FAILURE; pInfo->dstartlatitude = rect.miny; pInfo->dstartlongitude = rect.minx; pInfo->dendlatitude = rect.maxy; pInfo->dendlongitude = rect.maxx; pInfo->bvertical = 1; pInfo->extent = rect; if (pInfo->minincrement > 0.0) { pInfo->dincrementlongitude = pInfo->minincrement; pInfo->dincrementlatitude = pInfo->minincrement; } else if (pInfo->maxincrement > 0.0) { pInfo->dincrementlongitude = pInfo->maxincrement; pInfo->dincrementlatitude = pInfo->maxincrement; } else { pInfo->dincrementlongitude = 0; pInfo->dincrementlatitude = 0; } if (pInfo->maxarcs > 0) iAxisTickCount = (int)pInfo->maxarcs; else if (pInfo->minarcs > 0) iAxisTickCount = (int)pInfo->minarcs; DefineAxis(iAxisTickCount, &pInfo->dstartlongitude, &pInfo->dendlongitude, &pInfo->dincrementlongitude); DefineAxis(iAxisTickCount, &pInfo->dstartlatitude, &pInfo->dendlatitude, &pInfo->dincrementlatitude); pInfo->dwhichlatitude = pInfo->dstartlatitude; pInfo->dwhichlongitude = pInfo->dstartlongitude; if (pInfo->minincrement > 0.0 && pInfo->maxincrement > 0.0 && pInfo->minincrement == pInfo->maxincrement) { pInfo->dincrementlongitude = pInfo->minincrement; pInfo->dincrementlatitude = pInfo->minincrement; } else if (pInfo->minincrement > 0.0) { pInfo->dincrementlongitude = pInfo->minincrement; pInfo->dincrementlatitude = pInfo->minincrement; } else if (pInfo->maxincrement > 0.0) { pInfo->dincrementlongitude = pInfo->maxincrement; pInfo->dincrementlatitude = pInfo->maxincrement; } /* * If using PROJ, project rect back into map system, and generate rect corner * points in native system. These lines will be used when generating labels to * get correct placement at arc/rect edge intersections. */ rectMapCoordinates = layer->map->extent; layer->project = msProjectionsDiffer(&(layer->projection), &(layer->map->projection)); if (layer->project && strstr(layer->map->projection.args[0], "epsg:3857") && msProjIsGeographicCRS(&(layer->projection))) { if (rectMapCoordinates.minx < -20037508) rectMapCoordinates.minx = -20037508; if (rectMapCoordinates.maxx > 20037508) rectMapCoordinates.maxx = 20037508; } msFree(pInfo->pboundinglines); pInfo->pboundinglines = (lineObj *)msSmallMalloc(sizeof(lineObj) * 4); msFree(pInfo->pboundingpoints); pInfo->pboundingpoints = (pointObj *)msSmallMalloc(sizeof(pointObj) * 8); { /* * top */ pInfo->pboundinglines[0].numpoints = 2; pInfo->pboundinglines[0].point = &pInfo->pboundingpoints[0]; pInfo->pboundinglines[0].point[0].x = rectMapCoordinates.minx; pInfo->pboundinglines[0].point[0].y = rectMapCoordinates.maxy; pInfo->pboundinglines[0].point[1].x = rectMapCoordinates.maxx; pInfo->pboundinglines[0].point[1].y = rectMapCoordinates.maxy; if (layer->project) msProjectLine(&layer->map->projection, &layer->projection, &pInfo->pboundinglines[0]); /* * bottom */ pInfo->pboundinglines[1].numpoints = 2; pInfo->pboundinglines[1].point = &pInfo->pboundingpoints[2]; pInfo->pboundinglines[1].point[0].x = rectMapCoordinates.minx; pInfo->pboundinglines[1].point[0].y = rectMapCoordinates.miny; pInfo->pboundinglines[1].point[1].x = rectMapCoordinates.maxx; pInfo->pboundinglines[1].point[1].y = rectMapCoordinates.miny; if (layer->project) msProjectLine(&layer->map->projection, &layer->projection, &pInfo->pboundinglines[1]); /* * left */ pInfo->pboundinglines[2].numpoints = 2; pInfo->pboundinglines[2].point = &pInfo->pboundingpoints[4]; pInfo->pboundinglines[2].point[0].x = rectMapCoordinates.minx; pInfo->pboundinglines[2].point[0].y = rectMapCoordinates.miny; pInfo->pboundinglines[2].point[1].x = rectMapCoordinates.minx; pInfo->pboundinglines[2].point[1].y = rectMapCoordinates.maxy; if (layer->project) msProjectLine(&layer->map->projection, &layer->projection, &pInfo->pboundinglines[2]); /* * right */ pInfo->pboundinglines[3].numpoints = 2; pInfo->pboundinglines[3].point = &pInfo->pboundingpoints[6]; pInfo->pboundinglines[3].point[0].x = rectMapCoordinates.maxx; pInfo->pboundinglines[3].point[0].y = rectMapCoordinates.miny; pInfo->pboundinglines[3].point[1].x = rectMapCoordinates.maxx; pInfo->pboundinglines[3].point[1].y = rectMapCoordinates.maxy; if (layer->project) msProjectLine(&layer->map->projection, &layer->projection, &pInfo->pboundinglines[3]); } return MS_SUCCESS; } /********************************************************************************************************************** * */ int msGraticuleLayerNextShape(layerObj *layer, shapeObj *shape) { graticuleObj *pInfo = layer->grid; if (pInfo->minsubdivides <= 0.0 || pInfo->maxsubdivides <= 0.0) pInfo->minsubdivides = pInfo->maxsubdivides = MAPGRATICULE_ARC_SUBDIVISION_DEFAULT; shape->numlines = 1; shape->type = MS_SHAPE_LINE; shape->line = (lineObj *)msSmallMalloc(sizeof(lineObj)); shape->line->numpoints = (int)pInfo->maxsubdivides; shape->line->point = NULL; /* * Subdivide and draw current arc, rendering the arc labels first */ if (pInfo->bvertical) { int iPointIndex; double dArcDelta = (pInfo->dendlatitude - pInfo->dstartlatitude) / (double)shape->line->numpoints; double dArcPosition = pInfo->dstartlatitude + dArcDelta; double dStartY, dDeltaX; switch (pInfo->ilabelstate) { case 0: if (!pInfo->blabelaxes) { /* Bottom */ pInfo->ilabelstate++; msFreeShape(shape); return MS_SUCCESS; } dDeltaX = (pInfo->dwhichlongitude - pInfo->pboundinglines[1].point[0].x) / (pInfo->pboundinglines[1].point[1].x - pInfo->pboundinglines[1].point[0].x); if (dDeltaX < 0) dDeltaX = dDeltaX * -1; dStartY = (pInfo->pboundinglines[1].point[1].y - pInfo->pboundinglines[1].point[0].y) * dDeltaX + pInfo->pboundinglines[1].point[0].y; shape->line->numpoints = (int)2; shape->line->point = (pointObj *)msSmallMalloc(sizeof(pointObj) * 2); shape->line->point[0].x = pInfo->dwhichlongitude; shape->line->point[0].y = dStartY; shape->line->point[1].x = pInfo->dwhichlongitude; shape->line->point[1].y = dStartY + dArcDelta; _FormatLabel(layer, shape, shape->line->point[0].x); if (_AdjustLabelPosition(layer, shape, posBottom) != MS_SUCCESS) { msFreeShape(shape); pInfo->ilabelstate++; return MS_SUCCESS; } pInfo->ilabelstate++; return MS_SUCCESS; case 1: if (!pInfo->blabelaxes) { /* Top */ pInfo->ilabelstate++; msFreeShape(shape); return MS_SUCCESS; } dDeltaX = (pInfo->dwhichlongitude - pInfo->pboundinglines[0].point[0].x) / (pInfo->pboundinglines[0].point[1].x - pInfo->pboundinglines[0].point[0].x); if (dDeltaX < 0) dDeltaX = dDeltaX * -1; dStartY = (pInfo->pboundinglines[0].point[1].y - pInfo->pboundinglines[0].point[0].y) * dDeltaX + pInfo->pboundinglines[0].point[1].y; shape->line->numpoints = (int)2; shape->line->point = (pointObj *)msSmallMalloc(sizeof(pointObj) * 2); shape->line->point[0].x = pInfo->dwhichlongitude; shape->line->point[0].y = dStartY - dArcDelta; shape->line->point[1].x = pInfo->dwhichlongitude; shape->line->point[1].y = dStartY; _FormatLabel(layer, shape, shape->line->point[0].x); if (_AdjustLabelPosition(layer, shape, posTop) != MS_SUCCESS) { msFreeShape(shape); pInfo->ilabelstate++; return MS_SUCCESS; } pInfo->ilabelstate++; return MS_SUCCESS; case 2: shape->line->numpoints = (int)shape->line->numpoints + 1; shape->line->point = (pointObj *)msSmallMalloc(sizeof(pointObj) * shape->line->numpoints); shape->line->point[0].x = pInfo->dwhichlongitude; shape->line->point[0].y = pInfo->dstartlatitude; for (iPointIndex = 1; iPointIndex < shape->line->numpoints; iPointIndex++) { shape->line->point[iPointIndex].x = pInfo->dwhichlongitude; shape->line->point[iPointIndex].y = dArcPosition; dArcPosition += dArcDelta; } pInfo->ilabelstate = 0; pInfo->dwhichlongitude += pInfo->dincrementlongitude; break; default: pInfo->ilabelstate = 0; break; } } else { /*horizontal*/ int iPointIndex; double dArcDelta = (pInfo->dendlongitude - pInfo->dstartlongitude) / (double)shape->line->numpoints; double dArcPosition = pInfo->dstartlongitude + dArcDelta; double dStartX, dDeltaY; switch (pInfo->ilabelstate) { case 0: if (!pInfo->blabelaxes) { /* Left side */ pInfo->ilabelstate++; msFreeShape(shape); return MS_SUCCESS; } dDeltaY = (pInfo->dwhichlatitude - pInfo->pboundinglines[2].point[0].y) / (pInfo->pboundinglines[2].point[1].y - pInfo->pboundinglines[2].point[0].y); if (dDeltaY < 0) dDeltaY = dDeltaY * -1; dStartX = (pInfo->pboundinglines[2].point[1].x - pInfo->pboundinglines[2].point[0].x) * dDeltaY + pInfo->pboundinglines[2].point[0].x; shape->line->numpoints = (int)2; shape->line->point = (pointObj *)msSmallMalloc(sizeof(pointObj) * 2); shape->line->point[0].x = dStartX; shape->line->point[0].y = pInfo->dwhichlatitude; shape->line->point[1].x = dStartX + dArcDelta; shape->line->point[1].y = pInfo->dwhichlatitude; _FormatLabel(layer, shape, shape->line->point[0].y); if (_AdjustLabelPosition(layer, shape, posLeft) != MS_SUCCESS) { msFreeShape(shape); pInfo->ilabelstate++; return MS_SUCCESS; } pInfo->ilabelstate++; return MS_SUCCESS; case 1: if (!pInfo->blabelaxes) { /* Right side */ pInfo->ilabelstate++; msFreeShape(shape); return MS_SUCCESS; } dDeltaY = (pInfo->dwhichlatitude - pInfo->pboundinglines[3].point[0].y) / (pInfo->pboundinglines[3].point[1].y - pInfo->pboundinglines[3].point[0].y); if (dDeltaY < 0) dDeltaY = dDeltaY * -1; dStartX = (pInfo->pboundinglines[3].point[1].x - pInfo->pboundinglines[3].point[0].x) * dDeltaY + pInfo->pboundinglines[3].point[0].x; shape->line->numpoints = (int)2; shape->line->point = (pointObj *)msSmallMalloc(sizeof(pointObj) * 2); shape->line->point[0].x = dStartX - dArcDelta; shape->line->point[0].y = pInfo->dwhichlatitude; shape->line->point[1].x = dStartX; shape->line->point[1].y = pInfo->dwhichlatitude; _FormatLabel(layer, shape, shape->line->point[0].y); if (_AdjustLabelPosition(layer, shape, posRight) != MS_SUCCESS) { msFreeShape(shape); pInfo->ilabelstate++; return MS_SUCCESS; } pInfo->ilabelstate++; return MS_SUCCESS; case 2: shape->line->numpoints = (int)shape->line->numpoints + 1; shape->line->point = (pointObj *)msSmallMalloc(sizeof(pointObj) * shape->line->numpoints); shape->line->point[0].x = pInfo->dstartlongitude; shape->line->point[0].y = pInfo->dwhichlatitude; for (iPointIndex = 1; iPointIndex < shape->line->numpoints; iPointIndex++) { shape->line->point[iPointIndex].x = dArcPosition; shape->line->point[iPointIndex].y = pInfo->dwhichlatitude; dArcPosition += dArcDelta; } pInfo->ilabelstate = 0; pInfo->dwhichlatitude += pInfo->dincrementlatitude; break; default: pInfo->ilabelstate = 0; break; } } /* * Increment and move to next arc */ if (pInfo->bvertical && pInfo->dwhichlongitude > pInfo->dendlongitude) { pInfo->dwhichlatitude = pInfo->dstartlatitude; pInfo->bvertical = 0; } if (pInfo->dwhichlatitude > pInfo->dendlatitude) { /* free the lineObj and pointObj that have been erroneously allocated * beforehand */ msFreeShape(shape); return MS_DONE; } return MS_SUCCESS; } /********************************************************************************************************************** * */ int msGraticuleLayerGetItems(layerObj *layer) { char **ppItemName = (char **)msSmallMalloc(sizeof(char *)); *ppItemName = (char *)msSmallMalloc(64); /* why is this necessary? */ strcpy(*ppItemName, "Graticule"); layer->numitems = 1; layer->items = ppItemName; return MS_SUCCESS; } /********************************************************************************************************************** * */ int msGraticuleLayerInitItemInfo(layerObj *layer) { (void)layer; return MS_SUCCESS; } /********************************************************************************************************************** * */ void msGraticuleLayerFreeItemInfo(layerObj *layer) { (void)layer; } /********************************************************************************************************************** * */ int msGraticuleLayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { (void)layer; (void)shape; (void)record; return MS_FAILURE; } /********************************************************************************************************************** * */ int msGraticuleLayerGetExtent(layerObj *layer, rectObj *extent) { graticuleObj *pInfo = layer->grid; if (pInfo) { *extent = pInfo->extent; return MS_SUCCESS; } return MS_FAILURE; } /********************************************************************************************************************** * */ int msGraticuleLayerGetAutoStyle(mapObj *map, layerObj *layer, classObj *c, shapeObj *shape) { (void)map; (void)layer; (void)c; (void)shape; return MS_SUCCESS; } /************************************************************************/ /* msGraticuleLayerFreeIntersectionPoints */ /* */ /* Free intersection object. */ /************************************************************************/ void msGraticuleLayerFreeIntersectionPoints(graticuleIntersectionObj *psValue) { if (psValue) { for (int i = 0; i < psValue->nTop; i++) msFree(psValue->papszTopLabels[i]); msFree(psValue->papszTopLabels); msFree(psValue->pasTop); for (int i = 0; i < psValue->nBottom; i++) msFree(psValue->papszBottomLabels[i]); msFree(psValue->papszBottomLabels); msFree(psValue->pasBottom); for (int i = 0; i < psValue->nLeft; i++) msFree(psValue->papszLeftLabels[i]); msFree(psValue->papszLeftLabels); msFree(psValue->pasLeft); for (int i = 0; i < psValue->nRight; i++) msFree(psValue->papszRightLabels[i]); msFree(psValue->papszRightLabels); msFree(psValue->pasRight); msFree(psValue); } } /************************************************************************/ /* msGraticuleLayerInitIntersectionPoints */ /* */ /* init intersection object. */ /************************************************************************/ static void msGraticuleLayerInitIntersectionPoints(graticuleIntersectionObj *psValue) { if (psValue) { psValue->nTop = 0; psValue->pasTop = NULL; psValue->papszTopLabels = NULL; psValue->nBottom = 0; psValue->pasBottom = NULL; psValue->papszBottomLabels = NULL; psValue->nLeft = 0; psValue->pasLeft = NULL; psValue->papszLeftLabels = NULL; psValue->nRight = 0; psValue->pasRight = NULL; psValue->papszRightLabels = NULL; } } /************************************************************************/ /* msGraticuleLayerGetIntersectionPoints */ /* */ /* Utility function thar returns all intersection positions and */ /* labels (4 sides of the map) for a grid layer. */ /************************************************************************/ graticuleIntersectionObj * msGraticuleLayerGetIntersectionPoints(mapObj *map, layerObj *layer) { shapeObj shapegrid, tmpshape; rectObj searchrect; int status; pointObj oFirstPoint; pointObj oLastPoint; lineObj oLineObj; rectObj cliprect; graticuleObj *pInfo = NULL; double dfTmp; int i = 0; if (layer->connectiontype != MS_GRATICULE) return NULL; pInfo = layer->grid; /*set cellsize if bnot already set*/ if (map->cellsize == 0) map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); if (layer->transform == MS_TRUE) searchrect = map->extent; else { searchrect.minx = searchrect.miny = 0; searchrect.maxx = map->width - 1; searchrect.maxy = map->height - 1; } if ((map->projection.numargs > 0) && (layer->projection.numargs > 0)) msProjectRect(&map->projection, &layer->projection, &searchrect); /* project the searchrect to source coords */ status = msLayerOpen(layer); if (status != MS_SUCCESS) return NULL; status = msLayerWhichShapes(layer, searchrect, MS_FALSE); if (status == MS_DONE) { /* no overlap */ msLayerClose(layer); return NULL; } else if (status != MS_SUCCESS) { msLayerClose(layer); return NULL; } /* step through the target shapes */ msInitShape(&shapegrid); cliprect.minx = map->extent.minx - map->cellsize; cliprect.miny = map->extent.miny - map->cellsize; cliprect.maxx = map->extent.maxx + map->cellsize; cliprect.maxy = map->extent.maxy + map->cellsize; /* clip using the layer projection */ /* msProjectRect(&map->projection , &layer->projection, &cliprect); */ graticuleIntersectionObj *psValues = (graticuleIntersectionObj *)msSmallMalloc( sizeof(graticuleIntersectionObj)); msGraticuleLayerInitIntersectionPoints(psValues); while ((status = msLayerNextShape(layer, &shapegrid)) == MS_SUCCESS) { /*don't really need a class here*/ /* shapegrid.classindex = msShapeGetClass(layer, &shapegrid, map->scaledenom, NULL, 0); if((shapegrid.classindex == -1) || (layer->class[shapegrid.classindex]->status == MS_OFF)) { msFreeShape(&shapegrid); continue; } */ msInitShape(&tmpshape); msCopyShape(&shapegrid, &tmpshape); /* status = msDrawShape(map, layer, &tmpshape, image, -1); */ if (layer->project) { if (layer->reprojectorLayerToMap == NULL) { layer->reprojectorLayerToMap = msProjectCreateReprojector(&layer->projection, &map->projection); } if (layer->reprojectorLayerToMap) msProjectShapeEx(layer->reprojectorLayerToMap, &shapegrid); } msClipPolylineRect(&shapegrid, cliprect); msTransformShapeToPixelRound(&shapegrid, map->extent, map->cellsize); if (shapegrid.numlines <= 0 || shapegrid.line[0].numpoints < 2) { /* once clipped the shape didn't need to be drawn */ msFreeShape(&shapegrid); msFreeShape(&tmpshape); continue; } { int iTmpLine = 0; int nNumPoints = 0; /*grid code seems to return lines that can double cross the extenst??*/ /*creating a more than one clipped shape. Take the shape that has the most points, which should be the most likley to be correct*/ if (shapegrid.numlines > 1) { for (i = 0; i < shapegrid.numlines; i++) { if (shapegrid.line[i].numpoints > nNumPoints) { nNumPoints = shapegrid.line[i].numpoints; iTmpLine = i; } } } /* get the first and last point*/ oFirstPoint.x = shapegrid.line[iTmpLine].point[0].x; oFirstPoint.y = shapegrid.line[iTmpLine].point[0].y; oLineObj = shapegrid.line[iTmpLine]; oLastPoint.x = oLineObj.point[oLineObj.numpoints - 1].x; oLastPoint.y = oLineObj.point[oLineObj.numpoints - 1].y; if (pInfo->bvertical) { /*vertical*/ /*SHAPES ARE DRAWN FROM BOTTOM TO TOP.*/ /*Normally lines are drawn FROM BOTTOM TO TOP but not always for some reason, so make sure that firstpoint < lastpoint in y, We are in pixel coordinates so y increases as we we go down*/ if (oFirstPoint.y < oLastPoint.y) { dfTmp = oFirstPoint.x; oFirstPoint.x = oLastPoint.x; oLastPoint.x = dfTmp; dfTmp = oFirstPoint.y; oFirstPoint.y = oLastPoint.y; oLastPoint.y = dfTmp; } /*first point should cross the BOTTOM base where y== map->height*/ if (abs((int)oFirstPoint.y - map->height) <= 1) { char *pszLabel = NULL; oFirstPoint.y = map->height; /*validate point is in map width/height*/ if (oFirstPoint.x < 0 || oFirstPoint.x > map->width) continue; /*validate point is in map width/height*/ if (oLastPoint.x < 0 || oLastPoint.x > map->width) continue; if (shapegrid.text) pszLabel = msStrdup(shapegrid.text); else { _FormatLabel( layer, &tmpshape, tmpshape.line[0].point[tmpshape.line[0].numpoints - 1].x); if (tmpshape.text) pszLabel = msStrdup(tmpshape.text); else pszLabel = msStrdup("unknown"); } /*validate that the value is not already in the array*/ if (psValues->nBottom > 0) { /* if (psValues->pasBottom[psValues->nBottom-1].x == oFirstPoint.x) continue; */ for (i = 0; i < psValues->nBottom; i++) { if (psValues->pasBottom[i].x == oFirstPoint.x) break; } if (i < psValues->nBottom) { msFree(pszLabel); continue; } } if (psValues->pasBottom == NULL) { psValues->pasBottom = (pointObj *)msSmallMalloc(sizeof(pointObj)); psValues->papszBottomLabels = (char **)msSmallMalloc(sizeof(char *)); psValues->nBottom = 1; } else { psValues->nBottom++; psValues->pasBottom = (pointObj *)msSmallRealloc( psValues->pasBottom, sizeof(pointObj) * psValues->nBottom); psValues->papszBottomLabels = (char **)msSmallRealloc(psValues->papszBottomLabels, sizeof(char *) * psValues->nBottom); } psValues->pasBottom[psValues->nBottom - 1].x = oFirstPoint.x; psValues->pasBottom[psValues->nBottom - 1].y = oFirstPoint.y; psValues->papszBottomLabels[psValues->nBottom - 1] = pszLabel; } /*first point should cross the TOP base where y==0*/ if (abs((int)oLastPoint.y) <= 1) { char *pszLabel = NULL; oLastPoint.y = 0; /*validate point is in map width/height*/ if (oLastPoint.x < 0 || oLastPoint.x > map->width) continue; if (shapegrid.text) pszLabel = msStrdup(shapegrid.text); else { _FormatLabel( layer, &tmpshape, tmpshape.line[0].point[tmpshape.line[0].numpoints - 1].x); if (tmpshape.text) pszLabel = msStrdup(tmpshape.text); else pszLabel = msStrdup("unknown"); } /*validate if same value is not already there*/ if (psValues->nTop > 0) { /* if (psValues->pasTop[psValues->nTop-1].x == oLastPoint.x) continue; */ for (i = 0; i < psValues->nTop; i++) { if (psValues->pasTop[i].x == oLastPoint.x || strcasecmp(pszLabel, psValues->papszTopLabels[i]) == 0) break; } if (i < psValues->nTop) { msFree(pszLabel); continue; } } if (psValues->pasTop == NULL) { psValues->pasTop = (pointObj *)msSmallMalloc(sizeof(pointObj)); psValues->papszTopLabels = (char **)msSmallMalloc(sizeof(char *)); psValues->nTop = 1; } else { psValues->nTop++; psValues->pasTop = (pointObj *)msSmallRealloc( psValues->pasTop, sizeof(pointObj) * psValues->nTop); psValues->papszTopLabels = (char **)msSmallRealloc( psValues->papszTopLabels, sizeof(char *) * psValues->nTop); } psValues->pasTop[psValues->nTop - 1].x = oLastPoint.x; psValues->pasTop[psValues->nTop - 1].y = oLastPoint.y; psValues->papszTopLabels[psValues->nTop - 1] = pszLabel; } } else { /*horizontal*/ /*Normally lines are drawn from left to right but not always for some reason, so make sure that firstpoint < lastpoint in x*/ if (oFirstPoint.x > oLastPoint.x) { dfTmp = oFirstPoint.x; oFirstPoint.x = oLastPoint.x; oLastPoint.x = dfTmp; dfTmp = oFirstPoint.y; oFirstPoint.y = oLastPoint.y; oLastPoint.y = dfTmp; } /*first point should cross the LEFT base where x=0 axis*/ if (abs((int)oFirstPoint.x) <= 1) { char *pszLabel = NULL; oFirstPoint.x = 0; /*validate point is in map width/height*/ if (oFirstPoint.y < 0 || oFirstPoint.y > map->height) continue; if (shapegrid.text) pszLabel = msStrdup(shapegrid.text); else { _FormatLabel( layer, &tmpshape, tmpshape.line[0].point[tmpshape.line[0].numpoints - 1].y); if (tmpshape.text) pszLabel = msStrdup(tmpshape.text); else pszLabel = msStrdup("unknown"); } /*validate that the previous value is not the same*/ if (psValues->nLeft > 0) { /* if (psValues->pasLeft[psValues->nLeft-1].y == oFirstPoint.y) continue; */ for (i = 0; i < psValues->nLeft; i++) { if (psValues->pasLeft[i].y == oFirstPoint.y) break; } if (i < psValues->nLeft) { msFree(pszLabel); continue; } } if (psValues->pasLeft == NULL) { psValues->pasLeft = (pointObj *)msSmallMalloc(sizeof(pointObj)); psValues->papszLeftLabels = (char **)msSmallMalloc(sizeof(char *)); psValues->nLeft = 1; } else { psValues->nLeft++; psValues->pasLeft = (pointObj *)msSmallRealloc( psValues->pasLeft, sizeof(pointObj) * psValues->nLeft); psValues->papszLeftLabels = (char **)msSmallRealloc( psValues->papszLeftLabels, sizeof(char *) * psValues->nLeft); } psValues->pasLeft[psValues->nLeft - 1].x = oFirstPoint.x; psValues->pasLeft[psValues->nLeft - 1].y = oFirstPoint.y; psValues->papszLeftLabels[psValues->nLeft - 1] = pszLabel; /* takes ownership of allocated pszLabel */ } /*first point should cross the RIGHT base where x=map=>width axis*/ if (abs((int)oLastPoint.x - map->width) <= 1) { char *pszLabel = NULL; oLastPoint.x = map->width; /*validate point is in map width/height*/ if (oLastPoint.y < 0 || oLastPoint.y > map->height) continue; if (shapegrid.text) pszLabel = msStrdup(shapegrid.text); else { _FormatLabel( layer, &tmpshape, tmpshape.line[0].point[tmpshape.line[0].numpoints - 1].y); if (tmpshape.text) pszLabel = msStrdup(tmpshape.text); else pszLabel = msStrdup("unknown"); } /*validate that the previous value is not the same*/ if (psValues->nRight > 0) { /* if (psValues->pasRight[psValues->nRight-1].y == oLastPoint.y) continue; */ for (i = 0; i < psValues->nRight; i++) { if (psValues->pasRight[i].y == oLastPoint.y) break; } if (i < psValues->nRight) { msFree(pszLabel); continue; } } if (psValues->pasRight == NULL) { psValues->pasRight = (pointObj *)msSmallMalloc(sizeof(pointObj)); psValues->papszRightLabels = (char **)msSmallMalloc(sizeof(char *)); psValues->nRight = 1; } else { psValues->nRight++; psValues->pasRight = (pointObj *)msSmallRealloc( psValues->pasRight, sizeof(pointObj) * psValues->nRight); psValues->papszRightLabels = (char **)msSmallRealloc( psValues->papszRightLabels, sizeof(char *) * psValues->nRight); } psValues->pasRight[psValues->nRight - 1].x = oLastPoint.x; psValues->pasRight[psValues->nRight - 1].y = oLastPoint.y; psValues->papszRightLabels[psValues->nRight - 1] = pszLabel; } } msFreeShape(&shapegrid); msFreeShape(&tmpshape); } msInitShape(&shapegrid); } msLayerClose(layer); return psValues; } /********************************************************************************************************************** * */ int msGraticuleLayerInitializeVirtualTable(layerObj *layer) { assert(layer != NULL); assert(layer->vtable != NULL); layer->vtable->LayerInitItemInfo = msGraticuleLayerInitItemInfo; /* should use defaults for item info functions */ layer->vtable->LayerFreeItemInfo = msGraticuleLayerFreeItemInfo; layer->vtable->LayerOpen = msGraticuleLayerOpen; layer->vtable->LayerIsOpen = msGraticuleLayerIsOpen; layer->vtable->LayerWhichShapes = msGraticuleLayerWhichShapes; layer->vtable->LayerNextShape = msGraticuleLayerNextShape; /* layer->vtable->LayerResultsGetShape, use default */ layer->vtable->LayerGetShape = msGraticuleLayerGetShape; /* layer->vtable->LayerGetShapeCount, use default */ layer->vtable->LayerClose = msGraticuleLayerClose; layer->vtable->LayerGetItems = msGraticuleLayerGetItems; layer->vtable->LayerGetExtent = msGraticuleLayerGetExtent; layer->vtable->LayerGetAutoStyle = msGraticuleLayerGetAutoStyle; /* layer->vtable->LayerCloseConnection, use default */; layer->vtable->LayerSetTimeFilter = msLayerMakePlainTimeFilter; /* layer->vtable->LayerApplyFilterToLayer, use default */ /* layer->vtable->LayerCreateItems, use default */ /* layer->vtable->LayerGetNumFeatures, use default */ return MS_SUCCESS; } /********************************************************************************************************************** * */ static void _FormatLabel(layerObj *pLayer, shapeObj *pShape, double dDataToFormat) { graticuleObj *pInfo = pLayer->grid; char cBuffer[32]; int iDegrees, iMinutes; switch (pInfo->ilabeltype) { case lpDDMMSS: iDegrees = (int)dDataToFormat; dDataToFormat = fabs(dDataToFormat - (double)iDegrees); iMinutes = (int)(dDataToFormat * 60.0); dDataToFormat = dDataToFormat - (((double)iMinutes) / 60.0); sprintf(cBuffer, pInfo->labelformat, iDegrees, iMinutes, (int)(dDataToFormat * 3600.0)); break; case lpDDMM: iDegrees = (int)dDataToFormat; dDataToFormat = fabs(dDataToFormat - (double)iDegrees); sprintf(cBuffer, pInfo->labelformat, iDegrees, (int)(dDataToFormat * 60.0)); break; case lpDD: iDegrees = (int)dDataToFormat; sprintf(cBuffer, pInfo->labelformat, iDegrees); break; case lpDefault: default: sprintf(cBuffer, pInfo->labelformat, dDataToFormat); } pShape->text = msStrdup(cBuffer); } /********************************************************************************************************************** * * Move label position into display area by adjusting underlying shape line. */ static int _AdjustLabelPosition(layerObj *pLayer, shapeObj *pShape, msGraticulePosition ePosition) { graticuleObj *pInfo = pLayer->grid; rectObj rectLabel; pointObj ptPoint; double size = -1; char *labeltxt; if (pInfo == NULL || pShape == NULL) { msSetError(MS_MISCERR, "Assertion failed: Null shape or non-configured grid!, ", "_AdjustLabelPosition()"); return MS_FAILURE; } assert(pLayer->class[0] -> numlabels >= 1); if (msCheckParentPointer(pLayer->map, "map") == MS_FAILURE) return MS_FAILURE; ptPoint = pShape->line->point[0]; if (pLayer->project) { if (pLayer->reprojectorLayerToMap == NULL) { pLayer->reprojectorLayerToMap = msProjectCreateReprojector( &pLayer->projection, &pLayer->map->projection); } if (pLayer->reprojectorLayerToMap) msProjectShapeEx(pLayer->reprojectorLayerToMap, pShape); /* Poor man detection of reprojection failure */ if (msProjIsGeographicCRS(&(pLayer->projection)) != msProjIsGeographicCRS(&(pLayer->map->projection))) { if (ptPoint.x == pShape->line->point[0].x && ptPoint.y == pShape->line->point[0].y) { return MS_FAILURE; } } } if (pLayer->transform) { msTransformShapeToPixelRound(pShape, pLayer->map->extent, pLayer->map->cellsize); } size = pLayer->class[0] ->labels[0] ->size; /* TODO someday: adjust minsize/maxsize/resolution*/ /* We only use the first label as there's no use (yet) in defining multiple labels for GRID layers, as the only label to represent is the longitude or latitude */ labeltxt = msShapeGetLabelAnnotation(pLayer, pShape, pLayer->class[0] -> labels[0]); assert(labeltxt); if (msGetStringSize(pLayer->map, pLayer->class[0] -> labels[0], size, labeltxt, &rectLabel) != MS_SUCCESS) { free(labeltxt); return MS_FAILURE; /* msSetError already called */ } free(labeltxt); switch (ePosition) { case posBottom: pShape->line->point[1].y = pLayer->map->height; pShape->line->point[0].y = pLayer->map->height - (fabs(rectLabel.maxy - rectLabel.miny) * 2 + 5); break; case posTop: pShape->line->point[1].y = 0; pShape->line->point[0].y = fabs(rectLabel.maxy - rectLabel.miny) * 2 + 5; break; case posLeft: pShape->line->point[0].x = 0; pShape->line->point[1].x = fabs(rectLabel.maxx - rectLabel.minx) * 2 + 5; break; case posRight: pShape->line->point[1].x = pLayer->map->width; pShape->line->point[0].x = pLayer->map->width - (fabs(rectLabel.maxx - rectLabel.minx) * 2 + 5); break; } if (pLayer->transform) msTransformPixelToShape(pShape, pLayer->map->extent, pLayer->map->cellsize); if (pLayer->project) { /* Clamp coordinates into the validity area of the projection, in the */ /* particular case of EPSG:3857 (WebMercator) to longlat reprojection */ if (strstr(pLayer->map->projection.args[0], "epsg:3857") && msProjIsGeographicCRS(&(pLayer->projection))) { if (!pLayer->map->projection.gt.need_geotransform && ePosition == posLeft && pShape->line->point[0].x < -20037508) { pShape->line->point[1].x = -20037508 + (pShape->line->point[1].x - pShape->line->point[0].x); pShape->line->point[0].x = -20037508; } else if (pLayer->map->projection.gt.need_geotransform && ePosition == posLeft && pLayer->map->projection.gt.geotransform[0] + pShape->line->point[0].x * pLayer->map->projection.gt.geotransform[1] + pShape->line->point[0].y * pLayer->map->projection.gt.geotransform[2] < -20037508) { double y_tmp; double width = pShape->line->point[1].x - pShape->line->point[0].x; y_tmp = pLayer->map->projection.gt.geotransform[3] + pShape->line->point[0].x * pLayer->map->projection.gt.geotransform[4] + pShape->line->point[0].y * pLayer->map->projection.gt.geotransform[5]; pShape->line->point[0].x = pLayer->map->projection.gt.invgeotransform[0] + -20037508 * pLayer->map->projection.gt.invgeotransform[1] + y_tmp * pLayer->map->projection.gt.invgeotransform[2]; pShape->line->point[1].x = pShape->line->point[0].x + width; } if (!pLayer->map->projection.gt.need_geotransform && ePosition == posRight && pShape->line->point[1].x > 20037508) { pShape->line->point[0].x = 20037508 - (pShape->line->point[1].x - pShape->line->point[0].x); pShape->line->point[1].x = 20037508; } else if (pLayer->map->projection.gt.need_geotransform && ePosition == posRight && pLayer->map->projection.gt.geotransform[0] + pShape->line->point[1].x * pLayer->map->projection.gt.geotransform[1] + pShape->line->point[1].y * pLayer->map->projection.gt.geotransform[2] > 20037508) { double y_tmp; double width = pShape->line->point[1].x - pShape->line->point[0].x; y_tmp = pLayer->map->projection.gt.geotransform[3] + pShape->line->point[1].x * pLayer->map->projection.gt.geotransform[4] + pShape->line->point[1].y * pLayer->map->projection.gt.geotransform[5]; pShape->line->point[1].x = pLayer->map->projection.gt.invgeotransform[0] + 20037508 * pLayer->map->projection.gt.invgeotransform[1] + y_tmp * pLayer->map->projection.gt.invgeotransform[2]; pShape->line->point[0].x = pShape->line->point[1].x - width; } } if (pLayer->reprojectorMapToLayer == NULL) { pLayer->reprojectorMapToLayer = msProjectCreateReprojector( &pLayer->map->projection, &pLayer->projection); } if (pLayer->reprojectorMapToLayer) msProjectShapeEx(pLayer->reprojectorMapToLayer, pShape); } switch (ePosition) { case posBottom: case posTop: pShape->line->point[1].x = ptPoint.x; pShape->line->point[0].x = ptPoint.x; break; case posLeft: case posRight: pShape->line->point[1].y = ptPoint.y; pShape->line->point[0].y = ptPoint.y; break; } return MS_SUCCESS; } /********************************************************************************************************************** ********************************************************************************************************************** * DefineAxes - Copyright (c) 2000, Michael P.D. Bramley. * * Permission is granted to use this code without restriction as long as * this copyright notice appears in all source files. * * Minor tweaks to increment calculations - jnovak */ void DefineAxis(int iTickCountTarget, double *Min, double *Max, double *Inc) { /* define local variables... */ double Test_inc, /* candidate increment value */ Test_min, /* minimum scale value */ Test_max, /* maximum scale value */ Range = *Max - *Min; /* range of data */ int i = 0; /* counter */ /* don't create problems -- solve them */ if (Range < 0) { *Inc = 0; return; } /* handle special case of repeated values */ else if (Range == 0) { *Min = ceil(*Max) - 1; *Max = *Min + 1; *Inc = 1; return; } /* compute candidate for increment */ Test_inc = pow(10.0, ceil(log10(Range / 10))); if (*Inc > 0 && (Test_inc < *Inc || Test_inc > *Inc)) Test_inc = *Inc; /* establish maximum scale value... */ Test_max = ((long)(*Max / Test_inc)) * Test_inc; if (Test_max < *Max) Test_max += Test_inc; /* establish minimum scale value... */ Test_min = Test_max; do { ++i; Test_min -= Test_inc; } while (Test_min > *Min); /* subtracting small values can screw up the scale limits, */ /* eg: if DefineAxis is called with (min,max)=(0.01, 0.1), */ /* then the calculated scale is 1.0408E17 TO 0.05 BY 0.01. */ /* the following if statement corrects for this... */ /* if(fabs(Test_min) < 1E-10) */ /* Test_min = 0 ; */ /* adjust for too few tick marks */ if (iTickCountTarget <= 0) iTickCountTarget = MAPGRATICULE_ARC_MINIMUM; while (i < iTickCountTarget) { Test_inc /= 2; i *= 2; } if (i < 6 && 0) { Test_inc /= 2; if ((Test_min + Test_inc) <= *Min) Test_min += Test_inc; if ((Test_max - Test_inc) >= *Max) Test_max -= Test_inc; } /* pass back axis definition to caller */ *Min = Test_min; *Max = Test_max; *Inc = Test_inc; } /********************************************************************************************************************** **********************************************************************************************************************/ mapserver-8.6.0/src/maphash.c000066400000000000000000000145321511405061000161030ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implement hashTableObj class. * Author: Sean Gillies, sgillies@frii.com * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include "mapserver.h" #include "maphash.h" static unsigned hash(const char *key) { unsigned hashval; for (hashval = 0; *key != '\0'; key++) hashval = tolower(*key) + 31 * hashval; return (hashval % MS_HASHSIZE); } hashTableObj *msCreateHashTable() { int i; hashTableObj *table; table = (hashTableObj *)msSmallMalloc(sizeof(hashTableObj)); table->items = (struct hashObj **)msSmallMalloc(sizeof(struct hashObj *) * MS_HASHSIZE); for (i = 0; i < MS_HASHSIZE; i++) table->items[i] = NULL; table->numitems = 0; return table; } int initHashTable(hashTableObj *table) { int i; table->items = (struct hashObj **)malloc(sizeof(struct hashObj *) * MS_HASHSIZE); MS_CHECK_ALLOC(table->items, sizeof(struct hashObj *) * MS_HASHSIZE, MS_FAILURE); for (i = 0; i < MS_HASHSIZE; i++) table->items[i] = NULL; table->numitems = 0; return MS_SUCCESS; } void msFreeHashTable(hashTableObj *table) { if (table != NULL) { msFreeHashItems(table); free(table); } } int msHashIsEmpty(const hashTableObj *table) { if (table->numitems == 0) return MS_TRUE; else return MS_FALSE; } void msFreeHashItems(hashTableObj *table) { int i; struct hashObj *tp = NULL; struct hashObj *prev_tp = NULL; if (table) { if (table->items) { for (i = 0; i < MS_HASHSIZE; i++) { if (table->items[i] != NULL) { for (tp = table->items[i]; tp != NULL; prev_tp = tp, tp = tp->next, free(prev_tp)) { msFree(tp->key); msFree(tp->data); } } } free(table->items); table->items = NULL; } else { msSetError(MS_HASHERR, "No items allocated.", "msFreeHashItems()"); } } else { msSetError(MS_HASHERR, "Can't free NULL table", "msFreeHashItems()"); } } struct hashObj *msInsertHashTable(hashTableObj *table, const char *key, const char *value) { struct hashObj *tp; unsigned hashval; if (!table || !key || !value) { msSetError(MS_HASHERR, "Invalid hash table or key", "msInsertHashTable"); return NULL; } for (tp = table->items[hash(key)]; tp != NULL; tp = tp->next) if (strcasecmp(key, tp->key) == 0) break; if (tp == NULL) { /* not found */ tp = (struct hashObj *)malloc(sizeof(*tp)); MS_CHECK_ALLOC(tp, sizeof(*tp), NULL); tp->key = msStrdup(key); hashval = hash(key); tp->next = table->items[hashval]; table->items[hashval] = tp; table->numitems++; } else { free(tp->data); } if ((tp->data = msStrdup(value)) == NULL) return NULL; return tp; } const char *msLookupHashTable(const hashTableObj *table, const char *key) { struct hashObj *tp; if (!table || !key) { return (NULL); } for (tp = table->items[hash(key)]; tp != NULL; tp = tp->next) if (strcasecmp(key, tp->key) == 0) return (tp->data); return NULL; } int msRemoveHashTable(hashTableObj *table, const char *key) { struct hashObj *tp; struct hashObj *prev_tp = NULL; int status = MS_FAILURE; if (!table || !key) { msSetError(MS_HASHERR, "No hash table", "msRemoveHashTable"); return MS_FAILURE; } tp = table->items[hash(key)]; if (!tp) { msSetError(MS_HASHERR, "No such hash entry", "msRemoveHashTable"); return MS_FAILURE; } prev_tp = NULL; while (tp != NULL) { if (strcasecmp(key, tp->key) == 0) { status = MS_SUCCESS; if (prev_tp) { prev_tp->next = tp->next; msFree(tp->key); msFree(tp->data); free(tp); break; } else { table->items[hash(key)] = tp->next; msFree(tp->key); msFree(tp->data); free(tp); break; } } prev_tp = tp; tp = tp->next; } if (status == MS_SUCCESS) table->numitems--; return status; } const char *msFirstKeyFromHashTable(const hashTableObj *table) { int hash_index; if (!table) { msSetError(MS_HASHERR, "No hash table", "msFirstKeyFromHashTable"); return NULL; } for (hash_index = 0; hash_index < MS_HASHSIZE; hash_index++) { if (table->items[hash_index] != NULL) return table->items[hash_index]->key; } return NULL; } const char *msNextKeyFromHashTable(const hashTableObj *table, const char *lastKey) { int hash_index; struct hashObj *link; if (!table) { msSetError(MS_HASHERR, "No hash table", "msNextKeyFromHashTable"); return NULL; } if (lastKey == NULL) return msFirstKeyFromHashTable(table); hash_index = hash(lastKey); for (link = table->items[hash_index]; link != NULL && strcasecmp(lastKey, link->key) != 0; link = link->next) { } if (link != NULL && link->next != NULL) return link->next->key; while (++hash_index < MS_HASHSIZE) { if (table->items[hash_index] != NULL) return table->items[hash_index]->key; } return NULL; } mapserver-8.6.0/src/maphash.h000066400000000000000000000116151511405061000161070ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Declarations for the hashTableObj and related stuff. * Author: Sean Gillies, sgillies@frii.com * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPHASH__H #define MAPHASH__H #ifdef __cplusplus extern "C" { #endif #if defined(_WIN32) && !defined(__CYGWIN__) #define MS_DLL_EXPORT __declspec(dllexport) #else #define MS_DLL_EXPORT #endif #define MS_HASHSIZE 41 /* ========================================================================= * Structs * ========================================================================= */ #ifndef SWIG struct hashObj { struct hashObj *next; /* pointer to next item */ char *key; /* string key that is hashed */ char *data; /* string stored in this item */ }; #endif /*SWIG*/ /** * An object to store key-value pairs * */ typedef struct { #ifndef SWIG struct hashObj **items; /* the hash table */ #endif #ifdef SWIG %immutable; #endif /*SWIG*/ int numitems; ///< \**immutable** number of items #ifdef SWIG %mutable; #endif /*SWIG*/ } hashTableObj; /* ========================================================================= * Functions * ========================================================================= */ #ifndef SWIG /* msCreateHashTable - create a hash table * ARGS: * None * RETURNS: * New hash table */ MS_DLL_EXPORT hashTableObj *msCreateHashTable(void); /* For use in mapfile.c with hashTableObj structure members */ MS_DLL_EXPORT int initHashTable(hashTableObj *table); /* msFreeHashTable - free allocated memory * ARGS: * table - target hash table * RETURNS: * None */ MS_DLL_EXPORT void msFreeHashTable(hashTableObj *table); /* Free only the items for hashTableObj structure members (metadata, &c) */ MS_DLL_EXPORT void msFreeHashItems(hashTableObj *table); /* msInsertHashTable - insert new item * ARGS: * table - the target hash table * key - key string for new item * value - data string for new item * RETURNS: * pointer to the new item or NULL * EXCEPTIONS: * raise MS_HASHERR on failure */ MS_DLL_EXPORT struct hashObj * msInsertHashTable(hashTableObj *table, const char *key, const char *value); /* msLookupHashTable - get the value of an item by its key * ARGS: * table - the target hash table * key - key string of item * RETURNS: * string value of item */ MS_DLL_EXPORT const char *msLookupHashTable(const hashTableObj *table, const char *key); /* msRemoveHashTable - remove item from table at key * ARGS: * table - target hash table * key - key string * RETURNS: * MS_SUCCESS or MS_FAILURE */ MS_DLL_EXPORT int msRemoveHashTable(hashTableObj *table, const char *key); /* msFirstKeyFromHashTable - get key of first item * ARGS: * table - target hash table * RETURNS: * first key as a string */ MS_DLL_EXPORT const char *msFirstKeyFromHashTable(const hashTableObj *table); /* msNextKeyFromHashTable - get next key * ARGS: * table - target hash table * prevkey - the previous key * RETURNS: * the key of the item of following prevkey as a string */ MS_DLL_EXPORT const char *msNextKeyFromHashTable(const hashTableObj *table, const char *prevkey); /* msHashIsEmpty - get next key * ARGS: * table - target hash table * RETURNS: * MS_TRUE if the table is empty and MS_FALSE if the table has items */ MS_DLL_EXPORT int msHashIsEmpty(const hashTableObj *table); #endif /*SWIG*/ #ifdef __cplusplus } #endif #endif /* MAPHASH__H */ mapserver-8.6.0/src/maphttp.c000066400000000000000000001034151511405061000161360ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: Utility functions to access files via HTTP (requires libcurl) * Author: Daniel Morissette, DM Solutions Group (morissette@dmsolutions.ca) * ********************************************************************** * Copyright (c) 2001-2003, Daniel Morissette, DM Solutions Group Inc * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #define NEED_IGNORE_RET_VAL /* For now this code is enabled only when WMS/WFS client is enabled. * This should be changed to a test on the presence of libcurl which * is really what the real dependency is. */ #include "mapserver-config.h" #if defined(USE_CURL) #include "mapserver.h" #include "maphttp.h" #include "maperror.h" #include "mapthread.h" #include "mapows.h" #include "cpl_conv.h" #include #ifndef _WIN32 #include #include #endif /* * Note: This code uses libcurl to access remote files via the HTTP protocol. * Requires libcurl v 7.10 or more recent. * See http://curl.haxx.se/libcurl/c/ for the lib source code and docs. */ #include #ifndef CURL_AT_LEAST_VERSION #define CURL_VERSION_BITS(x, y, z) ((x) << 16 | (y) << 8 | z) #define CURL_AT_LEAST_VERSION(x, y, z) \ (LIBCURL_VERSION_NUM >= CURL_VERSION_BITS(x, y, z)) #endif // #ifndef CURL_AT_LEAST_VERSION #define unchecked_curl_easy_setopt(handle, opt, param) \ IGNORE_RET_VAL(curl_easy_setopt(handle, opt, param)) /********************************************************************** * msHTTPInit() * * This function is called to init libcurl before the first HTTP request * in this process is executed. * On further calls (when gbCurlInitialized = MS_TRUE) it simply doest nothing. * * Returns MS_SUCCESS/MS_FAILURE. * * msHTTPCleanup() will have to be called in msCleanup() when this process * exits. **********************************************************************/ static int gbCurlInitialized = MS_FALSE; int msHTTPInit() { /* curl_global_init() should only be called once (no matter how * many threads or libcurl sessions that'll be used) by every * application that uses libcurl. */ msAcquireLock(TLOCK_OWS); if (!gbCurlInitialized && curl_global_init(CURL_GLOBAL_ALL) != 0) { msReleaseLock(TLOCK_OWS); msSetError(MS_HTTPERR, "Libcurl initialization failed.", "msHTTPInit()"); return MS_FAILURE; } gbCurlInitialized = MS_TRUE; msReleaseLock(TLOCK_OWS); return MS_SUCCESS; } /********************************************************************** * msHTTPCleanup() * **********************************************************************/ void msHTTPCleanup() { msAcquireLock(TLOCK_OWS); if (gbCurlInitialized) curl_global_cleanup(); gbCurlInitialized = MS_FALSE; msReleaseLock(TLOCK_OWS); } /********************************************************************** * msHTTPInitRequestObj() * * Should be called on a new array of httpRequestObj to initialize them * for use with msHTTPExecuteRequest(), etc. * **********************************************************************/ void msHTTPInitRequestObj(httpRequestObj *pasReqInfo, int numRequests) { int i; for (i = 0; i < numRequests; i++) { pasReqInfo[i].pszGetUrl = NULL; pasReqInfo[i].pszPostRequest = NULL; pasReqInfo[i].pszPostContentType = NULL; pasReqInfo[i].pszOutputFile = NULL; pasReqInfo[i].pszEPSG = NULL; pasReqInfo[i].nLayerId = 0; pasReqInfo[i].nTimeout = 0; pasReqInfo[i].nMaxBytes = 0; pasReqInfo[i].nStatus = 0; pasReqInfo[i].pszContentType = NULL; pasReqInfo[i].pszErrBuf = NULL; pasReqInfo[i].pszUserAgent = NULL; pasReqInfo[i].pszHTTPCookieData = NULL; pasReqInfo[i].pszProxyAddress = NULL; pasReqInfo[i].pszProxyUsername = NULL; pasReqInfo[i].pszProxyPassword = NULL; pasReqInfo[i].pszHttpUsername = NULL; pasReqInfo[i].pszHttpPassword = NULL; pasReqInfo[i].debug = MS_FALSE; pasReqInfo[i].curl_handle = NULL; pasReqInfo[i].fp = NULL; pasReqInfo[i].result_data = NULL; pasReqInfo[i].result_size = 0; pasReqInfo[i].result_buf_size = 0; } } /********************************************************************** * msHTTPFreeRequestObj() * **********************************************************************/ void msHTTPFreeRequestObj(httpRequestObj *pasReqInfo, int numRequests) { int i; for (i = 0; i < numRequests; i++) { if (pasReqInfo[i].pszGetUrl) free(pasReqInfo[i].pszGetUrl); pasReqInfo[i].pszGetUrl = NULL; if (pasReqInfo[i].pszPostRequest) free(pasReqInfo[i].pszPostRequest); pasReqInfo[i].pszPostRequest = NULL; if (pasReqInfo[i].pszPostContentType) free(pasReqInfo[i].pszPostContentType); pasReqInfo[i].pszPostContentType = NULL; if (pasReqInfo[i].pszOutputFile) free(pasReqInfo[i].pszOutputFile); pasReqInfo[i].pszOutputFile = NULL; if (pasReqInfo[i].pszEPSG) free(pasReqInfo[i].pszEPSG); pasReqInfo[i].pszEPSG = NULL; if (pasReqInfo[i].pszContentType) free(pasReqInfo[i].pszContentType); pasReqInfo[i].pszContentType = NULL; if (pasReqInfo[i].pszErrBuf) free(pasReqInfo[i].pszErrBuf); pasReqInfo[i].pszErrBuf = NULL; if (pasReqInfo[i].pszUserAgent) free(pasReqInfo[i].pszUserAgent); pasReqInfo[i].pszUserAgent = NULL; if (pasReqInfo[i].pszHTTPCookieData) free(pasReqInfo[i].pszHTTPCookieData); pasReqInfo[i].pszHTTPCookieData = NULL; pasReqInfo[i].curl_handle = NULL; free(pasReqInfo[i].result_data); pasReqInfo[i].result_data = NULL; pasReqInfo[i].result_size = 0; pasReqInfo[i].result_buf_size = 0; } } /********************************************************************** * msHTTPWriteFct() * * CURL_OPTWRITEFUNCTION, called to write blocks of data to the file we * are downloading. Should return the number of bytes that were taken * care of. If that amount differs from the amount passed to it * it'll signal an error to the library and it will abort the transfer * and produce a CURLE_WRITE_ERROR. * **********************************************************************/ static size_t msHTTPWriteFct(void *buffer, size_t size, size_t nmemb, void *reqInfo) { httpRequestObj *psReq; psReq = (httpRequestObj *)reqInfo; if (psReq->debug) { msDebug("msHTTPWriteFct(id=%d, %d bytes)\n", psReq->nLayerId, (int)(size * nmemb)); } if (psReq->nMaxBytes > 0 && (psReq->result_size + size * nmemb) > (size_t)psReq->nMaxBytes) { msSetError(MS_HTTPERR, "Requested transfer larger than configured maximum %d.", "msHTTPWriteFct()", psReq->nMaxBytes); return -1; } /* Case where we are writing to a disk file. */ if (psReq->fp != NULL) { psReq->result_size += size * nmemb; return fwrite(buffer, size, nmemb, psReq->fp); } /* Case where we build up the result in memory */ else { if (psReq->result_data == NULL) { psReq->result_buf_size = size * nmemb + 10000; psReq->result_data = (char *)msSmallMalloc(psReq->result_buf_size); } else if (psReq->result_size + nmemb * size > (size_t)psReq->result_buf_size) { psReq->result_buf_size = psReq->result_size + nmemb * size + 10000; psReq->result_data = (char *)msSmallRealloc(psReq->result_data, psReq->result_buf_size); } if (psReq->result_data == NULL) { msSetError(MS_HTTPERR, "Unable to grow HTTP result buffer to size %d.", "msHTTPWriteFct()", psReq->result_buf_size); psReq->result_buf_size = 0; psReq->result_size = 0; return -1; } memcpy(psReq->result_data + psReq->result_size, buffer, size * nmemb); psReq->result_size += size * nmemb; return size * nmemb; } } /********************************************************************** * msGetCURLAuthType() * * Returns the equivalent CURL CURLAUTH_ constant given a * MS_HTTP_AUTH_TYPE, or CURLAUTH_BASIC if no match is found. **********************************************************************/ long msGetCURLAuthType(enum MS_HTTP_AUTH_TYPE authType) { switch (authType) { case MS_BASIC: return CURLAUTH_BASIC; case MS_DIGEST: return CURLAUTH_DIGEST; case MS_NTLM: return CURLAUTH_NTLM; case MS_ANY: return CURLAUTH_ANY; case MS_ANYSAFE: return CURLAUTH_ANYSAFE; default: return CURLAUTH_BASIC; } } /********************************************************************** * msHTTPAuthProxySetup() * * Common code used by msPrepareWFSLayerRequest() and * msPrepareWMSLayerRequest() to handle proxy / http auth for requests * * Return value: * MS_SUCCESS if all requests completed successfully. * MS_FAILURE if a fatal error happened **********************************************************************/ int msHTTPAuthProxySetup(hashTableObj *mapmd, hashTableObj *lyrmd, httpRequestObj *pasReqInfo, int numRequests, mapObj *map, const char *namespaces) { const char *pszTmp; char *pszProxyHost = NULL; long nProxyPort = 0; char *pszProxyUsername = NULL, *pszProxyPassword = NULL; char *pszHttpAuthUsername = NULL, *pszHttpAuthPassword = NULL; enum MS_HTTP_AUTH_TYPE eHttpAuthType = MS_BASIC; enum MS_HTTP_AUTH_TYPE eProxyAuthType = MS_BASIC; enum MS_HTTP_PROXY_TYPE eProxyType = MS_HTTP; /* ------------------------------------------------------------------ * Check for authentication and proxying metadata. If the metadata is not * found in the layer metadata, check the map-level metadata. * ------------------------------------------------------------------ */ if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "proxy_host")) != NULL) { pszProxyHost = msStrdup(pszTmp); } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "proxy_port")) != NULL) { nProxyPort = atol(pszTmp); } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "proxy_type")) != NULL) { if (strcasecmp(pszTmp, "HTTP") == 0) eProxyType = MS_HTTP; else if (strcasecmp(pszTmp, "SOCKS5") == 0) eProxyType = MS_SOCKS5; else { msSetError(MS_WMSERR, "Invalid proxy_type metadata '%s' specified", "msHTTPAuthProxySetup()", pszTmp); return MS_FAILURE; } } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "proxy_auth_type")) != NULL) { if (strcasecmp(pszTmp, "BASIC") == 0) eProxyAuthType = MS_BASIC; else if (strcasecmp(pszTmp, "DIGEST") == 0) eProxyAuthType = MS_DIGEST; else if (strcasecmp(pszTmp, "NTLM") == 0) eProxyAuthType = MS_NTLM; else if (strcasecmp(pszTmp, "ANY") == 0) eProxyAuthType = MS_ANY; else if (strcasecmp(pszTmp, "ANYSAFE") == 0) eProxyAuthType = MS_ANYSAFE; else { msSetError(MS_WMSERR, "Invalid proxy_auth_type metadata '%s' specified", "msHTTPAuthProxySetup()", pszTmp); return MS_FAILURE; } } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "proxy_username")) != NULL) { pszProxyUsername = msStrdup(pszTmp); } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "proxy_password")) != NULL) { pszProxyPassword = msDecryptStringTokens(map, pszTmp); if (pszProxyPassword == NULL) { msFree(pszProxyHost); msFree(pszProxyUsername); return (MS_FAILURE); /* An error should already have been produced */ } } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "auth_type")) != NULL) { if (strcasecmp(pszTmp, "BASIC") == 0) eHttpAuthType = MS_BASIC; else if (strcasecmp(pszTmp, "DIGEST") == 0) eHttpAuthType = MS_DIGEST; else if (strcasecmp(pszTmp, "NTLM") == 0) eHttpAuthType = MS_NTLM; else if (strcasecmp(pszTmp, "ANY") == 0) eHttpAuthType = MS_ANY; else if (strcasecmp(pszTmp, "ANYSAFE") == 0) eHttpAuthType = MS_ANYSAFE; else { msSetError(MS_WMSERR, "Invalid auth_type metadata '%s' specified", "msHTTPAuthProxySetup()", pszTmp); return MS_FAILURE; } } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "auth_username")) != NULL) { pszHttpAuthUsername = msStrdup(pszTmp); } if ((pszTmp = msOWSLookupMetadata2(lyrmd, mapmd, namespaces, "auth_password")) != NULL) { pszHttpAuthPassword = msDecryptStringTokens(map, pszTmp); if (pszHttpAuthPassword == NULL) { msFree(pszHttpAuthUsername); msFree(pszProxyHost); msFree(pszProxyUsername); msFree(pszProxyPassword); return (MS_FAILURE); /* An error should already have been produced */ } } pasReqInfo[numRequests].pszProxyAddress = pszProxyHost; pasReqInfo[numRequests].nProxyPort = nProxyPort; pasReqInfo[numRequests].eProxyType = eProxyType; pasReqInfo[numRequests].eProxyAuthType = eProxyAuthType; pasReqInfo[numRequests].pszProxyUsername = pszProxyUsername; pasReqInfo[numRequests].pszProxyPassword = pszProxyPassword; pasReqInfo[numRequests].eHttpAuthType = eHttpAuthType; pasReqInfo[numRequests].pszHttpUsername = pszHttpAuthUsername; pasReqInfo[numRequests].pszHttpPassword = pszHttpAuthPassword; return MS_SUCCESS; } /********************************************************************** * msHTTPExecuteRequests() * * Fetch a map slide via HTTP request and save to specified temp file. * * If bCheckLocalCache==MS_TRUE then if the pszOutputfile already exists * then it is not downloaded again, and status 242 is returned. * * Return value: * MS_SUCCESS if all requests completed successfully. * MS_FAILURE if a fatal error happened * MS_DONE if some requests failed with 40x status for instance (not fatal) **********************************************************************/ int msHTTPExecuteRequests(httpRequestObj *pasReqInfo, int numRequests, int bCheckLocalCache) { int i, nStatus = MS_SUCCESS, nTimeout, still_running = 0, num_msgs = 0; CURLM *multi_handle; CURLMsg *curl_msg; char debug = MS_FALSE; const char *pszCurlCABundle = NULL; if (numRequests == 0) return MS_SUCCESS; /* Nothing to do */ if (!gbCurlInitialized) msHTTPInit(); /* Establish the timeout (seconds) for how long we are going to wait * for a response. * We use the longest timeout value in the array of requests */ nTimeout = pasReqInfo[0].nTimeout; for (i = 0; i < numRequests; i++) { if (pasReqInfo[i].nTimeout > nTimeout) nTimeout = pasReqInfo[i].nTimeout; if (pasReqInfo[i].debug) debug = MS_TRUE; /* For the download loop */ } if (nTimeout <= 0) nTimeout = 30; /* Check if we've got a CURL_CA_BUNDLE env. var. * If set then the value is the full path to the ca-bundle.crt file * e.g. CURL_CA_BUNDLE=/usr/local/share/curl/curl-ca-bundle.crt */ pszCurlCABundle = CPLGetConfigOption("CURL_CA_BUNDLE", NULL); if (debug) { msDebug("HTTP: Starting to prepare HTTP requests.\n"); if (pszCurlCABundle) msDebug("Using CURL_CA_BUNDLE=%s\n", pszCurlCABundle); } const char *pszHttpVersion = CPLGetConfigOption("CURL_HTTP_VERSION", NULL); /* Alloc a curl-multi handle, and add a curl-easy handle to it for each * file to download. */ multi_handle = curl_multi_init(); if (multi_handle == NULL) { msSetError(MS_HTTPERR, "curl_multi_init() failed.", "msHTTPExecuteRequests()"); return (MS_FAILURE); } for (i = 0; i < numRequests; i++) { CURL *http_handle; FILE *fp; if (pasReqInfo[i].pszGetUrl == NULL) { msSetError(MS_HTTPERR, "URL or output file parameter missing.", "msHTTPExecuteRequests()"); return (MS_FAILURE); } if (pasReqInfo[i].debug) { msDebug("HTTP request: id=%d, %s\n", pasReqInfo[i].nLayerId, pasReqInfo[i].pszGetUrl); } /* Reset some members */ pasReqInfo[i].nStatus = 0; if (pasReqInfo[i].pszContentType) free(pasReqInfo[i].pszContentType); pasReqInfo[i].pszContentType = NULL; /* Check local cache if requested */ if (bCheckLocalCache && pasReqInfo[i].pszOutputFile != NULL) { fp = fopen(pasReqInfo[i].pszOutputFile, "r"); if (fp) { /* File already there, don't download again. */ if (pasReqInfo[i].debug) msDebug("HTTP request: id=%d, found in cache, skipping.\n", pasReqInfo[i].nLayerId); fclose(fp); pasReqInfo[i].nStatus = 242; pasReqInfo[i].pszContentType = msStrdup("unknown/cached"); continue; } } /* Alloc curl handle */ http_handle = curl_easy_init(); if (http_handle == NULL) { msSetError(MS_HTTPERR, "curl_easy_init() failed.", "msHTTPExecuteRequests()"); return (MS_FAILURE); } pasReqInfo[i].curl_handle = http_handle; /* set URL, note that curl keeps only a ref to our string buffer */ unchecked_curl_easy_setopt(http_handle, CURLOPT_URL, pasReqInfo[i].pszGetUrl); #if CURL_AT_LEAST_VERSION(7, 85, 0) unchecked_curl_easy_setopt(http_handle, CURLOPT_PROTOCOLS_STR, "http,https"); #else unchecked_curl_easy_setopt(http_handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); #endif if (pszHttpVersion && strcmp(pszHttpVersion, "1.0") == 0) unchecked_curl_easy_setopt(http_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); else if (pszHttpVersion && strcmp(pszHttpVersion, "1.1") == 0) unchecked_curl_easy_setopt(http_handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); /* Set User-Agent (auto-generate if not set by caller */ if (pasReqInfo[i].pszUserAgent == NULL) { curl_version_info_data *psCurlVInfo; psCurlVInfo = curl_version_info(CURLVERSION_NOW); pasReqInfo[i].pszUserAgent = (char *)msSmallMalloc(100 * sizeof(char)); if (pasReqInfo[i].pszUserAgent) { sprintf(pasReqInfo[i].pszUserAgent, "MapServer/%s libcurl/%d.%d.%d", MS_VERSION, psCurlVInfo->version_num / 0x10000 & 0xff, psCurlVInfo->version_num / 0x100 & 0xff, psCurlVInfo->version_num & 0xff); } } if (pasReqInfo[i].pszUserAgent) { unchecked_curl_easy_setopt(http_handle, CURLOPT_USERAGENT, pasReqInfo[i].pszUserAgent); } /* Enable following redirections. Requires libcurl 7.10.1 at least */ unchecked_curl_easy_setopt(http_handle, CURLOPT_FOLLOWLOCATION, 1); unchecked_curl_easy_setopt(http_handle, CURLOPT_MAXREDIRS, 10); /* Set timeout.*/ unchecked_curl_easy_setopt(http_handle, CURLOPT_TIMEOUT, nTimeout); /* Pass CURL_CA_BUNDLE if set */ if (pszCurlCABundle) unchecked_curl_easy_setopt(http_handle, CURLOPT_CAINFO, pszCurlCABundle); /* Set proxying settings */ if (pasReqInfo[i].pszProxyAddress != NULL && strlen(pasReqInfo[i].pszProxyAddress) > 0) { long nProxyType = CURLPROXY_HTTP; unchecked_curl_easy_setopt(http_handle, CURLOPT_PROXY, pasReqInfo[i].pszProxyAddress); if (pasReqInfo[i].nProxyPort > 0 && pasReqInfo[i].nProxyPort < 65535) { unchecked_curl_easy_setopt(http_handle, CURLOPT_PROXYPORT, pasReqInfo[i].nProxyPort); } switch (pasReqInfo[i].eProxyType) { case MS_HTTP: nProxyType = CURLPROXY_HTTP; break; case MS_SOCKS5: nProxyType = CURLPROXY_SOCKS5; break; } unchecked_curl_easy_setopt(http_handle, CURLOPT_PROXYTYPE, nProxyType); /* If there is proxy authentication information, set it */ if (pasReqInfo[i].pszProxyUsername != NULL && pasReqInfo[i].pszProxyPassword != NULL && strlen(pasReqInfo[i].pszProxyUsername) > 0 && strlen(pasReqInfo[i].pszProxyPassword) > 0) { char szUsernamePasswd[128]; #if LIBCURL_VERSION_NUM >= 0x070a07 long nProxyAuthType = CURLAUTH_BASIC; /* CURLOPT_PROXYAUTH available only in Curl 7.10.7 and up */ nProxyAuthType = msGetCURLAuthType(pasReqInfo[i].eProxyAuthType); unchecked_curl_easy_setopt(http_handle, CURLOPT_PROXYAUTH, nProxyAuthType); #else /* We log an error but don't abort processing */ msSetError(MS_HTTPERR, "CURLOPT_PROXYAUTH not supported. Requires Curl 7.10.7 and " "up. *_proxy_auth_type setting ignored.", "msHTTPExecuteRequests()"); #endif /* LIBCURL_VERSION_NUM */ snprintf(szUsernamePasswd, 127, "%s:%s", pasReqInfo[i].pszProxyUsername, pasReqInfo[i].pszProxyPassword); unchecked_curl_easy_setopt(http_handle, CURLOPT_PROXYUSERPWD, szUsernamePasswd); } } /* Set HTTP Authentication settings */ if (pasReqInfo[i].pszHttpUsername != NULL && pasReqInfo[i].pszHttpPassword != NULL && strlen(pasReqInfo[i].pszHttpUsername) > 0 && strlen(pasReqInfo[i].pszHttpPassword) > 0) { char szUsernamePasswd[128]; long nHttpAuthType = CURLAUTH_BASIC; snprintf(szUsernamePasswd, 127, "%s:%s", pasReqInfo[i].pszHttpUsername, pasReqInfo[i].pszHttpPassword); unchecked_curl_easy_setopt(http_handle, CURLOPT_USERPWD, szUsernamePasswd); nHttpAuthType = msGetCURLAuthType(pasReqInfo[i].eHttpAuthType); unchecked_curl_easy_setopt(http_handle, CURLOPT_HTTPAUTH, nHttpAuthType); } /* NOSIGNAL should be set to true for timeout to work in multithread * environments on Unix, requires libcurl 7.10 or more recent. * (this force avoiding the use of sgnal handlers) */ #ifdef CURLOPT_NOSIGNAL unchecked_curl_easy_setopt(http_handle, CURLOPT_NOSIGNAL, 1); #endif /* If we are writing file to disk, open the file now. */ if (pasReqInfo[i].pszOutputFile != NULL) { if ((fp = fopen(pasReqInfo[i].pszOutputFile, "wb")) == NULL) { msSetError(MS_HTTPERR, "Can't open output file %s.", "msHTTPExecuteRequests()", pasReqInfo[i].pszOutputFile); return (MS_FAILURE); } pasReqInfo[i].fp = fp; } /* coverity[bad_sizeof] */ unchecked_curl_easy_setopt(http_handle, CURLOPT_WRITEDATA, &(pasReqInfo[i])); unchecked_curl_easy_setopt(http_handle, CURLOPT_WRITEFUNCTION, msHTTPWriteFct); /* Provide a buffer where libcurl can write human readable error msgs */ if (pasReqInfo[i].pszErrBuf == NULL) pasReqInfo[i].pszErrBuf = (char *)msSmallMalloc((CURL_ERROR_SIZE + 1) * sizeof(char)); pasReqInfo[i].pszErrBuf[0] = '\0'; unchecked_curl_easy_setopt(http_handle, CURLOPT_ERRORBUFFER, pasReqInfo[i].pszErrBuf); pasReqInfo[i].curl_headers = NULL; if (pasReqInfo[i].pszPostRequest != NULL) { char szBuf[100]; snprintf(szBuf, 100, "Content-Type: %s", pasReqInfo[i].pszPostContentType); pasReqInfo[i].curl_headers = curl_slist_append(NULL, szBuf); unchecked_curl_easy_setopt(http_handle, CURLOPT_POST, 1); unchecked_curl_easy_setopt(http_handle, CURLOPT_POSTFIELDS, pasReqInfo[i].pszPostRequest); if (debug) { msDebug("HTTP: POST = %s", pasReqInfo[i].pszPostRequest); } unchecked_curl_easy_setopt(http_handle, CURLOPT_HTTPHEADER, pasReqInfo[i].curl_headers); } /* Added by RFC-42 HTTP Cookie Forwarding */ if (pasReqInfo[i].pszHTTPCookieData != NULL) { /* Check if there's no end of line in the Cookie string */ /* This could break the HTTP Header */ for (size_t nPos = 0; nPos < strlen(pasReqInfo[i].pszHTTPCookieData); nPos++) { if (pasReqInfo[i].pszHTTPCookieData[nPos] == '\n') { msSetError(MS_HTTPERR, "Can't use cookie containing a newline character.", "msHTTPExecuteRequests()"); return (MS_FAILURE); } } /* Set the Curl option to send Cookie */ unchecked_curl_easy_setopt(http_handle, CURLOPT_COOKIE, pasReqInfo[i].pszHTTPCookieData); } /* Add to multi handle */ curl_multi_add_handle(multi_handle, http_handle); } if (debug) { msDebug("HTTP: Before download loop\n"); } /* DOWNLOAD LOOP ... inspired from multi-double.c example */ /* we start some action by calling perform right away */ while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running)) ; while (still_running) { struct timeval timeout; int rc; /* select() return code */ fd_set fdread; fd_set fdwrite; fd_set fdexcep; int maxfd; FD_ZERO(&fdread); FD_ZERO(&fdwrite); FD_ZERO(&fdexcep); /* set a suitable timeout to play around with */ timeout.tv_sec = 0; timeout.tv_usec = 100000; /* get file descriptors from the transfers */ curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout); switch (rc) { case -1: /* select error */ /* ==================================================================== */ /* On Windows the select function (just above) returns -1 when */ /* it is called the second time and all the calls after */ /* that. This causes an infinite loop. */ /* I do not really know why. */ /* To solve the problem the break from case -1 has been removed. */ /* ==================================================================== */ #ifndef _WIN32 break; #endif case 0: default: /* timeout or readable/writable sockets */ curl_multi_perform(multi_handle, &still_running); break; } } if (debug) msDebug("HTTP: After download loop\n"); /* Scan message stack from CURL and report fatal errors*/ while ((curl_msg = curl_multi_info_read(multi_handle, &num_msgs)) != NULL) { httpRequestObj *psReq = NULL; if (curl_msg->msg == CURLMSG_DONE && curl_msg->data.result != CURLE_OK) { /* Something went wrong with this transfer... report error */ for (i = 0; i < numRequests; i++) { if (pasReqInfo[i].curl_handle == curl_msg->easy_handle) { psReq = &(pasReqInfo[i]); break; } } if (psReq != NULL) { /* Record error code in nStatus as a negative value */ psReq->nStatus = -curl_msg->data.result; } } } if (debug) { /* Print a msDebug header for timings reported in the loop below */ msDebug("msHTTPExecuteRequests() timing summary per layer (connect_time + " "time_to_first_packet + download_time = total_time in seconds)\n"); } /* Check status of all requests, close files, report errors and cleanup * handles */ for (i = 0; i < numRequests; i++) { httpRequestObj *psReq; CURL *http_handle; long lVal = 0; psReq = &(pasReqInfo[i]); if (psReq->nStatus == 242) continue; /* Nothing to do here, this file was in cache already */ if (psReq->fp) fclose(psReq->fp); psReq->fp = NULL; http_handle = (CURL *)(psReq->curl_handle); if (psReq->nStatus == 0 && curl_easy_getinfo(http_handle, CURLINFO_HTTP_CODE, &lVal) == CURLE_OK) { char *pszContentType = NULL; psReq->nStatus = lVal; /* Fetch content type of response */ if (curl_easy_getinfo(http_handle, CURLINFO_CONTENT_TYPE, &pszContentType) == CURLE_OK && pszContentType != NULL) { psReq->pszContentType = msStrdup(pszContentType); } } if (!MS_HTTP_SUCCESS(psReq->nStatus)) { /* Set status to MS_DONE to indicate that transfers were */ /* completed but may not be successful */ nStatus = MS_DONE; if (psReq->nStatus == -(CURLE_OPERATION_TIMEOUTED)) { /* Timeout isn't a fatal error */ if (psReq->debug) msDebug("HTTP: TIMEOUT of %d seconds exceeded for %s\n", nTimeout, psReq->pszGetUrl); msSetError(MS_HTTPERR, "HTTP: TIMEOUT of %d seconds exceeded for %s\n", "msHTTPExecuteRequests()", nTimeout, psReq->pszGetUrl); /* Rewrite error message, the curl timeout message isn't * of much use to our users. */ sprintf(psReq->pszErrBuf, "TIMEOUT of %d seconds exceeded.", nTimeout); } else if (psReq->nStatus > 0) { /* Got an HTTP Error, e.g. 404, etc. */ if (psReq->debug) msDebug("HTTP: HTTP GET request failed with status %d (%s)" " for %s\n", psReq->nStatus, psReq->pszErrBuf, psReq->pszGetUrl); msSetError(MS_HTTPERR, "HTTP GET request failed with status %d (%s) " "for %s", "msHTTPExecuteRequests()", psReq->nStatus, psReq->pszErrBuf, psReq->pszGetUrl); } else { /* Got a curl error */ errorObj *error = msGetErrorObj(); if (psReq->debug) msDebug("HTTP: request failed with curl error " "code %d (%s) for %s", -psReq->nStatus, psReq->pszErrBuf, psReq->pszGetUrl); if (!error || error->code == MS_NOERR) /* only set error if one hasn't already been set */ msSetError(MS_HTTPERR, "HTTP: request failed with curl error " "code %d (%s) for %s", "msHTTPExecuteRequests()", -psReq->nStatus, psReq->pszErrBuf, psReq->pszGetUrl); } } /* Report download times foreach handle, in debug mode */ if (psReq->debug) { double dConnectTime = 0.0, dTotalTime = 0.0, dStartTfrTime = 0.0; curl_easy_getinfo(http_handle, CURLINFO_CONNECT_TIME, &dConnectTime); curl_easy_getinfo(http_handle, CURLINFO_STARTTRANSFER_TIME, &dStartTfrTime); curl_easy_getinfo(http_handle, CURLINFO_TOTAL_TIME, &dTotalTime); /* STARTTRANSFER_TIME includes CONNECT_TIME, but TOTAL_TIME * doesn't, so we need to add it. */ dTotalTime += dConnectTime; msDebug("Layer %d: %.3f + %.3f + %.3f = %.3fs\n", psReq->nLayerId, dConnectTime, dStartTfrTime - dConnectTime, dTotalTime - dStartTfrTime, dTotalTime); } /* Cleanup this handle */ unchecked_curl_easy_setopt(http_handle, CURLOPT_URL, ""); curl_multi_remove_handle(multi_handle, http_handle); curl_easy_cleanup(http_handle); psReq->curl_handle = NULL; curl_slist_free_all(psReq->curl_headers); // free the header list } /* Cleanup multi handle, each handle had to be cleaned up individually */ curl_multi_cleanup(multi_handle); return nStatus; } /********************************************************************** * msHTTPGetFile() * * Wrapper to call msHTTPExecuteRequests() for a single file. **********************************************************************/ int msHTTPGetFile(const char *pszGetUrl, const char *pszOutputFile, int *pnHTTPStatus, int nTimeout, int bCheckLocalCache, int bDebug, int nMaxBytes) { httpRequestObj *pasReqInfo; /* Alloc httpRequestInfo structs through which status of each request * will be returned. * We need to alloc 2 instance of requestobj so that the last * object in the array can be set to NULL. */ pasReqInfo = (httpRequestObj *)calloc(2, sizeof(httpRequestObj)); MS_CHECK_ALLOC(pasReqInfo, 2 * sizeof(httpRequestObj), MS_FAILURE); msHTTPInitRequestObj(pasReqInfo, 2); pasReqInfo[0].pszGetUrl = msStrdup(pszGetUrl); pasReqInfo[0].pszOutputFile = msStrdup(pszOutputFile); pasReqInfo[0].debug = (char)bDebug; pasReqInfo[0].nTimeout = nTimeout; pasReqInfo[0].nMaxBytes = nMaxBytes; if (msHTTPExecuteRequests(pasReqInfo, 1, bCheckLocalCache) != MS_SUCCESS) { *pnHTTPStatus = pasReqInfo[0].nStatus; if (pasReqInfo[0].debug) msDebug("HTTP request failed for %s.\n", pszGetUrl); msHTTPFreeRequestObj(pasReqInfo, 2); free(pasReqInfo); return MS_FAILURE; } *pnHTTPStatus = pasReqInfo[0].nStatus; msHTTPFreeRequestObj(pasReqInfo, 2); free(pasReqInfo); return MS_SUCCESS; } #endif /* defined(USE_WMS_LYR) || defined(USE_WMS_SVR) */ mapserver-8.6.0/src/maphttp.h000066400000000000000000000103501511405061000161360ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: http requests related functions * Author: MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPHTTP_H #define MAPHTTP_H #include "mapprimitive.h" #include #ifdef __cplusplus extern "C" { #endif #define MS_HTTP_SUCCESS(status) (status == 200 || status == 242) enum MS_HTTP_PROXY_TYPE { MS_HTTP, MS_SOCKS5 }; enum MS_HTTP_AUTH_TYPE { MS_BASIC, MS_DIGEST, MS_NTLM, MS_ANY, MS_ANYSAFE }; typedef struct http_request_info { int nLayerId; char *pszGetUrl; char *pszOutputFile; char *pszEPSG; int nTimeout; int nMaxBytes; rectObj bbox; int width; int height; int nStatus; /* 200=success, value < 0 if request failed */ char *pszContentType; /* Content-Type of the response */ char *pszErrBuf; /* Buffer where curl can write errors */ char *pszPostRequest; /* post request content (NULL for GET) */ char *pszPostContentType; /* post request MIME type */ char *pszUserAgent; /* User-Agent, auto-generated if not set */ char *pszHTTPCookieData; /* HTTP Cookie data */ char *pszProxyAddress; /* The address (IP or hostname) of proxy svr */ long nProxyPort; /* The proxy's port */ enum MS_HTTP_PROXY_TYPE eProxyType; /* The type of proxy */ enum MS_HTTP_AUTH_TYPE eProxyAuthType; /* Auth method against proxy */ char *pszProxyUsername; /* Proxy authentication username */ char *pszProxyPassword; /* Proxy authentication password */ enum MS_HTTP_AUTH_TYPE eHttpAuthType; /* HTTP Authentication type */ char *pszHttpUsername; /* HTTP Authentication username */ char *pszHttpPassword; /* HTTP Authentication password */ /* For debugging/profiling */ int debug; /* Debug mode? MS_TRUE/MS_FALSE */ /* Private members */ void *curl_headers; /* property to store a curl_slist handle */ void *curl_handle; /* CURLM * handle */ FILE *fp; /* FILE * used during download */ char *result_data; /* output if pszOutputFile is NULL */ int result_size; int result_buf_size; } httpRequestObj; #ifdef USE_CURL int msHTTPInit(void); void msHTTPCleanup(void); void msHTTPInitRequestObj(httpRequestObj *pasReqInfo, int numRequests); void msHTTPFreeRequestObj(httpRequestObj *pasReqInfo, int numRequests); int msHTTPExecuteRequests(httpRequestObj *pasReqInfo, int numRequests, int bCheckLocalCache); int msHTTPGetFile(const char *pszGetUrl, const char *pszOutputFile, int *pnHTTPStatus, int nTimeout, int bCheckLocalCache, int bDebug, int nMaxBytes); int msHTTPAuthProxySetup(hashTableObj *mapmd, hashTableObj *lyrmd, httpRequestObj *pasReqInfo, int numRequests, mapObj *map, const char *namespaces); #endif /*USE_CURL*/ #ifdef __cplusplus } #endif #endif /* MAPHTTP_H */ mapserver-8.6.0/src/mapiconv.c000066400000000000000000000032321511405061000162710ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: Wrapper for iconv functions * Author: Even Rouault * ****************************************************************************** * Copyright (c) 2020 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapiconv.h" size_t msIconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft) { return iconv(cd, inbuf, inbytesleft, outbuf, outbytesleft); } mapserver-8.6.0/src/mapiconv.h000066400000000000000000000033671511405061000163070ustar00rootroot00000000000000/****************************************************************************** * * Project: MapServer * Purpose: Wrapper for iconv functions * Author: Even Rouault * ****************************************************************************** * Copyright (c) 2020 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #ifndef MAPICONV_H #define MAPICONV_H #ifdef __cplusplus extern "C" { #endif #include /* Wrapper of iconv() to be used from C++ */ size_t msIconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); #ifdef __cplusplus } #endif #endif mapserver-8.6.0/src/mapimageio.c000066400000000000000000001133471511405061000165760ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Low level PNG/JPEG/GIF image io native functions * Author: Thomas Bonfort (tbonfort) * ****************************************************************************** * Copyright (c) 2009 Thomas Bonfort * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include #include #include #include #include #ifdef USE_GIF #include #endif typedef struct _streamInfo { FILE *fp; bufferObj *buffer; } streamInfo; static void png_write_data_to_stream(png_structp png_ptr, png_bytep data, png_size_t length) { FILE *fp = ((streamInfo *)png_get_io_ptr(png_ptr))->fp; msIO_fwrite(data, length, 1, fp); } static void png_write_data_to_buffer(png_structp png_ptr, png_bytep data, png_size_t length) { bufferObj *buffer = ((streamInfo *)png_get_io_ptr(png_ptr))->buffer; msBufferAppend(buffer, data, length); } static void png_flush_data(png_structp png_ptr) { (void)png_ptr; /* do nothing */ } typedef struct { struct jpeg_destination_mgr pub; unsigned char *data; } ms_destination_mgr; typedef struct { ms_destination_mgr mgr; FILE *stream; } ms_stream_destination_mgr; typedef struct { ms_destination_mgr mgr; bufferObj *buffer; } ms_buffer_destination_mgr; #define OUTPUT_BUF_SIZE 4096 static void jpeg_init_destination(j_compress_ptr cinfo) { ms_destination_mgr *dest = (ms_destination_mgr *)cinfo->dest; /* Allocate the output buffer --- it will be released when done with image */ dest->data = (unsigned char *)(*cinfo->mem->alloc_small)( (j_common_ptr)cinfo, JPOOL_IMAGE, OUTPUT_BUF_SIZE * sizeof(unsigned char)); dest->pub.next_output_byte = dest->data; dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; } static void jpeg_stream_term_destination(j_compress_ptr cinfo) { ms_stream_destination_mgr *dest = (ms_stream_destination_mgr *)cinfo->dest; msIO_fwrite(dest->mgr.data, OUTPUT_BUF_SIZE - dest->mgr.pub.free_in_buffer, 1, dest->stream); dest->mgr.pub.next_output_byte = dest->mgr.data; dest->mgr.pub.free_in_buffer = OUTPUT_BUF_SIZE; } static void jpeg_buffer_term_destination(j_compress_ptr cinfo) { ms_buffer_destination_mgr *dest = (ms_buffer_destination_mgr *)cinfo->dest; msBufferAppend(dest->buffer, dest->mgr.data, OUTPUT_BUF_SIZE - dest->mgr.pub.free_in_buffer); dest->mgr.pub.next_output_byte = dest->mgr.data; dest->mgr.pub.free_in_buffer = OUTPUT_BUF_SIZE; } static boolean jpeg_stream_empty_output_buffer(j_compress_ptr cinfo) { ms_stream_destination_mgr *dest = (ms_stream_destination_mgr *)cinfo->dest; msIO_fwrite(dest->mgr.data, OUTPUT_BUF_SIZE, 1, dest->stream); dest->mgr.pub.next_output_byte = dest->mgr.data; dest->mgr.pub.free_in_buffer = OUTPUT_BUF_SIZE; return TRUE; } static boolean jpeg_buffer_empty_output_buffer(j_compress_ptr cinfo) { ms_buffer_destination_mgr *dest = (ms_buffer_destination_mgr *)cinfo->dest; msBufferAppend(dest->buffer, dest->mgr.data, OUTPUT_BUF_SIZE); dest->mgr.pub.next_output_byte = dest->mgr.data; dest->mgr.pub.free_in_buffer = OUTPUT_BUF_SIZE; return TRUE; } static void msJPEGErrorExit(j_common_ptr cinfo) { jmp_buf *pJmpBuffer = (jmp_buf *)cinfo->client_data; char buffer[JMSG_LENGTH_MAX]; /* Create the message */ (*cinfo->err->format_message)(cinfo, buffer); msSetError(MS_MISCERR, "libjpeg: %s", "jpeg_ErrorExit()", buffer); /* Return control to the setjmp point */ longjmp(*pJmpBuffer, 1); } int saveAsJPEG(mapObj *map, rasterBufferObj *rb, streamInfo *info, outputFormatObj *format) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; int quality; const char *pszOptimized; int optimized; int arithmetic; ms_destination_mgr *dest; JSAMPLE *rowdata = NULL; unsigned int row; jmp_buf setjmp_buffer; quality = atoi(msGetOutputFormatOption(format, "QUALITY", "75")); pszOptimized = msGetOutputFormatOption(format, "OPTIMIZED", "YES"); optimized = EQUAL(pszOptimized, "YES") || EQUAL(pszOptimized, "ON") || EQUAL(pszOptimized, "TRUE"); arithmetic = EQUAL(pszOptimized, "ARITHMETIC"); if (setjmp(setjmp_buffer)) { jpeg_destroy_compress(&cinfo); free(rowdata); return MS_FAILURE; } cinfo.err = jpeg_std_error(&jerr); jerr.error_exit = msJPEGErrorExit; cinfo.client_data = (void *)&(setjmp_buffer); jpeg_create_compress(&cinfo); if (cinfo.dest == NULL) { if (info->fp) { cinfo.dest = (struct jpeg_destination_mgr *)(*cinfo.mem->alloc_small)( (j_common_ptr)&cinfo, JPOOL_PERMANENT, sizeof(ms_stream_destination_mgr)); ((ms_stream_destination_mgr *)cinfo.dest)->mgr.pub.empty_output_buffer = jpeg_stream_empty_output_buffer; ((ms_stream_destination_mgr *)cinfo.dest)->mgr.pub.term_destination = jpeg_stream_term_destination; ((ms_stream_destination_mgr *)cinfo.dest)->stream = info->fp; } else { cinfo.dest = (struct jpeg_destination_mgr *)(*cinfo.mem->alloc_small)( (j_common_ptr)&cinfo, JPOOL_PERMANENT, sizeof(ms_buffer_destination_mgr)); ((ms_buffer_destination_mgr *)cinfo.dest)->mgr.pub.empty_output_buffer = jpeg_buffer_empty_output_buffer; ((ms_buffer_destination_mgr *)cinfo.dest)->mgr.pub.term_destination = jpeg_buffer_term_destination; ((ms_buffer_destination_mgr *)cinfo.dest)->buffer = info->buffer; } } dest = (ms_destination_mgr *)cinfo.dest; dest->pub.init_destination = jpeg_init_destination; cinfo.image_width = rb->width; cinfo.image_height = rb->height; cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, TRUE); if (arithmetic) cinfo.arith_code = TRUE; else if (optimized) cinfo.optimize_coding = TRUE; if (arithmetic || optimized) { /* libjpeg turbo 1.5.2 honours max_memory_to_use, but has no backing */ /* store implementation, so better not set max_memory_to_use ourselves. */ /* See https://github.com/libjpeg-turbo/libjpeg-turbo/issues/162 */ if (cinfo.mem->max_memory_to_use > 0) { if (map == NULL || msGetConfigOption(map, "JPEGMEM") == NULL) { /* If the user doesn't provide a value for JPEGMEM, we want to be sure */ /* that at least the image size will be used before creating the * temporary file */ cinfo.mem->max_memory_to_use = MS_MAX(cinfo.mem->max_memory_to_use, cinfo.input_components * rb->width * rb->height); } } } jpeg_start_compress(&cinfo, TRUE); rowdata = (JSAMPLE *)malloc(sizeof(JSAMPLE) * rb->width * cinfo.input_components); for (row = 0; row < rb->height; row++) { JSAMPLE *pixptr = rowdata; unsigned char *r, *g, *b; r = rb->data.rgba.r + row * rb->data.rgba.row_step; g = rb->data.rgba.g + row * rb->data.rgba.row_step; b = rb->data.rgba.b + row * rb->data.rgba.row_step; for (unsigned col = 0; col < rb->width; col++) { *(pixptr++) = *r; *(pixptr++) = *g; *(pixptr++) = *b; r += rb->data.rgba.pixel_step; g += rb->data.rgba.pixel_step; b += rb->data.rgba.pixel_step; } (void)jpeg_write_scanlines(&cinfo, &rowdata, 1); } /* Step 6: Finish compression */ jpeg_finish_compress(&cinfo); jpeg_destroy_compress(&cinfo); free(rowdata); return MS_SUCCESS; } /* * sort a given list of rgba entries so that all the opaque pixels are at the * end */ int remapPaletteForPNG(rasterBufferObj *rb, rgbPixel *rgb, unsigned char *a, int *num_a) { int bot_idx, top_idx; unsigned x; int remap[256]; unsigned int maxval = rb->data.palette.scaling_maxval; assert(rb->type == MS_BUFFER_BYTE_PALETTE); /* ** remap the palette colors so that all entries with ** the maximal alpha value (i.e., fully opaque) are at the end and can ** therefore be omitted from the tRNS chunk. Note that the ordering of ** opaque entries is reversed from how they were previously arranged ** --not that this should matter to anyone. */ for (top_idx = (int)rb->data.palette.num_entries - 1, bot_idx = x = 0; x < rb->data.palette.num_entries; ++x) { if (rb->data.palette.palette[x].a == maxval) remap[x] = top_idx--; else remap[x] = bot_idx++; } /* sanity check: top and bottom indices should have just crossed paths */ if (bot_idx != top_idx + 1) { msSetError(MS_MISCERR, "quantization sanity check failed", "createPNGPalette()"); return MS_FAILURE; } *num_a = bot_idx; for (x = 0; x < rb->width * rb->height; x++) rb->data.palette.pixels[x] = remap[rb->data.palette.pixels[x]]; for (x = 0; x < rb->data.palette.num_entries; ++x) { if (maxval == 255) { a[remap[x]] = rb->data.palette.palette[x].a; rgb[remap[x]].r = rb->data.palette.palette[x].r; rgb[remap[x]].g = rb->data.palette.palette[x].g; rgb[remap[x]].b = rb->data.palette.palette[x].b; } else { /* rescale palette */ rgb[remap[x]].r = (rb->data.palette.palette[x].r * 255 + (maxval >> 1)) / maxval; rgb[remap[x]].g = (rb->data.palette.palette[x].g * 255 + (maxval >> 1)) / maxval; rgb[remap[x]].b = (rb->data.palette.palette[x].b * 255 + (maxval >> 1)) / maxval; a[remap[x]] = (rb->data.palette.palette[x].a * 255 + (maxval >> 1)) / maxval; } if (a[remap[x]] != 255) { /* un-premultiply pixels */ double da = 255.0 / a[remap[x]]; rgb[remap[x]].r *= da; rgb[remap[x]].g *= da; rgb[remap[x]].b *= da; } } return MS_SUCCESS; } int savePalettePNG(rasterBufferObj *rb, streamInfo *info, int compression) { png_infop info_ptr; rgbPixel rgb[256]; unsigned char a[256]; int num_a; int sample_depth; png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); assert(rb->type == MS_BUFFER_BYTE_PALETTE); if (!png_ptr) return (MS_FAILURE); png_set_compression_level(png_ptr, compression); png_set_filter(png_ptr, 0, PNG_FILTER_NONE); info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_write_struct(&png_ptr, (png_infopp)NULL); return (MS_FAILURE); } if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_write_struct(&png_ptr, &info_ptr); return (MS_FAILURE); } if (info->fp) png_set_write_fn(png_ptr, info, png_write_data_to_stream, png_flush_data); else png_set_write_fn(png_ptr, info, png_write_data_to_buffer, png_flush_data); if (rb->data.palette.num_entries <= 2) sample_depth = 1; else if (rb->data.palette.num_entries <= 4) sample_depth = 2; else if (rb->data.palette.num_entries <= 16) sample_depth = 4; else sample_depth = 8; png_set_IHDR(png_ptr, info_ptr, rb->width, rb->height, sample_depth, PNG_COLOR_TYPE_PALETTE, 0, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); remapPaletteForPNG(rb, rgb, a, &num_a); png_set_PLTE(png_ptr, info_ptr, (png_colorp)(rgb), rb->data.palette.num_entries); if (num_a) png_set_tRNS(png_ptr, info_ptr, a, num_a, NULL); png_write_info(png_ptr, info_ptr); png_set_packing(png_ptr); for (unsigned row = 0; row < rb->height; row++) { unsigned char *rowptr = &(rb->data.palette.pixels[row * rb->width]); png_write_row(png_ptr, rowptr); } png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); return MS_SUCCESS; } int readPalette(const char *palette, rgbaPixel *entries, unsigned int *nEntries, int useAlpha) { FILE *stream = NULL; char buffer[MS_BUFFER_LENGTH]; *nEntries = 0; stream = fopen(palette, "r"); if (!stream) { msSetError(MS_IOERR, "Error opening palette file %s.", "readPalette()", palette); return MS_FAILURE; } while (fgets(buffer, MS_BUFFER_LENGTH, stream) && *nEntries < 256) { int r, g, b, a = 0; /* while there are colors to load */ if (buffer[0] == '#' || buffer[0] == '\n' || buffer[0] == '\r') continue; /* skip comments and blank lines */ if (!useAlpha) { if (3 != sscanf(buffer, "%d,%d,%d\n", &r, &g, &b)) { fclose(stream); msSetError(MS_MISCERR, "failed to parse color %d r,g,b triplet in line \"%s\" from " "file %s", "readPalette()", *nEntries + 1, buffer, palette); return MS_FAILURE; } } else { if (4 != sscanf(buffer, "%d,%d,%d,%d\n", &r, &g, &b, &a)) { fclose(stream); msSetError(MS_MISCERR, "failed to parse color %d r,g,b,a quadruplet in line \"%s\" " "from file %s", "readPalette()", *nEntries + 1, buffer, palette); return MS_FAILURE; } } if (useAlpha && a != 255) { double da = a / 255.0; entries[*nEntries].r = r * da; entries[*nEntries].g = g * da; entries[*nEntries].b = b * da; entries[*nEntries].a = a; } else { entries[*nEntries].r = r; entries[*nEntries].g = g; entries[*nEntries].b = b; entries[*nEntries].a = 255; } (*nEntries)++; } fclose(stream); return MS_SUCCESS; } int saveAsPNG(mapObj *map, rasterBufferObj *rb, streamInfo *info, outputFormatObj *format) { int force_pc256 = MS_FALSE; int force_palette = MS_FALSE; const char *force_string, *zlib_compression; int compression = -1; zlib_compression = msGetOutputFormatOption(format, "COMPRESSION", NULL); if (zlib_compression && *zlib_compression) { char *endptr; compression = strtol(zlib_compression, &endptr, 10); if (*endptr || compression < -1 || compression > 9) { msSetError(MS_MISCERR, "failed to parse FORMATOPTION \"COMPRESSION=%s\", expecting " "integer from 0 to 9.", "saveAsPNG()", zlib_compression); return MS_FAILURE; } } force_string = msGetOutputFormatOption(format, "QUANTIZE_FORCE", NULL); if (force_string && (strcasecmp(force_string, "on") == 0 || strcasecmp(force_string, "yes") == 0 || strcasecmp(force_string, "true") == 0)) force_pc256 = MS_TRUE; force_string = msGetOutputFormatOption(format, "PALETTE_FORCE", NULL); if (force_string && (strcasecmp(force_string, "on") == 0 || strcasecmp(force_string, "yes") == 0 || strcasecmp(force_string, "true") == 0)) force_palette = MS_TRUE; if (force_pc256 || force_palette) { rasterBufferObj qrb; rgbaPixel palette[256], paletteGiven[256]; unsigned int numPaletteGivenEntries; memset(&qrb, 0, sizeof(rasterBufferObj)); qrb.type = MS_BUFFER_BYTE_PALETTE; qrb.width = rb->width; qrb.height = rb->height; qrb.data.palette.pixels = (unsigned char *)malloc(sizeof(unsigned char) * qrb.width * qrb.height); qrb.data.palette.scaling_maxval = 255; int ret; if (force_pc256) { qrb.data.palette.palette = palette; qrb.data.palette.num_entries = atoi(msGetOutputFormatOption(format, "QUANTIZE_COLORS", "256")); ret = msQuantizeRasterBuffer(rb, &(qrb.data.palette.num_entries), qrb.data.palette.palette, NULL, 0, &qrb.data.palette.scaling_maxval); } else { unsigned colorsWanted = (unsigned)atoi( msGetOutputFormatOption(format, "QUANTIZE_COLORS", "0")); const char *palettePath = msGetOutputFormatOption(format, "PALETTE", "palette.txt"); char szPath[MS_MAXPATHLEN]; if (map) { msBuildPath(szPath, map->mappath, palettePath); palettePath = szPath; } if (readPalette(palettePath, paletteGiven, &numPaletteGivenEntries, format->transparent) != MS_SUCCESS) { msFree(qrb.data.palette.pixels); return MS_FAILURE; } if (numPaletteGivenEntries == 256 || colorsWanted == 0) { qrb.data.palette.palette = paletteGiven; qrb.data.palette.num_entries = numPaletteGivenEntries; ret = MS_SUCCESS; /* we have a full palette and don't want an additional quantization step */ } else { /* quantize the image, and mix our colours in the resulting palette */ qrb.data.palette.palette = palette; qrb.data.palette.num_entries = MS_MAX(colorsWanted, numPaletteGivenEntries); ret = msQuantizeRasterBuffer(rb, &(qrb.data.palette.num_entries), qrb.data.palette.palette, paletteGiven, numPaletteGivenEntries, &qrb.data.palette.scaling_maxval); } } if (ret != MS_FAILURE) { msClassifyRasterBuffer(rb, &qrb); ret = savePalettePNG(&qrb, info, compression); } msFree(qrb.data.palette.pixels); return ret; } else if (rb->type == MS_BUFFER_BYTE_RGBA) { png_infop info_ptr; int color_type; unsigned int *rowdata; png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) return (MS_FAILURE); png_set_compression_level(png_ptr, compression); png_set_filter(png_ptr, 0, PNG_FILTER_NONE); info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_write_struct(&png_ptr, (png_infopp)NULL); return (MS_FAILURE); } if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_write_struct(&png_ptr, &info_ptr); return (MS_FAILURE); } if (info->fp) png_set_write_fn(png_ptr, info, png_write_data_to_stream, png_flush_data); else png_set_write_fn(png_ptr, info, png_write_data_to_buffer, png_flush_data); if (rb->data.rgba.a) color_type = PNG_COLOR_TYPE_RGB_ALPHA; else color_type = PNG_COLOR_TYPE_RGB; png_set_IHDR(png_ptr, info_ptr, rb->width, rb->height, 8, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_write_info(png_ptr, info_ptr); if (!rb->data.rgba.a && rb->data.rgba.pixel_step == 4) png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); rowdata = (unsigned int *)malloc(rb->width * sizeof(unsigned int)); for (unsigned row = 0; row < rb->height; row++) { unsigned int *pixptr = rowdata; unsigned char *a, *r, *g, *b; r = rb->data.rgba.r + row * rb->data.rgba.row_step; g = rb->data.rgba.g + row * rb->data.rgba.row_step; b = rb->data.rgba.b + row * rb->data.rgba.row_step; if (rb->data.rgba.a) { a = rb->data.rgba.a + row * rb->data.rgba.row_step; for (unsigned col = 0; col < rb->width; col++) { if (*a) { double da = *a / 255.0; unsigned char *pix = (unsigned char *)pixptr; pix[0] = *r / da; pix[1] = *g / da; pix[2] = *b / da; pix[3] = *a; } else { *pixptr = 0; } pixptr++; a += rb->data.rgba.pixel_step; r += rb->data.rgba.pixel_step; g += rb->data.rgba.pixel_step; b += rb->data.rgba.pixel_step; } } else { for (unsigned col = 0; col < rb->width; col++) { unsigned char *pix = (unsigned char *)pixptr; pix[0] = *r; pix[1] = *g; pix[2] = *b; pixptr++; r += rb->data.rgba.pixel_step; g += rb->data.rgba.pixel_step; b += rb->data.rgba.pixel_step; } } png_write_row(png_ptr, (png_bytep)rowdata); } png_write_end(png_ptr, info_ptr); free(rowdata); png_destroy_write_struct(&png_ptr, &info_ptr); return MS_SUCCESS; } else { msSetError(MS_MISCERR, "Unknown buffer type", "saveAsPNG()"); return MS_FAILURE; } } /* For platforms with incomplete ANSI defines. Fortunately, SEEK_SET is defined to be zero by the standard. */ #ifndef SEEK_SET #define SEEK_SET 0 #endif /* SEEK_SET */ int readPNG(char *path, rasterBufferObj *rb) { png_uint_32 width, height; unsigned char *a, *r, *g, *b; int bit_depth, color_type; unsigned char **row_pointers; png_structp png_ptr = NULL; png_infop info_ptr = NULL; FILE *stream = fopen(path, "rb"); if (!stream) return MS_FAILURE; /* could pass pointers to user-defined error handlers instead of NULLs: */ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { fclose(stream); return MS_FAILURE; /* out of memory */ } info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, NULL, NULL); fclose(stream); return MS_FAILURE; /* out of memory */ } if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_read_struct(&png_ptr, &info_ptr, NULL); fclose(stream); return MS_FAILURE; } png_init_io(png_ptr, stream); png_read_info(png_ptr, info_ptr); png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL); rb->width = width; rb->height = height; rb->type = MS_BUFFER_BYTE_RGBA; rb->data.rgba.pixels = (unsigned char *)malloc(sizeof(unsigned char) * width * height * 4); row_pointers = (unsigned char **)malloc(height * sizeof(unsigned char *)); rb->data.rgba.pixel_step = 4; rb->data.rgba.row_step = width * 4; b = rb->data.rgba.b = &rb->data.rgba.pixels[0]; g = rb->data.rgba.g = &rb->data.rgba.pixels[1]; r = rb->data.rgba.r = &rb->data.rgba.pixels[2]; a = rb->data.rgba.a = &rb->data.rgba.pixels[3]; for (unsigned i = 0; i < height; i++) { row_pointers[i] = &(rb->data.rgba.pixels[i * rb->data.rgba.row_step]); } if (color_type == PNG_COLOR_TYPE_PALETTE) /* expand palette images to RGB */ png_set_expand(png_ptr); if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) /* expand low bit-depth grayscale to 8bits */ png_set_expand(png_ptr); if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) /* expand transparency chunks to full alpha */ png_set_expand(png_ptr); if (bit_depth == 16) /* scale 16bits down to 8 */ png_set_strip_16(png_ptr); if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) /* convert grayscale to rgba */ png_set_gray_to_rgb(png_ptr); png_set_bgr(png_ptr); if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_PALETTE) png_set_add_alpha(png_ptr, 0xff, PNG_FILLER_AFTER); png_read_update_info(png_ptr, info_ptr); assert(png_get_rowbytes(png_ptr, info_ptr) == rb->data.rgba.row_step); png_read_image(png_ptr, row_pointers); free(row_pointers); row_pointers = NULL; png_read_end(png_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL); /*premultiply data*/ for (unsigned i = 0; i < width * height; i++) { if (*a < 255) { if (*a == 0) { *r = *g = *b = 0; } else { *r = (*r * *a + 255) >> 8; *g = (*g * *a + 255) >> 8; *b = (*b * *a + 255) >> 8; } } a += 4; b += 4; g += 4; r += 4; } fclose(stream); return MS_SUCCESS; } int msSaveRasterBuffer(mapObj *map, rasterBufferObj *rb, FILE *stream, outputFormatObj *format) { if (strcasestr(format->driver, "/png")) { streamInfo info; info.fp = stream; info.buffer = NULL; return saveAsPNG(map, rb, &info, format); } else if (strcasestr(format->driver, "/jpeg")) { streamInfo info; info.fp = stream; info.buffer = NULL; return saveAsJPEG(map, rb, &info, format); } else { msSetError(MS_MISCERR, "unsupported image format\n", "msSaveRasterBuffer()"); return MS_FAILURE; } } int msSaveRasterBufferToBuffer(rasterBufferObj *data, bufferObj *buffer, outputFormatObj *format) { if (strcasestr(format->driver, "/png")) { streamInfo info; info.fp = NULL; info.buffer = buffer; return saveAsPNG(NULL, data, &info, format); } else if (strcasestr(format->driver, "/jpeg")) { streamInfo info; info.fp = NULL; info.buffer = buffer; return saveAsJPEG(NULL, data, &info, format); } else { msSetError(MS_MISCERR, "unsupported image format\n", "msSaveRasterBuffer()"); return MS_FAILURE; } } #ifdef USE_GIF #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 static char const *gif_error_msg(int code) #else static char const *gif_error_msg() #endif { static char msg[80]; #if (!defined GIFLIB_MAJOR) || (GIFLIB_MAJOR < 5) int code = GifLastError(); #endif switch (code) { case E_GIF_ERR_OPEN_FAILED: /* should not see this */ return "Failed to open given file"; case E_GIF_ERR_WRITE_FAILED: return "Write failed"; case E_GIF_ERR_HAS_SCRN_DSCR: /* should not see this */ return "Screen descriptor already passed to giflib"; case E_GIF_ERR_HAS_IMAG_DSCR: /* should not see this */ return "Image descriptor already passed to giflib"; case E_GIF_ERR_NO_COLOR_MAP: /* should not see this */ return "Neither global nor local color map set"; case E_GIF_ERR_DATA_TOO_BIG: /* should not see this */ return "Too much pixel data passed to giflib"; case E_GIF_ERR_NOT_ENOUGH_MEM: return "Out of memory"; case E_GIF_ERR_DISK_IS_FULL: return "Disk is full"; case E_GIF_ERR_CLOSE_FAILED: /* should not see this */ return "File close failed"; case E_GIF_ERR_NOT_WRITEABLE: /* should not see this */ return "File not writable"; case D_GIF_ERR_OPEN_FAILED: return "Failed to open file"; case D_GIF_ERR_READ_FAILED: return "Failed to read from file"; case D_GIF_ERR_NOT_GIF_FILE: return "File is not a GIF file"; case D_GIF_ERR_NO_SCRN_DSCR: return "No screen descriptor detected - invalid file"; case D_GIF_ERR_NO_IMAG_DSCR: return "No image descriptor detected - invalid file"; case D_GIF_ERR_NO_COLOR_MAP: return "No global or local color map found"; case D_GIF_ERR_WRONG_RECORD: return "Wrong record type detected - invalid file?"; case D_GIF_ERR_DATA_TOO_BIG: return "Data in file too big for image"; case D_GIF_ERR_NOT_ENOUGH_MEM: return "Out of memory"; case D_GIF_ERR_CLOSE_FAILED: return "Close failed"; case D_GIF_ERR_NOT_READABLE: return "File not opened for read"; case D_GIF_ERR_IMAGE_DEFECT: return "Defective image"; case D_GIF_ERR_EOF_TOO_SOON: return "Unexpected EOF - invalid file"; default: sprintf(msg, "Unknown giflib error code %d", code); return msg; } } /* not fully implemented and tested */ /* missing: set the first pointer to a,r,g,b */ int readGIF(char *path, rasterBufferObj *rb) { int codeSize, extCode, firstImageRead = MS_FALSE; unsigned char *r, *g, *b, *a; int transIdx = -1; GifFileType *image; GifPixelType *line; GifRecordType recordType; GifByteType *codeBlock, *extension; ColorMapObject *cmap; int interlacedOffsets[] = {0, 4, 2, 1}; int interlacedJumps[] = {8, 8, 4, 2}; #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 int errcode; #endif rb->type = MS_BUFFER_BYTE_RGBA; #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 image = DGifOpenFileName(path, &errcode); if (image == NULL) { msSetError(MS_MISCERR, "failed to load gif image: %s", "readGIF()", gif_error_msg(errcode)); return MS_FAILURE; } #else image = DGifOpenFileName(path); if (image == NULL) { msSetError(MS_MISCERR, "failed to load gif image: %s", "readGIF()", gif_error_msg()); return MS_FAILURE; } #endif rb->width = image->SWidth; rb->height = image->SHeight; rb->data.rgba.row_step = rb->width * 4; rb->data.rgba.pixel_step = 4; rb->data.rgba.pixels = (unsigned char *)malloc(sizeof(unsigned char) * rb->width * rb->height * 4); b = rb->data.rgba.b = &rb->data.rgba.pixels[0]; g = rb->data.rgba.g = &rb->data.rgba.pixels[1]; r = rb->data.rgba.r = &rb->data.rgba.pixels[2]; a = rb->data.rgba.a = &rb->data.rgba.pixels[3]; cmap = (image->Image.ColorMap) ? image->Image.ColorMap : image->SColorMap; for (unsigned i = 0; i < rb->width * rb->height; i++) { *a = 255; *r = cmap->Colors[image->SBackGroundColor].Red; *g = cmap->Colors[image->SBackGroundColor].Green; *b = cmap->Colors[image->SBackGroundColor].Blue; a += rb->data.rgba.pixel_step; r += rb->data.rgba.pixel_step; g += rb->data.rgba.pixel_step; b += rb->data.rgba.pixel_step; } do { if (DGifGetRecordType(image, &recordType) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } switch (recordType) { case SCREEN_DESC_RECORD_TYPE: DGifGetScreenDesc(image); break; case IMAGE_DESC_RECORD_TYPE: if (DGifGetImageDesc(image) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } if (!firstImageRead) { unsigned row = image->Image.Top; unsigned col = image->Image.Left; unsigned width = image->Image.Width; unsigned height = image->Image.Height; /* sanity check: */ if (col + width > rb->width || row + height > rb->height) { msSetError(MS_MISCERR, "corrupted gif image, img size exceeds screen size", "readGIF()"); return MS_FAILURE; } line = (GifPixelType *)malloc(width * sizeof(GifPixelType)); if (image->Image.Interlace) { int count; for (count = 0; count < 4; count++) { for (unsigned i = row + interlacedOffsets[count]; i < row + height; i += interlacedJumps[count]) { int offset = i * rb->data.rgba.row_step + col * rb->data.rgba.pixel_step; a = rb->data.rgba.a + offset; r = rb->data.rgba.r + offset; g = rb->data.rgba.g + offset; b = rb->data.rgba.b + offset; if (DGifGetLine(image, line, width) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } for (unsigned j = 0; j < width; j++) { GifPixelType pix = line[j]; if (transIdx == -1 || pix != transIdx) { *a = 255; *r = cmap->Colors[pix].Red; *g = cmap->Colors[pix].Green; *b = cmap->Colors[pix].Blue; } else { *a = *r = *g = *b = 0; } a += rb->data.rgba.pixel_step; r += rb->data.rgba.pixel_step; g += rb->data.rgba.pixel_step; b += rb->data.rgba.pixel_step; } } } } else { for (unsigned i = 0; i < height; i++) { int offset = i * rb->data.rgba.row_step + col * rb->data.rgba.pixel_step; a = rb->data.rgba.a + offset; r = rb->data.rgba.r + offset; g = rb->data.rgba.g + offset; b = rb->data.rgba.b + offset; if (DGifGetLine(image, line, width) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } for (unsigned j = 0; j < width; j++) { GifPixelType pix = line[j]; if (transIdx == -1 || pix != transIdx) { *a = 255; *r = cmap->Colors[pix].Red; *g = cmap->Colors[pix].Green; *b = cmap->Colors[pix].Blue; } else { *a = *r = *g = *b = 0; } a += rb->data.rgba.pixel_step; r += rb->data.rgba.pixel_step; g += rb->data.rgba.pixel_step; b += rb->data.rgba.pixel_step; } } } free((char *)line); firstImageRead = MS_TRUE; } else { /* Skip all next images */ if (DGifGetCode(image, &codeSize, &codeBlock) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } while (codeBlock != NULL) { if (DGifGetCodeNext(image, &codeBlock) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } } } break; case EXTENSION_RECORD_TYPE: /* skip all extension blocks */ if (DGifGetExtension(image, &extCode, &extension) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } if (extCode == 249 && (extension[1] & 1)) transIdx = extension[4]; for (;;) { if (DGifGetExtensionNext(image, &extension) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "corrupted gif image?: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } if (extension == NULL) break; if (extension[1] & 1) transIdx = extension[4]; } break; case UNDEFINED_RECORD_TYPE: break; case TERMINATE_RECORD_TYPE: break; default: break; } } while (recordType != TERMINATE_RECORD_TYPE); #if defined GIFLIB_MAJOR && GIFLIB_MINOR && \ ((GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1) || (GIFLIB_MAJOR > 5)) if (DGifCloseFile(image, &errcode) == GIF_ERROR) { msSetError(MS_MISCERR, "failed to close gif after loading: %s", "readGIF()", gif_error_msg(errcode)); return MS_FAILURE; } #else if (DGifCloseFile(image) == GIF_ERROR) { #if defined GIFLIB_MAJOR && GIFLIB_MAJOR >= 5 msSetError(MS_MISCERR, "failed to close gif after loading: %s", "readGIF()", gif_error_msg(image->Error)); #else msSetError(MS_MISCERR, "failed to close gif after loading: %s", "readGIF()", gif_error_msg()); #endif return MS_FAILURE; } #endif return MS_SUCCESS; } #endif int msLoadMSRasterBufferFromFile(char *path, rasterBufferObj *rb) { FILE *stream; unsigned char signature[8]; int ret = MS_FAILURE; stream = fopen(path, "rb"); if (!stream) { msSetError(MS_MISCERR, "unable to open file %s for reading", "msLoadMSRasterBufferFromFile()", path); return MS_FAILURE; } if (1 != fread(signature, 8, 1, stream)) { fclose(stream); msSetError(MS_MISCERR, "Unable to read header from image file %s", "msLoadMSRasterBufferFromFile()", path); return MS_FAILURE; } fclose(stream); if (png_sig_cmp(signature, 0, 8) == 0) { ret = readPNG(path, rb); } else if (!strncmp((char *)signature, "GIF", 3)) { #ifdef USE_GIF ret = readGIF(path, rb); #else msSetError(MS_MISCERR, "pixmap %s seems to be GIF formatted, but this server is " "compiled without GIF support", "readImage()", path); return MS_FAILURE; #endif } else { msSetError(MS_MISCERR, "unsupported pixmap format", "readImage()"); return MS_FAILURE; } return ret; } mapserver-8.6.0/src/mapimagemap.c000066400000000000000000000623761511405061000167510ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implements imagemap outputformat support. * Author: Attila Csipa * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "dxfcolor.h" #include #include #ifdef _WIN32 #include #include #endif #define MYDEBUG 0 #define DEBUG_IF if (MYDEBUG > 2) /* * Client-side imagemap support was originally written by * Attila Csipa (http://prometheus.org.yu/me.php). C. Scott Ananian * (http://cscott.net) cleaned up the code somewhat and made it more flexible: * you can now customize the generated HREFs and create mouseover and * mouseout attributes. * * Use * IMAGETYPE imagemap * to select this driver. * * The following FORMATOPTIONs are available. If any are set to the empty * string the associated attribute will be suppressed. * POLYHREF the href string to use for the elements. * use a %s to interpolate the area title. * default: "javascript:Clicked('%s');" * POLYMOUSEOVER the onMouseOver string to use for the elements. * use a %s to interpolate the area title. * default: "" (ie the attribute is suppressed) * POLYMOUSEOUT the onMouseOut string to use for the elements. * use a %s to interpolate the area title. * default: "" (ie the attribute is suppressed) * SYMBOLMOUSEOVER and SYMBOLMOUSEOUT are equivalent properties for * tags representing symbols, with the same defaults. * MAPNAME the string which will be used in the name attribute * of the tag. There is no %s interpolation. * default: "map1" * SUPPRESS if "yes", then we will suppress area declarations with * no title. * default: "NO" * * For example, http://vevo.verifiedvoting.org/verifier contains this * .map file fragment: * OUTPUTFORMAT * NAME imagemap * DRIVER imagemap * FORMATOPTION "POLYHREF=/verifier/map.php?state=%s" * FORMATOPTION "SYMBOLHREF=#" * FORMATOPTION "SUPPRESS=YES" * FORMATOPTION "MAPNAME=map-48" * FORMATOPTION "POLYMOUSEOUT=return nd();" * FORMATOPTION "POLYMOUSEOVER=return overlib('%s');" * END */ /*-------------------------------------------------------------------------*/ /* A pString is a variable-length (appendable) string, stored as a triple: * character pointer, allocated length, and used length. The one wrinkle * is that we use pointers to the allocated size and character pointer, * in order to support referring to fields declared elsewhere (ie in the * 'image' data structure) for these. The 'iprintf' function appends * to a pString. */ typedef struct pString { /* these two fields are somewhere else */ char **string; int *alloc_size; /* this field is stored locally. */ int string_len; } pString; /* These are the pStrings we declare statically. One is the 'output' * imagemap/dxf file; parts of this live in another data structure and * are only referenced indirectly here. The other contains layer-specific * information for the dxf output. */ static char *layerlist = NULL; static int layersize = 0; static pString imgStr, layerStr = {&layerlist, &layersize, 0}; /* Format strings for the various bits of a client-side imagemap. */ static const char *polyHrefFmt, *polyMOverFmt, *polyMOutFmt; static const char *symbolHrefFmt, *symbolMOverFmt, *symbolMOutFmt; static const char *mapName; /* Should we suppress AREA declarations in imagemaps with no title? */ static int suppressEmpty = 0; /* Prevent buffer-overrun and format-string attacks by "sanitizing" any * provided format string to fit the number of expected string arguments * (MAX) exactly. */ static const char *makeFmtSafe(const char *fmt, int MAX) { /* format string should have exactly 'MAX' %s */ char *result = msSmallMalloc(strlen(fmt) + 1 + 3 * MAX), *cp; int numstr = 0, saw_percent = 0; strcpy(result, fmt); for (cp = result; *cp; cp++) { if (saw_percent) { if (*cp == '%') { /* safe */ } else if (*cp == 's' && numstr < MAX) { numstr++; /* still safe */ } else { /* disable this unsafe format string! */ *(cp - 1) = ' '; } saw_percent = 0; } else if (*cp == '%') saw_percent = 1; } /* fixup format strings without enough %s in them */ while (numstr < MAX) { strcpy(cp, "%.s"); /* print using zero-length precision */ cp += 3; numstr++; } return result; } /* Append the given printf-style formatted string to the pString 'ps'. * This is much cleaner (and faster) than the technique this file * used to use! */ static void im_iprintf(pString *ps, const char *fmt, ...) { int n, remaining; va_list ap; do { remaining = *(ps->alloc_size) - ps->string_len; va_start(ap, fmt); #if defined(HAVE_VSNPRINTF) n = vsnprintf((*(ps->string)) + ps->string_len, remaining, fmt, ap); #else /* If vsnprintf() is not available then require a minimum * of 512 bytes of free space to prevent a buffer overflow * This is not fully bulletproof but should help, see bug 1613 */ if (remaining < 512) n = -1; else n = vsprintf((*(ps->string)) + ps->string_len, fmt, ap); #endif va_end(ap); /* if that worked, we're done! */ if (-1 < n && n < remaining) { ps->string_len += n; return; } else { /* double allocated string size */ *(ps->alloc_size) *= 2; /* these keeps realloc linear.*/ if (*(ps->alloc_size) < 1024) /* careful: initial size can be 0 */ *(ps->alloc_size) = 1024; if (n > -1 && *(ps->alloc_size) <= (n + ps->string_len)) /* ensure at least as much as what is needed */ *(ps->alloc_size) = n + ps->string_len + 1; *(ps->string) = (char *)msSmallRealloc(*(ps->string), *(ps->alloc_size)); /* if realloc doesn't work, we're screwed! */ } } while (1); /* go back and try again. */ } static int lastcolor = -1; static int matchdxfcolor(colorObj col) { int best = 7; int delta = 128 * 255; int tcolor = 0; if (lastcolor != -1) return lastcolor; while (tcolor < 256 && (ctable[tcolor].r != col.red || ctable[tcolor].g != col.green || ctable[tcolor].b != col.blue)) { const int dr = ctable[tcolor].r - col.red; const int dg = ctable[tcolor].g - col.green; const int db = ctable[tcolor].b - col.blue; const int newdelta = dr * dr + dg * dg + db * db; if (newdelta < delta) { best = tcolor; delta = newdelta; } tcolor++; } if (tcolor >= 256) tcolor = best; /* DEBUG_IF printf("%d/%d/%d (%d/%d - %d), %d : %d/%d/%d
\n", * ctable[tcolor].r, ctable[tcolor].g, ctable[tcolor].b, tcolor, best, delta, * lastcolor, col.red, col.green, col.blue); */ lastcolor = tcolor; return tcolor; } static char *lname; static int dxf; void msImageStartLayerIM(mapObj *map, layerObj *layer, imageObj *image) { (void)map; (void)image; DEBUG_IF printf("ImageStartLayerIM\n
"); free(lname); if (layer->name) lname = msStrdup(layer->name); else lname = msStrdup("NONE"); if (dxf == 2) { im_iprintf(&layerStr, "LAYER\n%s\n", lname); } else if (dxf) { im_iprintf(&layerStr, " 0\nLAYER\n 2\n%s\n" " 70\n 64\n 6\nCONTINUOUS\n", lname); } lastcolor = -1; } /* * Utility function to create a IM image. Returns * a pointer to an imageObj structure. */ imageObj *msImageCreateIM(int width, int height, outputFormatObj *format, char *imagepath, char *imageurl, double resolution, double defresolution) { imageObj *image = NULL; if (setvbuf(stdout, NULL, _IONBF, 0)) { printf("Whoops..."); }; DEBUG_IF printf("msImageCreateIM
\n"); if (width > 0 && height > 0) { image = (imageObj *)msSmallCalloc(1, sizeof(imageObj)); imgStr.string = &(image->img.imagemap); imgStr.alloc_size = &(image->size); image->format = format; format->refcount++; image->width = width; image->height = height; image->imagepath = NULL; image->imageurl = NULL; image->resolution = resolution; image->resolutionfactor = resolution / defresolution; if (strcasecmp("ON", msGetOutputFormatOption(format, "DXF", "OFF")) == 0) { dxf = 1; im_iprintf(&layerStr, " 2\nLAYER\n 70\n 10\n"); } else dxf = 0; if (strcasecmp("ON", msGetOutputFormatOption(format, "SCRIPT", "OFF")) == 0) { dxf = 2; im_iprintf(&layerStr, ""); } /* get href formation string options */ polyHrefFmt = makeFmtSafe(msGetOutputFormatOption(format, "POLYHREF", "javascript:Clicked('%s');"), 1); polyMOverFmt = makeFmtSafe(msGetOutputFormatOption(format, "POLYMOUSEOVER", ""), 1); polyMOutFmt = makeFmtSafe(msGetOutputFormatOption(format, "POLYMOUSEOUT", ""), 1); symbolHrefFmt = makeFmtSafe(msGetOutputFormatOption(format, "SYMBOLHREF", "javascript:SymbolClicked();"), 1); symbolMOverFmt = makeFmtSafe(msGetOutputFormatOption(format, "SYMBOLMOUSEOVER", ""), 1); symbolMOutFmt = makeFmtSafe(msGetOutputFormatOption(format, "SYMBOLMOUSEOUT", ""), 1); /* get name of client-side image map */ mapName = msGetOutputFormatOption(format, "MAPNAME", "map1"); /* should we suppress area declarations with no title? */ if (strcasecmp("YES", msGetOutputFormatOption(format, "SUPPRESS", "NO")) == 0) { suppressEmpty = 1; } lname = msStrdup("NONE"); *(imgStr.string) = msStrdup(""); if (*(imgStr.string)) { *(imgStr.alloc_size) = imgStr.string_len = strlen(*(imgStr.string)); } else { *(imgStr.alloc_size) = imgStr.string_len = 0; } if (imagepath) { image->imagepath = msStrdup(imagepath); } if (imageurl) { image->imageurl = msStrdup(imageurl); } return image; } else { msSetError(MS_IMGERR, "Cannot create IM image of size %d x %d.", "msImageCreateIM()", width, height); } return image; } /* ------------------------------------------------------------------------- */ /* Draw a single marker symbol of the specified size and color */ /* ------------------------------------------------------------------------- */ void msDrawMarkerSymbolIM(mapObj *map, imageObj *img, pointObj *p, styleObj *style, double scalefactor) { symbolObj *symbol; int ox, oy; double size; DEBUG_IF printf("msDrawMarkerSymbolIM\n
"); /* skip this, we don't do text */ if (!p) return; if (style->symbol > map->symbolset.numsymbols || style->symbol < 0) return; /* no such symbol, 0 is OK */ symbol = map->symbolset.symbol[style->symbol]; ox = style->offsetx * scalefactor; oy = style->offsety * scalefactor; if (style->size == -1) { size = msSymbolGetDefaultSize(symbol); size = MS_NINT(size * scalefactor); } else size = MS_NINT(style->size * scalefactor); size = MS_MAX(size, style->minsize * img->resolutionfactor); size = MS_MIN(size, style->maxsize * img->resolutionfactor); if (size < 1) return; /* size too small */ /* DEBUG_IF printf(".%d.%d.%d.", symbol->type, style->symbol, fc); */ if (style->symbol == 0) { /* simply draw a single pixel of the specified color */ if (dxf) { if (dxf == 2) im_iprintf(&imgStr, "POINT\n%.0f %.0f\n%d\n", p->x + ox, p->y + oy, matchdxfcolor(style->color)); else im_iprintf(&imgStr, " 0\nPOINT\n 10\n%f\n 20\n%f\n 30\n0.0\n" " 62\n%6d\n 8\n%s\n", p->x + ox, p->y + oy, matchdxfcolor(style->color), lname); } else { im_iprintf(&imgStr, "\n", p->x + ox, p->y + oy); } /* point2 = &( p->line[j].point[i] ); */ /* if(point1->y == point2->y) {} */ return; } DEBUG_IF printf("A"); switch (symbol->type) { case (MS_SYMBOL_TRUETYPE): DEBUG_IF printf("T"); break; case (MS_SYMBOL_PIXMAP): DEBUG_IF printf("P"); break; case (MS_SYMBOL_VECTOR): DEBUG_IF printf("V"); { double d, offset_x, offset_y; d = size / symbol->sizey; offset_x = MS_NINT(p->x - d * .5 * symbol->sizex + ox); offset_y = MS_NINT(p->y - d * .5 * symbol->sizey + oy); /* For now I only render filled vector symbols in imagemap, and no */ /* dxf support available yet. */ if (symbol->filled && !dxf /* && fc >= 0 */) { /* char *title=(p->numvalues) ? p->values[0] : ""; */ char *title = ""; int j; im_iprintf(&imgStr, "numpoints; j++) { im_iprintf(&imgStr, "%s %d,%d", j == 0 ? "" : ",", (int)MS_NINT(d * symbol->points[j].x + offset_x), (int)MS_NINT(d * symbol->points[j].y + offset_y)); } im_iprintf(&imgStr, "\" />\n"); } /* end of imagemap, filled case. */ } break; default: DEBUG_IF printf("DEF"); break; } /* end switch statement */ return; } /* ------------------------------------------------------------------------- */ /* Draw a line symbol of the specified size and color */ /* ------------------------------------------------------------------------- */ void msDrawLineSymbolIM(mapObj *map, imageObj *img, shapeObj *p, styleObj *style, double scalefactor_ignored) { (void)img; (void)scalefactor_ignored; symbolObj *symbol; int i, j, l; char first = 1; DEBUG_IF printf("msDrawLineSymbolIM
\n"); if (!p) return; if (p->numlines <= 0) return; if (style->symbol > map->symbolset.numsymbols || style->symbol < 0) return; /* no such symbol, 0 is OK */ symbol = map->symbolset.symbol[style->symbol]; if (suppressEmpty && p->numvalues == 0) return; /* suppress area with empty title */ if (style->symbol == 0) { /* just draw a single width line */ for (l = 0, j = 0; j < p->numlines; j++) { if (dxf == 2) { im_iprintf(&imgStr, "LINE\n%d\n", matchdxfcolor(style->color)); } else if (dxf) { im_iprintf(&imgStr, " 0\nPOLYLINE\n 70\n 0\n 62\n%6d\n 8\n%s\n", matchdxfcolor(style->color), lname); } else { char *title; first = 1; title = (p->numvalues) ? p->values[0] : ""; im_iprintf(&imgStr, "line[j].point[p->line[j].numpoints-1] ); */ for (i = 0; i < p->line[j].numpoints; i++, l++) { if (dxf == 2) { im_iprintf(&imgStr, "%.0f %.0f\n", p->line[j].point[i].x, p->line[j].point[i].y); } else if (dxf) { im_iprintf(&imgStr, " 0\nVERTEX\n 10\n%f\n 20\n%f\n 30\n%f\n", p->line[j].point[i].x, p->line[j].point[i].y, 0.0); } else { im_iprintf(&imgStr, "%s %.0f,%.0f", first ? "" : ",", p->line[j].point[i].x, p->line[j].point[i].y); } first = 0; /* point2 = &( p->line[j].point[i] ); */ /* if(point1->y == point2->y) {} */ } im_iprintf(&imgStr, dxf ? (dxf == 2 ? "" : " 0\nSEQEND\n") : "\" />\n"); } /* DEBUG_IF printf ("%d, ",strlen(img->img.imagemap) ); */ return; } DEBUG_IF printf("-%d-", symbol->type); return; } /* ------------------------------------------------------------------------- */ /* Draw a shade symbol of the specified size and color */ /* ------------------------------------------------------------------------- */ void msDrawShadeSymbolIM(mapObj *map, imageObj *img, shapeObj *p, styleObj *style, double scalefactor_ignored) { (void)img; (void)scalefactor_ignored; symbolObj *symbol; int i, j, l; char first = 1; DEBUG_IF printf("msDrawShadeSymbolIM\n
"); if (!p) return; if (p->numlines <= 0) return; symbol = map->symbolset.symbol[style->symbol]; if (suppressEmpty && p->numvalues == 0) return; /* suppress area with empty title */ if (style->symbol == 0) { /* simply draw a single pixel of the specified color // */ for (l = 0, j = 0; j < p->numlines; j++) { if (dxf == 2) { im_iprintf(&imgStr, "POLY\n%d\n", matchdxfcolor(style->color)); } else if (dxf) { im_iprintf(&imgStr, " 0\nPOLYLINE\n 73\n 1\n 62\n%6d\n 8\n%s\n", matchdxfcolor(style->color), lname); } else { char *title = (p->numvalues) ? p->values[0] : ""; first = 1; im_iprintf(&imgStr, "line[j].point[p->line[j].numpoints-1] ); */ for (i = 0; i < p->line[j].numpoints; i++, l++) { if (dxf == 2) { im_iprintf(&imgStr, "%.0f %.0f\n", p->line[j].point[i].x, p->line[j].point[i].y); } else if (dxf) { im_iprintf(&imgStr, " 0\nVERTEX\n 10\n%f\n 20\n%f\n 30\n%f\n", p->line[j].point[i].x, p->line[j].point[i].y, 0.0); } else { im_iprintf(&imgStr, "%s %.0f,%.0f", first ? "" : ",", p->line[j].point[i].x, p->line[j].point[i].y); } first = 0; /* point2 = &( p->line[j].point[i] ); */ /* if(point1->y == point2->y) {} */ } im_iprintf(&imgStr, dxf ? (dxf == 2 ? "" : " 0\nSEQEND\n") : "\" />\n"); } return; } /* DEBUG_IF printf ("d"); */ DEBUG_IF printf("-%d-", symbol->type); return; } /* * Simply draws a label based on the label point and the supplied label object. */ int msDrawTextIM(mapObj *map, imageObj *img, pointObj labelPnt, char *string, labelObj *label, double scalefactor) { (void)map; (void)img; DEBUG_IF printf("msDrawText
\n"); if (!string) return (0); /* not errors, just don't want to do anything */ if (strlen(string) == 0) return (0); if (!dxf) return (0); if (dxf == 2) { im_iprintf(&imgStr, "TEXT\n%d\n%s\n%.0f\n%.0f\n%.0f\n", matchdxfcolor(label->color), string, labelPnt.x, labelPnt.y, -label->angle); } else { im_iprintf(&imgStr, " 0\nTEXT\n 1\n%s\n 10\n%f\n 20\n%f\n 30\n0.0\n 40\n%f\n " "50\n%f\n 62\n%6d\n 8\n%s\n 73\n 2\n 72\n 1\n", string, labelPnt.x, labelPnt.y, label->size * scalefactor * 100, -label->angle, matchdxfcolor(label->color), lname); } return (0); } /* * Save an image to a file named filename, if filename is NULL it goes to stdout */ int msSaveImageIM(imageObj *img, const char *filename, outputFormatObj *format) { FILE *stream_to_free = NULL; FILE *stream; char workbuffer[5000]; DEBUG_IF printf("msSaveImageIM\n
"); if (filename != NULL && strlen(filename) > 0) { stream_to_free = fopen(filename, "wb"); if (!stream_to_free) { msSetError(MS_IOERR, "(%s)", "msSaveImage()", filename); return (MS_FAILURE); } stream = stream_to_free; } else { /* use stdout */ #ifdef _WIN32 /* * Change stdout mode to binary on win32 platforms */ if (_setmode(_fileno(stdout), _O_BINARY) == -1) { msSetError(MS_IOERR, "Unable to change stdout to binary mode.", "msSaveImage()"); return (MS_FAILURE); } #endif stream = stdout; } if (strcasecmp(format->driver, "imagemap") == 0) { DEBUG_IF printf("ALLOCD %d
\n", img->size); /* DEBUG_IF printf("F %s
\n", img->img.imagemap); */ DEBUG_IF printf("FLEN %d
\n", (int)strlen(img->img.imagemap)); if (dxf == 2) { msIO_fprintf(stream, "%s", layerlist); } else if (dxf) { msIO_fprintf( stream, " 0\nSECTION\n 2\nHEADER\n 9\n$ACADVER\n 1\nAC1009\n0\nENDSEC\n " "0\nSECTION\n 2\nTABLES\n 0\nTABLE\n%s0\nENDTAB\n0\nENDSEC\n " "0\nSECTION\n 2\nBLOCKS\n0\nENDSEC\n 0\nSECTION\n 2\nENTITIES\n", layerlist); } else { msIO_fprintf(stream, "\n", mapName, img->width, img->height); } const int nSize = sizeof(workbuffer); const int size = strlen(img->img.imagemap); if (size > nSize) { int iIndice = 0; while ((iIndice + nSize) <= size) { snprintf(workbuffer, sizeof(workbuffer), "%s", img->img.imagemap + iIndice); workbuffer[nSize - 1] = '\0'; msIO_fwrite(workbuffer, strlen(workbuffer), 1, stream); iIndice += nSize - 1; } if (iIndice < size) { sprintf(workbuffer, "%s", img->img.imagemap + iIndice); msIO_fprintf(stream, "%s", workbuffer); } } else msIO_fwrite(img->img.imagemap, size, 1, stream); if (strcasecmp("OFF", msGetOutputFormatOption(format, "SKIPENDTAG", "OFF")) == 0) { if (dxf == 2) msIO_fprintf(stream, "END"); else if (dxf) msIO_fprintf(stream, "0\nENDSEC\n0\nEOF\n"); else msIO_fprintf(stream, ""); } } else { msSetError(MS_MISCERR, "Unknown output image type driver: %s.", "msSaveImage()", format->driver); if (stream_to_free != NULL) fclose(stream_to_free); return (MS_FAILURE); } if (stream_to_free != NULL) fclose(stream_to_free); return (MS_SUCCESS); } /* * Free gdImagePtr */ void msFreeImageIM(imageObj *img) { free(img->img.imagemap); } mapserver-8.6.0/src/mapio.c000066400000000000000000001107661511405061000155750ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementations for MapServer IO redirection capability. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2004, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include #include "mapserver.h" #include "mapthread.h" #ifdef _WIN32 #include #include #endif #ifdef MOD_WMS_ENABLED #include "httpd.h" #include "apr_strings.h" #endif static int is_msIO_initialized = MS_FALSE; static int is_msIO_header_enabled = MS_TRUE; typedef struct msIOContextGroup_t { msIOContext stdin_context; msIOContext stdout_context; msIOContext stderr_context; void *thread_id; struct msIOContextGroup_t *next; } msIOContextGroup; static msIOContextGroup default_contexts; static msIOContextGroup *io_context_list = NULL; static void msIO_Initialize(void); #ifdef msIO_printf #undef msIO_printf #undef msIO_fprintf #undef msIO_fwrite #undef msIO_fread #undef msIO_vfprintf #endif /************************************************************************/ /* msIO_Cleanup() */ /************************************************************************/ void msIO_Cleanup() { if (is_msIO_initialized) { is_msIO_initialized = MS_FALSE; while (io_context_list != NULL) { msIOContextGroup *last = io_context_list; io_context_list = io_context_list->next; free(last); } } } /************************************************************************/ /* msIO_GetContextGroup() */ /************************************************************************/ static msIOContextGroup *msIO_GetContextGroup() { void *nThreadId = msGetThreadId(); msIOContextGroup *prev = NULL, *group = io_context_list; if (group != NULL && group->thread_id == nThreadId) return group; /* -------------------------------------------------------------------- */ /* Search for group for this thread */ /* -------------------------------------------------------------------- */ msAcquireLock(TLOCK_IOCONTEXT); msIO_Initialize(); group = io_context_list; while (group != NULL && group->thread_id != nThreadId) { prev = group; group = group->next; } /* -------------------------------------------------------------------- */ /* If we found it, make sure it is pushed to the front of the */ /* link for faster finding next time, and return it. */ /* -------------------------------------------------------------------- */ if (group != NULL) { if (prev != NULL) { prev->next = group->next; group->next = io_context_list; io_context_list = group; } msReleaseLock(TLOCK_IOCONTEXT); return group; } /* -------------------------------------------------------------------- */ /* Create a new context group for this thread. */ /* -------------------------------------------------------------------- */ group = (msIOContextGroup *)calloc(1, sizeof(msIOContextGroup)); group->stdin_context = default_contexts.stdin_context; group->stdout_context = default_contexts.stdout_context; group->stderr_context = default_contexts.stderr_context; group->thread_id = nThreadId; group->next = io_context_list; io_context_list = group; msReleaseLock(TLOCK_IOCONTEXT); return group; } /* returns MS_TRUE if the msIO standard output hasn't been redirected */ int msIO_isStdContext() { msIOContextGroup *group = io_context_list; void *nThreadId = msGetThreadId(); if (!group || group->thread_id != nThreadId) { group = msIO_GetContextGroup(); if (!group) { return MS_FALSE; /* probably a bug */ } } if (group->stderr_context.cbData == (void *)stderr && group->stdin_context.cbData == (void *)stdin && group->stdout_context.cbData == (void *)stdout) return MS_TRUE; return MS_FALSE; } /************************************************************************/ /* msIO_getHandler() */ /************************************************************************/ msIOContext *msIO_getHandler(FILE *fp) { void *nThreadId = msGetThreadId(); msIOContextGroup *group = io_context_list; msIO_Initialize(); if (group == NULL || group->thread_id != nThreadId) { group = msIO_GetContextGroup(); if (group == NULL) return NULL; } if (fp == stdin || fp == NULL || strcmp((const char *)fp, "stdin") == 0) return &(group->stdin_context); else if (fp == stdout || strcmp((const char *)fp, "stdout") == 0) return &(group->stdout_context); else if (fp == stderr || strcmp((const char *)fp, "stderr") == 0) return &(group->stderr_context); else return NULL; } /************************************************************************/ /* msIO_setHeaderEnabled() */ /************************************************************************/ void msIO_setHeaderEnabled(int bFlag) { is_msIO_header_enabled = bFlag; } /************************************************************************/ /* msIO_setHeader() */ /************************************************************************/ void msIO_setHeader(const char *header, const char *value, ...) { va_list args; va_start(args, value); #ifdef MOD_WMS_ENABLED msIOContext *ioctx = msIO_getHandler(stdout); if (ioctx && !strcmp(ioctx->label, "apache")) { request_rec *r = (request_rec *)(ioctx->cbData); char *fullvalue = apr_pvsprintf(r->pool, value, args); if (strcasecmp(header, "Content-Type") == 0) { r->content_type = fullvalue; } else if (strcasecmp(header, "Status") == 0) { r->status = atoi(fullvalue); } else { apr_table_setn(r->headers_out, apr_pstrdup(r->pool, header), fullvalue); } } else { #endif // MOD_WMS_ENABLED if (is_msIO_header_enabled) { msIO_fprintf(stdout, "%s: ", header); msIO_vfprintf(stdout, value, args); msIO_fprintf(stdout, "\r\n"); } #ifdef MOD_WMS_ENABLED } #endif va_end(args); } void msIO_sendHeaders() { #ifdef MOD_WMS_ENABLED msIOContext *ioctx = msIO_getHandler(stdout); if (ioctx && !strcmp(ioctx->label, "apache")) return; #endif // !MOD_WMS_ENABLED if (is_msIO_header_enabled) { msIO_printf("\r\n"); fflush(stdout); } } /************************************************************************/ /* msIO_installHandlers() */ /************************************************************************/ int msIO_installHandlers(msIOContext *stdin_context, msIOContext *stdout_context, msIOContext *stderr_context) { msIOContextGroup *group; msIO_Initialize(); group = msIO_GetContextGroup(); if (stdin_context == NULL) group->stdin_context = default_contexts.stdin_context; else if (stdin_context != &group->stdin_context) group->stdin_context = *stdin_context; if (stdout_context == NULL) group->stdout_context = default_contexts.stdout_context; else if (stdout_context != &group->stdout_context) group->stdout_context = *stdout_context; if (stderr_context == NULL) group->stderr_context = default_contexts.stderr_context; else if (stderr_context != &group->stderr_context) group->stderr_context = *stderr_context; return MS_TRUE; } /************************************************************************/ /* msIO_contextRead() */ /************************************************************************/ int msIO_contextRead(msIOContext *context, void *data, int byteCount) { if (context->write_channel == MS_TRUE) return 0; else return context->readWriteFunc(context->cbData, data, byteCount); } /************************************************************************/ /* msIO_contextWrite() */ /************************************************************************/ int msIO_contextWrite(msIOContext *context, const void *data, int byteCount) { if (context->write_channel == MS_FALSE) return 0; else return context->readWriteFunc(context->cbData, (void *)data, byteCount); } /* ==================================================================== */ /* ==================================================================== */ /* Stdio-like cover functions. */ /* ==================================================================== */ /* ==================================================================== */ /************************************************************************/ /* _ms_vsprintf() */ /************************************************************************/ static int _ms_vsprintf(char **workBufPtr, const char *format, va_list ap) { int ret_val; int workBufSize = 16000; *workBufPtr = (char *)malloc(workBufSize * sizeof(char)); if (*workBufPtr == NULL) { msSetError(MS_MEMERR, NULL, "_ms_vsprintf()"); return -1; } #if defined(HAVE_VSNPRINTF) /* This should grow a big enough buffer to hold any formatted result. */ { va_list wrk_args; #ifdef va_copy va_copy(wrk_args, ap); #else wrk_args = ap; #endif while ((ret_val = vsnprintf(*workBufPtr, workBufSize, format, wrk_args)) >= workBufSize - 1 || ret_val == -1) { workBufSize *= 4; *workBufPtr = (char *)realloc(*workBufPtr, workBufSize); if (*workBufPtr == NULL) { msSetError(MS_MEMERR, NULL, "_ms_vsprintf()"); va_end(wrk_args); return -1; } #ifdef va_copy va_end(wrk_args); va_copy(wrk_args, ap); #else wrk_args = ap; #endif } va_end(wrk_args); } #else /* We do not have vsnprintf()... there is a risk of buffer overrun */ ret_val = vsprintf(*workBufPtr, format, ap); if (ret_val < 0 || ret_val >= workBufSize) { msSetError(MS_MISCERR, "Possible buffer overrun.", "_ms_vsprintf()"); msFree(*workBufPtr); *workBufPtr = NULL; return -1; } #endif return ret_val; } /************************************************************************/ /* msIO_printf() */ /************************************************************************/ int msIO_printf(const char *format, ...) { va_list args; int ret; va_start(args, format); ret = msIO_vfprintf(stdout, format, args); va_end(args); return ret; } /************************************************************************/ /* msIO_fprintf() */ /************************************************************************/ int msIO_fprintf(FILE *fp, const char *format, ...) { va_list args; int ret; va_start(args, format); ret = msIO_vfprintf(fp, format, args); va_end(args); return ret; } /************************************************************************/ /* msIO_vfprintf() */ /************************************************************************/ int msIO_vfprintf(FILE *fp, const char *format, va_list ap) { int return_val; msIOContext *context; char workBuf[8000]; #if !defined(HAVE_VSNPRINTF) return_val = vsprintf(workBuf, format, ap); if (return_val < 0 || return_val >= sizeof(workBuf)) { msSetError(MS_MISCERR, "Possible buffer overrun.", "msIO_vfprintf()"); return -1; } char *outbuf = workBuf; #else va_list args_copy; #ifdef va_copy va_copy(args_copy, ap); #else args_copy = ap; #endif /* va_copy */ char *largerBuf = NULL; return_val = vsnprintf(workBuf, sizeof(workBuf), format, ap); if (return_val == -1 || return_val >= (int)sizeof(workBuf) - 1) { return_val = _ms_vsprintf(&largerBuf, format, args_copy); } va_end(args_copy); if (return_val < 0) return -1; char *outbuf = largerBuf ? largerBuf : workBuf; #endif /* HAVE_VSNPRINTF */ context = msIO_getHandler(fp); if (context == NULL) return_val = fwrite(outbuf, 1, return_val, fp); else return_val = msIO_contextWrite(context, outbuf, return_val); #if defined(HAVE_VSNPRINTF) msFree(largerBuf); #endif return return_val; } /************************************************************************/ /* msIO_fwrite() */ /************************************************************************/ int msIO_fwrite(const void *data, size_t size, size_t nmemb, FILE *fp) { msIOContext *context; if (size == 0 || nmemb == 0) return 0; context = msIO_getHandler(fp); if (context == NULL) return fwrite(data, size, nmemb, fp); else return msIO_contextWrite(context, data, size * nmemb) / size; } /************************************************************************/ /* msIO_fread() */ /************************************************************************/ int msIO_fread(void *data, size_t size, size_t nmemb, FILE *fp) { msIOContext *context; if (size == 0 || nmemb == 0) return 0; context = msIO_getHandler(fp); if (context == NULL) return fread(data, size, nmemb, fp); else return msIO_contextRead(context, data, size * nmemb) / size; } /* ==================================================================== */ /* ==================================================================== */ /* Internal default callbacks implementing stdio reading and */ /* writing. */ /* ==================================================================== */ /* ==================================================================== */ /************************************************************************/ /* msIO_stdioRead() */ /* */ /* This is the default implementation via stdio. */ /************************************************************************/ static int msIO_stdioRead(void *cbData, void *data, int byteCount) { return fread(data, 1, byteCount, (FILE *)cbData); } /************************************************************************/ /* msIO_stdioWrite() */ /* */ /* This is the default implementation via stdio. */ /************************************************************************/ static int msIO_stdioWrite(void *cbData, void *data, int byteCount) { return fwrite(data, 1, byteCount, (FILE *)cbData); } /************************************************************************/ /* msIO_Initialize() */ /************************************************************************/ static void msIO_Initialize(void) { if (is_msIO_initialized == MS_TRUE) return; default_contexts.stdin_context.label = "stdio"; default_contexts.stdin_context.write_channel = MS_FALSE; default_contexts.stdin_context.readWriteFunc = msIO_stdioRead; default_contexts.stdin_context.cbData = (void *)stdin; default_contexts.stdout_context.label = "stdio"; default_contexts.stdout_context.write_channel = MS_TRUE; default_contexts.stdout_context.readWriteFunc = msIO_stdioWrite; default_contexts.stdout_context.cbData = (void *)stdout; default_contexts.stderr_context.label = "stdio"; default_contexts.stderr_context.write_channel = MS_TRUE; default_contexts.stderr_context.readWriteFunc = msIO_stdioWrite; default_contexts.stderr_context.cbData = (void *)stderr; default_contexts.next = NULL; default_contexts.thread_id = 0; is_msIO_initialized = MS_TRUE; } /* ==================================================================== */ /* ==================================================================== */ /* FastCGI output redirection functions. */ /* ==================================================================== */ /* ==================================================================== */ /************************************************************************/ /* msIO_needBinaryStdout() */ /* */ /* This function is intended to ensure that stdout is in binary */ /* mode. */ /* */ /* But don't do it we are using FastCGI. We will take care of */ /* doing it in the libfcgi library in that case for the normal */ /* cgi case, and for the fastcgi case the _setmode() call */ /* causes a crash. */ /************************************************************************/ int msIO_needBinaryStdout() { #if defined(_WIN32) && !defined(USE_FASTCGI) if (_setmode(_fileno(stdout), _O_BINARY) == -1) { msSetError(MS_IOERR, "Unable to change stdout to binary mode.", "msIO_needBinaryStdout()"); return (MS_FAILURE); } #endif return MS_SUCCESS; } /************************************************************************/ /* msIO_needBinaryStdin() */ /* */ /* This function is intended to ensure that stdin is in binary */ /* mode. */ /* */ /* But don't do it we are using FastCGI. We will take care of */ /* doing it in the libfcgi library in that case for the normal */ /* cgi case, and for the fastcgi case the _setmode() call */ /* causes a crash. */ /************************************************************************/ int msIO_needBinaryStdin() { #if defined(_WIN32) && !defined(USE_FASTCGI) if (_setmode(_fileno(stdin), _O_BINARY) == -1) { msSetError(MS_IOERR, "Unable to change stdin to binary mode.", "msIO_needBinaryStdin()"); return (MS_FAILURE); } #endif return MS_SUCCESS; } /* ==================================================================== */ /* memory buffer io handling functions. */ /* ==================================================================== */ /************************************************************************/ /* msIO_resetHandlers() */ /************************************************************************/ void msIO_resetHandlers() { msIOContextGroup *group = msIO_GetContextGroup(); if (group == NULL) return; if (strcmp(group->stdin_context.label, "buffer") == 0) { msIOBuffer *buf = (msIOBuffer *)group->stdin_context.cbData; if (buf->data != NULL) free(buf->data); free(buf); } if (strcmp(group->stdout_context.label, "buffer") == 0) { msIOBuffer *buf = (msIOBuffer *)group->stdout_context.cbData; if (buf->data != NULL) free(buf->data); free(buf); } if (strcmp(group->stderr_context.label, "buffer") == 0) { msIOBuffer *buf = (msIOBuffer *)group->stderr_context.cbData; if (buf->data != NULL) free(buf->data); free(buf); } msIO_installHandlers(NULL, NULL, NULL); } /************************************************************************/ /* msIO_installStdoutToBuffer() */ /************************************************************************/ void msIO_installStdoutToBuffer() { msIOContextGroup *group = msIO_GetContextGroup(); msIOContext context; context.label = "buffer"; context.write_channel = MS_TRUE; context.readWriteFunc = msIO_bufferWrite; context.cbData = calloc(1, sizeof(msIOBuffer)); msIO_installHandlers(&group->stdin_context, &context, &group->stderr_context); } /************************************************************************/ /* msIO_pushStdoutToBufferAndGetOldContext() */ /* */ /* This function installs a temporary buffer I/O context and returns */ /* previously installed stdout handler. This previous stdout handler */ /* should later be restored with msIO_restoreOldStdoutContext(). */ /* This function can be for example used when wanting to ingest into */ /* libxml objects XML generated by msIO_fprintf() */ /************************************************************************/ msIOContext *msIO_pushStdoutToBufferAndGetOldContext() { msIOContextGroup *group = msIO_GetContextGroup(); msIOContext *old_context; /* Backup current context */ old_context = (msIOContext *)msSmallMalloc(sizeof(msIOContext)); memcpy(old_context, &group->stdout_context, sizeof(msIOContext)); msIO_installStdoutToBuffer(); return old_context; } /************************************************************************/ /* msIO_restoreOldStdoutContext() */ /************************************************************************/ void msIO_restoreOldStdoutContext(msIOContext *context_to_restore) { msIOContextGroup *group = msIO_GetContextGroup(); msIOContext *prev_context = &group->stdout_context; msIOBuffer *buffer; /* Free memory associated to our temporary context */ assert(strcmp(prev_context->label, "buffer") == 0); buffer = (msIOBuffer *)prev_context->cbData; msFree(buffer->data); msFree(buffer); /* Restore old context */ msIO_installHandlers(&group->stdin_context, context_to_restore, &group->stderr_context); msFree(context_to_restore); } /************************************************************************/ /* msIO_installStdinFromBuffer() */ /************************************************************************/ void msIO_installStdinFromBuffer() { msIOContextGroup *group = msIO_GetContextGroup(); msIOContext context; context.label = "buffer"; context.write_channel = MS_FALSE; context.readWriteFunc = msIO_bufferRead; context.cbData = calloc(1, sizeof(msIOBuffer)); msIO_installHandlers(&context, &group->stdout_context, &group->stderr_context); } /************************************************************************/ /* msIO_getAndStripStdoutBufferMimeHeaders() */ /* */ /************************************************************************/ hashTableObj *msIO_getAndStripStdoutBufferMimeHeaders() { /* -------------------------------------------------------------------- */ /* Find stdout buffer. */ /* -------------------------------------------------------------------- */ msIOContext *ctx = msIO_getHandler((FILE *)"stdout"); msIOBuffer *buf; int start_of_mime_header, current_pos; hashTableObj *hashTable; if (ctx == NULL || ctx->write_channel == MS_FALSE || strcmp(ctx->label, "buffer") != 0) { msSetError(MS_MISCERR, "Can't identify msIO buffer.", "msIO_getAndStripStdoutBufferMimeHeaders"); return NULL; } buf = (msIOBuffer *)ctx->cbData; hashTable = msCreateHashTable(); /* -------------------------------------------------------------------- */ /* Loop over all headers. */ /* -------------------------------------------------------------------- */ current_pos = 0; while (MS_TRUE) { int pos_of_column = -1; char *key, *value; start_of_mime_header = current_pos; while (current_pos < buf->data_offset) { if (buf->data[current_pos] == '\r') { if (current_pos + 1 == buf->data_offset || buf->data[current_pos + 1] != '\n') { pos_of_column = -1; break; } break; } if (buf->data[current_pos] == ':') { pos_of_column = current_pos; if (current_pos + 1 == buf->data_offset || buf->data[current_pos + 1] != ' ') { pos_of_column = -1; break; } } current_pos++; } if (pos_of_column < 0 || current_pos == buf->data_offset) { msSetError(MS_MISCERR, "Corrupt mime headers.", "msIO_getAndStripStdoutBufferMimeHeaders"); msFreeHashTable(hashTable); return NULL; } key = (char *)malloc(pos_of_column - start_of_mime_header + 1); memcpy(key, buf->data + start_of_mime_header, pos_of_column - start_of_mime_header); key[pos_of_column - start_of_mime_header] = '\0'; value = (char *)malloc(current_pos - (pos_of_column + 2) + 1); memcpy(value, buf->data + pos_of_column + 2, current_pos - (pos_of_column + 2)); value[current_pos - (pos_of_column + 2)] = '\0'; msInsertHashTable(hashTable, key, value); msFree(key); msFree(value); /* -------------------------------------------------------------------- */ /* Go to next line. */ /* -------------------------------------------------------------------- */ current_pos += 2; if (current_pos == buf->data_offset) { msSetError(MS_MISCERR, "Corrupt mime headers.", "msIO_getAndStripStdoutBufferMimeHeaders"); msFreeHashTable(hashTable); return NULL; } /* If next line is a '\r', this is the end of mime headers. */ if (buf->data[current_pos] == '\r') { current_pos++; if (current_pos == buf->data_offset || buf->data[current_pos] != '\n') { msSetError(MS_MISCERR, "Corrupt mime headers.", "msIO_getAndStripStdoutBufferMimeHeaders"); msFreeHashTable(hashTable); return NULL; } current_pos++; break; } } /* -------------------------------------------------------------------- */ /* Move data to front of buffer, and reset length. */ /* -------------------------------------------------------------------- */ memmove(buf->data, buf->data + current_pos, buf->data_offset - current_pos); buf->data[buf->data_offset - current_pos] = '\0'; buf->data_offset -= current_pos; return hashTable; } /************************************************************************/ /* msIO_stripStdoutBufferContentType() */ /* */ /* Strip off Content-Type header from buffer, and return to */ /* caller. Returned string is the callers responsibility to */ /* call msFree() on to deallocate. This function will return */ /* NULL if there is no Content-Type header. */ /************************************************************************/ char *msIO_stripStdoutBufferContentType() { /* -------------------------------------------------------------------- */ /* Find stdout buffer. */ /* -------------------------------------------------------------------- */ msIOContext *ctx = msIO_getHandler((FILE *)"stdout"); msIOBuffer *buf; char *content_type = NULL; int end_of_ct, start_of_data; if (ctx == NULL || ctx->write_channel == MS_FALSE || strcmp(ctx->label, "buffer") != 0) { msSetError(MS_MISCERR, "Can't identify msIO buffer.", "msIO_stripStdoutBufferContentType"); return NULL; } buf = (msIOBuffer *)ctx->cbData; /* -------------------------------------------------------------------- */ /* Return NULL if we don't have a Content-Type header. */ /* -------------------------------------------------------------------- */ if (buf->data_offset < 14 || strncasecmp((const char *)buf->data, "Content-Type: ", 14) != 0) return NULL; /* -------------------------------------------------------------------- */ /* Find newline marker at end of content type argument. */ /* -------------------------------------------------------------------- */ end_of_ct = 13; while (end_of_ct + 1 < buf->data_offset && buf->data[end_of_ct + 1] != '\r') end_of_ct++; if (end_of_ct + 1 == buf->data_offset) { msSetError(MS_MISCERR, "Corrupt Content-Type header.", "msIO_stripStdoutBufferContentType"); return NULL; } /* -------------------------------------------------------------------- */ /* Continue on to the start of data ... */ /* Go to next line and skip if empty. */ /* -------------------------------------------------------------------- */ start_of_data = end_of_ct + 3; if (start_of_data < buf->data_offset && buf->data[start_of_data] == '\r') start_of_data += 2; if (start_of_data == buf->data_offset) { msSetError(MS_MISCERR, "Corrupt Content-Type header.", "msIO_stripStdoutBufferContentType"); return NULL; } /* -------------------------------------------------------------------- */ /* Copy out content type. Note we go against the coding guidelines */ /* here and use strncpy() instead of strlcpy() as the source */ /* buffer may not be NULL terminated - strlcpy() requires NULL */ /* terminated sources (see issue #4672). */ /* -------------------------------------------------------------------- */ content_type = (char *)malloc(end_of_ct - 14 + 2); strncpy(content_type, (const char *)buf->data + 14, end_of_ct - 14 + 2); content_type[end_of_ct - 14 + 1] = '\0'; /* -------------------------------------------------------------------- */ /* Move data to front of buffer, and reset length. */ /* -------------------------------------------------------------------- */ memmove(buf->data, buf->data + start_of_data, buf->data_offset - start_of_data); buf->data[buf->data_offset - start_of_data] = '\0'; buf->data_offset -= start_of_data; return content_type; } /************************************************************************/ /* msIO_stripStdoutBufferContentHeaders() */ /* */ /* Strip off Content-* headers from buffer. */ /************************************************************************/ void msIO_stripStdoutBufferContentHeaders() { /* -------------------------------------------------------------------- */ /* Find stdout buffer. */ /* -------------------------------------------------------------------- */ msIOContext *ctx = msIO_getHandler((FILE *)"stdout"); msIOBuffer *buf; int start_of_data; if (ctx == NULL || ctx->write_channel == MS_FALSE || strcmp(ctx->label, "buffer") != 0) { msSetError(MS_MISCERR, "Can't identify msIO buffer.", "msIO_stripStdoutBufferContentHeaders"); return; } buf = (msIOBuffer *)ctx->cbData; /* -------------------------------------------------------------------- */ /* Exit if we don't have any content-* header. */ /* -------------------------------------------------------------------- */ if (buf->data_offset < 8 || strncasecmp((const char *)buf->data, "Content-", 8) != 0) return; /* -------------------------------------------------------------------- */ /* Loop over all content-* headers. */ /* -------------------------------------------------------------------- */ start_of_data = 0; while (buf->data_offset > start_of_data && strncasecmp((const char *)buf->data + start_of_data, "Content-", 8) == 0) { /* -------------------------------------------------------------------- */ /* Find newline marker at end of content-* header argument. */ /* -------------------------------------------------------------------- */ start_of_data += 7; while (start_of_data + 1 < buf->data_offset && buf->data[start_of_data + 1] != '\r') start_of_data++; if (start_of_data + 1 == buf->data_offset) { msSetError(MS_MISCERR, "Corrupt Content-* header.", "msIO_stripStdoutBufferContentHeaders"); return; } /* -------------------------------------------------------------------- */ /* Go to next line. */ /* -------------------------------------------------------------------- */ start_of_data += 3; } /* -------------------------------------------------------------------- */ /* Continue on to the start of data ... */ /* Skip next line if empty. */ /* -------------------------------------------------------------------- */ if (start_of_data < buf->data_offset && buf->data[start_of_data] == '\r') start_of_data += 2; if (start_of_data == buf->data_offset) { msSetError(MS_MISCERR, "Corrupt Content-* header.", "msIO_stripStdoutBufferContentHeaders"); return; } /* -------------------------------------------------------------------- */ /* Move data to front of buffer, and reset length. */ /* -------------------------------------------------------------------- */ memmove(buf->data, buf->data + start_of_data, buf->data_offset - start_of_data); buf->data[buf->data_offset - start_of_data] = '\0'; buf->data_offset -= start_of_data; return; } /************************************************************************/ /* msIO_bufferWrite() */ /************************************************************************/ int msIO_bufferWrite(void *cbData, void *data, int byteCount) { msIOBuffer *buf = (msIOBuffer *)cbData; /* ** Grow buffer if needed (reserve one extra byte to put nul character) */ if (buf->data_offset + byteCount >= buf->data_len) { buf->data_len = buf->data_len * 2 + byteCount + 100; if (buf->data == NULL) buf->data = (unsigned char *)malloc(buf->data_len); else buf->data = (unsigned char *)realloc(buf->data, buf->data_len); if (buf->data == NULL) { msSetError(MS_MEMERR, "Failed to allocate %d bytes for capture buffer.", "msIO_bufferWrite()", buf->data_len); buf->data_len = 0; return 0; } } /* ** Copy result into buffer. */ memcpy(buf->data + buf->data_offset, data, byteCount); buf->data_offset += byteCount; buf->data[buf->data_offset] = '\0'; return byteCount; } /************************************************************************/ /* msIO_bufferRead() */ /************************************************************************/ int msIO_bufferRead(void *cbData, void *data, int byteCount) { (void)cbData; (void)data; (void)byteCount; /* not implemented yet. */ return 0; } mapserver-8.6.0/src/mapio.h000066400000000000000000000113701511405061000155710ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Definitions for MapServer IO redirection capability. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2004, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPIO_H #define MAPIO_H /* ** We deliberately emulate stdio functions in the msIO cover functions. ** This makes it easy for folks to understand the semantics, and means we ** can just #define things to use stdio in the simplest case. */ #include #include "maphash.h" #ifdef __cplusplus extern "C" { #endif #ifndef MS_PRINT_FUNC_FORMAT #if defined(__GNUC__) && __GNUC__ >= 3 && !defined(DOXYGEN_SKIP) #define MS_PRINT_FUNC_FORMAT(format_idx, arg_idx) \ __attribute__((__format__(__printf__, format_idx, arg_idx))) #else #define MS_PRINT_FUNC_FORMAT(format_idx, arg_idx) #endif #endif /* stdio analogs */ int MS_DLL_EXPORT msIO_printf(const char *format, ...) MS_PRINT_FUNC_FORMAT(1, 2); int MS_DLL_EXPORT msIO_fprintf(FILE *stream, const char *format, ...) MS_PRINT_FUNC_FORMAT(2, 3); int MS_DLL_EXPORT msIO_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); int MS_DLL_EXPORT msIO_fread(void *ptr, size_t size, size_t nmemb, FILE *stream); int MS_DLL_EXPORT msIO_vfprintf(FILE *fp, const char *format, va_list ap) MS_PRINT_FUNC_FORMAT(2, 0); /* ** Definitions for the callback function and the details of the IO ** channel contexts. */ typedef int (*msIO_llReadWriteFunc)(void *cbData, void *data, int byteCount); typedef struct msIOContext_t { const char *label; int write_channel; /* 1 for stdout/stderr, 0 for stdin */ msIO_llReadWriteFunc readWriteFunc; void *cbData; } msIOContext; int MS_DLL_EXPORT msIO_installHandlers(msIOContext *stdin_context, msIOContext *stdout_context, msIOContext *stderr_context); msIOContext MS_DLL_EXPORT *msIO_getHandler(FILE *); void MS_DLL_EXPORT msIO_setHeaderEnabled(int bFlag); void msIO_setHeader(const char *header, const char *value, ...) MS_PRINT_FUNC_FORMAT(2, 3); void msIO_sendHeaders(void); /* ** These can be used instead of the stdio style functions if you have ** msIOContext's for the channel in question. */ int msIO_contextRead(msIOContext *context, void *data, int byteCount); int msIO_contextWrite(msIOContext *context, const void *data, int byteCount); /* ** For redirecting IO to a memory buffer. */ typedef struct { unsigned char *data; int data_len; /* really buffer length */ int data_offset; /* really buffer used */ } msIOBuffer; int MS_DLL_EXPORT msIO_bufferRead(void *, void *, int); int MS_DLL_EXPORT msIO_bufferWrite(void *, void *, int); void MS_DLL_EXPORT msIO_resetHandlers(void); void MS_DLL_EXPORT msIO_installStdoutToBuffer(void); void MS_DLL_EXPORT msIO_installStdinFromBuffer(void); void MS_DLL_EXPORT msIO_Cleanup(void); char MS_DLL_EXPORT *msIO_stripStdoutBufferContentType(void); void MS_DLL_EXPORT msIO_stripStdoutBufferContentHeaders(void); hashTableObj MS_DLL_EXPORT *msIO_getAndStripStdoutBufferMimeHeaders(void); msIOContext *msIO_pushStdoutToBufferAndGetOldContext(void); void msIO_restoreOldStdoutContext(msIOContext *context_to_restore); int MS_DLL_EXPORT msIO_isStdContext(void); /* this is just for setting normal stdout's to binary mode on windows */ int msIO_needBinaryStdout(void); int msIO_needBinaryStdin(void); #ifdef __cplusplus } #endif #endif /* nef MAPIO_H */ mapserver-8.6.0/src/mapjoin.c000066400000000000000000000632471511405061000161260ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implements MapServer joins. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #define ROW_ALLOCATION_SIZE 10 /* DBF/XBase function prototypes */ int msDBFJoinConnect(layerObj *layer, joinObj *join); int msDBFJoinPrepare(joinObj *join, shapeObj *shape); int msDBFJoinNext(joinObj *join); int msDBFJoinClose(joinObj *join); int msDBFJoinTable(layerObj *layer, joinObj *join, shapeObj *shape); /* CSV (comma delimited text file) function prototypes */ int msCSVJoinConnect(layerObj *layer, joinObj *join); int msCSVJoinPrepare(joinObj *join, shapeObj *shape); int msCSVJoinNext(joinObj *join); int msCSVJoinClose(joinObj *join); int msCSVJoinTable(layerObj *layer, joinObj *join, shapeObj *shape); /* MySQL function prototypes */ int msMySQLJoinConnect(layerObj *layer, joinObj *join); int msMySQLJoinPrepare(joinObj *join, shapeObj *shape); int msMySQLJoinNext(joinObj *join); int msMySQLJoinClose(joinObj *join); int msMySQLJoinTable(layerObj *layer, joinObj *join, shapeObj *shape); /* PostgreSQL function prototypes */ int msPOSTGRESQLJoinConnect(layerObj *layer, joinObj *join); int msPOSTGRESQLJoinPrepare(joinObj *join, shapeObj *shape); int msPOSTGRESQLJoinNext(joinObj *join); int msPOSTGRESQLJoinClose(joinObj *join); /* wrapper function for DB specific join functions */ int msJoinConnect(layerObj *layer, joinObj *join) { switch (join->connectiontype) { case (MS_DB_XBASE): return msDBFJoinConnect(layer, join); break; case (MS_DB_CSV): return msCSVJoinConnect(layer, join); break; case (MS_DB_MYSQL): return msMySQLJoinConnect(layer, join); break; case (MS_DB_POSTGRES): return msPOSTGRESQLJoinConnect(layer, join); break; default: break; } msSetError(MS_JOINERR, "Unsupported join connection type.", "msJoinConnect()"); return MS_FAILURE; } int msJoinPrepare(joinObj *join, shapeObj *shape) { switch (join->connectiontype) { case (MS_DB_XBASE): return msDBFJoinPrepare(join, shape); break; case (MS_DB_CSV): return msCSVJoinPrepare(join, shape); break; case (MS_DB_MYSQL): return msMySQLJoinPrepare(join, shape); break; case (MS_DB_POSTGRES): return msPOSTGRESQLJoinPrepare(join, shape); break; default: break; } msSetError(MS_JOINERR, "Unsupported join connection type.", "msJoinPrepare()"); return MS_FAILURE; } int msJoinNext(joinObj *join) { switch (join->connectiontype) { case (MS_DB_XBASE): return msDBFJoinNext(join); break; case (MS_DB_CSV): return msCSVJoinNext(join); break; case (MS_DB_MYSQL): return msMySQLJoinNext(join); break; case (MS_DB_POSTGRES): return msPOSTGRESQLJoinNext(join); break; default: break; } msSetError(MS_JOINERR, "Unsupported join connection type.", "msJoinNext()"); return MS_FAILURE; } int msJoinClose(joinObj *join) { switch (join->connectiontype) { case (MS_DB_XBASE): return msDBFJoinClose(join); break; case (MS_DB_CSV): return msCSVJoinClose(join); break; case (MS_DB_MYSQL): return msMySQLJoinClose(join); break; case (MS_DB_POSTGRES): return msPOSTGRESQLJoinClose(join); break; default: break; } msSetError(MS_JOINERR, "Unsupported join connection type.", "msJoinClose()"); return MS_FAILURE; } /* */ /* XBASE join functions */ /* */ typedef struct { DBFHandle hDBF; int fromindex, toindex; char *target; int nextrecord; } msDBFJoinInfo; int msDBFJoinConnect(layerObj *layer, joinObj *join) { int i; char szPath[MS_MAXPATHLEN]; msDBFJoinInfo *joininfo; if (join->joininfo) return (MS_SUCCESS); /* already open */ if (msCheckParentPointer(layer->map, "map") == MS_FAILURE) return MS_FAILURE; /* allocate a msDBFJoinInfo struct */ joininfo = (msDBFJoinInfo *)malloc(sizeof(msDBFJoinInfo)); if (!joininfo) { msSetError(MS_MEMERR, "Error allocating XBase table info structure.", "msDBFJoinConnect()"); return (MS_FAILURE); } /* initialize any members that won't get set later on in this function */ joininfo->target = NULL; joininfo->nextrecord = 0; join->joininfo = joininfo; /* open the XBase file */ if ((joininfo->hDBF = msDBFOpen(msBuildPath3(szPath, layer->map->mappath, layer->map->shapepath, join->table), "rb")) == NULL) { if ((joininfo->hDBF = msDBFOpen(msBuildPath(szPath, layer->map->mappath, join->table), "rb")) == NULL) { msSetError(MS_IOERR, "(%s)", "msDBFJoinConnect()", join->table); return (MS_FAILURE); } } /* get "to" item index */ if ((joininfo->toindex = msDBFGetItemIndex(joininfo->hDBF, join->to)) == -1) { msSetError(MS_DBFERR, "Item %s not found in table %s.", "msDBFJoinConnect()", join->to, join->table); return (MS_FAILURE); } /* get "from" item index */ for (i = 0; i < layer->numitems; i++) { if (strcasecmp(layer->items[i], join->from) == 0) { /* found it */ joininfo->fromindex = i; break; } } if (i == layer->numitems) { msSetError(MS_JOINERR, "Item %s not found in layer %s.", "msDBFJoinConnect()", join->from, layer->name); return (MS_FAILURE); } /* finally store away the item names in the XBase table */ join->numitems = msDBFGetFieldCount(joininfo->hDBF); join->items = msDBFGetItems(joininfo->hDBF); if (!join->items) return (MS_FAILURE); return (MS_SUCCESS); } int msDBFJoinPrepare(joinObj *join, shapeObj *shape) { msDBFJoinInfo *joininfo = join->joininfo; if (!joininfo) { msSetError(MS_JOINERR, "Join connection has not be created.", "msDBFJoinPrepare()"); return (MS_FAILURE); } if (!shape) { msSetError(MS_JOINERR, "Shape to be joined is empty.", "msDBFJoinPrepare()"); return (MS_FAILURE); } if (!shape->values) { msSetError(MS_JOINERR, "Shape to be joined has no attributes.", "msDBFJoinPrepare()"); return (MS_FAILURE); } joininfo->nextrecord = 0; /* starting with the first record */ if (joininfo->target) free(joininfo->target); /* clear last target */ joininfo->target = msStrdup(shape->values[joininfo->fromindex]); return (MS_SUCCESS); } int msDBFJoinNext(joinObj *join) { int i, n; msDBFJoinInfo *joininfo = join->joininfo; if (!joininfo) { msSetError(MS_JOINERR, "Join connection has not be created.", "msDBFJoinNext()"); return (MS_FAILURE); } if (!joininfo->target) { msSetError(MS_JOINERR, "No target specified, run msDBFJoinPrepare() first.", "msDBFJoinNext()"); return (MS_FAILURE); } /* clear any old data */ if (join->values) { msFreeCharArray(join->values, join->numitems); join->values = NULL; } n = msDBFGetRecordCount(joininfo->hDBF); for (i = joininfo->nextrecord; i < n; i++) { /* find a match */ if (strcmp(joininfo->target, msDBFReadStringAttribute(joininfo->hDBF, i, joininfo->toindex)) == 0) break; } if (i == n) { /* unable to do the join */ if ((join->values = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, NULL, "msDBFJoinNext()"); return (MS_FAILURE); } for (i = 0; i < join->numitems; i++) join->values[i] = msStrdup("\0"); /* initialize to zero length strings */ joininfo->nextrecord = n; return (MS_DONE); } if ((join->values = msDBFGetValues(joininfo->hDBF, i)) == NULL) return (MS_FAILURE); joininfo->nextrecord = i + 1; /* so we know where to start looking next time through */ return (MS_SUCCESS); } int msDBFJoinClose(joinObj *join) { msDBFJoinInfo *joininfo = join->joininfo; if (!joininfo) return (MS_SUCCESS); /* already closed */ if (joininfo->hDBF) msDBFClose(joininfo->hDBF); if (joininfo->target) free(joininfo->target); free(joininfo); joininfo = NULL; return (MS_SUCCESS); } /* */ /* CSV (comma separated value) join functions */ /* */ typedef struct { int fromindex, toindex; char *target; char ***rows; int numrows; int nextrow; } msCSVJoinInfo; int msCSVJoinConnect(layerObj *layer, joinObj *join) { int i; FILE *stream; char szPath[MS_MAXPATHLEN]; msCSVJoinInfo *joininfo; char buffer[MS_BUFFER_LENGTH]; if (join->joininfo) return (MS_SUCCESS); /* already open */ if (msCheckParentPointer(layer->map, "map") == MS_FAILURE) return MS_FAILURE; /* allocate a msCSVJoinInfo struct */ if ((joininfo = (msCSVJoinInfo *)malloc(sizeof(msCSVJoinInfo))) == NULL) { msSetError(MS_MEMERR, "Error allocating CSV table info structure.", "msCSVJoinConnect()"); return (MS_FAILURE); } /* initialize any members that won't get set later on in this function */ joininfo->target = NULL; joininfo->nextrow = 0; join->joininfo = joininfo; /* open the CSV file */ if ((stream = fopen(msBuildPath3(szPath, layer->map->mappath, layer->map->shapepath, join->table), "r")) == NULL) { if ((stream = fopen(msBuildPath(szPath, layer->map->mappath, join->table), "r")) == NULL) { msSetError(MS_IOERR, "(%s)", "msCSVJoinConnect()", join->table); return (MS_FAILURE); } } /* once through to get the number of rows */ joininfo->numrows = 0; while (fgets(buffer, MS_BUFFER_LENGTH, stream) != NULL) joininfo->numrows++; rewind(stream); if ((joininfo->rows = (char ***)malloc(joininfo->numrows * sizeof(char **))) == NULL) { fclose(stream); msSetError(MS_MEMERR, "Error allocating rows.", "msCSVJoinConnect()"); return (MS_FAILURE); } /* load the rows */ i = 0; while (fgets(buffer, MS_BUFFER_LENGTH, stream) != NULL) { msStringTrimEOL(buffer); joininfo->rows[i] = msStringSplitComplex(buffer, ",", &(join->numitems), MS_ALLOWEMPTYTOKENS); i++; } fclose(stream); /* get "from" item index */ for (i = 0; i < layer->numitems; i++) { if (strcasecmp(layer->items[i], join->from) == 0) { /* found it */ joininfo->fromindex = i; break; } } if (i == layer->numitems) { msSetError(MS_JOINERR, "Item %s not found in layer %s.", "msCSVJoinConnect()", join->from, layer->name); return (MS_FAILURE); } /* get "to" index (for now the user tells us which column, 1..n) */ joininfo->toindex = atoi(join->to) - 1; if (joininfo->toindex < 0 || joininfo->toindex > join->numitems) { msSetError(MS_JOINERR, "Invalid column index %s.", "msCSVJoinConnect()", join->to); return (MS_FAILURE); } /* store away the column names (1..n) */ if ((join->items = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, "Error allocating space for join item names.", "msCSVJoinConnect()"); return (MS_FAILURE); } for (i = 0; i < join->numitems; i++) { join->items[i] = (char *)malloc(12); /* plenty of space */ sprintf(join->items[i], "%d", i + 1); } return (MS_SUCCESS); } int msCSVJoinPrepare(joinObj *join, shapeObj *shape) { msCSVJoinInfo *joininfo = join->joininfo; if (!joininfo) { msSetError(MS_JOINERR, "Join connection has not be created.", "msCSVJoinPrepare()"); return (MS_FAILURE); } if (!shape) { msSetError(MS_JOINERR, "Shape to be joined is empty.", "msCSVJoinPrepare()"); return (MS_FAILURE); } if (!shape->values) { msSetError(MS_JOINERR, "Shape to be joined has no attributes.", "msCSVJoinPrepare()"); return (MS_FAILURE); } joininfo->nextrow = 0; /* starting with the first record */ if (joininfo->target) free(joininfo->target); /* clear last target */ joininfo->target = msStrdup(shape->values[joininfo->fromindex]); return (MS_SUCCESS); } int msCSVJoinNext(joinObj *join) { int i, j; msCSVJoinInfo *joininfo = join->joininfo; if (!joininfo) { msSetError(MS_JOINERR, "Join connection has not be created.", "msCSVJoinNext()"); return (MS_FAILURE); } /* clear any old data */ if (join->values) { msFreeCharArray(join->values, join->numitems); join->values = NULL; } for (i = joininfo->nextrow; i < joininfo->numrows; i++) { /* find a match */ if (strcmp(joininfo->target, joininfo->rows[i][joininfo->toindex]) == 0) break; } if ((join->values = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, NULL, "msCSVJoinNext()"); return (MS_FAILURE); } if (i == joininfo->numrows) { /* unable to do the join */ for (j = 0; j < join->numitems; j++) join->values[j] = msStrdup("\0"); /* initialize to zero length strings */ joininfo->nextrow = joininfo->numrows; return (MS_DONE); } for (j = 0; j < join->numitems; j++) join->values[j] = msStrdup(joininfo->rows[i][j]); joininfo->nextrow = i + 1; /* so we know where to start looking next time through */ return (MS_SUCCESS); } int msCSVJoinClose(joinObj *join) { int i; msCSVJoinInfo *joininfo = join->joininfo; if (!joininfo) return (MS_SUCCESS); /* already closed */ for (i = 0; i < joininfo->numrows; i++) msFreeCharArray(joininfo->rows[i], join->numitems); free(joininfo->rows); if (joininfo->target) free(joininfo->target); free(joininfo); joininfo = NULL; return (MS_SUCCESS); } #ifdef USE_MYSQL #ifndef _mysql_h #include #endif char *DB_HOST = NULL; char *DB_USER = NULL; char *DB_PASSWD = NULL; char *DB_DATABASE = NULL; char *delim; #define MYDEBUG if (0) MYSQL_RES *msMySQLQuery(char *q, MYSQL *conn) { MYSQL_RES *qresult = NULL; if (mysql_query(conn, q) < 0) { mysql_close(conn); msSetError(MS_QUERYERR, "Bad mysql query (%s)", "msMySQLQuery()", q); return qresult; } if (!(qresult = mysql_store_result(conn))) { mysql_close(conn); msSetError(MS_QUERYERR, "mysql query failed (%s)", "msMySQLQuery()", q); return qresult; } return qresult; } /* */ /* mysql join functions */ /* */ typedef struct { MYSQL mysql, *conn; MYSQL_RES *qresult; MYSQL_ROW row; int rows; int fromindex; char *tocolumn; char *target; int nextrecord; } msMySQLJoinInfo; #endif int msMySQLJoinConnect(layerObj *layer, joinObj *join) { (void)layer; (void)join; #ifndef USE_MYSQL msSetError(MS_QUERYERR, "MySQL support not available (compile with --with-mysql)", "msMySQLJoinConnect()"); return (MS_FAILURE); #else int i; char qbuf[4000]; char *conn_decrypted; msMySQLJoinInfo *joininfo; MYDEBUG if (setvbuf(stdout, NULL, _IONBF, 0)) { printf("Whoops..."); }; if (join->joininfo) return (MS_SUCCESS); /* already open */ /* allocate a msMySQLJoinInfo struct */ joininfo = (msMySQLJoinInfo *)malloc(sizeof(msMySQLJoinInfo)); if (!joininfo) { msSetError(MS_MEMERR, "Error allocating mysql table info structure.", "msMySQLJoinConnect()"); return (MS_FAILURE); } /* initialize any members that won't get set later on in this function */ joininfo->qresult = NULL; joininfo->target = NULL; joininfo->nextrecord = 0; join->joininfo = joininfo; /* open the mysql connection */ if (join->connection == NULL) { msSetError( MS_QUERYERR, "Error parsing MYSQL JOIN: nothing specified in CONNECTION statement.", "msMySQLJoinConnect()"); return (MS_FAILURE); } conn_decrypted = msDecryptStringTokens(layer->map, join->connection); if (conn_decrypted == NULL) { msSetError( MS_QUERYERR, "Error parsing MYSQL JOIN: unable to decrypt CONNECTION statement.", "msMySQLJoinConnect()"); return (MS_FAILURE); } delim = msStrdup(":"); DB_HOST = msStrdup(strtok(conn_decrypted, delim)); DB_USER = msStrdup(strtok(NULL, delim)); DB_PASSWD = msStrdup(strtok(NULL, delim)); DB_DATABASE = msStrdup(strtok(NULL, delim)); free(conn_decrypted); if (DB_HOST == NULL || DB_USER == NULL || DB_PASSWD == NULL || DB_DATABASE == NULL) { msSetError(MS_QUERYERR, "DB param error: at least one of HOST, USER, PASSWD or DATABASE " "is null!", "msMySQLJoinConnect()"); return MS_FAILURE; } if (strcmp(DB_PASSWD, "none") == 0) strcpy(DB_PASSWD, ""); #if MYSQL_VERSION_ID >= 40000 mysql_init(&(joininfo->mysql)); if (!(joininfo->conn = mysql_real_connect( &(joininfo->mysql), DB_HOST, DB_USER, DB_PASSWD, NULL, 0, NULL, 0))) #else if (!(joininfo->conn = mysql_connect(&(joininfo->mysql), DB_HOST, DB_USER, DB_PASSWD))) #endif { char tmp[4000]; snprintf(tmp, sizeof(tmp), "Failed to connect to SQL server: Error: %s\nHost: " "%s\nUsername:%s\nPassword:%s\n", mysql_error(joininfo->conn), DB_HOST, DB_USER, DB_PASSWD); msSetError(MS_QUERYERR, "%s", "msMYSQLLayerOpen()", tmp); free(joininfo); return MS_FAILURE; } MYDEBUG printf("msMYSQLLayerOpen2 called
\n"); if (mysql_select_db(joininfo->conn, DB_DATABASE) < 0) { mysql_close(joininfo->conn); } MYDEBUG printf("msMYSQLLayerOpen3 called
\n"); if (joininfo->qresult != NULL) { /* query leftover */ MYDEBUG printf("msMYSQLLayerOpen4 called
\n"); mysql_free_result(joininfo->qresult); } MYDEBUG printf("msMYSQLLayerOpen5 called
\n"); snprintf(qbuf, sizeof(qbuf), "SELECT count(%s) FROM %s", join->to, join->table); MYDEBUG printf("%s
\n", qbuf); if ((joininfo->qresult = msMySQLQuery(qbuf, joininfo->conn))) { /* There were some rows found, write 'em out for debug */ int numrows = mysql_affected_rows(joininfo->conn); MYDEBUG printf("%d rows
\n", numrows); for (i = 0; i < numrows; i++) { MYSQL_ROW row = mysql_fetch_row(joininfo->qresult); MYDEBUG printf("(%s)
\n", row[0]); joininfo->rows = atoi(row[0]); } } else { msSetError(MS_DBFERR, "Item %s not found in table %s.", "msMySQLJoinConnect()", join->to, join->table); return (MS_FAILURE); } snprintf(qbuf, sizeof(qbuf), "EXPLAIN %s", join->table); if ((joininfo->qresult = msMySQLQuery(qbuf, joininfo->conn))) { /* There were some rows found, write 'em out for debug */ join->numitems = mysql_affected_rows(joininfo->conn); if ((join->items = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, NULL, "msMySQLJoinConnect()"); return (MS_FAILURE); } MYDEBUG printf("%d rows
\n", join->numitems); for (i = 0; i < join->numitems; i++) { MYSQL_ROW row = mysql_fetch_row(joininfo->qresult); MYDEBUG printf("(%s)
\n", row[0]); join->items[i] = msStrdup(row[0]); } } else { msSetError(MS_DBFERR, "Item %s not found in table %s.", "msMySQLJoinConnect()", join->to, join->table); return (MS_FAILURE); } joininfo->tocolumn = msStrdup(join->to); /* get "from" item index */ for (i = 0; i < layer->numitems; i++) { if (strcasecmp(layer->items[i], join->from) == 0) { /* found it */ joininfo->fromindex = i; break; } } if (i == layer->numitems) { msSetError(MS_JOINERR, "Item %s not found in layer %s.", "msMySQLJoinConnect()", join->from, layer->name); return (MS_FAILURE); } /* finally store away the item names in the XBase table */ if (!join->items) return (MS_FAILURE); return (MS_SUCCESS); #endif } int msMySQLJoinPrepare(joinObj *join, shapeObj *shape) { (void)join; (void)shape; #ifndef USE_MYSQL msSetError(MS_QUERYERR, "MySQL support not available (compile with --with-mysql)", "msMySQLJoinPrepare()"); return (MS_FAILURE); #else msMySQLJoinInfo *joininfo = join->joininfo; if (!joininfo) { msSetError(MS_JOINERR, "Join connection has not be created.", "msMySQLJoinPrepare()"); return (MS_FAILURE); } if (!shape) { msSetError(MS_JOINERR, "Shape to be joined is empty.", "msMySQLJoinPrepare()"); return (MS_FAILURE); } if (!shape->values) { msSetError(MS_JOINERR, "Shape to be joined has no attributes.", "msMySQLJoinPrepare()"); return (MS_FAILURE); } joininfo->nextrecord = 0; /* starting with the first record */ if (joininfo->target) free(joininfo->target); /* clear last target */ joininfo->target = msStrdup(shape->values[joininfo->fromindex]); return (MS_SUCCESS); #endif } int msMySQLJoinNext(joinObj *join) { (void)join; #ifndef USE_MYSQL msSetError(MS_QUERYERR, "MySQL support not available (compile with --with-mysql)", "msMySQLJoinNext()"); return (MS_FAILURE); #else int i; char qbuf[4000]; msMySQLJoinInfo *joininfo = join->joininfo; if (!joininfo) { msSetError(MS_JOINERR, "Join connection has not be created.", "msMySQLJoinNext()"); return (MS_FAILURE); } if (!joininfo->target) { msSetError(MS_JOINERR, "No target specified, run msMySQLJoinPrepare() first.", "msMySQLJoinNext()"); return (MS_FAILURE); } /* clear any old data */ if (join->values) { msFreeCharArray(join->values, join->numitems); join->values = NULL; } /* int n = joininfo->rows; */ /* for(i=joininfo->nextrecord; itarget, msMySQLReadStringAttribute(joininfo->conn, i, * joininfo->toindex)) == 0) break; */ /* } */ snprintf(qbuf, sizeof(qbuf), "SELECT * FROM %s WHERE %s = %s", join->table, joininfo->tocolumn, joininfo->target); MYDEBUG printf("%s
\n", qbuf); if ((joininfo->qresult = msMySQLQuery(qbuf, joininfo->conn))) { /* There were some rows found, write 'em out for debug */ int numrows = mysql_affected_rows(joininfo->conn); int numfields = mysql_field_count(joininfo->conn); MYDEBUG printf("%d rows
\n", numrows); if (numrows > 0) { MYSQL_ROW row = mysql_fetch_row(joininfo->qresult); for (i = 0; i < numfields; i++) { MYDEBUG printf("%s,", row[i]); } MYDEBUG printf("
\n"); free(join->values); if ((join->values = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, NULL, "msMySQLJoinNext()"); return (MS_FAILURE); } for (i = 0; i < join->numitems; i++) { /* join->values[i] = msStrdup("\0"); */ /* initialize to zero length strings */ join->values[i] = msStrdup(row[i]); /* initialize to zero length strings */ /* rows = atoi(row[0]); */ } } else { if ((join->values = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, NULL, "msMySQLJoinNext()"); return (MS_FAILURE); } for (i = 0; i < join->numitems; i++) join->values[i] = msStrdup("\0"); /* initialize to zero length strings */ return (MS_DONE); } } else { msSetError(MS_QUERYERR, "Query error (%s)", "msMySQLJoinNext()", qbuf); return (MS_FAILURE); } #ifdef __NOTDEF__ if (i == n) { /* unable to do the join */ if ((join->values = (char **)malloc(sizeof(char *) * join->numitems)) == NULL) { msSetError(MS_MEMERR, NULL, "msMySQLJoinNext()"); return (MS_FAILURE); } for (i = 0; i < join->numitems; i++) join->values[i] = msStrdup("\0"); /* initialize to zero length strings */ joininfo->nextrecord = n; return (MS_DONE); } if ((join->values = msMySQLGetValues(joininfo->conn, i)) == NULL) return (MS_FAILURE); joininfo->nextrecord = i + 1; /* so we know where to start looking next time through */ #endif /* __NOTDEF__ */ return (MS_SUCCESS); #endif } int msMySQLJoinClose(joinObj *join) { (void)join; #ifndef USE_MYSQL msSetError(MS_QUERYERR, "MySQL support not available (compile with --with-mysql)", "msMySQLJoinClose()"); return (MS_FAILURE); #else msMySQLJoinInfo *joininfo = join->joininfo; if (!joininfo) return (MS_SUCCESS); /* already closed */ mysql_close(joininfo->conn); if (joininfo->target) free(joininfo->target); free(joininfo); joininfo = NULL; return (MS_SUCCESS); #endif } mapserver-8.6.0/src/mapkml.cpp000066400000000000000000000177371511405061000163150ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Headers for mapkml.cpp Google Earth KML output * Author: David Kana and the MapServer team * ****************************************************************************** * Copyright (c) 1996-2009 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #ifdef USE_KML #include "mapkmlrenderer.h" #ifdef __cplusplus extern "C" { #endif KmlRenderer *getKmlRenderer(imageObj *img) { return (KmlRenderer *)img->img.plugin; } imageObj *msCreateImageKml(int width, int height, outputFormatObj *format, colorObj *bg) { imageObj *image = NULL; image = (imageObj *)malloc(sizeof(imageObj)); MS_CHECK_ALLOC(image, sizeof(imageObj), NULL); memset(image, 0, sizeof(imageObj)); KmlRenderer *ren = new KmlRenderer(width, height, format, bg); image->img.plugin = (void *)ren; return image; } int msSaveImageKml(imageObj *img, mapObj * /*map*/, FILE *fp, outputFormatObj *format) { KmlRenderer *renderer = getKmlRenderer(img); return renderer->saveImage(img, fp, format); } int msRenderLineKml(imageObj *img, shapeObj *p, strokeStyleObj *style) { KmlRenderer *renderer = getKmlRenderer(img); renderer->renderLine(img, p, style); return MS_SUCCESS; } int msRenderPolygonKml(imageObj *img, shapeObj *p, colorObj *color) { KmlRenderer *renderer = getKmlRenderer(img); renderer->renderPolygon(img, p, color); return MS_SUCCESS; } int msRenderPolygonTiledKml(imageObj * /*img*/, shapeObj * /*p*/, imageObj * /*tile*/) { /*KmlRenderer* renderer = getKmlRenderer(img);*/ return MS_SUCCESS; } int msRenderLineTiledKml(imageObj * /*img*/, shapeObj * /*p*/, imageObj * /*tile*/) { return MS_SUCCESS; } int msRenderGlyphsKml(imageObj *img, const textSymbolObj *ts, colorObj *c, colorObj *oc, int ow, int /*isMarker*/) { KmlRenderer *renderer = getKmlRenderer(img); renderer->renderGlyphs(img, ts, c, oc, ow); return MS_SUCCESS; } int msRenderVectorSymbolKml(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { KmlRenderer *renderer = getKmlRenderer(img); renderer->renderVectorSymbol(img, x, y, symbol, style); return MS_SUCCESS; } int msRenderPixmapSymbolKml(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { KmlRenderer *renderer = getKmlRenderer(img); renderer->renderPixmapSymbol(img, x, y, symbol, style); return MS_SUCCESS; } int msRenderEllipseSymbolKml(imageObj *image, double x, double y, symbolObj *symbol, symbolStyleObj *style) { KmlRenderer *renderer = getKmlRenderer(image); renderer->renderEllipseSymbol(image, x, y, symbol, style); return MS_SUCCESS; } int msRenderTruetypeSymbolKml(imageObj *image, double x, double y, symbolObj *symbol, symbolStyleObj *style) { KmlRenderer *renderer = getKmlRenderer(image); renderer->renderTruetypeSymbol(image, x, y, symbol, style); return MS_SUCCESS; } int msRenderTileKml(imageObj * /*img*/, imageObj * /*tile*/, double /*x*/, double /*y*/) { return MS_SUCCESS; } int msGetRasterBufferKml(imageObj * /*img*/, rasterBufferObj * /*rb*/) { return MS_FAILURE; // not supported for kml } int msGetTruetypeTextBBoxKml(rendererVTableObj * /*r*/, char ** /*fonts*/, int /*numfonts*/, double size, char *string, rectObj *rect, double **advances, int /*bAdjustBaseline*/) { rect->minx = 0.0; rect->maxx = 0.0; rect->miny = 0.0; rect->maxy = 0.0; if (advances) { int numglyphs = msGetNumGlyphs(string); *advances = (double *)msSmallMalloc(numglyphs * sizeof(double)); for (int i = 0; i < numglyphs; i++) { (*advances)[i] = size; } } return MS_SUCCESS; } int msStartNewLayerKml(imageObj *img, mapObj * /*map*/, layerObj *layer) { KmlRenderer *renderer = getKmlRenderer(img); return renderer->startNewLayer(img, layer); } int msCloseNewLayerKml(imageObj *img, mapObj * /*map*/, layerObj *layer) { KmlRenderer *renderer = getKmlRenderer(img); return renderer->closeNewLayer(img, layer); } int msFreeImageKml(imageObj *image) { KmlRenderer *renderer = getKmlRenderer(image); if (renderer) { delete renderer; } image->img.plugin = NULL; return MS_SUCCESS; } int msFreeSymbolKml(symbolObj * /*symbol*/) { return MS_SUCCESS; } int msStartShapeKml(imageObj *img, shapeObj *shape) { KmlRenderer *renderer = getKmlRenderer(img); renderer->startShape(img, shape); return MS_SUCCESS; } int msEndShapeKml(imageObj *img, shapeObj *shape) { KmlRenderer *renderer = getKmlRenderer(img); renderer->endShape(img, shape); return MS_SUCCESS; } int msMergeRasterBufferKml(imageObj *dest, rasterBufferObj *overlay, double /*opacity*/, int /*srcX*/, int /*srcY*/, int /*dstX*/, int /*dstY*/, int /*width*/, int /*height*/) { KmlRenderer *renderer = getKmlRenderer(dest); return renderer->mergeRasterBuffer(dest, overlay); } #ifdef __cplusplus } #endif #endif /*USE_KML*/ int aggInitializeRasterBuffer(rasterBufferObj *rb, int width, int height, int mode); int msPopulateRendererVTableKML(rendererVTableObj *renderer) { #ifdef USE_KML renderer->supports_pixel_buffer = 0; renderer->supports_clipping = 0; renderer->use_imagecache = 0; renderer->default_transform_mode = MS_TRANSFORM_NONE; renderer->startLayer = msStartNewLayerKml; renderer->endLayer = msCloseNewLayerKml; renderer->renderLine = &msRenderLineKml; renderer->createImage = &msCreateImageKml; renderer->saveImage = &msSaveImageKml; renderer->renderPolygon = &msRenderPolygonKml; renderer->renderGlyphs = &msRenderGlyphsKml; renderer->renderEllipseSymbol = &msRenderEllipseSymbolKml; renderer->renderVectorSymbol = &msRenderVectorSymbolKml; renderer->renderPixmapSymbol = &msRenderPixmapSymbolKml; renderer->mergeRasterBuffer = &msMergeRasterBufferKml; renderer->loadImageFromFile = msLoadMSRasterBufferFromFile; renderer->initializeRasterBuffer = aggInitializeRasterBuffer; renderer->renderTile = &msRenderTileKml; renderer->renderPolygonTiled = &msRenderPolygonTiledKml; renderer->renderLineTiled = NULL; renderer->freeSymbol = &msFreeSymbolKml; renderer->freeImage = &msFreeImageKml; renderer->mergeRasterBuffer = msMergeRasterBufferKml; renderer->compositeRasterBuffer = NULL; renderer->startShape = &msStartShapeKml; renderer->endShape = &msEndShapeKml; return MS_SUCCESS; #else (void)renderer; msSetError(MS_MISCERR, "KML Driver requested but is not built in", "msPopulateRendererVTableKML()"); return MS_FAILURE; #endif } mapserver-8.6.0/src/mapkmlrenderer.cpp000066400000000000000000001262471511405061000200410ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Google Earth KML output * Author: David Kana and the MapServer team * ****************************************************************************** * Copyright (c) 1996-2009 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver-config.h" #ifdef USE_KML #include "mapserver.h" #include "maperror.h" #include "mapkmlrenderer.h" #include "mapio.h" #include "mapows.h" #include "cpl_conv.h" #include "cpl_vsi.h" #include "cpl_string.h" #define KML_MAXFEATURES_TODRAW 1000 KmlRenderer::KmlRenderer(int width, int height, outputFormatObj * /*format*/, colorObj * /*color*/) : Width(width), Height(height), MapCellsize(1.0), XmlDoc(NULL), LayerNode(NULL), GroundOverlayNode(NULL), PlacemarkNode(NULL), GeomNode(NULL), Items(NULL), NumItems(0), FirstLayer(MS_TRUE), map(NULL), currentLayer(NULL), mElevationFromAttribute(false), mElevationAttributeIndex(-1), mCurrentElevationValue(0.0) { /*private variables*/ pszLayerDescMetadata = NULL; papszLayerIncludeItems = NULL; nIncludeItems = 0; papszLayerExcludeItems = NULL; nExcludeItems = 0; pszLayerNameAttributeMetadata = NULL; /*metadata to use for a name for each feature*/ LineStyle = NULL; numLineStyle = 0; xmlNodePtr styleNode; xmlNodePtr listStyleNode; /* Create document.*/ XmlDoc = xmlNewDoc(BAD_CAST "1.0"); xmlNodePtr rootNode = xmlNewNode(NULL, BAD_CAST "kml"); /* Name spaces*/ xmlSetNs(rootNode, xmlNewNs(rootNode, BAD_CAST "http://www.opengis.net/kml/2.2", NULL)); xmlDocSetRootElement(XmlDoc, rootNode); DocNode = xmlNewChild(rootNode, NULL, BAD_CAST "Document", NULL); styleNode = xmlNewChild(DocNode, NULL, BAD_CAST "Style", NULL); xmlNewProp(styleNode, BAD_CAST "id", BAD_CAST "LayerFolder_check"); listStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "ListStyle", NULL); xmlNewChild(listStyleNode, NULL, BAD_CAST "listItemType", BAD_CAST "check"); styleNode = xmlNewChild(DocNode, NULL, BAD_CAST "Style", NULL); xmlNewProp(styleNode, BAD_CAST "id", BAD_CAST "LayerFolder_checkHideChildren"); listStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "ListStyle", NULL); xmlNewChild(listStyleNode, NULL, BAD_CAST "listItemType", BAD_CAST "checkHideChildren"); styleNode = xmlNewChild(DocNode, NULL, BAD_CAST "Style", NULL); xmlNewProp(styleNode, BAD_CAST "id", BAD_CAST "LayerFolder_checkOffOnly"); listStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "ListStyle", NULL); xmlNewChild(listStyleNode, NULL, BAD_CAST "listItemType", BAD_CAST "checkOffOnly"); styleNode = xmlNewChild(DocNode, NULL, BAD_CAST "Style", NULL); xmlNewProp(styleNode, BAD_CAST "id", BAD_CAST "LayerFolder_radioFolder"); listStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "ListStyle", NULL); xmlNewChild(listStyleNode, NULL, BAD_CAST "listItemType", BAD_CAST "radioFolder"); StyleHashTable = msCreateHashTable(); } KmlRenderer::~KmlRenderer() { if (XmlDoc) xmlFreeDoc(XmlDoc); if (StyleHashTable) msFreeHashTable(StyleHashTable); if (LineStyle) msFree(LineStyle); xmlCleanupParser(); } imageObj *KmlRenderer::createImage(int, int, outputFormatObj *, colorObj *) { return NULL; } int KmlRenderer::saveImage(imageObj *, FILE *fp, outputFormatObj *format) { /* -------------------------------------------------------------------- */ /* Write out the document. */ /* -------------------------------------------------------------------- */ int bufSize = 0; xmlChar *buf = NULL; msIOContext *context = NULL; int chunkSize = 4096; int bZip = MS_FALSE; if (msIO_needBinaryStdout() == MS_FAILURE) return MS_FAILURE; xmlDocDumpFormatMemoryEnc(XmlDoc, &buf, &bufSize, "UTF-8", 1); if (format && format->driver && strcasecmp(format->driver, "kmz") == 0) { bZip = MS_TRUE; } if (bZip) { VSILFILE *fpZip; int bytes_read; char buffer[1024]; char *zip_filename = NULL; void *hZip = NULL; const char *timestamp; timestamp = msGetOutputFormatOption(format, "TIMESTAMP", "NOW"); char **papszOptions = nullptr; papszOptions = CSLAddNameValue(papszOptions, "TIMESTAMP", timestamp); zip_filename = msTmpFile(NULL, NULL, "/vsimem/kmlzip/", "kmz"); hZip = CPLCreateZip(zip_filename, NULL); CPLCreateFileInZip(hZip, "mapserver.kml", papszOptions); for (int i = 0; i < bufSize; i += chunkSize) { int size = chunkSize; if (i + size > bufSize) size = bufSize - i; CPLWriteFileInZip(hZip, buf + i, size); } CPLCloseFileInZip(hZip); CPLCloseZip(hZip); CSLDestroy(papszOptions); context = msIO_getHandler(fp); fpZip = VSIFOpenL(zip_filename, "r"); while ((bytes_read = VSIFReadL(buffer, 1, sizeof(buffer), fpZip)) > 0) { if (context) msIO_contextWrite(context, buffer, bytes_read); else msIO_fwrite(buffer, 1, bytes_read, fp); } VSIFCloseL(fpZip); msFree(zip_filename); xmlFree(buf); return (MS_SUCCESS); } context = msIO_getHandler(fp); for (int i = 0; i < bufSize; i += chunkSize) { int size = chunkSize; if (i + size > bufSize) size = bufSize - i; if (context) msIO_contextWrite(context, buf + i, size); else msIO_fwrite(buf + i, 1, size, fp); } xmlFree(buf); return (MS_SUCCESS); } /************************************************************************/ /* processLayer */ /* */ /* Set parameters that make sense to a kml output. */ /************************************************************************/ void KmlRenderer::processLayer(layerObj *layer, outputFormatObj *format) { int i; const char *asRaster = NULL; int nMaxFeatures = -1; const char *pszTmp; char szTmp[10]; if (!layer) return; /*turn of labelcache*/ layer->labelcache = MS_OFF; /*if there are labels we want the coordinates to be the center of the element.*/ for (i = 0; i < layer->numclasses; i++) if (layer->_class[i]->numlabels > 0) layer->_class[i]->labels[0]->position = MS_XY; /*we do not want to draw multiple styles. the new rendering architecture does not allow to know if we are dealing with a multi-style. So here we remove all styles beside the first one*/ for (i = 0; i < layer->numclasses; i++) { while (layer->_class[i]->numstyles > 1) msDeleteStyle(layer->_class[i], layer->_class[i]->numstyles - 1); } /*if layer has a metadata KML_OUTPUTASRASTER set to true, add a processing directive to use an agg driver*/ asRaster = msLookupHashTable(&layer->metadata, "kml_outputasraster"); if (!asRaster) asRaster = msLookupHashTable(&(layer->map->web.metadata), "kml_outputasraster"); if (asRaster && (strcasecmp(asRaster, "true") == 0 || strcasecmp(asRaster, "yes") == 0)) msLayerAddProcessing(layer, "RENDERER=png24"); /*set a maxfeaturestodraw, if not already set*/ pszTmp = msLookupHashTable(&layer->metadata, "maxfeaturestodraw"); if (pszTmp) nMaxFeatures = atoi(pszTmp); else { pszTmp = msLookupHashTable(&layer->map->web.metadata, "maxfeaturestodraw"); if (pszTmp) nMaxFeatures = atoi(pszTmp); } if (nMaxFeatures < 0 && format) nMaxFeatures = atoi(msGetOutputFormatOption(format, "maxfeaturestodraw", "-1")); if (nMaxFeatures < 0 && format) { snprintf(szTmp, sizeof(szTmp), "%d", KML_MAXFEATURES_TODRAW); msSetOutputFormatOption(format, "maxfeaturestodraw", szTmp); } } /************************************************************************/ /* getLayerName */ /* */ /* Internal utility function to build name used for the layer. */ /************************************************************************/ char *KmlRenderer::getLayerName(layerObj *layer) { char stmp[20]; const char *name = NULL; ; if (!layer) return NULL; name = msLookupHashTable(&layer->metadata, "ows_name"); if (name && strlen(name) > 0) return msStrdup(name); if (layer->name && strlen(layer->name) > 0) return msStrdup(layer->name); sprintf(stmp, "Layer%d", layer->index); return msStrdup(stmp); } const char *KmlRenderer::getAliasName(layerObj *lp, char *pszItemName, const char *namespaces) { const char *pszAlias = NULL; if (lp && pszItemName && strlen(pszItemName) > 0) { char szTmp[256]; snprintf(szTmp, sizeof(szTmp), "%s_alias", pszItemName); pszAlias = msOWSLookupMetadata(&(lp->metadata), namespaces, szTmp); } return pszAlias; } int KmlRenderer::startNewLayer(imageObj *img, layerObj *layer) { char *layerName = NULL; const char *value = NULL; LayerNode = xmlNewNode(NULL, BAD_CAST "Folder"); layerName = getLayerName(layer); xmlNewChild(LayerNode, NULL, BAD_CAST "name", BAD_CAST layerName); msFree(layerName); const char *layerVisibility = layer->status != MS_OFF ? "1" : "0"; xmlNewChild(LayerNode, NULL, BAD_CAST "visibility", BAD_CAST layerVisibility); const char *layerDsiplayFolder = msLookupHashTable(&(layer->metadata), "kml_folder_display"); if (layerDsiplayFolder == NULL) layerDsiplayFolder = msLookupHashTable(&(layer->map->web.metadata), "kml_folder_display"); if (!layerDsiplayFolder || strlen(layerDsiplayFolder) <= 0) { xmlNewChild(LayerNode, NULL, BAD_CAST "styleUrl", BAD_CAST "#LayerFolder_check"); } else { if (strcasecmp(layerDsiplayFolder, "checkHideChildren") == 0) xmlNewChild(LayerNode, NULL, BAD_CAST "styleUrl", BAD_CAST "#LayerFolder_checkHideChildren"); else if (strcasecmp(layerDsiplayFolder, "checkOffOnly") == 0) xmlNewChild(LayerNode, NULL, BAD_CAST "styleUrl", BAD_CAST "#LayerFolder_checkOffOnly"); else if (strcasecmp(layerDsiplayFolder, "radioFolder") == 0) xmlNewChild(LayerNode, NULL, BAD_CAST "styleUrl", BAD_CAST "#LayerFolder_radioFolder"); else xmlNewChild(LayerNode, NULL, BAD_CAST "styleUrl", BAD_CAST "#LayerFolder_check"); } /*Init few things on the first layer*/ if (FirstLayer) { FirstLayer = MS_FALSE; map = layer->map; if (layer->map->mappath) snprintf(MapPath, sizeof(MapPath), "%s", layer->map->mappath); /*First rendered layer - check mapfile projection*/ checkProjection(layer->map); /*check for image path and image url*/ if (layer->map->debug && (layer->map->web.imageurl == NULL || layer->map->web.imagepath == NULL)) msDebug("KmlRenderer::startNewLayer: imagepath and imageurl should be " "set in the web object\n"); /*map rect for ground overlay*/ MapExtent = layer->map->extent; MapCellsize = layer->map->cellsize; BgColor = layer->map->imagecolor; xmlNewChild(DocNode, NULL, BAD_CAST "name", BAD_CAST layer->map->name); aggFormat = msSelectOutputFormat(layer->map, "png24"); aggFormat->transparent = MS_TRUE; } currentLayer = layer; if (!msLayerIsOpen(layer)) { if (msLayerOpen(layer) != MS_SUCCESS) { msSetError(MS_MISCERR, "msLayerOpen failed", "KmlRenderer::startNewLayer"); return MS_FAILURE; } } /*pre process the layer to set things that make sense for kml output*/ if (img) processLayer(layer, img->format); else processLayer(layer, NULL); if (msLookupHashTable(&layer->metadata, "kml_description")) pszLayerDescMetadata = msLookupHashTable(&layer->metadata, "kml_description"); else if (msLookupHashTable(&layer->metadata, "ows_description")) pszLayerDescMetadata = msLookupHashTable(&layer->metadata, "ows_description"); value = msLookupHashTable(&layer->metadata, "kml_include_items"); if (!value) value = msLookupHashTable(&layer->metadata, "ows_include_items"); if (value) papszLayerIncludeItems = msStringSplit(value, ',', &nIncludeItems); value = msLookupHashTable(&layer->metadata, "kml_exclude_items"); if (!value) value = msLookupHashTable(&layer->metadata, "ows_exclude_items"); if (value) papszLayerExcludeItems = msStringSplit(value, ',', &nExcludeItems); if (msLookupHashTable(&layer->metadata, "kml_name_item")) pszLayerNameAttributeMetadata = msLookupHashTable(&layer->metadata, "kml_name_item"); /*get all attributes*/ if (msLayerWhichItems(layer, MS_TRUE, NULL) != MS_SUCCESS) { return MS_FAILURE; } NumItems = layer->numitems; if (NumItems) { Items = (char **)msSmallCalloc(NumItems, sizeof(char *)); for (int i = 0; i < NumItems; i++) Items[i] = msStrdup(layer->items[i]); } const char *elevationAttribute = msLookupHashTable(&layer->metadata, "kml_elevation_attribute"); if (elevationAttribute) { mElevationFromAttribute = true; for (int i = 0; i < layer->numitems; ++i) { if (strcasecmp(layer->items[i], elevationAttribute) == 0) { mElevationAttributeIndex = i; } } } setupRenderingParams(&layer->metadata); return MS_SUCCESS; } int KmlRenderer::closeNewLayer(imageObj *, layerObj *) { flushPlacemark(); xmlAddChild(DocNode, LayerNode); if (Items) { msFreeCharArray(Items, NumItems); Items = NULL; NumItems = 0; } if (pszLayerDescMetadata) pszLayerDescMetadata = NULL; if (pszLayerNameAttributeMetadata) pszLayerNameAttributeMetadata = NULL; if (papszLayerIncludeItems && nIncludeItems > 0) msFreeCharArray(papszLayerIncludeItems, nIncludeItems); papszLayerIncludeItems = NULL; if (papszLayerExcludeItems && nExcludeItems > 0) msFreeCharArray(papszLayerExcludeItems, nExcludeItems); papszLayerExcludeItems = NULL; return MS_SUCCESS; } int KmlRenderer::mergeRasterBuffer(imageObj *image, rasterBufferObj *rb) { assert(rb && rb->type == MS_BUFFER_BYTE_RGBA); char *tmpFileName = NULL; char *tmpUrl = NULL; FILE *tmpFile = NULL; tmpFileName = msTmpFile(NULL, MapPath, image->imagepath, "png"); tmpFile = fopen(tmpFileName, "wb"); if (tmpFile) { if (!aggFormat->vtable) msInitializeRendererVTable(aggFormat); msSaveRasterBuffer(map, rb, tmpFile, aggFormat); tmpUrl = msStrdup(image->imageurl); tmpUrl = msStringConcatenate(tmpUrl, (char *)(msGetBasename(tmpFileName))); tmpUrl = msStringConcatenate(tmpUrl, ".png"); createGroundOverlayNode(LayerNode, tmpUrl, currentLayer); msFree(tmpFileName); msFree(tmpUrl); fclose(tmpFile); return MS_SUCCESS; } else { msSetError(MS_IOERR, "Failed to create file for kml overlay", "KmlRenderer::mergeRasterBuffer()"); return MS_FAILURE; } } void KmlRenderer::setupRenderingParams(hashTableObj *layerMetadata) { AltitudeMode = 0; Extrude = 0; Tessellate = 0; const char *altitudeModeVal = msLookupHashTable(layerMetadata, "kml_altitudeMode"); if (altitudeModeVal) { if (strcasecmp(altitudeModeVal, "absolute") == 0) AltitudeMode = absolute; else if (strcasecmp(altitudeModeVal, "relativeToGround") == 0) AltitudeMode = relativeToGround; else if (strcasecmp(altitudeModeVal, "clampToGround") == 0) AltitudeMode = clampToGround; } const char *extrudeVal = msLookupHashTable(layerMetadata, "kml_extrude"); if (altitudeModeVal) { Extrude = atoi(extrudeVal); } const char *tessellateVal = msLookupHashTable(layerMetadata, "kml_tessellate"); if (tessellateVal) { Tessellate = atoi(tessellateVal); } } int KmlRenderer::checkProjection(mapObj *map) { projectionObj *projection = &map->projection; if (projection && projection->numargs > 0 && msProjIsGeographicCRS(projection)) { return MS_SUCCESS; } else { char epsg_string[100]; rectObj sRect; projectionObj out; /* for layer the do not have any projection set, set them with the current map projection*/ if (projection && projection->numargs > 0) { layerObj *lp = NULL; int i = 0; char *pszMapProjectString = msGetProjectionString(projection); if (pszMapProjectString) { for (i = 0; i < map->numlayers; i++) { lp = GET_LAYER(map, i); if (lp->projection.numargs == 0 && lp->transform == MS_TRUE) { msFreeProjection(&lp->projection); msLoadProjectionString(&lp->projection, pszMapProjectString); } } msFree(pszMapProjectString); } } strcpy(epsg_string, "epsg:4326"); msInitProjection(&out); msProjectionInheritContextFrom(&out, projection); msLoadProjectionString(&out, epsg_string); sRect = map->extent; msProjectRect(projection, &out, &sRect); msFreeProjectionExceptContext(projection); msLoadProjectionString(projection, epsg_string); /*change also units and extents*/ map->extent = sRect; map->units = MS_DD; if (map->debug) msDebug("KmlRenderer::checkProjection: Mapfile projection set to " "epsg:4326\n"); return MS_SUCCESS; } } xmlNodePtr KmlRenderer::createPlacemarkNode(xmlNodePtr parentNode, char *styleUrl) { xmlNodePtr placemarkNode = xmlNewChild(parentNode, NULL, BAD_CAST "Placemark", NULL); /*always add a name. It will be replaced by a text value if available*/ char tmpid[100]; char *stmp = NULL, *layerName = NULL; if (CurrentShapeName && strlen(CurrentShapeName) > 0) { xmlNewChild(placemarkNode, NULL, BAD_CAST "name", BAD_CAST CurrentShapeName); } else { sprintf(tmpid, ".%d", CurrentShapeIndex); layerName = getLayerName(currentLayer); stmp = msStringConcatenate(stmp, layerName); stmp = msStringConcatenate(stmp, tmpid); xmlNewChild(placemarkNode, NULL, BAD_CAST "name", BAD_CAST stmp); } msFree(layerName); msFree(stmp); if (styleUrl) xmlNewChild(placemarkNode, NULL, BAD_CAST "styleUrl", BAD_CAST styleUrl); return placemarkNode; } void KmlRenderer::renderLine(imageObj *, shapeObj *p, strokeStyleObj *style) { if (p->numlines == 0) return; if (PlacemarkNode == NULL) PlacemarkNode = createPlacemarkNode(LayerNode, NULL); if (!PlacemarkNode) return; addLineStyleToList(style); SymbologyFlag[Line] = 1; /*p->index > CurrentDrawnShapeIndexneed to be reviewd. Added since the height level code caches shapes when rendering lines*/ if (CurrentDrawnShapeIndex == -1 || p->index > CurrentDrawnShapeIndex) { xmlNodePtr geomNode = getGeomParentNode("LineString"); addAddRenderingSpecifications(geomNode); addCoordsNode(geomNode, p->line[0].point, p->line[0].numpoints); /* more than one line => MultiGeometry*/ if (p->numlines > 1) { geomNode = getGeomParentNode("LineString"); // returns MultiGeom Node for (int i = 1; i < p->numlines; i++) { xmlNodePtr lineStringNode = xmlNewChild(geomNode, NULL, BAD_CAST "LineString", NULL); addAddRenderingSpecifications(lineStringNode); addCoordsNode(lineStringNode, p->line[i].point, p->line[i].numpoints); } } CurrentDrawnShapeIndex = p->index; } } void KmlRenderer::renderPolygon(imageObj *, shapeObj *p, colorObj *color) { if (PlacemarkNode == NULL) PlacemarkNode = createPlacemarkNode(LayerNode, NULL); if (!PlacemarkNode) return; memcpy(&PolygonColor, color, sizeof(colorObj)); SymbologyFlag[Polygon] = 1; if (p->index != CurrentDrawnShapeIndex) { xmlNodePtr geomParentNode = getGeomParentNode("Polygon"); for (int i = 0; i < p->numlines; i++) { xmlNodePtr bdryNode = NULL; if (i == 0) /* __TODO__ check ring order*/ bdryNode = xmlNewChild(geomParentNode, NULL, BAD_CAST "outerBoundaryIs", NULL); else bdryNode = xmlNewChild(geomParentNode, NULL, BAD_CAST "innerBoundaryIs", NULL); xmlNodePtr ringNode = xmlNewChild(bdryNode, NULL, BAD_CAST "LinearRing", NULL); addAddRenderingSpecifications(ringNode); addCoordsNode(ringNode, p->line[i].point, p->line[i].numpoints); } CurrentDrawnShapeIndex = p->index; } } void KmlRenderer::addCoordsNode(xmlNodePtr parentNode, pointObj *pts, int numPts) { char lineBuf[128]; xmlNodePtr coordsNode = xmlNewChild(parentNode, NULL, BAD_CAST "coordinates", NULL); xmlNodeAddContent(coordsNode, BAD_CAST "\n"); for (int i = 0; i < numPts; i++) { if (mElevationFromAttribute) { sprintf(lineBuf, "\t%.8f,%.8f,%.8f\n", pts[i].x, pts[i].y, mCurrentElevationValue); } else if (AltitudeMode == relativeToGround || AltitudeMode == absolute) { sprintf(lineBuf, "\t%.8f,%.8f,%.8f\n", pts[i].x, pts[i].y, pts[i].z); } else sprintf(lineBuf, "\t%.8f,%.8f\n", pts[i].x, pts[i].y); xmlNodeAddContent(coordsNode, BAD_CAST lineBuf); } xmlNodeAddContent(coordsNode, BAD_CAST "\t"); } void KmlRenderer::renderGlyphs(imageObj *, const textSymbolObj *ts, colorObj *clr, colorObj * /*oc*/, int /*ow*/) { if (ts->annotext == NULL || ts->textpath->numglyphs == 0) return; if (PlacemarkNode == NULL) PlacemarkNode = createPlacemarkNode(LayerNode, NULL); if (!PlacemarkNode) return; memcpy(&LabelColor, clr, sizeof(colorObj)); SymbologyFlag[Label] = 1; /*there is alaws a default name (layer.shapeid). Replace it*/ for (xmlNodePtr node = PlacemarkNode->children; node; node = node->next) { if (node->type != XML_ELEMENT_NODE) continue; if (strcmp((char *)node->name, "name") == 0) { xmlNodeSetContent(node, BAD_CAST ts->annotext); break; } } /*xmlNewChild(PlacemarkNode, NULL, BAD_CAST "name", BAD_CAST text);*/ xmlNodePtr geomNode = getGeomParentNode("Point"); addAddRenderingSpecifications(geomNode); pointObj pt; pt.x = ts->textpath->glyphs[0].pnt.x; pt.y = ts->textpath->glyphs[0].pnt.y; pt.z = 0.0; addCoordsNode(geomNode, &pt, 1); } void KmlRenderer::addAddRenderingSpecifications(xmlNodePtr node) { /* 0 0 clampToGround */ if (Extrude) xmlNewChild(node, NULL, BAD_CAST "extrude", BAD_CAST "1"); if (Tessellate) xmlNewChild(node, NULL, BAD_CAST "tessellate", BAD_CAST "1"); if (AltitudeMode == absolute) xmlNewChild(node, NULL, BAD_CAST "altitudeMode", BAD_CAST "absolute"); else if (AltitudeMode == relativeToGround) xmlNewChild(node, NULL, BAD_CAST "altitudeMode", BAD_CAST "relativeToGround"); else if (AltitudeMode == clampToGround) xmlNewChild(node, NULL, BAD_CAST "altitudeMode", BAD_CAST "clampToGround"); } imageObj *agg2CreateImage(int width, int height, outputFormatObj *format, colorObj *bg); int KmlRenderer::createIconImage(char *fileName, symbolObj *symbol, symbolStyleObj *symstyle) { pointObj p; int status; imageObj *tmpImg = NULL; tmpImg = agg2CreateImage((int)(symbol->sizex * symstyle->scale), (int)(symbol->sizey * symstyle->scale), aggFormat, NULL); tmpImg->format = aggFormat; if (!aggFormat->vtable) msInitializeRendererVTable(aggFormat); p.x = symbol->sizex * symstyle->scale / 2; p.y = symbol->sizey * symstyle->scale / 2; p.z = 0.0; status = msDrawMarkerSymbol(map, tmpImg, &p, symstyle->style, 1); if (status != MS_SUCCESS) return status; return msSaveImage(map, tmpImg, fileName); } void KmlRenderer::renderSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { if (PlacemarkNode == NULL) PlacemarkNode = createPlacemarkNode(LayerNode, NULL); if (!PlacemarkNode) return; snprintf(SymbolUrl, sizeof(SymbolUrl), "%s", lookupSymbolUrl(img, symbol, style)); SymbologyFlag[Symbol] = 1; xmlNodePtr geomNode = getGeomParentNode("Point"); addAddRenderingSpecifications(geomNode); pointObj pt; pt.x = x; pt.y = y; pt.z = 0.0; addCoordsNode(geomNode, &pt, 1); } void KmlRenderer::renderPixmapSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { renderSymbol(img, x, y, symbol, style); } void KmlRenderer::renderVectorSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { renderSymbol(img, x, y, symbol, style); } void KmlRenderer::renderEllipseSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { renderSymbol(img, x, y, symbol, style); } void KmlRenderer::renderTruetypeSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style) { renderSymbol(img, x, y, symbol, style); } xmlNodePtr KmlRenderer::createGroundOverlayNode(xmlNodePtr parentNode, char *imageHref, layerObj *layer) { /* GroundOverlay.kml 7fffffff 1 http://www.google.com/intl/en/images/logo.gif onInterval 86400 0.75 37.83234 37.832122 -122.373033 -122.373724 45 */ char layerHexColor[32]; xmlNodePtr groundOverlayNode = xmlNewChild(parentNode, NULL, BAD_CAST "GroundOverlay", NULL); char *layerName = getLayerName(layer); xmlNewChild(groundOverlayNode, NULL, BAD_CAST "name", BAD_CAST layerName); if (layer->compositer && layer->compositer->opacity > 0 && layer->compositer->opacity < 100) { sprintf(layerHexColor, "%02xffffff", (unsigned int)MS_NINT(layer->compositer->opacity * 2.55)); xmlNewChild(groundOverlayNode, NULL, BAD_CAST "color", BAD_CAST layerHexColor); } else xmlNewChild(groundOverlayNode, NULL, BAD_CAST "color", BAD_CAST "ffffffff"); char stmp[20]; sprintf(stmp, "%d", layer->index); xmlNewChild(groundOverlayNode, NULL, BAD_CAST "drawOrder", BAD_CAST stmp); if (imageHref) { xmlNodePtr iconNode = xmlNewChild(groundOverlayNode, NULL, BAD_CAST "Icon", NULL); xmlNewChild(iconNode, NULL, BAD_CAST "href", BAD_CAST imageHref); } char crdStr[64]; rectObj mapextent; if (map->gt.need_geotransform == MS_TRUE) mapextent = currentLayer->map->saved_extent; else mapextent = currentLayer->map->extent; xmlNodePtr latLonBoxNode = xmlNewChild(groundOverlayNode, NULL, BAD_CAST "LatLonBox", NULL); sprintf(crdStr, "%.8f", mapextent.maxy); xmlNewChild(latLonBoxNode, NULL, BAD_CAST "north", BAD_CAST crdStr); sprintf(crdStr, "%.8f", mapextent.miny); xmlNewChild(latLonBoxNode, NULL, BAD_CAST "south", BAD_CAST crdStr); sprintf(crdStr, "%.8f", mapextent.minx); xmlNewChild(latLonBoxNode, NULL, BAD_CAST "west", BAD_CAST crdStr); sprintf(crdStr, "%.8f", mapextent.maxx); xmlNewChild(latLonBoxNode, NULL, BAD_CAST "east", BAD_CAST crdStr); xmlNewChild(latLonBoxNode, NULL, BAD_CAST "rotation", BAD_CAST "0.0"); return groundOverlayNode; } void KmlRenderer::startShape(imageObj *, shapeObj *shape) { if (PlacemarkNode) flushPlacemark(); CurrentShapeIndex = -1; CurrentDrawnShapeIndex = -1; CurrentShapeName = NULL; /*should be done at endshape but the plugin architecture does not call * endshape yet*/ if (LineStyle) { msFree(LineStyle); LineStyle = NULL; numLineStyle = 0; } CurrentShapeIndex = shape->index; if (pszLayerNameAttributeMetadata) { for (int i = 0; i < currentLayer->numitems; i++) { if (strcasecmp(currentLayer->items[i], pszLayerNameAttributeMetadata) == 0 && shape->values[i]) { CurrentShapeName = msStrdup(shape->values[i]); break; } } } PlacemarkNode = NULL; GeomNode = NULL; DescriptionNode = createDescriptionNode(shape); if (mElevationFromAttribute && shape->numvalues > mElevationAttributeIndex && mElevationAttributeIndex >= 0 && shape->values[mElevationAttributeIndex]) { mCurrentElevationValue = atof(shape->values[mElevationAttributeIndex]); } memset(SymbologyFlag, 0, NumSymbologyFlag); } void KmlRenderer::endShape(imageObj *, shapeObj *) { CurrentShapeIndex = -1; if (CurrentShapeName) msFree(CurrentShapeName); CurrentShapeName = NULL; } xmlNodePtr KmlRenderer::getGeomParentNode(const char *geomName) { /*we do not need a multi-geometry for point layers*/ if (currentLayer->type != MS_LAYER_POINT && currentLayer->type != MS_LAYER_ANNOTATION && GeomNode) { /*placemark geometry already defined, we need multigeometry node*/ xmlNodePtr multiGeomNode = xmlNewNode(NULL, BAD_CAST "MultiGeometry"); xmlAddChild(multiGeomNode, GeomNode); GeomNode = multiGeomNode; xmlNodePtr geomNode = xmlNewChild(multiGeomNode, NULL, BAD_CAST geomName, NULL); return geomNode; } else { GeomNode = xmlNewNode(NULL, BAD_CAST geomName); return GeomNode; } } const char *KmlRenderer::lookupSymbolUrl(imageObj *img, symbolObj *symbol, symbolStyleObj *symstyle) { char symbolHexColor[32]; /* */ sprintf(symbolHexColor, "%02x%02x%02x%02x", symstyle->style->color.alpha, symstyle->style->color.blue, symstyle->style->color.green, symstyle->style->color.red); snprintf(SymbolName, sizeof(SymbolName), "symbol_%s_%.1f_%s", symbol->name, symstyle->scale, symbolHexColor); const char *symbolUrl = msLookupHashTable(StyleHashTable, SymbolName); if (!symbolUrl) { char iconFileName[MS_MAXPATHLEN]; char iconUrl[MS_MAXPATHLEN]; if (img->imagepath) { char *tmpFileName = msTmpFile(NULL, MapPath, img->imagepath, "png"); snprintf(iconFileName, sizeof(iconFileName), "%s", tmpFileName); msFree(tmpFileName); } else { sprintf(iconFileName, "symbol_%s_%.1f.%s", symbol->name, symstyle->scale, "png"); } if (createIconImage(iconFileName, symbol, symstyle) != MS_SUCCESS) { msSetError(MS_IOERR, "Error creating icon file '%s'", "KmlRenderer::lookupSymbolStyle()", iconFileName); return NULL; } if (img->imageurl) sprintf(iconUrl, "%s%s.%s", img->imageurl, msGetBasename(iconFileName), "png"); else snprintf(iconUrl, sizeof(iconUrl), "%s", iconFileName); hashObj *hash = msInsertHashTable(StyleHashTable, SymbolName, iconUrl); symbolUrl = hash->data; } return symbolUrl; } const char *KmlRenderer::lookupPlacemarkStyle() { char lineHexColor[32]; char polygonHexColor[32]; char labelHexColor[32]; char *styleName = NULL; styleName = msStringConcatenate(styleName, "style"); if (SymbologyFlag[Line]) { /* ffffffff normal 1 */ for (int i = 0; i < numLineStyle; i++) { if (currentLayer && currentLayer->compositer && currentLayer->compositer->opacity > 0 && currentLayer->compositer->opacity < 100 && LineStyle[i].color->alpha == 255) LineStyle[i].color->alpha = MS_NINT(currentLayer->compositer->opacity * 2.55); sprintf(lineHexColor, "%02x%02x%02x%02x", LineStyle[i].color->alpha, LineStyle[0].color->blue, LineStyle[i].color->green, LineStyle[i].color->red); char lineStyleName[64]; snprintf(lineStyleName, sizeof(lineStyleName), "_line_%s_w%.1f", lineHexColor, LineStyle[i].width); styleName = msStringConcatenate(styleName, lineStyleName); } } if (SymbologyFlag[Polygon]) { /* ffffffff normal 1 1 */ if (currentLayer && currentLayer->compositer && currentLayer->compositer->opacity > 0 && currentLayer->compositer->opacity < 100 && PolygonColor.alpha == 255) PolygonColor.alpha = MS_NINT(currentLayer->compositer->opacity * 2.55); sprintf(polygonHexColor, "%02x%02x%02x%02x", PolygonColor.alpha, PolygonColor.blue, PolygonColor.green, PolygonColor.red); char polygonStyleName[64]; sprintf(polygonStyleName, "_polygon_%s", polygonHexColor); styleName = msStringConcatenate(styleName, polygonStyleName); } if (SymbologyFlag[Label]) { /* ffffffff normal 1 */ if (currentLayer && currentLayer->compositer && currentLayer->compositer->opacity > 0 && currentLayer->compositer->opacity < 100 && LabelColor.alpha == 255) LabelColor.alpha = MS_NINT(currentLayer->compositer->opacity * 2.55); sprintf(labelHexColor, "%02x%02x%02x%02x", LabelColor.alpha, LabelColor.blue, LabelColor.green, LabelColor.red); // __TODO__ add label scale char labelStyleName[64]; sprintf(labelStyleName, "_label_%s", labelHexColor); styleName = msStringConcatenate(styleName, labelStyleName); } if (SymbologyFlag[Symbol]) { /* */ /* __TODO__ add label scale */ styleName = msStringConcatenate(styleName, "_"); styleName = msStringConcatenate(styleName, SymbolName); } const char *styleUrl = msLookupHashTable(StyleHashTable, styleName); if (!styleUrl) { char *styleValue = NULL; styleValue = msStringConcatenate(styleValue, "#"); styleValue = msStringConcatenate(styleValue, styleName); hashObj *hash = msInsertHashTable(StyleHashTable, styleName, styleValue); styleUrl = hash->data; msFree(styleValue); /* Insert new Style node into Document node*/ xmlNodePtr styleNode = xmlNewChild(DocNode, NULL, BAD_CAST "Style", NULL); xmlNewProp(styleNode, BAD_CAST "id", BAD_CAST styleName); if (SymbologyFlag[Polygon]) { xmlNodePtr polyStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "PolyStyle", NULL); xmlNewChild(polyStyleNode, NULL, BAD_CAST "color", BAD_CAST polygonHexColor); } if (SymbologyFlag[Line]) { for (int i = 0; i < numLineStyle; i++) { xmlNodePtr lineStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "LineStyle", NULL); sprintf(lineHexColor, "%02x%02x%02x%02x", LineStyle[i].color->alpha, LineStyle[i].color->blue, LineStyle[i].color->green, LineStyle[i].color->red); xmlNewChild(lineStyleNode, NULL, BAD_CAST "color", BAD_CAST lineHexColor); char width[16]; sprintf(width, "%.1f", LineStyle[i].width); xmlNewChild(lineStyleNode, NULL, BAD_CAST "width", BAD_CAST width); } } if (SymbologyFlag[Symbol]) { xmlNodePtr iconStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "IconStyle", NULL); xmlNodePtr iconNode = xmlNewChild(iconStyleNode, NULL, BAD_CAST "Icon", NULL); xmlNewChild(iconNode, NULL, BAD_CAST "href", BAD_CAST SymbolUrl); /*char scale[16]; sprintf(scale, "%.1f", style->scale); xmlNewChild(iconStyleNode, NULL, BAD_CAST "scale", BAD_CAST scale);*/ } else { const char *value = msLookupHashTable(¤tLayer->metadata, "kml_default_symbol_href"); if (value && strlen(value) > 0) { xmlNodePtr iconStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "IconStyle", NULL); xmlNodePtr iconNode = xmlNewChild(iconStyleNode, NULL, BAD_CAST "Icon", NULL); xmlNewChild(iconNode, NULL, BAD_CAST "href", BAD_CAST value); } } if (SymbologyFlag[Label]) { xmlNodePtr labelStyleNode = xmlNewChild(styleNode, NULL, BAD_CAST "LabelStyle", NULL); xmlNewChild(labelStyleNode, NULL, BAD_CAST "color", BAD_CAST labelHexColor); /*char scale[16]; sprintf(scale, "%.1f", style->scale); xmlNewChild(iconStyleNode, NULL, BAD_CAST "scale", BAD_CAST scale);*/ } } if (styleName) msFree(styleName); return styleUrl; } void KmlRenderer::flushPlacemark() { if (PlacemarkNode) { const char *styleUrl = lookupPlacemarkStyle(); xmlNewChild(PlacemarkNode, NULL, BAD_CAST "styleUrl", BAD_CAST styleUrl); if (DescriptionNode) xmlAddChild(PlacemarkNode, DescriptionNode); if (GeomNode) xmlAddChild(PlacemarkNode, GeomNode); } } xmlNodePtr KmlRenderer::createDescriptionNode(shapeObj *shape) { /* */ /*description nodes for vector layers: - if kml_description is set, use it - if not, dump the attributes */ if (pszLayerDescMetadata) { char *pszTmp = NULL; char *pszTmpDesc = NULL; size_t bufferSize = 0; pszTmpDesc = msStrdup(pszLayerDescMetadata); for (int i = 0; i < currentLayer->numitems; i++) { bufferSize = strlen(currentLayer->items[i]) + 3; pszTmp = (char *)msSmallMalloc(bufferSize); snprintf(pszTmp, bufferSize, "%%%s%%", currentLayer->items[i]); if (strcasestr(pszTmpDesc, pszTmp)) pszTmpDesc = msCaseReplaceSubstring(pszTmpDesc, pszTmp, shape->values[i]); msFree(pszTmp); } xmlNodePtr descriptionNode = xmlNewNode(NULL, BAD_CAST "description"); xmlNodeAddContent(descriptionNode, BAD_CAST pszTmpDesc); msFree(pszTmpDesc); return descriptionNode; } else if ((papszLayerIncludeItems && nIncludeItems > 0) || (papszLayerExcludeItems && nExcludeItems > 0)) { /* -------------------------------------------------------------------- */ /* preferred way is to use the ExtendedData tag (#3728) */ /* http://code.google.com/apis/kml/documentation/extendeddata.html */ /* -------------------------------------------------------------------- */ xmlNodePtr extendedDataNode = xmlNewNode(NULL, BAD_CAST "ExtendedData"); xmlNodePtr dataNode = NULL; const char *pszAlias = NULL; int bIncludeAll = MS_FALSE; if (papszLayerIncludeItems && nIncludeItems == 1 && strcasecmp(papszLayerIncludeItems[0], "all") == 0) bIncludeAll = MS_TRUE; for (int i = 0; i < currentLayer->numitems; i++) { int j = 0, k = 0; /*TODO optimize to calculate this only once per layer*/ for (j = 0; j < nIncludeItems; j++) { if (strcasecmp(currentLayer->items[i], papszLayerIncludeItems[j]) == 0) break; } if (j < nIncludeItems || bIncludeAll) { if (papszLayerExcludeItems && nExcludeItems > 0) { for (k = 0; k < nExcludeItems; k++) { if (strcasecmp(currentLayer->items[i], papszLayerExcludeItems[k]) == 0) break; } } if (nExcludeItems == 0 || k == nExcludeItems) { dataNode = xmlNewNode(NULL, BAD_CAST "Data"); xmlNewProp(dataNode, BAD_CAST "name", BAD_CAST currentLayer->items[i]); pszAlias = getAliasName(currentLayer, currentLayer->items[i], "GO"); if (pszAlias) xmlNewChild(dataNode, NULL, BAD_CAST "displayName", BAD_CAST pszAlias); else xmlNewChild(dataNode, NULL, BAD_CAST "displayName", BAD_CAST currentLayer->items[i]); if (shape->values[i] && strlen(shape->values[i])) xmlNewChild(dataNode, NULL, BAD_CAST "value", BAD_CAST shape->values[i]); else xmlNewChild(dataNode, NULL, BAD_CAST "value", NULL); xmlAddChild(extendedDataNode, dataNode); } } } return extendedDataNode; } return NULL; } void KmlRenderer::addLineStyleToList(strokeStyleObj *style) { /*actually this is not necessary. kml only uses the last LineStyle so we should not bother keeping them all*/ int i = 0; for (i = 0; i < numLineStyle; i++) { if (style->width == LineStyle[i].width && LineStyle[i].color->alpha == style->color->alpha && LineStyle[i].color->red == style->color->red && LineStyle[i].color->green == style->color->green && LineStyle[i].color->blue == style->color->blue) break; } if (i == numLineStyle) { numLineStyle++; if (LineStyle == NULL) LineStyle = (strokeStyleObj *)msSmallMalloc(sizeof(strokeStyleObj)); else LineStyle = (strokeStyleObj *)msSmallRealloc( LineStyle, sizeof(strokeStyleObj) * numLineStyle); memcpy(&LineStyle[numLineStyle - 1], style, sizeof(strokeStyleObj)); } } #endif mapserver-8.6.0/src/mapkmlrenderer.h000066400000000000000000000150051511405061000174730ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Headers for mapkmlrenderer.cpp Google Earth KML output * Author: David Kana and the MapServer team * ****************************************************************************** * Copyright (c) 1996-2009 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #ifndef MAPKMLRENDERER_H #define MAPKMLRENDERER_H #include "mapserver-config.h" #if defined(USE_KML) #include "mapserver.h" #include "maplibxml2.h" class KmlRenderer { private: const char *pszLayerDescMetadata = nullptr; /*if the kml_description is set*/ char **papszLayerIncludeItems = nullptr; int nIncludeItems = 0; char **papszLayerExcludeItems = nullptr; int nExcludeItems = 0; const char *pszLayerNameAttributeMetadata = nullptr; protected: // map properties int Width = 0, Height = 0; rectObj MapExtent = {0, 0, 0, 0}; double MapCellsize = 0; colorObj BgColor = {0, 0, 0, 0}; char MapPath[MS_MAXPATHLEN] = {0}; // xml nodes pointers xmlDocPtr XmlDoc = nullptr; xmlNodePtr DocNode = nullptr; xmlNodePtr LayerNode = nullptr; xmlNodePtr GroundOverlayNode = nullptr; xmlNodePtr PlacemarkNode = nullptr; xmlNodePtr GeomNode = nullptr; xmlNodePtr DescriptionNode = nullptr; int CurrentShapeIndex = 0; int CurrentDrawnShapeIndex = 0; char *CurrentShapeName = nullptr; char **Items = nullptr; int NumItems = 0; int DumpAttributes = 0; // placemark symbology hashTableObj *StyleHashTable = nullptr; colorObj LabelColor = {0, 0, 0, 0}; strokeStyleObj *LineStyle = nullptr; int numLineStyle = 0; colorObj PolygonColor = {0, 0, 0, 0}; char SymbolName[128] = {0}; char SymbolUrl[128] = {0}; enum { NumSymbologyFlag = 4 }; char SymbologyFlag[NumSymbologyFlag] = {0, 0, 0, 0}; enum symbFlagsEnum { Label, Line, Polygon, Symbol }; int FirstLayer = 0; mapObj *map = nullptr; layerObj *currentLayer = nullptr; int AltitudeMode = 0; int Tessellate = 0; int Extrude = 0; enum altitudeModeEnum { undefined, clampToGround, relativeToGround, absolute }; /**True if elevation is taken from a feature attribute*/ bool mElevationFromAttribute = false; /**Attribute index of elevation (or -1 if elevation is not attribute driven*/ int mElevationAttributeIndex = 0; double mCurrentElevationValue = 0; outputFormatObj *aggFormat = nullptr; protected: imageObj *createInternalImage(); xmlNodePtr createPlacemarkNode(xmlNodePtr parentNode, char *styleUrl); xmlNodePtr createGroundOverlayNode(xmlNodePtr parentNode, char *imageHref, layerObj *layer); xmlNodePtr createDescriptionNode(shapeObj *shape); const char *lookupSymbolUrl(imageObj *img, symbolObj *symbol, symbolStyleObj *style); void addCoordsNode(xmlNodePtr parentNode, pointObj *pts, int numPts); void setupRenderingParams(hashTableObj *layerMetadata); void addAddRenderingSpecifications(xmlNodePtr node); int checkProjection(mapObj *map); int createIconImage(char *fileName, symbolObj *symbol, symbolStyleObj *style); void renderSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style); ////////////////////////////////////////////////////////////////////////////// void renderLineVector(imageObj *img, shapeObj *p, strokeStyleObj *style); void renderPolygonVector(imageObj *img, shapeObj *p, colorObj *color); const char *lookupPlacemarkStyle(); void flushPlacemark(); xmlNodePtr getGeomParentNode(const char *geomName); char *getLayerName(layerObj *layer); void processLayer(layerObj *layer, outputFormatObj *format); void addLineStyleToList(strokeStyleObj *style); const char *getAliasName(layerObj *lp, char *pszItemName, const char *namespaces); public: KmlRenderer(int width, int height, outputFormatObj *format, colorObj *color = NULL); virtual ~KmlRenderer(); imageObj *createImage(int width, int height, outputFormatObj *format, colorObj *bg); int saveImage(imageObj *img, FILE *fp, outputFormatObj *format); int startNewLayer(imageObj *img, layerObj *layer); int closeNewLayer(imageObj *img, layerObj *layer); void startShape(imageObj *img, shapeObj *shape); void endShape(imageObj *img, shapeObj *shape); void renderLine(imageObj *img, shapeObj *p, strokeStyleObj *style); void renderPolygon(imageObj *img, shapeObj *p, colorObj *color); void renderGlyphs(imageObj *img, const textSymbolObj *ts, colorObj *c, colorObj *oc, int ow); // Symbols void renderPixmapSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style); void renderVectorSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style); void renderEllipseSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style); void renderTruetypeSymbol(imageObj *img, double x, double y, symbolObj *symbol, symbolStyleObj *style); int getTruetypeTextBBox(imageObj *img, char **fonts, int numfonts, double size, char *string, rectObj *rect, double **advances); int mergeRasterBuffer(imageObj *image, rasterBufferObj *rb); }; #endif /* USE_KML */ #endif mapserver-8.6.0/src/maplabel.c000066400000000000000000001251721511405061000162420ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Labeling Implementation. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ /* ** maplabel.c: Routines to enable text drawing, BITMAP or TRUETYPE. */ #include #include #include "mapserver.h" #include "fontcache.h" #include "cpl_vsi.h" #include "cpl_string.h" void initTextPath(textPathObj *ts) { memset(ts, 0, sizeof(*ts)); } int WARN_UNUSED msLayoutTextSymbol(mapObj *map, textSymbolObj *ts, textPathObj *tgret); #if defined(USE_EXTENDED_DEBUG) && 0 static void msDebugTextPath(textSymbolObj *ts) { int i; msDebug("text: %s\n", ts->annotext); if (ts->textpath) { for (i = 0; i < ts->textpath->numglyphs; i++) { glyphObj *g = &ts->textpath->glyphs[i]; msDebug("glyph %d: pos: %f %f\n", g->glyph->key.codepoint, g->pnt.x, g->pnt.y); } } else { msDebug("no glyphs\n"); } msDebug("\n=========================================\n"); } #endif int msComputeTextPath(mapObj *map, textSymbolObj *ts) { textPathObj *tgret = msSmallMalloc(sizeof(textPathObj)); assert(ts->annotext && *ts->annotext); initTextPath(tgret); ts->textpath = tgret; tgret->absolute = 0; tgret->glyph_size = ts->label->size * ts->scalefactor; tgret->glyph_size = MS_MAX(tgret->glyph_size, ts->label->minsize * ts->resolutionfactor); tgret->glyph_size = MS_NINT( MS_MIN(tgret->glyph_size, ts->label->maxsize * ts->resolutionfactor)); tgret->line_height = ceil(tgret->glyph_size * 1.33); return msLayoutTextSymbol(map, ts, tgret); } void initTextSymbol(textSymbolObj *ts) { memset(ts, 0, sizeof(*ts)); } void freeTextPath(textPathObj *tp) { free(tp->glyphs); if (tp->bounds.poly) { free(tp->bounds.poly->point); free(tp->bounds.poly); } } void freeTextSymbol(textSymbolObj *ts) { freeTextSymbolEx(ts, MS_TRUE); } void freeTextSymbolEx(textSymbolObj *ts, int doFreeLabel) { if (ts->textpath) { freeTextPath(ts->textpath); free(ts->textpath); } if (ts->label->numstyles) { if (ts->style_bounds) { int i; for (i = 0; i < ts->label->numstyles; i++) { if (ts->style_bounds[i]) { if (ts->style_bounds[i]->poly) { free(ts->style_bounds[i]->poly->point); free(ts->style_bounds[i]->poly); } free(ts->style_bounds[i]); } } free(ts->style_bounds); } } free(ts->annotext); if (doFreeLabel && freeLabel(ts->label) == MS_SUCCESS) { free(ts->label); } } void msCopyTextPath(textPathObj *dst, textPathObj *src) { int i; *dst = *src; if (src->bounds.poly) { dst->bounds.poly = msSmallMalloc(sizeof(lineObj)); dst->bounds.poly->numpoints = src->bounds.poly->numpoints; dst->bounds.poly->point = msSmallMalloc(src->bounds.poly->numpoints * sizeof(pointObj)); for (i = 0; i < src->bounds.poly->numpoints; i++) { dst->bounds.poly->point[i] = src->bounds.poly->point[i]; } } else { dst->bounds.poly = NULL; } if (dst->numglyphs > 0) { dst->glyphs = msSmallMalloc(dst->numglyphs * sizeof(glyphObj)); for (i = 0; i < dst->numglyphs; i++) dst->glyphs[i] = src->glyphs[i]; } } void msCopyTextSymbol(textSymbolObj *dst, textSymbolObj *src) { *dst = *src; MS_REFCNT_INCR(src->label); dst->annotext = msStrdup(src->annotext); if (src->textpath) { dst->textpath = msSmallMalloc(sizeof(textPathObj)); msCopyTextPath(dst->textpath, src->textpath); } if (src->style_bounds) { int i; dst->style_bounds = msSmallCalloc(src->label->numstyles, sizeof(label_bounds *)); for (i = 0; i < src->label->numstyles; i++) { if (src->style_bounds[i]) { dst->style_bounds[i] = msSmallMalloc(sizeof(label_bounds)); copyLabelBounds(dst->style_bounds[i], src->style_bounds[i]); } } } } static int labelNeedsDeepCopy(labelObj *label) { int i; if (label->numbindings > 0) return MS_TRUE; for (i = 0; i < label->numstyles; i++) { if (label->styles[i]->numbindings > 0) { return MS_TRUE; } } return MS_FALSE; } void msPopulateTextSymbolForLabelAndString(textSymbolObj *ts, labelObj *l, char *string, double scalefactor, double resolutionfactor, label_cache_mode cache) { if (cache == duplicate_always) { ts->label = msSmallMalloc(sizeof(labelObj)); initLabel(ts->label); msCopyLabel(ts->label, l); } else if (cache == duplicate_never) { ts->label = l; MS_REFCNT_INCR(l); } else if (cache == duplicate_if_needed && labelNeedsDeepCopy(l)) { ts->label = msSmallMalloc(sizeof(labelObj)); initLabel(ts->label); msCopyLabel(ts->label, l); } else { ts->label = l; MS_REFCNT_INCR(l); } ts->resolutionfactor = resolutionfactor; ts->scalefactor = scalefactor; ts->annotext = string; /* we take the ownership of the annotation text */ ts->rotation = l->angle * MS_DEG_TO_RAD; } int msAddLabelGroup(mapObj *map, imageObj *image, layerObj *layer, int classindex, shapeObj *shape, pointObj *point, double featuresize) { int l, s, priority; labelCacheSlotObj *cacheslot; labelCacheMemberObj *cachePtr = NULL; layerObj *layerPtr = NULL; classObj *classPtr = NULL; int numtextsymbols = 0; textSymbolObj **textsymbols, *ts; int layerindex = layer->index; // We cannot use GET_LAYER here because in drawQuery the drawing may happen // on a temp layer only. layerPtr = layer; classPtr = layer->class[classindex]; if (classPtr->numlabels == 0) return MS_SUCCESS; /* not an error just nothing to do */ /* check that the label intersects the layer mask */ if (layerPtr->mask) { int maskLayerIdx = msGetLayerIndex(map, layerPtr->mask); layerObj *maskLayer = GET_LAYER(map, maskLayerIdx); unsigned char *alphapixptr; if (maskLayer->maskimage && MS_IMAGE_RENDERER(maskLayer->maskimage)->supports_pixel_buffer) { rasterBufferObj rb; int x, y; memset(&rb, 0, sizeof(rasterBufferObj)); if (MS_UNLIKELY(MS_FAILURE == MS_IMAGE_RENDERER(maskLayer->maskimage) ->getRasterBufferHandle(maskLayer->maskimage, &rb))) { return MS_FAILURE; } x = MS_NINT(point->x); y = MS_NINT(point->y); /* Using label repeatdistance, we might have a point with x/y below 0. See * #4764 */ if (x >= 0 && x < (int)rb.width && y >= 0 && y < (int)rb.height) { assert(rb.type == MS_BUFFER_BYTE_RGBA); alphapixptr = rb.data.rgba.a + rb.data.rgba.row_step * y + rb.data.rgba.pixel_step * x; if (!*alphapixptr) { /* label point does not intersect mask */ return MS_SUCCESS; } } else { return MS_SUCCESS; /* label point does not intersect image extent, we cannot know if it intersects mask, so we discard it (#5237)*/ } } else { msSetError(MS_MISCERR, "Layer (%s) references references a mask layer, but the " "selected renderer does not support them", "msAddLabelGroup()", layerPtr->name); return (MS_FAILURE); } } textsymbols = msSmallMalloc(classPtr->numlabels * sizeof(textSymbolObj *)); for (l = 0; l < classPtr->numlabels; l++) { labelObj *lbl = classPtr->labels[l]; char *annotext; if (msGetLabelStatus(map, layerPtr, shape, lbl) == MS_OFF) { continue; } annotext = msShapeGetLabelAnnotation(layerPtr, shape, lbl); if (!annotext) { for (s = 0; s < lbl->numstyles; s++) { if (lbl->styles[s]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) break; /* we have a "symbol only label, so we shouldn't skip this label */ } if (s == lbl->numstyles) { continue; /* no anno text, and no label symbols */ } } ts = msSmallMalloc(sizeof(textSymbolObj)); initTextSymbol(ts); msPopulateTextSymbolForLabelAndString( ts, lbl, annotext, layerPtr->scalefactor, image->resolutionfactor, 1); if (annotext && *annotext && lbl->autominfeaturesize && featuresize > 0) { if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, ts))) { freeTextSymbol(ts); free(ts); return MS_FAILURE; } if (featuresize < (ts->textpath->bounds.bbox.maxx - ts->textpath->bounds.bbox.minx)) { /* feature is too big to be drawn, skip it */ freeTextSymbol(ts); free(ts); continue; } } textsymbols[numtextsymbols] = ts; numtextsymbols++; } if (numtextsymbols == 0) { free(textsymbols); return MS_SUCCESS; } /* Validate label priority value and get ref on label cache for it */ priority = classPtr->labels[0]->priority; /* take priority from the first label */ if (priority < 1) priority = 1; else if (priority > MS_MAX_LABEL_PRIORITY) priority = MS_MAX_LABEL_PRIORITY; cacheslot = &(map->labelcache.slots[priority - 1]); if (cacheslot->numlabels == cacheslot->cachesize) { /* just add it to the end */ cacheslot->labels = (labelCacheMemberObj *)realloc( cacheslot->labels, sizeof(labelCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT)); MS_CHECK_ALLOC(cacheslot->labels, sizeof(labelCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT), MS_FAILURE); cacheslot->cachesize += MS_LABELCACHEINCREMENT; } cachePtr = &(cacheslot->labels[cacheslot->numlabels]); cachePtr->layerindex = layerindex; /* so we can get back to this *raw* data if necessary */ cachePtr->classindex = classindex; cachePtr->point = *point; /* the actual label point */ cachePtr->leaderline = NULL; cachePtr->leaderbbox = NULL; cachePtr->markerid = -1; cachePtr->status = MS_FALSE; if (layerPtr->type == MS_LAYER_POINT && classPtr->numstyles > 0) { /* cache the marker placement, it's already on the map */ /* TO DO: at the moment only checks the bottom style, perhaps should check * all of them */ /* #2347: after RFC-24 classPtr->styles could be NULL so we check it */ double w, h; if (msGetMarkerSize(map, classPtr->styles[0], &w, &h, layerPtr->scalefactor) != MS_SUCCESS) return (MS_FAILURE); if (cacheslot->nummarkers == cacheslot->markercachesize) { /* just add it to the end */ cacheslot->markers = (markerCacheMemberObj *)realloc( cacheslot->markers, sizeof(markerCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT)); MS_CHECK_ALLOC(cacheslot->markers, sizeof(markerCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT), MS_FAILURE); cacheslot->markercachesize += MS_LABELCACHEINCREMENT; } cacheslot->markers[cacheslot->nummarkers].bounds.minx = (point->x - .5 * w); cacheslot->markers[cacheslot->nummarkers].bounds.miny = (point->y - .5 * h); cacheslot->markers[cacheslot->nummarkers].bounds.maxx = cacheslot->markers[cacheslot->nummarkers].bounds.minx + (w - 1); cacheslot->markers[cacheslot->nummarkers].bounds.maxy = cacheslot->markers[cacheslot->nummarkers].bounds.miny + (h - 1); cacheslot->markers[cacheslot->nummarkers].id = cacheslot->numlabels; cachePtr->markerid = cacheslot->nummarkers; cacheslot->nummarkers++; } cachePtr->textsymbols = textsymbols; cachePtr->numtextsymbols = numtextsymbols; cacheslot->numlabels++; return (MS_SUCCESS); } int msAddLabel(mapObj *map, imageObj *image, labelObj *label, int layerindex, int classindex, shapeObj *shape, pointObj *point, double featuresize, textSymbolObj *ts) { int i; labelCacheSlotObj *cacheslot; labelCacheMemberObj *cachePtr = NULL; const char *annotext = NULL; char *annotextToFree = NULL; layerObj *layerPtr; classObj *classPtr; layerPtr = GET_LAYER(map, layerindex); assert(layerPtr); assert(classindex < layerPtr->numclasses); classPtr = layerPtr->class[classindex]; assert(label); if (ts) annotext = ts->annotext; else if (shape) { annotextToFree = msShapeGetLabelAnnotation(layerPtr, shape, label); annotext = annotextToFree; } if (!annotext) { /* check if we have a labelpnt style */ for (i = 0; i < label->numstyles; i++) { if (label->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) break; } if (i == label->numstyles) { /* label has no text or marker symbols */ if (ts) { freeTextSymbol(ts); free(ts); } return MS_SUCCESS; } } if (classPtr->leader) { if (ts && ts->textpath && ts->textpath->absolute) { msSetError(MS_MISCERR, "LEADERs are not supported on ANGLE FOLLOW labels", "msAddLabel()"); return MS_FAILURE; } } /* check that the label intersects the layer mask */ if (layerPtr->mask) { int maskLayerIdx = msGetLayerIndex(map, layerPtr->mask); layerObj *maskLayer = GET_LAYER(map, maskLayerIdx); unsigned char *alphapixptr; if (maskLayer->maskimage && MS_IMAGE_RENDERER(maskLayer->maskimage)->supports_pixel_buffer) { rasterBufferObj rb; memset(&rb, 0, sizeof(rasterBufferObj)); if (MS_UNLIKELY(MS_FAILURE == MS_IMAGE_RENDERER(maskLayer->maskimage) ->getRasterBufferHandle(maskLayer->maskimage, &rb))) { msFree(annotextToFree); return MS_FAILURE; } assert(rb.type == MS_BUFFER_BYTE_RGBA); if (point) { int x = MS_NINT(point->x); int y = MS_NINT(point->y); /* Using label repeatdistance, we might have a point with x/y below 0. * See #4764 */ if (x >= 0 && x < (int)rb.width && y >= 0 && y < (int)rb.height) { alphapixptr = rb.data.rgba.a + rb.data.rgba.row_step * y + rb.data.rgba.pixel_step * x; if (!*alphapixptr) { /* label point does not intersect mask */ if (ts) { freeTextSymbol(ts); free(ts); } msFree(annotextToFree); return MS_SUCCESS; } } else { msFree(annotextToFree); return MS_SUCCESS; /* label point does not intersect image extent, we cannot know if it intersects mask, so we discard it (#5237)*/ } } else if (ts && ts->textpath) { int i = 0; for (i = 0; i < ts->textpath->numglyphs; i++) { int x = MS_NINT(ts->textpath->glyphs[i].pnt.x); int y = MS_NINT(ts->textpath->glyphs[i].pnt.y); if (x >= 0 && x < (int)rb.width && y >= 0 && y < (int)rb.height) { alphapixptr = rb.data.rgba.a + rb.data.rgba.row_step * y + rb.data.rgba.pixel_step * x; if (!*alphapixptr) { freeTextSymbol(ts); free(ts); msFree(annotextToFree); return MS_SUCCESS; } } else { freeTextSymbol(ts); free(ts); msFree(annotextToFree); return MS_SUCCESS; /* label point does not intersect image extent, we cannot know if it intersects mask, so we discard it (#5237)*/ } } } } else { msSetError(MS_MISCERR, "Layer (%s) references references a mask layer, but the " "selected renderer does not support them", "msAddLabel()", layerPtr->name); msFree(annotextToFree); return (MS_FAILURE); } } if (!ts) { ts = msSmallMalloc(sizeof(textSymbolObj)); initTextSymbol(ts); msPopulateTextSymbolForLabelAndString(ts, label, annotextToFree, layerPtr->scalefactor, image->resolutionfactor, 1); // annotextToFree = NULL; } if (annotext && label->autominfeaturesize && featuresize > 0) { if (!ts->textpath) { if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, ts))) return MS_FAILURE; } if (!ts->textpath) { return MS_FAILURE; } if (featuresize > (ts->textpath->bounds.bbox.maxx - ts->textpath->bounds.bbox.minx)) { /* feature is too big to be drawn, skip it */ freeTextSymbol(ts); free(ts); return MS_SUCCESS; } } /* Validate label priority value and get ref on label cache for it */ if (label->priority < 1) label->priority = 1; else if (label->priority > MS_MAX_LABEL_PRIORITY) label->priority = MS_MAX_LABEL_PRIORITY; cacheslot = &(map->labelcache.slots[label->priority - 1]); if (cacheslot->numlabels == cacheslot->cachesize) { /* just add it to the end */ cacheslot->labels = (labelCacheMemberObj *)realloc( cacheslot->labels, sizeof(labelCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT)); MS_CHECK_ALLOC(cacheslot->labels, sizeof(labelCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT), MS_FAILURE); cacheslot->cachesize += MS_LABELCACHEINCREMENT; } cachePtr = &(cacheslot->labels[cacheslot->numlabels]); cachePtr->layerindex = layerindex; /* so we can get back to this *raw* data if necessary */ cachePtr->classindex = classindex; cachePtr->leaderline = NULL; cachePtr->leaderbbox = NULL; /* Store the label point or the label path (Bug #1620) */ if (point) { cachePtr->point = *point; /* the actual label point */ } else { assert(ts && ts->textpath && ts->textpath->absolute && ts->textpath->numglyphs > 0); /* Use the middle point of the labelpath for mindistance calculations */ cachePtr->point = ts->textpath->glyphs[ts->textpath->numglyphs / 2].pnt; } /* copy the label */ cachePtr->numtextsymbols = 1; cachePtr->textsymbols = (textSymbolObj **)msSmallMalloc(sizeof(textSymbolObj *)); cachePtr->textsymbols[0] = ts; cachePtr->markerid = -1; cachePtr->status = MS_FALSE; if (layerPtr->type == MS_LAYER_POINT && classPtr->numstyles > 0) { /* cache the marker placement, it's already on the map */ double w, h; if (cacheslot->nummarkers == cacheslot->markercachesize) { /* just add it to the end */ cacheslot->markers = (markerCacheMemberObj *)realloc( cacheslot->markers, sizeof(markerCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT)); MS_CHECK_ALLOC(cacheslot->markers, sizeof(markerCacheMemberObj) * (cacheslot->cachesize + MS_LABELCACHEINCREMENT), MS_FAILURE); cacheslot->markercachesize += MS_LABELCACHEINCREMENT; } i = cacheslot->nummarkers; /* TO DO: at the moment only checks the bottom style, perhaps should check * all of them */ /* #2347: after RFC-24 classPtr->styles could be NULL so we check it */ if (classPtr->styles != NULL) { if (msGetMarkerSize(map, classPtr->styles[0], &w, &h, layerPtr->scalefactor) != MS_SUCCESS) return (MS_FAILURE); assert(point); cacheslot->markers[cacheslot->nummarkers].bounds.minx = (point->x - .5 * w); cacheslot->markers[cacheslot->nummarkers].bounds.miny = (point->y - .5 * h); cacheslot->markers[cacheslot->nummarkers].bounds.maxx = cacheslot->markers[cacheslot->nummarkers].bounds.minx + (w - 1); cacheslot->markers[cacheslot->nummarkers].bounds.maxy = cacheslot->markers[cacheslot->nummarkers].bounds.miny + (h - 1); cacheslot->markers[i].id = cacheslot->numlabels; cachePtr->markerid = i; cacheslot->nummarkers++; } } cacheslot->numlabels++; return (MS_SUCCESS); } /* ** Is a label completely in the image, reserving a gutter (in pixels) inside ** image for no labels (effectively making image larger. The gutter can be ** negative in cases where a label has a buffer around it. */ static int labelInImage(int width, int height, lineObj *lpoly, rectObj *bounds, int gutter) { int j; /* do a bbox test first */ if (bounds->minx >= gutter && bounds->miny >= gutter && bounds->maxx < width - gutter && bounds->maxy < height - gutter) { return MS_TRUE; } if (lpoly) { for (j = 1; j < lpoly->numpoints; j++) { if (lpoly->point[j].x < gutter) return (MS_FALSE); if (lpoly->point[j].x >= width - gutter) return (MS_FALSE); if (lpoly->point[j].y < gutter) return (MS_FALSE); if (lpoly->point[j].y >= height - gutter) return (MS_FALSE); } } else { /* if no poly, then return false as the boundong box intersected */ return MS_FALSE; } return (MS_TRUE); } void insertRenderedLabelMember(mapObj *map, labelCacheMemberObj *cachePtr) { if (map->labelcache.num_rendered_members == map->labelcache.num_allocated_rendered_members) { if (map->labelcache.num_rendered_members == 0) { map->labelcache.num_allocated_rendered_members = 50; } else { map->labelcache.num_allocated_rendered_members *= 2; } map->labelcache.rendered_text_symbols = msSmallRealloc(map->labelcache.rendered_text_symbols, map->labelcache.num_allocated_rendered_members * sizeof(labelCacheMemberObj *)); } map->labelcache .rendered_text_symbols[map->labelcache.num_rendered_members++] = cachePtr; } static inline int testSegmentLabelBBoxIntersection(const rectObj *leaderbbox, const pointObj *lp1, const pointObj *lp2, const label_bounds *test) { if (msRectOverlap(leaderbbox, &test->bbox)) { if (test->poly) { int pp; for (pp = 1; pp < test->poly->numpoints; pp++) { if (msIntersectSegments(&(test->poly->point[pp - 1]), &(test->poly->point[pp]), lp1, lp2) == MS_TRUE) { return (MS_FALSE); } } } else { pointObj tp1 = {0}, tp2 = {0}; tp1.x = test->bbox.minx; tp1.y = test->bbox.miny; tp2.x = test->bbox.minx; tp2.y = test->bbox.maxy; if (msIntersectSegments(lp1, lp2, &tp1, &tp2)) return MS_FALSE; tp2.x = test->bbox.maxx; tp2.y = test->bbox.miny; if (msIntersectSegments(lp1, lp2, &tp1, &tp2)) return MS_FALSE; tp1.x = test->bbox.maxx; tp1.y = test->bbox.maxy; tp2.x = test->bbox.minx; tp2.y = test->bbox.maxy; if (msIntersectSegments(lp1, lp2, &tp1, &tp2)) return MS_FALSE; tp2.x = test->bbox.maxx; tp2.y = test->bbox.miny; if (msIntersectSegments(lp1, lp2, &tp1, &tp2)) return MS_FALSE; } } return MS_TRUE; } int msTestLabelCacheLeaderCollision(mapObj *map, pointObj *lp1, pointObj *lp2) { int p; rectObj leaderbbox; leaderbbox.minx = MS_MIN(lp1->x, lp2->x); leaderbbox.maxx = MS_MAX(lp1->x, lp2->x); leaderbbox.miny = MS_MIN(lp1->y, lp2->y); leaderbbox.maxy = MS_MAX(lp1->y, lp2->y); for (p = 0; p < map->labelcache.num_rendered_members; p++) { labelCacheMemberObj *curCachePtr = map->labelcache.rendered_text_symbols[p]; if (msRectOverlap(&leaderbbox, &(curCachePtr->bbox))) { /* leaderbbox intersects with the curCachePtr's global bbox */ int t; for (t = 0; t < curCachePtr->numtextsymbols; t++) { int s; textSymbolObj *ts = curCachePtr->textsymbols[t]; /* check for intersect with textpath */ if (ts->textpath && testSegmentLabelBBoxIntersection( &leaderbbox, lp1, lp2, &ts->textpath->bounds) == MS_FALSE) { return MS_FALSE; } /* check for intersect with label's labelpnt styles */ if (ts->style_bounds) { for (s = 0; s < ts->label->numstyles; s++) { if (ts->label->styles[s]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { if (testSegmentLabelBBoxIntersection( &leaderbbox, lp1, lp2, ts->style_bounds[s]) == MS_FALSE) { return MS_FALSE; } } } } } if (curCachePtr->leaderbbox) { if (msIntersectSegments(lp1, lp2, &(curCachePtr->leaderline->point[0]), &(curCachePtr->leaderline->point[1])) == MS_TRUE) { return MS_FALSE; } } } } return MS_TRUE; } /* msTestLabelCacheCollisions() ** ** Compares label bounds (in *bounds) against labels already drawn and markers from cache and ** returns MS_FALSE if it collides with another label, or collides with a marker. ** ** This function is used by the various msDrawLabelCacheXX() implementations. int msTestLabelCacheCollisions(mapObj *map, labelCacheMemberObj *cachePtr, label_bounds *bounds, int current_priority, int current_label); */ int msTestLabelCacheCollisions(mapObj *map, labelCacheMemberObj *cachePtr, label_bounds *lb, int current_priority, int current_label) { labelCacheObj *labelcache = &(map->labelcache); int i, p, ll; /* * Check against image bounds first */ if (!cachePtr->textsymbols[0]->label->partials) { if (labelInImage(map->width, map->height, lb->poly, &lb->bbox, labelcache->gutter) == MS_FALSE) { return MS_FALSE; } } /* Compare against all rendered markers from this priority level and higher. ** Labels can overlap their own marker and markers from lower priority levels */ for (p = current_priority; p < MS_MAX_LABEL_PRIORITY; p++) { labelCacheSlotObj *markerslot; markerslot = &(labelcache->slots[p]); for (ll = 0; ll < markerslot->nummarkers; ll++) { if (!(p == current_priority && current_label == markerslot->markers[ll] .id)) { /* labels can overlap their own marker */ if (intersectLabelPolygons(NULL, &markerslot->markers[ll].bounds, lb->poly, &lb->bbox) == MS_TRUE) { return MS_FALSE; } } } } for (p = 0; p < labelcache->num_rendered_members; p++) { labelCacheMemberObj *curCachePtr = labelcache->rendered_text_symbols[p]; if (msRectOverlap(&curCachePtr->bbox, &lb->bbox)) { for (i = 0; i < curCachePtr->numtextsymbols; i++) { int j; textSymbolObj *ts = curCachePtr->textsymbols[i]; if (ts->textpath && intersectLabelPolygons(ts->textpath->bounds.poly, &ts->textpath->bounds.bbox, lb->poly, &lb->bbox) == MS_TRUE) { return MS_FALSE; } if (ts->style_bounds) { for (j = 0; j < ts->label->numstyles; j++) { if (ts->style_bounds[j] && ts->label->styles[j]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { if (intersectLabelPolygons(ts->style_bounds[j]->poly, &ts->style_bounds[j]->bbox, lb->poly, &lb->bbox)) { return MS_FALSE; } } } } } } if (curCachePtr->leaderline) { if (testSegmentLabelBBoxIntersection( curCachePtr->leaderbbox, &curCachePtr->leaderline->point[0], &curCachePtr->leaderline->point[1], lb) == MS_FALSE) { return MS_FALSE; } } } return MS_TRUE; } /* utility function to get the rect of a string outside of a rendering loop, i.e. without going through textpath layouts */ int msGetStringSize(mapObj *map, labelObj *label, int size, char *string, rectObj *r) { textSymbolObj ts; double lsize = label->size; initTextSymbol(&ts); label->size = size; msPopulateTextSymbolForLabelAndString(&ts, label, msStrdup(string), 1, 1, 0); if (MS_UNLIKELY(MS_FAILURE == msGetTextSymbolSize(map, &ts, r))) return MS_FAILURE; label->size = lsize; freeTextSymbol(&ts); return MS_SUCCESS; } int msInitFontSet(fontSetObj *fontset) { fontset->filename = NULL; /* fontset->fonts = NULL; */ initHashTable(&(fontset->fonts)); fontset->numfonts = 0; fontset->map = NULL; return (0); } int msFreeFontSet(fontSetObj *fontset) { if (fontset->filename) free(fontset->filename); fontset->filename = NULL; msFreeHashItems(&(fontset->fonts)); /* fontset->fonts = NULL; */ fontset->numfonts = 0; return (0); } int msLoadFontSet(fontSetObj *fontset, mapObj *map) { VSILFILE *stream; const char *line; char *path; char szPath[MS_MAXPATHLEN]; int i; int bFullPath = 0; const char *realpath; if (fontset->numfonts != 0) /* already initialized */ return (0); if (!fontset->filename) return (0); fontset->map = (mapObj *)map; path = msGetPath(fontset->filename); /* fontset->fonts = msCreateHashTable(); // create font hash */ /* if(!fontset->fonts) { */ /* msSetError(MS_HASHERR, "Error initializing font hash.", "msLoadFontSet()"); */ /* return(-1); */ /* } */ realpath = msBuildPath(szPath, fontset->map->mappath, fontset->filename); if (!realpath) { free(path); return -1; } stream = VSIFOpenL(realpath, "rb"); if (!stream) { msSetError(MS_IOERR, "Error opening fontset %s.", "msLoadFontset()", fontset->filename); free(path); return (-1); } i = 0; while ((line = CPLReadLineL(stream)) != NULL) { /* while there's something to load */ if (line[0] == '#' || line[0] == '\n' || line[0] == '\r' || line[0] == ' ') continue; /* skip comments and blank lines */ char alias[64]; snprintf(alias, sizeof(alias), "%s", line); char *ptr = strpbrk(alias, " \t"); if (!ptr) continue; *ptr = '\0'; const char *file1StartPtr = line + (ptr - alias); file1StartPtr++; /* Skip leading spaces */ while (isspace((int)*file1StartPtr)) file1StartPtr++; if (!(*file1StartPtr) || !(*alias)) continue; char file1[MS_PATH_LENGTH]; snprintf(file1, sizeof(file1), "%s", file1StartPtr); /* Remove trailing spaces */ ptr = file1 + strlen(file1) - 1; while (ptr >= file1 && isspace((int)*ptr)) { *ptr = '\0'; --ptr; } bFullPath = 0; #if defined(_WIN32) && !defined(__CYGWIN__) if (file1[0] == '\\' || (strlen(file1) > 1 && (file1[1] == ':'))) bFullPath = 1; #else if (file1[0] == '/') bFullPath = 1; #endif if (bFullPath) { /* already full path */ msInsertHashTable(&(fontset->fonts), alias, file1); } else { char file2[MS_PATH_LENGTH]; snprintf(file2, sizeof(file2), "%s%s", path, file1); /* msInsertHashTable(fontset->fonts, alias, file2); */ /* ** msBuildPath is use here, but if we have to save the fontset file ** the msBuildPath must be done everywhere the fonts are used and ** removed here. */ msInsertHashTable(&(fontset->fonts), alias, msBuildPath(szPath, fontset->map->mappath, file2)); } i++; } fontset->numfonts = i; VSIFCloseL(stream); /* close the file */ free(path); return (0); } int msGetTextSymbolSize(mapObj *map, textSymbolObj *ts, rectObj *r) { if (!ts->textpath) { if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, ts))) return MS_FAILURE; } if (!ts->textpath) return MS_FAILURE; *r = ts->textpath->bounds.bbox; return MS_SUCCESS; } /* ** Note: All these routines assume a reference point at the LL corner of the *text. GD's ** bitmapped fonts use UL and this is compensated for. Note the rect is relative *to the ** LL corner of the text to be rendered, this is first line for TrueType fonts. */ #define MARKER_SLOP 2 pointObj get_metrics(pointObj *p, int position, textPathObj *tp, int ox, int oy, double rotation, int buffer, label_bounds *bounds) { pointObj q = {0}; // initialize double x1 = 0, y1 = 0, x2 = 0, y2 = 0; double sin_a, cos_a; double w, h, x, y; w = tp->bounds.bbox.maxx - tp->bounds.bbox.minx; h = tp->bounds.bbox.maxy - tp->bounds.bbox.miny; switch (position) { case MS_UL: x1 = -w - ox; y1 = -oy; break; case MS_UC: x1 = -(w / 2.0); y1 = -oy - MARKER_SLOP; break; case MS_UR: x1 = ox; y1 = -oy; break; case MS_CL: x1 = -w - ox - MARKER_SLOP; if (oy > 0 && tp->numlines == 1) y1 = oy; else y1 = (h / 2.0); break; case MS_CC: x1 = -(w / 2.0) + ox; y1 = (h / 2.0) + oy; break; case MS_CR: x1 = ox + MARKER_SLOP; if (oy > 0 && tp->numlines == 1) y1 = oy; else y1 = (h / 2.0); break; case MS_LL: x1 = -w - ox; y1 = h + oy; break; case MS_LC: x1 = -(w / 2.0); y1 = h + oy + MARKER_SLOP; break; case MS_LR: x1 = ox; y1 = h + oy; break; } if (rotation) { sin_a = sin(rotation); cos_a = cos(rotation); x = x1 - tp->bounds.bbox.minx; y = tp->bounds.bbox.maxy - y1; q.x = p->x + (x * cos_a - (y)*sin_a); q.y = p->y - (x * sin_a + (y)*cos_a); if (bounds) { x2 = x1 - buffer; /* ll */ y2 = y1 + buffer; bounds->poly->point[0].x = p->x + (x2 * cos_a - (-y2) * sin_a); bounds->poly->point[0].y = p->y - (x2 * sin_a + (-y2) * cos_a); x2 = x1 - buffer; /* ul */ y2 = y1 - h - buffer; bounds->poly->point[1].x = p->x + (x2 * cos_a - (-y2) * sin_a); bounds->poly->point[1].y = p->y - (x2 * sin_a + (-y2) * cos_a); x2 = x1 + w + buffer; /* ur */ y2 = y1 - h - buffer; bounds->poly->point[2].x = p->x + (x2 * cos_a - (-y2) * sin_a); bounds->poly->point[2].y = p->y - (x2 * sin_a + (-y2) * cos_a); x2 = x1 + w + buffer; /* lr */ y2 = y1 + buffer; bounds->poly->point[3].x = p->x + (x2 * cos_a - (-y2) * sin_a); bounds->poly->point[3].y = p->y - (x2 * sin_a + (-y2) * cos_a); bounds->poly->point[4].x = bounds->poly->point[0].x; bounds->poly->point[4].y = bounds->poly->point[0].y; fastComputeBounds(bounds->poly, &bounds->bbox); } } else { q.x = p->x + x1 - tp->bounds.bbox.minx; q.y = p->y + y1 - tp->bounds.bbox.maxy; if (bounds) { /* no rotation, we only need to return a bbox */ bounds->poly = NULL; bounds->bbox.minx = q.x - buffer; bounds->bbox.maxy = q.y + buffer + tp->bounds.bbox.maxy; bounds->bbox.maxx = q.x + w + buffer; bounds->bbox.miny = bounds->bbox.maxy - h - buffer * 2; } } return (q); } int intersectTextSymbol(textSymbolObj *ts, label_bounds *lb) { if (ts->textpath && ts->textpath->absolute) { if (intersectLabelPolygons(lb->poly, &lb->bbox, ts->textpath->bounds.poly, &ts->textpath->bounds.bbox)) return MS_TRUE; } if (ts->style_bounds) { int s; for (s = 0; s < ts->label->numstyles; s++) { if (ts->style_bounds[s] && ts->label->styles[s]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT && intersectLabelPolygons(lb->poly, &lb->bbox, ts->style_bounds[s]->poly, &ts->style_bounds[s]->bbox)) return MS_TRUE; } } return MS_FALSE; } /* ** Variation on msIntersectPolygons. Label polygons aren't like shapefile *polygons. They ** have no holes, and often do have overlapping parts (i.e. road symbols). */ int intersectLabelPolygons(lineObj *l1, rectObj *r1, lineObj *l2, rectObj *r2) { int v1, v2; pointObj *point; lineObj *p1, *p2, sp1, sp2; pointObj pnts1[5], pnts2[5]; /* STEP 0: check bounding boxes */ if (!msRectOverlap(r1, r2)) { /* from alans@wunderground.com */ return (MS_FALSE); } if (!l1 && !l2) return MS_TRUE; if (!l1) { p1 = &sp1; p1->numpoints = 5; p1->point = pnts1; pnts1[0].x = pnts1[1].x = pnts1[4].x = r1->minx; pnts1[2].x = pnts1[3].x = r1->maxx; pnts1[0].y = pnts1[3].y = pnts1[4].y = r1->miny; pnts1[1].y = pnts1[2].y = r1->maxy; } else { p1 = l1; } if (!l2) { p2 = &sp2; p2->numpoints = 5; p2->point = pnts2; pnts2[0].x = pnts2[1].x = pnts2[4].x = r2->minx; pnts2[2].x = pnts2[3].x = r2->maxx; pnts2[0].y = pnts2[3].y = pnts2[4].y = r2->miny; pnts2[1].y = pnts2[2].y = r2->maxy; } else { p2 = l2; } (void)pnts1[0].x; (void)pnts1[0].y; (void)pnts1[1].x; (void)pnts1[1].y; (void)pnts1[2].x; (void)pnts1[2].y; (void)pnts1[3].x; (void)pnts1[3].y; (void)pnts1[4].x; (void)pnts1[4].y; (void)pnts2[0].x; (void)pnts2[0].y; (void)pnts2[1].x; (void)pnts2[1].y; (void)pnts2[2].x; (void)pnts2[2].y; (void)pnts2[3].x; (void)pnts2[3].y; (void)pnts2[4].x; (void)pnts2[4].y; /* STEP 1: look for intersecting line segments */ for (v1 = 1; v1 < p1->numpoints; v1++) for (v2 = 1; v2 < p2->numpoints; v2++) if (msIntersectSegments(&(p1->point[v1 - 1]), &(p1->point[v1]), &(p2->point[v2 - 1]), &(p2->point[v2])) == MS_TRUE) { return (MS_TRUE); } /* STEP 2: polygon one completely contains two (only need to check one point * from each part) */ point = &(p2->point[0]); if (msPointInPolygon(point, p1) == MS_TRUE) /* ok, the point is in a polygon */ return (MS_TRUE); /* STEP 3: polygon two completely contains one (only need to check one point * from each part) */ point = &(p1->point[0]); if (msPointInPolygon(point, p2) == MS_TRUE) /* ok, the point is in a polygon */ return (MS_TRUE); return (MS_FALSE); } /* For MapScript, exactly the same the msInsertStyle */ int msInsertLabelStyle(labelObj *label, styleObj *style, int nStyleIndex) { if (!style) { msSetError(MS_CHILDERR, "Can't insert a NULL Style", "msInsertLabelStyle()"); return -1; } /* Ensure there is room for a new style */ if (msGrowLabelStyles(label) == NULL) { return -1; } /* Catch attempt to insert past end of styles array */ else if (nStyleIndex >= label->numstyles) { msSetError(MS_CHILDERR, "Cannot insert style beyond index %d", "insertLabelStyle()", label->numstyles - 1); return -1; } else if (nStyleIndex < 0) { /* Insert at the end by default */ label->styles[label->numstyles] = style; MS_REFCNT_INCR(style); label->numstyles++; return label->numstyles - 1; } else { /* Move styles existing at the specified nStyleIndex or greater */ /* to a higher nStyleIndex */ for (int i = label->numstyles - 1; i >= nStyleIndex; i--) { label->styles[i + 1] = label->styles[i]; } label->styles[nStyleIndex] = style; MS_REFCNT_INCR(style); label->numstyles++; return nStyleIndex; } } /** * Move the style up inside the array of styles. */ int msMoveLabelStyleUp(labelObj *label, int nStyleIndex) { if (label && nStyleIndex < label->numstyles && nStyleIndex > 0) { styleObj *psTmpStyle = (styleObj *)malloc(sizeof(styleObj)); initStyle(psTmpStyle); msCopyStyle(psTmpStyle, label->styles[nStyleIndex]); msCopyStyle(label->styles[nStyleIndex], label->styles[nStyleIndex - 1]); msCopyStyle(label->styles[nStyleIndex - 1], psTmpStyle); return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveLabelStyleUp()", nStyleIndex); return (MS_FAILURE); } /** * Move the style down inside the array of styles. */ int msMoveLabelStyleDown(labelObj *label, int nStyleIndex) { styleObj *psTmpStyle = NULL; if (label && nStyleIndex < label->numstyles - 1 && nStyleIndex >= 0) { psTmpStyle = (styleObj *)malloc(sizeof(styleObj)); initStyle(psTmpStyle); msCopyStyle(psTmpStyle, label->styles[nStyleIndex]); msCopyStyle(label->styles[nStyleIndex], label->styles[nStyleIndex + 1]); msCopyStyle(label->styles[nStyleIndex + 1], psTmpStyle); return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveLabelStyleDown()", nStyleIndex); return (MS_FAILURE); } /** * Delete the style identified by the index and shift * styles that follows the deleted style. */ int msDeleteLabelStyle(labelObj *label, int nStyleIndex) { if (label && nStyleIndex < label->numstyles && nStyleIndex >= 0) { if (freeStyle(label->styles[nStyleIndex]) == MS_SUCCESS) msFree(label->styles[nStyleIndex]); for (int i = nStyleIndex; i < label->numstyles - 1; i++) { label->styles[i] = label->styles[i + 1]; } label->styles[label->numstyles - 1] = NULL; label->numstyles--; return (MS_SUCCESS); } msSetError(MS_CHILDERR, "Invalid index: %d", "msDeleteLabelStyle()", nStyleIndex); return (MS_FAILURE); } styleObj *msRemoveLabelStyle(labelObj *label, int nStyleIndex) { int i; styleObj *style; if (nStyleIndex < 0 || nStyleIndex >= label->numstyles) { msSetError(MS_CHILDERR, "Cannot remove style, invalid nStyleIndex %d", "removeLabelStyle()", nStyleIndex); return NULL; } else { style = label->styles[nStyleIndex]; for (i = nStyleIndex; i < label->numstyles - 1; i++) { label->styles[i] = label->styles[i + 1]; } label->styles[label->numstyles - 1] = NULL; label->numstyles--; MS_REFCNT_DECR(style); return style; } } mapserver-8.6.0/src/maplayer.c000066400000000000000000002455571511405061000163110ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Implementation of most layerObj functions. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "maptime.h" #include "mapogcfilter.h" #include "mapthread.h" #include "mapfile.h" #include "mapows.h" #include "mapparser.h" #include "mapogcsld.h" #include "cpl_string.h" #include #ifndef cppcheck_assert #define cppcheck_assert(x) \ do { \ } while (0) #endif static int populateVirtualTable(layerVTableObj *vtable); /* ** Iteminfo is a layer parameter that holds information necessary to retrieve an *individual item for ** a particular source. It is an array built from a list of items. The type of *iteminfo will vary by ** source. For shapefiles and OGR it is simply an array of integers where each *value is an index for ** the item. For SDE it's a ESRI specific type that contains index and column *type information. Two ** helper functions below initialize and free that structure member which is *used locally by layer ** specific functions. */ int msLayerInitItemInfo(layerObj *layer) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerInitItemInfo(layer); } void msLayerFreeItemInfo(layerObj *layer) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return; } cppcheck_assert(layer->vtable); layer->vtable->LayerFreeItemInfo(layer); /* * Layer expressions with attribute binding hold a numeric index pointing * to an iteminfo (node->tokenval.bindval.index). If iteminfo changes, * an expression may be no longer valid. (#5161) */ msLayerFreeExpressions(layer); } int msLayerRestoreFromScaletokens(layerObj *layer) { if (!layer->scaletokens || !layer->orig_st) { return MS_SUCCESS; } if (layer->orig_st->data) { msFree(layer->data); layer->data = layer->orig_st->data; } if (layer->orig_st->tileindex) { msFree(layer->tileindex); layer->tileindex = layer->orig_st->tileindex; } if (layer->orig_st->tileitem) { msFree(layer->tileitem); layer->tileitem = layer->orig_st->tileitem; } if (layer->orig_st->filter) { if (layer->filter.type == MS_EXPRESSION) { const size_t tmpval_size = strlen(layer->filter.string) + 3; char *tmpval = (char *)msSmallMalloc(tmpval_size); snprintf(tmpval, tmpval_size, "(%s)", layer->filter.string); msLoadExpressionString(&(layer->filter), tmpval); msFree(tmpval); } else { msLoadExpressionString(&(layer->filter), layer->orig_st->filter); } msFree(layer->orig_st->filter); } if (layer->orig_st->filteritem) { msFree(layer->filteritem); layer->filteritem = layer->orig_st->filteritem; } if (layer->orig_st->processing) { CSLDestroy(layer->processing); layer->processing = layer->orig_st->processing; layer->orig_st->processing = NULL; } msFree(layer->orig_st); layer->orig_st = NULL; return MS_SUCCESS; } #define check_st_alloc(l) \ if (!l->orig_st) \ l->orig_st = msSmallCalloc(1, sizeof(originalScaleTokenStrings)); int msLayerApplyScaletokens(layerObj *layer, double scale) { int i, p; if (!layer->scaletokens) { return MS_SUCCESS; } msLayerRestoreFromScaletokens(layer); for (i = 0; i < layer->numscaletokens; i++) { scaleTokenObj *st = &layer->scaletokens[i]; scaleTokenEntryObj *ste = NULL; if (scale <= 0) { ste = &(st->tokens[0]); /* no scale defined, use first entry */ } else { int tokenindex = 0; while (tokenindex < st->n_entries) { ste = &(st->tokens[tokenindex]); if (scale < ste->maxscale && scale >= ste->minscale) break; /* current token is the correct one */ tokenindex++; ste = NULL; } } assert(ste); if (layer->data && strstr(layer->data, st->name)) { if (layer->debug >= MS_DEBUGLEVEL_DEBUG) { msDebug("replacing scaletoken (%s) with (%s) in layer->data (%s) for " "scale=%f\n", st->name, ste->value, layer->name, scale); } check_st_alloc(layer); layer->orig_st->data = layer->data; layer->data = msStrdup(layer->data); layer->data = msReplaceSubstring(layer->data, st->name, ste->value); } if (layer->tileindex && strstr(layer->tileindex, st->name)) { if (layer->debug >= MS_DEBUGLEVEL_DEBUG) { msDebug("replacing scaletoken (%s) with (%s) in layer->tileindex (%s) " "for scale=%f\n", st->name, ste->value, layer->name, scale); } check_st_alloc(layer); layer->orig_st->tileindex = layer->tileindex; layer->tileindex = msStrdup(layer->tileindex); layer->tileindex = msReplaceSubstring(layer->tileindex, st->name, ste->value); } if (layer->tileitem && strstr(layer->tileitem, st->name)) { if (layer->debug >= MS_DEBUGLEVEL_DEBUG) { msDebug("replacing scaletoken (%s) with (%s) in layer->tileitem (%s) " "for scale=%f\n", st->name, ste->value, layer->name, scale); } check_st_alloc(layer); layer->orig_st->tileitem = layer->tileitem; layer->tileitem = msStrdup(layer->tileitem); layer->tileitem = msReplaceSubstring(layer->tileitem, st->name, ste->value); } if (layer->filteritem && strstr(layer->filteritem, st->name)) { if (layer->debug >= MS_DEBUGLEVEL_DEBUG) { msDebug("replacing scaletoken (%s) with (%s) in layer->filteritem (%s) " "for scale=%f\n", st->name, ste->value, layer->name, scale); } check_st_alloc(layer); layer->orig_st->filteritem = layer->filteritem; layer->filteritem = msStrdup(layer->filteritem); layer->filteritem = msReplaceSubstring(layer->filteritem, st->name, ste->value); } if (layer->filter.string && strstr(layer->filter.string, st->name)) { if (layer->debug >= MS_DEBUGLEVEL_DEBUG) { msDebug("replacing scaletoken (%s) with (%s) in layer->filter (%s) for " "scale=%f\n", st->name, ste->value, layer->name, scale); } check_st_alloc(layer); layer->orig_st->filter = msStrdup(layer->filter.string); char *tmpval = NULL; if (layer->filter.type == MS_EXPRESSION) { const size_t tmpval_size = strlen(layer->filter.string) + 3; tmpval = (char *)msSmallMalloc(tmpval_size); snprintf(tmpval, tmpval_size, "(%s)", layer->filter.string); } else { tmpval = msStrdup(layer->filter.string); } tmpval = msReplaceSubstring(tmpval, st->name, ste->value); if (msLoadExpressionString(&(layer->filter), tmpval) == -1) { msFree(tmpval); return (MS_FAILURE); /* msLoadExpressionString() cleans up previously allocated expression */ } msFree(tmpval); } for (p = 0; layer->processing && layer->processing[p]; p++) { if (strstr(layer->processing[p], st->name)) { check_st_alloc(layer); if (!layer->orig_st->processing) { layer->orig_st->processing = CSLDuplicate(layer->processing); } char *newVal = msStrdup(layer->processing[p]); newVal = msReplaceSubstring(newVal, st->name, ste->value); CPLFree(layer->processing[p]); layer->processing[p] = CPLStrdup(newVal); msFree(newVal); } } } return MS_SUCCESS; } /* ** Does exactly what it implies, readies a layer for processing. */ int msLayerOpen(layerObj *layer) { int rv; /* RFC-86 Scale dependent token replacements*/ rv = msLayerApplyScaletokens(layer, (layer->map) ? layer->map->scaledenom : -1); if (rv != MS_SUCCESS) return rv; /* RFC-69 clustering support */ if (layer->cluster.region) return msClusterLayerOpen(layer); if (layer->features && layer->connectiontype != MS_GRATICULE) layer->connectiontype = MS_INLINE; if (layer->tileindex && layer->connectiontype == MS_SHAPEFILE) layer->connectiontype = MS_TILED_SHAPEFILE; if (layer->type == MS_LAYER_RASTER && layer->connectiontype != MS_WMS && layer->connectiontype != MS_KERNELDENSITY) layer->connectiontype = MS_RASTER; if (!layer->vtable) { rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerOpen(layer); } /* ** Returns MS_TRUE if layer has been opened using msLayerOpen(), MS_FALSE *otherwise */ int msLayerIsOpen(layerObj *layer) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerIsOpen(layer); } /* ** msLayerPropertyIsCharacter() ** ** Check if a field in a layer is a Character type */ bool msLayerPropertyIsCharacter(layerObj *layer, const char *property) { if (!property) { return false; } char md_item_name[256]; snprintf(md_item_name, sizeof(md_item_name), "gml_%s_type", property); const char *type = msLookupHashTable(&(layer->metadata), md_item_name); return (type != NULL && (EQUAL(type, "Character"))); } /* ** msLayerPropertyIsNumeric() ** ** Check if a field in a layer is numeric - an Integer, Long, or Real */ bool msLayerPropertyIsNumeric(layerObj *layer, const char *property) { if (!property) { return false; } char md_item_name[256]; snprintf(md_item_name, sizeof(md_item_name), "gml_%s_type", property); const char *type = msLookupHashTable(&(layer->metadata), md_item_name); return (type != NULL && (EQUAL(type, "Integer") || EQUAL(type, "Long") || EQUAL(type, "Real"))); } /* ** Returns MS_TRUE is a layer supports the common expression/filter syntax (RFC *64) and MS_FALSE otherwise. */ int msLayerSupportsCommonFilters(layerObj *layer) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerSupportsCommonFilters(layer); } int msLayerTranslateFilter(layerObj *layer, expressionObj *filter, char *filteritem) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerTranslateFilter(layer, filter, filteritem); } /* ** Performs a spatial, and optionally an attribute based feature search. The *function basically ** prepares things so that candidate features can be accessed by query or *drawing functions. For ** OGR and shapefiles this sets an internal bit vector that indicates whether a *particular feature ** is to processed. For SDE it executes an SQL statement on the SDE server. Once *run the msLayerNextShape ** function should be called to actually access the shapes. ** ** Note that for shapefiles we apply any maxfeatures constraint at this point. *That may be the only ** connection type where this is feasible. */ int msLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { if (!msLayerSupportsCommonFilters(layer)) msLayerTranslateFilter(layer, &layer->filter, layer->filteritem); if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerWhichShapes(layer, rect, isQuery); } /* ** Called after msWhichShapes has been called to actually retrieve shapes within *a given area ** and matching a vendor specific filter (i.e. layer FILTER attribute). ** ** Shapefiles: NULL shapes (shapes with attributes but NO vertices are skipped) */ int msLayerNextShape(layerObj *layer, shapeObj *shape) { int rv, filter_passed; if (!layer->vtable) { rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); #ifdef USE_V8_MAPSCRIPT /* we need to force the GetItems for the geomtransform attributes */ if (!layer->items && layer->_geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION && strstr(layer->_geomtransform.string, "javascript")) msLayerGetItems(layer); #endif /* At the end of switch case (default -> break; -> return MS_FAILURE), * was following TODO ITEM: * * TO DO! This is where dynamic joins will happen. Joined attributes will be * tagged on to the main attributes with the naming scheme [join name].[item * name]. We need to leverage the iteminfo (I think) at this point */ /* RFC 91: MapServer-based filtering is done at a more general level. */ do { rv = layer->vtable->LayerNextShape(layer, shape); if (rv != MS_SUCCESS) return rv; /* attributes need to be iconv'd to UTF-8 before any filter logic is applied */ if (layer->encoding) { rv = msLayerEncodeShapeAttributes(layer, shape); if (rv != MS_SUCCESS) return rv; } filter_passed = msEvalExpression(layer, shape, &(layer->filter), layer->filteritemindex); if (!filter_passed) msFreeShape(shape); } while (!filter_passed); /* RFC89 Apply Layer GeomTransform */ if (layer->_geomtransform.type != MS_GEOMTRANSFORM_NONE && rv == MS_SUCCESS) { rv = msGeomTransformShape(layer->map, layer, shape); if (rv != MS_SUCCESS) return rv; } return rv; } /* ** Used to retrieve a shape from a result set by index. Result sets are created *by the various ** msQueryBy...() functions. The index is assigned by the data source. */ /* int msLayerResultsGetShape(layerObj *layer, shapeObj *shape, int tile, long record) { if ( ! layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } return layer->vtable->LayerResultsGetShape(layer, shape, tile, record); } */ /* ** Used to retrieve a shape by index. All data sources must be capable of random *access using ** a record number(s) of some sort. */ int msLayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { int rv; if (!layer->vtable) { rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); /* ** TODO: This is where dynamic joins could happen. Joined attributes would be ** tagged on to the main attributes with the naming scheme [join name].[item *name]. */ rv = layer->vtable->LayerGetShape(layer, shape, record); if (rv != MS_SUCCESS) return rv; /* RFC89 Apply Layer GeomTransform */ if (layer->_geomtransform.type != MS_GEOMTRANSFORM_NONE) { rv = msGeomTransformShape(layer->map, layer, shape); if (rv != MS_SUCCESS) return rv; } if (layer->encoding) { rv = msLayerEncodeShapeAttributes(layer, shape); if (rv != MS_SUCCESS) return rv; } return rv; } /* ** Returns the number of shapes that match the potential filter and extent. * rectProjection is the projection in which rect is expressed, or can be NULL if * rect should be considered in the layer projection. * This should be equivalent to calling msLayerWhichShapes() and counting the * number of shapes returned by msLayerNextShape(), honouring layer->maxfeatures * limitation if layer->maxfeatures>=0, and honouring layer->startindex if * layer->startindex >= 1 and paging is enabled. * Returns -1 in case of failure. */ int msLayerGetShapeCount(layerObj *layer, rectObj rect, projectionObj *rectProjection) { int rv; if (!layer->vtable) { rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return -1; } cppcheck_assert(layer->vtable); return layer->vtable->LayerGetShapeCount(layer, rect, rectProjection); } /* ** Closes resources used by a particular layer. */ void msLayerClose(layerObj *layer) { /* no need for items once the layer is closed */ msLayerFreeItemInfo(layer); if (layer->items) { msFreeCharArray(layer->items, layer->numitems); layer->items = NULL; layer->numitems = 0; } /* clear out items used as part of expressions (bug #2702) -- what about the * layer filter? */ msLayerFreeExpressions(layer); if (layer->vtable) { layer->vtable->LayerClose(layer); } msLayerRestoreFromScaletokens(layer); } /* ** Clear out items used as part of expressions. */ void msLayerFreeExpressions(layerObj *layer) { int i, j, k; msFreeExpressionTokens(&(layer->filter)); msFreeExpressionTokens(&(layer->cluster.group)); msFreeExpressionTokens(&(layer->cluster.filter)); for (i = 0; i < layer->numclasses; i++) { msFreeExpressionTokens(&(layer->class[i] -> expression)); msFreeExpressionTokens(&(layer->class[i] -> text)); for (j = 0; j < layer->class[i] -> numstyles; j++) msFreeExpressionTokens(&(layer->class[i] -> styles[j] -> _geomtransform)); for (k = 0; k < layer->class[i] -> numlabels; k++) { msFreeExpressionTokens(&(layer->class[i] -> labels[k] -> expression)); msFreeExpressionTokens(&(layer->class[i] -> labels[k] -> text)); } } } /* ** Retrieves a list of attributes available for this layer. Most sources also *set the iteminfo array ** at this point. This function is used when processing query results to expose *attributes to query ** templates. At that point all attributes are fair game. */ int msLayerGetItems(layerObj *layer) { const char *itemNames; /* clean up any previously allocated instances */ msLayerFreeItemInfo(layer); if (layer->items) { msFreeCharArray(layer->items, layer->numitems); layer->items = NULL; layer->numitems = 0; } if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); /* At the end of switch case (default -> break; -> return MS_FAILURE), * was following TODO ITEM: */ /* TO DO! Need to add any joined itemd on to the core layer items, one long * list! */ itemNames = msLayerGetProcessingKey(layer, "ITEMS"); if (itemNames) { layer->items = msStringSplit(itemNames, ',', &layer->numitems); /* populate the iteminfo array */ return (msLayerInitItemInfo(layer)); } else return layer->vtable->LayerGetItems(layer); } /* ** Returns extent of spatial coverage for a layer. ** ** If layer->extent is set then this value is used, otherwise the ** driver-specific implementation is called (this can be expensive). ** ** If layer is not already opened then it is opened and closed (so this ** function can be called on both opened or closed layers). ** ** Returns MS_SUCCESS/MS_FAILURE. */ int msLayerGetExtent(layerObj *layer, rectObj *extent) { int need_to_close = MS_FALSE, status = MS_SUCCESS; if (MS_VALID_EXTENT(layer->extent)) { *extent = layer->extent; return MS_SUCCESS; } if (!msLayerIsOpen(layer)) { if (msLayerOpen(layer) != MS_SUCCESS) return MS_FAILURE; need_to_close = MS_TRUE; } if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) { if (need_to_close) msLayerClose(layer); return rv; } } cppcheck_assert(layer->vtable); status = layer->vtable->LayerGetExtent(layer, extent); if (status == MS_SUCCESS) { layer->extent = *extent; } if (need_to_close) msLayerClose(layer); return (status); } int msLayerGetItemIndex(layerObj *layer, char *item) { int i; for (i = 0; i < layer->numitems; i++) { if (strcasecmp(layer->items[i], item) == 0) return (i); } return -1; /* item not found */ } static int string2list(char **list, int *listsize, char *string) { int i; for (i = 0; i < (*listsize); i++) { if (strcasecmp(list[i], string) == 0) { /* printf("string2list (duplicate): %s %d\n", string, i); */ return (i); } } list[i] = msStrdup(string); (*listsize)++; /* printf("string2list: %s %d\n", string, i); */ return (i); } extern int msyylex(void); extern int msyylex_destroy(void); extern int msyystate; extern char *msyystring; /* string to tokenize */ extern double msyynumber; /* token containers */ extern char *msyystring_buffer; const char *msExpressionTokenToString(int token) { switch (token) { case '(': return "("; case ')': return ")"; case ',': return ","; case '+': return "+"; case '-': return "-"; case '/': return "/"; case '*': return "*"; case '%': return "%"; case MS_TOKEN_LOGICAL_AND: return " and "; case MS_TOKEN_LOGICAL_OR: return " or "; case MS_TOKEN_LOGICAL_NOT: return " not "; case MS_TOKEN_COMPARISON_EQ: return " = "; case MS_TOKEN_COMPARISON_NE: return " != "; case MS_TOKEN_COMPARISON_GT: return " > "; case MS_TOKEN_COMPARISON_GE: return " >= "; case MS_TOKEN_COMPARISON_LT: return " < "; case MS_TOKEN_COMPARISON_LE: return " <= "; case MS_TOKEN_COMPARISON_IEQ: return ""; case MS_TOKEN_COMPARISON_RE: return " ~ "; case MS_TOKEN_COMPARISON_IRE: return " ~* "; case MS_TOKEN_COMPARISON_IN: return " in "; case MS_TOKEN_COMPARISON_INTERSECTS: return "intersects"; case MS_TOKEN_COMPARISON_DISJOINT: return "disjoint"; case MS_TOKEN_COMPARISON_TOUCHES: return "touches"; case MS_TOKEN_COMPARISON_OVERLAPS: return "overlaps"; case MS_TOKEN_COMPARISON_CROSSES: return "crosses"; case MS_TOKEN_COMPARISON_WITHIN: return "within"; case MS_TOKEN_COMPARISON_CONTAINS: return "contains"; case MS_TOKEN_COMPARISON_EQUALS: return "equals"; case MS_TOKEN_COMPARISON_BEYOND: return "beyond"; case MS_TOKEN_COMPARISON_DWITHIN: return "dwithin"; case MS_TOKEN_FUNCTION_LENGTH: return "length"; case MS_TOKEN_FUNCTION_TOSTRING: return "tostring"; case MS_TOKEN_FUNCTION_COMMIFY: return "commify"; case MS_TOKEN_FUNCTION_AREA: return "area"; case MS_TOKEN_FUNCTION_ROUND: return "round"; case MS_TOKEN_FUNCTION_BUFFER: return "buffer"; case MS_TOKEN_FUNCTION_DIFFERENCE: return "difference"; case MS_TOKEN_FUNCTION_SIMPLIFY: return "simplify"; // case MS_TOKEN_FUNCTION_SIMPLIFYPT: case MS_TOKEN_FUNCTION_GENERALIZE: return "generalize"; default: return NULL; } } int msTokenizeExpression(expressionObj *expression, char **list, int *listsize) { tokenListNodeObjPtr node; int token; /* TODO: make sure the constants can't somehow reference invalid expression * types */ /* if(expression->type != MS_EXPRESSION && expression->type != * MS_GEOMTRANSFORM_EXPRESSION) return MS_SUCCESS; */ msAcquireLock(TLOCK_PARSER); msyystate = MS_TOKENIZE_EXPRESSION; msyystring = expression->string; /* the thing we're tokenizing */ while ((token = msyylex()) != 0) { /* keep processing tokens until the end of the string (\0) */ if ((node = (tokenListNodeObjPtr)malloc(sizeof(tokenListNodeObj))) == NULL) { msSetError(MS_MEMERR, NULL, "msTokenizeExpression()"); goto parse_error; } node->tokensrc = NULL; node->tailifhead = NULL; node->next = NULL; switch (token) { case MS_TOKEN_LITERAL_BOOLEAN: case MS_TOKEN_LITERAL_NUMBER: node->token = token; node->tokenval.dblval = msyynumber; break; case MS_TOKEN_LITERAL_STRING: node->token = token; node->tokenval.strval = msStrdup(msyystring_buffer); break; case MS_TOKEN_LITERAL_TIME: node->tokensrc = msStrdup(msyystring_buffer); node->token = token; msTimeInit(&(node->tokenval.tmval)); if (msParseTime(msyystring_buffer, &(node->tokenval.tmval)) != MS_TRUE) { msSetError(MS_PARSEERR, "Parsing time value failed.", "msTokenizeExpression()"); free(node); goto parse_error; } break; case MS_TOKEN_BINDING_DOUBLE: /* we've encountered an attribute (binding) reference */ case MS_TOKEN_BINDING_INTEGER: case MS_TOKEN_BINDING_STRING: case MS_TOKEN_BINDING_TIME: node->token = token; /* binding type */ node->tokenval.bindval.item = msStrdup(msyystring_buffer); if (list) node->tokenval.bindval.index = string2list(list, listsize, msyystring_buffer); break; case MS_TOKEN_BINDING_SHAPE: node->token = token; break; case MS_TOKEN_BINDING_MAP_CELLSIZE: node->token = token; break; case MS_TOKEN_BINDING_DATA_CELLSIZE: node->token = token; break; case MS_TOKEN_FUNCTION_FROMTEXT: /* we want to process a shape from WKT once and not for every feature being evaluated */ if ((token = msyylex()) != 40) { /* ( */ msSetError(MS_PARSEERR, "Parsing fromText function failed.", "msTokenizeExpression()"); free(node); goto parse_error; } if ((token = msyylex()) != MS_TOKEN_LITERAL_STRING) { msSetError(MS_PARSEERR, "Parsing fromText function failed.", "msTokenizeExpression()"); free(node); goto parse_error; } node->token = MS_TOKEN_LITERAL_SHAPE; node->tokenval.shpval = msShapeFromWKT(msyystring_buffer); if (!node->tokenval.shpval) { msSetError(MS_PARSEERR, "Parsing fromText function failed, WKT processing failed.", "msTokenizeExpression()"); free(node); goto parse_error; } /* todo: perhaps process optional args (e.g. projection) */ if ((token = msyylex()) != 41) { /* ) */ msSetError(MS_PARSEERR, "Parsing fromText function failed.", "msTokenizeExpression()"); msFreeShape(node->tokenval.shpval); free(node->tokenval.shpval); free(node); goto parse_error; } break; default: node->token = token; /* for everything else */ break; } /* add node to token list */ if (expression->tokens == NULL) { expression->tokens = node; } else { if (expression->tokens->tailifhead != NULL) /* this should never be NULL, but just in case */ expression->tokens->tailifhead->next = node; /* put the node at the end of the list */ } /* repoint the head of the list to the end - our new element this causes a loop if we are at the head, be careful not to walk in a loop */ expression->tokens->tailifhead = node; } expression->curtoken = expression->tokens; /* point at the first token */ msReleaseLock(TLOCK_PARSER); return MS_SUCCESS; parse_error: msReleaseLock(TLOCK_PARSER); return MS_FAILURE; } static void buildLayerItemList(layerObj *layer) { int i, j, k, l; /* ** build layer item list, compute item indexes for explicitly item references *(e.g. classitem) or item bindings */ /* layer items */ if (layer->classitem) layer->classitemindex = string2list(layer->items, &(layer->numitems), layer->classitem); if (layer->filteritem) layer->filteritemindex = string2list(layer->items, &(layer->numitems), layer->filteritem); if (layer->styleitem && (strcasecmp(layer->styleitem, "AUTO") != 0) && !STARTS_WITH_CI(layer->styleitem, "javascript://") && !STARTS_WITH_CI(layer->styleitem, "sld://")) layer->styleitemindex = string2list(layer->items, &(layer->numitems), layer->styleitem); if (layer->labelitem) layer->labelitemindex = string2list(layer->items, &(layer->numitems), layer->labelitem); if (layer->utfitem) layer->utfitemindex = string2list(layer->items, &(layer->numitems), layer->utfitem); /* layer classes */ for (i = 0; i < layer->numclasses; i++) { // if classgroup has been set we can ignore any fields required // for rendering unused classes if (layer->class[i] -> group && layer -> classgroup &&strcasecmp( layer->class[i] -> group, layer -> classgroup) != 0) continue; if (layer->class[i] -> expression.type == MS_EXPRESSION) /* class expression */ msTokenizeExpression(&(layer->class[i] -> expression), layer->items, &(layer->numitems)); /* class styles (items, bindings, geomtransform) */ for (j = 0; j < layer->class[i] -> numstyles; j++) { if (layer->class[i] -> styles[j] -> rangeitem) layer->class[i]->styles[j]->rangeitemindex = string2list(layer->items, &(layer->numitems), layer->class[i] -> styles[j] -> rangeitem); for (k = 0; k < MS_STYLE_BINDING_LENGTH; k++) { if (layer->class[i] -> styles[j] -> bindings[k].item) layer->class[i]->styles[j]->bindings[k].index = string2list(layer->items, &(layer->numitems), layer->class[i] -> styles[j] -> bindings[k].item); if (layer->class[i] -> styles[j] -> exprBindings[k].type == MS_EXPRESSION) { msTokenizeExpression( &(layer->class[i] -> styles[j] -> exprBindings[k]), layer->items, &(layer->numitems)); } } if (layer->class[i] -> styles[j] -> _geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) msTokenizeExpression(&(layer->class[i] -> styles[j] -> _geomtransform), layer->items, &(layer->numitems)); } /* class labels and label styles (items, bindings, geomtransform) */ for (l = 0; l < layer->class[i] -> numlabels; l++) { for (j = 0; j < layer->class[i] -> labels[l] -> numstyles; j++) { if (layer->class[i] -> labels[l] -> styles[j] -> rangeitem) layer->class[i]->labels[l]->styles[j]->rangeitemindex = string2list( layer->items, &(layer->numitems), layer->class[i] -> labels[l] -> styles[j] -> rangeitem); for (k = 0; k < MS_STYLE_BINDING_LENGTH; k++) { if (layer->class[i] -> labels[l] -> styles[j] -> bindings[k].item) layer->class[i]->labels[l]->styles[j]->bindings[k].index = string2list(layer->items, &(layer->numitems), layer->class[i] -> labels[l] -> styles[j] -> bindings[k].item); if (layer->class[i] -> labels[l] -> styles[j] -> _geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) msTokenizeExpression( &(layer->class[i] -> labels[l] -> styles[j] -> _geomtransform), layer->items, &(layer->numitems)); } } for (k = 0; k < MS_LABEL_BINDING_LENGTH; k++) { if (layer->class[i] -> labels[l] -> bindings[k].item) layer->class[i]->labels[l]->bindings[k].index = string2list(layer->items, &(layer->numitems), layer->class[i] -> labels[l] -> bindings[k].item); if (layer->class[i] -> labels[l] -> exprBindings[k].type == MS_EXPRESSION) { msTokenizeExpression( &(layer->class[i] -> labels[l] -> exprBindings[k]), layer->items, &(layer->numitems)); } } /* label expression */ if (layer->class[i] -> labels[l] -> expression.type == MS_EXPRESSION) msTokenizeExpression(&(layer->class[i] -> labels[l] -> expression), layer->items, &(layer->numitems)); /* label text */ if (layer->class[i] -> labels[l] -> text.type == MS_EXPRESSION || (layer->class[i] -> labels[l] -> text.string &&strchr( layer->class[i] -> labels[l] -> text.string, '[') != NULL && strchr(layer->class[i] -> labels[l] -> text.string, ']') != NULL)) msTokenizeExpression(&(layer->class[i] -> labels[l] -> text), layer->items, &(layer->numitems)); } /* class text */ if (layer->class[i] -> text.type == MS_EXPRESSION || (layer->class[i] -> text.string &&strchr(layer->class[i] -> text.string, '[') != NULL && strchr(layer->class[i] -> text.string, ']') != NULL)) msTokenizeExpression(&(layer->class[i] -> text), layer->items, &(layer->numitems)); } /* layer filter */ if (layer->filter.type == MS_EXPRESSION) msTokenizeExpression(&(layer->filter), layer->items, &(layer->numitems)); /* cluster expressions */ if (layer->cluster.group.type == MS_EXPRESSION) msTokenizeExpression(&(layer->cluster.group), layer->items, &(layer->numitems)); if (layer->cluster.filter.type == MS_EXPRESSION) msTokenizeExpression(&(layer->cluster.filter), layer->items, &(layer->numitems)); /* utfdata */ if (layer->utfdata.type == MS_EXPRESSION || (layer->utfdata.string && strchr(layer->utfdata.string, '[') != NULL && strchr(layer->utfdata.string, ']') != NULL)) { msTokenizeExpression(&(layer->utfdata), layer->items, &(layer->numitems)); } } /* ** This function builds a list of items necessary to draw or query a particular *layer by ** examining the contents of the various xxxxitem parameters and expressions. *That list is ** then used to set the iteminfo variable. */ int msLayerWhichItems(layerObj *layer, int get_all, const char *metadata) { int i, j, k, l, rv; int nt = 0; if (!layer->vtable) { rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); /* Cleanup any previous item selection */ msLayerFreeItemInfo(layer); if (layer->items) { msFreeCharArray(layer->items, layer->numitems); layer->items = NULL; layer->numitems = 0; } /* ** need a count of potential items/attributes needed */ /* layer level counts */ layer->classitemindex = -1; layer->filteritemindex = -1; layer->styleitemindex = -1; layer->labelitemindex = -1; layer->utfitemindex = -1; if (layer->classitem) nt++; if (layer->filteritem) nt++; if (layer->styleitem && (strcasecmp(layer->styleitem, "AUTO") != 0) && !STARTS_WITH_CI(layer->styleitem, "javascript://") && !STARTS_WITH_CI(layer->styleitem, "sld://")) nt++; if (layer->filter.type == MS_EXPRESSION) nt += msCountChars(layer->filter.string, '['); if (layer->cluster.group.type == MS_EXPRESSION) nt += msCountChars(layer->cluster.group.string, '['); if (layer->cluster.filter.type == MS_EXPRESSION) nt += msCountChars(layer->cluster.filter.string, '['); if (layer->labelitem) nt++; if (layer->utfitem) nt++; if (layer->_geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) msTokenizeExpression(&layer->_geomtransform, layer->items, &(layer->numitems)); /* class level counts */ for (i = 0; i < layer->numclasses; i++) { for (j = 0; j < layer->class[i] -> numstyles; j++) { if (layer->class[i] -> styles[j] -> rangeitem) nt++; nt += layer->class[i]->styles[j]->numbindings; if (layer->class[i] -> styles[j] -> _geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) nt += msCountChars( layer->class[i] -> styles[j] -> _geomtransform.string, '['); for (k = 0; k < MS_STYLE_BINDING_LENGTH; k++) { if (layer->class[i] -> styles[j] -> exprBindings[k].type == MS_EXPRESSION) { nt += msCountChars( layer->class[i] -> styles[j] -> exprBindings[k].string, '['); } } } if (layer->class[i] -> expression.type == MS_EXPRESSION) nt += msCountChars(layer->class[i] -> expression.string, '['); for (l = 0; l < layer->class[i] -> numlabels; l++) { nt += layer->class[i]->labels[l]->numbindings; for (j = 0; j < layer->class[i] -> labels[l] -> numstyles; j++) { if (layer->class[i] -> labels[l] -> styles[j] -> rangeitem) nt++; nt += layer->class[i]->labels[l]->styles[j]->numbindings; if (layer->class[i] -> labels[l] -> styles[j] -> _geomtransform.type == MS_GEOMTRANSFORM_EXPRESSION) nt += msCountChars(layer->class[i] -> labels[l] -> styles[j] -> _geomtransform.string, '['); } for (k = 0; k < MS_LABEL_BINDING_LENGTH; k++) { if (layer->class[i] -> labels[l] -> exprBindings[k].type == MS_EXPRESSION) { nt += msCountChars( layer->class[i] -> labels[l] -> exprBindings[k].string, '['); } } if (layer->class[i] -> labels[l] -> expression.type == MS_EXPRESSION) nt += msCountChars(layer->class[i] -> labels[l] -> expression.string, '['); if (layer->class[i] -> labels[l] -> text.type == MS_EXPRESSION || (layer->class[i] -> labels[l] -> text.string &&strchr( layer->class[i] -> labels[l] -> text.string, '[') != NULL && strchr(layer->class[i] -> labels[l] -> text.string, ']') != NULL)) nt += msCountChars(layer->class[i] -> labels[l] -> text.string, '['); } if (layer->class[i] -> text.type == MS_EXPRESSION || (layer->class[i] -> text.string &&strchr(layer->class[i] -> text.string, '[') != NULL && strchr(layer->class[i] -> text.string, ']') != NULL)) nt += msCountChars(layer->class[i] -> text.string, '['); } /* utfgrid count */ if (layer->utfdata.type == MS_EXPRESSION || (layer->utfdata.string && strchr(layer->utfdata.string, '[') != NULL && strchr(layer->utfdata.string, ']') != NULL)) nt += msCountChars(layer->utfdata.string, '['); // if we are using a GetMap request with a WMS filter we don't need to return // all items if (msOWSLookupMetadata(&(layer->metadata), "G", "wmsfilter_flag") != NULL) { get_all = MS_FALSE; } if (metadata == NULL) { // check item set by mapwfs.cpp to restrict the number of columns selected metadata = msOWSLookupMetadata(&(layer->metadata), "G", "select_items"); if (metadata) { /* get only selected items */ get_all = MS_FALSE; } } /* always retrieve all items in some cases */ if (layer->connectiontype == MS_INLINE || (layer->map->outputformat && layer->map->outputformat->renderer == MS_RENDER_WITH_KML)) { get_all = MS_TRUE; } /* ** allocate space for the item list (worse case size) */ if (get_all) { rv = msLayerGetItems(layer); if (nt > 0) /* need to realloc the array to accept the possible new items*/ layer->items = (char **)msSmallRealloc( layer->items, sizeof(char *) * (layer->numitems + nt)); } else { rv = layer->vtable->LayerCreateItems(layer, nt); } if (rv != MS_SUCCESS) return rv; buildLayerItemList(layer); if (metadata) { char **tokens; int n = 0; int j; tokens = msStringSplit(metadata, ',', &n); if (tokens) { for (i = 0; i < n; i++) { int bFound = 0; for (j = 0; j < layer->numitems; j++) { if (strcasecmp(tokens[i], layer->items[j]) == 0) { bFound = 1; break; } } if (!bFound) { layer->numitems++; layer->items = (char **)msSmallRealloc( layer->items, sizeof(char *) * (layer->numitems)); layer->items[layer->numitems - 1] = msStrdup(tokens[i]); } } msFreeCharArray(tokens, n); } /* If we didn't retrieve all items of the layer, then do it, so that the */ /* order of the layer->items array is consistent with it. This is */ /* important so that WFS DescribeFeatureType and GetFeature requests */ /* return items in the same order */ if (!get_all && layer->numitems) { char **unsorted_items = layer->items; int numitems = layer->numitems; /* Retrieve all items */ layer->items = NULL; layer->numitems = 0; rv = msLayerGetItems(layer); if (rv != MS_SUCCESS) { msFreeCharArray(unsorted_items, numitems); return rv; } /* Sort unsorted_items in the order of layer->items */ char **sorted_items = (char **)msSmallMalloc(sizeof(char *) * numitems); int num_sorted_items = 0; for (i = 0; i < layer->numitems; i++) { if (layer->items[i]) { for (j = 0; j < numitems; j++) { if (unsorted_items[j] && strcasecmp(layer->items[i], unsorted_items[j]) == 0) { sorted_items[num_sorted_items] = layer->items[i]; num_sorted_items++; layer->items[i] = NULL; msFree(unsorted_items[j]); unsorted_items[j] = NULL; break; } } } } /* Add items that are not returned by msLayerGetItems() (not sure if that * can happen) */ for (j = 0; j < numitems; j++) { if (unsorted_items[j]) { sorted_items[num_sorted_items] = unsorted_items[j]; num_sorted_items++; } } if (layer->numitems > 0) { msFreeCharArray(layer->items, layer->numitems); } msFreeCharArray(unsorted_items, numitems); layer->items = sorted_items; layer->numitems = numitems; /* Re-run buildLayerItemList() with the now correctly sorted items */ buildLayerItemList(layer); } } /* populate the iteminfo array */ if (layer->numitems == 0) return (MS_SUCCESS); return (msLayerInitItemInfo(layer)); } /* ** A helper function to set the items to be retrieved with a particular shape. *Unused at the moment but will be used ** from within MapScript. Should not need modification. */ int msLayerSetItems(layerObj *layer, char **items, int numitems) { int i; /* Cleanup any previous item selection */ msLayerFreeItemInfo(layer); if (layer->items) { msFreeCharArray(layer->items, layer->numitems); layer->items = NULL; layer->numitems = 0; } /* now allocate and set the layer item parameters */ layer->items = (char **)malloc(sizeof(char *) * numitems); MS_CHECK_ALLOC(layer->items, sizeof(char *) * numitems, MS_FAILURE); for (i = 0; i < numitems; i++) layer->items[i] = msStrdup(items[i]); layer->numitems = numitems; /* populate the iteminfo array */ return (msLayerInitItemInfo(layer)); } /* ** Fills a classObj with style info from the specified shape. This is used ** with STYLEITEM AUTO when rendering shapes. ** For optimal results, this should be called immediately after ** GetNextShape() or GetShape() so that the shape doesn't have to be read ** twice. ** */ int msLayerGetAutoStyle(mapObj *map, layerObj *layer, classObj *c, shapeObj *shape) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerGetAutoStyle(map, layer, c, shape); } /* ** Fills a classObj with style info from the specified attribute. This is used ** with STYLEITEM "attribute" when rendering shapes. ** */ int msLayerGetFeatureStyle(mapObj *map, layerObj *layer, classObj *c, shapeObj *shape) { char *stylestring = NULL; if (layer->styleitem && layer->styleitemindex >= 0) { stylestring = msStrdup(shape->values[layer->styleitemindex]); } else if (layer->styleitem && strncasecmp(layer->styleitem, "javascript://", 13) == 0) { #ifdef USE_V8_MAPSCRIPT char *filename = layer->styleitem + 13; if (!map->v8context) { msV8CreateContext(map); if (!map->v8context) { msSetError(MS_V8ERR, "Unable to create v8 context.", "msLayerGetFeatureStyle()"); return MS_FAILURE; } } if (*filename == '\0') { msSetError(MS_V8ERR, "Invalid javascript filename: \"%s\".", "msLayerGetFeatureStyle()", layer->styleitem); return MS_FAILURE; } stylestring = msV8GetFeatureStyle(map, filename, layer, shape); #else msSetError(MS_V8ERR, "V8 Javascript support is not available.", "msLayerGetFeatureStyle()"); return MS_FAILURE; #endif } else if (layer->styleitem && STARTS_WITH_CI(layer->styleitem, "sld://")) { // ignore the SLD styleitem return MS_SUCCESS; } else { /* unknown styleitem */ return MS_FAILURE; } /* try to find out the current style format */ if (!stylestring) return MS_FAILURE; if (strncasecmp(stylestring, "style", 5) == 0) { resetClassStyle(c); c->layer = layer; if (msMaybeAllocateClassStyle(c, 0)) { free(stylestring); return (MS_FAILURE); } msUpdateStyleFromString(c->styles[0], stylestring); double geo_cellsize = msGetGeoCellSize(map); msUpdateClassScaleFactor(geo_cellsize, map, layer, c); if (c->styles[0]->symbolname) { if ((c->styles[0]->symbol = msGetSymbolIndex( &(map->symbolset), c->styles[0]->symbolname, MS_TRUE)) == -1) { msSetError(MS_MISCERR, "Undefined symbol \"%s\" in class of layer %s.", "msLayerGetFeatureStyle()", c->styles[0]->symbolname, layer->name); free(stylestring); return MS_FAILURE; } } } else if (strncasecmp(stylestring, "class", 5) == 0) { if (strcasestr(stylestring, " style ") != NULL) { /* reset style if stylestring contains style definitions */ resetClassStyle(c); c->layer = layer; } msUpdateClassFromString(c, stylestring); double geo_cellsize = msGetGeoCellSize(map); msUpdateClassScaleFactor(geo_cellsize, map, layer, c); } else if (strncasecmp(stylestring, "pen", 3) == 0 || strncasecmp(stylestring, "brush", 5) == 0 || strncasecmp(stylestring, "symbol", 6) == 0 || strncasecmp(stylestring, "label", 5) == 0) { msOGRUpdateStyleFromString(map, layer, c, stylestring); } else if (strcasestr(stylestring, "StyledLayerDescriptor>") != NULL) { // check for the closing tag of an SLD document or // with a namespace e.g. msSLDApplySLD(map, stylestring, layer->index, NULL, NULL); } else { resetClassStyle(c); } free(stylestring); return MS_SUCCESS; } /* Returns the number of inline feature of a layer */ int msLayerGetNumFeatures(layerObj *layer) { int need_to_close = MS_FALSE, result = -1; if (!msLayerIsOpen(layer)) { if (msLayerOpen(layer) != MS_SUCCESS) return result; need_to_close = MS_TRUE; } if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return result; } cppcheck_assert(layer->vtable); result = layer->vtable->LayerGetNumFeatures(layer); if (need_to_close) msLayerClose(layer); return (result); } void msLayerSetProcessingKey(layerObj *layer, const char *key, const char *value) { layer->processing = CSLSetNameValue(layer->processing, key, value); } void msLayerSubstituteProcessing(layerObj *layer, const char *from, const char *to) { int i; for (i = 0; layer->processing && layer->processing[i]; i++) { char *newVal = msCaseReplaceSubstring(msStrdup(layer->processing[i]), from, to); CPLFree(layer->processing[i]); layer->processing[i] = CPLStrdup(newVal); msFree(newVal); } } void msLayerAddProcessing(layerObj *layer, const char *directive) { layer->processing = CSLAddString(layer->processing, directive); } int msLayerGetNumProcessing(const layerObj *layer) { return CSLCount(layer->processing); } const char *msLayerGetProcessing(const layerObj *layer, int proc_index) { if (proc_index < 0 || proc_index >= msLayerGetNumProcessing(layer)) { msSetError(MS_CHILDERR, "Invalid processing index.", "msLayerGetProcessing()"); return NULL; } else { return layer->processing[proc_index]; } } const char *msLayerGetProcessingKey(const layerObj *layer, const char *key) { return CSLFetchNameValue(layer->processing, key); } /************************************************************************/ /* msLayerGetMaxFeaturesToDraw */ /* */ /* Check to see if maxfeaturestodraw is set as a metadata or an */ /* output format option. Used for vector layers to limit the */ /* number of fatures rendered. */ /************************************************************************/ int msLayerGetMaxFeaturesToDraw(layerObj *layer, outputFormatObj *format) { int nMaxFeatures = -1; const char *pszTmp = NULL; if (layer) { nMaxFeatures = layer->maxfeatures; pszTmp = msLookupHashTable(&layer->metadata, "maxfeaturestodraw"); if (pszTmp) nMaxFeatures = atoi(pszTmp); else { pszTmp = msLookupHashTable(&layer->map->web.metadata, "maxfeaturestodraw"); if (pszTmp) nMaxFeatures = atoi(pszTmp); } } if (format) { if (nMaxFeatures < 0) nMaxFeatures = atoi(msGetOutputFormatOption(format, "maxfeaturestodraw", "-1")); } return nMaxFeatures; } int msLayerClearProcessing(layerObj *layer) { CSLDestroy(layer->processing); layer->processing = 0; return 0; } int makeTimeFilter(layerObj *lp, const char *timestring, const char *timefield, const int addtimebacktics) { char **atimes, **tokens = NULL; int numtimes, i, ntmp = 0; char *pszBuffer = NULL; int bOnlyExistingFilter = 0; if (!lp || !timestring || !timefield) return MS_FALSE; /* parse the time string. We support discrete times (eg 2004-09-21), */ /* multiple times (2004-09-21, 2004-09-22, ...) */ /* and range(s) (2004-09-21/2004-09-25, 2004-09-27/2004-09-29) */ if (strstr(timestring, ",") == NULL && strstr(timestring, "/") == NULL) { /* discrete time */ /* if(lp->filteritem) free(lp->filteritem); lp->filteritem = msStrdup(timefield); if (&lp->filter) msFreeExpression(&lp->filter); */ /* if the filter is set and it's a sting type, concatenate it with the time. If not just free it */ if (lp->filter.string && lp->filter.type == MS_STRING) { pszBuffer = msStringConcatenate(pszBuffer, "(("); pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string); pszBuffer = msStringConcatenate(pszBuffer, ") and "); } else if (lp->filter.string && lp->filter.type == MS_EXPRESSION) { char *pszExpressionString = msGetExpressionString(&(lp->filter)); pszBuffer = msStringConcatenate(pszBuffer, "("); pszBuffer = msStringConcatenate(pszBuffer, pszExpressionString); pszBuffer = msStringConcatenate(pszBuffer, " and "); msFree(pszExpressionString); } else { msFreeExpression(&lp->filter); } pszBuffer = msStringConcatenate(pszBuffer, "("); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "["); pszBuffer = msStringConcatenate(pszBuffer, (char *)timefield); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "]"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); pszBuffer = msStringConcatenate(pszBuffer, " = "); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, (char *)timestring); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, ")"); /* if there was a filter, It was concatenate with an And ans should be * closed*/ if (lp->filter.string && (lp->filter.type == MS_STRING || lp->filter.type == MS_EXPRESSION)) pszBuffer = msStringConcatenate(pszBuffer, ")"); msLoadExpressionString(&lp->filter, pszBuffer); if (pszBuffer) msFree(pszBuffer); return MS_TRUE; } atimes = msStringSplit(timestring, ',', &numtimes); if (atimes == NULL || numtimes < 1) { msFreeCharArray(atimes, numtimes); return MS_FALSE; } if (lp->filter.string && lp->filter.type == MS_STRING) { pszBuffer = msStringConcatenate(pszBuffer, "(("); pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string); pszBuffer = msStringConcatenate(pszBuffer, ") and "); /*this flag is used to indicate that the buffer contains only the existing filter. It is set to 0 when time filter parts are added to the buffer */ bOnlyExistingFilter = 1; } else if (lp->filter.string && lp->filter.type == MS_EXPRESSION) { char *pszExpressionString = msGetExpressionString(&(lp->filter)); pszBuffer = msStringConcatenate(pszBuffer, "("); pszBuffer = msStringConcatenate(pszBuffer, pszExpressionString); pszBuffer = msStringConcatenate(pszBuffer, " and "); msFree(pszExpressionString); bOnlyExistingFilter = 1; } else msFreeExpression(&lp->filter); /* check to see if we have ranges by parsing the first entry */ tokens = msStringSplit(atimes[0], '/', &ntmp); if (ntmp == 2) { /* ranges */ msFreeCharArray(tokens, ntmp); for (i = 0; i < numtimes; i++) { tokens = msStringSplit(atimes[i], '/', &ntmp); if (ntmp == 2) { if (pszBuffer && strlen(pszBuffer) > 0 && bOnlyExistingFilter == 0) pszBuffer = msStringConcatenate(pszBuffer, " OR "); else pszBuffer = msStringConcatenate(pszBuffer, "("); bOnlyExistingFilter = 0; pszBuffer = msStringConcatenate(pszBuffer, "("); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "["); pszBuffer = msStringConcatenate(pszBuffer, (char *)timefield); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "]"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); pszBuffer = msStringConcatenate(pszBuffer, " >= "); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, tokens[0]); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, " AND "); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "["); pszBuffer = msStringConcatenate(pszBuffer, (char *)timefield); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "]"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); pszBuffer = msStringConcatenate(pszBuffer, " <= "); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, tokens[1]); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, ")"); } msFreeCharArray(tokens, ntmp); } if (pszBuffer && strlen(pszBuffer) > 0 && bOnlyExistingFilter == 0) pszBuffer = msStringConcatenate(pszBuffer, ")"); } else if (ntmp == 1) { /* multiple times */ msFreeCharArray(tokens, ntmp); pszBuffer = msStringConcatenate(pszBuffer, "("); for (i = 0; i < numtimes; i++) { if (i > 0) pszBuffer = msStringConcatenate(pszBuffer, " OR "); pszBuffer = msStringConcatenate(pszBuffer, "("); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "["); pszBuffer = msStringConcatenate(pszBuffer, (char *)timefield); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "]"); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); pszBuffer = msStringConcatenate(pszBuffer, " = "); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, atimes[i]); if (addtimebacktics) pszBuffer = msStringConcatenate(pszBuffer, "`"); else pszBuffer = msStringConcatenate(pszBuffer, "'"); pszBuffer = msStringConcatenate(pszBuffer, ")"); } pszBuffer = msStringConcatenate(pszBuffer, ")"); } else { msFreeCharArray(tokens, ntmp); msFreeCharArray(atimes, numtimes); msFree(pszBuffer); return MS_FALSE; } msFreeCharArray(atimes, numtimes); /* load the string to the filter */ if (pszBuffer && strlen(pszBuffer) > 0) { if (lp->filter.string && (lp->filter.type == MS_STRING || lp->filter.type == MS_EXPRESSION)) pszBuffer = msStringConcatenate(pszBuffer, ")"); /* if(lp->filteritem) free(lp->filteritem); lp->filteritem = msStrdup(timefield); */ msLoadExpressionString(&lp->filter, pszBuffer); } msFree(pszBuffer); return MS_TRUE; } /** set the filter parameter for a time filter **/ int msLayerSetTimeFilter(layerObj *layer, const char *timestring, const char *timefield) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } cppcheck_assert(layer->vtable); return layer->vtable->LayerSetTimeFilter(layer, timestring, timefield); } int msLayerMakeBackticsTimeFilter(layerObj *lp, const char *timestring, const char *timefield) { return makeTimeFilter(lp, timestring, timefield, MS_TRUE); } int msLayerMakePlainTimeFilter(layerObj *lp, const char *timestring, const char *timefield) { return makeTimeFilter(lp, timestring, timefield, MS_FALSE); } /* * Dummies / default actions for layers */ int LayerDefaultInitItemInfo(layerObj *layer) { (void)layer; return MS_SUCCESS; } void LayerDefaultFreeItemInfo(layerObj *layer) { (void)layer; } int LayerDefaultOpen(layerObj *layer) { (void)layer; return MS_FAILURE; } int LayerDefaultIsOpen(layerObj *layer) { (void)layer; return MS_FALSE; } int LayerDefaultWhichShapes(layerObj *layer, rectObj rect, int isQuery) { (void)layer; (void)rect; (void)isQuery; return MS_SUCCESS; } int LayerDefaultNextShape(layerObj *layer, shapeObj *shape) { (void)layer; (void)shape; return MS_FAILURE; } int LayerDefaultGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { (void)layer; (void)shape; (void)record; return MS_FAILURE; } int LayerDefaultGetShapeCount(layerObj *layer, rectObj rect, projectionObj *rectProjection) { int status; shapeObj shape, searchshape; int nShapeCount = 0; rectObj searchrect = rect; reprojectionObj *reprojector = NULL; msInitShape(&searchshape); msRectToPolygon(searchrect, &searchshape); if (rectProjection != NULL) { if (layer->project && msProjectionsDiffer(&(layer->projection), rectProjection)) msProjectRect(rectProjection, &(layer->projection), &searchrect); /* project the searchrect to source coords */ else layer->project = MS_FALSE; } status = msLayerWhichShapes(layer, searchrect, MS_TRUE); if (status == MS_FAILURE) { msFreeShape(&searchshape); return -1; } else if (status == MS_DONE) { msFreeShape(&searchshape); return 0; } msInitShape(&shape); while ((status = msLayerNextShape(layer, &shape)) == MS_SUCCESS) { if (rectProjection != NULL) { if (layer->project && msProjectionsDiffer(&(layer->projection), rectProjection)) { if (reprojector == NULL) reprojector = msProjectCreateReprojector(&(layer->projection), rectProjection); if (reprojector) msProjectShapeEx(reprojector, &shape); } else layer->project = MS_FALSE; if (msRectContained(&shape.bounds, &rect) == MS_TRUE) { /* if the whole shape is in, don't intersect */ status = MS_TRUE; } else { switch (shape.type) { /* make sure shape actually intersects the qrect (ADD FUNCTIONS SPECIFIC TO RECTOBJ) */ case MS_SHAPE_POINT: status = msIntersectMultipointPolygon(&shape, &searchshape); break; case MS_SHAPE_LINE: status = msIntersectPolylinePolygon(&shape, &searchshape); break; case MS_SHAPE_POLYGON: status = msIntersectPolygons(&shape, &searchshape); break; default: break; } } } else status = MS_TRUE; if (status == MS_TRUE) nShapeCount++; msFreeShape(&shape); if (layer->maxfeatures > 0 && layer->maxfeatures == nShapeCount) break; } msFreeShape(&searchshape); msProjectDestroyReprojector(reprojector); return nShapeCount; } int LayerDefaultClose(layerObj *layer) { (void)layer; return MS_SUCCESS; } int LayerDefaultGetItems(layerObj *layer) { (void)layer; return MS_SUCCESS; /* returning no items is legit */ } int msLayerApplyCondSQLFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex) { return FLTLayerApplyCondSQLFilterToLayer(psNode, map, iLayerIndex); } int msLayerSupportsPaging(layerObj *layer) { if (layer && ((layer->connectiontype == MS_ORACLESPATIAL) || (layer->connectiontype == MS_POSTGIS))) return MS_TRUE; return MS_FALSE; } int msLayerApplyPlainFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex); /* * msLayerSupportsSorting() * * Returns MS_TRUE if the layer supports sorting/ordering. */ int msLayerSupportsSorting(layerObj *layer) { if (layer && ((layer->connectiontype == MS_OGR) || (layer->connectiontype == MS_POSTGIS) || (layer->connectiontype == MS_ORACLESPATIAL) || ((layer->connectiontype == MS_PLUGIN) && (strstr(layer->plugin_library, "msplugin_oracle") != NULL)) || ((layer->connectiontype == MS_PLUGIN) && (strstr(layer->plugin_library, "msplugin_mssql2008") != NULL)))) return MS_TRUE; return MS_FALSE; } static void msLayerFreeSortBy(layerObj *layer) { for (int i = 0; i < layer->sortBy.nProperties; i++) msFree(layer->sortBy.properties[i].item); msFree(layer->sortBy.properties); layer->sortBy.properties = NULL; layer->sortBy.nProperties = 0; } /* * msLayerSetSort() * * Copy the sortBy clause passed as an argument into the layer sortBy member. */ void msLayerSetSort(layerObj *layer, const sortByClause *sortBy) { sortByProperties *newProperties = (sortByProperties *)msSmallMalloc( sortBy->nProperties * sizeof(sortByProperties)); for (int i = 0; i < sortBy->nProperties; i++) { newProperties[i].item = msStrdup(sortBy->properties[i].item); newProperties[i].sortOrder = sortBy->properties[i].sortOrder; } msLayerFreeSortBy(layer); layer->sortBy.nProperties = sortBy->nProperties; layer->sortBy.properties = newProperties; } /* * msLayerBuildSQLOrderBy() * * Returns the content of a SQL ORDER BY clause from the sortBy member of * the layer. The string does not contain the "ORDER BY" keywords itself. */ char *msLayerBuildSQLOrderBy(layerObj *layer) { char *strOrderBy = NULL; if (layer->sortBy.nProperties > 0) { int i; for (i = 0; i < layer->sortBy.nProperties; i++) { char *escaped = msLayerEscapePropertyName(layer, layer->sortBy.properties[i].item); if (i > 0) strOrderBy = msStringConcatenate(strOrderBy, ", "); strOrderBy = msStringConcatenate(strOrderBy, escaped); if (layer->sortBy.properties[i].sortOrder == SORT_DESC) strOrderBy = msStringConcatenate(strOrderBy, " DESC"); msFree(escaped); } } return strOrderBy; } int msLayerApplyPlainFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex) { return FLTLayerApplyPlainFilterToLayer(psNode, map, iLayerIndex); } int msLayerGetPaging(layerObj *layer) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) { msSetError(MS_MISCERR, "Unable to initialize virtual table", "msLayerGetPaging()"); return MS_FAILURE; } } cppcheck_assert(layer->vtable); return layer->vtable->LayerGetPaging(layer); } void msLayerEnablePaging(layerObj *layer, int value) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) { msSetError(MS_MISCERR, "Unable to initialize virtual table", "msLayerEnablePaging()"); return; } } cppcheck_assert(layer->vtable); layer->vtable->LayerEnablePaging(layer, value); } /** Returns a cached reprojector from the layer projection to the map projection */ reprojectionObj *msLayerGetReprojectorToMap(layerObj *layer, mapObj *map) { if (layer->reprojectorLayerToMap != NULL && !msProjectIsReprojectorStillValid(layer->reprojectorLayerToMap)) { msProjectDestroyReprojector(layer->reprojectorLayerToMap); layer->reprojectorLayerToMap = NULL; } if (layer->reprojectorLayerToMap == NULL) { layer->reprojectorLayerToMap = msProjectCreateReprojector(&layer->projection, &map->projection); } return layer->reprojectorLayerToMap; } int LayerDefaultGetExtent(layerObj *layer, rectObj *extent) { (void)layer; (void)extent; return MS_FAILURE; } int LayerDefaultGetAutoStyle(mapObj *map, layerObj *layer, classObj *c, shapeObj *shape) { (void)map; (void)layer; (void)c; (void)shape; msSetError(MS_MISCERR, "'STYLEITEM AUTO' not supported for this data source.", "msLayerGetAutoStyle()"); return MS_FAILURE; } int LayerDefaultCloseConnection(layerObj *layer) { (void)layer; return MS_SUCCESS; } int LayerDefaultCreateItems(layerObj *layer, const int nt) { if (nt > 0) { layer->items = (char **)calloc( nt, sizeof(char *)); /* should be more than enough space */ MS_CHECK_ALLOC(layer->items, sizeof(char *), MS_FAILURE); layer->numitems = 0; } return MS_SUCCESS; } int LayerDefaultGetNumFeatures(layerObj *layer) { rectObj extent; int status; int result; shapeObj shape; /* calculate layer extent */ if (!MS_VALID_EXTENT(layer->extent)) { if (msLayerGetExtent(layer, &extent) != MS_SUCCESS) { msSetError(MS_MISCERR, "Unable to get layer extent", "LayerDefaultGetNumFeatures()"); return -1; } } else extent = layer->extent; /* Cleanup any previous item selection */ msLayerFreeItemInfo(layer); if (layer->items) { msFreeCharArray(layer->items, layer->numitems); layer->items = NULL; layer->numitems = 0; } status = msLayerWhichShapes(layer, extent, MS_FALSE); if (status == MS_DONE) { /* no overlap */ return 0; } else if (status != MS_SUCCESS) { return -1; } result = 0; while ((status = msLayerNextShape(layer, &shape)) == MS_SUCCESS) { ++result; msFreeShape(&shape); } return result; } int LayerDefaultAutoProjection(layerObj *layer, projectionObj *projection) { (void)layer; (void)projection; msSetError(MS_MISCERR, "This data driver does not implement AUTO projection support", "LayerDefaultAutoProjection()"); return MS_FAILURE; } int LayerDefaultSupportsCommonFilters(layerObj *layer) { (void)layer; return MS_FALSE; } int LayerDefaultTranslateFilter(layerObj *layer, expressionObj *filter, char *filteritem) { (void)layer; (void)filteritem; if (!filter->string) return MS_SUCCESS; /* nothing to do, not an error */ msSetError(MS_MISCERR, "This data driver does not implement filter translation support", "LayerDefaultTranslateFilter()"); return MS_FAILURE; } int msLayerDefaultGetPaging(layerObj *layer) { (void)layer; return MS_FALSE; } void msLayerDefaultEnablePaging(layerObj *layer, int value) { (void)layer; (void)value; } /************************************************************************/ /* LayerDefaultEscapeSQLParam */ /* */ /* Default function used to escape strings and avoid sql */ /* injection. Specific drivers should redefine if an escaping */ /* function is available in the driver. */ /************************************************************************/ char *LayerDefaultEscapeSQLParam(layerObj *layer, const char *pszString) { (void)layer; char *pszEscapedStr = NULL; if (pszString) { int nSrcLen; char c; int i = 0, j = 0; nSrcLen = (int)strlen(pszString); pszEscapedStr = (char *)msSmallMalloc(2 * nSrcLen + 1); for (i = 0, j = 0; i < nSrcLen; i++) { c = pszString[i]; if (c == '\'') { pszEscapedStr[j++] = '\''; pszEscapedStr[j++] = '\''; } else if (c == '\\') { pszEscapedStr[j++] = '\\'; pszEscapedStr[j++] = '\\'; } else pszEscapedStr[j++] = c; } pszEscapedStr[j] = 0; } return pszEscapedStr; } /************************************************************************/ /* LayerDefaultEscapePropertyName */ /* */ /* Return the property name in a properly escaped and quoted form. */ /************************************************************************/ char *LayerDefaultEscapePropertyName(layerObj *layer, const char *pszString) { char *pszEscapedStr = NULL; int i, j = 0; if (layer && pszString && strlen(pszString) > 0) { int nLength = strlen(pszString); pszEscapedStr = (char *)msSmallMalloc(1 + 2 * nLength + 1 + 1); pszEscapedStr[j++] = '"'; for (i = 0; i < nLength; i++) { char c = pszString[i]; if (c == '"') { pszEscapedStr[j++] = '"'; pszEscapedStr[j++] = '"'; } else if (c == '\\') { pszEscapedStr[j++] = '\\'; pszEscapedStr[j++] = '\\'; } else pszEscapedStr[j++] = c; } pszEscapedStr[j++] = '"'; pszEscapedStr[j++] = 0; } return pszEscapedStr; } /* * msConnectLayer * * This will connect layer object to the new layer type. * Caller is responsible to close previous layer correctly. * For Internal types the library_str is ignored, for PLUGIN it's * define what plugin to use. Returns MS_FAILURE or MS_SUCCESS. */ int msConnectLayer(layerObj *layer, const int connectiontype, const char *library_str) { layer->connectiontype = connectiontype; /* For internal types, library_str is ignored */ if (connectiontype == MS_PLUGIN) { int rv; msFree(layer->plugin_library_original); layer->plugin_library_original = msStrdup(library_str); rv = msBuildPluginLibraryPath(&layer->plugin_library, layer->plugin_library_original, layer->map); if (rv != MS_SUCCESS) { return rv; } } return msInitializeVirtualTable(layer); } static int populateVirtualTable(layerVTableObj *vtable) { assert(vtable != NULL); vtable->LayerSupportsCommonFilters = LayerDefaultSupportsCommonFilters; vtable->LayerTranslateFilter = LayerDefaultTranslateFilter; vtable->LayerInitItemInfo = LayerDefaultInitItemInfo; vtable->LayerFreeItemInfo = LayerDefaultFreeItemInfo; vtable->LayerOpen = LayerDefaultOpen; vtable->LayerIsOpen = LayerDefaultIsOpen; vtable->LayerWhichShapes = LayerDefaultWhichShapes; vtable->LayerNextShape = LayerDefaultNextShape; /* vtable->LayerResultsGetShape = LayerDefaultResultsGetShape; */ vtable->LayerGetShape = LayerDefaultGetShape; vtable->LayerGetShapeCount = LayerDefaultGetShapeCount; vtable->LayerClose = LayerDefaultClose; vtable->LayerGetItems = LayerDefaultGetItems; vtable->LayerGetExtent = LayerDefaultGetExtent; vtable->LayerGetAutoStyle = LayerDefaultGetAutoStyle; vtable->LayerCloseConnection = LayerDefaultCloseConnection; vtable->LayerSetTimeFilter = msLayerMakePlainTimeFilter; vtable->LayerApplyFilterToLayer = msLayerApplyPlainFilterToLayer; vtable->LayerCreateItems = LayerDefaultCreateItems; vtable->LayerGetNumFeatures = LayerDefaultGetNumFeatures; vtable->LayerGetAutoProjection = LayerDefaultAutoProjection; vtable->LayerEscapeSQLParam = LayerDefaultEscapeSQLParam; vtable->LayerEscapePropertyName = LayerDefaultEscapePropertyName; vtable->LayerEnablePaging = msLayerDefaultEnablePaging; vtable->LayerGetPaging = msLayerDefaultGetPaging; return MS_SUCCESS; } static int createVirtualTable(layerVTableObj **vtable) { *vtable = malloc(sizeof(**vtable)); MS_CHECK_ALLOC(*vtable, sizeof(**vtable), MS_FAILURE); return populateVirtualTable(*vtable); } static int destroyVirtualTable(layerVTableObj **vtable) { memset(*vtable, 0, sizeof(**vtable)); msFree(*vtable); *vtable = NULL; return MS_SUCCESS; } int msInitializeVirtualTable(layerObj *layer) { if (layer->vtable) { destroyVirtualTable(&layer->vtable); } createVirtualTable(&layer->vtable); if (layer->features && layer->connectiontype != MS_GRATICULE) layer->connectiontype = MS_INLINE; if (layer->tileindex && layer->connectiontype == MS_SHAPEFILE) layer->connectiontype = MS_TILED_SHAPEFILE; if (layer->type == MS_LAYER_RASTER && layer->connectiontype != MS_WMS && layer->connectiontype != MS_KERNELDENSITY) layer->connectiontype = MS_RASTER; switch (layer->connectiontype) { case (MS_INLINE): return (msINLINELayerInitializeVirtualTable(layer)); break; case (MS_SHAPEFILE): return (msSHPLayerInitializeVirtualTable(layer)); break; case (MS_TILED_SHAPEFILE): return (msTiledSHPLayerInitializeVirtualTable(layer)); break; case (MS_OGR): return (msOGRLayerInitializeVirtualTable(layer)); break; case (MS_FLATGEOBUF): return (msFlatGeobufLayerInitializeVirtualTable(layer)); break; case (MS_POSTGIS): return (msPostGISLayerInitializeVirtualTable(layer)); break; case (MS_WMS): /* WMS should be treated as a raster layer */ return (msRASTERLayerInitializeVirtualTable(layer)); break; case (MS_KERNELDENSITY): /* KERNELDENSITY should be treated as a raster layer */ return (msRASTERLayerInitializeVirtualTable(layer)); break; case (MS_ORACLESPATIAL): return (msOracleSpatialLayerInitializeVirtualTable(layer)); break; case (MS_WFS): return (msWFSLayerInitializeVirtualTable(layer)); break; case (MS_GRATICULE): return (msGraticuleLayerInitializeVirtualTable(layer)); break; case (MS_RASTER): return (msRASTERLayerInitializeVirtualTable(layer)); break; case (MS_PLUGIN): return (msPluginLayerInitializeVirtualTable(layer)); break; case (MS_UNION): return (msUnionLayerInitializeVirtualTable(layer)); break; case (MS_UVRASTER): return (msUVRASTERLayerInitializeVirtualTable(layer)); break; case (MS_CONTOUR): return (msContourLayerInitializeVirtualTable(layer)); break; case (MS_RASTER_LABEL): return (msRasterLabelLayerInitializeVirtualTable(layer)); break; default: msSetError(MS_MISCERR, "Unknown connectiontype, it was %d", "msInitializeVirtualTable()", layer->connectiontype); return MS_FAILURE; break; } /* not reached */ return MS_FAILURE; } /* * INLINE: Virtual table functions */ typedef struct { rectObj searchrect; int is_relative; /* relative coordinates? */ } msINLINELayerInfo; int msINLINELayerIsOpen(layerObj *layer) { if (layer->layerinfo) return (MS_TRUE); else return (MS_FALSE); } msINLINELayerInfo *msINLINECreateLayerInfo(void) { msINLINELayerInfo *layerinfo = msSmallMalloc(sizeof(msINLINELayerInfo)); layerinfo->searchrect.minx = -1.0; layerinfo->searchrect.miny = -1.0; layerinfo->searchrect.maxx = -1.0; layerinfo->searchrect.maxy = -1.0; layerinfo->is_relative = MS_FALSE; return layerinfo; } int msINLINELayerOpen(layerObj *layer) { msINLINELayerInfo *layerinfo; if (layer->layerinfo) { if (layer->debug) { msDebug("msINLINELayerOpen: Layer is already open!\n"); } return MS_SUCCESS; /* already open */ } /* ** Initialize the layerinfo **/ layerinfo = msINLINECreateLayerInfo(); layer->currentfeature = layer->features; /* point to the beginning of the feature list */ layer->layerinfo = (void *)layerinfo; return (MS_SUCCESS); } int msINLINELayerClose(layerObj *layer) { if (layer->layerinfo) { free(layer->layerinfo); layer->layerinfo = NULL; } return MS_SUCCESS; } int msINLINELayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { (void)isQuery; msINLINELayerInfo *layerinfo = NULL; layerinfo = (msINLINELayerInfo *)layer->layerinfo; layerinfo->searchrect = rect; layerinfo->is_relative = (layer->transform != MS_FALSE && layer->transform != MS_TRUE); return MS_SUCCESS; } /* Author: Cristoph Spoerri and Sean Gillies */ int msINLINELayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { int i = 0; featureListNodeObjPtr current; int shapeindex = record->shapeindex; /* only index necessary */ current = layer->features; while (current != NULL && i != shapeindex) { i++; current = current->next; } if (current == NULL) { msSetError(MS_SHPERR, "No inline feature with this index.", "msINLINELayerGetShape()"); return MS_FAILURE; } if (msCopyShape(&(current->shape), shape) != MS_SUCCESS) { msSetError( MS_SHPERR, "Cannot retrieve inline shape. There some problem with the shape", "msINLINELayerGetShape()"); return MS_FAILURE; } /* check for the expected size of the values array */ if (layer->numitems > shape->numvalues) { shape->values = (char **)msSmallRealloc(shape->values, sizeof(char *) * (layer->numitems)); for (i = shape->numvalues; i < layer->numitems; i++) shape->values[i] = msStrdup(""); } msComputeBounds(shape); return MS_SUCCESS; } int msINLINELayerNextShape(layerObj *layer, shapeObj *shape) { msINLINELayerInfo *layerinfo = NULL; shapeObj *s; layerinfo = (msINLINELayerInfo *)layer->layerinfo; while (1) { if (!(layer->currentfeature)) { /* out of features */ return (MS_DONE); } s = &(layer->currentfeature->shape); layer->currentfeature = layer->currentfeature->next; msComputeBounds(s); if (layerinfo->is_relative || msRectOverlap(&s->bounds, &layerinfo->searchrect)) { msCopyShape(s, shape); /* check for the expected size of the values array */ if (layer->numitems > shape->numvalues) { int i; shape->values = (char **)msSmallRealloc( shape->values, sizeof(char *) * (layer->numitems)); for (i = shape->numvalues; i < layer->numitems; i++) shape->values[i] = msStrdup(""); shape->numvalues = layer->numitems; } break; } } return (MS_SUCCESS); } int msINLINELayerGetNumFeatures(layerObj *layer) { int i = 0; featureListNodeObjPtr current; current = layer->features; while (current != NULL) { i++; current = current->next; } return i; } /* Returns an escaped string */ char *msLayerEscapeSQLParam(layerObj *layer, const char *pszString) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return ""; } cppcheck_assert(layer->vtable); return layer->vtable->LayerEscapeSQLParam(layer, pszString); } char *msLayerEscapePropertyName(layerObj *layer, const char *pszString) { if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return ""; } cppcheck_assert(layer->vtable); return layer->vtable->LayerEscapePropertyName(layer, pszString); } int msINLINELayerInitializeVirtualTable(layerObj *layer) { assert(layer != NULL); assert(layer->vtable != NULL); /* layer->vtable->LayerInitItemInfo, use default */ /* layer->vtable->LayerFreeItemInfo, use default */ layer->vtable->LayerOpen = msINLINELayerOpen; layer->vtable->LayerIsOpen = msINLINELayerIsOpen; layer->vtable->LayerWhichShapes = msINLINELayerWhichShapes; layer->vtable->LayerNextShape = msINLINELayerNextShape; /* layer->vtable->LayerGetShapeCount, use default */ layer->vtable->LayerGetShape = msINLINELayerGetShape; layer->vtable->LayerClose = msINLINELayerClose; /* layer->vtable->LayerGetItems, use default */ /* * Original code contained following * TODO: need to compute extents */ /* layer->vtable->LayerGetExtent, use default */ /* layer->vtable->LayerGetAutoStyle, use default */ /* layer->vtable->LayerCloseConnection, use default */ layer->vtable->LayerSetTimeFilter = msLayerMakeBackticsTimeFilter; /* layer->vtable->LayerApplyFilterToLayer, use default */ /* layer->vtable->LayerCreateItems, use default */ layer->vtable->LayerGetNumFeatures = msINLINELayerGetNumFeatures; /*layer->vtable->LayerEscapeSQLParam, use default*/ /*layer->vtable->LayerEscapePropertyName, use default*/ /* layer->vtable->LayerEnablePaging, use default */ /* layer->vtable->LayerGetPaging, use default */ return MS_SUCCESS; } mapserver-8.6.0/src/maplegend.c000066400000000000000000001151471511405061000164220ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Legend generation. * Author: Steve Lime and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #define PSF .8 #define VMARGIN 5 /* margin at top and bottom of legend graphic */ #define HMARGIN 5 /* margin at left and right of legend graphic */ static int msDrawGradientSymbol(rendererVTableObj *renderer, imageObj *image_draw, double x_center, double y_center, int width, int height, styleObj *style) { unsigned char *r, *g, *b, *a; symbolObj symbol; rasterBufferObj *rb; symbolStyleObj symbolStyle; int ret; initSymbol(&symbol); rb = (rasterBufferObj *)calloc(1, sizeof(rasterBufferObj)); symbol.pixmap_buffer = rb; rb->type = MS_BUFFER_BYTE_RGBA; rb->width = width; rb->height = height; rb->data.rgba.row_step = rb->width * 4; rb->data.rgba.pixel_step = 4; rb->data.rgba.pixels = (unsigned char *)malloc(sizeof(unsigned char) * rb->width * rb->height * 4); b = rb->data.rgba.b = &rb->data.rgba.pixels[0]; g = rb->data.rgba.g = &rb->data.rgba.pixels[1]; r = rb->data.rgba.r = &rb->data.rgba.pixels[2]; a = rb->data.rgba.a = &rb->data.rgba.pixels[3]; for (unsigned j = 0; j < rb->height; j++) { for (unsigned i = 0; i < rb->width; i++) { msValueToRange(style, style->minvalue + (double)i / rb->width * (style->maxvalue - style->minvalue), MS_COLORSPACE_RGB); b[4 * (j * rb->width + i)] = style->color.blue; g[4 * (j * rb->width + i)] = style->color.green; r[4 * (j * rb->width + i)] = style->color.red; if (strncasecmp(image_draw->format->driver, "AGG/", 4) == 0) { a[4 * (j * rb->width + i)] = 255; // Apply alpha later } else { a[4 * (j * rb->width + i)] = style->color.alpha; } } } INIT_SYMBOL_STYLE(symbolStyle); symbolStyle.color = &style->color; ret = renderer->renderPixmapSymbol(image_draw, x_center, y_center, &symbol, &symbolStyle); msFreeSymbol(&symbol); return ret; } /* * generic function for drawing a legend icon. (added for bug #2348) * renderer specific drawing functions shouldn't be called directly, but through * this function */ int msDrawLegendIcon(mapObj *map, layerObj *lp, classObj *theclass, int width, int height, imageObj *image, int dstX, int dstY, int scale_independant, class_hittest *hittest) { int i, type, hasmarkersymbol, ret = MS_SUCCESS; double offset; double polygon_contraction = 0.5; /* used to account for the width of a polygon's outline */ shapeObj box, zigzag; lineObj box_line, zigzag_line; pointObj box_point[5], zigzag_point[4]; pointObj marker; char szPath[MS_MAXPATHLEN]; styleObj outline_style; imageObj *image_draw = image; rendererVTableObj *renderer; outputFormatObj *transFormat = NULL, *altFormat = NULL; const char *alternativeFormatString = NULL; if (!MS_RENDERER_PLUGIN(image->format)) { msSetError(MS_MISCERR, "unsupported image format", "msDrawLegendIcon()"); return MS_FAILURE; } alternativeFormatString = msLayerGetProcessingKey(lp, "RENDERER"); if (MS_RENDERER_PLUGIN(image_draw->format) && alternativeFormatString != NULL && (altFormat = msSelectOutputFormat(map, alternativeFormatString))) { msInitializeRendererVTable(altFormat); image_draw = msImageCreate( image->width, image->height, altFormat, image->imagepath, image->imageurl, map->resolution, map->defresolution, &map->imagecolor); image_draw->map = map; renderer = MS_IMAGE_RENDERER(image_draw); } else { renderer = MS_IMAGE_RENDERER(image_draw); if (lp->compositer && renderer->compositeRasterBuffer) { image_draw = msImageCreate(image->width, image->height, image->format, image->imagepath, image->imageurl, map->resolution, map->defresolution, NULL); if (!image_draw) { msSetError(MS_MISCERR, "Unable to initialize temporary transparent image.", "msDrawLegendIcon()"); return (MS_FAILURE); } image_draw->map = map; } } if (renderer->supports_clipping && MS_VALID_COLOR(map->legend.outlinecolor)) { /* keep GD specific code here for now as it supports clipping */ rectObj clip; clip.maxx = dstX + width - 1; clip.maxy = dstY + height - 1; clip.minx = dstX; clip.miny = dstY; renderer->setClip(image_draw, clip); } /* if the class has a keyimage, treat it as a point layer * (the keyimage will be treated there) */ if (theclass->keyimage != NULL) { type = MS_LAYER_POINT; } else { /* some polygon layers may be better drawn using zigzag if there is no fill */ type = lp->type; if (type == MS_LAYER_POLYGON) { type = MS_LAYER_LINE; for (i = 0; i < theclass->numstyles; i++) { if (MS_VALID_COLOR(theclass->styles[i]->color)) { /* there is a fill */ type = MS_LAYER_POLYGON; } if (MS_VALID_COLOR( theclass->styles[i]->outlinecolor)) { /* there is an outline */ polygon_contraction = MS_MAX(polygon_contraction, theclass->styles[i]->width / 2.0); } } } } /* initialize the box used for polygons and for outlines */ msInitShape(&box); box.line = &box_line; box.numlines = 1; box.line[0].point = box_point; box.line[0].numpoints = 5; box.type = MS_SHAPE_POLYGON; box.line[0].point[0].x = dstX + polygon_contraction; box.line[0].point[0].y = dstY + polygon_contraction; box.line[0].point[1].x = dstX + width - polygon_contraction; box.line[0].point[1].y = dstY + polygon_contraction; box.line[0].point[2].x = dstX + width - polygon_contraction; box.line[0].point[2].y = dstY + height - polygon_contraction; box.line[0].point[3].x = dstX + polygon_contraction; box.line[0].point[3].y = dstY + height - polygon_contraction; box.line[0].point[4].x = box.line[0].point[0].x; box.line[0].point[4].y = box.line[0].point[0].y; /* ** now draw the appropriate color/symbol/size combination */ /* Scalefactor will be infinity when SIZEUNITS is set in LAYER */ if (lp->sizeunits != MS_PIXELS) { lp->scalefactor = 1.0; } switch (type) { case MS_LAYER_POINT: marker.x = dstX + MS_NINT(width / 2.0); marker.y = dstY + MS_NINT(height / 2.0); if (theclass->keyimage != NULL) { int symbolNum; styleObj imgStyle; symbolObj *symbol = NULL; symbolNum = msAddImageSymbol(&(map->symbolset), msBuildPath(szPath, map->mappath, theclass->keyimage)); if (symbolNum == -1) { msSetError(MS_IMGERR, "Failed to open legend key image", "msCreateLegendIcon()"); return (MS_FAILURE); } symbol = map->symbolset.symbol[symbolNum]; initStyle(&imgStyle); /*set size so that symbol will be scaled properly #3296*/ if (width / symbol->sizex < height / symbol->sizey) imgStyle.size = symbol->sizey * (width / symbol->sizex); else imgStyle.size = symbol->sizey * (height / symbol->sizey); if (imgStyle.size > imgStyle.maxsize) imgStyle.maxsize = imgStyle.size; imgStyle.symbol = symbolNum; ret = msDrawMarkerSymbol(map, image_draw, &marker, &imgStyle, 1.0); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; /* TO DO: we may want to handle this differently depending on the relative * size of the keyimage */ } else { for (i = 0; i < theclass->numstyles; i++) { if (!scale_independant && map->scaledenom > 0) { styleObj *lp = theclass->styles[i]; if ((lp->maxscaledenom > 0) && (map->scaledenom > lp->maxscaledenom)) continue; if ((lp->minscaledenom > 0) && (map->scaledenom <= lp->minscaledenom)) continue; } if (hittest && hittest->stylehits[i].status == 0) continue; ret = msDrawMarkerSymbol(map, image_draw, &marker, theclass->styles[i], lp->scalefactor * image->resolutionfactor); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } } break; case MS_LAYER_LINE: offset = 1; /* To set the offset, we only check the size/width parameter of the first * style */ if (theclass->numstyles > 0) { if (theclass->styles[0]->symbol > 0 && theclass->styles[0]->symbol < map->symbolset.numsymbols && map->symbolset.symbol[theclass->styles[0]->symbol]->type != MS_SYMBOL_SIMPLE) offset = theclass->styles[0]->size / 2; else offset = theclass->styles[0]->width / 2; } msInitShape(&zigzag); zigzag.line = &zigzag_line; zigzag.numlines = 1; zigzag.line[0].point = zigzag_point; zigzag.line[0].numpoints = 4; zigzag.type = MS_SHAPE_LINE; zigzag.line[0].point[0].x = dstX + offset; zigzag.line[0].point[0].y = dstY + height - offset; zigzag.line[0].point[1].x = dstX + MS_NINT(width / 3.0) - 1; zigzag.line[0].point[1].y = dstY + offset; zigzag.line[0].point[2].x = dstX + MS_NINT(2.0 * width / 3.0) - 1; zigzag.line[0].point[2].y = dstY + height - offset; zigzag.line[0].point[3].x = dstX + width - offset; zigzag.line[0].point[3].y = dstY + offset; for (i = 0; i < theclass->numstyles; i++) { if (!scale_independant && map->scaledenom > 0) { styleObj *lp = theclass->styles[i]; if ((lp->maxscaledenom > 0) && (map->scaledenom > lp->maxscaledenom)) continue; if ((lp->minscaledenom > 0) && (map->scaledenom <= lp->minscaledenom)) continue; } if (hittest && hittest->stylehits[i].status == 0) continue; if (theclass->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_NONE || theclass->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT || theclass->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY) { if (theclass->styles[i]->outlinewidth > 0) { /* Swap the style contents to render the outline first, * and then restore the style to render the interior of the line */ msOutlineRenderingPrepareStyle(theclass->styles[i], map, lp, image); ret = msDrawLineSymbol(map, image_draw, &zigzag, theclass->styles[i], lp->scalefactor * image_draw->resolutionfactor); msOutlineRenderingRestoreStyle(theclass->styles[i], map, lp, image); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } ret = msDrawLineSymbol(map, image_draw, &zigzag, theclass->styles[i], lp->scalefactor * image_draw->resolutionfactor); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } else { if (theclass->styles[i]->outlinewidth > 0) { /* Swap the style contents to render the outline first, * and then restore the style to render the interior of the line */ msOutlineRenderingPrepareStyle(theclass->styles[i], map, lp, image); ret = msDrawTransformedShape( map, image_draw, &zigzag, theclass->styles[i], lp->scalefactor * image_draw->resolutionfactor); msOutlineRenderingRestoreStyle(theclass->styles[i], map, lp, image); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } ret = msDrawTransformedShape( map, image_draw, &zigzag, theclass->styles[i], lp->scalefactor * image_draw->resolutionfactor); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } } break; case MS_LAYER_CIRCLE: case MS_LAYER_RASTER: case MS_LAYER_CHART: case MS_LAYER_POLYGON: for (i = 0; i < theclass->numstyles; i++) { if (!scale_independant && map->scaledenom > 0) { styleObj *lp = theclass->styles[i]; if ((lp->maxscaledenom > 0) && (map->scaledenom > lp->maxscaledenom)) continue; if ((lp->minscaledenom > 0) && (map->scaledenom <= lp->minscaledenom)) continue; } if (hittest && hittest->stylehits[i].status == 0) continue; if (theclass->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_NONE || theclass->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT || theclass->styles[i]->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOLY) { if (MS_VALID_COLOR(theclass->styles[i]->mincolor)) { ret = msDrawGradientSymbol( renderer, image_draw, dstX + width / 2., dstY + height / 2.0, width - 2 * polygon_contraction, height - 2 * polygon_contraction, theclass->styles[i]); } else { ret = msDrawShadeSymbol(map, image_draw, &box, theclass->styles[i], lp->scalefactor * image_draw->resolutionfactor); } if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } else { ret = msDrawTransformedShape(map, image_draw, &box, theclass->styles[i], lp->scalefactor); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } } break; default: return MS_FAILURE; break; } /* end symbol drawing */ /* handle label styles */ for (i = 0; i < theclass->numlabels; i++) { labelObj *l = theclass->labels[i]; if (!scale_independant && map->scaledenom > 0) { if (msScaleInBounds(map->scaledenom, l->minscaledenom, l->maxscaledenom)) { int j; for (j = 0; j < l->numstyles; j++) { styleObj *s = l->styles[j]; marker.x = dstX + MS_NINT(width / 2.0); marker.y = dstY + MS_NINT(height / 2.0); if (s->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { ret = msDrawMarkerSymbol(map, image_draw, &marker, s, lp->scalefactor); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } } } } } /* handle "pure" text layers, i.e. layers with no symbology */ hasmarkersymbol = 0; if (theclass->numstyles == 0) { for (i = 0; i < theclass->numlabels; i++) { labelObj *l = theclass->labels[i]; if (!scale_independant && map->scaledenom > 0) { if (msScaleInBounds(map->scaledenom, l->minscaledenom, l->maxscaledenom)) { int j; for (j = 0; j < l->numstyles; j++) { styleObj *s = l->styles[j]; if (s->_geomtransform.type == MS_GEOMTRANSFORM_LABELPOINT) { hasmarkersymbol = 1; } } } } } } else { hasmarkersymbol = 1; } if (!hasmarkersymbol && theclass->numlabels > 0) { textSymbolObj ts; pointObj textstartpt; marker.x = dstX + MS_NINT(width / 2.0); marker.y = dstY + MS_NINT(height / 2.0); initTextSymbol(&ts); msPopulateTextSymbolForLabelAndString( &ts, theclass->labels[0], msStrdup("Az"), lp->scalefactor * image_draw->resolutionfactor, image_draw->resolutionfactor, duplicate_always); ts.label->size = height - 1; ts.rotation = 0; ret = msComputeTextPath(map, &ts); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; textstartpt = get_metrics(&marker, MS_CC, ts.textpath, 0, 0, 0, 0, NULL); ret = msDrawTextSymbol(map, image_draw, textstartpt, &ts); freeTextSymbol(&ts); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; } /* handle an outline if necessary */ if (MS_VALID_COLOR(map->legend.outlinecolor)) { initStyle(&outline_style); outline_style.color = map->legend.outlinecolor; ret = msDrawLineSymbol(map, image_draw, &box, &outline_style, image_draw->resolutionfactor); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; /* reset clipping rectangle */ if (renderer->supports_clipping) renderer->resetClip(image_draw); } if (altFormat) { rendererVTableObj *renderer = MS_IMAGE_RENDERER(image); rendererVTableObj *altrenderer = MS_IMAGE_RENDERER(image_draw); rasterBufferObj rb; memset(&rb, 0, sizeof(rasterBufferObj)); ret = altrenderer->getRasterBufferHandle(image_draw, &rb); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; ret = renderer->mergeRasterBuffer( image, &rb, ((lp->compositer) ? lp->compositer->opacity * 0.01 : 1.0), 0, 0, 0, 0, rb.width, rb.height); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; /* * hack to work around bug #3834: if we have use an alternate renderer, the * symbolset may contain symbols that reference it. We want to remove those * references before the altFormat is destroyed to avoid a segfault and/or a * leak, and so the the main renderer doesn't pick the cache up thinking * it's for him. */ for (i = 0; i < map->symbolset.numsymbols; i++) { if (map->symbolset.symbol[i] != NULL) { symbolObj *s = map->symbolset.symbol[i]; if (s->renderer == altrenderer) { altrenderer->freeSymbol(s); s->renderer = NULL; } } } } else if (image != image_draw) { rendererVTableObj *renderer = MS_IMAGE_RENDERER(image_draw); rasterBufferObj rb; memset(&rb, 0, sizeof(rasterBufferObj)); ret = renderer->getRasterBufferHandle(image_draw, &rb); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; ret = renderer->mergeRasterBuffer( image, &rb, ((lp->compositer) ? lp->compositer->opacity * 0.01 : 1.0), 0, 0, 0, 0, rb.width, rb.height); if (MS_UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup; /* deref and possibly free temporary transparent output format. */ msApplyOutputFormat(&transFormat, NULL, MS_NOOVERRIDE); } legend_icon_cleanup: if (image != image_draw) { msFreeImage(image_draw); } return ret; } imageObj *msCreateLegendIcon(mapObj *map, layerObj *lp, classObj *class, int width, int height, int scale_independant) { imageObj *image; outputFormatObj *format = NULL; rendererVTableObj *renderer = MS_MAP_RENDERER(map); if (!renderer) { msSetError(MS_MISCERR, "invalid map outputformat", "msCreateLegendIcon()"); return (NULL); } /* ensure we have an image format representing the options for the legend */ msApplyOutputFormat(&format, map->outputformat, map->legend.transparent); image = msImageCreate(width, height, format, map->web.imagepath, map->web.imageurl, map->resolution, map->defresolution, &(map->legend.imagecolor)); /* drop this reference to output format */ msApplyOutputFormat(&format, NULL, MS_NOOVERRIDE); if (image == NULL) { msSetError(MS_IMGERR, "Unable to initialize image.", "msCreateLegendIcon()"); return (NULL); } image->map = map; /* Call drawLegendIcon with destination (0, 0) */ /* Return an empty image if lp==NULL || class=NULL */ /* (If class is NULL draw the legend for all classes. Modifications done */ /* Fev 2004 by AY) */ if (lp) { if (class) { if (MS_UNLIKELY(MS_FAILURE == msDrawLegendIcon(map, lp, class, width, height, image, 0, 0, scale_independant, NULL))) { msFreeImage(image); return NULL; } } else { for (int i = 0; i < lp->numclasses; i++) { if (MS_UNLIKELY(MS_FAILURE == msDrawLegendIcon(map, lp, lp->class[i], width, height, image, 0, 0, scale_independant, NULL))) { msFreeImage(image); return NULL; } } } } return image; } /* * Calculates the optimal size for the legend. If the optional layerObj * argument is given, the legend size will be calculated for only that * layer. Otherwise, the legend size is calculated for all layers that * are not MS_OFF or of MS_LAYER_QUERY type. * * Returns one of: * MS_SUCCESS * MS_FAILURE */ int msLegendCalcSize(mapObj *map, int scale_independent, int *size_x, int *size_y, int *layer_index, int num_layers, map_hittest *hittest, double resolutionfactor) { int i, j; int status, maxwidth = 0, nLegendItems = 0; char *text; layerObj *lp; rectObj rect; int current_layers = 0; /* reset sizes */ *size_x = 0; *size_y = 0; /* enable scale-dependent calculations */ if (!scale_independent) { map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); status = msCalculateScale(map->extent, map->units, map->width, map->height, map->resolution, &map->scaledenom); if (status != MS_SUCCESS) return MS_FAILURE; } /* * step through all map classes, and for each one that will be displayed * calculate the label size */ if (layer_index != NULL && num_layers > 0) current_layers = num_layers; else current_layers = map->numlayers; for (i = 0; i < current_layers; i++) { int layerindex; if (layer_index != NULL && num_layers > 0) layerindex = layer_index[i]; else layerindex = map->layerorder[i]; lp = (GET_LAYER(map, layerindex)); if ((lp->status == MS_OFF && (layer_index == NULL || num_layers <= 0)) || (lp->type == MS_LAYER_QUERY)) /* skip it */ continue; if (hittest && hittest->layerhits[layerindex].status == 0) continue; if (!scale_independent && map->scaledenom > 0) { if ((lp->maxscaledenom > 0) && (map->scaledenom > lp->maxscaledenom)) continue; if ((lp->minscaledenom > 0) && (map->scaledenom <= lp->minscaledenom)) continue; } for (j = lp->numclasses - 1; j >= 0; j--) { textSymbolObj ts; text = lp->class[j]->title ? lp->class[j]->title : lp->class[j]->name; /* point to the right legend text, title takes precedence */ if (!text) continue; /* skip it */ /* skip the class if the classgroup is defined */ if (lp->classgroup && (lp->class[j] -> group == NULL || strcasecmp(lp->class[j] -> group, lp -> classgroup) != 0)) continue; /* verify class scale */ if (!scale_independent && map->scaledenom > 0) { if ((lp->class[j] -> maxscaledenom > 0) && (map->scaledenom > lp->class[j] -> maxscaledenom)) continue; if ((lp->class[j] -> minscaledenom > 0) && (map->scaledenom <= lp->class[j] -> minscaledenom)) continue; } if (hittest && hittest->layerhits[layerindex].classhits[j].status == 0) continue; if (*text) { initTextSymbol(&ts); msPopulateTextSymbolForLabelAndString(&ts, &map->legend.label, msStrdup(text), resolutionfactor, resolutionfactor, 0); if (MS_UNLIKELY(MS_FAILURE == msGetTextSymbolSize(map, &ts, &rect))) { freeTextSymbol(&ts); return MS_FAILURE; } freeTextSymbol(&ts); maxwidth = MS_MAX(maxwidth, MS_NINT(rect.maxx - rect.minx)); *size_y += MS_MAX(MS_NINT(rect.maxy - rect.miny), map->legend.keysizey); } else { *size_y += map->legend.keysizey; } nLegendItems++; } } /* Calculate the size of the legend: */ /* - account for the Y keyspacing */ *size_y += (2 * VMARGIN) + ((nLegendItems - 1) * map->legend.keyspacingy); /* - determine the legend width */ *size_x = (2 * HMARGIN) + maxwidth + map->legend.keyspacingx + map->legend.keysizex; if (*size_y <= 0 || *size_x <= 0) return MS_FAILURE; return MS_SUCCESS; } /* ** Creates a GD image of a legend for a specific map. msDrawLegend() ** respects the current scale, and classes without a name are not ** added to the legend. ** ** scale_independent is used for WMS GetLegendGraphic. It should be set to ** MS_FALSE in most cases. If it is set to MS_TRUE then the layers' minscale ** and maxscale are ignored and layers that are currently out of scale still ** show up in the legend. */ imageObj *msDrawLegend(mapObj *map, int scale_independent, map_hittest *hittest) { int i, j, ret = MS_SUCCESS; /* loop counters */ pointObj pnt; int size_x, size_y = 0; layerObj *lp; rectObj rect; imageObj *image = NULL; outputFormatObj *format = NULL; char *text; struct legend_struct { int height; textSymbolObj ts; int layerindex, classindex; struct legend_struct *pred; }; typedef struct legend_struct legendlabel; legendlabel *head = NULL; if (!MS_RENDERER_PLUGIN(map->outputformat)) { msSetError(MS_MISCERR, "unsupported output format", "msDrawLegend()"); return NULL; } if (msValidateContexts(map) != MS_SUCCESS) return NULL; /* make sure there are no recursive REQUIRES or LABELREQUIRES expressions */ if (msLegendCalcSize(map, scale_independent, &size_x, &size_y, NULL, 0, hittest, map->resolution / map->defresolution) != MS_SUCCESS) return NULL; /* * step through all map classes, and for each one that will be displayed * keep a reference to its label size and text */ for (i = 0; i < map->numlayers; i++) { lp = (GET_LAYER(map, map->layerorder[i])); if ((lp->status == MS_OFF) || (lp->type == MS_LAYER_QUERY)) /* skip it */ continue; if (hittest && hittest->layerhits[map->layerorder[i]].status == 0) continue; if (!scale_independent && map->scaledenom > 0) { if ((lp->maxscaledenom > 0) && (map->scaledenom > lp->maxscaledenom)) continue; if ((lp->minscaledenom > 0) && (map->scaledenom <= lp->minscaledenom)) continue; } if (!scale_independent && lp->maxscaledenom <= 0 && lp->minscaledenom <= 0) { if ((lp->maxgeowidth > 0) && ((map->extent.maxx - map->extent.minx) > lp->maxgeowidth)) continue; if ((lp->mingeowidth > 0) && ((map->extent.maxx - map->extent.minx) < lp->mingeowidth)) continue; } /* set the scale factor so that scale dependent symbols are drawn in the * legend with their default size */ if (lp->sizeunits != MS_PIXELS) { map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); lp->scalefactor = (msInchesPerUnit(lp->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / map->cellsize; } for (j = lp->numclasses - 1; j >= 0; j--) { text = lp->class[j]->title ? lp->class[j]->title : lp->class[j]->name; /* point to the right legend text, title takes precedence */ if (!text) continue; /* skip it */ /* skip the class if the classgroup is defined */ if (lp->classgroup && (lp->class[j] -> group == NULL || strcasecmp(lp->class[j] -> group, lp -> classgroup) != 0)) continue; if (!scale_independent && map->scaledenom > 0) { /* verify class scale here */ if ((lp->class[j] -> maxscaledenom > 0) && (map->scaledenom > lp->class[j] -> maxscaledenom)) continue; if ((lp->class[j] -> minscaledenom > 0) && (map->scaledenom <= lp->class[j] -> minscaledenom)) continue; } if (hittest && hittest->layerhits[map->layerorder[i]].classhits[j].status == 0) { continue; } legendlabel *cur = (legendlabel *)msSmallMalloc(sizeof(legendlabel)); initTextSymbol(&cur->ts); if (*text) { msPopulateTextSymbolForLabelAndString( &cur->ts, &map->legend.label, msStrdup(text), map->resolution / map->defresolution, map->resolution / map->defresolution, 0); if (MS_UNLIKELY(MS_FAILURE == msComputeTextPath(map, &cur->ts))) { ret = MS_FAILURE; goto cleanup; } if (MS_UNLIKELY(MS_FAILURE == msGetTextSymbolSize(map, &cur->ts, &rect))) { ret = MS_FAILURE; goto cleanup; } cur->height = MS_MAX(MS_NINT(rect.maxy - rect.miny), map->legend.keysizey); } else { cur->height = map->legend.keysizey; } cur->classindex = j; cur->layerindex = map->layerorder[i]; cur->pred = head; head = cur; } } /* ensure we have an image format representing the options for the legend. */ msApplyOutputFormat(&format, map->outputformat, map->legend.transparent); /* initialize the legend image */ image = msImageCreate(size_x, size_y, format, map->web.imagepath, map->web.imageurl, map->resolution, map->defresolution, &map->legend.imagecolor); if (!image) { msSetError(MS_MISCERR, "Unable to initialize image.", "msDrawLegend()"); return NULL; } image->map = map; /* image = * renderer->createImage(size_x,size_y,format,&(map->legend.imagecolor)); */ /* drop this reference to output format */ msApplyOutputFormat(&format, NULL, MS_NOOVERRIDE); pnt.y = VMARGIN; pnt.x = HMARGIN + map->legend.keysizex + map->legend.keyspacingx; while (head) { /* head initially points on the last legend item, i.e. the one that should be at the top */ legendlabel *cur = head; class_hittest *ch = NULL; /* set the scale factor so that scale dependent symbols are drawn in the * legend with their default size */ if (map->layers[cur->layerindex]->sizeunits != MS_PIXELS) { map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); map->layers[cur->layerindex]->scalefactor = (msInchesPerUnit(map->layers[cur->layerindex]->sizeunits, 0) / msInchesPerUnit(map->units, 0)) / map->cellsize; } if (hittest) { ch = &hittest->layerhits[cur->layerindex].classhits[cur->classindex]; } ret = msDrawLegendIcon(map, map->layers[cur->layerindex], map->layers[cur->layerindex]->class[cur->classindex], map -> legend.keysizex, map->legend.keysizey, image, HMARGIN, (int)pnt.y, scale_independent, ch); if (MS_UNLIKELY(ret != MS_SUCCESS)) goto cleanup; pnt.y += cur->height; if (cur->ts.annotext) { pointObj textPnt = pnt; textPnt.y -= cur->ts.textpath->bounds.bbox.maxy; textPnt.y += map->legend.label.offsety; textPnt.x += map->legend.label.offsetx; ret = msDrawTextSymbol(map, image, textPnt, &cur->ts); if (MS_UNLIKELY(ret == MS_FAILURE)) goto cleanup; /* Coverity Scan is confused by label refcount, and wrongly believe we */ /* might free &map->legend.label, so make it clear we won't */ freeTextSymbolEx(&cur->ts, MS_FALSE); MS_REFCNT_DECR(cur->ts.label); } pnt.y += map->legend.keyspacingy; /* bump y for next label */ /* clean up */ head = cur->pred; free(cur); } /* next legend */ cleanup: while (head) { legendlabel *cur = head; /* Coverity Scan is confused by label refcount, and wrongly believe we */ /* might free &map->legend.label, so make it clear we won't */ freeTextSymbolEx(&cur->ts, MS_FALSE); MS_REFCNT_DECR(cur->ts.label); head = cur->pred; free(cur); } if (MS_UNLIKELY(ret != MS_SUCCESS)) { if (image) msFreeImage(image); return NULL; } return (image); } /* TODO */ int msEmbedLegend(mapObj *map, imageObj *img) { pointObj point; imageObj *image = NULL; symbolObj *legendSymbol; char *imageType = NULL; const char *const LEGEND_SYMBOL_NAME = "legend"; rendererVTableObj *renderer; int symbolIdx = msGetSymbolIndex(&(map->symbolset), LEGEND_SYMBOL_NAME, MS_FALSE); if (symbolIdx != -1) msRemoveSymbol(&(map->symbolset), symbolIdx); /* solves some caching issues in AGG with long-running processes */ if (msGrowSymbolSet(&map->symbolset) == NULL) return -1; symbolIdx = map->symbolset.numsymbols; legendSymbol = map->symbolset.symbol[symbolIdx]; map->symbolset.numsymbols++; initSymbol(legendSymbol); if (!MS_RENDERER_PLUGIN(map->outputformat) || !MS_MAP_RENDERER(map)->supports_pixel_buffer) { imageType = msStrdup(map->imagetype); /* save format */ if MS_DRIVER_CAIRO (map->outputformat) map->outputformat = msSelectOutputFormat(map, "cairopng"); else map->outputformat = msSelectOutputFormat(map, "png"); msInitializeRendererVTable(map->outputformat); } renderer = MS_MAP_RENDERER(map); /* render the legend. */ image = msDrawLegend(map, MS_FALSE, NULL); if (image == NULL) { msFree(imageType); return MS_FAILURE; } if (imageType) { map->outputformat = msSelectOutputFormat(map, imageType); /* restore format */ msFree(imageType); } /* copy renderered legend image into symbol */ legendSymbol->pixmap_buffer = calloc(1, sizeof(rasterBufferObj)); MS_CHECK_ALLOC(legendSymbol->pixmap_buffer, sizeof(rasterBufferObj), MS_FAILURE); if (MS_SUCCESS != renderer->getRasterBufferCopy(image, legendSymbol->pixmap_buffer)) return MS_FAILURE; legendSymbol->renderer = renderer; msFreeImage(image); if (!legendSymbol->pixmap_buffer) return (MS_FAILURE); /* something went wrong creating scalebar */ legendSymbol->type = MS_SYMBOL_PIXMAP; /* initialize a few things */ legendSymbol->name = msStrdup(LEGEND_SYMBOL_NAME); legendSymbol->sizex = legendSymbol->pixmap_buffer->width; legendSymbol->sizey = legendSymbol->pixmap_buffer->height; /* I'm not too sure this test is sufficient ... NFW. */ /* if(map->legend.transparent == MS_ON) */ /* gdImageColorTransparent(legendSymbol->img_deprecated, 0); */ switch (map->legend.position) { case (MS_LL): point.x = MS_NINT(legendSymbol->sizex / 2.0); point.y = map->height - MS_NINT(legendSymbol->sizey / 2.0); break; case (MS_LR): point.x = map->width - MS_NINT(legendSymbol->sizex / 2.0); point.y = map->height - MS_NINT(legendSymbol->sizey / 2.0); break; case (MS_LC): point.x = MS_NINT(map->width / 2.0); point.y = map->height - MS_NINT(legendSymbol->sizey / 2.0); break; case (MS_UR): point.x = map->width - MS_NINT(legendSymbol->sizex / 2.0); point.y = MS_NINT(legendSymbol->sizey / 2.0); break; case (MS_UL): point.x = MS_NINT(legendSymbol->sizex / 2.0); point.y = MS_NINT(legendSymbol->sizey / 2.0); break; case (MS_UC): point.x = MS_NINT(map->width / 2.0); point.y = MS_NINT(legendSymbol->sizey / 2.0); break; } const char *const EMBED_LEGEND_LAYER_NAME = "__embed__legend"; int layerIdx = msGetLayerIndex(map, EMBED_LEGEND_LAYER_NAME); if (layerIdx == -1) { if (msGrowMapLayers(map) == NULL) return (-1); layerIdx = map->numlayers; map->numlayers++; layerObj *layer = GET_LAYER(map, layerIdx); if (initLayer(layer, map) == -1) return (-1); layer->name = msStrdup(EMBED_LEGEND_LAYER_NAME); layer->type = MS_LAYER_POINT; if (msGrowLayerClasses(layer) == NULL) return (-1); if (initClass(layer->class[0]) == -1) return (-1); layer->numclasses = 1; /* so we make sure to free it */ /* update the layer order list with the layer's index. */ map->layerorder[layerIdx] = layerIdx; } layerObj *layer = GET_LAYER(map, layerIdx); layer->status = MS_ON; classObj *klass = layer->class[0]; if (map->legend.postlabelcache) { /* add it directly to the image */ if (MS_UNLIKELY(msMaybeAllocateClassStyle(klass, 0) == MS_FAILURE)) return MS_FAILURE; klass->styles[0]->symbol = symbolIdx; if (MS_UNLIKELY(MS_FAILURE == msDrawMarkerSymbol(map, img, &point, klass->styles[0], 1.0))) return MS_FAILURE; } else { if (!klass->labels) { if (msGrowClassLabels(klass) == NULL) return MS_FAILURE; labelObj *label = klass->labels[0]; initLabel(label); klass->numlabels = 1; label->force = MS_TRUE; label->size = MS_MEDIUM; /* must set a size to have a valid label definition */ label->priority = MS_MAX_LABEL_PRIORITY; } labelObj *label = klass->labels[0]; if (label->numstyles == 0) { if (msGrowLabelStyles(label) == NULL) return (MS_FAILURE); label->numstyles = 1; initStyle(label->styles[0]); label->styles[0]->_geomtransform.type = MS_GEOMTRANSFORM_LABELPOINT; } label->styles[0]->symbol = symbolIdx; if (MS_UNLIKELY(MS_FAILURE == msAddLabel(map, img, label, layerIdx, 0, NULL, &point, -1, NULL))) return MS_FAILURE; } /* Mark layer as deleted so that it doesn't interfere with html legends or * with saving maps */ layer->status = MS_DELETE; return MS_SUCCESS; } mapserver-8.6.0/src/maplexer.c000066400000000000000000005606161511405061000163100ustar00rootroot00000000000000#line 2 "src/maplexer.c" #line 4 "src/maplexer.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define yy_create_buffer msyy_create_buffer #define yy_delete_buffer msyy_delete_buffer #define yy_scan_buffer msyy_scan_buffer #define yy_scan_string msyy_scan_string #define yy_scan_bytes msyy_scan_bytes #define yy_init_buffer msyy_init_buffer #define yy_flush_buffer msyy_flush_buffer #define yy_load_buffer_state msyy_load_buffer_state #define yy_switch_to_buffer msyy_switch_to_buffer #define yypush_buffer_state msyypush_buffer_state #define yypop_buffer_state msyypop_buffer_state #define yyensure_buffer_stack msyyensure_buffer_stack #define yy_flex_debug msyy_flex_debug #define yyin msyyin #define yyleng msyyleng #define yylex msyylex #define yylineno msyylineno #define yyout msyyout #define yyrestart msyyrestart #define yytext msyytext #define yywrap msyywrap #define yyalloc msyyalloc #define yyrealloc msyyrealloc #define yyfree msyyfree #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 6 #define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif #ifdef yy_create_buffer #define msyy_create_buffer_ALREADY_DEFINED #else #define yy_create_buffer msyy_create_buffer #endif #ifdef yy_delete_buffer #define msyy_delete_buffer_ALREADY_DEFINED #else #define yy_delete_buffer msyy_delete_buffer #endif #ifdef yy_scan_buffer #define msyy_scan_buffer_ALREADY_DEFINED #else #define yy_scan_buffer msyy_scan_buffer #endif #ifdef yy_scan_string #define msyy_scan_string_ALREADY_DEFINED #else #define yy_scan_string msyy_scan_string #endif #ifdef yy_scan_bytes #define msyy_scan_bytes_ALREADY_DEFINED #else #define yy_scan_bytes msyy_scan_bytes #endif #ifdef yy_init_buffer #define msyy_init_buffer_ALREADY_DEFINED #else #define yy_init_buffer msyy_init_buffer #endif #ifdef yy_flush_buffer #define msyy_flush_buffer_ALREADY_DEFINED #else #define yy_flush_buffer msyy_flush_buffer #endif #ifdef yy_load_buffer_state #define msyy_load_buffer_state_ALREADY_DEFINED #else #define yy_load_buffer_state msyy_load_buffer_state #endif #ifdef yy_switch_to_buffer #define msyy_switch_to_buffer_ALREADY_DEFINED #else #define yy_switch_to_buffer msyy_switch_to_buffer #endif #ifdef yypush_buffer_state #define msyypush_buffer_state_ALREADY_DEFINED #else #define yypush_buffer_state msyypush_buffer_state #endif #ifdef yypop_buffer_state #define msyypop_buffer_state_ALREADY_DEFINED #else #define yypop_buffer_state msyypop_buffer_state #endif #ifdef yyensure_buffer_stack #define msyyensure_buffer_stack_ALREADY_DEFINED #else #define yyensure_buffer_stack msyyensure_buffer_stack #endif #ifdef yylex #define msyylex_ALREADY_DEFINED #else #define yylex msyylex #endif #ifdef yyrestart #define msyyrestart_ALREADY_DEFINED #else #define yyrestart msyyrestart #endif #ifdef yylex_init #define msyylex_init_ALREADY_DEFINED #else #define yylex_init msyylex_init #endif #ifdef yylex_init_extra #define msyylex_init_extra_ALREADY_DEFINED #else #define yylex_init_extra msyylex_init_extra #endif #ifdef yylex_destroy #define msyylex_destroy_ALREADY_DEFINED #else #define yylex_destroy msyylex_destroy #endif #ifdef yyget_debug #define msyyget_debug_ALREADY_DEFINED #else #define yyget_debug msyyget_debug #endif #ifdef yyset_debug #define msyyset_debug_ALREADY_DEFINED #else #define yyset_debug msyyset_debug #endif #ifdef yyget_extra #define msyyget_extra_ALREADY_DEFINED #else #define yyget_extra msyyget_extra #endif #ifdef yyset_extra #define msyyset_extra_ALREADY_DEFINED #else #define yyset_extra msyyset_extra #endif #ifdef yyget_in #define msyyget_in_ALREADY_DEFINED #else #define yyget_in msyyget_in #endif #ifdef yyset_in #define msyyset_in_ALREADY_DEFINED #else #define yyset_in msyyset_in #endif #ifdef yyget_out #define msyyget_out_ALREADY_DEFINED #else #define yyget_out msyyget_out #endif #ifdef yyset_out #define msyyset_out_ALREADY_DEFINED #else #define yyset_out msyyset_out #endif #ifdef yyget_leng #define msyyget_leng_ALREADY_DEFINED #else #define yyget_leng msyyget_leng #endif #ifdef yyget_text #define msyyget_text_ALREADY_DEFINED #else #define yyget_text msyyget_text #endif #ifdef yyget_lineno #define msyyget_lineno_ALREADY_DEFINED #else #define yyget_lineno msyyget_lineno #endif #ifdef yyset_lineno #define msyyset_lineno_ALREADY_DEFINED #else #define yyset_lineno msyyset_lineno #endif #ifdef yywrap #define msyywrap_ALREADY_DEFINED #else #define yywrap msyywrap #endif #ifdef yyalloc #define msyyalloc_ALREADY_DEFINED #else #define yyalloc msyyalloc #endif #ifdef yyrealloc #define msyyrealloc_ALREADY_DEFINED #else #define yyrealloc msyyrealloc #endif #ifdef yyfree #define msyyfree_ALREADY_DEFINED #else #define yyfree msyyfree #endif #ifdef yytext #define msyytext_ALREADY_DEFINED #else #define yytext msyytext #endif #ifdef yyleng #define msyyleng_ALREADY_DEFINED #else #define yyleng msyyleng #endif #ifdef yyin #define msyyin_ALREADY_DEFINED #else #define yyin msyyin #endif #ifdef yyout #define msyyout_ALREADY_DEFINED #else #define yyout msyyout #endif #ifdef yy_flex_debug #define msyy_flex_debug_ALREADY_DEFINED #else #define yy_flex_debug msyy_flex_debug #endif #ifdef yylineno #define msyylineno_ALREADY_DEFINED #else #define yylineno msyylineno #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #ifndef SIZE_MAX #define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ /* TODO: this is always defined, so inline it */ #define yyconst const #if defined(__GNUC__) && __GNUC__ >= 3 #define yynoreturn __attribute__((__noreturn__)) #else #define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an * integer in range [0..255] for use as an array index. */ #define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = (yy_hold_char); \ YY_RESTORE_YY_MORE_OFFSET \ (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ int yyleng; /* Points to current character in buffer. */ static char *yy_c_buf_p = NULL; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* Flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; void yyrestart ( FILE *input_file ); void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); void yy_delete_buffer ( YY_BUFFER_STATE b ); void yy_flush_buffer ( YY_BUFFER_STATE b ); void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); void yypop_buffer_state ( void ); static void yyensure_buffer_stack ( void ); static void yy_load_buffer_state ( void ); static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); #define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ); void *yyalloc ( yy_size_t ); void *yyrealloc ( void *, yy_size_t ); void yyfree ( void * ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ typedef flex_uint8_t YY_CHAR; FILE *yyin = NULL, *yyout = NULL; typedef int yy_state_type; extern int yylineno; int yylineno = 1; extern char *yytext; #ifdef yytext_ptr #undef yytext_ptr #endif #define yytext_ptr yytext static yy_state_type yy_get_previous_state ( void ); static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); static int yy_get_next_buffer ( void ); static void yynoreturn yy_fatal_error ( const char* msg ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; #define YY_NUM_RULES 348 #define YY_END_OF_BUFFER 349 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static const flex_int16_t yy_accept[1760] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 346, 1, 344, 337, 2, 346, 346, 330, 343, 330, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 346, 346, 346, 347, 1, 345, 1, 14, 342, 347, 342, 347, 331, 331, 18, 15, 17, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 345, 21, 345, 348, 1, 348, 348, 340, 338, 338, 339, 5, 7, 6, 343, 343, 343, 343, 343, 1, 2, 0, 335, 330, 330, 343, 330, 343, 0, 3, 343, 2, 330, 0, 343, 343, 343, 343, 343, 343, 343, 343, 247, 343, 343, 343, 251, 343, 252, 343, 343, 257, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 271, 343, 343, 274, 275, 343, 343, 343, 343, 343, 343, 343, 343, 343, 287, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 224, 343, 343, 314, 315, 343, 316, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 0, 323, 0, 336, 0, 16, 0, 13, 0, 331, 331, 331, 0, 331, 0, 20, 22, 15, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 19, 17, 24, 0, 20, 0, 18, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 332, 23, 0, 341, 0, 340, 338, 338, 339, 5, 4, 2, 343, 343, 343, 343, 330, 0, 0, 343, 330, 0, 334, 343, 334, 2, 2, 2, 330, 0, 0, 330, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 253, 343, 343, 343, 343, 343, 343, 343, 343, 88, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 104, 343, 343, 343, 343, 343, 343, 343, 343, 343, 266, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 143, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 284, 285, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 308, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 237, 321, 343, 239, 322, 343, 68, 0, 0, 0, 0, 0, 0, 0, 331, 331, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 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, 332, 2, 343, 9, 343, 343, 330, 333, 333, 2, 2, 0, 330, 343, 343, 343, 343, 343, 242, 343, 343, 343, 343, 343, 343, 343, 246, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 83, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 261, 343, 343, 343, 343, 99, 343, 343, 343, 103, 343, 343, 343, 106, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 122, 343, 343, 343, 343, 343, 343, 343, 343, 343, 272, 343, 273, 343, 146, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 176, 343, 282, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 208, 343, 343, 343, 343, 343, 343, 343, 219, 343, 310, 343, 343, 343, 343, 312, 231, 343, 343, 343, 343, 343, 343, 343, 343, 343, 240, 328, 328, 0, 331, 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, 56, 0, 0, 0, 0, 0, 329, 0, 343, 10, 343, 2, 61, 343, 63, 343, 343, 243, 343, 343, 244, 343, 343, 343, 343, 343, 343, 249, 343, 72, 343, 76, 343, 343, 343, 343, 343, 343, 84, 343, 343, 343, 343, 259, 86, 343, 89, 343, 343, 343, 260, 343, 343, 343, 343, 343, 343, 343, 101, 343, 343, 263, 343, 343, 109, 264, 343, 343, 343, 111, 343, 343, 119, 343, 343, 187, 343, 343, 343, 343, 343, 126, 270, 343, 136, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 279, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 280, 343, 255, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 294, 343, 343, 343, 343, 343, 343, 343, 343, 298, 343, 343, 343, 343, 343, 343, 343, 343, 301, 302, 201, 343, 343, 343, 343, 343, 343, 306, 343, 343, 211, 343, 217, 343, 343, 343, 343, 223, 343, 343, 343, 343, 317, 232, 343, 343, 343, 343, 343, 343, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 43, 0, 0, 0, 31, 42, 0, 29, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 343, 343, 343, 343, 343, 343, 343, 343, 245, 343, 70, 248, 343, 250, 343, 343, 343, 343, 343, 343, 79, 343, 80, 343, 343, 343, 343, 343, 85, 343, 343, 343, 343, 91, 343, 343, 95, 96, 343, 262, 343, 98, 343, 343, 343, 343, 110, 267, 343, 343, 343, 343, 343, 343, 268, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 135, 137, 138, 343, 343, 144, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 276, 343, 277, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 283, 177, 343, 343, 343, 343, 343, 343, 343, 343, 343, 293, 292, 297, 186, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 299, 343, 196, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 304, 305, 343, 307, 210, 343, 213, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 236, 320, 53, 34, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 50, 0, 0, 0, 329, 8, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 75, 343, 343, 343, 343, 319, 343, 256, 343, 258, 343, 343, 343, 343, 94, 343, 343, 100, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 118, 343, 343, 343, 343, 124, 343, 343, 343, 343, 343, 343, 343, 343, 343, 140, 343, 343, 147, 343, 343, 343, 343, 343, 343, 343, 343, 156, 343, 343, 343, 343, 343, 162, 343, 343, 343, 343, 343, 343, 172, 343, 343, 343, 343, 343, 178, 343, 179, 343, 343, 343, 343, 185, 343, 343, 295, 343, 296, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 222, 343, 343, 343, 343, 343, 233, 234, 343, 343, 0, 28, 0, 49, 41, 0, 0, 54, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 47, 0, 0, 324, 11, 343, 343, 343, 343, 343, 67, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 87, 343, 343, 93, 343, 343, 343, 343, 343, 107, 227, 343, 343, 343, 343, 117, 343, 343, 343, 123, 343, 343, 343, 343, 343, 343, 343, 343, 343, 141, 343, 343, 343, 343, 343, 343, 343, 343, 152, 343, 343, 159, 160, 161, 343, 343, 343, 343, 343, 169, 343, 343, 175, 281, 343, 343, 343, 343, 343, 343, 343, 184, 343, 343, 188, 343, 343, 190, 343, 343, 343, 194, 343, 343, 343, 343, 343, 198, 343, 203, 343, 343, 303, 343, 343, 343, 343, 343, 343, 343, 218, 116, 343, 221, 343, 343, 343, 311, 313, 318, 343, 0, 51, 0, 46, 33, 55, 0, 0, 0, 48, 36, 0, 27, 0, 0, 343, 343, 64, 343, 66, 343, 71, 228, 343, 73, 343, 343, 78, 343, 59, 343, 343, 92, 343, 343, 343, 343, 108, 343, 114, 115, 113, 343, 121, 343, 343, 343, 343, 343, 129, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 155, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 60, 343, 195, 343, 343, 343, 343, 343, 343, 343, 207, 209, 212, 343, 216, 220, 225, 230, 343, 343, 0, 0, 0, 0, 0, 0, 39, 0, 0, 343, 241, 343, 343, 74, 58, 77, 81, 343, 90, 97, 286, 343, 343, 112, 120, 343, 125, 269, 127, 343, 343, 343, 343, 343, 343, 145, 148, 343, 343, 343, 343, 343, 343, 343, 343, 163, 343, 343, 343, 343, 343, 343, 343, 343, 343, 288, 343, 343, 343, 343, 343, 343, 254, 343, 191, 192, 343, 343, 197, 343, 199, 202, 204, 343, 206, 343, 343, 343, 235, 40, 35, 38, 45, 44, 37, 0, 0, 62, 343, 343, 343, 343, 343, 343, 343, 343, 128, 343, 343, 343, 343, 343, 149, 150, 154, 151, 343, 343, 343, 158, 164, 343, 171, 168, 343, 343, 174, 343, 289, 343, 343, 343, 343, 291, 309, 343, 193, 300, 343, 205, 214, 343, 229, 0, 0, 343, 69, 343, 343, 343, 102, 343, 343, 343, 343, 343, 139, 343, 343, 343, 157, 343, 343, 173, 343, 343, 181, 182, 183, 343, 343, 343, 343, 0, 0, 343, 343, 343, 200, 105, 265, 130, 132, 134, 343, 343, 153, 343, 170, 278, 290, 343, 343, 343, 343, 0, 0, 343, 343, 82, 343, 343, 343, 343, 167, 189, 165, 343, 226, 0, 325, 65, 343, 343, 343, 142, 166, 343, 326, 343, 343, 343, 215, 180, 343, 343, 131, 133, 0 } ; static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 6, 7, 1, 1, 8, 9, 10, 11, 12, 13, 1, 14, 15, 16, 17, 17, 18, 17, 17, 17, 17, 17, 17, 17, 1, 1, 19, 20, 21, 1, 1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 1, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 83, 1, 1, 1, 84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 85, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const YY_CHAR yy_meta[87] = { 0, 1, 1, 2, 1, 1, 3, 1, 1, 3, 1, 1, 4, 1, 5, 5, 5, 5, 5, 1, 5, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 3, 1, 5, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const flex_int16_t yy_base[1785] = { 0, 0, 0, 86, 0, 171, 172, 173, 177, 181, 182, 226, 0, 1410, 3994, 185, 3994, 3994, 0, 1398, 173, 296, 353, 310, 304, 353, 416, 359, 354, 421, 436, 356, 467, 156, 290, 474, 473, 354, 483, 532, 275, 533, 579, 585, 540, 374, 631, 0, 1333, 1301, 1276, 3994, 193, 3994, 194, 1261, 1223, 1200, 1146, 184, 314, 611, 183, 188, 1170, 424, 479, 521, 615, 280, 644, 575, 284, 299, 628, 624, 636, 306, 637, 355, 343, 367, 678, 157, 1009, 1007, 3994, 3994, 208, 1008, 1000, 0, 411, 418, 475, 0, 3994, 910, 824, 473, 477, 492, 484, 209, 0, 769, 748, 690, 704, 0, 706, 201, 732, 3994, 763, 849, 720, 203, 531, 759, 525, 649, 524, 645, 551, 686, 0, 685, 703, 687, 756, 755, 0, 686, 690, 0, 727, 725, 758, 769, 771, 754, 760, 766, 781, 769, 782, 836, 769, 771, 774, 841, 851, 823, 852, 843, 852, 855, 895, 853, 850, 844, 849, 899, 0, 915, 849, 0, 0, 907, 898, 924, 852, 846, 907, 925, 866, 909, 929, 939, 940, 922, 943, 927, 936, 943, 968, 969, 961, 967, 1007, 972, 964, 988, 978, 995, 1015, 998, 979, 1000, 995, 990, 1002, 1023, 1026, 994, 1042, 1006, 0, 0, 1030, 0, 1036, 1030, 1037, 1049, 1056, 1042, 1058, 1044, 1046, 1065, 695, 3994, 652, 618, 603, 3994, 522, 3994, 573, 1079, 1094, 1104, 316, 1106, 451, 3994, 3994, 3994, 3994, 1077, 1080, 1061, 1081, 1084, 1091, 1091, 1093, 1102, 1101, 1092, 1102, 1101, 1105, 1108, 3994, 1114, 1102, 1111, 1103, 3994, 1107, 3994, 1111, 1127, 1112, 1130, 1131, 1128, 1127, 1144, 1141, 632, 1165, 1166, 1160, 585, 575, 274, 3994, 3994, 613, 3994, 575, 0, 3994, 3994, 3994, 0, 3994, 1220, 1157, 1192, 1166, 1163, 1220, 722, 189, 207, 326, 564, 1179, 1306, 1181, 627, 1392, 1478, 1226, 1236, 559, 724, 1186, 1218, 1218, 1219, 1226, 1221, 1226, 1234, 1234, 1236, 1228, 1219, 1237, 1224, 1226, 1258, 1296, 1281, 1286, 1293, 1293, 1304, 0, 1310, 1291, 1314, 1291, 1305, 1311, 1297, 1304, 0, 1305, 1303, 1317, 1374, 1303, 1305, 1379, 1306, 1315, 1308, 1309, 1382, 1381, 0, 1383, 1383, 1378, 1396, 1380, 1399, 1399, 1395, 1391, 0, 1399, 1399, 1403, 1389, 1405, 1399, 1399, 1400, 1462, 1400, 1413, 1441, 1448, 1467, 1469, 1457, 1475, 1477, 0, 1472, 1473, 1543, 1476, 1485, 1483, 1484, 1597, 1487, 1473, 1477, 1490, 1476, 1492, 1485, 1480, 0, 560, 1497, 1498, 1541, 1513, 1514, 1543, 1543, 1544, 1540, 1570, 1587, 1544, 1602, 1542, 1554, 1549, 1603, 1600, 1609, 1606, 1592, 1599, 1607, 1604, 1607, 1616, 1649, 1607, 1617, 1620, 1616, 1630, 1613, 1645, 0, 1656, 1648, 1645, 1643, 1661, 1642, 1656, 1664, 1656, 1670, 1667, 1668, 1659, 1671, 1675, 1669, 1657, 0, 0, 1661, 0, 0, 1666, 3994, 627, 564, 643, 1695, 528, 1697, 735, 799, 1718, 1262, 849, 871, 1685, 1672, 1710, 1699, 1707, 1702, 1706, 1708, 1722, 1719, 1710, 1730, 1713, 1714, 1721, 1730, 1716, 1732, 1733, 1738, 1733, 1736, 3994, 1737, 1725, 1730, 1729, 1731, 1728, 1746, 1747, 1750, 1749, 1758, 1765, 1781, 976, 1141, 464, 1775, 1779, 0, 1770, 1783, 874, 3994, 0, 1782, 1783, 986, 1179, 1779, 1780, 1791, 1777, 1797, 452, 1792, 1781, 1789, 1780, 1802, 1785, 1800, 0, 1801, 1818, 1796, 1792, 1794, 1799, 1834, 1816, 1836, 1828, 1826, 1839, 1826, 1846, 1847, 1837, 1850, 1830, 1853, 1840, 1854, 1846, 1859, 1857, 1842, 0, 1859, 1860, 1859, 1852, 1849, 1865, 1868, 1875, 0, 1859, 1861, 1878, 1881, 1886, 1895, 1900, 1886, 1888, 1904, 1906, 1892, 1890, 1906, 1898, 1898, 0, 1914, 1907, 1912, 1909, 1911, 1919, 1910, 1908, 1922, 0, 1915, 1958, 1927, 0, 1917, 1923, 1932, 1938, 1944, 1948, 1959, 1943, 1964, 1965, 1962, 1954, 1972, 1959, 1959, 1959, 1963, 1967, 1974, 1979, 1981, 1973, 2002, 1983, 1980, 1972, 1982, 1982, 0, 1988, 0, 1999, 2021, 1983, 2015, 2015, 2020, 2011, 2024, 2030, 2032, 2026, 2038, 2031, 2021, 2025, 2037, 2025, 2039, 2029, 2043, 2044, 2025, 2047, 2048, 2038, 2044, 2042, 2064, 2058, 2061, 2065, 2082, 2083, 2086, 2076, 2087, 2082, 2083, 2076, 2087, 2082, 2080, 2097, 2088, 2100, 2094, 0, 2099, 0, 2102, 2091, 2092, 2098, 2093, 0, 2100, 2096, 2120, 2104, 2108, 2125, 2130, 2132, 2140, 0, 461, 452, 1189, 1256, 3994, 2136, 2146, 2148, 2145, 2155, 2138, 2150, 2156, 2147, 2155, 2152, 2160, 2147, 2148, 2151, 2167, 2153, 2154, 2154, 2154, 2157, 2158, 2165, 2176, 2171, 2166, 2171, 2183, 3994, 2179, 2200, 2209, 1234, 2196, 401, 1152, 2204, 0, 2206, 0, 0, 2198, 0, 2217, 2207, 0, 2203, 2214, 0, 2223, 2210, 2222, 2211, 2212, 2228, 0, 2227, 2244, 2228, 2216, 2226, 2220, 2230, 2239, 2227, 2255, 0, 2247, 2250, 2253, 2253, 0, 0, 2265, 0, 2256, 2258, 2279, 0, 2263, 2279, 2267, 2281, 2265, 2284, 2273, 0, 2272, 2275, 0, 2291, 2275, 0, 0, 2278, 2292, 2289, 2318, 2280, 2297, 0, 2303, 2288, 0, 2301, 2314, 2292, 2332, 2331, 2342, 0, 2323, 0, 2322, 2338, 2342, 2332, 2332, 2350, 2330, 2337, 2356, 2343, 2339, 2347, 2358, 2365, 2346, 2373, 2364, 2376, 2370, 2392, 2376, 0, 2371, 2395, 2375, 2381, 2400, 2387, 2384, 2404, 2381, 2407, 2397, 2408, 0, 2397, 0, 2412, 2404, 2397, 2398, 2404, 2400, 2416, 2408, 2403, 2424, 2410, 2420, 2418, 2423, 2428, 2426, 2440, 2442, 2449, 2451, 2460, 2453, 2444, 2461, 2461, 2457, 2453, 2467, 2461, 2468, 2458, 2461, 2459, 0, 0, 2479, 2462, 2461, 2469, 2482, 2485, 2482, 0, 2496, 2485, 2498, 2505, 0, 2518, 2519, 2508, 2505, 0, 2523, 2520, 2518, 2504, 0, 0, 2511, 2528, 2514, 2536, 2520, 2522, 0, 2537, 2524, 2525, 2538, 2536, 2541, 2541, 2531, 2543, 2549, 2542, 3994, 2560, 2561, 2568, 2578, 3994, 2562, 2579, 2576, 3994, 3994, 2584, 3994, 2577, 2579, 2579, 2585, 3994, 2577, 1273, 2595, 2591, 1539, 398, 2588, 2585, 2585, 2582, 2594, 2589, 2585, 2594, 0, 2601, 0, 0, 2588, 0, 2588, 2593, 2594, 2605, 2624, 2616, 0, 2622, 0, 2621, 2625, 2630, 2626, 2632, 0, 2643, 2635, 2631, 2642, 0, 2649, 2648, 0, 2646, 2642, 0, 2638, 0, 2645, 2660, 2642, 2659, 0, 0, 2659, 2651, 2652, 2667, 2644, 2652, 0, 2666, 2661, 2675, 2681, 2680, 2685, 2690, 2683, 2704, 2691, 2688, 2708, 2705, 0, 0, 2705, 2696, 2704, 2695, 2696, 2700, 2700, 2702, 2700, 2720, 2719, 2709, 2716, 2724, 2726, 2715, 2712, 0, 2713, 0, 2719, 2719, 2728, 2729, 2732, 2732, 2760, 2755, 2763, 2766, 2755, 2752, 2761, 2773, 0, 0, 2770, 430, 2751, 2758, 2774, 2775, 2770, 2770, 2765, 0, 0, 0, 0, 2781, 2774, 2774, 2771, 2786, 2790, 2773, 2775, 2775, 2782, 2799, 2789, 2799, 2800, 0, 2795, 2823, 2824, 2810, 2831, 2828, 2819, 2830, 2833, 2836, 0, 0, 2829, 0, 0, 2819, 2822, 2823, 2824, 2842, 2842, 2830, 2836, 2836, 2852, 2842, 2839, 2855, 2844, 2854, 2842, 0, 0, 3994, 3994, 2859, 2848, 2862, 2860, 2864, 2886, 2878, 2880, 3994, 2894, 2872, 2885, 2882, 2894, 2882, 3994, 2885, 2897, 2886, 2892, 2889, 3994, 2906, 2909, 358, 352, 0, 2892, 2897, 2904, 2914, 2895, 2912, 2899, 2904, 2916, 2904, 2918, 2936, 0, 2937, 2933, 2934, 2947, 0, 2950, 0, 2946, 0, 2952, 2951, 2946, 2951, 0, 2943, 2963, 0, 2950, 2953, 2956, 2953, 2945, 2959, 2969, 2954, 2959, 2964, 0, 2970, 2966, 2974, 2975, 0, 2972, 2978, 2983, 2977, 2998, 2989, 3001, 2999, 3003, 0, 3005, 3011, 0, 3012, 3021, 3002, 3015, 3007, 3007, 3016, 3024, 0, 3021, 3019, 3024, 3032, 3030, 0, 3027, 3036, 3017, 3030, 3022, 3036, 0, 3033, 3031, 3037, 3043, 3045, 0, 3062, 0, 3049, 3075, 3065, 3062, 0, 3081, 3077, 0, 3070, 0, 3066, 3081, 3062, 3080, 3081, 3073, 3076, 3088, 3093, 3092, 3092, 3090, 3081, 3092, 3084, 3089, 3093, 3101, 3092, 3101, 3099, 3107, 3132, 3137, 3134, 3135, 3139, 3132, 0, 3143, 3129, 3130, 3144, 3146, 0, 0, 3134, 3144, 3145, 3994, 3136, 3994, 3994, 3142, 3137, 3994, 3143, 3140, 3152, 3994, 3159, 3154, 3145, 3140, 3157, 3160, 3994, 3176, 3160, 295, 0, 3160, 3184, 3182, 3188, 3191, 0, 3188, 3189, 3193, 3188, 3197, 3204, 3208, 3209, 3200, 3211, 3196, 0, 3203, 3205, 0, 3215, 3200, 3202, 3204, 3219, 0, 0, 3210, 3221, 3219, 3223, 0, 3228, 3212, 3220, 0, 3222, 3225, 3253, 3250, 3251, 3247, 3249, 3248, 3252, 3258, 3246, 3247, 3261, 3258, 3273, 3256, 3271, 3279, 3277, 3260, 3282, 0, 0, 0, 3258, 3271, 3268, 3283, 3266, 3285, 3268, 3290, 0, 0, 3280, 3295, 3284, 3304, 3308, 3316, 3308, 0, 3321, 3311, 0, 3314, 3320, 0, 3319, 3319, 3322, 0, 3324, 3336, 3334, 3320, 3322, 0, 3327, 0, 3328, 3339, 0, 3333, 3320, 3339, 3329, 3336, 3349, 3331, 0, 0, 3328, 0, 3348, 3342, 3353, 0, 0, 0, 3345, 3353, 3994, 3382, 3994, 3994, 3994, 3361, 3368, 3374, 3994, 3376, 3392, 3994, 3382, 3383, 3382, 3383, 0, 3395, 0, 3387, 0, 0, 3385, 0, 3397, 3385, 0, 3390, 0, 3385, 3392, 0, 3394, 3402, 3400, 3404, 0, 3395, 0, 0, 0, 3398, 0, 3396, 3410, 3401, 3417, 3428, 0, 3439, 3440, 3438, 3436, 3449, 3447, 3449, 3452, 3451, 3437, 3457, 0, 3443, 3456, 3453, 3443, 3459, 3462, 3461, 3447, 3467, 3464, 3461, 3451, 3463, 3461, 3471, 3457, 3467, 3478, 3471, 3486, 3499, 3493, 3506, 3504, 3498, 3513, 0, 3511, 0, 3502, 3498, 3505, 3507, 3507, 3508, 3519, 0, 0, 0, 3513, 0, 0, 3505, 0, 3513, 3514, 3524, 3525, 3526, 3513, 3513, 3514, 3994, 3541, 3547, 3517, 0, 3535, 3540, 0, 0, 0, 3558, 3535, 0, 0, 0, 3531, 3552, 0, 0, 3562, 0, 0, 0, 3554, 3578, 3579, 3563, 3581, 3559, 0, 0, 3580, 3567, 3579, 3576, 3588, 3576, 3587, 3587, 0, 3588, 3575, 3587, 3584, 3585, 3596, 3596, 3591, 3581, 0, 3598, 3593, 3595, 3627, 3610, 3613, 0, 3634, 0, 0, 3616, 3628, 0, 3640, 0, 0, 0, 3624, 0, 3638, 3630, 3625, 0, 3994, 3994, 3994, 3994, 3994, 3994, 3628, 3639, 0, 3634, 3630, 3635, 3627, 3638, 3640, 3637, 3636, 0, 3646, 3649, 3657, 3643, 3646, 0, 0, 0, 0, 3655, 3655, 3672, 0, 0, 3679, 0, 0, 3675, 3686, 0, 3690, 0, 3696, 3680, 3691, 3682, 0, 0, 3700, 0, 0, 3690, 0, 3701, 3697, 0, 3698, 3683, 3698, 0, 3691, 3697, 3700, 0, 3702, 3691, 3712, 3713, 3701, 0, 3714, 3717, 3712, 0, 3705, 3719, 0, 3720, 3731, 0, 0, 0, 3742, 3749, 3748, 3737, 3732, 3761, 3745, 3755, 3760, 0, 0, 0, 3763, 3764, 0, 3743, 3759, 0, 3767, 0, 0, 0, 3768, 3770, 3762, 3758, 3780, 291, 3761, 3765, 0, 3777, 3781, 3782, 3787, 0, 0, 0, 3778, 0, 288, 285, 0, 3780, 3787, 3791, 0, 0, 3799, 273, 3795, 3800, 3804, 0, 0, 3807, 3808, 0, 0, 3994, 3873, 3878, 3883, 3888, 3893, 310, 3898, 3903, 3908, 3913, 3918, 3923, 3928, 3933, 3938, 3943, 3948, 3953, 3958, 3963, 3968, 3973, 3978, 3983, 3988 } ; static const flex_int16_t yy_def[1785] = { 0, 1759, 1, 1759, 3, 1760, 1760, 1761, 1761, 1762, 1762, 1759, 11, 1759, 1759, 1759, 1759, 1759, 1763, 1764, 1759, 1765, 1766, 1759, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1767, 1768, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1769, 1770, 1759, 1759, 1759, 1759, 1759, 1771, 1772, 1773, 1759, 1759, 1759, 1774, 1759, 1759, 1765, 1765, 1765, 1765, 1765, 1759, 1763, 1764, 1764, 1759, 1759, 1765, 1765, 1765, 1775, 1759, 1776, 1777, 1759, 1759, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1767, 1759, 1768, 1768, 1759, 1759, 1778, 1759, 1779, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1769, 1769, 1769, 1769, 1759, 1770, 1780, 1759, 1759, 1771, 1759, 1772, 1773, 1759, 1759, 1759, 1774, 1759, 1781, 1765, 1765, 1765, 1765, 1759, 1759, 1759, 1765, 1765, 1775, 1759, 1776, 1765, 1782, 1777, 1781, 1759, 1759, 1759, 1759, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1759, 1778, 1759, 1778, 1779, 1759, 1779, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1769, 1769, 1769, 1780, 1780, 1759, 307, 1765, 1765, 1765, 1765, 1759, 1759, 1765, 1783, 307, 1759, 1759, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1769, 1769, 1769, 1759, 1784, 1765, 1765, 1765, 1783, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1769, 1769, 1769, 1784, 1759, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1769, 1769, 1769, 1759, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1769, 1769, 1759, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1769, 1769, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1769, 1769, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1759, 1759, 1759, 1759, 1759, 1759, 1769, 1769, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1769, 1769, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1769, 1769, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1769, 1769, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1769, 1759, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1759, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 1765, 0, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759 } ; static const flex_int16_t yy_nxt[4081] = { 0, 14, 15, 16, 15, 14, 17, 18, 14, 17, 19, 14, 14, 14, 20, 21, 22, 23, 23, 14, 14, 14, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 47, 48, 14, 14, 14, 14, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 47, 49, 14, 14, 14, 14, 14, 50, 14, 51, 52, 53, 54, 55, 56, 51, 57, 58, 51, 51, 51, 51, 59, 60, 51, 61, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 51, 72, 73, 51, 74, 51, 75, 76, 51, 51, 77, 78, 79, 80, 51, 81, 51, 51, 51, 82, 51, 51, 51, 83, 65, 66, 67, 68, 69, 70, 71, 51, 72, 73, 51, 74, 51, 75, 76, 51, 51, 77, 78, 79, 80, 51, 81, 51, 51, 51, 51, 84, 51, 85, 51, 51, 51, 86, 88, 88, 88, 88, 89, 89, 92, 90, 90, 93, 92, 96, 96, 93, 103, 107, 103, 108, 108, 160, 97, 97, 103, 103, 103, 103, 231, 238, 232, 232, 237, 227, 279, 520, 520, 239, 280, 103, 103, 103, 103, 298, 299, 310, 310, 300, 300, 311, 311, 94, 160, 300, 300, 94, 14, 15, 16, 15, 14, 17, 18, 14, 17, 14, 14, 14, 14, 14, 47, 98, 14, 14, 14, 14, 14, 47, 47, 99, 47, 100, 47, 47, 47, 47, 47, 47, 47, 101, 47, 47, 102, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 14, 14, 14, 14, 14, 47, 47, 99, 47, 100, 47, 47, 47, 47, 47, 47, 47, 101, 47, 47, 102, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 14, 14, 14, 14, 14, 14, 14, 14, 110, 110, 109, 161, 188, 251, 257, 162, 258, 111, 273, 513, 116, 514, 108, 108, 470, 470, 233, 233, 471, 471, 273, 117, 118, 1749, 119, 234, 1741, 266, 300, 300, 273, 120, 161, 188, 251, 257, 162, 258, 111, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 112, 117, 118, 115, 119, 234, 112, 266, 112, 121, 174, 120, 153, 122, 271, 134, 154, 123, 135, 136, 155, 138, 139, 140, 175, 269, 124, 141, 270, 125, 214, 272, 137, 142, 215, 112, 112, 112, 743, 112, 121, 174, 1313, 153, 122, 271, 134, 154, 123, 135, 136, 155, 138, 139, 140, 175, 269, 124, 141, 270, 125, 214, 272, 137, 142, 215, 112, 112, 112, 112, 112, 112, 112, 112, 126, 286, 127, 143, 1242, 128, 129, 144, 287, 130, 743, 145, 131, 743, 146, 132, 133, 147, 149, 241, 148, 467, 150, 242, 474, 474, 151, 464, 475, 475, 753, 126, 286, 127, 143, 152, 128, 129, 144, 287, 130, 288, 145, 131, 288, 146, 132, 133, 147, 149, 241, 148, 156, 150, 242, 169, 163, 151, 164, 170, 165, 157, 158, 171, 166, 243, 152, 167, 159, 292, 176, 177, 293, 168, 294, 172, 743, 295, 178, 173, 179, 244, 180, 156, 288, 181, 169, 163, 465, 164, 170, 165, 157, 158, 171, 166, 243, 467, 167, 159, 292, 176, 177, 293, 168, 294, 172, 245, 295, 178, 173, 179, 244, 180, 182, 189, 181, 246, 183, 190, 247, 312, 184, 191, 208, 185, 317, 320, 186, 192, 464, 187, 466, 209, 640, 210, 311, 311, 245, 211, 302, 212, 468, 213, 283, 182, 189, 323, 246, 183, 190, 247, 312, 184, 191, 208, 185, 317, 320, 186, 192, 255, 187, 193, 209, 194, 210, 202, 195, 196, 211, 203, 212, 197, 213, 204, 256, 198, 323, 283, 199, 205, 200, 469, 206, 201, 235, 280, 232, 232, 301, 207, 255, 465, 193, 273, 194, 236, 202, 195, 196, 248, 203, 523, 197, 249, 204, 256, 198, 703, 227, 199, 205, 200, 259, 206, 201, 216, 217, 250, 262, 218, 207, 219, 260, 220, 252, 267, 236, 261, 221, 268, 248, 318, 253, 263, 249, 466, 264, 265, 321, 227, 277, 254, 319, 259, 322, 463, 216, 217, 250, 262, 218, 466, 219, 260, 220, 252, 267, 225, 261, 221, 268, 274, 318, 253, 263, 296, 296, 264, 265, 321, 275, 324, 254, 319, 297, 322, 276, 116, 326, 108, 108, 110, 110, 327, 328, 325, 277, 334, 117, 335, 111, 225, 274, 298, 298, 308, 308, 520, 520, 311, 311, 275, 324, 223, 309, 297, 302, 276, 336, 326, 471, 471, 337, 338, 327, 328, 325, 106, 334, 117, 335, 111, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 309, 329, 304, 106, 336, 301, 313, 301, 337, 338, 314, 331, 332, 333, 339, 340, 344, 315, 342, 343, 345, 330, 347, 316, 346, 350, 348, 351, 356, 341, 349, 357, 329, 358, 301, 301, 301, 313, 301, 471, 471, 314, 331, 332, 333, 339, 340, 344, 315, 342, 343, 345, 330, 347, 316, 346, 350, 348, 351, 356, 341, 349, 357, 291, 358, 301, 301, 301, 301, 301, 301, 301, 301, 305, 305, 301, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 359, 363, 307, 475, 475, 305, 352, 305, 353, 354, 360, 364, 355, 365, 368, 366, 373, 374, 361, 377, 375, 385, 396, 397, 362, 475, 475, 376, 520, 520, 402, 359, 363, 367, 305, 305, 305, 352, 305, 353, 354, 360, 364, 355, 365, 368, 366, 373, 374, 361, 377, 375, 385, 396, 397, 362, 369, 370, 376, 378, 390, 402, 371, 290, 367, 305, 305, 305, 305, 305, 305, 305, 305, 372, 382, 379, 391, 380, 398, 383, 384, 386, 381, 387, 388, 403, 399, 369, 370, 389, 378, 390, 404, 371, 392, 393, 394, 400, 405, 406, 407, 401, 395, 410, 372, 382, 379, 391, 380, 398, 383, 384, 386, 381, 387, 388, 403, 399, 411, 408, 389, 409, 412, 404, 418, 392, 393, 394, 400, 405, 406, 407, 401, 395, 410, 413, 416, 427, 414, 419, 526, 526, 417, 428, 420, 415, 283, 429, 430, 411, 408, 283, 409, 412, 431, 418, 281, 435, 436, 437, 439, 440, 441, 513, 447, 514, 413, 416, 427, 414, 419, 421, 422, 417, 428, 420, 415, 423, 429, 430, 451, 424, 425, 438, 426, 431, 432, 433, 435, 436, 437, 439, 440, 441, 442, 447, 444, 452, 445, 434, 453, 448, 421, 422, 446, 443, 454, 455, 423, 449, 456, 451, 424, 425, 438, 426, 457, 432, 433, 458, 459, 450, 460, 461, 462, 442, 263, 444, 452, 445, 434, 453, 448, 233, 233, 446, 443, 454, 455, 229, 449, 456, 234, 476, 477, 478, 235, 457, 232, 232, 458, 459, 450, 460, 461, 462, 479, 236, 233, 233, 472, 472, 480, 481, 482, 483, 484, 234, 486, 473, 229, 487, 488, 234, 476, 477, 478, 489, 490, 485, 491, 492, 495, 496, 497, 498, 493, 479, 236, 499, 500, 501, 494, 480, 481, 482, 483, 484, 234, 486, 473, 502, 487, 488, 503, 504, 506, 505, 489, 490, 485, 491, 492, 495, 496, 497, 498, 493, 507, 508, 499, 500, 501, 494, 509, 510, 511, 240, 513, 516, 742, 230, 502, 526, 526, 503, 504, 506, 505, 957, 518, 958, 519, 706, 706, 229, 521, 277, 522, 507, 508, 527, 277, 277, 343, 509, 510, 511, 104, 104, 516, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 518, 517, 519, 296, 296, 104, 521, 104, 522, 308, 308, 527, 297, 528, 343, 525, 525, 529, 309, 526, 526, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 517, 541, 104, 104, 104, 228, 104, 706, 706, 705, 705, 297, 528, 706, 706, 227, 529, 309, 277, 955, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 542, 541, 104, 104, 104, 104, 104, 104, 104, 104, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 543, 544, 304, 277, 1150, 301, 545, 301, 542, 546, 547, 548, 551, 552, 555, 556, 553, 557, 558, 549, 559, 560, 561, 562, 565, 550, 566, 569, 570, 571, 572, 543, 544, 554, 301, 301, 301, 545, 301, 226, 546, 547, 548, 551, 552, 555, 556, 553, 557, 558, 549, 559, 560, 561, 562, 565, 550, 566, 569, 570, 571, 572, 225, 223, 554, 301, 301, 301, 301, 301, 301, 301, 301, 305, 305, 301, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 573, 563, 307, 106, 1759, 305, 567, 305, 564, 575, 574, 576, 577, 578, 568, 579, 580, 581, 582, 583, 584, 585, 586, 588, 589, 590, 587, 591, 592, 593, 596, 573, 563, 597, 305, 305, 305, 567, 305, 564, 575, 574, 576, 577, 578, 568, 579, 580, 581, 582, 583, 584, 585, 586, 588, 589, 590, 587, 591, 592, 593, 596, 1759, 598, 597, 305, 305, 305, 305, 305, 305, 305, 305, 104, 104, 599, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 594, 600, 601, 1759, 1759, 104, 602, 104, 598, 603, 595, 604, 605, 606, 618, 619, 524, 621, 622, 620, 599, 632, 633, 634, 635, 636, 637, 638, 639, 641, 642, 594, 600, 601, 104, 104, 104, 602, 104, 1759, 603, 595, 604, 605, 606, 618, 619, 524, 621, 622, 620, 1759, 632, 633, 634, 635, 636, 637, 638, 639, 641, 642, 645, 646, 1759, 104, 104, 104, 104, 104, 104, 104, 104, 607, 608, 647, 609, 648, 610, 611, 650, 612, 643, 651, 613, 649, 644, 614, 656, 659, 660, 615, 616, 645, 646, 617, 1759, 957, 661, 1153, 652, 1759, 1759, 1759, 607, 608, 647, 609, 648, 610, 611, 650, 612, 643, 651, 613, 649, 644, 614, 656, 659, 660, 615, 616, 653, 654, 617, 623, 624, 661, 625, 652, 626, 627, 657, 628, 655, 662, 663, 664, 665, 658, 666, 667, 668, 629, 630, 669, 670, 631, 671, 1759, 674, 675, 676, 653, 654, 677, 623, 624, 678, 625, 679, 626, 627, 657, 628, 655, 662, 663, 664, 665, 658, 666, 667, 668, 629, 630, 669, 670, 631, 671, 672, 674, 675, 676, 680, 681, 677, 682, 683, 678, 684, 679, 673, 685, 686, 687, 688, 689, 690, 691, 692, 693, 695, 697, 700, 698, 694, 696, 701, 702, 468, 672, 704, 707, 708, 680, 681, 699, 682, 683, 1759, 684, 1759, 673, 685, 686, 687, 688, 689, 690, 691, 692, 693, 695, 697, 700, 698, 694, 696, 701, 702, 472, 472, 709, 707, 708, 710, 711, 699, 712, 473, 469, 713, 469, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 709, 734, 735, 710, 711, 736, 712, 473, 737, 713, 738, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 739, 734, 735, 740, 741, 736, 515, 744, 737, 277, 738, 745, 746, 747, 515, 748, 277, 749, 750, 751, 752, 754, 755, 756, 757, 758, 759, 760, 761, 1759, 764, 739, 277, 765, 740, 741, 766, 515, 744, 767, 1759, 762, 745, 746, 747, 515, 748, 770, 749, 750, 751, 752, 754, 755, 756, 757, 758, 759, 760, 761, 763, 764, 768, 771, 765, 772, 773, 766, 774, 775, 767, 769, 762, 776, 777, 778, 779, 780, 770, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 763, 793, 768, 771, 794, 772, 773, 795, 774, 775, 796, 769, 797, 776, 777, 778, 779, 780, 798, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 799, 793, 800, 801, 794, 802, 803, 795, 804, 805, 796, 806, 797, 807, 808, 809, 810, 811, 798, 812, 813, 814, 816, 817, 818, 819, 820, 821, 815, 822, 1759, 799, 825, 800, 801, 826, 802, 803, 827, 804, 805, 828, 806, 829, 807, 808, 809, 810, 811, 830, 812, 813, 814, 816, 817, 818, 819, 820, 821, 815, 822, 823, 831, 825, 832, 833, 826, 834, 824, 827, 837, 838, 828, 835, 829, 839, 840, 841, 842, 843, 830, 844, 845, 846, 847, 836, 848, 849, 853, 854, 855, 856, 823, 831, 857, 832, 833, 858, 834, 824, 859, 837, 838, 862, 835, 850, 839, 840, 841, 842, 843, 851, 844, 845, 846, 847, 836, 848, 849, 853, 854, 855, 856, 852, 863, 857, 860, 864, 858, 865, 861, 859, 866, 867, 862, 868, 850, 869, 870, 871, 872, 873, 851, 874, 875, 876, 877, 879, 880, 881, 882, 878, 883, 884, 852, 863, 885, 860, 864, 886, 865, 861, 887, 866, 867, 888, 868, 889, 869, 870, 871, 872, 873, 890, 874, 875, 876, 877, 879, 880, 881, 882, 878, 883, 884, 891, 892, 885, 893, 894, 886, 895, 896, 887, 897, 898, 888, 899, 889, 900, 901, 902, 903, 904, 890, 905, 906, 910, 908, 911, 907, 912, 913, 914, 915, 916, 891, 892, 909, 893, 894, 917, 895, 896, 918, 897, 898, 919, 899, 920, 900, 901, 902, 903, 904, 921, 905, 906, 910, 908, 911, 907, 912, 913, 914, 915, 916, 922, 923, 909, 924, 925, 917, 926, 927, 918, 928, 929, 919, 930, 920, 931, 932, 933, 934, 935, 921, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 922, 923, 947, 924, 925, 948, 926, 927, 949, 928, 929, 950, 930, 951, 931, 932, 933, 934, 935, 952, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 953, 954, 947, 956, 959, 948, 960, 961, 949, 962, 963, 950, 964, 951, 965, 966, 277, 967, 968, 952, 969, 970, 971, 972, 976, 977, 978, 979, 981, 277, 980, 953, 954, 982, 956, 959, 973, 960, 961, 983, 962, 963, 974, 964, 975, 965, 966, 984, 967, 968, 985, 969, 970, 971, 972, 976, 977, 978, 979, 981, 986, 980, 987, 988, 982, 989, 990, 973, 991, 992, 983, 993, 994, 974, 995, 975, 996, 997, 984, 998, 999, 985, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1013, 986, 1014, 987, 988, 1015, 989, 990, 1759, 991, 992, 1016, 993, 994, 1017, 995, 1018, 996, 997, 1019, 998, 999, 1008, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1013, 1009, 1014, 1020, 1010, 1015, 1021, 1027, 1011, 1012, 1028, 1016, 1029, 1030, 1017, 1022, 1018, 1031, 1023, 1019, 1032, 1024, 1008, 1033, 1034, 1025, 1035, 1036, 1037, 1038, 1026, 1039, 1009, 1040, 1020, 1010, 1041, 1021, 1027, 1011, 1012, 1028, 1042, 1029, 1030, 1043, 1022, 1044, 1031, 1023, 1045, 1032, 1024, 1046, 1033, 1034, 1025, 1035, 1036, 1037, 1038, 1026, 1039, 1047, 1040, 1048, 1049, 1041, 1050, 1051, 1052, 1053, 1054, 1042, 1055, 1056, 1043, 1057, 1044, 1058, 1059, 1045, 1060, 1061, 1046, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1047, 1071, 1048, 1049, 1072, 1050, 1051, 1052, 1053, 1054, 1073, 1055, 1056, 1074, 1057, 1075, 1058, 1059, 1076, 1060, 1061, 1077, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1078, 1071, 1079, 1080, 1072, 1081, 1083, 1084, 1085, 1086, 1073, 1089, 1087, 1074, 1082, 1075, 1090, 1091, 1076, 1088, 1092, 1077, 1093, 1094, 1095, 1096, 1097, 1100, 1098, 1101, 1102, 1078, 1103, 1079, 1080, 1104, 1081, 1083, 1084, 1085, 1086, 1105, 1089, 1087, 1099, 1082, 1106, 1090, 1091, 1107, 1088, 1092, 1108, 1093, 1094, 1095, 1096, 1097, 1100, 1098, 1101, 1102, 1109, 1103, 1110, 1111, 1104, 1112, 1114, 1115, 1118, 1116, 1105, 1113, 1119, 1099, 1120, 1106, 1121, 1122, 1107, 1117, 1123, 1108, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1109, 1133, 1110, 1111, 1134, 1112, 1114, 1115, 1118, 1116, 1135, 1113, 1119, 1136, 1120, 1137, 1121, 1122, 1138, 1117, 1123, 1139, 1124, 1125, 1126, 1127, 1128, 1129, 1130, 1131, 1132, 1140, 1133, 1141, 1142, 1134, 1143, 1144, 1145, 1146, 1147, 1135, 1148, 1149, 1136, 1759, 1137, 1154, 1152, 1138, 1151, 1155, 1139, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1140, 1165, 1141, 1142, 1166, 1143, 1144, 1145, 1146, 1147, 277, 1148, 1149, 1167, 277, 1168, 1154, 1152, 1169, 1151, 1155, 1170, 1156, 1157, 1158, 1159, 1160, 1161, 1162, 1163, 1164, 1171, 1165, 1172, 1173, 1166, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1167, 1182, 1168, 1183, 1184, 1169, 1185, 1186, 1170, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1171, 1196, 1172, 1173, 1197, 1174, 1175, 1176, 1177, 1178, 1179, 1180, 1181, 1198, 1182, 1199, 1183, 1184, 1200, 1185, 1186, 1201, 1187, 1188, 1189, 1190, 1191, 1192, 1193, 1194, 1195, 1202, 1196, 1203, 1204, 1197, 1205, 1206, 1208, 1209, 1210, 1211, 1212, 1213, 1198, 1207, 1199, 1214, 1215, 1200, 1216, 1217, 1201, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1202, 1227, 1203, 1204, 1228, 1205, 1206, 1208, 1209, 1210, 1211, 1212, 1213, 1229, 1207, 1230, 1214, 1215, 1231, 1216, 1217, 1232, 1218, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 1233, 1227, 1234, 1235, 1228, 1236, 1237, 1238, 1239, 1240, 1241, 1243, 1244, 1229, 1245, 1230, 1246, 1247, 1231, 1248, 1249, 1232, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1233, 1259, 1234, 1235, 1260, 1236, 1237, 1238, 1239, 1240, 1241, 1243, 1244, 1261, 1245, 1262, 1246, 1247, 1263, 1248, 1249, 1264, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1265, 1259, 1266, 1267, 1260, 1268, 1269, 1270, 1271, 1272, 1274, 1275, 1276, 1261, 1277, 1262, 1278, 1279, 1263, 1280, 1281, 1264, 1282, 1283, 1284, 1273, 1285, 1286, 1287, 1288, 1289, 1265, 1290, 1266, 1267, 1291, 1268, 1269, 1270, 1271, 1272, 1274, 1275, 1276, 1292, 1277, 1293, 1278, 1279, 1294, 1280, 1281, 1295, 1282, 1283, 1284, 1273, 1285, 1286, 1287, 1288, 1289, 1296, 1290, 1297, 1298, 1291, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1292, 1307, 1293, 1308, 1309, 1294, 1310, 1311, 1295, 1314, 1315, 1316, 1312, 1317, 1318, 1319, 1320, 1321, 1296, 1322, 1297, 1298, 1323, 1299, 1300, 1301, 1302, 1303, 1304, 1305, 1306, 1324, 1307, 277, 1308, 1309, 277, 1310, 1311, 1325, 1314, 1315, 1316, 1312, 1317, 1318, 1319, 1320, 1321, 1326, 1322, 1327, 1328, 1323, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1324, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1325, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1326, 1353, 1327, 1328, 1354, 1329, 1330, 1331, 1332, 1333, 1334, 1335, 1336, 1355, 1337, 1338, 1339, 1340, 1341, 1342, 1343, 1356, 1344, 1345, 1346, 1347, 1348, 1349, 1350, 1351, 1352, 1357, 1353, 1358, 1359, 1354, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1355, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1356, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1357, 1384, 1358, 1359, 1385, 1360, 1361, 1362, 1363, 1364, 1365, 1366, 1367, 1386, 1368, 1369, 1370, 1371, 1372, 1373, 1374, 1389, 1375, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1387, 1384, 1388, 1390, 1385, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1386, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1389, 1407, 1391, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1387, 1415, 1388, 1390, 1416, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1417, 1400, 1401, 1402, 1403, 1404, 1405, 1406, 1418, 1407, 1391, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1419, 1415, 1422, 1420, 1416, 1421, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1417, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 1418, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1419, 1448, 1422, 1420, 1447, 1421, 1423, 1424, 1425, 1426, 1427, 1428, 1429, 1446, 1430, 1431, 1432, 1433, 1434, 1435, 1436, 277, 1437, 1438, 1439, 1440, 1441, 1442, 1443, 1444, 1445, 1449, 1448, 1450, 1451, 1447, 1452, 277, 1453, 1454, 1455, 1456, 1457, 1458, 1446, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1449, 1476, 1450, 1451, 1477, 1452, 1478, 1453, 1454, 1455, 1456, 1457, 1458, 1479, 1459, 1460, 1461, 1462, 1463, 1464, 1465, 1466, 1467, 1468, 1469, 1470, 1471, 1472, 1473, 1474, 1475, 1480, 1476, 1481, 1482, 1477, 1483, 1478, 1484, 1485, 1486, 1487, 1488, 1489, 1479, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1480, 1507, 1481, 1482, 1508, 1483, 1509, 1484, 1485, 1486, 1487, 1488, 1489, 1510, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1511, 1507, 1512, 1513, 1508, 1514, 1509, 1515, 1516, 1517, 1518, 1519, 1520, 1510, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1511, 1538, 1512, 1513, 1539, 1514, 1540, 1515, 1516, 1517, 1518, 1519, 1520, 1541, 1521, 1522, 1523, 1524, 1525, 1526, 1527, 1528, 1529, 1530, 1531, 1532, 1533, 1534, 1535, 1536, 1537, 1542, 1538, 1543, 1544, 1539, 1545, 1540, 1546, 1547, 1548, 1549, 1550, 1551, 1541, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 277, 277, 1564, 1565, 1566, 1542, 1567, 1543, 1544, 1568, 1545, 1569, 1546, 1547, 1548, 1549, 1550, 1551, 1570, 1552, 1553, 1554, 1555, 1556, 1557, 1558, 1559, 1560, 1561, 1562, 1563, 1571, 1572, 1564, 1565, 1566, 1573, 1567, 1574, 1575, 1568, 1576, 1569, 1577, 1578, 1579, 1580, 1581, 1582, 1570, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1571, 1572, 1595, 1596, 1597, 1573, 1598, 1574, 1575, 1599, 1576, 1600, 1577, 1578, 1579, 1580, 1581, 1582, 1601, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593, 1594, 1602, 1603, 1595, 1596, 1597, 1604, 1598, 1605, 1606, 1599, 1607, 1600, 1608, 1609, 1610, 1611, 1612, 1613, 1601, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1602, 1603, 1628, 1629, 1759, 1604, 1630, 1605, 1606, 1633, 1607, 1634, 1608, 1609, 1610, 1611, 1612, 1613, 1626, 1614, 1615, 1616, 1617, 1618, 1619, 1620, 1621, 1622, 1623, 1624, 1625, 1627, 1635, 1628, 1629, 277, 1636, 1630, 1631, 1637, 1633, 277, 1634, 1632, 1638, 1639, 1640, 1641, 1642, 1626, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1627, 1635, 1655, 1656, 1657, 1636, 1658, 1631, 1637, 1659, 1660, 1661, 1632, 1638, 1639, 1640, 1641, 1642, 1662, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1663, 1664, 1655, 1656, 1657, 1665, 1658, 1666, 1667, 1659, 1660, 1661, 1668, 1669, 1670, 1671, 1672, 1673, 1662, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 277, 1684, 1663, 1664, 1685, 1686, 1687, 1665, 1688, 1666, 1667, 277, 1689, 1690, 1668, 1669, 1670, 1671, 1672, 1673, 1691, 1674, 1675, 1676, 1677, 1678, 1679, 1680, 1681, 1682, 1683, 1692, 1684, 1693, 1694, 1685, 1686, 1687, 1695, 1688, 1696, 1697, 1698, 1689, 1690, 1699, 1700, 1701, 1702, 1703, 1704, 1691, 1705, 1706, 1707, 277, 1708, 1709, 1710, 1711, 1712, 1713, 1692, 1714, 1693, 1694, 1715, 1716, 1717, 1695, 277, 1696, 1697, 1698, 1718, 1719, 1699, 1700, 1701, 1702, 1703, 1704, 1720, 1705, 1706, 1707, 1721, 1708, 1709, 1710, 1711, 1712, 1713, 1722, 1714, 1723, 1724, 1715, 1716, 1717, 1725, 1726, 1759, 1728, 277, 1718, 1719, 1729, 1730, 1727, 1731, 1732, 1733, 1720, 1734, 1735, 1736, 1721, 1737, 1738, 1739, 1759, 1742, 1743, 1722, 1744, 1723, 1724, 1740, 1745, 1746, 1725, 1726, 277, 1728, 1747, 1748, 1750, 1729, 1730, 1727, 1731, 1732, 1733, 1751, 1734, 1735, 1736, 1752, 1737, 1738, 1739, 277, 1742, 1743, 1753, 1744, 1754, 1755, 1740, 1745, 1746, 1756, 1757, 1758, 1759, 1747, 1748, 1750, 1759, 1759, 1759, 1759, 1759, 1759, 1751, 1759, 1759, 1759, 1752, 1759, 1759, 1759, 1759, 1759, 1759, 1753, 1759, 1754, 1755, 1759, 1759, 1759, 1756, 1757, 1758, 87, 87, 87, 87, 87, 91, 91, 91, 91, 91, 95, 95, 95, 95, 95, 104, 1759, 104, 104, 104, 105, 1759, 105, 105, 105, 114, 114, 114, 114, 114, 222, 222, 222, 222, 222, 224, 1759, 224, 224, 224, 273, 273, 273, 273, 273, 278, 278, 278, 278, 278, 282, 282, 282, 282, 282, 284, 284, 284, 284, 284, 285, 285, 1759, 285, 285, 289, 1759, 289, 1759, 289, 301, 301, 301, 301, 301, 303, 303, 303, 303, 303, 306, 306, 306, 306, 306, 464, 464, 464, 464, 464, 467, 467, 467, 467, 467, 512, 512, 512, 512, 512, 515, 1759, 515, 515, 515, 305, 305, 305, 305, 305, 104, 1759, 104, 104, 104, 743, 743, 743, 743, 743, 13, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759 } ; static const flex_int16_t yy_chk[4081] = { 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, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 6, 5, 6, 5, 6, 7, 5, 6, 7, 8, 9, 10, 8, 15, 20, 15, 20, 20, 33, 9, 10, 52, 54, 52, 54, 59, 63, 59, 59, 62, 62, 83, 298, 298, 63, 83, 88, 103, 88, 103, 111, 111, 117, 117, 111, 111, 117, 117, 7, 33, 299, 299, 8, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 21, 21, 1765, 34, 40, 69, 72, 34, 73, 21, 1749, 279, 23, 279, 23, 23, 234, 234, 60, 60, 234, 234, 1741, 23, 24, 1740, 24, 60, 1727, 77, 300, 300, 1313, 24, 34, 40, 69, 72, 34, 73, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 24, 22, 24, 60, 22, 77, 22, 25, 37, 24, 31, 25, 80, 27, 31, 25, 27, 27, 31, 28, 28, 28, 37, 79, 25, 28, 79, 25, 45, 81, 27, 28, 45, 22, 22, 22, 1153, 22, 25, 37, 1152, 31, 25, 80, 27, 31, 25, 27, 27, 31, 28, 28, 28, 37, 79, 25, 28, 79, 25, 45, 81, 27, 28, 45, 22, 22, 22, 22, 22, 22, 22, 22, 26, 92, 26, 29, 1066, 26, 26, 29, 93, 26, 958, 29, 26, 742, 29, 26, 26, 29, 30, 65, 29, 704, 30, 65, 236, 236, 30, 703, 236, 236, 532, 26, 92, 26, 29, 30, 26, 26, 29, 93, 26, 94, 29, 26, 94, 29, 26, 26, 29, 30, 65, 29, 32, 30, 65, 36, 35, 30, 35, 36, 35, 32, 32, 36, 35, 66, 30, 35, 32, 99, 38, 38, 100, 35, 101, 36, 514, 102, 38, 36, 38, 66, 38, 32, 94, 38, 36, 35, 228, 35, 36, 35, 32, 32, 36, 35, 66, 468, 35, 32, 99, 38, 38, 100, 35, 101, 36, 67, 102, 38, 36, 38, 66, 38, 39, 41, 38, 67, 39, 41, 67, 118, 39, 41, 44, 39, 120, 122, 39, 41, 465, 39, 228, 44, 404, 44, 310, 310, 67, 44, 301, 44, 230, 44, 284, 39, 41, 124, 67, 39, 41, 67, 118, 39, 41, 44, 39, 120, 122, 39, 41, 71, 39, 42, 44, 42, 44, 43, 42, 42, 44, 43, 44, 42, 44, 43, 71, 42, 124, 282, 42, 43, 42, 230, 43, 42, 61, 278, 61, 61, 305, 43, 71, 464, 42, 277, 42, 61, 43, 42, 42, 68, 43, 305, 42, 68, 43, 71, 42, 466, 75, 42, 43, 42, 74, 43, 42, 46, 46, 68, 75, 46, 43, 46, 74, 46, 70, 78, 61, 74, 46, 78, 68, 121, 70, 76, 68, 464, 76, 76, 123, 75, 273, 70, 121, 74, 123, 226, 46, 46, 68, 75, 46, 466, 46, 74, 46, 70, 78, 225, 74, 46, 78, 82, 121, 70, 76, 107, 107, 76, 76, 123, 82, 125, 70, 121, 107, 123, 82, 108, 127, 108, 108, 110, 110, 128, 129, 125, 82, 133, 108, 134, 110, 224, 82, 297, 297, 116, 116, 297, 297, 311, 311, 82, 125, 222, 116, 107, 112, 82, 136, 127, 470, 470, 136, 137, 128, 129, 125, 106, 133, 108, 134, 110, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 116, 130, 114, 105, 136, 114, 119, 114, 136, 137, 119, 131, 131, 131, 138, 139, 141, 119, 140, 140, 142, 130, 143, 119, 142, 145, 144, 146, 148, 139, 144, 149, 130, 150, 114, 114, 114, 119, 114, 471, 471, 119, 131, 131, 131, 138, 139, 141, 119, 140, 140, 142, 130, 143, 119, 142, 145, 144, 146, 148, 139, 144, 149, 98, 150, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 151, 153, 115, 474, 474, 115, 147, 115, 147, 147, 152, 154, 147, 155, 157, 156, 159, 160, 152, 162, 161, 166, 172, 173, 152, 475, 475, 161, 520, 520, 176, 151, 153, 156, 115, 115, 115, 147, 115, 147, 147, 152, 154, 147, 155, 157, 156, 159, 160, 152, 162, 161, 166, 172, 173, 152, 158, 158, 161, 163, 170, 176, 158, 97, 156, 115, 115, 115, 115, 115, 115, 115, 115, 158, 165, 163, 170, 163, 174, 165, 165, 169, 163, 169, 169, 177, 174, 158, 158, 169, 163, 170, 178, 158, 171, 171, 171, 175, 179, 180, 181, 175, 171, 183, 158, 165, 163, 170, 163, 174, 165, 165, 169, 163, 169, 169, 177, 174, 184, 182, 169, 182, 185, 178, 188, 171, 171, 171, 175, 179, 180, 181, 175, 171, 183, 186, 187, 191, 186, 189, 525, 525, 187, 192, 189, 186, 90, 193, 194, 184, 182, 89, 182, 185, 195, 188, 85, 197, 198, 199, 200, 201, 202, 512, 205, 512, 186, 187, 191, 186, 189, 190, 190, 187, 192, 189, 186, 190, 193, 194, 207, 190, 190, 199, 190, 195, 196, 196, 197, 198, 199, 200, 201, 202, 203, 205, 204, 210, 204, 196, 212, 206, 190, 190, 204, 203, 213, 214, 190, 206, 215, 207, 190, 190, 199, 190, 216, 196, 196, 217, 218, 206, 219, 220, 221, 203, 84, 204, 210, 204, 196, 212, 206, 231, 231, 204, 203, 213, 214, 241, 206, 215, 231, 242, 243, 244, 232, 216, 232, 232, 217, 218, 206, 219, 220, 221, 245, 232, 233, 233, 235, 235, 246, 246, 247, 248, 249, 233, 250, 235, 241, 251, 252, 231, 242, 243, 244, 253, 254, 249, 255, 257, 258, 259, 260, 262, 257, 245, 232, 264, 265, 266, 257, 246, 246, 247, 248, 249, 233, 250, 235, 267, 251, 252, 268, 269, 270, 269, 253, 254, 249, 255, 257, 258, 259, 260, 262, 257, 271, 272, 264, 265, 266, 257, 274, 275, 276, 64, 513, 292, 513, 58, 267, 526, 526, 268, 269, 270, 269, 743, 294, 743, 295, 705, 705, 57, 302, 276, 304, 271, 272, 312, 274, 275, 293, 274, 275, 276, 291, 291, 292, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 294, 293, 295, 296, 296, 291, 302, 291, 304, 308, 308, 312, 296, 313, 293, 309, 309, 314, 308, 309, 309, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 293, 326, 291, 291, 291, 56, 291, 706, 706, 473, 473, 296, 313, 473, 473, 55, 314, 308, 740, 740, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 327, 326, 291, 291, 291, 291, 291, 291, 291, 291, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 328, 329, 303, 954, 954, 303, 330, 303, 327, 331, 332, 333, 335, 336, 338, 339, 337, 340, 341, 333, 342, 344, 345, 346, 348, 333, 349, 351, 352, 353, 354, 328, 329, 337, 303, 303, 303, 330, 303, 50, 331, 332, 333, 335, 336, 338, 339, 337, 340, 341, 333, 342, 344, 345, 346, 348, 333, 349, 351, 352, 353, 354, 49, 48, 337, 303, 303, 303, 303, 303, 303, 303, 303, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 355, 347, 306, 19, 13, 306, 350, 306, 347, 356, 355, 358, 359, 360, 350, 361, 362, 363, 364, 365, 366, 368, 369, 370, 371, 372, 369, 373, 374, 375, 377, 355, 347, 378, 306, 306, 306, 350, 306, 347, 356, 355, 358, 359, 360, 350, 361, 362, 363, 364, 365, 366, 368, 369, 370, 371, 372, 369, 373, 374, 375, 377, 0, 379, 378, 306, 306, 306, 306, 306, 306, 306, 306, 307, 307, 380, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 376, 381, 382, 0, 0, 307, 383, 307, 379, 384, 376, 385, 387, 388, 390, 391, 307, 392, 393, 391, 380, 395, 396, 397, 398, 399, 400, 401, 402, 405, 406, 376, 381, 382, 307, 307, 307, 383, 307, 0, 384, 376, 385, 387, 388, 390, 391, 307, 392, 393, 391, 0, 395, 396, 397, 398, 399, 400, 401, 402, 405, 406, 408, 409, 0, 307, 307, 307, 307, 307, 307, 307, 307, 389, 389, 410, 389, 411, 389, 389, 412, 389, 407, 413, 389, 411, 407, 389, 416, 418, 419, 389, 389, 408, 409, 389, 0, 957, 420, 957, 414, 0, 0, 0, 389, 389, 410, 389, 411, 389, 389, 412, 389, 407, 413, 389, 411, 407, 389, 416, 418, 419, 389, 389, 414, 415, 389, 394, 394, 420, 394, 414, 394, 394, 417, 394, 415, 421, 422, 423, 424, 417, 425, 426, 427, 394, 394, 428, 429, 394, 430, 0, 432, 433, 434, 414, 415, 435, 394, 394, 436, 394, 437, 394, 394, 417, 394, 415, 421, 422, 423, 424, 417, 425, 426, 427, 394, 394, 428, 429, 394, 430, 431, 432, 433, 434, 438, 440, 435, 441, 442, 436, 443, 437, 431, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 456, 455, 452, 453, 459, 462, 467, 431, 469, 476, 477, 438, 440, 455, 441, 442, 0, 443, 0, 431, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 456, 455, 452, 453, 459, 462, 472, 472, 478, 476, 477, 479, 480, 455, 481, 472, 467, 482, 469, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 499, 500, 501, 502, 503, 478, 504, 505, 479, 480, 506, 481, 472, 507, 482, 508, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 499, 500, 501, 502, 503, 509, 504, 505, 510, 511, 506, 515, 516, 507, 509, 508, 518, 519, 523, 524, 527, 510, 528, 529, 530, 531, 533, 534, 535, 536, 537, 538, 539, 541, 0, 543, 509, 511, 544, 510, 511, 545, 515, 516, 546, 0, 542, 518, 519, 523, 524, 527, 548, 528, 529, 530, 531, 533, 534, 535, 536, 537, 538, 539, 541, 542, 543, 547, 549, 544, 550, 551, 545, 552, 553, 546, 547, 542, 554, 555, 556, 557, 558, 548, 559, 560, 561, 562, 563, 564, 565, 567, 568, 569, 570, 571, 542, 572, 547, 549, 573, 550, 551, 574, 552, 553, 576, 547, 577, 554, 555, 556, 557, 558, 578, 559, 560, 561, 562, 563, 564, 565, 567, 568, 569, 570, 571, 579, 572, 580, 581, 573, 582, 583, 574, 584, 585, 576, 586, 577, 587, 588, 589, 590, 591, 578, 593, 594, 595, 596, 597, 598, 599, 600, 601, 595, 603, 0, 579, 605, 580, 581, 607, 582, 583, 608, 584, 585, 609, 586, 610, 587, 588, 589, 590, 591, 611, 593, 594, 595, 596, 597, 598, 599, 600, 601, 595, 603, 604, 612, 605, 613, 614, 607, 615, 604, 608, 616, 617, 609, 615, 610, 618, 619, 620, 621, 622, 611, 623, 624, 625, 626, 615, 627, 628, 630, 631, 632, 633, 604, 612, 634, 613, 614, 636, 615, 604, 638, 616, 617, 640, 615, 629, 618, 619, 620, 621, 622, 629, 623, 624, 625, 626, 615, 627, 628, 630, 631, 632, 633, 629, 641, 634, 639, 642, 636, 643, 639, 638, 644, 645, 640, 646, 629, 647, 648, 649, 650, 651, 629, 652, 653, 654, 655, 656, 657, 658, 659, 655, 660, 661, 629, 641, 662, 639, 642, 663, 643, 639, 664, 644, 645, 665, 646, 666, 647, 648, 649, 650, 651, 667, 652, 653, 654, 655, 656, 657, 658, 659, 655, 660, 661, 668, 669, 662, 670, 671, 663, 672, 673, 664, 674, 675, 665, 676, 666, 677, 678, 679, 680, 681, 667, 682, 683, 687, 685, 688, 683, 689, 690, 691, 693, 694, 668, 669, 685, 670, 671, 695, 672, 673, 696, 674, 675, 697, 676, 698, 677, 678, 679, 680, 681, 699, 682, 683, 687, 685, 688, 683, 689, 690, 691, 693, 694, 700, 701, 685, 708, 709, 695, 710, 711, 696, 712, 713, 697, 714, 698, 715, 716, 717, 718, 719, 699, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 700, 701, 731, 708, 709, 732, 710, 711, 733, 712, 713, 734, 714, 735, 715, 716, 717, 718, 719, 737, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 738, 739, 731, 741, 744, 732, 746, 749, 733, 751, 752, 734, 754, 735, 755, 757, 741, 758, 759, 737, 760, 761, 762, 764, 766, 767, 768, 769, 770, 739, 769, 738, 739, 771, 741, 744, 765, 746, 749, 772, 751, 752, 765, 754, 765, 755, 757, 773, 758, 759, 775, 760, 761, 762, 764, 766, 767, 768, 769, 770, 776, 769, 777, 778, 771, 781, 783, 765, 784, 784, 772, 785, 787, 765, 788, 765, 789, 790, 773, 791, 792, 775, 793, 795, 796, 798, 799, 802, 803, 804, 806, 776, 807, 777, 778, 809, 781, 783, 0, 784, 784, 810, 785, 787, 812, 788, 813, 789, 790, 814, 791, 792, 805, 793, 795, 796, 798, 799, 802, 803, 804, 806, 805, 807, 815, 805, 809, 816, 819, 805, 805, 821, 810, 822, 823, 812, 817, 813, 824, 817, 814, 825, 817, 805, 826, 827, 817, 828, 829, 830, 831, 817, 832, 805, 833, 815, 805, 834, 816, 819, 805, 805, 821, 835, 822, 823, 836, 817, 837, 824, 817, 838, 825, 817, 839, 826, 827, 817, 828, 829, 830, 831, 817, 832, 840, 833, 841, 843, 834, 844, 845, 846, 847, 848, 835, 849, 850, 836, 851, 837, 852, 853, 838, 854, 856, 839, 858, 859, 860, 861, 862, 863, 864, 865, 866, 840, 867, 841, 843, 868, 844, 845, 846, 847, 848, 869, 849, 850, 870, 851, 871, 852, 853, 872, 854, 856, 873, 858, 859, 860, 861, 862, 863, 864, 865, 866, 874, 867, 875, 876, 868, 877, 878, 879, 880, 881, 869, 883, 882, 870, 877, 871, 884, 885, 872, 882, 886, 873, 887, 888, 889, 890, 893, 894, 893, 895, 896, 874, 897, 875, 876, 898, 877, 878, 879, 880, 881, 899, 883, 882, 893, 877, 901, 884, 885, 902, 882, 886, 903, 887, 888, 889, 890, 893, 894, 893, 895, 896, 904, 897, 906, 907, 898, 908, 909, 911, 913, 912, 899, 908, 914, 893, 917, 901, 918, 919, 902, 912, 920, 903, 921, 922, 924, 925, 926, 927, 928, 929, 930, 904, 931, 906, 907, 932, 908, 909, 911, 913, 912, 933, 908, 914, 934, 917, 936, 918, 919, 937, 912, 920, 938, 921, 922, 924, 925, 926, 927, 928, 929, 930, 939, 931, 941, 942, 932, 943, 946, 948, 949, 950, 933, 951, 953, 934, 0, 936, 959, 956, 937, 955, 960, 938, 961, 962, 963, 964, 965, 966, 968, 971, 973, 939, 974, 941, 942, 975, 943, 946, 948, 949, 950, 956, 951, 953, 976, 955, 977, 959, 956, 978, 955, 960, 980, 961, 962, 963, 964, 965, 966, 968, 971, 973, 982, 974, 983, 984, 975, 985, 986, 988, 989, 990, 991, 993, 994, 976, 996, 977, 997, 999, 978, 1001, 1002, 980, 1003, 1004, 1007, 1008, 1009, 1010, 1011, 1012, 1014, 982, 1015, 983, 984, 1016, 985, 986, 988, 989, 990, 991, 993, 994, 1017, 996, 1018, 997, 999, 1019, 1001, 1002, 1020, 1003, 1004, 1007, 1008, 1009, 1010, 1011, 1012, 1014, 1021, 1015, 1022, 1023, 1016, 1024, 1025, 1026, 1029, 1030, 1031, 1032, 1033, 1017, 1025, 1018, 1034, 1035, 1019, 1036, 1037, 1020, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1047, 1021, 1049, 1022, 1023, 1050, 1024, 1025, 1026, 1029, 1030, 1031, 1032, 1033, 1051, 1025, 1052, 1034, 1035, 1053, 1036, 1037, 1054, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1047, 1055, 1049, 1056, 1057, 1050, 1058, 1059, 1060, 1061, 1062, 1065, 1067, 1068, 1051, 1069, 1052, 1070, 1071, 1053, 1072, 1073, 1054, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1055, 1087, 1056, 1057, 1088, 1058, 1059, 1060, 1061, 1062, 1065, 1067, 1068, 1089, 1069, 1090, 1070, 1071, 1091, 1072, 1073, 1093, 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1094, 1087, 1095, 1096, 1088, 1097, 1098, 1099, 1100, 1101, 1102, 1105, 1108, 1089, 1109, 1090, 1110, 1111, 1091, 1112, 1113, 1093, 1114, 1115, 1116, 1101, 1117, 1118, 1119, 1120, 1121, 1094, 1122, 1095, 1096, 1123, 1097, 1098, 1099, 1100, 1101, 1102, 1105, 1108, 1128, 1109, 1129, 1110, 1111, 1130, 1112, 1113, 1131, 1114, 1115, 1116, 1101, 1117, 1118, 1119, 1120, 1121, 1132, 1122, 1133, 1134, 1123, 1135, 1137, 1138, 1139, 1140, 1141, 1142, 1144, 1128, 1145, 1129, 1146, 1147, 1130, 1148, 1150, 1131, 1155, 1156, 1157, 1151, 1158, 1159, 1160, 1161, 1162, 1132, 1163, 1133, 1134, 1164, 1135, 1137, 1138, 1139, 1140, 1141, 1142, 1144, 1165, 1145, 1150, 1146, 1147, 1151, 1148, 1150, 1166, 1155, 1156, 1157, 1151, 1158, 1159, 1160, 1161, 1162, 1168, 1163, 1169, 1170, 1164, 1171, 1173, 1175, 1177, 1178, 1179, 1180, 1182, 1165, 1183, 1185, 1186, 1187, 1188, 1189, 1190, 1166, 1191, 1192, 1193, 1194, 1196, 1197, 1198, 1199, 1201, 1168, 1202, 1169, 1170, 1203, 1171, 1173, 1175, 1177, 1178, 1179, 1180, 1182, 1204, 1183, 1185, 1186, 1187, 1188, 1189, 1190, 1205, 1191, 1192, 1193, 1194, 1196, 1197, 1198, 1199, 1201, 1206, 1202, 1207, 1208, 1203, 1209, 1211, 1212, 1214, 1215, 1216, 1217, 1218, 1204, 1219, 1220, 1221, 1223, 1224, 1225, 1226, 1205, 1227, 1229, 1230, 1231, 1232, 1233, 1234, 1236, 1237, 1206, 1238, 1207, 1208, 1239, 1209, 1211, 1212, 1214, 1215, 1216, 1217, 1218, 1240, 1219, 1220, 1221, 1223, 1224, 1225, 1226, 1244, 1227, 1229, 1230, 1231, 1232, 1233, 1234, 1236, 1237, 1242, 1238, 1242, 1245, 1239, 1246, 1247, 1249, 1250, 1252, 1254, 1255, 1256, 1240, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1244, 1264, 1245, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1242, 1272, 1242, 1245, 1273, 1246, 1247, 1249, 1250, 1252, 1254, 1255, 1256, 1274, 1257, 1258, 1259, 1260, 1261, 1262, 1263, 1275, 1264, 1245, 1265, 1266, 1267, 1268, 1269, 1270, 1271, 1276, 1272, 1278, 1277, 1273, 1277, 1279, 1280, 1281, 1283, 1284, 1285, 1286, 1274, 1287, 1290, 1291, 1292, 1294, 1297, 1298, 1275, 1300, 1301, 1302, 1304, 1305, 1306, 1307, 1308, 1309, 1276, 1315, 1278, 1277, 1312, 1277, 1279, 1280, 1281, 1283, 1284, 1285, 1286, 1311, 1287, 1290, 1291, 1292, 1294, 1297, 1298, 1312, 1300, 1301, 1302, 1304, 1305, 1306, 1307, 1308, 1309, 1316, 1315, 1317, 1318, 1312, 1319, 1311, 1321, 1322, 1323, 1324, 1325, 1326, 1311, 1327, 1328, 1329, 1330, 1331, 1333, 1334, 1336, 1337, 1338, 1339, 1340, 1343, 1344, 1345, 1346, 1348, 1316, 1349, 1317, 1318, 1350, 1319, 1352, 1321, 1322, 1323, 1324, 1325, 1326, 1353, 1327, 1328, 1329, 1330, 1331, 1333, 1334, 1336, 1337, 1338, 1339, 1340, 1343, 1344, 1345, 1346, 1348, 1354, 1349, 1355, 1356, 1350, 1357, 1352, 1358, 1359, 1360, 1361, 1362, 1363, 1353, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1354, 1386, 1355, 1356, 1387, 1357, 1388, 1358, 1359, 1360, 1361, 1362, 1363, 1389, 1364, 1365, 1366, 1367, 1368, 1369, 1370, 1371, 1372, 1376, 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1390, 1386, 1391, 1392, 1387, 1394, 1388, 1395, 1397, 1398, 1400, 1401, 1402, 1389, 1404, 1405, 1406, 1407, 1408, 1410, 1412, 1413, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1424, 1426, 1390, 1427, 1391, 1392, 1428, 1394, 1432, 1395, 1397, 1398, 1400, 1401, 1402, 1433, 1404, 1405, 1406, 1407, 1408, 1410, 1412, 1413, 1415, 1416, 1417, 1418, 1419, 1420, 1421, 1424, 1426, 1435, 1427, 1439, 1440, 1428, 1441, 1432, 1443, 1444, 1446, 1447, 1448, 1449, 1433, 1451, 1453, 1456, 1458, 1459, 1461, 1463, 1464, 1466, 1467, 1468, 1469, 1446, 1447, 1471, 1475, 1477, 1435, 1478, 1439, 1440, 1479, 1441, 1480, 1443, 1444, 1446, 1447, 1448, 1449, 1481, 1451, 1453, 1456, 1458, 1459, 1461, 1463, 1464, 1466, 1467, 1468, 1469, 1483, 1484, 1471, 1475, 1477, 1485, 1478, 1486, 1487, 1479, 1488, 1480, 1489, 1490, 1491, 1492, 1493, 1495, 1481, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1483, 1484, 1508, 1509, 1510, 1485, 1511, 1486, 1487, 1512, 1488, 1513, 1489, 1490, 1491, 1492, 1493, 1495, 1514, 1496, 1497, 1498, 1499, 1500, 1501, 1502, 1503, 1504, 1505, 1506, 1507, 1515, 1516, 1508, 1509, 1510, 1517, 1511, 1518, 1519, 1512, 1520, 1513, 1522, 1524, 1525, 1526, 1527, 1528, 1514, 1529, 1530, 1534, 1537, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1515, 1516, 1550, 1552, 0, 1517, 1553, 1518, 1519, 1558, 1520, 1562, 1522, 1524, 1525, 1526, 1527, 1528, 1548, 1529, 1530, 1534, 1537, 1539, 1540, 1541, 1542, 1543, 1544, 1545, 1546, 1549, 1563, 1550, 1552, 1548, 1566, 1553, 1557, 1570, 1558, 1549, 1562, 1557, 1571, 1572, 1573, 1574, 1575, 1548, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1587, 1588, 1589, 1590, 1549, 1563, 1591, 1592, 1593, 1566, 1594, 1557, 1570, 1595, 1597, 1598, 1557, 1571, 1572, 1573, 1574, 1575, 1599, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1587, 1588, 1589, 1590, 1600, 1601, 1591, 1592, 1593, 1602, 1594, 1604, 1607, 1595, 1597, 1598, 1608, 1610, 1614, 1616, 1617, 1618, 1599, 1626, 1627, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1626, 1638, 1600, 1601, 1639, 1640, 1641, 1602, 1642, 1604, 1607, 1627, 1647, 1648, 1608, 1610, 1614, 1616, 1617, 1618, 1649, 1626, 1627, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1652, 1638, 1655, 1656, 1639, 1640, 1641, 1658, 1642, 1660, 1661, 1662, 1647, 1648, 1663, 1666, 1669, 1671, 1672, 1674, 1649, 1675, 1676, 1678, 1675, 1679, 1680, 1682, 1683, 1684, 1685, 1652, 1686, 1655, 1656, 1688, 1689, 1690, 1658, 1674, 1660, 1661, 1662, 1692, 1693, 1663, 1666, 1669, 1671, 1672, 1674, 1695, 1675, 1676, 1678, 1696, 1679, 1680, 1682, 1683, 1684, 1685, 1700, 1686, 1701, 1702, 1688, 1689, 1690, 1703, 1704, 0, 1706, 1704, 1692, 1693, 1707, 1708, 1705, 1712, 1713, 1715, 1695, 1716, 1718, 1722, 1696, 1723, 1724, 1725, 0, 1728, 1729, 1700, 1731, 1701, 1702, 1726, 1732, 1733, 1703, 1704, 1705, 1706, 1734, 1738, 1743, 1707, 1708, 1705, 1712, 1713, 1715, 1744, 1716, 1718, 1722, 1745, 1723, 1724, 1725, 1726, 1728, 1729, 1748, 1731, 1750, 1751, 1726, 1732, 1733, 1752, 1755, 1756, 0, 1734, 1738, 1743, 0, 0, 0, 0, 0, 0, 1744, 0, 0, 0, 1745, 0, 0, 0, 0, 0, 0, 1748, 0, 1750, 1751, 0, 0, 0, 1752, 1755, 1756, 1760, 1760, 1760, 1760, 1760, 1761, 1761, 1761, 1761, 1761, 1762, 1762, 1762, 1762, 1762, 1763, 0, 1763, 1763, 1763, 1764, 0, 1764, 1764, 1764, 1766, 1766, 1766, 1766, 1766, 1767, 1767, 1767, 1767, 1767, 1768, 0, 1768, 1768, 1768, 1769, 1769, 1769, 1769, 1769, 1770, 1770, 1770, 1770, 1770, 1771, 1771, 1771, 1771, 1771, 1772, 1772, 1772, 1772, 1772, 1773, 1773, 0, 1773, 1773, 1774, 0, 1774, 0, 1774, 1775, 1775, 1775, 1775, 1775, 1776, 1776, 1776, 1776, 1776, 1777, 1777, 1777, 1777, 1777, 1778, 1778, 1778, 1778, 1778, 1779, 1779, 1779, 1779, 1779, 1780, 1780, 1780, 1780, 1780, 1781, 0, 1781, 1781, 1781, 1782, 1782, 1782, 1782, 1782, 1783, 0, 1783, 1783, 1783, 1784, 1784, 1784, 1784, 1784, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759, 1759 } ; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int yy_flex_debug; int yy_flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; #line 1 "src/maplexer.l" #line 4 "src/maplexer.l" /* ** READ ME FIRST! ** ** When this file is altered, it is necessary to do "make lexer". Due to ** problems detailed in #2310 the lexer is no longer automatically rebuilt ** when maplexer.l is altered. */ #define YY_NO_INPUT /* C declarations */ #include #include #include #include #include #include "mapserver.h" #include "maperror.h" #include "mapfile.h" #include "maptime.h" #include "mapsymbol.h" #include "mapparser.h" #include "mapprimitive.h" /* msyylineno is required for flex 2.5.4 and older, but is already defined by * flex 2.5.31 (bug 975). * Unfortunately there is no clean way to differentiate the two versions, * so we use the symbol YY_CURRENT_BUFFER_LVALUE to base our test since it * was not present in 2.5.4 and is present in 2.5.31. Hopefully that won't * put us in trouble with other versions. If that happens then we can * switch to using autoconf to detect the version. */ #ifndef YY_CURRENT_BUFFER_LVALUE int msyylineno = 1; #endif #define YY_NO_INPUT /* Below is a redefinition of the default YY_INPUT() macro but replacing the * YY_FATAL_ERROR() macro with a call to msSetError(). */ /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ msSetError(MS_PARSEERR, "%s", "msyyparse()", "input in flex scanner failed"); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ msSetError(MS_PARSEERR, "%s", "msyyparse()", "input in flex scanner failed"); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ } int msyysource=MS_STRING_TOKENS; double msyynumber; int msyystate=MS_TOKENIZE_DEFAULT; const char *msyystring=NULL; char *msyybasepath=NULL; int msyystring_buffer_size = 0; int msyystring_size; char msyystring_begin; char *msyystring_buffer = NULL; int msyystring_icase = MS_FALSE; int msyystring_return_state; int msyystring_begin_state; int msyyreturncomments = 0; #define MS_LEXER_STRING_REALLOC(string, string_size, max_size) \ do { \ const int string_size_macro = (int)(string_size); \ if (string_size_macro >= (int)(max_size)) { \ max_size = (((int)(max_size)*2) > string_size_macro) ? ((int)(max_size))*2 : string_size_macro+1; \ string = (char *) msSmallRealloc(string, sizeof(char *) * (max_size)); \ } \ } while(0) #define MS_LEXER_RETURN_TOKEN(token) \ MS_LEXER_STRING_REALLOC(msyystring_buffer, strlen(msyytext), \ msyystring_buffer_size); \ strcpy(msyystring_buffer, msyytext); \ return(token); #define MAX_INCLUDE_DEPTH 5 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; int include_lineno[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; char path[MS_MAXPATHLEN]; #line 2297 "src/maplexer.c" #line 2299 "src/maplexer.c" #define INITIAL 0 #define EXPRESSION_STRING 1 #define INCLUDE 2 #define MSSTRING 3 #define MULTILINE_COMMENT 4 #define CONFIG_FILE 5 #ifndef YY_EXTRA_TYPE #define YY_EXTRA_TYPE void * #endif static int yy_init_globals ( void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy ( void ); int yyget_debug ( void ); void yyset_debug ( int debug_flag ); YY_EXTRA_TYPE yyget_extra ( void ); void yyset_extra ( YY_EXTRA_TYPE user_defined ); FILE *yyget_in ( void ); void yyset_in ( FILE * _in_str ); FILE *yyget_out ( void ); void yyset_out ( FILE * _out_str ); int yyget_leng ( void ); char *yyget_text ( void ); int yyget_lineno ( void ); void yyset_lineno ( int _line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap ( void ); #else extern int yywrap ( void ); #endif #endif #ifndef YY_NO_UNPUT static void yyunput ( int c, char *buf_ptr ); #endif #ifndef yytext_ptr static void yy_flex_strncpy ( char *, const char *, int ); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen ( const char * ); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput ( void ); #else static int input ( void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (void); #define YY_DECL int yylex (void) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; if ( !(yy_init) ) { (yy_init) = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! (yy_start) ) (yy_start) = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_load_buffer_state( ); } { #line 123 "src/maplexer.l" #line 125 "src/maplexer.l" if (msyystring_buffer == NULL) { msyystring_buffer_size = 256; msyystring_buffer = (char*) msSmallMalloc(sizeof(char) * msyystring_buffer_size); } msyystring_buffer[0] = '\0'; switch(msyystate) { case(MS_TOKENIZE_DEFAULT): (void) yyunput; /* just to avoid warning about it being unrefed */ break; case(MS_TOKENIZE_FILE): BEGIN(INITIAL); msyystring_begin_state = INITIAL; msyysource=MS_FILE_TOKENS; msyystate=MS_TOKENIZE_DEFAULT; msyystring=NULL; msyyreturncomments=0; include_stack_ptr=0; return(0); break; case(MS_TOKENIZE_STRING): BEGIN(INITIAL); msyystring_begin_state = INITIAL; msyy_delete_buffer(YY_CURRENT_BUFFER); msyy_scan_string(msyystring); msyysource=MS_STRING_TOKENS; msyystate=MS_TOKENIZE_DEFAULT; msyyin=NULL; msyyreturncomments=0; include_stack_ptr=0; return(0); break; case(MS_TOKENIZE_EXPRESSION): BEGIN(EXPRESSION_STRING); msyystring_begin_state = EXPRESSION_STRING; msyy_delete_buffer(YY_CURRENT_BUFFER); msyy_scan_string(msyystring); msyystate=MS_TOKENIZE_DEFAULT; msyyreturncomments=0; break; case(MS_TOKENIZE_CONFIG): BEGIN(CONFIG_FILE); msyystring_begin_state = CONFIG_FILE; msyysource=MS_FILE_TOKENS; msyystate=MS_TOKENIZE_DEFAULT; msyystring=NULL; msyyreturncomments=0; return(0); break; case(99): BEGIN(INITIAL); /* may not need this one */ msyystring_begin_state = INITIAL; msyy_delete_buffer(YY_CURRENT_BUFFER); msyystate=MS_TOKENIZE_DEFAULT; msyystring=NULL; msyyreturncomments=0; return(0); break; default: break; } #line 2579 "src/maplexer.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); /* Support of yytext. */ *yy_cp = (yy_hold_char); /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = (yy_start); yy_match: do { YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1760 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_current_state != 1759 ); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = (yy_hold_char); yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; case 1: YY_RULE_SETUP #line 188 "src/maplexer.l" ; YY_BREAK case 2: YY_RULE_SETUP #line 190 "src/maplexer.l" { if (msyyreturncomments) return(MS_COMMENT); } YY_BREAK case 3: YY_RULE_SETUP #line 192 "src/maplexer.l" { BEGIN(MULTILINE_COMMENT); } YY_BREAK case 4: YY_RULE_SETUP #line 193 "src/maplexer.l" { BEGIN(INITIAL); } YY_BREAK case 5: YY_RULE_SETUP #line 194 "src/maplexer.l" ; YY_BREAK case 6: YY_RULE_SETUP #line 195 "src/maplexer.l" ; YY_BREAK case 7: /* rule 7 can match eol */ YY_RULE_SETUP #line 196 "src/maplexer.l" { msyylineno++; } YY_BREAK case 8: YY_RULE_SETUP #line 198 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION); } YY_BREAK case 9: YY_RULE_SETUP #line 199 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION_ENV); } YY_BREAK case 10: YY_RULE_SETUP #line 200 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION_MAPS); } YY_BREAK case 11: YY_RULE_SETUP #line 201 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION_PLUGINS) } YY_BREAK case 12: YY_RULE_SETUP #line 203 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_LOGICAL_OR); } YY_BREAK case 13: YY_RULE_SETUP #line 204 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_LOGICAL_AND); } YY_BREAK case 14: YY_RULE_SETUP #line 205 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_LOGICAL_NOT); } YY_BREAK case 15: YY_RULE_SETUP #line 206 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_EQ); } YY_BREAK case 16: YY_RULE_SETUP #line 207 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_NE); } YY_BREAK case 17: YY_RULE_SETUP #line 208 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_GT); } YY_BREAK case 18: YY_RULE_SETUP #line 209 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_LT); } YY_BREAK case 19: YY_RULE_SETUP #line 210 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_GE); } YY_BREAK case 20: YY_RULE_SETUP #line 211 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_LE); } YY_BREAK case 21: YY_RULE_SETUP #line 212 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_RE); } YY_BREAK case 22: YY_RULE_SETUP #line 214 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_IEQ); } YY_BREAK case 23: YY_RULE_SETUP #line 215 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_IRE); } YY_BREAK case 24: YY_RULE_SETUP #line 217 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_IN); /* was IN */ } YY_BREAK case 25: YY_RULE_SETUP #line 219 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_AREA); } YY_BREAK case 26: YY_RULE_SETUP #line 220 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_LENGTH); } YY_BREAK case 27: YY_RULE_SETUP #line 221 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_TOSTRING); } YY_BREAK case 28: YY_RULE_SETUP #line 222 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_COMMIFY); } YY_BREAK case 29: YY_RULE_SETUP #line 223 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_ROUND); } YY_BREAK case 30: YY_RULE_SETUP #line 224 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_UPPER); } YY_BREAK case 31: YY_RULE_SETUP #line 225 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_LOWER); } YY_BREAK case 32: YY_RULE_SETUP #line 226 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_INITCAP); } YY_BREAK case 33: YY_RULE_SETUP #line 227 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_FIRSTCAP); } YY_BREAK case 34: YY_RULE_SETUP #line 229 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_BUFFER); } YY_BREAK case 35: YY_RULE_SETUP #line 230 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_DIFFERENCE); } YY_BREAK case 36: YY_RULE_SETUP #line 231 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_SIMPLIFY); } YY_BREAK case 37: YY_RULE_SETUP #line 232 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_SIMPLIFYPT); } YY_BREAK case 38: YY_RULE_SETUP #line 233 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_GENERALIZE); } YY_BREAK case 39: YY_RULE_SETUP #line 234 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_SMOOTHSIA); } YY_BREAK case 40: YY_RULE_SETUP #line 235 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_CENTERLINE); } YY_BREAK case 41: YY_RULE_SETUP #line 236 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_DENSIFY); } YY_BREAK case 42: YY_RULE_SETUP #line 237 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_OUTER); } YY_BREAK case 43: YY_RULE_SETUP #line 238 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_INNER); } YY_BREAK case 44: YY_RULE_SETUP #line 239 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_JAVASCRIPT); } YY_BREAK case 45: YY_RULE_SETUP #line 241 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_INTERSECTS); } YY_BREAK case 46: YY_RULE_SETUP #line 242 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_DISJOINT); } YY_BREAK case 47: YY_RULE_SETUP #line 243 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_TOUCHES); } YY_BREAK case 48: YY_RULE_SETUP #line 244 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_OVERLAPS); } YY_BREAK case 49: YY_RULE_SETUP #line 245 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_CROSSES); } YY_BREAK case 50: YY_RULE_SETUP #line 246 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_WITHIN); } YY_BREAK case 51: YY_RULE_SETUP #line 247 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_CONTAINS); } YY_BREAK case 52: YY_RULE_SETUP #line 248 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_EQUALS); } YY_BREAK case 53: YY_RULE_SETUP #line 249 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_BEYOND); } YY_BREAK case 54: YY_RULE_SETUP #line 250 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_DWITHIN); } YY_BREAK case 55: YY_RULE_SETUP #line 252 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_FROMTEXT); } YY_BREAK case 56: YY_RULE_SETUP #line 254 "src/maplexer.l" { msyynumber=MS_TRUE; return(MS_TOKEN_LITERAL_BOOLEAN); } YY_BREAK case 57: YY_RULE_SETUP #line 255 "src/maplexer.l" { msyynumber=MS_FALSE; return(MS_TOKEN_LITERAL_BOOLEAN); } YY_BREAK case 58: YY_RULE_SETUP #line 257 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(COLORRANGE); } YY_BREAK case 59: YY_RULE_SETUP #line 258 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(DATARANGE); } YY_BREAK case 60: YY_RULE_SETUP #line 259 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(RANGEITEM); } YY_BREAK case 61: YY_RULE_SETUP #line 261 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ALIGN); } YY_BREAK case 62: YY_RULE_SETUP #line 262 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ANCHORPOINT); } YY_BREAK case 63: YY_RULE_SETUP #line 263 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ANGLE); } YY_BREAK case 64: YY_RULE_SETUP #line 264 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ANTIALIAS); } YY_BREAK case 65: YY_RULE_SETUP #line 265 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(BACKGROUNDCOLOR); } YY_BREAK case 66: YY_RULE_SETUP #line 266 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(BANDSITEM); } YY_BREAK case 67: YY_RULE_SETUP #line 267 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(BINDVALS); } YY_BREAK case 68: YY_RULE_SETUP #line 268 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(BOM); } YY_BREAK case 69: YY_RULE_SETUP #line 269 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(BROWSEFORMAT); } YY_BREAK case 70: YY_RULE_SETUP #line 270 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(BUFFER); } YY_BREAK case 71: YY_RULE_SETUP #line 271 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CHARACTER); } YY_BREAK case 72: YY_RULE_SETUP #line 272 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CLASS); } YY_BREAK case 73: YY_RULE_SETUP #line 273 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CLASSITEM); } YY_BREAK case 74: YY_RULE_SETUP #line 274 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CLASSGROUP); } YY_BREAK case 75: YY_RULE_SETUP #line 275 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CLUSTER); } YY_BREAK case 76: YY_RULE_SETUP #line 276 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(COLOR); } YY_BREAK case 77: YY_RULE_SETUP #line 277 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(COMPFILTER); } YY_BREAK case 78: YY_RULE_SETUP #line 278 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(COMPOSITE); } YY_BREAK case 79: YY_RULE_SETUP #line 279 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(COMPOP); } YY_BREAK case 80: YY_RULE_SETUP #line 280 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CONFIG); } YY_BREAK case 81: YY_RULE_SETUP #line 281 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CONNECTION); } YY_BREAK case 82: YY_RULE_SETUP #line 282 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CONNECTIONTYPE); } YY_BREAK case 83: YY_RULE_SETUP #line 283 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(DATA); } YY_BREAK case 84: YY_RULE_SETUP #line 284 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(DEBUG); } YY_BREAK case 85: YY_RULE_SETUP #line 285 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(DRIVER); } YY_BREAK case 86: YY_RULE_SETUP #line 286 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(EMPTY); } YY_BREAK case 87: YY_RULE_SETUP #line 287 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ENCODING); } YY_BREAK case 88: YY_RULE_SETUP #line 288 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(END); } YY_BREAK case 89: YY_RULE_SETUP #line 289 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ERROR); } YY_BREAK case 90: YY_RULE_SETUP #line 290 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(EXPRESSION); } YY_BREAK case 91: YY_RULE_SETUP #line 291 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(EXTENT); } YY_BREAK case 92: YY_RULE_SETUP #line 292 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(EXTENSION); } YY_BREAK case 93: YY_RULE_SETUP #line 293 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FALLBACK); } YY_BREAK case 94: YY_RULE_SETUP #line 294 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FEATURE); } YY_BREAK case 95: YY_RULE_SETUP #line 295 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FILLED); } YY_BREAK case 96: YY_RULE_SETUP #line 296 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FILTER); } YY_BREAK case 97: YY_RULE_SETUP #line 297 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FILTERITEM); } YY_BREAK case 98: YY_RULE_SETUP #line 298 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FOOTER); } YY_BREAK case 99: YY_RULE_SETUP #line 299 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FONT); } YY_BREAK case 100: YY_RULE_SETUP #line 300 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FONTSET); } YY_BREAK case 101: YY_RULE_SETUP #line 301 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FORCE); } YY_BREAK case 102: YY_RULE_SETUP #line 302 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FORMATOPTION); } YY_BREAK case 103: YY_RULE_SETUP #line 303 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(FROM); } YY_BREAK case 104: YY_RULE_SETUP #line 304 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(GAP); } YY_BREAK case 105: YY_RULE_SETUP #line 305 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(GEOMTRANSFORM); } YY_BREAK case 106: YY_RULE_SETUP #line 306 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(GRID); } YY_BREAK case 107: YY_RULE_SETUP #line 307 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(GRIDSTEP); } YY_BREAK case 108: YY_RULE_SETUP #line 308 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(GRATICULE); } YY_BREAK case 109: YY_RULE_SETUP #line 309 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(GROUP); } YY_BREAK case 110: YY_RULE_SETUP #line 310 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(HEADER); } YY_BREAK case 111: YY_RULE_SETUP #line 311 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IMAGE); } YY_BREAK case 112: YY_RULE_SETUP #line 312 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IMAGECOLOR); } YY_BREAK case 113: YY_RULE_SETUP #line 313 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IMAGETYPE); } YY_BREAK case 114: YY_RULE_SETUP #line 314 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IMAGEMODE); } YY_BREAK case 115: YY_RULE_SETUP #line 315 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IMAGEPATH); } YY_BREAK case 116: YY_RULE_SETUP #line 316 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TEMPPATH); } YY_BREAK case 117: YY_RULE_SETUP #line 317 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IMAGEURL); } YY_BREAK case 118: YY_RULE_SETUP #line 318 "src/maplexer.l" { BEGIN(INCLUDE); } YY_BREAK case 119: YY_RULE_SETUP #line 319 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(INDEX); } YY_BREAK case 120: YY_RULE_SETUP #line 320 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(INITIALGAP); } YY_BREAK case 121: YY_RULE_SETUP #line 321 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(INTERVALS); } YY_BREAK case 122: YY_RULE_SETUP #line 322 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(JOIN); } YY_BREAK case 123: YY_RULE_SETUP #line 323 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(KEYIMAGE); } YY_BREAK case 124: YY_RULE_SETUP #line 324 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(KEYSIZE); } YY_BREAK case 125: YY_RULE_SETUP #line 325 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(KEYSPACING); } YY_BREAK case 126: YY_RULE_SETUP #line 326 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABEL); } YY_BREAK case 127: YY_RULE_SETUP #line 327 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELCACHE); } YY_BREAK case 128: YY_RULE_SETUP #line 328 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELFORMAT); } YY_BREAK case 129: YY_RULE_SETUP #line 329 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELITEM); } YY_BREAK case 130: YY_RULE_SETUP #line 330 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELMAXSCALE); } YY_BREAK case 131: YY_RULE_SETUP #line 331 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELMAXSCALEDENOM); } YY_BREAK case 132: YY_RULE_SETUP #line 332 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELMINSCALE); } YY_BREAK case 133: YY_RULE_SETUP #line 333 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELMINSCALEDENOM); } YY_BREAK case 134: YY_RULE_SETUP #line 334 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LABELREQUIRES); } YY_BREAK case 135: YY_RULE_SETUP #line 335 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LATLON); } YY_BREAK case 136: YY_RULE_SETUP #line 336 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LAYER); } YY_BREAK case 137: YY_RULE_SETUP #line 337 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LEADER); } YY_BREAK case 138: YY_RULE_SETUP #line 338 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LEGEND); } YY_BREAK case 139: YY_RULE_SETUP #line 339 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LEGENDFORMAT); } YY_BREAK case 140: YY_RULE_SETUP #line 340 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LINECAP); } YY_BREAK case 141: YY_RULE_SETUP #line 341 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LINEJOIN); } YY_BREAK case 142: YY_RULE_SETUP #line 342 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(LINEJOINMAXSIZE); } YY_BREAK case 143: YY_RULE_SETUP #line 343 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAP); } YY_BREAK case 144: YY_RULE_SETUP #line 344 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MARKER); } YY_BREAK case 145: YY_RULE_SETUP #line 345 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MARKERSIZE); } YY_BREAK case 146: YY_RULE_SETUP #line 346 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MASK); } YY_BREAK case 147: YY_RULE_SETUP #line 347 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXARCS); } YY_BREAK case 148: YY_RULE_SETUP #line 348 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXBOXSIZE); } YY_BREAK case 149: YY_RULE_SETUP #line 349 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXDISTANCE); } YY_BREAK case 150: YY_RULE_SETUP #line 350 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXFEATURES); } YY_BREAK case 151: YY_RULE_SETUP #line 351 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXINTERVAL); } YY_BREAK case 152: YY_RULE_SETUP #line 352 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXSCALE); } YY_BREAK case 153: YY_RULE_SETUP #line 353 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXSCALEDENOM); } YY_BREAK case 154: YY_RULE_SETUP #line 354 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXGEOWIDTH); } YY_BREAK case 155: YY_RULE_SETUP #line 355 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXLENGTH); } YY_BREAK case 156: YY_RULE_SETUP #line 356 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXSIZE); } YY_BREAK case 157: YY_RULE_SETUP #line 357 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXSUBDIVIDE); } YY_BREAK case 158: YY_RULE_SETUP #line 358 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXTEMPLATE); } YY_BREAK case 159: YY_RULE_SETUP #line 359 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXWIDTH); } YY_BREAK case 160: YY_RULE_SETUP #line 360 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(METADATA); } YY_BREAK case 161: YY_RULE_SETUP #line 361 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MIMETYPE); } YY_BREAK case 162: YY_RULE_SETUP #line 362 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINARCS); } YY_BREAK case 163: YY_RULE_SETUP #line 363 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINBOXSIZE); } YY_BREAK case 164: YY_RULE_SETUP #line 364 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINDISTANCE); } YY_BREAK case 165: YY_RULE_SETUP #line 365 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(REPEATDISTANCE); } YY_BREAK case 166: YY_RULE_SETUP #line 366 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MAXOVERLAPANGLE); } YY_BREAK case 167: YY_RULE_SETUP #line 367 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINFEATURESIZE); } YY_BREAK case 168: YY_RULE_SETUP #line 368 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MININTERVAL); } YY_BREAK case 169: YY_RULE_SETUP #line 369 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINSCALE); } YY_BREAK case 170: YY_RULE_SETUP #line 370 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINSCALEDENOM); } YY_BREAK case 171: YY_RULE_SETUP #line 371 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINGEOWIDTH); } YY_BREAK case 172: YY_RULE_SETUP #line 372 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINSIZE); } YY_BREAK case 173: YY_RULE_SETUP #line 373 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINSUBDIVIDE); } YY_BREAK case 174: YY_RULE_SETUP #line 374 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINTEMPLATE); } YY_BREAK case 175: YY_RULE_SETUP #line 375 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MINWIDTH); } YY_BREAK case 176: YY_RULE_SETUP #line 376 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(NAME); } YY_BREAK case 177: YY_RULE_SETUP #line 377 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(OFFSET); } YY_BREAK case 178: YY_RULE_SETUP #line 378 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(OFFSITE); } YY_BREAK case 179: YY_RULE_SETUP #line 379 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(OPACITY); } YY_BREAK case 180: YY_RULE_SETUP #line 380 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CONNECTIONOPTIONS); } YY_BREAK case 181: YY_RULE_SETUP #line 381 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(OUTLINECOLOR); } YY_BREAK case 182: YY_RULE_SETUP #line 382 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(OUTLINEWIDTH); } YY_BREAK case 183: YY_RULE_SETUP #line 383 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(OUTPUTFORMAT); } YY_BREAK case 184: YY_RULE_SETUP #line 384 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(PARTIALS); } YY_BREAK case 185: YY_RULE_SETUP #line 385 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(PATTERN); } YY_BREAK case 186: YY_RULE_SETUP #line 386 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(POINTS); } YY_BREAK case 187: YY_RULE_SETUP #line 387 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(ITEMS); } YY_BREAK case 188: YY_RULE_SETUP #line 388 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(POSITION); } YY_BREAK case 189: YY_RULE_SETUP #line 389 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(POSTLABELCACHE); } YY_BREAK case 190: YY_RULE_SETUP #line 390 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(PRIORITY); } YY_BREAK case 191: YY_RULE_SETUP #line 391 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(PROCESSING); } YY_BREAK case 192: YY_RULE_SETUP #line 392 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(PROJECTION); } YY_BREAK case 193: YY_RULE_SETUP #line 393 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(QUERYFORMAT); } YY_BREAK case 194: YY_RULE_SETUP #line 394 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(QUERYMAP); } YY_BREAK case 195: YY_RULE_SETUP #line 395 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(REFERENCE); } YY_BREAK case 196: YY_RULE_SETUP #line 396 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(REGION); } YY_BREAK case 197: YY_RULE_SETUP #line 397 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(RELATIVETO); } YY_BREAK case 198: YY_RULE_SETUP #line 398 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(REQUIRES); } YY_BREAK case 199: YY_RULE_SETUP #line 399 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(RESOLUTION); } YY_BREAK case 200: YY_RULE_SETUP #line 400 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(DEFRESOLUTION); } YY_BREAK case 201: YY_RULE_SETUP #line 401 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SCALE); } YY_BREAK case 202: YY_RULE_SETUP #line 402 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SCALEDENOM); } YY_BREAK case 203: YY_RULE_SETUP #line 403 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SCALEBAR); } YY_BREAK case 204: YY_RULE_SETUP #line 404 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SCALETOKEN); } YY_BREAK case 205: YY_RULE_SETUP #line 405 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SHADOWCOLOR); } YY_BREAK case 206: YY_RULE_SETUP #line 406 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SHADOWSIZE); } YY_BREAK case 207: YY_RULE_SETUP #line 407 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SHAPEPATH); } YY_BREAK case 208: YY_RULE_SETUP #line 408 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SIZE); } YY_BREAK case 209: YY_RULE_SETUP #line 409 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SIZEUNITS); } YY_BREAK case 210: YY_RULE_SETUP #line 410 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(STATUS); } YY_BREAK case 211: YY_RULE_SETUP #line 411 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(STYLE); } YY_BREAK case 212: YY_RULE_SETUP #line 412 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(STYLEITEM); } YY_BREAK case 213: YY_RULE_SETUP #line 413 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SYMBOL); } YY_BREAK case 214: YY_RULE_SETUP #line 414 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SYMBOLSCALE); } YY_BREAK case 215: YY_RULE_SETUP #line 415 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SYMBOLSCALEDENOM); } YY_BREAK case 216: YY_RULE_SETUP #line 416 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(SYMBOLSET); } YY_BREAK case 217: YY_RULE_SETUP #line 417 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TABLE); } YY_BREAK case 218: YY_RULE_SETUP #line 418 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TEMPLATE); } YY_BREAK case 219: YY_RULE_SETUP #line 419 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TEXT); } YY_BREAK case 220: YY_RULE_SETUP #line 420 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TILEINDEX); } YY_BREAK case 221: YY_RULE_SETUP #line 421 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TILEITEM); } YY_BREAK case 222: YY_RULE_SETUP #line 422 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TILESRS); } YY_BREAK case 223: YY_RULE_SETUP #line 423 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TITLE); } YY_BREAK case 224: YY_RULE_SETUP #line 424 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TO); } YY_BREAK case 225: YY_RULE_SETUP #line 425 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TOLERANCE); } YY_BREAK case 226: YY_RULE_SETUP #line 426 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TOLERANCEUNITS); } YY_BREAK case 227: YY_RULE_SETUP #line 427 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(IDENTIFY); } YY_BREAK case 228: YY_RULE_SETUP #line 428 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(CLASSAUTO); } YY_BREAK case 229: YY_RULE_SETUP #line 429 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TRANSPARENT); } YY_BREAK case 230: YY_RULE_SETUP #line 430 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TRANSFORM); } YY_BREAK case 231: YY_RULE_SETUP #line 431 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(TYPE); } YY_BREAK case 232: YY_RULE_SETUP #line 432 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(UNITS); } YY_BREAK case 233: YY_RULE_SETUP #line 433 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(UTFDATA); } YY_BREAK case 234: YY_RULE_SETUP #line 434 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(UTFITEM); } YY_BREAK case 235: YY_RULE_SETUP #line 435 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(VALIDATION); } YY_BREAK case 236: YY_RULE_SETUP #line 436 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(VALUES); } YY_BREAK case 237: YY_RULE_SETUP #line 437 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(WEB); } YY_BREAK case 238: YY_RULE_SETUP #line 438 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(WIDTH); } YY_BREAK case 239: YY_RULE_SETUP #line 439 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(WKT); } YY_BREAK case 240: YY_RULE_SETUP #line 440 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(WRAP); } YY_BREAK case 241: YY_RULE_SETUP #line 442 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_ANNOTATION); } YY_BREAK case 242: YY_RULE_SETUP #line 443 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_AUTO); } YY_BREAK case 243: YY_RULE_SETUP #line 444 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_AUTO2); } YY_BREAK case 244: YY_RULE_SETUP #line 445 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_BEVEL); } YY_BREAK case 245: YY_RULE_SETUP #line 446 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_BITMAP); } YY_BREAK case 246: YY_RULE_SETUP #line 447 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_BUTT); } YY_BREAK case 247: YY_RULE_SETUP #line 448 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CC); } YY_BREAK case 248: YY_RULE_SETUP #line 449 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_ALIGN_CENTER); } YY_BREAK case 249: YY_RULE_SETUP #line 450 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_CHART); } YY_BREAK case 250: YY_RULE_SETUP #line 451 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_CIRCLE); } YY_BREAK case 251: YY_RULE_SETUP #line 452 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CL); } YY_BREAK case 252: YY_RULE_SETUP #line 453 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CR); } YY_BREAK case 253: YY_RULE_SETUP #line 454 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_DB_CSV); } YY_BREAK case 254: YY_RULE_SETUP #line 455 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_DB_POSTGRES); } YY_BREAK case 255: YY_RULE_SETUP #line 456 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_DB_MYSQL); } YY_BREAK case 256: YY_RULE_SETUP #line 457 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_DEFAULT); } YY_BREAK case 257: YY_RULE_SETUP #line 458 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_DD); } YY_BREAK case 258: YY_RULE_SETUP #line 459 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_ELLIPSE); } YY_BREAK case 259: YY_RULE_SETUP #line 460 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_EMBED); } YY_BREAK case 260: YY_RULE_SETUP #line 461 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_FALSE); } YY_BREAK case 261: YY_RULE_SETUP #line 462 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_FEET); } YY_BREAK case 262: YY_RULE_SETUP #line 463 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_FOLLOW); } YY_BREAK case 263: YY_RULE_SETUP #line 464 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_GIANT); } YY_BREAK case 264: YY_RULE_SETUP #line 465 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_HATCH); } YY_BREAK case 265: YY_RULE_SETUP #line 466 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_KERNELDENSITY); } YY_BREAK case 266: YY_RULE_SETUP #line 467 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_IDW); } YY_BREAK case 267: YY_RULE_SETUP #line 468 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_HILITE); } YY_BREAK case 268: YY_RULE_SETUP #line 469 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_INCHES); } YY_BREAK case 269: YY_RULE_SETUP #line 470 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_KILOMETERS); } YY_BREAK case 270: YY_RULE_SETUP #line 471 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LARGE); } YY_BREAK case 271: YY_RULE_SETUP #line 472 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LC); } YY_BREAK case 272: YY_RULE_SETUP #line 473 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_ALIGN_LEFT); } YY_BREAK case 273: YY_RULE_SETUP #line 474 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_LINE); } YY_BREAK case 274: YY_RULE_SETUP #line 475 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LL); } YY_BREAK case 275: YY_RULE_SETUP #line 476 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LR); } YY_BREAK case 276: YY_RULE_SETUP #line 477 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_MEDIUM); } YY_BREAK case 277: YY_RULE_SETUP #line 478 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_METERS); } YY_BREAK case 278: YY_RULE_SETUP #line 479 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_NAUTICALMILES); } YY_BREAK case 279: YY_RULE_SETUP #line 480 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_MILES); } YY_BREAK case 280: YY_RULE_SETUP #line 481 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_MITER); } YY_BREAK case 281: YY_RULE_SETUP #line 482 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_MULTIPLE); } YY_BREAK case 282: YY_RULE_SETUP #line 483 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_NONE); } YY_BREAK case 283: YY_RULE_SETUP #line 484 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_NORMAL); } YY_BREAK case 284: YY_RULE_SETUP #line 485 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_OFF); } YY_BREAK case 285: YY_RULE_SETUP #line 486 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_OGR); } YY_BREAK case 286: YY_RULE_SETUP #line 487 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_FLATGEOBUF); } YY_BREAK case 287: YY_RULE_SETUP #line 488 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_ON); } YY_BREAK case 288: YY_RULE_SETUP #line 489 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_JOIN_ONE_TO_ONE); } YY_BREAK case 289: YY_RULE_SETUP #line 490 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_JOIN_ONE_TO_MANY); } YY_BREAK case 290: YY_RULE_SETUP #line 491 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_ORACLESPATIAL); } YY_BREAK case 291: YY_RULE_SETUP #line 492 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_PERCENTAGES); } YY_BREAK case 292: YY_RULE_SETUP #line 493 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_PIXMAP); } YY_BREAK case 293: YY_RULE_SETUP #line 494 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_PIXELS); } YY_BREAK case 294: YY_RULE_SETUP #line 495 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_POINT); } YY_BREAK case 295: YY_RULE_SETUP #line 496 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_POLYGON); } YY_BREAK case 296: YY_RULE_SETUP #line 497 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_POSTGIS); } YY_BREAK case 297: YY_RULE_SETUP #line 498 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_PLUGIN); } YY_BREAK case 298: YY_RULE_SETUP #line 499 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_QUERY); } YY_BREAK case 299: YY_RULE_SETUP #line 500 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_LAYER_RASTER); } YY_BREAK case 300: YY_RULE_SETUP #line 501 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_RASTER_LABEL); } YY_BREAK case 301: YY_RULE_SETUP #line 502 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_ALIGN_RIGHT); } YY_BREAK case 302: YY_RULE_SETUP #line 503 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_ROUND); } YY_BREAK case 303: YY_RULE_SETUP #line 504 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SELECTED); } YY_BREAK case 304: YY_RULE_SETUP #line 505 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_SIMPLE); } YY_BREAK case 305: YY_RULE_SETUP #line 506 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SINGLE); } YY_BREAK case 306: YY_RULE_SETUP #line 507 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SMALL); } YY_BREAK case 307: YY_RULE_SETUP #line 508 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_SQUARE); } YY_BREAK case 308: YY_RULE_SETUP #line 509 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_SVG); } YY_BREAK case 309: YY_RULE_SETUP #line 510 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(POLAROFFSET); } YY_BREAK case 310: YY_RULE_SETUP #line 511 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TINY); } YY_BREAK case 311: YY_RULE_SETUP #line 512 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CJC_TRIANGLE); } YY_BREAK case 312: YY_RULE_SETUP #line 513 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TRUE); } YY_BREAK case 313: YY_RULE_SETUP #line 514 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_TRUETYPE); } YY_BREAK case 314: YY_RULE_SETUP #line 515 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_UC); } YY_BREAK case 315: YY_RULE_SETUP #line 516 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_UL); } YY_BREAK case 316: YY_RULE_SETUP #line 517 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_UR); } YY_BREAK case 317: YY_RULE_SETUP #line 518 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_UNION); } YY_BREAK case 318: YY_RULE_SETUP #line 519 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_UVRASTER); } YY_BREAK case 319: YY_RULE_SETUP #line 520 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_CONTOUR); } YY_BREAK case 320: YY_RULE_SETUP #line 521 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_VECTOR); } YY_BREAK case 321: YY_RULE_SETUP #line 522 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_WFS); } YY_BREAK case 322: YY_RULE_SETUP #line 523 "src/maplexer.l" { MS_LEXER_RETURN_TOKEN(MS_WMS); } YY_BREAK case 323: /* rule 323 can match eol */ YY_RULE_SETUP #line 525 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer,msyytext); return(MS_BINDING); } YY_BREAK case 324: YY_RULE_SETUP #line 534 "src/maplexer.l" { /* attribute binding - shape (fixed value) */ return(MS_TOKEN_BINDING_SHAPE); } YY_BREAK case 325: YY_RULE_SETUP #line 538 "src/maplexer.l" { /* attribute binding - map cellsize */ return(MS_TOKEN_BINDING_MAP_CELLSIZE); } YY_BREAK case 326: YY_RULE_SETUP #line 542 "src/maplexer.l" { /* attribute binding - data cellsize */ return(MS_TOKEN_BINDING_DATA_CELLSIZE); } YY_BREAK case 327: /* rule 327 can match eol */ YY_RULE_SETUP #line 546 "src/maplexer.l" { /* attribute binding - numeric (no quotes) */ msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); msStringUnescape(msyystring_buffer, ']'); return(MS_TOKEN_BINDING_DOUBLE); } YY_BREAK case 328: /* rule 328 can match eol */ YY_RULE_SETUP #line 556 "src/maplexer.l" { /* attribute binding - string (single or double quotes) */ msyytext[msyyleng-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext + 2); msStringUnescape(msyystring_buffer, msyytext[0]); return(MS_TOKEN_BINDING_STRING); } YY_BREAK case 329: /* rule 329 can match eol */ YY_RULE_SETUP #line 565 "src/maplexer.l" { /* attribute binding - time */ msyytext+=2; msyytext[msyyleng-2-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); msStringUnescape(msyystring_buffer, '`'); return(MS_TOKEN_BINDING_TIME); } YY_BREAK case 330: YY_RULE_SETUP #line 576 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer,msyytext); msyynumber = atof(msyytext); return(MS_NUMBER); } YY_BREAK case 331: YY_RULE_SETUP #line 584 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer,msyytext); msyynumber = atof(msyytext); return(MS_TOKEN_LITERAL_NUMBER); } YY_BREAK case 332: /* rule 332 can match eol */ YY_RULE_SETUP #line 592 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_TOKEN_LITERAL_TIME); } YY_BREAK case 333: /* rule 333 can match eol */ YY_RULE_SETUP #line 601 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_IREGEX); } YY_BREAK case 334: /* rule 334 can match eol */ YY_RULE_SETUP #line 610 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_REGEX); } YY_BREAK case 335: YY_RULE_SETUP #line 619 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_EXPRESSION); } YY_BREAK case 336: YY_RULE_SETUP #line 628 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_LIST); } YY_BREAK case 337: YY_RULE_SETUP #line 637 "src/maplexer.l" { msyystring_return_state = MS_STRING; msyystring_begin = msyytext[0]; msyystring_size = 0; msyystring_buffer[0] = '\0'; BEGIN(MSSTRING); } YY_BREAK case 338: YY_RULE_SETUP #line 645 "src/maplexer.l" { if (msyystring_begin == msyytext[0]) { BEGIN(msyystring_begin_state); if (msyystring_return_state == MS_STRING) { if (msyystring_icase && msyyleng==2) { msyystring_icase = MS_FALSE; // reset return MS_ISTRING; } else return MS_STRING; } return msyystring_return_state; } else { int old_size = msyystring_size; msyystring_size += (msyyleng==2) ? 2 : 1; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, msyystring_buffer_size); msyystring_buffer[old_size] = *msyytext; if (msyyleng==2) { msyystring_buffer[old_size+1] = msyytext[1]; } msyystring_buffer[msyystring_size] = '\0'; } } YY_BREAK case 339: YY_RULE_SETUP #line 671 "src/maplexer.l" { ++msyystring_size; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, msyystring_buffer_size); if (msyyleng == 2) msyystring_buffer[msyystring_size-1] = msyytext[1]; else msyystring_buffer[msyystring_size-1] = msyytext[0]; msyystring_buffer[msyystring_size] = '\0'; } YY_BREAK case 340: /* rule 340 can match eol */ YY_RULE_SETUP #line 683 "src/maplexer.l" { int old_size = msyystring_size; msyystring_size += msyyleng; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, msyystring_buffer_size); memcpy(msyystring_buffer + old_size, msyytext, msyyleng + 1); } YY_BREAK case 341: /* rule 341 can match eol */ YY_RULE_SETUP #line 691 "src/maplexer.l" { msyytext++; msyytext[msyyleng-1-1] = '\0'; if(include_stack_ptr >= MAX_INCLUDE_DEPTH) { msSetError(MS_IOERR, "Includes nested to deeply.", "msyylex()"); return(-1); } msyyin = fopen(msBuildPath(path, msyybasepath, msyytext), "r"); if(!msyyin) { msSetError(MS_IOERR, "Error opening included file \"%s\".", "msyylex()", msyytext); msyyin = YY_CURRENT_BUFFER->yy_input_file; return(-1); } include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; /* save state */ include_lineno[include_stack_ptr] = msyylineno; include_stack_ptr++; msyy_switch_to_buffer( msyy_create_buffer(msyyin, YY_BUF_SIZE) ); msyylineno = 1; BEGIN(INITIAL); } YY_BREAK case 342: YY_RULE_SETUP #line 717 "src/maplexer.l" { msyystring_return_state = MS_TOKEN_LITERAL_STRING; msyystring_begin = msyytext[0]; msyystring_size = 0; msyystring_buffer[0] = '\0'; BEGIN(MSSTRING); } YY_BREAK case 343: YY_RULE_SETUP #line 725 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_STRING); } YY_BREAK case 344: /* rule 344 can match eol */ YY_RULE_SETUP #line 732 "src/maplexer.l" { msyylineno++; } YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(CONFIG_FILE): #line 734 "src/maplexer.l" { if( --include_stack_ptr < 0 ) return(EOF); /* end of main file */ else { fclose(YY_CURRENT_BUFFER->yy_input_file); msyy_delete_buffer( YY_CURRENT_BUFFER ); msyy_switch_to_buffer(include_stack[include_stack_ptr]); msyylineno = include_lineno[include_stack_ptr]; } } YY_BREAK case 345: /* rule 345 can match eol */ YY_RULE_SETUP #line 745 "src/maplexer.l" { return(0); } YY_BREAK case 346: YY_RULE_SETUP #line 749 "src/maplexer.l" { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(0); } YY_BREAK case 347: YY_RULE_SETUP #line 755 "src/maplexer.l" { return(msyytext[0]); } YY_BREAK case 348: YY_RULE_SETUP #line 756 "src/maplexer.l" ECHO; YY_BREAK #line 4575 "src/maplexer.c" case YY_STATE_EOF(EXPRESSION_STRING): case YY_STATE_EOF(INCLUDE): case YY_STATE_EOF(MSSTRING): case YY_STATE_EOF(MULTILINE_COMMENT): yyterminate(); case YY_END_OF_BUFFER: { /* Amount of text matched not including the EOB char. */ int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; /* Undo the effects of YY_DO_BEFORE_ACTION. */ *yy_cp = (yy_hold_char); YY_RESTORE_YY_MORE_OFFSET if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) { /* We're scanning a new file or input source. It's * possible that this happened because the user * just pointed yyin at a new source and called * yylex(). If so, then we have to assure * consistency between YY_CURRENT_BUFFER and our * globals. Here is the right place to do so, because * this is the first action (other than possibly a * back-up) that will match for the new input source. */ (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; } /* Note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the * end-of-buffer state). Contrast this with the test * in input(). */ if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) { /* This was really a NUL. */ yy_state_type yy_next_state; (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); /* Okay, we're now positioned to make the NUL * transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we don't * want to build jamming into it because then it * will run more slowly). */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = (yytext_ptr) + YY_MORE_ADJ; if ( yy_next_state ) { /* Consume the NUL. */ yy_cp = ++(yy_c_buf_p); yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = (yy_last_accepting_cpos); yy_current_state = (yy_last_accepting_state); goto yy_find_action; } } else switch ( yy_get_next_buffer( ) ) { case EOB_ACT_END_OF_FILE: { (yy_did_buffer_switch_on_eof) = 0; if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up * yytext, we can now set up * yy_c_buf_p so that if some total * hoser (like flex itself) wants to * call the scanner after we return the * YY_NULL, it'll still work - another * YY_NULL will get returned. */ (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; yy_act = YY_STATE_EOF(YY_START); goto do_action; } else { if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; } break; } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: (yy_c_buf_p) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; yy_current_state = yy_get_previous_state( ); yy_cp = (yy_c_buf_p); yy_bp = (yytext_ptr) + YY_MORE_ADJ; goto yy_find_action; } break; } default: YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer * * Returns a code representing an action: * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer (void) { char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = (yytext_ptr); int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) { /* Don't try to fill the buffer, so this is an EOF. */ if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) { /* We matched a single character, the EOB, so * treat this as a final EOF. */ return EOB_ACT_END_OF_FILE; } else { /* We matched some text prior to the EOB, first * process it. */ return EOB_ACT_LAST_MATCH; } } /* Try to read more data. */ /* First move last chars to start of buffer. */ number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; else { int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; else b->yy_buf_size *= 2; b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ yyrealloc( (void *) b->yy_ch_buf, (yy_size_t) (b->yy_buf_size + 2) ); } else /* Can't grow it, we don't own it. */ b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; } if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; /* Read in more data. */ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), (yy_n_chars), num_to_read ); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } if ( (yy_n_chars) == 0 ) { if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; yyrestart( yyin ); } else { ret_val = EOB_ACT_LAST_MATCH; YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); /* "- 2" to take care of EOB's */ YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } (yy_n_chars) += number_to_move; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ static yy_state_type yy_get_previous_state (void) { yy_state_type yy_current_state; char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 86); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1760 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { int yy_is_jam; char *yy_cp = (yy_c_buf_p); YY_CHAR yy_c = 86; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; (yy_last_accepting_cpos) = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 1760 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 1759); return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_UNPUT static void yyunput (int c, char * yy_bp ) { char *yy_cp; yy_cp = (yy_c_buf_p); /* undo effects of setting up yytext */ *yy_cp = (yy_hold_char); if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ int number_to_move = (yy_n_chars) + 2; char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) *--dest = *--source; yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } *--yy_cp = (char) c; (yytext_ptr) = yy_bp; (yy_hold_char) = *yy_cp; (yy_c_buf_p) = yy_cp; } #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) #else static int input (void) #endif { int c; *(yy_c_buf_p) = (yy_hold_char); if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) /* This was really a NUL. */ *(yy_c_buf_p) = '\0'; else { /* need more input */ int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) { case EOB_ACT_LAST_MATCH: /* This happens because yy_g_n_b() * sees that we've accumulated a * token and flags that we need to * try matching the token before * proceeding. But for input(), * there's no matching to consider. * So convert the EOB_ACT_LAST_MATCH * to EOB_ACT_END_OF_FILE. */ /* Reset buffer status. */ yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) YY_NEW_FILE; #ifdef __cplusplus return yyinput(); #else return input(); #endif } case EOB_ACT_CONTINUE_SCAN: (yy_c_buf_p) = (yytext_ptr) + offset; break; } } } c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ *(yy_c_buf_p) = '\0'; /* preserve yytext */ (yy_hold_char) = *++(yy_c_buf_p); return c; } #endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ void yyrestart (FILE * input_file ) { if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE ); } yy_init_buffer( YY_CURRENT_BUFFER, input_file ); yy_load_buffer_state( ); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) { /* TODO. We should be able to replace this entire function body * with * yypop_buffer_state(); * yypush_buffer_state(new_buffer); */ yyensure_buffer_stack (); if ( YY_CURRENT_BUFFER == new_buffer ) return; if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } YY_CURRENT_BUFFER_LVALUE = new_buffer; yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ (yy_did_buffer_switch_on_eof) = 1; } static void yy_load_buffer_state (void) { (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. * @param file A readable stream. * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. * * @return the allocated buffer state. */ YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; yy_init_buffer( b, file ); return b; } /** Destroy the buffer. * @param b a buffer created with yy_create_buffer() * */ void yy_delete_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) yyfree( (void *) b->yy_ch_buf ); yyfree( (void *) b ); } /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) { int oerrno = errno; yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; /* If b is the current buffer, then yy_init_buffer was _probably_ * called from yyrestart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ if (b != YY_CURRENT_BUFFER){ b->yy_bs_lineno = 1; b->yy_bs_column = 0; } b->yy_is_interactive = 0; errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ void yy_flush_buffer (YY_BUFFER_STATE b ) { if ( ! b ) return; b->yy_n_chars = 0; /* We always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[0]; b->yy_at_bol = 1; b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes * the current state. This function will allocate the stack * if necessary. * @param new_buffer The new state. * */ void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) { if (new_buffer == NULL) return; yyensure_buffer_stack(); /* This block is copied from yy_switch_to_buffer. */ if ( YY_CURRENT_BUFFER ) { /* Flush out information for old buffer. */ *(yy_c_buf_p) = (yy_hold_char); YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); } /* Only push if top exists. Otherwise, replace top. */ if (YY_CURRENT_BUFFER) (yy_buffer_stack_top)++; YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. * The next element becomes the new top. * */ void yypop_buffer_state (void) { if (!YY_CURRENT_BUFFER) return; yy_delete_buffer(YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; if ((yy_buffer_stack_top) > 0) --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } /* Allocates the stack if it does not exist. * Guarantees space for at least one push. */ static void yyensure_buffer_stack (void) { yy_size_t num_to_alloc; if (!(yy_buffer_stack)) { /* First allocation is just for 2 elements, since we don't know if this * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; } if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc ((yy_buffer_stack), num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); /* zero only the new slots.*/ memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); (yy_buffer_stack_max) = num_to_alloc; } } /** Setup the input buffer state to scan directly from a user-specified character buffer. * @param base the character buffer * @param size the size in bytes of the character buffer * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { YY_BUFFER_STATE b; if ( size < 2 || base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ return NULL; b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; yy_switch_to_buffer( b ); return b; } /** Setup the input buffer state to scan a string. The next call to yylex() will * scan from a @e copy of @a str. * @param yystr a NUL-terminated string to scan * * @return the newly allocated buffer state object. * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ YY_BUFFER_STATE yy_scan_string (const char * yystr ) { return yy_scan_bytes( yystr, (int) strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. * @param yybytes the byte buffer to scan * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; yy_size_t n; int i; /* Get memory for full buffer, including space for trailing EOB's. */ n = (yy_size_t) (_yybytes_len + 2); buf = (char *) yyalloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); /* It's okay to grow etc. this buffer, and we should throw it * away when we're done. */ b->yy_is_our_buffer = 1; return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif static void yynoreturn yy_fatal_error (const char* msg ) { fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } /* Redefine yyless() so it works in section 3 code. */ #undef yyless #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ yytext[yyleng] = (yy_hold_char); \ (yy_c_buf_p) = yytext + yyless_macro_arg; \ (yy_hold_char) = *(yy_c_buf_p); \ *(yy_c_buf_p) = '\0'; \ yyleng = yyless_macro_arg; \ } \ while ( 0 ) /* Accessor methods (get/set functions) to struct members. */ /** Get the current line number. * */ int yyget_lineno (void) { return yylineno; } /** Get the input stream. * */ FILE *yyget_in (void) { return yyin; } /** Get the output stream. * */ FILE *yyget_out (void) { return yyout; } /** Get the length of the current token. * */ int yyget_leng (void) { return yyleng; } /** Get the current token. * */ char *yyget_text (void) { return yytext; } /** Set the current line number. * @param _line_number line number * */ void yyset_lineno (int _line_number ) { yylineno = _line_number; } /** Set the input stream. This does not discard the current * input buffer. * @param _in_str A readable stream. * * @see yy_switch_to_buffer */ void yyset_in (FILE * _in_str ) { yyin = _in_str ; } void yyset_out (FILE * _out_str ) { yyout = _out_str ; } int yyget_debug (void) { return yy_flex_debug; } void yyset_debug (int _bdebug ) { yy_flex_debug = _bdebug ; } static int yy_init_globals (void) { /* Initialization is the same as for the non-reentrant scanner. * This function is called from yylex_destroy(), so don't allocate here. */ (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; (yy_c_buf_p) = NULL; (yy_init) = 0; (yy_start) = 0; /* Defined in main.c */ #ifdef YY_STDINIT yyin = stdin; yyout = stdout; #else yyin = NULL; yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by * yylex_init() */ return 0; } /* yylex_destroy is for both reentrant and non-reentrant scanners. */ int yylex_destroy (void) { /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ yy_delete_buffer( YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } /* Destroy the stack itself. */ yyfree((yy_buffer_stack) ); (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * yylex() is called, initialization will occur. */ yy_init_globals( ); return 0; } /* * Internal utility routines. */ #ifndef yytext_ptr static void yy_flex_strncpy (char* s1, const char * s2, int n ) { int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen (const char * s ) { int n; for ( n = 0; s[n]; ++n ) ; return n; } #endif void *yyalloc (yy_size_t size ) { return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size ) { /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter * because both ANSI C and C++ allow castless assignment from * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ return realloc(ptr, size); } void yyfree (void * ptr ) { free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 756 "src/maplexer.l" /* ** Any extra C functions */ int msyywrap() /* override */ { return(1); } int msyyerror(char *s) { msSetError(MS_PARSEERR, "%s", "msyyparse()", s); return(0); } /* cleanup any open includes */ void msyycleanup_includes() { while( --include_stack_ptr >= 0 ) { fclose(YY_CURRENT_BUFFER->yy_input_file); msyy_delete_buffer( YY_CURRENT_BUFFER ); msyy_switch_to_buffer(include_stack[include_stack_ptr]); } } mapserver-8.6.0/src/maplexer.l000066400000000000000000001333611511405061000163120ustar00rootroot00000000000000%option never-interactive %{ /* ** READ ME FIRST! ** ** When this file is altered, it is necessary to do "make lexer". Due to ** problems detailed in #2310 the lexer is no longer automatically rebuilt ** when maplexer.l is altered. */ #define YY_NO_INPUT /* C declarations */ #include #include #include #include #include #include "mapserver.h" #include "maperror.h" #include "mapfile.h" #include "maptime.h" #include "mapsymbol.h" #include "mapparser.h" #include "mapprimitive.h" /* msyylineno is required for flex 2.5.4 and older, but is already defined by * flex 2.5.31 (bug 975). * Unfortunately there is no clean way to differentiate the two versions, * so we use the symbol YY_CURRENT_BUFFER_LVALUE to base our test since it * was not present in 2.5.4 and is present in 2.5.31. Hopefully that won't * put us in trouble with other versions. If that happens then we can * switch to using autoconf to detect the version. */ #ifndef YY_CURRENT_BUFFER_LVALUE int msyylineno = 1; #endif #define YY_NO_INPUT /* Below is a redefinition of the default YY_INPUT() macro but replacing the * YY_FATAL_ERROR() macro with a call to msSetError(). */ /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ msSetError(MS_PARSEERR, "%s", "msyyparse()", "input in flex scanner failed"); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ msSetError(MS_PARSEERR, "%s", "msyyparse()", "input in flex scanner failed"); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ } int msyysource=MS_STRING_TOKENS; double msyynumber; int msyystate=MS_TOKENIZE_DEFAULT; const char *msyystring=NULL; char *msyybasepath=NULL; int msyystring_buffer_size = 0; int msyystring_size; char msyystring_begin; char *msyystring_buffer = NULL; int msyystring_icase = MS_FALSE; int msyystring_return_state; int msyystring_begin_state; int msyyreturncomments = 0; #define MS_LEXER_STRING_REALLOC(string, string_size, max_size) \ do { \ const int string_size_macro = (int)(string_size); \ if (string_size_macro >= (int)(max_size)) { \ max_size = (((int)(max_size)*2) > string_size_macro) ? ((int)(max_size))*2 : string_size_macro+1; \ string = (char *) msSmallRealloc(string, sizeof(char *) * (max_size)); \ } \ } while(0) #define MS_LEXER_RETURN_TOKEN(token) \ MS_LEXER_STRING_REALLOC(msyystring_buffer, strlen(msyytext), \ msyystring_buffer_size); \ strcpy(msyystring_buffer, msyytext); \ return(token); #define MAX_INCLUDE_DEPTH 5 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; int include_lineno[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; char path[MS_MAXPATHLEN]; %} %s EXPRESSION_STRING %s INCLUDE %s MSSTRING %s MULTILINE_COMMENT %s CONFIG_FILE %% if (msyystring_buffer == NULL) { msyystring_buffer_size = 256; msyystring_buffer = (char*) msSmallMalloc(sizeof(char) * msyystring_buffer_size); } msyystring_buffer[0] = '\0'; switch(msyystate) { case(MS_TOKENIZE_DEFAULT): (void) yyunput; /* just to avoid warning about it being unrefed */ break; case(MS_TOKENIZE_FILE): BEGIN(INITIAL); msyystring_begin_state = INITIAL; msyysource=MS_FILE_TOKENS; msyystate=MS_TOKENIZE_DEFAULT; msyystring=NULL; msyyreturncomments=0; include_stack_ptr=0; return(0); break; case(MS_TOKENIZE_STRING): BEGIN(INITIAL); msyystring_begin_state = INITIAL; msyy_delete_buffer(YY_CURRENT_BUFFER); msyy_scan_string(msyystring); msyysource=MS_STRING_TOKENS; msyystate=MS_TOKENIZE_DEFAULT; msyyin=NULL; msyyreturncomments=0; include_stack_ptr=0; return(0); break; case(MS_TOKENIZE_EXPRESSION): BEGIN(EXPRESSION_STRING); msyystring_begin_state = EXPRESSION_STRING; msyy_delete_buffer(YY_CURRENT_BUFFER); msyy_scan_string(msyystring); msyystate=MS_TOKENIZE_DEFAULT; msyyreturncomments=0; break; case(MS_TOKENIZE_CONFIG): BEGIN(CONFIG_FILE); msyystring_begin_state = CONFIG_FILE; msyysource=MS_FILE_TOKENS; msyystate=MS_TOKENIZE_DEFAULT; msyystring=NULL; msyyreturncomments=0; return(0); break; case(99): BEGIN(INITIAL); /* may not need this one */ msyystring_begin_state = INITIAL; msyy_delete_buffer(YY_CURRENT_BUFFER); msyystate=MS_TOKENIZE_DEFAULT; msyystring=NULL; msyyreturncomments=0; return(0); break; default: break; } [ \t\r]+ ; (\/\/|#).* { if (msyyreturncomments) return(MS_COMMENT); } \/\* { BEGIN(MULTILINE_COMMENT); } \*\/ { BEGIN(INITIAL); } [^*\n]+ ; \* ; \n { msyylineno++; } config { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION); } env { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION_ENV); } maps { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION_MAPS); } plugins { MS_LEXER_RETURN_TOKEN(MS_CONFIG_SECTION_PLUGINS) } or|\|\| { MS_LEXER_RETURN_TOKEN(MS_TOKEN_LOGICAL_OR); } and|&& { MS_LEXER_RETURN_TOKEN(MS_TOKEN_LOGICAL_AND); } not|! { MS_LEXER_RETURN_TOKEN(MS_TOKEN_LOGICAL_NOT); } eq|=|== { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_EQ); } ne|!=|<> { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_NE); } gt|> { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_GT); } lt|< { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_LT); } ge|>= { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_GE); } le|<= { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_LE); } ~ { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_RE); } =\* { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_IEQ); } ~\* { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_IRE); } in { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_IN); /* was IN */ } area { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_AREA); } length { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_LENGTH); } tostring { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_TOSTRING); } commify { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_COMMIFY); } round { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_ROUND); } upper { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_UPPER); } lower { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_LOWER); } initcap { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_INITCAP); } firstcap { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_FIRSTCAP); } buffer { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_BUFFER); } difference { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_DIFFERENCE); } simplify { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_SIMPLIFY); } simplifypt { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_SIMPLIFYPT); } generalize { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_GENERALIZE); } smoothsia { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_SMOOTHSIA); } centerline { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_CENTERLINE); } densify { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_DENSIFY); } outer { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_OUTER); } inner { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_INNER); } javascript { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_JAVASCRIPT); } intersects { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_INTERSECTS); } disjoint { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_DISJOINT); } touches { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_TOUCHES); } overlaps { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_OVERLAPS); } crosses { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_CROSSES); } within { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_WITHIN); } contains { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_CONTAINS); } equals { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_EQUALS); } beyond { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_BEYOND); } dwithin { MS_LEXER_RETURN_TOKEN(MS_TOKEN_COMPARISON_DWITHIN); } fromtext { MS_LEXER_RETURN_TOKEN(MS_TOKEN_FUNCTION_FROMTEXT); } true { msyynumber=MS_TRUE; return(MS_TOKEN_LITERAL_BOOLEAN); } false { msyynumber=MS_FALSE; return(MS_TOKEN_LITERAL_BOOLEAN); } colorrange { MS_LEXER_RETURN_TOKEN(COLORRANGE); } datarange { MS_LEXER_RETURN_TOKEN(DATARANGE); } rangeitem { MS_LEXER_RETURN_TOKEN(RANGEITEM); } align { MS_LEXER_RETURN_TOKEN(ALIGN); } anchorpoint { MS_LEXER_RETURN_TOKEN(ANCHORPOINT); } angle { MS_LEXER_RETURN_TOKEN(ANGLE); } antialias { MS_LEXER_RETURN_TOKEN(ANTIALIAS); } backgroundcolor { MS_LEXER_RETURN_TOKEN(BACKGROUNDCOLOR); } bandsitem { MS_LEXER_RETURN_TOKEN(BANDSITEM); } bindvals { MS_LEXER_RETURN_TOKEN(BINDVALS); } \xEF\xBB\xBF { MS_LEXER_RETURN_TOKEN(BOM); } browseformat { MS_LEXER_RETURN_TOKEN(BROWSEFORMAT); } buffer { MS_LEXER_RETURN_TOKEN(BUFFER); } character { MS_LEXER_RETURN_TOKEN(CHARACTER); } class { MS_LEXER_RETURN_TOKEN(CLASS); } classitem { MS_LEXER_RETURN_TOKEN(CLASSITEM); } classgroup { MS_LEXER_RETURN_TOKEN(CLASSGROUP); } cluster { MS_LEXER_RETURN_TOKEN(CLUSTER); } color { MS_LEXER_RETURN_TOKEN(COLOR); } compfilter { MS_LEXER_RETURN_TOKEN(COMPFILTER); } composite { MS_LEXER_RETURN_TOKEN(COMPOSITE); } compop { MS_LEXER_RETURN_TOKEN(COMPOP); } config { MS_LEXER_RETURN_TOKEN(CONFIG); } connection { MS_LEXER_RETURN_TOKEN(CONNECTION); } connectiontype { MS_LEXER_RETURN_TOKEN(CONNECTIONTYPE); } data { MS_LEXER_RETURN_TOKEN(DATA); } debug { MS_LEXER_RETURN_TOKEN(DEBUG); } driver { MS_LEXER_RETURN_TOKEN(DRIVER); } empty { MS_LEXER_RETURN_TOKEN(EMPTY); } encoding { MS_LEXER_RETURN_TOKEN(ENCODING); } end { MS_LEXER_RETURN_TOKEN(END); } error { MS_LEXER_RETURN_TOKEN(ERROR); } expression { MS_LEXER_RETURN_TOKEN(EXPRESSION); } extent { MS_LEXER_RETURN_TOKEN(EXTENT); } extension { MS_LEXER_RETURN_TOKEN(EXTENSION); } fallback { MS_LEXER_RETURN_TOKEN(FALLBACK); } feature { MS_LEXER_RETURN_TOKEN(FEATURE); } filled { MS_LEXER_RETURN_TOKEN(FILLED); } filter { MS_LEXER_RETURN_TOKEN(FILTER); } filteritem { MS_LEXER_RETURN_TOKEN(FILTERITEM); } footer { MS_LEXER_RETURN_TOKEN(FOOTER); } font { MS_LEXER_RETURN_TOKEN(FONT); } fontset { MS_LEXER_RETURN_TOKEN(FONTSET); } force { MS_LEXER_RETURN_TOKEN(FORCE); } formatoption { MS_LEXER_RETURN_TOKEN(FORMATOPTION); } from { MS_LEXER_RETURN_TOKEN(FROM); } gap { MS_LEXER_RETURN_TOKEN(GAP); } geomtransform { MS_LEXER_RETURN_TOKEN(GEOMTRANSFORM); } grid { MS_LEXER_RETURN_TOKEN(GRID); } gridstep { MS_LEXER_RETURN_TOKEN(GRIDSTEP); } graticule { MS_LEXER_RETURN_TOKEN(GRATICULE); } group { MS_LEXER_RETURN_TOKEN(GROUP); } header { MS_LEXER_RETURN_TOKEN(HEADER); } image { MS_LEXER_RETURN_TOKEN(IMAGE); } imagecolor { MS_LEXER_RETURN_TOKEN(IMAGECOLOR); } imagetype { MS_LEXER_RETURN_TOKEN(IMAGETYPE); } imagemode { MS_LEXER_RETURN_TOKEN(IMAGEMODE); } imagepath { MS_LEXER_RETURN_TOKEN(IMAGEPATH); } temppath { MS_LEXER_RETURN_TOKEN(TEMPPATH); } imageurl { MS_LEXER_RETURN_TOKEN(IMAGEURL); } include { BEGIN(INCLUDE); } index { MS_LEXER_RETURN_TOKEN(INDEX); } initialgap { MS_LEXER_RETURN_TOKEN(INITIALGAP); } intervals { MS_LEXER_RETURN_TOKEN(INTERVALS); } join { MS_LEXER_RETURN_TOKEN(JOIN); } keyimage { MS_LEXER_RETURN_TOKEN(KEYIMAGE); } keysize { MS_LEXER_RETURN_TOKEN(KEYSIZE); } keyspacing { MS_LEXER_RETURN_TOKEN(KEYSPACING); } label { MS_LEXER_RETURN_TOKEN(LABEL); } labelcache { MS_LEXER_RETURN_TOKEN(LABELCACHE); } labelformat { MS_LEXER_RETURN_TOKEN(LABELFORMAT); } labelitem { MS_LEXER_RETURN_TOKEN(LABELITEM); } labelmaxscale { MS_LEXER_RETURN_TOKEN(LABELMAXSCALE); } labelmaxscaledenom { MS_LEXER_RETURN_TOKEN(LABELMAXSCALEDENOM); } labelminscale { MS_LEXER_RETURN_TOKEN(LABELMINSCALE); } labelminscaledenom { MS_LEXER_RETURN_TOKEN(LABELMINSCALEDENOM); } labelrequires { MS_LEXER_RETURN_TOKEN(LABELREQUIRES); } latlon { MS_LEXER_RETURN_TOKEN(LATLON); } layer { MS_LEXER_RETURN_TOKEN(LAYER); } leader { MS_LEXER_RETURN_TOKEN(LEADER); } legend { MS_LEXER_RETURN_TOKEN(LEGEND); } legendformat { MS_LEXER_RETURN_TOKEN(LEGENDFORMAT); } linecap { MS_LEXER_RETURN_TOKEN(LINECAP); } linejoin { MS_LEXER_RETURN_TOKEN(LINEJOIN); } linejoinmaxsize { MS_LEXER_RETURN_TOKEN(LINEJOINMAXSIZE); } map { MS_LEXER_RETURN_TOKEN(MAP); } marker { MS_LEXER_RETURN_TOKEN(MARKER); } markersize { MS_LEXER_RETURN_TOKEN(MARKERSIZE); } mask { MS_LEXER_RETURN_TOKEN(MASK); } maxarcs { MS_LEXER_RETURN_TOKEN(MAXARCS); } maxboxsize { MS_LEXER_RETURN_TOKEN(MAXBOXSIZE); } maxdistance { MS_LEXER_RETURN_TOKEN(MAXDISTANCE); } maxfeatures { MS_LEXER_RETURN_TOKEN(MAXFEATURES); } maxinterval { MS_LEXER_RETURN_TOKEN(MAXINTERVAL); } maxscale { MS_LEXER_RETURN_TOKEN(MAXSCALE); } maxscaledenom { MS_LEXER_RETURN_TOKEN(MAXSCALEDENOM); } maxgeowidth { MS_LEXER_RETURN_TOKEN(MAXGEOWIDTH); } maxlength { MS_LEXER_RETURN_TOKEN(MAXLENGTH); } maxsize { MS_LEXER_RETURN_TOKEN(MAXSIZE); } maxsubdivide { MS_LEXER_RETURN_TOKEN(MAXSUBDIVIDE); } maxtemplate { MS_LEXER_RETURN_TOKEN(MAXTEMPLATE); } maxwidth { MS_LEXER_RETURN_TOKEN(MAXWIDTH); } metadata { MS_LEXER_RETURN_TOKEN(METADATA); } mimetype { MS_LEXER_RETURN_TOKEN(MIMETYPE); } minarcs { MS_LEXER_RETURN_TOKEN(MINARCS); } minboxsize { MS_LEXER_RETURN_TOKEN(MINBOXSIZE); } mindistance { MS_LEXER_RETURN_TOKEN(MINDISTANCE); } repeatdistance { MS_LEXER_RETURN_TOKEN(REPEATDISTANCE); } maxoverlapangle { MS_LEXER_RETURN_TOKEN(MAXOVERLAPANGLE); } minfeaturesize { MS_LEXER_RETURN_TOKEN(MINFEATURESIZE); } mininterval { MS_LEXER_RETURN_TOKEN(MININTERVAL); } minscale { MS_LEXER_RETURN_TOKEN(MINSCALE); } minscaledenom { MS_LEXER_RETURN_TOKEN(MINSCALEDENOM); } mingeowidth { MS_LEXER_RETURN_TOKEN(MINGEOWIDTH); } minsize { MS_LEXER_RETURN_TOKEN(MINSIZE); } minsubdivide { MS_LEXER_RETURN_TOKEN(MINSUBDIVIDE); } mintemplate { MS_LEXER_RETURN_TOKEN(MINTEMPLATE); } minwidth { MS_LEXER_RETURN_TOKEN(MINWIDTH); } name { MS_LEXER_RETURN_TOKEN(NAME); } offset { MS_LEXER_RETURN_TOKEN(OFFSET); } offsite { MS_LEXER_RETURN_TOKEN(OFFSITE); } opacity { MS_LEXER_RETURN_TOKEN(OPACITY); } connectionoptions { MS_LEXER_RETURN_TOKEN(CONNECTIONOPTIONS); } outlinecolor { MS_LEXER_RETURN_TOKEN(OUTLINECOLOR); } outlinewidth { MS_LEXER_RETURN_TOKEN(OUTLINEWIDTH); } outputformat { MS_LEXER_RETURN_TOKEN(OUTPUTFORMAT); } partials { MS_LEXER_RETURN_TOKEN(PARTIALS); } pattern { MS_LEXER_RETURN_TOKEN(PATTERN); } points { MS_LEXER_RETURN_TOKEN(POINTS); } items { MS_LEXER_RETURN_TOKEN(ITEMS); } position { MS_LEXER_RETURN_TOKEN(POSITION); } postlabelcache { MS_LEXER_RETURN_TOKEN(POSTLABELCACHE); } priority { MS_LEXER_RETURN_TOKEN(PRIORITY); } processing { MS_LEXER_RETURN_TOKEN(PROCESSING); } projection { MS_LEXER_RETURN_TOKEN(PROJECTION); } queryformat { MS_LEXER_RETURN_TOKEN(QUERYFORMAT); } querymap { MS_LEXER_RETURN_TOKEN(QUERYMAP); } reference { MS_LEXER_RETURN_TOKEN(REFERENCE); } region { MS_LEXER_RETURN_TOKEN(REGION); } relativeto { MS_LEXER_RETURN_TOKEN(RELATIVETO); } requires { MS_LEXER_RETURN_TOKEN(REQUIRES); } resolution { MS_LEXER_RETURN_TOKEN(RESOLUTION); } defresolution { MS_LEXER_RETURN_TOKEN(DEFRESOLUTION); } scale { MS_LEXER_RETURN_TOKEN(SCALE); } scaledenom { MS_LEXER_RETURN_TOKEN(SCALEDENOM); } scalebar { MS_LEXER_RETURN_TOKEN(SCALEBAR); } scaletoken { MS_LEXER_RETURN_TOKEN(SCALETOKEN); } shadowcolor { MS_LEXER_RETURN_TOKEN(SHADOWCOLOR); } shadowsize { MS_LEXER_RETURN_TOKEN(SHADOWSIZE); } shapepath { MS_LEXER_RETURN_TOKEN(SHAPEPATH); } size { MS_LEXER_RETURN_TOKEN(SIZE); } sizeunits { MS_LEXER_RETURN_TOKEN(SIZEUNITS); } status { MS_LEXER_RETURN_TOKEN(STATUS); } style { MS_LEXER_RETURN_TOKEN(STYLE); } styleitem { MS_LEXER_RETURN_TOKEN(STYLEITEM); } symbol { MS_LEXER_RETURN_TOKEN(SYMBOL); } symbolscale { MS_LEXER_RETURN_TOKEN(SYMBOLSCALE); } symbolscaledenom { MS_LEXER_RETURN_TOKEN(SYMBOLSCALEDENOM); } symbolset { MS_LEXER_RETURN_TOKEN(SYMBOLSET); } table { MS_LEXER_RETURN_TOKEN(TABLE); } template { MS_LEXER_RETURN_TOKEN(TEMPLATE); } text { MS_LEXER_RETURN_TOKEN(TEXT); } tileindex { MS_LEXER_RETURN_TOKEN(TILEINDEX); } tileitem { MS_LEXER_RETURN_TOKEN(TILEITEM); } tilesrs { MS_LEXER_RETURN_TOKEN(TILESRS); } title { MS_LEXER_RETURN_TOKEN(TITLE); } to { MS_LEXER_RETURN_TOKEN(TO); } tolerance { MS_LEXER_RETURN_TOKEN(TOLERANCE); } toleranceunits { MS_LEXER_RETURN_TOKEN(TOLERANCEUNITS); } identify { MS_LEXER_RETURN_TOKEN(IDENTIFY); } classauto { MS_LEXER_RETURN_TOKEN(CLASSAUTO); } transparent { MS_LEXER_RETURN_TOKEN(TRANSPARENT); } transform { MS_LEXER_RETURN_TOKEN(TRANSFORM); } type { MS_LEXER_RETURN_TOKEN(TYPE); } units { MS_LEXER_RETURN_TOKEN(UNITS); } utfdata { MS_LEXER_RETURN_TOKEN(UTFDATA); } utfitem { MS_LEXER_RETURN_TOKEN(UTFITEM); } validation { MS_LEXER_RETURN_TOKEN(VALIDATION); } values { MS_LEXER_RETURN_TOKEN(VALUES); } web { MS_LEXER_RETURN_TOKEN(WEB); } width { MS_LEXER_RETURN_TOKEN(WIDTH); } wkt { MS_LEXER_RETURN_TOKEN(WKT); } wrap { MS_LEXER_RETURN_TOKEN(WRAP); } annotation { MS_LEXER_RETURN_TOKEN(MS_LAYER_ANNOTATION); } auto { MS_LEXER_RETURN_TOKEN(MS_AUTO); } auto2 { MS_LEXER_RETURN_TOKEN(MS_AUTO2); } bevel { MS_LEXER_RETURN_TOKEN(MS_CJC_BEVEL); } bitmap { MS_LEXER_RETURN_TOKEN(MS_BITMAP); } butt { MS_LEXER_RETURN_TOKEN(MS_CJC_BUTT); } cc { MS_LEXER_RETURN_TOKEN(MS_CC); } center { MS_LEXER_RETURN_TOKEN(MS_ALIGN_CENTER); } chart { MS_LEXER_RETURN_TOKEN(MS_LAYER_CHART); } circle { MS_LEXER_RETURN_TOKEN(MS_LAYER_CIRCLE); } cl { MS_LEXER_RETURN_TOKEN(MS_CL); } cr { MS_LEXER_RETURN_TOKEN(MS_CR); } csv { MS_LEXER_RETURN_TOKEN(MS_DB_CSV); } postgresql { MS_LEXER_RETURN_TOKEN(MS_DB_POSTGRES); } mysql { MS_LEXER_RETURN_TOKEN(MS_DB_MYSQL); } default { MS_LEXER_RETURN_TOKEN(MS_DEFAULT); } dd { MS_LEXER_RETURN_TOKEN(MS_DD); } ellipse { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_ELLIPSE); } embed { MS_LEXER_RETURN_TOKEN(MS_EMBED); } false { MS_LEXER_RETURN_TOKEN(MS_FALSE); } feet { MS_LEXER_RETURN_TOKEN(MS_FEET); } follow { MS_LEXER_RETURN_TOKEN(MS_FOLLOW); } giant { MS_LEXER_RETURN_TOKEN(MS_GIANT); } hatch { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_HATCH); } kerneldensity { MS_LEXER_RETURN_TOKEN(MS_KERNELDENSITY); } idw { MS_LEXER_RETURN_TOKEN(MS_IDW); } hilite { MS_LEXER_RETURN_TOKEN(MS_HILITE); } inches { MS_LEXER_RETURN_TOKEN(MS_INCHES); } kilometers { MS_LEXER_RETURN_TOKEN(MS_KILOMETERS); } large { MS_LEXER_RETURN_TOKEN(MS_LARGE); } lc { MS_LEXER_RETURN_TOKEN(MS_LC); } left { MS_LEXER_RETURN_TOKEN(MS_ALIGN_LEFT); } line { MS_LEXER_RETURN_TOKEN(MS_LAYER_LINE); } ll { MS_LEXER_RETURN_TOKEN(MS_LL); } lr { MS_LEXER_RETURN_TOKEN(MS_LR); } medium { MS_LEXER_RETURN_TOKEN(MS_MEDIUM); } meters { MS_LEXER_RETURN_TOKEN(MS_METERS); } nauticalmiles { MS_LEXER_RETURN_TOKEN(MS_NAUTICALMILES); } miles { MS_LEXER_RETURN_TOKEN(MS_MILES); } miter { MS_LEXER_RETURN_TOKEN(MS_CJC_MITER); } multiple { MS_LEXER_RETURN_TOKEN(MS_MULTIPLE); } none { MS_LEXER_RETURN_TOKEN(MS_CJC_NONE); } normal { MS_LEXER_RETURN_TOKEN(MS_NORMAL); } off { MS_LEXER_RETURN_TOKEN(MS_OFF); } ogr { MS_LEXER_RETURN_TOKEN(MS_OGR); } flatgeobuf { MS_LEXER_RETURN_TOKEN(MS_FLATGEOBUF); } on { MS_LEXER_RETURN_TOKEN(MS_ON); } one-to-one { MS_LEXER_RETURN_TOKEN(MS_JOIN_ONE_TO_ONE); } one-to-many { MS_LEXER_RETURN_TOKEN(MS_JOIN_ONE_TO_MANY); } oraclespatial { MS_LEXER_RETURN_TOKEN(MS_ORACLESPATIAL); } percentages { MS_LEXER_RETURN_TOKEN(MS_PERCENTAGES); } pixmap { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_PIXMAP); } pixels { MS_LEXER_RETURN_TOKEN(MS_PIXELS); } point { MS_LEXER_RETURN_TOKEN(MS_LAYER_POINT); } polygon { MS_LEXER_RETURN_TOKEN(MS_LAYER_POLYGON); } postgis { MS_LEXER_RETURN_TOKEN(MS_POSTGIS); } plugin { MS_LEXER_RETURN_TOKEN(MS_PLUGIN); } query { MS_LEXER_RETURN_TOKEN(MS_LAYER_QUERY); } raster { MS_LEXER_RETURN_TOKEN(MS_LAYER_RASTER); } rasterlabel { MS_LEXER_RETURN_TOKEN(MS_RASTER_LABEL); } right { MS_LEXER_RETURN_TOKEN(MS_ALIGN_RIGHT); } round { MS_LEXER_RETURN_TOKEN(MS_CJC_ROUND); } selected { MS_LEXER_RETURN_TOKEN(MS_SELECTED); } simple { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_SIMPLE); } single { MS_LEXER_RETURN_TOKEN(MS_SINGLE); } small { MS_LEXER_RETURN_TOKEN(MS_SMALL); } square { MS_LEXER_RETURN_TOKEN(MS_CJC_SQUARE); } svg { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_SVG); } polaroffset { MS_LEXER_RETURN_TOKEN(POLAROFFSET); } tiny { MS_LEXER_RETURN_TOKEN(MS_TINY); } triangle { MS_LEXER_RETURN_TOKEN(MS_CJC_TRIANGLE); } true { MS_LEXER_RETURN_TOKEN(MS_TRUE); } truetype { MS_LEXER_RETURN_TOKEN(MS_TRUETYPE); } uc { MS_LEXER_RETURN_TOKEN(MS_UC); } ul { MS_LEXER_RETURN_TOKEN(MS_UL); } ur { MS_LEXER_RETURN_TOKEN(MS_UR); } union { MS_LEXER_RETURN_TOKEN(MS_UNION); } uvraster { MS_LEXER_RETURN_TOKEN(MS_UVRASTER); } contour { MS_LEXER_RETURN_TOKEN(MS_CONTOUR); } vector { MS_LEXER_RETURN_TOKEN(MS_SYMBOL_VECTOR); } wfs { MS_LEXER_RETURN_TOKEN(MS_WFS); } wms { MS_LEXER_RETURN_TOKEN(MS_WMS); } \[[^\]]*\] { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer,msyytext); return(MS_BINDING); } \[shape\] { /* attribute binding - shape (fixed value) */ return(MS_TOKEN_BINDING_SHAPE); } \[map_cellsize\] { /* attribute binding - map cellsize */ return(MS_TOKEN_BINDING_MAP_CELLSIZE); } \[data_cellsize\] { /* attribute binding - data cellsize */ return(MS_TOKEN_BINDING_DATA_CELLSIZE); } \[(?:\]\]|[^\]])*\] { /* attribute binding - numeric (no quotes) */ msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); msStringUnescape(msyystring_buffer, ']'); return(MS_TOKEN_BINDING_DOUBLE); } \"\[(?:\"\"|[^\"])*\]\"|\'\[(?:\'\'|[^\'])*\]\' { /* attribute binding - string (single or double quotes) */ msyytext[msyyleng-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext + 2); msStringUnescape(msyystring_buffer, msyytext[0]); return(MS_TOKEN_BINDING_STRING); } \`\[(?:\`\`|[^\`])*\]\` { /* attribute binding - time */ msyytext+=2; msyytext[msyyleng-2-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); msStringUnescape(msyystring_buffer, '`'); return(MS_TOKEN_BINDING_TIME); } -?[0-9]+|-?[0-9]+\.[0-9]*|-?\.[0-9]*|-?[0-9]+[eE][+-]?[0-9]+|-?[0-9]+\.[0-9]*[eE][+-]?[0-9]+|-?\.[0-9]*[eE][+-]?[0-9]+ { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer,msyytext); msyynumber = atof(msyytext); return(MS_NUMBER); } -?[0-9]+|-?[0-9]+\.[0-9]*|-?\.[0-9]*|-?[0-9]+[eE][+-]?[0-9]+|-?[0-9]+\.[0-9]*[eE][+-]?[0-9]+|-?\.[0-9]*[eE][+-]?[0-9]+ { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer,msyytext); msyynumber = atof(msyytext); return(MS_TOKEN_LITERAL_NUMBER); } \`[^\`]*\` { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_TOKEN_LITERAL_TIME); } \/[^*]{1}[^\/]*\/i { msyytext++; msyytext[msyyleng-1-2] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_IREGEX); } \/[^*]{1}[^\/]*\/ { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_REGEX); } \(.*\) { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_EXPRESSION); } \{.*\} { msyytext++; msyytext[msyyleng-1-1] = '\0'; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_LIST); } \'|\" { msyystring_return_state = MS_STRING; msyystring_begin = msyytext[0]; msyystring_size = 0; msyystring_buffer[0] = '\0'; BEGIN(MSSTRING); } \'|\"|\"i|\'i { if (msyystring_begin == msyytext[0]) { BEGIN(msyystring_begin_state); if (msyystring_return_state == MS_STRING) { if (msyystring_icase && msyyleng==2) { msyystring_icase = MS_FALSE; // reset return MS_ISTRING; } else return MS_STRING; } return msyystring_return_state; } else { int old_size = msyystring_size; msyystring_size += (msyyleng==2) ? 2 : 1; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, msyystring_buffer_size); msyystring_buffer[old_size] = *msyytext; if (msyyleng==2) { msyystring_buffer[old_size+1] = msyytext[1]; } msyystring_buffer[msyystring_size] = '\0'; } } \\\'|\\\"|\\\\|\\ { ++msyystring_size; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, msyystring_buffer_size); if (msyyleng == 2) msyystring_buffer[msyystring_size-1] = msyytext[1]; else msyystring_buffer[msyystring_size-1] = msyytext[0]; msyystring_buffer[msyystring_size] = '\0'; } [^\\\'\\\"]+ { int old_size = msyystring_size; msyystring_size += msyyleng; MS_LEXER_STRING_REALLOC(msyystring_buffer, msyystring_size, msyystring_buffer_size); memcpy(msyystring_buffer + old_size, msyytext, msyyleng + 1); } \"[^\"]*\"|\'[^\']*\' { msyytext++; msyytext[msyyleng-1-1] = '\0'; if(include_stack_ptr >= MAX_INCLUDE_DEPTH) { msSetError(MS_IOERR, "Includes nested to deeply.", "msyylex()"); return(-1); } msyyin = fopen(msBuildPath(path, msyybasepath, msyytext), "r"); if(!msyyin) { msSetError(MS_IOERR, "Error opening included file \"%s\".", "msyylex()", msyytext); msyyin = YY_CURRENT_BUFFER->yy_input_file; return(-1); } include_stack[include_stack_ptr] = YY_CURRENT_BUFFER; /* save state */ include_lineno[include_stack_ptr] = msyylineno; include_stack_ptr++; msyy_switch_to_buffer( msyy_create_buffer(msyyin, YY_BUF_SIZE) ); msyylineno = 1; BEGIN(INITIAL); } \'|\" { msyystring_return_state = MS_TOKEN_LITERAL_STRING; msyystring_begin = msyytext[0]; msyystring_size = 0; msyystring_buffer[0] = '\0'; BEGIN(MSSTRING); } [a-z/\.][a-z0-9/\._\-\=]* { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(MS_STRING); } \n { msyylineno++; } <> { if( --include_stack_ptr < 0 ) return(EOF); /* end of main file */ else { fclose(YY_CURRENT_BUFFER->yy_input_file); msyy_delete_buffer( YY_CURRENT_BUFFER ); msyy_switch_to_buffer(include_stack[include_stack_ptr]); msyylineno = include_lineno[include_stack_ptr]; } } [\r|\n|\0] { return(0); } . { MS_LEXER_STRING_REALLOC(msyystring_buffer, msyyleng, msyystring_buffer_size); strcpy(msyystring_buffer, msyytext); return(0); } . { return(msyytext[0]); } %% /* ** Any extra C functions */ int msyywrap() /* override */ { return(1); } int msyyerror(char *s) { msSetError(MS_PARSEERR, "%s", "msyyparse()", s); return(0); } /* cleanup any open includes */ void msyycleanup_includes() { while( --include_stack_ptr >= 0 ) { fclose(YY_CURRENT_BUFFER->yy_input_file); msyy_delete_buffer( YY_CURRENT_BUFFER ); msyy_switch_to_buffer(include_stack[include_stack_ptr]); } } mapserver-8.6.0/src/maplibxml2.c000066400000000000000000000076031511405061000165320ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: libxml2 convenience wrapper functions * Author: Tom Kralidis (tomkralidis@gmail.com) * ****************************************************************************** * Copyright (c) 2007, Tom Kralidis * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #ifdef USE_LIBXML2 #include #include #include #include /** * msLibXml2GenerateList() * * Convenience function to produce a series of XML elements from a delimited * list * * @param xmlNodePtr psParent the encompassing node * @param xmlNsPtr psNs the namespace object * @param const char *elname the list member element name * @param const char *values the list member element values * @param char delim the delimiter * */ void msLibXml2GenerateList(xmlNodePtr psParent, xmlNsPtr psNs, const char *elname, const char *values, char delim) { char **tokens = NULL; int n = 0; int i = 0; tokens = msStringSplit(values, delim, &n); for (i = 0; i < n; i++) { // Not sure we really need to distinguish empty vs non-empty case, but // this does change the result of // msautotest/wxs/expected/wcs_empty_cap111.xml otherwise if (tokens[i] && tokens[i][0] != '\0') xmlNewTextChild(psParent, psNs, BAD_CAST elname, BAD_CAST tokens[i]); else xmlNewChild(psParent, psNs, BAD_CAST elname, BAD_CAST tokens[i]); } msFreeCharArray(tokens, n); } /** * msLibXml2GetXPath() * * Convenience function to fetch an XPath * * @param xmlDocPtr doc the XML doc pointer * @param xmlXPathContextPtr the context pointer * @param xmlChar *xpath the xpath value * * @return result xmlXPathObjectPtr pointer * */ xmlXPathObjectPtr msLibXml2GetXPath(xmlDocPtr doc, xmlXPathContextPtr context, xmlChar *xpath) { (void)doc; xmlXPathObjectPtr result; result = xmlXPathEval(xpath, context); if (result == NULL) { return NULL; } if (xmlXPathNodeSetIsEmpty(result->nodesetval)) { xmlXPathFreeObject(result); return NULL; } return result; } /** * msLibXml2GetXPathTree * * Convenience function to fetch an XPath and children * * @param xmlDocPtr doc the XML doc pointer * @param xmlXPathObjectPtr the xpath object * * @return result string * */ char *msLibXml2GetXPathTree(xmlDocPtr doc, xmlXPathObjectPtr xpath) { xmlBufferPtr xbuf; char *result = NULL; xbuf = xmlBufferCreate(); if (xpath) { if (xmlNodeDump(xbuf, doc, xpath->nodesetval->nodeTab[0], 0, 0) == -1) { return NULL; } result = msStrdup((char *)xbuf->content); } xmlBufferFree(xbuf); return result; } #endif /* defined(USE_LIBXML2) */ mapserver-8.6.0/src/maplibxml2.h000066400000000000000000000043131511405061000165320ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: libxml2 convenience wrapper functions include file * Author: Tom Kralidis (tomkralidis@gmail.com) * ****************************************************************************** * Copyright (c) 2007, Tom Kralidis * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #ifndef MAPLIBXML2_H #define MAPLIBXML2_H #ifdef USE_LIBXML2 #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif xmlXPathObjectPtr msLibXml2GetXPath(xmlDocPtr doc, xmlXPathContextPtr context, xmlChar *xpath); void msLibXml2GenerateList(xmlNodePtr psParent, xmlNsPtr psNs, const char *elname, const char *values, char delim); char *msLibXml2GetXPathTree(xmlDocPtr doc, xmlXPathObjectPtr xpath); #ifdef __cplusplus } /* extern C */ #endif #endif /* defined(USE_LIBXML2) */ #endif /* MAPLIBXML2_H */ mapserver-8.6.0/src/mapmetadata.c000066400000000000000000001220071511405061000167350ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: Metadata implementation * Author: Tom Kralidis (tomkralidis@gmail.com) * ********************************************************************** * Copyright (c) 2017, Tom Kralidis * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapserver.h" #include "mapows.h" #include "mapowscommon.h" #include "maplibxml2.h" #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) || defined(USE_WMS_LYR) || defined(USE_WFS_LYR) #ifdef USE_LIBXML2 static int msMetadataParseRequest(cgiRequestObj *request, metadataParamsObj *metadataparams); /************************************************************************/ /* _msMetadataGetCharacterString */ /* */ /* Create a gmd:name/gmd:CharacterString element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetCharacterString(xmlNsPtr namespace, const char *name, const char *value, xmlNsPtr *ppsNsGco) { if (*ppsNsGco == NULL) *ppsNsGco = xmlNewNs(NULL, BAD_CAST "http://www.isotc211.org/2005/gmd", BAD_CAST "gco"); xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST name); if (!value) xmlNewNsProp(psNode, *ppsNsGco, BAD_CAST "nilReason", BAD_CAST "missing"); else xmlNewChild(psNode, *ppsNsGco, BAD_CAST "CharacterString", BAD_CAST value); return psNode; } /************************************************************************/ /* _msMetadataGetURL */ /* */ /* Create a gmd:name/gmd:URL element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetURL(xmlNsPtr namespace, const char *name, const char *value, xmlNsPtr *ppsNsGco) { if (*ppsNsGco == NULL) *ppsNsGco = xmlNewNs(NULL, BAD_CAST "http://www.isotc211.org/2005/gmd", BAD_CAST "gco"); xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST name); if (!value) xmlNewNsProp(psNode, *ppsNsGco, BAD_CAST "nilReason", BAD_CAST "missing"); else xmlNewChild(psNode, namespace, BAD_CAST "URL", BAD_CAST value); return psNode; } /************************************************************************/ /* _msMetadataGetOnline */ /* */ /* Create a gmd:onLine element pattern */ /************************************************************************/ static char *_stringConcatenateAndEncodeHTML(char *str, const char *appendStr) { char *pszTmp = msEncodeHTMLEntities(appendStr); str = msStringConcatenate(str, pszTmp); msFree(pszTmp); return str; } static xmlNodePtr _msMetadataGetOnline(xmlNsPtr namespace, layerObj *layer, const char *service, const char *format, const char *desc, const char *url_in, xmlNsPtr *ppsNsGco) { int status; const char *link_protocol = "unknown protocol"; xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST "onLine"); xmlNodePtr psORNode = xmlNewChild(psNode, namespace, BAD_CAST "CI_OnlineResource", NULL); char *url = msStrdup(url_in); if (strcasecmp(service, "M") == 0) { url = _stringConcatenateAndEncodeHTML( url, "service=WMS&version=1.3.0&request=GetMap&width=500&height=300&" "styles=&layers="); url = _stringConcatenateAndEncodeHTML(url, layer->name); url = _stringConcatenateAndEncodeHTML(url, "&format="); url = _stringConcatenateAndEncodeHTML(url, format); url = _stringConcatenateAndEncodeHTML(url, "&crs="); { char *epsg_str = NULL; msOWSGetEPSGProj(&(layer->projection), &(layer->metadata), "MFCSGO", MS_TRUE, &epsg_str); url = _stringConcatenateAndEncodeHTML(url, epsg_str); msFree(epsg_str); } link_protocol = "WWW:DOWNLOAD-1.0-http-get-map"; rectObj rect; status = msLayerGetExtent(layer, &rect); if (status == 0) { char buffer[32]; url = _stringConcatenateAndEncodeHTML(url, "&bbox="); sprintf(buffer, "%f", rect.miny); url = msStringConcatenate(url, buffer); url = msStringConcatenate(url, ","); sprintf(buffer, "%f", rect.minx); url = msStringConcatenate(url, buffer); url = msStringConcatenate(url, ","); sprintf(buffer, "%f", rect.maxy); url = msStringConcatenate(url, buffer); url = msStringConcatenate(url, ","); sprintf(buffer, "%f", rect.maxx); url = msStringConcatenate(url, buffer); } } else if (strcasecmp(service, "F") == 0) { link_protocol = "WWW:DOWNLOAD-1.0-http--download"; url = _stringConcatenateAndEncodeHTML( url, "service=WFS&version=1.1.0&request=GetFeature&typename="); url = _stringConcatenateAndEncodeHTML(url, layer->name); url = _stringConcatenateAndEncodeHTML(url, "&outputformat="); url = _stringConcatenateAndEncodeHTML(url, format); } else if (strcasecmp(service, "C") == 0) { link_protocol = "WWW:DOWNLOAD-1.0-http--download"; url = _stringConcatenateAndEncodeHTML( url, "service=WCS&version=2.0.1&request=GetCoverage&coverageid="); url = _stringConcatenateAndEncodeHTML(url, layer->name); url = _stringConcatenateAndEncodeHTML(url, "&format="); url = _stringConcatenateAndEncodeHTML(url, format); } xmlAddChild(psORNode, _msMetadataGetURL(namespace, "linkage", url, ppsNsGco)); msFree(url); xmlAddChild(psORNode, _msMetadataGetCharacterString(namespace, "protocol", link_protocol, ppsNsGco)); xmlAddChild(psORNode, _msMetadataGetCharacterString(namespace, "name", layer->name, ppsNsGco)); xmlAddChild(psORNode, _msMetadataGetCharacterString(namespace, "description", desc, ppsNsGco)); return psNode; } /************************************************************************/ /* _msMetadataGetInteger */ /* */ /* Create a gmd:name/gmd:Integer element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetInteger(xmlNsPtr namespace, const char *name, int value, xmlNsPtr *ppsNsGco) { char buffer[8]; sprintf(buffer, "%d", value); if (*ppsNsGco == NULL) *ppsNsGco = xmlNewNs(NULL, BAD_CAST "http://www.isotc211.org/2005/gmd", BAD_CAST "gco"); xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST name); if (!value) xmlNewNsProp(psNode, *ppsNsGco, BAD_CAST "nilReason", BAD_CAST "missing"); else xmlNewChild(psNode, *ppsNsGco, BAD_CAST "Integer", BAD_CAST buffer); return psNode; } /************************************************************************/ /* _msMetadataGetDecimal */ /* */ /* Create a gmd:name/gmd:Decimal element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetDecimal(xmlNsPtr namespace, const char *name, double value, xmlNsPtr *ppsNsGco) { char buffer[32]; snprintf(buffer, sizeof(buffer), "%.6f", value); if (*ppsNsGco == NULL) *ppsNsGco = xmlNewNs(NULL, BAD_CAST "http://www.isotc211.org/2005/gmd", BAD_CAST "gco"); xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST name); if (!value) xmlNewNsProp(psNode, *ppsNsGco, BAD_CAST "nilReason", BAD_CAST "missing"); else xmlNewChild(psNode, *ppsNsGco, BAD_CAST "Decimal", BAD_CAST buffer); return psNode; } /************************************************************************/ /* _msMetadataGetCodeList */ /* */ /* Create a gmd:name/gmd:* code list element pattern */ /************************************************************************/ xmlNodePtr _msMetadataGetCodeList(xmlNsPtr namespace, const char *parent_element, const char *name, const char *value) { char *codelist = NULL; codelist = msStrdup( "http://www.isotc211.org/2005/resources/Codelist/gmxCodelists.xml#"); codelist = msStringConcatenate(codelist, name); xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST parent_element); xmlNodePtr psCodeNode = xmlNewChild(psNode, namespace, BAD_CAST name, BAD_CAST value); xmlNewProp(psCodeNode, BAD_CAST "codeSpace", BAD_CAST "ISOTC211/19115"); xmlNewProp(psCodeNode, BAD_CAST "codeList", BAD_CAST codelist); xmlNewProp(psCodeNode, BAD_CAST "codeListValue", BAD_CAST value); msFree(codelist); return psNode; } /************************************************************************/ /* _msMetadataGetGMLTimePeriod */ /* */ /* Create a gml:TimePeriod element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetGMLTimePeriod(char **temporal) { xmlNsPtr psNsGml = xmlNewNs(NULL, BAD_CAST "http://www.opengis.net/gml", BAD_CAST "gml"); xmlNodePtr psNode = xmlNewNode(psNsGml, BAD_CAST "TimePeriod"); xmlNewNsProp(psNode, psNsGml, BAD_CAST "id", BAD_CAST "T001"); xmlNewNs(psNode, BAD_CAST "http://www.opengis.net/gml", BAD_CAST "gml"); xmlSetNs(psNode, psNsGml); xmlNewChild(psNode, psNsGml, BAD_CAST "beginPosition", BAD_CAST temporal[0]); xmlNewChild(psNode, psNsGml, BAD_CAST "endPosition", BAD_CAST temporal[1]); return psNode; } /************************************************************************/ /* _msMetadataGetExtent */ /* */ /* Create a gmd:extent element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetExtent(xmlNsPtr namespace, layerObj *layer, xmlNsPtr *ppsNsGco) { int n = 0; int status; char **temporal = NULL; rectObj rect; xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST "extent"); xmlNodePtr psEXNode = xmlNewChild(psNode, namespace, BAD_CAST "EX_Extent", NULL); /* scan for geospatial extent */ status = msLayerGetExtent(layer, &rect); if (status == 0) { /* always project to lat long */ msOWSProjectToWGS84(&layer->projection, &rect); xmlNodePtr psGNode = xmlNewChild(psEXNode, namespace, BAD_CAST "geographicElement", NULL); xmlNodePtr psGNode2 = xmlNewChild( psGNode, namespace, BAD_CAST "EX_GeographicBoundingBox", NULL); xmlAddChild(psGNode2, _msMetadataGetDecimal(namespace, "westBoundLongitude", rect.minx, ppsNsGco)); xmlAddChild(psGNode2, _msMetadataGetDecimal(namespace, "eastBoundLongitude", rect.maxx, ppsNsGco)); xmlAddChild(psGNode2, _msMetadataGetDecimal(namespace, "southBoundLatitude", rect.miny, ppsNsGco)); xmlAddChild(psGNode2, _msMetadataGetDecimal(namespace, "northBoundLatitude", rect.maxy, ppsNsGco)); } /* scan for temporal extent */ const char *value = msOWSLookupMetadata(&(layer->metadata), "MO", "timeextent"); if (value) { /* WMS */ temporal = msStringSplit(value, '/', &n); } else { /* WCS */ value = msOWSLookupMetadata(&(layer->metadata), "CO", "timeposition"); if (value) { /* split extent */ temporal = msStringSplit(value, ',', &n); } } if (!value) { /* SOS */ value = msOWSLookupMetadata(&(layer->metadata), "SO", "offering_timeextent"); if (value) temporal = msStringSplit(value, '/', &n); } if (value) { if (temporal && n > 0) { xmlNodePtr psTNode = xmlNewChild(psEXNode, namespace, BAD_CAST "temporalElement", NULL); xmlNodePtr psTNode2 = xmlNewChild(psTNode, namespace, BAD_CAST "EX_TemporalExtent", NULL); xmlNodePtr psENode = xmlNewChild(psTNode2, namespace, BAD_CAST "extent", NULL); xmlAddChild(psENode, _msMetadataGetGMLTimePeriod(temporal)); } } msFreeCharArray(temporal, n); return psNode; } /************************************************************************/ /* _msMetadataGetReferenceSystemInfo */ /* */ /* Create a gmd:referenceSystemInfo element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetReferenceSystemInfo(xmlNsPtr namespace, layerObj *layer, xmlNsPtr *ppsNsGco) { xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST "referenceSystemInfo"); xmlNodePtr psRSNode = xmlNewChild(psNode, namespace, BAD_CAST "MD_ReferenceSystem", NULL); xmlNodePtr psRSINode = xmlNewChild( psRSNode, namespace, BAD_CAST "referenceSystemIdentifier", NULL); xmlNodePtr psRSINode2 = xmlNewChild(psRSINode, namespace, BAD_CAST "RS_Identifier", NULL); char *epsg_str = NULL; msOWSGetEPSGProj(&(layer->projection), &(layer->metadata), "MFCSGO", MS_TRUE, &epsg_str); xmlAddChild(psRSINode2, _msMetadataGetCharacterString(namespace, "code", epsg_str, ppsNsGco)); xmlAddChild(psRSINode2, _msMetadataGetCharacterString( namespace, "codeSpace", "http://www.epsg-registry.org", ppsNsGco)); xmlAddChild(psRSINode2, _msMetadataGetCharacterString(namespace, "version", "6.14", ppsNsGco)); msFree(epsg_str); return psNode; } /************************************************************************/ /* _msMetadataGetContact */ /* */ /* Create a gmd:contact element pattern */ /************************************************************************/ xmlNodePtr _msMetadataGetContact(xmlNsPtr namespace, char *contact_element, mapObj *map, xmlNsPtr *ppsNsGco) { xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST contact_element); xmlNodePtr psCNode = xmlNewChild(psNode, namespace, BAD_CAST "CI_ResponsibleParty", NULL); xmlNewProp(psCNode, BAD_CAST "id", BAD_CAST contact_element); const char *value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "contactperson"); if (value) xmlAddChild(psCNode, _msMetadataGetCharacterString( namespace, "individualName", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "contactorganization"); if (value) xmlAddChild(psCNode, _msMetadataGetCharacterString( namespace, "organisationName", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "contactposition"); if (value) xmlAddChild(psCNode, _msMetadataGetCharacterString( namespace, "positionName", value, ppsNsGco)); xmlNodePtr psCINode = xmlNewChild(psCNode, namespace, BAD_CAST "contactInfo", NULL); xmlNodePtr psCINode2 = xmlNewChild(psCINode, namespace, BAD_CAST "CI_Contact", NULL); xmlNodePtr psPhoneNode = xmlNewChild(psCINode2, namespace, BAD_CAST "phone", NULL); xmlNodePtr psCIPhoneNode = xmlNewChild(psPhoneNode, namespace, BAD_CAST "CI_Telephone", NULL); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "contactvoicetelephone"); if (value) xmlAddChild(psCIPhoneNode, _msMetadataGetCharacterString(namespace, "voice", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "contactfacsimiletelephone"); if (value) xmlAddChild(psCIPhoneNode, _msMetadataGetCharacterString( namespace, "facsimile", value, ppsNsGco)); xmlNodePtr psAddressNode = xmlNewChild(psCINode2, namespace, BAD_CAST "address", NULL); xmlNodePtr psCIAddressNode = xmlNewChild(psAddressNode, namespace, BAD_CAST "CI_Address", NULL); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "address"); if (value) xmlAddChild(psCIAddressNode, _msMetadataGetCharacterString(namespace, "deliveryPoint", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "city"); if (value) xmlAddChild(psCIAddressNode, _msMetadataGetCharacterString( namespace, "city", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "stateorprovince"); if (value) xmlAddChild(psCIAddressNode, _msMetadataGetCharacterString(namespace, "administrativeArea", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "postcode"); if (value) xmlAddChild(psCIAddressNode, _msMetadataGetCharacterString( namespace, "postalCode", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "country"); if (value) xmlAddChild(psCIAddressNode, _msMetadataGetCharacterString( namespace, "country", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "contactelectronicmailaddress"); if (value) xmlAddChild(psCIAddressNode, _msMetadataGetCharacterString( namespace, "electronicMailAddress", value, ppsNsGco)); value = msOWSLookupMetadata(&(map->web.metadata), "MCFO", "onlineresource"); if (value) { xmlNodePtr psORNode = xmlNewChild(psCINode2, namespace, BAD_CAST "onlineResource", NULL); xmlNodePtr psORNode2 = xmlNewChild(psORNode, namespace, BAD_CAST "CI_OnlineResource", NULL); xmlAddChild(psORNode2, _msMetadataGetURL(namespace, "linkage", value, ppsNsGco)); } xmlAddChild(psCNode, _msMetadataGetCodeList(namespace, "role", "CI_RoleCode", "pointOfContact")); return psNode; } /************************************************************************/ /* _msMetadataGetIdentificationInfo */ /* */ /* Create a gmd:identificationInfo element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetIdentificationInfo(xmlNsPtr namespace, mapObj *map, layerObj *layer, xmlNsPtr *ppsNsGco) { xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST "identificationInfo"); xmlNodePtr psDINode = xmlNewChild(psNode, namespace, BAD_CAST "MD_DataIdentification", NULL); xmlNewProp(psDINode, BAD_CAST "id", BAD_CAST layer->name); xmlNodePtr psCNode = xmlNewChild(psDINode, namespace, BAD_CAST "citation", NULL); xmlNodePtr psCINode = xmlNewChild(psCNode, namespace, BAD_CAST "CI_Citation", NULL); const char *value = msOWSLookupMetadata(&(layer->metadata), "MCFGO", "title"); if (!value) value = msOWSLookupMetadata(&(layer->metadata), "S", "offering_name"); xmlAddChild(psCINode, _msMetadataGetCharacterString(namespace, "title", value, ppsNsGco)); xmlNodePtr psDNode = xmlNewChild(psCINode, namespace, BAD_CAST "date", NULL); xmlNewNsProp(psDNode, *ppsNsGco, BAD_CAST "nilReason", BAD_CAST "missing"); value = msOWSLookupMetadata(&(layer->metadata), "MCFGO", "attribution_title"); if (value) { xmlAddChild(psCINode, _msMetadataGetCharacterString(namespace, "otherCitationDetails", value, ppsNsGco)); } value = msOWSLookupMetadata(&(layer->metadata), "MCFGO", "abstract"); if (!value) value = msOWSLookupMetadata(&(layer->metadata), "S", "offering_description"); xmlAddChild(psDINode, _msMetadataGetCharacterString(namespace, "abstract", value, ppsNsGco)); value = msOWSLookupMetadata(&(layer->metadata), "MCFSGO", "keywordlist"); if (value) { xmlNodePtr psKWNode = xmlNewChild(psDINode, namespace, BAD_CAST "descriptiveKeywords", NULL); xmlNodePtr psMDKNode = xmlNewChild(psKWNode, namespace, BAD_CAST "MD_Keywords", NULL); int n = 0; char **tokens = msStringSplit(value, ',', &n); if (tokens && n > 0) { for (int i = 0; i < n; i++) { xmlAddChild(psMDKNode, _msMetadataGetCharacterString( namespace, "keyword", tokens[i], ppsNsGco)); } } msFreeCharArray(tokens, n); } xmlAddChild(psDINode, _msMetadataGetCharacterString( namespace, "language", (char *)msOWSGetLanguage(map, "exception"), ppsNsGco)); xmlAddChild(psDINode, _msMetadataGetExtent(namespace, layer, ppsNsGco)); return psNode; } /************************************************************************/ /* _msMetadataGetSpatialRepresentationInfo */ /* */ /* Create a gmd:spatialRepresentationInfo element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetSpatialRepresentationInfo(xmlNsPtr namespace, layerObj *layer, xmlNsPtr *ppsNsGco) { xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST "spatialRepresentationInfo"); if (layer->type == MS_LAYER_RASTER) { xmlNodePtr psSRNode = xmlNewChild( psNode, namespace, BAD_CAST "MD_GridSpatialRepresentation", NULL); xmlAddChild(psSRNode, _msMetadataGetInteger(namespace, "numberOfDimensions", 2, ppsNsGco)); xmlAddChild(psSRNode, _msMetadataGetCodeList(namespace, "cellGeometry", "MD_CellGeometryCode", "area")); } else { xmlNodePtr psSRNode = xmlNewChild( psNode, namespace, BAD_CAST "MD_VectorSpatialRepresentation", NULL); xmlAddChild(psSRNode, _msMetadataGetCodeList(namespace, "topologyLevel", "MD_TopologyLevelCode", "geometryOnly")); xmlNodePtr psGONode = xmlNewChild(psSRNode, namespace, BAD_CAST "geometricObjects", NULL); xmlNodePtr psGONode2 = xmlNewChild(psGONode, namespace, BAD_CAST "MD_GeometricObjects", NULL); const char *value; if (layer->type == MS_LAYER_POINT) value = "point"; else if (layer->type == MS_LAYER_LINE) value = "curve"; else if (layer->type == MS_LAYER_POLYGON) value = "surface"; else value = "complex"; xmlAddChild(psGONode2, _msMetadataGetCodeList(namespace, "geometricObjectType", "MD_GeometricObjectTypeCode", value)); // TODO: find way to get feature count in a fast way /* xmlAddChild(psGONode2, _msMetadataGetInteger(namespace, * "geometricObjectCount", msLayerGetNumFeatures(layer))); */ } return psNode; } /************************************************************************/ /* _msMetadataGetDistributionInfo */ /* */ /* Create a gmd:identificationInfo element pattern */ /************************************************************************/ static xmlNodePtr _msMetadataGetDistributionInfo(xmlNsPtr namespace, mapObj *map, layerObj *layer, cgiRequestObj *cgi_request, xmlNsPtr *ppsNsGco) { char *url = NULL; xmlNodePtr psNode = xmlNewNode(namespace, BAD_CAST "distributionInfo"); xmlNodePtr psMDNode = xmlNewChild(psNode, namespace, BAD_CAST "MD_Distribution", NULL); { char *pszTmp = msOWSGetOnlineResource(map, "MFCSGO", "onlineresource", cgi_request); url = msEncodeHTMLEntities(pszTmp); msFree(pszTmp); } /* gmd:distributor */ xmlNodePtr psDNode = xmlNewChild(psMDNode, namespace, BAD_CAST "distributor", NULL); xmlNodePtr psDNode2 = xmlNewChild(psDNode, namespace, BAD_CAST "MD_Distributor", NULL); xmlAddChild(psDNode2, _msMetadataGetContact(namespace, "distributorContact", map, ppsNsGco)); /* gmd:transferOptions */ xmlNodePtr psTONode = xmlNewChild(psMDNode, namespace, BAD_CAST "transferOptions", NULL); xmlNodePtr psDTONode = xmlNewChild( psTONode, namespace, BAD_CAST "MD_DigitalTransferOptions", NULL); xmlAddChild(psDTONode, _msMetadataGetCharacterString( namespace, "unitsOfDistribution", "KB", ppsNsGco)); /* links */ /* WMS */ xmlAddChild(psDTONode, _msMetadataGetOnline(namespace, layer, "M", "image/png", "PNG Format", url, ppsNsGco)); xmlAddChild(psDTONode, _msMetadataGetOnline(namespace, layer, "M", "image/jpeg", "JPEG Format", url, ppsNsGco)); /* WCS */ if (layer->type == MS_LAYER_RASTER) { xmlAddChild(psDTONode, _msMetadataGetOnline(namespace, layer, "C", "image/tiff", "GeoTIFF Format", url, ppsNsGco)); } /* WFS */ else { xmlAddChild(psDTONode, _msMetadataGetOnline(namespace, layer, "F", "GML2", "GML2 Format", url, ppsNsGco)); xmlAddChild(psDTONode, _msMetadataGetOnline(namespace, layer, "F", "GML3", "GML3 Format", url, ppsNsGco)); } msFree(url); return psNode; } /************************************************************************/ /* msMetadataGetExceptionReport */ /* */ /* Generate an OWS Common Exception Report */ /************************************************************************/ static xmlNodePtr msMetadataGetExceptionReport(mapObj *map, char *code, char *locator, char *message, xmlNsPtr *ppsNsOws) { char *schemas_location = NULL; xmlNodePtr psRootNode = NULL; schemas_location = msEncodeHTMLEntities(msOWSGetSchemasLocation(map)); *ppsNsOws = xmlNewNs(NULL, BAD_CAST "http://www.opengis.net/ows/1.1", BAD_CAST "ows"); psRootNode = msOWSCommonExceptionReport( *ppsNsOws, OWS_1_1_0, schemas_location, "1.1.0", msOWSGetLanguage(map, "exception"), code, locator, message); msFree(schemas_location); xmlNewNs(psRootNode, BAD_CAST "http://www.opengis.net/ows/1.1", BAD_CAST "ows"); return psRootNode; } /************************************************************************/ /* msMetadataGetLayerMetadata */ /* */ /* Generate an ISO 19139-1:2019 representation of layer metadata */ /************************************************************************/ static xmlNodePtr msMetadataGetLayerMetadata(mapObj *map, metadataParamsObj *paramsObj, cgiRequestObj *cgi_request, xmlNsPtr *ppsNsOws, xmlNsPtr *ppsNsXsi, xmlNsPtr *ppsNsGmd, xmlNsPtr *ppsNsGco) { int i; int layer_found = MS_FALSE; xmlNodePtr psRootNode = NULL; layerObj *layer = NULL; /* Check that layer requested exists in mapfile */ for (i = 0; i < map->numlayers; i++) { if (strcasecmp(GET_LAYER(map, i)->name, paramsObj->pszLayer) == 0) { layer_found = MS_TRUE; layer = GET_LAYER(map, i); // when checking a layer with clustering msLayerGetExtent does not have // access to the source layer, so remove clustering first if (layer->cluster.region) { layer->cluster.region = NULL; } break; } } if (layer_found == MS_FALSE) { psRootNode = msMetadataGetExceptionReport( map, "InvalidParameterValue", "layer", "Layer not found", ppsNsOws); } /* Check that outputschema is valid */ else if (paramsObj->pszOutputSchema && strcasecmp(paramsObj->pszOutputSchema, "http://www.isotc211.org/2005/gmd") != 0) { psRootNode = msMetadataGetExceptionReport( map, "InvalidParameterValue", "outputschema", "OUTPUTSCHEMA must be \"http://www.isotc211.org/2005/gmd\"", ppsNsOws); } else { *ppsNsXsi = xmlNewNs(NULL, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); *ppsNsGmd = xmlNewNs(NULL, BAD_CAST "http://www.isotc211.org/2005/gmd", BAD_CAST "gmd"); /* root element */ psRootNode = xmlNewNode(NULL, BAD_CAST "MD_Metadata"); xmlNewNs(psRootNode, BAD_CAST "http://www.isotc211.org/2005/gmd", BAD_CAST "gmd"); xmlNewNs(psRootNode, BAD_CAST "http://www.isotc211.org/2005/gco", BAD_CAST "gco"); xmlNewNs(psRootNode, BAD_CAST "http://www.w3.org/2001/XMLSchema-instance", BAD_CAST "xsi"); xmlSetNs(psRootNode, *ppsNsGmd); xmlNewNsProp(psRootNode, *ppsNsXsi, BAD_CAST "schemaLocation", BAD_CAST "http://www.isotc211.org/2005/gmd " "http://www.isotc211.org/2005/gmd/gmd.xsd"); /* gmd:identifier */ xmlAddChild(psRootNode, _msMetadataGetCharacterString(*ppsNsGmd, "fileIdentifier", layer->name, ppsNsGco)); /* gmd:language */ xmlAddChild(psRootNode, _msMetadataGetCharacterString( *ppsNsGmd, "language", (char *)msOWSGetLanguage(map, "exception"), ppsNsGco)); /* gmd:hierarchyLevel */ xmlAddChild(psRootNode, _msMetadataGetCodeList(*ppsNsGmd, "hierarchyLevel", "MD_ScopeCode", "dataset")); /* gmd:contact */ xmlAddChild(psRootNode, _msMetadataGetContact(*ppsNsGmd, "contact", map, ppsNsGco)); /* gmd:dateStamp */ /* TODO: nil for now, find way to derive this automagically */ xmlAddChild(psRootNode, _msMetadataGetCharacterString( *ppsNsGmd, "dateStamp", NULL, ppsNsGco)); /* gmd:metadataStandardName */ xmlAddChild(psRootNode, _msMetadataGetCharacterString( *ppsNsGmd, "metadataStandardName", "ISO 19115:2003 - Geographic information - Metadata", ppsNsGco)); /* gmd:metadataStandardVersion */ xmlAddChild(psRootNode, _msMetadataGetCharacterString( *ppsNsGmd, "metadataStandardVersion", "ISO 19115:2003", ppsNsGco)); /* gmd:spatialRepresentationInfo */ xmlAddChild(psRootNode, _msMetadataGetSpatialRepresentationInfo( *ppsNsGmd, layer, ppsNsGco)); /* gmd:referenceSystemInfo */ xmlAddChild(psRootNode, _msMetadataGetReferenceSystemInfo(*ppsNsGmd, layer, ppsNsGco)); /* gmd:identificationInfo */ xmlAddChild(psRootNode, _msMetadataGetIdentificationInfo(*ppsNsGmd, map, layer, ppsNsGco)); /* gmd:distributionInfo */ xmlAddChild(psRootNode, _msMetadataGetDistributionInfo( *ppsNsGmd, map, layer, cgi_request, ppsNsGco)); } return psRootNode; } /************************************************************************/ /* msMetadataDispatch */ /* */ /* Entry point for metadata requests. */ /* */ /* - If this is a valid request then it is processed and MS_SUCCESS */ /* is returned on success, or MS_FAILURE on failure. */ /* */ /* - If this does not appear to be a valid WFS request then MS_DONE */ /* is returned and MapServer is expected to process this as a regular */ /* MapServer request. */ /************************************************************************/ int msMetadataDispatch(mapObj *map, cgiRequestObj *cgi_request) { int i; int status = MS_SUCCESS; xmlNodePtr psRootNode = NULL; xmlDocPtr xml_document; metadataParamsObj *paramsObj; layerObj *layer = NULL; xmlNsPtr psNsOws = NULL; xmlNsPtr psNsXsi = NULL; xmlNsPtr psNsGmd = NULL; xmlNsPtr psNsGco = NULL; /* Populate the Params object based on the request */ paramsObj = msMetadataCreateParamsObj(); xml_document = xmlNewDoc(BAD_CAST "1.0"); if (msMetadataParseRequest(cgi_request, paramsObj) == MS_FAILURE) { psRootNode = msMetadataGetExceptionReport( map, "InvalidRequest", "layer", "Request parsing failed", &psNsOws); status = MS_FAILURE; } /* if layer= is not specified, */ if (paramsObj->pszLayer == NULL || strlen(paramsObj->pszLayer) == 0) { psRootNode = msMetadataGetExceptionReport(map, "MissingParameterValue", "layer", "Missing layer parameter", &psNsOws); status = MS_FAILURE; } if (status == MS_SUCCESS) { /* Start dispatching request */ /* Check that layer requested exists in mapfile */ for (i = 0; i < map->numlayers; i++) { if (strcasecmp(GET_LAYER(map, i)->name, paramsObj->pszLayer) == 0) { layer = GET_LAYER(map, i); break; } } if (layer != NULL && msOWSLookupMetadata(&(layer->metadata), "MFCO", "metadataurl_href")) { msIO_setHeader("Status", "301 Moved Permanently"); msIO_setHeader( "Location", "%s", msOWSLookupMetadata(&(layer->metadata), "MFCO", "metadataurl_href")); msIO_sendHeaders(); } else { psRootNode = msMetadataGetLayerMetadata( map, paramsObj, cgi_request, &psNsOws, &psNsXsi, &psNsGmd, &psNsGco); } } if (psRootNode != NULL) { xmlChar *xml_buffer = NULL; int buffersize = 0; xmlDocSetRootElement(xml_document, psRootNode); msIO_setHeader("Content-type", "text/xml; charset=UTF-8"); msIO_sendHeaders(); msIOContext *context = NULL; context = msIO_getHandler(stdout); xmlDocDumpFormatMemoryEnc(xml_document, &xml_buffer, &buffersize, "UTF-8", 1); msIO_contextWrite(context, xml_buffer, buffersize); xmlFree(xml_buffer); } xmlFreeDoc(xml_document); if (psNsOws) xmlFreeNs(psNsOws); if (psNsXsi) xmlFreeNs(psNsXsi); if (psNsGmd) xmlFreeNs(psNsGmd); if (psNsGco) xmlFreeNs(psNsGco); msMetadataFreeParamsObj(paramsObj); return status; } #endif /* USE_LIBXML2 */ /************************************************************************/ /* msMetadataCreateParamsObj */ /* */ /* Create a parameter object, initialize it. */ /* The caller should free the object using msMetadataFreeParamsObj. */ /************************************************************************/ metadataParamsObj *msMetadataCreateParamsObj() { metadataParamsObj *paramsObj = (metadataParamsObj *)calloc(1, sizeof(metadataParamsObj)); MS_CHECK_ALLOC(paramsObj, sizeof(metadataParamsObj), NULL); paramsObj->pszLayer = NULL; paramsObj->pszOutputSchema = NULL; return paramsObj; } /************************************************************************/ /* msMetadataFreeParmsObj */ /* */ /* Free params object. */ /************************************************************************/ void msMetadataFreeParamsObj(metadataParamsObj *metadataparams) { if (metadataparams) { free(metadataparams->pszRequest); free(metadataparams->pszLayer); free(metadataparams->pszOutputSchema); free(metadataparams); } } /************************************************************************/ /* msMetadataParseRequest */ /* */ /* Parse request into the params object. */ /************************************************************************/ static int msMetadataParseRequest(cgiRequestObj *request, metadataParamsObj *metadataparams) { if (!request || !metadataparams) return MS_FAILURE; if (request->NumParams > 0) { for (int i = 0; i < request->NumParams; i++) { if (request->ParamNames[i] && request->ParamValues[i]) { if (strcasecmp(request->ParamNames[i], "LAYER") == 0) metadataparams->pszLayer = msStrdup(request->ParamValues[i]); if (strcasecmp(request->ParamNames[i], "OUTPUTSCHEMA") == 0) metadataparams->pszOutputSchema = msStrdup(request->ParamValues[i]); } } } return MS_SUCCESS; } /************************************************************************/ /* msMetadataSetGetMetadataURL */ /* */ /* Parse request into the params object. */ /************************************************************************/ void msMetadataSetGetMetadataURL(layerObj *lp, const char *url) { char *pszMetadataURL = NULL; pszMetadataURL = msStrdup(url); msDecodeHTMLEntities(pszMetadataURL); pszMetadataURL = msStringConcatenate(pszMetadataURL, "request=GetMetadata&layer="); pszMetadataURL = msStringConcatenate(pszMetadataURL, lp->name); msInsertHashTable(&(lp->metadata), "ows_metadataurl_href", pszMetadataURL); msInsertHashTable(&(lp->metadata), "ows_metadataurl_type", "TC211"); msInsertHashTable(&(lp->metadata), "ows_metadataurl_format", "text/xml"); msInsertHashTable(&(lp->metadata), "ows_metadatalink_href", pszMetadataURL); msInsertHashTable(&(lp->metadata), "ows_metadatalink_type", "TC211"); msInsertHashTable(&(lp->metadata), "ows_metadatalink_format", "text/xml"); msFree(pszMetadataURL); } #endif mapserver-8.6.0/src/mapmssql2008.c000066400000000000000000004017331511405061000166340ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MS SQL Server Layer Connector * Author: Richard Hillman - based on PostGIS and SpatialDB connectors * Tamas Szekeres - maintenance * ****************************************************************************** * Copyright (c) 2007 IS Consulting (www.mapdotnet.com) * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * Revision 1.0 2007/7/1 * Created. * */ #ifndef _WIN32 #define _GNU_SOURCE #endif #define _CRT_SECURE_NO_WARNINGS 1 /* $Id$ */ #include #include "mapserver.h" #include "maptime.h" #include "mapows.h" #ifdef USE_MSSQL2008 #ifdef _WIN32 #include #endif #include #include #include #include #include /* tolower() */ /* SqlGeometry/SqlGeography serialization format Simple Point (SerializationProps & IsSinglePoint) [SRID][0x01][SerializationProps][Point][z][m] Simple Line Segment (SerializationProps & IsSingleLineSegment) [SRID][0x01][SerializationProps][Point1][Point2][z1][z2][m1][m2] Complex Geometries [SRID][VersionAttribute][SerializationProps][NumPoints][Point1]..[PointN][z1]..[zN][m1]..[mN] [NumFigures][Figure]..[Figure][NumShapes][Shape]..[Shape] Complex Geometries (FigureAttribute == Curve) [SRID][VersionAttribute][SerializationProps][NumPoints][Point1]..[PointN][z1]..[zN][m1]..[mN] [NumFigures][Figure]..[Figure][NumShapes][Shape]..[Shape][NumSegments][SegmentType]..[SegmentType] VersionAttribute (1 byte) 0x01 = Katmai (MSSQL2008+) 0x02 = Denali (MSSQL2012+) SRID Spatial Reference Id (4 bytes) SerializationProps (bitmask) 1 byte 0x01 = HasZValues 0x02 = HasMValues 0x04 = IsValid 0x08 = IsSinglePoint 0x10 = IsSingleLineSegment 0x20 = IsLargerThanAHemisphere Point (2-4)x8 bytes, size depends on SerializationProps & HasZValues & HasMValues [x][y] - SqlGeometry [latitude][longitude] - SqlGeography Figure [FigureAttribute][PointOffset] FigureAttribute - Katmai (1 byte) 0x00 = Interior Ring 0x01 = Stroke 0x02 = Exterior Ring FigureAttribute - Denali (1 byte) 0x00 = None 0x01 = Line 0x02 = Arc 0x03 = Curve Shape [ParentFigureOffset][FigureOffset][ShapeType] ShapeType (1 byte) 0x00 = Unknown 0x01 = Point 0x02 = LineString 0x03 = Polygon 0x04 = MultiPoint 0x05 = MultiLineString 0x06 = MultiPolygon 0x07 = GeometryCollection -- Denali 0x08 = CircularString 0x09 = CompoundCurve 0x0A = CurvePolygon 0x0B = FullGlobe SegmentType (1 byte) 0x00 = Line 0x01 = Arc 0x02 = FirstLine 0x03 = FirstArc */ /* Native geometry parser macros */ /* parser error codes */ #define NOERROR 0 #define NOT_ENOUGH_DATA 1 #define CORRUPT_DATA 2 #define UNSUPPORTED_GEOMETRY_TYPE 3 /* geometry format to transfer geometry column */ #define MSSQLGEOMETRY_NATIVE 0 #define MSSQLGEOMETRY_WKB 1 #define MSSQLGEOMETRY_WKT 2 /* geometry column types */ #define MSSQLCOLTYPE_GEOMETRY 0 #define MSSQLCOLTYPE_GEOGRAPHY 1 #define MSSQLCOLTYPE_BINARY 2 #define MSSQLCOLTYPE_TEXT 3 #define SP_NONE 0 #define SP_HASZVALUES 1 #define SP_HASMVALUES 2 #define SP_ISVALID 4 #define SP_ISSINGLEPOINT 8 #define SP_ISSINGLELINESEGMENT 0x10 #define SP_ISLARGERTHANAHEMISPHERE 0x20 #define ST_UNKNOWN 0 #define ST_POINT 1 #define ST_LINESTRING 2 #define ST_POLYGON 3 #define ST_MULTIPOINT 4 #define ST_MULTILINESTRING 5 #define ST_MULTIPOLYGON 6 #define ST_GEOMETRYCOLLECTION 7 #define ST_CIRCULARSTRING 8 #define ST_COMPOUNDCURVE 9 #define ST_CURVEPOLYGON 10 #define ST_FULLGLOBE 11 #define SMT_LINE 0 #define SMT_ARC 1 #define SMT_FIRSTLINE 2 #define SMT_FIRSTARC 3 #define ReadInt32(nPos) (*((unsigned int *)(gpi->pszData + (nPos)))) #define ReadByte(nPos) (gpi->pszData[nPos]) #define ReadDouble(nPos) (*((double *)(gpi->pszData + (nPos)))) #define ParentOffset(iShape) (ReadInt32(gpi->nShapePos + (iShape)*9)) #define FigureOffset(iShape) (ReadInt32(gpi->nShapePos + (iShape)*9 + 4)) #define ShapeType(iShape) (ReadByte(gpi->nShapePos + (iShape)*9 + 8)) #define SegmentType(iSegment) (ReadByte(gpi->nSegmentPos + (iSegment))) #define NextFigureOffset(iShape) \ (iShape + 1 < gpi->nNumShapes ? FigureOffset((iShape) + 1) : gpi->nNumFigures) #define FigureAttribute(iFigure) (ReadByte(gpi->nFigurePos + (iFigure)*5)) #define PointOffset(iFigure) (ReadInt32(gpi->nFigurePos + (iFigure)*5 + 1)) #define NextPointOffset(iFigure) \ (iFigure + 1 < gpi->nNumFigures ? PointOffset((iFigure) + 1) \ : (unsigned)gpi->nNumPoints) #define ReadX(iPoint) (ReadDouble(gpi->nPointPos + 16 * (iPoint))) #define ReadY(iPoint) (ReadDouble(gpi->nPointPos + 16 * (iPoint) + 8)) #define ReadZ(iPoint) \ (ReadDouble(gpi->nPointPos + 16 * gpi->nNumPoints + 8 * (iPoint))) #define ReadM(iPoint) \ (ReadDouble(gpi->nPointPos + 24 * gpi->nNumPoints + 8 * (iPoint))) #define FP_EPSILON 1e-12 #define SEGMENT_ANGLE 5.0 #define SEGMENT_MINPOINTS 10 /* Native geometry parser struct */ typedef struct msGeometryParserInfo_t { unsigned char *pszData; int nLen; /* version */ char chVersion; /* serialization properties */ char chProps; /* point array */ int nPointSize; int nPointPos; int nNumPoints; int nNumPointsRead; /* figure array */ int nFigurePos; int nNumFigures; /* shape array */ int nShapePos; int nNumShapes; int nSRSId; /* segment array */ int nSegmentPos; int nNumSegments; /* geometry or geography */ int nColType; /* bounds */ double minx; double miny; double maxx; double maxy; } msGeometryParserInfo; /* Structure for connection to an ODBC database (Microsoft preferred way to * connect to SQL Server 2005 from c/c++) */ typedef struct msODBCconn_t { SQLHENV henv; /* ODBC HENV */ SQLHDBC hdbc; /* ODBC HDBC */ SQLHSTMT hstmt; /* ODBC HSTMNT */ char errorMessage[1024]; /* Last error message if any */ } msODBCconn; typedef struct ms_MSSQL2008_layer_info_t { char *sql; /* sql query to send to DB */ long row_num; /* what row is the NEXT to be read (for random access) */ char *geom_column; /* name of the actual geometry column parsed from the LAYER's DATA field */ char *geom_column_type; /* the type of the geometry column */ char *geom_table; /* the table name or sub-select decalred in the LAYER's DATA field */ char *urid_name; /* name of user-specified unique identifier or OID */ char * user_srid; /* zero length = calculate, non-zero means using this value! */ char *index_name; /* hopefully this isn't necessary - but if the optimizer ain't cuttin' it... */ char *sort_spec; /* the sort by specification which should be applied to the generated select statement */ int mssqlversion_major; /* the sql server major version number */ int paging; /* Driver handling of pagination, enabled by default */ SQLSMALLINT *itemtypes; /* storing the sql field types for further reference */ msODBCconn *conn; /* Connection to db */ msGeometryParserInfo gpi; /* struct for the geometry parser */ int geometry_format; /* Geometry format to be retrieved from the database */ tokenListNodeObjPtr current_node; /* filter expression translation */ } msMSSQL2008LayerInfo; #define SQL_COLUMN_NAME_MAX_LENGTH 128 #define SQL_TABLE_NAME_MAX_LENGTH 128 #define DATA_ERROR_MESSAGE \ "%s" \ "Error with MSSQL2008 data variable. You specified '%s'.
\n" \ "Standard ways of specifying are :
\n(1) 'geometry_column from " \ "geometry_table'
\n(2) 'geometry_column from (<sub query>) as " \ "foo using unique <column name> using SRID=<srid#>' " \ "

\n\n" \ "Make sure you utilize the 'using unique <column name>' and 'using " \ "with <index name>' clauses in.\n\n

" \ "For more help, please see http://www.mapdotnet.com \n\n

" \ "mapmssql2008.c - version of 2007/7/1.\n" /* Native geometry parser code */ void ReadPoint(msGeometryParserInfo *gpi, pointObj *p, int iPoint) { if (gpi->nColType == MSSQLCOLTYPE_GEOGRAPHY) { p->x = ReadY(iPoint); p->y = ReadX(iPoint); } else { p->x = ReadX(iPoint); p->y = ReadY(iPoint); } /* calculate bounds */ if (gpi->nNumPointsRead++ == 0) { gpi->minx = gpi->maxx = p->x; gpi->miny = gpi->maxy = p->y; } else { if (gpi->minx > p->x) gpi->minx = p->x; else if (gpi->maxx < p->x) gpi->maxx = p->x; if (gpi->miny > p->y) gpi->miny = p->y; else if (gpi->maxy < p->y) gpi->maxy = p->y; } if ((gpi->chProps & SP_HASZVALUES) && (gpi->chProps & SP_HASMVALUES)) { p->z = ReadZ(iPoint); p->m = ReadM(iPoint); } else if (gpi->chProps & SP_HASZVALUES) { p->z = ReadZ(iPoint); p->m = 0.0; } else if (gpi->chProps & SP_HASMVALUES) { p->z = 0.0; p->m = ReadZ(iPoint); } else { p->z = 0.0; p->m = 0.0; } } int StrokeArcToLine(msGeometryParserInfo *gpi, lineObj *line, int index) { if (index > 1) { double x, y, x1, y1, x2, y2, x3, y3, dxa, dya, sxa, sya, dxb, dyb; double d, sxb, syb, ox, oy, a1, a3, sa, da, a, radius; int numpoints; double z; z = line->point[index].z; /* must be equal for arc segments */ /* first point */ x1 = line->point[index - 2].x; y1 = line->point[index - 2].y; /* second point */ x2 = line->point[index - 1].x; y2 = line->point[index - 1].y; /* third point */ x3 = line->point[index].x; y3 = line->point[index].y; sxa = (x1 + x2); sya = (y1 + y2); dxa = x2 - x1; dya = y2 - y1; sxb = (x2 + x3); syb = (y2 + y3); dxb = x3 - x2; dyb = y3 - y2; d = (dxa * dyb - dya * dxb) * 2; if (fabs(d) < FP_EPSILON) { /* points are colinear, nothing to do here */ return index; } /* calculating the center of circle */ ox = ((sya - syb) * dya * dyb + sxa * dyb * dxa - sxb * dya * dxb) / d; oy = ((sxb - sxa) * dxa * dxb + syb * dyb * dxa - sya * dya * dxb) / d; radius = sqrt((x1 - ox) * (x1 - ox) + (y1 - oy) * (y1 - oy)); /* calculating the angle to be used */ a1 = atan2(y1 - oy, x1 - ox); a3 = atan2(y3 - oy, x3 - ox); if (d > 0) { /* draw counterclockwise */ if (a3 > a1) /* Wrapping past 180? */ sa = a3 - a1; else sa = a3 - a1 + 2.0 * M_PI; } else { if (a3 > a1) /* Wrapping past 180? */ sa = a3 - a1 + 2.0 * M_PI; else sa = a3 - a1; } numpoints = (int)floor(fabs(sa) * 180 / SEGMENT_ANGLE / M_PI); if (numpoints < SEGMENT_MINPOINTS) numpoints = SEGMENT_MINPOINTS; da = sa / numpoints; /* extend the point array */ line->numpoints += numpoints - 2; line->point = msSmallRealloc(line->point, sizeof(pointObj) * line->numpoints); --index; a = a1 + da; while (numpoints > 1) { line->point[index].x = x = ox + radius * cos(a); line->point[index].y = y = oy + radius * sin(a); line->point[index].z = z; /* calculate bounds */ if (gpi->minx > x) gpi->minx = x; else if (gpi->maxx < x) gpi->maxx = x; if (gpi->miny > y) gpi->miny = y; else if (gpi->maxy < y) gpi->maxy = y; a += da; ++index; --numpoints; } /* set last point */ line->point[index].x = x3; line->point[index].y = y3; line->point[index].z = z; } return index; } int ParseSqlGeometry(msMSSQL2008LayerInfo *layerinfo, shapeObj *shape) { msGeometryParserInfo *gpi = &layerinfo->gpi; gpi->nNumPointsRead = 0; if (gpi->nLen < 10) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } /* store the SRS id for further use */ gpi->nSRSId = ReadInt32(0); gpi->chVersion = ReadByte(4); if (gpi->chVersion > 2) { msDebug("ParseSqlGeometry CORRUPT_DATA\n"); return CORRUPT_DATA; } gpi->chProps = ReadByte(5); gpi->nPointSize = 16; if (gpi->chProps & SP_HASMVALUES) gpi->nPointSize += 8; if (gpi->chProps & SP_HASZVALUES) gpi->nPointSize += 8; if (gpi->chProps & SP_ISSINGLEPOINT) { // single point geometry gpi->nNumPoints = 1; if (gpi->nLen < 6 + gpi->nPointSize) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } shape->type = MS_SHAPE_POINT; shape->line = (lineObj *)msSmallMalloc(sizeof(lineObj)); shape->numlines = 1; shape->line[0].point = (pointObj *)msSmallMalloc(sizeof(pointObj)); shape->line[0].numpoints = 1; gpi->nPointPos = 6; ReadPoint(gpi, &shape->line[0].point[0], 0); } else if (gpi->chProps & SP_ISSINGLELINESEGMENT) { // single line segment with 2 points gpi->nNumPoints = 2; if (gpi->nLen < 6 + 2 * gpi->nPointSize) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } shape->type = MS_SHAPE_LINE; shape->line = (lineObj *)msSmallMalloc(sizeof(lineObj)); shape->numlines = 1; shape->line[0].point = (pointObj *)msSmallMalloc(sizeof(pointObj) * 2); shape->line[0].numpoints = 2; gpi->nPointPos = 6; ReadPoint(gpi, &shape->line[0].point[0], 0); ReadPoint(gpi, &shape->line[0].point[1], 1); } else { int iShape, iFigure, iSegment = 0; // complex geometries gpi->nNumPoints = ReadInt32(6); if (gpi->nNumPoints <= 0) { return NOERROR; } // position of the point array gpi->nPointPos = 10; // position of the figures gpi->nFigurePos = gpi->nPointPos + gpi->nPointSize * gpi->nNumPoints + 4; if (gpi->nLen < gpi->nFigurePos) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } gpi->nNumFigures = ReadInt32(gpi->nFigurePos - 4); if (gpi->nNumFigures <= 0) { return NOERROR; } // position of the shapes gpi->nShapePos = gpi->nFigurePos + 5 * gpi->nNumFigures + 4; if (gpi->nLen < gpi->nShapePos) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } gpi->nNumShapes = ReadInt32(gpi->nShapePos - 4); if (gpi->nLen < gpi->nShapePos + 9 * gpi->nNumShapes) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } if (gpi->nNumShapes <= 0) { return NOERROR; } // pick up the root shape if (ParentOffset(0) != 0xFFFFFFFF) { msDebug("ParseSqlGeometry CORRUPT_DATA\n"); return CORRUPT_DATA; } // determine the shape type for (iShape = 0; iShape < gpi->nNumShapes; iShape++) { unsigned char shapeType = ShapeType(iShape); if (shapeType == ST_POINT || shapeType == ST_MULTIPOINT) { shape->type = MS_SHAPE_POINT; break; } else if (shapeType == ST_LINESTRING || shapeType == ST_MULTILINESTRING || shapeType == ST_CIRCULARSTRING || shapeType == ST_COMPOUNDCURVE) { shape->type = MS_SHAPE_LINE; break; } else if (shapeType == ST_POLYGON || shapeType == ST_MULTIPOLYGON || shapeType == ST_CURVEPOLYGON) { shape->type = MS_SHAPE_POLYGON; break; } } shape->line = (lineObj *)msSmallMalloc(sizeof(lineObj) * gpi->nNumFigures); shape->numlines = gpi->nNumFigures; gpi->nNumSegments = 0; // read figures for (iFigure = 0; iFigure < gpi->nNumFigures; iFigure++) { int iPoint, iNextPoint, i; iPoint = PointOffset(iFigure); iNextPoint = NextPointOffset(iFigure); shape->line[iFigure].point = (pointObj *)msSmallMalloc(sizeof(pointObj) * (iNextPoint - iPoint)); shape->line[iFigure].numpoints = iNextPoint - iPoint; i = 0; if (gpi->chVersion == 0x02 && FigureAttribute(iFigure) >= 0x02) { int nPointPrepared = 0; lineObj *line = &shape->line[iFigure]; if (FigureAttribute(iFigure) == 0x03) { if (gpi->nNumSegments == 0) { /* position of the segment types */ gpi->nSegmentPos = gpi->nShapePos + 9 * gpi->nNumShapes + 4; gpi->nNumSegments = ReadInt32(gpi->nSegmentPos - 4); if (gpi->nLen < gpi->nSegmentPos + gpi->nNumSegments) { msDebug("ParseSqlGeometry NOT_ENOUGH_DATA\n"); return NOT_ENOUGH_DATA; } iSegment = 0; } while (iPoint < iNextPoint && iSegment < gpi->nNumSegments) { ReadPoint(gpi, &line->point[i], iPoint); ++iPoint; ++nPointPrepared; if (nPointPrepared == 2 && (SegmentType(iSegment) == SMT_FIRSTLINE || SegmentType(iSegment) == SMT_LINE)) { ++iSegment; nPointPrepared = 1; } else if (nPointPrepared == 3 && (SegmentType(iSegment) == SMT_FIRSTARC || SegmentType(iSegment) == SMT_ARC)) { i = StrokeArcToLine(gpi, line, i); ++iSegment; nPointPrepared = 1; } ++i; } } else { while (iPoint < iNextPoint) { ReadPoint(gpi, &line->point[i], iPoint); ++iPoint; ++nPointPrepared; if (nPointPrepared == 3) { i = StrokeArcToLine(gpi, line, i); nPointPrepared = 1; } ++i; } } } else { while (iPoint < iNextPoint) { ReadPoint(gpi, &shape->line[iFigure].point[i], iPoint); ++iPoint; ++i; } } } } /* set bounds */ shape->bounds.minx = gpi->minx; shape->bounds.miny = gpi->miny; shape->bounds.maxx = gpi->maxx; shape->bounds.maxy = gpi->maxy; return NOERROR; } /* MS SQL driver code*/ msMSSQL2008LayerInfo *getMSSQL2008LayerInfo(const layerObj *layer) { return layer->layerinfo; } void setMSSQL2008LayerInfo(layerObj *layer, msMSSQL2008LayerInfo *MSSQL2008layerinfo) { layer->layerinfo = (void *)MSSQL2008layerinfo; } void handleSQLError(layerObj *layer) { SQLCHAR SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH]; SQLINTEGER NativeError; SQLSMALLINT i, MsgLen; SQLRETURN rc; msMSSQL2008LayerInfo *layerinfo = getMSSQL2008LayerInfo(layer); if (layerinfo == NULL) return; // Get the status records. i = 1; while ((rc = SQLGetDiagRec(SQL_HANDLE_STMT, layerinfo->conn->hstmt, i, SqlState, &NativeError, Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) { if (layer->debug) { msDebug("SQLError: %s\n", Msg); } i++; } } /* TODO Take a look at glibc's strcasestr */ static char *strstrIgnoreCase(const char *haystack, const char *needle) { char *hay_lower; char *needle_lower; size_t len_hay, len_need, match; int found = MS_FALSE; char *loc; len_hay = strlen(haystack); len_need = strlen(needle); hay_lower = (char *)msSmallMalloc(len_hay + 1); needle_lower = (char *)msSmallMalloc(len_need + 1); size_t t; for (t = 0; t < len_hay; t++) { hay_lower[t] = (char)tolower(haystack[t]); } hay_lower[t] = 0; for (t = 0; t < len_need; t++) { needle_lower[t] = (char)tolower(needle[t]); } needle_lower[t] = 0; loc = strstr(hay_lower, needle_lower); if (loc) { match = loc - hay_lower; found = MS_TRUE; } msFree(hay_lower); msFree(needle_lower); return (char *)(found == MS_FALSE ? NULL : haystack + match); } static int msMSSQL2008LayerParseData(layerObj *layer, char **geom_column_name, char **geom_column_type, char **table_name, char **urid_name, char **user_srid, char **index_name, char **sort_spec, int debug); /* Close connection and handles */ static void msMSSQL2008CloseConnection(void *conn_handle) { msODBCconn *conn = (msODBCconn *)conn_handle; if (!conn) { return; } if (conn->hstmt) { SQLFreeHandle(SQL_HANDLE_STMT, conn->hstmt); } if (conn->hdbc) { SQLDisconnect(conn->hdbc); SQLFreeHandle(SQL_HANDLE_DBC, conn->hdbc); } if (conn->henv) { SQLFreeHandle(SQL_HANDLE_ENV, conn->henv); } msFree(conn); } /* Set the error string for the connection */ static void setConnError(msODBCconn *conn) { SQLSMALLINT len; SQLGetDiagField(SQL_HANDLE_DBC, conn->hdbc, 1, SQL_DIAG_MESSAGE_TEXT, (SQLPOINTER)conn->errorMessage, sizeof(conn->errorMessage), &len); conn->errorMessage[len] = 0; } #if defined(_WIN32) && defined(USE_ICONV) static SQLWCHAR *convertCwchartToSQLWCHAR(const wchar_t *inStr) { SQLWCHAR *outStr; int i, len; for (len = 0; inStr[len] != 0; ++len) { /* do nothing */ } outStr = (SQLWCHAR *)msSmallMalloc(sizeof(SQLWCHAR) * (len + 1)); for (i = 0; i <= len; i++) { outStr[i] = (SQLWCHAR)inStr[i]; } return outStr; } #endif /* Connect to db */ static msODBCconn *mssql2008Connect(const char *connString) { SQLSMALLINT outConnStringLen; SQLRETURN rc; msODBCconn *conn = msSmallMalloc(sizeof(msODBCconn)); char fullConnString[1024]; memset(conn, 0, sizeof(*conn)); SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &conn->henv); SQLSetEnvAttr(conn->henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); SQLAllocHandle(SQL_HANDLE_DBC, conn->henv, &conn->hdbc); if (strcasestr(connString, "DRIVER=") == 0) { snprintf(fullConnString, sizeof(fullConnString), "DRIVER={SQL Server};%s", connString); connString = fullConnString; } { #if defined(_WIN32) && defined(USE_ICONV) wchar_t *decodedConnString = msConvertWideStringFromUTF8(connString, "UCS-2LE"); SQLWCHAR outConnString[1024]; SQLWCHAR *decodedConnStringSQLWCHAR = convertCwchartToSQLWCHAR(decodedConnString); rc = SQLDriverConnectW(conn->hdbc, NULL, decodedConnStringSQLWCHAR, SQL_NTS, outConnString, 1024, &outConnStringLen, SQL_DRIVER_NOPROMPT); msFree(decodedConnString); msFree(decodedConnStringSQLWCHAR); #else SQLCHAR outConnString[1024]; rc = SQLDriverConnect(conn->hdbc, NULL, (SQLCHAR *)connString, SQL_NTS, outConnString, 1024, &outConnStringLen, SQL_DRIVER_NOPROMPT); #endif } if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { setConnError(conn); return conn; } SQLAllocHandle(SQL_HANDLE_STMT, conn->hdbc, &conn->hstmt); return conn; } /* Set the error string for the statement execution */ static void setStmntError(msODBCconn *conn) { SQLSMALLINT len; SQLGetDiagField(SQL_HANDLE_STMT, conn->hstmt, 1, SQL_DIAG_MESSAGE_TEXT, (SQLPOINTER)conn->errorMessage, sizeof(conn->errorMessage), &len); conn->errorMessage[len] = 0; } /* Execute SQL against connection. Set error string if failed */ static int executeSQL(msODBCconn *conn, const char *sql) { SQLRETURN rc; SQLCloseCursor(conn->hstmt); #if defined(_WIN32) && defined(USE_ICONV) { wchar_t *decodedSql = msConvertWideStringFromUTF8(sql, "UCS-2LE"); SQLWCHAR *decodedSqlSQLWCHAR = convertCwchartToSQLWCHAR(decodedSql); rc = SQLExecDirectW(conn->hstmt, decodedSqlSQLWCHAR, SQL_NTS); msFree(decodedSql); msFree(decodedSqlSQLWCHAR); } #else rc = SQLExecDirect(conn->hstmt, (SQLCHAR *)sql, SQL_NTS); #endif if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { return 1; } else { setStmntError(conn); return 0; } } /* Get columns name from query results */ static int columnName(msODBCconn *conn, int index, char *buffer, int bufferLength, layerObj *layer, char pass_field_def, SQLSMALLINT *itemType) { SQLRETURN rc; SQLCHAR columnName[SQL_COLUMN_NAME_MAX_LENGTH + 1]; SQLSMALLINT columnNameLen; SQLSMALLINT dataType; SQLULEN columnSize; SQLSMALLINT decimalDigits; SQLSMALLINT nullable; rc = SQLDescribeCol(conn->hstmt, (SQLUSMALLINT)index, columnName, SQL_COLUMN_NAME_MAX_LENGTH, &columnNameLen, &dataType, &columnSize, &decimalDigits, &nullable); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { if (bufferLength < SQL_COLUMN_NAME_MAX_LENGTH + 1) strlcpy(buffer, (const char *)columnName, bufferLength); else strlcpy(buffer, (const char *)columnName, SQL_COLUMN_NAME_MAX_LENGTH + 1); *itemType = dataType; if (pass_field_def) { char gml_width[32], gml_precision[32]; const char *gml_type = NULL; gml_width[0] = '\0'; gml_precision[0] = '\0'; switch (dataType) { case SQL_INTEGER: case SQL_SMALLINT: case SQL_TINYINT: gml_type = "Integer"; break; case SQL_BIGINT: gml_type = "Long"; break; case SQL_REAL: case SQL_FLOAT: case SQL_DOUBLE: case SQL_DECIMAL: case SQL_NUMERIC: gml_type = "Real"; if (decimalDigits > 0) sprintf(gml_precision, "%d", decimalDigits); break; case SQL_TYPE_DATE: gml_type = "Date"; break; case SQL_TYPE_TIME: gml_type = "Time"; break; case SQL_TYPE_TIMESTAMP: gml_type = "DateTime"; break; case SQL_BIT: gml_type = "Boolean"; break; default: gml_type = "Character"; break; } if (columnSize > 0) sprintf(gml_width, "%u", (unsigned int)columnSize); msUpdateGMLFieldMetadata(layer, buffer, gml_type, gml_width, gml_precision, (const short)nullable); } return 1; } else { setStmntError(conn); return 0; } } /* open up a connection to the MS SQL 2008 database using the connection string * in layer->connection */ /* ie. "driver=;server=;database=;integrated * security=?;user id=;password=" */ int msMSSQL2008LayerOpen(layerObj *layer) { msMSSQL2008LayerInfo *layerinfo; char *conn_decrypted = NULL; if (layer->debug) { msDebug("msMSSQL2008LayerOpen called datastatement: %s\n", layer->data); } if (getMSSQL2008LayerInfo(layer)) { if (layer->debug) { msDebug("msMSSQL2008LayerOpen :: layer is already open!!\n"); } return MS_SUCCESS; /* already open */ } if (!layer->data) { msSetError(MS_QUERYERR, DATA_ERROR_MESSAGE, "msMSSQL2008LayerOpen()", "", "Error parsing MSSQL2008 data variable: nothing specified in " "DATA statement.

\n\nMore Help:

\n\n"); return MS_FAILURE; } if (!layer->connection) { msSetError(MS_QUERYERR, "MSSQL connection parameter not specified.", "msMSSQL2008LayerOpen()"); return MS_FAILURE; } /* have to setup a connection to the database */ layerinfo = (msMSSQL2008LayerInfo *)msSmallMalloc(sizeof(msMSSQL2008LayerInfo)); layerinfo->sql = NULL; /* calc later */ layerinfo->row_num = 0; layerinfo->geom_column = NULL; layerinfo->geom_column_type = NULL; layerinfo->geom_table = NULL; layerinfo->urid_name = NULL; layerinfo->user_srid = NULL; layerinfo->index_name = NULL; layerinfo->sort_spec = NULL; layerinfo->conn = NULL; layerinfo->itemtypes = NULL; layerinfo->mssqlversion_major = 0; layerinfo->paging = MS_TRUE; layerinfo->conn = (msODBCconn *)msConnPoolRequest(layer); if (!layerinfo->conn) { if (layer->debug) { msDebug("MSMSSQL2008LayerOpen -- shared connection not available.\n"); } /* Decrypt any encrypted token in connection and attempt to connect */ conn_decrypted = msDecryptStringTokens(layer->map, layer->connection); if (conn_decrypted == NULL) { return (MS_FAILURE); /* An error should already have been produced */ } layerinfo->conn = mssql2008Connect(conn_decrypted); msFree(conn_decrypted); conn_decrypted = NULL; if (!layerinfo->conn || layerinfo->conn->errorMessage[0]) { char *errMess = "Out of memory"; if (layer->debug) msDebug("MSMSSQL2008LayerOpen: Connection failure.\n"); if (layerinfo->conn) { errMess = layerinfo->conn->errorMessage; } msDebug( "Couldn't make connection to MS SQL Server with connect string " "'%s'.\n" "Error reported was '%s'.\n\n" "This error occurred when trying to make a connection to the " "specified SQL server.\n" "Most commonly this is caused by: \n" "(1) incorrect connection string \n" "(2) you didn't specify a 'user id=...' in your connection string \n" "(3) SQL server isn't running \n" "(4) TCPIP not enabled for SQL Client or server \n\n", layer->connection, errMess); msSetError(MS_QUERYERR, "Database connection failed. Check server logs for more " "details. Is SQL Server running? Is it allowing connections? " "Does the specified user exist? Is the password valid? Is the " "database on the standard port?", "MSMSSQL2008LayerOpen()"); msMSSQL2008CloseConnection(layerinfo->conn); msFree(layerinfo); return MS_FAILURE; } msConnPoolRegister(layer, layerinfo->conn, msMSSQL2008CloseConnection); } setMSSQL2008LayerInfo(layer, layerinfo); if (msMSSQL2008LayerParseData( layer, &layerinfo->geom_column, &layerinfo->geom_column_type, &layerinfo->geom_table, &layerinfo->urid_name, &layerinfo->user_srid, &layerinfo->index_name, &layerinfo->sort_spec, layer->debug) != MS_SUCCESS) { msSetError(MS_QUERYERR, "Could not parse the layer data", "msMSSQL2008LayerOpen()"); return MS_FAILURE; } /* identify the geometry transfer type */ if (msLayerGetProcessingKey(layer, "MSSQL_READ_WKB") != NULL) layerinfo->geometry_format = MSSQLGEOMETRY_WKB; else { layerinfo->geometry_format = MSSQLGEOMETRY_NATIVE; if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) layerinfo->gpi.nColType = MSSQLCOLTYPE_GEOGRAPHY; else layerinfo->gpi.nColType = MSSQLCOLTYPE_GEOMETRY; } return MS_SUCCESS; } /* Return MS_TRUE if layer is open, MS_FALSE otherwise. */ int msMSSQL2008LayerIsOpen(layerObj *layer) { return getMSSQL2008LayerInfo(layer) ? MS_TRUE : MS_FALSE; } /* Free the itemindexes array in a layer. */ void msMSSQL2008LayerFreeItemInfo(layerObj *layer) { if (layer->debug) { msDebug("msMSSQL2008LayerFreeItemInfo called\n"); } if (layer->iteminfo) { msFree(layer->iteminfo); } layer->iteminfo = NULL; } /* allocate the iteminfo index array - same order as the item list */ int msMSSQL2008LayerInitItemInfo(layerObj *layer) { int i; int *itemindexes; if (layer->debug) { msDebug("msMSSQL2008LayerInitItemInfo called\n"); } if (layer->numitems == 0) { return MS_SUCCESS; } msFree(layer->iteminfo); layer->iteminfo = (int *)msSmallMalloc(sizeof(int) * layer->numitems); itemindexes = (int *)layer->iteminfo; for (i = 0; i < layer->numitems; i++) { itemindexes[i] = i; /* last one is always the geometry one - the rest are non-geom */ } return MS_SUCCESS; } static int getMSSQLMajorVersion(layerObj *layer) { msMSSQL2008LayerInfo *layerinfo = getMSSQL2008LayerInfo(layer); if (layerinfo == NULL) return 0; if (layerinfo->mssqlversion_major == 0) { const char *mssqlversion_major = msLayerGetProcessingKey(layer, "MSSQL_VERSION_MAJOR"); if (mssqlversion_major != NULL) { layerinfo->mssqlversion_major = atoi(mssqlversion_major); } else { /* need to query from database */ if (executeSQL(layerinfo->conn, "SELECT SERVERPROPERTY('ProductVersion')")) { SQLRETURN rc = SQLFetch(layerinfo->conn->hstmt); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { /* process results */ char result_data[256]; SQLLEN retLen = 0; rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc != SQL_ERROR) { result_data[retLen] = 0; layerinfo->mssqlversion_major = atoi(result_data); } } } } } return layerinfo->mssqlversion_major; } static int addFilter(layerObj *layer, char **query) { if (layer->filter.native_string) { (*query) = msStringConcatenate(*query, " WHERE ("); (*query) = msStringConcatenate(*query, layer->filter.native_string); (*query) = msStringConcatenate(*query, ")"); return MS_TRUE; } else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") != NULL) { (*query) = msStringConcatenate(*query, " WHERE ("); (*query) = msStringConcatenate( *query, msLayerGetProcessingKey(layer, "NATIVE_FILTER")); (*query) = msStringConcatenate(*query, ")"); return MS_TRUE; } return MS_FALSE; } /* Get the layer extent as specified in the mapfile or a largest area */ /* covering all features */ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent) { msMSSQL2008LayerInfo *layerinfo; char *query = 0; char result_data[256]; SQLLEN retLen; SQLRETURN rc; if (layer->debug) { msDebug("msMSSQL2008LayerGetExtent called\n"); } if (!(layer->extent.minx == -1.0 && layer->extent.miny == -1.0 && layer->extent.maxx == -1.0 && layer->extent.maxy == -1.0)) { /* extent was already set */ extent->minx = layer->extent.minx; extent->miny = layer->extent.miny; extent->maxx = layer->extent.maxx; extent->maxy = layer->extent.maxy; } layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { msSetError(MS_QUERYERR, "GetExtent called with layerinfo = NULL", "msMSSQL2008LayerGetExtent()"); return MS_FAILURE; } /* set up statement */ if (getMSSQLMajorVersion(layer) >= 11) { if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) { query = msStringConcatenate( query, "WITH extent(extentcol) AS (SELECT " "geometry::EnvelopeAggregate(geometry::STGeomFromWKB("); query = msStringConcatenate(query, layerinfo->geom_column); query = msStringConcatenate(query, ".STAsBinary(), "); query = msStringConcatenate(query, layerinfo->geom_column); query = msStringConcatenate(query, ".STSrid)"); } else { query = msStringConcatenate( query, "WITH extent(extentcol) AS (SELECT geometry::EnvelopeAggregate("); query = msStringConcatenate(query, layerinfo->geom_column); } query = msStringConcatenate(query, ") AS extentcol FROM "); query = msStringConcatenate(query, layerinfo->geom_table); /* adding attribute filter */ addFilter(layer, &query); query = msStringConcatenate( query, ") SELECT extentcol.STPointN(1).STX, extentcol.STPointN(1).STY, " "extentcol.STPointN(3).STX, extentcol.STPointN(3).STY FROM extent"); } else { if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) { query = msStringConcatenate( query, "WITH ENVELOPE as (SELECT geometry::STGeomFromWKB("); query = msStringConcatenate(query, layerinfo->geom_column); query = msStringConcatenate(query, ".STAsBinary(), "); query = msStringConcatenate(query, layerinfo->geom_column); query = msStringConcatenate(query, ".STSrid)"); } else { query = msStringConcatenate(query, "WITH ENVELOPE as (SELECT "); query = msStringConcatenate(query, layerinfo->geom_column); } query = msStringConcatenate(query, ".STEnvelope() as envelope from "); query = msStringConcatenate(query, layerinfo->geom_table); /* adding attribute filter */ addFilter(layer, &query); query = msStringConcatenate( query, "), CORNERS as (SELECT envelope.STPointN(1) as point from " "ENVELOPE UNION ALL select envelope.STPointN(3) from ENVELOPE) " "SELECT MIN(point.STX), MIN(point.STY), MAX(point.STX), " "MAX(point.STY) FROM CORNERS"); } if (!executeSQL(layerinfo->conn, query)) { msFree(query); return MS_FAILURE; } msFree(query); /* process results */ rc = SQLFetch(layerinfo->conn->hstmt); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { if (layer->debug) { msDebug("msMSSQL2008LayerGetExtent: No results found.\n"); } return MS_FAILURE; } rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc == SQL_ERROR || retLen < 0) { msSetError(MS_QUERYERR, "Failed to get MinX value", "msMSSQL2008LayerGetExtent()"); return MS_FAILURE; } result_data[retLen] = 0; extent->minx = atof(result_data); rc = SQLGetData(layerinfo->conn->hstmt, 2, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc == SQL_ERROR || retLen < 0) { msSetError(MS_QUERYERR, "Failed to get MinY value", "msMSSQL2008LayerGetExtent()"); return MS_FAILURE; } result_data[retLen] = 0; extent->miny = atof(result_data); rc = SQLGetData(layerinfo->conn->hstmt, 3, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc == SQL_ERROR || retLen < 0) { msSetError(MS_QUERYERR, "Failed to get MaxX value", "msMSSQL2008LayerGetExtent()"); return MS_FAILURE; } result_data[retLen] = 0; extent->maxx = atof(result_data); rc = SQLGetData(layerinfo->conn->hstmt, 4, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc == SQL_ERROR || retLen < 0) { msSetError(MS_QUERYERR, "Failed to get MaxY value", "msMSSQL2008LayerGetExtent()"); return MS_FAILURE; } result_data[retLen] = 0; extent->maxy = atof(result_data); return MS_SUCCESS; } /* Get the layer feature count */ int msMSSQL2008LayerGetNumFeatures(layerObj *layer) { msMSSQL2008LayerInfo *layerinfo; char *query = 0; char result_data[256]; SQLLEN retLen; SQLRETURN rc; if (layer->debug) { msDebug("msMSSQL2008LayerGetNumFeatures called\n"); } layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { msSetError(MS_QUERYERR, "GetNumFeatures called with layerinfo = NULL", "msMSSQL2008LayerGetNumFeatures()"); return -1; } /* set up statement */ query = msStringConcatenate(query, "SELECT count(*) FROM "); query = msStringConcatenate(query, layerinfo->geom_table); /* adding attribute filter */ addFilter(layer, &query); if (!executeSQL(layerinfo->conn, query)) { msFree(query); return -1; } msFree(query); rc = SQLFetch(layerinfo->conn->hstmt); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { if (layer->debug) { msDebug("msMSSQL2008LayerGetNumFeatures: No results found.\n"); } return -1; } rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc == SQL_ERROR) { msSetError(MS_QUERYERR, "Failed to get feature count", "msMSSQL2008LayerGetNumFeatures()"); return -1; } result_data[retLen] = 0; return atoi(result_data); } /* Prepare and execute the SQL statement for this layer */ static int prepare_database(layerObj *layer, rectObj rect, char **query_string, int isQuery) { msMSSQL2008LayerInfo *layerinfo; char *query = 0; char *data_source = 0; char *f_table_name = 0; char *geom_table = 0; char *tmp = 0; char *paging_query = 0; /* "Geometry::STGeomFromText('POLYGON(())',)" + terminator = 40 chars Plus 10 formatted doubles (15 digits of precision, a decimal point, a space/comma delimiter each = 17 chars each) Plus SRID + comma - if SRID is a long...we'll be safe with 10 chars or for geography columns "Geography::STGeomFromText('CURVEPOLYGON(())',)" + terminator = 46 chars Plus 18 formatted doubles (15 digits of precision, a decimal point, a space/comma delimiter each = 17 chars each) Plus SRID + comma - if SRID is a long...we'll be safe with 10 chars */ char box3d[46 + 18 * 22 + 11]; int t; char *pos_from, *pos_ftab, *pos_space, *pos_paren; int hasFilter = MS_FALSE; const rectObj rectInvalid = MS_INIT_INVALID_RECT; const int bIsValidRect = memcmp(&rect, &rectInvalid, sizeof(rect)) != 0; layerinfo = getMSSQL2008LayerInfo(layer); /* Extract the proper f_table_name from the geom_table string. * We are expecting the geom_table to be either a single word * or a sub-select clause that possibly includes a join -- * * (select column[,column[,...]] from ftab[ natural join table2]) as foo * * We are expecting whitespace or a ')' after the ftab name. * */ geom_table = msStrdup(layerinfo->geom_table); pos_from = strstrIgnoreCase(geom_table, " from "); if (!pos_from) { f_table_name = (char *)msSmallMalloc(strlen(geom_table) + 1); strcpy(f_table_name, geom_table); } else { /* geom_table is a sub-select clause */ pos_ftab = pos_from + 6; /* This should be the start of the ftab name */ pos_space = strstr(pos_ftab, " "); /* First space */ /* TODO strrchr is POSIX and C99, rindex is neither */ #if defined(_WIN32) && !defined(__CYGWIN__) pos_paren = strrchr(pos_ftab, ')'); #else pos_paren = rindex(pos_ftab, ')'); #endif if (!pos_space || !pos_paren) { msSetError( MS_QUERYERR, DATA_ERROR_MESSAGE, "prepare_database()", geom_table, "Error parsing MSSQL2008 data variable: Something is wrong with your " "subselect statement.

\n\nMore Help:

\n\n"); return MS_FAILURE; } if (pos_paren < pos_space) { /* closing parenthesis precedes any space */ f_table_name = (char *)msSmallMalloc(pos_paren - pos_ftab + 1); strlcpy(f_table_name, pos_ftab, pos_paren - pos_ftab + 1); } else { f_table_name = (char *)msSmallMalloc(pos_space - pos_ftab + 1); strlcpy(f_table_name, pos_ftab, pos_space - pos_ftab + 1); } } if (rect.minx == rect.maxx || rect.miny == rect.maxy) { /* create point shape for rectangles with zero area */ sprintf(box3d, "%s::STGeomFromText('POINT(%.15g %.15g)',%s)", /* %s.STSrid)", */ layerinfo->geom_column_type, rect.minx, rect.miny, layerinfo->user_srid); } else if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) { /* SQL Server has a problem when x is -180 or 180 */ double minx = rect.minx <= -180 ? -179.999 : rect.minx; double maxx = rect.maxx >= 180 ? 179.999 : rect.maxx; double miny = rect.miny < -90 ? -90 : rect.miny; double maxy = rect.maxy > 90 ? 90 : rect.maxy; sprintf(box3d, "Geography::STGeomFromText('CURVEPOLYGON((%.15g %.15g,%.15g " "%.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g " "%.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */ minx, miny, minx + (maxx - minx) / 2, miny, maxx, miny, maxx, miny + (maxy - miny) / 2, maxx, maxy, minx + (maxx - minx) / 2, maxy, minx, maxy, minx, miny + (maxy - miny) / 2, minx, miny, layerinfo->user_srid); } else { sprintf(box3d, "Geometry::STGeomFromText('POLYGON((%.15g %.15g,%.15g %.15g,%.15g " "%.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */ rect.minx, rect.miny, rect.maxx, rect.miny, rect.maxx, rect.maxy, rect.minx, rect.maxy, rect.minx, rect.miny, layerinfo->user_srid); } /* substitute token '!BOX!' in geom_table with the box3d - do an unlimited # * of subs */ /* to not undo the work here, we need to make sure that data_source is * malloc'd here */ if (!strstr(geom_table, "!BOX!")) { data_source = (char *)msSmallMalloc(strlen(geom_table) + 1); strcpy(data_source, geom_table); } else { char *result = NULL; while (strstr(geom_table, "!BOX!")) { /* need to do a substitution */ char *start, *end; char *oldresult = result; start = strstr(geom_table, "!BOX!"); end = start + 5; result = (char *)msSmallMalloc((start - geom_table) + strlen(box3d) + strlen(end) + 1); strlcpy(result, geom_table, start - geom_table + 1); strcpy(result + (start - geom_table), box3d); strcat(result, end); geom_table = result; msFree(oldresult); } /* if we're here, this will be a malloc'd string, so no need to copy it */ data_source = (char *)geom_table; } /* start creating the query */ query = msStringConcatenate(query, "SELECT "); if (layerinfo->paging && (layer->maxfeatures >= 0 || layer->startindex > 0)) paging_query = msStringConcatenate(paging_query, "SELECT "); /* adding items to the select list */ for (t = 0; t < layer->numitems; t++) { #if defined(_WIN32) && defined(USE_ICONV) query = msStringConcatenate(query, "convert(nvarchar(max), ["); #else query = msStringConcatenate(query, "convert(varchar(max), ["); #endif query = msStringConcatenate(query, layer->items[t]); query = msStringConcatenate(query, "]) '"); tmp = msIntToString(t); query = msStringConcatenate(query, tmp); if (paging_query) { paging_query = msStringConcatenate(paging_query, "["); paging_query = msStringConcatenate(paging_query, tmp); paging_query = msStringConcatenate(paging_query, "], "); } msFree(tmp); query = msStringConcatenate(query, "',"); } /* adding geometry column */ query = msStringConcatenate(query, "["); query = msStringConcatenate(query, layerinfo->geom_column); if (layerinfo->geometry_format == MSSQLGEOMETRY_NATIVE) query = msStringConcatenate(query, "] 'geom',"); else { query = msStringConcatenate(query, "].STAsBinary() 'geom',"); } /* adding id column */ query = msStringConcatenate(query, "convert(varchar(36), ["); query = msStringConcatenate(query, layerinfo->urid_name); if (paging_query) { paging_query = msStringConcatenate(paging_query, "[geom], [id] FROM ("); query = msStringConcatenate(query, "]) 'id', row_number() over ("); if (layerinfo->sort_spec) { query = msStringConcatenate(query, layerinfo->sort_spec); } if (layer->sortBy.nProperties > 0) { tmp = msLayerBuildSQLOrderBy(layer); if (layerinfo->sort_spec) { query = msStringConcatenate(query, ", "); } else { query = msStringConcatenate(query, " ORDER BY "); } query = msStringConcatenate(query, tmp); msFree(tmp); } else { if (!layerinfo->sort_spec) { // use the unique Id as the default sort for paging query = msStringConcatenate(query, "ORDER BY "); query = msStringConcatenate(query, layerinfo->urid_name); } } query = msStringConcatenate(query, ") 'rownum' FROM "); } else { query = msStringConcatenate(query, "]) 'id' FROM "); } /* adding the source */ query = msStringConcatenate(query, data_source); msFree(data_source); msFree(f_table_name); /* use the index hint if provided */ if (layerinfo->index_name) { query = msStringConcatenate(query, " WITH (INDEX("); query = msStringConcatenate(query, layerinfo->index_name); query = msStringConcatenate(query, "))"); } /* adding attribute filter */ hasFilter = addFilter(layer, &query); if (bIsValidRect) { /* adding spatial filter */ if (hasFilter == MS_FALSE) query = msStringConcatenate(query, " WHERE "); else query = msStringConcatenate(query, " AND "); query = msStringConcatenate(query, layerinfo->geom_column); query = msStringConcatenate(query, ".STIntersects("); query = msStringConcatenate(query, box3d); query = msStringConcatenate(query, ") = 1 "); } if (paging_query) { paging_query = msStringConcatenate(paging_query, query); paging_query = msStringConcatenate(paging_query, ") tbl where [rownum] "); if (layer->startindex > 0) { tmp = msIntToString(layer->startindex); paging_query = msStringConcatenate(paging_query, ">= "); paging_query = msStringConcatenate(paging_query, tmp); if (layer->maxfeatures >= 0) { msFree(tmp); tmp = msIntToString(layer->startindex + layer->maxfeatures); paging_query = msStringConcatenate(paging_query, " and [rownum] < "); paging_query = msStringConcatenate(paging_query, tmp); } } else { tmp = msIntToString(layer->maxfeatures); paging_query = msStringConcatenate(paging_query, "< "); paging_query = msStringConcatenate(paging_query, tmp); } msFree(tmp); msFree(query); query = paging_query; } else { if (layerinfo->sort_spec) { query = msStringConcatenate(query, layerinfo->sort_spec); } /* Add extra sort by */ if (layer->sortBy.nProperties > 0) { char *pszTmp = msLayerBuildSQLOrderBy(layer); if (layerinfo->sort_spec) query = msStringConcatenate(query, ", "); else query = msStringConcatenate(query, " ORDER BY "); query = msStringConcatenate(query, pszTmp); msFree(pszTmp); } else if (isQuery && !layerinfo->sort_spec) { /* Add orderby to make the result set order deterministic */ query = msStringConcatenate(query, " ORDER BY ["); query = msStringConcatenate(query, layerinfo->urid_name); query = msStringConcatenate(query, "]"); } } if (layer->debug) { msDebug("query:%s\n", query); } if (executeSQL(layerinfo->conn, query)) { char pass_field_def = 0; int t; const char *value; *query_string = query; /* collect result information */ if ((value = msOWSLookupMetadata(&(layer->metadata), "G", "types")) != NULL && strcasecmp(value, "auto") == 0) pass_field_def = 1; msFree(layerinfo->itemtypes); layerinfo->itemtypes = msSmallMalloc(sizeof(SQLSMALLINT) * (layer->numitems + 1)); for (t = 0; t < layer->numitems; t++) { char colBuff[256]; SQLSMALLINT itemType = 0; columnName(layerinfo->conn, t + 1, colBuff, sizeof(colBuff), layer, pass_field_def, &itemType); layerinfo->itemtypes[t] = itemType; } return MS_SUCCESS; } else { msSetError( MS_QUERYERR, "Error executing MSSQL2008 SQL statement: %s\n-%s\n", "msMSSQL2008LayerGetShape()", query, layerinfo->conn->errorMessage); msFree(query); return MS_FAILURE; } } /* Execute SQL query for this layer */ int msMSSQL2008LayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { (void)isQuery; msMSSQL2008LayerInfo *layerinfo = 0; char *query_str = 0; int set_up_result; if (layer->debug) { msDebug("msMSSQL2008LayerWhichShapes called\n"); } layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { /* layer not opened yet */ msSetError(MS_QUERYERR, "msMSSQL2008LayerWhichShapes called on unopened layer " "(layerinfo = NULL)", "msMSSQL2008LayerWhichShapes()"); return MS_FAILURE; } if (!layer->data) { msSetError(MS_QUERYERR, "Missing DATA clause in MSSQL2008 Layer definition. DATA " "statement must contain 'geometry_column from table_name' or " "'geometry_column from (sub-query) as foo'.", "msMSSQL2008LayerWhichShapes()"); return MS_FAILURE; } set_up_result = prepare_database(layer, rect, &query_str, isQuery); if (set_up_result != MS_SUCCESS) { msFree(query_str); return set_up_result; /* relay error */ } msFree(layerinfo->sql); layerinfo->sql = query_str; layerinfo->row_num = 0; return MS_SUCCESS; } /* Close the MSSQL2008 record set and connection */ int msMSSQL2008LayerClose(layerObj *layer) { msMSSQL2008LayerInfo *layerinfo; layerinfo = getMSSQL2008LayerInfo(layer); if (layer->debug) { char *data = ""; if (layer->data) { data = layer->data; } msDebug("msMSSQL2008LayerClose datastatement: %s\n", data); } if (layer->debug && !layerinfo) { msDebug("msMSSQL2008LayerClose -- layerinfo is NULL\n"); } if (layerinfo) { msConnPoolRelease(layer, layerinfo->conn); layerinfo->conn = NULL; if (layerinfo->user_srid) { msFree(layerinfo->user_srid); layerinfo->user_srid = NULL; } if (layerinfo->urid_name) { msFree(layerinfo->urid_name); layerinfo->urid_name = NULL; } if (layerinfo->index_name) { msFree(layerinfo->index_name); layerinfo->index_name = NULL; } if (layerinfo->sort_spec) { msFree(layerinfo->sort_spec); layerinfo->sort_spec = NULL; } if (layerinfo->sql) { msFree(layerinfo->sql); layerinfo->sql = NULL; } if (layerinfo->geom_column) { msFree(layerinfo->geom_column); layerinfo->geom_column = NULL; } if (layerinfo->geom_column_type) { msFree(layerinfo->geom_column_type); layerinfo->geom_column_type = NULL; } if (layerinfo->geom_table) { msFree(layerinfo->geom_table); layerinfo->geom_table = NULL; } if (layerinfo->itemtypes) { msFree(layerinfo->itemtypes); layerinfo->itemtypes = NULL; } setMSSQL2008LayerInfo(layer, NULL); msFree(layerinfo); } return MS_SUCCESS; } /* ******************************************************* */ /* wkb is assumed to be 2d (force_2d) */ /* and wkb is a GEOMETRYCOLLECTION (force_collection) */ /* and wkb is in the endian of this computer (asbinary(...,'[XN]DR')) */ /* each of the sub-geom inside the collection are point,linestring, or polygon */ /* */ /* also, int is 32bits long */ /* double is 64bits long */ /* ******************************************************* */ /* convert the wkb into points */ /* points -> pass through */ /* lines-> constituent points */ /* polys-> treat ring like line and pull out the constituent points */ static int force_to_points(char *wkb, shapeObj *shape) { /* we're going to make a 'line' for each entity (point, line or ring) in the * geom collection */ int offset = 0; int ngeoms; int t, u, v; int type, nrings, npoints; lineObj line = {0, NULL}; shape->type = MS_SHAPE_NULL; /* nothing in it */ memcpy(&ngeoms, &wkb[5], 4); offset = 9; /* were the first geometry is */ for (t = 0; t < ngeoms; t++) { memcpy(&type, &wkb[offset + 1], 4); /* type of this geometry */ if (type == 1) { /* Point */ shape->type = MS_SHAPE_POINT; line.numpoints = 1; line.point = (pointObj *)msSmallMalloc(sizeof(pointObj)); memcpy(&line.point[0].x, &wkb[offset + 5], 8); memcpy(&line.point[0].y, &wkb[offset + 5 + 8], 8); offset += 5 + 16; msAddLine(shape, &line); msFree(line.point); } else if (type == 2) { /* Linestring */ shape->type = MS_SHAPE_POINT; memcpy(&line.numpoints, &wkb[offset + 5], 4); /* num points */ line.point = (pointObj *)msSmallMalloc(sizeof(pointObj) * line.numpoints); for (u = 0; u < line.numpoints; u++) { memcpy(&line.point[u].x, &wkb[offset + 9 + (16 * u)], 8); memcpy(&line.point[u].y, &wkb[offset + 9 + (16 * u) + 8], 8); } offset += 9 + 16 * line.numpoints; /* length of object */ msAddLine(shape, &line); msFree(line.point); } else if (type == 3) { /* Polygon */ shape->type = MS_SHAPE_POINT; memcpy(&nrings, &wkb[offset + 5], 4); /* num rings */ /* add a line for each polygon ring */ offset += 9; /* now points at 1st linear ring */ for (u = 0; u < nrings; u++) { /* for each ring, make a line */ memcpy(&npoints, &wkb[offset], 4); /* num points */ line.numpoints = npoints; line.point = (pointObj *)msSmallMalloc(sizeof(pointObj) * npoints); /* point struct */ for (v = 0; v < npoints; v++) { memcpy(&line.point[v].x, &wkb[offset + 4 + (16 * v)], 8); memcpy(&line.point[v].y, &wkb[offset + 4 + (16 * v) + 8], 8); } /* make offset point to next linear ring */ msAddLine(shape, &line); msFree(line.point); offset += 4 + 16 * npoints; } } } return MS_SUCCESS; } /* convert the wkb into lines */ /* points-> remove */ /* lines -> pass through */ /* polys -> treat rings as lines */ static int force_to_lines(char *wkb, shapeObj *shape) { int offset = 0; int ngeoms; int t, u, v; int type, nrings, npoints; lineObj line = {0, NULL}; shape->type = MS_SHAPE_NULL; /* nothing in it */ memcpy(&ngeoms, &wkb[5], 4); offset = 9; /* were the first geometry is */ for (t = 0; t < ngeoms; t++) { memcpy(&type, &wkb[offset + 1], 4); /* type of this geometry */ /* cannot do anything with a point */ if (type == 2) { /* Linestring */ shape->type = MS_SHAPE_LINE; memcpy(&line.numpoints, &wkb[offset + 5], 4); line.point = (pointObj *)msSmallMalloc(sizeof(pointObj) * line.numpoints); for (u = 0; u < line.numpoints; u++) { memcpy(&line.point[u].x, &wkb[offset + 9 + (16 * u)], 8); memcpy(&line.point[u].y, &wkb[offset + 9 + (16 * u) + 8], 8); } offset += 9 + 16 * line.numpoints; /* length of object */ msAddLine(shape, &line); msFree(line.point); } else if (type == 3) { /* polygon */ shape->type = MS_SHAPE_LINE; memcpy(&nrings, &wkb[offset + 5], 4); /* num rings */ /* add a line for each polygon ring */ offset += 9; /* now points at 1st linear ring */ for (u = 0; u < nrings; u++) { /* for each ring, make a line */ memcpy(&npoints, &wkb[offset], 4); line.numpoints = npoints; line.point = (pointObj *)msSmallMalloc(sizeof(pointObj) * npoints); /* point struct */ for (v = 0; v < npoints; v++) { memcpy(&line.point[v].x, &wkb[offset + 4 + (16 * v)], 8); memcpy(&line.point[v].y, &wkb[offset + 4 + (16 * v) + 8], 8); } /* make offset point to next linear ring */ msAddLine(shape, &line); msFree(line.point); offset += 4 + 16 * npoints; } } } return MS_SUCCESS; } /* point -> reject */ /* line -> reject */ /* polygon -> lines of linear rings */ static int force_to_polygons(char *wkb, shapeObj *shape) { int offset = 0; int ngeoms; int t, u, v; int type, nrings, npoints; lineObj line = {0, NULL}; shape->type = MS_SHAPE_NULL; /* nothing in it */ memcpy(&ngeoms, &wkb[5], 4); offset = 9; /* were the first geometry is */ for (t = 0; t < ngeoms; t++) { memcpy(&type, &wkb[offset + 1], 4); /* type of this geometry */ if (type == 3) { /* polygon */ shape->type = MS_SHAPE_POLYGON; memcpy(&nrings, &wkb[offset + 5], 4); /* num rings */ /* add a line for each polygon ring */ offset += 9; /* now points at 1st linear ring */ for (u = 0; u < nrings; u++) { /* for each ring, make a line */ memcpy(&npoints, &wkb[offset], 4); /* num points */ line.numpoints = npoints; line.point = (pointObj *)msSmallMalloc(sizeof(pointObj) * npoints); for (v = 0; v < npoints; v++) { memcpy(&line.point[v].x, &wkb[offset + 4 + (16 * v)], 8); memcpy(&line.point[v].y, &wkb[offset + 4 + (16 * v) + 8], 8); } /* make offset point to next linear ring */ msAddLine(shape, &line); msFree(line.point); offset += 4 + 16 * npoints; } } } return MS_SUCCESS; } /* if there is any polygon in wkb, return force_polygon */ /* if there is any line in wkb, return force_line */ /* otherwise return force_point */ static int dont_force(char *wkb, shapeObj *shape) { int offset = 0; int ngeoms; int type, t; int best_type; best_type = MS_SHAPE_NULL; /* nothing in it */ memcpy(&ngeoms, &wkb[5], 4); offset = 9; /* were the first geometry is */ for (t = 0; t < ngeoms; t++) { memcpy(&type, &wkb[offset + 1], 4); /* type of this geometry */ if (type == 3) { best_type = MS_SHAPE_POLYGON; } else if (type == 2 && best_type != MS_SHAPE_POLYGON) { best_type = MS_SHAPE_LINE; } else if (type == 1 && best_type == MS_SHAPE_NULL) { best_type = MS_SHAPE_POINT; } } if (best_type == MS_SHAPE_POINT) { return force_to_points(wkb, shape); } if (best_type == MS_SHAPE_LINE) { return force_to_lines(wkb, shape); } if (best_type == MS_SHAPE_POLYGON) { return force_to_polygons(wkb, shape); } return MS_FAILURE; /* unknown type */ } #if 0 /* ******************************************************* */ /* wkb assumed to be same endian as this machine. */ /* Should be in little endian (default if created by Microsoft platforms) */ /* ******************************************************* */ /* convert the wkb into points */ /* points -> pass through */ /* lines-> constituent points */ /* polys-> treat ring like line and pull out the constituent points */ static int force_to_shapeType(char *wkb, shapeObj *shape, int msShapeType) { int offset = 0; int ngeoms = 1; int u, v; int type, nrings, npoints; lineObj line = {0, NULL}; shape->type = MS_SHAPE_NULL; /* nothing in it */ do { ngeoms--; memcpy(&type, &wkb[offset + 1], 4); /* type of this geometry */ if (type == 1) { /* Point */ shape->type = msShapeType; line.numpoints = 1; line.point = (pointObj *) msSmallMalloc(sizeof(pointObj)); memcpy(&line.point[0].x, &wkb[offset + 5], 8); memcpy(&line.point[0].y, &wkb[offset + 5 + 8], 8); offset += 5 + 16; if (msShapeType == MS_SHAPE_POINT) { msAddLine(shape, &line); } msFree(line.point); } else if(type == 2) { /* Linestring */ shape->type = msShapeType; memcpy(&line.numpoints, &wkb[offset+5], 4); /* num points */ line.point = (pointObj *) msSmallMalloc(sizeof(pointObj) * line.numpoints); for(u = 0; u < line.numpoints; u++) { memcpy( &line.point[u].x, &wkb[offset+9 + (16 * u)], 8); memcpy( &line.point[u].y, &wkb[offset+9 + (16 * u)+8], 8); } offset += 9 + 16 * line.numpoints; /* length of object */ if ((msShapeType == MS_SHAPE_POINT) || (msShapeType == MS_SHAPE_LINE)) { msAddLine(shape, &line); } msFree(line.point); } else if(type == 3) { /* Polygon */ shape->type = msShapeType; memcpy(&nrings, &wkb[offset+5],4); /* num rings */ /* add a line for each polygon ring */ offset += 9; /* now points at 1st linear ring */ for(u = 0; u < nrings; u++) { /* for each ring, make a line */ memcpy(&npoints, &wkb[offset], 4); /* num points */ line.numpoints = npoints; line.point = (pointObj *) msSmallMalloc(sizeof(pointObj)* npoints); /* point struct */ for(v = 0; v < npoints; v++) { memcpy(&line.point[v].x, &wkb[offset + 4 + (16 * v)], 8); memcpy(&line.point[v].y, &wkb[offset + 4 + (16 * v) + 8], 8); } /* make offset point to next linear ring */ msAddLine(shape, &line); msFree(line.point); offset += 4 + 16 *npoints; } } else if(type >= 4 && type <= 7) { int cnt = 0; offset += 5; memcpy(&cnt, &wkb[offset], 4); offset += 4; /* were the first geometry is */ ngeoms += cnt; } } while (ngeoms > 0); return MS_SUCCESS; } #endif ///* if there is any polygon in wkb, return force_polygon */ ///* if there is any line in wkb, return force_line */ ///* otherwise return force_point */ // static int dont_force(char *wkb, shapeObj *shape) //{ // int offset =0; // int ngeoms = 1; // int type; // int best_type; // int u; // int nrings, npoints; // // best_type = MS_SHAPE_NULL; /* nothing in it */ // // do // { // ngeoms--; // // memcpy(&type, &wkb[offset + 1], 4); /* type of this geometry */ // // if(type == 3) { // best_type = MS_SHAPE_POLYGON; // } else if(type ==2 && best_type != MS_SHAPE_POLYGON) { // best_type = MS_SHAPE_LINE; // } else if(type == 1 && best_type == MS_SHAPE_NULL) { // best_type = MS_SHAPE_POINT; // } // // if (type == 1) // { // /* Point */ // offset += 5 + 16; // } // else if(type == 2) // { // int numPoints; // // memcpy(&numPoints, &wkb[offset+5], 4); /* num points */ // /* Linestring */ // offset += 9 + 16 * numPoints; /* length of object */ // } // else if(type == 3) // { // /* Polygon */ // memcpy(&nrings, &wkb[offset+5],4); /* num rings */ // offset += 9; /* now points at 1st linear ring */ // for(u = 0; u < nrings; u++) { // /* for each ring, make a line */ // memcpy(&npoints, &wkb[offset], 4); /* num points */ // offset += 4 + 16 *npoints; // } // } // else if(type >= 4 && type <= 7) // { // int cnt = 0; // // offset += 5; // // memcpy(&cnt, &wkb[offset], 4); // offset += 4; /* were the first geometry is */ // // ngeoms += cnt; // } // } // while (ngeoms > 0); // // return force_to_shapeType(wkb, shape, best_type); // } // /* find the bounds of the shape */ static void find_bounds(shapeObj *shape) { int t, u; int first_one = 1; for (t = 0; t < shape->numlines; t++) { for (u = 0; u < shape->line[t].numpoints; u++) { if (first_one) { shape->bounds.minx = shape->line[t].point[u].x; shape->bounds.maxx = shape->line[t].point[u].x; shape->bounds.miny = shape->line[t].point[u].y; shape->bounds.maxy = shape->line[t].point[u].y; first_one = 0; } else { if (shape->line[t].point[u].x < shape->bounds.minx) { shape->bounds.minx = shape->line[t].point[u].x; } if (shape->line[t].point[u].x > shape->bounds.maxx) { shape->bounds.maxx = shape->line[t].point[u].x; } if (shape->line[t].point[u].y < shape->bounds.miny) { shape->bounds.miny = shape->line[t].point[u].y; } if (shape->line[t].point[u].y > shape->bounds.maxy) { shape->bounds.maxy = shape->line[t].point[u].y; } } } } } /* Used by NextShape() to access a shape in the query set */ int msMSSQL2008LayerGetShapeRandom(layerObj *layer, shapeObj *shape, long *record) { msMSSQL2008LayerInfo *layerinfo; SQLLEN needLen = 0; SQLLEN retLen = 0; char dummyBuffer[1]; char *wkbBuffer; char *valueBuffer; char oidBuffer[16]; /* assuming the OID will always be a long this should be enough */ long record_oid; int t; /* for coercing single types into geometry collections */ char *wkbTemp; int geomType; layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { msSetError(MS_QUERYERR, "GetShape called with layerinfo = NULL", "msMSSQL2008LayerGetShape()"); return MS_FAILURE; } if (!layerinfo->conn) { msSetError(MS_QUERYERR, "NextShape called on MSSQL2008 layer with no connection to DB.", "msMSSQL2008LayerGetShape()"); return MS_FAILURE; } shape->type = MS_SHAPE_NULL; while (shape->type == MS_SHAPE_NULL) { /* SQLRETURN rc = SQLFetchScroll(layerinfo->conn->hstmt, SQL_FETCH_ABSOLUTE, * (SQLLEN) (*record) + 1); */ /* We only do forward fetches. the parameter 'record' is ignored, but is * incremented */ SQLRETURN rc = SQLFetch(layerinfo->conn->hstmt); /* Any error assume out of recordset bounds */ if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { handleSQLError(layer); return MS_DONE; } /* retrieve an item */ { /* have to retrieve shape attributes */ shape->values = (char **)msSmallMalloc(sizeof(char *) * layer->numitems); shape->numvalues = layer->numitems; for (t = 0; t < layer->numitems; t++) { /* Startwith a 64 character long buffer. This may need to be increased * after calling SQLGetData. */ SQLLEN emptyLen = 64; valueBuffer = (char *)msSmallMalloc(emptyLen); if (valueBuffer == NULL) { msSetError(MS_QUERYERR, "Could not allocate value buffer.", "msMSSQL2008LayerGetShapeRandom()"); return MS_FAILURE; } #if defined(_WIN32) && defined(USE_ICONV) SQLSMALLINT targetType = SQL_WCHAR; #else SQLSMALLINT targetType = SQL_CHAR; #endif SQLLEN totalLen = 0; char *bufferLocation = valueBuffer; int r = 0; while (r < 20) { rc = SQLGetData(layerinfo->conn->hstmt, (SQLUSMALLINT)(t + 1), targetType, bufferLocation, emptyLen, &retLen); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) totalLen += retLen > emptyLen || retLen == SQL_NO_TOTAL ? emptyLen : retLen; if (rc == SQL_SUCCESS_WITH_INFO && rc != SQL_NO_DATA) { /* We must compensate for the last null termination that SQLGetData * include */ /* If we get SQL_NO_TOTAL we do not know how big buffer we need so * we increase it with 512. */ #if defined(_WIN32) && defined(USE_ICONV) totalLen -= sizeof(wchar_t); emptyLen = retLen != SQL_NO_TOTAL ? retLen - emptyLen + 2 * sizeof(wchar_t) : 512; #else totalLen -= sizeof(char); emptyLen = retLen != SQL_NO_TOTAL ? retLen - emptyLen + 2 * sizeof(char) : 512; #endif valueBuffer = (char *)msSmallRealloc(valueBuffer, totalLen + emptyLen); bufferLocation = valueBuffer + totalLen; } else break; r++; } if (rc == SQL_ERROR) handleSQLError(layer); if (totalLen > 0) { /* Pop the value into the shape's value array */ #if defined(_WIN32) && defined(USE_ICONV) shape->values[t] = msConvertWideStringToUTF8((wchar_t *)valueBuffer, "UCS-2LE"); msFree(valueBuffer); #else shape->values[t] = valueBuffer; #endif } else { /* Copy empty sting for NULL values */ shape->values[t] = msStrdup(""); msFree(valueBuffer); } } /* Get shape geometry */ { /* Set up to request the size of the buffer needed */ rc = SQLGetData(layerinfo->conn->hstmt, (SQLUSMALLINT)(layer->numitems + 1), SQL_C_BINARY, dummyBuffer, 0, &needLen); if (rc == SQL_ERROR) handleSQLError(layer); /* allow space for coercion to geometry collection if needed*/ wkbTemp = (char *)msSmallMalloc(needLen + 9); /* write data above space allocated for geometry collection coercion */ wkbBuffer = wkbTemp + 9; if (wkbBuffer == NULL) { msSetError(MS_QUERYERR, "Could not allocate value buffer.", "msMSSQL2008LayerGetShapeRandom()"); return MS_FAILURE; } /* Grab the WKB */ rc = SQLGetData(layerinfo->conn->hstmt, (SQLUSMALLINT)(layer->numitems + 1), SQL_C_BINARY, wkbBuffer, needLen, &retLen); if (rc == SQL_ERROR || rc == SQL_SUCCESS_WITH_INFO) handleSQLError(layer); if (layerinfo->geometry_format == MSSQLGEOMETRY_NATIVE) { layerinfo->gpi.pszData = (unsigned char *)wkbBuffer; layerinfo->gpi.nLen = (int)retLen; if (!ParseSqlGeometry(layerinfo, shape)) { switch (layer->type) { case MS_LAYER_POINT: shape->type = MS_SHAPE_POINT; break; case MS_LAYER_LINE: shape->type = MS_SHAPE_LINE; break; case MS_LAYER_POLYGON: shape->type = MS_SHAPE_POLYGON; break; default: break; } } } else { memcpy(&geomType, wkbBuffer + 1, 4); /* is this a single type? */ if (geomType < 4) { /* copy byte order marker (although we don't check it) */ wkbTemp[0] = wkbBuffer[0]; wkbBuffer = wkbTemp; /* indicate type is geometry collection (although geomType + 3 would * also work) */ wkbBuffer[1] = (char)7; wkbBuffer[2] = (char)0; wkbBuffer[3] = (char)0; wkbBuffer[4] = (char)0; /* indicate 1 shape */ wkbBuffer[5] = (char)1; wkbBuffer[6] = (char)0; wkbBuffer[7] = (char)0; wkbBuffer[8] = (char)0; } switch (layer->type) { case MS_LAYER_POINT: /*result =*/force_to_points(wkbBuffer, shape); break; case MS_LAYER_LINE: /*result =*/force_to_lines(wkbBuffer, shape); break; case MS_LAYER_POLYGON: /*result =*/force_to_polygons(wkbBuffer, shape); break; case MS_LAYER_QUERY: case MS_LAYER_CHART: /*result =*/dont_force(wkbBuffer, shape); break; case MS_LAYER_RASTER: msDebug("Ignoring MS_LAYER_RASTER in mapMSSQL2008.c\n"); break; case MS_LAYER_CIRCLE: msDebug("Ignoring MS_LAYER_CIRCLE in mapMSSQL2008.c\n"); break; default: msDebug("Unsupported layer type in msMSSQL2008LayerNextShape()!"); break; } find_bounds(shape); } // free(wkbBuffer); msFree(wkbTemp); } /* Next get unique id for row - since the OID shouldn't be larger than a * long we'll assume billions as a limit */ rc = SQLGetData(layerinfo->conn->hstmt, (SQLUSMALLINT)(layer->numitems + 2), SQL_C_BINARY, oidBuffer, sizeof(oidBuffer) - 1, &retLen); if (rc == SQL_ERROR || rc == SQL_SUCCESS_WITH_INFO) handleSQLError(layer); if (retLen > 0 && retLen < (int)sizeof(oidBuffer)) { oidBuffer[retLen] = 0; record_oid = strtol(oidBuffer, NULL, 10); shape->index = record_oid; } else { /* non integer fid column, use single pass */ shape->index = -1; } shape->resultindex = (*record); (*record)++; /* move to next shape */ if (shape->type != MS_SHAPE_NULL) { return MS_SUCCESS; } else { msDebug("msMSSQL2008LayerGetShapeRandom bad shape: %ld\n", *record); } /* if (layer->type == MS_LAYER_POINT) {return MS_DONE;} */ } } msFreeShape(shape); return MS_FAILURE; } /* find the next shape with the appropriate shape type (convert it if necessary) */ /* also, load in the attribute data */ /* MS_DONE => no more data */ int msMSSQL2008LayerNextShape(layerObj *layer, shapeObj *shape) { int result; msMSSQL2008LayerInfo *layerinfo; layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { msSetError(MS_QUERYERR, "NextShape called with layerinfo = NULL", "msMSSQL2008LayerNextShape()"); return MS_FAILURE; } result = msMSSQL2008LayerGetShapeRandom(layer, shape, &(layerinfo->row_num)); /* getshaperandom will increment the row_num */ /* layerinfo->row_num ++; */ return result; } /* Execute a query on the DB based on the query result. */ int msMSSQL2008LayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record) { char *query_str; char *columns_wanted = 0; msMSSQL2008LayerInfo *layerinfo; int t; char buffer[32000] = ""; long shapeindex = record->shapeindex; long resultindex = record->resultindex; if (layer->debug) { msDebug("msMSSQL2008LayerGetShape called for shapeindex = %ld\n", shapeindex); } layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { /* Layer not open */ msSetError( MS_QUERYERR, "msMSSQL2008LayerGetShape called on unopened layer (layerinfo = NULL)", "msMSSQL2008LayerGetShape()"); return MS_FAILURE; } if (resultindex >= 0 && layerinfo->sql) { /* trying to provide the result from the current resultset (single-pass * query) */ if (resultindex < layerinfo->row_num) { /* re-issue the query */ if (!executeSQL(layerinfo->conn, layerinfo->sql)) { msSetError(MS_QUERYERR, "Error executing MSSQL2008 SQL statement: %s\n-%s\n", "msMSSQL2008LayerGetShape()", layerinfo->sql, layerinfo->conn->errorMessage); return MS_FAILURE; } layerinfo->row_num = 0; } while (layerinfo->row_num < resultindex) { /* move forward until we reach the desired index */ if (msMSSQL2008LayerGetShapeRandom(layer, shape, &(layerinfo->row_num)) != MS_SUCCESS) return MS_FAILURE; } return msMSSQL2008LayerGetShapeRandom(layer, shape, &(layerinfo->row_num)); } /* non single-pass case, fetch the record from the database */ if (layer->numitems == 0) { if (layerinfo->geometry_format == MSSQLGEOMETRY_NATIVE) snprintf(buffer, sizeof(buffer), "%s, convert(varchar(36), %s)", layerinfo->geom_column, layerinfo->urid_name); else snprintf(buffer, sizeof(buffer), "%s.STAsBinary(), convert(varchar(36), %s)", layerinfo->geom_column, layerinfo->urid_name); columns_wanted = msStrdup(buffer); } else { for (t = 0; t < layer->numitems; t++) { snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "convert(varchar(max), %s),", layer->items[t]); } if (layerinfo->geometry_format == MSSQLGEOMETRY_NATIVE) snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "%s, convert(varchar(36), %s)", layerinfo->geom_column, layerinfo->urid_name); else snprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer), "%s.STAsBinary(), convert(varchar(36), %s)", layerinfo->geom_column, layerinfo->urid_name); columns_wanted = msStrdup(buffer); } /* index_name is ignored here since the hint should be for the spatial index, * not the PK index */ snprintf(buffer, sizeof(buffer), "select %s from %s where %s = %ld", columns_wanted, layerinfo->geom_table, layerinfo->urid_name, shapeindex); query_str = msStrdup(buffer); if (layer->debug) { msDebug("msMSSQL2008LayerGetShape: %s \n", query_str); } msFree(columns_wanted); if (!executeSQL(layerinfo->conn, query_str)) { msSetError( MS_QUERYERR, "Error executing MSSQL2008 SQL statement: %s\n-%s\n", "msMSSQL2008LayerGetShape()", query_str, layerinfo->conn->errorMessage); msFree(query_str); return MS_FAILURE; } /* we don't preserve the query string in this case (cannot be re-used) */ msFree(query_str); layerinfo->row_num = 0; return msMSSQL2008LayerGetShapeRandom(layer, shape, &(layerinfo->row_num)); } /* ** Returns the number of shapes that match the potential filter and extent. * rectProjection is the projection in which rect is expressed, or can be NULL if * rect should be considered in the layer projection. * This should be equivalent to calling msLayerWhichShapes() and counting the * number of shapes returned by msLayerNextShape(), honouring layer->maxfeatures * limitation if layer->maxfeatures>=0, and honouring layer->startindex if * layer->startindex >= 1 and paging is enabled. * Returns -1 in case of failure. */ int msMSSQL2008LayerGetShapeCount(layerObj *layer, rectObj rect, projectionObj *rectProjection) { msMSSQL2008LayerInfo *layerinfo; char *query = 0; char result_data[256]; char box3d[40 + 10 * 22 + 11]; SQLLEN retLen; SQLRETURN rc; int hasFilter = MS_FALSE; const rectObj rectInvalid = MS_INIT_INVALID_RECT; const int bIsValidRect = memcmp(&rect, &rectInvalid, sizeof(rect)) != 0; rectObj searchrectInLayerProj = rect; if (layer->debug) { msDebug("msMSSQL2008LayerGetShapeCount called.\n"); } layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { /* Layer not open */ msSetError(MS_QUERYERR, "msMSSQL2008LayerGetShapeCount called on unopened layer " "(layerinfo = NULL)", "msMSSQL2008LayerGetShapeCount()"); return MS_FAILURE; } // Special processing if the specified projection for the rect is different // from the layer projection We want to issue a WHERE that includes // ((the_geom && rect_reprojected_in_layer_SRID) AND NOT // ST_Disjoint(ST_Transform(the_geom, rect_SRID), rect)) if (rectProjection != NULL && layer->project && msProjectionsDiffer(&(layer->projection), rectProjection)) { // If we cannot guess the EPSG code of the rectProjection, fallback on slow // implementation if (rectProjection->numargs < 1 || strncasecmp(rectProjection->args[0], "init=epsg:", (int)strlen("init=epsg:")) != 0) { if (layer->debug) { msDebug("msMSSQL2008LayerGetShapeCount(): cannot find EPSG code of " "rectProjection. Falling back on client-side feature count.\n"); } return LayerDefaultGetShapeCount(layer, rect, rectProjection); } // Reproject the passed rect into the layer projection and get // the SRID from the rectProjection msProjectRect( rectProjection, &(layer->projection), &searchrectInLayerProj); /* project the searchrect to source coords */ } if (searchrectInLayerProj.minx == searchrectInLayerProj.maxx || searchrectInLayerProj.miny == searchrectInLayerProj.maxy) { /* create point shape for rectangles with zero area */ snprintf(box3d, sizeof(box3d), "%s::STGeomFromText('POINT(%.15g %.15g)',%s)", /* %s.STSrid)", */ layerinfo->geom_column_type, searchrectInLayerProj.minx, searchrectInLayerProj.miny, layerinfo->user_srid); } else { snprintf(box3d, sizeof(box3d), "%s::STGeomFromText('POLYGON((%.15g %.15g,%.15g %.15g,%.15g " "%.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */ layerinfo->geom_column_type, searchrectInLayerProj.minx, searchrectInLayerProj.miny, searchrectInLayerProj.maxx, searchrectInLayerProj.miny, searchrectInLayerProj.maxx, searchrectInLayerProj.maxy, searchrectInLayerProj.minx, searchrectInLayerProj.maxy, searchrectInLayerProj.minx, searchrectInLayerProj.miny, layerinfo->user_srid); } msLayerTranslateFilter(layer, &layer->filter, layer->filteritem); /* set up statement */ query = msStringConcatenate(query, "SELECT count(*) FROM "); query = msStringConcatenate(query, layerinfo->geom_table); /* adding attribute filter */ hasFilter = addFilter(layer, &query); if (bIsValidRect) { /* adding spatial filter */ if (hasFilter == MS_FALSE) query = msStringConcatenate(query, " WHERE "); else query = msStringConcatenate(query, " AND "); query = msStringConcatenate(query, layerinfo->geom_column); query = msStringConcatenate(query, ".STIntersects("); query = msStringConcatenate(query, box3d); query = msStringConcatenate(query, ") = 1 "); } if (layer->debug) { msDebug("query:%s\n", query); } if (!executeSQL(layerinfo->conn, query)) { msFree(query); return -1; } msFree(query); rc = SQLFetch(layerinfo->conn->hstmt); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { if (layer->debug) { msDebug("msMSSQL2008LayerGetShapeCount: No results found.\n"); } return -1; } rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_CHAR, result_data, sizeof(result_data), &retLen); if (rc == SQL_ERROR) { msSetError(MS_QUERYERR, "Failed to get feature count", "msMSSQL2008LayerGetShapeCount()"); return -1; } result_data[retLen] = 0; return atoi(result_data); } /* Query the DB for info about the requested table */ int msMSSQL2008LayerGetItems(layerObj *layer) { msMSSQL2008LayerInfo *layerinfo; char *sql = NULL; size_t sqlSize; char found_geom = 0; int t, item_num; SQLSMALLINT cols = 0; const char *value; /* * Pass the field definitions through to the layer metadata in the * "gml_[item]_{type,width,precision}" set of metadata items for * defining fields. */ char pass_field_def = 0; if (layer->debug) { msDebug("in msMSSQL2008LayerGetItems (find column names)\n"); } layerinfo = getMSSQL2008LayerInfo(layer); if (!layerinfo) { /* layer not opened yet */ msSetError(MS_QUERYERR, "msMSSQL2008LayerGetItems called on unopened layer", "msMSSQL2008LayerGetItems()"); return MS_FAILURE; } if (!layerinfo->conn) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetItems called on MSSQL2008 layer with no " "connection to DB.", "msMSSQL2008LayerGetItems()"); return MS_FAILURE; } sqlSize = strlen(layerinfo->geom_table) + 30; sql = msSmallMalloc(sizeof(char *) * sqlSize); snprintf(sql, sqlSize, "SELECT top 0 * FROM %s", layerinfo->geom_table); if (!executeSQL(layerinfo->conn, sql)) { msFree(sql); return MS_FAILURE; } msFree(sql); SQLNumResultCols(layerinfo->conn->hstmt, &cols); layer->numitems = cols - 1; /* don't include the geometry column */ layer->items = msSmallMalloc( sizeof(char *) * (layer->numitems + 1)); /* +1 in case there is a problem finding goeometry column */ layerinfo->itemtypes = msSmallMalloc(sizeof(SQLSMALLINT) * (layer->numitems + 1)); /* it will return an error if there is no geometry column found, */ /* so this isn't a problem */ found_geom = 0; /* haven't found the geom field */ item_num = 0; /* consider populating the field definitions in metadata */ if ((value = msOWSLookupMetadata(&(layer->metadata), "G", "types")) != NULL && strcasecmp(value, "auto") == 0) pass_field_def = 1; for (t = 0; t < cols; t++) { char colBuff[256]; SQLSMALLINT itemType = 0; columnName(layerinfo->conn, t + 1, colBuff, sizeof(colBuff), layer, pass_field_def, &itemType); if (strcmp(colBuff, layerinfo->geom_column) != 0) { /* this isn't the geometry column */ layer->items[item_num] = (char *)msSmallMalloc(strlen(colBuff) + 1); strcpy(layer->items[item_num], colBuff); layerinfo->itemtypes[item_num] = itemType; item_num++; } else { found_geom = 1; } } if (!found_geom) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetItems: tried to find the geometry column in " "the results from the database, but couldn't find it. Is it " "miss-capitialized? '%s'", "msMSSQL2008LayerGetItems()", layerinfo->geom_column); return MS_FAILURE; } return msMSSQL2008LayerInitItemInfo(layer); } /* Get primary key column of table */ int msMSSQL2008LayerRetrievePK(layerObj *layer, char **urid_name, char *table_name, int debug) { char sql[1024]; msMSSQL2008LayerInfo *layerinfo = 0; SQLRETURN rc; snprintf(sql, sizeof(sql), "SELECT convert(varchar(50), sys.columns.name) AS ColumnName, " "sys.indexes.name " "FROM sys.columns INNER JOIN " " sys.indexes INNER JOIN " " sys.tables ON sys.indexes.object_id = " "sys.tables.object_id INNER JOIN " " sys.index_columns ON sys.indexes.object_id = " "sys.index_columns.object_id AND sys.indexes.index_id = " "sys.index_columns.index_id ON " " sys.columns.object_id = " "sys.index_columns.object_id AND sys.columns.column_id = " "sys.index_columns.column_id " "WHERE (sys.indexes.is_primary_key = 1) AND (sys.tables.name = " "N'%s') ", table_name); if (debug) { msDebug("msMSSQL2008LayerRetrievePK: query = %s\n", sql); } layerinfo = (msMSSQL2008LayerInfo *)layer->layerinfo; if (layerinfo->conn == NULL) { msSetError(MS_QUERYERR, "Layer does not have a MSSQL2008 connection.", "msMSSQL2008LayerRetrievePK()"); return (MS_FAILURE); } /* error somewhere above here in this method */ if (!executeSQL(layerinfo->conn, sql)) { char *tmp1; char *tmp2 = NULL; tmp1 = "Error executing MSSQL2008 statement (msMSSQL2008LayerRetrievePK():"; tmp2 = (char *)msSmallMalloc(sizeof(char) * (strlen(tmp1) + strlen(sql) + 1)); strcpy(tmp2, tmp1); strcat(tmp2, sql); msSetError(MS_QUERYERR, "%s", "msMSSQL2008LayerRetrievePK()", tmp2); msFree(tmp2); return (MS_FAILURE); } rc = SQLFetch(layerinfo->conn->hstmt); if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) { if (debug) { msDebug("msMSSQL2008LayerRetrievePK: No results found.\n"); } return MS_FAILURE; } { char buff[100]; SQLLEN retLen; rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_BINARY, buff, sizeof(buff), &retLen); rc = SQLFetch(layerinfo->conn->hstmt); if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) { if (debug) { msDebug("msMSSQL2008LayerRetrievePK: Multiple primary key columns are " "not supported in MapServer\n"); } return MS_FAILURE; } buff[retLen] = 0; *urid_name = msStrdup(buff); } return MS_SUCCESS; } /* Function to parse the Mapserver DATA parameter for geometry * column name, table name and name of a column to serve as a * unique record id */ static int msMSSQL2008LayerParseData(layerObj *layer, char **geom_column_name, char **geom_column_type, char **table_name, char **urid_name, char **user_srid, char **index_name, char **sort_spec, int debug) { char *pos_opt, *pos_scn, *tmp, *pos_srid, *pos_urid, *pos_geomtype, *pos_geomtype2, *pos_indexHint, *data, *pos_order; size_t slength; data = msStrdup(layer->data); /* replace tabs with spaces */ msReplaceChar(data, '\t', ' '); /* given a string of the from 'geom from ctivalues' or 'geom from () as foo' * return geom_column_name as 'geom' * and table name as 'ctivalues' or 'geom from () as foo' */ /* First look for the optional ' using unique ID' string */ pos_urid = strstrIgnoreCase(data, " using unique "); if (pos_urid) { /* CHANGE - protect the trailing edge for thing like 'using unique ftab_id * using srid=33' */ tmp = strstr(pos_urid + 14, " "); if (!tmp) { tmp = pos_urid + strlen(pos_urid); } *urid_name = (char *)msSmallMalloc((tmp - (pos_urid + 14)) + 1); strlcpy(*urid_name, pos_urid + 14, (tmp - (pos_urid + 14)) + 1); } /* Find the srid */ pos_srid = strstrIgnoreCase(data, " using SRID="); if (!pos_srid) { *user_srid = (char *)msSmallMalloc(2); (*user_srid)[0] = '0'; (*user_srid)[1] = 0; } else { slength = strspn(pos_srid + 12, "-0123456789"); if (!slength) { msSetError( MS_QUERYERR, DATA_ERROR_MESSAGE, "msMSSQL2008LayerParseData()", "Error parsing MSSQL2008 data variable: You specified 'using SRID=#' " "but didn't have any numbers!

\n\nMore Help:

\n\n", data); msFree(data); return MS_FAILURE; } else { *user_srid = (char *)msSmallMalloc(slength + 1); strlcpy(*user_srid, pos_srid + 12, slength + 1); } } pos_indexHint = strstrIgnoreCase(data, " using index "); if (pos_indexHint) { /* CHANGE - protect the trailing edge for thing like 'using unique ftab_id * using srid=33' */ tmp = strstr(pos_indexHint + 13, " "); if (!tmp) { tmp = pos_indexHint + strlen(pos_indexHint); } *index_name = (char *)msSmallMalloc((tmp - (pos_indexHint + 13)) + 1); strlcpy(*index_name, pos_indexHint + 13, tmp - (pos_indexHint + 13) + 1); } /* this is a little hack so the rest of the code works. If the ' using SRID=' * comes before */ /* the ' using unique ', then make sure pos_opt points to where the ' using * SRID' starts! */ pos_opt = pos_urid; if (!pos_opt || (pos_srid && pos_srid < pos_opt)) pos_opt = pos_srid; if (!pos_opt || (pos_indexHint && pos_indexHint < pos_opt)) pos_opt = pos_indexHint; if (!pos_opt) pos_opt = data + strlen(data); /* Scan for the table or sub-select clause */ pos_scn = strstrIgnoreCase(data, " from "); if (!pos_scn) { msSetError(MS_QUERYERR, DATA_ERROR_MESSAGE, "msMSSQL2008LayerParseData()", "Error parsing MSSQL2008 data variable. Must contain " "'geometry_column from table_name' or 'geom from (subselect) as " "foo' (couldn't find ' from '). More help:

\n\n", data); msFree(data); return MS_FAILURE; } /* Scanning the geometry column type */ pos_geomtype = data; while (pos_geomtype < pos_scn && *pos_geomtype != '(' && *pos_geomtype != 0) ++pos_geomtype; if (*pos_geomtype == '(') { pos_geomtype2 = pos_geomtype; while (pos_geomtype2 < pos_scn && *pos_geomtype2 != ')' && *pos_geomtype2 != 0) ++pos_geomtype2; if (*pos_geomtype2 != ')' || pos_geomtype2 == pos_geomtype) { msSetError(MS_QUERYERR, DATA_ERROR_MESSAGE, "msMSSQL2008LayerParseData()", "Error parsing MSSQL2008 data variable. Invalid syntax near " "geometry column type.", data); msFree(data); return MS_FAILURE; } *geom_column_name = (char *)msSmallMalloc((pos_geomtype - data) + 1); strlcpy(*geom_column_name, data, pos_geomtype - data + 1); *geom_column_type = (char *)msSmallMalloc(pos_geomtype2 - pos_geomtype); strlcpy(*geom_column_type, pos_geomtype + 1, pos_geomtype2 - pos_geomtype); } else { /* Copy the geometry column name */ *geom_column_name = (char *)msSmallMalloc((pos_scn - data) + 1); strlcpy(*geom_column_name, data, pos_scn - data + 1); *geom_column_type = msStrdup("geometry"); } /* Copy out the table name or sub-select clause */ *table_name = (char *)msSmallMalloc((pos_opt - (pos_scn + 6)) + 1); strlcpy(*table_name, pos_scn + 6, pos_opt - (pos_scn + 6) + 1); if (strlen(*table_name) < 1 || strlen(*geom_column_name) < 1) { msSetError( MS_QUERYERR, DATA_ERROR_MESSAGE, "msMSSQL2008LayerParseData()", "Error parsing MSSQL2008 data variable. Must contain 'geometry_column " "from table_name' or 'geom from (subselect) as foo' (couldn't find a " "geometry_column or table/subselect). More help:

\n\n", data); msFree(data); return MS_FAILURE; } if (!pos_urid) { if (msMSSQL2008LayerRetrievePK(layer, urid_name, *table_name, debug) != MS_SUCCESS) { msSetError(MS_QUERYERR, DATA_ERROR_MESSAGE, "msMSSQL2008LayerParseData()", "No primary key defined for table, or primary key contains " "more that one column\n\n", *table_name); msFree(data); return MS_FAILURE; } } /* Find the order by */ pos_order = strstrIgnoreCase(pos_opt, " order by "); if (pos_order) { *sort_spec = msStrdup(pos_order); } if (debug) { msDebug("msMSSQL2008LayerParseData: unique column = %s, srid='%s', " "geom_column_name = %s, table_name=%s\n", *urid_name, *user_srid, *geom_column_name, *table_name); } msFree(data); return MS_SUCCESS; } char *msMSSQL2008LayerEscapePropertyName(layerObj *layer, const char *pszString) { (void)layer; char *pszEscapedStr = NULL; int j = 0; if (pszString && strlen(pszString) > 0) { size_t nLength = strlen(pszString); pszEscapedStr = (char *)msSmallMalloc(1 + nLength + 1 + 1); pszEscapedStr[j++] = '['; for (size_t i = 0; i < nLength; i++) pszEscapedStr[j++] = pszString[i]; pszEscapedStr[j++] = ']'; pszEscapedStr[j++] = 0; } return pszEscapedStr; } char *msMSSQL2008LayerEscapeSQLParam(layerObj *layer, const char *pszString) { (void)layer; char *pszEscapedStr = NULL; if (pszString) { int nSrcLen; char c; int i = 0, j = 0; nSrcLen = (int)strlen(pszString); pszEscapedStr = (char *)msSmallMalloc(2 * nSrcLen + 1); for (i = 0, j = 0; i < nSrcLen; i++) { c = pszString[i]; if (c == '\'') { pszEscapedStr[j++] = '\''; pszEscapedStr[j++] = '\''; } else pszEscapedStr[j++] = c; } pszEscapedStr[j] = 0; } return pszEscapedStr; } int msMSSQL2008GetPaging(layerObj *layer) { msMSSQL2008LayerInfo *layerinfo = NULL; if (!msMSSQL2008LayerIsOpen(layer)) return MS_TRUE; assert(layer->layerinfo != NULL); layerinfo = (msMSSQL2008LayerInfo *)layer->layerinfo; return layerinfo->paging; } void msMSSQL2008EnablePaging(layerObj *layer, int value) { msMSSQL2008LayerInfo *layerinfo = NULL; if (!msMSSQL2008LayerIsOpen(layer)) { if (msMSSQL2008LayerOpen(layer) != MS_SUCCESS) { return; } } assert(layer->layerinfo != NULL); layerinfo = (msMSSQL2008LayerInfo *)layer->layerinfo; layerinfo->paging = value; } int process_node(layerObj *layer, expressionObj *filter) { char *snippet = NULL; char *strtmpl = NULL; char *stresc = NULL; msMSSQL2008LayerInfo *layerinfo = (msMSSQL2008LayerInfo *)layer->layerinfo; if (!layerinfo->current_node) { msSetError(MS_MISCERR, "Unecpected end of expression", "msMSSQL2008LayerTranslateFilter()"); return 0; } switch (layerinfo->current_node->token) { case '(': filter->native_string = msStringConcatenate(filter->native_string, "("); /* process subexpression */ layerinfo->current_node = layerinfo->current_node->next; while (layerinfo->current_node != NULL) { if (!process_node(layer, filter)) return 0; if (!layerinfo->current_node) break; if (layerinfo->current_node->token == ')') break; layerinfo->current_node = layerinfo->current_node->next; } break; case ')': filter->native_string = msStringConcatenate(filter->native_string, ")"); break; /* argument separator */ case ',': break; /* literal tokens */ case MS_TOKEN_LITERAL_BOOLEAN: if (layerinfo->current_node->tokenval.dblval == MS_TRUE) filter->native_string = msStringConcatenate(filter->native_string, "1"); else filter->native_string = msStringConcatenate(filter->native_string, "0"); break; case MS_TOKEN_LITERAL_NUMBER: { char buffer[32]; snprintf(buffer, sizeof(buffer), "%.18g", layerinfo->current_node->tokenval.dblval); filter->native_string = msStringConcatenate(filter->native_string, buffer); break; } case MS_TOKEN_LITERAL_STRING: strtmpl = "'%s'"; stresc = msMSSQL2008LayerEscapeSQLParam( layer, layerinfo->current_node->tokenval.strval); snippet = (char *)msSmallMalloc(strlen(strtmpl) + strlen(stresc)); sprintf(snippet, strtmpl, stresc); filter->native_string = msStringConcatenate(filter->native_string, snippet); msFree(snippet); msFree(stresc); break; case MS_TOKEN_LITERAL_TIME: { int resolution = msTimeGetResolution(layerinfo->current_node->tokensrc); snippet = (char *)msSmallMalloc(128); switch (resolution) { case TIME_RESOLUTION_YEAR: sprintf(snippet, "'%d'", (layerinfo->current_node->tokenval.tmval.tm_year + 1900)); break; case TIME_RESOLUTION_MONTH: sprintf(snippet, "'%d-%02d-01'", (layerinfo->current_node->tokenval.tmval.tm_year + 1900), (layerinfo->current_node->tokenval.tmval.tm_mon + 1)); break; case TIME_RESOLUTION_DAY: sprintf(snippet, "'%d-%02d-%02d'", (layerinfo->current_node->tokenval.tmval.tm_year + 1900), (layerinfo->current_node->tokenval.tmval.tm_mon + 1), layerinfo->current_node->tokenval.tmval.tm_mday); break; case TIME_RESOLUTION_HOUR: sprintf(snippet, "'%d-%02d-%02d %02d:00'", (layerinfo->current_node->tokenval.tmval.tm_year + 1900), (layerinfo->current_node->tokenval.tmval.tm_mon + 1), layerinfo->current_node->tokenval.tmval.tm_mday, layerinfo->current_node->tokenval.tmval.tm_hour); break; case TIME_RESOLUTION_MINUTE: sprintf(snippet, "%d-%02d-%02d %02d:%02d'", (layerinfo->current_node->tokenval.tmval.tm_year + 1900), (layerinfo->current_node->tokenval.tmval.tm_mon + 1), layerinfo->current_node->tokenval.tmval.tm_mday, layerinfo->current_node->tokenval.tmval.tm_hour, layerinfo->current_node->tokenval.tmval.tm_min); break; case TIME_RESOLUTION_SECOND: sprintf(snippet, "'%d-%02d-%02d %02d:%02d:%02d'", (layerinfo->current_node->tokenval.tmval.tm_year + 1900), (layerinfo->current_node->tokenval.tmval.tm_mon + 1), layerinfo->current_node->tokenval.tmval.tm_mday, layerinfo->current_node->tokenval.tmval.tm_hour, layerinfo->current_node->tokenval.tmval.tm_min, layerinfo->current_node->tokenval.tmval.tm_sec); break; } filter->native_string = msStringConcatenate(filter->native_string, snippet); msFree(snippet); } break; case MS_TOKEN_LITERAL_SHAPE: if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) filter->native_string = msStringConcatenate( filter->native_string, "geography::STGeomFromText('"); else filter->native_string = msStringConcatenate(filter->native_string, "geometry::STGeomFromText('"); filter->native_string = msStringConcatenate( filter->native_string, msShapeToWKT(layerinfo->current_node->tokenval.shpval)); filter->native_string = msStringConcatenate(filter->native_string, "'"); if (layerinfo->user_srid && strcmp(layerinfo->user_srid, "") != 0) { filter->native_string = msStringConcatenate(filter->native_string, ", "); filter->native_string = msStringConcatenate(filter->native_string, layerinfo->user_srid); } filter->native_string = msStringConcatenate(filter->native_string, ")"); break; case MS_TOKEN_BINDING_TIME: case MS_TOKEN_BINDING_DOUBLE: case MS_TOKEN_BINDING_INTEGER: case MS_TOKEN_BINDING_STRING: if (layerinfo->current_node->next->token == MS_TOKEN_COMPARISON_IRE) strtmpl = "LOWER(%s)"; else strtmpl = "%s"; stresc = msMSSQL2008LayerEscapePropertyName( layer, layerinfo->current_node->tokenval.bindval.item); snippet = (char *)msSmallMalloc(strlen(strtmpl) + strlen(stresc)); sprintf(snippet, strtmpl, stresc); filter->native_string = msStringConcatenate(filter->native_string, snippet); msFree(snippet); msFree(stresc); break; case MS_TOKEN_BINDING_SHAPE: filter->native_string = msStringConcatenate(filter->native_string, layerinfo->geom_column); break; case MS_TOKEN_BINDING_MAP_CELLSIZE: { char buffer[32]; snprintf(buffer, sizeof(buffer), "%.18g", layer->map->cellsize); filter->native_string = msStringConcatenate(filter->native_string, buffer); break; } /* comparisons */ case MS_TOKEN_COMPARISON_IN: filter->native_string = msStringConcatenate(filter->native_string, " IN "); break; case MS_TOKEN_COMPARISON_RE: case MS_TOKEN_COMPARISON_IRE: { /* process regexp */ size_t i = 0, j = 0; char c; char c_next; int bCaseInsensitive = (layerinfo->current_node->token == MS_TOKEN_COMPARISON_IRE); int nEscapeLen = 0; if (bCaseInsensitive) filter->native_string = msStringConcatenate(filter->native_string, " LIKE LOWER("); else filter->native_string = msStringConcatenate(filter->native_string, " LIKE "); layerinfo->current_node = layerinfo->current_node->next; if (layerinfo->current_node->token != MS_TOKEN_LITERAL_STRING) return 0; strtmpl = msStrdup(layerinfo->current_node->tokenval.strval); if (strtmpl[0] == '/') { stresc = strtmpl + 1; strtmpl[strlen(strtmpl) - 1] = '\0'; } else if (strtmpl[0] == '^') stresc = strtmpl + 1; else stresc = strtmpl; while (*stresc) { c = stresc[i]; if (c == '%' || c == '_' || c == '[' || c == ']' || c == '^') { nEscapeLen++; } stresc++; } snippet = (char *)msSmallMalloc(strlen(strtmpl) + nEscapeLen + 3); snippet[j++] = '\''; while (i < strlen(strtmpl)) { c = strtmpl[i]; c_next = strtmpl[i + 1]; if (i == 0 && c == '^') { i++; continue; } if (c == '$' && c_next == 0 && strtmpl[0] == '^') break; if (c == '\\') { i++; c = c_next; } if (c == '%' || c == '_' || c == '[' || c == ']' || c == '^') { snippet[j++] = '\\'; } if (c == '.' && c_next == '*') { i++; c = '%'; } else if (c == '.') c = '_'; snippet[j++] = c; i++; } snippet[j++] = '\''; snippet[j] = '\0'; filter->native_string = msStringConcatenate(filter->native_string, snippet); msFree(strtmpl); msFree(snippet); if (bCaseInsensitive) filter->native_string = msStringConcatenate(filter->native_string, ")"); if (nEscapeLen > 0) filter->native_string = msStringConcatenate(filter->native_string, " ESCAPE '\\'"); } break; case MS_TOKEN_COMPARISON_EQ: filter->native_string = msStringConcatenate(filter->native_string, " = "); break; case MS_TOKEN_COMPARISON_NE: filter->native_string = msStringConcatenate(filter->native_string, " != "); break; case MS_TOKEN_COMPARISON_GT: filter->native_string = msStringConcatenate(filter->native_string, " > "); break; case MS_TOKEN_COMPARISON_GE: filter->native_string = msStringConcatenate(filter->native_string, " >= "); break; case MS_TOKEN_COMPARISON_LT: filter->native_string = msStringConcatenate(filter->native_string, " < "); break; case MS_TOKEN_COMPARISON_LE: filter->native_string = msStringConcatenate(filter->native_string, " <= "); break; /* logical ops */ case MS_TOKEN_LOGICAL_AND: filter->native_string = msStringConcatenate(filter->native_string, " AND "); break; case MS_TOKEN_LOGICAL_OR: filter->native_string = msStringConcatenate(filter->native_string, " OR "); break; case MS_TOKEN_LOGICAL_NOT: filter->native_string = msStringConcatenate(filter->native_string, " NOT "); break; /* spatial comparison tokens */ case MS_TOKEN_COMPARISON_INTERSECTS: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STIntersects("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_DISJOINT: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STDisjoint("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_TOUCHES: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STTouches("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_OVERLAPS: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STOverlaps("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_CROSSES: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STCrosses("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_WITHIN: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STWithin("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_CONTAINS: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STContains("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_EQUALS: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STEquals("); if (!process_node(layer, filter)) return 0; break; case MS_TOKEN_COMPARISON_BEYOND: msSetError(MS_MISCERR, "Beyond operator is unsupported.", "msMSSQL2008LayerTranslateFilter()"); return 0; case MS_TOKEN_COMPARISON_DWITHIN: msSetError(MS_MISCERR, "DWithin operator is unsupported.", "msMSSQL2008LayerTranslateFilter()"); return 0; /* spatial functions */ case MS_TOKEN_FUNCTION_AREA: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STArea()"); break; case MS_TOKEN_FUNCTION_BUFFER: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STBuffer("); if (!process_node(layer, filter)) return 0; filter->native_string = msStringConcatenate(filter->native_string, ")"); break; case MS_TOKEN_FUNCTION_DIFFERENCE: if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (!process_node(layer, filter)) return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; if (layerinfo->current_node->next) layerinfo->current_node = layerinfo->current_node->next; else return 0; filter->native_string = msStringConcatenate(filter->native_string, ".STDifference("); if (!process_node(layer, filter)) return 0; filter->native_string = msStringConcatenate(filter->native_string, ")"); break; case MS_TOKEN_FUNCTION_FROMTEXT: if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) filter->native_string = msStringConcatenate(filter->native_string, "geography::STGeomFromText"); else filter->native_string = msStringConcatenate(filter->native_string, "geometry::STGeomFromText"); break; case MS_TOKEN_FUNCTION_LENGTH: filter->native_string = msStringConcatenate(filter->native_string, "len"); break; case MS_TOKEN_FUNCTION_ROUND: filter->native_string = msStringConcatenate(filter->native_string, "round"); break; case MS_TOKEN_FUNCTION_TOSTRING: break; case MS_TOKEN_FUNCTION_COMMIFY: break; case MS_TOKEN_FUNCTION_SIMPLIFY: filter->native_string = msStringConcatenate(filter->native_string, ".Reduce"); break; case MS_TOKEN_FUNCTION_SIMPLIFYPT: break; case MS_TOKEN_FUNCTION_GENERALIZE: filter->native_string = msStringConcatenate(filter->native_string, ".Reduce"); break; default: msSetError(MS_MISCERR, "Translation to native SQL failed.", "msMSSQL2008LayerTranslateFilter()"); if (layer->debug) { msDebug("Token not caught, exiting: Token is %i\n", layerinfo->current_node->token); } return 0; } return 1; } /* Translate filter expression to native msssql filter */ int msMSSQL2008LayerTranslateFilter(layerObj *layer, expressionObj *filter, char *filteritem) { char *snippet = NULL; char *strtmpl = NULL; char *stresc = NULL; msMSSQL2008LayerInfo *layerinfo = (msMSSQL2008LayerInfo *)layer->layerinfo; if (!filter->string) return MS_SUCCESS; msFree(filter->native_string); filter->native_string = NULL; if (filter->type == MS_STRING && filter->string && filteritem) { /* item/value pair */ stresc = msMSSQL2008LayerEscapePropertyName(layer, filteritem); if (filter->flags & MS_EXP_INSENSITIVE) { filter->native_string = msStringConcatenate(filter->native_string, "upper("); filter->native_string = msStringConcatenate(filter->native_string, stresc); filter->native_string = msStringConcatenate(filter->native_string, ") = upper("); } else { filter->native_string = msStringConcatenate(filter->native_string, stresc); filter->native_string = msStringConcatenate(filter->native_string, " = "); } msFree(stresc); strtmpl = "'%s'"; /* don't have a type for the righthand literal so assume it's a string and we quote */ snippet = (char *)msSmallMalloc(strlen(strtmpl) + strlen(filter->string)); sprintf(snippet, strtmpl, filter->string); // TODO: escape filter->string filter->native_string = msStringConcatenate(filter->native_string, snippet); free(snippet); if (filter->flags & MS_EXP_INSENSITIVE) filter->native_string = msStringConcatenate(filter->native_string, ")"); } else if (filter->type == MS_REGEX && filter->string && filteritem) { /* item/regex pair */ /* NOTE: regex is not supported by MSSQL natively. We should install it in CLR UDF according to https://msdn.microsoft.com/en-us/magazine/cc163473.aspx*/ filter->native_string = msStringConcatenate(filter->native_string, "dbo.RegexMatch("); if (filter->flags & MS_EXP_INSENSITIVE) { filter->native_string = msStringConcatenate(filter->native_string, "'(?i)"); } filter->native_string = msStrdup(filteritem); filter->native_string = msStringConcatenate(filter->native_string, ", "); strtmpl = "'%s'"; snippet = (char *)msSmallMalloc(strlen(strtmpl) + strlen(filter->string)); sprintf(snippet, strtmpl, filter->string); // TODO: escape filter->string filter->native_string = msStringConcatenate(filter->native_string, snippet); filter->native_string = msStringConcatenate(filter->native_string, "')"); free(snippet); } else if (filter->type == MS_EXPRESSION) { if (layer->debug >= 2) msDebug("msMSSQL2008LayerTranslateFilter. String: %s.\n", filter->string); if (!filter->tokens) { if (layer->debug >= 2) msDebug("msMSSQL2008LayerTranslateFilter. There are tokens to " "process... \n"); return MS_SUCCESS; } /* start processing nodes */ layerinfo->current_node = filter->tokens; while (layerinfo->current_node != NULL) { if (!process_node(layer, filter)) { msFree(filter->native_string); filter->native_string = 0; return MS_FAILURE; } if (!layerinfo->current_node) break; layerinfo->current_node = layerinfo->current_node->next; } } return MS_SUCCESS; } #else /* prototypes if MSSQL2008 isn't supposed to be compiled */ int msMSSQL2008LayerOpen(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008LayerOpen called but unimplemented! (mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008LayerOpen()"); return MS_FAILURE; } int msMSSQL2008LayerIsOpen(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008IsLayerOpen called but unimplemented! (mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008LayerIsOpen()"); return MS_FALSE; } void msMSSQL2008LayerFreeItemInfo(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008LayerFreeItemInfo called but unimplemented!(mapserver " "not compiled with MSSQL2008 support)", "msMSSQL2008LayerFreeItemInfo()"); } int msMSSQL2008LayerInitItemInfo(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008LayerInitItemInfo called but unimplemented!(mapserver " "not compiled with MSSQL2008 support)", "msMSSQL2008LayerInitItemInfo()"); return MS_FAILURE; } int msMSSQL2008LayerWhichShapes(layerObj *layer, rectObj rect, int isQuery) { msSetError(MS_QUERYERR, "msMSSQL2008LayerWhichShapes called but unimplemented!(mapserver " "not compiled with MSSQL2008 support)", "msMSSQL2008LayerWhichShapes()"); return MS_FAILURE; } int msMSSQL2008LayerClose(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008LayerClose called but unimplemented!(mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008LayerClose()"); return MS_FAILURE; } int msMSSQL2008LayerNextShape(layerObj *layer, shapeObj *shape) { msSetError(MS_QUERYERR, "msMSSQL2008LayerNextShape called but unimplemented!(mapserver " "not compiled with MSSQL2008 support)", "msMSSQL2008LayerNextShape()"); return MS_FAILURE; } int msMSSQL2008LayerGetShape(layerObj *layer, shapeObj *shape, long record) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetShape called but unimplemented!(mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008LayerGetShape()"); return MS_FAILURE; } int msMSSQL2008LayerGetShapeCount(layerObj *layer, rectObj rect, projectionObj *rectProjection) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetShapeCount called but " "unimplemented!(mapserver not compiled with MSSQL2008 support)", "msMSSQL2008LayerGetShapeCount()"); return MS_FAILURE; } int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetExtent called but unimplemented!(mapserver " "not compiled with MSSQL2008 support)", "msMSSQL2008LayerGetExtent()"); return MS_FAILURE; } int msMSSQL2008LayerGetNumFeatures(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetNumFeatures called but " "unimplemented!(mapserver not compiled with MSSQL2008 support)", "msMSSQL2008LayerGetNumFeatures()"); return -1; } int msMSSQL2008LayerGetShapeRandom(layerObj *layer, shapeObj *shape, long *record) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetShapeRandom called but " "unimplemented!(mapserver not compiled with MSSQL2008 support)", "msMSSQL2008LayerGetShapeRandom()"); return MS_FAILURE; } int msMSSQL2008LayerGetItems(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008LayerGetItems called but unimplemented!(mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008LayerGetItems()"); return MS_FAILURE; } void msMSSQL2008EnablePaging(layerObj *layer, int value) { msSetError(MS_QUERYERR, "msMSSQL2008EnablePaging called but unimplemented!(mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008EnablePaging()"); return; } int msMSSQL2008GetPaging(layerObj *layer) { msSetError(MS_QUERYERR, "msMSSQL2008GetPaging called but unimplemented!(mapserver not " "compiled with MSSQL2008 support)", "msMSSQL2008GetPaging()"); return MS_FAILURE; } int msMSSQL2008LayerTranslateFilter(layerObj *layer, expressionObj *filter, char *filteritem) { msSetError(MS_QUERYERR, "msMSSQL2008LayerTranslateFilter called but " "unimplemented!(mapserver not compiled with MSSQL2008 support)", "msMSSQL2008LayerTranslateFilter()"); return MS_FAILURE; } char *msMSSQL2008LayerEscapeSQLParam(layerObj *layer, const char *pszString) { msSetError(MS_QUERYERR, "msMSSQL2008EscapeSQLParam called but unimplemented!(mapserver " "not compiled with MSSQL2008 support)", "msMSSQL2008LayerEscapeSQLParam()"); return NULL; } char *msMSSQL2008LayerEscapePropertyName(layerObj *layer, const char *pszString) { msSetError(MS_QUERYERR, "msMSSQL2008LayerEscapePropertyName called but " "unimplemented!(mapserver not compiled with MSSQL2008 support)", "msMSSQL2008LayerEscapePropertyName()"); return NULL; } /* end above's #ifdef USE_MSSQL2008 */ #endif #ifdef USE_MSSQL2008_PLUGIN MS_DLL_EXPORT int PluginInitializeVirtualTable(layerVTableObj *vtable, layerObj *layer) { assert(layer != NULL); assert(vtable != NULL); vtable->LayerEnablePaging = msMSSQL2008EnablePaging; vtable->LayerGetPaging = msMSSQL2008GetPaging; vtable->LayerTranslateFilter = msMSSQL2008LayerTranslateFilter; vtable->LayerEscapeSQLParam = msMSSQL2008LayerEscapeSQLParam; vtable->LayerEscapePropertyName = msMSSQL2008LayerEscapePropertyName; vtable->LayerInitItemInfo = msMSSQL2008LayerInitItemInfo; vtable->LayerFreeItemInfo = msMSSQL2008LayerFreeItemInfo; vtable->LayerOpen = msMSSQL2008LayerOpen; vtable->LayerIsOpen = msMSSQL2008LayerIsOpen; vtable->LayerWhichShapes = msMSSQL2008LayerWhichShapes; vtable->LayerNextShape = msMSSQL2008LayerNextShape; vtable->LayerGetShape = msMSSQL2008LayerGetShape; vtable->LayerGetShapeCount = msMSSQL2008LayerGetShapeCount; vtable->LayerClose = msMSSQL2008LayerClose; vtable->LayerGetItems = msMSSQL2008LayerGetItems; vtable->LayerGetExtent = msMSSQL2008LayerGetExtent; vtable->LayerApplyFilterToLayer = msLayerApplyCondSQLFilterToLayer; /* vtable->LayerGetAutoStyle, not supported for this layer */ vtable->LayerCloseConnection = msMSSQL2008LayerClose; vtable->LayerSetTimeFilter = msLayerMakeBackticsTimeFilter; /* vtable->LayerCreateItems, use default */ vtable->LayerGetNumFeatures = msMSSQL2008LayerGetNumFeatures; /* layer->vtable->LayerGetAutoProjection, use default*/ return MS_SUCCESS; } #endif int msMSSQL2008LayerInitializeVirtualTable(layerObj *layer) { assert(layer != NULL); assert(layer->vtable != NULL); layer->vtable->LayerEnablePaging = msMSSQL2008EnablePaging; layer->vtable->LayerGetPaging = msMSSQL2008GetPaging; layer->vtable->LayerTranslateFilter = msMSSQL2008LayerTranslateFilter; layer->vtable->LayerEscapeSQLParam = msMSSQL2008LayerEscapeSQLParam; layer->vtable->LayerEscapePropertyName = msMSSQL2008LayerEscapePropertyName; layer->vtable->LayerInitItemInfo = msMSSQL2008LayerInitItemInfo; layer->vtable->LayerFreeItemInfo = msMSSQL2008LayerFreeItemInfo; layer->vtable->LayerOpen = msMSSQL2008LayerOpen; layer->vtable->LayerIsOpen = msMSSQL2008LayerIsOpen; layer->vtable->LayerWhichShapes = msMSSQL2008LayerWhichShapes; layer->vtable->LayerNextShape = msMSSQL2008LayerNextShape; layer->vtable->LayerGetShape = msMSSQL2008LayerGetShape; layer->vtable->LayerGetShapeCount = msMSSQL2008LayerGetShapeCount; layer->vtable->LayerClose = msMSSQL2008LayerClose; layer->vtable->LayerGetItems = msMSSQL2008LayerGetItems; layer->vtable->LayerGetExtent = msMSSQL2008LayerGetExtent; layer->vtable->LayerApplyFilterToLayer = msLayerApplyCondSQLFilterToLayer; /* layer->vtable->LayerGetAutoStyle, not supported for this layer */ layer->vtable->LayerCloseConnection = msMSSQL2008LayerClose; layer->vtable->LayerSetTimeFilter = msLayerMakeBackticsTimeFilter; /* layer->vtable->LayerCreateItems, use default */ layer->vtable->LayerGetNumFeatures = msMSSQL2008LayerGetNumFeatures; return MS_SUCCESS; } mapserver-8.6.0/src/mapmvt.c000066400000000000000000000551521511405061000157710ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: MapBox Vector Tile rendering. * Author: Thomas Bonfort and the MapServer team. * ****************************************************************************** * Copyright (c) 1996-2015 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include "mapserver.h" #include "maptile.h" #ifdef USE_PBF #include "vector_tile.pb-c.h" #include "mapows.h" #include "uthash.h" #include #define MOVETO 1 #define LINETO 2 #define CLOSEPATH 7 #define FEATURES_INCREMENT_SIZE 5 enum MS_RING_DIRECTION { MS_DIRECTION_INVALID_RING, MS_DIRECTION_CLOCKWISE, MS_DIRECTION_COUNTERCLOCKWISE }; typedef struct { char *value; unsigned int index; UT_hash_handle hh; } value_lookup; typedef struct { value_lookup *cache; } value_lookup_table; #define COMMAND(id, count) (((id)&0x7) | ((count) << 3)) #define PARAMETER(n) (((n) << 1) ^ ((n) >> 31)) static double getTriangleHeight(lineObj *ring) { int i; double s = 0, b = 0; if (ring->numpoints != 4) return -1; /* not a triangle */ for (i = 0; i < ring->numpoints - 1; i++) { s += (ring->point[i].x * ring->point[i + 1].y - ring->point[i + 1].x * ring->point[i].y); b = MS_MAX(b, msDistancePointToPoint(&ring->point[i], &ring->point[i + 1])); } return (MS_ABS(s / b)); } static enum MS_RING_DIRECTION mvtGetRingDirection(lineObj *ring) { int i, sum = 0; if (ring->numpoints < 4) return MS_DIRECTION_INVALID_RING; /* step through the edges */ for (i = 0; i < ring->numpoints - 1; i++) { sum += ring->point[i].x * ring->point[i + 1].y - ring->point[i + 1].x * ring->point[i].y; } return sum > 0 ? MS_DIRECTION_CLOCKWISE : sum < 0 ? MS_DIRECTION_COUNTERCLOCKWISE : MS_DIRECTION_INVALID_RING; } static void mvtReverseRingDirection(lineObj *ring) { pointObj temp; int start = 1, end = ring->numpoints - 2; /* first and last points are the same so skip 'em */ while (start < end) { temp.x = ring->point[start].x; temp.y = ring->point[start].y; ring->point[start].x = ring->point[end].x; ring->point[start].y = ring->point[end].y; ring->point[end].x = temp.x; ring->point[end].y = temp.y; start++; end--; } } static void mvtReorderRings(shapeObj *shape, int *outers) { int i, j; int t1; lineObj t2; for (i = 0; i < (shape->numlines - 1); i++) { for (j = 0; j < (shape->numlines - i - 1); j++) { if (outers[j] < outers[j + 1]) { /* swap */ t1 = outers[j]; outers[j] = outers[j + 1]; outers[j + 1] = t1; t2 = shape->line[j]; shape->line[j] = shape->line[j + 1]; shape->line[j + 1] = t2; } } } } static int mvtTransformShape(shapeObj *shape, rectObj *extent, int layer_type, int mvt_layer_extent) { double scale_x, scale_y; int i, j, outj; int *outers = NULL, ring_direction; scale_x = (double)mvt_layer_extent / (extent->maxx - extent->minx); scale_y = (double)mvt_layer_extent / (extent->maxy - extent->miny); if (layer_type == MS_LAYER_POLYGON) { outers = msGetOuterList(shape); /* compute before we muck with the shape */ if (outers[0] == 0) /* first ring must be an outer */ mvtReorderRings(shape, outers); } for (i = 0; i < shape->numlines; i++) { for (j = 0, outj = 0; j < shape->line[i].numpoints; j++) { shape->line[i].point[outj].x = (int)((shape->line[i].point[j].x - extent->minx) * scale_x); shape->line[i].point[outj].y = mvt_layer_extent - (int)((shape->line[i].point[j].y - extent->miny) * scale_y); if (!outj || shape->line[i].point[outj].x != shape->line[i].point[outj - 1].x || shape->line[i].point[outj].y != shape->line[i].point[outj - 1].y) outj++; /* add the point to the shape only if it's the first one or if it's different than the previous one */ } shape->line[i].numpoints = outj; if (layer_type == MS_LAYER_POLYGON) { if (shape->line[i].numpoints == 4 && getTriangleHeight(&shape->line[i]) < 1) { shape->line[i].numpoints = 0; /* so it's not considered anymore */ continue; /* next ring */ } ring_direction = mvtGetRingDirection(&shape->line[i]); if (ring_direction == MS_DIRECTION_INVALID_RING) shape->line[i].numpoints = 0; /* so it's not considered anymore */ else if ((outers[i] && ring_direction != MS_DIRECTION_CLOCKWISE) || (!outers[i] && ring_direction != MS_DIRECTION_COUNTERCLOCKWISE)) mvtReverseRingDirection(&shape->line[i]); } } msComputeBounds( shape); /* TODO: might need to limit this to just valid parts... */ msFree(outers); return (shape->numlines == 0) ? MS_FAILURE : MS_SUCCESS; /* success if at least one line */ } static int mvtClipShape(shapeObj *shape, int layer_type, int buffer, int mvt_layer_extent) { rectObj tile_rect; tile_rect.minx = tile_rect.miny = -buffer * 16; tile_rect.maxx = tile_rect.maxy = mvt_layer_extent + buffer * 16; if (layer_type == MS_LAYER_POLYGON) { msClipPolygonRect(shape, tile_rect); } else if (layer_type == MS_LAYER_LINE) { msClipPolylineRect(shape, tile_rect); } /* success if at least one line and not a degenerate bounding box */ if (shape->numlines > 0 && (layer_type == MS_LAYER_POINT || (shape->bounds.minx != shape->bounds.maxx || shape->bounds.miny != shape->bounds.maxy))) return MS_SUCCESS; else return MS_FAILURE; } static void freeMvtFeature(VectorTile__Tile__Feature *mvt_feature) { if (mvt_feature->tags) msFree(mvt_feature->tags); if (mvt_feature->geometry) msFree(mvt_feature->geometry); } static void freeMvtValue(VectorTile__Tile__Value *mvt_value) { if (mvt_value->string_value) msFree(mvt_value->string_value); } static void freeMvtLayer(VectorTile__Tile__Layer *mvt_layer) { if (mvt_layer->keys) { for (unsigned i = 0; i < mvt_layer->n_keys; i++) { msFree(mvt_layer->keys[i]); } msFree(mvt_layer->keys); } if (mvt_layer->values) { for (unsigned i = 0; i < mvt_layer->n_values; i++) { freeMvtValue(mvt_layer->values[i]); msFree(mvt_layer->values[i]); } msFree(mvt_layer->values); } if (mvt_layer->features) { for (unsigned i = 0; i < mvt_layer->n_features; i++) { freeMvtFeature(mvt_layer->features[i]); msFree(mvt_layer->features[i]); } msFree(mvt_layer->features); } } int mvtWriteShape(layerObj *layer, shapeObj *shape, VectorTile__Tile__Layer *mvt_layer, gmlItemListObj *item_list, value_lookup_table *value_lookup_cache, rectObj *unbuffered_bbox, int buffer) { VectorTile__Tile__Feature *mvt_feature; int i, j, iout; value_lookup *value; long int n_geometry; /* could consider an intersection test here */ if (mvtTransformShape(shape, unbuffered_bbox, layer->type, mvt_layer->extent) != MS_SUCCESS) { return MS_SUCCESS; /* degenerate shape */ } if (mvtClipShape(shape, layer->type, buffer, mvt_layer->extent) != MS_SUCCESS) { return MS_SUCCESS; /* no features left after clipping */ } n_geometry = 0; if (layer->type == MS_LAYER_POINT) { for (i = 0; i < shape->numlines; i++) n_geometry += shape->line[i].numpoints * 2; if (n_geometry) n_geometry++; /* one MOVETO */ } else if (layer->type == MS_LAYER_LINE) { for (i = 0; i < shape->numlines; i++) if (shape->line[i].numpoints >= 2) n_geometry += 2 + shape->line[i].numpoints * 2; /* one MOVETO, one LINETO */ } else { /* MS_LAYER_POLYGON */ for (i = 0; i < shape->numlines; i++) if (shape->line[i].numpoints >= 4) n_geometry += 3 + (shape->line[i].numpoints - 1) * 2; /* one MOVETO, one LINETO, one CLOSEPATH (don't consider last duplicate point) */ } if (n_geometry == 0) return MS_SUCCESS; mvt_layer->features[mvt_layer->n_features++] = msSmallMalloc(sizeof(VectorTile__Tile__Feature)); mvt_feature = mvt_layer->features[mvt_layer->n_features - 1]; vector_tile__tile__feature__init(mvt_feature); mvt_feature->n_tags = mvt_layer->n_keys * 2; mvt_feature->tags = msSmallMalloc(mvt_feature->n_tags * sizeof(uint32_t)); mvt_feature->id = shape->index; mvt_feature->has_id = 1; if (layer->type == MS_LAYER_POLYGON) mvt_feature->type = VECTOR_TILE__TILE__GEOM_TYPE__POLYGON; else if (layer->type == MS_LAYER_LINE) mvt_feature->type = VECTOR_TILE__TILE__GEOM_TYPE__LINESTRING; else mvt_feature->type = VECTOR_TILE__TILE__GEOM_TYPE__POINT; mvt_feature->has_type = 1; /* output values */ for (i = 0, iout = 0; i < item_list->numitems; i++) { gmlItemObj *item = item_list->items + i; if (!item->visible) continue; UT_HASH_FIND_STR(value_lookup_cache->cache, shape->values[i], value); if (!value) { VectorTile__Tile__Value *mvt_value; value = msSmallMalloc(sizeof(value_lookup)); value->value = msStrdup(shape->values[i]); value->index = mvt_layer->n_values; mvt_layer->values = msSmallRealloc(mvt_layer->values, (++mvt_layer->n_values) * sizeof(VectorTile__Tile__Value *)); mvt_layer->values[mvt_layer->n_values - 1] = msSmallMalloc(sizeof(VectorTile__Tile__Value)); mvt_value = mvt_layer->values[mvt_layer->n_values - 1]; vector_tile__tile__value__init(mvt_value); if (item->type && EQUAL(item->type, "Integer")) { mvt_value->int_value = atoi(value->value); mvt_value->has_int_value = 1; } else if (item->type && EQUAL(item->type, "Long")) { /* signed */ mvt_value->sint_value = atol(value->value); mvt_value->has_sint_value = 1; } else if (item->type && EQUAL(item->type, "Real")) { mvt_value->float_value = atof(value->value); mvt_value->has_float_value = 1; } else if (item->type && EQUAL(item->type, "Boolean")) { if (EQUAL(value->value, "0") || EQUAL(value->value, "false")) mvt_value->bool_value = 0; else mvt_value->bool_value = 1; mvt_value->has_bool_value = 1; } else { mvt_value->string_value = msStrdup(value->value); } UT_HASH_ADD_KEYPTR(hh, value_lookup_cache->cache, value->value, strlen(value->value), value); } mvt_feature->tags[iout * 2] = iout; mvt_feature->tags[iout * 2 + 1] = value->index; iout++; } /* output geom */ mvt_feature->n_geometry = n_geometry; mvt_feature->geometry = msSmallMalloc(mvt_feature->n_geometry * sizeof(uint32_t)); if (layer->type == MS_LAYER_POINT) { int idx = 0, lastx = 0, lasty = 0; mvt_feature->geometry[idx++] = COMMAND(MOVETO, (mvt_feature->n_geometry - 1) / 2); for (i = 0; i < shape->numlines; i++) { for (j = 0; j < shape->line[i].numpoints; j++) { mvt_feature->geometry[idx++] = PARAMETER(MS_NINT(shape->line[i].point[j].x) - lastx); mvt_feature->geometry[idx++] = PARAMETER(MS_NINT(shape->line[i].point[j].y) - lasty); lastx = MS_NINT(shape->line[i].point[j].x); lasty = MS_NINT(shape->line[i].point[j].y); } } } else { /* MS_LAYER_LINE or MS_LAYER_POLYGON */ int numpoints; int idx = 0, lastx = 0, lasty = 0; for (i = 0; i < shape->numlines; i++) { if ((layer->type == MS_LAYER_LINE && !(shape->line[i].numpoints >= 2)) || (layer->type == MS_LAYER_POLYGON && !(shape->line[i].numpoints >= 4))) { continue; /* skip malformed parts */ } numpoints = (layer->type == MS_LAYER_LINE) ? shape->line[i].numpoints : (shape->line[i].numpoints - 1); /* don't consider last point for polygons */ for (j = 0; j < numpoints; j++) { if (j == 0) { mvt_feature->geometry[idx++] = COMMAND(MOVETO, 1); } else if (j == 1) { mvt_feature->geometry[idx++] = COMMAND(LINETO, numpoints - 1); } mvt_feature->geometry[idx++] = PARAMETER(MS_NINT(shape->line[i].point[j].x) - lastx); mvt_feature->geometry[idx++] = PARAMETER(MS_NINT(shape->line[i].point[j].y) - lasty); lastx = MS_NINT(shape->line[i].point[j].x); lasty = MS_NINT(shape->line[i].point[j].y); } if (layer->type == MS_LAYER_POLYGON) { mvt_feature->geometry[idx++] = COMMAND(CLOSEPATH, 1); } } } return MS_SUCCESS; } static void freeMvtTile(VectorTile__Tile *mvt_tile) { for (unsigned iLayer = 0; iLayer < mvt_tile->n_layers; iLayer++) { freeMvtLayer(mvt_tile->layers[iLayer]); msFree(mvt_tile->layers[iLayer]); } msFree(mvt_tile->layers); } int msMVTWriteTile(mapObj *map, int sendheaders) { int iLayer, retcode = MS_SUCCESS; unsigned len; void *buf; const char *mvt_extent = msGetOutputFormatOption(map->outputformat, "EXTENT", "4096"); const char *mvt_buffer = msGetOutputFormatOption(map->outputformat, "EDGE_BUFFER", "10"); int buffer = MS_ABS(atoi(mvt_buffer)); VectorTile__Tile mvt_tile = VECTOR_TILE__TILE__INIT; mvt_tile.layers = msSmallCalloc(map->numlayers, sizeof(VectorTile__Tile__Layer *)); /* make sure we have a scale and cellsize computed */ map->cellsize = MS_CELLSIZE(map->extent.minx, map->extent.maxx, map->width); msCalculateScale(map->extent, map->units, map->width, map->height, map->resolution, &map->scaledenom); /* expand the map->extent so it goes from pixel center (MapServer) to pixel * edge (OWS) */ map->extent.minx -= map->cellsize * 0.5; map->extent.maxx += map->cellsize * 0.5; map->extent.miny -= map->cellsize * 0.5; map->extent.maxy += map->cellsize * 0.5; for (iLayer = 0; iLayer < map->numlayers; iLayer++) { int status = MS_SUCCESS; layerObj *layer = GET_LAYER(map, iLayer); int i; shapeObj shape; gmlItemListObj *item_list = NULL; VectorTile__Tile__Layer *mvt_layer; value_lookup_table value_lookup_cache = {NULL}; value_lookup *cur_value_lookup, *tmp_value_lookup; rectObj rect; int nclasses = 0; int *classgroup = NULL; unsigned features_size = 0; if (!msLayerIsVisible(map, layer)) continue; if (layer->type != MS_LAYER_POINT && layer->type != MS_LAYER_POLYGON && layer->type != MS_LAYER_LINE) continue; status = msLayerOpen(layer); if (status != MS_SUCCESS) { retcode = status; goto layer_cleanup; } status = msLayerWhichItems( layer, MS_TRUE, NULL); /* we want all items - behaves like a query in that sense */ if (status != MS_SUCCESS) { retcode = status; goto layer_cleanup; } /* -------------------------------------------------------------------- */ /* Will we need to reproject? */ /* -------------------------------------------------------------------- */ layer->project = msProjectionsDiffer(&(layer->projection), &(map->projection)); rect = map->extent; if (layer->project) msProjectRect(&(map->projection), &(layer->projection), &rect); status = msLayerWhichShapes(layer, rect, MS_TRUE); if (status == MS_DONE) { /* no overlap - that's ok */ retcode = MS_SUCCESS; goto layer_cleanup; } else if (status != MS_SUCCESS) { retcode = status; goto layer_cleanup; } mvt_tile.layers[mvt_tile.n_layers++] = msSmallMalloc(sizeof(VectorTile__Tile__Layer)); mvt_layer = mvt_tile.layers[mvt_tile.n_layers - 1]; vector_tile__tile__layer__init(mvt_layer); mvt_layer->version = 2; mvt_layer->name = layer->name; mvt_layer->extent = MS_ABS(atoi(mvt_extent)); mvt_layer->has_extent = 1; /* -------------------------------------------------------------------- */ /* Create appropriate attributes on this layer. */ /* -------------------------------------------------------------------- */ item_list = msGMLGetItems(layer, "G"); assert(item_list->numitems == layer->numitems); mvt_layer->keys = msSmallMalloc(layer->numitems * sizeof(char *)); for (i = 0; i < layer->numitems; i++) { gmlItemObj *item = item_list->items + i; if (!item->visible) continue; if (item->alias) mvt_layer->keys[mvt_layer->n_keys++] = msStrdup(item->alias); else mvt_layer->keys[mvt_layer->n_keys++] = msStrdup(item->name); } /* -------------------------------------------------------------------- */ /* Setup joins if needed. This is likely untested. */ /* -------------------------------------------------------------------- */ if (layer->numjoins > 0) { int j; for (j = 0; j < layer->numjoins; j++) { status = msJoinConnect(layer, &(layer->joins[j])); if (status != MS_SUCCESS) { retcode = status; goto layer_cleanup; } } } /* -------------------------------------------------------------------- */ /* Setup classgroup if needed. */ /* -------------------------------------------------------------------- */ if (layer->classgroup && layer->numclasses > 0) classgroup = msAllocateValidClassGroups(layer, &nclasses); mvt_layer->features = msSmallCalloc(FEATURES_INCREMENT_SIZE, sizeof(VectorTile__Tile__Feature *)); features_size = FEATURES_INCREMENT_SIZE; msInitShape(&shape); i = 0; for (;;) { if (layer->resultcache) { status = (i < layer->resultcache->numresults) ? msLayerGetShape(layer, &shape, &(layer->resultcache->results[i])) : MS_DONE; i++; } else { status = msLayerNextShape(layer, &shape); } if (status != MS_SUCCESS) goto feature_cleanup; if (layer->numclasses > 0) { /* Should be equivalent to shape.classindex = * layer->resultcache->results[i].classindex; */ shape.classindex = msShapeGetClass(layer, map, &shape, classgroup, nclasses); /* Perform classification, and some annotation related magic. */ if (shape.classindex < 0) goto feature_cleanup; /* no matching CLASS found, skip this feature */ } /* ** prepare any necessary JOINs here (one-to-one only) */ if (layer->numjoins > 0) { int j; for (j = 0; j < layer->numjoins; j++) { if (layer->joins[j].type == MS_JOIN_ONE_TO_ONE) { msJoinPrepare(&(layer->joins[j]), &shape); msJoinNext(&(layer->joins[j])); /* fetch the first row */ } } } if (mvt_layer->n_features == features_size) { /* need to allocate more space */ features_size += FEATURES_INCREMENT_SIZE; mvt_layer->features = msSmallRealloc( mvt_layer->features, sizeof(VectorTile__Tile__Feature *) * (features_size)); } if (layer->project) { if (layer->reprojectorLayerToMap == NULL) { layer->reprojectorLayerToMap = msProjectCreateReprojector(&layer->projection, &map->projection); } if (layer->reprojectorLayerToMap) status = msProjectShapeEx(layer->reprojectorLayerToMap, &shape); else status = MS_FAILURE; } if (status == MS_SUCCESS) { status = mvtWriteShape(layer, &shape, mvt_layer, item_list, &value_lookup_cache, &map->extent, buffer); } feature_cleanup: msFreeShape(&shape); if (status != MS_SUCCESS) goto layer_cleanup; } /* next shape */ layer_cleanup: if (classgroup) msFree(classgroup); msLayerClose(layer); msGMLFreeItems(item_list); UT_HASH_ITER(hh, value_lookup_cache.cache, cur_value_lookup, tmp_value_lookup) { msFree(cur_value_lookup->value); UT_HASH_DEL(value_lookup_cache.cache, cur_value_lookup); msFree(cur_value_lookup); } if (retcode != MS_SUCCESS) goto cleanup; } /* next layer */ len = vector_tile__tile__get_packed_size( &mvt_tile); // This is the calculated packing length buf = msSmallMalloc(len); // Allocate memory vector_tile__tile__pack(&mvt_tile, buf); if (sendheaders) { msIO_fprintf(stdout, "Content-Length: %d\r\n" "Content-Type: %s\r\n\r\n", len, MS_IMAGE_MIME_TYPE(map->outputformat)); } msIO_fwrite(buf, len, 1, stdout); msFree(buf); cleanup: freeMvtTile(&mvt_tile); return retcode; } int msPopulateRendererVTableMVT(rendererVTableObj *renderer) { (void)renderer; return MS_SUCCESS; } #else int msPopulateRendererVTableMVT(rendererVTableObj *renderer) { (void)renderer; msSetError(MS_MISCERR, "Vector Tile Driver requested but support is not compiled in", "msPopulateRendererVTableMVT()"); return MS_FAILURE; } int msMVTWriteTile(mapObj *map, int sendheaders) { (void)map; (void)sendheaders; msSetError(MS_MISCERR, "Vector Tile support is not available.", "msMVTWriteTile()"); return MS_FAILURE; } #endif mapserver-8.6.0/src/mapobject.c000066400000000000000000000637731511405061000164410ustar00rootroot00000000000000/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: Functions for operating on a mapObj that don't belong in a * more specific file such as mapfile.c, or mapdraw.c. * Author: Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2004, Frank Warmerdam * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/ #include "mapserver.h" #include "mapows.h" #include "gdal.h" #include "cpl_conv.h" void freeWeb(webObj *web); void freeScalebar(scalebarObj *scalebar); void freeReferenceMap(referenceMapObj *ref); void freeLegend(legendObj *legend); /************************************************************************/ /* msNewMapObj() */ /* */ /* Create a new initialized map object. */ /************************************************************************/ mapObj *msNewMapObj() { mapObj *map = NULL; /* create an empty map, no layers etc... */ map = (mapObj *)calloc(1, sizeof(mapObj)); if (!map) { msSetError(MS_MEMERR, NULL, "msCreateMap()"); return NULL; } if (initMap(map) == -1) { msFreeMap(map); return NULL; } if (msPostMapParseOutputFormatSetup(map) == MS_FAILURE) { msFreeMap(map); return NULL; } return map; } /************************************************************************/ /* msFreeMap() */ /************************************************************************/ void msFreeMap(mapObj *map) { int i; if (!map) return; /* printf("msFreeMap(): maybe freeing map at %p count=%d.\n",map, * map->refcount); */ if (MS_REFCNT_DECR_IS_NOT_ZERO(map)) { return; } if (map->debug >= MS_DEBUGLEVEL_VV) msDebug("msFreeMap(): freeing map at %p.\n", map); msCloseConnections(map); msFree(map->name); msFree(map->shapepath); msFree(map->mappath); msFreeProjection(&(map->projection)); msFreeProjection(&(map->latlon)); msProjectionContextReleaseToPool(map->projContext); msFreeLabelCache(&(map->labelcache)); msFree(map->imagetype); msFreeFontSet(&(map->fontset)); msFreeSymbolSet(&map->symbolset); /* free symbols */ msFree(map->symbolset.filename); freeWeb(&(map->web)); freeScalebar(&(map->scalebar)); freeReferenceMap(&(map->reference)); freeLegend(&(map->legend)); for (i = 0; i < map->maxlayers; i++) { if (GET_LAYER(map, i) != NULL) { GET_LAYER(map, i)->map = NULL; if (freeLayer((GET_LAYER(map, i))) == MS_SUCCESS) free(GET_LAYER(map, i)); } } msFree(map->layers); if (map->layerorder) free(map->layerorder); msFree(map->templatepattern); msFree(map->datapattern); msFreeHashItems(&(map->configoptions)); if (map->outputformat && map->outputformat->refcount > 0 && --map->outputformat->refcount < 1) msFreeOutputFormat(map->outputformat); for (i = 0; i < map->numoutputformats; i++) { if (map->outputformatlist[i]->refcount > 0 && --map->outputformatlist[i]->refcount < 1) msFreeOutputFormat(map->outputformatlist[i]); } if (map->outputformatlist != NULL) msFree(map->outputformatlist); msFreeQuery(&(map->query)); #ifdef USE_V8_MAPSCRIPT if (map->v8context) msV8FreeContext(map); #endif msFree(map); } /************************************************************************/ /* msGetConfigOption() */ /************************************************************************/ const char *msGetConfigOption(mapObj *map, const char *key) { return msLookupHashTable(&(map->configoptions), key); } /************************************************************************/ /* msSetConfigOption() */ /************************************************************************/ int msSetConfigOption(mapObj *map, const char *key, const char *value) { /* We have special "early" handling of this so that it will be */ /* in effect when the projection blocks are parsed and pj_init is called. */ if (strcasecmp(key, "PROJ_DATA") == 0 || strcasecmp(key, "PROJ_LIB") == 0) { /* value may be relative to map path */ msSetPROJ_DATA(value, map->mappath); } /* Same for MS_ERRORFILE, we want it to kick in as early as possible * to catch parsing errors. * Value can be relative to mapfile, unless it's already absolute */ if (strcasecmp(key, "MS_ERRORFILE") == 0) { if (msSetErrorFile(value, map->mappath) != MS_SUCCESS) return MS_FAILURE; } if (msLookupHashTable(&(map->configoptions), key) != NULL) msRemoveHashTable(&(map->configoptions), key); msInsertHashTable(&(map->configoptions), key, value); return MS_SUCCESS; } /************************************************************************/ /* msTestConfigOption() */ /************************************************************************/ int msTestConfigOption(mapObj *map, const char *key, int default_result) { const char *result = msGetConfigOption(map, key); if (result == NULL) return default_result; if (strcasecmp(result, "YES") == 0 || strcasecmp(result, "ON") == 0 || strcasecmp(result, "TRUE") == 0) return MS_TRUE; else return MS_FALSE; } /************************************************************************/ /* msApplyMapConfigOptions() */ /************************************************************************/ void msApplyMapConfigOptions(mapObj *map) { const char *key; for (key = msFirstKeyFromHashTable(&(map->configoptions)); key != NULL; key = msNextKeyFromHashTable(&(map->configoptions), key)) { const char *value = msLookupHashTable(&(map->configoptions), key); if (strcasecmp(key, "PROJ_DATA") == 0 || strcasecmp(key, "PROJ_LIB") == 0) { msSetPROJ_DATA(value, map->mappath); } else if (strcasecmp(key, "MS_ERRORFILE") == 0) { msSetErrorFile(value, map->mappath); } else { CPLSetConfigOption(key, value); } } } /************************************************************************/ /* msMapIgnoreMissingData() */ /************************************************************************/ int msMapIgnoreMissingData(mapObj *map) { const char *result = msGetConfigOption(map, "ON_MISSING_DATA"); const int default_result = #ifndef IGNORE_MISSING_DATA MS_MISSING_DATA_FAIL; #else MS_MISSING_DATA_LOG; #endif if (result == NULL) return default_result; if (strcasecmp(result, "FAIL") == 0) return MS_MISSING_DATA_FAIL; else if (strcasecmp(result, "LOG") == 0) return MS_MISSING_DATA_LOG; else if (strcasecmp(result, "IGNORE") == 0) return MS_MISSING_DATA_IGNORE; return default_result; } /************************************************************************/ /* msMapSetExtent() */ /************************************************************************/ int msMapSetExtent(mapObj *map, double minx, double miny, double maxx, double maxy) { map->extent.minx = minx; map->extent.miny = miny; map->extent.maxx = maxx; map->extent.maxy = maxy; if (!MS_VALID_EXTENT(map->extent)) { msSetError(MS_MISCERR, "Given map extent is invalid. Check that it " "is in the form: minx, miny, maxx, maxy", "setExtent()"); return MS_FAILURE; } map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); /* if the map size is also set, recompute scale, ignore errors? */ if (map->width != -1 || map->height != -1) msCalculateScale(map->extent, map->units, map->width, map->height, map->resolution, &(map->scaledenom)); return msMapComputeGeotransform(map); } /************************************************************************/ /* msMapOffsetExtent() */ /************************************************************************/ int msMapOffsetExtent(mapObj *map, double x, double y) { return msMapSetExtent(map, map->extent.minx + x, map->extent.miny + y, map->extent.maxx + x, map->extent.maxy + y); } /************************************************************************/ /* msMapScaleExtent() */ /************************************************************************/ int msMapScaleExtent(mapObj *map, double zoomfactor, double minscaledenom, double maxscaledenom) { double geo_width, geo_height, center_x, center_y, md; if (zoomfactor <= 0.0) { msSetError(MS_MISCERR, "The given zoomfactor is invalid", "msMapScaleExtent()"); } geo_width = map->extent.maxx - map->extent.minx; geo_height = map->extent.maxy - map->extent.miny; center_x = map->extent.minx + geo_width * 0.5; center_y = map->extent.miny + geo_height * 0.5; geo_width *= zoomfactor; if (minscaledenom > 0 || maxscaledenom > 0) { /* ensure we are within the valid scale domain */ md = (map->width - 1) / (map->resolution * msInchesPerUnit(map->units, center_y)); if (minscaledenom > 0 && geo_width < minscaledenom * md) geo_width = minscaledenom * md; if (maxscaledenom > 0 && geo_width > maxscaledenom * md) geo_width = maxscaledenom * md; } geo_width *= 0.5; geo_height = geo_width * map->height / map->width; return msMapSetExtent(map, center_x - geo_width, center_y - geo_height, center_x + geo_width, center_y + geo_height); } /************************************************************************/ /* msMapSetCenter() */ /************************************************************************/ int msMapSetCenter(mapObj *map, pointObj *center) { return msMapOffsetExtent( map, center->x - (map->extent.minx + map->extent.maxx) * 0.5, center->y - (map->extent.miny + map->extent.maxy) * 0.5); } /************************************************************************/ /* msMapSetRotation() */ /************************************************************************/ int msMapSetRotation(mapObj *map, double rotation_angle) { map->gt.rotation_angle = rotation_angle; if (map->gt.rotation_angle != 0.0) map->gt.need_geotransform = MS_TRUE; else map->gt.need_geotransform = MS_FALSE; return msMapComputeGeotransform(map); } /************************************************************************/ /* msMapSetSize() */ /************************************************************************/ int msMapSetSize(mapObj *map, int width, int height) { map->width = width; map->height = height; return msMapComputeGeotransform(map); /* like SetRotation -- sean */ } /************************************************************************/ /* msMapComputeGeotransform() */ /************************************************************************/ extern int InvGeoTransform(double *gt_in, double *gt_out); int msMapComputeGeotransformEx(mapObj *map, double resolutionX, double resolutionY) { double rot_angle; double geo_width, geo_height, center_x, center_y; map->saved_extent = map->extent; rot_angle = map->gt.rotation_angle * MS_PI / 180.0; geo_width = map->extent.maxx - map->extent.minx; geo_height = map->extent.maxy - map->extent.miny; center_x = map->extent.minx + geo_width * 0.5; center_y = map->extent.miny + geo_height * 0.5; /* ** Per bug 1916 we have to adjust for the fact that map extents ** are based on the center of the edge pixels, not the outer ** edges as is expected in a geotransform. */ map->gt.geotransform[1] = cos(rot_angle) * resolutionX; map->gt.geotransform[2] = sin(rot_angle) * resolutionY; map->gt.geotransform[0] = center_x - (map->width * 0.5) * map->gt.geotransform[1] - (map->height * 0.5) * map->gt.geotransform[2]; map->gt.geotransform[4] = sin(rot_angle) * resolutionX; map->gt.geotransform[5] = -cos(rot_angle) * resolutionY; map->gt.geotransform[3] = center_y - (map->width * 0.5) * map->gt.geotransform[4] - (map->height * 0.5) * map->gt.geotransform[5]; if (InvGeoTransform(map->gt.geotransform, map->gt.invgeotransform)) return MS_SUCCESS; else return MS_FAILURE; } int msMapComputeGeotransform(mapObj *map) { /* Do we have all required parameters? */ if (map->extent.minx == map->extent.maxx || map->width <= 1 || map->height <= 1) return MS_FAILURE; const double geo_width = map->extent.maxx - map->extent.minx; const double geo_height = map->extent.maxy - map->extent.miny; return msMapComputeGeotransformEx(map, geo_width / (map->width - 1), geo_height / (map->height - 1)); } /************************************************************************/ /* msMapPixelToGeoref() */ /************************************************************************/ void msMapPixelToGeoref(mapObj *map, double *x, double *y) { (void)map; (void)x; (void)y; msSetError(MS_MISCERR, NULL, "msMapPixelToGeoref() not yet implemented"); } /************************************************************************/ /* msMapGeorefToPixel() */ /************************************************************************/ void msMapGeorefToPixel(mapObj *map, double *x, double *y) { (void)map; (void)x; (void)y; msSetError(MS_MISCERR, NULL, "msMapGeorefToPixel() not yet implemented"); } /************************************************************************/ /* msMapSetFakedExtent() */ /************************************************************************/ int msMapSetFakedExtent(mapObj *map) { int i; /* -------------------------------------------------------------------- */ /* Remember the original map extents so we can restore them */ /* later. */ /* -------------------------------------------------------------------- */ map->saved_extent = map->extent; /* -------------------------------------------------------------------- */ /* Set extents such that the bottom left corner is 0,0 and the */ /* top right is width,height. Note this is upside down from */ /* the normal sense of pixel/line coordinates, but we do this */ /* so that the normal "extent" concept of coordinates */ /* increasing to the right, and up is maintained (like in */ /* georeferenced coordinate systems). */ /* -------------------------------------------------------------------- */ map->extent.minx = 0; map->extent.maxx = map->width; map->extent.miny = 0; map->extent.maxy = map->height; map->cellsize = 1.0; /* -------------------------------------------------------------------- */ /* When we copy the geotransform into the projection object we */ /* have to flip it to account for the preceding upside-down */ /* coordinate system. */ /* -------------------------------------------------------------------- */ map->projection.gt = map->gt; map->projection.gt.geotransform[0] += map->height * map->gt.geotransform[2]; map->projection.gt.geotransform[3] += map->height * map->gt.geotransform[5]; map->projection.gt.geotransform[2] *= -1; map->projection.gt.geotransform[5] *= -1; for (i = 0; i < map->numlayers; i++) GET_LAYER(map, i)->project = MS_TRUE; return InvGeoTransform(map->projection.gt.geotransform, map->projection.gt.invgeotransform); } /************************************************************************/ /* msMapRestoreRealExtent() */ /************************************************************************/ int msMapRestoreRealExtent(mapObj *map) { map->projection.gt.need_geotransform = MS_FALSE; map->extent = map->saved_extent; map->cellsize = msAdjustExtent(&(map->extent), map->width, map->height); return MS_SUCCESS; } /************************************************************************/ /* msInsertLayer() */ /************************************************************************/ /* Returns the index at which the layer was inserted */ int msInsertLayer(mapObj *map, layerObj *layer, int nIndex) { if (!layer) { msSetError(MS_CHILDERR, "Can't insert a NULL Layer", "msInsertLayer()"); return -1; } /* Ensure there is room for a new layer */ if (map->numlayers == map->maxlayers) { if (msGrowMapLayers(map) == NULL) return -1; } /* msGrowMapLayers allocates the new layer which we don't need to do since we have 1 that we are inserting not sure if it is possible for this to be non null otherwise, but better to check since this function replaces the value */ if (map->layers[map->numlayers] != NULL) free(map->layers[map->numlayers]); /* Catch attempt to insert past end of layers array */ if (nIndex >= map->numlayers) { msSetError(MS_CHILDERR, "Cannot insert layer beyond index %d", "msInsertLayer()", map->numlayers - 1); return -1; } else if (nIndex < 0) { /* Insert at the end by default */ map->layerorder[map->numlayers] = map->numlayers; GET_LAYER(map, map->numlayers) = layer; GET_LAYER(map, map->numlayers)->index = map->numlayers; GET_LAYER(map, map->numlayers)->map = map; MS_REFCNT_INCR(layer); map->numlayers++; return map->numlayers - 1; } else { /* Move existing layers at the specified nIndex or greater */ /* to an index one higher */ int i; for (i = map->numlayers; i > nIndex; i--) { GET_LAYER(map, i) = GET_LAYER(map, i - 1); GET_LAYER(map, i)->index = i; } /* assign new layer to specified index */ GET_LAYER(map, nIndex) = layer; GET_LAYER(map, nIndex)->index = nIndex; GET_LAYER(map, nIndex)->map = map; /* adjust layers drawing order */ for (i = map->numlayers; i > nIndex; i--) { map->layerorder[i] = map->layerorder[i - 1]; if (map->layerorder[i] >= nIndex) map->layerorder[i]++; } for (i = 0; i < nIndex; i++) { if (map->layerorder[i] >= nIndex) map->layerorder[i]++; } map->layerorder[nIndex] = nIndex; /* increment number of layers and return */ MS_REFCNT_INCR(layer); map->numlayers++; return nIndex; } } /************************************************************************/ /* msRemoveLayer() */ /************************************************************************/ layerObj *msRemoveLayer(mapObj *map, int nIndex) { int i; int order_index; layerObj *layer; if (nIndex < 0 || nIndex >= map->numlayers) { msSetError(MS_CHILDERR, "Cannot remove Layer, invalid index %d", "msRemoveLayer()", nIndex); return NULL; } else { layer = GET_LAYER(map, nIndex); /* msCopyLayer(layer, (GET_LAYER(map, nIndex))); */ /* Iteratively copy the higher index layers down one index */ for (i = nIndex; i < map->numlayers - 1; i++) { /* freeLayer((GET_LAYER(map, i))); */ /* initLayer((GET_LAYER(map, i)), map); */ /* msCopyLayer(GET_LAYER(map, i), GET_LAYER(map, i+1)); */ GET_LAYER(map, i) = GET_LAYER(map, i + 1); GET_LAYER(map, i)->index = i; } /* Free the extra layer at the end */ /* freeLayer((GET_LAYER(map, map->numlayers-1))); */ GET_LAYER(map, map->numlayers - 1) = NULL; /* Adjust drawing order */ order_index = 0; for (i = 0; i < map->numlayers; i++) { if (map->layerorder[i] > nIndex) map->layerorder[i]--; if (map->layerorder[i] == nIndex) { order_index = i; break; } } for (i = order_index; i < map->numlayers - 1; i++) { map->layerorder[i] = map->layerorder[i + 1]; if (map->layerorder[i] > nIndex) map->layerorder[i]--; } /* decrement number of layers and return copy of removed layer */ map->numlayers--; layer->map = NULL; MS_REFCNT_DECR(layer); return layer; } } /* ** Move the layer's order for drawing purpose. Moving it up here ** will have the effect of drawing the layer earlier. */ int msMoveLayerUp(mapObj *map, int nLayerIndex) { int iCurrentIndex = -1; if (map && nLayerIndex < map->numlayers && nLayerIndex >= 0) { for (int i = 0; i < map->numlayers; i++) { if (map->layerorder[i] == nLayerIndex) { iCurrentIndex = i; break; } } if (iCurrentIndex >= 0) { /* we do not need to promote if it is the first one. */ if (iCurrentIndex == 0) return MS_FAILURE; map->layerorder[iCurrentIndex] = map->layerorder[iCurrentIndex - 1]; map->layerorder[iCurrentIndex - 1] = nLayerIndex; return MS_SUCCESS; } } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveLayerUp()", nLayerIndex); return MS_FAILURE; } /* ** Move the layer's order for drawing purpose. Moving it down here ** will have the effect of drawing the layer later. */ int msMoveLayerDown(mapObj *map, int nLayerIndex) { int iCurrentIndex = -1; if (map && nLayerIndex < map->numlayers && nLayerIndex >= 0) { for (int i = 0; i < map->numlayers; i++) { if (map->layerorder[i] == nLayerIndex) { iCurrentIndex = i; break; } } if (iCurrentIndex >= 0) { /* we do not need to demote if it is the last one. */ if (iCurrentIndex == map->numlayers - 1) return MS_FAILURE; map->layerorder[iCurrentIndex] = map->layerorder[iCurrentIndex + 1]; map->layerorder[iCurrentIndex + 1] = nLayerIndex; return MS_SUCCESS; } } msSetError(MS_CHILDERR, "Invalid index: %d", "msMoveLayerDown()", nLayerIndex); return MS_FAILURE; } /* ** Set the array used for the drawing order. The array passed must contain ** all the layer's index ordered by the drawing priority. ** Ex : for 3 layers in the map file, if ** panIndexes[0] = 2 ** panIndexes[1] = 0 ** panIndexes[2] = 1 ** will set the darwing order to layer 2, layer 0, ** and then layer 1. ** ** Note : It is assumed that the index panIndexes has the same number of ** of elements as the number of layers in the map. ** Return TRUE on success else FALSE. */ int msSetLayersdrawingOrder(mapObj *self, int *panIndexes) { if (self && panIndexes) { const int nElements = self->numlayers; for (int i = 0; i < nElements; i++) { int bFound = 0; for (int j = 0; j < nElements; j++) { if (panIndexes[j] == i) { bFound = 1; break; } } if (!bFound) return 0; } /* -------------------------------------------------------------------- */ /* At this point the array is valid so update the layers order array.*/ /* -------------------------------------------------------------------- */ for (int i = 0; i < nElements; i++) { self->layerorder[i] = panIndexes[i]; } return 1; } return 0; } /* ========================================================================= msMapLoadOWSParameters Function to support mapscript mapObj::loadOWSParameters ========================================================================= */ int msMapLoadOWSParameters(mapObj *map, cgiRequestObj *request, const char *wmtver) { #ifdef USE_WMS_SVR int version; char *wms_exception_format = NULL; const char *wms_request = NULL; int result, i = 0; owsRequestObj ows_request; msOWSInitRequestObj(&ows_request); version = msOWSParseVersionString(wmtver); for (i = 0; i < request->NumParams; i++) { if (strcasecmp(request->ParamNames[i], "EXCEPTIONS") == 0) wms_exception_format = request->ParamValues[i]; else if (strcasecmp(request->ParamNames[i], "REQUEST") == 0) wms_request = request->ParamValues[i]; } msOWSRequestLayersEnabled(map, "M", wms_request, &ows_request); result = msWMSLoadGetMapParams( map, version, request->ParamNames, request->ParamValues, request->NumParams, wms_exception_format, wms_request, &ows_request); msOWSClearRequestObj(&ows_request); return result; #else msSetError(MS_WMSERR, "WMS server support is not available.", "msMapLoadOWSParameters()"); return MS_FAILURE; #endif } mapserver-8.6.0/src/mapogcapi.cpp000066400000000000000000002133701511405061000167630ustar00rootroot00000000000000/********************************************************************** * $id$ * * Project: MapServer * Purpose: OGCAPI Implementation * Author: Steve Lime and the MapServer team. * ********************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapserver.h" #include "mapogcapi.h" #include "mapows.h" #include "mapgml.h" #include "maptime.h" #include "mapogcfilter.h" #include "cpl_conv.h" #include "third-party/include_nlohmann_json.hpp" #include "third-party/include_pantor_inja.hpp" #include #include #include #include #include using namespace inja; using json = nlohmann::json; #define OGCAPI_DEFAULT_TITLE "MapServer OGC API" /* ** HTML Templates */ #define OGCAPI_TEMPLATE_HTML_LANDING "landing.html" #define OGCAPI_TEMPLATE_HTML_CONFORMANCE "conformance.html" #define OGCAPI_TEMPLATE_HTML_COLLECTION "collection.html" #define OGCAPI_TEMPLATE_HTML_COLLECTIONS "collections.html" #define OGCAPI_TEMPLATE_HTML_COLLECTION_ITEMS "collection-items.html" #define OGCAPI_TEMPLATE_HTML_COLLECTION_ITEM "collection-item.html" #define OGCAPI_TEMPLATE_HTML_OPENAPI "openapi.html" #define OGCAPI_DEFAULT_LIMIT 10 // by specification #define OGCAPI_MAX_LIMIT 10000 #define OGCAPI_DEFAULT_GEOMETRY_PRECISION 6 constexpr const char *EPSG_PREFIX_URL = "http://www.opengis.net/def/crs/EPSG/0/"; constexpr const char *CRS84_URL = "http://www.opengis.net/def/crs/OGC/1.3/CRS84"; #ifdef USE_OGCAPI_SVR /* ** Returns a JSON object using and a description. */ void msOGCAPIOutputError(OGCAPIErrorType errorType, const std::string &description) { const char *code = ""; const char *status = ""; switch (errorType) { case OGCAPI_SERVER_ERROR: { code = "ServerError"; status = "500"; break; } case OGCAPI_CONFIG_ERROR: { code = "ConfigError"; status = "500"; break; } case OGCAPI_PARAM_ERROR: { code = "InvalidParameterValue"; status = "400"; break; } case OGCAPI_NOT_FOUND_ERROR: { code = "NotFound"; status = "404"; break; } } json j = {{"code", code}, {"description", description}}; msIO_setHeader("Content-Type", "%s", OGCAPI_MIMETYPE_JSON); msIO_setHeader("Status", "%s", status); msIO_sendHeaders(); msIO_printf("%s\n", j.dump().c_str()); } static int includeLayer(mapObj *map, layerObj *layer) { if (!msOWSRequestIsEnabled(map, layer, "AO", "OGCAPI", MS_FALSE) || !msIsLayerSupportedForWFSOrOAPIF(layer) || !msIsLayerQueryable(layer)) { return MS_FALSE; } else { return MS_TRUE; } } /* ** Get stuff... */ /* ** Returns the value associated with an item from the request's query string and *NULL if the item was not found. */ static const char *getRequestParameter(cgiRequestObj *request, const char *item) { int i; for (i = 0; i < request->NumParams; i++) { if (strcmp(item, request->ParamNames[i]) == 0) return request->ParamValues[i]; } return NULL; } static int getMaxLimit(mapObj *map, layerObj *layer) { int max_limit = OGCAPI_MAX_LIMIT; const char *value; // check metadata, layer then map value = msOWSLookupMetadata(&(layer->metadata), "A", "max_limit"); if (value == NULL) value = msOWSLookupMetadata(&(map->web.metadata), "A", "max_limit"); if (value != NULL) { int status = msStringToInt(value, &max_limit, 10); if (status != MS_SUCCESS) max_limit = OGCAPI_MAX_LIMIT; // conversion failed } return max_limit; } static int getDefaultLimit(mapObj *map, layerObj *layer) { int default_limit = OGCAPI_DEFAULT_LIMIT; // check metadata, layer then map const char *value = msOWSLookupMetadata(&(layer->metadata), "A", "default_limit"); if (value == NULL) value = msOWSLookupMetadata(&(map->web.metadata), "A", "default_limit"); if (value != NULL) { int status = msStringToInt(value, &default_limit, 10); if (status != MS_SUCCESS) default_limit = OGCAPI_DEFAULT_LIMIT; // conversion failed } return default_limit; } static std::string getExtraParameters(mapObj *map, layerObj *layer) { std::string extra_params; // first check layer metadata if layer is not null if (layer) { const char *layerVal = msOWSLookupMetadata(&(layer->metadata), "AO", "extra_params"); if (layerVal) // only check for null extra_params = std::string("&") + layerVal; } if (extra_params.empty() && map) { const char *mapVal = msOWSLookupMetadata(&(map->web.metadata), "AO", "extra_params"); if (mapVal) extra_params = std::string("&") + mapVal; } return extra_params; } /* ** Returns the limit as an int - between 1 and getMaxLimit(). We always return a *valid value... */ static int getLimit(mapObj *map, cgiRequestObj *request, layerObj *layer, int *limit) { int status; const char *p; int max_limit; max_limit = getMaxLimit(map, layer); p = getRequestParameter(request, "limit"); if (!p || (p && strlen(p) == 0)) { // missing or empty *limit = MS_MIN(getDefaultLimit(map, layer), max_limit); // max could be smaller than the default } else { status = msStringToInt(p, limit, 10); if (status != MS_SUCCESS) return MS_FAILURE; if (*limit <= 0) { *limit = MS_MIN(getDefaultLimit(map, layer), max_limit); // max could be smaller than the default } else { *limit = MS_MIN(*limit, max_limit); } } return MS_SUCCESS; } // Return the content of the "crs" member of the /collections/{name} response static json getCrsList(mapObj *map, layerObj *layer) { char *pszSRSList = NULL; msOWSGetEPSGProj(&(layer->projection), &(layer->metadata), "AOF", MS_FALSE, &pszSRSList); if (!pszSRSList) msOWSGetEPSGProj(&(map->projection), &(map->web.metadata), "AOF", MS_FALSE, &pszSRSList); json jCrsList; if (pszSRSList) { const auto tokens = msStringSplit(pszSRSList, ' '); for (const auto &crs : tokens) { if (crs.find("EPSG:") == 0) { if (jCrsList.empty()) { jCrsList.push_back(CRS84_URL); } const std::string url = std::string(EPSG_PREFIX_URL) + crs.substr(strlen("EPSG:")); jCrsList.push_back(url); } } msFree(pszSRSList); } return jCrsList; } // Return the content of the "storageCrs" member of the /collections/{name} // response static std::string getStorageCrs(layerObj *layer) { std::string storageCrs; char *pszFirstSRS = nullptr; msOWSGetEPSGProj(&(layer->projection), &(layer->metadata), "AOF", MS_TRUE, &pszFirstSRS); if (pszFirstSRS) { if (std::string(pszFirstSRS).find("EPSG:") == 0) { storageCrs = std::string(EPSG_PREFIX_URL) + (pszFirstSRS + strlen("EPSG:")); } msFree(pszFirstSRS); } return storageCrs; } /* ** Returns the bbox in output CRS (CRS84 by default, or "crs" request parameter *when specified) */ static bool getBbox(mapObj *map, layerObj *layer, cgiRequestObj *request, rectObj *bbox, projectionObj *outputProj) { int status; const char *bboxParam = getRequestParameter(request, "bbox"); if (!bboxParam || strlen(bboxParam) == 0) { // missing or empty extent rectObj rect; if (FLTLayerSetInvalidRectIfSupported(layer, &rect, "AO")) { bbox->minx = rect.minx; bbox->miny = rect.miny; bbox->maxx = rect.maxx; bbox->maxy = rect.maxy; } else { // assign map->extent (no projection necessary) bbox->minx = map->extent.minx; bbox->miny = map->extent.miny; bbox->maxx = map->extent.maxx; bbox->maxy = map->extent.maxy; } } else { const auto tokens = msStringSplit(bboxParam, ','); if (tokens.size() != 4) { msOGCAPIOutputError(OGCAPI_PARAM_ERROR, "Bad value for bbox."); return false; } double values[4]; for (int i = 0; i < 4; i++) { status = msStringToDouble(tokens[i].c_str(), &values[i]); if (status != MS_SUCCESS) { msOGCAPIOutputError(OGCAPI_PARAM_ERROR, "Bad value for bbox."); return false; } } bbox->minx = values[0]; // assign bbox->miny = values[1]; bbox->maxx = values[2]; bbox->maxy = values[3]; // validate bbox is well-formed (degenerate is ok) if (MS_VALID_SEARCH_EXTENT(*bbox) != MS_TRUE) { msOGCAPIOutputError(OGCAPI_PARAM_ERROR, "Bad value for bbox."); return false; } std::string bboxCrs = "EPSG:4326"; bool axisInverted = false; // because above EPSG:4326 is meant to be OGC:CRS84 actually const char *bboxCrsParam = getRequestParameter(request, "bbox-crs"); if (bboxCrsParam) { bool isExpectedCrs = false; for (const auto &crsItem : getCrsList(map, layer)) { if (bboxCrsParam == crsItem.get()) { isExpectedCrs = true; break; } } if (!isExpectedCrs) { msOGCAPIOutputError(OGCAPI_PARAM_ERROR, "Bad value for bbox-crs."); return false; } if (std::string(bboxCrsParam) != CRS84_URL) { if (std::string(bboxCrsParam).find(EPSG_PREFIX_URL) == 0) { const char *code = bboxCrsParam + strlen(EPSG_PREFIX_URL); bboxCrs = std::string("EPSG:") + code; axisInverted = msIsAxisInverted(atoi(code)); } } } if (axisInverted) { std::swap(bbox->minx, bbox->miny); std::swap(bbox->maxx, bbox->maxy); } projectionObj bboxProj; msInitProjection(&bboxProj); msProjectionInheritContextFrom(&bboxProj, &(map->projection)); if (msLoadProjectionString(&bboxProj, bboxCrs.c_str()) != 0) { msFreeProjection(&bboxProj); msOGCAPIOutputError(OGCAPI_SERVER_ERROR, "Cannot process bbox-crs."); return false; } status = msProjectRect(&bboxProj, outputProj, bbox); msFreeProjection(&bboxProj); if (status != MS_SUCCESS) { msOGCAPIOutputError(OGCAPI_SERVER_ERROR, "Cannot reproject bbox from bbox-crs to output CRS."); return false; } } return true; } /* ** Returns the template directory location or NULL if it isn't set. */ std::string msOGCAPIGetTemplateDirectory(mapObj *map, const char *key, const char *envvar) { const char *directory = NULL; if (map != NULL) { directory = msOWSLookupMetadata(&(map->web.metadata), "A", key); } if (directory == NULL) { directory = CPLGetConfigOption(envvar, NULL); } std::string s; if (directory != NULL) { s = directory; if (!s.empty() && (s.back() != '/' && s.back() != '\\')) { // add a trailing slash if missing std::string slash = "/"; #ifdef _WIN32 slash = "\\"; #endif s += slash; } } return s; } /* ** Returns the service title from oga_{key} and/or ows_{key} or a default value *if not set. */ static const char *getWebMetadata(mapObj *map, const char *domain, const char *key, const char *defaultVal) { const char *value; if ((value = msOWSLookupMetadata(&(map->web.metadata), domain, key)) != NULL) return value; else return defaultVal; } /* ** Returns the service title from oga|ows_title or a default value if not set. */ static const char *getTitle(mapObj *map) { return getWebMetadata(map, "OA", "title", OGCAPI_DEFAULT_TITLE); } /* ** Returns the API root URL from oga_onlineresource or builds a value if not *set. */ std::string msOGCAPIGetApiRootUrl(mapObj *map, cgiRequestObj *request, const char *namespaces) { const char *root; if ((root = msOWSLookupMetadata(&(map->web.metadata), namespaces, "onlineresource")) != NULL) { return std::string(root); } std::string api_root; if (char *res = msBuildOnlineResource(NULL, request)) { api_root = res; free(res); // find last ogcapi in the string and strip the rest to get the root API std::size_t pos = api_root.rfind("ogcapi"); if (pos != std::string::npos) { api_root = api_root.substr(0, pos + std::string("ogcapi").size()); } else { // strip trailing '?' or '/' and append "/ogcapi" while (!api_root.empty() && (api_root.back() == '?' || api_root.back() == '/')) { api_root.pop_back(); } api_root += "/ogcapi"; } } if (api_root.empty()) { api_root = "/ogcapi"; } return api_root; } static json getFeatureConstant(const gmlConstantObj *constant) { json j; // empty (null) if (!constant) throw std::runtime_error("Null constant metadata."); if (!constant->value) return j; // initialize j = {{constant->name, constant->value}}; return j; } static json getFeatureItem(const gmlItemObj *item, const char *value) { json j; // empty (null) const char *key; if (!item) throw std::runtime_error("Null item metadata."); if (!item->visible) return j; if (item->alias) key = item->alias; else key = item->name; // initialize j = {{key, value}}; if (item->type && (EQUAL(item->type, "Date") || EQUAL(item->type, "DateTime") || EQUAL(item->type, "Time"))) { struct tm tm; if (msParseTime(value, &tm) == MS_TRUE) { char tmpValue[64]; if (EQUAL(item->type, "Date")) snprintf(tmpValue, sizeof(tmpValue), "%04d-%02d-%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); else if (EQUAL(item->type, "Time")) snprintf(tmpValue, sizeof(tmpValue), "%02d:%02d:%02dZ", tm.tm_hour, tm.tm_min, tm.tm_sec); else snprintf(tmpValue, sizeof(tmpValue), "%04d-%02d-%02dT%02d:%02d:%02dZ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); j = {{key, tmpValue}}; } } else if (item->type && (EQUAL(item->type, "Integer") || EQUAL(item->type, "Long"))) { try { j = {{key, std::stoll(value)}}; } catch (const std::exception &) { } } else if (item->type && EQUAL(item->type, "Real")) { try { j = {{key, std::stod(value)}}; } catch (const std::exception &) { } } else if (item->type && EQUAL(item->type, "Boolean")) { if (EQUAL(value, "0") || EQUAL(value, "false")) { j = {{key, false}}; } else { j = {{key, true}}; } } return j; } static double round_down(double value, int decimal_places) { const double multiplier = std::pow(10.0, decimal_places); return std::floor(value * multiplier) / multiplier; } // https://stackoverflow.com/questions/25925290/c-round-a-double-up-to-2-decimal-places static double round_up(double value, int decimal_places) { const double multiplier = std::pow(10.0, decimal_places); return std::ceil(value * multiplier) / multiplier; } static json getFeatureGeometry(shapeObj *shape, int precision, bool outputCrsAxisInverted) { json geometry; // empty (null) int *outerList = NULL, numOuterRings = 0; if (!shape) throw std::runtime_error("Null shape."); switch (shape->type) { case (MS_SHAPE_POINT): if (shape->numlines == 0 || shape->line[0].numpoints == 0) // not enough info for a point return geometry; if (shape->line[0].numpoints == 1) { geometry["type"] = "Point"; double x = shape->line[0].point[0].x; double y = shape->line[0].point[0].y; if (outputCrsAxisInverted) std::swap(x, y); geometry["coordinates"] = {round_up(x, precision), round_up(y, precision)}; } else { geometry["type"] = "MultiPoint"; geometry["coordinates"] = json::array(); for (int j = 0; j < shape->line[0].numpoints; j++) { double x = shape->line[0].point[j].x; double y = shape->line[0].point[j].y; if (outputCrsAxisInverted) std::swap(x, y); geometry["coordinates"].push_back( {round_up(x, precision), round_up(y, precision)}); } } break; case (MS_SHAPE_LINE): if (shape->numlines == 0 || shape->line[0].numpoints < 2) // not enough info for a line return geometry; if (shape->numlines == 1) { geometry["type"] = "LineString"; geometry["coordinates"] = json::array(); for (int j = 0; j < shape->line[0].numpoints; j++) { double x = shape->line[0].point[j].x; double y = shape->line[0].point[j].y; if (outputCrsAxisInverted) std::swap(x, y); geometry["coordinates"].push_back( {round_up(x, precision), round_up(y, precision)}); } } else { geometry["type"] = "MultiLineString"; geometry["coordinates"] = json::array(); for (int i = 0; i < shape->numlines; i++) { json part = json::array(); for (int j = 0; j < shape->line[i].numpoints; j++) { double x = shape->line[i].point[j].x; double y = shape->line[i].point[j].y; if (outputCrsAxisInverted) std::swap(x, y); part.push_back({round_up(x, precision), round_up(y, precision)}); } geometry["coordinates"].push_back(part); } } break; case (MS_SHAPE_POLYGON): if (shape->numlines == 0 || shape->line[0].numpoints < 4) // not enough info for a polygon (first=last) return geometry; outerList = msGetOuterList(shape); if (outerList == NULL) throw std::runtime_error("Unable to allocate list of outer rings."); for (int k = 0; k < shape->numlines; k++) { if (outerList[k] == MS_TRUE) numOuterRings++; } if (numOuterRings == 1) { geometry["type"] = "Polygon"; geometry["coordinates"] = json::array(); for (int i = 0; i < shape->numlines; i++) { json part = json::array(); for (int j = 0; j < shape->line[i].numpoints; j++) { double x = shape->line[i].point[j].x; double y = shape->line[i].point[j].y; if (outputCrsAxisInverted) std::swap(x, y); part.push_back({round_up(x, precision), round_up(y, precision)}); } geometry["coordinates"].push_back(part); } } else { geometry["type"] = "MultiPolygon"; geometry["coordinates"] = json::array(); for (int k = 0; k < shape->numlines; k++) { if (outerList[k] == MS_TRUE) { // outer ring: generate polygon and add to coordinates int *innerList = msGetInnerList(shape, k, outerList); if (innerList == NULL) { msFree(outerList); throw std::runtime_error("Unable to allocate list of inner rings."); } json polygon = json::array(); for (int i = 0; i < shape->numlines; i++) { if (i == k || innerList[i] == MS_TRUE) { // add outer ring (k) and any inner rings json part = json::array(); for (int j = 0; j < shape->line[i].numpoints; j++) { double x = shape->line[i].point[j].x; double y = shape->line[i].point[j].y; if (outputCrsAxisInverted) std::swap(x, y); part.push_back( {round_up(x, precision), round_up(y, precision)}); } polygon.push_back(part); } } msFree(innerList); geometry["coordinates"].push_back(polygon); } } } msFree(outerList); break; default: throw std::runtime_error("Invalid shape type."); break; } return geometry; } /* ** Return a GeoJSON representation of a shape. */ static json getFeature(layerObj *layer, shapeObj *shape, gmlItemListObj *items, gmlConstantListObj *constants, int geometry_precision, bool outputCrsAxisInverted) { int i; json feature; // empty (null) if (!layer || !shape) throw std::runtime_error("Null arguments."); // initialize feature = {{"type", "Feature"}, {"properties", json::object()}}; // id const char *featureIdItem = msOWSLookupMetadata(&(layer->metadata), "AGFO", "featureid"); if (featureIdItem == NULL) throw std::runtime_error( "Missing required featureid metadata."); // should have been trapped // earlier for (i = 0; i < items->numitems; i++) { if (strcasecmp(featureIdItem, items->items[i].name) == 0) { feature["id"] = shape->values[i]; break; } } if (i == items->numitems) throw std::runtime_error("Feature id not found."); // properties - build from items and constants, no group support for now for (int i = 0; i < items->numitems; i++) { try { json item = getFeatureItem(&(items->items[i]), shape->values[i]); if (!item.is_null()) feature["properties"].insert(item.begin(), item.end()); } catch (const std::runtime_error &) { throw std::runtime_error("Error fetching item."); } } for (int i = 0; i < constants->numconstants; i++) { try { json constant = getFeatureConstant(&(constants->constants[i])); if (!constant.is_null()) feature["properties"].insert(constant.begin(), constant.end()); } catch (const std::runtime_error &) { throw std::runtime_error("Error fetching constant."); } } // geometry try { json geometry = getFeatureGeometry(shape, geometry_precision, outputCrsAxisInverted); if (!geometry.is_null()) feature["geometry"] = std::move(geometry); } catch (const std::runtime_error &) { throw std::runtime_error("Error fetching geometry."); } return feature; } static json getLink(hashTableObj *metadata, const std::string &name) { json link; const char *href = msOWSLookupMetadata(metadata, "A", (name + "_href").c_str()); if (!href) throw std::runtime_error("Missing required link href property."); const char *title = msOWSLookupMetadata(metadata, "A", (name + "_title").c_str()); const char *type = msOWSLookupMetadata(metadata, "A", (name + "_type").c_str()); link = {{"href", href}, {"title", title ? title : href}, {"type", type ? type : "text/html"}}; return link; } static const char *getCollectionDescription(layerObj *layer) { const char *description = msOWSLookupMetadata(&(layer->metadata), "A", "description"); if (!description) description = msOWSLookupMetadata(&(layer->metadata), "OF", "abstract"); // fallback on abstract if (!description) description = ""; // finally // a // warning... return description; } static const char *getCollectionTitle(layerObj *layer) { const char *title = msOWSLookupMetadata(&(layer->metadata), "AOF", "title"); if (!title) title = layer->name; // revert to layer name if no title found return title; } static int getGeometryPrecision(mapObj *map, layerObj *layer) { int geometry_precision = OGCAPI_DEFAULT_GEOMETRY_PRECISION; if (msOWSLookupMetadata(&(layer->metadata), "AF", "geometry_precision")) { geometry_precision = atoi( msOWSLookupMetadata(&(layer->metadata), "AF", "geometry_precision")); } else if (msOWSLookupMetadata(&map->web.metadata, "AF", "geometry_precision")) { geometry_precision = atoi( msOWSLookupMetadata(&map->web.metadata, "AF", "geometry_precision")); } return geometry_precision; } static json getCollection(mapObj *map, layerObj *layer, OGCAPIFormat format, const std::string &api_root) { json collection; // empty (null) rectObj bbox; if (!map || !layer) return collection; if (!includeLayer(map, layer)) return collection; // initialize some things if (msOWSGetLayerExtent(map, layer, "AOF", &bbox) == MS_SUCCESS) { if (layer->projection.numargs > 0) msOWSProjectToWGS84(&layer->projection, &bbox); else if (map->projection.numargs > 0) msOWSProjectToWGS84(&map->projection, &bbox); else throw std::runtime_error( "Unable to transform bounding box, no projection defined."); } else { throw std::runtime_error( "Unable to get collection bounding box."); // might be too harsh since // extent is optional } const char *description = getCollectionDescription(layer); const char *title = getCollectionTitle(layer); const char *id = layer->name; char *id_encoded = msEncodeUrl(id); // free after use const int geometry_precision = getGeometryPrecision(map, layer); const std::string extra_params = getExtraParameters(map, layer); // build collection object collection = { {"id", id}, {"description", description}, {"title", title}, {"extent", {{"spatial", {{"bbox", {{round_down(bbox.minx, geometry_precision), round_down(bbox.miny, geometry_precision), round_up(bbox.maxx, geometry_precision), round_up(bbox.maxy, geometry_precision)}}}, {"crs", CRS84_URL}}}}}, {"links", {{{"rel", format == OGCAPIFormat::JSON ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_JSON}, {"title", "This collection as JSON"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "?f=json" + extra_params}}, {{"rel", format == OGCAPIFormat::HTML ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "This collection as HTML"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "?f=html" + extra_params}}, {{"rel", "items"}, {"type", OGCAPI_MIMETYPE_GEOJSON}, {"title", "Items for this collection as GeoJSON"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items?f=json" + extra_params}}, {{"rel", "items"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "Items for this collection as HTML"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items?f=html" + extra_params}} }}, {"itemType", "feature"}}; msFree(id_encoded); // done // handle optional configuration (keywords and links) const char *value = msOWSLookupMetadata(&(layer->metadata), "A", "keywords"); if (!value) value = msOWSLookupMetadata(&(layer->metadata), "OF", "keywordlist"); // fallback on keywordlist if (value) { std::vector keywords = msStringSplit(value, ','); for (const std::string &keyword : keywords) { collection["keywords"].push_back(keyword); } } value = msOWSLookupMetadata(&(layer->metadata), "A", "links"); if (value) { std::vector names = msStringSplit(value, ','); for (const std::string &name : names) { try { json link = getLink(&(layer->metadata), name); collection["links"].push_back(link); } catch (const std::runtime_error &e) { throw e; } } } // Part 2 - CRS support // Inspect metadata to set the "crs": [] member and "storageCrs" member json jCrsList = getCrsList(map, layer); if (!jCrsList.empty()) { collection["crs"] = std::move(jCrsList); std::string storageCrs = getStorageCrs(layer); if (!storageCrs.empty()) { collection["storageCrs"] = std::move(storageCrs); } } return collection; } /* ** Output stuff... */ void msOGCAPIOutputJson( const json &j, const char *mimetype, const std::map> &extraHeaders) { std::string js; try { js = j.dump(); } catch (...) { msOGCAPIOutputError(OGCAPI_CONFIG_ERROR, "Invalid UTF-8 data, check encoding."); return; } msIO_setHeader("Content-Type", "%s", mimetype); for (const auto &kvp : extraHeaders) { for (const auto &value : kvp.second) { msIO_setHeader(kvp.first.c_str(), "%s", value.c_str()); } } msIO_sendHeaders(); msIO_printf("%s\n", js.c_str()); } void msOGCAPIOutputTemplate(const char *directory, const char *filename, const json &j, const char *mimetype) { std::string _directory(directory); std::string _filename(filename); Environment env{_directory}; // catch // ERB-style instead of Mustache (we'll see) // env.set_expression("<%=", "%>"); // env.set_statement("<%", "%>"); // callbacks, need: // - match (regex) // - contains (substring) // - URL encode try { std::string js = j.dump(); } catch (...) { msOGCAPIOutputError(OGCAPI_CONFIG_ERROR, "Invalid UTF-8 data, check encoding."); return; } try { Template t = env.parse_template(_filename); // catch std::string result = env.render(t, j); msIO_setHeader("Content-Type", "%s", mimetype); msIO_sendHeaders(); msIO_printf("%s\n", result.c_str()); } catch (const inja::RenderError &e) { msOGCAPIOutputError(OGCAPI_CONFIG_ERROR, "Template rendering error. " + std::string(e.what()) + " (" + std::string(filename) + ")."); return; } catch (const inja::InjaError &e) { msOGCAPIOutputError(OGCAPI_CONFIG_ERROR, "InjaError error. " + std::string(e.what()) + " (" + std::string(filename) + ")." + " (" + std::string(directory) + ")."); return; } catch (...) { msOGCAPIOutputError(OGCAPI_SERVER_ERROR, "General template handling error."); return; } } /* ** Generic response output. */ static void outputResponse( mapObj *map, cgiRequestObj *request, OGCAPIFormat format, const char *filename, const json &response, const std::map> &extraHeaders = std::map>()) { std::string path; char fullpath[MS_MAXPATHLEN]; if (format == OGCAPIFormat::JSON) { msOGCAPIOutputJson(response, OGCAPI_MIMETYPE_JSON, extraHeaders); } else if (format == OGCAPIFormat::GeoJSON) { msOGCAPIOutputJson(response, OGCAPI_MIMETYPE_GEOJSON, extraHeaders); } else if (format == OGCAPIFormat::OpenAPI_V3) { msOGCAPIOutputJson(response, OGCAPI_MIMETYPE_OPENAPI_V3, extraHeaders); } else if (format == OGCAPIFormat::HTML) { path = msOGCAPIGetTemplateDirectory(map, "html_template_directory", "OGCAPI_HTML_TEMPLATE_DIRECTORY"); if (path.empty()) { msOGCAPIOutputError(OGCAPI_CONFIG_ERROR, "Template directory not set."); return; // bail } msBuildPath(fullpath, map->mappath, path.c_str()); json j; j["response"] = response; // nest the response so we could write the whole // object in the template // extend the JSON with a few things that we need for templating const std::string extra_params = getExtraParameters(map, nullptr); j["template"] = {{"path", json::array()}, {"params", json::object()}, {"api_root", msOGCAPIGetApiRootUrl(map, request)}, {"extra_params", extra_params}, {"title", getTitle(map)}, {"tags", json::object()}}; // api path for (int i = 0; i < request->api_path_length; i++) j["template"]["path"].push_back(request->api_path[i]); // parameters (optional) for (int i = 0; i < request->NumParams; i++) { if (request->ParamValues[i] && strlen(request->ParamValues[i]) > 0) { // skip empty params j["template"]["params"].update( {{request->ParamNames[i], request->ParamValues[i]}}); } } // add custom tags (optional) const char *tags = msOWSLookupMetadata(&(map->web.metadata), "A", "html_tags"); if (tags) { std::vector names = msStringSplit(tags, ','); for (std::string name : names) { const char *value = msOWSLookupMetadata(&(map->web.metadata), "A", ("tag_" + name).c_str()); if (value) { j["template"]["tags"].update({{name, value}}); // add object } } } msOGCAPIOutputTemplate(fullpath, filename, j, OGCAPI_MIMETYPE_HTML); } else { msOGCAPIOutputError(OGCAPI_PARAM_ERROR, "Unsupported format requested."); } } /* ** Process stuff... */ static int processLandingRequest(mapObj *map, cgiRequestObj *request, OGCAPIFormat format) { json response; // define ambiguous elements const char *description = msOWSLookupMetadata(&(map->web.metadata), "A", "description"); if (!description) description = msOWSLookupMetadata(&(map->web.metadata), "OF", "abstract"); // fallback on abstract if necessary const std::string extra_params = getExtraParameters(map, nullptr); // define api root url std::string api_root = msOGCAPIGetApiRootUrl(map, request); // build response object // - consider conditionally excluding links for HTML format response = { {"title", getTitle(map)}, {"description", description ? description : ""}, {"links", {{{"rel", format == OGCAPIFormat::JSON ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_JSON}, {"title", "This document as JSON"}, {"href", api_root + "?f=json" + extra_params}}, {{"rel", format == OGCAPIFormat::HTML ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "This document as HTML"}, {"href", api_root + "?f=html" + extra_params}}, {{"rel", "conformance"}, {"type", OGCAPI_MIMETYPE_JSON}, {"title", "OCG API conformance classes implemented by this server (JSON)"}, {"href", api_root + "/conformance?f=json" + extra_params}}, {{"rel", "conformance"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "OCG API conformance classes implemented by this server"}, {"href", api_root + "/conformance?f=html" + extra_params}}, {{"rel", "data"}, {"type", OGCAPI_MIMETYPE_JSON}, {"title", "Information about feature collections available from this " "server (JSON)"}, {"href", api_root + "/collections?f=json" + extra_params}}, {{"rel", "data"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "Information about feature collections available from this server"}, {"href", api_root + "/collections?f=html" + extra_params}}, {{"rel", "service-desc"}, {"type", OGCAPI_MIMETYPE_OPENAPI_V3}, {"title", "OpenAPI document"}, {"href", api_root + "/api?f=json" + extra_params}}, {{"rel", "service-doc"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "API documentation"}, {"href", api_root + "/api?f=html" + extra_params}}}}}; // handle custom links (optional) const char *links = msOWSLookupMetadata(&(map->web.metadata), "A", "links"); if (links) { std::vector names = msStringSplit(links, ','); for (std::string name : names) { try { json link = getLink(&(map->web.metadata), name); response["links"].push_back(link); } catch (const std::runtime_error &e) { msOGCAPIOutputError(OGCAPI_CONFIG_ERROR, std::string(e.what())); return MS_SUCCESS; } } } outputResponse(map, request, format, OGCAPI_TEMPLATE_HTML_LANDING, response); return MS_SUCCESS; } static int processConformanceRequest(mapObj *map, cgiRequestObj *request, OGCAPIFormat format) { json response; // build response object response = { {"conformsTo", { "http://www.opengis.net/spec/ogcapi-common-1/1.0/conf/core", "http://www.opengis.net/spec/ogcapi-common-2/1.0/conf/collections", "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/core", "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/oas30", "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/html", "http://www.opengis.net/spec/ogcapi-features-1/1.0/conf/geojson", "http://www.opengis.net/spec/ogcapi-features-2/1.0/conf/crs", }}}; outputResponse(map, request, format, OGCAPI_TEMPLATE_HTML_CONFORMANCE, response); return MS_SUCCESS; } static int processCollectionItemsRequest(mapObj *map, cgiRequestObj *request, const char *collectionId, const char *featureId, OGCAPIFormat format) { json response; int i; layerObj *layer; int limit; rectObj bbox; int numberMatched = 0; // find the right layer for (i = 0; i < map->numlayers; i++) { if (strcmp(map->layers[i]->name, collectionId) == 0) break; // match } if (i == map->numlayers) { // invalid collectionId msOGCAPIOutputError(OGCAPI_NOT_FOUND_ERROR, "Invalid collection."); return MS_SUCCESS; } layer = map->layers[i]; // for convenience layer->status = MS_ON; // force on (do we need to save and reset?) if (!includeLayer(map, layer)) { msOGCAPIOutputError(OGCAPI_NOT_FOUND_ERROR, "Invalid collection."); return MS_SUCCESS; } // // handle parameters specific to this endpoint // if (getLimit(map, request, layer, &limit) != MS_SUCCESS) { msOGCAPIOutputError(OGCAPI_PARAM_ERROR, "Bad value for limit."); return MS_SUCCESS; } std::string api_root = msOGCAPIGetApiRootUrl(map, request); const char *crs = getRequestParameter(request, "crs"); std::string outputCrs = "EPSG:4326"; bool outputCrsAxisInverted = false; // because above EPSG:4326 is meant to be OGC:CRS84 actually std::map> extraHeaders; if (crs) { bool isExpectedCrs = false; for (const auto &crsItem : getCrsList(map, layer)) { if (crs == crsItem.get()) { isExpectedCrs = true; break; } } if (!isExpectedCrs) { msOGCAPIOutputError(OGCAPI_PARAM_ERROR, "Bad value for crs."); return MS_SUCCESS; } extraHeaders["Content-Crs"].push_back('<' + std::string(crs) + '>'); if (std::string(crs) != CRS84_URL) { if (std::string(crs).find(EPSG_PREFIX_URL) == 0) { const char *code = crs + strlen(EPSG_PREFIX_URL); outputCrs = std::string("EPSG:") + code; outputCrsAxisInverted = msIsAxisInverted(atoi(code)); } } } else { extraHeaders["Content-Crs"].push_back('<' + std::string(CRS84_URL) + '>'); } struct ReprojectionObjects { reprojectionObj *reprojector = NULL; projectionObj proj; ReprojectionObjects() { msInitProjection(&proj); } ~ReprojectionObjects() { msProjectDestroyReprojector(reprojector); msFreeProjection(&proj); } int executeQuery(mapObj *map) { projectionObj backupMapProjection = map->projection; map->projection = proj; int ret = msExecuteQuery(map); map->projection = backupMapProjection; return ret; } }; ReprojectionObjects reprObjs; msProjectionInheritContextFrom(&reprObjs.proj, &(map->projection)); if (msLoadProjectionString(&reprObjs.proj, outputCrs.c_str()) != 0) { msOGCAPIOutputError(OGCAPI_SERVER_ERROR, "Cannot instantiate output CRS."); return MS_SUCCESS; } if (layer->projection.numargs > 0) { if (msProjectionsDiffer(&(layer->projection), &reprObjs.proj)) { reprObjs.reprojector = msProjectCreateReprojector(&(layer->projection), &reprObjs.proj); if (reprObjs.reprojector == NULL) { msOGCAPIOutputError(OGCAPI_SERVER_ERROR, "Error creating re-projector."); return MS_SUCCESS; } } } else if (map->projection.numargs > 0) { if (msProjectionsDiffer(&(map->projection), &reprObjs.proj)) { reprObjs.reprojector = msProjectCreateReprojector(&(map->projection), &reprObjs.proj); if (reprObjs.reprojector == NULL) { msOGCAPIOutputError(OGCAPI_SERVER_ERROR, "Error creating re-projector."); return MS_SUCCESS; } } } else { msOGCAPIOutputError( OGCAPI_CONFIG_ERROR, "Unable to transform geometries, no projection defined."); return MS_SUCCESS; } if (map->projection.numargs > 0) { msProjectRect(&(map->projection), &reprObjs.proj, &map->extent); } if (!getBbox(map, layer, request, &bbox, &reprObjs.proj)) { return MS_SUCCESS; } int offset = 0; if (featureId) { const char *featureIdItem = msOWSLookupMetadata(&(layer->metadata), "AGFO", "featureid"); if (featureIdItem == NULL) { msOGCAPIOutputError(OGCAPI_CONFIG_ERROR, "Missing required featureid metadata."); return MS_SUCCESS; } // TODO: does featureIdItem exist in the data? // optional validation const char *featureIdValidation = msLookupHashTable(&(layer->validation), featureIdItem); if (featureIdValidation && msValidateParameter(featureId, featureIdValidation, NULL, NULL, NULL) != MS_SUCCESS) { msOGCAPIOutputError(OGCAPI_NOT_FOUND_ERROR, "Invalid feature id."); return MS_SUCCESS; } map->query.type = MS_QUERY_BY_FILTER; map->query.mode = MS_QUERY_SINGLE; map->query.layer = i; map->query.rect = bbox; map->query.filteritem = strdup(featureIdItem); msInitExpression(&map->query.filter); map->query.filter.type = MS_STRING; map->query.filter.string = strdup(featureId); if (reprObjs.executeQuery(map) != MS_SUCCESS) { msOGCAPIOutputError(OGCAPI_NOT_FOUND_ERROR, "Collection items id query failed."); return MS_SUCCESS; } if (!layer->resultcache || layer->resultcache->numresults != 1) { msOGCAPIOutputError(OGCAPI_NOT_FOUND_ERROR, "Collection items id query failed."); return MS_SUCCESS; } } else { // bbox query map->query.type = MS_QUERY_BY_RECT; map->query.mode = MS_QUERY_MULTIPLE; map->query.layer = i; map->query.rect = bbox; map->query.only_cache_result_count = MS_TRUE; // get number matched if (reprObjs.executeQuery(map) != MS_SUCCESS) { msOGCAPIOutputError(OGCAPI_NOT_FOUND_ERROR, "Collection items query failed."); return MS_SUCCESS; } if (!layer->resultcache) { msOGCAPIOutputError(OGCAPI_NOT_FOUND_ERROR, "Collection items query failed."); return MS_SUCCESS; } numberMatched = layer->resultcache->numresults; if (numberMatched > 0) { map->query.only_cache_result_count = MS_FALSE; map->query.maxfeatures = limit; const char *offsetStr = getRequestParameter(request, "offset"); if (offsetStr) { if (msStringToInt(offsetStr, &offset, 10) != MS_SUCCESS) { msOGCAPIOutputError(OGCAPI_PARAM_ERROR, "Bad value for offset."); return MS_SUCCESS; } if (offset < 0 || offset >= numberMatched) { msOGCAPIOutputError(OGCAPI_PARAM_ERROR, "Offset out of range."); return MS_SUCCESS; } // msExecuteQuery() use a 1-based offset convention, whereas the API // uses a 0-based offset convention. map->query.startindex = 1 + offset; layer->startindex = 1 + offset; } if (reprObjs.executeQuery(map) != MS_SUCCESS || !layer->resultcache) { msOGCAPIOutputError(OGCAPI_NOT_FOUND_ERROR, "Collection items query failed."); return MS_SUCCESS; } } } const std::string extra_params = getExtraParameters(map, layer); // build response object if (!featureId) { const char *id = layer->name; char *id_encoded = msEncodeUrl(id); // free after use std::string extra_kvp = "&limit=" + std::to_string(limit); extra_kvp += "&offset=" + std::to_string(offset); std::string other_extra_kvp; if (crs) other_extra_kvp += "&crs=" + std::string(crs); const char *bbox = getRequestParameter(request, "bbox"); if (bbox) other_extra_kvp += "&bbox=" + std::string(bbox); const char *bboxCrs = getRequestParameter(request, "bbox-crs"); if (bboxCrs) other_extra_kvp += "&bbox-crs=" + std::string(bboxCrs); response = {{"type", "FeatureCollection"}, {"numberMatched", numberMatched}, {"numberReturned", layer->resultcache->numresults}, {"features", json::array()}, {"links", {{{"rel", format == OGCAPIFormat::JSON ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_GEOJSON}, {"title", "Items for this collection as GeoJSON"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items?f=json" + extra_kvp + other_extra_kvp + extra_params}}, {{"rel", format == OGCAPIFormat::HTML ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "Items for this collection as HTML"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items?f=html" + extra_kvp + other_extra_kvp + extra_params}}}}}; if (offset + layer->resultcache->numresults < numberMatched) { response["links"].push_back( {{"rel", "next"}, {"type", format == OGCAPIFormat::JSON ? OGCAPI_MIMETYPE_GEOJSON : OGCAPI_MIMETYPE_HTML}, {"title", "next page"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items?f=" + (format == OGCAPIFormat::JSON ? "json" : "html") + "&limit=" + std::to_string(limit) + "&offset=" + std::to_string(offset + limit) + other_extra_kvp + extra_params}}); } if (offset > 0) { response["links"].push_back( {{"rel", "prev"}, {"type", format == OGCAPIFormat::JSON ? OGCAPI_MIMETYPE_GEOJSON : OGCAPI_MIMETYPE_HTML}, {"title", "previous page"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items?f=" + (format == OGCAPIFormat::JSON ? "json" : "html") + "&limit=" + std::to_string(limit) + "&offset=" + std::to_string(MS_MAX(0, (offset - limit))) + other_extra_kvp + extra_params}}); } extraHeaders["OGC-NumberReturned"].push_back( std::to_string(layer->resultcache->numresults)); extraHeaders["OGC-NumberMatched"].push_back(std::to_string(numberMatched)); std::vector linksHeaders; for (auto &link : response["links"]) { linksHeaders.push_back("<" + link["href"].get() + ">; rel=\"" + link["rel"].get() + "\"; title=\"" + link["title"].get() + "\"; type=\"" + link["type"].get() + "\""); } extraHeaders["Link"] = std::move(linksHeaders); msFree(id_encoded); // done } // features (items) { shapeObj shape; msInitShape(&shape); // we piggyback on GML configuration gmlItemListObj *items = msGMLGetItems(layer, "AG"); gmlConstantListObj *constants = msGMLGetConstants(layer, "AG"); if (!items || !constants) { msGMLFreeItems(items); msGMLFreeConstants(constants); msOGCAPIOutputError(OGCAPI_SERVER_ERROR, "Error fetching layer attribute metadata."); return MS_SUCCESS; } const int geometry_precision = getGeometryPrecision(map, layer); for (i = 0; i < layer->resultcache->numresults; i++) { int status = msLayerGetShape(layer, &shape, &(layer->resultcache->results[i])); if (status != MS_SUCCESS) { msGMLFreeItems(items); msGMLFreeConstants(constants); msOGCAPIOutputError(OGCAPI_SERVER_ERROR, "Error fetching feature."); return MS_SUCCESS; } if (reprObjs.reprojector) { status = msProjectShapeEx(reprObjs.reprojector, &shape); if (status != MS_SUCCESS) { msGMLFreeItems(items); msGMLFreeConstants(constants); msFreeShape(&shape); msOGCAPIOutputError(OGCAPI_SERVER_ERROR, "Error reprojecting feature."); return MS_SUCCESS; } } try { json feature = getFeature(layer, &shape, items, constants, geometry_precision, outputCrsAxisInverted); if (featureId) { response = std::move(feature); } else { response["features"].emplace_back(std::move(feature)); } } catch (const std::runtime_error &e) { msGMLFreeItems(items); msGMLFreeConstants(constants); msFreeShape(&shape); msOGCAPIOutputError(OGCAPI_SERVER_ERROR, "Error getting feature. " + std::string(e.what())); return MS_SUCCESS; } msFreeShape(&shape); // next } msGMLFreeItems(items); // clean up msGMLFreeConstants(constants); } // extend the response a bit for templating (HERE) if (format == OGCAPIFormat::HTML) { const char *title = getCollectionTitle(layer); const char *id = layer->name; response["collection"] = {{"id", id}, {"title", title ? title : ""}}; } if (featureId) { const char *id = layer->name; char *id_encoded = msEncodeUrl(id); // free after use response["links"] = { {{"rel", format == OGCAPIFormat::JSON ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_GEOJSON}, {"title", "This document as GeoJSON"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items/" + featureId + "?f=json" + extra_params}}, {{"rel", format == OGCAPIFormat::HTML ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "This document as HTML"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "/items/" + featureId + "?f=html" + extra_params}}, {{"rel", "collection"}, {"type", OGCAPI_MIMETYPE_JSON}, {"title", "This collection as JSON"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "?f=json" + extra_params}}, {{"rel", "collection"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "This collection as HTML"}, {"href", api_root + "/collections/" + std::string(id_encoded) + "?f=html" + extra_params}}}; msFree(id_encoded); outputResponse( map, request, format == OGCAPIFormat::JSON ? OGCAPIFormat::GeoJSON : format, OGCAPI_TEMPLATE_HTML_COLLECTION_ITEM, response, extraHeaders); } else { outputResponse( map, request, format == OGCAPIFormat::JSON ? OGCAPIFormat::GeoJSON : format, OGCAPI_TEMPLATE_HTML_COLLECTION_ITEMS, response, extraHeaders); } return MS_SUCCESS; } static int processCollectionRequest(mapObj *map, cgiRequestObj *request, const char *collectionId, OGCAPIFormat format) { json response; int l; for (l = 0; l < map->numlayers; l++) { if (strcmp(map->layers[l]->name, collectionId) == 0) break; // match } if (l == map->numlayers) { // invalid collectionId msOGCAPIOutputError(OGCAPI_NOT_FOUND_ERROR, "Invalid collection."); return MS_SUCCESS; } try { response = getCollection(map, map->layers[l], format, msOGCAPIGetApiRootUrl(map, request)); if (response.is_null()) { // same as not found msOGCAPIOutputError(OGCAPI_NOT_FOUND_ERROR, "Invalid collection."); return MS_SUCCESS; } } catch (const std::runtime_error &e) { msOGCAPIOutputError(OGCAPI_CONFIG_ERROR, "Error getting collection. " + std::string(e.what())); return MS_SUCCESS; } outputResponse(map, request, format, OGCAPI_TEMPLATE_HTML_COLLECTION, response); return MS_SUCCESS; } static int processCollectionsRequest(mapObj *map, cgiRequestObj *request, OGCAPIFormat format) { json response; int i; // define api root url std::string api_root = msOGCAPIGetApiRootUrl(map, request); const std::string extra_params = getExtraParameters(map, nullptr); // build response object response = {{"links", {{{"rel", format == OGCAPIFormat::JSON ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_JSON}, {"title", "This document as JSON"}, {"href", api_root + "/collections?f=json" + extra_params}}, {{"rel", format == OGCAPIFormat::HTML ? "self" : "alternate"}, {"type", OGCAPI_MIMETYPE_HTML}, {"title", "This document as HTML"}, {"href", api_root + "/collections?f=html" + extra_params}}}}, {"collections", json::array()}}; for (i = 0; i < map->numlayers; i++) { try { json collection = getCollection(map, map->layers[i], format, api_root); if (!collection.is_null()) response["collections"].push_back(collection); } catch (const std::runtime_error &e) { msOGCAPIOutputError(OGCAPI_CONFIG_ERROR, "Error getting collection." + std::string(e.what())); return MS_SUCCESS; } } outputResponse(map, request, format, OGCAPI_TEMPLATE_HTML_COLLECTIONS, response); return MS_SUCCESS; } static int processApiRequest(mapObj *map, cgiRequestObj *request, OGCAPIFormat format) { // Strongly inspired from // https://github.com/geopython/pygeoapi/blob/master/pygeoapi/openapi.py json response; response = { {"openapi", "3.0.2"}, {"tags", json::array()}, }; response["info"] = { {"title", getTitle(map)}, {"version", getWebMetadata(map, "A", "version", "1.0.0")}, }; for (const char *item : {"description", "termsOfService"}) { const char *value = getWebMetadata(map, "AO", item, nullptr); if (value) { response["info"][item] = value; } } for (const auto &pair : { std::make_pair("name", "contactperson"), std::make_pair("url", "contacturl"), std::make_pair("email", "contactelectronicmailaddress"), }) { const char *value = getWebMetadata(map, "AO", pair.second, nullptr); if (value) { response["info"]["contact"][pair.first] = value; } } for (const auto &pair : { std::make_pair("name", "licensename"), std::make_pair("url", "licenseurl"), }) { const char *value = getWebMetadata(map, "AO", pair.second, nullptr); if (value) { response["info"]["license"][pair.first] = value; } } { const char *value = getWebMetadata(map, "AO", "keywords", nullptr); if (value) { response["info"]["x-keywords"] = value; } } json server; server["url"] = msOGCAPIGetApiRootUrl(map, request); { const char *value = getWebMetadata(map, "AO", "server_description", nullptr); if (value) { server["description"] = value; } } response["servers"].push_back(server); const std::string oapif_schema_base_url = msOWSGetSchemasLocation(map); const std::string oapif_yaml_url = oapif_schema_base_url + "/ogcapi/features/part1/1.0/openapi/" "ogcapi-features-1.yaml"; const std::string oapif_part2_yaml_url = oapif_schema_base_url + "/ogcapi/features/part2/1.0/openapi/" "ogcapi-features-2.yaml"; json paths; paths["/"]["get"] = { {"summary", "Landing page"}, {"description", "Landing page"}, {"tags", {"server"}}, {"operationId", "getLandingPage"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, }}, {"responses", {{"200", {{"$ref", oapif_yaml_url + "#/components/responses/LandingPage"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"500", {{"$ref", oapif_yaml_url + "#/components/responses/ServerError"}}}}}}; paths["/api"]["get"] = { {"summary", "API documentation"}, {"description", "API documentation"}, {"tags", {"server"}}, {"operationId", "getOpenapi"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, }}, {"responses", {{"200", {{"$ref", "#/components/responses/200"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"default", {{"$ref", "#/components/responses/default"}}}}}}; paths["/conformance"]["get"] = { {"summary", "API conformance definition"}, {"description", "API conformance definition"}, {"tags", {"server"}}, {"operationId", "getConformanceDeclaration"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, }}, {"responses", {{"200", {{"$ref", oapif_yaml_url + "#/components/responses/ConformanceDeclaration"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"500", {{"$ref", oapif_yaml_url + "#/components/responses/ServerError"}}}}}}; paths["/collections"]["get"] = { {"summary", "Collections"}, {"description", "Collections"}, {"tags", {"server"}}, {"operationId", "getCollections"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, }}, {"responses", {{"200", {{"$ref", oapif_yaml_url + "#/components/responses/Collections"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"500", {{"$ref", oapif_yaml_url + "#/components/responses/ServerError"}}}}}}; for (int i = 0; i < map->numlayers; i++) { layerObj *layer = map->layers[i]; if (!includeLayer(map, layer)) { continue; } json collection_get = { {"summary", std::string("Get ") + getCollectionTitle(layer) + " metadata"}, {"description", getCollectionDescription(layer)}, {"tags", {layer->name}}, {"operationId", "describe" + std::string(layer->name) + "Collection"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, }}, {"responses", {{"200", {{"$ref", oapif_yaml_url + "#/components/responses/Collection"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"500", {{"$ref", oapif_yaml_url + "#/components/responses/ServerError"}}}}}}; std::string collectionNamePath("/collections/"); collectionNamePath += layer->name; paths[collectionNamePath]["get"] = std::move(collection_get); // check metadata, layer then map const char *max_limit_str = msOWSLookupMetadata(&(layer->metadata), "A", "max_limit"); if (max_limit_str == nullptr) max_limit_str = msOWSLookupMetadata(&(map->web.metadata), "A", "max_limit"); const int max_limit = max_limit_str ? atoi(max_limit_str) : OGCAPI_MAX_LIMIT; const int default_limit = getDefaultLimit(map, layer); json items_get = { {"summary", std::string("Get ") + getCollectionTitle(layer) + " items"}, {"description", getCollectionDescription(layer)}, {"tags", {layer->name}}, {"operationId", "get" + std::string(layer->name) + "Features"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, {{"$ref", oapif_yaml_url + "#/components/parameters/bbox"}}, {{"$ref", oapif_yaml_url + "#/components/parameters/datetime"}}, {{"$ref", oapif_part2_yaml_url + "#/components/parameters/bbox-crs"}}, {{"$ref", oapif_part2_yaml_url + "#/components/parameters/crs"}}, {{"$ref", "#/components/parameters/offset"}}, {{"$ref", "#/components/parameters/vendorSpecificParameters"}}, }}, {"responses", {{"200", {{"$ref", oapif_yaml_url + "#/components/responses/Features"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"500", {{"$ref", oapif_yaml_url + "#/components/responses/ServerError"}}}}}}; json param_limit = { {"name", "limit"}, {"in", "query"}, {"description", "The optional limit parameter limits the number of " "items that are presented in the response document."}, {"required", false}, {"schema", { {"type", "integer"}, {"minimum", 1}, {"maximum", max_limit}, {"default", default_limit}, }}, {"style", "form"}, {"explode", false}, }; items_get["parameters"].emplace_back(param_limit); std::string itemsPath(collectionNamePath + "/items"); paths[itemsPath]["get"] = std::move(items_get); json feature_id_get = { {"summary", std::string("Get ") + getCollectionTitle(layer) + " item by id"}, {"description", getCollectionDescription(layer)}, {"tags", {layer->name}}, {"operationId", "get" + std::string(layer->name) + "Feature"}, {"parameters", { {{"$ref", "#/components/parameters/f"}}, {{"$ref", oapif_yaml_url + "#/components/parameters/featureId"}}, }}, {"responses", {{"200", {{"$ref", oapif_yaml_url + "#/components/responses/Feature"}}}, {"400", {{"$ref", oapif_yaml_url + "#/components/responses/InvalidParameter"}}}, {"404", {{"$ref", oapif_yaml_url + "#/components/responses/NotFound"}}}, {"500", {{"$ref", oapif_yaml_url + "#/components/responses/ServerError"}}}}}}; std::string itemsFeatureIdPath(collectionNamePath + "/items/{featureId}"); paths[itemsFeatureIdPath]["get"] = std::move(feature_id_get); } response["paths"] = std::move(paths); json components; components["responses"]["200"] = {{"description", "successful operation"}}; components["responses"]["default"] = { {"description", "unexpected error"}, {"content", {{"application/json", {{"schema", {{"$ref", "https://schemas.opengis.net/ogcapi/common/part1/1.0/" "openapi/schemas/exception.yaml"}}}}}}}}; json parameters; parameters["f"] = { {"name", "f"}, {"in", "query"}, {"description", "The optional f parameter indicates the output format " "which the server shall provide as part of the response " "document. The default format is GeoJSON."}, {"required", false}, {"schema", {{"type", "string"}, {"enum", {"json", "html"}}, {"default", "json"}}}, {"style", "form"}, {"explode", false}, }; parameters["offset"] = { {"name", "offset"}, {"in", "query"}, {"description", "The optional offset parameter indicates the index within the result " "set from which the server shall begin presenting results in the " "response document. The first element has an index of 0 (default)."}, {"required", false}, {"schema", { {"type", "integer"}, {"minimum", 0}, {"default", 0}, }}, {"style", "form"}, {"explode", false}, }; parameters["vendorSpecificParameters"] = { {"name", "vendorSpecificParameters"}, {"in", "query"}, {"description", "Additional \"free-form\" parameters that are not explicitly defined"}, {"schema", { {"type", "object"}, {"additionalProperties", true}, }}, {"style", "form"}, }; components["parameters"] = std::move(parameters); response["components"] = std::move(components); // TODO: "tags" array ? outputResponse(map, request, format == OGCAPIFormat::JSON ? OGCAPIFormat::OpenAPI_V3 : format, OGCAPI_TEMPLATE_HTML_OPENAPI, response); return MS_SUCCESS; } #endif OGCAPIFormat msOGCAPIGetOutputFormat(cgiRequestObj *request) { OGCAPIFormat format; // all endpoints need a format const char *p = getRequestParameter(request, "f"); // if f= query parameter is not specified, use HTTP Accept header if available if (p == nullptr) { const char *accept = getenv("HTTP_ACCEPT"); if (accept) { if (strcmp(accept, "*/*") == 0) p = OGCAPI_MIMETYPE_JSON; else p = accept; } } if (p && (strcmp(p, "json") == 0 || strstr(p, OGCAPI_MIMETYPE_JSON) != nullptr || strstr(p, OGCAPI_MIMETYPE_GEOJSON) != nullptr || strstr(p, OGCAPI_MIMETYPE_OPENAPI_V3) != nullptr)) { format = OGCAPIFormat::JSON; } else if (p && (strcmp(p, "html") == 0 || strstr(p, OGCAPI_MIMETYPE_HTML) != nullptr)) { format = OGCAPIFormat::HTML; } else if (p) { std::string errorMsg("Unsupported format requested: "); errorMsg += p; msOGCAPIOutputError(OGCAPI_PARAM_ERROR, errorMsg.c_str()); format = OGCAPIFormat::Invalid; } else { format = OGCAPIFormat::HTML; // default for now } return format; } int msOGCAPIDispatchRequest(mapObj *map, cgiRequestObj *request) { #ifdef USE_OGCAPI_SVR // make sure ogcapi requests are enabled for this map int status = msOWSRequestIsEnabled(map, NULL, "AO", "OGCAPI", MS_FALSE); if (status != MS_TRUE) { msSetError(MS_OGCAPIERR, "OGC API requests are not enabled.", "msCGIDispatchAPIRequest()"); return MS_FAILURE; // let normal error handling take over } for (int i = 0; i < request->NumParams; i++) { for (int j = i + 1; j < request->NumParams; j++) { if (strcmp(request->ParamNames[i], request->ParamNames[j]) == 0) { std::string errorMsg("Query parameter "); errorMsg += request->ParamNames[i]; errorMsg += " is repeated"; msOGCAPIOutputError(OGCAPI_PARAM_ERROR, errorMsg.c_str()); return MS_SUCCESS; } } } const OGCAPIFormat format = msOGCAPIGetOutputFormat(request); if (format == OGCAPIFormat::Invalid) { return MS_SUCCESS; // avoid any downstream MapServer processing } if (request->api_path_length == 2) { return processLandingRequest(map, request, format); } else if (request->api_path_length == 3) { if (strcmp(request->api_path[2], "conformance") == 0) { return processConformanceRequest(map, request, format); } else if (strcmp(request->api_path[2], "conformance.html") == 0) { return processConformanceRequest(map, request, OGCAPIFormat::HTML); } else if (strcmp(request->api_path[2], "collections") == 0) { return processCollectionsRequest(map, request, format); } else if (strcmp(request->api_path[2], "collections.html") == 0) { return processCollectionsRequest(map, request, OGCAPIFormat::HTML); } else if (strcmp(request->api_path[2], "api") == 0) { return processApiRequest(map, request, format); } } else if (request->api_path_length == 4) { if (strcmp(request->api_path[2], "collections") == 0) { // next argument (3) is collectionId return processCollectionRequest(map, request, request->api_path[3], format); } } else if (request->api_path_length == 5) { if (strcmp(request->api_path[2], "collections") == 0 && strcmp(request->api_path[4], "items") == 0) { // middle argument (3) is the collectionId return processCollectionItemsRequest(map, request, request->api_path[3], NULL, format); } } else if (request->api_path_length == 6) { if (strcmp(request->api_path[2], "collections") == 0 && strcmp(request->api_path[4], "items") == 0) { // middle argument (3) is the collectionId, last argument (5) // is featureId return processCollectionItemsRequest(map, request, request->api_path[3], request->api_path[5], format); } } msOGCAPIOutputError(OGCAPI_NOT_FOUND_ERROR, "Invalid API path."); return MS_SUCCESS; // avoid any downstream MapServer processing #else msSetError(MS_OGCAPIERR, "OGC API server support is not enabled.", "msOGCAPIDispatchRequest()"); return MS_FAILURE; #endif } mapserver-8.6.0/src/mapogcapi.h000066400000000000000000000057371511405061000164360ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: OGCAPI Implementation * Author: Steve Lime and the MapServer team. * ********************************************************************** * Copyright (c) 1996-2005 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #ifndef MAPOGCAPI_H #define MAPOGCAPI_H #ifdef __cplusplus extern "C" { #endif int msOGCAPIDispatchRequest(mapObj *map, cgiRequestObj *request); #ifdef __cplusplus } #include #include #include "third-party/include_nlohmann_json.hpp" #include "third-party/include_pantor_inja.hpp" // Error types typedef enum { OGCAPI_SERVER_ERROR = 0, OGCAPI_CONFIG_ERROR = 1, OGCAPI_PARAM_ERROR = 2, OGCAPI_NOT_FOUND_ERROR = 3, } OGCAPIErrorType; enum class OGCAPIFormat { JSON, GeoJSON, OpenAPI_V3, HTML, Invalid }; #define OGCAPI_MIMETYPE_JSON "application/json" #define OGCAPI_MIMETYPE_GEOJSON "application/geo+json" #define OGCAPI_MIMETYPE_OPENAPI_V3 \ "application/vnd.oai.openapi+json;version=3.0" #define OGCAPI_MIMETYPE_HTML "text/html" std::string msOGCAPIGetTemplateDirectory(mapObj *map, const char *key, const char *envvar); OGCAPIFormat msOGCAPIGetOutputFormat(cgiRequestObj *request); std::string msOGCAPIGetApiRootUrl(mapObj *map, cgiRequestObj *request, const char *namespaces = "AO"); void msOGCAPIOutputError(OGCAPIErrorType errorType, const std::string &description); void msOGCAPIOutputJson( const nlohmann::json &j, const char *mimetype, const std::map> &extraHeaders); void msOGCAPIOutputTemplate(const char *directory, const char *filename, const nlohmann::json &j, const char *mimetype); #endif #endif mapserver-8.6.0/src/mapogcfilter.cpp000066400000000000000000004166311511405061000175040ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: OGC Filter Encoding implementation * Author: Y. Assefa, DM Solutions Group (assefa@dmsolutions.ca) * ********************************************************************** * Copyright (c) 2003, Y. Assefa, DM Solutions Group Inc * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapserver-config.h" #include "cpl_minixml.h" #include "cpl_string.h" #include "mapogcfilter.h" #include "mapserver.h" #include "mapowscommon.h" #include "maptime.h" #include "mapows.h" #include #if 0 static int FLTHasUniqueTopLevelDuringFilter(FilterEncodingNode *psFilterNode); #endif #if !(defined(_WIN32) && !defined(__CYGWIN__)) static inline void IGUR_double(double ignored) { (void)ignored; } /* Ignore GCC Unused Result */ #endif int FLTIsNumeric(const char *pszValue) { if (pszValue != NULL && *pszValue != '\0' && !isspace(*pszValue)) { /*the regex seems to have a problem on windows when mapserver is built using PHP regex*/ #if defined(_WIN32) && !defined(__CYGWIN__) int i = 0, nLength = 0, bString = 0; nLength = strlen(pszValue); for (i = 0; i < nLength; i++) { if (i == 0) { if (!isdigit(pszValue[i]) && pszValue[i] != '-') { bString = 1; break; } } else if (!isdigit(pszValue[i]) && pszValue[i] != '.') { bString = 1; break; } } if (!bString) return MS_TRUE; #else char *p; IGUR_double(strtod(pszValue, &p)); if (p != pszValue && *p == '\0') return MS_TRUE; #endif } return MS_FALSE; } /* ** Apply an expression to the layer's filter element. ** */ int FLTApplyExpressionToLayer(layerObj *lp, const char *pszExpression) { char *pszFinalExpression = NULL, *pszBuffer = NULL; /*char *escapedTextString=NULL;*/ int bConcatWhere = 0, bHasAWhere = 0; if (lp && pszExpression) { if (lp->connectiontype == MS_POSTGIS || lp->connectiontype == MS_ORACLESPATIAL || lp->connectiontype == MS_PLUGIN) { pszFinalExpression = msStrdup("("); pszFinalExpression = msStringConcatenate(pszFinalExpression, pszExpression); pszFinalExpression = msStringConcatenate(pszFinalExpression, ")"); } else if (lp->connectiontype == MS_OGR) { pszFinalExpression = msStrdup(pszExpression); if (lp->filter.type != MS_EXPRESSION) { bConcatWhere = 1; } else { if (lp->filter.string && EQUALN(lp->filter.string, "WHERE ", 6)) { bHasAWhere = 1; bConcatWhere = 1; } } } else pszFinalExpression = msStrdup(pszExpression); if (bConcatWhere) pszBuffer = msStringConcatenate(pszBuffer, "WHERE "); /* if the filter is set and it's an expression type, concatenate it with this filter. If not just free it */ if (lp->filter.string && lp->filter.type == MS_EXPRESSION) { pszBuffer = msStringConcatenate(pszBuffer, "(("); if (bHasAWhere) pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string + 6); else pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string); pszBuffer = msStringConcatenate(pszBuffer, ") and "); } else if (lp->filter.string) msFreeExpression(&lp->filter); pszBuffer = msStringConcatenate(pszBuffer, pszFinalExpression); if (lp->filter.string && lp->filter.type == MS_EXPRESSION) pszBuffer = msStringConcatenate(pszBuffer, ")"); /*assuming that expression was properly escaped escapedTextString = msStringEscape(pszBuffer); msLoadExpressionString(&lp->filter, (char*)CPLSPrintf("%s", escapedTextString)); msFree(escapedTextString); */ msLoadExpressionString(&lp->filter, pszBuffer); msFree(pszFinalExpression); if (pszBuffer) msFree(pszBuffer); return MS_TRUE; } return MS_FALSE; } char *FLTGetExpressionForValuesRanges(layerObj *lp, const char *item, const char *value, int forcecharcter) { int bIscharacter; char *pszExpression = NULL, *pszTmpExpression = NULL; char **paszElements = NULL, **papszRangeElements = NULL; int numelements, i, nrangeelements; /* double minval, maxval; */ if (lp && item && value) { if (strstr(value, "/") == NULL) { /*value(s)*/ paszElements = msStringSplit(value, ',', &numelements); if (paszElements && numelements > 0) { if (forcecharcter) bIscharacter = MS_TRUE; else bIscharacter = !FLTIsNumeric(paszElements[0]); pszTmpExpression = msStringConcatenate(pszTmpExpression, "("); for (i = 0; i < numelements; i++) { pszTmpExpression = msStringConcatenate(pszTmpExpression, "("); { if (bIscharacter) pszTmpExpression = msStringConcatenate(pszTmpExpression, "\""); pszTmpExpression = msStringConcatenate(pszTmpExpression, "["); pszTmpExpression = msStringConcatenate(pszTmpExpression, item); pszTmpExpression = msStringConcatenate(pszTmpExpression, "]"); if (bIscharacter) pszTmpExpression = msStringConcatenate(pszTmpExpression, "\""); } if (bIscharacter) { pszTmpExpression = msStringConcatenate(pszTmpExpression, " = \""); } else pszTmpExpression = msStringConcatenate(pszTmpExpression, " = "); { char *pszEscapedStr = msLayerEscapeSQLParam(lp, paszElements[i]); pszTmpExpression = msStringConcatenate(pszTmpExpression, pszEscapedStr); msFree(pszEscapedStr); } if (bIscharacter) { pszTmpExpression = msStringConcatenate(pszTmpExpression, "\""); } pszTmpExpression = msStringConcatenate(pszTmpExpression, ")"); if (pszExpression != NULL) pszExpression = msStringConcatenate(pszExpression, " OR "); pszExpression = msStringConcatenate(pszExpression, pszTmpExpression); msFree(pszTmpExpression); pszTmpExpression = NULL; } pszExpression = msStringConcatenate(pszExpression, ")"); } msFreeCharArray(paszElements, numelements); } else { /*range(s)*/ paszElements = msStringSplit(value, ',', &numelements); if (paszElements && numelements > 0) { pszTmpExpression = msStringConcatenate(pszTmpExpression, "("); for (i = 0; i < numelements; i++) { papszRangeElements = msStringSplit(paszElements[i], '/', &nrangeelements); if (papszRangeElements && nrangeelements > 0) { pszTmpExpression = msStringConcatenate(pszTmpExpression, "("); if (nrangeelements == 2 || nrangeelements == 3) { /* minval = atof(papszRangeElements[0]); maxval = atof(papszRangeElements[1]); */ { pszTmpExpression = msStringConcatenate(pszTmpExpression, "["); pszTmpExpression = msStringConcatenate(pszTmpExpression, item); pszTmpExpression = msStringConcatenate(pszTmpExpression, "]"); } pszTmpExpression = msStringConcatenate(pszTmpExpression, " >= "); { char *pszEscapedStr = msLayerEscapeSQLParam(lp, papszRangeElements[0]); pszTmpExpression = msStringConcatenate(pszTmpExpression, pszEscapedStr); msFree(pszEscapedStr); } pszTmpExpression = msStringConcatenate(pszTmpExpression, " AND "); { pszTmpExpression = msStringConcatenate(pszTmpExpression, "["); pszTmpExpression = msStringConcatenate(pszTmpExpression, item); pszTmpExpression = msStringConcatenate(pszTmpExpression, "]"); } pszTmpExpression = msStringConcatenate(pszTmpExpression, " <= "); { char *pszEscapedStr = msLayerEscapeSQLParam(lp, papszRangeElements[1]); pszTmpExpression = msStringConcatenate(pszTmpExpression, pszEscapedStr); msFree(pszEscapedStr); } pszTmpExpression = msStringConcatenate(pszTmpExpression, ")"); } else if (nrangeelements == 1) { pszTmpExpression = msStringConcatenate(pszTmpExpression, "("); { pszTmpExpression = msStringConcatenate(pszTmpExpression, "["); pszTmpExpression = msStringConcatenate(pszTmpExpression, item); pszTmpExpression = msStringConcatenate(pszTmpExpression, "]"); } pszTmpExpression = msStringConcatenate(pszTmpExpression, " = "); { char *pszEscapedStr = msLayerEscapeSQLParam(lp, papszRangeElements[0]); pszTmpExpression = msStringConcatenate(pszTmpExpression, pszEscapedStr); msFree(pszEscapedStr); } pszTmpExpression = msStringConcatenate(pszTmpExpression, ")"); } if (pszExpression != NULL) pszExpression = msStringConcatenate(pszExpression, " OR "); pszExpression = msStringConcatenate(pszExpression, pszTmpExpression); msFree(pszTmpExpression); pszTmpExpression = NULL; } msFreeCharArray(papszRangeElements, nrangeelements); } pszExpression = msStringConcatenate(pszExpression, ")"); } msFreeCharArray(paszElements, numelements); } } msFree(pszTmpExpression); return pszExpression; } int FLTogrConvertGeometry(OGRGeometryH hGeometry, shapeObj *psShape, OGRwkbGeometryType nType) { return msOGRGeometryToShape(hGeometry, psShape, nType); } static int FLTShapeFromGMLTree(CPLXMLNode *psTree, shapeObj *psShape, char **ppszSRS) { const char *pszSRS = NULL; if (psTree && psShape) { CPLXMLNode *psNext = psTree->psNext; OGRGeometryH hGeometry = NULL; psTree->psNext = NULL; hGeometry = OGR_G_CreateFromGMLTree(psTree); psTree->psNext = psNext; if (hGeometry) { OGRwkbGeometryType nType; nType = OGR_G_GetGeometryType(hGeometry); if (nType == wkbPolygon25D || nType == wkbMultiPolygon25D) nType = wkbPolygon; else if (nType == wkbLineString25D || nType == wkbMultiLineString25D) nType = wkbLineString; else if (nType == wkbPoint25D || nType == wkbMultiPoint25D) nType = wkbPoint; FLTogrConvertGeometry(hGeometry, psShape, nType); OGR_G_DestroyGeometry(hGeometry); pszSRS = CPLGetXMLValue(psTree, "srsName", NULL); if (ppszSRS && pszSRS) *ppszSRS = msStrdup(pszSRS); return MS_TRUE; } } return MS_FALSE; } int FLTGetGeosOperator(char *pszValue) { if (!pszValue) return -1; if (strcasecmp(pszValue, "Equals") == 0) return MS_GEOS_EQUALS; else if (strcasecmp(pszValue, "Intersect") == 0 || strcasecmp(pszValue, "Intersects") == 0) return MS_GEOS_INTERSECTS; else if (strcasecmp(pszValue, "Disjoint") == 0) return MS_GEOS_DISJOINT; else if (strcasecmp(pszValue, "Touches") == 0) return MS_GEOS_TOUCHES; else if (strcasecmp(pszValue, "Crosses") == 0) return MS_GEOS_CROSSES; else if (strcasecmp(pszValue, "Within") == 0) return MS_GEOS_WITHIN; else if (strcasecmp(pszValue, "Contains") == 0) return MS_GEOS_CONTAINS; else if (strcasecmp(pszValue, "Overlaps") == 0) return MS_GEOS_OVERLAPS; else if (strcasecmp(pszValue, "Beyond") == 0) return MS_GEOS_BEYOND; else if (strcasecmp(pszValue, "DWithin") == 0) return MS_GEOS_DWITHIN; return -1; } int FLTIsGeosNode(char *pszValue) { if (FLTGetGeosOperator(pszValue) == -1) return MS_FALSE; return MS_TRUE; } /************************************************************************/ /* FLTIsSimpleFilterNoSpatial */ /* */ /* Filter encoding with only attribute queries */ /************************************************************************/ int FLTIsSimpleFilterNoSpatial(FilterEncodingNode *psNode) { if (FLTIsSimpleFilter(psNode) && FLTNumberOfFilterType(psNode, "BBOX") == 0) return MS_TRUE; return MS_FALSE; } /************************************************************************/ /* FLTApplySimpleSQLFilter() */ /************************************************************************/ int FLTApplySimpleSQLFilter(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex) { layerObj *lp = NULL; char *szExpression = NULL; rectObj sQueryRect = map->extent; const char *szEPSG = NULL; projectionObj sProjTmp; char *pszBuffer = NULL; int bConcatWhere = 0; int bHasAWhere = 0; char *pszTmp = NULL, *pszTmp2 = NULL; char *tmpfilename = NULL; const char *pszTimeField = NULL; const char *pszTimeValue = NULL; lp = (GET_LAYER(map, iLayerIndex)); /* if there is a bbox use it */ szEPSG = FLTGetBBOX(psNode, &sQueryRect); if (szEPSG && map->projection.numargs > 0) { msInitProjection(&sProjTmp); msProjectionInheritContextFrom(&sProjTmp, &map->projection); /* Use the non EPSG variant since axis swapping is done in * FLTDoAxisSwappingIfNecessary */ if (msLoadProjectionString(&sProjTmp, szEPSG) == 0) { msProjectRect(&sProjTmp, &map->projection, &sQueryRect); } msFreeProjection(&sProjTmp); } if (lp->connectiontype == MS_OGR) { pszTimeValue = FLTGetDuring(psNode, &pszTimeField); } /* make sure that the layer can be queried*/ if (!lp->_template) lp->_template = msStrdup("ttt.html"); /* if there is no class, create at least one, so that query by rect would work */ if (lp->numclasses == 0) { if (msGrowLayerClasses(lp) == NULL) return MS_FAILURE; initClass(lp->_class[0]); } bConcatWhere = 0; bHasAWhere = 0; if (lp->connectiontype == MS_POSTGIS || lp->connectiontype == MS_ORACLESPATIAL || lp->connectiontype == MS_PLUGIN) { szExpression = FLTGetSQLExpression(psNode, lp); if (szExpression) { pszTmp = msStrdup("("); pszTmp = msStringConcatenate(pszTmp, szExpression); pszTmp = msStringConcatenate(pszTmp, ")"); msFree(szExpression); szExpression = pszTmp; } } /* concatenates the WHERE clause for OGR layers. This only applies if the expression was empty or not of an expression string. If there is an sql type expression, it is assumed to have the WHERE clause. If it is an expression and does not have a WHERE it is assumed to be a mapserver type expression*/ else if (lp->connectiontype == MS_OGR) { if (lp->filter.type != MS_EXPRESSION) { szExpression = FLTGetSQLExpression(psNode, lp); bConcatWhere = 1; } else { if (lp->filter.string && EQUALN(lp->filter.string, "WHERE ", 6)) { szExpression = FLTGetSQLExpression(psNode, lp); bHasAWhere = 1; bConcatWhere = 1; } else { szExpression = FLTGetCommonExpression(psNode, lp); } } } else { szExpression = FLTGetCommonExpression(psNode, lp); } if (szExpression) { if (bConcatWhere) pszBuffer = msStringConcatenate(pszBuffer, "WHERE "); /* if the filter is set and it's an expression type, concatenate it with this filter. If not just free it */ if (lp->filter.string && lp->filter.type == MS_EXPRESSION) { pszBuffer = msStringConcatenate(pszBuffer, "(("); if (bHasAWhere) pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string + 6); else pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string); pszBuffer = msStringConcatenate(pszBuffer, ") and "); } else if (lp->filter.string) msFreeExpression(&lp->filter); pszBuffer = msStringConcatenate(pszBuffer, szExpression); if (lp->filter.string && lp->filter.type == MS_EXPRESSION) pszBuffer = msStringConcatenate(pszBuffer, ")"); msLoadExpressionString(&lp->filter, pszBuffer); free(szExpression); } if (pszTimeField && pszTimeValue) msLayerSetTimeFilter(lp, pszTimeValue, pszTimeField); if (pszBuffer) free(pszBuffer); map->query.type = MS_QUERY_BY_RECT; map->query.mode = MS_QUERY_MULTIPLE; map->query.layer = lp->index; map->query.rect = sQueryRect; if (map->debug == MS_DEBUGLEVEL_VVV) { tmpfilename = msTmpFile(map, map->mappath, NULL, "_filter.map"); if (tmpfilename == NULL) { tmpfilename = msTmpFile(map, NULL, NULL, "_filter.map"); } if (tmpfilename) { msSaveMap(map, tmpfilename); msDebug( "FLTApplySimpleSQLFilter(): Map file after Filter was applied %s\n", tmpfilename); msFree(tmpfilename); } } /*for oracle connection, if we have a simple filter with no spatial constraints we should set the connection function to NONE to have a better performance (#2725)*/ if (lp->connectiontype == MS_ORACLESPATIAL && FLTIsSimpleFilterNoSpatial(psNode)) { if (strcasestr(lp->data, "USING") == 0) lp->data = msStringConcatenate(lp->data, " USING NONE"); else if (strcasestr(lp->data, "NONE") == 0) { /*if one of the functions is used, just replace it with NONE*/ if (strcasestr(lp->data, "FILTER")) lp->data = msCaseReplaceSubstring(lp->data, "FILTER", "NONE"); else if (strcasestr(lp->data, "GEOMRELATE")) lp->data = msCaseReplaceSubstring(lp->data, "GEOMRELATE", "NONE"); else if (strcasestr(lp->data, "RELATE")) lp->data = msCaseReplaceSubstring(lp->data, "RELATE", "NONE"); else if (strcasestr(lp->data, "VERSION")) { /*should add NONE just before the VERSION. Cases are: DATA "ORA_GEOMETRY FROM data USING VERSION 10g DATA "ORA_GEOMETRY FROM data USING UNIQUE FID VERSION 10g" */ pszTmp = (char *)strcasestr(lp->data, "VERSION"); pszTmp2 = msStringConcatenate(pszTmp2, " NONE "); pszTmp2 = msStringConcatenate(pszTmp2, pszTmp); lp->data = msCaseReplaceSubstring(lp->data, pszTmp, pszTmp2); msFree(pszTmp2); } else if (strcasestr(lp->data, "SRID")) { lp->data = msStringConcatenate(lp->data, " NONE"); } } } return msQueryByRect(map); /* return MS_SUCCESS; */ } /************************************************************************/ /* FLTSplitFilters */ /* */ /* Split filters separated by parentheses into an array of strings. */ /************************************************************************/ char **FLTSplitFilters(const char *pszStr, int *pnTokens) { const char *pszTokenBegin; char **papszRet = NULL; int nTokens = 0; char chStringQuote = '\0'; int nXMLIndent = 0; int bInBracket = FALSE; if (*pszStr != '(') { *pnTokens = 0; return NULL; } pszStr++; pszTokenBegin = pszStr; while (*pszStr != '\0') { /* Ignore any character until end of quoted string */ if (chStringQuote != '\0') { if (*pszStr == chStringQuote) chStringQuote = 0; } /* Detect begin of quoted string only for an XML attribute, i.e. between < and > */ else if (bInBracket && (*pszStr == '\'' || *pszStr == '"')) { chStringQuote = *pszStr; } /* Begin of XML element */ else if (*pszStr == '<') { bInBracket = TRUE; if (pszStr[1] == '/') nXMLIndent--; else if (pszStr[1] != '!') nXMLIndent++; } /* case */ else if (*pszStr == '/' && pszStr[1] == '>') { bInBracket = FALSE; nXMLIndent--; pszStr++; } /* End of XML element */ else if (*pszStr == '>') { bInBracket = FALSE; } /* Only detect and of filter when XML indentation goes back to zero */ else if (nXMLIndent == 0 && *pszStr == ')') { papszRet = (char **)msSmallRealloc(papszRet, sizeof(char *) * (nTokens + 1)); papszRet[nTokens] = msStrdup(pszTokenBegin); papszRet[nTokens][pszStr - pszTokenBegin] = '\0'; nTokens++; if (pszStr[1] != '(') { break; } pszStr++; pszTokenBegin = pszStr + 1; } pszStr++; } *pnTokens = nTokens; return papszRet; } /************************************************************************/ /* FLTIsSimpleFilter */ /* */ /* Filter encoding with only attribute queries and only one bbox. */ /************************************************************************/ int FLTIsSimpleFilter(FilterEncodingNode *psNode) { if (FLTValidForBBoxFilter(psNode)) { if (FLTNumberOfFilterType(psNode, "DWithin") == 0 && FLTNumberOfFilterType(psNode, "Intersect") == 0 && FLTNumberOfFilterType(psNode, "Intersects") == 0 && FLTNumberOfFilterType(psNode, "Equals") == 0 && FLTNumberOfFilterType(psNode, "Disjoint") == 0 && FLTNumberOfFilterType(psNode, "Touches") == 0 && FLTNumberOfFilterType(psNode, "Crosses") == 0 && FLTNumberOfFilterType(psNode, "Within") == 0 && FLTNumberOfFilterType(psNode, "Contains") == 0 && FLTNumberOfFilterType(psNode, "Overlaps") == 0 && FLTNumberOfFilterType(psNode, "Beyond") == 0) return TRUE; } return FALSE; } /************************************************************************/ /* FLTApplyFilterToLayer */ /* */ /* Use the filter encoding node to create mapserver expressions */ /* and apply it to the layer. */ /************************************************************************/ int FLTApplyFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex) { layerObj *layer = GET_LAYER(map, iLayerIndex); if (!layer->vtable) { int rv = msInitializeVirtualTable(layer); if (rv != MS_SUCCESS) return rv; } if (!layer->vtable) return MS_FAILURE; return layer->vtable->LayerApplyFilterToLayer(psNode, map, iLayerIndex); } /************************************************************************/ /* FLTLayerApplyCondSQLFilterToLayer */ /* */ /* Helper function for layer virtual table architecture */ /************************************************************************/ int FLTLayerApplyCondSQLFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex) { return FLTLayerApplyPlainFilterToLayer(psNode, map, iLayerIndex); } /************************************************************************/ /* FLTGetTopBBOX */ /* */ /* Return the "top" BBOX if there's a unique one. */ /************************************************************************/ static int FLTGetTopBBOXInternal(FilterEncodingNode *psNode, FilterEncodingNode **ppsTopBBOX, int *pnCount) { if (psNode->pszValue && strcasecmp(psNode->pszValue, "BBOX") == 0) { (*pnCount)++; if (*pnCount == 1) { *ppsTopBBOX = psNode; return TRUE; } *ppsTopBBOX = NULL; return FALSE; } else if (psNode->pszValue && strcasecmp(psNode->pszValue, "AND") == 0) { return FLTGetTopBBOXInternal(psNode->psLeftNode, ppsTopBBOX, pnCount) && FLTGetTopBBOXInternal(psNode->psRightNode, ppsTopBBOX, pnCount); } else { return TRUE; } } static FilterEncodingNode *FLTGetTopBBOX(FilterEncodingNode *psNode) { int nCount = 0; FilterEncodingNode *psTopBBOX = NULL; FLTGetTopBBOXInternal(psNode, &psTopBBOX, &nCount); return psTopBBOX; } /************************************************************************/ /* FLTLayerSetInvalidRectIfSupported */ /* */ /* This function will set in *rect a very huge extent if the layer */ /* wfs_use_default_extent_for_getfeature metadata item is set to false */ /* and the layer supports such degenerate rectangle, as a hint that */ /* they should not issue a spatial filter. */ /************************************************************************/ int FLTLayerSetInvalidRectIfSupported(layerObj *lp, rectObj *rect, const char *metadata_namespaces) { const char *pszUseDefaultExtent = msOWSLookupMetadata(&(lp->metadata), metadata_namespaces, "use_default_extent_for_getfeature"); if (pszUseDefaultExtent && !CSLTestBoolean(pszUseDefaultExtent) && (lp->connectiontype == MS_OGR || lp->connectiontype == MS_POSTGIS || ((lp->connectiontype == MS_PLUGIN) && (strstr(lp->plugin_library, "msplugin_mssql2008") != NULL)))) { const rectObj rectInvalid = MS_INIT_INVALID_RECT; *rect = rectInvalid; return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* FLTLayerApplyPlainFilterToLayer */ /* */ /* Helper function for layer virtual table architecture */ /************************************************************************/ int FLTLayerApplyPlainFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex) { char *pszExpression = NULL; int status = MS_FALSE; layerObj *lp = GET_LAYER(map, iLayerIndex); pszExpression = FLTGetCommonExpression(psNode, lp); if (pszExpression) { FilterEncodingNode *psTopBBOX; rectObj rect = map->extent; FLTLayerSetInvalidRectIfSupported(lp, &rect, "OF"); psTopBBOX = FLTGetTopBBOX(psNode); if (psTopBBOX) { int can_remove_expression = MS_TRUE; const char *pszEPSG = FLTGetBBOX(psNode, &rect); if (pszEPSG && map->projection.numargs > 0) { projectionObj sProjTmp; msInitProjection(&sProjTmp); msProjectionInheritContextFrom(&sProjTmp, &map->projection); /* Use the non EPSG variant since axis swapping is done in * FLTDoAxisSwappingIfNecessary */ if (msLoadProjectionString(&sProjTmp, pszEPSG) == 0) { rectObj oldRect = rect; msProjectRect(&sProjTmp, &map->projection, &rect); /* If reprojection is involved, do not remove the expression */ if (rect.minx != oldRect.minx || rect.miny != oldRect.miny || rect.maxx != oldRect.maxx || rect.maxy != oldRect.maxy) { can_remove_expression = MS_FALSE; } } msFreeProjection(&sProjTmp); } /* Small optimization: if the query is just a BBOX, then do a */ /* msQueryByRect() */ if (psTopBBOX == psNode && can_remove_expression) { msFree(pszExpression); pszExpression = NULL; } } if (map->debug == MS_DEBUGLEVEL_VVV) { if (pszExpression) msDebug("FLTLayerApplyPlainFilterToLayer(): %s, " "rect=%.15g,%.15g,%.15g,%.15g\n", pszExpression, rect.minx, rect.miny, rect.maxx, rect.maxy); else msDebug( "FLTLayerApplyPlainFilterToLayer(): rect=%.15g,%.15g,%.15g,%.15g\n", rect.minx, rect.miny, rect.maxx, rect.maxy); } status = FLTApplyFilterToLayerCommonExpressionWithRect(map, iLayerIndex, pszExpression, rect); msFree(pszExpression); } return status; } /************************************************************************/ /* FilterNode *FLTPaserFilterEncoding(char *szXMLString) */ /* */ /* Parses an Filter Encoding XML string and creates a */ /* FilterEncodingNodes corresponding to the string. */ /* Returns a pointer to the first node or NULL if */ /* unsuccessful. */ /* Calling function should use FreeFilterEncodingNode function */ /* to free memory. */ /************************************************************************/ FilterEncodingNode *FLTParseFilterEncoding(const char *szXMLString) { CPLXMLNode *psRoot = NULL, *psChild = NULL, *psFilter = NULL; FilterEncodingNode *psFilterNode = NULL; if (szXMLString == NULL || strlen(szXMLString) == 0 || (strstr(szXMLString, "Filter") == NULL)) return NULL; psRoot = CPLParseXMLString(szXMLString); if (psRoot == NULL) return NULL; /* strip namespaces. We srtip all name spaces (#1350)*/ CPLStripXMLNamespace(psRoot, NULL, 1); /* -------------------------------------------------------------------- */ /* get the root element (Filter). */ /* -------------------------------------------------------------------- */ psFilter = CPLGetXMLNode(psRoot, "=Filter"); if (!psFilter) { CPLDestroyXMLNode(psRoot); return NULL; } psChild = psFilter->psChild; while (psChild) { if (FLTIsSupportedFilterType(psChild)) { psFilterNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psFilterNode, psChild); break; } else psChild = psChild->psNext; } CPLDestroyXMLNode(psRoot); /* -------------------------------------------------------------------- */ /* validate the node tree to make sure that all the nodes are valid.*/ /* -------------------------------------------------------------------- */ if (!FLTValidFilterNode(psFilterNode)) { FLTFreeFilterEncodingNode(psFilterNode); return NULL; } return psFilterNode; } /************************************************************************/ /* int FLTValidFilterNode(FilterEncodingNode *psFilterNode) */ /* */ /* Validate that all the nodes are filled properly. We could */ /* have parts of the nodes that are correct and part which */ /* could be incorrect if the filter string sent is corrupted */ /* (eg missing a value :) */ /************************************************************************/ int FLTValidFilterNode(FilterEncodingNode *psFilterNode) { if (!psFilterNode) return 0; if (psFilterNode->eType == FILTER_NODE_TYPE_UNDEFINED) return 0; if (psFilterNode->psLeftNode) { const int bReturn = FLTValidFilterNode(psFilterNode->psLeftNode); if (bReturn == 0) return 0; else if (psFilterNode->psRightNode) return FLTValidFilterNode(psFilterNode->psRightNode); } return 1; } /************************************************************************/ /* FLTIsGeometryFilterNodeType */ /************************************************************************/ static int FLTIsGeometryFilterNodeType(int eType) { return (eType == FILTER_NODE_TYPE_GEOMETRY_POINT || eType == FILTER_NODE_TYPE_GEOMETRY_LINE || eType == FILTER_NODE_TYPE_GEOMETRY_POLYGON); } /************************************************************************/ /* FLTFreeFilterEncodingNode */ /* */ /* recursive freeing of Filter Encoding nodes. */ /************************************************************************/ void FLTFreeFilterEncodingNode(FilterEncodingNode *psFilterNode) { if (psFilterNode) { if (psFilterNode->psLeftNode) { FLTFreeFilterEncodingNode(psFilterNode->psLeftNode); psFilterNode->psLeftNode = NULL; } if (psFilterNode->psRightNode) { FLTFreeFilterEncodingNode(psFilterNode->psRightNode); psFilterNode->psRightNode = NULL; } if (psFilterNode->pszSRS) free(psFilterNode->pszSRS); if (psFilterNode->pOther) { if (psFilterNode->pszValue != NULL && strcasecmp(psFilterNode->pszValue, "PropertyIsLike") == 0) { FEPropertyIsLike *propIsLike = (FEPropertyIsLike *)psFilterNode->pOther; if (propIsLike->pszWildCard) free(propIsLike->pszWildCard); if (propIsLike->pszSingleChar) free(propIsLike->pszSingleChar); if (propIsLike->pszEscapeChar) free(propIsLike->pszEscapeChar); } else if (FLTIsGeometryFilterNodeType(psFilterNode->eType)) { msFreeShape((shapeObj *)(psFilterNode->pOther)); } /* else */ /* TODO free pOther special fields */ free(psFilterNode->pOther); } /* Cannot free pszValue before, 'cause we are testing it above */ if (psFilterNode->pszValue) free(psFilterNode->pszValue); free(psFilterNode); } } /************************************************************************/ /* FLTCreateFilterEncodingNode */ /* */ /* return a FilterEncoding node. */ /************************************************************************/ FilterEncodingNode *FLTCreateFilterEncodingNode(void) { FilterEncodingNode *psFilterNode = NULL; psFilterNode = (FilterEncodingNode *)malloc(sizeof(FilterEncodingNode)); psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; psFilterNode->pszValue = NULL; psFilterNode->pOther = NULL; psFilterNode->pszSRS = NULL; psFilterNode->psLeftNode = NULL; psFilterNode->psRightNode = NULL; return psFilterNode; } FilterEncodingNode *FLTCreateBinaryCompFilterEncodingNode(void) { FilterEncodingNode *psFilterNode = NULL; psFilterNode = FLTCreateFilterEncodingNode(); /* used to store case sensitivity flag. Default is 0 meaning the comparing is case sensititive */ psFilterNode->pOther = (int *)malloc(sizeof(int)); (*(int *)(psFilterNode->pOther)) = 0; return psFilterNode; } /************************************************************************/ /* FLTFindGeometryNode */ /* */ /************************************************************************/ static CPLXMLNode *FLTFindGeometryNode(CPLXMLNode *psXMLNode, int *pbPoint, int *pbLine, int *pbPolygon) { CPLXMLNode *psGMLElement = NULL; psGMLElement = CPLGetXMLNode(psXMLNode, "Point"); if (!psGMLElement) psGMLElement = CPLGetXMLNode(psXMLNode, "PointType"); if (psGMLElement) *pbPoint = 1; else { psGMLElement = CPLGetXMLNode(psXMLNode, "Polygon"); if (psGMLElement) *pbPolygon = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "MultiPolygon"))) *pbPolygon = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "Surface"))) *pbPolygon = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "MultiSurface"))) *pbPolygon = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "Box"))) *pbPolygon = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "Envelope"))) *pbPolygon = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "LineString"))) *pbLine = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "MultiLineString"))) *pbLine = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "Curve"))) *pbLine = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "MultiCurve"))) *pbLine = 1; else if ((psGMLElement = CPLGetXMLNode(psXMLNode, "MultiPoint"))) *pbPoint = 1; } return psGMLElement; } /************************************************************************/ /* FLTGetPropertyName */ /************************************************************************/ static const char *FLTGetPropertyName(CPLXMLNode *psXMLNode) { const char *pszPropertyName; pszPropertyName = CPLGetXMLValue(psXMLNode, "PropertyName", NULL); if (pszPropertyName == NULL) /* FE 2.0 ? */ pszPropertyName = CPLGetXMLValue(psXMLNode, "ValueReference", NULL); return pszPropertyName; } /************************************************************************/ /* FLTGetFirstChildNode */ /************************************************************************/ static CPLXMLNode *FLTGetFirstChildNode(CPLXMLNode *psXMLNode) { if (psXMLNode == NULL) return NULL; psXMLNode = psXMLNode->psChild; while (psXMLNode != NULL) { if (psXMLNode->eType == CXT_Element) return psXMLNode; psXMLNode = psXMLNode->psNext; } return NULL; } /************************************************************************/ /* FLTGetNextSibblingNode */ /************************************************************************/ static CPLXMLNode *FLTGetNextSibblingNode(CPLXMLNode *psXMLNode) { if (psXMLNode == NULL) return NULL; psXMLNode = psXMLNode->psNext; while (psXMLNode != NULL) { if (psXMLNode->eType == CXT_Element) return psXMLNode; psXMLNode = psXMLNode->psNext; } return NULL; } /************************************************************************/ /* FLTInsertElementInNode */ /* */ /* Utility function to parse an XML node and transfer the */ /* contents into the Filter Encoding node structure. */ /************************************************************************/ void FLTInsertElementInNode(FilterEncodingNode *psFilterNode, CPLXMLNode *psXMLNode) { char *pszTmp = NULL; FilterEncodingNode *psCurFilNode = NULL; CPLXMLNode *psCurXMLNode = NULL; CPLXMLNode *psTmpNode = NULL; CPLXMLNode *psFeatureIdNode = NULL; const char *pszFeatureId = NULL; char *pszFeatureIdList = NULL; if (psFilterNode && psXMLNode && psXMLNode->pszValue) { psFilterNode->pszValue = msStrdup(psXMLNode->pszValue); psFilterNode->psLeftNode = NULL; psFilterNode->psRightNode = NULL; /* -------------------------------------------------------------------- */ /* Logical filter. AND, OR and NOT are supported. Example of */ /* filer using logical filters : */ /* */ /* */ /* */ /* Person/Age */ /* 50 */ /* */ /* */ /* Person/Address/City */ /* Toronto */ /* */ /* */ /* */ /* -------------------------------------------------------------------- */ if (FLTIsLogicalFilterType(psXMLNode->pszValue)) { psFilterNode->eType = FILTER_NODE_TYPE_LOGICAL; if (strcasecmp(psFilterNode->pszValue, "AND") == 0 || strcasecmp(psFilterNode->pszValue, "OR") == 0) { CPLXMLNode *psFirstNode = FLTGetFirstChildNode(psXMLNode); CPLXMLNode *psSecondNode = FLTGetNextSibblingNode(psFirstNode); if (psFirstNode && psSecondNode) { /*2 operators */ CPLXMLNode *psNextNode = FLTGetNextSibblingNode(psSecondNode); if (psNextNode == NULL) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psFilterNode->psLeftNode, psFirstNode); psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psFilterNode->psRightNode, psSecondNode); } else { psCurXMLNode = psFirstNode; psCurFilNode = psFilterNode; while (psCurXMLNode) { psNextNode = FLTGetNextSibblingNode(psCurXMLNode); if (FLTGetNextSibblingNode(psNextNode)) { psCurFilNode->psLeftNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psCurFilNode->psLeftNode, psCurXMLNode); psCurFilNode->psRightNode = FLTCreateFilterEncodingNode(); psCurFilNode->psRightNode->eType = FILTER_NODE_TYPE_LOGICAL; psCurFilNode->psRightNode->pszValue = msStrdup(psFilterNode->pszValue); psCurFilNode = psCurFilNode->psRightNode; psCurXMLNode = psNextNode; } else { /*last 2 operators*/ psCurFilNode->psLeftNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psCurFilNode->psLeftNode, psCurXMLNode); psCurFilNode->psRightNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psCurFilNode->psRightNode, psNextNode); break; } } } } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } else if (strcasecmp(psFilterNode->pszValue, "NOT") == 0) { CPLXMLNode *psFirstNode = FLTGetFirstChildNode(psXMLNode); if (psFirstNode) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); FLTInsertElementInNode(psFilterNode->psLeftNode, psFirstNode); } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } /* end if is logical */ /* -------------------------------------------------------------------- */ /* Spatial Filter. */ /* BBOX : */ /* */ /* */ /* Geometry */ /* */ /* 13.0983,31.5899 35.5472,42.8143*/ /* */ /* */ /* */ /* */ /* DWithin */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* Geometry */ /* */ /* 13.0983,31.5899 */ /* */ /* 10 */ /* */ /* */ /* */ /* Intersect */ /* */ /* type="ogc:BinarySpatialOpType" substitutionGroup="ogc:spatialOps"/>*/ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* -------------------------------------------------------------------- */ else if (FLTIsSpatialFilterType(psXMLNode->pszValue)) { psFilterNode->eType = FILTER_NODE_TYPE_SPATIAL; if (strcasecmp(psXMLNode->pszValue, "BBOX") == 0) { char *pszSRS = NULL; const char *pszPropertyName = NULL; CPLXMLNode *psBox = NULL, *psEnvelope = NULL; rectObj sBox = {0, 0, 0, 0}; int bCoordinatesValid = 0; pszPropertyName = FLTGetPropertyName(psXMLNode); psBox = CPLGetXMLNode(psXMLNode, "Box"); if (!psBox) psBox = CPLGetXMLNode(psXMLNode, "BoxType"); /*FE 1.0 used box FE1.1 uses envelop*/ if (psBox) bCoordinatesValid = FLTParseGMLBox(psBox, &sBox, &pszSRS); else if ((psEnvelope = CPLGetXMLNode(psXMLNode, "Envelope"))) bCoordinatesValid = FLTParseGMLEnvelope(psEnvelope, &sBox, &pszSRS); if (bCoordinatesValid) { /*set the srs if available*/ if (pszSRS) psFilterNode->pszSRS = pszSRS; psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; /* PropertyName is optional since FE 1.1.0, in which case */ /* the BBOX must apply to all geometry fields. As we support */ /* currently only one geometry field, this doesn't make much */ /* difference to further processing. */ if (pszPropertyName != NULL) { psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); } /* coordinates */ psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_BBOX; psFilterNode->psRightNode->pOther = (rectObj *)msSmallMalloc(sizeof(rectObj)); ((rectObj *)psFilterNode->psRightNode->pOther)->minx = sBox.minx; ((rectObj *)psFilterNode->psRightNode->pOther)->miny = sBox.miny; ((rectObj *)psFilterNode->psRightNode->pOther)->maxx = sBox.maxx; ((rectObj *)psFilterNode->psRightNode->pOther)->maxy = sBox.maxy; } else { msFree(pszSRS); psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } } else if (strcasecmp(psXMLNode->pszValue, "DWithin") == 0 || strcasecmp(psXMLNode->pszValue, "Beyond") == 0) { shapeObj *psShape = NULL; int bPoint = 0, bLine = 0, bPolygon = 0; const char *pszUnits = NULL; const char *pszDistance = NULL; const char *pszPropertyName; char *pszSRS = NULL; CPLXMLNode *psGMLElement = NULL, *psDistance = NULL; pszPropertyName = FLTGetPropertyName(psXMLNode); psGMLElement = FLTFindGeometryNode(psXMLNode, &bPoint, &bLine, &bPolygon); psDistance = CPLGetXMLNode(psXMLNode, "Distance"); if (psDistance != NULL) pszDistance = CPLGetXMLValue(psDistance, NULL, NULL); if (pszPropertyName != NULL && psGMLElement && psDistance != NULL) { pszUnits = CPLGetXMLValue(psDistance, "units", NULL); if (pszUnits == NULL) /* FE 2.0 */ pszUnits = CPLGetXMLValue(psDistance, "uom", NULL); psShape = (shapeObj *)msSmallMalloc(sizeof(shapeObj)); msInitShape(psShape); if (FLTShapeFromGMLTree(psGMLElement, psShape, &pszSRS)) { /*set the srs if available*/ if (pszSRS) psFilterNode->pszSRS = pszSRS; psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); if (bPoint) psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_GEOMETRY_POINT; else if (bLine) psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_GEOMETRY_LINE; else if (bPolygon) psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_GEOMETRY_POLYGON; psFilterNode->psRightNode->pOther = (shapeObj *)psShape; /*the value will be distance;units*/ psFilterNode->psRightNode->pszValue = msStrdup(pszDistance); if (pszUnits) { psFilterNode->psRightNode->pszValue = msStringConcatenate(psFilterNode->psRightNode->pszValue, ";"); psFilterNode->psRightNode->pszValue = msStringConcatenate( psFilterNode->psRightNode->pszValue, pszUnits); } } else { free(psShape); msFree(pszSRS); psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } else if (strcasecmp(psXMLNode->pszValue, "Intersect") == 0 || strcasecmp(psXMLNode->pszValue, "Intersects") == 0 || strcasecmp(psXMLNode->pszValue, "Equals") == 0 || strcasecmp(psXMLNode->pszValue, "Disjoint") == 0 || strcasecmp(psXMLNode->pszValue, "Touches") == 0 || strcasecmp(psXMLNode->pszValue, "Crosses") == 0 || strcasecmp(psXMLNode->pszValue, "Within") == 0 || strcasecmp(psXMLNode->pszValue, "Contains") == 0 || strcasecmp(psXMLNode->pszValue, "Overlaps") == 0) { shapeObj *psShape = NULL; int bLine = 0, bPolygon = 0, bPoint = 0; char *pszSRS = NULL; const char *pszPropertyName; CPLXMLNode *psGMLElement = NULL; pszPropertyName = FLTGetPropertyName(psXMLNode); psGMLElement = FLTFindGeometryNode(psXMLNode, &bPoint, &bLine, &bPolygon); if (pszPropertyName != NULL && psGMLElement) { psShape = (shapeObj *)msSmallMalloc(sizeof(shapeObj)); msInitShape(psShape); if (FLTShapeFromGMLTree(psGMLElement, psShape, &pszSRS)) { /*set the srs if available*/ if (pszSRS) psFilterNode->pszSRS = pszSRS; psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); if (bPoint) psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_GEOMETRY_POINT; else if (bLine) psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_GEOMETRY_LINE; else if (bPolygon) psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_GEOMETRY_POLYGON; psFilterNode->psRightNode->pOther = (shapeObj *)psShape; } else { free(psShape); msFree(pszSRS); psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } } /* end of is spatial */ /* -------------------------------------------------------------------- */ /* Comparison Filter */ /* -------------------------------------------------------------------- */ else if (FLTIsComparisonFilterType(psXMLNode->pszValue)) { psFilterNode->eType = FILTER_NODE_TYPE_COMPARISON; /* -------------------------------------------------------------------- */ /* binary comaparison types. Example : */ /* */ /* */ /* */ /* SomeProperty */ /* 100 */ /* */ /* */ /* -------------------------------------------------------------------- */ if (FLTIsBinaryComparisonFilterType(psXMLNode->pszValue)) { const char *pszPropertyName = FLTGetPropertyName(psXMLNode); if (pszPropertyName != NULL) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psTmpNode = CPLSearchXMLNode(psXMLNode, "Literal"); if (psTmpNode) { const char *pszLiteral = CPLGetXMLValue(psTmpNode, NULL, NULL); psFilterNode->psRightNode = FLTCreateBinaryCompFilterEncodingNode(); psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_LITERAL; if (pszLiteral != NULL) { const char *pszMatchCase; psFilterNode->psRightNode->pszValue = msStrdup(pszLiteral); pszMatchCase = CPLGetXMLValue(psXMLNode, "matchCase", NULL); /*check if the matchCase attribute is set*/ if (pszMatchCase != NULL && strcasecmp(pszMatchCase, "false") == 0) { (*(int *)psFilterNode->psRightNode->pOther) = 1; } } /* special case where the user puts an empty value */ /* for the Literal so it can end up as an empty */ /* string query in the expression */ else psFilterNode->psRightNode->pszValue = NULL; } } if (psFilterNode->psLeftNode == NULL || psFilterNode->psRightNode == NULL) psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } /* -------------------------------------------------------------------- */ /* PropertyIsBetween filter : extract property name and boundary */ /* values. The boundary values are stored in the right */ /* node. The values are separated by a semi-column (;) */ /* Eg of Filter : */ /* */ /* DEPTH */ /* 400 */ /* 800 */ /* */ /* */ /* Or */ /* */ /* DEPTH */ /* 400 */ /* 800 */ /* */ /* -------------------------------------------------------------------- */ else if (strcasecmp(psXMLNode->pszValue, "PropertyIsBetween") == 0) { const char *pszPropertyName = FLTGetPropertyName(psXMLNode); CPLXMLNode *psLowerBoundary = CPLGetXMLNode(psXMLNode, "LowerBoundary"); CPLXMLNode *psUpperBoundary = CPLGetXMLNode(psXMLNode, "UpperBoundary"); const char *pszLowerNode = NULL; const char *pszUpperNode = NULL; if (psLowerBoundary != NULL) { /* check if the is there */ if (CPLGetXMLNode(psLowerBoundary, "Literal") != NULL) pszLowerNode = CPLGetXMLValue(psLowerBoundary, "Literal", NULL); else pszLowerNode = CPLGetXMLValue(psLowerBoundary, NULL, NULL); } if (psUpperBoundary != NULL) { if (CPLGetXMLNode(psUpperBoundary, "Literal") != NULL) pszUpperNode = CPLGetXMLValue(psUpperBoundary, "Literal", NULL); else pszUpperNode = CPLGetXMLValue(psUpperBoundary, NULL, NULL); } if (pszPropertyName != NULL && pszLowerNode != NULL && pszUpperNode != NULL) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_BOUNDARY; /* adding a ; between boundary values */ const int nStrLength = strlen(pszLowerNode) + strlen(pszUpperNode) + 2; psFilterNode->psRightNode->pszValue = (char *)malloc(sizeof(char) * (nStrLength)); strcpy(psFilterNode->psRightNode->pszValue, pszLowerNode); strlcat(psFilterNode->psRightNode->pszValue, ";", nStrLength); strlcat(psFilterNode->psRightNode->pszValue, pszUpperNode, nStrLength); } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } /* end of PropertyIsBetween */ /* -------------------------------------------------------------------- */ /* PropertyIsLike */ /* */ /* */ /* */ /* LAST_NAME */ /* JOHN* */ /* */ /* */ /* -------------------------------------------------------------------- */ else if (strcasecmp(psXMLNode->pszValue, "PropertyIsLike") == 0) { const char *pszPropertyName = FLTGetPropertyName(psXMLNode); const char *pszLiteral = CPLGetXMLValue(psXMLNode, "Literal", NULL); const char *pszWildCard = CPLGetXMLValue(psXMLNode, "wildCard", NULL); const char *pszSingleChar = CPLGetXMLValue(psXMLNode, "singleChar", NULL); const char *pszEscapeChar = CPLGetXMLValue(psXMLNode, "escape", NULL); if (pszEscapeChar == NULL) pszEscapeChar = CPLGetXMLValue(psXMLNode, "escapeChar", NULL); if (pszPropertyName != NULL && pszLiteral != NULL && pszWildCard != NULL && pszSingleChar != NULL && pszEscapeChar != NULL) { FEPropertyIsLike *propIsLike; propIsLike = (FEPropertyIsLike *)malloc(sizeof(FEPropertyIsLike)); psFilterNode->pOther = propIsLike; propIsLike->bCaseInsensitive = 0; propIsLike->pszWildCard = msStrdup(pszWildCard); propIsLike->pszSingleChar = msStrdup(pszSingleChar); propIsLike->pszEscapeChar = msStrdup(pszEscapeChar); pszTmp = (char *)CPLGetXMLValue(psXMLNode, "matchCase", NULL); if (pszTmp && strcasecmp(pszTmp, "false") == 0) { propIsLike->bCaseInsensitive = 1; } /* -------------------------------------------------------------------- */ /* Create left and right node for the attribute and the value. */ /* -------------------------------------------------------------------- */ psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); psFilterNode->psRightNode->pszValue = msStrdup(pszLiteral); psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_LITERAL; } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } else if (strcasecmp(psXMLNode->pszValue, "PropertyIsNull") == 0) { const char *pszPropertyName = FLTGetPropertyName(psXMLNode); if (pszPropertyName != NULL) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } else if (strcasecmp(psXMLNode->pszValue, "PropertyIsNil") == 0) { const char *pszPropertyName = FLTGetPropertyName(psXMLNode); if (pszPropertyName != NULL) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } } /* -------------------------------------------------------------------- */ /* FeatureId Filter */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* Note that for FES1.1.0 the featureid has been deprecated in */ /* favor of GmlObjectId */ /* */ /* */ /* And in FES 2.0, in favor of */ /* -------------------------------------------------------------------- */ else if (FLTIsFeatureIdFilterType(psXMLNode->pszValue)) { psFilterNode->eType = FILTER_NODE_TYPE_FEATUREID; pszFeatureIdList = NULL; psFeatureIdNode = psXMLNode; while (psFeatureIdNode) { pszFeatureId = CPLGetXMLValue(psFeatureIdNode, "fid", NULL); if (!pszFeatureId) pszFeatureId = CPLGetXMLValue(psFeatureIdNode, "id", NULL); if (!pszFeatureId) pszFeatureId = CPLGetXMLValue(psFeatureIdNode, "rid", NULL); if (pszFeatureId) { if (pszFeatureIdList) pszFeatureIdList = msStringConcatenate(pszFeatureIdList, ","); pszFeatureIdList = msStringConcatenate(pszFeatureIdList, pszFeatureId); } psFeatureIdNode = psFeatureIdNode->psNext; } if (pszFeatureIdList) { msFree(psFilterNode->pszValue); psFilterNode->pszValue = msStrdup(pszFeatureIdList); msFree(pszFeatureIdList); } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } /* -------------------------------------------------------------------- */ /* Temporal Filter. */ /* gml:TimeInstant 2005-05-17T00:00:00Z 2005-05-23T00:00:00Z */ /* -------------------------------------------------------------------- */ else if (FLTIsTemporalFilterType(psXMLNode->pszValue)) { psFilterNode->eType = FILTER_NODE_TYPE_TEMPORAL; if (strcasecmp(psXMLNode->pszValue, "During") == 0) { const char *pszPropertyName = NULL; const char *pszBeginTime; const char *pszEndTime; pszPropertyName = FLTGetPropertyName(psXMLNode); pszBeginTime = CPLGetXMLValue( psXMLNode, "TimePeriod.begin.TimeInstant.timePosition", NULL); if (pszBeginTime == NULL) pszBeginTime = CPLGetXMLValue(psXMLNode, "TimePeriod.beginPosition", NULL); pszEndTime = CPLGetXMLValue( psXMLNode, "TimePeriod.end.TimeInstant.timePosition", NULL); if (pszEndTime == NULL) pszEndTime = CPLGetXMLValue(psXMLNode, "TimePeriod.endPosition", NULL); if (pszPropertyName && pszBeginTime && pszEndTime && strchr(pszBeginTime, '\'') == NULL && strchr(pszBeginTime, '\\') == NULL && strchr(pszEndTime, '\'') == NULL && strchr(pszEndTime, '\\') == NULL && msTimeGetResolution(pszBeginTime) >= 0 && msTimeGetResolution(pszEndTime) >= 0) { psFilterNode->psLeftNode = FLTCreateFilterEncodingNode(); psFilterNode->psLeftNode->eType = FILTER_NODE_TYPE_PROPERTYNAME; psFilterNode->psLeftNode->pszValue = msStrdup(pszPropertyName); psFilterNode->psRightNode = FLTCreateFilterEncodingNode(); psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_TIME_PERIOD; const size_t nSize = strlen(pszBeginTime) + strlen(pszEndTime) + 2; psFilterNode->psRightNode->pszValue = static_cast(msSmallMalloc(nSize)); snprintf(psFilterNode->psRightNode->pszValue, nSize, "%s/%s", pszBeginTime, pszEndTime); } else psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } else { psFilterNode->eType = FILTER_NODE_TYPE_UNDEFINED; } } /* end of is temporal */ } } /************************************************************************/ /* int FLTIsLogicalFilterType((char *pszValue) */ /* */ /* return TRUE if the value of the node is of logical filter */ /* encoding type. */ /************************************************************************/ int FLTIsLogicalFilterType(const char *pszValue) { if (pszValue) { if (strcasecmp(pszValue, "AND") == 0 || strcasecmp(pszValue, "OR") == 0 || strcasecmp(pszValue, "NOT") == 0) return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* int FLTIsBinaryComparisonFilterType(char *pszValue) */ /* */ /* Binary comparison filter type. */ /************************************************************************/ int FLTIsBinaryComparisonFilterType(const char *pszValue) { if (pszValue) { if (strcasecmp(pszValue, "PropertyIsEqualTo") == 0 || strcasecmp(pszValue, "PropertyIsNotEqualTo") == 0 || strcasecmp(pszValue, "PropertyIsLessThan") == 0 || strcasecmp(pszValue, "PropertyIsGreaterThan") == 0 || strcasecmp(pszValue, "PropertyIsLessThanOrEqualTo") == 0 || strcasecmp(pszValue, "PropertyIsGreaterThanOrEqualTo") == 0) return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* int FLTIsComparisonFilterType(char *pszValue) */ /* */ /* return TRUE if the value of the node is of comparison filter */ /* encoding type. */ /************************************************************************/ int FLTIsComparisonFilterType(const char *pszValue) { if (pszValue) { if (FLTIsBinaryComparisonFilterType(pszValue) || strcasecmp(pszValue, "PropertyIsLike") == 0 || strcasecmp(pszValue, "PropertyIsBetween") == 0 || strcasecmp(pszValue, "PropertyIsNull") == 0 || strcasecmp(pszValue, "PropertyIsNil") == 0) return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* int FLTIsFeatureIdFilterType(char *pszValue) */ /* */ /* return TRUE if the value of the node is of featureid filter */ /* encoding type. */ /************************************************************************/ int FLTIsFeatureIdFilterType(const char *pszValue) { if (pszValue && (strcasecmp(pszValue, "FeatureId") == 0 || strcasecmp(pszValue, "GmlObjectId") == 0 || strcasecmp(pszValue, "ResourceId") == 0)) return MS_TRUE; return MS_FALSE; } /************************************************************************/ /* int FLTIsSpatialFilterType(char *pszValue) */ /* */ /* return TRUE if the value of the node is of spatial filter */ /* encoding type. */ /************************************************************************/ int FLTIsSpatialFilterType(const char *pszValue) { if (pszValue) { if (strcasecmp(pszValue, "BBOX") == 0 || strcasecmp(pszValue, "DWithin") == 0 || strcasecmp(pszValue, "Intersect") == 0 || strcasecmp(pszValue, "Intersects") == 0 || strcasecmp(pszValue, "Equals") == 0 || strcasecmp(pszValue, "Disjoint") == 0 || strcasecmp(pszValue, "Touches") == 0 || strcasecmp(pszValue, "Crosses") == 0 || strcasecmp(pszValue, "Within") == 0 || strcasecmp(pszValue, "Contains") == 0 || strcasecmp(pszValue, "Overlaps") == 0 || strcasecmp(pszValue, "Beyond") == 0) return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* int FLTIsTemportalFilterType(char *pszValue) */ /* */ /* return TRUE if the value of the node is of temporal filter */ /* encoding type. */ /************************************************************************/ int FLTIsTemporalFilterType(const char *pszValue) { if (pszValue) { if (strcasecmp(pszValue, "During") == 0) return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* int FLTIsSupportedFilterType(CPLXMLNode *psXMLNode) */ /* */ /* Verify if the value of the node is one of the supported */ /* filter type. */ /************************************************************************/ int FLTIsSupportedFilterType(CPLXMLNode *psXMLNode) { if (psXMLNode) { if (FLTIsLogicalFilterType(psXMLNode->pszValue) || FLTIsSpatialFilterType(psXMLNode->pszValue) || FLTIsComparisonFilterType(psXMLNode->pszValue) || FLTIsFeatureIdFilterType(psXMLNode->pszValue) || FLTIsTemporalFilterType(psXMLNode->pszValue)) return MS_TRUE; } return MS_FALSE; } /************************************************************************/ /* FLTNumberOfFilterType */ /* */ /* Loop trhough the nodes and return the number of nodes of */ /* specified value. */ /************************************************************************/ int FLTNumberOfFilterType(FilterEncodingNode *psFilterNode, const char *szType) { int nCount = 0; int nLeftNode = 0, nRightNode = 0; if (!psFilterNode || !szType || !psFilterNode->pszValue) return 0; if (strcasecmp(psFilterNode->pszValue, (char *)szType) == 0) nCount++; if (psFilterNode->psLeftNode) nLeftNode = FLTNumberOfFilterType(psFilterNode->psLeftNode, szType); nCount += nLeftNode; if (psFilterNode->psRightNode) nRightNode = FLTNumberOfFilterType(psFilterNode->psRightNode, szType); nCount += nRightNode; return nCount; } /************************************************************************/ /* FLTValidForBBoxFilter */ /* */ /* Validate if there is only one BBOX filter node. Here is what */ /* is supported (is valid) : */ /* - one node which is a BBOX */ /* - a logical AND with a valid BBOX */ /* */ /* eg 1: */ /* */ /* Geometry */ /* */ /* 13.0983,31.5899 35.5472,42.8143*/ /* */ /* */ /* */ /* */ /* eg 2 : */ /* */ /* */ /* Geometry */ /* */ /* 13.0983,31.5899 35.5472,42.8143*/ /* */ /* */ /* */ /* SomeProperty */ /* 100 */ /* */ /* */ /* */ /* */ /************************************************************************/ int FLTValidForBBoxFilter(FilterEncodingNode *psFilterNode) { int nCount = 0; if (!psFilterNode || !psFilterNode->pszValue) return 1; nCount = FLTNumberOfFilterType(psFilterNode, "BBOX"); if (nCount > 1) return 0; else if (nCount == 0) return 1; /* nCount ==1 */ if (strcasecmp(psFilterNode->pszValue, "BBOX") == 0) return 1; if (strcasecmp(psFilterNode->pszValue, "AND") == 0) { return FLTValidForBBoxFilter(psFilterNode->psLeftNode) && FLTValidForBBoxFilter(psFilterNode->psRightNode); } return 0; } #if 0 static int FLTHasUniqueTopLevelDuringFilter(FilterEncodingNode *psFilterNode) { int nCount = 0; if (!psFilterNode || !psFilterNode->pszValue) return 1; nCount = FLTNumberOfFilterType(psFilterNode, "During"); if (nCount > 1) return 0; else if (nCount == 0) return 1; /* nCount ==1 */ if (strcasecmp(psFilterNode->pszValue, "During") == 0) return 1; if (strcasecmp(psFilterNode->pszValue, "AND") == 0) { return FLTHasUniqueTopLevelDuringFilter(psFilterNode->psLeftNode) && FLTHasUniqueTopLevelDuringFilter(psFilterNode->psRightNode); } return 0; } #endif int FLTIsLineFilter(FilterEncodingNode *psFilterNode) { if (!psFilterNode || !psFilterNode->pszValue) return 0; if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL && psFilterNode->psRightNode && psFilterNode->psRightNode->eType == FILTER_NODE_TYPE_GEOMETRY_LINE) return 1; return 0; } int FLTIsPolygonFilter(FilterEncodingNode *psFilterNode) { if (!psFilterNode || !psFilterNode->pszValue) return 0; if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL && psFilterNode->psRightNode && psFilterNode->psRightNode->eType == FILTER_NODE_TYPE_GEOMETRY_POLYGON) return 1; return 0; } int FLTIsPointFilter(FilterEncodingNode *psFilterNode) { if (!psFilterNode || !psFilterNode->pszValue) return 0; if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL && psFilterNode->psRightNode && psFilterNode->psRightNode->eType == FILTER_NODE_TYPE_GEOMETRY_POINT) return 1; return 0; } int FLTIsBBoxFilter(FilterEncodingNode *psFilterNode) { if (!psFilterNode || !psFilterNode->pszValue) return 0; if (strcasecmp(psFilterNode->pszValue, "BBOX") == 0) return 1; return 0; } shapeObj *FLTGetShape(FilterEncodingNode *psFilterNode, double *pdfDistance, int *pnUnit) { char **tokens = NULL; int nTokens = 0; FilterEncodingNode *psNode = psFilterNode; char *szUnitStr = NULL; char *szUnit = NULL; if (psNode) { if (psNode->eType == FILTER_NODE_TYPE_SPATIAL && psNode->psRightNode) psNode = psNode->psRightNode; if (FLTIsGeometryFilterNodeType(psNode->eType)) { if (psNode->pszValue && pdfDistance) { /* syntax expected is "distance;unit" or just "distance" if unit is there syntax is "URI#unit" (eg http://..../#m) or just "unit" */ tokens = msStringSplit(psNode->pszValue, ';', &nTokens); if (tokens && nTokens >= 1) { *pdfDistance = atof(tokens[0]); if (nTokens == 2 && pnUnit) { szUnitStr = msStrdup(tokens[1]); msFreeCharArray(tokens, nTokens); nTokens = 0; tokens = msStringSplit(szUnitStr, '#', &nTokens); msFree(szUnitStr); if (tokens && nTokens >= 1) { if (nTokens == 1) szUnit = tokens[0]; else szUnit = tokens[1]; if (strcasecmp(szUnit, "m") == 0 || strcasecmp(szUnit, "meters") == 0) *pnUnit = MS_METERS; else if (strcasecmp(szUnit, "km") == 0 || strcasecmp(szUnit, "kilometers") == 0) *pnUnit = MS_KILOMETERS; else if (strcasecmp(szUnit, "NM") == 0 || strcasecmp(szUnit, "nauticalmiles") == 0) *pnUnit = MS_NAUTICALMILES; else if (strcasecmp(szUnit, "mi") == 0 || strcasecmp(szUnit, "miles") == 0) *pnUnit = MS_MILES; else if (strcasecmp(szUnit, "in") == 0 || strcasecmp(szUnit, "inches") == 0) *pnUnit = MS_INCHES; else if (strcasecmp(szUnit, "ft") == 0 || strcasecmp(szUnit, "feet") == 0) *pnUnit = MS_FEET; else if (strcasecmp(szUnit, "deg") == 0 || strcasecmp(szUnit, "dd") == 0) *pnUnit = MS_DD; else if (strcasecmp(szUnit, "px") == 0) *pnUnit = MS_PIXELS; } } } msFreeCharArray(tokens, nTokens); } return (shapeObj *)psNode->pOther; } } return NULL; } /************************************************************************/ /* FLTGetBBOX */ /* */ /* Loop through the nodes are return the coordinates of the */ /* first bbox node found. The return value is the epsg code of */ /* the bbox. */ /************************************************************************/ const char *FLTGetBBOX(FilterEncodingNode *psFilterNode, rectObj *psRect) { const char *pszReturn = NULL; if (!psFilterNode || !psRect) return NULL; if (psFilterNode->pszValue && strcasecmp(psFilterNode->pszValue, "BBOX") == 0) { if (psFilterNode->psRightNode && psFilterNode->psRightNode->pOther) { rectObj *pRect = (rectObj *)psFilterNode->psRightNode->pOther; psRect->minx = pRect->minx; psRect->miny = pRect->miny; psRect->maxx = pRect->maxx; psRect->maxy = pRect->maxy; return psFilterNode->pszSRS; } } else { pszReturn = FLTGetBBOX(psFilterNode->psLeftNode, psRect); if (pszReturn) return pszReturn; else return FLTGetBBOX(psFilterNode->psRightNode, psRect); } return pszReturn; } const char *FLTGetDuring(FilterEncodingNode *psFilterNode, const char **ppszTimeField) { const char *pszReturn = NULL; if (!psFilterNode || !ppszTimeField) return NULL; if (psFilterNode->pszValue && strcasecmp(psFilterNode->pszValue, "During") == 0) { *ppszTimeField = psFilterNode->psLeftNode->pszValue; return psFilterNode->psRightNode->pszValue; } else { pszReturn = FLTGetDuring(psFilterNode->psLeftNode, ppszTimeField); if (pszReturn) return pszReturn; else return FLTGetDuring(psFilterNode->psRightNode, ppszTimeField); } return pszReturn; } /************************************************************************/ /* FLTGetSQLExpression */ /* */ /* Build SQL expressions from the mapserver nodes. */ /************************************************************************/ char *FLTGetSQLExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { char *pszExpression = NULL; if (psFilterNode == NULL || lp == NULL) return NULL; if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON) { if (psFilterNode->psLeftNode && psFilterNode->psRightNode) { if (FLTIsBinaryComparisonFilterType(psFilterNode->pszValue)) { pszExpression = FLTGetBinaryComparisonSQLExpresssion(psFilterNode, lp); } else if (strcasecmp(psFilterNode->pszValue, "PropertyIsBetween") == 0) { pszExpression = FLTGetIsBetweenComparisonSQLExpresssion(psFilterNode, lp); } else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLike") == 0) { pszExpression = FLTGetIsLikeComparisonSQLExpression(psFilterNode, lp); } } } else if (psFilterNode->eType == FILTER_NODE_TYPE_LOGICAL) { if (strcasecmp(psFilterNode->pszValue, "AND") == 0 || strcasecmp(psFilterNode->pszValue, "OR") == 0) { pszExpression = FLTGetLogicalComparisonSQLExpresssion(psFilterNode, lp); } else if (strcasecmp(psFilterNode->pszValue, "NOT") == 0) { pszExpression = FLTGetLogicalComparisonSQLExpresssion(psFilterNode, lp); } } else if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL) { /* TODO */ } else if (psFilterNode->eType == FILTER_NODE_TYPE_FEATUREID) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) if (psFilterNode->pszValue) { const char *pszAttribute = msOWSLookupMetadata(&(lp->metadata), "OFG", "featureid"); if (pszAttribute) { int nTokens = 0; char **tokens = msStringSplit(psFilterNode->pszValue, ',', &nTokens); int bString = 0; if (tokens && nTokens > 0) { for (int i = 0; i < nTokens; i++) { char *pszEscapedStr = NULL; const char *pszId = tokens[i]; const char *pszDot = strchr(pszId, '.'); if (pszDot) pszId = pszDot + 1; if (strlen(pszId) <= 0) continue; if (FLTIsNumeric(pszId) == MS_FALSE) bString = 1; pszEscapedStr = msLayerEscapeSQLParam(lp, pszId); char szTmp[256]; if (bString) { if (lp->connectiontype == MS_OGR || lp->connectiontype == MS_POSTGIS) snprintf(szTmp, sizeof(szTmp), "(CAST(%s AS CHARACTER(255)) = '%s')", pszAttribute, pszEscapedStr); else snprintf(szTmp, sizeof(szTmp), "(%s = '%s')", pszAttribute, pszEscapedStr); } else snprintf(szTmp, sizeof(szTmp), "(%s = %s)", pszAttribute, pszEscapedStr); msFree(pszEscapedStr); pszEscapedStr = NULL; if (pszExpression != NULL) pszExpression = msStringConcatenate(pszExpression, " OR "); else /*opening and closing brackets*/ pszExpression = msStringConcatenate(pszExpression, "("); pszExpression = msStringConcatenate(pszExpression, szTmp); } } msFreeCharArray(tokens, nTokens); } /*opening and closing brackets*/ if (pszExpression) pszExpression = msStringConcatenate(pszExpression, ")"); } #else msSetError(MS_MISCERR, "OWS support is not available.", "FLTGetSQLExpression()"); return NULL; #endif } else if (lp->connectiontype != MS_OGR && psFilterNode->eType == FILTER_NODE_TYPE_TEMPORAL) pszExpression = msStrdup(FLTGetTimeExpression(psFilterNode, lp).c_str()); return pszExpression; } /************************************************************************/ /* FLTGetLogicalComparisonSQLExpresssion */ /* */ /* Return the expression for logical comparison expression. */ /************************************************************************/ char *FLTGetLogicalComparisonSQLExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp) { char *pszBuffer = NULL; char *pszTmp = NULL; if (lp == NULL) return NULL; /* ==================================================================== */ /* special case for BBOX node. */ /* ==================================================================== */ if (psFilterNode->psLeftNode && psFilterNode->psRightNode && ((strcasecmp(psFilterNode->psLeftNode->pszValue, "BBOX") == 0) || (strcasecmp(psFilterNode->psRightNode->pszValue, "BBOX") == 0))) { if (strcasecmp(psFilterNode->psLeftNode->pszValue, "BBOX") != 0) pszTmp = FLTGetSQLExpression(psFilterNode->psLeftNode, lp); else pszTmp = FLTGetSQLExpression(psFilterNode->psRightNode, lp); if (!pszTmp) return NULL; const size_t nSize = strlen(pszTmp) + 1; pszBuffer = (char *)malloc(nSize); snprintf(pszBuffer, nSize, "%s", pszTmp); } /* ==================================================================== */ /* special case for temporal filter node (OGR layer only) */ /* ==================================================================== */ else if (lp->connectiontype == MS_OGR && psFilterNode->psLeftNode && psFilterNode->psRightNode && (psFilterNode->psLeftNode->eType == FILTER_NODE_TYPE_TEMPORAL || psFilterNode->psRightNode->eType == FILTER_NODE_TYPE_TEMPORAL)) { if (psFilterNode->psLeftNode->eType != FILTER_NODE_TYPE_TEMPORAL) pszTmp = FLTGetSQLExpression(psFilterNode->psLeftNode, lp); else pszTmp = FLTGetSQLExpression(psFilterNode->psRightNode, lp); if (!pszTmp) return NULL; const size_t nSize = strlen(pszTmp) + 1; pszBuffer = (char *)malloc(nSize); snprintf(pszBuffer, nSize, "%s", pszTmp); } /* -------------------------------------------------------------------- */ /* OR and AND */ /* -------------------------------------------------------------------- */ else if (psFilterNode->psLeftNode && psFilterNode->psRightNode) { pszTmp = FLTGetSQLExpression(psFilterNode->psLeftNode, lp); if (!pszTmp) return NULL; pszBuffer = (char *)malloc( sizeof(char) * (strlen(pszTmp) + strlen(psFilterNode->pszValue) + 5)); pszBuffer[0] = '\0'; strcat(pszBuffer, " ("); strcat(pszBuffer, pszTmp); strcat(pszBuffer, " "); strcat(pszBuffer, psFilterNode->pszValue); strcat(pszBuffer, " "); free(pszTmp); const size_t nTmp = strlen(pszBuffer); pszTmp = FLTGetSQLExpression(psFilterNode->psRightNode, lp); if (!pszTmp) { free(pszBuffer); return NULL; } pszBuffer = (char *)msSmallRealloc( pszBuffer, sizeof(char) * (strlen(pszTmp) + nTmp + 3)); strcat(pszBuffer, pszTmp); strcat(pszBuffer, ") "); } /* -------------------------------------------------------------------- */ /* NOT */ /* -------------------------------------------------------------------- */ else if (psFilterNode->psLeftNode && strcasecmp(psFilterNode->pszValue, "NOT") == 0) { pszTmp = FLTGetSQLExpression(psFilterNode->psLeftNode, lp); if (!pszTmp) return NULL; pszBuffer = (char *)malloc(sizeof(char) * (strlen(pszTmp) + 9)); pszBuffer[0] = '\0'; strcat(pszBuffer, " (NOT "); strcat(pszBuffer, pszTmp); strcat(pszBuffer, ") "); } else return NULL; /* -------------------------------------------------------------------- */ /* Cleanup. */ /* -------------------------------------------------------------------- */ if (pszTmp != NULL) free(pszTmp); return pszBuffer; } /************************************************************************/ /* FLTGetBinaryComparisonSQLExpresssion */ /* */ /* Return the expression for a binary comparison filter node. */ /************************************************************************/ char *FLTGetBinaryComparisonSQLExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp) { const size_t bufferSize = 1024; char szBuffer[1024]; int bString = 0; char szTmp[256]; char *pszEscapedStr = NULL; szBuffer[0] = '\0'; if (!psFilterNode || !FLTIsBinaryComparisonFilterType(psFilterNode->pszValue)) return NULL; /* -------------------------------------------------------------------- */ /* check if the value is a numeric value or alphanumeric. If it */ /* is alphanumeric, add quotes around attribute and values. */ /* -------------------------------------------------------------------- */ bString = 0; if (psFilterNode->psRightNode->pszValue) { const char *pszOFGType; snprintf(szTmp, sizeof(szTmp), "%s_type", psFilterNode->psLeftNode->pszValue); pszOFGType = msOWSLookupMetadata(&(lp->metadata), "OFG", szTmp); if (pszOFGType != NULL && strcasecmp(pszOFGType, "Character") == 0) bString = 1; else if (FLTIsNumeric(psFilterNode->psRightNode->pszValue) == MS_FALSE) bString = 1; } /* special case to be able to have empty strings in the expression. */ if (psFilterNode->psRightNode->pszValue == NULL) bString = 1; /*opening bracket*/ strlcat(szBuffer, " (", bufferSize); pszEscapedStr = msLayerEscapePropertyName(lp, psFilterNode->psLeftNode->pszValue); /* attribute */ /*case insensitive set ? */ if (bString && strcasecmp(psFilterNode->pszValue, "PropertyIsEqualTo") == 0 && psFilterNode->psRightNode->pOther && (*(int *)psFilterNode->psRightNode->pOther) == 1) { snprintf(szTmp, sizeof(szTmp), "lower(%s) ", pszEscapedStr); strlcat(szBuffer, szTmp, bufferSize); } else strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); pszEscapedStr = NULL; /* logical operator */ if (strcasecmp(psFilterNode->pszValue, "PropertyIsEqualTo") == 0) strlcat(szBuffer, "=", bufferSize); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsNotEqualTo") == 0) strlcat(szBuffer, "<>", bufferSize); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLessThan") == 0) strlcat(szBuffer, "<", bufferSize); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsGreaterThan") == 0) strlcat(szBuffer, ">", bufferSize); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLessThanOrEqualTo") == 0) strlcat(szBuffer, "<=", bufferSize); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsGreaterThanOrEqualTo") == 0) strlcat(szBuffer, ">=", bufferSize); strlcat(szBuffer, " ", bufferSize); /* value */ if (bString && psFilterNode->psRightNode->pszValue && strcasecmp(psFilterNode->pszValue, "PropertyIsEqualTo") == 0 && psFilterNode->psRightNode->pOther && (*(int *)psFilterNode->psRightNode->pOther) == 1) { char *pszEscapedStr; pszEscapedStr = msLayerEscapeSQLParam(lp, psFilterNode->psRightNode->pszValue); snprintf(szTmp, sizeof(szTmp), "lower('%s') ", pszEscapedStr); msFree(pszEscapedStr); strlcat(szBuffer, szTmp, bufferSize); } else { if (bString) strlcat(szBuffer, "'", bufferSize); if (psFilterNode->psRightNode->pszValue) { if (bString) { char *pszEscapedStr; pszEscapedStr = msLayerEscapeSQLParam(lp, psFilterNode->psRightNode->pszValue); strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); pszEscapedStr = NULL; } else strlcat(szBuffer, psFilterNode->psRightNode->pszValue, bufferSize); } if (bString) strlcat(szBuffer, "'", bufferSize); } /*closing bracket*/ strlcat(szBuffer, ") ", bufferSize); return msStrdup(szBuffer); } /************************************************************************/ /* FLTGetIsBetweenComparisonSQLExpresssion */ /* */ /* Build an SQL expression for IsBteween Filter. */ /************************************************************************/ char *FLTGetIsBetweenComparisonSQLExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp) { const size_t bufferSize = 1024; char szBuffer[1024]; char **aszBounds = NULL; int nBounds = 0; int bString = 0; char szTmp[256]; char *pszEscapedStr; szBuffer[0] = '\0'; if (!psFilterNode || !(strcasecmp(psFilterNode->pszValue, "PropertyIsBetween") == 0)) return NULL; if (!psFilterNode->psLeftNode || !psFilterNode->psRightNode) return NULL; /* -------------------------------------------------------------------- */ /* Get the bounds value which are stored like boundmin;boundmax */ /* -------------------------------------------------------------------- */ aszBounds = msStringSplit(psFilterNode->psRightNode->pszValue, ';', &nBounds); if (nBounds != 2) { msFreeCharArray(aszBounds, nBounds); return NULL; } /* -------------------------------------------------------------------- */ /* check if the value is a numeric value or alphanumeric. If it */ /* is alphanumeric, add quotes around attribute and values. */ /* -------------------------------------------------------------------- */ bString = 0; if (aszBounds[0]) { const char *pszOFGType; snprintf(szTmp, sizeof(szTmp), "%s_type", psFilterNode->psLeftNode->pszValue); pszOFGType = msOWSLookupMetadata(&(lp->metadata), "OFG", szTmp); if (pszOFGType != NULL && strcasecmp(pszOFGType, "Character") == 0) bString = 1; else if (FLTIsNumeric(aszBounds[0]) == MS_FALSE) bString = 1; } if (!bString) { if (aszBounds[1]) { if (FLTIsNumeric(aszBounds[1]) == MS_FALSE) bString = 1; } } /* -------------------------------------------------------------------- */ /* build expression. */ /* -------------------------------------------------------------------- */ /*opening parenthesis */ strlcat(szBuffer, " (", bufferSize); /* attribute */ pszEscapedStr = msLayerEscapePropertyName(lp, psFilterNode->psLeftNode->pszValue); strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); pszEscapedStr = NULL; /*between*/ strlcat(szBuffer, " BETWEEN ", bufferSize); /*bound 1*/ if (bString) strlcat(szBuffer, "'", bufferSize); pszEscapedStr = msLayerEscapeSQLParam(lp, aszBounds[0]); strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); pszEscapedStr = NULL; if (bString) strlcat(szBuffer, "'", bufferSize); strlcat(szBuffer, " AND ", bufferSize); /*bound 2*/ if (bString) strlcat(szBuffer, "'", bufferSize); pszEscapedStr = msLayerEscapeSQLParam(lp, aszBounds[1]); strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); pszEscapedStr = NULL; if (bString) strlcat(szBuffer, "'", bufferSize); /*closing parenthesis*/ strlcat(szBuffer, ")", bufferSize); msFreeCharArray(aszBounds, nBounds); return msStrdup(szBuffer); } /************************************************************************/ /* FLTGetIsLikeComparisonSQLExpression */ /* */ /* Build an sql expression for IsLike filter. */ /************************************************************************/ char *FLTGetIsLikeComparisonSQLExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { const size_t bufferSize = 1024; char szBuffer[1024]; char *pszValue = NULL; const char *pszWild = NULL; const char *pszSingle = NULL; const char *pszEscape = NULL; char szTmp[4]; int nLength = 0, i = 0, j = 0; int bCaseInsensitive = 0; char *pszEscapedStr = NULL; FEPropertyIsLike *propIsLike; if (!psFilterNode || !psFilterNode->pOther || !psFilterNode->psLeftNode || !psFilterNode->psRightNode || !psFilterNode->psRightNode->pszValue) return NULL; propIsLike = (FEPropertyIsLike *)psFilterNode->pOther; pszWild = propIsLike->pszWildCard; pszSingle = propIsLike->pszSingleChar; pszEscape = propIsLike->pszEscapeChar; bCaseInsensitive = propIsLike->bCaseInsensitive; if (!pszWild || strlen(pszWild) == 0 || !pszSingle || strlen(pszSingle) == 0 || !pszEscape || strlen(pszEscape) == 0) return NULL; if (pszEscape[0] == '\'') { /* This might be valid, but the risk of SQL injection is too high */ /* and the below code is not ready for that */ /* Someone who does this has clearly suspect intentions ! */ msSetError( MS_MISCERR, "Single quote character is not allowed as an escaping character.", "FLTGetIsLikeComparisonSQLExpression()"); return NULL; } szBuffer[0] = '\0'; /*opening bracket*/ strlcat(szBuffer, " (", bufferSize); /* attribute name */ pszEscapedStr = msLayerEscapePropertyName(lp, psFilterNode->psLeftNode->pszValue); strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); pszEscapedStr = NULL; if (lp->connectiontype == MS_POSTGIS) { if (bCaseInsensitive == 1) strlcat(szBuffer, "::text ilike '", bufferSize); else strlcat(szBuffer, "::text like '", bufferSize); } else strlcat(szBuffer, " like '", bufferSize); pszValue = psFilterNode->psRightNode->pszValue; nLength = strlen(pszValue); pszEscapedStr = (char *)msSmallMalloc(3 * nLength + 1); for (i = 0, j = 0; i < nLength; i++) { char c = pszValue[i]; if (c != pszWild[0] && c != pszSingle[0] && c != pszEscape[0]) { if (c == '\'') { pszEscapedStr[j++] = '\''; pszEscapedStr[j++] = '\''; } else if (c == '\\') { pszEscapedStr[j++] = '\\'; pszEscapedStr[j++] = '\\'; } else pszEscapedStr[j++] = c; } else if (c == pszSingle[0]) { pszEscapedStr[j++] = '_'; } else if (c == pszEscape[0]) { pszEscapedStr[j++] = pszEscape[0]; if (i + 1 < nLength) { char nextC = pszValue[i + 1]; i++; if (nextC == '\'') { pszEscapedStr[j++] = '\''; pszEscapedStr[j++] = '\''; } else pszEscapedStr[j++] = nextC; } } else if (c == pszWild[0]) { pszEscapedStr[j++] = '%'; } } pszEscapedStr[j++] = 0; strlcat(szBuffer, pszEscapedStr, bufferSize); msFree(pszEscapedStr); strlcat(szBuffer, "'", bufferSize); if (lp->connectiontype != MS_OGR) { if (lp->connectiontype == MS_POSTGIS && pszEscape[0] == '\\') strlcat(szBuffer, " escape E'", bufferSize); else strlcat(szBuffer, " escape '", bufferSize); szTmp[0] = pszEscape[0]; if (pszEscape[0] == '\\') { szTmp[1] = '\\'; szTmp[2] = '\''; szTmp[3] = '\0'; } else { szTmp[1] = '\''; szTmp[2] = '\0'; } strlcat(szBuffer, szTmp, bufferSize); } strlcat(szBuffer, ") ", bufferSize); return msStrdup(szBuffer); } /************************************************************************/ /* FLTHasSpatialFilter */ /* */ /* Utility function to see if a spatial filter is included in */ /* the node. */ /************************************************************************/ int FLTHasSpatialFilter(FilterEncodingNode *psNode) { int bResult = MS_FALSE; if (!psNode) return MS_FALSE; if (psNode->eType == FILTER_NODE_TYPE_LOGICAL) { if (psNode->psLeftNode) bResult = FLTHasSpatialFilter(psNode->psLeftNode); if (bResult) return MS_TRUE; if (psNode->psRightNode) bResult = FLTHasSpatialFilter(psNode->psRightNode); if (bResult) return MS_TRUE; } else if (FLTIsBBoxFilter(psNode) || FLTIsPointFilter(psNode) || FLTIsLineFilter(psNode) || FLTIsPolygonFilter(psNode)) return MS_TRUE; return MS_FALSE; } /************************************************************************/ /* FLTCreateFeatureIdFilterEncoding */ /* */ /* Utility function to create a filter node of FeatureId type. */ /************************************************************************/ FilterEncodingNode *FLTCreateFeatureIdFilterEncoding(const char *pszString) { FilterEncodingNode *psFilterNode = NULL; if (pszString) { psFilterNode = FLTCreateFilterEncodingNode(); psFilterNode->eType = FILTER_NODE_TYPE_FEATUREID; psFilterNode->pszValue = msStrdup(pszString); return psFilterNode; } return NULL; } /************************************************************************/ /* FLTParseGMLBox */ /* */ /* Parse gml box. Used for FE 1.0 */ /************************************************************************/ int FLTParseGMLBox(CPLXMLNode *psBox, rectObj *psBbox, char **ppszSRS) { int bCoordinatesValid = 0; CPLXMLNode *psCoordinates = NULL; CPLXMLNode *psCoord1 = NULL, *psCoord2 = NULL; char **papszCoords = NULL, **papszMin = NULL, **papszMax = NULL; int nCoords = 0, nCoordsMin = 0, nCoordsMax = 0; const char *pszTmpCoord = NULL; const char *pszSRS = NULL; const char *pszTS = NULL; const char *pszCS = NULL; double minx = 0.0, miny = 0.0, maxx = 0.0, maxy = 0.0; if (psBox) { pszSRS = CPLGetXMLValue(psBox, "srsName", NULL); if (ppszSRS && pszSRS) *ppszSRS = msStrdup(pszSRS); psCoordinates = CPLGetXMLNode(psBox, "coordinates"); pszTS = CPLGetXMLValue(psCoordinates, "ts", NULL); if (pszTS == NULL) pszTS = " "; pszCS = CPLGetXMLValue(psCoordinates, "cs", NULL); if (pszCS == NULL) pszCS = ","; pszTmpCoord = CPLGetXMLValue(psCoordinates, NULL, NULL); if (pszTmpCoord) { papszCoords = msStringSplit(pszTmpCoord, pszTS[0], &nCoords); if (papszCoords && nCoords == 2) { papszMin = msStringSplit(papszCoords[0], pszCS[0], &nCoordsMin); if (papszMin && nCoordsMin == 2) { papszMax = msStringSplit(papszCoords[1], pszCS[0], &nCoordsMax); } if (papszMax && nCoordsMax == 2) { bCoordinatesValid = 1; minx = atof(papszMin[0]); miny = atof(papszMin[1]); maxx = atof(papszMax[0]); maxy = atof(papszMax[1]); } msFreeCharArray(papszMin, nCoordsMin); msFreeCharArray(papszMax, nCoordsMax); } msFreeCharArray(papszCoords, nCoords); } else { psCoord1 = CPLGetXMLNode(psBox, "coord"); psCoord2 = FLTGetNextSibblingNode(psCoord1); if (psCoord1 && psCoord2 && strcmp(psCoord2->pszValue, "coord") == 0) { const char *pszX = CPLGetXMLValue(psCoord1, "X", NULL); const char *pszY = CPLGetXMLValue(psCoord1, "Y", NULL); if (pszX && pszY) { minx = atof(pszX); miny = atof(pszY); pszX = CPLGetXMLValue(psCoord2, "X", NULL); pszY = CPLGetXMLValue(psCoord2, "Y", NULL); if (pszX && pszY) { maxx = atof(pszX); maxy = atof(pszY); bCoordinatesValid = 1; } } } } } if (bCoordinatesValid) { psBbox->minx = minx; psBbox->miny = miny; psBbox->maxx = maxx; psBbox->maxy = maxy; } return bCoordinatesValid; } /************************************************************************/ /* FLTParseGMLEnvelope */ /* */ /* Utility function to parse a gml:Envelope (used for SOS and FE1.1)*/ /************************************************************************/ int FLTParseGMLEnvelope(CPLXMLNode *psRoot, rectObj *psBbox, char **ppszSRS) { CPLXMLNode *psUpperCorner = NULL, *psLowerCorner = NULL; const char *pszLowerCorner = NULL, *pszUpperCorner = NULL; int bValid = 0; char **tokens; int n; if (psRoot && psBbox && psRoot->eType == CXT_Element && EQUAL(psRoot->pszValue, "Envelope")) { /*Get the srs if available*/ if (ppszSRS) { const char *pszSRS = CPLGetXMLValue(psRoot, "srsName", NULL); if (pszSRS != NULL) *ppszSRS = msStrdup(pszSRS); } psLowerCorner = CPLSearchXMLNode(psRoot, "lowerCorner"); psUpperCorner = CPLSearchXMLNode(psRoot, "upperCorner"); if (psLowerCorner && psUpperCorner) { pszLowerCorner = CPLGetXMLValue(psLowerCorner, NULL, NULL); pszUpperCorner = CPLGetXMLValue(psUpperCorner, NULL, NULL); if (pszLowerCorner && pszUpperCorner) { tokens = msStringSplit(pszLowerCorner, ' ', &n); if (tokens && n >= 2) { psBbox->minx = atof(tokens[0]); psBbox->miny = atof(tokens[1]); msFreeCharArray(tokens, n); tokens = msStringSplit(pszUpperCorner, ' ', &n); if (tokens && n >= 2) { psBbox->maxx = atof(tokens[0]); psBbox->maxy = atof(tokens[1]); bValid = 1; } } msFreeCharArray(tokens, n); } } } return bValid; } /************************************************************************/ /* FLTNeedSRSSwapping */ /************************************************************************/ static int FLTNeedSRSSwapping(mapObj *map, const char *pszSRS) { int bNeedSwapping = MS_FALSE; projectionObj sProjTmp; msInitProjection(&sProjTmp); if (map) { msProjectionInheritContextFrom(&sProjTmp, &map->projection); } if (msLoadProjectionStringEPSG(&sProjTmp, pszSRS) == 0) { bNeedSwapping = msIsAxisInvertedProj(&sProjTmp); } msFreeProjection(&sProjTmp); return bNeedSwapping; } /************************************************************************/ /* FLTDoAxisSwappingIfNecessary */ /* */ /* Explore all geometries and BBOX to do axis swapping when the */ /* SRS requires it. If no explicit SRS is attached to the geometry */ /* the bDefaultSRSNeedsAxisSwapping is taken into account. The */ /* caller will have to determine its value from a more general */ /* context. */ /************************************************************************/ void FLTDoAxisSwappingIfNecessary(mapObj *map, FilterEncodingNode *psFilterNode, int bDefaultSRSNeedsAxisSwapping) { if (psFilterNode == NULL) return; if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL && psFilterNode->psRightNode->eType == FILTER_NODE_TYPE_BBOX) { rectObj *rect = (rectObj *)psFilterNode->psRightNode->pOther; const char *pszSRS = psFilterNode->pszSRS; if ((pszSRS != NULL && FLTNeedSRSSwapping(map, pszSRS)) || (pszSRS == NULL && bDefaultSRSNeedsAxisSwapping)) { double tmp; tmp = rect->minx; rect->minx = rect->miny; rect->miny = tmp; tmp = rect->maxx; rect->maxx = rect->maxy; rect->maxy = tmp; } } else if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL && FLTIsGeometryFilterNodeType(psFilterNode->psRightNode->eType)) { shapeObj *shape = (shapeObj *)(psFilterNode->psRightNode->pOther); const char *pszSRS = psFilterNode->pszSRS; if ((pszSRS != NULL && FLTNeedSRSSwapping(map, pszSRS)) || (pszSRS == NULL && bDefaultSRSNeedsAxisSwapping)) { msAxisSwapShape(shape); } } else { FLTDoAxisSwappingIfNecessary(map, psFilterNode->psLeftNode, bDefaultSRSNeedsAxisSwapping); FLTDoAxisSwappingIfNecessary(map, psFilterNode->psRightNode, bDefaultSRSNeedsAxisSwapping); } } static void FLTReplacePropertyName(FilterEncodingNode *psFilterNode, const char *pszOldName, const char *pszNewName) { if (psFilterNode && pszOldName && pszNewName) { if (psFilterNode->eType == FILTER_NODE_TYPE_PROPERTYNAME) { if (psFilterNode->pszValue && strcasecmp(psFilterNode->pszValue, pszOldName) == 0) { msFree(psFilterNode->pszValue); psFilterNode->pszValue = msStrdup(pszNewName); } } if (psFilterNode->psLeftNode) FLTReplacePropertyName(psFilterNode->psLeftNode, pszOldName, pszNewName); if (psFilterNode->psRightNode) FLTReplacePropertyName(psFilterNode->psRightNode, pszOldName, pszNewName); } } static int FLTIsGMLDefaultProperty(const char *pszName) { return (strcmp(pszName, "gml:name") == 0 || strcmp(pszName, "gml:description") == 0 || strcmp(pszName, "gml:descriptionReference") == 0 || strcmp(pszName, "gml:identifier") == 0 || strcmp(pszName, "gml:boundedBy") == 0 || strcmp(pszName, "@gml:id") == 0); } static void FLTStripNameSpacesFromPropertyName(FilterEncodingNode *psFilterNode) { char **tokens = NULL; int n = 0; if (psFilterNode) { if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON && psFilterNode->psLeftNode != NULL && psFilterNode->psLeftNode->eType == FILTER_NODE_TYPE_PROPERTYNAME && FLTIsGMLDefaultProperty(psFilterNode->psLeftNode->pszValue)) { return; } if (psFilterNode->eType == FILTER_NODE_TYPE_PROPERTYNAME) { if (psFilterNode->pszValue && strstr(psFilterNode->pszValue, ":")) { tokens = msStringSplit(psFilterNode->pszValue, ':', &n); if (tokens && n == 2) { msFree(psFilterNode->pszValue); psFilterNode->pszValue = msStrdup(tokens[1]); } msFreeCharArray(tokens, n); } } if (psFilterNode->psLeftNode) FLTStripNameSpacesFromPropertyName(psFilterNode->psLeftNode); if (psFilterNode->psRightNode) FLTStripNameSpacesFromPropertyName(psFilterNode->psRightNode); } } static void FLTRemoveGroupName(FilterEncodingNode *psFilterNode, gmlGroupListObj *groupList) { int i; if (psFilterNode) { if (psFilterNode->eType == FILTER_NODE_TYPE_PROPERTYNAME) { if (psFilterNode->pszValue != NULL) { const char *pszPropertyName = psFilterNode->pszValue; const char *pszSlash = strchr(pszPropertyName, '/'); if (pszSlash != NULL) { const char *pszColon = strchr(pszPropertyName, ':'); if (pszColon != NULL && pszColon < pszSlash) pszPropertyName = pszColon + 1; for (i = 0; i < groupList->numgroups; i++) { const char *pszGroupName = groupList->groups[i].name; size_t nGroupNameLen = strlen(pszGroupName); if (strncasecmp(pszPropertyName, pszGroupName, nGroupNameLen) == 0 && pszPropertyName[nGroupNameLen] == '/') { char *pszTmp; pszPropertyName = pszPropertyName + nGroupNameLen + 1; pszColon = strchr(pszPropertyName, ':'); if (pszColon != NULL) pszPropertyName = pszColon + 1; pszTmp = msStrdup(pszPropertyName); msFree(psFilterNode->pszValue); psFilterNode->pszValue = pszTmp; break; } } } } } if (psFilterNode->psLeftNode) FLTRemoveGroupName(psFilterNode->psLeftNode, groupList); if (psFilterNode->psRightNode) FLTRemoveGroupName(psFilterNode->psRightNode, groupList); } } /************************************************************************/ /* FLTPreParseFilterForAliasAndGroup */ /* */ /* Utility function to replace aliased' and grouped attributes */ /* with their internal name. */ /************************************************************************/ void FLTPreParseFilterForAliasAndGroup(FilterEncodingNode *psFilterNode, mapObj *map, int i, const char *namespaces) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) if (psFilterNode && map && i >= 0 && i < map->numlayers) { /*strip name spaces before hand*/ FLTStripNameSpacesFromPropertyName(psFilterNode); layerObj *lp = GET_LAYER(map, i); int layerWasOpened = msLayerIsOpen(lp); if (msLayerOpen(lp) == MS_SUCCESS && msLayerGetItems(lp) == MS_SUCCESS) { /* Remove group names from property names if using groupname/itemname * syntax */ gmlGroupListObj *groupList = msGMLGetGroups(lp, namespaces); if (groupList && groupList->numgroups > 0) FLTRemoveGroupName(psFilterNode, groupList); msGMLFreeGroups(groupList); for (i = 0; i < lp->numitems; i++) { if (!lp->items[i] || strlen(lp->items[i]) <= 0) continue; char szTmp[256]; snprintf(szTmp, sizeof(szTmp), "%s_alias", lp->items[i]); const char *pszFullName = msOWSLookupMetadata(&(lp->metadata), namespaces, szTmp); if (pszFullName) { FLTReplacePropertyName(psFilterNode, pszFullName, lp->items[i]); } } if (!layerWasOpened) /* do not close the layer if it has been opened somewhere else (paging?) */ msLayerClose(lp); } } #else msSetError(MS_MISCERR, "OWS support is not available.", "FLTPreParseFilterForAlias()"); #endif } /************************************************************************/ /* FLTCheckFeatureIdFilters */ /* */ /* Check that FeatureId filters match features in the active */ /* layer. */ /************************************************************************/ int FLTCheckFeatureIdFilters(FilterEncodingNode *psFilterNode, mapObj *map, int i) { int status = MS_SUCCESS; if (psFilterNode->eType == FILTER_NODE_TYPE_FEATUREID) { char **tokens; int nTokens = 0; layerObj *lp; int j; lp = GET_LAYER(map, i); tokens = msStringSplit(psFilterNode->pszValue, ',', &nTokens); for (j = 0; j < nTokens; j++) { const char *pszId = tokens[j]; const char *pszDot = strrchr(pszId, '.'); if (pszDot) { if (static_cast(pszDot - pszId) != strlen(lp->name) || strncasecmp(pszId, lp->name, strlen(lp->name)) != 0) { msSetError(MS_MISCERR, "Feature id %s not consistent with feature type name %s.", "FLTPreParseFilterForAlias()", pszId, lp->name); status = MS_FAILURE; break; } } } msFreeCharArray(tokens, nTokens); } if (psFilterNode->psLeftNode) { status = FLTCheckFeatureIdFilters(psFilterNode->psLeftNode, map, i); if (status == MS_SUCCESS) { if (psFilterNode->psRightNode) status = FLTCheckFeatureIdFilters(psFilterNode->psRightNode, map, i); } } return status; } /************************************************************************/ /* FLTCheckInvalidOperand */ /* */ /* Check that the operand of a comparison operator is valid */ /* Currently only detects use of boundedBy in a binary comparison */ /************************************************************************/ int FLTCheckInvalidOperand(FilterEncodingNode *psFilterNode) { int status = MS_SUCCESS; if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON && psFilterNode->psLeftNode != NULL && psFilterNode->psLeftNode->eType == FILTER_NODE_TYPE_PROPERTYNAME) { if (strcmp(psFilterNode->psLeftNode->pszValue, "gml:boundedBy") == 0 && strcmp(psFilterNode->pszValue, "PropertyIsNull") != 0 && strcmp(psFilterNode->pszValue, "PropertyIsNil") != 0) { msSetError(MS_MISCERR, "Operand '%s' is invalid in comparison.", "FLTCheckInvalidOperand()", psFilterNode->psLeftNode->pszValue); return MS_FAILURE; } } if (psFilterNode->psLeftNode) { status = FLTCheckInvalidOperand(psFilterNode->psLeftNode); if (status == MS_SUCCESS) { if (psFilterNode->psRightNode) status = FLTCheckInvalidOperand(psFilterNode->psRightNode); } } return status; } /************************************************************************/ /* FLTProcessPropertyIsNull */ /* */ /* HACK for PropertyIsNull processing. PostGIS & Spatialite only */ /* for now. */ /************************************************************************/ int FLTProcessPropertyIsNull(FilterEncodingNode *psFilterNode, mapObj *map, int i) { int status = MS_SUCCESS; if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON && psFilterNode->psLeftNode != NULL && psFilterNode->psLeftNode->eType == FILTER_NODE_TYPE_PROPERTYNAME && strcmp(psFilterNode->pszValue, "PropertyIsNull") == 0 && !FLTIsGMLDefaultProperty(psFilterNode->psLeftNode->pszValue)) { layerObj *lp; int layerWasOpened; lp = GET_LAYER(map, i); layerWasOpened = msLayerIsOpen(lp); /* Horrible HACK to compensate for the lack of null testing in MapServer */ if (lp->connectiontype == MS_POSTGIS || (lp->connectiontype == MS_OGR && msOGRSupportsIsNull(lp))) { msFree(psFilterNode->pszValue); psFilterNode->pszValue = msStrdup("PropertyIsEqualTo"); psFilterNode->psRightNode = FLTCreateBinaryCompFilterEncodingNode(); psFilterNode->psRightNode->eType = FILTER_NODE_TYPE_LITERAL; psFilterNode->psRightNode->pszValue = msStrdup("_MAPSERVER_NULL_"); } if (!layerWasOpened) /* do not close the layer if it has been opened somewhere else (paging?) */ msLayerClose(lp); } if (psFilterNode->psLeftNode) { status = FLTProcessPropertyIsNull(psFilterNode->psLeftNode, map, i); if (status == MS_SUCCESS) { if (psFilterNode->psRightNode) status = FLTProcessPropertyIsNull(psFilterNode->psRightNode, map, i); } } return status; } /************************************************************************/ /* FLTCheckInvalidProperty */ /* */ /* Check that property names are known */ /************************************************************************/ int FLTCheckInvalidProperty(FilterEncodingNode *psFilterNode, mapObj *map, int i) { int status = MS_SUCCESS; if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON && psFilterNode->psLeftNode != NULL && psFilterNode->psLeftNode->eType == FILTER_NODE_TYPE_PROPERTYNAME) { layerObj *lp; int layerWasOpened; int bFound = MS_FALSE; if ((strcmp(psFilterNode->pszValue, "PropertyIsNull") == 0 || strcmp(psFilterNode->pszValue, "PropertyIsNil") == 0) && FLTIsGMLDefaultProperty(psFilterNode->psLeftNode->pszValue)) { return MS_SUCCESS; } lp = GET_LAYER(map, i); layerWasOpened = msLayerIsOpen(lp); if ((layerWasOpened || msLayerOpen(lp) == MS_SUCCESS) && msLayerGetItems(lp) == MS_SUCCESS) { int i; gmlItemListObj *items = msGMLGetItems(lp, "G"); for (i = 0; i < items->numitems; i++) { if (!items->items[i].name || strlen(items->items[i].name) == 0 || !items->items[i].visible) continue; if (strcasecmp(items->items[i].name, psFilterNode->psLeftNode->pszValue) == 0) { bFound = MS_TRUE; break; } } msGMLFreeItems(items); } if (!layerWasOpened) /* do not close the layer if it has been opened somewhere else (paging?) */ msLayerClose(lp); if (!bFound) { msSetError(MS_MISCERR, "Property '%s' is unknown.", "FLTCheckInvalidProperty()", psFilterNode->psLeftNode->pszValue); return MS_FAILURE; } } if (psFilterNode->psLeftNode) { status = FLTCheckInvalidProperty(psFilterNode->psLeftNode, map, i); if (status == MS_SUCCESS) { if (psFilterNode->psRightNode) status = FLTCheckInvalidProperty(psFilterNode->psRightNode, map, i); } } return status; } /************************************************************************/ /* FLTSimplify */ /* */ /* Simplify the expression by removing parts that evaluate to */ /* constants. */ /* The passed psFilterNode is potentially consumed by the function */ /* and replaced by the returned value. */ /* If the function returns NULL, *pnEvaluation = MS_FALSE means */ /* that the filter evaluates to FALSE, or MS_TRUE that it */ /* evaluates to TRUE */ /************************************************************************/ FilterEncodingNode *FLTSimplify(FilterEncodingNode *psFilterNode, int *pnEvaluation) { *pnEvaluation = -1; /* There are no nullable or nillable property in WFS currently */ /* except gml:name or gml:description that are null */ if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON && (strcmp(psFilterNode->pszValue, "PropertyIsNull") == 0 || strcmp(psFilterNode->pszValue, "PropertyIsNil") == 0) && psFilterNode->psLeftNode != NULL && psFilterNode->psLeftNode->eType == FILTER_NODE_TYPE_PROPERTYNAME) { if (strcmp(psFilterNode->pszValue, "PropertyIsNull") == 0 && FLTIsGMLDefaultProperty(psFilterNode->psLeftNode->pszValue) && strcmp(psFilterNode->psLeftNode->pszValue, "@gml:id") != 0 && strcmp(psFilterNode->psLeftNode->pszValue, "gml:boundedBy") != 0) *pnEvaluation = MS_TRUE; else *pnEvaluation = MS_FALSE; FLTFreeFilterEncodingNode(psFilterNode); return NULL; } if (psFilterNode->eType == FILTER_NODE_TYPE_LOGICAL && strcasecmp(psFilterNode->pszValue, "NOT") == 0 && psFilterNode->psLeftNode != NULL) { int nEvaluation; psFilterNode->psLeftNode = FLTSimplify(psFilterNode->psLeftNode, &nEvaluation); if (psFilterNode->psLeftNode == NULL) { *pnEvaluation = 1 - nEvaluation; FLTFreeFilterEncodingNode(psFilterNode); return NULL; } } if (psFilterNode->eType == FILTER_NODE_TYPE_LOGICAL && (strcasecmp(psFilterNode->pszValue, "AND") == 0 || strcasecmp(psFilterNode->pszValue, "OR") == 0) && psFilterNode->psLeftNode != NULL && psFilterNode->psRightNode != NULL) { FilterEncodingNode *psOtherNode; int nEvaluation; int nExpectedValForFastExit; psFilterNode->psLeftNode = FLTSimplify(psFilterNode->psLeftNode, &nEvaluation); if (strcasecmp(psFilterNode->pszValue, "AND") == 0) nExpectedValForFastExit = MS_FALSE; else nExpectedValForFastExit = MS_TRUE; if (psFilterNode->psLeftNode == NULL) { if (nEvaluation == nExpectedValForFastExit) { *pnEvaluation = nEvaluation; FLTFreeFilterEncodingNode(psFilterNode); return NULL; } psOtherNode = psFilterNode->psRightNode; psFilterNode->psRightNode = NULL; FLTFreeFilterEncodingNode(psFilterNode); return FLTSimplify(psOtherNode, pnEvaluation); } psFilterNode->psRightNode = FLTSimplify(psFilterNode->psRightNode, &nEvaluation); if (psFilterNode->psRightNode == NULL) { if (nEvaluation == nExpectedValForFastExit) { *pnEvaluation = nEvaluation; FLTFreeFilterEncodingNode(psFilterNode); return NULL; } psOtherNode = psFilterNode->psLeftNode; psFilterNode->psLeftNode = NULL; FLTFreeFilterEncodingNode(psFilterNode); return FLTSimplify(psOtherNode, pnEvaluation); } } return psFilterNode; } #ifdef USE_LIBXML2 xmlNodePtr FLTGetCapabilities(xmlNsPtr psNsParent, xmlNsPtr psNsOgc, int bTemporal) { xmlNodePtr psRootNode = NULL, psNode = NULL, psSubNode = NULL, psSubSubNode = NULL; psRootNode = xmlNewNode(psNsParent, BAD_CAST "Filter_Capabilities"); psNode = xmlNewChild(psRootNode, psNsOgc, BAD_CAST "Spatial_Capabilities", NULL); psSubNode = xmlNewChild(psNode, psNsOgc, BAD_CAST "GeometryOperands", NULL); xmlNewChild(psSubNode, psNsOgc, BAD_CAST "GeometryOperand", BAD_CAST "gml:Point"); xmlNewChild(psSubNode, psNsOgc, BAD_CAST "GeometryOperand", BAD_CAST "gml:LineString"); xmlNewChild(psSubNode, psNsOgc, BAD_CAST "GeometryOperand", BAD_CAST "gml:Polygon"); xmlNewChild(psSubNode, psNsOgc, BAD_CAST "GeometryOperand", BAD_CAST "gml:Envelope"); psSubNode = xmlNewChild(psNode, psNsOgc, BAD_CAST "SpatialOperators", NULL); #ifdef USE_GEOS psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Equals"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Disjoint"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Touches"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Within"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Overlaps"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Crosses"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Intersects"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Contains"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "DWithin"); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "Beyond"); #endif psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "SpatialOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "BBOX"); if (bTemporal) { psNode = xmlNewChild(psRootNode, psNsOgc, BAD_CAST "Temporal_Capabilities", NULL); psSubNode = xmlNewChild(psNode, psNsOgc, BAD_CAST "TemporalOperands", NULL); xmlNewChild(psSubNode, psNsOgc, BAD_CAST "TemporalOperand", BAD_CAST "gml:TimePeriod"); xmlNewChild(psSubNode, psNsOgc, BAD_CAST "TemporalOperand", BAD_CAST "gml:TimeInstant"); psSubNode = xmlNewChild(psNode, psNsOgc, BAD_CAST "TemporalOperators", NULL); psSubSubNode = xmlNewChild(psSubNode, psNsOgc, BAD_CAST "TemporalOperator", NULL); xmlNewProp(psSubSubNode, BAD_CAST "name", BAD_CAST "TM_Equals"); } psNode = xmlNewChild(psRootNode, psNsOgc, BAD_CAST "Scalar_Capabilities", NULL); xmlNewChild(psNode, psNsOgc, BAD_CAST "LogicalOperators", NULL); psNode = xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperators", NULL); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "LessThan"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "GreaterThan"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "LessThanEqualTo"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "GreaterThanEqualTo"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "EqualTo"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "NotEqualTo"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "Like"); xmlNewChild(psNode, psNsOgc, BAD_CAST "ComparisonOperator", BAD_CAST "Between"); psNode = xmlNewChild(psRootNode, psNsOgc, BAD_CAST "Id_Capabilities", NULL); xmlNewChild(psNode, psNsOgc, BAD_CAST "EID", NULL); xmlNewChild(psNode, psNsOgc, BAD_CAST "FID", NULL); return psRootNode; } #endif mapserver-8.6.0/src/mapogcfilter.h000066400000000000000000000202601511405061000171360ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: OGC Filter Encoding implementation * Author: Y. Assefa, DM Solutions Group (assefa@dmsolutions.ca) * ********************************************************************** * Copyright (c) 2003, Y. Assefa, DM Solutions Group Inc * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #ifndef MAPOGCFILTER_H #define MAPOGCFILTER_H #include "mapserver.h" /* There is a dependency to OGR for the MiniXML parser */ #include "cpl_minixml.h" #ifdef USE_LIBXML2 #include #include #endif #ifdef __cplusplus extern "C" { #endif typedef struct { char *pszWildCard; char *pszSingleChar; char *pszEscapeChar; int bCaseInsensitive; } FEPropertyIsLike; /* -------------------------------------------------------------------- */ /* prototypes. */ /* -------------------------------------------------------------------- */ MS_DLL_EXPORT int FLTIsNumeric(const char *pszValue); MS_DLL_EXPORT int FLTApplyExpressionToLayer(layerObj *lp, const char *pszExpression); MS_DLL_EXPORT char *FLTGetExpressionForValuesRanges(layerObj *lp, const char *item, const char *value, int forcecharcter); MS_DLL_EXPORT FilterEncodingNode * FLTParseFilterEncoding(const char *szXMLString); MS_DLL_EXPORT FilterEncodingNode *FLTCreateFilterEncodingNode(void); MS_DLL_EXPORT char **FLTSplitFilters(const char *pszStr, int *pnTokens); MS_DLL_EXPORT int FLTApplyFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex); MS_DLL_EXPORT int FLTLayerApplyCondSQLFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex); MS_DLL_EXPORT int FLTLayerApplyPlainFilterToLayer(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex); MS_DLL_EXPORT void FLTFreeFilterEncodingNode(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTValidFilterNode(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTValidForBBoxFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTNumberOfFilterType(FilterEncodingNode *psFilterNode, const char *szType); MS_DLL_EXPORT int FLTIsBBoxFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTIsPointFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTIsLineFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTIsPolygonFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTValidForPropertyIsLikeFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT int FLTIsOnlyPropertyIsLike(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT void FLTInsertElementInNode(FilterEncodingNode *psFilterNode, CPLXMLNode *psXMLNode); MS_DLL_EXPORT int FLTIsLogicalFilterType(const char *pszValue); MS_DLL_EXPORT int FLTIsBinaryComparisonFilterType(const char *pszValue); MS_DLL_EXPORT int FLTIsComparisonFilterType(const char *pszValue); MS_DLL_EXPORT int FLTIsFeatureIdFilterType(const char *pszValue); MS_DLL_EXPORT int FLTIsSpatialFilterType(const char *pszValue); MS_DLL_EXPORT int FLTIsTemporalFilterType(const char *pszValue); MS_DLL_EXPORT int FLTIsSupportedFilterType(CPLXMLNode *psXMLNode); MS_DLL_EXPORT const char *FLTGetBBOX(FilterEncodingNode *psFilterNode, rectObj *psRect); const char *FLTGetDuring(FilterEncodingNode *psFilterNode, const char **ppszTimeField); MS_DLL_EXPORT shapeObj *FLTGetShape(FilterEncodingNode *psFilterNode, double *pdfDistance, int *pnUnit); MS_DLL_EXPORT int FLTHasSpatialFilter(FilterEncodingNode *psFilterNode); /*SQL expressions related functions.*/ MS_DLL_EXPORT int FLTApplySimpleSQLFilter(FilterEncodingNode *psNode, mapObj *map, int iLayerIndex); MS_DLL_EXPORT char *FLTGetSQLExpression(FilterEncodingNode *psFilterNode, layerObj *lp); MS_DLL_EXPORT char * FLTGetBinaryComparisonSQLExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp); MS_DLL_EXPORT char * FLTGetIsBetweenComparisonSQLExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp); MS_DLL_EXPORT char * FLTGetIsLikeComparisonSQLExpression(FilterEncodingNode *psFilterNode, layerObj *lp); MS_DLL_EXPORT char * FLTGetLogicalComparisonSQLExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp); MS_DLL_EXPORT int FLTIsSimpleFilter(FilterEncodingNode *psFilterNode); MS_DLL_EXPORT FilterEncodingNode * FLTCreateFeatureIdFilterEncoding(const char *pszString); MS_DLL_EXPORT int FLTParseGMLEnvelope(CPLXMLNode *psRoot, rectObj *psBbox, char **ppszSRS); MS_DLL_EXPORT int FLTParseGMLBox(CPLXMLNode *psBox, rectObj *psBbox, char **ppszSRS); /*common-expressions*/ MS_DLL_EXPORT char *FLTGetCommonExpression(FilterEncodingNode *psFilterNode, layerObj *lp); MS_DLL_EXPORT int FLTApplyFilterToLayerCommonExpression(mapObj *map, int iLayerIndex, const char *pszExpression); #ifdef USE_LIBXML2 MS_DLL_EXPORT xmlNodePtr FLTGetCapabilities(xmlNsPtr psNsParent, xmlNsPtr psNsOgc, int bTemporal); #endif void FLTDoAxisSwappingIfNecessary(mapObj *map, FilterEncodingNode *psFilterNode, int bDefaultSRSNeedsAxisSwapping); void FLTPreParseFilterForAliasAndGroup(FilterEncodingNode *psFilterNode, mapObj *map, int i, const char *namespaces); int FLTCheckFeatureIdFilters(FilterEncodingNode *psFilterNode, mapObj *map, int i); int FLTCheckInvalidOperand(FilterEncodingNode *psFilterNode); int FLTCheckInvalidProperty(FilterEncodingNode *psFilterNode, mapObj *map, int i); FilterEncodingNode *FLTSimplify(FilterEncodingNode *psFilterNode, int *pnEvaluation); int FLTApplyFilterToLayerCommonExpressionWithRect(mapObj *map, int iLayerIndex, const char *pszExpression, rectObj rect); int FLTProcessPropertyIsNull(FilterEncodingNode *psFilterNode, mapObj *map, int i); int FLTLayerSetInvalidRectIfSupported(layerObj *lp, rectObj *rect, const char *metadata_namespaces); #ifdef __cplusplus } std::string FLTGetTimeExpression(FilterEncodingNode *psFilterNode, layerObj *lp); #endif #endif mapserver-8.6.0/src/mapogcfiltercommon.cpp000066400000000000000000000550511511405061000207100ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: OGC Filter Encoding implementation * Author: Y. Assefa, DM Solutions Group (assefa@dmsolutions.ca) * ********************************************************************** * Copyright (c) 2003, Y. Assefa, DM Solutions Group Inc * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapogcfilter.h" #include "mapserver.h" #include "mapows.h" #include "mapowscommon.h" #include "cpl_minixml.h" #include static std::string FLTEscapePropertyName(const char *pszStr, char chEscapeChar) { std::string ret; for (; *pszStr; ++pszStr) { if (*pszStr == chEscapeChar) { ret += chEscapeChar; ret += chEscapeChar; } else { ret += *pszStr; } } return ret; } static std::string FLTGetIsLikeComparisonCommonExpression(FilterEncodingNode *psFilterNode) { /* From * http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_04 */ /* also add double quote because we are within a string */ const char *pszRegexSpecialCharsAndDoubleQuote = "\\^${[().*+?|\""; if (!psFilterNode || !psFilterNode->pOther || !psFilterNode->psLeftNode || !psFilterNode->psRightNode || !psFilterNode->psRightNode->pszValue) return std::string(); const FEPropertyIsLike *propIsLike = (const FEPropertyIsLike *)psFilterNode->pOther; const char *pszWild = propIsLike->pszWildCard; const char *pszSingle = propIsLike->pszSingleChar; const char *pszEscape = propIsLike->pszEscapeChar; const bool bCaseInsensitive = propIsLike->bCaseInsensitive != 0; if (!pszWild || strlen(pszWild) == 0 || !pszSingle || strlen(pszSingle) == 0 || !pszEscape || strlen(pszEscape) == 0) return std::string(); /* -------------------------------------------------------------------- */ /* Use operand with regular expressions. */ /* -------------------------------------------------------------------- */ std::string expr("(\"["); /* attribute */ expr += FLTEscapePropertyName(psFilterNode->psLeftNode->pszValue, '"'); /* #3521 */ if (bCaseInsensitive) expr += "]\" ~* \""; else expr += "]\" ~ \""; const char *pszValue = psFilterNode->psRightNode->pszValue; const size_t nLength = strlen(pszValue); if (nLength > 0) { expr += '^'; } for (size_t i = 0; i < nLength; i++) { if (pszValue[i] == pszSingle[0]) { expr += '.'; /* The Filter escape character is supposed to only escape the single, * wildcard and escape character */ } else if (pszValue[i] == pszEscape[0] && (pszValue[i + 1] == pszSingle[0] || pszValue[i + 1] == pszWild[0] || pszValue[i + 1] == pszEscape[0])) { if (pszValue[i + 1] == '\\') { /* Tricky case: \ must be escaped ncce in the regular expression context so that the regexp matches it as an ordinary character. But as \ is also the escape character for MapServer string, we must escape it again. */ expr += "\\" "\\" "\\" "\\"; } else { /* If the escaped character is itself a regular expression special * character */ /* we need to regular-expression-escape-it ! */ if (strchr(pszRegexSpecialCharsAndDoubleQuote, pszValue[i + 1])) { expr += '\\'; } expr += pszValue[i + 1]; } i++; } else if (pszValue[i] == pszWild[0]) { expr += ".*"; } /* Escape regular expressions special characters and double quote */ else if (strchr(pszRegexSpecialCharsAndDoubleQuote, pszValue[i])) { if (pszValue[i] == '\\') { /* See above explantation */ expr += "\\" "\\" "\\" "\\"; } else { expr += '\\'; expr += pszValue[i]; } } else { expr += pszValue[i]; } } if (nLength > 0) { expr += '$'; } expr += "\")"; return expr; } static std::string FLTGetIsBetweenComparisonCommonExpresssion(FilterEncodingNode *psFilterNode, layerObj *lp) { if (psFilterNode->psLeftNode == NULL || psFilterNode->psRightNode == NULL) return std::string(); /* -------------------------------------------------------------------- */ /* Get the bounds value which are stored like boundmin;boundmax */ /* -------------------------------------------------------------------- */ const auto bounds = msStringSplit(psFilterNode->psRightNode->pszValue, ';'); if (bounds.size() != 2) { return std::string(); } /* -------------------------------------------------------------------- */ /* check if the value is a numeric value or alphanumeric. If it */ /* is alphanumeric, add quotes around attribute and values. */ /* -------------------------------------------------------------------- */ bool bString = false; bool bDateTime = false; const char *pszType = msOWSLookupMetadata( &(lp->metadata), "OFG", (std::string(psFilterNode->psLeftNode->pszValue) + "_type").c_str()); if (pszType != NULL && (strcasecmp(pszType, "Character") == 0)) bString = true; else if (pszType != NULL && (strcasecmp(pszType, "Date") == 0)) bDateTime = true; else if (FLTIsNumeric(bounds[0].c_str()) == MS_FALSE) bString = true; if (!bString && !bDateTime) { if (FLTIsNumeric(bounds[1].c_str()) == MS_FALSE) bString = true; } std::string expr; /* -------------------------------------------------------------------- */ /* build expression. */ /* -------------------------------------------------------------------- */ /* attribute */ if (bString) expr += "(\"["; else expr += "(["; expr += FLTEscapePropertyName(psFilterNode->psLeftNode->pszValue, bString ? '"' : ']'); if (bString) expr += "]\" "; else expr += "] "; expr += " >= "; if (bString) { expr += '\"'; } else if (bDateTime) { expr += '`'; } expr += msStdStringEscape(bounds[0].c_str()); if (bString) { expr += '\"'; } else if (bDateTime) { expr += '`'; } expr += " AND "; if (bString) expr += " \"["; else expr += " ["; /* attribute */ expr += psFilterNode->psLeftNode->pszValue; if (bString) expr += "]\" "; else expr += "] "; expr += " <= "; if (bString) { expr += '\"'; } else if (bDateTime) { expr += '`'; } expr += msStdStringEscape(bounds[1].c_str()); if (bString) { expr += '\"'; } else if (bDateTime) { expr += '`'; } expr += ')'; return expr; } static std::string FLTGetBinaryComparisonCommonExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { /* -------------------------------------------------------------------- */ /* check if the value is a numeric value or alphanumeric. If it */ /* is alphanumeric, add quotes around attribute and values. */ /* -------------------------------------------------------------------- */ bool bString = false; bool bDateTime = false; if (psFilterNode->psRightNode->pszValue) { const char *pszType = msOWSLookupMetadata( &(lp->metadata), "OFG", (std::string(psFilterNode->psLeftNode->pszValue) + "_type").c_str()); if (pszType != NULL && (strcasecmp(pszType, "Character") == 0)) bString = true; else if (pszType != NULL && (strcasecmp(pszType, "Date") == 0)) bDateTime = true; else if (FLTIsNumeric(psFilterNode->psRightNode->pszValue) == MS_FALSE) bString = true; } /* special case to be able to have empty strings in the expression. */ /* propertyislike is always treated as string */ if (psFilterNode->psRightNode->pszValue == NULL || strcasecmp(psFilterNode->pszValue, "PropertyIsLike") == 0) bString = true; /* attribute */ std::string expr; if (bString) expr = "(\"["; else expr = "(["; expr += FLTEscapePropertyName(psFilterNode->psLeftNode->pszValue, bString ? '"' : ']'); if (bString) expr += "]\" "; else expr += "] "; if (strcasecmp(psFilterNode->pszValue, "PropertyIsEqualTo") == 0) { /* case insensitive set ? */ if (psFilterNode->psRightNode->pOther && (*(int *)psFilterNode->psRightNode->pOther) == 1) expr += "=*"; else expr += "="; } else if (strcasecmp(psFilterNode->pszValue, "PropertyIsNotEqualTo") == 0) expr += "!="; else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLessThan") == 0) expr += "<"; else if (strcasecmp(psFilterNode->pszValue, "PropertyIsGreaterThan") == 0) expr += ">"; else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLessThanOrEqualTo") == 0) expr += "<="; else if (strcasecmp(psFilterNode->pszValue, "PropertyIsGreaterThanOrEqualTo") == 0) expr += ">="; else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLike") == 0) expr += "~"; expr += ' '; /* value */ if (bString) { expr += "\""; } else if (bDateTime) { expr += "`"; } if (psFilterNode->psRightNode->pszValue) { expr += msStdStringEscape(psFilterNode->psRightNode->pszValue); } if (bString) { expr += "\""; } else if (bDateTime) { expr += "`"; } expr += ")"; return expr; } static std::string FLTGetLogicalComparisonCommonExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { std::string expr; /* -------------------------------------------------------------------- */ /* OR and AND */ /* -------------------------------------------------------------------- */ if (psFilterNode->psLeftNode && psFilterNode->psRightNode) { char *pszTmp = FLTGetCommonExpression(psFilterNode->psLeftNode, lp); if (!pszTmp) return std::string(); expr = '('; expr += pszTmp; msFree(pszTmp); expr += ' '; expr += psFilterNode->pszValue; expr += ' '; pszTmp = FLTGetCommonExpression(psFilterNode->psRightNode, lp); if (!pszTmp) { return std::string(); } expr += pszTmp; msFree(pszTmp); expr += ')'; } /* -------------------------------------------------------------------- */ /* NOT */ /* -------------------------------------------------------------------- */ else if (psFilterNode->psLeftNode && strcasecmp(psFilterNode->pszValue, "NOT") == 0) { char *pszTmp = FLTGetCommonExpression(psFilterNode->psLeftNode, lp); if (!pszTmp) return std::string(); expr = "(NOT "; expr += pszTmp; msFree(pszTmp); expr += ')'; } return expr; } static std::string FLTGetSpatialComparisonCommonExpression(FilterEncodingNode *psNode, layerObj *lp) { std::string expr; double dfDistance = -1; shapeObj *psTmpShape = NULL; bool bBBoxQuery = false; bool bAlreadyReprojected = false; if (lp == NULL) return std::string(); /* get the shape */ if (FLTIsBBoxFilter(psNode)) { rectObj sQueryRect; FLTGetBBOX(psNode, &sQueryRect); char szPolygon[512]; snprintf(szPolygon, sizeof(szPolygon), "POLYGON((%.18f %.18f,%.18f %.18f,%.18f %.18f,%.18f %.18f,%.18f " "%.18f))", sQueryRect.minx, sQueryRect.miny, sQueryRect.minx, sQueryRect.maxy, sQueryRect.maxx, sQueryRect.maxy, sQueryRect.maxx, sQueryRect.miny, sQueryRect.minx, sQueryRect.miny); psTmpShape = msShapeFromWKT(szPolygon); /* ** This is a horrible hack to deal with world-extent requests and ** reprojection. msProjectRect() detects if reprojection from longlat to ** projected SRS, and in that case it transforms the bbox to *-1e-15,-1e-15,1e15,1e15 ** to ensure that all features are returned. ** ** Make wfs_200_cite_filter_bbox_world.xml and *wfs_200_cite_postgis_bbox_world.xml pass */ if (fabs(sQueryRect.minx - -180.0) < 1e-5 && fabs(sQueryRect.miny - -90.0) < 1e-5 && fabs(sQueryRect.maxx - 180.0) < 1e-5 && fabs(sQueryRect.maxy - 90.0) < 1e-5) { if (lp->projection.numargs > 0) { projectionObj sProjTmp; if (psNode->pszSRS) { msInitProjection(&sProjTmp); msProjectionInheritContextFrom(&sProjTmp, &lp->projection); } if (psNode->pszSRS) { /* Use the non EPSG variant since axis swapping is done in * FLTDoAxisSwappingIfNecessary */ if (msLoadProjectionString(&sProjTmp, psNode->pszSRS) == 0) { msProjectRect(&sProjTmp, &lp->projection, &sQueryRect); } } else if (lp->map->projection.numargs > 0) msProjectRect(&lp->map->projection, &lp->projection, &sQueryRect); if (psNode->pszSRS) msFreeProjection(&sProjTmp); } if (sQueryRect.minx <= -1e14) { msFreeShape(psTmpShape); msFree(psTmpShape); psTmpShape = (shapeObj *)msSmallMalloc(sizeof(shapeObj)); msInitShape(psTmpShape); msRectToPolygon(sQueryRect, psTmpShape); bAlreadyReprojected = true; } } bBBoxQuery = true; } else { /* other geos type operations */ /* project shape to layer projection. If the proj is not part of the filter query, assume that the cooredinates are in the map projection */ int nUnit = -1; shapeObj *psQueryShape = FLTGetShape(psNode, &dfDistance, &nUnit); if ((strcasecmp(psNode->pszValue, "DWithin") == 0 || strcasecmp(psNode->pszValue, "Beyond") == 0) && dfDistance > 0) { int nLayerUnit = lp->units; if (nLayerUnit == -1) nLayerUnit = GetMapserverUnitUsingProj(&lp->projection); if (nLayerUnit == -1) nLayerUnit = lp->map->units; if (nLayerUnit == -1) nLayerUnit = GetMapserverUnitUsingProj(&lp->map->projection); if (nUnit >= 0 && nUnit != nLayerUnit) dfDistance *= msInchesPerUnit(nUnit, 0) / msInchesPerUnit(nLayerUnit, 0); /* target is layer units */ } psTmpShape = psQueryShape; } if (psTmpShape) { /* ** target is layer projection */ if (!bAlreadyReprojected && lp->projection.numargs > 0) { projectionObj sProjTmp; if (psNode->pszSRS) { msInitProjection(&sProjTmp); msProjectionInheritContextFrom(&sProjTmp, &lp->projection); } if (psNode->pszSRS) { /* Use the non EPSG variant since axis swapping is done in * FLTDoAxisSwappingIfNecessary */ if (msLoadProjectionString(&sProjTmp, psNode->pszSRS) == 0) { msProjectShape(&sProjTmp, &lp->projection, psTmpShape); } } else if (lp->map->projection.numargs > 0) msProjectShape(&lp->map->projection, &lp->projection, psTmpShape); if (psNode->pszSRS) msFreeProjection(&sProjTmp); } /* function name */ if (bBBoxQuery) { expr = "intersects"; } else { if (strncasecmp(psNode->pszValue, "intersect", 9) == 0) expr = "intersects"; else { expr = msStringToLower(std::string(psNode->pszValue)); } } /* geometry binding */ expr += "([shape],fromText('"; /* filter geometry */ char *pszWktText = msGEOSShapeToWKT(psTmpShape); expr += pszWktText ? pszWktText : "Cannot translate shape to WKT"; expr += "')"; msGEOSFreeWKT(pszWktText); /* (optional) beyond/dwithin distance, always 0.0 since we apply the * distance as a buffer earlier */ if ((strcasecmp(psNode->pszValue, "DWithin") == 0 || strcasecmp(psNode->pszValue, "Beyond") == 0)) { char szBuffer[32]; snprintf(szBuffer, sizeof(szBuffer), ",%g", dfDistance); expr += szBuffer; } /* terminate the function */ expr += ") = TRUE"; } /* ** Cleanup */ if (bBBoxQuery) { msFreeShape(psTmpShape); msFree(psTmpShape); } return expr; } static std::string FLTGetFeatureIdCommonExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { std::string expr; #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) if (psFilterNode->pszValue) { const char *pszAttribute = msOWSLookupMetadata(&(lp->metadata), "OFG", "featureid"); if (pszAttribute) { const auto tokens = msStringSplit(psFilterNode->pszValue, ','); if (!tokens.empty()) { bool bString = false; for (size_t i = 0; i < tokens.size(); i++) { const char *pszId = tokens[i].c_str(); const char *pszDot = strrchr(pszId, '.'); if (pszDot) pszId = pszDot + 1; if (i == 0) { if (FLTIsNumeric(pszId) == MS_FALSE) bString = true; } if (!expr.empty()) expr += " OR "; else expr = '('; if (bString) { expr += "(\"["; expr += FLTEscapePropertyName(pszAttribute, '"'); expr += "]\" == \""; expr += pszId; expr += "\")"; } else { expr += "(["; expr += FLTEscapePropertyName(pszAttribute, ']'); expr += "] == "; expr += pszId; expr += ")"; } } } } /* opening and closing brackets are needed for mapserver expressions */ if (!expr.empty()) expr += ')'; } #endif return expr; } std::string FLTGetTimeExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { if (lp == NULL) return std::string(); std::string expr; const char *pszTimeField = nullptr; const char *pszTimeValue = FLTGetDuring(psFilterNode, &pszTimeField); if (pszTimeField && pszTimeValue) { expressionObj old_filter; msInitExpression(&old_filter); msCopyExpression(&old_filter, &lp->filter); /* save existing filter */ msFreeExpression(&lp->filter); if (msLayerSetTimeFilter(lp, pszTimeValue, pszTimeField) == MS_TRUE && lp->filter.string) { expr = lp->filter.string; } msCopyExpression(&lp->filter, &old_filter); /* restore old filter */ msFreeExpression(&old_filter); } return expr; } char *FLTGetCommonExpression(FilterEncodingNode *psFilterNode, layerObj *lp) { char *pszExpression = NULL; if (!psFilterNode) return NULL; if (psFilterNode->eType == FILTER_NODE_TYPE_COMPARISON) { if (psFilterNode->psLeftNode && psFilterNode->psRightNode) { if (FLTIsBinaryComparisonFilterType(psFilterNode->pszValue)) pszExpression = msStrdup( FLTGetBinaryComparisonCommonExpression(psFilterNode, lp).c_str()); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsLike") == 0) pszExpression = msStrdup( FLTGetIsLikeComparisonCommonExpression(psFilterNode).c_str()); else if (strcasecmp(psFilterNode->pszValue, "PropertyIsBetween") == 0) pszExpression = msStrdup( FLTGetIsBetweenComparisonCommonExpresssion(psFilterNode, lp) .c_str()); } } else if (psFilterNode->eType == FILTER_NODE_TYPE_LOGICAL) { pszExpression = msStrdup( FLTGetLogicalComparisonCommonExpression(psFilterNode, lp).c_str()); } else if (psFilterNode->eType == FILTER_NODE_TYPE_SPATIAL) { pszExpression = msStrdup( FLTGetSpatialComparisonCommonExpression(psFilterNode, lp).c_str()); } else if (psFilterNode->eType == FILTER_NODE_TYPE_FEATUREID) { pszExpression = msStrdup(FLTGetFeatureIdCommonExpression(psFilterNode, lp).c_str()); } else if (psFilterNode->eType == FILTER_NODE_TYPE_TEMPORAL) { pszExpression = msStrdup(FLTGetTimeExpression(psFilterNode, lp).c_str()); } return pszExpression; } int FLTApplyFilterToLayerCommonExpression(mapObj *map, int iLayerIndex, const char *pszExpression) { return FLTApplyFilterToLayerCommonExpressionWithRect( map, iLayerIndex, pszExpression, map->extent); } /* rect must be in map->projection */ int FLTApplyFilterToLayerCommonExpressionWithRect(mapObj *map, int iLayerIndex, const char *pszExpression, rectObj rect) { int retval; const int save_startindex = map->query.startindex; const int save_maxfeatures = map->query.maxfeatures; const int save_only_cache_result_count = map->query.only_cache_result_count; const int save_cache_shapes = map->query.cache_shapes; const int save_max_cached_shape_count = map->query.max_cached_shape_count; const int save_max_cached_shape_ram_amount = map->query.max_cached_shape_ram_amount; msInitQuery(&(map->query)); map->query.startindex = save_startindex; map->query.maxfeatures = save_maxfeatures; map->query.only_cache_result_count = save_only_cache_result_count; map->query.cache_shapes = save_cache_shapes; map->query.max_cached_shape_count = save_max_cached_shape_count; map->query.max_cached_shape_ram_amount = save_max_cached_shape_ram_amount; map->query.mode = MS_QUERY_MULTIPLE; map->query.layer = iLayerIndex; map->query.rect = rect; if (pszExpression) { map->query.type = MS_QUERY_BY_FILTER; msInitExpression(&map->query.filter); map->query.filter.string = msStrdup(pszExpression); map->query.filter.type = MS_EXPRESSION; /* a logical expression */ retval = msQueryByFilter(map); } else { map->query.type = MS_QUERY_BY_RECT; retval = msQueryByRect(map); } return retval; } mapserver-8.6.0/src/mapogcsld.cpp000066400000000000000000006736361511405061000170130ustar00rootroot00000000000000/********************************************************************** * $Id$ * * Project: MapServer * Purpose: OGC SLD implementation * Author: Y. Assefa, DM Solutions Group (assefa@dmsolutions.ca) * ********************************************************************** * Copyright (c) 2003, Y. Assefa, DM Solutions Group Inc * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER ****************************************************************************/ #include "mapogcsld.h" #include "mapogcfilter.h" #include "mapserver.h" #include "mapows.h" #include "mapcopy.h" #include "cpl_string.h" extern "C" { extern int yyparse(parseObj *); } static inline void IGUR_sizet(size_t ignored) { (void)ignored; } /* Ignore GCC Unused Result */ #define SLD_LINE_SYMBOL_NAME "sld_line_symbol" #define SLD_LINE_SYMBOL_DASH_NAME "sld_line_symbol_dash" #define SLD_MARK_SYMBOL_SQUARE "sld_mark_symbol_square" #define SLD_MARK_SYMBOL_SQUARE_FILLED "sld_mark_symbol_square_filled" #define SLD_MARK_SYMBOL_CIRCLE "sld_mark_symbol_circle" #define SLD_MARK_SYMBOL_CIRCLE_FILLED "sld_mark_symbol_circle_filled" #define SLD_MARK_SYMBOL_TRIANGLE "sld_mark_symbol_triangle" #define SLD_MARK_SYMBOL_TRIANGLE_FILLED "sld_mark_symbol_triangle_filled" #define SLD_MARK_SYMBOL_STAR "sld_mark_symbol_star" #define SLD_MARK_SYMBOL_STAR_FILLED "sld_mark_symbol_star_filled" #define SLD_MARK_SYMBOL_CROSS "sld_mark_symbol_cross" #define SLD_MARK_SYMBOL_CROSS_FILLED "sld_mark_symbol_cross_filled" #define SLD_MARK_SYMBOL_X "sld_mark_symbol_x" #define SLD_MARK_SYMBOL_X_FILLED "sld_mark_symbol_x_filled" /************************************************************************/ /* msSLDApplySLDURL */ /* */ /* Use the SLD document given through a URL and apply the SLD */ /* on the map. Layer name and Named Layer's name parameter are */ /* used to do the match. */ /************************************************************************/ int msSLDApplySLDURL(mapObj *map, const char *szURL, int iLayer, const char *pszStyleLayerName, char **ppszLayerNames) { /* needed for libcurl function msHTTPGetFile in maphttp.c */ #if defined(USE_CURL) char *pszSLDTmpFile = NULL; int status = 0; char *pszSLDbuf = NULL; FILE *fp = NULL; int nStatus = MS_FAILURE; if (map && szURL) { map->sldurl = (char *)szURL; pszSLDTmpFile = msTmpFile(map, map->mappath, NULL, "sld.xml"); if (pszSLDTmpFile == NULL) { pszSLDTmpFile = msTmpFile(map, NULL, NULL, "sld.xml"); } if (pszSLDTmpFile == NULL) { msSetError( MS_WMSERR, "Could not determine temporary file. Please make sure that the " "temporary path is set. The temporary path can be defined for " "example by setting TEMPPATH in the map file. Please check the " "MapServer documentation on temporary path settings.", "msSLDApplySLDURL()"); } else { int nMaxRemoteSLDBytes; const char *pszMaxRemoteSLDBytes = msOWSLookupMetadata( &(map->web.metadata), "MO", "remote_sld_max_bytes"); if (!pszMaxRemoteSLDBytes) { nMaxRemoteSLDBytes = 1024 * 1024; /* 1 megaByte */ } else { nMaxRemoteSLDBytes = atoi(pszMaxRemoteSLDBytes); } if (msHTTPGetFile(szURL, pszSLDTmpFile, &status, -1, 0, 0, nMaxRemoteSLDBytes) == MS_SUCCESS) { if ((fp = fopen(pszSLDTmpFile, "rb")) != NULL) { int nBufsize = 0; fseek(fp, 0, SEEK_END); nBufsize = ftell(fp); if (nBufsize > 0) { rewind(fp); pszSLDbuf = (char *)malloc((nBufsize + 1) * sizeof(char)); if (pszSLDbuf == NULL) { msSetError(MS_MEMERR, "Failed to open SLD file.", "msSLDApplySLDURL()"); } else { IGUR_sizet(fread(pszSLDbuf, 1, nBufsize, fp)); pszSLDbuf[nBufsize] = '\0'; } } else { msSetError(MS_WMSERR, "Could not open SLD %s as it appears empty", "msSLDApplySLDURL", szURL); } fclose(fp); unlink(pszSLDTmpFile); } } else { unlink(pszSLDTmpFile); msSetError( MS_WMSERR, "Could not open SLD %s and save it in a temporary file. Please " "make sure that the sld url is valid and that the temporary path " "is set. The temporary path can be defined for example by setting " "TEMPPATH in the map file. Please check the MapServer " "documentation on temporary path settings.", "msSLDApplySLDURL", szURL); } msFree(pszSLDTmpFile); if (pszSLDbuf) nStatus = msSLDApplySLD(map, pszSLDbuf, iLayer, pszStyleLayerName, ppszLayerNames); } map->sldurl = NULL; } msFree(pszSLDbuf); return nStatus; #else msSetError(MS_MISCERR, "WMS/WFS client support is not enabled .", "msSLDApplySLDURL()"); return (MS_FAILURE); #endif } /************************************************************************/ /* msSLDApplyFromFile */ /* */ /* Apply SLD from a file on disk to the layerObj */ /************************************************************************/ int msSLDApplyFromFile(mapObj *map, layerObj *layer, const char *filename) { FILE *fp = NULL; int nStatus = MS_FAILURE; /* open SLD file */ char szPath[MS_MAXPATHLEN]; char *pszSLDbuf = NULL; const char *realpath = msBuildPath(szPath, map->mappath, filename); if ((fp = fopen(realpath, "rb")) != NULL) { int nBufsize = 0; fseek(fp, 0, SEEK_END); nBufsize = ftell(fp); if (nBufsize > 0) { rewind(fp); pszSLDbuf = (char *)malloc((nBufsize + 1) * sizeof(char)); if (pszSLDbuf == NULL) { msSetError(MS_MEMERR, "Failed to read SLD file.", "msSLDApplyFromFile()"); } else { IGUR_sizet(fread(pszSLDbuf, 1, nBufsize, fp)); pszSLDbuf[nBufsize] = '\0'; } } else { msSetError(MS_IOERR, "Could not open SLD %s as it appears empty", "msSLDApplyFromFile", realpath); } fclose(fp); } if (pszSLDbuf) { // if not set, then use the first NamedStyle in the SLD file // even if the names don't match const char *pszMetadataName = "SLD_USE_FIRST_NAMEDLAYER"; const char *pszValue = msLookupHashTable(&(layer->metadata), pszMetadataName); if (pszValue == NULL) { msInsertHashTable(&(layer->metadata), pszMetadataName, "true"); } nStatus = msSLDApplySLD(map, pszSLDbuf, layer->index, NULL, NULL); } else { msSetError(MS_IOERR, "Invalid SLD filename: \"%s\".", "msSLDApplyFromFile()", realpath); } msFree(pszSLDbuf); return nStatus; } #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) /* -------------------------------------------------------------------- */ /* If the same layer is given more that once, we need to */ /* duplicate it. */ /* -------------------------------------------------------------------- */ static void msSLDApplySLD_DuplicateLayers(mapObj *map, int nSLDLayers, layerObj *pasSLDLayers) { int m; for (m = 0; m < nSLDLayers; m++) { int l; int nIndex = msGetLayerIndex(map, pasSLDLayers[m].name); if (pasSLDLayers[m].name == NULL) continue; if (nIndex < 0) continue; for (l = m + 1; l < nSLDLayers; l++) { if (pasSLDLayers[l].name == NULL) continue; if (strcasecmp(pasSLDLayers[m].name, pasSLDLayers[l].name) == 0) { layerObj *psTmpLayer = (layerObj *)malloc(sizeof(layerObj)); char tmpId[128]; initLayer(psTmpLayer, map); msCopyLayer(psTmpLayer, GET_LAYER(map, nIndex)); /* open the source layer */ if (!psTmpLayer->vtable) { if (msInitializeVirtualTable(psTmpLayer) != MS_SUCCESS) { MS_REFCNT_DECR(psTmpLayer); continue; } } /*make the name unique*/ snprintf(tmpId, sizeof(tmpId), "%lx_%x_%d", (long)time(NULL), (int)getpid(), map->numlayers); if (psTmpLayer->name) msFree(psTmpLayer->name); psTmpLayer->name = msStrdup(tmpId); msFree(pasSLDLayers[l].name); pasSLDLayers[l].name = msStrdup(tmpId); msInsertLayer(map, psTmpLayer, -1); MS_REFCNT_DECR(psTmpLayer); } } } } #endif static int msApplySldLayerToMapLayer(layerObj *sldLayer, layerObj *lp) { if (sldLayer->numclasses > 0) { int iClass = 0; bool bSLDHasNamedClass = false; lp->type = sldLayer->type; lp->rendermode = MS_ALL_MATCHING_CLASSES; for (int k = 0; k < sldLayer->numclasses; k++) { if (sldLayer->_class[k]->group) { bSLDHasNamedClass = true; break; } } for (int k = 0; k < lp->numclasses; k++) { if (lp->_class[k] != NULL) { lp->_class[k]->layer = NULL; if (freeClass(lp->_class[k]) == MS_SUCCESS) { msFree(lp->_class[k]); lp->_class[k] = NULL; } } } lp->numclasses = 0; if (bSLDHasNamedClass && sldLayer->classgroup) { /* Set the class group to the class that has UserStyle.IsDefaultf */ msFree(lp->classgroup); lp->classgroup = msStrdup(sldLayer->classgroup); } else { /*unset the classgroup on the layer if it was set. This allows the layer to render with all the classes defined in the SLD*/ msFree(lp->classgroup); lp->classgroup = NULL; } for (int k = 0; k < sldLayer->numclasses; k++) { if (msGrowLayerClasses(lp) == NULL) return MS_FAILURE; initClass(lp->_class[iClass]); msCopyClass(lp->_class[iClass], sldLayer->_class[k], NULL); lp->_class[iClass]->layer = lp; lp->numclasses++; /*aliases may have been used as part of the sld text symbolizer for label element. Try to process it if that is the case #3114*/ const int layerWasOpened = msLayerIsOpen(lp); if (layerWasOpened || (msLayerOpen(lp) == MS_SUCCESS && msLayerGetItems(lp) == MS_SUCCESS)) { if (lp->_class[iClass]->text.string) { for (int z = 0; z < lp->numitems; z++) { if (!lp->items[z] || strlen(lp->items[z]) == 0) continue; char *pszTmp1 = msStrdup(lp->_class[iClass]->text.string); const char *pszFullName = msOWSLookupMetadata( &(lp->metadata), "G", std::string(lp->items[z]).append("_alias").c_str()); if (pszFullName != NULL && (strstr(pszTmp1, pszFullName) != NULL)) { pszTmp1 = msReplaceSubstring(pszTmp1, pszFullName, lp->items[z]); std::string osTmp("("); osTmp.append(pszTmp1).append(")"); // Silence false positive Coverity Scan warnings which wrongly // believes that osTmp.c_str() might be used by // msLoadExpressionString() after osTmp is destroyed. // coverity[escape] msLoadExpressionString(&(lp->_class[iClass]->text), osTmp.c_str()); } msFree(pszTmp1); } } if (!layerWasOpened) { // don't close the layer if already // open msLayerClose(lp); } } iClass++; } } else { /*this is probably an SLD that uses Named styles*/ if (sldLayer->classgroup) { int k; for (k = 0; k < lp->numclasses; k++) { if (lp->_class[k]->group && strcasecmp(lp->_class[k]->group, sldLayer->classgroup) == 0) break; } if (k < lp->numclasses) { msFree(lp->classgroup); lp->classgroup = msStrdup(sldLayer->classgroup); } else { /* TODO we throw an exception ?*/ } } } if (sldLayer->labelitem) { if (lp->labelitem) free(lp->labelitem); lp->labelitem = msStrdup(sldLayer->labelitem); } if (sldLayer->classitem) { if (lp->classitem) free(lp->classitem); lp->classitem = msStrdup(sldLayer->classitem); } /* opacity for sld raster */ if (lp->type == MS_LAYER_RASTER && sldLayer->compositer && sldLayer->compositer->opacity != 100) msSetLayerOpacity(lp, sldLayer->compositer->opacity); /* mark as auto-generate SLD */ if (lp->connectiontype == MS_WMS) msInsertHashTable(&(lp->metadata), "wms_sld_body", "auto"); /* The SLD might have a FeatureTypeConstraint */ if (sldLayer->filter.type == MS_EXPRESSION) { if (lp->filter.string && lp->filter.type == MS_EXPRESSION) { char *pszBuffer = msStringConcatenate(NULL, "(("); pszBuffer = msStringConcatenate(pszBuffer, lp->filter.string); pszBuffer = msStringConcatenate(pszBuffer, ") AND ("); pszBuffer = msStringConcatenate(pszBuffer, sldLayer->filter.string); pszBuffer = msStringConcatenate(pszBuffer, "))"); msFreeExpression(&lp->filter); msInitExpression(&lp->filter); lp->filter.string = pszBuffer; lp->filter.type = MS_EXPRESSION; } else { msFreeExpression(&lp->filter); msInitExpression(&lp->filter); lp->filter.string = msStrdup(sldLayer->filter.string); lp->filter.type = MS_EXPRESSION; } } /*in some cases it would make sense to concatenate all the class expressions and use it to set the filter on the layer. This could increase performance. Will do it for db types layers #2840*/ if (lp->filter.string == NULL || (lp->filter.string && lp->filter.type == MS_STRING && !lp->filteritem)) { if (lp->connectiontype == MS_POSTGIS || lp->connectiontype == MS_ORACLESPATIAL || lp->connectiontype == MS_PLUGIN) { if (lp->numclasses > 0) { /* check first that all classes have an expression type. That is the only way we can concatenate them and set the filter expression */ int k; for (k = 0; k < lp->numclasses; k++) { if (lp->_class[k]->expression.type != MS_EXPRESSION) break; } if (k == lp->numclasses) { char szTmp[512]; char *pszBuffer = NULL; for (k = 0; k < lp->numclasses; k++) { if (pszBuffer == NULL) snprintf(szTmp, sizeof(szTmp), "%s", "(("); /* we a building a string expression, explicitly set type below */ else snprintf(szTmp, sizeof(szTmp), "%s", " OR "); pszBuffer = msStringConcatenate(pszBuffer, szTmp); pszBuffer = msStringConcatenate(pszBuffer, lp->_class[k]->expression.string); } snprintf(szTmp, sizeof(szTmp), "%s", "))"); pszBuffer = msStringConcatenate(pszBuffer, szTmp); msFreeExpression(&lp->filter); msInitExpression(&lp->filter); lp->filter.string = msStrdup(pszBuffer); lp->filter.type = MS_EXPRESSION; msFree(pszBuffer); } } } } return MS_SUCCESS; } /************************************************************************/ /* msSLDApplySLD */ /* */ /* Parses the SLD into array of layers. Go through the map and */ /* compare the SLD layers and the map layers using the name. If */ /* they have the same name, copy the classes associated with */ /* the SLD layers onto the map layers. */ /************************************************************************/ int msSLDApplySLD(mapObj *map, const char *psSLDXML, int iLayer, const char *pszStyleLayerName, char **ppszLayerNames) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) int nSLDLayers = 0; layerObj *pasSLDLayers = NULL; int nStatus = MS_SUCCESS; /*const char *pszSLDNotSupported = NULL;*/ pasSLDLayers = msSLDParseSLD(map, psSLDXML, &nSLDLayers); if (pasSLDLayers == NULL) { errorObj *psError = msGetErrorObj(); if (psError && psError->code != MS_NOERR) return MS_FAILURE; } if (pasSLDLayers && nSLDLayers > 0) { int i; msSLDApplySLD_DuplicateLayers(map, nSLDLayers, pasSLDLayers); for (i = 0; i < map->numlayers; i++) { layerObj *lp = NULL; const char *pszWMSLayerName = NULL; int j; int bUseSpecificLayer = 0; if (iLayer >= 0 && iLayer < map->numlayers) { i = iLayer; bUseSpecificLayer = 1; } lp = GET_LAYER(map, i); /* compare layer name to wms_name as well */ pszWMSLayerName = msOWSLookupMetadata(&(lp->metadata), "MO", "name"); bool bSldApplied = false; for (j = 0; j < nSLDLayers; j++) { layerObj *sldLayer = &pasSLDLayers[j]; /* -------------------------------------------------------------------- */ /* copy : - class */ /* - layer's labelitem */ /* -------------------------------------------------------------------- */ if ((sldLayer->name && pszStyleLayerName == NULL && ((strcasecmp(lp->name, sldLayer->name) == 0 || (pszWMSLayerName && strcasecmp(pszWMSLayerName, sldLayer->name) == 0)) || (lp->group && strcasecmp(lp->group, sldLayer->name) == 0))) || (bUseSpecificLayer && pszStyleLayerName && sldLayer->name && strcasecmp(sldLayer->name, pszStyleLayerName) == 0)) { #ifdef notdef /*this is a test code if we decide to flag some layers as not * supporting SLD*/ pszSLDNotSupported = msOWSLookupMetadata(&(lp->metadata), "M", "SLD_NOT_SUPPORTED"); if (pszSLDNotSupported) { msSetError(MS_WMSERR, "Layer %s does not support SLD", "msSLDApplySLD", sldLayer->name); nsStatus = MS_FAILURE; goto sld_cleanup; } #endif if (msApplySldLayerToMapLayer(sldLayer, lp) == MS_FAILURE) { nStatus = MS_FAILURE; goto sld_cleanup; }; bSldApplied = true; break; } } if (bUseSpecificLayer) { if (!bSldApplied) { // there was no name match between the map layer and the SLD named // layer - check if we should apply the first SLD layer anyway const char *pszSLDUseFirstNamedLayer = msLookupHashTable(&(lp->metadata), "SLD_USE_FIRST_NAMEDLAYER"); if (pszSLDUseFirstNamedLayer) { if (strcasecmp(pszSLDUseFirstNamedLayer, "true") == 0) { layerObj *firstSldLayer = &pasSLDLayers[0]; if (msApplySldLayerToMapLayer(firstSldLayer, lp) == MS_FAILURE) { nStatus = MS_FAILURE; goto sld_cleanup; }; } } } break; } } /* -------------------------------------------------------------------- */ /* if needed return a comma separated list of the layers found */ /* in the sld. */ /* -------------------------------------------------------------------- */ if (ppszLayerNames) { char *pszTmp = NULL; for (i = 0; i < nSLDLayers; i++) { if (pasSLDLayers[i].name) { if (pszTmp != NULL) pszTmp = msStringConcatenate(pszTmp, ","); pszTmp = msStringConcatenate(pszTmp, pasSLDLayers[i].name); } } *ppszLayerNames = pszTmp; } } nStatus = MS_SUCCESS; sld_cleanup: if (pasSLDLayers) { for (int i = 0; i < nSLDLayers; i++) freeLayer(&pasSLDLayers[i]); msFree(pasSLDLayers); } if (map->debug == MS_DEBUGLEVEL_VVV) { char *tmpfilename = msTmpFile(map, map->mappath, NULL, "_sld.map"); if (tmpfilename == NULL) { tmpfilename = msTmpFile(map, NULL, NULL, "_sld.map"); } if (tmpfilename) { msSaveMap(map, tmpfilename); msDebug("msApplySLD(): Map file after SLD was applied %s\n", tmpfilename); msFree(tmpfilename); } } return nStatus; #else msSetError(MS_MISCERR, "OWS support is not available.", "msSLDApplySLD()"); return (MS_FAILURE); #endif } static CPLXMLNode *FindNextChild(CPLXMLNode *psNode, const char *pszChildName) { while (psNode) { if (psNode->eType == CXT_Element && strcasecmp(psNode->pszValue, pszChildName) == 0) { return psNode; } psNode = psNode->psNext; } return NULL; } #define LOOP_ON_CHILD_ELEMENT(psParent_, psChild_, pszChildName_) \ for (psChild_ = FindNextChild(psParent_->psChild, pszChildName_); \ psChild_ != NULL; \ psChild_ = FindNextChild(psChild_->psNext, pszChildName_)) /************************************************************************/ /* msSLDParseSLD */ /* */ /* Parse the sld document into layers : for each named layer */ /* there is one mapserver layer created with appropriate */ /* classes and styles. */ /* Returns an array of mapserver layers. The pnLayres if */ /* provided will indicate the size of the returned array. */ /************************************************************************/ layerObj *msSLDParseSLD(mapObj *map, const char *psSLDXML, int *pnLayers) { CPLXMLNode *psRoot = NULL; CPLXMLNode *psSLD, *psNamedLayer; layerObj *pasLayers = NULL; int iLayer = 0; int nLayers = 0; if (map == NULL || psSLDXML == NULL || strlen(psSLDXML) == 0 || (strstr(psSLDXML, "StyledLayerDescriptor") == NULL)) { msSetError(MS_WMSERR, "Invalid SLD document", ""); return NULL; } psRoot = CPLParseXMLString(psSLDXML); if (psRoot == NULL) { msSetError(MS_WMSERR, "Invalid SLD document : %s", "", psSLDXML); return NULL; } /* strip namespaces ogc and sld and gml */ CPLStripXMLNamespace(psRoot, "ogc", 1); CPLStripXMLNamespace(psRoot, "sld", 1); CPLStripXMLNamespace(psRoot, "gml", 1); CPLStripXMLNamespace(psRoot, "se", 1); /* -------------------------------------------------------------------- */ /* get the root element (StyledLayerDescriptor). */ /* -------------------------------------------------------------------- */ psSLD = CPLGetXMLNode(psRoot, "=StyledLayerDescriptor"); if (!psSLD) { msSetError(MS_WMSERR, "Invalid SLD document : %s", "", psSLDXML); return NULL; } /* -------------------------------------------------------------------- */ /* Parse the named layers. */ /* -------------------------------------------------------------------- */ LOOP_ON_CHILD_ELEMENT(psSLD, psNamedLayer, "NamedLayer") { nLayers++; } if (nLayers > 0) pasLayers = (layerObj *)malloc(sizeof(layerObj) * nLayers); else return NULL; LOOP_ON_CHILD_ELEMENT(psSLD, psNamedLayer, "NamedLayer") { CPLXMLNode *psName = CPLGetXMLNode(psNamedLayer, "Name"); initLayer(&pasLayers[iLayer], map); if (psName && psName->psChild && psName->psChild->pszValue) pasLayers[iLayer].name = msStrdup(psName->psChild->pszValue); if (msSLDParseNamedLayer(psNamedLayer, &pasLayers[iLayer]) != MS_SUCCESS) { int i; for (i = 0; i <= iLayer; i++) freeLayer(&pasLayers[i]); msFree(pasLayers); nLayers = 0; pasLayers = NULL; break; } iLayer++; } if (pnLayers) *pnLayers = nLayers; if (psRoot) CPLDestroyXMLNode(psRoot); return pasLayers; } /************************************************************************/ /* _SLDApplyRuleValues */ /* */ /* Utility function to set the scale, title/name for the */ /* classes created by a Rule. */ /************************************************************************/ void _SLDApplyRuleValues(CPLXMLNode *psRule, layerObj *psLayer, int nNewClasses) { CPLXMLNode *psMinScale = NULL, *psMaxScale = NULL; CPLXMLNode *psName = NULL, *psTitle = NULL; double dfMinScale = 0, dfMaxScale = 0; char *pszName = NULL, *pszTitle = NULL; if (psRule && psLayer && nNewClasses > 0) { /* -------------------------------------------------------------------- */ /* parse minscale and maxscale. */ /* -------------------------------------------------------------------- */ psMinScale = CPLGetXMLNode(psRule, "MinScaleDenominator"); if (psMinScale && psMinScale->psChild && psMinScale->psChild->pszValue) dfMinScale = atof(psMinScale->psChild->pszValue); psMaxScale = CPLGetXMLNode(psRule, "MaxScaleDenominator"); if (psMaxScale && psMaxScale->psChild && psMaxScale->psChild->pszValue) dfMaxScale = atof(psMaxScale->psChild->pszValue); /* -------------------------------------------------------------------- */ /* parse name and title. */ /* -------------------------------------------------------------------- */ psName = CPLGetXMLNode(psRule, "Name"); if (psName && psName->psChild && psName->psChild->pszValue) pszName = psName->psChild->pszValue; psTitle = CPLGetXMLNode(psRule, "Title"); if (psTitle && psTitle->psChild && psTitle->psChild->pszValue) pszTitle = psTitle->psChild->pszValue; /* -------------------------------------------------------------------- */ /* set the scale to all the classes created by the rule. */ /* -------------------------------------------------------------------- */ if (dfMinScale > 0 || dfMaxScale > 0) { for (int i = 0; i < nNewClasses; i++) { if (dfMinScale > 0) psLayer->_class[psLayer->numclasses - 1 - i]->minscaledenom = dfMinScale; if (dfMaxScale) psLayer->_class[psLayer->numclasses - 1 - i]->maxscaledenom = dfMaxScale; } } /* -------------------------------------------------------------------- */ /* set name and title to the classes created by the rule. */ /* -------------------------------------------------------------------- */ for (int i = 0; i < nNewClasses; i++) { if (!psLayer->_class[psLayer->numclasses - 1 - i]->name) { if (pszName) psLayer->_class[psLayer->numclasses - 1 - i]->name = msStrdup(pszName); else if (pszTitle) psLayer->_class[psLayer->numclasses - 1 - i]->name = msStrdup(pszTitle); else { // Build a name from layer and class info char szTmp[256]; snprintf(szTmp, sizeof(szTmp), "%s#%d", psLayer->name, psLayer->numclasses - 1 - i); psLayer->_class[psLayer->numclasses - 1 - i]->name = msStrdup(szTmp); } } } if (pszTitle) { for (int i = 0; i < nNewClasses; i++) { psLayer->_class[psLayer->numclasses - 1 - i]->title = msStrdup(pszTitle); } } } } /************************************************************************/ /* msSLDGetCommonExpressionFromFilter */ /* */ /* Get a common expression valid from the filter valid for the */ /* temporary layer. */ /************************************************************************/ static char *msSLDGetCommonExpressionFromFilter(CPLXMLNode *psFilter, layerObj *psLayer) { char *pszExpression = NULL; CPLXMLNode *psTmpNextNode = NULL; CPLXMLNode *psTmpNode = NULL; FilterEncodingNode *psNode = NULL; char *pszTmpFilter = NULL; layerObj *psCurrentLayer = NULL; const char *pszWmsName = NULL; const char *key = NULL; /* clone the tree and set the next node to null */ /* so we only have the Filter node */ psTmpNode = CPLCloneXMLTree(psFilter); psTmpNextNode = psTmpNode->psNext; psTmpNode->psNext = NULL; pszTmpFilter = CPLSerializeXMLTree(psTmpNode); psTmpNode->psNext = psTmpNextNode; CPLDestroyXMLNode(psTmpNode); if (pszTmpFilter) { psNode = FLTParseFilterEncoding(pszTmpFilter); CPLFree(pszTmpFilter); } if (psNode) { int j; /*preparse the filter for possible gml aliases set on the layer's metadata: "gml_NA3DESC_alias" "alias_name" and filter could be alias_name #3079*/ for (j = 0; j < psLayer->map->numlayers; j++) { psCurrentLayer = GET_LAYER(psLayer->map, j); pszWmsName = msOWSLookupMetadata(&(psCurrentLayer->metadata), "MO", "name"); if ((psCurrentLayer->name && psLayer->name && strcasecmp(psCurrentLayer->name, psLayer->name) == 0) || (psCurrentLayer->group && psLayer->name && strcasecmp(psCurrentLayer->group, psLayer->name) == 0) || (psLayer->name && pszWmsName && strcasecmp(pszWmsName, psLayer->name) == 0)) break; } if (j < psLayer->map->numlayers) { /*make sure that the tmp layer has all the metadata that the original layer has, allowing to do parsing for such things as gml_attribute_type #3052*/ while (1) { key = msNextKeyFromHashTable(&psCurrentLayer->metadata, key); if (!key) break; else msInsertHashTable(&psLayer->metadata, key, msLookupHashTable(&psCurrentLayer->metadata, key)); } FLTPreParseFilterForAliasAndGroup(psNode, psLayer->map, j, "G"); } pszExpression = FLTGetCommonExpression(psNode, psLayer); FLTFreeFilterEncodingNode(psNode); } return pszExpression; } /************************************************************************/ /* msSLDParseUserStyle */ /* */ /* Parse UserStyle node. */ /************************************************************************/ static void msSLDParseUserStyle(CPLXMLNode *psUserStyle, layerObj *psLayer) { CPLXMLNode *psFeatureTypeStyle; const char *pszUserStyleName = CPLGetXMLValue(psUserStyle, "Name", NULL); if (pszUserStyleName) { const char *pszIsDefault = CPLGetXMLValue(psUserStyle, "IsDefault", "0"); if (EQUAL(pszIsDefault, "true") || EQUAL(pszIsDefault, "1")) { msFree(psLayer->classgroup); psLayer->classgroup = msStrdup(pszUserStyleName); } } LOOP_ON_CHILD_ELEMENT(psUserStyle, psFeatureTypeStyle, "FeatureTypeStyle") { CPLXMLNode *psRule; /* -------------------------------------------------------------------- */ /* Parse rules with no Else filter. */ /* -------------------------------------------------------------------- */ LOOP_ON_CHILD_ELEMENT(psFeatureTypeStyle, psRule, "Rule") { CPLXMLNode *psFilter = NULL; CPLXMLNode *psElseFilter = NULL; int nNewClasses = 0, nClassBeforeFilter = 0, nClassAfterFilter = 0; int nClassAfterRule = 0, nClassBeforeRule = 0; /* used for scale setting */ nClassBeforeRule = psLayer->numclasses; psElseFilter = CPLGetXMLNode(psRule, "ElseFilter"); nClassBeforeFilter = psLayer->numclasses; if (psElseFilter == NULL) msSLDParseRule(psRule, psLayer, pszUserStyleName); nClassAfterFilter = psLayer->numclasses; /* -------------------------------------------------------------------- */ /* Parse the filter and apply it to the latest class created by */ /* the rule. */ /* NOTE : Spatial Filter is not supported. */ /* -------------------------------------------------------------------- */ psFilter = CPLGetXMLNode(psRule, "Filter"); if (psFilter && psFilter->psChild && psFilter->psChild->pszValue) { char *pszExpression = msSLDGetCommonExpressionFromFilter(psFilter, psLayer); if (pszExpression) { int i; nNewClasses = nClassAfterFilter - nClassBeforeFilter; for (i = 0; i < nNewClasses; i++) { expressionObj *exp = &(psLayer->_class[psLayer->numclasses - 1 - i]->expression); msFreeExpression(exp); msInitExpression(exp); exp->string = msStrdup(pszExpression); exp->type = MS_EXPRESSION; } msFree(pszExpression); pszExpression = NULL; } } nClassAfterRule = psLayer->numclasses; nNewClasses = nClassAfterRule - nClassBeforeRule; /* apply scale and title to newly created classes */ _SLDApplyRuleValues(psRule, psLayer, nNewClasses); /* TODO : parse legendgraphic */ } /* -------------------------------------------------------------------- */ /* First parse rules with the else filter. These rules will */ /* create the classes that are placed at the end of class */ /* list. (See how classes are applied to layers in function */ /* msSLDApplySLD). */ /* -------------------------------------------------------------------- */ LOOP_ON_CHILD_ELEMENT(psFeatureTypeStyle, psRule, "Rule") { CPLXMLNode *psElseFilter = CPLGetXMLNode(psRule, "ElseFilter"); if (psElseFilter) { msSLDParseRule(psRule, psLayer, pszUserStyleName); _SLDApplyRuleValues(psRule, psLayer, 1); psLayer->_class[psLayer->numclasses - 1]->isfallback = TRUE; } } } } /************************************************************************/ /* msSLDParseNamedLayer */ /* */ /* Parse NamedLayer root. */ /************************************************************************/ int msSLDParseNamedLayer(CPLXMLNode *psRoot, layerObj *psLayer) { CPLXMLNode *psLayerFeatureConstraints = NULL; if (!psRoot || !psLayer) return MS_FAILURE; if (CPLGetXMLNode(psRoot, "UserStyle")) { CPLXMLNode *psUserStyle; LOOP_ON_CHILD_ELEMENT(psRoot, psUserStyle, "UserStyle") { msSLDParseUserStyle(psUserStyle, psLayer); } } /* check for Named styles*/ else { CPLXMLNode *psNamedStyle = CPLGetXMLNode(psRoot, "NamedStyle"); if (psNamedStyle) { CPLXMLNode *psSLDName = CPLGetXMLNode(psNamedStyle, "Name"); if (psSLDName && psSLDName->psChild && psSLDName->psChild->pszValue) { msFree(psLayer->classgroup); psLayer->classgroup = msStrdup(psSLDName->psChild->pszValue); } } } /* Deal with LayerFeatureConstraints */ psLayerFeatureConstraints = CPLGetXMLNode(psRoot, "LayerFeatureConstraints"); if (psLayerFeatureConstraints != NULL) { CPLXMLNode *psIter = psLayerFeatureConstraints->psChild; CPLXMLNode *psFeatureTypeConstraint = NULL; for (; psIter != NULL; psIter = psIter->psNext) { if (psIter->eType == CXT_Element && strcmp(psIter->pszValue, "FeatureTypeConstraint") == 0) { if (psFeatureTypeConstraint == NULL) { psFeatureTypeConstraint = psIter; } else { msSetError(MS_WMSERR, "Only one single FeatureTypeConstraint element " "per LayerFeatureConstraints is supported", ""); return MS_FAILURE; } } } if (psFeatureTypeConstraint != NULL) { CPLXMLNode *psFilter; if (CPLGetXMLNode(psFeatureTypeConstraint, "FeatureTypeName") != NULL) { msSetError(MS_WMSERR, "FeatureTypeName element is not " "supported in FeatureTypeConstraint", ""); return MS_FAILURE; } if (CPLGetXMLNode(psFeatureTypeConstraint, "Extent") != NULL) { msSetError(MS_WMSERR, "Extent element is not " "supported in FeatureTypeConstraint", ""); return MS_FAILURE; } psFilter = CPLGetXMLNode(psFeatureTypeConstraint, "Filter"); if (psFilter && psFilter->psChild && psFilter->psChild->pszValue) { char *pszExpression = msSLDGetCommonExpressionFromFilter(psFilter, psLayer); if (pszExpression) { msFreeExpression(&psLayer->filter); msInitExpression(&psLayer->filter); psLayer->filter.string = pszExpression; psLayer->filter.type = MS_EXPRESSION; } } } } return MS_SUCCESS; } /************************************************************************/ /* msSLDParseRule() */ /* */ /* Parse a Rule node into classes for a specific layer. */ /************************************************************************/ int msSLDParseRule(CPLXMLNode *psRoot, layerObj *psLayer, const char *pszUserStyleName) { CPLXMLNode *psLineSymbolizer = NULL; CPLXMLNode *psPolygonSymbolizer = NULL; CPLXMLNode *psPointSymbolizer = NULL; CPLXMLNode *psTextSymbolizer = NULL; CPLXMLNode *psRasterSymbolizer = NULL; int nSymbolizer = 0; if (!psRoot || !psLayer) return MS_FAILURE; /* TODO : parse name of the rule */ /* ==================================================================== */ /* For each rule a new class is created. If there are more than */ /* one symbolizer, a style is added in the same class. */ /* ==================================================================== */ /* Raster symbolizer */ LOOP_ON_CHILD_ELEMENT(psRoot, psRasterSymbolizer, "RasterSymbolizer") { msSLDParseRasterSymbolizer(psRasterSymbolizer, psLayer, pszUserStyleName); /* cppcheck-suppress knownConditionTrueFalse */ if (nSymbolizer == 0) { psLayer->type = MS_LAYER_RASTER; } } /* Polygon symbolizer */ LOOP_ON_CHILD_ELEMENT(psRoot, psPolygonSymbolizer, "PolygonSymbolizer") { /* cppcheck-suppress knownConditionTrueFalse */ const int bNewClass = (nSymbolizer == 0); msSLDParsePolygonSymbolizer(psPolygonSymbolizer, psLayer, bNewClass, pszUserStyleName); psLayer->type = MS_LAYER_POLYGON; nSymbolizer++; } /* line symbolizer */ LOOP_ON_CHILD_ELEMENT(psRoot, psLineSymbolizer, "LineSymbolizer") { const int bNewClass = (nSymbolizer == 0); msSLDParseLineSymbolizer(psLineSymbolizer, psLayer, bNewClass, pszUserStyleName); if (bNewClass) { psLayer->type = MS_LAYER_LINE; } if (psLayer->type == MS_LAYER_POLYGON) { const int nClassId = psLayer->numclasses - 1; if (nClassId >= 0) { const int nStyleId = psLayer->_class[nClassId]->numstyles - 1; if (nStyleId >= 0) { styleObj *psStyle = psLayer->_class[nClassId]->styles[nStyleId]; psStyle->outlinecolor = psStyle->color; MS_INIT_COLOR(psStyle->color, -1, -1, -1, 255); MS_COPYSTRING( psStyle->exprBindings[MS_STYLE_BINDING_OUTLINECOLOR].string, psStyle->exprBindings[MS_STYLE_BINDING_COLOR].string); psStyle->exprBindings[MS_STYLE_BINDING_OUTLINECOLOR].type = psStyle->exprBindings[MS_STYLE_BINDING_COLOR].type; msFreeExpression(&(psStyle->exprBindings[MS_STYLE_BINDING_COLOR])); msInitExpression(&(psStyle->exprBindings[MS_STYLE_BINDING_COLOR])); } } } nSymbolizer++; } /* Point Symbolizer */ LOOP_ON_CHILD_ELEMENT(psRoot, psPointSymbolizer, "PointSymbolizer") { const int bNewClass = (nSymbolizer == 0); msSLDParsePointSymbolizer(psPointSymbolizer, psLayer, bNewClass, pszUserStyleName); if (bNewClass) { psLayer->type = MS_LAYER_POINT; } if (psLayer->type == MS_LAYER_POLYGON || psLayer->type == MS_LAYER_LINE || psLayer->type == MS_LAYER_RASTER) { const int nClassId = psLayer->numclasses - 1; if (nClassId >= 0) { const int nStyleId = psLayer->_class[nClassId]->numstyles - 1; if (nStyleId >= 0) { styleObj *psStyle = psLayer->_class[nClassId]->styles[nStyleId]; msStyleSetGeomTransform(psStyle, "centroid"); } } } nSymbolizer++; } /* Text symbolizer */ /* ==================================================================== */ /* For text symbolizer, here is how it is translated into */ /* mapserver classes : */ /* - If there are other symbolizers(line, polygon, symbol), */ /* the label object created will be created in the same class */ /* (the last class) as the symbolizer. This allows to have for */ /* example of point layer with labels. */ /* - If there are no other symbolizers, a new class will be */ /* created to contain the label object. */ /* ==================================================================== */ if (psLayer->type == MS_LAYER_LINE || psLayer->type == MS_LAYER_POLYGON) nSymbolizer++; LOOP_ON_CHILD_ELEMENT(psRoot, psTextSymbolizer, "TextSymbolizer") { if (nSymbolizer == 0) psLayer->type = MS_LAYER_POINT; msSLDParseTextSymbolizer(psTextSymbolizer, psLayer, nSymbolizer > 0, pszUserStyleName); } return MS_SUCCESS; } /************************************************************************/ /* getClassId() */ /************************************************************************/ static int getClassId(layerObj *psLayer, int bNewClass, const char *pszUserStyleName) { int nClassId; if (bNewClass || psLayer->numclasses <= 0) { if (msGrowLayerClasses(psLayer) == NULL) return -1; initClass(psLayer->_class[psLayer->numclasses]); nClassId = psLayer->numclasses; if (pszUserStyleName) psLayer->_class[nClassId]->group = msStrdup(pszUserStyleName); psLayer->numclasses++; } else { nClassId = psLayer->numclasses - 1; } return nClassId; } /************************************************************************/ /* msSLDParseUomAttribute() */ /************************************************************************/ int msSLDParseUomAttribute(CPLXMLNode *node, enum MS_UNITS *sizeunits) { const struct { enum MS_UNITS unit; const char *const values[10]; } known_uoms[] = { {MS_INCHES, {"inch", "inches", NULL}}, {MS_FEET, {"foot", "feet", "http://www.opengeospatial.org/se/units/foot", NULL}}, {MS_MILES, {"mile", "miles", NULL}}, {MS_METERS, {"meter", "meters", "metre", "metres", "http://www.opengeospatial.org/se/units/metre", NULL}}, {MS_KILOMETERS, {"kilometer", "kilometers", "kilometre", "kilometres", NULL}}, {MS_DD, {"dd", NULL}}, {MS_PIXELS, {"pixel", "pixels", "px", "http://www.opengeospatial.org/se/units/pixel", NULL}}, {MS_PERCENTAGES, {"percent", "percents", "percentage", "percentages", NULL}}, {MS_NAUTICALMILES, {"nauticalmile", "nauticalmiles", "nautical_mile", "nautical_miles", NULL}}, {MS_INCHES, {NULL}}}; const char *uom = CPLGetXMLValue(node, "uom", NULL); if (uom) { for (int i = 0; known_uoms[i].values[0]; i++) for (int j = 0; known_uoms[i].values[j]; j++) if (strcmp(uom, known_uoms[i].values[j]) == 0) { // Match found *sizeunits = known_uoms[i].unit; return MS_SUCCESS; } // No match was found return MS_FAILURE; } // No uom was found *sizeunits = MS_PIXELS; return MS_SUCCESS; } /************************************************************************/ /* msSLDParseLineSymbolizer() */ /* */ /* Parses the LineSymbolizer rule and creates a class in the */ /* layer. */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* Example of a rule : */ /* ... */ /* */ /* */ /* */ /* center-line */ /* */ /* */ /* #0000ff */ /* 5.0 */ /* 10.0 5 5 10*/ /* */ /* */ /* */ /* ... */ /************************************************************************/ int msSLDParseLineSymbolizer(CPLXMLNode *psRoot, layerObj *psLayer, int bNewClass, const char *pszUserStyleName) { CPLXMLNode *psStroke = NULL, *psOffset = NULL; if (!psRoot || !psLayer) return MS_FAILURE; // Get uom if any, defaults to MS_PIXELS enum MS_UNITS sizeunits = MS_PIXELS; if (msSLDParseUomAttribute(psRoot, &sizeunits) != MS_SUCCESS) { msSetError(MS_WMSERR, "Invalid uom attribute value.", "msSLDParsePolygonSymbolizer()"); return MS_FAILURE; } psStroke = CPLGetXMLNode(psRoot, "Stroke"); if (psStroke) { int nClassId = getClassId(psLayer, bNewClass, pszUserStyleName); if (nClassId < 0) return MS_FAILURE; const int iStyle = psLayer->_class[nClassId]->numstyles; msMaybeAllocateClassStyle(psLayer->_class[nClassId], iStyle); psLayer->_class[nClassId]->styles[iStyle]->sizeunits = sizeunits; msSLDParseStroke(psStroke, psLayer->_class[nClassId]->styles[iStyle], psLayer->map, 0); /*parse PerpendicularOffset SLD 1.1.10*/ psOffset = CPLGetXMLNode(psRoot, "PerpendicularOffset"); if (psOffset && psOffset->psChild && psOffset->psChild->pszValue) { psLayer->_class[nClassId]->styles[iStyle]->offsetx = atoi(psOffset->psChild->pszValue); psLayer->_class[nClassId]->styles[iStyle]->offsety = MS_STYLE_SINGLE_SIDED_OFFSET; } } return MS_SUCCESS; } /************************************************************************/ /* void msSLDParseStroke(CPLXMLNode *psStroke, styleObj */ /* *psStyle, int iColorParam) */ /* */ /* Parse Stroke content into a style object. */ /* The iColorParm is used to indicate which color object to use */ /* : */ /* 0 : for color */ /* 1 : outlinecolor */ /************************************************************************/ int msSLDParseStroke(CPLXMLNode *psStroke, styleObj *psStyle, mapObj *map, int iColorParam) { CPLXMLNode *psCssParam = NULL, *psGraphicFill = NULL; char *psStrkName = NULL; char *pszDashValue = NULL; if (!psStroke || !psStyle) return MS_FAILURE; /* parse css parameters */ psCssParam = CPLGetXMLNode(psStroke, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psStroke, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { psStrkName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (psStrkName) { if (strcasecmp(psStrkName, "stroke") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { switch (iColorParam) { case 0: msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_COLOR, MS_OBJ_STYLE); break; case 1: msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_OUTLINECOLOR, MS_OBJ_STYLE); break; } } } else if (strcasecmp(psStrkName, "stroke-width") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_WIDTH, MS_OBJ_STYLE); } } else if (strcasecmp(psStrkName, "stroke-dasharray") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext && psCssParam->psChild->psNext->pszValue) { int nDash = 0, i; char **aszValues = NULL; int nMaxDash; if (pszDashValue) free(pszDashValue); /* free previous if multiple stroke-dasharray attributes were found */ pszDashValue = msStrdup(psCssParam->psChild->psNext->pszValue); aszValues = msStringSplit(pszDashValue, ' ', &nDash); if (nDash > 0) { nMaxDash = nDash; if (nDash > MS_MAXPATTERNLENGTH) nMaxDash = MS_MAXPATTERNLENGTH; psStyle->patternlength = nMaxDash; for (i = 0; i < nMaxDash; i++) psStyle->pattern[i] = atof(aszValues[i]); psStyle->linecap = MS_CJC_BUTT; } msFreeCharArray(aszValues, nDash); } } else if (strcasecmp(psStrkName, "stroke-opacity") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_OPACITY, MS_OBJ_STYLE); } } } psCssParam = psCssParam->psNext; } /* parse graphic fill or stroke */ /* graphic fill and graphic stroke pare parsed the same way : */ /* TODO : It seems inconsistent to me since the only difference */ /* between them seems to be fill (fill) or not fill (stroke). And */ /* then again the fill parameter can be used inside both elements. */ psGraphicFill = CPLGetXMLNode(psStroke, "GraphicFill"); if (psGraphicFill) msSLDParseGraphicFillOrStroke(psGraphicFill, pszDashValue, psStyle, map); psGraphicFill = CPLGetXMLNode(psStroke, "GraphicStroke"); if (psGraphicFill) msSLDParseGraphicFillOrStroke(psGraphicFill, pszDashValue, psStyle, map); if (pszDashValue) free(pszDashValue); return MS_SUCCESS; } /************************************************************************/ /* int msSLDParseOgcExpression(CPLXMLNode *psRoot, styleObj *psStyle, */ /* enum MS_STYLE_BINDING_ENUM binding) */ /* */ /* Parse an OGC expression in a */ /************************************************************************/ int msSLDParseOgcExpression(CPLXMLNode *psRoot, void *psObj, int binding, enum objType objtype) { int status = MS_FAILURE; const char *ops = "Add+Sub-Mul*Div/"; styleObj *psStyle = static_cast(psObj); labelObj *psLabel = static_cast(psObj); int lbinding; expressionObj *exprBindings; int *nexprbindings; enum { MS_STYLE_BASE = 0, MS_LABEL_BASE = 100 }; switch (objtype) { case MS_OBJ_STYLE: lbinding = binding + MS_STYLE_BASE; exprBindings = psStyle->exprBindings; nexprbindings = &psStyle->nexprbindings; break; case MS_OBJ_LABEL: lbinding = binding + MS_LABEL_BASE; exprBindings = psLabel->exprBindings; nexprbindings = &psLabel->nexprbindings; break; default: return MS_FAILURE; break; } switch (psRoot->eType) { case CXT_Text: // Parse a raw value { msStringBuffer *literal = msStringBufferAlloc(); msStringBufferAppend(literal, "("); msStringBufferAppend(literal, psRoot->pszValue); msStringBufferAppend(literal, ")"); msFreeExpression(&(exprBindings[binding])); msInitExpression(&(exprBindings[binding])); exprBindings[binding].string = msStringBufferReleaseStringAndFree(literal); exprBindings[binding].type = MS_STRING; } switch (lbinding) { case MS_STYLE_BASE + MS_STYLE_BINDING_OFFSET_X: psStyle->offsetx = atoi(psRoot->pszValue); status = MS_SUCCESS; break; case MS_STYLE_BASE + MS_STYLE_BINDING_OFFSET_Y: psStyle->offsety = atoi(psRoot->pszValue); status = MS_SUCCESS; break; case MS_STYLE_BASE + MS_STYLE_BINDING_ANGLE: psStyle->angle = atof(psRoot->pszValue); status = MS_SUCCESS; break; case MS_STYLE_BASE + MS_STYLE_BINDING_SIZE: psStyle->size = atof(psRoot->pszValue); status = MS_SUCCESS; break; case MS_STYLE_BASE + MS_STYLE_BINDING_WIDTH: psStyle->width = atof(psRoot->pszValue); status = MS_SUCCESS; break; case MS_STYLE_BASE + MS_STYLE_BINDING_OPACITY: psStyle->opacity = atof(psRoot->pszValue) * 100; status = MS_SUCCESS; // Apply opacity as the alpha channel color(s) if (psStyle->opacity < 100) { int alpha = MS_NINT(psStyle->opacity * 2.55); psStyle->color.alpha = alpha; psStyle->outlinecolor.alpha = alpha; psStyle->mincolor.alpha = alpha; psStyle->maxcolor.alpha = alpha; } break; case MS_STYLE_BASE + MS_STYLE_BINDING_COLOR: if (strlen(psRoot->pszValue) == 7 && psRoot->pszValue[0] == '#') { psStyle->color.red = msHexToInt(psRoot->pszValue + 1); psStyle->color.green = msHexToInt(psRoot->pszValue + 3); psStyle->color.blue = msHexToInt(psRoot->pszValue + 5); status = MS_SUCCESS; } break; case MS_STYLE_BASE + MS_STYLE_BINDING_OUTLINECOLOR: if (strlen(psRoot->pszValue) == 7 && psRoot->pszValue[0] == '#') { psStyle->outlinecolor.red = msHexToInt(psRoot->pszValue + 1); psStyle->outlinecolor.green = msHexToInt(psRoot->pszValue + 3); psStyle->outlinecolor.blue = msHexToInt(psRoot->pszValue + 5); status = MS_SUCCESS; } break; case MS_LABEL_BASE + MS_LABEL_BINDING_SIZE: psLabel->size = atof(psRoot->pszValue); if (psLabel->size <= 0.0) { psLabel->size = 10.0; } status = MS_SUCCESS; break; case MS_LABEL_BASE + MS_LABEL_BINDING_ANGLE: psLabel->angle = atof(psRoot->pszValue); status = MS_SUCCESS; break; case MS_LABEL_BASE + MS_LABEL_BINDING_COLOR: if (strlen(psRoot->pszValue) == 7 && psRoot->pszValue[0] == '#') { psLabel->color.red = msHexToInt(psRoot->pszValue + 1); psLabel->color.green = msHexToInt(psRoot->pszValue + 3); psLabel->color.blue = msHexToInt(psRoot->pszValue + 5); status = MS_SUCCESS; } break; case MS_LABEL_BASE + MS_LABEL_BINDING_OUTLINECOLOR: if (strlen(psRoot->pszValue) == 7 && psRoot->pszValue[0] == '#') { psLabel->outlinecolor.red = msHexToInt(psRoot->pszValue + 1); psLabel->outlinecolor.green = msHexToInt(psRoot->pszValue + 3); psLabel->outlinecolor.blue = msHexToInt(psRoot->pszValue + 5); status = MS_SUCCESS; } break; default: break; } break; case CXT_Element: if (strcasecmp(psRoot->pszValue, "Literal") == 0 && psRoot->psChild) { // Parse a element status = msSLDParseOgcExpression(psRoot->psChild, psObj, binding, objtype); } else if (strcasecmp(psRoot->pszValue, "PropertyName") == 0 && psRoot->psChild) { // Parse a element msStringBuffer *property = msStringBufferAlloc(); const char *strDelim = ""; switch (lbinding) { case MS_STYLE_BASE + MS_STYLE_BINDING_COLOR: case MS_STYLE_BASE + MS_STYLE_BINDING_OUTLINECOLOR: case MS_LABEL_BASE + MS_LABEL_BINDING_COLOR: case MS_LABEL_BASE + MS_LABEL_BINDING_OUTLINECOLOR: strDelim = "\""; /* FALLTHROUGH */ default: msStringBufferAppend(property, strDelim); msStringBufferAppend(property, "["); msStringBufferAppend(property, psRoot->psChild->pszValue); msStringBufferAppend(property, "]"); msStringBufferAppend(property, strDelim); msInitExpression(&(exprBindings[binding])); exprBindings[binding].string = msStringBufferReleaseStringAndFree(property); exprBindings[binding].type = MS_EXPRESSION; (*nexprbindings)++; break; } status = MS_SUCCESS; } else if (strcasecmp(psRoot->pszValue, "Function") == 0 && psRoot->psChild && CPLGetXMLValue(psRoot, "name", NULL) && psRoot->psChild->psNext) { // Parse a element msStringBuffer *function = msStringBufferAlloc(); // Parse function name const char *funcname = CPLGetXMLValue(psRoot, "name", NULL); msStringBufferAppend(function, funcname); msStringBufferAppend(function, "("); msInitExpression(&(exprBindings[binding])); // Parse arguments const char *sep = ""; for (CPLXMLNode *argument = psRoot->psChild->psNext; argument; argument = argument->psNext) { status = msSLDParseOgcExpression(argument, psObj, binding, objtype); if (status != MS_SUCCESS) break; msStringBufferAppend(function, sep); msStringBufferAppend(function, exprBindings[binding].string); msReplaceFreeableStr(&(exprBindings[binding].string), nullptr); msInitExpression(&(exprBindings[binding])); sep = ","; } msStringBufferAppend(function, ")"); exprBindings[binding].string = msStringBufferReleaseStringAndFree(function); exprBindings[binding].type = MS_EXPRESSION; (*nexprbindings)++; status = MS_SUCCESS; } else if (strstr(ops, psRoot->pszValue) && psRoot->psChild && psRoot->psChild->psNext) { // Parse an arithmetic element , , , const char op[2] = {*(strstr(ops, psRoot->pszValue) + 3), '\0'}; msStringBuffer *expression = msStringBufferAlloc(); // Parse first operand msStringBufferAppend(expression, "("); msInitExpression(&(exprBindings[binding])); status = msSLDParseOgcExpression(psRoot->psChild, psObj, binding, objtype); // Parse second operand if (status == MS_SUCCESS) { msStringBufferAppend(expression, exprBindings[binding].string); msStringBufferAppend(expression, op); msReplaceFreeableStr(&(exprBindings[binding].string), nullptr); msInitExpression(&(exprBindings[binding])); status = msSLDParseOgcExpression(psRoot->psChild->psNext, psObj, binding, objtype); if (status == MS_SUCCESS && exprBindings[binding].string) { msStringBufferAppend(expression, exprBindings[binding].string); msStringBufferAppend(expression, ")"); msReplaceFreeableStr(&(exprBindings[binding].string), msStringBufferReleaseStringAndFree(expression)); expression = NULL; exprBindings[binding].type = MS_EXPRESSION; (*nexprbindings)++; } } if (expression != NULL) { msStringBufferFree(expression); msInitExpression(&(exprBindings[binding])); } } break; default: break; } return status; } /************************************************************************/ /* msSLDParsePolygonSymbolizer() */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* Here, the CssParameter names are fill instead of stroke and */ /* fill-opacity instead of stroke-opacity. None of the other * CssParameters*/ /* in Stroke are available for filling and the default value for the fill * color in this context is 50% gray (value #808080).*/ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* The default if neither an ExternalGraphic nor a Mark is specified is to * use the default*/ /* mark of a square with a 50%-gray fill and a black outline, with a size * of 6 pixels.*/ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* The WellKnownName element gives the well-known name of the shape of the * mark.*/ /* Allowed values include at least square, circle, triangle, star, cross,*/ /* and x, though map servers may draw a different symbol instead if they * don't have a*/ /* shape for all of these. The default WellKnownName is square. Renderings * of these*/ /* marks may be made solid or hollow depending on Fill and Stroke * elements.*/ /* */ /************************************************************************/ int msSLDParsePolygonSymbolizer(CPLXMLNode *psRoot, layerObj *psLayer, int bNewClass, const char *pszUserStyleName) { CPLXMLNode *psFill, *psStroke; CPLXMLNode *psDisplacement = NULL, *psDisplacementX = NULL, *psDisplacementY = NULL; int nOffsetX = -1, nOffsetY = -1; if (!psRoot || !psLayer) return MS_FAILURE; // Get uom if any, defaults to MS_PIXELS enum MS_UNITS sizeunits = MS_PIXELS; if (msSLDParseUomAttribute(psRoot, &sizeunits) != MS_SUCCESS) { msSetError(MS_WMSERR, "Invalid uom attribute value.", "msSLDParsePolygonSymbolizer()"); return MS_FAILURE; } /*parse displacement for SLD 1.1.0*/ psDisplacement = CPLGetXMLNode(psRoot, "Displacement"); if (psDisplacement) { psDisplacementX = CPLGetXMLNode(psDisplacement, "DisplacementX"); psDisplacementY = CPLGetXMLNode(psDisplacement, "DisplacementY"); /* psCssParam->psChild->psNext->pszValue) */ if (psDisplacementX && psDisplacementX->psChild && psDisplacementX->psChild->pszValue && psDisplacementY && psDisplacementY->psChild && psDisplacementY->psChild->pszValue) { nOffsetX = atoi(psDisplacementX->psChild->pszValue); nOffsetY = atoi(psDisplacementY->psChild->pszValue); } } psFill = CPLGetXMLNode(psRoot, "Fill"); if (psFill) { const int nClassId = getClassId(psLayer, bNewClass, pszUserStyleName); if (nClassId < 0) return MS_FAILURE; const int iStyle = psLayer->_class[nClassId]->numstyles; msMaybeAllocateClassStyle(psLayer->_class[nClassId], iStyle); psLayer->_class[nClassId]->styles[iStyle]->sizeunits = sizeunits; msSLDParsePolygonFill(psFill, psLayer->_class[nClassId]->styles[iStyle], psLayer->map); if (nOffsetX > 0 && nOffsetY > 0) { psLayer->_class[nClassId]->styles[iStyle]->offsetx = nOffsetX; psLayer->_class[nClassId]->styles[iStyle]->offsety = nOffsetY; } } /* stroke which corresponds to the outline in mapserver */ /* is drawn after the fill */ psStroke = CPLGetXMLNode(psRoot, "Stroke"); if (psStroke) { /* -------------------------------------------------------------------- */ /* there was a fill so add a style to the last class created */ /* by the fill */ /* -------------------------------------------------------------------- */ int nClassId; int iStyle; if (psFill && psLayer->numclasses > 0) { nClassId = psLayer->numclasses - 1; iStyle = psLayer->_class[nClassId]->numstyles; msMaybeAllocateClassStyle(psLayer->_class[nClassId], iStyle); psLayer->_class[nClassId]->styles[iStyle]->sizeunits = sizeunits; } else { nClassId = getClassId(psLayer, bNewClass, pszUserStyleName); if (nClassId < 0) return MS_FAILURE; iStyle = psLayer->_class[nClassId]->numstyles; msMaybeAllocateClassStyle(psLayer->_class[nClassId], iStyle); psLayer->_class[nClassId]->styles[iStyle]->sizeunits = sizeunits; } msSLDParseStroke(psStroke, psLayer->_class[nClassId]->styles[iStyle], psLayer->map, 1); if (nOffsetX > 0 && nOffsetY > 0) { psLayer->_class[nClassId]->styles[iStyle]->offsetx = nOffsetX; psLayer->_class[nClassId]->styles[iStyle]->offsety = nOffsetY; } } return MS_SUCCESS; } /************************************************************************/ /* void msSLDParsePolygonFill(CPLXMLNode *psFill, styleObj *psStyle, */ /* mapObj *map) */ /* */ /* Parse the Fill node for a polygon into a style. */ /************************************************************************/ int msSLDParsePolygonFill(CPLXMLNode *psFill, styleObj *psStyle, mapObj *map) { CPLXMLNode *psCssParam, *psGraphicFill; char *psFillName = NULL; if (!psFill || !psStyle || !map) return MS_FAILURE; /* sets the default fill color defined in the spec #808080 */ psStyle->color.red = 128; psStyle->color.green = 128; psStyle->color.blue = 128; psCssParam = CPLGetXMLNode(psFill, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psFill, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { psFillName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (psFillName) { if (strcasecmp(psFillName, "fill") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_COLOR, MS_OBJ_STYLE); } } else if (strcasecmp(psFillName, "fill-opacity") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_OPACITY, MS_OBJ_STYLE); } } } psCssParam = psCssParam->psNext; } /* graphic fill and graphic stroke pare parsed the same way : */ /* TODO : It seems inconsistent to me since the only difference */ /* between them seems to be fill (fill) or not fill (stroke). And */ /* then again the fill parameter can be used inside both elements. */ psGraphicFill = CPLGetXMLNode(psFill, "GraphicFill"); if (psGraphicFill) msSLDParseGraphicFillOrStroke(psGraphicFill, NULL, psStyle, map); psGraphicFill = CPLGetXMLNode(psFill, "GraphicStroke"); if (psGraphicFill) msSLDParseGraphicFillOrStroke(psGraphicFill, NULL, psStyle, map); return MS_SUCCESS; } /************************************************************************/ /* msSLDParseGraphicFillOrStroke */ /* */ /* Parse the GraphicFill Or GraphicStroke node : look for a */ /* Marker symbol and set the style for that symbol. */ /************************************************************************/ int msSLDParseGraphicFillOrStroke(CPLXMLNode *psRoot, char *pszDashValue_unused, styleObj *psStyle, mapObj *map) { (void)pszDashValue_unused; CPLXMLNode *psCssParam, *psGraphic, *psExternalGraphic, *psMark, *psSize, *psGap, *psInitialGap; CPLXMLNode *psWellKnownName, *psStroke, *psFill; CPLXMLNode *psDisplacement = NULL, *psDisplacementX = NULL, *psDisplacementY = NULL; CPLXMLNode *psOpacity = NULL, *psRotation = NULL; char *psName = NULL, *psValue = NULL; char *pszSymbolName = NULL; int bFilled = 0; if (!psRoot || !psStyle || !map) return MS_FAILURE; /* ==================================================================== */ /* This a definition taken from the specification (11.3.2) : */ /* Graphics can either be referenced from an external URL in a common * format (such as*/ /* GIF or SVG) or may be derived from a Mark. Multiple external URLs and * marks may be*/ /* referenced with the semantic that they all provide the equivalent * graphic in different*/ /* formats. */ /* */ /* For this reason, we only need to support one Mark and one */ /* ExtrnalGraphic ???? */ /* ==================================================================== */ psGraphic = CPLGetXMLNode(psRoot, "Graphic"); if (psGraphic) { /* extract symbol size */ psSize = CPLGetXMLNode(psGraphic, "Size"); if (psSize && psSize->psChild) { msSLDParseOgcExpression(psSize->psChild, psStyle, MS_STYLE_BINDING_SIZE, MS_OBJ_STYLE); } else { /*do not set a default for external symbols #2305*/ psExternalGraphic = CPLGetXMLNode(psGraphic, "ExternalGraphic"); if (!psExternalGraphic) psStyle->size = 6; /* default value */ } /*SLD 1.1.0 extract opacity, rotation, displacement*/ psOpacity = CPLGetXMLNode(psGraphic, "Opacity"); if (psOpacity && psOpacity->psChild) { msSLDParseOgcExpression(psOpacity->psChild, psStyle, MS_STYLE_BINDING_OPACITY, MS_OBJ_STYLE); } psRotation = CPLGetXMLNode(psGraphic, "Rotation"); if (psRotation && psRotation->psChild) { msSLDParseOgcExpression(psRotation->psChild, psStyle, MS_STYLE_BINDING_ANGLE, MS_OBJ_STYLE); } psDisplacement = CPLGetXMLNode(psGraphic, "Displacement"); if (psDisplacement && psDisplacement->psChild) { psDisplacementX = CPLGetXMLNode(psDisplacement, "DisplacementX"); if (psDisplacementX && psDisplacementX->psChild) { msSLDParseOgcExpression(psDisplacementX->psChild, psStyle, MS_STYLE_BINDING_OFFSET_X, MS_OBJ_STYLE); } psDisplacementY = CPLGetXMLNode(psDisplacement, "DisplacementY"); if (psDisplacementY && psDisplacementY->psChild) { msSLDParseOgcExpression(psDisplacementY->psChild, psStyle, MS_STYLE_BINDING_OFFSET_Y, MS_OBJ_STYLE); } } /* extract symbol */ psMark = CPLGetXMLNode(psGraphic, "Mark"); if (psMark) { pszSymbolName = NULL; psWellKnownName = CPLGetXMLNode(psMark, "WellKnownName"); if (psWellKnownName && psWellKnownName->psChild && psWellKnownName->psChild->pszValue) pszSymbolName = msStrdup(psWellKnownName->psChild->pszValue); /* default symbol is square */ if (!pszSymbolName || !*pszSymbolName || (strcasecmp(pszSymbolName, "square") != 0 && strcasecmp(pszSymbolName, "circle") != 0 && strcasecmp(pszSymbolName, "triangle") != 0 && strcasecmp(pszSymbolName, "star") != 0 && strcasecmp(pszSymbolName, "cross") != 0 && strcasecmp(pszSymbolName, "x") != 0)) { if (!pszSymbolName || !*pszSymbolName || msGetSymbolIndex(&map->symbolset, pszSymbolName, MS_FALSE) < 0) { msFree(pszSymbolName); pszSymbolName = msStrdup("square"); } } /* check if the symbol should be filled or not */ psFill = CPLGetXMLNode(psMark, "Fill"); psStroke = CPLGetXMLNode(psMark, "Stroke"); if (psFill || psStroke) { if (psFill) bFilled = 1; else bFilled = 0; if (psFill) { psCssParam = CPLGetXMLNode(psFill, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psFill, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { psName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (psName && strcasecmp(psName, "fill") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_COLOR, MS_OBJ_STYLE); } } else if (psName && strcasecmp(psName, "fill-opacity") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { psValue = psCssParam->psChild->psNext->pszValue; if (psValue) { psStyle->color.alpha = (int)(atof(psValue) * 255); } } } psCssParam = psCssParam->psNext; } } if (psStroke) { psCssParam = CPLGetXMLNode(psStroke, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psStroke, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { psName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (psName && strcasecmp(psName, "stroke") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { if (bFilled) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_OUTLINECOLOR, MS_OBJ_STYLE); } else { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_COLOR, MS_OBJ_STYLE); } } } else if (psName && strcasecmp(psName, "stroke-opacity") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { psValue = psCssParam->psChild->psNext->pszValue; if (psValue) { if (bFilled) { psStyle->outlinecolor.alpha = (int)(atof(psValue) * 255); } else { psStyle->color.alpha = (int)(atof(psValue) * 255); } } } } else if (psName && strcasecmp(psName, "stroke-width") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psStyle, MS_STYLE_BINDING_WIDTH, MS_OBJ_STYLE); } } psCssParam = psCssParam->psNext; } } } /* set the default color if color is not not already set */ if ((psStyle->color.red < 0 || psStyle->color.green == -1 || psStyle->color.blue == -1) && (psStyle->outlinecolor.red == -1 || psStyle->outlinecolor.green == -1 || psStyle->outlinecolor.blue == -1)) { psStyle->color.red = 128; psStyle->color.green = 128; psStyle->color.blue = 128; } /* Get the corresponding symbol id */ psStyle->symbol = msSLDGetMarkSymbol(map, pszSymbolName, bFilled); if (psStyle->symbol > 0 && psStyle->symbol < map->symbolset.numsymbols) psStyle->symbolname = msStrdup(map->symbolset.symbol[psStyle->symbol]->name); } else { psExternalGraphic = CPLGetXMLNode(psGraphic, "ExternalGraphic"); if (psExternalGraphic) msSLDParseExternalGraphic(psExternalGraphic, psStyle, map); } msFree(pszSymbolName); } psGap = CPLGetXMLNode(psRoot, "Gap"); if (psGap && psGap->psChild && psGap->psChild->pszValue) { psStyle->gap = atof(psGap->psChild->pszValue); } psInitialGap = CPLGetXMLNode(psRoot, "InitialGap"); if (psInitialGap && psInitialGap->psChild && psInitialGap->psChild->pszValue) { psStyle->initialgap = atof(psInitialGap->psChild->pszValue); } return MS_SUCCESS; } /************************************************************************/ /* msSLDGetMarkSymbol */ /* */ /* Get a Mark symbol using the name. Mark symbols can be */ /* square, circle, triangle, star, cross, x. */ /* If the symbol does not exist add it to the symbol list. */ /************************************************************************/ int msSLDGetMarkSymbol(mapObj *map, char *pszSymbolName, int bFilled) { int nSymbolId = 0; symbolObj *psSymbol = NULL; if (!map || !pszSymbolName) return 0; if (strcasecmp(pszSymbolName, "square") == 0) { if (bFilled) nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_SQUARE_FILLED, MS_FALSE); else nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_SQUARE, MS_FALSE); } else if (strcasecmp(pszSymbolName, "circle") == 0) { if (bFilled) nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_CIRCLE_FILLED, MS_FALSE); else nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_CIRCLE, MS_FALSE); } else if (strcasecmp(pszSymbolName, "triangle") == 0) { if (bFilled) nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_TRIANGLE_FILLED, MS_FALSE); else nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_TRIANGLE, MS_FALSE); } else if (strcasecmp(pszSymbolName, "star") == 0) { if (bFilled) nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_STAR_FILLED, MS_FALSE); else nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_STAR, MS_FALSE); } else if (strcasecmp(pszSymbolName, "cross") == 0) { if (bFilled) nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_CROSS_FILLED, MS_FALSE); else nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_CROSS, MS_FALSE); } else if (strcasecmp(pszSymbolName, "x") == 0) { if (bFilled) nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_X_FILLED, MS_FALSE); else nSymbolId = msGetSymbolIndex(&map->symbolset, SLD_MARK_SYMBOL_X, MS_FALSE); } else { nSymbolId = msGetSymbolIndex(&map->symbolset, pszSymbolName, MS_FALSE); } if (nSymbolId <= 0) { if ((psSymbol = msGrowSymbolSet(&(map->symbolset))) == NULL) return 0; /* returns 0 for no symbol */ nSymbolId = map->symbolset.numsymbols; map->symbolset.numsymbols++; initSymbol(psSymbol); psSymbol->inmapfile = MS_TRUE; psSymbol->sizex = 1; psSymbol->sizey = 1; if (strcasecmp(pszSymbolName, "square") == 0) { if (bFilled) psSymbol->name = msStrdup(SLD_MARK_SYMBOL_SQUARE_FILLED); else psSymbol->name = msStrdup(SLD_MARK_SYMBOL_SQUARE); psSymbol->type = MS_SYMBOL_VECTOR; if (bFilled) psSymbol->filled = MS_TRUE; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; } else if (strcasecmp(pszSymbolName, "circle") == 0) { if (bFilled) psSymbol->name = msStrdup(SLD_MARK_SYMBOL_CIRCLE_FILLED); else psSymbol->name = msStrdup(SLD_MARK_SYMBOL_CIRCLE); psSymbol->type = MS_SYMBOL_ELLIPSE; if (bFilled) psSymbol->filled = MS_TRUE; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->sizex = 1; psSymbol->sizey = 1; psSymbol->numpoints++; } else if (strcasecmp(pszSymbolName, "triangle") == 0) { if (bFilled) psSymbol->name = msStrdup(SLD_MARK_SYMBOL_TRIANGLE_FILLED); else psSymbol->name = msStrdup(SLD_MARK_SYMBOL_TRIANGLE); psSymbol->type = MS_SYMBOL_VECTOR; if (bFilled) psSymbol->filled = MS_TRUE; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.5; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; } else if (strcasecmp(pszSymbolName, "star") == 0) { if (bFilled) psSymbol->name = msStrdup(SLD_MARK_SYMBOL_STAR_FILLED); else psSymbol->name = msStrdup(SLD_MARK_SYMBOL_STAR); psSymbol->type = MS_SYMBOL_VECTOR; if (bFilled) psSymbol->filled = MS_TRUE; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 0.375; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.35; psSymbol->points[psSymbol->numpoints].y = 0.375; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.5; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.65; psSymbol->points[psSymbol->numpoints].y = 0.375; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 0.375; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.75; psSymbol->points[psSymbol->numpoints].y = 0.625; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.875; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.5; psSymbol->points[psSymbol->numpoints].y = 0.75; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.125; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.25; psSymbol->points[psSymbol->numpoints].y = 0.625; psSymbol->numpoints++; } /* cross is like plus (+) since there is also X symbol ?? */ else if (strcasecmp(pszSymbolName, "cross") == 0) { /* NEVER FILL CROSS */ /* if (bFilled) */ /* psSymbol->name = msStrdup(SLD_MARK_SYMBOL_CROSS_FILLED); */ /* else */ psSymbol->name = msStrdup(SLD_MARK_SYMBOL_CROSS); psSymbol->type = MS_SYMBOL_VECTOR; /* if (bFilled) */ /* psSymbol->filled = MS_TRUE; */ psSymbol->points[psSymbol->numpoints].x = 0.5; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0.5; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = -99; psSymbol->points[psSymbol->numpoints].y = -99; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 0.5; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 0.5; psSymbol->numpoints++; } else if (strcasecmp(pszSymbolName, "x") == 0) { /* NEVER FILL X */ /* if (bFilled) */ /* psSymbol->name = msStrdup(SLD_MARK_SYMBOL_X_FILLED); */ /* else */ psSymbol->name = msStrdup(SLD_MARK_SYMBOL_X); psSymbol->type = MS_SYMBOL_VECTOR; /* if (bFilled) */ /* psSymbol->filled = MS_TRUE; */ psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = -99; psSymbol->points[psSymbol->numpoints].y = -99; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 0; psSymbol->points[psSymbol->numpoints].y = 1; psSymbol->numpoints++; psSymbol->points[psSymbol->numpoints].x = 1; psSymbol->points[psSymbol->numpoints].y = 0; psSymbol->numpoints++; } } return nSymbolId; } /************************************************************************/ /* msSLDGetGraphicSymbol */ /* */ /* Create a symbol entry for an inmap pixmap symbol. Returns */ /* the symbol id. */ /************************************************************************/ int msSLDGetGraphicSymbol(mapObj *map, char *pszFileName, char *extGraphicName, int nGap_ignored) { (void)nGap_ignored; int nSymbolId = 0; symbolObj *psSymbol = NULL; if (map && pszFileName) { if ((psSymbol = msGrowSymbolSet(&(map->symbolset))) == NULL) return 0; /* returns 0 for no symbol */ nSymbolId = map->symbolset.numsymbols; map->symbolset.numsymbols++; initSymbol(psSymbol); psSymbol->inmapfile = MS_TRUE; psSymbol->type = MS_SYMBOL_PIXMAP; psSymbol->name = msStrdup(extGraphicName); psSymbol->imagepath = msStrdup(pszFileName); psSymbol->full_pixmap_path = msStrdup(pszFileName); } return nSymbolId; } /************************************************************************/ /* msSLDParsePointSymbolizer */ /* */ /* Parse point symbolizer. */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /************************************************************************/ int msSLDParsePointSymbolizer(CPLXMLNode *psRoot, layerObj *psLayer, int bNewClass, const char *pszUserStyleName) { int nClassId = 0; int iStyle = 0; if (!psRoot || !psLayer) return MS_FAILURE; nClassId = getClassId(psLayer, bNewClass, pszUserStyleName); if (nClassId < 0) return MS_FAILURE; // Get uom if any, defaults to MS_PIXELS enum MS_UNITS sizeunits = MS_PIXELS; if (msSLDParseUomAttribute(psRoot, &sizeunits) != MS_SUCCESS) { msSetError(MS_WMSERR, "Invalid uom attribute value.", "msSLDParsePolygonSymbolizer()"); return MS_FAILURE; } iStyle = psLayer->_class[nClassId]->numstyles; msMaybeAllocateClassStyle(psLayer->_class[nClassId], iStyle); psLayer->_class[nClassId]->styles[iStyle]->sizeunits = sizeunits; msSLDParseGraphicFillOrStroke( psRoot, NULL, psLayer->_class[nClassId]->styles[iStyle], psLayer->map); return MS_SUCCESS; } /************************************************************************/ /* msSLDParseExternalGraphic */ /* */ /* Parse external graphic node : download the symbol referenced */ /* by the URL and create a PIXMAP inmap symbol. Only GIF and */ /* PNG are supported. */ /************************************************************************/ int msSLDParseExternalGraphic(CPLXMLNode *psExternalGraphic, styleObj *psStyle, mapObj *map) { char *pszFormat = NULL; CPLXMLNode *psURL = NULL, *psFormat = NULL, *psTmp = NULL; char *pszURL = NULL; if (!psExternalGraphic || !psStyle || !map) return MS_FAILURE; psFormat = CPLGetXMLNode(psExternalGraphic, "Format"); if (psFormat && psFormat->psChild && psFormat->psChild->pszValue) pszFormat = psFormat->psChild->pszValue; /* supports GIF and PNG and SVG */ if (pszFormat && (strcasecmp(pszFormat, "GIF") == 0 || strcasecmp(pszFormat, "image/gif") == 0 || strcasecmp(pszFormat, "PNG") == 0 || strcasecmp(pszFormat, "image/png") == 0 || strcasecmp(pszFormat, "image/svg+xml") == 0)) { /* */ psURL = CPLGetXMLNode(psExternalGraphic, "OnlineResource"); if (psURL && psURL->psChild) { psTmp = psURL->psChild; while (psTmp != NULL && psTmp->pszValue && strcasecmp(psTmp->pszValue, "xlink:href") != 0) { psTmp = psTmp->psNext; } if (psTmp && psTmp->psChild) { pszURL = (char *)psTmp->psChild->pszValue; char *symbolurl = NULL; // Handle relative URL for ExternalGraphic if (map->sldurl && !strstr(pszURL, "://")) { char *baseurl = NULL; char *relpath = NULL; symbolurl = static_cast(malloc(sizeof(char) * MS_MAXPATHLEN)); if (pszURL[0] != '/') { // Symbol file is relative to SLD file // e.g. SLD : http://example.com/path/to/sld.xml // and symbol: assets/symbol.svg // lead to: http://example.com/path/to/assets/symbol.svg baseurl = msGetPath(map->sldurl); relpath = pszURL; } else { // Symbol file is relative to the root of SLD server // e.g. SLD : http://example.com/path/to/sld.xml // and symbol: /path/to/assets/symbol.svg // lead to: http://example.com/path/to/assets/symbol.svg baseurl = msStrdup(map->sldurl); relpath = pszURL + 1; char *sep = strstr(baseurl, "://"); if (sep) sep += 3; else sep = baseurl; sep = strchr(sep, '/'); if (!sep) sep = baseurl + strlen(baseurl); sep[1] = '\0'; } msBuildPath(symbolurl, baseurl, relpath); msFree(baseurl); } else { // Absolute URL // e.g. symbol: http://example.com/path/to/assets/symbol.svg symbolurl = msStrdup(pszURL); } /* validate the ExternalGraphic parameter */ if (msValidateParameter(symbolurl, msLookupHashTable(&(map->web.validation), "sld_external_graphic"), NULL, NULL, NULL) != MS_SUCCESS) { msSetError(MS_WEBERR, "SLD ExternalGraphic OnlineResource value fails to " "validate against sld_external_graphic VALIDATION", "mapserv()"); msFree(symbolurl); return MS_FAILURE; } /*external symbols using http will be automatically downloaded. The file should be saved in a temporary directory (msAddImageSymbol) #2305*/ psStyle->symbol = msGetSymbolIndex(&map->symbolset, symbolurl, MS_TRUE); msFree(symbolurl); if (psStyle->symbol > 0 && psStyle->symbol < map->symbolset.numsymbols) psStyle->symbolname = msStrdup(map->symbolset.symbol[psStyle->symbol]->name); /* set the color parameter if not set. Does not make sense */ /* for pixmap but mapserver needs it. */ if (psStyle->color.red == -1 || psStyle->color.green || psStyle->color.blue) { psStyle->color.red = 0; psStyle->color.green = 0; psStyle->color.blue = 0; } } } } return MS_SUCCESS; } /************************************************************************/ /* msSLDParseTextSymbolizer */ /* */ /* Parse text symbolizer. */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* Four types of CssParameter are allowed, font-family, font-style,*/ /* fontweight,and font-size. */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* The coordinates are given as two floating-point numbers in */ /* the AnchorPointX and AnchorPointY elements each with values */ /* between 0.0 and 1.0 inclusive. The bounding box of the label */ /* to be rendered is considered to be in a coorindate space */ /* from 0.0 (lowerleft corner) to 1.0 (upper-right corner), and */ /* the anchor position is specified as a point in this */ /* space. The default point is X=0, Y=0.5, which is at the */ /* middle height of the lefthand side of the label. */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /************************************************************************/ int msSLDParseTextSymbolizer(CPLXMLNode *psRoot, layerObj *psLayer, int bOtherSymboliser, const char *pszUserStyleName) { int nStyleId = 0, nClassId = 0; if (!psRoot || !psLayer) return MS_FAILURE; if (!bOtherSymboliser) { if (msGrowLayerClasses(psLayer) == NULL) return MS_FAILURE; initClass(psLayer->_class[psLayer->numclasses]); nClassId = psLayer->numclasses; if (pszUserStyleName) psLayer->_class[nClassId]->group = msStrdup(pszUserStyleName); psLayer->numclasses++; msMaybeAllocateClassStyle(psLayer->_class[nClassId], 0); nStyleId = 0; } else { nClassId = psLayer->numclasses - 1; if (nClassId >= 0) /* should always be true */ nStyleId = psLayer->_class[nClassId]->numstyles - 1; } if (nStyleId >= 0 && nClassId >= 0) /* should always be true */ msSLDParseTextParams(psRoot, psLayer, psLayer->_class[nClassId]); return MS_SUCCESS; } /************************************************************************/ /* msSLDParseRasterSymbolizer */ /* */ /* Supports the ColorMap parameter in a Raster Symbolizer. In */ /* the ColorMap, only color and quantity are used here. */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* SLD 1.1 */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /************************************************************************/ int msSLDParseRasterSymbolizer(CPLXMLNode *psRoot, layerObj *psLayer, const char *pszUserStyleName) { CPLXMLNode *psColorMap = NULL, *psColorEntry = NULL, *psOpacity = NULL; char *pszColor = NULL, *pszQuantity = NULL; char *pszPreviousColor = NULL, *pszPreviousQuality = NULL; colorObj sColor; char szExpression[100]; double dfOpacity = 1.0; char *pszLabel = NULL, *pszPreviousLabel = NULL; char *pch = NULL, *pchPrevious = NULL; CPLXMLNode *psNode = NULL, *psCategorize = NULL; char *pszTmp = NULL; int nValues = 0, nThresholds = 0; int i, nMaxValues = 100, nMaxThreshold = 100; if (!psRoot || !psLayer) return MS_FAILURE; psOpacity = CPLGetXMLNode(psRoot, "Opacity"); if (psOpacity) { if (psOpacity->psChild && psOpacity->psChild->pszValue) dfOpacity = atof(psOpacity->psChild->pszValue); /* values in sld goes from 0.0 (for transparent) to 1.0 (for full opacity); */ if (dfOpacity >= 0.0 && dfOpacity <= 1.0) msSetLayerOpacity(psLayer, (int)(dfOpacity * 100)); else { msSetError(MS_WMSERR, "Invalid opacity value. Values should be between 0.0 and 1.0", "msSLDParseRasterSymbolizer()"); return MS_FAILURE; } } psColorMap = CPLGetXMLNode(psRoot, "ColorMap"); if (psColorMap) { psColorEntry = CPLGetXMLNode(psColorMap, "ColorMapEntry"); if (psColorEntry) { /*SLD 1.0*/ while (psColorEntry && psColorEntry->pszValue && strcasecmp(psColorEntry->pszValue, "ColorMapEntry") == 0) { pszColor = (char *)CPLGetXMLValue(psColorEntry, "color", NULL); pszQuantity = (char *)CPLGetXMLValue(psColorEntry, "quantity", NULL); pszLabel = (char *)CPLGetXMLValue(psColorEntry, "label", NULL); if (pszColor && pszQuantity) { if (pszPreviousColor && pszPreviousQuality) { if (strlen(pszPreviousColor) == 7 && pszPreviousColor[0] == '#' && strlen(pszColor) == 7 && pszColor[0] == '#') { sColor.red = msHexToInt(pszPreviousColor + 1); sColor.green = msHexToInt(pszPreviousColor + 3); sColor.blue = msHexToInt(pszPreviousColor + 5); /* pszQuantity and pszPreviousQuality may be integer or float */ pchPrevious = strchr(pszPreviousQuality, '.'); pch = strchr(pszQuantity, '.'); if (pchPrevious == NULL && pch == NULL) { snprintf(szExpression, sizeof(szExpression), "([pixel] >= %d AND [pixel] < %d)", atoi(pszPreviousQuality), atoi(pszQuantity)); } else if (pchPrevious != NULL && pch == NULL) { snprintf(szExpression, sizeof(szExpression), "([pixel] >= %f AND [pixel] < %d)", atof(pszPreviousQuality), atoi(pszQuantity)); } else if (pchPrevious == NULL && pch != NULL) { snprintf(szExpression, sizeof(szExpression), "([pixel] >= %d AND [pixel] < %f)", atoi(pszPreviousQuality), atof(pszQuantity)); } else { snprintf(szExpression, sizeof(szExpression), "([pixel] >= %f AND [pixel] < %f)", atof(pszPreviousQuality), atof(pszQuantity)); } if (msGrowLayerClasses(psLayer) == NULL) return MS_FAILURE; else { initClass(psLayer->_class[psLayer->numclasses]); psLayer->numclasses++; const int nClassId = psLayer->numclasses - 1; if (pszUserStyleName) psLayer->_class[nClassId]->group = msStrdup(pszUserStyleName); /*set the class name using the label. If label not defined set it with the quantity*/ if (pszPreviousLabel) psLayer->_class[nClassId]->name = msStrdup(pszPreviousLabel); else psLayer->_class[nClassId]->name = msStrdup(pszPreviousQuality); msMaybeAllocateClassStyle(psLayer->_class[nClassId], 0); psLayer->_class[nClassId]->styles[0]->color.red = sColor.red; psLayer->_class[nClassId]->styles[0]->color.green = sColor.green; psLayer->_class[nClassId]->styles[0]->color.blue = sColor.blue; if (!psLayer->classitem || strcasecmp(psLayer->classitem, "[pixel]") != 0) { free(psLayer->classitem); psLayer->classitem = msStrdup("[pixel]"); } msLoadExpressionString(&psLayer->_class[nClassId]->expression, szExpression); } } else { msSetError(MS_WMSERR, "Invalid ColorMap Entry.", "msSLDParseRasterSymbolizer()"); return MS_FAILURE; } } pszPreviousColor = pszColor; pszPreviousQuality = pszQuantity; pszPreviousLabel = pszLabel; } psColorEntry = psColorEntry->psNext; } /* do the last Color Map Entry */ if (pszColor && pszQuantity) { if (strlen(pszColor) == 7 && pszColor[0] == '#') { sColor.red = msHexToInt(pszColor + 1); sColor.green = msHexToInt(pszColor + 3); sColor.blue = msHexToInt(pszColor + 5); /* pszQuantity may be integer or float */ pch = strchr(pszQuantity, '.'); if (pch == NULL) { snprintf(szExpression, sizeof(szExpression), "([pixel] = %d)", atoi(pszQuantity)); } else { snprintf(szExpression, sizeof(szExpression), "([pixel] = %f)", atof(pszQuantity)); } if (msGrowLayerClasses(psLayer) == NULL) return MS_FAILURE; else { initClass(psLayer->_class[psLayer->numclasses]); psLayer->numclasses++; const int nClassId = psLayer->numclasses - 1; if (pszUserStyleName) psLayer->_class[nClassId]->group = msStrdup(pszUserStyleName); msMaybeAllocateClassStyle(psLayer->_class[nClassId], 0); if (pszLabel) psLayer->_class[nClassId]->name = msStrdup(pszLabel); else psLayer->_class[nClassId]->name = msStrdup(pszQuantity); psLayer->_class[nClassId]->numstyles = 1; psLayer->_class[nClassId]->styles[0]->color.red = sColor.red; psLayer->_class[nClassId]->styles[0]->color.green = sColor.green; psLayer->_class[nClassId]->styles[0]->color.blue = sColor.blue; if (!psLayer->classitem || strcasecmp(psLayer->classitem, "[pixel]") != 0) { free(psLayer->classitem); psLayer->classitem = msStrdup("[pixel]"); } msLoadExpressionString(&psLayer->_class[nClassId]->expression, szExpression); } } } } else if ((psCategorize = CPLGetXMLNode(psColorMap, "Categorize"))) { char **papszValues = (char **)msSmallMalloc(sizeof(char *) * nMaxValues); char **papszThresholds = (char **)msSmallMalloc(sizeof(char *) * nMaxThreshold); psNode = CPLGetXMLNode(psCategorize, "Value"); while (psNode && psNode->pszValue && psNode->psChild && psNode->psChild->pszValue) { if (strcasecmp(psNode->pszValue, "Value") == 0) { papszValues[nValues] = psNode->psChild->pszValue; nValues++; if (nValues == nMaxValues) { nMaxValues += 100; papszValues = (char **)msSmallRealloc(papszValues, sizeof(char *) * nMaxValues); } } else if (strcasecmp(psNode->pszValue, "Threshold") == 0) { papszThresholds[nThresholds] = psNode->psChild->pszValue; nThresholds++; if (nValues == nMaxThreshold) { nMaxThreshold += 100; papszThresholds = (char **)msSmallRealloc( papszThresholds, sizeof(char *) * nMaxThreshold); } } psNode = psNode->psNext; } if (nThresholds > 0 && nValues == nThresholds + 1) { /*free existing classes*/ for (i = 0; i < psLayer->numclasses; i++) { if (psLayer->_class[i] != NULL) { psLayer->_class[i]->layer = NULL; if (freeClass(psLayer->_class[i]) == MS_SUCCESS) { msFree(psLayer->_class[i]); psLayer->_class[i] = NULL; } } } psLayer->numclasses = 0; for (i = 0; i < nValues; i++) { pszTmp = (papszValues[i]); if (pszTmp && strlen(pszTmp) == 7 && pszTmp[0] == '#') { sColor.red = msHexToInt(pszTmp + 1); sColor.green = msHexToInt(pszTmp + 3); sColor.blue = msHexToInt(pszTmp + 5); if (i == 0) { if (strchr(papszThresholds[i], '.')) snprintf(szExpression, sizeof(szExpression), "([pixel] < %f)", atof(papszThresholds[i])); else snprintf(szExpression, sizeof(szExpression), "([pixel] < %d)", atoi(papszThresholds[i])); } else if (i < nValues - 1) { if (strchr(papszThresholds[i], '.')) snprintf(szExpression, sizeof(szExpression), "([pixel] >= %f AND [pixel] < %f)", atof(papszThresholds[i - 1]), atof(papszThresholds[i])); else snprintf(szExpression, sizeof(szExpression), "([pixel] >= %d AND [pixel] < %d)", atoi(papszThresholds[i - 1]), atoi(papszThresholds[i])); } else { if (strchr(papszThresholds[i - 1], '.')) snprintf(szExpression, sizeof(szExpression), "([pixel] >= %f)", atof(papszThresholds[i - 1])); else snprintf(szExpression, sizeof(szExpression), "([pixel] >= %d)", atoi(papszThresholds[i - 1])); } if (msGrowLayerClasses(psLayer)) { initClass(psLayer->_class[psLayer->numclasses]); psLayer->numclasses++; const int nClassId = psLayer->numclasses - 1; if (pszUserStyleName) psLayer->_class[nClassId]->group = msStrdup(pszUserStyleName); msMaybeAllocateClassStyle(psLayer->_class[nClassId], 0); psLayer->_class[nClassId]->numstyles = 1; psLayer->_class[nClassId]->styles[0]->color.red = sColor.red; psLayer->_class[nClassId]->styles[0]->color.green = sColor.green; psLayer->_class[nClassId]->styles[0]->color.blue = sColor.blue; if (psLayer->classitem && strcasecmp(psLayer->classitem, "[pixel]") != 0) free(psLayer->classitem); psLayer->classitem = msStrdup("[pixel]"); msLoadExpressionString(&psLayer->_class[nClassId]->expression, szExpression); } } } } msFree(papszValues); msFree(papszThresholds); } else { msSetError(MS_WMSERR, "Invalid SLD document. msSLDParseRaster", ""); return MS_FAILURE; } } return MS_SUCCESS; } /************************************************************************/ /* msSLDParseTextParams */ /* */ /* Parse text parameters like font, placement and color. */ /************************************************************************/ int msSLDParseTextParams(CPLXMLNode *psRoot, layerObj *psLayer, classObj *psClass) { char szFontName[100]; CPLXMLNode *psLabel = NULL, *psFont = NULL; CPLXMLNode *psCssParam = NULL; char *pszName = NULL, *pszFontFamily = NULL, *pszFontStyle = NULL; char *pszFontWeight = NULL; CPLXMLNode *psLabelPlacement = NULL, *psPointPlacement = NULL, *psLinePlacement = NULL; CPLXMLNode *psFill = NULL, *psHalo = NULL, *psHaloRadius = NULL, *psHaloFill = NULL; labelObj *psLabelObj = NULL; szFontName[0] = '\0'; if (!psRoot || !psClass || !psLayer) return MS_FAILURE; if (psClass->numlabels == 0) { if (msGrowClassLabels(psClass) == NULL) return (MS_FAILURE); initLabel(psClass->labels[0]); psClass->numlabels++; } psLabelObj = psClass->labels[0]; /*set the angle by default to auto. the angle can be modified Label Placement #2806*/ psLabelObj->anglemode = MS_AUTO; /* label */ /* support literal expression and propertyname - - Bug 1857 */ psLabel = CPLGetXMLNode(psRoot, "Label"); if (psLabel) { const char *sep = ""; msStringBuffer *classtext = msStringBufferAlloc(); msStringBufferAppend(classtext, "("); for (CPLXMLNode *psTmpNode = psLabel->psChild; psTmpNode; psTmpNode = psTmpNode->psNext) { if (psTmpNode->eType == CXT_Text && psTmpNode->pszValue) { msStringBufferAppend(classtext, sep); msStringBufferAppend(classtext, "\""); msStringBufferAppend(classtext, psTmpNode->pszValue); msStringBufferAppend(classtext, "\""); sep = "+"; } else if (psTmpNode->eType == CXT_Element && strcasecmp(psTmpNode->pszValue, "Literal") == 0 && psTmpNode->psChild) { msStringBufferAppend(classtext, sep); msStringBufferAppend(classtext, "\""); msStringBufferAppend(classtext, psTmpNode->psChild->pszValue); msStringBufferAppend(classtext, "\""); sep = "+"; } else if (psTmpNode->eType == CXT_Element && strcasecmp(psTmpNode->pszValue, "PropertyName") == 0 && psTmpNode->psChild) { msStringBufferAppend(classtext, sep); msStringBufferAppend(classtext, "\"["); msStringBufferAppend(classtext, psTmpNode->psChild->pszValue); msStringBufferAppend(classtext, "]\""); sep = "+"; } else if (psTmpNode->eType == CXT_Element && strcasecmp(psTmpNode->pszValue, "Function") == 0 && psTmpNode->psChild) { msStringBufferAppend(classtext, sep); msStringBufferAppend(classtext, "tostring("); labelObj tempExpressionCollector; initLabel(&tempExpressionCollector); msSLDParseOgcExpression(psTmpNode, &tempExpressionCollector, MS_LABEL_BINDING_SIZE, MS_OBJ_LABEL); msStringBufferAppend( classtext, tempExpressionCollector.exprBindings[MS_LABEL_BINDING_SIZE].string); freeLabel(&tempExpressionCollector); msStringBufferAppend(classtext, ",\"%g\")"); sep = "+"; } } msStringBufferAppend(classtext, ")"); const char *expressionstring = msStringBufferGetString(classtext); if (strlen(expressionstring) > 2) { msLoadExpressionString(&psClass->text, (char *)expressionstring); } msStringBufferFree(classtext); { /* font */ psFont = CPLGetXMLNode(psRoot, "Font"); if (psFont) { psCssParam = CPLGetXMLNode(psFont, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psFont, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { pszName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (pszName) { if (strcasecmp(pszName, "font-family") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext && psCssParam->psChild->psNext->pszValue) pszFontFamily = psCssParam->psChild->psNext->pszValue; } /* normal, italic, oblique */ else if (strcasecmp(pszName, "font-style") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext && psCssParam->psChild->psNext->pszValue) pszFontStyle = psCssParam->psChild->psNext->pszValue; } /* normal or bold */ else if (strcasecmp(pszName, "font-weight") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext && psCssParam->psChild->psNext->pszValue) pszFontWeight = psCssParam->psChild->psNext->pszValue; } /* default is 10 pix */ else if (strcasecmp(pszName, "font-size") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psLabelObj, MS_LABEL_BINDING_SIZE, MS_OBJ_LABEL); } } } psCssParam = psCssParam->psNext; } } /* -------------------------------------------------------------------- */ /* parse the label placement. */ /* -------------------------------------------------------------------- */ psLabelPlacement = CPLGetXMLNode(psRoot, "LabelPlacement"); if (psLabelPlacement) { psPointPlacement = CPLGetXMLNode(psLabelPlacement, "PointPlacement"); psLinePlacement = CPLGetXMLNode(psLabelPlacement, "LinePlacement"); if (psPointPlacement) ParseTextPointPlacement(psPointPlacement, psClass); if (psLinePlacement) ParseTextLinePlacement(psLinePlacement, psClass); } /* -------------------------------------------------------------------- */ /* build the font name using the font font-family, font-style */ /* and font-weight. The name building uses a - between these */ /* parameters and the resulting name is compared to the list of */ /* available fonts. If the name exists, it will be used else we */ /* go to the bitmap fonts. */ /* -------------------------------------------------------------------- */ if (pszFontFamily) { snprintf(szFontName, sizeof(szFontName), "%s", pszFontFamily); if (pszFontWeight && strcasecmp(pszFontWeight, "normal") != 0) { strlcat(szFontName, "-", sizeof(szFontName)); strlcat(szFontName, pszFontWeight, sizeof(szFontName)); } if (pszFontStyle && strcasecmp(pszFontStyle, "normal") != 0) { strlcat(szFontName, "-", sizeof(szFontName)); strlcat(szFontName, pszFontStyle, sizeof(szFontName)); } if ((msLookupHashTable(&(psLayer->map->fontset.fonts), szFontName) != NULL)) { psLabelObj->font = msStrdup(szFontName); } } /* -------------------------------------------------------------------- */ /* parse the halo parameter. */ /* -------------------------------------------------------------------- */ psHalo = CPLGetXMLNode(psRoot, "Halo"); if (psHalo) { psHaloRadius = CPLGetXMLNode(psHalo, "Radius"); if (psHaloRadius && psHaloRadius->psChild && psHaloRadius->psChild->pszValue) psLabelObj->outlinewidth = atoi(psHaloRadius->psChild->pszValue); psHaloFill = CPLGetXMLNode(psHalo, "Fill"); if (psHaloFill) { psCssParam = CPLGetXMLNode(psHaloFill, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psHaloFill, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { pszName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (pszName) { if (strcasecmp(pszName, "fill") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression( psCssParam->psChild->psNext, psLabelObj, MS_LABEL_BINDING_OUTLINECOLOR, MS_OBJ_LABEL); } } } psCssParam = psCssParam->psNext; } } } /* -------------------------------------------------------------------- */ /* Parse the color */ /* -------------------------------------------------------------------- */ psFill = CPLGetXMLNode(psRoot, "Fill"); if (psFill) { psCssParam = CPLGetXMLNode(psFill, "CssParameter"); /*sld 1.1 used SvgParameter*/ if (psCssParam == NULL) psCssParam = CPLGetXMLNode(psFill, "SvgParameter"); while (psCssParam && psCssParam->pszValue && (strcasecmp(psCssParam->pszValue, "CssParameter") == 0 || strcasecmp(psCssParam->pszValue, "SvgParameter") == 0)) { pszName = (char *)CPLGetXMLValue(psCssParam, "name", NULL); if (pszName) { if (strcasecmp(pszName, "fill") == 0) { if (psCssParam->psChild && psCssParam->psChild->psNext) { msSLDParseOgcExpression(psCssParam->psChild->psNext, psLabelObj, MS_LABEL_BINDING_COLOR, MS_OBJ_LABEL); } } } psCssParam = psCssParam->psNext; } } } } return MS_SUCCESS; } /************************************************************************/ /* ParseTextPointPlacement */ /* */ /* point placement node for the text symbolizer. */ /************************************************************************/ int ParseTextPointPlacement(CPLXMLNode *psRoot, classObj *psClass) { CPLXMLNode *psAnchor, *psAnchorX, *psAnchorY; CPLXMLNode *psDisplacement, *psDisplacementX, *psDisplacementY; CPLXMLNode *psRotation = NULL; labelObj *psLabelObj = NULL; if (!psRoot || !psClass) return MS_FAILURE; if (psClass->numlabels == 0) { if (msGrowClassLabels(psClass) == NULL) return (MS_FAILURE); initLabel(psClass->labels[0]); psClass->numlabels++; } psLabelObj = psClass->labels[0]; /* init the label with the default position */ psLabelObj->position = MS_CL; /* -------------------------------------------------------------------- */ /* parse anchor point. see function msSLDParseTextSymbolizer */ /* for documentation. */ /* -------------------------------------------------------------------- */ psAnchor = CPLGetXMLNode(psRoot, "AnchorPoint"); if (psAnchor) { psAnchorX = CPLGetXMLNode(psAnchor, "AnchorPointX"); psAnchorY = CPLGetXMLNode(psAnchor, "AnchorPointY"); /* psCssParam->psChild->psNext->pszValue) */ if (psAnchorX && psAnchorX->psChild && psAnchorX->psChild->pszValue && psAnchorY && psAnchorY->psChild && psAnchorY->psChild->pszValue) { const double dfAnchorX = atof(psAnchorX->psChild->pszValue); const double dfAnchorY = atof(psAnchorY->psChild->pszValue); if ((dfAnchorX == 0 || dfAnchorX == 0.5 || dfAnchorX == 1) && (dfAnchorY == 0 || dfAnchorY == 0.5 || dfAnchorY == 1)) { if (dfAnchorX == 0 && dfAnchorY == 0) psLabelObj->position = MS_LL; if (dfAnchorX == 0 && dfAnchorY == 0.5) psLabelObj->position = MS_CL; if (dfAnchorX == 0 && dfAnchorY == 1) psLabelObj->position = MS_UL; if (dfAnchorX == 0.5 && dfAnchorY == 0) psLabelObj->position = MS_LC; if (dfAnchorX == 0.5 && dfAnchorY == 0.5) psLabelObj->position = MS_CC; if (dfAnchorX == 0.5 && dfAnchorY == 1) psLabelObj->position = MS_UC; if (dfAnchorX == 1 && dfAnchorY == 0) psLabelObj->position = MS_LR; if (dfAnchorX == 1 && dfAnchorY == 0.5) psLabelObj->position = MS_CR; if (dfAnchorX == 1 && dfAnchorY == 1) psLabelObj->position = MS_UR; } } } /* -------------------------------------------------------------------- */ /* Parse displacement */ /* -------------------------------------------------------------------- */ psDisplacement = CPLGetXMLNode(psRoot, "Displacement"); if (psDisplacement) { psDisplacementX = CPLGetXMLNode(psDisplacement, "DisplacementX"); psDisplacementY = CPLGetXMLNode(psDisplacement, "DisplacementY"); /* psCssParam->psChild->psNext->pszValue) */ if (psDisplacementX && psDisplacementX->psChild && psDisplacementX->psChild->pszValue && psDisplacementY && psDisplacementY->psChild && psDisplacementY->psChild->pszValue) { psLabelObj->offsetx = atoi(psDisplacementX->psChild->pszValue); psLabelObj->offsety = atoi(psDisplacementY->psChild->pszValue); } } /* -------------------------------------------------------------------- */ /* parse rotation. */ /* -------------------------------------------------------------------- */ psRotation = CPLGetXMLNode(psRoot, "Rotation"); if (psRotation && psRotation->psChild) { msSLDParseOgcExpression(psRotation->psChild, psLabelObj, MS_LABEL_BINDING_ANGLE, MS_OBJ_LABEL); } return MS_SUCCESS; } /************************************************************************/ /* ParseTextLinePlacement */ /* */ /* Lineplacement node fro the text symbolizer. */ /************************************************************************/ int ParseTextLinePlacement(CPLXMLNode *psRoot, classObj *psClass) { CPLXMLNode *psOffset = NULL, *psAligned = NULL; labelObj *psLabelObj = NULL; if (!psRoot || !psClass) return MS_FAILURE; if (psClass->numlabels == 0) { if (msGrowClassLabels(psClass) == NULL) return (MS_FAILURE); initLabel(psClass->labels[0]); psClass->numlabels++; } psLabelObj = psClass->labels[0]; /*if there is a line placement, we will assume that the best setting for mapserver would be for the text to follow the line #2806*/ psLabelObj->anglemode = MS_FOLLOW; /*sld 1.1.0 has a parameter IsAligned. default value is true*/ psAligned = CPLGetXMLNode(psRoot, "IsAligned"); if (psAligned && psAligned->psChild && psAligned->psChild->pszValue && strcasecmp(psAligned->psChild->pszValue, "false") == 0) { psLabelObj->anglemode = MS_NONE; } psOffset = CPLGetXMLNode(psRoot, "PerpendicularOffset"); if (psOffset && psOffset->psChild && psOffset->psChild->pszValue) { psLabelObj->offsetx = atoi(psOffset->psChild->pszValue); psLabelObj->offsety = MS_LABEL_PERPENDICULAR_OFFSET; /*if there is a PerpendicularOffset, we will assume that the best setting for mapserver would be to use angle=0 and the the offset #2806*/ /* since sld 1.1.0 introduces the IsAligned parameter, only set the angles if the parameter is not set*/ if (!psAligned) { psLabelObj->anglemode = MS_NONE; psLabelObj->offsety = psLabelObj->offsetx; } } return MS_SUCCESS; } /************************************************************************/ /* void msSLDSetColorObject(char *psHexColor, colorObj */ /* *psColor) */ /* */ /* Utility function to extract rgb values from an hexadecimal */ /* color string (format is : #aaff08) and set it in the color */ /* object. */ /************************************************************************/ int msSLDSetColorObject(char *psHexColor, colorObj *psColor) { if (psHexColor && psColor && strlen(psHexColor) == 7 && psHexColor[0] == '#') { psColor->red = msHexToInt(psHexColor + 1); psColor->green = msHexToInt(psHexColor + 3); psColor->blue = msHexToInt(psHexColor + 5); } return MS_SUCCESS; } /* -------------------------------------------------------------------- */ /* client sld support functions */ /* -------------------------------------------------------------------- */ /************************************************************************/ /* msSLDGenerateSLD(mapObj *map, int iLayer) */ /* */ /* Return an SLD document for all layers that are on or */ /* default. The second argument should be set to -1 to generate */ /* on all layers. Or set to the layer index to generate an SLD */ /* for a specific layer. */ /* */ /* The caller should free the returned string. */ /************************************************************************/ char *msSLDGenerateSLD(mapObj *map, int iLayer, const char *pszVersion) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) char szTmp[500]; int i = 0; char *pszTmp = NULL; char *pszSLD = NULL; char *schemalocation = NULL; int sld_version = OWS_VERSION_NOTSET; sld_version = msOWSParseVersionString(pszVersion); if (sld_version == OWS_VERSION_NOTSET || (sld_version != OWS_1_0_0 && sld_version != OWS_1_1_0)) sld_version = OWS_1_0_0; if (map) { schemalocation = msEncodeHTMLEntities(msOWSGetSchemasLocation(map)); if (sld_version == OWS_1_0_0) snprintf(szTmp, sizeof(szTmp), "\n", schemalocation); else snprintf(szTmp, sizeof(szTmp), "\n", schemalocation); free(schemalocation); pszSLD = msStringConcatenate(pszSLD, szTmp); if (iLayer < 0 || iLayer > map->numlayers - 1) { for (i = 0; i < map->numlayers; i++) { pszTmp = msSLDGenerateSLDLayer(GET_LAYER(map, i), sld_version); if (pszTmp) { pszSLD = msStringConcatenate(pszSLD, pszTmp); free(pszTmp); } } } else { pszTmp = msSLDGenerateSLDLayer(GET_LAYER(map, iLayer), sld_version); if (pszTmp) { pszSLD = msStringConcatenate(pszSLD, pszTmp); free(pszTmp); } } snprintf(szTmp, sizeof(szTmp), "%s", "\n"); pszSLD = msStringConcatenate(pszSLD, szTmp); } return pszSLD; #else msSetError(MS_MISCERR, "OWS support is not available.", "msSLDGenerateSLDLayer()"); return NULL; #endif } /************************************************************************/ /* msSLDGetGraphicSLD */ /* */ /* Get an SLD for a style containing a symbol (Mark or external). */ /************************************************************************/ char *msSLDGetGraphicSLD(styleObj *psStyle, layerObj *psLayer, int bNeedMarkSybol, int nVersion) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) msStringBuffer *sldString = msStringBufferAlloc(); int nSymbol = -1; symbolObj *psSymbol = NULL; char szTmp[512]; char szFormat[4]; int i = 0, nLength = 0; int bColorAvailable = 0; int bGenerateDefaultSymbol = 0; char *pszSymbolName = NULL; char sNameSpace[10]; char sCssParam[30]; sCssParam[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sCssParam, "se:SvgParameter"); else strcpy(sCssParam, "CssParameter"); sNameSpace[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sNameSpace, "se:"); if (psStyle && psLayer && psLayer->map) { nSymbol = -1; if (psStyle->symbol > 0) nSymbol = psStyle->symbol; else if (psStyle->symbolname) nSymbol = msGetSymbolIndex(&psLayer->map->symbolset, psStyle->symbolname, MS_FALSE); bGenerateDefaultSymbol = 0; if (bNeedMarkSybol && (nSymbol <= 0 || nSymbol >= psLayer->map->symbolset.numsymbols)) bGenerateDefaultSymbol = 1; if (nSymbol > 0 && nSymbol < psLayer->map->symbolset.numsymbols) { psSymbol = psLayer->map->symbolset.symbol[nSymbol]; if (psSymbol->type == MS_SYMBOL_VECTOR || psSymbol->type == MS_SYMBOL_ELLIPSE) { /* Mark symbol */ if (psSymbol->name) { if (strcasecmp(psSymbol->name, "square") == 0 || strcasecmp(psSymbol->name, "circle") == 0 || strcasecmp(psSymbol->name, "triangle") == 0 || strcasecmp(psSymbol->name, "star") == 0 || strcasecmp(psSymbol->name, "cross") == 0 || strcasecmp(psSymbol->name, "x") == 0) pszSymbolName = msStrdup(psSymbol->name); else if (strncasecmp(psSymbol->name, "sld_mark_symbol_square", 22) == 0) pszSymbolName = msStrdup("square"); else if (strncasecmp(psSymbol->name, "sld_mark_symbol_triangle", 24) == 0) pszSymbolName = msStrdup("triangle"); else if (strncasecmp(psSymbol->name, "sld_mark_symbol_circle", 22) == 0) pszSymbolName = msStrdup("circle"); else if (strncasecmp(psSymbol->name, "sld_mark_symbol_star", 20) == 0) pszSymbolName = msStrdup("star"); else if (strncasecmp(psSymbol->name, "sld_mark_symbol_cross", 21) == 0) pszSymbolName = msStrdup("cross"); else if (strncasecmp(psSymbol->name, "sld_mark_symbol_x", 17) == 0) pszSymbolName = msStrdup("X"); if (pszSymbolName) { colorObj sTmpFillColor = {128, 128, 128, 255}; colorObj sTmpStrokeColor = {0, 0, 0, 255}; int hasFillColor = 0; int hasStrokeColor = 0; snprintf(szTmp, sizeof(szTmp), "<%sGraphic>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sMark>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sWellKnownName>%s\n", sNameSpace, pszSymbolName, sNameSpace); msStringBufferAppend(sldString, szTmp); if (psStyle->color.red != -1 && psStyle->color.green != -1 && psStyle->color.blue != -1) { sTmpFillColor.red = psStyle->color.red; sTmpFillColor.green = psStyle->color.green; sTmpFillColor.blue = psStyle->color.blue; sTmpFillColor.alpha = psStyle->color.alpha; hasFillColor = 1; } if (psStyle->outlinecolor.red != -1 && psStyle->outlinecolor.green != -1 && psStyle->outlinecolor.blue != -1) { sTmpStrokeColor.red = psStyle->outlinecolor.red; sTmpStrokeColor.green = psStyle->outlinecolor.green; sTmpStrokeColor.blue = psStyle->outlinecolor.blue; sTmpStrokeColor.alpha = psStyle->outlinecolor.alpha; hasStrokeColor = 1; // Make defaults implicit if (sTmpStrokeColor.red == 0 && sTmpStrokeColor.green == 0 && sTmpStrokeColor.blue == 0 && sTmpStrokeColor.alpha == 255 && psStyle->width == 1) { hasStrokeColor = 0; } } if (!hasFillColor && !hasStrokeColor) { sTmpFillColor.red = 128; sTmpFillColor.green = 128; sTmpFillColor.blue = 128; sTmpFillColor.alpha = 255; hasFillColor = 1; } if (hasFillColor) { snprintf(szTmp, sizeof(szTmp), "<%sFill>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%s name=\"fill\">#%02x%02x%02x\n", sCssParam, sTmpFillColor.red, sTmpFillColor.green, sTmpFillColor.blue, sCssParam); msStringBufferAppend(sldString, szTmp); if (sTmpFillColor.alpha != 255 && sTmpFillColor.alpha != -1) { snprintf(szTmp, sizeof(szTmp), "<%s name=\"fill-opacity\">%.2f\n", sCssParam, (float)sTmpFillColor.alpha / 255.0, sCssParam); msStringBufferAppend(sldString, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); } if (hasStrokeColor) { snprintf(szTmp, sizeof(szTmp), "<%sStroke>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke\">#%02x%02x%02x\n", sCssParam, sTmpStrokeColor.red, sTmpStrokeColor.green, sTmpStrokeColor.blue, sCssParam); msStringBufferAppend(sldString, szTmp); if (psStyle->width > 0) { snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-width\">%g\n", sCssParam, psStyle->width, sCssParam); msStringBufferAppend(sldString, szTmp); } if (sTmpStrokeColor.alpha != 255 && sTmpStrokeColor.alpha != -1) { snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-opacity\">%.2f\n", sCssParam, (float)sTmpStrokeColor.alpha / 255.0, sCssParam); msStringBufferAppend(sldString, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); if (psStyle->size > 0) { snprintf(szTmp, sizeof(szTmp), "<%sSize>%g\n", sNameSpace, psStyle->size, sNameSpace); msStringBufferAppend(sldString, szTmp); } if (fmod(psStyle->angle, 360)) { snprintf(szTmp, sizeof(szTmp), "<%sRotation>%g\n", sNameSpace, psStyle->angle, sNameSpace); msStringBufferAppend(sldString, szTmp); } // Style opacity is already reported to alpha channel of color and // outlinecolor if (psStyle->opacity < 100) // { // snprintf(szTmp, sizeof(szTmp), "<%sOpacity>%g\n", // sNameSpace, psStyle->opacity/100.0, sNameSpace); // pszSLD = msStringConcatenate(pszSLD, szTmp); // } if (psStyle->offsetx != 0 || psStyle->offsety != 0) { snprintf(szTmp, sizeof(szTmp), "<%sDisplacement>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sDisplacementX>%g\n", sNameSpace, psStyle->offsetx, sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sDisplacementY>%g\n", sNameSpace, psStyle->offsety, sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); if (pszSymbolName) free(pszSymbolName); } } else bGenerateDefaultSymbol = 1; } else if (psSymbol->type == MS_SYMBOL_PIXMAP || psSymbol->type == MS_SYMBOL_SVG) { if (psSymbol->name) { const char *pszURL = msLookupHashTable(&(psLayer->metadata), "WMS_SLD_SYMBOL_URL"); if (!pszURL) pszURL = msLookupHashTable(&(psLayer->map->web.metadata), "WMS_SLD_SYMBOL_URL"); if (pszURL) { snprintf(szTmp, sizeof(szTmp), "<%sGraphic>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sExternalGraphic>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sOnlineResource " "xmlns:xlink=\"http://www.w3.org/1999/xlink\" " "xlink:type=\"simple\" xlink:href=\"%s%s\"/>\n", sNameSpace, pszURL, psSymbol->imagepath); msStringBufferAppend(sldString, szTmp); /* TODO : extract format from symbol */ szFormat[0] = '\0'; nLength = strlen(psSymbol->imagepath); if (nLength > 3) { for (i = 0; i <= 2; i++) szFormat[2 - i] = psSymbol->imagepath[nLength - 1 - i]; szFormat[3] = '\0'; } if (strlen(szFormat) > 0 && ((strcasecmp(szFormat, "GIF") == 0) || (strcasecmp(szFormat, "PNG") == 0))) { if (strcasecmp(szFormat, "GIF") == 0) snprintf(szTmp, sizeof(szTmp), "<%sFormat>image/gif\n", sNameSpace, sNameSpace); else snprintf(szTmp, sizeof(szTmp), "<%sFormat>image/png\n", sNameSpace, sNameSpace); } else snprintf(szTmp, sizeof(szTmp), "<%sFormat>%s\n", sNameSpace, (psSymbol->type == MS_SYMBOL_SVG) ? "image/svg+xml" : "image/gif", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); if (psStyle->size > 0) snprintf(szTmp, sizeof(szTmp), "<%sSize>%g\n", sNameSpace, psStyle->size, sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); } } } } if (bGenerateDefaultSymbol) { /* generate a default square symbol */ snprintf(szTmp, sizeof(szTmp), "<%sGraphic>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sMark>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sWellKnownName>%s\n", sNameSpace, "square", sNameSpace); msStringBufferAppend(sldString, szTmp); bColorAvailable = 0; if (psStyle->color.red != -1 && psStyle->color.green != -1 && psStyle->color.blue != -1) { snprintf(szTmp, sizeof(szTmp), "<%sFill>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%s name=\"fill\">#%02x%02x%02x\n", sCssParam, psStyle->color.red, psStyle->color.green, psStyle->color.blue, sCssParam); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); bColorAvailable = 1; } if (psStyle->outlinecolor.red != -1 && psStyle->outlinecolor.green != -1 && psStyle->outlinecolor.blue != -1) { snprintf(szTmp, sizeof(szTmp), "<%sStroke>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%s name=\"Stroke\">#%02x%02x%02x\n", sCssParam, psStyle->outlinecolor.red, psStyle->outlinecolor.green, psStyle->outlinecolor.blue, sCssParam); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); bColorAvailable = 1; } if (!bColorAvailable) { /* default color */ snprintf(szTmp, sizeof(szTmp), "<%sFill>\n", sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "<%s name=\"fill\">%s\n", sCssParam, "#808080", sCssParam); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); if (psStyle->size > 0) snprintf(szTmp, sizeof(szTmp), "<%sSize>%g\n", sNameSpace, psStyle->size, sNameSpace); else snprintf(szTmp, sizeof(szTmp), "<%sSize>%d\n", sNameSpace, 1, sNameSpace); msStringBufferAppend(sldString, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); msStringBufferAppend(sldString, szTmp); } } return msStringBufferReleaseStringAndFree(sldString); #else return NULL; #endif } /************************************************************************/ /* msSLDGenerateLineSLD */ /* */ /* Generate SLD for a Line layer. */ /************************************************************************/ char *msSLDGenerateLineSLD(styleObj *psStyle, layerObj *psLayer, int nVersion) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) char *pszSLD = NULL; char szTmp[100]; char szHexColor[7]; int nSymbol = -1; int i = 0; double dfSize = 1.0; char *pszDashArray = NULL; char *pszGraphicSLD = NULL; char sCssParam[30]; char sNameSpace[10]; if (msCheckParentPointer(psLayer->map, "map") == MS_FAILURE) return NULL; sCssParam[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sCssParam, "se:SvgParameter"); else strcpy(sCssParam, "CssParameter"); sNameSpace[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sNameSpace, "se:"); snprintf(szTmp, sizeof(szTmp), "<%sLineSymbolizer>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); snprintf(szTmp, sizeof(szTmp), "<%sStroke>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); pszGraphicSLD = msSLDGetGraphicSLD(psStyle, psLayer, 0, nVersion); if (pszGraphicSLD) { snprintf(szTmp, sizeof(szTmp), "<%sGraphicStroke>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); pszSLD = msStringConcatenate(pszSLD, pszGraphicSLD); if (nVersion >= OWS_1_1_0) { if (psStyle->gap > 0) { snprintf(szTmp, sizeof(szTmp), "<%sGap>%.2f\n", sNameSpace, psStyle->gap, sNameSpace); } if (psStyle->initialgap > 0) { snprintf(szTmp, sizeof(szTmp), "<%sInitialGap>%.2f\n", sNameSpace, psStyle->initialgap, sNameSpace); } } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); free(pszGraphicSLD); pszGraphicSLD = NULL; } if (psStyle->color.red != -1 && psStyle->color.green != -1 && psStyle->color.blue != -1) snprintf(szHexColor, sizeof(szHexColor), "%02x%02x%02x", psStyle->color.red, psStyle->color.green, psStyle->color.blue); else snprintf(szHexColor, sizeof(szHexColor), "%02x%02x%02x", psStyle->outlinecolor.red, psStyle->outlinecolor.green, psStyle->outlinecolor.blue); snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke\">#%s\n", sCssParam, szHexColor, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); if (psStyle->color.alpha != 255 && psStyle->color.alpha != -1) { snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-opacity\">%.2f\n", sCssParam, (float)psStyle->color.alpha / 255.0, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); } nSymbol = -1; if (psStyle->symbol >= 0) nSymbol = psStyle->symbol; else if (psStyle->symbolname) nSymbol = msGetSymbolIndex(&psLayer->map->symbolset, psStyle->symbolname, MS_FALSE); if (nSymbol < 0) dfSize = 1.0; else { if (psStyle->size > 0) dfSize = psStyle->size; else if (psStyle->width > 0) dfSize = psStyle->width; else dfSize = 1; } snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-width\">%.2f\n", sCssParam, dfSize, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); /* -------------------------------------------------------------------- */ /* dash array */ /* -------------------------------------------------------------------- */ if (psStyle->patternlength > 0) { for (i = 0; i < psStyle->patternlength; i++) { snprintf(szTmp, sizeof(szTmp), "%.2f ", psStyle->pattern[i]); pszDashArray = msStringConcatenate(pszDashArray, szTmp); } // remove the final trailing space from the last pattern value msStringTrimBlanks(pszDashArray); snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-dasharray\">%s\n", sCssParam, pszDashArray, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); msFree(pszDashArray); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); return pszSLD; #else return NULL; #endif } /************************************************************************/ /* msSLDGeneratePolygonSLD */ /* */ /* Generate SLD for a Polygon layer. */ /************************************************************************/ char *msSLDGeneratePolygonSLD(styleObj *psStyle, layerObj *psLayer, int nVersion) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) char szTmp[100]; char *pszSLD = NULL; char szHexColor[7]; double dfSize; char sCssParam[30]; char sNameSpace[10]; sCssParam[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sCssParam, "se:SvgParameter"); else strcpy(sCssParam, "CssParameter"); sNameSpace[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sNameSpace, "se:"); snprintf(szTmp, sizeof(szTmp), "<%sPolygonSymbolizer>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); /* fill */ if (psStyle->color.red != -1 && psStyle->color.green != -1 && psStyle->color.blue != -1) { snprintf(szTmp, sizeof(szTmp), "<%sFill>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); char *pszGraphicSLD = msSLDGetGraphicSLD(psStyle, psLayer, 0, nVersion); if (pszGraphicSLD) { snprintf(szTmp, sizeof(szTmp), "<%sGraphicFill>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); pszSLD = msStringConcatenate(pszSLD, pszGraphicSLD); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); free(pszGraphicSLD); } snprintf(szHexColor, sizeof(szHexColor), "%02x%02x%02x", psStyle->color.red, psStyle->color.green, psStyle->color.blue); snprintf(szTmp, sizeof(szTmp), "<%s name=\"fill\">#%s\n", sCssParam, szHexColor, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); if (psStyle->color.alpha != 255 && psStyle->color.alpha != -1) { snprintf(szTmp, sizeof(szTmp), "<%s name=\"fill-opacity\">%.2f\n", sCssParam, (float)psStyle->color.alpha / 255, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); } /* stroke */ if (psStyle->outlinecolor.red != -1 && psStyle->outlinecolor.green != -1 && psStyle->outlinecolor.blue != -1) { snprintf(szTmp, sizeof(szTmp), "<%sStroke>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); /* If there is a symbol to be used for stroke, the color in the */ /* style should be set to -1. Else It won't apply here. */ if (psStyle->color.red == -1 && psStyle->color.green == -1 && psStyle->color.blue == -1) { char *pszGraphicSLD = msSLDGetGraphicSLD(psStyle, psLayer, 0, nVersion); if (pszGraphicSLD) { snprintf(szTmp, sizeof(szTmp), "<%sGraphicFill>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); pszSLD = msStringConcatenate(pszSLD, pszGraphicSLD); snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); free(pszGraphicSLD); } } snprintf(szHexColor, sizeof(szHexColor), "%02x%02x%02x", psStyle->outlinecolor.red, psStyle->outlinecolor.green, psStyle->outlinecolor.blue); snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke\">#%s\n", sCssParam, szHexColor, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); dfSize = 1.0; if (psStyle->size > 0) dfSize = psStyle->size; else if (psStyle->width > 0) dfSize = psStyle->width; snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-width\">%.2f\n", sCssParam, dfSize, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); if (psStyle->outlinecolor.alpha != 255 && psStyle->outlinecolor.alpha != -1) { snprintf(szTmp, sizeof(szTmp), "<%s name=\"stroke-opacity\">%.2f\n", sCssParam, psStyle->outlinecolor.alpha / 255.0, sCssParam); pszSLD = msStringConcatenate(pszSLD, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); return pszSLD; #else return NULL; #endif } /************************************************************************/ /* msSLDGeneratePointSLD */ /* */ /* Generate SLD for a Point layer. */ /************************************************************************/ char *msSLDGeneratePointSLD(styleObj *psStyle, layerObj *psLayer, int nVersion) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) char *pszSLD = NULL; char *pszGraphicSLD = NULL; char szTmp[100]; char sNameSpace[10]; sNameSpace[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sNameSpace, "se:"); snprintf(szTmp, sizeof(szTmp), "<%sPointSymbolizer>\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); pszGraphicSLD = msSLDGetGraphicSLD(psStyle, psLayer, 1, nVersion); if (pszGraphicSLD) { pszSLD = msStringConcatenate(pszSLD, pszGraphicSLD); free(pszGraphicSLD); } snprintf(szTmp, sizeof(szTmp), "\n", sNameSpace); pszSLD = msStringConcatenate(pszSLD, szTmp); return pszSLD; #else return NULL; #endif } /************************************************************************/ /* msSLDGenerateTextSLD */ /* */ /* Generate a TextSymboliser SLD xml based on the class's label */ /* object. */ /************************************************************************/ char *msSLDGenerateTextSLD(classObj *psClass, layerObj *psLayer, int nVersion) { #if defined(USE_WMS_SVR) || defined(USE_WFS_SVR) || defined(USE_WCS_SVR) || \ defined(USE_SOS_SVR) char *pszSLD = NULL; char szTmp[1000]; char **aszFontsParts = NULL; int nFontParts = 0; char szHexColor[7]; double dfAnchorX = 0.5, dfAnchorY = 0.5; int i = 0; int lid; char sCssParam[30]; char sNameSpace[10]; labelObj *psLabelObj = NULL; sCssParam[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sCssParam, "se:SvgParameter"); else strcpy(sCssParam, "CssParameter"); sNameSpace[0] = '\0'; if (nVersion > OWS_1_0_0) strcpy(sNameSpace, "se:"); if (!psLayer || !psClass) return pszSLD; for (lid = 0; lid < psClass->numlabels; lid++) { char *psLabelText; expressionObj psLabelExpr; parseObj p; msInitExpression(&psLabelExpr); psLabelObj = psClass->labels[lid]; if (psLabelObj->text.string) { psLabelExpr.string = msStrdup(psLabelObj->text.string); psLabelExpr.type = psLabelObj->text.type; } else if (psClass->text.string) { psLabelExpr.string = msStrdup(psClass->text.string); psLabelExpr.type = psClass->text.type; } else if (psLayer->labelitem) { psLabelExpr.string = msStrdup(psLayer->labelitem); psLabelExpr.type = MS_STRING; } else { msFreeExpression(&psLabelExpr); continue; // Can't find text content for this