diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..c650217b1f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. + +version: 2 + +updates: + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + # Only do security updates rather than all version updates. + open-pull-requests-limit: 0 + + - package-ecosystem: "pip" + directory: "/" + schedule: + interval: "monthly" + # Only do security updates rather than all version updates. + open-pull-requests-limit: 0 diff --git a/.github/workflows/abi_compatibility.yml b/.github/workflows/abi_compatibility.yml new file mode 100644 index 0000000000..fa8345dc25 --- /dev/null +++ b/.github/workflows/abi_compatibility.yml @@ -0,0 +1,288 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# GitHub Actions workflow file +# https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions +# +# ABI compatibility gate for patch releases. +# +# Patch releases are cut from the RB-MAJOR.MINOR release branches (e.g. RB-2.6), +# and a patch release must not break the ABI promised by the library's SONAME. +# OpenColorIO sets SOVERSION = MAJOR.MINOR (see the top-level CMakeLists.txt), so +# every binary linked against libOpenColorIO.so. -- i.e. built +# against X.Y.0 -- is expected to keep working with any later X.Y.Z without +# recompilation. +# +# This workflow enforces that contract *before* a patch ships: it runs on every +# pull request targeting an RB-* branch, builds the shared library from the +# post-merge state of the PR and from the series anchor (X.Y.0), and compares +# the two ABIs with libabigail's `abidiff`. If the change would break the +# series ABI, the check fails and the PR is blocked. +# +# ----------------------------------------------------------------------------- +# Why libabigail (`abidiff`)? +# ----------------------------------------------------------------------------- +# Several tools can compare C/C++ ABIs. The options that were considered: +# +# * libabigail (abidiff / abidw) -- CHOSEN. +# Actively maintained by Sourceware/Red Hat and used as the ABI gate by +# the Linux kernel, systemd, and most major distros. Reads DWARF debug +# info straight from the built .so (no source-level reparsing), has a +# deep model of C++ (vtables, templates, member layout, mangling), gives +# scriptable bitmask exit codes that make CI gating trivial, supports +# `--headers-dir` to restrict the diff to the public API, and supports +# suppression files for the rare intentional exception. Installable in +# the ASWF ci-ocio container via dnf. +# +# * abi-compliance-checker (+ abi-dumper) -- the historical ABI Laboratory +# tool. Produces nice HTML reports, but is Perl-based, more loosely +# maintained, needs an extra dumper/vtable-dumper toolchain, and its +# header-driven mode is brittle with modern C++. Worse fit for an +# unattended CI gate; its exit handling is also less granular. +# +# * Symbol-list diffing (nm -D / readelf --dyn-syms, or `abidw` symbol-only) +# -- trivial to run, but only catches added/removed *symbols*. It is +# blind to the changes that most often break consumers silently: struct +# layout, vtable order, enum/parameter/return-type changes. Too coarse to +# trust as the sole gate. +# +# * Off-the-shelf "ABI check" marketplace Actions -- thin wrappers around one +# of the above, generally unmaintained and unpinned. Calling the tool +# directly is more transparent and easier to pin/audit. +# +# libabigail gives the strongest correctness guarantee for the least +# maintenance, which is why it is used here. +# ----------------------------------------------------------------------------- + +name: ABI Compatibility + +on: + # Only run on pull requests that target a release branch. Patch releases are + # the only releases that must preserve the ABI, and they are always prepared + # on RB-MAJOR.MINOR branches. + pull_request: + branches: + - 'RB-*' + + # Manual trigger, e.g. to dry-run the check against a release branch before + # opening the PR. + workflow_dispatch: + inputs: + base_branch: + description: 'Release branch the change targets (e.g. RB-2.6)' + required: true + type: string + ref: + description: 'Ref to check as the proposed change (optional; defaults to the launched ref)' + required: false + type: string + +# A PR can be pushed to repeatedly; this double build is expensive, so cancel +# superseded runs. +concurrency: + group: abi-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + abi: + name: 'ABI compatibility check' + runs-on: ubuntu-latest + # Build inside the same ASWF image used by the CI workflow so the toolchain + # and dependencies match what releases are actually built with. Pinned to a + # stable VFX CY; bump this together with the CI matrix. + container: + image: aswf/ci-ocio:2025 + + steps: + - name: Install libabigail + run: | + dnf install -y libabigail \ + || { dnf install -y epel-release && dnf install -y libabigail; } + abidiff --version + + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + # Full history + tags are needed to resolve the anchor tag and to add + # a worktree for it. For a pull_request, github.ref is the merge ref + # (refs/pull/N/merge), i.e. the post-merge state we want to validate. + fetch-depth: 0 + fetch-tags: true + ref: ${{ github.event_name == 'workflow_dispatch' && inputs.ref || github.ref }} + + - name: Determine ABI baseline + id: versions + shell: bash + run: | + set -euo pipefail + # The container checks out the workspace as a different user than the + # one git expects; mark everything safe so git/worktree commands work. + git config --global --add safe.directory '*' + + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + BASE_REF='${{ inputs.base_branch }}' + CURRENT_DESC="${{ inputs.ref || github.ref_name }} -> ${BASE_REF}" + else + BASE_REF='${{ github.base_ref }}' + CURRENT_DESC="PR #${{ github.event.pull_request.number }} -> ${BASE_REF}" + fi + echo "Target release branch: ${BASE_REF}" + + # The release branch name encodes the series: RB-MAJOR.MINOR. + if [[ ! "${BASE_REF}" =~ ^RB-([0-9]+)\.([0-9]+)$ ]]; then + echo "::notice::Base branch '${BASE_REF}' is not an RB-MAJOR.MINOR release branch; skipping ABI check." + echo "skip=true" >> "${GITHUB_OUTPUT}" + exit 0 + fi + MAJOR="${BASH_REMATCH[1]}" + MINOR="${BASH_REMATCH[2]}" + + # Anchor on X.Y.0, the ABI first published under the MAJOR.MINOR + # SONAME. Comparing the proposed change directly against the series + # anchor enforces compatibility with every consumer linked against any + # release in the series. Fall back to the lowest existing patch tag if + # X.Y.0 is missing for some reason. + ANCHOR="v${MAJOR}.${MINOR}.0" + if git rev-parse -q --verify "refs/tags/${ANCHOR}" >/dev/null; then + BASELINE="${ANCHOR}" + else + BASELINE=$(git tag --list "v${MAJOR}.${MINOR}.*" | grep -E "^v${MAJOR}\.${MINOR}\.[0-9]+$" | sort -V | head -1) + fi + if [ -z "${BASELINE}" ]; then + echo "::notice::The ${MAJOR}.${MINOR} series has no published release tag yet, so there is no ABI to preserve. Skipping." + echo "skip=true" >> "${GITHUB_OUTPUT}" + exit 0 + fi + + echo "Comparing '${CURRENT_DESC}' against baseline ${BASELINE}" + { + echo "skip=false" + echo "baseline=${BASELINE}" + echo "current_desc=${CURRENT_DESC}" + } >> "${GITHUB_OUTPUT}" + + - name: Write build helper + if: steps.versions.outputs.skip != 'true' + shell: bash + run: | + set -euo pipefail + cat > "${RUNNER_TEMP}/abi_build.sh" <<'EOF' + #!/usr/bin/env bash + # Build only the shared library so abidiff can read the DWARF ABI. + # RelWithDebInfo is deliberate: it emits -g AND is the only optimized + # build type OCIO leaves unstripped (share/cmake/macros/StripUtils.cmake + # strips Release/MinSizeRel, which would erase the debug info abidiff + # needs). Everything not needed for the .so is turned off to keep the + # double build as fast as possible. + set -euo pipefail + SRC="$1" + OUT="$2" + cmake -S "${SRC}" -B "${OUT}/build" \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DCMAKE_INSTALL_PREFIX="${OUT}/install" \ + -DBUILD_SHARED_LIBS=ON \ + -DOCIO_USE_SOVERSION=ON \ + -DOCIO_BUILD_PYTHON=OFF \ + -DOCIO_BUILD_APPS=OFF \ + -DOCIO_BUILD_TESTS=OFF \ + -DOCIO_BUILD_GPU_TESTS=OFF \ + -DOCIO_BUILD_OPENFX=OFF \ + -DOCIO_BUILD_DOCS=OFF \ + -DOCIO_INSTALL_EXT_PACKAGES=MISSING \ + -DOCIO_WARNING_AS_ERROR=OFF + cmake --build "${OUT}/build" --target install -- -j"$(nproc)" + EOF + chmod +x "${RUNNER_TEMP}/abi_build.sh" + + - name: Build baseline (${{ steps.versions.outputs.baseline }}) + if: steps.versions.outputs.skip != 'true' + shell: bash + run: | + set -euo pipefail + git worktree add --detach "${RUNNER_TEMP}/baseline-src" "${{ steps.versions.outputs.baseline }}" + "${RUNNER_TEMP}/abi_build.sh" "${RUNNER_TEMP}/baseline-src" "${RUNNER_TEMP}/old" + + - name: Build proposed change + if: steps.versions.outputs.skip != 'true' + shell: bash + run: | + set -euo pipefail + "${RUNNER_TEMP}/abi_build.sh" "${GITHUB_WORKSPACE}" "${RUNNER_TEMP}/new" + + - name: Compare ABI (abidiff) + if: steps.versions.outputs.skip != 'true' + shell: bash + run: | + set -euo pipefail + + OLD_LIB=$(find "${RUNNER_TEMP}/old/install" -type f -name 'libOpenColorIO.so.*' | head -1) + NEW_LIB=$(find "${RUNNER_TEMP}/new/install" -type f -name 'libOpenColorIO.so.*' | head -1) + if [ -z "${OLD_LIB}" ] || [ -z "${NEW_LIB}" ]; then + echo "::error::Could not locate the built shared libraries (old='${OLD_LIB}' new='${NEW_LIB}')." + exit 1 + fi + echo "Baseline library: ${OLD_LIB}" + echo "Proposed library: ${NEW_LIB}" + + ARGS=( + # Restrict the comparison to types reachable from the public headers. + --headers-dir1 "${RUNNER_TEMP}/old/install/include" + --headers-dir2 "${RUNNER_TEMP}/new/install/include" + # Added symbols are forward-compatible for existing consumers, so do + # not count them as a breaking change (they would warrant a minor + # bump, but they do not break binaries linked against the baseline). + --no-added-syms + # Fail loudly instead of silently degrading to a weaker, symbol-only + # comparison if a build somehow lacks debug info. + --fail-no-debug-info + ) + SUPPR="${GITHUB_WORKSPACE}/share/abi/ocio.abignore" + if [ -f "${SUPPR}" ]; then + ARGS+=(--suppressions "${SUPPR}") + fi + + set +e + abidiff "${ARGS[@]}" "${OLD_LIB}" "${NEW_LIB}" | tee "${RUNNER_TEMP}/abidiff.txt" + STATUS=${PIPESTATUS[0]} + set -e + + # abidiff exit code is a bitmask: + # 1 = ABIDIFF_ERROR (tool error) + # 2 = ABIDIFF_USAGE_ERROR + # 4 = ABIDIFF_ABI_CHANGE + # 8 = ABIDIFF_ABI_INCOMPATIBLE_CHANGE + { + echo "## ABI compatibility check" + echo "" + echo "- Baseline: \`${{ steps.versions.outputs.baseline }}\`" + echo "- Change: ${{ steps.versions.outputs.current_desc }}" + echo "" + echo '```' + cat "${RUNNER_TEMP}/abidiff.txt" + echo '```' + } >> "${GITHUB_STEP_SUMMARY}" + + if (( STATUS & 2 )); then + echo "::error::abidiff usage error (exit ${STATUS})." + exit 1 + fi + if (( STATUS & 1 )); then + echo "::error::abidiff failed to run (exit ${STATUS}); a build may be missing debug info." + exit 1 + fi + if (( STATUS & (4 | 8) )); then + echo "::error::This change breaks the ABI of the ${{ steps.versions.outputs.baseline }} series. A patch release must preserve the ABI. If the change is intentional and verified safe, add a justified suppression to share/abi/ocio.abignore." + exit 1 + fi + echo "ABI is compatible with the baseline. ✅" + + - name: Upload abidiff report + if: steps.versions.outputs.skip != 'true' && always() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: abidiff-report + path: ${{ runner.temp }}/abidiff.txt + if-no-files-found: ignore diff --git a/.github/workflows/analysis_workflow.yml b/.github/workflows/analysis_workflow.yml index d722232129..1bd42af380 100644 --- a/.github/workflows/analysis_workflow.yml +++ b/.github/workflows/analysis_workflow.yml @@ -41,11 +41,11 @@ jobs: CC: gcc steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 50 - - name: Install sonar-scanner and build-wrapper - uses: sonarsource/sonarcloud-github-c-cpp@v2 + - name: Install build-wrapper + uses: SonarSource/sonarqube-scan-action/install-build-wrapper@59db25f34e16620e48ab4bb9e4a5dce155cb5432 # v8.0.0 - name: Install docs env run: share/ci/scripts/linux/dnf/install_docs_env.sh - name: Install tests env @@ -78,7 +78,7 @@ jobs: - name: Generate code coverage report run: share/ci/scripts/linux/run_gcov.sh - name: Run sonar-scanner + uses: SonarSource/sonarqube-scan-action@59db25f34e16620e48ab4bb9e4a5dce155cb5432 # v8.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: sonar-scanner diff --git a/.github/workflows/ci_workflow.yml b/.github/workflows/ci_workflow.yml index 62ea921776..41c7afb08a 100644 --- a/.github/workflows/ci_workflow.yml +++ b/.github/workflows/ci_workflow.yml @@ -57,16 +57,16 @@ jobs: container: # DockerHub: https://hub.docker.com/u/aswf # Source: https://github.com/AcademySoftwareFoundation/aswf-docker - image: aswf/ci-ocio:${{ matrix.vfx-cy }} + image: aswf/ci-ocio:${{ matrix.container-tag || matrix.vfx-cy }} strategy: - fail-fast: true + fail-fast: false matrix: - build: [7, 8, 9, 10, 11, 12, 13, 14, 15] + build: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] include: # ------------------------------------------------------------------- - # VFX CY2025 (Python 3.11) + # VFX CY2026 (Python 3.13) # ------------------------------------------------------------------- - - build: 15 + - build: 12 build-type: Debug build-shared: 'ON' build-docs: 'OFF' @@ -77,9 +77,9 @@ jobs: cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang - vfx-cy: 2025 + vfx-cy: 2026 install-ext-packages: MISSING - - build: 14 + - build: 11 build-type: Release build-shared: 'ON' build-docs: 'ON' @@ -90,9 +90,9 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2025 + vfx-cy: 2026 install-ext-packages: ALL - - build: 13 + - build: 10 build-type: Release build-shared: 'OFF' build-docs: 'OFF' @@ -103,12 +103,12 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2025 + vfx-cy: 2026 install-ext-packages: ALL # ------------------------------------------------------------------- - # VFX CY2024 (Python 3.11) + # VFX CY2025 (Python 3.11) # ------------------------------------------------------------------- - - build: 12 + - build: 9 build-type: Debug build-shared: 'ON' build-docs: 'OFF' @@ -119,9 +119,9 @@ jobs: cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang - vfx-cy: 2024 + vfx-cy: 2025 install-ext-packages: MISSING - - build: 11 + - build: 8 build-type: Release build-shared: 'ON' build-docs: 'ON' @@ -132,9 +132,9 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2024 + vfx-cy: 2025 install-ext-packages: ALL - - build: 10 + - build: 7 build-type: Release build-shared: 'OFF' build-docs: 'OFF' @@ -145,12 +145,12 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2024 + vfx-cy: 2025 install-ext-packages: ALL # ------------------------------------------------------------------- - # VFX CY2023 (Python 3.10) + # VFX CY2024 (Python 3.11) # ------------------------------------------------------------------- - - build: 9 + - build: 6 build-type: Debug build-shared: 'ON' build-docs: 'OFF' @@ -161,9 +161,9 @@ jobs: cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang - vfx-cy: 2023 + vfx-cy: 2024 install-ext-packages: MISSING - - build: 8 + - build: 5 build-type: Release build-shared: 'ON' build-docs: 'ON' @@ -174,9 +174,9 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2023 + vfx-cy: 2024 install-ext-packages: ALL - - build: 7 + - build: 4 build-type: Release build-shared: 'OFF' build-docs: 'OFF' @@ -187,136 +187,25 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2023 + vfx-cy: 2024 install-ext-packages: ALL - env: - CXX: ${{ matrix.cxx-compiler }} - CC: ${{ matrix.cc-compiler }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Install docs env - run: share/ci/scripts/linux/dnf/install_docs_env.sh - if: matrix.build-docs == 'ON' - - name: Install tests env - run: share/ci/scripts/linux/dnf/install_tests_env.sh - - name: Create build directories - run: | - mkdir _install - mkdir _build - - name: Configure - run: | - cmake ../. \ - -DCMAKE_INSTALL_PREFIX=../_install \ - -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ - -DCMAKE_CXX_STANDARD=${{ matrix.cxx-standard }} \ - -DBUILD_SHARED_LIBS=${{ matrix.build-shared }} \ - -DOCIO_BUILD_DOCS=${{ matrix.build-docs }} \ - -DOCIO_BUILD_OPENFX=${{ matrix.build-openfx }} \ - -DOCIO_BUILD_GPU_TESTS=OFF \ - -DOCIO_USE_SIMD=${{ matrix.use-simd }} \ - -DOCIO_USE_OIIO_FOR_APPS=${{ matrix.use-oiio }} \ - -DOCIO_INSTALL_EXT_PACKAGES=${{ matrix.install-ext-packages }} \ - -DOCIO_WARNING_AS_ERROR=ON \ - -DPython_EXECUTABLE=$(which python) - working-directory: _build - - name: Build - run: | - cmake --build . \ - --target install \ - --config ${{ matrix.build-type }} \ - -- -j$(nproc) - echo "ocio_build_path=$(pwd)" >> $GITHUB_ENV - working-directory: _build - - name: Test - run: ctest -V -C ${{ matrix.build-type }} - working-directory: _build - - name: Test CMake Consumer with shared OCIO - if: matrix.build-shared == 'ON' - run: | - cmake . \ - -DCMAKE_PREFIX_PATH=../../../_install \ - -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} - cmake --build . \ - --config ${{ matrix.build-type }} - ./consumer - working-directory: _build/tests/cmake-consumer-dist - - name: Test CMake Consumer with static OCIO - if: matrix.build-shared == 'OFF' - # The yaml-cpp_VERSION is set below because Findyaml-cpp.cmake needs it but is unable to - # extract it from the headers, like the other modules. - # - # Prefer the static version of each dependencies by using _STATIC_LIBRARY. - # Alternatively, this can be done by setting _LIBRARY and _INCLUDE_DIR to - # the static version of the package. - run: | - cmake . \ - -DCMAKE_PREFIX_PATH=../../../_install \ - -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ - -Dexpat_ROOT=${{ env.ocio_build_path }}/ext/dist \ - -Dexpat_STATIC_LIBRARY=ON \ - -DImath_ROOT=${{ env.ocio_build_path }}/ext/dist \ - -DImath_STATIC_LIBRARY=ON \ - -Dpystring_ROOT=${{ env.ocio_build_path }}/ext/dist \ - -Dyaml-cpp_ROOT=${{ env.ocio_build_path }}/ext/dist \ - -Dyaml-cpp_STATIC_LIBRARY=ON \ - -Dyaml-cpp_VERSION=0.8.0 \ - -DZLIB_ROOT=${{ env.ocio_build_path }}/ext/dist \ - -DZLIB_STATIC_LIBRARY=ON \ - -Dminizip-ng_ROOT=${{ env.ocio_build_path }}/ext/dist \ - -Dminizip-ng_STATIC_LIBRARY=ON - cmake --build . \ - --config ${{ matrix.build-type }} - ./consumer - working-directory: _build/tests/cmake-consumer-dist - - # --------------------------------------------------------------------------- - # Linux (unsupported Node.js) - # --------------------------------------------------------------------------- - - linux-old: - name: 'Linux VFX CY${{ matrix.vfx-cy }} - <${{ matrix.compiler-desc }} - config=${{ matrix.build-type }}, - shared=${{ matrix.build-shared }}, - simd=${{ matrix.use-simd }}, - cxx=${{ matrix.cxx-standard }}, - docs=${{ matrix.build-docs }}, - oiio=${{ matrix.use-oiio }}>' - # Avoid duplicated checks when a pull_request is opened from a local branch. - if: | - github.event_name == 'push' || - github.event.pull_request.head.repo.full_name != github.repository - # GH-hosted VM. The build runs in ASWF 'container' defined below. - runs-on: ubuntu-latest - container: - # DockerHub: https://hub.docker.com/u/aswf - # Source: https://github.com/AcademySoftwareFoundation/aswf-docker - image: aswf/ci-ocio:${{ matrix.vfx-cy }} - volumes: - - /node20217:/node20217:rw,rshared - - /node20217:/__e/node20:ro,rshared - strategy: - fail-fast: true - matrix: - build: [1, 2, 3] - include: # ------------------------------------------------------------------- - # VFX CY2022 (Python 3.9) + # VFX CY2023 (Python 3.10) # ------------------------------------------------------------------- - - build: 1 + - build: 3 build-type: Debug build-shared: 'ON' build-docs: 'OFF' build-openfx: 'ON' use-simd: 'ON' use-oiio: 'ON' - cxx-standard: 17 + cxx-standard: 20 cxx-compiler: clang++ cc-compiler: clang compiler-desc: Clang - vfx-cy: 2022 - install-ext-packages: ALL + vfx-cy: 2023 + container-tag: 2023.2 + install-ext-packages: MISSING - build: 2 build-type: Release build-shared: 'ON' @@ -328,9 +217,10 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2022 - install-ext-packages: MISSING - - build: 3 + vfx-cy: 2023 + container-tag: 2023.2 + install-ext-packages: ALL + - build: 1 build-type: Release build-shared: 'OFF' build-docs: 'OFF' @@ -341,30 +231,15 @@ jobs: cxx-compiler: g++ cc-compiler: gcc compiler-desc: GCC - vfx-cy: 2022 + vfx-cy: 2023 + container-tag: 2023.2 install-ext-packages: ALL env: CXX: ${{ matrix.cxx-compiler }} CC: ${{ matrix.cc-compiler }} steps: - # Install nodejs 20 with glibc 2.17, to work around the face that the - # GHA runners are insisting on a node version that is too new for the - # glibc in the ASWF containers prior to 2023. - - name: Install nodejs20glibc2.17 - run: | - curl --silent https://unofficial-builds.nodejs.org/download/release/v20.18.1/node-v20.18.1-linux-x64-glibc-217.tar.xz | tar -xJ --strip-components 1 -C /node20217 -f - - # We would like to use harden-runner, but it flags too many false - # positives, every time we download a dependency. We should use it only - # on CI runs where we are producing artifacts that users might rely on. - # - name: Harden Runner - # uses: step-security/harden-runner@248ae51c2e8cc9622ecf50685c8bf7150c6e8813 # v1.4.3 - # with: - # egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 - # Note: can't upgrade to actions/checkout 4.0 because it needs newer - # glibc than these containers have. - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install docs env run: share/ci/scripts/linux/dnf/install_docs_env.sh if: matrix.build-docs == 'ON' @@ -445,7 +320,7 @@ jobs: # --------------------------------------------------------------------------- macos: - name: 'macOS 13 + name: 'macOS 15 intel OpenColorIO-.tar.gz +# + +name: Sign Release + +on: + release: + types: [published] + +permissions: + contents: read + +jobs: + release: + name: Sign & upload release artifacts + runs-on: ubuntu-latest + + env: + TAG: ${{ github.ref_name }} + permissions: + contents: write + id-token: write + repository-projects: write + + steps: + + - name: Set Prefix + # The tag name begins with a 'v', e.g. "v2.4.0", but the prefix + # should omit the 'v', so the tarball "OpenColorIO-2.4.0.tar.gz" + # extracts files into "OpenColorIO-2.4.0/...". This matches + # the GitHub release page autogenerated artifact conventions. + run: | + echo OCIO_PREFIX=OpenColorIO-${TAG//v}/ >> $GITHUB_ENV + echo OCIO_TARBALL=OpenColorIO-${TAG//v}.tar.gz >> $GITHUB_ENV + shell: bash + + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Create archive + run: git archive --format=tar.gz -o ${OCIO_TARBALL} --prefix ${OCIO_PREFIX} ${TAG} + + - name: Sign archive with Sigstore + uses: sigstore/gh-action-sigstore-python@04cffa1d795717b140764e8b640de88853c92acc # v3.3.0 + with: + inputs: ${{ env.OCIO_TARBALL }} + upload-signing-artifacts: false + release-signing-artifacts: false + + - name: Upload release archive + env: + GH_TOKEN: ${{ github.token }} + run: gh release upload ${TAG} ${OCIO_TARBALL} ${OCIO_TARBALL}.sigstore.json diff --git a/.github/workflows/wheel_workflow.yml b/.github/workflows/wheel_workflow.yml index ed83e68457..d2602978da 100644 --- a/.github/workflows/wheel_workflow.yml +++ b/.github/workflows/wheel_workflow.yml @@ -50,19 +50,18 @@ jobs: github.repository == 'AcademySoftwareFoundation/OpenColorIO' steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/checkout@v4 + - name: Build SDist + run: pipx run build --sdist - - name: Build SDist - run: pipx run build --sdist + - name: Check metadata + run: pipx run twine check dist/* - - name: Check metadata - run: pipx run twine check dist/* - - - uses: actions/upload-artifact@v4 - with: - name: cibw-sdist - path: dist/*.tar.gz + - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 + with: + name: cibw-sdist + path: dist/*.tar.gz # --------------------------------------------------------------------------- # Linux Wheels @@ -81,10 +80,6 @@ jobs: # ------------------------------------------------------------------- # CPython 64 bits manylinux_2_28 # ------------------------------------------------------------------- - - build: CPython 3.9 64 bits manylinux_2_28 - manylinux: manylinux_2_28 - python: cp39-manylinux_x86_64 - arch: x86_64 - build: CPython 3.10 64 bits manylinux_2_28 manylinux: manylinux_2_28 python: cp310-manylinux_x86_64 @@ -101,17 +96,13 @@ jobs: manylinux: manylinux_2_28 python: cp313-manylinux_x86_64 arch: x86_64 - # - build: CPython 3.14 64 bits manylinux_2_28 - # manylinux: manylinux_2_28 - # python: cp314-manylinux_x86_64 - # arch: x86_64 + - build: CPython 3.14 64 bits manylinux_2_28 + manylinux: manylinux_2_28 + python: cp314-manylinux_x86_64 + arch: x86_64 # ------------------------------------------------------------------- # CPython 64 bits manylinux2014 # ------------------------------------------------------------------- - - build: CPython 3.9 64 bits manylinux2014 - manylinux: manylinux2014 - python: cp39-manylinux_x86_64 - arch: x86_64 - build: CPython 3.10 64 bits manylinux2014 manylinux: manylinux2014 python: cp310-manylinux_x86_64 @@ -128,27 +119,28 @@ jobs: manylinux: manylinux2014 python: cp313-manylinux_x86_64 arch: x86_64 - # - build: CPython 3.14 64 bits manylinux2014 - # manylinux: manylinux2014 - # python: cp314-manylinux_x86_64 - # arch: x86_64 + - build: CPython 3.14 64 bits manylinux2014 + manylinux: manylinux2014 + python: cp314-manylinux_x86_64 + arch: x86_64 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 name: Install Python with: python-version: '3.11' - name: Build wheels - uses: pypa/cibuildwheel@v3.1.4 + uses: pypa/cibuildwheel@ee02a1537ce3071a004a6b08c41e72f0fdc42d9a # v3.4.0 env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.manylinux }} + CIBW_BEFORE_BUILD: "pip install sphinx-press-theme" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: cibw-wheels-${{ matrix.python }}-${{ matrix.manylinux }} path: ./wheelhouse/*.whl @@ -170,10 +162,6 @@ jobs: # ------------------------------------------------------------------- # CPython ARM 64 bits manylinux2014 # ------------------------------------------------------------------- - - build: CPython 3.9 ARM 64 bits manylinux2014 - manylinux: manylinux2014 - python: cp39-manylinux_aarch64 - arch: aarch64 - build: CPython 3.10 ARM 64 bits manylinux2014 manylinux: manylinux2014 python: cp310-manylinux_aarch64 @@ -190,27 +178,28 @@ jobs: manylinux: manylinux2014 python: cp313-manylinux_aarch64 arch: aarch64 - # - build: CPython 3.14 ARM 64 bits manylinux2014 - # manylinux: manylinux2014 - # python: cp314-manylinux_aarch64 - # arch: aarch64 + - build: CPython 3.14 ARM 64 bits manylinux2014 + manylinux: manylinux2014 + python: cp314-manylinux_aarch64 + arch: aarch64 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 name: Install Python with: python-version: '3.11' - name: Build wheels - uses: pypa/cibuildwheel@v3.1.4 + uses: pypa/cibuildwheel@ee02a1537ce3071a004a6b08c41e72f0fdc42d9a # v3.4.0 env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} CIBW_MANYLINUX_AARCH64_IMAGE: ${{ matrix.manylinux }} + CIBW_BEFORE_BUILD: "pip install sphinx-press-theme" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: cibw-wheels-${{ matrix.python }}-${{ matrix.manylinux }} path: ./wheelhouse/*.whl @@ -221,7 +210,7 @@ jobs: macos: name: Build wheels on macOS - runs-on: macos-13 + runs-on: macos-15-intel # Don't run on OCIO forks if: | github.event_name != 'schedule' || @@ -232,9 +221,6 @@ jobs: # ------------------------------------------------------------------- # CPython 64 bits # ------------------------------------------------------------------- - - build: CPython 3.9 64 bits - python: cp39-macosx_x86_64 - arch: x86_64 - build: CPython 3.10 64 bits python: cp310-macosx_x86_64 arch: x86_64 @@ -247,14 +233,14 @@ jobs: - build: CPython 3.13 64 bits python: cp313-macosx_x86_64 arch: x86_64 - # - build: CPython 3.14 64 bits - # python: cp314-macosx_x86_64 - # arch: x86_64 + - build: CPython 3.14 64 bits + python: cp314-macosx_x86_64 + arch: x86_64 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 name: Install Python with: python-version: '3.11' @@ -264,12 +250,13 @@ jobs: brew uninstall --ignore-dependencies openexr imath || true - name: Build wheels - uses: pypa/cibuildwheel@v3.1.4 + uses: pypa/cibuildwheel@ee02a1537ce3071a004a6b08c41e72f0fdc42d9a # v3.4.0 env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} + CIBW_BEFORE_BUILD: "pip install sphinx-press-theme" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: cibw-wheels-${{ matrix.python }} path: ./wheelhouse/*.whl @@ -291,9 +278,6 @@ jobs: # ------------------------------------------------------------------- # CPython ARM 64 bits # ------------------------------------------------------------------- - - build: CPython 3.9 ARM 64 bits - python: cp39-macosx_arm64 - arch: arm64 - build: CPython 3.10 ARM 64 bits python: cp310-macosx_arm64 arch: arm64 @@ -306,25 +290,26 @@ jobs: - build: CPython 3.13 ARM 64 bits python: cp313-macosx_arm64 arch: arm64 - # - build: CPython 3.14 ARM 64 bits - # python: cp314-macosx_arm64 - # arch: arm64 + - build: CPython 3.14 ARM 64 bits + python: cp314-macosx_arm64 + arch: arm64 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 name: Install Python with: python-version: '3.11' - name: Build wheels - uses: pypa/cibuildwheel@v3.1.4 + uses: pypa/cibuildwheel@ee02a1537ce3071a004a6b08c41e72f0fdc42d9a # v3.4.0 env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} + CIBW_BEFORE_BUILD: "pip install sphinx-press-theme" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: cibw-wheels-${{ matrix.python }} path: ./wheelhouse/*.whl @@ -346,9 +331,6 @@ jobs: # ------------------------------------------------------------------- # CPython 64 bits # ------------------------------------------------------------------- - - build: CPython 3.9 64 bits - python: cp39-win_amd64 - arch: AMD64 - build: CPython 3.10 64 bits python: cp310-win_amd64 arch: AMD64 @@ -361,44 +343,48 @@ jobs: - build: CPython 3.13 64 bits python: cp313-win_amd64 arch: AMD64 - # - build: CPython 3.14 64 bits - # python: cp314-win_amd64 - # arch: AMD64 + - build: CPython 3.14 64 bits + python: cp314-win_amd64 + arch: AMD64 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 name: Install Python with: python-version: '3.11' - name: Build wheels - uses: pypa/cibuildwheel@v3.1.4 + uses: pypa/cibuildwheel@ee02a1537ce3071a004a6b08c41e72f0fdc42d9a # v3.4.0 env: CIBW_BUILD: ${{ matrix.python }} CIBW_ARCHS: ${{ matrix.arch }} + CIBW_BEFORE_BUILD: "pip install sphinx-press-theme" - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: cibw-wheels-${{ matrix.python }} path: ./wheelhouse/*.whl + # --------------------------------------------------------------------------- + # Upload + # --------------------------------------------------------------------------- upload_pypi: needs: [sdist, linux, linux-arm, macos, macos-arm, windows] runs-on: ubuntu-latest if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v') steps: - - uses: actions/setup-python@v5 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 with: pattern: cibw-* path: dist merge-multiple: true - - uses: pypa/gh-action-pypi-publish@release/v1 + - uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0 with: user: __token__ password: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.gitignore b/.gitignore index 53ca1bc274..827d8df759 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ dist* mastercopy *.pyc !*.yml -.vscode +.idea/ +.venv/ +.vscode/ -src/apps/ocioview/poetry.lock +src/apps/ocioview/uv.lock diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ad6d3c8a7..ccf2dfbba1 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,7 +29,7 @@ endif() # Project definition. project(OpenColorIO - VERSION 2.5.0 + VERSION 2.6.0 DESCRIPTION "OpenColorIO (OCIO) is a complete color management solution" HOMEPAGE_URL https://github.com/AcademySoftwareFoundation/OpenColorIO LANGUAGES CXX C) @@ -287,6 +287,19 @@ message(STATUS "") message(STATUS "Checking for GPU configuration...") include(CheckSupportGL) +# DirectX 12 is only available on Windows. +if(WIN32) + option(OCIO_DIRECTX_ENABLED "Enable DirectX 12 GPU rendering support" ON) +else() + set(OCIO_DIRECTX_ENABLED OFF CACHE BOOL "Enable DirectX 12 GPU rendering support" FORCE) +endif() +mark_as_advanced(OCIO_DIRECTX_ENABLED) + +# Vulkan is cross-platform but requires an external SDK, so it is off by +# default; enable explicitly with -DOCIO_VULKAN_ENABLED=ON. +option(OCIO_VULKAN_ENABLED "Enable Vulkan GPU rendering support" OFF) +mark_as_advanced(OCIO_VULKAN_ENABLED) + ############################################################################### # Check for ARM neon here because we need to know if ARM NEON is supported @@ -349,6 +362,11 @@ endif() include(CompilerFlags) +############################################################################### +# Include utility functions for setting debugging environments + +include(DebuggerEnvironment) + ############################################################################### # External linking options @@ -396,9 +414,7 @@ if(NOT DEFINED OCIO_NAMESPACE) elseif(OCIO_NAMESPACE STREQUAL "") message(FATAL_ERROR "A namespace cannot be empty.") else() - set(OCIO_NAMESPACE "OpenColorIO_${OCIO_NAMESPACE}_v${OpenColorIO_VERSION_MAJOR}_${OpenColorIO_VERSION_MINOR}${OpenColorIO_VERSION_RELEASE_TYPE}" CACHE STRING - "Specify the main OCIO C++ namespace: Options include OpenColorIO OpenColorIO_ etc.") - message(STATUS "Setting namespace to '${OCIO_NAMESPACE}' as none was specified.") + message(STATUS "Setting namespace to '${OCIO_NAMESPACE}'.") endif() diff --git a/SECURITY.md b/SECURITY.md index 19555844b9..a3f8990a47 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -14,23 +14,15 @@ would be naive to say our code is immune to every exploit. ## Reporting Vulnerabilities -Quickly resolving security related issues is a priority. If you think -you've found a potential vulnerability in OpenColorIO, please report it by -emailing security@opencolorio.org. Only TSC members and ASWF project -management have access to these messages. +Quickly resolving security related issues is a priority. The best way to report a +vulnerability is to file a GitHub security advisory. If that is not possible, it +is also fine to email your report to security@opencolorio.org. Only the project +administrators have access to these reports. Include detailed steps to reproduce the issue, and any other information that could aid an investigation. Someone will assess the report and make every effort to respond within 14 days. -## Outstanding Security Issues - -None - -## Addressed Security Issues - -None - ## File Format Expectations Attempting to read an OCIO config (YAML) file will: @@ -65,5 +57,6 @@ It is a bug if calling a function with well-formed arguments causes the library to crash. It is a security issue if calling a function with well-formed arguments causes arbitrary code execution. -We do not consider this as severe as file format issues because in most -deployments the parameter space is not exposed to potential attackers. +## History of CVE Fixes + +CVE-2026-42450 -- Stack buffer overflow in sscanf. (Fixed in OCIO 2.5.2) diff --git a/docs/api/grading_transforms.rst b/docs/api/grading_transforms.rst index 83fafe2d24..f2d8d7fbf5 100644 --- a/docs/api/grading_transforms.rst +++ b/docs/api/grading_transforms.rst @@ -118,6 +118,53 @@ GradingRGBCurve .. doxygentypedef:: ${OCIO_NAMESPACE}::ConstGradingRGBCurveRcPtr .. doxygentypedef:: ${OCIO_NAMESPACE}::GradingRGBCurveRcPtr +GradingHueCurveTransform +************************ + +.. tabs:: + + .. group-tab:: Python + + .. autoclass:: PyOpenColorIO.GradingHueCurveTransform + :members: + :undoc-members: + :special-members: __init__, __str__ + :inherited-members: + + .. group-tab:: C++ + + .. doxygenclass:: ${OCIO_NAMESPACE}::GradingHueCurveTransform + :members: + :undoc-members: + + .. doxygenfunction:: ${OCIO_NAMESPACE}::operator<<(std::ostream&, const GradingHueCurveTransform&) noexcept + + .. doxygentypedef:: ${OCIO_NAMESPACE}::ConstGradingHueCurveTransformRcPtr + .. doxygentypedef:: ${OCIO_NAMESPACE}::GradingHueCurveTransformRcPtr + +GradingHueCurve +^^^^^^^^^^^^^^^ + +.. tabs:: + + .. group-tab:: Python + + .. autoclass:: PyOpenColorIO.GradingHueCurve + :members: + :undoc-members: + :special-members: __init__, __str__ + + .. group-tab:: C++ + + .. doxygenclass:: ${OCIO_NAMESPACE}::GradingHueCurve + :members: + :undoc-members: + + .. doxygenfunction:: ${OCIO_NAMESPACE}::operator<<(std::ostream&, const GradingHueCurve&) + + .. doxygentypedef:: ${OCIO_NAMESPACE}::ConstGradingHueCurveRcPtr + .. doxygentypedef:: ${OCIO_NAMESPACE}::GradingHueCurveRcPtr + GradingControlPoint ^^^^^^^^^^^^^^^^^^^ diff --git a/docs/index.rst b/docs/index.rst index f87ffb2d79..07749aa274 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -36,19 +36,52 @@ best leverage them. We have an OCIO User Experience (UX) working group that is gradually working on more coverage. The documentation is a work-in-progress and we would love to have your help to -improve it! An easy way to get involved is to join the #docs or #ux channel on +improve it! An easy way to get involved is to join the #opencolorio channel on :ref:`slack`. +Roadmap +======= + +The project attempts to maintain a roadmap to give the community insight into +upcoming development. The items are grouped into "Now", "Next", and "Later" categories. +"Now" indicates work that is currently in-progress. "Next" indicates work that is being +planned for imminent development (meaning now would be a good time to provide your input). +The roadmap is available `here. `_ + + Community ========= +.. _meetings: + +Meetings +******** + +The OpenColorIO project has a Technical Steering Committee meeting on Zoom every two weeks +at noon LA time. The Zoom link is available from the `OCIO Calendar. `_ + +There is a general working group and "office hours" meeting once a month in the same +time slot. The Zoom link is available from the `OCIO Calendar. `_ + +These meetings are open to anyone! + + +.. _slack: + +Slack +***** + +Join us on the `ASWF Slack `_ in the channels +`#opencolorio` and `#opencolor-configs`. + + .. _mailing_lists: Mailing Lists ************* -There are two mailing lists associated with OpenColorIO: +Most of the conversation happens on Slack, but there are two mailing lists associated with OpenColorIO: `ocio-user `__\ ``@lists.aswf.io`` For end users (artists, often) interested in OCIO profile design, @@ -57,14 +90,40 @@ There are two mailing lists associated with OpenColorIO: `ocio-dev `__\ ``@lists.aswf.io`` For developers interested OCIO APIs, code integration, compilation, etc. -.. _slack: -Slack -***** +Related Projects +================ + +.. _cif: + +ASWF Color Interop Forum +************************ + +The CIF is an open, cross-project forum for discussing color interoperability across varying workflows +and standards. The aim isn’t necessarily to develop new standards, but rather to make recommendations +for how to improve color accuracy through the existing infrastructure. + +Recommendations are published on the `ColorInterop GitHub. `_ + +The forum has a monthly Zoom meeting on Mondays at noon LA time, as posted on the +`OCIO Calendar. `_ + +Discussion happens in the `#color-interop-forum` channel on the ASWF Slack. + + +.. _nano: + +NanoColor +********* + +NanoColor is a collaboration between OpenUSD, MaterialX, and OpenColorIO to ensure that there +is interoperable and flexible color management among those projects and related projects in +the computer graphics world. -There is an OpenColorIO Slack workspace at: ``_. +The working group has a Zoom meeting every two weeks on Mondays at 1:00 pm LA time, as posted on the +`OCIO Calendar. `_ -New users may join the workspace from `here `_. +Discussion happens in the `#nanocolor` channel on the ASWF Slack. Search diff --git a/docs/quick_start/installation.rst b/docs/quick_start/installation.rst index d8d208e05c..71292348c2 100644 --- a/docs/quick_start/installation.rst +++ b/docs/quick_start/installation.rst @@ -142,8 +142,8 @@ Optional OCIO functionality also depends on: - Doxygen (for the docs) - NumPy (optionally used in the Python test suite) - \*pybind11 >= 2.9.2 (for the Python binding) -- Python >= 3.9 (for the Python binding only) -- Python 3.9+ (for building the documentation) +- Python >= 3.10 (for the Python binding only) +- Python 3.10+ (for building the documentation) Building the documentation requires the following packages, available via PyPI: @@ -287,6 +287,8 @@ Here are the most common OCIO-specific CMake options (the default values are sho - ``-DOCIO_BUILD_TESTS=ON`` (Set to OFF to not build the unit tests) - ``-DOCIO_BUILD_GPU_TESTS=ON`` (Set to OFF to not build the GPU unit tests) - ``-DOCIO_USE_HEADLESS=OFF`` (Set to ON to do headless GPU rendering) +- ``-DOCIO_DIRECTX_ENABLED=ON`` (Windows only; set to OFF to disable the DirectX 12 GPU rendering backend used by ``test_dx``. Forced OFF on non-Windows platforms.) +- ``-DOCIO_VULKAN_ENABLED=OFF`` (Set to ON to enable the Vulkan GPU rendering backend used by ``test_vulkan``. Requires the Vulkan SDK to be installed and findable by CMake.) - ``-DOCIO_WARNING_AS_ERROR=ON`` (Set to OFF to turn off warnings as errors) - ``-DOCIO_BUILD_DOCS=OFF`` (Set to ON to build the documentation) diff --git a/docs/releases/ocio_2_5.rst b/docs/releases/ocio_2_5.rst index 593076e3af..5cc1be20d4 100644 --- a/docs/releases/ocio_2_5.rst +++ b/docs/releases/ocio_2_5.rst @@ -39,6 +39,15 @@ For Developers * Please see the section below about version updates to required third-party dependencies. +Library Version ++++++++++++++++ + +* The 2.5.1 release is not ABI compatible with 2.5.0 for clients that use the GPU renderer + API due to a change made to correct an issue with the Vulkan support introduced in 2.5.0. + Because the SOVERSION of both libraries remains "2.5", applications using the GPU API that + were compiled with the 2.5.0 release must be recompiled to use the 2.5.1 library. Any + further releases in the 2.5.x series will be ABI-compatible with 2.5.1. + New Feature Guide ================= diff --git a/docs/requirements.txt b/docs/requirements.txt index 334e782153..c212eeb4c4 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,7 +1,4 @@ -# Fix an issue with the OCIO's Linux container images that have OpenSSL under 1.1.1. -# If the container images are updated with OpenSSL 1.1.1+, the restriction on -# urllib3 version <2 can be removed. -urllib3<2 +urllib3<3 # The builds for documentation fails with <0.18.0 docutils>=0.18.1 sphinx<=7.1.2 @@ -11,4 +8,4 @@ recommonmark sphinx-press-theme sphinx-tabs breathe -setuptools<68.0.0 +setuptools<83.0.0 diff --git a/docs/site/homepage/config.toml b/docs/site/homepage/config.toml index 8b072d2a2d..a7e4dfc865 100644 --- a/docs/site/homepage/config.toml +++ b/docs/site/homepage/config.toml @@ -105,14 +105,6 @@ post_share = true enable = false preloader = "images/opencolorio-color.png" -# google map -[params.map] -enable = false -gmap_api = "https://maps.googleapis.com/maps/api/js?key=AIzaSyBu5nZKbeK-WHQ70oqOWo-_4VmwOwKP9YQ" -map_latitude = "51.5223477" -map_longitude = "-0.1622023" -map_marker = "images/marker.png" - ############################# ASWF LINKS ########################## [[params.aswf]] @@ -143,7 +135,7 @@ languageCode = "en-us" contentDir = "content/english" weight = 1 home = "Home" -copyright = "copyright © 2020 OpenColorIO Contributors" +copyright = "Copyright © OpenColorIO a Series of LF Projects, LLC. For web site terms of use, trademark policy and other project policies please see https://lfprojects.org/." ################################ France Language ######################## [Languages.fr] @@ -152,4 +144,4 @@ languageCode = "fr-fr" contentDir = "content/french" weight = 2 home = "Accueil" -copyright = "copyright © 2020 [gethugothemes](https://gethugothemes.com) tous droits réservés" +copyright = "Copyright © OpenColorIO, a Series of LF Projects, LLC. Pour les conditions d'utilisation du site Web, la politique sur les marques et autres politiques de projet, voir https://lfprojects.org/." diff --git a/docs/site/homepage/data/en/contact.yml b/docs/site/homepage/data/en/contact.yml index 624ddcf0e3..f0b6e8b9e8 100644 --- a/docs/site/homepage/data/en/contact.yml +++ b/docs/site/homepage/data/en/contact.yml @@ -9,8 +9,8 @@ contact: contact_list: - icon : ti-comment # themify icon pack : https://themify.me/themify-icons name: "Slack:" - info : "OpenColorIO" - link: "http://slack.opencolorio.org" + info : "#OpenColorIO" + link: "https://academysoftwarefdn.slack.com" - icon : ti-email # themify icon pack : https://themify.me/themify-icons name: "OCIO-User:" diff --git a/docs/site/homepage/data/en/news.yml b/docs/site/homepage/data/en/news.yml index 71a4626961..fe04515deb 100644 --- a/docs/site/homepage/data/en/news.yml +++ b/docs/site/homepage/data/en/news.yml @@ -2,26 +2,26 @@ news: enable : true image : images/disney_insideout.jpeg - title : OCIO v2 is here! + title : OCIO v2.5.0 is here! content : "Check out our [guides](https://opencolorio.readthedocs.io/en/latest/releases/_index.html#releases) for upgrading. Here are just a few highlights of new features:" caption: "Image courtesy of Disney (c)" feature_item : # feature item loop - - title : New GPU Renderer - icon : ti-world # themify icon pack : https://themify.me/themify-icons - content : The GPU renderer now matches the CPU and may be used to render final frames! + - title : Config Merging + icon : ti-files # themify icon pack : https://themify.me/themify-icons + content : This much-anticipated feature is now in Preview. Please provide feedback on use cases and workflows. Merging enables user and application control over things like name and alias conflicts, color space duplication, and much more. # feature item loop - - title : Better User Experience - icon : ti-brush # themify icon pack : https://themify.me/themify-icons - content : Config authors have new tools to organize color spaces by category, hide color spaces, and define hierarchical menus. New File and Viewing Rules allow more powerful default behaviors. + - title : Vulkan GPU Support + icon : ti-image # themify icon pack : https://themify.me/themify-icons + content : Support has been added for the Khronos Vulkan graphics API standard. The OCIO GPU renderer may now be used within applications that use Vulkan to get the most out of the latest GPUs. # feature item loop - - title : Improved ACES Support - icon : ti-stats-up # themify icon pack : https://themify.me/themify-icons - content : ACES Output Transforms no longer use 3d-LUTs and are accurate even for extreme exposure values. There is also full read and write support for the Academy/ASC Common LUT Format (CLF). + - title : Full ACES 2.0 Support + icon : ti-brush # themify icon pack : https://themify.me/themify-icons + content : With the inclusion of ACES 2.0 Built-In configs, our ACES 2.0 support is now feature complete. This allows use of the ACES 2.0 Output Transforms as OCIO views. # feature item loop - - title : Analysis Tools + - title : New Color Space Attributes icon : ti-panel # themify icon pack : https://themify.me/themify-icons - content : There are new command line tools for evaluating LUTs, converting to CLF, serializing OCIO Processors, and more! \ No newline at end of file + content : OCIO now supports the Color Interop ID developed by the Color Interop Forum, as well as attributes for ICC and AMF. Please see the latest config release for example usage. \ No newline at end of file diff --git a/ext/sampleicc/src/include/iccProfileReader.h b/ext/sampleicc/src/include/iccProfileReader.h index 8b28753c54..9abce18b33 100644 --- a/ext/sampleicc/src/include/iccProfileReader.h +++ b/ext/sampleicc/src/include/iccProfileReader.h @@ -586,6 +586,10 @@ namespace SampleICC if (!Read32(istream, &sizeData, 1)) return false; + // ICC curve entries are indexed by 16-bit values; 65536 is the maximum. + if (sizeData > 65536) + return false; + mCurve.resize(sizeData); if (sizeData) diff --git a/include/OpenColorIO/OpenColorIO.h b/include/OpenColorIO/OpenColorIO.h index c02a6c8344..ad294fc805 100644 --- a/include/OpenColorIO/OpenColorIO.h +++ b/include/OpenColorIO/OpenColorIO.h @@ -3503,8 +3503,9 @@ class OCIOEXPORT GpuShaderCreator * The 'values' parameter contains the LUT data which must be used as-is as the dimensions and * origin are hard-coded in the fragment shader program. So, it means one GPU texture per entry. * - * \return Index of the texture. For shading languages using explicit texture bindings, the return - * value is the same as the texture binding index in the generated shader program. + * \return Shader binding index of the texture. For shading languages using explicit texture bindings, + * the return value is the same as the texture binding index in the generated shader program. + * The setDescriptorSetIndex function may be used to offset the starting index value. **/ virtual unsigned addTexture(const char * textureName, const char * samplerName, @@ -3522,8 +3523,9 @@ class OCIOEXPORT GpuShaderCreator * and origin are hard-coded in the fragment shader program. So, it means one GPU 3D texture * per entry. * - * \return Index of the texture. For shading languages using explicit texture bindings, the return - * value is the same as the texture binding index in the generated shader program. + * \return Shader binding index of the texture. For shading languages using explicit texture bindings, + * the return value is the same as the texture binding index in the generated shader program. + * The setDescriptorSetIndex function may be used to offset the starting index value. **/ virtual unsigned add3DTexture(const char * textureName, const char * samplerName, @@ -3775,7 +3777,12 @@ class OCIOEXPORT GpuShaderDesc : public GpuShaderCreator **/ virtual std::size_t getUniformBufferSize() const noexcept = 0; - // 1D lut related methods + /** + * The getTexture methods are used to access Lut1D arrays to upload to the GPU as textures. + * Please note that the index used here is based on the total number of Lut1Ds used by + * the Processor and is different from the texture shader binding index, which may be + * obtained using the corresponding function. + */ virtual unsigned getNumTextures() const noexcept = 0; virtual void getTexture(unsigned index, const char *& textureName, @@ -3786,8 +3793,15 @@ class OCIOEXPORT GpuShaderDesc : public GpuShaderCreator TextureDimensions & dimensions, Interpolation & interpolation) const = 0; virtual void getTextureValues(unsigned index, const float *& values) const = 0; + /// Get the index used to declare the texture in the shader for languages such as Vulkan. + virtual unsigned getTextureShaderBindingIndex(unsigned index) const = 0; - // 3D lut related methods + /** + * The get3DTexture methods are used to access Lut3D arrays to upload to the GPU as textures. + * Please note that the index used here is based on the total number of Lut3Ds used by + * the Processor and is different from the texture shader binding index, which may be + * obtained using the corresponding function. + */ virtual unsigned getNum3DTextures() const noexcept = 0; virtual void get3DTexture(unsigned index, const char *& textureName, @@ -3795,6 +3809,8 @@ class OCIOEXPORT GpuShaderDesc : public GpuShaderCreator unsigned & edgelen, Interpolation & interpolation) const = 0; virtual void get3DTextureValues(unsigned index, const float *& values) const = 0; + /// Get the index used to declare the texture in the shader for languages such as Vulkan. + virtual unsigned get3DTextureShaderBindingIndex(unsigned index) const = 0; /// Get the complete OCIO shader program. const char * getShaderText() const noexcept; diff --git a/include/OpenColorIO/OpenColorTransforms.h b/include/OpenColorIO/OpenColorTransforms.h index 8ef04be8c8..94dc58d0d6 100644 --- a/include/OpenColorIO/OpenColorTransforms.h +++ b/include/OpenColorIO/OpenColorTransforms.h @@ -1367,10 +1367,10 @@ class OCIOEXPORT GradingHueCurveTransform : public Transform virtual HSYTransformStyle getRGBToHSY() const = 0; virtual void setRGBToHSY(HSYTransformStyle style) = 0; - ///** - // * Parameters can be made dynamic so the values can be changed through the CPU or GPU processor, - // * but if there are several GradingHueCurveTransform only one can have dynamic parameters. - // */ + /** + * Parameters can be made dynamic so the values can be changed through the CPU or GPU processor, + * but if there are several GradingHueCurveTransform only one can have dynamic parameters. + */ virtual bool isDynamic() const noexcept = 0; virtual void makeDynamic() noexcept = 0; virtual void makeNonDynamic() noexcept = 0; diff --git a/include/OpenColorIO/OpenColorTypes.h b/include/OpenColorIO/OpenColorTypes.h index 8fa5833749..39a181c467 100644 --- a/include/OpenColorIO/OpenColorTypes.h +++ b/include/OpenColorIO/OpenColorTypes.h @@ -977,6 +977,13 @@ extern OCIOEXPORT const char * METADATA_NAME; */ extern OCIOEXPORT const char * METADATA_ID; +/** + * An ID when stored as an XML element rather than as an attribute. This is the + * preferred mechanism in the SMPTE ST 2036-1 version of the CLF format. If + * present, it is only available from the top-level FormatMetadata. + */ + extern OCIOEXPORT const char * METADATA_ID_ELEMENT; + /*!rst:: Caches ****** diff --git a/pyproject.toml b/pyproject.toml index 23631c12bc..7c49ae11a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,12 @@ [build-system] requires = [ - "setuptools>=42", + "setuptools>=82.0.1", "wheel", "cmake>=3.14", "ninja; sys_platform != 'win32' and platform_machine != 'arm64'", # Documentation requirements (see docs/requirements.txt for details) - "urllib3<2", - "docutils>=0.18.1", + "urllib3<3", + "docutils>=0.22.4", "sphinx<=7.1.2", "six", "testresources", diff --git a/setup.cfg b/setup.cfg index aa1015183a..a34fc55490 100644 --- a/setup.cfg +++ b/setup.cfg @@ -7,7 +7,6 @@ classifiers = Topic :: Software Development :: Libraries :: Python Modules Programming Language :: C++ Programming Language :: Python :: 3 - Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.11 Programming Language :: Python :: 3.12 @@ -21,7 +20,7 @@ license_files = LICENSE long_description = file: README.md, LICENSE long_description_content_type = text/markdown name = opencolorio -python_requires = '>=3.9' +python_requires = '>=3.10' url = https://opencolorio.org/ [options] diff --git a/share/abi/ocio.abignore b/share/abi/ocio.abignore new file mode 100644 index 0000000000..f09c133e74 --- /dev/null +++ b/share/abi/ocio.abignore @@ -0,0 +1,38 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# libabigail suppression specification for the OpenColorIO ABI compatibility +# check (see .github/workflows/abi_compatibility.yml). +# +# Reference: +# https://sourceware.org/libabigail/manual/libabigail-concepts.html#suppression-specifications +# +# The ABI check is run with `--headers-dir`, so abidiff already restricts the +# comparison to the types that are reachable from the installed public headers +# (include/OpenColorIO/*.h). Internal symbols and statically linked third-party +# dependencies (expat, yaml-cpp, pystring, Imath, minizip-ng, zlib, ...) are +# therefore ignored automatically and do NOT need entries here. +# +# Add a suppression below ONLY to allow-list an *intentional* ABI change that +# you have verified is safe for consumers in the current major.minor series +# (this should be very rare in a patch release). Every entry must: +# * carry a comment justifying why the change is ABI-safe, and +# * reference the PR / issue that introduced it. +# Entries become obsolete once the next minor/major release re-baselines the +# ABI, so prune them at that point. +# +# ---------------------------------------------------------------------------- +# Example (kept commented out on purpose): +# +# Allow a new data member appended at the end of an opaque/impl-detail struct, +# which does not change the layout seen by existing consumers: +# +# [suppress_type] +# name = OpenColorIO_v2_6::SomeType::Impl +# has_data_member_inserted_at = end +# +# Allow a newly added member function (additions are backward compatible): +# +# [suppress_function] +# name_regexp = ^OpenColorIO_v2_6::.*::newlyAddedMethod +# ---------------------------------------------------------------------------- diff --git a/share/ci/scripts/windows/install_doxygen.sh b/share/ci/scripts/windows/install_doxygen.sh index a08783f765..7b4341d5f5 100755 --- a/share/ci/scripts/windows/install_doxygen.sh +++ b/share/ci/scripts/windows/install_doxygen.sh @@ -10,7 +10,7 @@ DOXYGEN_LOCATION="$1" choco install jq # Get the URL of the latest zip package for Doxygen. -url=$(curl -s 'https://api.github.com/repos/doxygen/doxygen/releases/latest' | jq -r '.assets[] | select(.name | test("doxygen-.*windows.x64.bin.zip")) | .browser_download_url') +url=$(curl -s 'https://api.github.com/repos/doxygen/doxygen/releases/latest' | jq -r '.assets[] | select(.name | test("doxygen-.*\\.x64\\.bin\\.zip")) | .browser_download_url') # Download the zip. mkdir $DOXYGEN_LOCATION diff --git a/share/cmake/modules/FindDirectX-Headers.cmake b/share/cmake/modules/FindDirectX-Headers.cmake new file mode 100644 index 0000000000..99f2788d4e --- /dev/null +++ b/share/cmake/modules/FindDirectX-Headers.cmake @@ -0,0 +1,76 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Locate DirectX-Headers (header-only, Windows only) +# +# Variables defined by this module: +# DirectX-Headers_FOUND - Indicate whether the package was found or not +# DirectX-Headers_INCLUDE_DIR - Location of the header files +# DirectX-Headers_VERSION - Package version +# +# Global targets defined by this module: +# Microsoft::DirectX-Headers +# +# DirectX-Headers can be supplied by the caller through any of the standard +# CMake mechanisms: +# -- Set -DDirectX-Headers_DIR to the directory containing directx-headers-config.cmake +# -- Set -DDirectX-Headers_ROOT to the install prefix (with include/directx/ underneath) +# -- Set -DDirectX-Headers_INCLUDE_DIR to the directory containing directx/d3d12.h +# +# When OCIO_INSTALL_EXT_PACKAGES is not ALL, this module first tries to locate +# an existing install via the upstream CMake config, then falls back to a +# manual header search. If still not found and OCIO_INSTALL_EXT_PACKAGES is +# MISSING (the default), OCIO's ocio_install_dependency() pathway will invoke +# InstallDirectX-Headers.cmake to build it via FetchContent. +# + +if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) + # Prefer the upstream CMake config (installed as lower-case). + find_package(directx-headers ${DirectX-Headers_FIND_VERSION} CONFIG QUIET) + + if(directx-headers_FOUND) + set(DirectX-Headers_FOUND TRUE) + if(directx-headers_VERSION) + set(DirectX-Headers_VERSION ${directx-headers_VERSION}) + endif() + else() + # Fall back to locating the public header directly (e.g. when the + # headers were installed without the CMake config, or are provided + # by a vendored copy). + find_path(DirectX-Headers_INCLUDE_DIR + NAMES + directx/d3d12.h + HINTS + ${DirectX-Headers_ROOT} + PATH_SUFFIXES + include + ) + endif() + + # If OCIO can install the package itself, demote REQUIRED so a missing + # dependency here does not abort configuration before the install step. + if(OCIO_INSTALL_EXT_PACKAGES STREQUAL MISSING) + set(DirectX-Headers_FIND_REQUIRED FALSE) + endif() + + include(FindPackageHandleStandardArgs) + find_package_handle_standard_args(DirectX-Headers + REQUIRED_VARS + DirectX-Headers_INCLUDE_DIR + VERSION_VAR + DirectX-Headers_VERSION + ) +endif() + +############################################################################### +### Create target (only needed for the manual-header-search fallback; the +### upstream CMake config already defines Microsoft::DirectX-Headers). + +if(DirectX-Headers_FOUND AND NOT TARGET Microsoft::DirectX-Headers AND DirectX-Headers_INCLUDE_DIR) + add_library(Microsoft::DirectX-Headers INTERFACE IMPORTED GLOBAL) + set_target_properties(Microsoft::DirectX-Headers PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${DirectX-Headers_INCLUDE_DIR}" + ) + + mark_as_advanced(DirectX-Headers_INCLUDE_DIR DirectX-Headers_VERSION) +endif() diff --git a/share/cmake/modules/FindImath.cmake b/share/cmake/modules/FindImath.cmake index 6126b934f7..fc2086aad1 100644 --- a/share/cmake/modules/FindImath.cmake +++ b/share/cmake/modules/FindImath.cmake @@ -40,10 +40,8 @@ if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) set(_Imath_REQUIRED_VARS Imath_LIBRARY) set(_Imath_LIB_VER "${Imath_FIND_VERSION_MAJOR}_${Imath_FIND_VERSION_MINOR}") - if(NOT DEFINED Imath_ROOT) - # Search for ImathConfig.cmake - find_package(Imath ${Imath_FIND_VERSION} CONFIG QUIET) - endif() + # Search for ImathConfig.cmake + find_package(Imath ${Imath_FIND_VERSION} CONFIG QUIET) if(Imath_FOUND) get_target_property(Imath_LIBRARY Imath::Imath LOCATION) diff --git a/share/cmake/modules/FindOSL.cmake b/share/cmake/modules/FindOSL.cmake index 5cefe410bc..54dc17fb73 100644 --- a/share/cmake/modules/FindOSL.cmake +++ b/share/cmake/modules/FindOSL.cmake @@ -29,22 +29,22 @@ ############################################################################### ### Try to find package ### -if(NOT DEFINED OSL_ROOT) - find_package(OSL ${OSL_FIND_VERSION} CONFIG QUIET) - - set(OSL_SHADERS_INCLUDE_DIR ${OSL_INCLUDE_DIR}/../share) - # Variable used by the OSL unit tests. - set(OSL_SHADERS_DIR ${OSL_SHADERS_INCLUDE_DIR}/OSL/shaders) - - include (FindPackageHandleStandardArgs) - find_package_handle_standard_args (OSL - REQUIRED_VARS - OSL_INCLUDE_DIR - OSL_LIB_DIR - VERSION_VAR - OSL_VERSION - ) -else() +find_package(OSL ${OSL_FIND_VERSION} CONFIG QUIET) + +set(OSL_SHADERS_INCLUDE_DIR ${OSL_INCLUDE_DIR}/../share) +# Variable used by the OSL unit tests. +set(OSL_SHADERS_DIR ${OSL_SHADERS_INCLUDE_DIR}/OSL/shaders) + +include (FindPackageHandleStandardArgs) +find_package_handle_standard_args (OSL + REQUIRED_VARS + OSL_INCLUDE_DIR + OSL_LIB_DIR + VERSION_VAR + OSL_VERSION +) + +if(NOT OSL_FOUND) set(OSL_INCLUDE_DIR ${OSL_ROOT}/include) set(OSL_VERSION_HEADER "${OSL_INCLUDE_DIR}/OSL/oslversion.h") diff --git a/share/cmake/modules/Findexpat.cmake b/share/cmake/modules/Findexpat.cmake index 1e715bb0cf..73eed21fb9 100644 --- a/share/cmake/modules/Findexpat.cmake +++ b/share/cmake/modules/Findexpat.cmake @@ -39,10 +39,8 @@ endif() if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) set(_expat_REQUIRED_VARS expat_LIBRARY) - if(NOT DEFINED expat_ROOT) - # Search for expat-config.cmake - find_package(expat ${expat_FIND_VERSION} CONFIG QUIET) - endif() + # Search for expat-config.cmake + find_package(expat ${expat_FIND_VERSION} CONFIG QUIET) if(expat_FOUND) if (TARGET expat::libexpat) diff --git a/share/cmake/modules/Findminizip-ng.cmake b/share/cmake/modules/Findminizip-ng.cmake index 3609b0ef84..bf194c073d 100644 --- a/share/cmake/modules/Findminizip-ng.cmake +++ b/share/cmake/modules/Findminizip-ng.cmake @@ -45,10 +45,8 @@ if(CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]") endif() if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) - if(NOT DEFINED minizip-ng_ROOT) - # Search for minizip-ng-config.cmake - find_package(minizip-ng ${minizip-ng_FIND_VERSION} CONFIG QUIET) - endif() + # Search for minizip-ng-config.cmake + find_package(minizip-ng ${minizip-ng_FIND_VERSION} CONFIG QUIET) if (minizip-ng_FOUND) get_target_property(minizip-ng_INCLUDE_DIR MINIZIP::minizip-ng INTERFACE_INCLUDE_DIRECTORIES) diff --git a/share/cmake/modules/Findpybind11.cmake b/share/cmake/modules/Findpybind11.cmake index ccbb53e656..89d8cf8ab0 100644 --- a/share/cmake/modules/Findpybind11.cmake +++ b/share/cmake/modules/Findpybind11.cmake @@ -24,10 +24,8 @@ ### Try to find package ### if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) - if(NOT DEFINED pybind11_ROOT) - # Search for pybind11Config.cmake - find_package(pybind11 ${pybind11_FIND_VERSION} CONFIG QUIET) - endif() + # Search for pybind11Config.cmake + find_package(pybind11 ${pybind11_FIND_VERSION} CONFIG QUIET) if(NOT pybind11_FOUND) # Find include directory @@ -142,5 +140,14 @@ if(_pybind11_TARGET_CREATE) INTERFACE_INCLUDE_DIRECTORIES ${pybind11_INCLUDE_DIR} ) + # /bigobj is needed for bigger binding projects due to the limit to 64k + # addressable sections (see pybind11Common.cmake). + if (MSVC) + set_target_properties(pybind11::module PROPERTIES + INTERFACE_COMPILE_OPTIONS /bigobj + ) + + endif() + mark_as_advanced(pybind11_INCLUDE_DIR pybind11_VERSION) endif() diff --git a/share/cmake/modules/Findyaml-cpp.cmake b/share/cmake/modules/Findyaml-cpp.cmake index d10bdb4f5e..95275bcea8 100644 --- a/share/cmake/modules/Findyaml-cpp.cmake +++ b/share/cmake/modules/Findyaml-cpp.cmake @@ -44,9 +44,7 @@ if(NOT OCIO_INSTALL_EXT_PACKAGES STREQUAL ALL) set(_yaml-cpp_REQUIRED_VARS yaml-cpp_LIBRARY) # Search for yaml-cpp-config.cmake - if(NOT DEFINED yaml-cpp_ROOT) - find_package(yaml-cpp ${yaml-cpp_FIND_VERSION} CONFIG ${quiet}) - endif() + find_package(yaml-cpp ${yaml-cpp_FIND_VERSION} CONFIG ${quiet}) if(yaml-cpp_FOUND) # Alias target for yaml-cpp < 0.8 compatibility diff --git a/share/cmake/modules/install/InstallDirectX-Headers.cmake b/share/cmake/modules/install/InstallDirectX-Headers.cmake new file mode 100644 index 0000000000..69132f412e --- /dev/null +++ b/share/cmake/modules/install/InstallDirectX-Headers.cmake @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Install DirectX-Headers (header-only, Windows only) +# https://github.com/microsoft/DirectX-Headers +# +############################################################################### + +include(FetchContent) + +if(OCIO_DirectX-Headers_RECOMMENDED_VERSION) + set(DirectX-Headers_VERSION ${OCIO_DirectX-Headers_RECOMMENDED_VERSION}) +else() + set(DirectX-Headers_VERSION ${DirectX-Headers_FIND_VERSION}) +endif() + +set(FETCHCONTENT_BASE_DIR "${CMAKE_BINARY_DIR}/ext/build/DirectX-Headers") +set(DIRECTX_HEADERS_BUILD_TEST OFF CACHE BOOL "" FORCE) + +FetchContent_Declare(DirectX-Headers + GIT_REPOSITORY https://github.com/microsoft/DirectX-Headers.git + GIT_TAG v${DirectX-Headers_VERSION} +) + +FetchContent_MakeAvailable(DirectX-Headers) + +# Signal success to ocio_install_dependency so ocio_handle_dependency does not +# abort at the next required-check. FetchContent_MakeAvailable has just created +# the Microsoft::DirectX-Headers target via the upstream CMakeLists. +if(TARGET Microsoft::DirectX-Headers) + set(DirectX-Headers_FOUND TRUE) +endif() diff --git a/share/cmake/modules/install/InstallZLIB.cmake b/share/cmake/modules/install/InstallZLIB.cmake index 6cfca2800e..96f09bb09f 100644 --- a/share/cmake/modules/install/InstallZLIB.cmake +++ b/share/cmake/modules/install/InstallZLIB.cmake @@ -53,8 +53,8 @@ if(NOT ZLIB_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAGE set(ZLIB_INCLUDE_DIRS "${_EXT_DIST_ROOT}/${CMAKE_INSTALL_INCLUDEDIR}") - # Windows need the "d" suffix at the end. - if(WIN32 AND BUILD_TYPE_DEBUG) + # Windows need the "d" suffix at the end (only for MSVC). + if(MSVC AND BUILD_TYPE_DEBUG) set(_ZLIB_LIB_SUFFIX "d") endif() diff --git a/share/cmake/modules/install/Installexpat.cmake b/share/cmake/modules/install/Installexpat.cmake index cda465312e..ee750a1f41 100644 --- a/share/cmake/modules/install/Installexpat.cmake +++ b/share/cmake/modules/install/Installexpat.cmake @@ -46,9 +46,11 @@ if(NOT expat_FOUND AND OCIO_INSTALL_EXT_PACKAGES AND NOT OCIO_INSTALL_EXT_PACKAG if(BUILD_TYPE_DEBUG) set(_expat_LIB_SUFFIX "d") endif() - # Static Linking, Multi-threaded Dll naming (>=2.2.8): - # https://github.com/libexpat/libexpat/blob/R_2_2_8/expat/win32/README.txt - set(_expat_LIB_SUFFIX "${_expat_LIB_SUFFIX}MD") + if (MSVC) + # Static Linking, Multi-threaded Dll naming (>=2.2.8): + # https://github.com/libexpat/libexpat/blob/R_2_2_8/expat/win32/README.txt + set(_expat_LIB_SUFFIX "${_expat_LIB_SUFFIX}MD") + endif() endif() # Expat use a hardcoded lib prefix instead of CMAKE_STATIC_LIBRARY_PREFIX diff --git a/share/cmake/utils/DebuggerEnvironment.cmake b/share/cmake/utils/DebuggerEnvironment.cmake new file mode 100644 index 0000000000..2b47980976 --- /dev/null +++ b/share/cmake/utils/DebuggerEnvironment.cmake @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. + + +############################################################################### +# Define a function to set debugger environment so that the run time +# dependencies can be located by the debugger. + +function(set_debugger_env target_name) + cmake_parse_arguments(ARG "NEEDS_GL" "" "" ${ARGN}) + + if(NOT TARGET ${target_name}) + message(FATAL_ERROR "set_debugger_env: '${target_name}' is not a CMake target") + endif() + + # Set the Paths for Visual Studio IDE Debugger. + if(MSVC) + if(OCIO_GL_ENABLED AND ARG_NEEDS_GL) + # Add folders for glut and glew DLLs. + set(extra_dirs "${GLUT_INCLUDE_DIR}/../bin;${GLEW_INCLUDE_DIRS}/../bin") + endif() + + set_property(TARGET ${target_name} PROPERTY + VS_DEBUGGER_ENVIRONMENT "PATH=$,;>;${extra_dirs};%PATH%" + ) + endif() +endfunction() \ No newline at end of file diff --git a/share/cmake/utils/LocateDXCompilerRuntime.cmake b/share/cmake/utils/LocateDXCompilerRuntime.cmake new file mode 100644 index 0000000000..f8d3aacecf --- /dev/null +++ b/share/cmake/utils/LocateDXCompilerRuntime.cmake @@ -0,0 +1,78 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright Contributors to the OpenColorIO Project. +# +# Locate the dxcompiler.dll + dxil.dll runtime pair needed to run D3D12 shader +# compilation at test time, and surface their file version. +# +# Inputs: +# OCIO_DXCOMPILER_DLL - Optional user-supplied path to dxcompiler.dll. +# When set, overrides the Windows SDK Redist/D3D +# search. Useful when the SDK-bundled DLL is too old. +# +# Outputs: +# DXCOMPILER_DLL - Path to dxcompiler.dll (cache variable). +# DXIL_DLL - Path to the adjacent dxil.dll (cache variable, may +# be left unset if not found next to dxcompiler.dll). + +set(OCIO_DXCOMPILER_DLL "" CACHE FILEPATH + "Optional explicit path to dxcompiler.dll (e.g. from a newer DirectX Shader Compiler release). \ +Overrides the automatic Windows SDK Redist/D3D search." +) + +if(OCIO_DXCOMPILER_DLL) + if(NOT EXISTS "${OCIO_DXCOMPILER_DLL}") + message(FATAL_ERROR "OCIO_DXCOMPILER_DLL=${OCIO_DXCOMPILER_DLL} does not exist.") + endif() + set(DXCOMPILER_DLL "${OCIO_DXCOMPILER_DLL}" CACHE FILEPATH + "Path to dxcompiler.dll (user-supplied via OCIO_DXCOMPILER_DLL)" FORCE) +else() + find_file(DXCOMPILER_DLL + NAMES dxcompiler.dll + PATHS + # Note: x64 hardcoded; update if ARM64 Windows support is needed. + "$ENV{WindowsSdkDir}Redist/D3D/x64" + "C:/Program Files (x86)/Windows Kits/10/Redist/D3D/x64" + NO_DEFAULT_PATH + DOC "Path to dxcompiler.dll from Windows SDK" + ) +endif() + +if(DXCOMPILER_DLL) + get_filename_component(_dxc_dll_dir "${DXCOMPILER_DLL}" DIRECTORY) + find_file(DXIL_DLL + NAMES dxil.dll + HINTS "${_dxc_dll_dir}" + NO_DEFAULT_PATH + ) + + # Report the found dxcompiler.dll version so crash reports can identify + # mismatched or outdated DXC builds without re-running diagnostics. + string(REPLACE "'" "''" _dxc_dll_ps "${DXCOMPILER_DLL}") + execute_process( + COMMAND powershell -NoProfile -Command + "(Get-Item -LiteralPath '${_dxc_dll_ps}').VersionInfo.FileVersion" + OUTPUT_VARIABLE _dxc_version + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) + if(_dxc_version) + message(STATUS "Found dxcompiler.dll (version ${_dxc_version}): ${DXCOMPILER_DLL}") + else() + message(STATUS "Found dxcompiler.dll (version unknown): ${DXCOMPILER_DLL}") + endif() + message(STATUS + "If test_dx crashes during shader compilation, the Windows SDK's dxcompiler.dll " + "may be too old to produce signed DXIL on this system. Replace it with a newer " + "build from https://github.com/microsoft/DirectXShaderCompiler/releases, or set " + "-DOCIO_DXCOMPILER_DLL= to point at a specific dxcompiler.dll." + ) +else() + message(WARNING + "OCIO_DIRECTX_ENABLED is ON but dxcompiler.dll was not found in the " + "Windows SDK Redist/D3D path. test_dx will fail at runtime unless " + "dxcompiler.dll and dxil.dll are on PATH. Install the Windows SDK " + "redistributable components, set -DOCIO_DXCOMPILER_DLL= to supply " + "a specific dxcompiler.dll, or set -DOCIO_DIRECTX_ENABLED=OFF to " + "disable the DirectX 12 backend." + ) +endif() diff --git a/src/OpenColorIO/CMakeLists.txt b/src/OpenColorIO/CMakeLists.txt index f56b6219c3..ff20c1a6c7 100755 --- a/src/OpenColorIO/CMakeLists.txt +++ b/src/OpenColorIO/CMakeLists.txt @@ -235,6 +235,9 @@ configure_file(CPUInfoConfig.h.in CPUInfoConfig.h) add_library(OpenColorIO ${SOURCES}) +# Group the source files to replicate the source tree structure in the IDEs. +source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" FILES ${SOURCES}) + # Require at least a C++11 compatible compiler for consumer projects. target_compile_features(OpenColorIO PUBLIC cxx_std_11 diff --git a/src/OpenColorIO/ColorSpace.cpp b/src/OpenColorIO/ColorSpace.cpp index 98f776fe18..946c7286c1 100644 --- a/src/OpenColorIO/ColorSpace.cpp +++ b/src/OpenColorIO/ColorSpace.cpp @@ -162,6 +162,7 @@ const char * ColorSpace::getAlias(size_t idx) const noexcept bool ColorSpace::hasAlias(const char * alias) const noexcept { + if (!alias) return false; for (size_t idx = 0; idx < getImpl()->m_aliases.size(); ++idx) { if (0 == Platform::Strcasecmp(getImpl()->m_aliases[idx].c_str(), alias)) @@ -430,6 +431,7 @@ int ColorSpace::getAllocationNumVars() const void ColorSpace::getAllocationVars(float * vars) const { + if(!vars) return; if(!getImpl()->m_allocationVars.empty()) { memcpy(vars, @@ -440,6 +442,15 @@ void ColorSpace::getAllocationVars(float * vars) const void ColorSpace::setAllocationVars(int numvars, const float * vars) { + if (numvars < 0) + { + throw Exception("setAllocationVars: numvars must not be negative."); + } + if (numvars > 0 && !vars) + { + throw Exception("setAllocationVars: vars must not be null when numvars is positive."); + } + getImpl()->m_allocationVars.resize(numvars); if(!getImpl()->m_allocationVars.empty()) diff --git a/src/OpenColorIO/ColorSpaceSet.cpp b/src/OpenColorIO/ColorSpaceSet.cpp index 99c659a61b..488099be68 100644 --- a/src/OpenColorIO/ColorSpaceSet.cpp +++ b/src/OpenColorIO/ColorSpaceSet.cpp @@ -180,6 +180,7 @@ class ColorSpaceSet::Impl void remove(const char * csName) { + if (!csName || !*csName) return; const std::string name = StringUtils::Lower(csName); if (name.empty()) return; diff --git a/src/OpenColorIO/Config.cpp b/src/OpenColorIO/Config.cpp index 7072c50df9..a8f25d5cad 100644 --- a/src/OpenColorIO/Config.cpp +++ b/src/OpenColorIO/Config.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -798,7 +799,7 @@ class Config::Impl } const ViewVec & views = searchShared ? m_sharedViews : iter->second.m_views; - const auto & viewIt = FindView(views, view); + const auto viewIt = FindView(views, view); if (viewIt != views.end()) { @@ -1153,9 +1154,10 @@ ConstConfigRcPtr Config::CreateFromEnv() ConstConfigRcPtr Config::CreateFromFile(const char * filename) { + // Specifically check if a config filepath is provided. if (!filename || !*filename) { - throw ExceptionMissingFile ("The config filepath is missing."); + throw Exception("The config filepath is missing."); } // Check for URI Pattern: ocio:// @@ -1167,6 +1169,14 @@ ConstConfigRcPtr Config::CreateFromFile(const char * filename) return CreateFromBuiltinConfig(uri.c_str()); } + // Specifically check if the provided non-builtin config filepath exists. + if (!std::filesystem::exists(filename)) + { + std::ostringstream oss; + oss << "'" << filename << "' file does not exist."; + throw ExceptionMissingFile(oss.str().c_str()); + } + std::ifstream ifstream = Platform::CreateInputFileStream( filename, std::ios_base::in | std::ios_base::binary @@ -1461,7 +1471,7 @@ void Config::validate() const os << "Config failed color space validation. "; os << "The color space '" << name << "' "; os << "refers to an interop ID, '" << interop << "', "; - os << "which is not defined in this config."; + os << "which is not a color space name or alias."; getImpl()->m_validationtext = os.str(); throw Exception(getImpl()->m_validationtext.c_str()); } @@ -4337,7 +4347,7 @@ int Config::getNumDisplaysAll() const noexcept const char * Config::getDisplayAll(int index) const noexcept { - if (index >= 0 || index < static_cast(getImpl()->m_displays.size())) + if (index >= 0 && index < static_cast(getImpl()->m_displays.size())) { return getImpl()->m_displays[index].first.c_str(); } @@ -4365,7 +4375,7 @@ int Config::getDisplayAllByName(const char * name) const noexcept bool Config::isDisplayTemporary(int index) const noexcept { - if (index >= 0 || index < static_cast(getImpl()->m_displays.size())) + if (index >= 0 && index < static_cast(getImpl()->m_displays.size())) { return getImpl()->m_displays[index].second.m_temporary; } @@ -4375,7 +4385,7 @@ bool Config::isDisplayTemporary(int index) const noexcept void Config::setDisplayTemporary(int index, bool isTemporary) noexcept { - if (index >= 0 || index < static_cast(getImpl()->m_displays.size())) + if (index >= 0 && index < static_cast(getImpl()->m_displays.size())) { getImpl()->m_displays[index].second.m_temporary = isTemporary; @@ -4410,7 +4420,7 @@ const char * Config::getView(ViewType type, const char * display, int index) con { if (!display || !*display) { - if (index >= 0 || index < static_cast(getImpl()->m_sharedViews.size())) + if (index >= 0 && index < static_cast(getImpl()->m_sharedViews.size())) { return getImpl()->m_sharedViews[index].m_name.c_str(); } @@ -4449,11 +4459,19 @@ const char * Config::getView(ViewType type, const char * display, int index) con void Config::getDefaultLumaCoefs(double * c3) const { + if (!c3) + { + throw Exception("getDefaultLumaCoefs: c3 must not be null."); + } memcpy(c3, &getImpl()->m_defaultLumaCoefs[0], 3*sizeof(double)); } void Config::setDefaultLumaCoefs(const double * c3) { + if (!c3) + { + throw Exception("setDefaultLumaCoefs: c3 must not be null."); + } memcpy(&getImpl()->m_defaultLumaCoefs[0], c3, 3*sizeof(double)); AutoMutex lock(getImpl()->m_cacheidMutex); diff --git a/src/OpenColorIO/ContextVariableUtils.cpp b/src/OpenColorIO/ContextVariableUtils.cpp index 1207a0363a..8340a5cd30 100644 --- a/src/OpenColorIO/ContextVariableUtils.cpp +++ b/src/OpenColorIO/ContextVariableUtils.cpp @@ -101,10 +101,12 @@ void LoadEnvironment(EnvMap & map, bool update) const std::string env_str = (char*)*env; #endif - const int pos = static_cast(env_str.find_first_of('=')); + const auto pos = env_str.find_first_of('='); + + if (pos == std::string::npos) continue; const std::string name = env_str.substr(0, pos); - const std::string value = env_str.substr(pos+1, env_str.length()); + const std::string value = env_str.substr(pos+1); if (update) { @@ -122,8 +124,15 @@ void LoadEnvironment(EnvMap & map, bool update) } } -std::string ResolveContextVariables(const std::string & str, const EnvMap & map, UsedEnvs & used) +static std::string ResolveContextVariablesImpl(const std::string & str, const EnvMap & map, + UsedEnvs & used, int depth) { + // Guard against infinite recursion at the string substitution level (e.g. $A expands + // to $B which expands to $A). This is independent from the graph-level guards in + // CollectContextVariables() and Transform.cpp's BuildOps(), which protect against cycles + // in the color space / look / view transform reference graph. + if (depth > 32) return str; + // Early exit if no reserved tokens are found. if (!ContainsContextVariables(str)) { @@ -159,17 +168,41 @@ std::string ResolveContextVariables(const std::string & str, const EnvMap & map, // recursively call till string doesn't expand anymore if(newstr != orig) { - return ResolveContextVariables(newstr, map, used); + return ResolveContextVariablesImpl(newstr, map, used, depth + 1); } return orig; } -bool CollectContextVariables(const Config & config, +std::string ResolveContextVariables(const std::string & str, const EnvMap & map, UsedEnvs & used) +{ + return ResolveContextVariablesImpl(str, map, used, 0); +} + +bool CollectContextVariables(const Config & config, const Context & context, ConstTransformRcPtr transform, ContextRcPtr & usedContextVars) { + // Guard against infinite recursion through cycles in the color space / look / view + // transform reference graph (e.g. a ColorSpace whose from_reference is a + // ColorSpaceTransform pointing back to itself). Distinct from the string-level depth + // check in ResolveContextVariablesImpl, which only guards cyclic context-variable + // substitution within a single string; that check fires once per finite resolveStringVar + // call here and never observes this outer graph traversal. A matching guard exists in + // BuildOps() for the op-builder traversal that runs after this one. + static thread_local int depth = 0; + if (depth > 32) + { + throw Exception("Cycle detected while collecting context variables."); + } + struct DepthGuard + { + int & d; + DepthGuard(int & d_) : d(d_) { ++d; } + ~DepthGuard() { --d; } + } guard(depth); + if(ConstColorSpaceTransformRcPtr tr = DynamicPtrCast(transform)) { if (CollectContextVariables(config, context, *tr, usedContextVars)) return true; diff --git a/src/OpenColorIO/CustomKeys.h b/src/OpenColorIO/CustomKeys.h index b41b9714ce..02f364bc1f 100644 --- a/src/OpenColorIO/CustomKeys.h +++ b/src/OpenColorIO/CustomKeys.h @@ -61,14 +61,24 @@ class CustomKeysContainer bool hasKey(const char * key) { - std::string s = key; - return m_customKeys.count(s) > 0; + if (!key || !*key) return false; + return m_customKeys.count(key) > 0; } const char * getValueForKey(const char * key) { - // NB: Will throw if the map doesn't have the key. - return m_customKeys[key].c_str(); + if (!key || !*key) + { + throw Exception("Key has to be a non-empty string."); + } + auto it = m_customKeys.find(key); + if (it == m_customKeys.end()) + { + std::ostringstream oss; + oss << "Key '" << key << "' not found."; + throw Exception(oss.str().c_str()); + } + return it->second.c_str(); } private: diff --git a/src/OpenColorIO/Display.cpp b/src/OpenColorIO/Display.cpp index 4280b99231..aebc37fb08 100644 --- a/src/OpenColorIO/Display.cpp +++ b/src/OpenColorIO/Display.cpp @@ -52,7 +52,7 @@ void AddView(ViewVec & views, const char * name, const char * viewTransform, const char * displayColorSpace, const char * looks, const char * rule, const char * description) { - if (0 == Platform::Strcasecmp(displayColorSpace, OCIO_VIEW_USE_DISPLAY_NAME)) + if (displayColorSpace && 0 == Platform::Strcasecmp(displayColorSpace, OCIO_VIEW_USE_DISPLAY_NAME)) { displayColorSpace = OCIO_VIEW_USE_DISPLAY_NAME; } diff --git a/src/OpenColorIO/Display.h b/src/OpenColorIO/Display.h index 43e1b2cc9c..b2ffd85b50 100644 --- a/src/OpenColorIO/Display.h +++ b/src/OpenColorIO/Display.h @@ -37,7 +37,7 @@ struct View const char * looks, const char * rule, const char * description) - : m_name(name) + : m_name(name ? name : "") , m_viewTransform(viewTransform ? viewTransform : "") , m_colorspace(colorspace ? colorspace : "") , m_looks(looks ? looks : "") diff --git a/src/OpenColorIO/DynamicProperty.cpp b/src/OpenColorIO/DynamicProperty.cpp index 075973412f..bf61a484cd 100644 --- a/src/OpenColorIO/DynamicProperty.cpp +++ b/src/OpenColorIO/DynamicProperty.cpp @@ -280,6 +280,10 @@ void DynamicPropertyGradingRGBCurveImpl::precompute() { ConstGradingBSplineCurveRcPtr curve = m_gradingRGBCurve->getCurve(c); auto curveImpl = dynamic_cast(curve.get()); + if (!curveImpl) + { + throw Exception("DynamicPropertyGradingRGBCurveImpl: unexpected curve implementation."); + } curveImpl->computeKnotsAndCoefs(m_knotsCoefs, static_cast(c), false); } if (m_knotsCoefs.m_numKnots <= 0) m_knotsCoefs.m_localBypass = true; @@ -375,6 +379,10 @@ void DynamicPropertyGradingHueCurveImpl::precompute() { ConstGradingBSplineCurveRcPtr curve = m_gradingHueCurve->getCurve(c); auto curveImpl = dynamic_cast(curve.get()); + if (!curveImpl) + { + throw Exception("DynamicPropertyGradingHueCurveImpl: unexpected curve implementation."); + } curveImpl->computeKnotsAndCoefs(m_knotsCoefs, static_cast(c), m_gradingHueCurve->getDrawCurveOnly()); } diff --git a/src/OpenColorIO/FileRules.cpp b/src/OpenColorIO/FileRules.cpp index e0df0d0276..19cbd47bf7 100644 --- a/src/OpenColorIO/FileRules.cpp +++ b/src/OpenColorIO/FileRules.cpp @@ -117,7 +117,7 @@ std::string ConvertToRegularExpression(const char * globPattern, bool ignoreCase if (globString[idx] == ']') { - ThrowInvalidRegex(globPattern, globPattern + idx); + ThrowInvalidRegex(globPattern, &globString[idx]); } // Full processing from '[' to ']'. diff --git a/src/OpenColorIO/GpuShader.cpp b/src/OpenColorIO/GpuShader.cpp index 38eda8a30e..95d2572750 100644 --- a/src/OpenColorIO/GpuShader.cpp +++ b/src/OpenColorIO/GpuShader.cpp @@ -11,7 +11,7 @@ #include "DynamicProperty.h" #include "GpuShader.h" -#include "ops/lut3d/Lut3DOpData.h" +#include "LutLimits.h" #include "Platform.h" namespace OCIO_NAMESPACE @@ -70,6 +70,7 @@ class PrivateImpl GpuShaderDesc::TextureType channel, unsigned dimensions, Interpolation interpolation, + unsigned textureShaderBindingIndex, const float * v) : m_textureName(textureName) , m_samplerName(samplerName) @@ -79,6 +80,7 @@ class PrivateImpl , m_type(channel) , m_dimensions(dimensions) , m_interp(interpolation) + , m_textureShaderBindingIndex(textureShaderBindingIndex) { if (!textureName || !*textureName) { @@ -113,6 +115,7 @@ class PrivateImpl GpuShaderDesc::TextureType m_type; unsigned m_dimensions; Interpolation m_interp; + unsigned m_textureShaderBindingIndex; std::vector m_values; @@ -191,7 +194,7 @@ class PrivateImpl virtual ~PrivateImpl() {} - inline unsigned get3dLutMaxLength() const { return Lut3DOpData::maxSupportedLength; } + inline unsigned get3dLutMaxLength() const { return Max3DLUTLength; } inline unsigned get1dLutMaxWidth() const { return m_max1DLUTWidth; } inline void set1dLutMaxWidth(unsigned maxWidth) { m_max1DLUTWidth = maxWidth; } @@ -214,11 +217,13 @@ class PrivateImpl << width << " > " << get1dLutMaxWidth(); throw Exception(ss.str().c_str()); } - unsigned textureIndex = static_cast(m_textures.size()); + unsigned textureShaderBindingIndex = static_cast(m_textures.size()) + + static_cast(m_textures3D.size()); unsigned numDimensions = static_cast(dimensions); - Texture t(textureName, samplerName, width, height, 1, channel, numDimensions, interpolation, values); + Texture t(textureName, samplerName, width, height, 1, channel, numDimensions, interpolation, + textureShaderBindingIndex, values); m_textures.push_back(t); - return textureIndex; + return textureShaderBindingIndex; } void getTexture(unsigned index, @@ -268,6 +273,20 @@ class PrivateImpl values = &t.m_values[0]; } + unsigned getTextureShaderBindingIndex(unsigned index) const + { + if(index >= m_textures.size()) + { + std::ostringstream ss; + ss << "1D LUT access error: index = " << index + << " where size = " << m_textures.size(); + throw Exception(ss.str().c_str()); + } + + const Texture & t = m_textures[index]; + return t.m_textureShaderBindingIndex; + } + unsigned add3DTexture(const char * textureName, const char * samplerName, unsigned edgelen, @@ -282,12 +301,13 @@ class PrivateImpl throw Exception(ss.str().c_str()); } - unsigned textureIndex = static_cast(m_textures3D.size()); + unsigned textureShaderBindingIndex = static_cast(m_textures.size()) + + static_cast(m_textures3D.size()); Texture t(textureName, samplerName, edgelen, edgelen, edgelen, GpuShaderDesc::TEXTURE_RGB_CHANNEL, 3, - interpolation, values); + interpolation, textureShaderBindingIndex, values); m_textures3D.push_back(t); - return textureIndex; + return textureShaderBindingIndex; } void get3DTexture(unsigned index, @@ -325,6 +345,20 @@ class PrivateImpl values = &t.m_values[0]; } + unsigned get3DTextureShaderBindingIndex(unsigned index) const + { + if(index >= m_textures3D.size()) + { + std::ostringstream ss; + ss << "3D LUT access error: index = " << index + << " where size = " << m_textures3D.size(); + throw Exception(ss.str().c_str()); + } + + const Texture & t = m_textures3D[index]; + return t.m_textureShaderBindingIndex; + } + unsigned getNumUniforms() const { return (unsigned)m_uniforms.size(); @@ -544,7 +578,9 @@ unsigned GenericGpuShaderDesc::addTexture(const char * textureName, Interpolation interpolation, const float * values) { - return getImplGeneric()->addTexture(textureName, samplerName, width, height, channel, dimensions, interpolation, values); + return getImplGeneric()->addTexture(textureName, samplerName, width, height, channel, + dimensions, interpolation, values) + + getTextureBindingStart(); } void GenericGpuShaderDesc::getTexture(unsigned index, @@ -555,7 +591,8 @@ void GenericGpuShaderDesc::getTexture(unsigned index, TextureDimensions & dimensions, Interpolation & interpolation) const { - getImplGeneric()->getTexture(index, textureName, samplerName, width, height, channel, dimensions, interpolation); + getImplGeneric()->getTexture(index, textureName, samplerName, width, height, channel, + dimensions, interpolation); } void GenericGpuShaderDesc::getTextureValues(unsigned index, const float *& values) const @@ -563,6 +600,11 @@ void GenericGpuShaderDesc::getTextureValues(unsigned index, const float *& value getImplGeneric()->getTextureValues(index, values); } +unsigned GenericGpuShaderDesc::getTextureShaderBindingIndex(unsigned index) const +{ + return getImplGeneric()->getTextureShaderBindingIndex(index) + getTextureBindingStart(); +} + unsigned GenericGpuShaderDesc::getNum3DTextures() const noexcept { return unsigned(getImplGeneric()->m_textures3D.size()); @@ -574,7 +616,8 @@ unsigned GenericGpuShaderDesc::add3DTexture(const char * textureName, Interpolation interpolation, const float * values) { - return getImplGeneric()->add3DTexture(textureName, samplerName, edgelen, interpolation, values); + return getImplGeneric()->add3DTexture(textureName, samplerName, edgelen, interpolation, values) + + getTextureBindingStart(); } void GenericGpuShaderDesc::get3DTexture(unsigned index, @@ -591,6 +634,11 @@ void GenericGpuShaderDesc::get3DTextureValues(unsigned index, const float *& val getImplGeneric()->get3DTextureValues(index, values); } +unsigned GenericGpuShaderDesc::get3DTextureShaderBindingIndex(unsigned index) const +{ + return getImplGeneric()->get3DTextureShaderBindingIndex(index) + getTextureBindingStart(); +} + void GenericGpuShaderDesc::Deleter(GenericGpuShaderDesc* c) { delete c; diff --git a/src/OpenColorIO/GpuShader.h b/src/OpenColorIO/GpuShader.h index 8b099cc12f..174d346e34 100644 --- a/src/OpenColorIO/GpuShader.h +++ b/src/OpenColorIO/GpuShader.h @@ -67,6 +67,7 @@ class GenericGpuShaderDesc : public GpuShaderDesc TextureDimensions & dimensions, Interpolation & interpolation) const override; void getTextureValues(unsigned index, const float *& values) const override; + unsigned getTextureShaderBindingIndex(unsigned index) const override; // Accessors to the 3D textures built from 3D LUT // @@ -82,6 +83,7 @@ class GenericGpuShaderDesc : public GpuShaderDesc unsigned & edgelen, Interpolation & interpolation) const override; void get3DTextureValues(unsigned index, const float *& value) const override; + unsigned get3DTextureShaderBindingIndex(unsigned index) const override; private: diff --git a/src/OpenColorIO/GpuShaderDesc.cpp b/src/OpenColorIO/GpuShaderDesc.cpp index ffa9be7407..c16add78ad 100644 --- a/src/OpenColorIO/GpuShaderDesc.cpp +++ b/src/OpenColorIO/GpuShaderDesc.cpp @@ -135,7 +135,7 @@ void GpuShaderCreator::setFunctionName(const char * name) noexcept { AutoMutex lock(getImpl()->m_cacheIDMutex); // Note: Remove potentially problematic double underscores from GLSL resource names. - getImpl()->m_functionName = StringUtils::Replace(name, "__", "_"); + getImpl()->m_functionName = StringUtils::Replace(name ? name : "", "__", "_"); getImpl()->m_cacheID.clear(); } @@ -148,7 +148,7 @@ void GpuShaderCreator::setResourcePrefix(const char * prefix) noexcept { AutoMutex lock(getImpl()->m_cacheIDMutex); // Note: Remove potentially problematic double underscores from GLSL resource names. - getImpl()->m_resourcePrefix = StringUtils::Replace(prefix, "__", "_"); + getImpl()->m_resourcePrefix = StringUtils::Replace(prefix ? prefix : "", "__", "_"); getImpl()->m_cacheID.clear(); } @@ -161,7 +161,7 @@ void GpuShaderCreator::setPixelName(const char * name) noexcept { AutoMutex lock(getImpl()->m_cacheIDMutex); // Note: Remove potentially problematic double underscores from GLSL resource names. - getImpl()->m_pixelName = StringUtils::Replace(name, "__", "_"); + getImpl()->m_pixelName = StringUtils::Replace(name ? name : "", "__", "_"); getImpl()->m_cacheID.clear(); } @@ -181,8 +181,10 @@ void GpuShaderCreator::setDescriptorSetIndex(unsigned index, unsigned textureBin { throw Exception("Texture binding start index must be greater than 0."); } + AutoMutex lock(getImpl()->m_cacheIDMutex); getImpl()->m_descriptorSetIndex = index; getImpl()->m_textureBindingStart = textureBindingStart; + getImpl()->m_cacheID.clear(); } unsigned GpuShaderCreator::getDescriptorSetIndex() const noexcept @@ -270,6 +272,8 @@ const char * GpuShaderCreator::getCacheID() const noexcept os << getImpl()->m_resourcePrefix << " "; os << getImpl()->m_pixelName << " "; os << getImpl()->m_numResources << " "; + os << getImpl()->m_descriptorSetIndex << " "; + os << getImpl()->m_textureBindingStart << " "; os << getImpl()->m_shaderCodeID; getImpl()->m_cacheID = os.str(); } diff --git a/src/OpenColorIO/GpuShaderUtils.cpp b/src/OpenColorIO/GpuShaderUtils.cpp index 6b32c01cf1..3f8e158e48 100644 --- a/src/OpenColorIO/GpuShaderUtils.cpp +++ b/src/OpenColorIO/GpuShaderUtils.cpp @@ -482,7 +482,8 @@ std::string GpuShaderText::declareVarStr(const std::string & name, float v) std::string GpuShaderText::vectorCompareExpression(const std::string& lhs, const std::string& op, const std::string& rhs) { std::string ret = lhs + " " + op + " " + rhs; - if(m_lang == GPU_LANGUAGE_MSL_2_0) + // MSL and HLSL do not allow vector bool in if-conditions: wrap with any(). + if(m_lang == GPU_LANGUAGE_MSL_2_0 || m_lang == GPU_LANGUAGE_HLSL_SM_5_0) { ret = "any( " + ret + " )"; } @@ -845,11 +846,11 @@ std::string GpuShaderText::getSamplerName(const std::string& textureName) void GpuShaderText::declareTex1D(const std::string & textureName, unsigned descriptorSetIndex, - unsigned textureIndex, unsigned textureBindingStart) + unsigned textureIndex) { std::string textureDecl, samplerDecl; getTexDecl<1>(m_lang, textureName, getSamplerName(textureName), textureDecl, samplerDecl, - descriptorSetIndex, textureIndex + textureBindingStart); + descriptorSetIndex, textureIndex); if (!textureDecl.empty()) { @@ -864,11 +865,11 @@ void GpuShaderText::declareTex1D(const std::string & textureName, void GpuShaderText::declareTex2D(const std::string & textureName, unsigned descriptorSetIndex, - unsigned textureIndex, unsigned textureBindingStart) + unsigned textureIndex) { std::string textureDecl, samplerDecl; getTexDecl<2>(m_lang, textureName, getSamplerName(textureName), textureDecl, samplerDecl, - descriptorSetIndex, textureIndex + textureBindingStart); + descriptorSetIndex, textureIndex); if (!textureDecl.empty()) { @@ -883,11 +884,11 @@ void GpuShaderText::declareTex2D(const std::string & textureName, void GpuShaderText::declareTex3D(const std::string& textureName, unsigned descriptorSetIndex, - unsigned textureIndex, unsigned textureBindingStart) + unsigned textureIndex) { std::string textureDecl, samplerDecl; getTexDecl<3>(m_lang, textureName, getSamplerName(textureName), textureDecl, samplerDecl, - descriptorSetIndex, textureIndex + textureBindingStart); + descriptorSetIndex, textureIndex); if (!textureDecl.empty()) { diff --git a/src/OpenColorIO/GpuShaderUtils.h b/src/OpenColorIO/GpuShaderUtils.h index 72ef1c670d..0b081acba9 100644 --- a/src/OpenColorIO/GpuShaderUtils.h +++ b/src/OpenColorIO/GpuShaderUtils.h @@ -171,11 +171,11 @@ class GpuShaderText static std::string getSamplerName(const std::string& textureName); // Declare the global texture and sampler information for a 1D texture. - void declareTex1D(const std::string& textureName, unsigned descriptorSetIndex, unsigned textureIndex, unsigned textureBindingStart); + void declareTex1D(const std::string& textureName, unsigned descriptorSetIndex, unsigned textureIndex); // Declare the global texture and sampler information for a 2D texture. - void declareTex2D(const std::string& textureName, unsigned descriptorSetIndex, unsigned textureIndex, unsigned textureBindingStart); + void declareTex2D(const std::string& textureName, unsigned descriptorSetIndex, unsigned textureIndex); // Declare the global texture and sampler information for a 3D texture. - void declareTex3D(const std::string& textureName, unsigned descriptorSetIndex, unsigned textureIndex, unsigned textureBindingStart); + void declareTex3D(const std::string& textureName, unsigned descriptorSetIndex, unsigned textureIndex); // Get the texture lookup call for a 1D texture. std::string sampleTex1D(const std::string& textureName, const std::string& coords) const; diff --git a/src/OpenColorIO/HashUtils.cpp b/src/OpenColorIO/HashUtils.cpp index 15f775faa0..c5d6035013 100644 --- a/src/OpenColorIO/HashUtils.cpp +++ b/src/OpenColorIO/HashUtils.cpp @@ -2,6 +2,7 @@ // Copyright Contributors to the OpenColorIO Project. #include +#include #include @@ -21,8 +22,33 @@ std::string CacheIDHash(const char * array, std::size_t size) XXH128_hash_t hash = XXH3_128bits(array, size); std::stringstream oss; - oss << std::hex << hash.low64 << hash.high64; + oss << std::hex << std::setfill('0'); + oss << std::setw(16) << hash.low64; + oss << std::setw(16) << hash.high64; return oss.str(); } +std::string CacheIDHashUUID(const char * array, std::size_t size) +{ + XXH128_hash_t hash = XXH3_128bits(array, size); + + // Make sure that we have full, zero-padded 32 chars. + std::stringstream oss; + oss << std::hex << std::setfill('0'); + oss << std::setw(16) << hash.high64; + oss << std::setw(16) << hash.low64; + + // Format into 8-4-4-4-12 form. + std::string hex = oss.str(); + std::string uuid = + hex.substr(0, 8) + "-" + + hex.substr(8, 4) + "-" + + hex.substr(12, 4) + "-" + + hex.substr(16, 4) + "-" + + hex.substr(20, 12); + + return uuid; +} + + } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/HashUtils.h b/src/OpenColorIO/HashUtils.h index 66c3b6e3fd..cf53ab1cba 100644 --- a/src/OpenColorIO/HashUtils.h +++ b/src/OpenColorIO/HashUtils.h @@ -14,6 +14,10 @@ namespace OCIO_NAMESPACE std::string CacheIDHash(const char * array, std::size_t size); +// Generates 128 bit UUID in the form of 8-4-4-4-12 using the hash of the passed +// string. +std::string CacheIDHashUUID(const char * array, std::size_t size); + } // namespace OCIO_NAMESPACE #endif diff --git a/src/OpenColorIO/ImageDesc.cpp b/src/OpenColorIO/ImageDesc.cpp index 2f045f1597..7830168987 100644 --- a/src/OpenColorIO/ImageDesc.cpp +++ b/src/OpenColorIO/ImageDesc.cpp @@ -260,6 +260,7 @@ struct PackedImageDesc::Impl { // Confirm xStrideBytes is a pure packing // (I.e., it will divide evenly) + if (m_chanStrideBytes == 0) return false; const div_t result = div((int)m_xStrideBytes, (int)m_chanStrideBytes); if(result.rem != 0) return false; diff --git a/src/OpenColorIO/ImagePacking.cpp b/src/OpenColorIO/ImagePacking.cpp index 3c24c9a58f..4fb185ec2a 100644 --- a/src/OpenColorIO/ImagePacking.cpp +++ b/src/OpenColorIO/ImagePacking.cpp @@ -23,7 +23,8 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, Type * inBitDepthBuffer, float * outputBuffer, int outputBufferSize, - long imagePixelStartIndex) + long imagePixelStartIndex, + BitDepth inputBitDepth) { if(outputBuffer==nullptr) { @@ -62,15 +63,21 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, aPtr = reinterpret_cast(aRow + xStrideBytes*xIndex); } + float maxValue = static_cast(GetBitDepthMaxValue(inputBitDepth)); + if (maxValue <= 0) + { + throw Exception("Invalid bit depth max value."); + } + // Process one single, complete scanline. int pixelsCopied = 0; while(pixelsCopied < outputBufferSize) - { + { // Reorder channels from arbitrary channel ordering to RGBA 32-bit float. inBitDepthBuffer[4*pixelsCopied+0] = *rPtr; inBitDepthBuffer[4*pixelsCopied+1] = *gPtr; inBitDepthBuffer[4*pixelsCopied+2] = *bPtr; - inBitDepthBuffer[4*pixelsCopied+3] = aPtr ? *aPtr : (Type)0.0f; + inBitDepthBuffer[4*pixelsCopied+3] = aPtr ? *aPtr : (Type)(maxValue); pixelsCopied++; xIndex++; @@ -93,7 +100,8 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, float * /*inBitDepthBuffer*/, float * outputBuffer, int outputBufferSize, - long imagePixelStartIndex) + long imagePixelStartIndex, + BitDepth /*inputBitDepth*/) { if(outputBuffer==nullptr) { @@ -140,7 +148,7 @@ void Generic::PackRGBAFromImageDesc(const GenericImageDesc & srcImg, outputBuffer[4*pixelsCopied+0] = *rPtr; outputBuffer[4*pixelsCopied+1] = *gPtr; outputBuffer[4*pixelsCopied+2] = *bPtr; - outputBuffer[4*pixelsCopied+3] = aPtr ? *aPtr : 0.0f; + outputBuffer[4*pixelsCopied+3] = aPtr ? *aPtr : 1.0f; pixelsCopied++; xIndex++; diff --git a/src/OpenColorIO/ImagePacking.h b/src/OpenColorIO/ImagePacking.h index 578bb997ef..42c3db8dc4 100644 --- a/src/OpenColorIO/ImagePacking.h +++ b/src/OpenColorIO/ImagePacking.h @@ -53,7 +53,8 @@ struct Generic Type * inBitDepthBuffer, float * outputBuffer, int outputBufferSize, - long imagePixelStartIndex); + long imagePixelStartIndex, + BitDepth inputBitDepth); static void UnpackRGBAToImageDesc(GenericImageDesc & dstImg, float * inputBuffer, diff --git a/src/OpenColorIO/Logging.cpp b/src/OpenColorIO/Logging.cpp index e40692db7c..4331878dfe 100644 --- a/src/OpenColorIO/Logging.cpp +++ b/src/OpenColorIO/Logging.cpp @@ -114,11 +114,17 @@ void SetLoggingLevel(LoggingLevel level) void SetLoggingFunction(LoggingFunction logFunction) { + if (!logFunction) + { + throw Exception("SetLoggingFunction: logFunction must not be null."); + } + AutoMutex lock(g_logmutex); g_loggingFunction = logFunction; } void ResetToDefaultLoggingFunction() { + AutoMutex lock(g_logmutex); g_loggingFunction = DefaultLoggingFunction; } diff --git a/src/OpenColorIO/LutLimits.h b/src/OpenColorIO/LutLimits.h new file mode 100644 index 0000000000..d7ce24ccc7 --- /dev/null +++ b/src/OpenColorIO/LutLimits.h @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#ifndef INCLUDED_OCIO_LUTLIMITS_H +#define INCLUDED_OCIO_LUTLIMITS_H + +namespace OCIO_NAMESPACE +{ + +// Maximum number of entries supported in a 1D LUT. +constexpr unsigned long Max1DLUTLength = 300000; + +// Maximum grid size supported for a 3D LUT. +// 129 allows for a MESH dimension of 7 in the 3dl file format. +constexpr unsigned long Max3DLUTLength = 129; + +} // namespace OCIO_NAMESPACE + +#endif // INCLUDED_OCIO_LUTLIMITS_H diff --git a/src/OpenColorIO/NamedTransform.cpp b/src/OpenColorIO/NamedTransform.cpp index 2eb8f53b19..19c6d8d67c 100644 --- a/src/OpenColorIO/NamedTransform.cpp +++ b/src/OpenColorIO/NamedTransform.cpp @@ -67,6 +67,7 @@ const char * NamedTransformImpl::getAlias(size_t idx) const noexcept bool NamedTransformImpl::hasAlias(const char * alias) const noexcept { + if (!alias || !*alias) return false; for (size_t idx = 0; idx < m_aliases.size(); ++idx) { if (0 == Platform::Strcasecmp(m_aliases[idx].c_str(), alias)) diff --git a/src/OpenColorIO/OCIOYaml.cpp b/src/OpenColorIO/OCIOYaml.cpp index c9361579fe..9010dcb606 100644 --- a/src/OpenColorIO/OCIOYaml.cpp +++ b/src/OpenColorIO/OCIOYaml.cpp @@ -4413,17 +4413,24 @@ inline void load(const YAML::Node& node, ConfigRcPtr & config, const char* filen results = StringUtils::Split(version, '.'); - if(results.size()==1) - { - profile_major_version = std::stoi(results[0].c_str()); - profile_minor_version = 0; - } - else if(results.size()==2) + try { - profile_major_version = std::stoi(results[0].c_str()); - profile_minor_version = std::stoi(results[1].c_str()); + if(results.size()==1) + { + profile_major_version = std::stoi(results[0].c_str()); + profile_minor_version = 0; + } + else if(results.size()==2) + { + profile_major_version = std::stoi(results[0].c_str()); + profile_minor_version = std::stoi(results[1].c_str()); + } + else + { + faulty_version = true; + } } - else + catch (const std::exception &) { faulty_version = true; } diff --git a/src/OpenColorIO/OCIOZArchive.cpp b/src/OpenColorIO/OCIOZArchive.cpp index 982fce6823..1caed9ecba 100644 --- a/src/OpenColorIO/OCIOZArchive.cpp +++ b/src/OpenColorIO/OCIOZArchive.cpp @@ -387,6 +387,21 @@ void ExtractOCIOZArchive(const char * archivePath, const char * destination) mz_zip_reader_delete(&extracter); } +std::vector readEntryBuffer(void * reader) +{ + int32_t buf_size = (int32_t)mz_zip_reader_entry_save_buffer_length(reader); + // Reject negative values (minizip error codes) and implausibly large entries. + // 256 MB is well above any realistic individual OCIO config or LUT file size. + static constexpr size_t MAX_ENTRY_SIZE = 256 * 1024 * 1024; + if (buf_size <= 0 || (size_t)buf_size > MAX_ENTRY_SIZE) + { + throw Exception("OCIOZ archive entry size is invalid or exceeds maximum allowed size."); + } + std::vector buffer(buf_size); + mz_zip_reader_entry_save_buffer(reader, &buffer[0], buf_size); + return buffer; +} + /** * \brief Callback function for getFileStringFromArchiveStream in order to get the contents of a * file inside an OCIOZ archive as a buffer. @@ -406,11 +421,7 @@ std::vector getFileBufferByPath(void * reader, mz_zip_file & info, std: std::vector buffer; if (mz_path_compare_wc(filepath.c_str(), info.filename, 1) == MZ_OK) { - // Initialize the buffer for the file. - int32_t buf_size = (int32_t)mz_zip_reader_entry_save_buffer_length(reader); - buffer.resize(buf_size); - // Read the content of the file and return it as buffer. - mz_zip_reader_entry_save_buffer(reader, &buffer[0], buf_size); + buffer = readEntryBuffer(reader); } return buffer; } @@ -434,9 +445,7 @@ std::vector getFileBufferByExtension(void * reader, mz_zip_file & info, pystring::os::path::splitext(root, ext, info.filename); if (Platform::Strcasecmp(extension.c_str(), ext.c_str()) == 0) { - int32_t buf_size = (int32_t)mz_zip_reader_entry_save_buffer_length(reader); - buffer.resize(buf_size); - mz_zip_reader_entry_save_buffer(reader, &buffer[0], buf_size); + buffer = readEntryBuffer(reader); } return buffer; } diff --git a/src/OpenColorIO/Platform.cpp b/src/OpenColorIO/Platform.cpp index 0e7fc68b2d..f579c49bdd 100644 --- a/src/OpenColorIO/Platform.cpp +++ b/src/OpenColorIO/Platform.cpp @@ -22,7 +22,7 @@ namespace OCIO_NAMESPACE const char * GetEnvVariable(const char * name) { - static std::string value; + thread_local std::string value; Platform::Getenv(name, value); return value.c_str(); } @@ -183,12 +183,16 @@ int Strncasecmp(const char * str1, const char * str2, size_t n) void * AlignedMalloc(size_t size, size_t alignment) { #ifdef _WIN32 - return _aligned_malloc(size, alignment); + void * memBlock = _aligned_malloc(size, alignment); #else - void* memBlock = 0x0; - if (!posix_memalign(&memBlock, alignment, size)) return memBlock; - return 0x0; + void* memBlock = nullptr; + if (posix_memalign(&memBlock, alignment, size)) memBlock = nullptr; #endif + if (!memBlock) + { + throw Exception("AlignedMalloc: memory allocation failure."); + } + return memBlock; } void AlignedFree(void* memBlock) diff --git a/src/OpenColorIO/Processor.cpp b/src/OpenColorIO/Processor.cpp index dab0287dfb..992701855f 100755 --- a/src/OpenColorIO/Processor.cpp +++ b/src/OpenColorIO/Processor.cpp @@ -289,6 +289,10 @@ int Processor::Impl::getNumTransforms() const const FormatMetadata & Processor::Impl::getTransformFormatMetadata(int index) const { + if (index < 0 || index >= static_cast(m_ops.size())) + { + throw Exception("Processor::getTransformFormatMetadata: index out of range."); + } auto op = OCIO_DYNAMIC_POINTER_CAST(m_ops[index]); return op->data()->getFormatMetadata(); } @@ -330,15 +334,9 @@ const char * Processor::Impl::getCacheID() const if(!m_cacheID.empty()) return m_cacheID.c_str(); - if(m_ops.empty()) - { - m_cacheID = ""; - } - else - { - const std::string fullstr = m_ops.getCacheID(); - m_cacheID = CacheIDHash(fullstr.c_str(), fullstr.size()); - } + // Note: empty ops vector will also create a UUID. + const std::string fullstr = m_ops.getCacheID(); + m_cacheID = CacheIDHashUUID(fullstr.c_str(), fullstr.size()); return m_cacheID.c_str(); } @@ -352,8 +350,19 @@ OptimizationFlags EnvironmentOverride(OptimizationFlags oFlags) const std::string envFlag = GetEnvVariable(OCIO_OPTIMIZATION_FLAGS_ENVVAR); if (!envFlag.empty()) { - // Use 0 to allow base to be determined by the format. - oFlags = static_cast(std::stoul(envFlag, nullptr, 0)); + try + { + // Use 0 to allow base to be determined by the format. + oFlags = static_cast(std::stoul(envFlag, nullptr, 0)); + } + catch (const std::exception & e) + { + std::string msg("Illegal value for "); + msg += OCIO_OPTIMIZATION_FLAGS_ENVVAR; + msg += ": "; + msg += e.what(); + throw Exception(msg.c_str()); + } } return oFlags; } diff --git a/src/OpenColorIO/ScanlineHelper.cpp b/src/OpenColorIO/ScanlineHelper.cpp index 59a0020a5e..aaa985fa35 100644 --- a/src/OpenColorIO/ScanlineHelper.cpp +++ b/src/OpenColorIO/ScanlineHelper.cpp @@ -143,7 +143,8 @@ void GenericScanlineHelper::prepRGBAScanline(float** buffer, lo &m_inBitDepthBuffer[0], *buffer, m_dstImg.m_width, - m_yIndex * m_dstImg.m_width); + m_yIndex * m_dstImg.m_width, + m_inputBitDepth); } numPixels = m_dstImg.m_width; diff --git a/src/OpenColorIO/SystemMonitor.cpp b/src/OpenColorIO/SystemMonitor.cpp index 8ee5e915e5..7fcc9c3663 100644 --- a/src/OpenColorIO/SystemMonitor.cpp +++ b/src/OpenColorIO/SystemMonitor.cpp @@ -8,6 +8,7 @@ #include +#include "Logging.h" #include "Mutex.h" #include "SystemMonitor.h" @@ -62,7 +63,14 @@ ConstSystemMonitorsRcPtr SystemMonitors::Get() noexcept if (!monitors) { SystemMonitorsRcPtr m = std::make_shared(); - DynamicPtrCast(m)->getAllMonitors(); + try + { + DynamicPtrCast(m)->getAllMonitors(); + } + catch (const std::exception & ex) + { + LogDebug(ex.what()); + } monitors = m; } diff --git a/src/OpenColorIO/TokensManager.h b/src/OpenColorIO/TokensManager.h index 706487289e..b2f02f3b08 100644 --- a/src/OpenColorIO/TokensManager.h +++ b/src/OpenColorIO/TokensManager.h @@ -51,6 +51,7 @@ class TokensManager void addToken(const char * token) { + if (!token || !*token) return; if (findToken(token) == m_tokens.end()) { m_tokens.push_back(StringUtils::Trim(token)); diff --git a/src/OpenColorIO/Transform.cpp b/src/OpenColorIO/Transform.cpp index 74223096fa..061f1f733b 100755 --- a/src/OpenColorIO/Transform.cpp +++ b/src/OpenColorIO/Transform.cpp @@ -49,6 +49,27 @@ void BuildOps(OpRcPtrVec & ops, if(!transform) return; + // Guard against infinite recursion through cycles in the color space / look / view + // transform reference graph (e.g. a ColorSpace whose from_reference is a + // ColorSpaceTransform pointing back to itself). A matching guard in + // CollectContextVariables() catches the same cycles during the earlier context-variable + // scan; this one protects the op-builder traversal. Both are independent from the + // string-level depth check in ResolveContextVariablesImpl, which guards cyclic + // context-variable substitution within a single string. Having the extra guard here + // is necessary for any situations where CollectContextVariables is not called, for + // example, see Config_tests.cpp/cyclic_color_space_linearity_check. + static thread_local int depth = 0; + if (depth > 32) + { + throw Exception("Cycle detected while building ops from transform."); + } + struct DepthGuard + { + int & d; + DepthGuard(int & d_) : d(d_) { ++d; } + ~DepthGuard() { --d; } + } guard(depth); + if(ConstAllocationTransformRcPtr allocationTransform = \ DynamicPtrCast(transform)) { @@ -373,9 +394,10 @@ void CreateTransform(GroupTransformRcPtr & group, ConstOpRcPtr & op) } else { + const auto & ref = *op; std::ostringstream error; error << "CreateTransform from op. Missing implementation for: " - << typeid(op).name(); + << typeid(ref).name(); throw Exception(error.str().c_str()); } diff --git a/src/OpenColorIO/ViewingRules.cpp b/src/OpenColorIO/ViewingRules.cpp index bbe27172c1..2db7d1e499 100644 --- a/src/OpenColorIO/ViewingRules.cpp +++ b/src/OpenColorIO/ViewingRules.cpp @@ -91,7 +91,7 @@ class ViewingRule os << "The rule '" << m_name << "' "; os << "refers to encoding '" << std::string(encName); os << "' that is not used by any of the color spaces."; - LogWarning(os.str()); + LogInfo(os.str()); } } if (numCS + numEnc == 0) diff --git a/src/OpenColorIO/apphelpers/CategoryHelpers.cpp b/src/OpenColorIO/apphelpers/CategoryHelpers.cpp index 33aa2ade2c..08a2249b6f 100644 --- a/src/OpenColorIO/apphelpers/CategoryHelpers.cpp +++ b/src/OpenColorIO/apphelpers/CategoryHelpers.cpp @@ -262,6 +262,7 @@ T Intersection(const T & list0, const T & list1) StringUtils::StringVec ExtractItems(const char * strings) { + if (!strings) return {}; StringUtils::StringVec tmp = StringUtils::Split(StringUtils::Lower(strings), ','); StringUtils::StringVec all; diff --git a/src/OpenColorIO/apphelpers/DisplayViewHelpers.cpp b/src/OpenColorIO/apphelpers/DisplayViewHelpers.cpp index d4055f46c1..4d3aa649e3 100644 --- a/src/OpenColorIO/apphelpers/DisplayViewHelpers.cpp +++ b/src/OpenColorIO/apphelpers/DisplayViewHelpers.cpp @@ -406,7 +406,7 @@ void AddDisplayView(ConfigRcPtr & config, { std::string errMsg; errMsg += "Connection color space name '"; - errMsg += connectionColorSpaceName; + errMsg += connectionColorSpaceName ? connectionColorSpaceName : "(null)"; errMsg += "' does not exist."; throw Exception(errMsg.c_str()); @@ -502,6 +502,8 @@ void AddDisplayView(ConfigRcPtr & config, void RemoveDisplayView(ConfigRcPtr & config, const char * displayName, const char * viewName) { + if (!displayName || !viewName) return; + const std::string name{ config->getDisplayViewColorSpaceName(displayName, viewName) }; const std::string csName{ name.empty() ? displayName : name }; if (csName.empty()) diff --git a/src/OpenColorIO/apphelpers/MixingHelpers.cpp b/src/OpenColorIO/apphelpers/MixingHelpers.cpp index 9f6fa1e396..1895c17a1b 100644 --- a/src/OpenColorIO/apphelpers/MixingHelpers.cpp +++ b/src/OpenColorIO/apphelpers/MixingHelpers.cpp @@ -205,6 +205,11 @@ void MixingColorSpaceManagerImpl::setSelectedMixingSpaceIdx(size_t idx) void MixingColorSpaceManagerImpl::setSelectedMixingSpace(const char * mixingSpace) { + if (!mixingSpace) + { + throw Exception("Invalid null mixing space name."); + } + for (size_t idx = 0 ; idx < m_mixingSpaces.size(); ++idx) { if (m_mixingSpaces[idx] == mixingSpace) @@ -269,6 +274,11 @@ void MixingColorSpaceManagerImpl::setSelectedMixingEncodingIdx(size_t idx) void MixingColorSpaceManagerImpl::setSelectedMixingEncoding(const char * mixingEncoding) { + if (!mixingEncoding) + { + throw Exception("Invalid null mixing encoding name."); + } + for (size_t idx = 0 ; idx < m_mixingEncodings.size(); ++idx) { if (m_mixingEncodings[idx] == mixingEncoding) diff --git a/src/OpenColorIO/apphelpers/mergeconfigs/MergeConfigsHelpers.cpp b/src/OpenColorIO/apphelpers/mergeconfigs/MergeConfigsHelpers.cpp index ab74ed9975..1342d533cd 100644 --- a/src/OpenColorIO/apphelpers/mergeconfigs/MergeConfigsHelpers.cpp +++ b/src/OpenColorIO/apphelpers/mergeconfigs/MergeConfigsHelpers.cpp @@ -477,16 +477,19 @@ ConstConfigRcPtr ConfigMerger::Impl::loadConfig(const char * value) const try { // Try to load the provided config using the search paths. - // Return as soon as they find a valid path. - const std::string resolvedfullpath = pystring::os::path::join(searchpaths[i], - value); + // Return as soon as a valid path is found. + // Normalize the path to prevent directory traversal via '../' sequences. + const std::string resolvedfullpath = pystring::os::path::normpath( + pystring::os::path::join(searchpaths[i], value)); return Config::CreateFromFile(resolvedfullpath.c_str()); } // TODO: If the file exists but won't load, this hides the error. // (Tried using ExceptionMissingFile, but the implementation of that is not what I // expected, Config::CreateFromFile only uses that if the argument is empty, not // if it can't read the file.) - catch(...) { /* don't capture the exception */ } + // There is no need to log a warning here, since this is simply trying the various + // locations on the path that might contain the config. + catch(...) { } } // Try to load the provided base config name as a built-in config. @@ -495,7 +498,9 @@ ConstConfigRcPtr ConfigMerger::Impl::loadConfig(const char * value) const // Check if the base config name is a built-in config. return Config::CreateFromBuiltinConfig(value); } - catch(...) { /* don't capture the exception */ } + // There is no need to log a warning here, since this is simply trying the various + // possible sources for the named config. + catch(...) { } // Must be a reference to a config from a previous merge. for (size_t i = 0; i < m_mergeParams.size(); i++) diff --git a/src/OpenColorIO/apphelpers/mergeconfigs/OCIOMYaml.cpp b/src/OpenColorIO/apphelpers/mergeconfigs/OCIOMYaml.cpp index 3afddf3474..f431c4ccdf 100644 --- a/src/OpenColorIO/apphelpers/mergeconfigs/OCIOMYaml.cpp +++ b/src/OpenColorIO/apphelpers/mergeconfigs/OCIOMYaml.cpp @@ -299,8 +299,7 @@ void OCIOMYaml::loadParams(const YAML::Node & node, ConfigMergingParametersRcPtr } else { - // Handle unsupported property or use default handler. - std::cout << "Unsupported property : " << key << std::endl; + LogWarning("Unsupported property in merge params: " + key); } } } @@ -324,15 +323,34 @@ void OCIOMYaml::load(const YAML::Node& node, ConfigMergerRcPtr & merger, const c load(node["ociom_version"], version); results = StringUtils::Split(version, '.'); - if(results.size() == 1) + bool faulty_version = false; + try { - merger->setVersion(std::stoi(results[0].c_str()), 0); + if(results.size() == 1) + { + merger->setVersion(std::stoi(results[0].c_str()), 0); + } + else if(results.size() == 2) + { + merger->setVersion(std::stoi(results[0].c_str()), + std::stoi(results[1].c_str())); + } + else + { + faulty_version = true; + } } - else if(results.size() == 2) + catch (const std::exception &) { - merger->setVersion(std::stoi(results[0].c_str()), - std::stoi(results[1].c_str())); + faulty_version = true; } + + if (faulty_version) + { + throwValueError(it->second.Tag(), it->first, + "The value '" + version + "' is not a valid OCIOM version."); + } + if (merger->getMajorVersion() > 1u || merger->getMinorVersion() > 0u) { throwValueError(it->second.Tag(), it->first, diff --git a/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.cpp b/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.cpp index bced3f4144..6fd3b7b52f 100644 --- a/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.cpp +++ b/src/OpenColorIO/builtinconfigs/BuiltinConfigRegistry.cpp @@ -34,6 +34,8 @@ namespace OCIO_NAMESPACE // Note that this function does not require initializing the built-in config registry. const char * ResolveConfigPath(const char * originalPath) noexcept { + if (!originalPath) return ""; + static const std::regex uriPattern(R"(ocio:\/\/([^\s]+))"); std::smatch match; const std::string uri = originalPath; diff --git a/src/OpenColorIO/fileformats/FileFormat3DL.cpp b/src/OpenColorIO/fileformats/FileFormat3DL.cpp index c4d90cc776..59f0bdf2a4 100755 --- a/src/OpenColorIO/fileformats/FileFormat3DL.cpp +++ b/src/OpenColorIO/fileformats/FileFormat3DL.cpp @@ -314,6 +314,13 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, // If we've found 3 ints, add it to our 3D LUT. else if(tmpData.size() == 3) { + if (raw3d.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + std::ostringstream os; + os << "Error parsing .3dl file. "; + os << "Too many 3D LUT entries found."; + throw Exception(os.str().c_str()); + } raw3d.push_back(tmpData[0]); raw3d.push_back(tmpData[1]); raw3d.push_back(tmpData[2]); diff --git a/src/OpenColorIO/fileformats/FileFormatCSP.cpp b/src/OpenColorIO/fileformats/FileFormatCSP.cpp index 418edfa570..aa48762ea5 100755 --- a/src/OpenColorIO/fileformats/FileFormatCSP.cpp +++ b/src/OpenColorIO/fileformats/FileFormatCSP.cpp @@ -487,9 +487,16 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { // How many 1D LUT points do we have. nextline (istream, line); - int points1D = std::stoi(line.c_str()); + int points1D = 0; + if (!StringToInt(&points1D, line.c_str())) + { + std::ostringstream os; + os << "A csp 1D LUT with invalid number of entries ("; + os << line << ") in " << fileName << "."; + throw Exception(os.str().c_str()); + } - if (points1D <= 0) + if (points1D <= 0 || points1D > static_cast(Max1DLUTLength)) { std::ostringstream os; os << "A csp 1D LUT with invalid number of entries ("; @@ -563,7 +570,7 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } - if (lutSize <= 0) + if (lutSize <= 0 || lutSize > static_cast(Max3DLUTLength)) { std::ostringstream os; os << "A csp 3D LUT with invalid cube size ("; diff --git a/src/OpenColorIO/fileformats/FileFormatCTF.cpp b/src/OpenColorIO/fileformats/FileFormatCTF.cpp index b1f0393038..d4a0e7e42e 100644 --- a/src/OpenColorIO/fileformats/FileFormatCTF.cpp +++ b/src/OpenColorIO/fileformats/FileFormatCTF.cpp @@ -28,6 +28,7 @@ #include "TransformBuilder.h" #include "transforms/FileTransform.h" #include "utils/StringUtils.h" +#include "HashUtils.h" /* @@ -40,7 +41,14 @@ to agree on a common LUT format for this industry. Support for CLF is a requirement in order to obtain ACES Logo Certification from the Academy (in several product categories). CLF files are expressed using XML. The spec, AMPAS S-2014-006, is available from: - + + +In 2026, SMPTE will publish ST 2136-1 to standardize the Academy/ASC format. +The main change is how versions are declared. The SMPTE spec sets the xmlns +attribute of the ProcessList to a specific value rather than using the +compCLFversion attribute. Since the differences are so minimal, OCIO writes +both the xmlns and compCLFversion in order to maximize compatibility with +different readers. The Autodesk CTF format is based on the Academy/ASC CLF format and adds several operators that allow higher quality results by avoiding the need to bake @@ -146,27 +154,36 @@ class LocalFileFormat : public FileFormat void LocalFileFormat::getFormatInfo(FormatInfoVec & formatInfoVec) const { - FormatInfo info; - info.name = FILEFORMAT_CLF; - info.extension = "clf"; - info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | - FORMAT_CAPABILITY_BAKE | - FORMAT_CAPABILITY_WRITE); - info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT | - FORMAT_BAKE_CAPABILITY_1DLUT | - FORMAT_BAKE_CAPABILITY_1D_3D_LUT); - formatInfoVec.push_back(info); - - FormatInfo info2; - info2.name = FILEFORMAT_CTF; - info2.extension = "ctf"; - info2.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | - FORMAT_CAPABILITY_BAKE | - FORMAT_CAPABILITY_WRITE); - info.bake_capabilities = FormatBakeFlags(FORMAT_BAKE_CAPABILITY_3DLUT | - FORMAT_BAKE_CAPABILITY_1DLUT | - FORMAT_BAKE_CAPABILITY_1D_3D_LUT); - formatInfoVec.push_back(info2); + // CLF - Academy/ASC & SMPTE uses the same format + { + FormatInfo info; + info.name = FILEFORMAT_CLF; + info.extension = "clf"; + info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | + FORMAT_CAPABILITY_BAKE | + FORMAT_CAPABILITY_WRITE); + + info.bake_capabilities = FormatBakeFlags( FORMAT_BAKE_CAPABILITY_3DLUT | + FORMAT_BAKE_CAPABILITY_1DLUT | + FORMAT_BAKE_CAPABILITY_1D_3D_LUT); + formatInfoVec.push_back(info); + } + + // CTF + { + FormatInfo info; + info.name = FILEFORMAT_CTF; + info.extension = "ctf"; + info.capabilities = FormatCapabilityFlags(FORMAT_CAPABILITY_READ | + FORMAT_CAPABILITY_BAKE | + FORMAT_CAPABILITY_WRITE); + + info.bake_capabilities = FormatBakeFlags( FORMAT_BAKE_CAPABILITY_3DLUT | + FORMAT_BAKE_CAPABILITY_1DLUT | + FORMAT_BAKE_CAPABILITY_1D_3D_LUT); + + formatInfoVec.push_back(info); + } } class XMLParserHelper @@ -227,7 +244,7 @@ class XMLParserHelper throwMessage(error); } - if (pT->getOps().empty()) + if (pT->getOpDataVec().empty()) { static const std::string error( "CTF/CLF parsing error: No color operator in file."); @@ -420,7 +437,7 @@ class XMLParserHelper // Start the parsing of one element. static void StartElementHandler(void * userData, - const XML_Char * name, + const XML_Char * name_full, const XML_Char ** atts) { static const std::vector rangeSubElements = { @@ -478,7 +495,7 @@ class XMLParserHelper XMLParserHelper * pImpl = (XMLParserHelper*)userData; - if (!pImpl || !name || !*name) + if (!pImpl || !name_full || !*name_full) { if (!pImpl) { @@ -490,6 +507,14 @@ class XMLParserHelper } } + // Strip the name spaces + const char *name = name_full; + if (pImpl->m_keepNamespaces <= 0) + { + name = strrchr(name_full, ':'); + name = name ? (name+1) : name_full; + } + if (!pImpl->m_elms.empty()) { // Check if we are still processing a metadata structure. @@ -711,12 +736,22 @@ class XMLParserHelper SupportedElement(name, pElt, METADATA_VIEWING_DESCRIPTION, TAG_CDL, recognizedName)) { pImpl->m_elms.push_back( - std::make_shared( + std::make_shared( + name, + pContainer, + pImpl->getXmLineNumber(), + pImpl->getXmlFilename())); + } + else if (SupportedElement(name, pElt, TAG_ID, "", recognizedName)) + { + pImpl->m_elms.push_back( + std::make_shared( name, pContainer, pImpl->getXmLineNumber(), pImpl->getXmlFilename())); } + // Dynamic Property is valid under any operator parent. First // test if the tag is supported to set the recognizedName // accordingly, without testing for parents. Test for the @@ -790,6 +825,8 @@ class XMLParserHelper else if (SupportedElement(name, pElt, TAG_INFO, TAG_PROCESS_LIST, recognizedName)) { + pImpl->m_keepNamespaces++; + pImpl->m_elms.push_back( std::make_shared( name, @@ -801,7 +838,7 @@ class XMLParserHelper TAG_PROCESS_LIST, recognizedName)) { pImpl->m_elms.push_back( - std::make_shared( + std::make_shared( name, pContainer, pImpl->getXmLineNumber(), @@ -838,7 +875,7 @@ class XMLParserHelper TAG_PROCESS_LIST, recognizedName)) { pImpl->m_elms.push_back( - std::make_shared( + std::make_shared( name, pContainer, pImpl->getXmLineNumber(), @@ -992,14 +1029,22 @@ class XMLParserHelper // End the parsing of one element. static void EndElementHandler(void * userData, - const XML_Char * name) + const XML_Char * name_full) { XMLParserHelper * pImpl = (XMLParserHelper*)userData; - if (!pImpl || !name || !*name) + if (!pImpl || !name_full || !*name_full) { throw Exception("CTF/CLF internal parsing error."); } + // Strip the name spaces + const char *name = name_full; + if (pImpl->m_keepNamespaces <= 0) + { + name = strrchr(name_full, ':'); + name = name ? (name+1) : name_full; + } + // Is the expected element present? auto pElt(pImpl->m_elms.back()); if (!pElt.get()) @@ -1054,6 +1099,12 @@ class XMLParserHelper } } + // Exiting the info element; decrease keep namespace counter. + if(std::dynamic_pointer_cast(pElt)) + { + pImpl->m_keepNamespaces--; + } + pElt->end(); } @@ -1086,15 +1137,29 @@ class XMLParserHelper pImpl->throwMessage(oss.str()); } - auto pDescriptionElt = - std::dynamic_pointer_cast(pElt); - if (pDescriptionElt) + // TODO: Fix this special case handling where description elements want + // leading and trailing white space retained. + if (auto pDescriptionElt = std::dynamic_pointer_cast(pElt)) { pDescriptionElt->setRawData(s, len, pImpl->getXmLineNumber()); } + if (auto pDescElt = std::dynamic_pointer_cast(pElt)) + { + pDescElt->setRawData(s, len, pImpl->getXmLineNumber()); + } else { // Strip white spaces. + + // TODO: Need to change this. CharacterDataHandler() may be called + // multiple times for a single element, and we may end up stripping + // white spaces that are actually part of the data. Other parts of + // the code already anticipate partial text reception, this part is + // not handling that possibility. White space removal should be done by + // the element handlers at the end. Also the special case handling + // doesn't belong here. This part is dispatching the strings to the + // elements, it shouldn't know the identities of the handlers and + // should not change the behavior accordingly. size_t start = 0; size_t end = len; FindSubString(s, len, start, end); @@ -1160,6 +1225,7 @@ class XMLParserHelper bool m_isCLF; XmlReaderElementStack m_elms; // Parsing stack CTFReaderTransformPtr m_transform; + int m_keepNamespaces = 0; // if >0, name spaces will be preserved }; @@ -1167,8 +1233,10 @@ bool isLoadableCTF(std::istream & istream) { std::streampos curPos = istream.tellg(); - const unsigned limit(5 * 1024); // 5 kilobytes. - const char *pattern = "m_transform->toMetadata(processorData); // Resolve reference path using context and load referenced files. - const ConstOpDataVec & opDataVec = cachedFile->m_transform->getOps(); + const ConstOpDataVec & opDataVec = cachedFile->m_transform->getOpDataVec(); // Try to use the FileTransform interpolation for any Lut1D or Lut3D that does not specify // an interpolation in the CTF itself. If the interpolation can not be used, ignore it. @@ -1558,14 +1633,19 @@ void LocalFileFormat::write(const ConstConfigRcPtr & config, const std::string & formatName, std::ostream & ostream) const { - bool isCLF = false; + + TransformWriter::SubFormat subFormat{TransformWriter::SubFormat::FORMAT_UNKNOWN}; + if (Platform::Strcasecmp(formatName.c_str(), FILEFORMAT_CLF) == 0) { - isCLF = true; - } - else if (Platform::Strcasecmp(formatName.c_str(), FILEFORMAT_CTF) != 0) + subFormat = TransformWriter::SubFormat::FORMAT_CLF; + } + else if (Platform::Strcasecmp(formatName.c_str(), FILEFORMAT_CTF) == 0) + { + subFormat = TransformWriter::SubFormat::FORMAT_CTF; + } + else { - // Neither a clf nor a ctf. std::ostringstream os; os << "Error: CLF/CTF writer does not also write format " << formatName << "."; throw Exception(os.str().c_str()); @@ -1583,11 +1663,21 @@ void LocalFileFormat::write(const ConstConfigRcPtr & config, const FormatMetadataImpl & metadata = group.getFormatMetadata(); CTFReaderTransformPtr transform = std::make_shared(ops, metadata); + // It it doesn't have an id, create one based on the op list. + if (transform->getID().empty()) + { + std::string opId = ops.getCacheID(); + + std::ostringstream ss; + ss << "urn:uuid:" << CacheIDHashUUID(opId.c_str(), opId.size()); + transform->setID(ss.str().c_str()); + } + // Write XML Header. ostream << "" << std::endl; XmlFormatter fmt(ostream); - TransformWriter writer(fmt, transform, isCLF); + TransformWriter writer(fmt, transform, subFormat); writer.write(); } diff --git a/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp b/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp index 6a76d968d4..d22de1ba3c 100755 --- a/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp +++ b/src/OpenColorIO/fileformats/FileFormatDiscreet1DL.cpp @@ -275,15 +275,13 @@ bool Lut1dUtils::IMLutAlloc(IMLutStruct **plut, int num, int length) // targetBitDepth will be set appropriately for conversion LUTs in IMLutGet lut->targetBitDepth = IMLutTableSizeToBitDepth(length); - lut->tables = (unsigned short **)malloc(4 * sizeof(unsigned short *)); + lut->tables = (unsigned short **)calloc(4, sizeof(unsigned short *)); if (lut->tables == NULL) { delete lut; lut = 0; return false; } - for (i = 0; i < num; i++) - lut->tables[i] = NULL; for (i = 0; i < num; i++) { lut->tables[i] = (unsigned short *)malloc(length * sizeof(unsigned short)); @@ -324,7 +322,15 @@ static int tableLoad( if (isdigit(*InString)) { - ptable[Count++] = (unsigned short)std::stoi(InString); + try + { + ptable[Count++] = (unsigned short)std::stoi(InString); + } + catch (const std::exception &) + { + errorLine = InString; + return Lut1dUtils::IMLUT_ERR_SYNTAX; + } if (Count >= length) break; } @@ -404,22 +410,34 @@ int Lut1dUtils::IMLutGet( } // Load first table value. - (lut->tables[0])[0] = (unsigned short)std::stoi(InString); + try + { + (lut->tables[0])[0] = (unsigned short)std::stoi(InString); + } + catch (const std::exception &) + { + errorLine = InString; + status = IMLUT_ERR_SYNTAX; + IMLutFree(&lut); + *plut = 0; + goto load_abort; + } tablestart = 1; } else { char dstDepthS[16] = ""; #ifdef _WIN32 - const int nummatched = sscanf(InString, "%*s %d %d %s", &numtables, &length, dstDepthS, 16); + const int nummatched = sscanf_s(InString, "%*s %d %d %15s", &numtables, &length, dstDepthS, 16); #else - const int nummatched = sscanf(InString, "%*s %d %d %s", &numtables, &length, dstDepthS); + const int nummatched = sscanf(InString, "%*s %d %d %15s", &numtables, &length, dstDepthS); #endif std::string subStr(InString, 5); if (nummatched < 2 || StringUtils::Lower(subStr) != "lut: " || (numtables != 1 && numtables != 3 && numtables != 4) || - length <= 0) + length <= 0 || + length > 65536) { errorLine = InString; status = IMLUT_ERR_SYNTAX; @@ -435,7 +453,7 @@ int Lut1dUtils::IMLutGet( int dstDepth = 0; char floatC = ' '; #ifdef _WIN32 - sscanf(dstDepthS, "%d%c", &dstDepth, &floatC, 1); + sscanf_s(dstDepthS, "%d%c", &dstDepth, &floatC, 1); #else sscanf(dstDepthS, "%d%c", &dstDepth, &floatC); #endif diff --git a/src/OpenColorIO/fileformats/FileFormatHDL.cpp b/src/OpenColorIO/fileformats/FileFormatHDL.cpp index 16e0ffab53..f2ca6c0059 100755 --- a/src/OpenColorIO/fileformats/FileFormatHDL.cpp +++ b/src/OpenColorIO/fileformats/FileFormatHDL.cpp @@ -189,6 +189,13 @@ readLuts(std::istream& istream, if (result.ec == std::errc()) { + // Cap per-LUT entry count: max is Max3DLUTLength^3 * 3 for a 3D LUT. + if (lutValues[lutname].size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + std::ostringstream os; + os << "Too many values in " << lutname << " LUT block"; + throw Exception(os.str().c_str()); + } lutValues[lutname].push_back(v); } else @@ -452,6 +459,13 @@ LocalFileFormat::read(std::istream & istream, // Set cube size size_3d = lut_sizes[0]; + if(size_3d < 2 || size_3d > static_cast(Max3DLUTLength)) + { + std::ostringstream os; + os << "3D LUT cube size must be between 2 and " << Max3DLUTLength << ", found: " << size_3d; + throw Exception(os.str().c_str()); + } + lut3d_ptr = std::make_shared(lut_sizes[0]); if (Lut3DOpData::IsValidInterpolation(interp)) { @@ -463,11 +477,23 @@ LocalFileFormat::read(std::istream & istream, if(cachedFile->hdltype == "c") { size_1d = lut_sizes[0]; + if(size_1d < 2 || size_1d > static_cast(Max1DLUTLength)) + { + std::ostringstream os; + os << "1D LUT size must be between 2 and " << Max1DLUTLength << ", found: " << size_1d; + throw Exception(os.str().c_str()); + } } if(cachedFile->hdltype == "3d+1d") { size_prelut = lut_sizes[1]; + if(size_prelut < 2 || size_prelut > static_cast(Max1DLUTLength)) + { + std::ostringstream os; + os << "Prelut size must be between 2 and " << Max1DLUTLength << ", found: " << size_prelut; + throw Exception(os.str().c_str()); + } } } diff --git a/src/OpenColorIO/fileformats/FileFormatICC.cpp b/src/OpenColorIO/fileformats/FileFormatICC.cpp index 4768101129..be105bf6d0 100755 --- a/src/OpenColorIO/fileformats/FileFormatICC.cpp +++ b/src/OpenColorIO/fileformats/FileFormatICC.cpp @@ -15,7 +15,6 @@ #include "ops/gamma/GammaOp.h" #include "ops/lut1d/Lut1DOp.h" #include "ops/matrix/MatrixOp.h" -#include "ops/range/RangeOp.h" #include "Platform.h" #include "transforms/FileTransform.h" @@ -181,9 +180,14 @@ LocalCachedFileRcPtr LocalFileFormat::ReadInfo(std::istream & istream, ThrowErrorMessage("Error loading number of tags.", fileName); } + constexpr icUInt32Number MaxNumICCTags = 100; + if (count > MaxNumICCTags) + { + ThrowErrorMessage("Too many tags in ICC profile.", fileName); + } icc.mTags.resize(count); - // Read Tag offset table. + // Read Tag offset table. for (i = 0; imGammaRGB[1] }; const GammaOpData::Params blueParams = { cachedFile->mGammaRGB[2] }; const GammaOpData::Params alphaParams = { cachedFile->mGammaRGB[3] }; - auto gamma = std::make_shared(GammaOpData::BASIC_FWD, + auto gamma = std::make_shared(GammaOpData::BASIC_MIRROR_FWD, redParams, greenParams, blueParams, alphaParams); - // GammaOp will clamp at 0 so we don't do it in the RangeOp. - CreateRangeOp(ops, - RangeOpData::EmptyValue(), 1, - RangeOpData::EmptyValue(), 1, - TRANSFORM_DIR_FORWARD); - CreateGammaOp(ops, gamma, TRANSFORM_DIR_FORWARD); } @@ -859,18 +867,13 @@ LocalFileFormat::buildFileOps(OpRcPtrVec & ops, const GammaOpData::Params greenParams = { cachedFile->mGammaRGB[1] }; const GammaOpData::Params blueParams = { cachedFile->mGammaRGB[2] }; const GammaOpData::Params alphaParams = { cachedFile->mGammaRGB[3] }; - auto gamma = std::make_shared(GammaOpData::BASIC_REV, + auto gamma = std::make_shared(GammaOpData::BASIC_MIRROR_REV, redParams, greenParams, blueParams, alphaParams); CreateGammaOp(ops, gamma, TRANSFORM_DIR_FORWARD); - - CreateRangeOp(ops, - RangeOpData::EmptyValue(), 1, - RangeOpData::EmptyValue(), 1, - TRANSFORM_DIR_FORWARD); } break; } diff --git a/src/OpenColorIO/fileformats/FileFormatIridasCube.cpp b/src/OpenColorIO/fileformats/FileFormatIridasCube.cpp index ca2965e373..b6da8d7e81 100755 --- a/src/OpenColorIO/fileformats/FileFormatIridasCube.cpp +++ b/src/OpenColorIO/fileformats/FileFormatIridasCube.cpp @@ -205,6 +205,16 @@ LocalFileFormat::read(std::istream & istream, line); } + if (size1d < 2 || size1d > static_cast(Max1DLUTLength)) + { + ThrowErrorMessage( + ("'LUT_1D_SIZE' must be between 2 and " + + std::to_string(Max1DLUTLength) + ".").c_str(), + fileName, + lineNumber, + line); + } + raw.reserve(3*size1d); in1d = true; } @@ -231,6 +241,16 @@ LocalFileFormat::read(std::istream & istream, line); } + if (size3d < 2 || size3d > static_cast(Max3DLUTLength)) + { + ThrowErrorMessage( + ("'LUT_3D_SIZE' must be between 2 and " + + std::to_string(Max3DLUTLength) + ".").c_str(), + fileName, + lineNumber, + line); + } + raw.reserve(3*size3d*size3d*size3d); in3d = true; } @@ -241,9 +261,9 @@ LocalFileFormat::read(std::istream & istream, char domainMinB[64] = ""; #ifdef _WIN32 - if (sscanf_s(line.c_str(), "domain_min %s %s %s %c", domainMinR, 64, domainMinG, 64, domainMinB, 64, &endTok, 1) != 3) + if (sscanf_s(line.c_str(), "domain_min %63s %63s %63s %c", domainMinR, 64, domainMinG, 64, domainMinB, 64, &endTok, 1) != 3) #else - if (sscanf(line.c_str(), "domain_min %s %s %s %c", domainMinR, domainMinG, domainMinB, &endTok) != 3) + if (sscanf(line.c_str(), "domain_min %63s %63s %63s %c", domainMinR, domainMinG, domainMinB, &endTok) != 3) #endif { ThrowErrorMessage( @@ -275,9 +295,9 @@ LocalFileFormat::read(std::istream & istream, char domainMaxB[64] = ""; #ifdef _WIN32 - if (sscanf_s(line.c_str(), "domain_max %s %s %s %c", domainMaxR, 64, domainMaxG, 64, domainMaxB, 64, &endTok, 1) != 3) + if (sscanf_s(line.c_str(), "domain_max %63s %63s %63s %c", domainMaxR, 64, domainMaxG, 64, domainMaxB, 64, &endTok, 1) != 3) #else - if (sscanf(line.c_str(), "domain_max %s %s %s %c", domainMaxR, domainMaxG, domainMaxB, &endTok) != 3) + if (sscanf(line.c_str(), "domain_max %63s %63s %63s %c", domainMaxR, domainMaxG, domainMaxB, &endTok) != 3) #endif { ThrowErrorMessage( @@ -322,9 +342,9 @@ LocalFileFormat::read(std::istream & istream, char valB[64] = ""; #ifdef _WIN32 - if (sscanf_s(line.c_str(), "%s %s %s %c", valR, 64, valG, 64, valB, 64, &endTok, 1) != 3) + if (sscanf_s(line.c_str(), "%63s %63s %63s %c", valR, 64, valG, 64, valB, 64, &endTok, 1) != 3) #else - if (sscanf(line.c_str(), "%s %s %s %c", valR, valG, valB, &endTok) != 3) + if (sscanf(line.c_str(), "%63s %63s %63s %c", valR, valG, valB, &endTok) != 3) #endif { // It must be a float triple! diff --git a/src/OpenColorIO/fileformats/FileFormatIridasItx.cpp b/src/OpenColorIO/fileformats/FileFormatIridasItx.cpp index ae6282efb8..b7f84c59fa 100755 --- a/src/OpenColorIO/fileformats/FileFormatIridasItx.cpp +++ b/src/OpenColorIO/fileformats/FileFormatIridasItx.cpp @@ -165,6 +165,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, lineNumber, line); } + if (size < 2 || size > static_cast(Max3DLUTLength)) + { + ThrowErrorMessage( + ("LUT_3D_SIZE must be between 2 and " + + std::to_string(Max3DLUTLength) + ".").c_str(), + fileName, + lineNumber, + line); + } size3d = size; raw.reserve(3*size3d * size3d * size3d); @@ -184,6 +193,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } + if (raw.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + ThrowErrorMessage( + "Too many 3D LUT entries.", + fileName, + lineNumber, + line); + } + for(int i=0; i<3; ++i) { raw.push_back(tmpfloats[i]); diff --git a/src/OpenColorIO/fileformats/FileFormatIridasLook.cpp b/src/OpenColorIO/fileformats/FileFormatIridasLook.cpp index 0ba209a905..e2c30cbf5f 100755 --- a/src/OpenColorIO/fileformats/FileFormatIridasLook.cpp +++ b/src/OpenColorIO/fileformats/FileFormatIridasLook.cpp @@ -429,6 +429,13 @@ class XMLParserHelper os << "'. Expected quoted integer"; pImpl->Throw(os.str().c_str()); } + if (size_3d < 2 || size_3d > static_cast(Max3DLUTLength)) + { + std::ostringstream os; + os << "Invalid LUT size value: '" << size_raw; + os << "'. Expected value between 2 and " << Max3DLUTLength; + pImpl->Throw(os.str().c_str()); + } pImpl->m_lutSize = static_cast(size_3d); } else if (pImpl->m_data) @@ -441,7 +448,11 @@ class XMLParserHelper StringUtils::ReplaceInPlace(what, "\"", ""); StringUtils::ReplaceInPlace(what, "'", ""); StringUtils::ReplaceInPlace(what, "\n", ""); - // Append to lut string + // Append to lut string (cap at max possible: Max3DLUTLength^3 entries * 3 floats * 8 hex chars) + if (pImpl->m_lutString.size() + what.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3 * 8) + { + pImpl->Throw("Too many characters in 'data' block"); + } pImpl->m_lutString += what; } } diff --git a/src/OpenColorIO/fileformats/FileFormatPandora.cpp b/src/OpenColorIO/fileformats/FileFormatPandora.cpp index 6d36321527..0d2baf5ea5 100755 --- a/src/OpenColorIO/fileformats/FileFormatPandora.cpp +++ b/src/OpenColorIO/fileformats/FileFormatPandora.cpp @@ -156,6 +156,16 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, lineNumber, line); } + if (inval < 8 || inval > static_cast(Max3DLUTLength * Max3DLUTLength * Max3DLUTLength)) + { + ThrowErrorMessage( + ("'in' value must be between 8 and " + + std::to_string(Max3DLUTLength * Max3DLUTLength * Max3DLUTLength) + + " (" + std::to_string(Max3DLUTLength) + "^3).").c_str(), + fileName, + lineNumber, + line); + } raw3d.reserve(inval*3); lutEdgeLen = Get3DLutEdgeLenFromNumPixels(inval); } @@ -213,6 +223,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } + if (raw3d.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + ThrowErrorMessage( + "Too many 3D LUT entries.", + fileName, + lineNumber, + line); + } + raw3d.push_back(tmpints[1]); raw3d.push_back(tmpints[2]); raw3d.push_back(tmpints[3]); diff --git a/src/OpenColorIO/fileformats/FileFormatResolveCube.cpp b/src/OpenColorIO/fileformats/FileFormatResolveCube.cpp index 6b5e0da8d7..cb43e2be71 100755 --- a/src/OpenColorIO/fileformats/FileFormatResolveCube.cpp +++ b/src/OpenColorIO/fileformats/FileFormatResolveCube.cpp @@ -336,6 +336,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } + if (size1d < 2 || size1d > static_cast(Max1DLUTLength)) + { + ThrowErrorMessage( + ("LUT_1D_SIZE must be between 2 and " + + std::to_string(Max1DLUTLength) + ".").c_str(), + fileName, + lineNumber, + line); + } raw1d.reserve(3*size1d); has1d = true; } @@ -359,6 +368,15 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, line); } + if (size3d < 2 || size3d > static_cast(Max3DLUTLength)) + { + ThrowErrorMessage( + ("LUT_3D_SIZE must be between 2 and " + + std::to_string(Max3DLUTLength) + ".").c_str(), + fileName, + lineNumber, + line); + } raw3d.reserve(3*size3d*size3d*size3d); has3d = true; } @@ -410,6 +428,14 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, } else { + if (raw3d.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + ThrowErrorMessage( + "Too many 3D LUT entries.", + fileName, + lineNumber, + line); + } raw3d.push_back(tmpfloats[i]); } } diff --git a/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp b/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp index 1cdc51b22c..c63e22ad25 100755 --- a/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp +++ b/src/OpenColorIO/fileformats/FileFormatSpi1D.cpp @@ -135,9 +135,9 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, char fromMinS[64] = ""; char fromMaxS[64] = ""; #ifdef _WIN32 - if (sscanf_s(lineBuffer, "From %s %s", fromMinS, 64, fromMaxS, 64) != 2) + if (sscanf_s(lineBuffer, "From %63s %63s", fromMinS, 64, fromMaxS, 64) != 2) #else - if (sscanf(lineBuffer, "From %s %s", fromMinS, fromMaxS) != 2) + if (sscanf(lineBuffer, "From %63s %63s", fromMinS, fromMaxS) != 2) #endif { ThrowErrorMessage("Invalid 'From' Tag", currentLine, headerLine); @@ -179,6 +179,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { ThrowErrorMessage("Could not find 'Length' Tag", -1, ""); } + if (lut_size < 2 || lut_size > static_cast(Max1DLUTLength)) + { + ThrowErrorMessage( + ("'Length' must be between 2 and " + std::to_string(Max1DLUTLength)).c_str(), + -1, ""); + } if (components == -1) { ThrowErrorMessage("Could not find 'Components' Tag", -1, ""); @@ -219,11 +225,11 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, char inputLUT[4][64] = {"", "", "", ""}; #ifdef _WIN32 - if (sscanf_s(lineBuffer, "%s %s %s %63s", inputLUT[0], 64, + if (sscanf_s(lineBuffer, "%63s %63s %63s %63s", inputLUT[0], 64, inputLUT[1], 64, inputLUT[2], 64, inputLUT[3], 64) != components) #else - if (sscanf(lineBuffer, "%s %s %s %63s", inputLUT[0], + if (sscanf(lineBuffer, "%63s %63s %63s %63s", inputLUT[0], inputLUT[1], inputLUT[2], inputLUT[3]) != components) #endif { diff --git a/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp b/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp index c3ef153f43..af8150254e 100755 --- a/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp +++ b/src/OpenColorIO/fileformats/FileFormatSpi3D.cpp @@ -128,6 +128,17 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } + if (rSize < 2 || rSize > static_cast(Max3DLUTLength)) + { + std::ostringstream os; + os << "Error parsing .spi3d file ("; + os << fileName; + os << "). "; + os << "LUT size must be between 2 and " << Max3DLUTLength << ". Found: '"; + os << lineBuffer << "'."; + throw Exception(os.str().c_str()); + } + Lut3DOpDataRcPtr lut3d = std::make_shared((unsigned long)rSize); if (Lut3DOpData::IsValidInterpolation(interp)) { @@ -153,14 +164,13 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, char blueValueS[64] = ""; #ifdef _WIN32 - if (sscanf(lineBuffer, - "%d %d %d %s %s %s", + if (sscanf_s(lineBuffer, "%d %d %d %63s %63s %63s", &rIndex, &gIndex, &bIndex, redValueS, 64, greenValueS, 64, blueValueS, 64) == 6) #else - if (sscanf(lineBuffer, "%d %d %d %s %s %s", + if (sscanf(lineBuffer, "%d %d %d %63s %63s %63s", &rIndex, &gIndex, &bIndex, redValueS, greenValueS, blueValueS) == 6) #endif diff --git a/src/OpenColorIO/fileformats/FileFormatSpiMtx.cpp b/src/OpenColorIO/fileformats/FileFormatSpiMtx.cpp index 663a4e9a5d..87c15182dd 100755 --- a/src/OpenColorIO/fileformats/FileFormatSpiMtx.cpp +++ b/src/OpenColorIO/fileformats/FileFormatSpiMtx.cpp @@ -68,23 +68,23 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, Interpolation /*interp*/) const { - // Read the entire file. - std::ostringstream fileStream; - + // Read the entire file (capped: a valid spimtx file contains exactly 12 floats). + constexpr size_t MAX_FILE_SIZE = 1024; + char fileBuf[MAX_FILE_SIZE]; + istream.read(fileBuf, MAX_FILE_SIZE); + const std::streamsize bytesRead = istream.gcount(); + if (!istream.eof()) { - const int MAX_LINE_SIZE = 4096; - char lineBuffer[MAX_LINE_SIZE]; - - while (istream.good()) - { - istream.getline(lineBuffer, MAX_LINE_SIZE); - fileStream << std::string(lineBuffer) << " "; - } + std::ostringstream os; + os << "Error parsing .spimtx file ("; + os << fileName << "). "; + os << "File is too large to be a valid .spimtx file."; + throw Exception(os.str().c_str()); } // Turn it into parts - const StringUtils::StringVec lineParts - = StringUtils::SplitByWhiteSpaces(StringUtils::Trim(fileStream.str())); + const StringUtils::StringVec lineParts + = StringUtils::SplitByWhiteSpaces(StringUtils::Trim(std::string(fileBuf, bytesRead))); if(lineParts.size() != 12) { diff --git a/src/OpenColorIO/fileformats/FileFormatTruelight.cpp b/src/OpenColorIO/fileformats/FileFormatTruelight.cpp index 0d95261cc3..1c5b9452e2 100755 --- a/src/OpenColorIO/fileformats/FileFormatTruelight.cpp +++ b/src/OpenColorIO/fileformats/FileFormatTruelight.cpp @@ -149,6 +149,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, throw Exception(os.str().c_str()); } + if (size3d[0] < 2 || size3d[0] > static_cast(Max3DLUTLength)) + { + throw Exception(("Truelight .cub LUT grid size must be between 2 and " + + std::to_string(Max3DLUTLength) + ".").c_str()); + } + raw3d.reserve(3*size3d[0]*size3d[1]*size3d[2]); } else if(parts[1] == "lutlength") @@ -158,6 +164,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { throw Exception("Malformed lutlength tag in Truelight .cub LUT."); } + if (size1d < 2 || size1d > static_cast(Max1DLUTLength)) + { + throw Exception(("Truelight .cub LUT lutlength must be between 2 and " + + std::to_string(Max1DLUTLength) + ".").c_str()); + } + raw1d.reserve(3*size1d); } else if(parts[1] == "inputlut") @@ -187,12 +199,20 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { if(in1d) { + if (raw1d.size() > Max1DLUTLength * 3) + { + throw Exception("Too many 1D LUT entries in Truelight .cub LUT."); + } raw1d.push_back(tmpfloats[0]); raw1d.push_back(tmpfloats[1]); raw1d.push_back(tmpfloats[2]); } else if(in3d) { + if (raw3d.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + throw Exception("Too many 3D LUT entries in Truelight .cub LUT."); + } raw3d.push_back(tmpfloats[0]); raw3d.push_back(tmpfloats[1]); raw3d.push_back(tmpfloats[2]); diff --git a/src/OpenColorIO/fileformats/FileFormatVF.cpp b/src/OpenColorIO/fileformats/FileFormatVF.cpp index 9026030344..736bf2cc19 100755 --- a/src/OpenColorIO/fileformats/FileFormatVF.cpp +++ b/src/OpenColorIO/fileformats/FileFormatVF.cpp @@ -158,6 +158,14 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, fileName, lineNumber, line); } + if (size3d[0] < 2 || size3d[0] > static_cast(Max3DLUTLength)) + { + ThrowErrorMessage( + ("Grid size must be between 2 and " + + std::to_string(Max3DLUTLength) + ".").c_str(), + fileName, lineNumber, line); + } + raw3d.reserve(3*size3d[0]*size3d[1]*size3d[2]); } else if(parts[0] == "global_transform") @@ -190,6 +198,12 @@ CachedFileRcPtr LocalFileFormat::read(std::istream & istream, { if(StringVecToFloatVec(tmpfloats, parts) && (tmpfloats.size() == 3)) { + if (raw3d.size() > Max3DLUTLength * Max3DLUTLength * Max3DLUTLength * 3) + { + ThrowErrorMessage( + "Too many 3D LUT entries.", + fileName, lineNumber, line); + } raw3d.push_back(tmpfloats[0]); raw3d.push_back(tmpfloats[1]); raw3d.push_back(tmpfloats[2]); diff --git a/src/OpenColorIO/fileformats/FormatMetadata.cpp b/src/OpenColorIO/fileformats/FormatMetadata.cpp index 8b5fe1cfad..345cb1bf38 100644 --- a/src/OpenColorIO/fileformats/FormatMetadata.cpp +++ b/src/OpenColorIO/fileformats/FormatMetadata.cpp @@ -19,6 +19,9 @@ const char * METADATA_INFO = "Info"; const char * METADATA_INPUT_DESCRIPTOR = "InputDescriptor"; const char * METADATA_OUTPUT_DESCRIPTOR = "OutputDescriptor"; +// CLF XML elements described in ST2136-1 +const char * METADATA_ID_ELEMENT = "Id"; + // NAME and ID are CLF XML attributes described in S-2014-006. const char * METADATA_NAME = "name"; const char * METADATA_ID = "id"; @@ -216,6 +219,20 @@ int FormatMetadataImpl::getFirstChildIndex(const std::string & name) const noexc return -1; } +FormatMetadataImpl::Elements FormatMetadataImpl::getChildrenElements( + const std::string & name) const noexcept +{ + Elements subElements; + for (auto & it : m_elements) + { + if (0 == Platform::Strcasecmp(name.c_str(), it.getElementName())) + { + subElements.push_back(it); + } + } + return subElements; +} + int FormatMetadataImpl::findNamedAttribute(const std::string & name) const noexcept { int i = 0; diff --git a/src/OpenColorIO/fileformats/FormatMetadata.h b/src/OpenColorIO/fileformats/FormatMetadata.h index 35c8cb2e01..6f26f2afb2 100644 --- a/src/OpenColorIO/fileformats/FormatMetadata.h +++ b/src/OpenColorIO/fileformats/FormatMetadata.h @@ -55,6 +55,9 @@ class FormatMetadataImpl : public FormatMetadata // Retrieve the vector of elements under the metadata. Elements & getChildrenElements() noexcept; const Elements & getChildrenElements() const noexcept; + + // Returns all of the children elements matching the given name. + Elements getChildrenElements(const std::string & name) const noexcept; // Merge rhs into this. Expected to be used on root FormatMetadataImpl for ops. void combine(const FormatMetadataImpl & rhs); diff --git a/src/OpenColorIO/fileformats/cdl/CDLParser.cpp b/src/OpenColorIO/fileformats/cdl/CDLParser.cpp index 1c02d7670e..e2945bdfbb 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLParser.cpp +++ b/src/OpenColorIO/fileformats/cdl/CDLParser.cpp @@ -368,7 +368,6 @@ void CDLParser::Impl::reset() m_elms.clear(); m_lineNumber = 0; - m_fileName = ""; m_isCC = false; m_isCCC = false; } @@ -897,6 +896,11 @@ void CDLParser::Impl::CharacterDataHandler(void *userData, // Parsing a single new line. This is valid. if (len == 1 && s[0] == '\n') return; + if (pImpl->m_elms.empty()) + { + pImpl->throwMessage("Unexpected character data before root element"); + } + ElementRcPtr pElt = pImpl->m_elms.back(); if (!pElt) { diff --git a/src/OpenColorIO/fileformats/cdl/CDLParser.h b/src/OpenColorIO/fileformats/cdl/CDLParser.h index 0e5471b005..ddeee5a262 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLParser.h +++ b/src/OpenColorIO/fileformats/cdl/CDLParser.h @@ -20,7 +20,7 @@ class CDLParser { public: explicit CDLParser(const std::string& xmlFile); - virtual ~CDLParser(); + ~CDLParser(); void parse(std::istream & istream) const; diff --git a/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.cpp b/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.cpp index 38eaab76dd..c85d7b160e 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.cpp +++ b/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.cpp @@ -77,11 +77,10 @@ void CDLReaderColorCorrectionElt::setCDLParsingInfo(const CDLParsingInfoRcPtr & m_parsingInfo = pTransformList; } -void CDLReaderColorCorrectionElt::appendMetadata(const std::string & name, const std::string & value) +void CDLReaderColorCorrectionElt::appendMetadata(FormatMetadataImpl& metadata) { // Keeps description as metadata with supplied name. - FormatMetadataImpl item(name, value); - m_transformData->getFormatMetadata().getChildrenElements().push_back(item); + m_transformData->getFormatMetadata().getChildrenElements().push_back(metadata); } } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.h b/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.h index b67e4e2144..4b3b613e7f 100644 --- a/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.h +++ b/src/OpenColorIO/fileformats/cdl/CDLReaderHelper.h @@ -54,9 +54,9 @@ class CDLReaderColorDecisionListElt : public XmlReaderContainerElt return m_parsingInfo; } - void appendMetadata(const std::string & name, const std::string & value) override + void appendMetadata(FormatMetadataImpl& metadata) override { - m_parsingInfo->m_metadata.addChildElement(name.c_str(), value.c_str()); + m_parsingInfo->m_metadata.getChildrenElements().push_back(metadata); } const FormatMetadataImpl & getMetadata() const @@ -89,9 +89,9 @@ class CDLReaderColorDecisionElt : public XmlReaderComplexElt { } - void appendMetadata(const std::string & name, const std::string & value) override + void appendMetadata(FormatMetadataImpl& metadata) override { - m_metadata.addChildElement(name.c_str(), value.c_str()); + m_metadata.getChildrenElements().push_back(metadata); } @@ -138,9 +138,9 @@ class CDLReaderColorCorrectionCollectionElt : public XmlReaderContainerElt return m_parsingInfo; } - void appendMetadata(const std::string & name, const std::string & value) override + void appendMetadata(FormatMetadataImpl& metadata) override { - m_parsingInfo->m_metadata.addChildElement(name.c_str(), value.c_str()); + m_parsingInfo->m_metadata.getChildrenElements().push_back(metadata); } const FormatMetadataImpl & getMetadata() const @@ -169,7 +169,7 @@ class CDLReaderColorCorrectionElt : public XmlReaderComplexElt void setCDLParsingInfo(const CDLParsingInfoRcPtr & parsingInfo); - void appendMetadata(const std::string & name, const std::string & value) override; + void appendMetadata(FormatMetadataImpl& metadata) override; private: CDLParsingInfoRcPtr m_parsingInfo; diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp index 79393fc489..60e72b42c8 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.cpp @@ -60,6 +60,7 @@ void CTFReaderTransformElt::start(const char ** atts) bool isIdFound = false; bool isVersionFound = false; bool isCLFVersionFound = false; + bool isSMPTEVersionFound = false; CTFVersion requestedVersion(0, 0); CTFVersion requestedCLFVersion(0, 0); @@ -70,12 +71,40 @@ void CTFReaderTransformElt::start(const char ** atts) { if (!atts[i + 1] || !*atts[i + 1]) { - throwMessage("Required attribute 'id' does not have a value."); + throwMessage("Attribute 'id' does not have a value."); } - m_transform->setID(atts[i + 1]); + m_transform->getFormatMetadata().addAttribute(ATTR_ID, atts[i + 1]); isIdFound = true; } + else if (0 == Platform::Strcasecmp(ATTR_XMLNS, atts[i])) + { + if (!atts[i + 1] || !*atts[i + 1]) + { + throwMessage("Attribute 'xmlns' does not have a value."); + } + + // Check if xmlns atrribute holds a SMPTE version string. + try + { + auto version = CTFVersion(atts[i + 1], CTFVersion::StringFormat::VERSION_SMPTE_XMLNS); + requestedVersion = CTF_PROCESS_LIST_VERSION_2_0; + requestedCLFVersion = version; + isSMPTEVersionFound = true; + m_isCLF = true; + } + catch (Exception& /*e*/) + { + // Ignore other xmlns attribute strings. + } + + // Disallow Version and version-holding xmlns appering togather. + // Note that compCLFversion can appear together with xmlns. + if (isVersionFound && isSMPTEVersionFound) + { + throwMessage("SMPTE 'xmlns' version and 'Version' attribute cannot both be present."); + } + } else if (0 == Platform::Strcasecmp(ATTR_NAME, atts[i])) { if (!atts[i + 1] || !*atts[i + 1]) @@ -83,7 +112,7 @@ void CTFReaderTransformElt::start(const char ** atts) throwMessage("If the attribute 'name' is present, it must have a value."); } - m_transform->setName(atts[i + 1]); + m_transform->getFormatMetadata().addAttribute(ATTR_NAME, atts[i + 1]); } else if (0 == Platform::Strcasecmp(ATTR_INVERSE_OF, atts[i])) { @@ -92,7 +121,7 @@ void CTFReaderTransformElt::start(const char ** atts) throwMessage("If the attribute 'inverseOf' is present, it must have a value."); } - m_transform->setInverseOfId(atts[i + 1]); + m_transform->getFormatMetadata().addAttribute(ATTR_INVERSE_OF, atts[i + 1]); } else if (0 == Platform::Strcasecmp(ATTR_VERSION, atts[i])) { @@ -100,6 +129,10 @@ void CTFReaderTransformElt::start(const char ** atts) { throwMessage("'compCLFversion' and 'Version' cannot both be present."); } + if (isSMPTEVersionFound) + { + throwMessage("SMPTE 'xmlns' version and 'Version' attribute cannot both be present."); + } if (isVersionFound) { throwMessage("'Version' can only be there once."); @@ -114,7 +147,7 @@ void CTFReaderTransformElt::start(const char ** atts) try { const std::string verString(pVer); - CTFVersion::ReadVersion(verString, requestedVersion); + requestedVersion = CTFVersion(verString); } catch (Exception& ce) { @@ -134,6 +167,9 @@ void CTFReaderTransformElt::start(const char ** atts) throwMessage("'compCLFversion' and 'Version' cannot be both present."); } + // Note: compCLFversion can appear together with xmlns for SMPTE CLF + // files. + const char* pVer = atts[i + 1]; if (!pVer || !*pVer) { @@ -143,7 +179,7 @@ void CTFReaderTransformElt::start(const char ** atts) try { std::string verString(pVer); - CTFVersion::ReadVersion(verString, requestedCLFVersion); + requestedCLFVersion = CTFVersion(verString, CTFVersion::StringFormat::VERSION_SMPTE_CLF); } catch (Exception& ce) { @@ -168,14 +204,18 @@ void CTFReaderTransformElt::start(const char ** atts) requestedVersion = CTF_PROCESS_LIST_VERSION_2_0; } - isVersionFound = true; isCLFVersionFound = true; // Handle as CLF. m_isCLF = true; } - else if (0 == Platform::Strcasecmp("xmlns", atts[i])) + else if(StringUtils::StartsWith(std::string(atts[i]),"xmlns:")) { - // Ignore. + // push as metadata attribute. + if (!atts[i + 1] || !*atts[i + 1]) + { + throwMessage("If the attribute 'xmlns:*' is present, it must have a value."); + } + m_transform->getFormatMetadata().addAttribute(atts[i], atts[i + 1]); } else { @@ -185,29 +225,27 @@ void CTFReaderTransformElt::start(const char ** atts) i += 2; } - // Check mandatory elements. - if (!isIdFound) + // Check mandatory id keyword for non-SMPTE variants. + if (!isIdFound && !isSMPTEVersionFound) { throwMessage("Required attribute 'id' is missing."); } // Transform file format with no version means that // the CTF format is 1.2. - if (!isVersionFound) + if (!(isVersionFound || isCLFVersionFound || isSMPTEVersionFound )) { - if (m_isCLF && !isCLFVersionFound) + if (m_isCLF) { - throwMessage("Required attribute 'compCLFversion' is missing."); + throwMessage("No valid 'version', 'compCLFversion', or 'xmlns' attributes were found; " + "at least one of them is required."); } setVersion(CTF_PROCESS_LIST_VERSION_1_2); } else { setVersion(requestedVersion); - if (m_isCLF) - { - setCLFVersion(requestedCLFVersion); - } + setCLFVersion(requestedCLFVersion); } } @@ -215,9 +253,9 @@ void CTFReaderTransformElt::end() { } -void CTFReaderTransformElt::appendMetadata(const std::string & /*name*/, const std::string & value) +void CTFReaderTransformElt::appendMetadata(FormatMetadataImpl& metadata) { - getTransform()->getDescriptions().push_back(value); + getTransform()->getFormatMetadata().getChildrenElements().push_back(metadata); } const CTFReaderTransformPtr & CTFReaderTransformElt::getTransform() const @@ -260,6 +298,25 @@ bool CTFReaderTransformElt::isCLF() const return getTransform()->isCLF(); } +////////////////////////////////////////////////////////// +void CTFReaderIdElt::end() +{ + if(!ValidateSMPTEId(m_id)) + { + // We allow non-compliant Id values with a warning. + std::ostringstream ss; + ss << getXmlFile().c_str() << "(" << getXmlLineNumber() << "): "; + ss << "'" << m_id << "' is not a SMPTE ST 2136-1 compliant Id value."; + LogWarning(ss.str().c_str()); + } + + if(!m_id.empty()) + { + FormatMetadataImpl metadata(getName(), m_id); + getParent()->appendMetadata(metadata); + } +} + ////////////////////////////////////////////////////////// CTFReaderArrayElt::CTFReaderArrayElt(const std::string & name, @@ -799,6 +856,43 @@ void CTFReaderInfoElt::end() ////////////////////////////////////////////////////////// +void CTFReaderDescElt::start(const char ** atts ) +{ + m_desc = {}; + m_language = {}; + + unsigned i = 0; + while (atts[i] && *atts[i]) + { + if (0 == Platform::Strcasecmp(ATTR_LANGUAGE, *atts)) + { + if (!atts[i + 1] || !*atts[i + 1]) + { + throwMessage("Attribute 'language' does not have a value."); + } + + m_language = atts[i + 1]; + } + + i += 2; + } +} + +void CTFReaderDescElt::end() +{ + FormatMetadataImpl metadata(getName(), m_desc); + if(!m_language.empty()) + { + metadata.addAttribute(ATTR_LANGUAGE, m_language.c_str()); + } + getParent()->appendMetadata(metadata); +} + +////////////////////////////////////////////////////////// + + + + CTFReaderOpElt::CTFReaderOpElt() : XmlReaderContainerElt("", 0, "") { @@ -828,10 +922,9 @@ const std::string & CTFReaderOpElt::getIdentifier() const return getOp()->getID(); } -void CTFReaderOpElt::appendMetadata(const std::string & name, const std::string & value) +void CTFReaderOpElt::appendMetadata(FormatMetadataImpl& metadata) { - FormatMetadataImpl item(name, value); - getOp()->getFormatMetadata().getChildrenElements().push_back(item); + getOp()->getFormatMetadata().getChildrenElements().push_back(metadata); } void CTFReaderOpElt::start(const char ** atts) @@ -844,7 +937,7 @@ void CTFReaderOpElt::start(const char ** atts) // Add a pointer to an empty op of the appropriate child class to the // end of the opvec. No data is copied since the parameters of the op // have not been filled in yet. - m_transform->getOps().push_back(getOp()); + m_transform->getOpDataVec().push_back(getOp()); enum BitDepthFlags { @@ -3365,6 +3458,11 @@ ArrayBase * CTFReaderInvLut1DElt::updateDimension(const Dimensions & dims) return nullptr; } + if (dims[0] < 2 || dims[0] > Max1DLUTLength) + { + return nullptr; + } + Array * pArray = &m_invLut->getArray(); pArray->resize(dims[0], numColorComponents); return pArray; @@ -3503,6 +3601,11 @@ ArrayBase * CTFReaderInvLut3DElt::updateDimension(const Dimensions & dims) return nullptr; } + if (dims[0] < 2 || dims[0] > Max3DLUTLength) + { + return nullptr; + } + Array * pArray = &m_invLut->getArray(); pArray->resize(dims[0], numColorComponents); return pArray; @@ -4178,6 +4281,11 @@ ArrayBase * CTFReaderLut1DElt::updateDimension(const Dimensions & dims) return nullptr; } + if (dims[0] < 2 || dims[0] > Max1DLUTLength) + { + return nullptr; + } + Array * pArray = &m_lut->getArray(); pArray->resize(dims[0], numColorComponents); return pArray; @@ -4239,7 +4347,7 @@ IndexMapping * CTFReaderLut1DElt::updateDimensionIM(const DimensionsIM & dims) const unsigned int numComponents = dims[0]; - if (dims[0] == 0) + if (dims[0] < 2 || dims[0] > Max1DLUTLength) { return nullptr; } @@ -4363,9 +4471,9 @@ void CTFReaderLut1DElt_1_7::end() // This code assumes that the current LUT is at the end of the opList. // In other words, that this LUT's end() method will be called before // any other Op's start(). - const size_t len = m_transform->getOps().size(); + const size_t len = m_transform->getOpDataVec().size(); const size_t pos = len - 1; - m_transform->getOps().insert(m_transform->getOps().begin() + pos, pRng); + m_transform->getOpDataVec().insert(m_transform->getOpDataVec().begin() + pos, pRng); } } @@ -4450,6 +4558,11 @@ ArrayBase * CTFReaderLut3DElt::updateDimension(const Dimensions & dims) return nullptr; } + if (dims[0] < 2 || dims[0] > Max3DLUTLength) + { + return nullptr; + } + Array* pArray = &m_lut->getArray(); pArray->resize(dims[0], numColorComponents); @@ -4480,7 +4593,7 @@ IndexMapping * CTFReaderLut3DElt::updateDimensionIM(const DimensionsIM & dims) const unsigned numComponents = dims[0]; - if (dims[0] == 0) + if (dims[0] < 2 || dims[0] > Max3DLUTLength) { return nullptr; } @@ -4530,9 +4643,9 @@ void CTFReaderLut3DElt_1_7::end() // This code assumes that the current LUT is at the end of the opList. // In other words, that this LUT's end() method will be called before // any other Op's start(). - const unsigned long len = (unsigned long)m_transform->getOps().size(); + const unsigned long len = (unsigned long)m_transform->getOpDataVec().size(); const unsigned long pos = len - 1; - m_transform->getOps().insert(m_transform->getOps().begin() + pos, pRng); + m_transform->getOpDataVec().insert(m_transform->getOpDataVec().begin() + pos, pRng); } } @@ -4584,6 +4697,11 @@ ArrayBase * CTFReaderMatrixElt::updateDimension(const Dimensions & dims) return nullptr; } + if (size < 3 || size > 4) + { + return nullptr; + } + ArrayDouble * pArray = &m_matrix->getArray(); pArray->resize(size, numColorComponents); @@ -4908,12 +5026,12 @@ void CTFReaderRangeElt_1_7::end() // This code assumes that the current Range is at the end of the opList. // In other words, that this Op's end() method will be called before // any other Op's start(). - const size_t len = m_transform->getOps().size(); + const size_t len = m_transform->getOpDataVec().size(); const size_t pos = len - 1; // Replace the range appended to m_transform in OpElt::start // with the matrix. - m_transform->getOps()[pos].swap(pMtx); + m_transform->getOpDataVec()[pos].swap(pMtx); } } diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.h b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.h index e4e1bacecd..5b7d48a4b8 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.h +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderHelper.h @@ -47,7 +47,7 @@ class CTFReaderTransformElt : public XmlReaderContainerElt void end() override; - void appendMetadata(const std::string & name, const std::string & value) override; + void appendMetadata(FormatMetadataImpl& metadata) override; // Get its parent which is a Transform. const CTFReaderTransformPtr & getTransform() const; @@ -71,11 +71,48 @@ class CTFReaderTransformElt : public XmlReaderContainerElt // The associated Transform. CTFReaderTransformPtr m_transform; // Is it a clf file? Or is a clf parser requested. - bool m_isCLF; + bool m_isCLF = false; +}; + +// Class for the Id element. +class CTFReaderIdElt : public XmlReaderPlainElt +{ +public: + CTFReaderIdElt() = delete; + CTFReaderIdElt(const std::string & name, + ContainerEltRcPtr & pParent, + unsigned int xmlLocation, + const std::string & xmlFile) + : XmlReaderPlainElt(name, pParent, xmlLocation, xmlFile) + { + } + + ~CTFReaderIdElt() + { + } + + void start(const char ** /* atts */) override + { + m_id = {}; + } + + void end() override; + + void setRawData(const char * str, size_t len, unsigned int /* xmlLine */) override + { + // This function can receive the text in small pieces, so keep adding to + // the string. + m_id += std::string(str, len); + } + +private: + std::string m_id; }; typedef OCIO_SHARED_PTR CTFReaderTransformEltRcPtr; +// Note: This class is used only for adding metadata to other info metadata +// elements, not to the transform. class CTFReaderMetadataElt : public XmlReaderComplexElt { public: @@ -117,76 +154,37 @@ class CTFReaderInfoElt : public CTFReaderMetadataElt void end() override; }; -class CTFReaderInputDescriptorElt : public XmlReaderPlainElt +// This class is used for collecting descriptions, input descriptors and output +// descriptors. It also collects the language attribute for those if provided. +// Appends the found elements to the format metadata of the transform. +class CTFReaderDescElt : public XmlReaderPlainElt { public: - CTFReaderInputDescriptorElt() = delete; - CTFReaderInputDescriptorElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) + CTFReaderDescElt() = delete; + CTFReaderDescElt(const std::string & name, + ContainerEltRcPtr pParent, + unsigned int xmlLineNumber, + const std::string & xmlFile) : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) { } - ~CTFReaderInputDescriptorElt() + ~CTFReaderDescElt() { } - void start(const char ** /* atts */) override - { - } - - void end() override - { - } + void start(const char ** atts ) override; + void end() override; void setRawData(const char * str, size_t len, unsigned int /*xmlLine*/) override { - CTFReaderTransformElt* pTransform - = dynamic_cast(getParent().get()); - - std::string s = pTransform->getTransform()->getInputDescriptor(); - s += std::string(str, len); - - pTransform->getTransform()->setInputDescriptor(s); - } -}; - -class CTFReaderOutputDescriptorElt : public XmlReaderPlainElt -{ -public: - CTFReaderOutputDescriptorElt() = delete; - CTFReaderOutputDescriptorElt(const std::string & name, - ContainerEltRcPtr pParent, - unsigned int xmlLineNumber, - const std::string & xmlFile) - : XmlReaderPlainElt(name, pParent, xmlLineNumber, xmlFile) - { - } - - ~CTFReaderOutputDescriptorElt() - { - } - - void start(const char ** /* atts */) override - { - } - - void end() override - { - } - - void setRawData(const char* str, size_t len, unsigned int /* xmlLine */) override - { - CTFReaderTransformElt* pTransform - = dynamic_cast(getParent().get()); - - std::string s = pTransform->getTransform()->getOutputDescriptor(); - s += std::string(str, len); - - pTransform->getTransform()->setOutputDescriptor(s); + // This function may receive the text in small pieces, so keep adding to + // the string. + m_desc += std::string(str, len); } +private: + std::string m_desc; + std::string m_language; }; class CTFReaderArrayElt : public XmlReaderPlainElt @@ -348,7 +346,7 @@ class CTFReaderOpElt : public XmlReaderContainerElt virtual const OpDataRcPtr getOp() const = 0; - void appendMetadata(const std::string & name, const std::string & value) override; + void appendMetadata(FormatMetadataImpl& metadata) override; void start(const char ** atts) override; diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.cpp b/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.cpp index ffd73cbd43..89eb7f9f71 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.cpp +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.cpp @@ -3,6 +3,7 @@ #include #include +#include #include "fileformats/ctf/CTFReaderUtils.h" #include "Platform.h" @@ -173,4 +174,19 @@ const char * ConvertGradingStyleAndDirToString(GradingStyle style, TransformDire throw Exception(os.str().c_str()); } + +bool ValidateSMPTEId(const std::string& id) +{ + static const std::regex clf_id_regex( + "^urn:uuid:" + "[0-9a-fA-F]{8}-" + "[0-9a-fA-F]{4}-" + "[0-9a-fA-F]{4}-" + "[0-9a-fA-F]{4}-" + "[0-9a-fA-F]{12}$"); + + return std::regex_match(id, clf_id_regex); +} + + } // namespace OCIO_NAMESPACE diff --git a/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.h b/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.h index 805e95bb12..f58b47d0d2 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.h +++ b/src/OpenColorIO/fileformats/ctf/CTFReaderUtils.h @@ -18,6 +18,7 @@ void ConvertStringToGradingStyleAndDir(const char * str, TransformDirection & dir); const char * ConvertGradingStyleAndDirToString(GradingStyle style, TransformDirection dir); +bool ValidateSMPTEId(const std::string& id); static constexpr char TAG_ACES[] = "ACES"; static constexpr char TAG_ACES_PARAMS[] = "ACESParams"; @@ -42,6 +43,7 @@ static constexpr char TAG_FIXED_FUNCTION[] = "FixedFunction"; static constexpr char TAG_FUNCTION[] = "Function"; static constexpr char TAG_GAMMA[] = "Gamma"; static constexpr char TAG_GAMMA_PARAMS[] = "GammaParams"; +static constexpr char TAG_ID[] = "Id"; static constexpr char TAG_INDEX_MAP[] = "IndexMap"; static constexpr char TAG_INFO[] = "Info"; static constexpr char TAG_INVLUT1D[] = "InverseLUT1D"; @@ -114,6 +116,7 @@ static constexpr char ATTR_HUE_ADJUST[] = "hueAdjust"; static constexpr char ATTR_INTERPOLATION[] = "interpolation"; static constexpr char ATTR_INVERSE_OF[] = "inverseOf"; static constexpr char ATTR_IS_INVERTED[] = "inverted"; +static constexpr char ATTR_LANGUAGE[] = "language"; static constexpr char ATTR_LINEARSLOPE[] = "linearSlope"; static constexpr char ATTR_LINSIDEBREAK[] = "linSideBreak"; static constexpr char ATTR_LINSIDESLOPE[] = "linSideSlope"; diff --git a/src/OpenColorIO/fileformats/ctf/CTFTransform.cpp b/src/OpenColorIO/fileformats/ctf/CTFTransform.cpp index 5a21b6cb1d..55f6877adf 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFTransform.cpp +++ b/src/OpenColorIO/fileformats/ctf/CTFTransform.cpp @@ -2,12 +2,12 @@ // Copyright Contributors to the OpenColorIO Project. #include +#include #include "BitDepthUtils.h" #include "fileformats/ctf/CTFReaderUtils.h" #include "fileformats/ctf/CTFTransform.h" #include "fileformats/xmlutils/XMLReaderUtils.h" -#include "HashUtils.h" #include "ops/cdl/CDLOpData.h" #include "ops/exponent/ExponentOp.h" #include "ops/exposurecontrast/ExposureContrastOpData.h" @@ -38,9 +38,37 @@ namespace OCIO_NAMESPACE // This results in less pretty output and also causes problems for some unit tests. static constexpr unsigned DOUBLE_PRECISION = 15; +static constexpr const char* SMPTE_XMLNS_URL = "http://www.smpte-ra.org/ns/2136-1/2024"; -void CTFVersion::ReadVersion(const std::string & versionString, CTFVersion & versionOut) +CTFVersion::CTFVersion(const std::string & versionString, StringFormat acceptedFormat) { + // Parse the version string to see if that matches the SMPTE + // namespace/version patterns. If so store the version string and consider + // equivalent to v3.0. + if (acceptedFormat & ( VERSION_SMPTE_XMLNS | VERSION_SMPTE_CLF)) + { + bool res = false; + if (acceptedFormat & VERSION_SMPTE_XMLNS) + { + res = (0 == Platform::Strcasecmp(versionString.c_str(), + SMPTE_XMLNS_URL)); + } + + if (!res && acceptedFormat & VERSION_SMPTE_CLF) + { + res = (0 == Platform::Strcasecmp(versionString.c_str(), + "ST2136-1:2024")); + } + + if (res) + { + m_version_string = versionString; + m_major = 3; + return; + } + } + + // For non-SMPTE namespace versions, parse as MAJOR[.MINOR[.REVISION]] unsigned int numDot = 0; unsigned int numInt = 0; bool canBeDot = false; @@ -73,19 +101,19 @@ void CTFVersion::ReadVersion(const std::string & versionString, CTFVersion & ver std::ostringstream os; os << "'"; os << versionString; - os << "' is not a valid version. "; - os << "Expecting MAJOR[.MINOR[.REVISION]] "; + os << "' is not a valid version. Expecting "; + if (acceptedFormat & VERSION_SMPTE_CLF) + os << "'ST2136-1:2024' or "; + if (acceptedFormat & VERSION_SMPTE_XMLNS) + os << "'" << SMPTE_XMLNS_URL << "' or "; + os << "MAJOR[.MINOR[.REVISION]] "; throw Exception(os.str().c_str()); } - versionOut.m_major = 0; - versionOut.m_minor = 0; - versionOut.m_revision = 0; - sscanf(versionString.c_str(), "%d.%d.%d", - &versionOut.m_major, - &versionOut.m_minor, - &versionOut.m_revision); + &m_major, + &m_minor, + &m_revision); } CTFVersion & CTFVersion::operator=(const CTFVersion & rhs) @@ -95,6 +123,7 @@ CTFVersion & CTFVersion::operator=(const CTFVersion & rhs) m_major = rhs.m_major; m_minor = rhs.m_minor; m_revision = rhs.m_revision; + m_version_string = rhs.m_version_string; } return *this; } @@ -385,7 +414,7 @@ CTFVersion GetOpMinimumVersion(const ConstOpDataRcPtr & op) CTFVersion GetMinimumVersion(const ConstCTFReaderTransformPtr & transform) { - auto & opList = transform->getOps(); + auto & opList = transform->getOpDataVec(); // Need to specify the minimum version here. Some test transforms have no ops. CTFVersion minimumVersion = CTF_PROCESS_LIST_VERSION_1_3; @@ -402,59 +431,93 @@ CTFVersion GetMinimumVersion(const ConstCTFReaderTransformPtr & transform) return minimumVersion; } -const char * GetFirstElementValue(const FormatMetadataImpl::Elements & elements, const std::string & name) +const char * GetLastElementValue(const FormatMetadataImpl::Elements & elements, const std::string & name) { - for (auto & it : elements) + for (auto it = elements.rbegin(); it != elements.rend(); ++it) { - if (0 == Platform::Strcasecmp(name.c_str(), it.getElementName())) + if (0 == Platform::Strcasecmp(name.c_str(), it->getElementName())) { - return it.getElementValue(); + return it->getElementValue(); } } return ""; } -const char * GetLastElementValue(const FormatMetadataImpl::Elements & elements, const std::string & name) +void CopyNonEmptyAttribute(FormatMetadataImpl& dest,const FormatMetadataImpl& source, const char * attrname) { - for (auto it = elements.rbegin(); it != elements.rend(); ++it) + const std::string value = source.getAttributeValueString(attrname); + if (!value.empty()) { - if (0 == Platform::Strcasecmp(name.c_str(), it->getElementName())) - { - return it->getElementValue(); - } + dest.addAttribute(attrname, value.c_str()); } - return ""; } + +void AddNonEmptyElement(FormatMetadataImpl & metadata, const char * name, const std::string & value) +{ + if (!value.empty()) + { + metadata.addChildElement(name, value.c_str()); + } } +} // namespace + // This method copies the metadata from the argument into the transform object. // Only attributes and elements that are expected parts of the CLF spec are // preserved. This corresponds to the top level metadata in the CLF ProcessList, // note that any metadata in the individual process nodes are stored separately // in their opData. Here is what is preserved: // -- ProcessList attributes "name", "id", and "inverseOf". Other attributes are ignored. +// -- ProcessList sub-element "Id". // -- ProcessList sub-elements "InputDescriptor" and "OutputDescriptor". The value -// of these elements is preserved but no additional attributes or sub-elements. -// Only the first InputDescriptor and last OutputDescriptor in the metadata is preserved. +// of these elements is preserved with the language attrib, but no sub-elements. // -- ProcessList "Description" sub-elements. All of these elements are preserved, -// but only their value strings, no attributes or sub-elements. +// but only their value strings and language attributes. // -- ProcessList "Info" sub-elements. If there is more than one, they are merged into // a single Info element. All attributes and sub-elements are preserved. // -- Any other sub-elements or attributes are ignored. void CTFReaderTransform::fromMetadata(const FormatMetadataImpl & metadata) { - // Name & id handled as attributes of the root metadata. - m_name = metadata.getAttributeValueString(METADATA_NAME); - m_id = metadata.getAttributeValueString(METADATA_ID); - m_inverseOfId = metadata.getAttributeValueString(ATTR_INVERSE_OF); + // Attributes + CopyNonEmptyAttribute(m_formatMetadata, metadata, METADATA_ID); + CopyNonEmptyAttribute(m_formatMetadata, metadata, METADATA_NAME); + CopyNonEmptyAttribute(m_formatMetadata, metadata, ATTR_INVERSE_OF); + + // all "xmlns:*" attributes needs to be copied too. + for (int i = 0; i < metadata.getNumAttributes(); ++i) + { + const std::string attrName = metadata.getAttributeName(i); + if (StringUtils::StartsWith(attrName.c_str(), "xmlns:")) + { + CopyNonEmptyAttribute(m_formatMetadata, metadata, attrName.c_str()); + } + } + + // Id Element + AddNonEmptyElement(m_formatMetadata, METADATA_ID_ELEMENT, + GetLastElementValue(metadata.getChildrenElements(), METADATA_ID_ELEMENT)); + + // Description, input and output descriptors + auto copyDescs = [&](const char * elementName) + { + for (auto desc : metadata.getChildrenElements(elementName)) + { + FormatMetadataImpl newEl(desc.getElementName(), desc.getElementValue()); + auto lang = desc.getAttributeValueString("language"); + if (!lang.empty()) + { + newEl.addAttribute("language", lang.c_str()); + } + m_formatMetadata.getChildrenElements().push_back(newEl); + } + }; - // Preserve first InputDescriptor, last OutputDescriptor, and all Descriptions. - m_inDescriptor = GetFirstElementValue(metadata.getChildrenElements(), METADATA_INPUT_DESCRIPTOR); - m_outDescriptor = GetLastElementValue(metadata.getChildrenElements(), METADATA_OUTPUT_DESCRIPTOR); - GetElementsValues(metadata.getChildrenElements(), METADATA_DESCRIPTION, m_descriptions); + copyDescs(METADATA_DESCRIPTION); + copyDescs(METADATA_INPUT_DESCRIPTOR); + copyDescs(METADATA_OUTPUT_DESCRIPTOR); // Combine all Info elements. - for (auto elt : metadata.getChildrenElements()) + for (auto & elt : metadata.getChildrenElements()) { if (0 == Platform::Strcasecmp(elt.getElementName(), METADATA_INFO)) { @@ -463,38 +526,51 @@ void CTFReaderTransform::fromMetadata(const FormatMetadataImpl & metadata) } } -namespace -{ -void AddNonEmptyElement(FormatMetadataImpl & metadata, const char * name, const std::string & value) -{ - if (!value.empty()) - { - metadata.addChildElement(name, value.c_str()); - } -} -void AddNonEmptyAttribute(FormatMetadataImpl & metadata, const char * name, const std::string & value) -{ - if (!value.empty()) - { - metadata.addAttribute(name, value.c_str()); - } -} -} void CTFReaderTransform::toMetadata(FormatMetadataImpl & metadata) const { // Put CTF processList information into the FormatMetadata. - AddNonEmptyAttribute(metadata, METADATA_NAME, getName()); - AddNonEmptyAttribute(metadata, METADATA_ID, getID()); - AddNonEmptyAttribute(metadata, ATTR_INVERSE_OF, getInverseOfId()); - AddNonEmptyElement(metadata, METADATA_INPUT_DESCRIPTOR, getInputDescriptor()); - AddNonEmptyElement(metadata, METADATA_OUTPUT_DESCRIPTOR, getOutputDescriptor()); - for (auto & desc : m_descriptions) + // Attributes + CopyNonEmptyAttribute(metadata, m_formatMetadata, METADATA_ID); + CopyNonEmptyAttribute(metadata, m_formatMetadata, METADATA_NAME); + CopyNonEmptyAttribute(metadata, m_formatMetadata, ATTR_INVERSE_OF); + + // all "xmlns:*" attributes needs to be copied too. + for (int i = 0; i < m_formatMetadata.getNumAttributes(); ++i) { - metadata.addChildElement(METADATA_DESCRIPTION, desc.c_str()); + const std::string attrName = m_formatMetadata.getAttributeName(i); + if (StringUtils::StartsWith(attrName.c_str(), "xmlns:")) + { + CopyNonEmptyAttribute(metadata, m_formatMetadata, attrName.c_str()); + } } + + // Child Elements + AddNonEmptyElement(metadata, METADATA_ID_ELEMENT, + GetLastElementValue(m_formatMetadata.getChildrenElements(), METADATA_ID_ELEMENT)); + + // Description, Input and Output Descriptor Elements. + auto copyDescs = [&](const char * elementName) + { + for (auto desc : m_formatMetadata.getChildrenElements(elementName)) + { + FormatMetadataImpl newEl(desc.getElementName(), desc.getElementValue()); + auto lang = desc.getAttributeValueString("language"); + if (!lang.empty()) + { + newEl.addAttribute("language", lang.c_str()); + } + metadata.getChildrenElements().push_back(newEl); + } + }; + + copyDescs(METADATA_DESCRIPTION); + copyDescs(METADATA_INPUT_DESCRIPTOR); + copyDescs(METADATA_OUTPUT_DESCRIPTOR); + + // Info Metadata. const std::string infoValue(m_infoMetadata.getElementValue()); if (m_infoMetadata.getNumAttributes() || m_infoMetadata.getNumChildrenElements() || !infoValue.empty()) @@ -508,14 +584,23 @@ void CTFReaderTransform::toMetadata(FormatMetadataImpl & metadata) const namespace { -void WriteDescriptions(XmlFormatter & fmt, const char * tag, const StringUtils::StringVec & descriptions) +void WriteTagStringVec(XmlFormatter & fmt, const char * tag, const StringUtils::StringVec & strVec) { - for (auto & it : descriptions) + for (auto & it : strVec) { fmt.writeContentTag(tag, it); } } +// Writes the given list of elements along with their attributes. +void WriteTagElementVec(XmlFormatter & fmt, const FormatMetadataImpl::Elements & elVec) +{ + for (auto & el : elVec) + { + fmt.writeContentTag(el.getElementName(), el.getAttributes(), el.getElementValue()); + } +} + template typename std::enable_if::value, void>::type WriteValue(T value, std::ostream& stream) { @@ -737,7 +822,7 @@ void OpWriter::writeFormatMetadata() const StringUtils::StringVec desc; GetElementsValues(op->getFormatMetadata().getChildrenElements(), TAG_DESCRIPTION, desc); - WriteDescriptions(m_formatter, TAG_DESCRIPTION, desc); + WriteTagStringVec(m_formatter, TAG_DESCRIPTION, desc); } const char * BitDepthToCLFString(BitDepth bitDepth) @@ -879,7 +964,7 @@ void CDLWriter::writeContent() const StringUtils::StringVec desc; GetElementsValues(op->getFormatMetadata().getChildrenElements(), METADATA_SOP_DESCRIPTION, desc); - WriteDescriptions(m_formatter, TAG_DESCRIPTION, desc); + WriteTagStringVec(m_formatter, TAG_DESCRIPTION, desc); oss.str(""); params = m_cdl->getSlopeParams(); @@ -906,7 +991,7 @@ void CDLWriter::writeContent() const StringUtils::StringVec desc; GetElementsValues(op->getFormatMetadata().getChildrenElements(), METADATA_SAT_DESCRIPTION, desc); - WriteDescriptions(m_formatter, TAG_DESCRIPTION, desc); + WriteTagStringVec(m_formatter, TAG_DESCRIPTION, desc); oss.str(""); oss << m_cdl->getSaturation(); @@ -921,15 +1006,15 @@ void CDLWriter::writeFormatMetadata() const StringUtils::StringVec desc; GetElementsValues(op->getFormatMetadata().getChildrenElements(), METADATA_DESCRIPTION, desc); - WriteDescriptions(m_formatter, TAG_DESCRIPTION, desc); + WriteTagStringVec(m_formatter, TAG_DESCRIPTION, desc); desc.clear(); GetElementsValues(op->getFormatMetadata().getChildrenElements(), METADATA_INPUT_DESCRIPTION, desc); - WriteDescriptions(m_formatter, METADATA_INPUT_DESCRIPTION, desc); + WriteTagStringVec(m_formatter, METADATA_INPUT_DESCRIPTION, desc); desc.clear(); GetElementsValues(op->getFormatMetadata().getChildrenElements(), METADATA_VIEWING_DESCRIPTION, desc); - WriteDescriptions(m_formatter, METADATA_VIEWING_DESCRIPTION, desc); + WriteTagStringVec(m_formatter, METADATA_VIEWING_DESCRIPTION, desc); } /////////////////////////////////////////////////////////////////////////////// @@ -2517,10 +2602,10 @@ void RangeWriter::writeContent() const TransformWriter::TransformWriter(XmlFormatter & formatter, ConstCTFReaderTransformPtr transform, - bool isCLF) + SubFormat subFormat) : XmlElementWriter(formatter) , m_transform(transform) - , m_isCLF(isCLF) + , m_subFormat(subFormat) { } @@ -2534,68 +2619,115 @@ void TransformWriter::write() const XmlFormatter::Attributes attributes; - CTFVersion writeVersion{ CTF_PROCESS_LIST_VERSION_2_0 }; - - std::ostringstream fversion; - if (m_isCLF) + CTFVersion writeVersion; // This controls the available ops + switch(m_subFormat) { - // Save with CLF version 3. - fversion << 3; - attributes.push_back(XmlFormatter::Attribute(ATTR_COMP_CLF_VERSION, - fversion.str())); + case SubFormat::FORMAT_UNKNOWN: + throw Exception("Cannot write transform with unknown sub-format."); + break; - } - else - { - writeVersion = GetMinimumVersion(m_transform); - fversion << writeVersion; + case SubFormat::FORMAT_CLF: + // For CLF, we're writing versions per both the Academy and SMPTE + // requirements. + writeVersion = CTF_PROCESS_LIST_VERSION_2_0; + attributes.push_back(XmlFormatter::Attribute( + ATTR_COMP_CLF_VERSION, "3")); + attributes.push_back(XmlFormatter::Attribute( + ATTR_XMLNS, SMPTE_XMLNS_URL)); + break; + + case SubFormat::FORMAT_CTF: + writeVersion = GetMinimumVersion(m_transform); - attributes.push_back(XmlFormatter::Attribute(ATTR_VERSION, - fversion.str())); + std::ostringstream fversion; + fversion << writeVersion; + attributes.push_back(XmlFormatter::Attribute( + ATTR_VERSION, fversion.str())); + break; } + auto & metada = m_transform->getFormatMetadata(); + + // Id attribute std::string id = m_transform->getID(); if (id.empty()) { - auto & ops = m_transform->getOps(); - for (auto op : ops) - { - id += op->getCacheID(); - } - - id = CacheIDHash(id.c_str(), id.size()); + throw Exception("Internal error; at this point the transform should have an id"); } attributes.push_back(XmlFormatter::Attribute(ATTR_ID, id)); - + + // Name attribute const std::string& name = m_transform->getName(); if (!name.empty()) { attributes.push_back(XmlFormatter::Attribute(ATTR_NAME, name)); } - const std::string & inverseOfId = m_transform->getInverseOfId(); - if (!inverseOfId.empty()) + // inverseOf attribute + const char * inverseOf = metada.getAttributeValue(ATTR_INVERSE_OF); + if (inverseOf && *inverseOf) + { + attributes.push_back(XmlFormatter::Attribute( + ATTR_INVERSE_OF, inverseOf)); + } + + // Non-default namespace attributes. + for (int i = 0; i < metada.getNumAttributes(); ++i) { - attributes.push_back(XmlFormatter::Attribute(ATTR_INVERSE_OF, inverseOfId)); + const char * attrName = metada.getAttributeName(i); + if (attrName && StringUtils::StartsWith(attrName, "xmlns:")) + { + const char * attrValue = metada.getAttributeValue(i); + if (attrValue && *attrValue) + { + attributes.push_back(XmlFormatter::Attribute(attrName, attrValue)); + } + } } m_formatter.writeStartTag(processListTag, attributes); { XmlScopeIndent scopeIndent(m_formatter); + + // Id element, won't generate if not provided but the format is + // enforced. + auto idIdx = m_transform->getFormatMetadata() + .getFirstChildIndex(METADATA_ID_ELEMENT); + if(idIdx>=0) + { + const char * idVal = m_transform->getFormatMetadata().getChildElement(idIdx).getElementValue(); + if (idVal && *idVal) + { + if (m_subFormat == SubFormat::FORMAT_CLF && !ValidateSMPTEId(idVal)) + { + std::ostringstream ss; + ss << "'" << idVal << "' is not a SMPTE ST 2136-1 compliant Id value."; + throw Exception(ss.str().c_str()); + } + m_formatter.writeContentTag(TAG_ID, idVal); + } + } - WriteDescriptions(m_formatter, TAG_DESCRIPTION, m_transform->getDescriptions()); + // Descriptions. + { + auto desc = m_transform->getFormatMetadata() + .getChildrenElements(METADATA_DESCRIPTION); + WriteTagElementVec(m_formatter, desc); + } - const std::string & inputDesc = m_transform->getInputDescriptor(); - if (!inputDesc.empty()) + // Input Descriptors. { - m_formatter.writeContentTag(METADATA_INPUT_DESCRIPTOR, inputDesc); + auto desc = m_transform->getFormatMetadata() + .getChildrenElements(METADATA_INPUT_DESCRIPTOR); + WriteTagElementVec(m_formatter, desc); } - const std::string & outputDesc = m_transform->getOutputDescriptor(); - if (!outputDesc.empty()) + // Output Descriptors. { - m_formatter.writeContentTag(METADATA_OUTPUT_DESCRIPTOR, outputDesc); + auto desc = m_transform->getFormatMetadata() + .getChildrenElements(METADATA_OUTPUT_DESCRIPTOR); + WriteTagElementVec(m_formatter, desc); } const FormatMetadataImpl & info = m_transform->getInfoMetadata(); @@ -2629,7 +2761,7 @@ void TransformWriter::writeProcessListMetadata(const FormatMetadataImpl& m) cons m_formatter.writeContent(m.getElementValue()); } - const auto items = m.getChildrenElements(); + const auto & items = m.getChildrenElements(); for (auto it = items.begin(), end = items.end(); it != end; ++it) { XmlScopeIndent scopeIndent(m_formatter); @@ -2699,8 +2831,8 @@ void TransformWriter::writeOps(const CTFVersion & version) const // values on write. Otherwise, default to 32f. BitDepth inBD = BIT_DEPTH_F32; BitDepth outBD = BIT_DEPTH_F32; - - auto & ops = m_transform->getOps(); + bool isCLF = m_subFormat == SubFormat::FORMAT_CLF; + auto & ops = m_transform->getOpDataVec(); size_t numOps = ops.size(); size_t numSavedOps = 0; if (numOps) @@ -2762,7 +2894,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const paramR, paramG, paramB, paramA); gammaData->getFormatMetadata() = exp->getFormatMetadata(); - if (m_isCLF && !gammaData->isAlphaComponentIdentity()) + if (isCLF && !gammaData->isAlphaComponentIdentity()) { ThrowWriteOp("Exponent with alpha"); } @@ -2775,7 +2907,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const } case OpData::ExposureContrastType: { - if (m_isCLF) + if (isCLF) { ThrowWriteOp("ExposureContrast"); } @@ -2789,7 +2921,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const } case OpData::FixedFunctionType: { - if (m_isCLF) + if (isCLF) { ThrowWriteOp("FixedFunction"); } @@ -2804,7 +2936,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const case OpData::GammaType: { auto gamma = OCIO_DYNAMIC_POINTER_CAST(op); - if (m_isCLF) + if (isCLF) { if (!gamma->isAlphaComponentIdentity()) { @@ -2820,7 +2952,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const } case OpData::GradingPrimaryType: { - if (m_isCLF) + if (isCLF) { ThrowWriteOp("GradingPrimary"); } @@ -2834,7 +2966,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const } case OpData::GradingRGBCurveType: { - if (m_isCLF) + if (isCLF) { ThrowWriteOp("GradingRGBCurve"); } @@ -2848,7 +2980,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const } case OpData::GradingHueCurveType: { - if (m_isCLF) + if (isCLF) { ThrowWriteOp("GradingHueCurve"); } @@ -2862,7 +2994,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const } case OpData::GradingToneType: { - if (m_isCLF) + if (isCLF) { ThrowWriteOp("GradingTone"); } @@ -2886,7 +3018,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const case OpData::Lut1DType: { auto lut = OCIO_DYNAMIC_POINTER_CAST(op); - if (m_isCLF) + if (isCLF) { if (lut->getDirection() != TRANSFORM_DIR_FORWARD) { @@ -2910,7 +3042,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const case OpData::Lut3DType: { auto lut = OCIO_DYNAMIC_POINTER_CAST(op); - if (m_isCLF) + if (isCLF) { if (lut->getDirection() != TRANSFORM_DIR_FORWARD) { @@ -2935,7 +3067,7 @@ void TransformWriter::writeOps(const CTFVersion & version) const { auto matSrc = OCIO_DYNAMIC_POINTER_CAST(op); - if (m_isCLF) + if (isCLF) { if (matSrc->hasAlpha()) { diff --git a/src/OpenColorIO/fileformats/ctf/CTFTransform.h b/src/OpenColorIO/fileformats/ctf/CTFTransform.h index f8fb741c26..dec4c71532 100644 --- a/src/OpenColorIO/fileformats/ctf/CTFTransform.h +++ b/src/OpenColorIO/fileformats/ctf/CTFTransform.h @@ -22,16 +22,20 @@ namespace OCIO_NAMESPACE class CTFVersion { public: + enum StringFormat + { + VERSION_NUMERIC = 0, // Numeric version is always accepted. + VERSION_SMPTE_XMLNS = 1 << 1, + VERSION_SMPTE_CLF = 1 << 2 + }; + // Will throw if versionString is not formatted like a version. - static void ReadVersion(const std::string & versionString, - CTFVersion & versionOut); + explicit CTFVersion(const std::string & versionString, StringFormat acceptedFormat = VERSION_NUMERIC); CTFVersion() - : m_major(0) - , m_minor(0) - , m_revision(0) { } + CTFVersion(unsigned int major, unsigned int minor, unsigned int revision) : m_major(major) , m_minor(minor) @@ -41,7 +45,6 @@ class CTFVersion CTFVersion(unsigned int major, unsigned int minor) : m_major(major) , m_minor(minor) - , m_revision(0) { } @@ -49,6 +52,7 @@ class CTFVersion : m_major(otherVersion.m_major) , m_minor(otherVersion.m_minor) , m_revision(otherVersion.m_revision) + , m_version_string(otherVersion.m_version_string) { } @@ -65,22 +69,33 @@ class CTFVersion friend std::ostream & operator<< (std::ostream & stream, const CTFVersion & rhs) { - stream << rhs.m_major; - if (rhs.m_minor != 0 || rhs.m_revision != 0) + if (!rhs.m_version_string.empty()) { - stream << "." << rhs.m_minor; - if (rhs.m_revision != 0) + stream << rhs.m_version_string; + } + else + { + stream << rhs.m_major; + if (rhs.m_minor != 0 || rhs.m_revision != 0) { - stream << "." << rhs.m_revision; + stream << "." << rhs.m_minor; + if (rhs.m_revision != 0) + { + stream << "." << rhs.m_revision; + } } } return stream; } private: - unsigned int m_major; - unsigned int m_minor; - unsigned int m_revision; + // CTF and Academy/ASC CLF uses the numeric version system. + unsigned int m_major = 0; + unsigned int m_minor = 0; + unsigned int m_revision = 0; + + // SMPTE CLF uses a non-numeric xmlns version system. + std::string m_version_string; }; // @@ -151,28 +166,22 @@ class CTFReaderTransform const std::string & getID() const { - return m_id; + return m_formatMetadata.getAttributeValueString(METADATA_ID); } void setID(const char * id) { - m_id = id; + m_formatMetadata.addAttribute(METADATA_ID, id); } + const std::string & getName() const { - return m_name; + return m_formatMetadata.getAttributeValueString(METADATA_NAME); } void setName(const char * name) { - m_name = name; - } - const std::string & getInverseOfId() const - { - return m_inverseOfId; - } - void setInverseOfId(const char * id) - { - m_inverseOfId = id; + m_formatMetadata.addAttribute(METADATA_NAME, name); } + FormatMetadataImpl & getInfoMetadata() { return m_infoMetadata; @@ -181,41 +190,23 @@ class CTFReaderTransform { return m_infoMetadata; } - const ConstOpDataVec & getOps() const - { - return m_ops; - } - ConstOpDataVec & getOps() - { - return m_ops; - } - const StringUtils::StringVec & getDescriptions() const - { - return m_descriptions; - } - StringUtils::StringVec & getDescriptions() - { - return m_descriptions; - } - const std::string & getInputDescriptor() const + FormatMetadataImpl & getFormatMetadata() { - return m_inDescriptor; + return m_formatMetadata; } - - void setInputDescriptor(const std::string & in) + const FormatMetadataImpl & getFormatMetadata() const { - m_inDescriptor = in; + return m_formatMetadata; } - const std::string & getOutputDescriptor() const + const ConstOpDataVec & getOpDataVec() const { - return m_outDescriptor; + return m_ops; } - - void setOutputDescriptor(const std::string & out) + ConstOpDataVec & getOpDataVec() { - m_outDescriptor = out; + return m_ops; } void setCTFVersion(const CTFVersion & ver); @@ -239,15 +230,10 @@ class CTFReaderTransform } private: - std::string m_id; - std::string m_name; - std::string m_inverseOfId; - std::string m_inDescriptor; - std::string m_outDescriptor; FormatMetadataImpl m_infoMetadata; + FormatMetadataImpl m_formatMetadata; ConstOpDataVec m_ops; - StringUtils::StringVec m_descriptions; // CTF version used even for CLF files. // CLF versions <= 2.0 are interpreted as CTF version 1.7. @@ -265,14 +251,22 @@ typedef OCIO_SHARED_PTR ConstCTFReaderTransformPtr; class TransformWriter : public XmlElementWriter { -public: + public: + enum class SubFormat : uint8_t + { + FORMAT_UNKNOWN, + FORMAT_CLF, + FORMAT_CTF + }; + + public: TransformWriter() = delete; TransformWriter(const TransformWriter &) = delete; TransformWriter& operator=(const TransformWriter &) = delete; TransformWriter(XmlFormatter & formatter, ConstCTFReaderTransformPtr transform, - bool isCLF); + SubFormat SubFormat); virtual ~TransformWriter(); @@ -284,8 +278,8 @@ class TransformWriter : public XmlElementWriter void writeOps(const CTFVersion & version) const; private: - ConstCTFReaderTransformPtr m_transform; - bool m_isCLF; + ConstCTFReaderTransformPtr m_transform; + SubFormat m_subFormat = SubFormat::FORMAT_UNKNOWN; }; diff --git a/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.cpp b/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.cpp index d5b5be5dcf..2bb71c895b 100644 --- a/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.cpp +++ b/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.cpp @@ -101,7 +101,8 @@ void XmlReaderDescriptionElt::end() { // Note: eXpat automatically replaces escaped characters with // their original values. - getParent()->appendMetadata(getIdentifier(), m_description); + FormatMetadataImpl metadata(getIdentifier(), m_description); + getParent()->appendMetadata(metadata); } } diff --git a/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.h b/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.h index 203d3bcdfc..bc1abf4ce8 100644 --- a/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.h +++ b/src/OpenColorIO/fileformats/xmlutils/XMLReaderHelper.h @@ -34,9 +34,6 @@ class XmlReaderElement // End the parsing of the element. virtual void end() = 0; - // Is it a container which means if it can hold other elements. - virtual bool isContainer() const = 0; - const std::string & getName() const { return m_name; @@ -64,6 +61,9 @@ class XmlReaderElement { return false; } + + // Is it a container which means if it can hold other elements. + virtual bool isContainer() const = 0; void throwMessage(const std::string & error) const; @@ -135,7 +135,7 @@ class XmlReaderContainerElt : public XmlReaderElement return true; } - virtual void appendMetadata(const std::string & name, const std::string & value) = 0; + virtual void appendMetadata(FormatMetadataImpl& metadata) = 0; private: XmlReaderContainerElt() = delete; @@ -211,7 +211,7 @@ class XmlReaderDummyElt : public XmlReaderPlainElt { } - void appendMetadata(const std::string & /*name*/, const std::string & /*value*/) override + void appendMetadata(FormatMetadataImpl& /*metadata*/) override { } @@ -288,6 +288,7 @@ class XmlReaderDescriptionElt : public XmlReaderPlainElt void start(const char ** /* atts */) override { + // TODO: collect language attr. m_description.resize(0); m_changed = false; } @@ -339,7 +340,7 @@ class XmlReaderComplexElt : public XmlReaderContainerElt return getName().c_str(); } - void appendMetadata(const std::string & /*name*/, const std::string & /*value*/) override + void appendMetadata(FormatMetadataImpl& /*metadata*/) override { } @@ -392,11 +393,11 @@ class XmlReaderSOPNodeBaseElt : public XmlReaderComplexElt void setIsOffsetInit(bool status) { m_isOffsetInit = status; } void setIsPowerInit(bool status) { m_isPowerInit = status; } - void appendMetadata(const std::string & /* name */, const std::string & value) override + void appendMetadata(FormatMetadataImpl& metadata) override { // Add description to parent and override name. - FormatMetadataImpl item(METADATA_SOP_DESCRIPTION, value); - getCDL()->getFormatMetadata().getChildrenElements().push_back(item); + metadata.setElementName(METADATA_SOP_DESCRIPTION); + getCDL()->getFormatMetadata().getChildrenElements().push_back(metadata); } private: @@ -452,11 +453,11 @@ class XmlReaderSatNodeBaseElt : public XmlReaderComplexElt virtual const CDLOpDataRcPtr & getCDL() const = 0; - void appendMetadata(const std::string & /* name */, const std::string & value) override + void appendMetadata(FormatMetadataImpl& metadata) override { // Add description to parent and override name. - FormatMetadataImpl item(METADATA_SAT_DESCRIPTION, value); - getCDL()->getFormatMetadata().getChildrenElements().push_back(item); + metadata.setElementName(METADATA_SAT_DESCRIPTION); + getCDL()->getFormatMetadata().getChildrenElements().push_back(metadata); } diff --git a/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.h b/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.h index 9a813a2551..895771fa87 100644 --- a/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.h +++ b/src/OpenColorIO/fileformats/xmlutils/XMLReaderUtils.h @@ -23,19 +23,20 @@ namespace OCIO_NAMESPACE // Strings used by CDL and CLF parsers or writers. -static constexpr char ATTR_ID[] = "id"; -static constexpr char ATTR_NAME[] = "name"; - -static constexpr char CDL_TAG_COLOR_CORRECTION[] = "ColorCorrection"; - -static constexpr char TAG_DESCRIPTION[] = "Description"; -static constexpr char TAG_OFFSET[] = "Offset"; -static constexpr char TAG_POWER[] = "Power"; -static constexpr char TAG_SATNODE[] = "SatNode"; -static constexpr char TAG_SATNODEALT[] = "SATNode"; -static constexpr char TAG_SATURATION[] = "Saturation"; -static constexpr char TAG_SLOPE[] = "Slope"; -static constexpr char TAG_SOPNODE[] = "SOPNode"; +static constexpr const char* ATTR_ID = "id"; +static constexpr const char* ATTR_NAME = "name"; +static constexpr const char* ATTR_XMLNS = "xmlns"; + +static constexpr const char* CDL_TAG_COLOR_CORRECTION = "ColorCorrection"; + +static constexpr const char* TAG_DESCRIPTION = "Description"; +static constexpr const char* TAG_OFFSET = "Offset"; +static constexpr const char* TAG_POWER = "Power"; +static constexpr const char* TAG_SATNODE = "SatNode"; +static constexpr const char* TAG_SATNODEALT = "SATNode"; +static constexpr const char* TAG_SATURATION = "Saturation"; +static constexpr const char* TAG_SLOPE = "Slope"; +static constexpr const char* TAG_SOPNODE = "SOPNode"; // This method truncates a string (mainly used for display purpose). diff --git a/src/OpenColorIO/ops/cdl/CDLOpCPU.cpp b/src/OpenColorIO/ops/cdl/CDLOpCPU.cpp index 982e992f14..ddb1f8eabc 100644 --- a/src/OpenColorIO/ops/cdl/CDLOpCPU.cpp +++ b/src/OpenColorIO/ops/cdl/CDLOpCPU.cpp @@ -132,7 +132,7 @@ inline void ApplyClamp(__m128&) { } -// Apply the power component to the the pixel's values. +// Apply the power component to the pixel's values. // When the template argument is true, the values in pix // are clamped to the range [0,1] and the power operation is // applied. When the argument is false, the values in pix are @@ -154,7 +154,7 @@ inline void ApplyPower(__m128& pix, const __m128& power) pix = sseSelect(negMask, pix, pixPower); } -// Apply the saturation component to the the pixel's values +// Apply the saturation component to the pixel's values inline void ApplySaturation(__m128& pix, const __m128 saturation) { // Compute luma: dot product of pixel values and the luma weights @@ -179,7 +179,7 @@ inline void ApplyScale(float * pix, const float scale) pix[2] = pix[2] * scale; } -// Apply the slope component to the the pixel's values +// Apply the slope component to the pixel's values inline void ApplySlope(float * pix, const float * slope) { pix[0] = pix[0] * slope[0]; @@ -187,7 +187,7 @@ inline void ApplySlope(float * pix, const float * slope) pix[2] = pix[2] * slope[2]; } -// Apply the offset component to the the pixel's values +// Apply the offset component to the pixel's values inline void ApplyOffset(float * pix, const float * offset) { pix[0] = pix[0] + offset[0]; @@ -195,7 +195,7 @@ inline void ApplyOffset(float * pix, const float * offset) pix[2] = pix[2] + offset[2]; } -// Apply the saturation component to the the pixel's values +// Apply the saturation component to the pixel's values inline void ApplySaturation(float * pix, const float saturation) { const float srcpix[3] = { pix[0], pix[1], pix[2] }; @@ -232,7 +232,7 @@ inline void ApplyClamp(float *) { } -// Apply the power component to the the pixel's values. +// Apply the power component to the pixel's values. // When the template argument is true, the values in pix // are clamped to the range [0,1] and the power operation is // applied. When the argument is false, the values in pix are diff --git a/src/OpenColorIO/ops/exponent/ExponentOp.cpp b/src/OpenColorIO/ops/exponent/ExponentOp.cpp index 41b95992c4..e10eb56b71 100644 --- a/src/OpenColorIO/ops/exponent/ExponentOp.cpp +++ b/src/OpenColorIO/ops/exponent/ExponentOp.cpp @@ -41,6 +41,10 @@ ExponentOpData::ExponentOpData(const ExponentOpData & rhs) ExponentOpData::ExponentOpData(const double * exp4) : OpData() { + if (!exp4) + { + throw Exception("ExponentOpData: exp4 must not be null."); + } memcpy(m_exp4, exp4, 4*sizeof(double)); } diff --git a/src/OpenColorIO/ops/fixedfunction/ACES2/Common.h b/src/OpenColorIO/ops/fixedfunction/ACES2/Common.h index 18f0123636..2bfa79c90a 100644 --- a/src/OpenColorIO/ops/fixedfunction/ACES2/Common.h +++ b/src/OpenColorIO/ops/fixedfunction/ACES2/Common.h @@ -47,10 +47,11 @@ inline float from_radians(const float v) { return wrap_to_hue_limit(v); }; struct TableBase { - static constexpr unsigned int _TABLE_ADDITION_ENTRIES = 2; - static constexpr unsigned int base_index = 1; + static constexpr unsigned int _TABLE_ADDITION_LOWER_ENTRIES = 1; + static constexpr unsigned int _TABLE_ADDITION_UPPER_ENTRIES = 2; + static constexpr unsigned int base_index = _TABLE_ADDITION_LOWER_ENTRIES; static constexpr unsigned int nominal_size = 360; - static constexpr unsigned int total_size = nominal_size + _TABLE_ADDITION_ENTRIES; + static constexpr unsigned int total_size = nominal_size + _TABLE_ADDITION_LOWER_ENTRIES + _TABLE_ADDITION_UPPER_ENTRIES; static constexpr unsigned int lower_wrap_index = 0; static constexpr unsigned int upper_wrap_index = base_index + nominal_size; diff --git a/src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp b/src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp index d3bd1771ee..889c2a90be 100644 --- a/src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp +++ b/src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp @@ -730,8 +730,9 @@ void build_hue_table(Table1D &hue_table, const std::array find_display_cusp_for_hue(float hue, const std::array& RGB_corners, const std::array& JMh_corners, @@ -820,12 +821,15 @@ Table3D build_cusp_table(const Table1D& hue_table, const std::arraygetResourcePrefix() << std::string("_") @@ -518,7 +518,7 @@ std::string _Add_Reach_table( std::string name(resName.str()); StringUtils::ReplaceInPlace(name, "__", "_"); - // Register texture + // Determine texture dimensions. GpuShaderDesc::TextureDimensions dimensions = GpuShaderDesc::TEXTURE_1D; if (shaderCreator->getLanguage() == GPU_LANGUAGE_GLSL_ES_1_0 || shaderCreator->getLanguage() == GPU_LANGUAGE_GLSL_ES_3_0 @@ -527,31 +527,35 @@ std::string _Add_Reach_table( dimensions = GpuShaderDesc::TEXTURE_2D; } - const unsigned textureIndex = shaderCreator->addTexture( - name.c_str(), - GpuShaderText::getSamplerName(name).c_str(), - table.total_size, - 1, - GpuShaderCreator::TEXTURE_RED_CHANNEL, - dimensions, - INTERP_NEAREST, - &(table[0])); - + // Copy the LUT into the shaderCreator as a Texture object. + const unsigned textureShaderBindingIndex = shaderCreator->addTexture( + name.c_str(), + GpuShaderText::getSamplerName(name).c_str(), + table.total_size, + 1, + GpuShaderCreator::TEXTURE_RED_CHANNEL, + dimensions, + INTERP_NEAREST, + &(table[0]) + ); + // Create the texture declaration. if (dimensions == GpuShaderDesc::TEXTURE_1D) { GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex1D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex1D(name, shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } else { GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex2D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex2D(name, shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } - // Sampler function + // Sampler function. GpuShaderText ss(shaderCreator->getLanguage()); ss.newLine() << ss.floatKeyword() << " " << name << "_sample(float h)"; @@ -559,18 +563,18 @@ std::string _Add_Reach_table( ss.indent(); ss.newLine() << ss.floatDecl("i_base") << " = floor(h);"; - ss.newLine() << ss.floatDecl("i_lo") << " = i_base + " << table.base_index << ";"; - ss.newLine() << ss.floatDecl("i_hi") << " = i_lo + 1;"; + ss.newLine() << ss.floatDecl("i_lo") << " = i_base + " << ss.floatKeyword() << "(" << table.base_index << ");"; + ss.newLine() << ss.floatDecl("i_hi") << " = i_lo + 1.0;"; if (dimensions == GpuShaderDesc::TEXTURE_1D) { - ss.newLine() << ss.floatDecl("lo") << " = " << ss.sampleTex1D(name, "(i_lo + 0.5) / " + std::to_string(table.total_size)) << ".r;"; - ss.newLine() << ss.floatDecl("hi") << " = " << ss.sampleTex1D(name, "(i_hi + 0.5) / " + std::to_string(table.total_size)) << ".r;"; + ss.newLine() << ss.floatDecl("lo") << " = " << ss.sampleTex1D(name, "(i_lo + 0.5) / " + ss.floatKeyword() + " (" + std::to_string(table.total_size) + ")") << ".r;"; + ss.newLine() << ss.floatDecl("hi") << " = " << ss.sampleTex1D(name, "(i_hi + 0.5) / " + ss.floatKeyword() + " (" + std::to_string(table.total_size) + ")") << ".r;"; } else { - ss.newLine() << ss.floatDecl("lo") << " = " << ss.sampleTex2D(name, ss.float2Const("(i_lo + 0.5) / " + std::to_string(table.total_size), "0.0")) << ".r;"; - ss.newLine() << ss.floatDecl("hi") << " = " << ss.sampleTex2D(name, ss.float2Const("(i_hi + 0.5) / " + std::to_string(table.total_size), "0.5")) << ".r;"; + ss.newLine() << ss.floatDecl("lo") << " = " << ss.sampleTex2D(name, ss.float2Const("(i_lo + 0.5) / " + ss.floatKeyword() + " (" + std::to_string(table.total_size) + ")", "0.0")) << ".r;"; + ss.newLine() << ss.floatDecl("hi") << " = " << ss.sampleTex2D(name, ss.float2Const("(i_hi + 0.5) / " + ss.floatKeyword() + " (" + std::to_string(table.total_size) + ")", "0.5")) << ".r;"; } ss.newLine() << ss.floatDecl("t") << " = h - i_base;"; // Hardcoded single degree spacing @@ -805,7 +809,7 @@ std::string _Add_Cusp_table( unsigned resourceIndex, const ACES2::GamutCompressParams & g) { - // Reserve name + // Reserve name. std::ostringstream resName; resName << shaderCreator->getResourcePrefix() << std::string("_") @@ -816,7 +820,7 @@ std::string _Add_Cusp_table( std::string name(resName.str()); StringUtils::ReplaceInPlace(name, "__", "_"); - // Register texture + // Determine texture dimensions. GpuShaderDesc::TextureDimensions dimensions = GpuShaderDesc::TEXTURE_1D; if (shaderCreator->getLanguage() == GPU_LANGUAGE_GLSL_ES_1_0 || shaderCreator->getLanguage() == GPU_LANGUAGE_GLSL_ES_3_0 @@ -825,30 +829,35 @@ std::string _Add_Cusp_table( dimensions = GpuShaderDesc::TEXTURE_2D; } - const unsigned textureIndex = shaderCreator->addTexture( - name.c_str(), - GpuShaderText::getSamplerName(name).c_str(), - g.gamut_cusp_table.total_size, - 1, - GpuShaderCreator::TEXTURE_RGB_CHANNEL, - dimensions, - INTERP_NEAREST, - &(g.gamut_cusp_table[0][0])); + // Copy the LUT into the shaderCreator as a Texture object. + const unsigned textureShaderBindingIndex = shaderCreator->addTexture( + name.c_str(), + GpuShaderText::getSamplerName(name).c_str(), + g.gamut_cusp_table.total_size, + 1, + GpuShaderCreator::TEXTURE_RGB_CHANNEL, + dimensions, + INTERP_NEAREST, + &(g.gamut_cusp_table[0][0]) + ); + // Create the texture declaration. if (dimensions == GpuShaderDesc::TEXTURE_1D) { GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex1D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex1D(name, shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } else { GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex2D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex2D(name, shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } - // Sampler function + // Sampler function. GpuShaderText ss(shaderCreator->getLanguage()); const std::string hues_array_name = name + "_hues_array"; @@ -892,13 +901,13 @@ std::string _Add_Cusp_table( if (dimensions == GpuShaderDesc::TEXTURE_1D) { - ss.newLine() << ss.float3Decl("lo") << " = " << ss.sampleTex1D(name, std::string("(i_hi - 1 + 0.5) / ") + std::to_string(g.gamut_cusp_table.total_size)) << ".rgb;"; - ss.newLine() << ss.float3Decl("hi") << " = " << ss.sampleTex1D(name, std::string("(i_hi + 0.5) / ") + std::to_string(g.gamut_cusp_table.total_size)) << ".rgb;"; + ss.newLine() << ss.float3Decl("lo") << " = " << ss.sampleTex1D(name, std::string("(" + ss.floatKeyword() + "(i_hi) - 1.0 + 0.5) / ") + ss.floatKeyword() + "(" + std::to_string(g.gamut_cusp_table.total_size) + ")") << ".rgb;"; + ss.newLine() << ss.float3Decl("hi") << " = " << ss.sampleTex1D(name, std::string("(" + ss.floatKeyword() + "(i_hi) + 0.5) / ") + ss.floatKeyword() + "(" + std::to_string(g.gamut_cusp_table.total_size) + ")") << ".rgb;"; } else { - ss.newLine() << ss.float3Decl("lo") << " = " << ss.sampleTex2D(name, ss.float2Const(std::string("(i_hi - 1 + 0.5) / ") + std::to_string(g.gamut_cusp_table.total_size), "0.5")) << ".rgb;"; - ss.newLine() << ss.float3Decl("hi") << " = " << ss.sampleTex2D(name, ss.float2Const(std::string("(i_hi + 0.5) / ") + std::to_string(g.gamut_cusp_table.total_size), "0.5")) << ".rgb;"; + ss.newLine() << ss.float3Decl("lo") << " = " << ss.sampleTex2D(name, ss.float2Const(std::string("(" + ss.floatKeyword() + "(i_hi) - 1.0 + 0.5) / ") + ss.floatKeyword() + "(" + std::to_string(g.gamut_cusp_table.total_size) + ")", "0.5")) << ".rgb;"; + ss.newLine() << ss.float3Decl("hi") << " = " << ss.sampleTex2D(name, ss.float2Const(std::string("(" + ss.floatKeyword() + "(i_hi) + 0.5) / ") + ss.floatKeyword() + "(" + std::to_string(g.gamut_cusp_table.total_size) + ")", "0.5")) << ".rgb;"; } ss.newLine() << ss.floatDecl("t") << " = (h - " << hues_array_name << "[i_hi - 1]) / " diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpCPU.cpp b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpCPU.cpp index f0e73d648f..760bd78b60 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpCPU.cpp +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpCPU.cpp @@ -190,7 +190,7 @@ inline void ApplyLinContrast(float * pix, const float * contrast, const float pi pix[2] = std::pow(std::abs(pix[2] / pivot), contrast[2]) * std::copysign(pivot, pix[2]); } -// Apply the slope component to the the pixel's values +// Apply the slope component to the pixel's values inline void ApplySlope(float * pix, const float * slope) { pix[0] = pix[0] * slope[0]; @@ -198,7 +198,7 @@ inline void ApplySlope(float * pix, const float * slope) pix[2] = pix[2] * slope[2]; } -// Apply the offset component to the the pixel's values. +// Apply the offset component to the pixel's values. inline void ApplyOffset(float * pix, const float * m_offset) { pix[0] = pix[0] + m_offset[0]; @@ -216,7 +216,7 @@ inline void ApplyGamma(float * pix, const float * gamma, float blackPivot, float std::copysign(1.f, pix[2] - blackPivot) * (whitePivot - blackPivot) + blackPivot; } -// Apply the saturation component to the the pixel's values. +// Apply the saturation component to the pixel's values. inline void ApplySaturation(float * pix, const float m_saturation) { if (m_saturation != 1.f) diff --git a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.cpp b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.cpp index a0d2298f0c..8ada40bdcf 100644 --- a/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.cpp +++ b/src/OpenColorIO/ops/gradingprimary/GradingPrimaryOpGPU.cpp @@ -501,10 +501,11 @@ void AddGPVideoInverseShader(GpuShaderCreatorRcPtr & shaderCreator, st.newLine() << pxl << ".rgb = ( " << pxl << ".rgb - " << props.pivotBlack << " ) * "<< props.slope <<" + " << props.pivotBlack << ";"; - st.newLine() << pxl << ".rgb += " << props.offset << " );"; -} + st.newLine() << pxl << ".rgb += " << props.offset << ";"; } +} // namespace + void GetGradingPrimaryGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstGradingPrimaryOpDataRcPtr & gpData) { diff --git a/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.cpp b/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.cpp index 8dc8d8d23d..d046111651 100644 --- a/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.cpp +++ b/src/OpenColorIO/ops/gradingrgbcurve/GradingBSplineCurve.cpp @@ -1155,7 +1155,12 @@ void GradingBSplineCurveImpl::AddShaderEvalRev(GpuShaderText & st, st.newLine() << "float kn = " << knots << "[knotsOffs + i];"; st.newLine() << "float C0 = C - x;"; st.newLine() << "float discrim = sqrt(B * B - 4. * A * C0);"; - st.newLine() << "return kn + (-2. * C0) / (discrim + B);"; + st.newLine() << "float denom = discrim + B;"; + st.newLine() << "if (abs(denom) < 1e-5)"; + st.newLine() << "{"; + st.newLine() << " return abs(B) < 1e-5 ? kn : kn + (-C0 / B);"; + st.newLine() << "}"; + st.newLine() << "return kn + (-2. * C0) / denom;"; } //------------------------------------------------------------------------------------------------ @@ -1229,7 +1234,12 @@ void GradingBSplineCurveImpl::AddShaderEvalRevHue(GpuShaderText & st, st.newLine() << "}"; st.newLine() << "float C0 = C - x;"; st.newLine() << "float discrim = sqrt(B * B - 4. * A * C0);"; - st.newLine() << "return kn + (-2. * C0) / (discrim + B);"; + st.newLine() << "float denom = discrim + B;"; + st.newLine() << "if (abs(denom) < 1e-5)"; + st.newLine() << "{"; + st.newLine() << " return abs(B) < 1e-5 ? kn : kn + (-C0 / B);"; + st.newLine() << "}"; + st.newLine() << "return kn + (-2. * C0) / denom;"; } //------------------------------------------------------------------------------------------------ @@ -1360,7 +1370,13 @@ float GradingBSplineCurveImpl::KnotsCoefs::evalCurveRev(int c, float y) const const float kn = m_knotsArray[knotsOffs + i]; const float C0 = C - y; const float discrim = sqrt(B * B - 4.f * A * C0); - return kn + (-2.f * C0) / (discrim + B); + const float denom = discrim + B; + if (std::fabs(denom) < 1e-5f) + { + // A~=0, B<0: linear segment with negative slope; use linear inverse. + return std::fabs(B) < 1e-5f ? kn : kn + (-C0 / B); + } + return kn + (-2.f * C0) / denom; } } @@ -1432,7 +1448,13 @@ float GradingBSplineCurveImpl::KnotsCoefs::evalCurveRevHue(int c, float y) const } const float C0 = C - y; const float discrim = sqrt(B * B - 4.f * A * C0); - return kn + (-2.f * C0) / (discrim + B); + const float denom = discrim + B; + if (std::fabs(denom) < 1e-5f) + { + // A~=0, B<0: linear segment with negative slope; use linear inverse. + return std::fabs(B) < 1e-5f ? kn : kn + (-C0 / B); + } + return kn + (-2.f * C0) / denom; // Note: The caller should wrap to ensure the output is a hue on [0,1). } diff --git a/src/OpenColorIO/ops/gradingtone/GradingTone.cpp b/src/OpenColorIO/ops/gradingtone/GradingTone.cpp index 932b0a6d14..4851e72cb5 100644 --- a/src/OpenColorIO/ops/gradingtone/GradingTone.cpp +++ b/src/OpenColorIO/ops/gradingtone/GradingTone.cpp @@ -60,7 +60,7 @@ void GradingTone::validate() const static constexpr double MinSHTol = MinSH - Error; static constexpr double MaxSHTol = MaxSH + Error; static constexpr double MinWSCTol = MinWSC - Error; - static constexpr double MaxSCTol = MaxSC - Error; + static constexpr double MaxSCTol = MaxSC + Error; { const auto & bd = m_blacks; diff --git a/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp b/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp index 573496d653..f901859800 100644 --- a/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp +++ b/src/OpenColorIO/ops/lut1d/Lut1DOpGPU.cpp @@ -198,16 +198,18 @@ void GetLut1DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, dimensions = GpuShaderDesc::TEXTURE_2D; } - // (Using CacheID here to potentially allow reuse of existing textures.) - const unsigned textureIndex = shaderCreator->addTexture(name.c_str(), - GpuShaderText::getSamplerName(name).c_str(), - width, - height, - singleChannel ? GpuShaderCreator::TEXTURE_RED_CHANNEL - : GpuShaderCreator::TEXTURE_RGB_CHANNEL, - dimensions, - lutData->getConcreteInterpolation(), - &values[0]); + // Copy the LUT into the shaderCreator as a Texture object. + const unsigned textureShaderBindingIndex = shaderCreator->addTexture( + name.c_str(), + GpuShaderText::getSamplerName(name).c_str(), + width, + height, + singleChannel ? GpuShaderCreator::TEXTURE_RED_CHANNEL + : GpuShaderCreator::TEXTURE_RGB_CHANNEL, + dimensions, + lutData->getConcreteInterpolation(), + &values[0] + ); // Add the LUT code to the OCIO shader program. @@ -217,12 +219,14 @@ void GetLut1DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, // or the language doesn't support 1D textures, // a 2D texture is used. + // Create a 2D texture declaration. { GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex2D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex2D(name, shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } - + // Create the helper function to deal with 2D array lookups. { GpuShaderText ss(shaderCreator->getLanguage()); @@ -302,8 +306,10 @@ void GetLut1DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, } else { + // Create a 1D texture declaration. GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex1D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex1D(name, shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp b/src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp index e17cbcfce6..2331d1777b 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpData.cpp @@ -58,9 +58,6 @@ Lut3DOpDataRcPtr MakeFastLut3DFromInverse(ConstLut3DOpDataRcPtr & lut) return result; } -// 129 allows for a MESH dimension of 7 in the 3dl file format. -const unsigned long Lut3DOpData::maxSupportedLength = 129; - // Functional composition is a concept from mathematics where two functions // are combined into a single function. This idea may be applied to ops // where we generate a single op that has the same (or similar) effect as @@ -196,11 +193,11 @@ void Lut3DOpData::Lut3DArray::fill() void Lut3DOpData::Lut3DArray::resize(unsigned long length, unsigned long numColorComponents) { - if (length > maxSupportedLength) + if (length > Max3DLUTLength) { std::ostringstream oss; oss << "LUT 3D: Grid size '" << length - << "' must not be greater than '" << maxSupportedLength << "'."; + << "' must not be greater than '" << Max3DLUTLength << "'."; throw Exception(oss.str().c_str()); } Array::resize(length, numColorComponents); @@ -389,7 +386,7 @@ void Lut3DOpData::validate() const throw Exception("Lut3D has an incorrect number of color components. "); } - if (getArray().getLength()>maxSupportedLength) + if (getArray().getLength()>Max3DLUTLength) { // This should never happen. Enforced by resize. std::ostringstream oss; diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpData.h b/src/OpenColorIO/ops/lut3d/Lut3DOpData.h index 370f496c74..c10f2af3eb 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpData.h +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpData.h @@ -8,6 +8,7 @@ #include +#include "LutLimits.h" #include "Op.h" #include "ops/OpArray.h" #include "PrivateTypes.h" @@ -23,9 +24,6 @@ class Lut3DOpData : public OpData { public: - // The maximum grid size supported for a 3D LUT. - static const unsigned long maxSupportedLength; - // Use functional composition to generate a single op that // approximates the effect of the pair of ops. static Lut3DOpDataRcPtr Compose(ConstLut3DOpDataRcPtr & lut1, ConstLut3DOpDataRcPtr & lut2); diff --git a/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp b/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp index 01423f6973..e81bd180b7 100644 --- a/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp +++ b/src/OpenColorIO/ops/lut3d/Lut3DOpGPU.cpp @@ -38,16 +38,22 @@ void GetLut3DGPUShaderProgram(GpuShaderCreatorRcPtr & shaderCreator, ConstLut3DO { samplerInterpolation = INTERP_NEAREST; } - // (Using CacheID here to potentially allow reuse of existing textures.) - const unsigned textureIndex = shaderCreator->add3DTexture(name.c_str(), - GpuShaderText::getSamplerName(name).c_str(), - lutData->getGridSize(), - samplerInterpolation, - &lutData->getArray()[0]); + // Copy the LUT into the shaderCreator as a Texture object. + const unsigned textureShaderBindingIndex = shaderCreator->add3DTexture( + name.c_str(), + GpuShaderText::getSamplerName(name).c_str(), + lutData->getGridSize(), + samplerInterpolation, + &lutData->getArray()[0] + ); + + // Create the texture declaration. { GpuShaderText ss(shaderCreator->getLanguage()); - ss.declareTex3D(name, shaderCreator->getDescriptorSetIndex(), textureIndex, shaderCreator->getTextureBindingStart()); + ss.declareTex3D(name, + shaderCreator->getDescriptorSetIndex(), + textureShaderBindingIndex); shaderCreator->addToTextureDeclareShaderCode(ss.string().c_str()); } diff --git a/src/OpenColorIO/ops/matrix/MatrixOp.cpp b/src/OpenColorIO/ops/matrix/MatrixOp.cpp index 93505a284e..b593983128 100644 --- a/src/OpenColorIO/ops/matrix/MatrixOp.cpp +++ b/src/OpenColorIO/ops/matrix/MatrixOp.cpp @@ -304,7 +304,12 @@ void CreateMinMaxOp(OpRcPtrVec & ops, bool somethingToDo = false; for (int i = 0; i < 3; ++i) { - scale4[i] = 1.0 / (from_max3[i] - from_min3[i]); + const double range = from_max3[i] - from_min3[i]; + if (range == 0.0) + { + throw Exception("CreateMinMaxOp: from_min and from_max must not be equal."); + } + scale4[i] = 1.0 / range; offset4[i] = -from_min3[i] * scale4[i]; somethingToDo |= (scale4[i] != 1.0 || offset4[i] != 0.0); } diff --git a/src/OpenColorIO/ops/matrix/MatrixOpData.cpp b/src/OpenColorIO/ops/matrix/MatrixOpData.cpp index 9750b154eb..709cde55ca 100644 --- a/src/OpenColorIO/ops/matrix/MatrixOpData.cpp +++ b/src/OpenColorIO/ops/matrix/MatrixOpData.cpp @@ -373,6 +373,10 @@ void MatrixOpData::MatrixArray::expandFrom3x3To4x4() void MatrixOpData::MatrixArray::setRGBA(const float * values) { + if (!values) + { + throw Exception("Matrix: setRGBA NULL pointer."); + } Values & v = getValues(); v[0] = values[0]; @@ -398,6 +402,10 @@ void MatrixOpData::MatrixArray::setRGBA(const float * values) void MatrixOpData::MatrixArray::setRGBA(const double * values) { + if (!values) + { + throw Exception("Matrix: setRGBA NULL pointer."); + } Values & v = getValues(); std::memcpy(&v[0], values, 16 * sizeof(double)); } diff --git a/src/OpenColorIO/transforms/AllocationTransform.cpp b/src/OpenColorIO/transforms/AllocationTransform.cpp index eeca74431d..1ab8aea5b6 100755 --- a/src/OpenColorIO/transforms/AllocationTransform.cpp +++ b/src/OpenColorIO/transforms/AllocationTransform.cpp @@ -146,6 +146,10 @@ void AllocationTransform::setVars(int numvars, const float * vars) if(!getImpl()->m_vars.empty()) { + if (!vars) + { + throw Exception("AllocationTransform::setVars: vars pointer must not be null."); + } memcpy(&getImpl()->m_vars[0], vars, numvars*sizeof(float)); diff --git a/src/OpenColorIO/transforms/CDLTransform.cpp b/src/OpenColorIO/transforms/CDLTransform.cpp index 393bec4dbe..a6ac91891b 100755 --- a/src/OpenColorIO/transforms/CDLTransform.cpp +++ b/src/OpenColorIO/transforms/CDLTransform.cpp @@ -7,7 +7,6 @@ #include -#include "fileformats/cdl/CDLParser.h" #include "Logging.h" #include "MathUtils.h" #include "Mutex.h" diff --git a/src/OpenColorIO/transforms/FileTransform.cpp b/src/OpenColorIO/transforms/FileTransform.cpp index 33da5f3077..6fd1549d61 100755 --- a/src/OpenColorIO/transforms/FileTransform.cpp +++ b/src/OpenColorIO/transforms/FileTransform.cpp @@ -110,7 +110,7 @@ const char * FileTransform::getSrc() const void FileTransform::setSrc(const char * src) { - getImpl()->m_src = src; + getImpl()->m_src = src ? src : ""; } const char * FileTransform::getCCCId() const @@ -120,7 +120,7 @@ const char * FileTransform::getCCCId() const void FileTransform::setCCCId(const char * cccid) { - getImpl()->m_cccid = cccid; + getImpl()->m_cccid = cccid ? cccid : ""; } CDLStyle FileTransform::getCDLStyle() const diff --git a/src/OpenColorIO/transforms/FixedFunctionTransform.cpp b/src/OpenColorIO/transforms/FixedFunctionTransform.cpp index 07baef12a9..1c00c8c0e8 100644 --- a/src/OpenColorIO/transforms/FixedFunctionTransform.cpp +++ b/src/OpenColorIO/transforms/FixedFunctionTransform.cpp @@ -21,8 +21,15 @@ FixedFunctionTransformRcPtr FixedFunctionTransform::Create(FixedFunctionStyle st const double * params, size_t num) { + if (!params && num > 0) + { + throw Exception("FixedFunctionTransform::Create: params pointer must not be null."); + } FixedFunctionOpData::Params p(num); - std::copy(params, params + num, p.begin()); + if (num > 0) + { + std::copy(params, params + num, p.begin()); + } return FixedFunctionTransformRcPtr(new FixedFunctionTransformImpl(style, p), &FixedFunctionTransformImpl::deleter); @@ -125,8 +132,15 @@ size_t FixedFunctionTransformImpl::getNumParams() const void FixedFunctionTransformImpl::setParams(const double * params, size_t num) { + if (!params && num > 0) + { + throw Exception("FixedFunctionTransform::setParams: params pointer must not be null."); + } FixedFunctionOpData::Params p(num); - std::copy(params, params+num, p.begin()); + if (num > 0) + { + std::copy(params, params + num, p.begin()); + } data().setParams(p); } diff --git a/src/OpenColorIO/transforms/Lut3DTransform.cpp b/src/OpenColorIO/transforms/Lut3DTransform.cpp index 6e1a2babeb..d0d12d4087 100644 --- a/src/OpenColorIO/transforms/Lut3DTransform.cpp +++ b/src/OpenColorIO/transforms/Lut3DTransform.cpp @@ -201,9 +201,9 @@ std::ostream & operator<< (std::ostream & os, const Lut3DTransform & t) rMin = std::min(rMin, rv); gMin = std::min(gMin, gv); bMin = std::min(bMin, bv); - rMax = std::max(rMin, rv); - gMax = std::max(gMin, gv); - bMax = std::max(bMin, bv); + rMax = std::max(rMax, rv); + gMax = std::max(gMax, gv); + bMax = std::max(bMax, bv); } } } diff --git a/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp b/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp index d828f11ace..f06515bcc7 100644 --- a/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp +++ b/src/OpenColorIO/transforms/builtins/BuiltinTransformRegistry.cpp @@ -124,7 +124,7 @@ void BuiltinTransformRegistryImpl::registerAll() noexcept void CreateBuiltinTransformOps(OpRcPtrVec & ops, size_t nameIndex, TransformDirection direction) { - if (nameIndex > BuiltinTransformRegistry::Get()->getNumBuiltins()) + if (nameIndex >= BuiltinTransformRegistry::Get()->getNumBuiltins()) { throw Exception("Invalid built-in transform name."); } diff --git a/src/apps/ocioarchive/CMakeLists.txt b/src/apps/ocioarchive/CMakeLists.txt index 599d706f09..b8af2808fb 100644 --- a/src/apps/ocioarchive/CMakeLists.txt +++ b/src/apps/ocioarchive/CMakeLists.txt @@ -30,3 +30,7 @@ ocio_strip_binary(ocioarchive) install(TARGETS ocioarchive RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ocioarchive) diff --git a/src/apps/ociobakelut/CMakeLists.txt b/src/apps/ociobakelut/CMakeLists.txt index 3d6e586b96..09cd76b137 100755 --- a/src/apps/ociobakelut/CMakeLists.txt +++ b/src/apps/ociobakelut/CMakeLists.txt @@ -39,3 +39,7 @@ ocio_strip_binary(ociobakelut) install(TARGETS ociobakelut RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociobakelut) diff --git a/src/apps/ociocheck/CMakeLists.txt b/src/apps/ociocheck/CMakeLists.txt index 024139546d..50955bc0d7 100755 --- a/src/apps/ociocheck/CMakeLists.txt +++ b/src/apps/ociocheck/CMakeLists.txt @@ -28,3 +28,7 @@ ocio_strip_binary(ociocheck) install(TARGETS ociocheck RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociocheck) diff --git a/src/apps/ociocheck/main.cpp b/src/apps/ociocheck/main.cpp index 5c66a7eba0..5a0c24524a 100644 --- a/src/apps/ociocheck/main.cpp +++ b/src/apps/ociocheck/main.cpp @@ -28,7 +28,7 @@ const char * DESC_STRING = "\n\n" "that has been manually edited, using the '-o' option.\n"; -// returns true if the interopID is valid +// Returns true if the interopID is valid. bool isValidInteropID(const std::string& id) { // See https://github.com/AcademySoftwareFoundation/ColorInterop for the details. @@ -56,7 +56,7 @@ bool isValidInteropID(const std::string& id) "srgb_rec709_display", "g24_rec709_display", "srgb_p3d65_display", - "srgbx_p3d65_display", + "srgbe_p3d65_display", "pq_p3d65_display", "pq_rec2020_display", "hlg_rec2020_display", @@ -70,15 +70,15 @@ bool isValidInteropID(const std::string& id) if (id.empty()) return true; - // Check if has a namespace. + // Check if the ID has a namespace. size_t pos = id.find(':'); if (pos == std::string::npos) { - // No namespace, so id must be in the Color Interop Forum ID list. + // No namespace, so the ID must be in the Color Interop Forum ID list. if (cifTextureIDs.count(id) == 0 && cifDisplayIDs.count(id)==0) { - std::cout << "ERROR: InteropID '" << id << "' is not valid. " - "It should either be one of Color Interop Forum standard IDs or " + std::cout << "WARNING: InteropID '" << id << "' is not valid. " + "It should either be one of the Color Interop Forum standard IDs or " "it must contain a namespace followed by ':', e.g. 'mycompany:mycolorspace'." << std::endl; return false; @@ -86,21 +86,21 @@ bool isValidInteropID(const std::string& id) } else { - // Namespace found, split into namespace and id. + // Namespace found, split into namespace and ID. std::string ns = id.substr(0, pos); std::string cs = id.substr(pos+1); - // Id should not be in the Color Interop Forum ID list. + // The ID should not be in the Color Interop Forum ID list. if (cifTextureIDs.count(cs) > 0 || cifDisplayIDs.count(cs)> 0) { - std::cout << "ERROR: InteropID '" << id << "' is not valid. " - "The ID part must not be one of the Color Interop Forum standard IDs when a namespace is used." << - std::endl; + std::cout << "WARNING: InteropID '" << id << "' is not valid. " + "The ID part must not be one of the Color Interop Forum standard IDs " + "when a namespace is used." << std::endl; return false; } } - // all clear. + // All clear. return true; } @@ -108,6 +108,7 @@ int main(int argc, const char **argv) { bool help = false; int errorcount = 0; + int warningcount = 0; std::string inputconfig; std::string outputconfig; @@ -357,6 +358,7 @@ int main(int argc, const char **argv) if(!cs) { std::cout << "WARNING: NOT DEFINED (" << role << ")" << std::endl; + warningcount += 1; } } } @@ -369,6 +371,9 @@ int main(int argc, const char **argv) OCIO::SEARCH_REFERENCE_SPACE_ALL, // Iterate over scene & display color spaces. OCIO::COLORSPACE_ALL); // Iterate over active & inactive color spaces. + bool foundCategory = false; + bool foundNoCategory = false; + for(int i=0; igetColorSpace(config->getColorSpaceNameByIndex( @@ -381,10 +386,16 @@ int main(int argc, const char **argv) { if (!isValidInteropID(interopID)) { - errorcount += 1; + warningcount += 1; } } + if(!config->isInactiveColorSpace(cs->getName())) + { + if(cs->getNumCategories() > 0) foundCategory = true; + else foundNoCategory = true; + } + // Try to load the transform for the to_ref direction -- this will load any LUTs. bool toRefOK = true; std::string toRefErrorText; @@ -440,6 +451,14 @@ int main(int argc, const char **argv) std::cout << cs->getName() << std::endl; } } + + if(foundCategory && foundNoCategory) + { + // Categories should either be missing in all, or present in all active items. + std::cout << "\nWARNING: The config has some color spaces " + "where the categories are not set.\n"; + warningcount += 1; + } } { @@ -453,11 +472,20 @@ int main(int argc, const char **argv) std::cout << "no named transforms defined" << std::endl; } + bool foundCategory = false; + bool foundNoCategory = false; + for(int i = 0; igetNamedTransform( config->getNamedTransformNameByIndex(OCIO::NAMEDTRANSFORM_ALL, i)); + if(!config->isInactiveColorSpace(nt->getName())) + { + if(nt->getNumCategories() > 0) foundCategory = true; + else foundNoCategory = true; + } + // Try to load the transform -- this will load any LUTs. bool fwdOK = true; std::string fwdErrorText; @@ -513,6 +541,14 @@ int main(int argc, const char **argv) std::cout << nt->getName() << std::endl; } } + + if(foundCategory && foundNoCategory) + { + // Categories should either be missing in all, or present in all active items. + std::cout << "\nWARNING: The config has some named transforms " + "where the categories are not set.\n"; + warningcount += 1; + } } { @@ -605,11 +641,11 @@ int main(int argc, const char **argv) StringUtils::StringVec svec = StringUtils::SplitByLines(logGuard.output()); if (!StringUtils::Contain(svec, "[OpenColorIO Error]")) { - std::cout << "passed" << std::endl; + std::cout << "Validation: passed" << std::endl; } else { - std::cout << "failed" << std::endl; + std::cout << "Validation: failed" << std::endl; errorcount += 1; } } @@ -618,7 +654,7 @@ int main(int argc, const char **argv) std::cout << "ERROR:" << std::endl; errorcount += 1; std::cout << exception.what() << std::endl; - std::cout << "failed" << std::endl; + std::cout << "Validation: failed" << std::endl; } std::cout << std::endl; @@ -657,6 +693,11 @@ int main(int argc, const char **argv) return 1; } + if(warningcount > 0) + { + std::cout << "\nWarnings encountered: " << warningcount << std::endl; + } + std::cout << std::endl; if(errorcount == 0) { diff --git a/src/apps/ociochecklut/CMakeLists.txt b/src/apps/ociochecklut/CMakeLists.txt index 431b1b79fb..f4662f1b02 100644 --- a/src/apps/ociochecklut/CMakeLists.txt +++ b/src/apps/ociochecklut/CMakeLists.txt @@ -36,3 +36,7 @@ ocio_strip_binary(ociochecklut) install(TARGETS ociochecklut RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociochecklut NEEDS_GL) \ No newline at end of file diff --git a/src/apps/ociochecklut/main.cpp b/src/apps/ociochecklut/main.cpp index 9469090a15..593d676236 100644 --- a/src/apps/ociochecklut/main.cpp +++ b/src/apps/ociochecklut/main.cpp @@ -52,18 +52,18 @@ class ProcessorWrapper m_gpu = gpu; if (!m_oglApp) { - m_oglApp = OCIO::OglApp::CreateOglApp("ociochecklut", 256, 20); + m_oglApp = OCIO::GraphicalApp::CreateApp("ociochecklut", 256, 20); if (m_verbose) { - m_oglApp->printGLInfo(); + m_oglApp->printGraphicsInfo(); } } - m_oglApp->setPrintShader(m_verbose); + m_oglApp->setShaderVerbose(m_verbose); float image[4]{ 0.f, 0.f, 0.f, 0.f }; - m_oglApp->initImage(1, 1, OCIO::OglApp::COMPONENTS_RGBA, image); - m_oglApp->createGLBuffers(); + m_oglApp->initImage(1, 1, OCIO::GraphicalApp::COMPONENTS_RGBA, image); + m_oglApp->createBuffers(); OCIO::GpuShaderDescRcPtr shaderDesc = OCIO::GpuShaderDesc::CreateShaderDesc(); shaderDesc->setLanguage(OCIO::GPU_LANGUAGE_GLSL_1_2); m_gpu->extractGpuShaderInfo(shaderDesc); @@ -98,7 +98,7 @@ class ProcessorWrapper m_oglApp->redisplay(); m_oglApp->readImage(pixel.data()); } - OCIO::OglAppRcPtr m_oglApp; + OCIO::GraphicalAppRcPtr m_oglApp; #else void applyGPU(std::vector &) { diff --git a/src/apps/ocioconvert/CMakeLists.txt b/src/apps/ocioconvert/CMakeLists.txt index 7b7abddcf2..1172588111 100755 --- a/src/apps/ocioconvert/CMakeLists.txt +++ b/src/apps/ocioconvert/CMakeLists.txt @@ -40,3 +40,7 @@ ocio_strip_binary(ocioconvert) install(TARGETS ocioconvert RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ocioconvert NEEDS_GL) diff --git a/src/apps/ocioconvert/main.cpp b/src/apps/ocioconvert/main.cpp index 31a5ed3542..165aefc4a8 100644 --- a/src/apps/ocioconvert/main.cpp +++ b/src/apps/ocioconvert/main.cpp @@ -361,18 +361,18 @@ int main(int argc, const char **argv) #ifdef OCIO_GPU_ENABLED // Initialize GPU. - OCIO::OglAppRcPtr oglApp; + OCIO::GraphicalAppRcPtr oglApp; if (usegpu || usegpuLegacy) { - OCIO::OglApp::Components comp = OCIO::OglApp::COMPONENTS_RGBA; + OCIO::GraphicalApp::Components comp = OCIO::GraphicalApp::COMPONENTS_RGBA; if (imgInput.getNumChannels() == 4) { - comp = OCIO::OglApp::COMPONENTS_RGBA; + comp = OCIO::GraphicalApp::COMPONENTS_RGBA; } else if (imgInput.getNumChannels() == 3) { - comp = OCIO::OglApp::COMPONENTS_RGB; + comp = OCIO::GraphicalApp::COMPONENTS_RGB; } else { @@ -383,7 +383,7 @@ int main(int argc, const char **argv) try { - oglApp = OCIO::OglApp::CreateOglApp("ocioconvert", 256, 20); + oglApp = OCIO::GraphicalApp::CreateApp("ocioconvert", 256, 20); } catch (const OCIO::Exception & e) { @@ -393,14 +393,14 @@ int main(int argc, const char **argv) if (verbose) { - oglApp->printGLInfo(); + oglApp->printGraphicsInfo(); } - oglApp->setPrintShader(outputgpuInfo); + oglApp->setShaderVerbose(outputgpuInfo); oglApp->initImage(imgInput.getWidth(), imgInput.getHeight(), comp, (float *)imgInput.getData()); - oglApp->createGLBuffers(); + oglApp->createBuffers(); } #endif // OCIO_GPU_ENABLED diff --git a/src/apps/ociodisplay/CMakeLists.txt b/src/apps/ociodisplay/CMakeLists.txt index 14b53cfda3..9261f1cab4 100755 --- a/src/apps/ociodisplay/CMakeLists.txt +++ b/src/apps/ociodisplay/CMakeLists.txt @@ -53,3 +53,7 @@ ocio_strip_binary(ociodisplay) install(TARGETS ociodisplay RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociodisplay NEEDS_GL) diff --git a/src/apps/ociodisplay/main.cpp b/src/apps/ociodisplay/main.cpp index ed7f09759a..6eebc3b6a3 100644 --- a/src/apps/ociodisplay/main.cpp +++ b/src/apps/ociodisplay/main.cpp @@ -64,7 +64,7 @@ float g_display_gamma{1.0f}; int g_channelHot[4]{1, 1, 1, 1}; // show rgb int g_viewsMenuID; -OCIO::OglAppRcPtr g_oglApp; +OCIO::GraphicalAppRcPtr g_oglApp; void UpdateOCIOGLState(); @@ -115,14 +115,14 @@ static void InitImageTexture(const char * filename) } } - OCIO::OglApp::Components comp = OCIO::OglApp::COMPONENTS_RGBA; + OCIO::GraphicalApp::Components comp = OCIO::GraphicalApp::COMPONENTS_RGBA; if (img.getNumChannels() == 4) { - comp = OCIO::OglApp::COMPONENTS_RGBA; + comp = OCIO::GraphicalApp::COMPONENTS_RGBA; } else if (img.getNumChannels() == 3) { - comp = OCIO::OglApp::COMPONENTS_RGB; + comp = OCIO::GraphicalApp::COMPONENTS_RGB; } else { @@ -658,7 +658,7 @@ int main(int argc, char **argv) else #endif { - g_oglApp = std::make_shared("ociodisplay", 512, 512); + g_oglApp = std::make_shared("ociodisplay", 512, 512); } } catch (const OCIO::Exception &e) @@ -669,11 +669,11 @@ int main(int argc, char **argv) if (g_verbose) { - g_oglApp->printGLInfo(); + g_oglApp->printGraphicsInfo(); } g_oglApp->setYMirror(); - g_oglApp->setPrintShader(g_gpuinfo); + g_oglApp->setShaderVerbose(g_gpuinfo); glutReshapeFunc(Reshape); glutKeyboardFunc(Key); diff --git a/src/apps/ociolutimage/CMakeLists.txt b/src/apps/ociolutimage/CMakeLists.txt index a470d2f6eb..07bdad9307 100755 --- a/src/apps/ociolutimage/CMakeLists.txt +++ b/src/apps/ociolutimage/CMakeLists.txt @@ -33,3 +33,7 @@ ocio_strip_binary(ociolutimage) install(TARGETS ociolutimage RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociolutimage) diff --git a/src/apps/ociomakeclf/CMakeLists.txt b/src/apps/ociomakeclf/CMakeLists.txt index fc3bd8e9f1..42028303ba 100644 --- a/src/apps/ociomakeclf/CMakeLists.txt +++ b/src/apps/ociomakeclf/CMakeLists.txt @@ -29,3 +29,7 @@ ocio_strip_binary(ociomakeclf) install(TARGETS ociomakeclf RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociomakeclf) diff --git a/src/apps/ociomakeclf/main.cpp b/src/apps/ociomakeclf/main.cpp index b79c771328..32bef97994 100644 --- a/src/apps/ociomakeclf/main.cpp +++ b/src/apps/ociomakeclf/main.cpp @@ -31,7 +31,7 @@ static int parse_end_args(int argc, const char * argv[]) return 0; } -void CreateOutputLutFile(const std::string & outLutFilepath, OCIO::ConstGroupTransformRcPtr transform) +void CreateOutputLutFile(const std::string & outLutFilepath, OCIO::ConstGroupTransformRcPtr transform, bool generateId) { // Get the processor. @@ -55,7 +55,15 @@ void CreateOutputLutFile(const std::string & outLutFilepath, OCIO::ConstGroupTra try { const auto group = optProcessor->createGroupTransform(); - group->write(config, "Academy/ASC Common LUT Format", outfs); + + if(generateId) + { + std::ostringstream ss; + ss << "urn:uuid:" << optProcessor->getCacheID(); + group->getFormatMetadata().addChildElement("Id", ss.str().c_str()); + } + + group->write(config, "Academy/ASC Common LUT Format", outfs); } catch (const OCIO::Exception &) { @@ -79,11 +87,17 @@ void CreateOutputLutFile(const std::string & outLutFilepath, OCIO::ConstGroupTra int main(int argc, const char ** argv) { - bool help = false, verbose = false, measure = false, listCSCColorSpaces = false; + bool help = false; + bool verbose = false; + bool measure = false; + bool listCSCColorSpaces = false; + bool generateId = false; std::string cscColorSpace; ArgParse ap; ap.options("ociomakeclf -- Convert a LUT into CLF format and optionally add conversions from/to ACES2065-1 to make it an LMT.\n" + " The generated file should be compatible with both SMPTE ST 2136-1 as well as the previous\n" + " Academy/ASC v3 version.\n" " If the csc argument is used, the CLF will contain the transforms:\n" " [ACES2065-1 to CSC space] [the LUT] [CSC space to ACES2065-1].\n\n" "usage: ociomakeclf inLutFilepath outLutFilepath --csc cscColorSpace\n" @@ -96,6 +110,7 @@ int main(int argc, const char ** argv) "--measure", &measure, "Measure (in ms) the CLF write", "--list", &listCSCColorSpaces, "List of the supported CSC color spaces", "--csc %s", &cscColorSpace, "The color space that the input LUT expects and produces", + "--generateid",&generateId, "Generates an id based on content and writes in SMPTE Id element format", nullptr); if (ap.parse(argc, argv) < 0) @@ -266,12 +281,12 @@ int main(int argc, const char ** argv) m.resume(); // Create the CLF file. - CreateOutputLutFile(outLutFilepath, grp); + CreateOutputLutFile(outLutFilepath, grp, generateId); } else { // Create the CLF file. - CreateOutputLutFile(outLutFilepath, grp); + CreateOutputLutFile(outLutFilepath, grp, generateId); } } catch (OCIO::Exception & ex) diff --git a/src/apps/ociomergeconfigs/CMakeLists.txt b/src/apps/ociomergeconfigs/CMakeLists.txt index 5a2a5bbe12..d78609112a 100644 --- a/src/apps/ociomergeconfigs/CMakeLists.txt +++ b/src/apps/ociomergeconfigs/CMakeLists.txt @@ -30,3 +30,7 @@ ocio_strip_binary(ociomergeconfigs) install(TARGETS ociomergeconfigs RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociomergeconfigs) diff --git a/src/apps/ocioperf/CMakeLists.txt b/src/apps/ocioperf/CMakeLists.txt index c056080bc5..541439e720 100644 --- a/src/apps/ocioperf/CMakeLists.txt +++ b/src/apps/ocioperf/CMakeLists.txt @@ -25,3 +25,7 @@ ocio_strip_binary(ocioperf) install(TARGETS ocioperf RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ocioperf) diff --git a/src/apps/ocioview/pyproject.toml b/src/apps/ocioview/pyproject.toml index 858223b4d5..10ec8d460f 100644 --- a/src/apps/ocioview/pyproject.toml +++ b/src/apps/ocioview/pyproject.toml @@ -1,49 +1,75 @@ -[tool.poetry] +[project] name = "ocioview" version = "0.1.0" description = "OpenColorIO config visual editor application" -license = "BSD-3-Clause" -authors = ["Contributors to the OpenColorIO Project"] +requires-python = ">=3.10,<3.14" +authors = [ + { name = "Contributors to the OpenColorIO Project" } +] +maintainers = [ + { name = "Contributors to the OpenColorIO Project" } +] +license = { text = "BSD-3-Clause" } +classifiers = [ + "Development Status :: 3 - Alpha", + "Environment :: Console", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "License :: OSI Approved", + "Natural Language :: English", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Topic :: Scientific/Engineering", + "Topic :: Software Development", +] +dependencies = [ + "colour-science>=0.4.5,<0.5", + "colour-visuals", + "imageio>=2,< 3", + "networkx>=3,<4", + "numpy>=1.24,<3", + "opencolorio>=2,<3", + "pygfx>=0.1,<0.3", + "pygments", + "pyopengl", + "pyside6", + "qtawesome", + "scipy>=1.10,<2", +] + +[tool.uv.sources] +"colour-visuals" = { git = "https://github.com/colour-science/colour-visuals.git" } -[tool.poetry.dependencies] -python = ">= 3.9, < 3.12" -colour-science = {git = "https://github.com/colour-science/colour.git"} -colour-visuals = {git = "https://github.com/colour-science/colour-visuals.git"} -imageio = ">= 2, < 3" -networkx = ">= 2.7, < 3" -numpy = ">= 1.22, < 2" -opencolorio = "*" -pygfx = "*" -pygments = "*" -pyopengl = "*" -pyside6 = "*" -qtawesome = "*" -scipy = ">= 1.8, < 2" -wpgu = "*" +[project.optional-dependencies] +docs = [ + "restructuredtext-lint", + "sphinx", +] -[tool.poetry.group.dev.dependencies] -black = "*" -blackdoc = "*" -coverage = "!= 6.3" -coveralls = "*" -flynt = "*" -invoke = "*" -jupyter = "*" -pre-commit = "*" -pyright = "*" -pytest = "*" -pytest-cov = "*" -pytest-qt = "*" -pytest-xdist = "*" -ruff = "*" -toml = "*" -twine = "*" +[tool.uv] +package = true +dev-dependencies = [ + "black", + "coverage", + "coveralls", + "hatch", + "invoke", + "jupyter", + "pre-commit", + "pyright", + "pytest", + "pytest-cov", + "pytest-xdist", + "toml", + "twine", +] -[tool.poetry.group.docs.dependencies] -pydata-sphinx-theme = "*" -restructuredtext-lint = "*" -sphinx = "*" -sphinxcontrib-bibtex = "*" +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = [ "ocioview" ] [tool.black] line-length = 79 @@ -85,7 +111,7 @@ filterwarnings = [ ] [tool.ruff] -target-version = "py39" +target-version = "py310" line-length = 88 select = [ "A", # flake8-builtins @@ -128,7 +154,7 @@ select = [ "TRY", # tryceratops "UP", # pyupgrade "W", # pydocstyle - "YTT" # flake8-2020 + "YTT", # flake8-2020 ] ignore = [ "B008", @@ -162,6 +188,7 @@ ignore = [ "RET508", "TRY003", "TRY300", + "UP038", ] typing-modules = ["colour.hints"] fixable = ["B", "C", "E", "F", "PIE", "RUF", "SIM", "UP", "W"] @@ -172,6 +199,5 @@ convention = "numpy" [tool.ruff.per-file-ignores] "docs/*" = ["INP"] -[build-system] -requires = ["poetry_core>=1.0.0"] -build-backend = "poetry.core.masonry.api" +[tool.ruff.format] +docstring-code-format = true diff --git a/src/apps/ocioview/requirements.txt b/src/apps/ocioview/requirements.txt index 124acd49da..ec6b8bca1e 100644 --- a/src/apps/ocioview/requirements.txt +++ b/src/apps/ocioview/requirements.txt @@ -1,4 +1,4 @@ -colour-science @ git+https://github.com/colour-science/colour.git +colour-science colour-visuals @ git+https://github.com/colour-science/colour-visuals.git imageio networkx @@ -10,4 +10,3 @@ PyOpenGL PySide6 QtAwesome scipy -wgpu diff --git a/src/apps/ociowrite/CMakeLists.txt b/src/apps/ociowrite/CMakeLists.txt index bd77acfea6..ebaf60dc90 100644 --- a/src/apps/ociowrite/CMakeLists.txt +++ b/src/apps/ociowrite/CMakeLists.txt @@ -24,3 +24,7 @@ ocio_strip_binary(ociowrite) install(TARGETS ociowrite RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) + +# Set the debugger environment so that the executable can be launched +# directly within IDE (e.g. Visual Studio). +set_debugger_env(ociowrite) diff --git a/src/bindings/python/PyCPUProcessor.cpp b/src/bindings/python/PyCPUProcessor.cpp index 84b91427bf..e5786ba244 100644 --- a/src/bindings/python/PyCPUProcessor.cpp +++ b/src/bindings/python/PyCPUProcessor.cpp @@ -96,7 +96,10 @@ written to the dstImgDesc image, leaving srcImgDesc unchanged. py::buffer_info info = data.request(); checkBufferDivisible(info, 3); - // Interpret as single row of RGB pixels + // --- detect C-contiguous --- + checkCContiguousArray(info); + + // --- proceed normally --- BitDepth bitDepth = getBufferBitDepth(info); py::gil_scoped_release release; @@ -115,6 +118,7 @@ written to the dstImgDesc image, leaving srcImgDesc unchanged. chanStrideBytes, xStrideBytes, yStrideBytes); + self->apply(img); }, "data"_a, @@ -171,6 +175,8 @@ float values is returned, leaving the input list unchanged. py::buffer_info info = data.request(); checkBufferDivisible(info, 4); + // --- detect C-contiguous --- + checkCContiguousArray(info); // Interpret as single row of RGBA pixels BitDepth bitDepth = getBufferBitDepth(info); diff --git a/src/bindings/python/PyGpuShaderDesc.cpp b/src/bindings/python/PyGpuShaderDesc.cpp index e6c9b600fc..a43f1f3c80 100644 --- a/src/bindings/python/PyGpuShaderDesc.cpp +++ b/src/bindings/python/PyGpuShaderDesc.cpp @@ -29,6 +29,7 @@ struct Texture GpuShaderDesc::TextureType m_channel; GpuShaderDesc::TextureDimensions m_dimensions; Interpolation m_interpolation; + unsigned m_textureShaderBindingIndex; GpuShaderDescRcPtr m_shaderDesc; int m_index; }; @@ -39,6 +40,7 @@ struct Texture3D std::string m_samplerName; unsigned m_edgelen; Interpolation m_interpolation; + unsigned m_textureShaderBindingIndex; GpuShaderDescRcPtr m_shaderDesc; int m_index; }; @@ -140,13 +142,13 @@ void bindPyGpuShaderDesc(py::module & m) py::gil_scoped_release release; - self->addTexture(textureName.c_str(), - samplerName.c_str(), - width, height, - channel, - dimensions, - interpolation, - static_cast(info.ptr)); + return self->addTexture(textureName.c_str(), + samplerName.c_str(), + width, height, + channel, + dimensions, + interpolation, + static_cast(info.ptr)); }, "textureName"_a, "samplerName"_a, "width"_a, "height"_a, "channel"_a, "dimensions"_a, "interpolation"_a, "values"_a, @@ -171,11 +173,11 @@ void bindPyGpuShaderDesc(py::module & m) py::gil_scoped_release release; - self->add3DTexture(textureName.c_str(), - samplerName.c_str(), - edgelen, - interpolation, - static_cast(info.ptr)); + return self->add3DTexture(textureName.c_str(), + samplerName.c_str(), + edgelen, + interpolation, + static_cast(info.ptr)); }, "textureName"_a, "samplerName"_a, "edgeLen"_a, "interpolation"_a, "values"_a, DOC(GpuShaderCreator, add3DTexture)) @@ -253,6 +255,7 @@ void bindPyGpuShaderDesc(py::module & m) .def_readonly("channel", &Texture::m_channel) .def_readonly("dimensions", &Texture::m_dimensions) .def_readonly("interpolation", &Texture::m_interpolation) + .def_readonly("textureShaderBindingIndex", &Texture::m_textureShaderBindingIndex) .def("getValues", [](Texture & self) { py::gil_scoped_release release; @@ -297,9 +300,10 @@ void bindPyGpuShaderDesc(py::module & m) Interpolation interpolation; it.m_obj->getTexture(i, textureName, samplerName, width, height, channel, dimensions, interpolation); + unsigned textureShaderBindingIndex = it.m_obj->getTextureShaderBindingIndex(i); return { textureName, samplerName, width, height, channel, dimensions, interpolation, - it.m_obj, i}; + textureShaderBindingIndex, it.m_obj, i}; }) .def("__iter__", [](TextureIterator & it) -> TextureIterator & { @@ -317,9 +321,10 @@ void bindPyGpuShaderDesc(py::module & m) Interpolation interpolation; it.m_obj->getTexture(i, textureName, samplerName, width, height, channel, dimensions, interpolation); + unsigned textureShaderBindingIndex = it.m_obj->getTextureShaderBindingIndex(i); return { textureName, samplerName, width, height, channel, dimensions, interpolation, - it.m_obj, i}; + textureShaderBindingIndex, it.m_obj, i}; }); clsTexture3D @@ -327,6 +332,7 @@ void bindPyGpuShaderDesc(py::module & m) .def_readonly("samplerName", &Texture3D::m_samplerName) .def_readonly("edgeLen", &Texture3D::m_edgelen) .def_readonly("interpolation", &Texture3D::m_interpolation) + .def_readonly("textureShaderBindingIndex", &Texture3D::m_textureShaderBindingIndex) .def("getValues", [](Texture3D & self) { py::gil_scoped_release release; @@ -355,8 +361,10 @@ void bindPyGpuShaderDesc(py::module & m) unsigned edgelen; Interpolation interpolation; it.m_obj->get3DTexture(i, textureName, samplerName, edgelen, interpolation); + unsigned textureShaderBindingIndex = it.m_obj->get3DTextureShaderBindingIndex(i); - return { textureName, samplerName, edgelen, interpolation, it.m_obj, i }; + return { textureName, samplerName, edgelen, interpolation, textureShaderBindingIndex, + it.m_obj, i }; }) .def("__iter__", [](Texture3DIterator & it) -> Texture3DIterator & { @@ -371,8 +379,10 @@ void bindPyGpuShaderDesc(py::module & m) unsigned edgelen; Interpolation interpolation; it.m_obj->get3DTexture(i, textureName, samplerName, edgelen, interpolation); + unsigned textureShaderBindingIndex = it.m_obj->get3DTextureShaderBindingIndex(i); - return { textureName, samplerName, edgelen, interpolation, it.m_obj, i }; + return { textureName, samplerName, edgelen, interpolation, textureShaderBindingIndex, + it.m_obj, i }; }); } diff --git a/src/bindings/python/PyGradingData.cpp b/src/bindings/python/PyGradingData.cpp index a1a093d7b3..c34179cf4e 100644 --- a/src/bindings/python/PyGradingData.cpp +++ b/src/bindings/python/PyGradingData.cpp @@ -21,11 +21,14 @@ using GradingControlPointIterator = PyIteratorsetSplineType(from->getSplineType()); + const size_t numPt = from->getNumControlPoints(); to->setNumControlPoints(numPt); for (size_t pt = 0; pt < numPt; ++pt) { to->getControlPoint(pt) = from->getControlPoint(pt); + to->setSlope(pt, from->getSlope(pt)); } } diff --git a/src/bindings/python/PyTypes.cpp b/src/bindings/python/PyTypes.cpp index 3305bdbf18..e109708c35 100644 --- a/src/bindings/python/PyTypes.cpp +++ b/src/bindings/python/PyTypes.cpp @@ -971,6 +971,7 @@ void bindPyTypes(py::module & m) m.attr("METADATA_OUTPUT_DESCRIPTOR") = METADATA_OUTPUT_DESCRIPTOR; m.attr("METADATA_NAME") = METADATA_NAME; m.attr("METADATA_ID") = METADATA_ID; + m.attr("METADATA_ID_ELEMENT") = METADATA_ID_ELEMENT; // Caches m.attr("OCIO_DISABLE_ALL_CACHES") = OCIO_DISABLE_ALL_CACHES; diff --git a/src/bindings/python/PyUtils.cpp b/src/bindings/python/PyUtils.cpp index 23be750685..fbf1afc31e 100644 --- a/src/bindings/python/PyUtils.cpp +++ b/src/bindings/python/PyUtils.cpp @@ -179,6 +179,27 @@ void checkBufferType(const py::buffer_info & info, BitDepth bitDepth) checkBufferType(info, bitDepthToDtype(bitDepth)); } +void checkCContiguousArray(const py::buffer_info & info) +{ + bool isC = true; + ptrdiff_t itemsize = info.itemsize; + auto shape = info.shape; + auto strides = info.strides; + py::ssize_t ndim = info.ndim; + + ptrdiff_t expected = itemsize; + for (py::ssize_t i = ndim - 1; i >= 0; --i) + { + if (strides[i] != expected) { isC = false; break; } + expected *= shape[i]; + } + + if (!isC) + { + throw std::runtime_error("function only supports C-contiguous (row-major) arrays"); + } +} + void checkBufferDivisible(const py::buffer_info & info, py::ssize_t numChannels) { if (info.size % numChannels != 0) diff --git a/src/bindings/python/PyUtils.h b/src/bindings/python/PyUtils.h index f5d39ee911..8e0ca44ef5 100644 --- a/src/bindings/python/PyUtils.h +++ b/src/bindings/python/PyUtils.h @@ -89,6 +89,9 @@ unsigned long getBufferLut3DGridSize(const py::buffer_info & info); // Throw if vector size is not divisible by channel count void checkVectorDivisible(const std::vector & pixel, size_t numChannels); +// Throw if array is not C-contiguous +void checkCContiguousArray(const py::buffer_info & info); + } // namespace OCIO_NAMESPACE #endif // INCLUDED_OCIO_PYUTILS_H diff --git a/src/libutils/oglapphelpers/CMakeLists.txt b/src/libutils/oglapphelpers/CMakeLists.txt index cef50ede1c..88e53c317b 100644 --- a/src/libutils/oglapphelpers/CMakeLists.txt +++ b/src/libutils/oglapphelpers/CMakeLists.txt @@ -1,20 +1,41 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenColorIO Project. -if(NOT OCIO_GL_ENABLED) - message(WARNING "GL component missing. Skipping oglapphelpers.") +if(NOT OCIO_GL_ENABLED AND NOT (WIN32 AND OCIO_DIRECTX_ENABLED) AND NOT OCIO_VULKAN_ENABLED) + message(WARNING "GL component missing, DirectX disabled, and Vulkan disabled. Skipping oglapphelpers.") return() endif() set(SOURCES - glsl.cpp - oglapp.cpp + graphicalapp.cpp ) set(INCLUDES - glsl.h - oglapp.h + graphicalapp.h ) +if(OCIO_GL_ENABLED) + list(APPEND SOURCES + glsl.cpp + oglapp.cpp + ) + list(APPEND INCLUDES + glsl.h + oglapp.h + ) +endif() + +if(WIN32 AND OCIO_DIRECTX_ENABLED) + list(APPEND SOURCES + dxapp.cpp + hlsl.cpp + ) + list(APPEND INCLUDES + dxapp.h + dxutils.h + hlsl.h + ) +endif() + if(APPLE) list(APPEND SOURCES @@ -31,7 +52,22 @@ if(APPLE) endif() -add_library(oglapphelpers STATIC ${SOURCES}) +if(OCIO_VULKAN_ENABLED) + + find_package(Vulkan REQUIRED) + find_package(glslang REQUIRED) + + list(APPEND SOURCES + vulkanapp.cpp + ) + + list(APPEND INCLUDES + vulkanapp.h + ) + +endif() + +add_library(oglapphelpers STATIC ${INCLUDES} ${SOURCES}) set_target_properties(oglapphelpers PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(oglapphelpers PROPERTIES OUTPUT_NAME OpenColorIOoglapphelpers) @@ -56,47 +92,55 @@ set_target_properties(oglapphelpers PROPERTIES target_include_directories(oglapphelpers PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} - PRIVATE - ${OPENGL_INCLUDE_DIR} - ${GLEW_INCLUDE_DIRS} - ${GLUT_INCLUDE_DIR} ) +if(OCIO_GL_ENABLED) + target_include_directories(oglapphelpers + PRIVATE + ${OPENGL_INCLUDE_DIR} + ${GLEW_INCLUDE_DIRS} + ${GLUT_INCLUDE_DIR} + ) +endif() -if(${OCIO_USE_GLVND}) - if(${OCIO_EGL_HEADLESS}) - target_include_directories(oglapphelpers - PRIVATE - ${OPENGL_EGL_INCLUDE_DIRS} - ) - target_link_libraries(oglapphelpers - PRIVATE - OpenColorIO - OpenGL::OpenGL - OpenGL::GLU - ${GLEW_LIBRARIES} - ${GLUT_LIBRARIES} - OpenGL::EGL +target_link_libraries(oglapphelpers + PRIVATE + OpenColorIO +) + +if(OCIO_GL_ENABLED) + if(${OCIO_USE_GLVND}) + if(${OCIO_EGL_HEADLESS}) + target_include_directories(oglapphelpers + PRIVATE + ${OPENGL_EGL_INCLUDE_DIRS} ) + target_link_libraries(oglapphelpers + PRIVATE + OpenGL::OpenGL + OpenGL::GLU + ${GLEW_LIBRARIES} + ${GLUT_LIBRARIES} + OpenGL::EGL + ) + else() + target_link_libraries(oglapphelpers + PRIVATE + OpenGL::OpenGL + OpenGL::GLU + ${GLEW_LIBRARIES} + ${GLUT_LIBRARIES} + ) + endif() else() + # if OCIO_USE_GLVND is OFF, OCIO_EGL_HEADLESS is also OFF target_link_libraries(oglapphelpers PRIVATE - OpenColorIO - OpenGL::OpenGL - OpenGL::GLU + ${OPENGL_LIBRARIES} ${GLEW_LIBRARIES} ${GLUT_LIBRARIES} - ) - endif() -else() - # if OCIO_USE_GLVND is OFF, OCIO_EGL_HEADLESS is also OFF - target_link_libraries(oglapphelpers - PRIVATE - OpenColorIO - ${OPENGL_LIBRARIES} - ${GLEW_LIBRARIES} - ${GLUT_LIBRARIES} - ) + ) + endif() endif() if(APPLE) @@ -111,6 +155,52 @@ if(APPLE) ) endif() +if(OCIO_GL_ENABLED) + target_compile_definitions(oglapphelpers + PUBLIC + OCIO_GL_ENABLED + ) +endif() + +if(WIN32 AND OCIO_DIRECTX_ENABLED) + include(ocio_handle_dependency) + ocio_handle_dependency(DirectX-Headers REQUIRED ALLOW_INSTALL + MIN_VERSION 1.606.0 + RECOMMENDED_VERSION 1.619.1 + RECOMMENDED_VERSION_REASON "Latest version tested with OCIO") + target_compile_definitions(oglapphelpers + PUBLIC + OCIO_DIRECTX_ENABLED + ) + target_link_libraries(oglapphelpers + PUBLIC + Microsoft::DirectX-Headers + PRIVATE + d3d12 + dxgi + dxcompiler + dxguid + ) +endif() + +if(OCIO_VULKAN_ENABLED) + target_include_directories(oglapphelpers + PUBLIC + ${Vulkan_INCLUDE_DIRS} + ) + target_link_libraries(oglapphelpers + PUBLIC + Vulkan::Vulkan + glslang::glslang + glslang::glslang-default-resource-limits + glslang::SPIRV + ) + target_compile_definitions(oglapphelpers + PUBLIC + OCIO_VULKAN_ENABLED + ) +endif() + if(${OCIO_EGL_HEADLESS}) target_include_directories(oglapphelpers PRIVATE diff --git a/src/libutils/oglapphelpers/dxapp.cpp b/src/libutils/oglapphelpers/dxapp.cpp new file mode 100644 index 0000000000..57fd1f1f03 --- /dev/null +++ b/src/libutils/oglapphelpers/dxapp.cpp @@ -0,0 +1,1094 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#include +#include +#include + +#include + +#include "dxapp.h" +#include "dxutils.h" + +#include + +namespace OCIO_NAMESPACE +{ + namespace + { + LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) + { + switch (message) + { + case WM_DESTROY: + PostQuitMessage(0); + return 0; + } + + return DefWindowProc(hWnd, message, wParam, lParam); + } + + void GetHardwareAdapter( + IDXGIFactory1* pFactory, + IDXGIAdapter1** ppAdapter, + bool requestHighPerformanceAdapter = true) + { + *ppAdapter = nullptr; + + ComPtr adapter; + + ComPtr factory6; + if (SUCCEEDED(pFactory->QueryInterface(IID_PPV_ARGS(&factory6)))) + { + for ( + UINT adapterIndex = 0; + SUCCEEDED(factory6->EnumAdapterByGpuPreference( + adapterIndex, + requestHighPerformanceAdapter ? DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE : DXGI_GPU_PREFERENCE_UNSPECIFIED, + IID_PPV_ARGS(&adapter))); + ++adapterIndex) + { + DXGI_ADAPTER_DESC1 desc; + adapter->GetDesc1(&desc); + + if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) + { + continue; + } + + if (SUCCEEDED(D3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), nullptr))) + { + break; + } + } + } + + if (adapter.Get() == nullptr) + { + for (UINT adapterIndex = 0; SUCCEEDED(pFactory->EnumAdapters1(adapterIndex, &adapter)); ++adapterIndex) + { + DXGI_ADAPTER_DESC1 desc; + adapter->GetDesc1(&desc); + + if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) + { + continue; + } + + if (SUCCEEDED(D3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), nullptr))) + { + break; + } + } + } + + *ppAdapter = adapter.Detach(); + } + } + +DxApp::DxApp(const char* winTitle, int winWidth, int winHeight) + : m_viewportWidth{ winWidth } + , m_viewportHeight{ winHeight } +{ + // Initialize the window class. + WNDCLASSEXA windowClass = { 0 }; + windowClass.cbSize = sizeof(WNDCLASSEXA); + windowClass.style = CS_HREDRAW | CS_VREDRAW; + windowClass.lpfnWndProc = WindowProc; + windowClass.hInstance = NULL; + windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); + windowClass.lpszClassName = winTitle; + // Only record the class name for cleanup if we actually registered it. + if (RegisterClassExA(&windowClass)) + { + m_windowClassName = winTitle; + } + + RECT windowRect = { 0, 0, static_cast(m_viewportWidth), static_cast(m_viewportHeight) }; + AdjustWindowRect(&windowRect, WS_OVERLAPPEDWINDOW, FALSE); + + // Create the window and store a handle to it. + m_hwnd = CreateWindowA( + windowClass.lpszClassName, + winTitle, + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + CW_USEDEFAULT, + windowRect.right - windowRect.left, + windowRect.bottom - windowRect.top, + NULL, // We have no parent window. + NULL, // We aren't using menus. + NULL, + NULL); + + ShowWindow(m_hwnd, SW_RESTORE); + + UINT dxgiFactoryFlags = 0; +#if defined(_DEBUG) + { + ComPtr debugController; + if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debugController)))) + { + debugController->EnableDebugLayer(); + + // Enable additional debug layers. + dxgiFactoryFlags |= DXGI_CREATE_FACTORY_DEBUG; + } + } +#endif + + ComPtr factory; + ThrowIfFailed(CreateDXGIFactory2(dxgiFactoryFlags, IID_PPV_ARGS(&factory))); + + ComPtr hardwareAdapter; + GetHardwareAdapter(factory.Get(), &hardwareAdapter); + + ThrowIfFailed(D3D12CreateDevice( + hardwareAdapter.Get(), + D3D_FEATURE_LEVEL_11_0, // Standard minimum for D3D12, maximize compatibility + IID_PPV_ARGS(&m_device) + )); + + // Describe and create the command queue. + D3D12_COMMAND_QUEUE_DESC queueDesc = {}; + queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; + queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; + ThrowIfFailed(m_device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&m_commandQueue))); + + DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {}; + swapChainDesc.BufferCount = FrameCount; + swapChainDesc.Width = m_viewportWidth; + swapChainDesc.Height = m_viewportHeight; + swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; + swapChainDesc.SampleDesc.Count = 1; + + ComPtr swapChain; + ThrowIfFailed(factory->CreateSwapChainForHwnd( + m_commandQueue.Get(), // Swap chain needs the queue so that it can force a flush on it. + m_hwnd, + &swapChainDesc, + nullptr, + nullptr, + &swapChain + )); + + // This sample does not support fullscreen transitions. + ThrowIfFailed(factory->MakeWindowAssociation(m_hwnd, DXGI_MWA_NO_ALT_ENTER)); + + ThrowIfFailed(swapChain.As(&m_swapChain)); + + // Create descriptor heaps. + { + // Describe and create a render target view (RTV) descriptor heap. + D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {}; + rtvHeapDesc.NumDescriptors = FrameCount; + rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; + rtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; + ThrowIfFailed(m_device->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(&m_rtvHeap))); + + m_rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); + m_cbvSrvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); + } + + // Create frame resources. + { + CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart()); + + // Create a RTV for each frame. + for (UINT n = 0; n < FrameCount; n++) + { + ThrowIfFailed(m_swapChain->GetBuffer(n, IID_PPV_ARGS(&m_renderTargets[n]))); + m_device->CreateRenderTargetView(m_renderTargets[n].Get(), nullptr, rtvHandle); + rtvHandle.Offset(1, m_rtvDescriptorSize); + } + } + + ThrowIfFailed(m_device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_commandAllocator))); + // Create the command list. + ThrowIfFailed(m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_commandAllocator.Get(), m_pipelineState.Get(), IID_PPV_ARGS(&m_commandList))); + // Close the command list and execute it to begin the initial GPU setup. + ThrowIfFailed(m_commandList->Close()); + + // Create fence + ThrowIfFailed(m_device->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&m_fence))); + m_fenceValue = 1; + m_fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); + if (!m_fenceEvent) + { + throw Exception("DxApp: CreateEvent failed."); + } +} + +DxApp::~DxApp() +{ + // Skip the GPU wait if sync objects were never created (constructor threw early). + if (m_commandQueue && m_fence && m_fenceEvent) + { + waitForPreviousFrame(); + } + + if (m_fenceEvent) + { + CloseHandle(m_fenceEvent); + } + + if (m_hwnd) + { + DestroyWindow(m_hwnd); + } + if (!m_windowClassName.empty()) + { + UnregisterClassA(m_windowClassName.c_str(), NULL); + } +} + +void DxApp::initImage(int imageWidth, int imageHeight, Components comp, const float* imageBuffer) +{ + if (comp != COMPONENTS_RGBA) + { + throw Exception("DxApp: COMPONENTS_RGB is unused and not currently implemented."); + } + + m_imageWidth = imageWidth; + m_imageHeight = imageHeight; + m_comp = comp; + + // Create CBV/SRV heap if not already created (room for image + LUT textures) + if (!m_cbvSrvHeap) + { + D3D12_DESCRIPTOR_HEAP_DESC srvHeapDesc = {}; + srvHeapDesc.NumDescriptors = CbvSrvHeapSize; + srvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; + srvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; + ThrowIfFailed(m_device->CreateDescriptorHeap(&srvHeapDesc, IID_PPV_ARGS(&m_cbvSrvHeap))); + } + + // Create the image texture in default heap + D3D12_RESOURCE_DESC textureDesc = {}; + textureDesc.MipLevels = 1; + textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + textureDesc.Width = m_imageWidth; + textureDesc.Height = m_imageHeight; + textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE; + textureDesc.DepthOrArraySize = 1; + textureDesc.SampleDesc.Count = 1; + textureDesc.SampleDesc.Quality = 0; + textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + + CD3DX12_HEAP_PROPERTIES defaultHeapProps(D3D12_HEAP_TYPE_DEFAULT); + ThrowIfFailed(m_device->CreateCommittedResource( + &defaultHeapProps, + D3D12_HEAP_FLAG_NONE, + &textureDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&m_imageTexture))); + + // Create the upload buffer with row-pitch aligned size + const UINT pixelSize = 4 * sizeof(float); // RGBA32F + const UINT rowPitch = AlignRowPitch(m_imageWidth, pixelSize); + const UINT64 uploadBufferSize = rowPitch * m_imageHeight; + + CD3DX12_HEAP_PROPERTIES uploadHeapProps(D3D12_HEAP_TYPE_UPLOAD); + CD3DX12_RESOURCE_DESC uploadBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(uploadBufferSize); + ThrowIfFailed(m_device->CreateCommittedResource( + &uploadHeapProps, + D3D12_HEAP_FLAG_NONE, + &uploadBufferDesc, + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&m_imageUploadBuffer))); + + // Perform the initial upload + // Map the upload buffer and copy image data + const UINT srcRowPitch = m_imageWidth * pixelSize; // Source data is tightly packed + BYTE* pData = nullptr; + ThrowIfFailed(m_imageUploadBuffer->Map(0, nullptr, reinterpret_cast(&pData))); + + for (int y = 0; y < m_imageHeight; ++y) + { + const BYTE* srcRow = reinterpret_cast(imageBuffer) + y * srcRowPitch; + BYTE* dstRow = pData + y * rowPitch; + memcpy(dstRow, srcRow, srcRowPitch); + } + + m_imageUploadBuffer->Unmap(0, nullptr); + + // Record commands to copy from upload buffer to the image texture + ThrowIfFailed(m_commandAllocator->Reset()); + ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), nullptr)); + + D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {}; + footprint.Offset = 0; + footprint.Footprint.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + footprint.Footprint.Width = m_imageWidth; + footprint.Footprint.Height = m_imageHeight; + footprint.Footprint.Depth = 1; + footprint.Footprint.RowPitch = rowPitch; + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = m_imageUploadBuffer.Get(); + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + srcLocation.PlacedFootprint = footprint; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = m_imageTexture.Get(); + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dstLocation.SubresourceIndex = 0; + + m_commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + + // Transition to PIXEL_SHADER_RESOURCE + auto barrierInit = CD3DX12_RESOURCE_BARRIER::Transition( + m_imageTexture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + m_commandList->ResourceBarrier(1, &barrierInit); + + ThrowIfFailed(m_commandList->Close()); + + // Execute the command list + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + + // Wait for GPU to finish + waitForPreviousFrame(); + + // Create SRV for the image texture in slot 0 + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + srvDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = 1; + + CD3DX12_CPU_DESCRIPTOR_HANDLE srvHandle(m_cbvSrvHeap->GetCPUDescriptorHandleForHeapStart()); + m_device->CreateShaderResourceView(m_imageTexture.Get(), &srvDesc, srvHandle); +} + +void DxApp::updateImage(const float* imageBuffer) +{ + // Map the upload buffer and copy image data row-by-row with proper pitch alignment + const UINT pixelSize = 4 * sizeof(float); // RGBA32F + const UINT srcRowPitch = m_imageWidth * pixelSize; + const UINT dstRowPitch = AlignRowPitch(m_imageWidth, pixelSize); + + BYTE* pData = nullptr; + ThrowIfFailed(m_imageUploadBuffer->Map(0, nullptr, reinterpret_cast(&pData))); + + for (int y = 0; y < m_imageHeight; ++y) + { + const BYTE* srcRow = reinterpret_cast(imageBuffer) + y * srcRowPitch; + BYTE* dstRow = pData + y * dstRowPitch; + memcpy(dstRow, srcRow, srcRowPitch); + } + + m_imageUploadBuffer->Unmap(0, nullptr); + + // Record commands to copy from upload buffer to the image texture + ThrowIfFailed(m_commandAllocator->Reset()); + ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), nullptr)); + + // Transition texture from PIXEL_SHADER_RESOURCE to COPY_DEST for the update + auto barrierUpdate1 = CD3DX12_RESOURCE_BARRIER::Transition( + m_imageTexture.Get(), D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, D3D12_RESOURCE_STATE_COPY_DEST); + m_commandList->ResourceBarrier(1, &barrierUpdate1); + + D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {}; + footprint.Offset = 0; + footprint.Footprint.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + footprint.Footprint.Width = m_imageWidth; + footprint.Footprint.Height = m_imageHeight; + footprint.Footprint.Depth = 1; + footprint.Footprint.RowPitch = dstRowPitch; + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = m_imageUploadBuffer.Get(); + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + srcLocation.PlacedFootprint = footprint; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = m_imageTexture.Get(); + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dstLocation.SubresourceIndex = 0; + + m_commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + + // Transition to PIXEL_SHADER_RESOURCE + auto barrierUpdate2 = CD3DX12_RESOURCE_BARRIER::Transition( + m_imageTexture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + m_commandList->ResourceBarrier(1, &barrierUpdate2); + + ThrowIfFailed(m_commandList->Close()); + + // Execute the command list + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + + // Wait for GPU to finish + waitForPreviousFrame(); +} + +void DxApp::createBuffers() +{ + // Create readback buffer for copying GPU results back to CPU + const UINT pixelSize = 4 * sizeof(float); // RGBA32F + m_readbackRowPitch = AlignRowPitch(m_viewportWidth, pixelSize); + const UINT64 readbackBufferSize = m_readbackRowPitch * m_viewportHeight; + + CD3DX12_HEAP_PROPERTIES readbackHeapProps(D3D12_HEAP_TYPE_READBACK); + CD3DX12_RESOURCE_DESC readbackBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(readbackBufferSize); + ThrowIfFailed(m_device->CreateCommittedResource( + &readbackHeapProps, + D3D12_HEAP_FLAG_NONE, + &readbackBufferDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&m_readbackBuffer))); +} + +void DxApp::setShader(GpuShaderDescRcPtr& shaderDesc) +{ + // Reset command list for LUT texture uploads + ThrowIfFailed(m_commandAllocator->Reset()); + ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), nullptr)); + + // Store shader desc so redisplay() can update uniform values each frame. + m_currentShaderDesc = shaderDesc; + + // Guard against shaders that need more SRV slots than the heap holds. + { + const UINT requiredSRVs + = 1 + shaderDesc->getNumTextures() + shaderDesc->getNum3DTextures(); + if (requiredSRVs > CbvSrvHeapSize) + { + std::ostringstream oss; + oss << "DxApp: shader needs " << requiredSRVs + << " SRV descriptors but the CBV/SRV heap only has " + << CbvSrvHeapSize << " slots."; + throw Exception(oss.str().c_str()); + } + } + + // Create HLSLBuilder to allocate all LUT textures. + // Each texture is placed at the descriptor heap slot matching its HLSL register + // (derived from shaderDesc->get3DTextureShaderBindingIndex / getTextureShaderBindingIndex). + m_hlslBuilder = HLSLBuilder::Create(shaderDesc, m_device.Get(), m_commandList.Get(), + m_cbvSrvHeap.Get()); + + // Execute command list to upload LUT textures and wait for completion + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + waitForPreviousFrame(); + + // Create constant buffer for OCIO uniform variables (dynamic properties). + // D3D12 constant buffers must be 256-byte aligned. We always create one so the + // root signature can unconditionally declare a CBV at b0. + { + m_constantBuffer.Reset(); + m_cbMappedData = nullptr; + + const UINT rawSize = static_cast(shaderDesc->getUniformBufferSize()); + m_cbufferAlignedSize = ((rawSize + 255u) & ~255u); + if (m_cbufferAlignedSize == 0) + m_cbufferAlignedSize = 256u; + + auto heapProps = CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD); + auto cbDesc = CD3DX12_RESOURCE_DESC::Buffer(m_cbufferAlignedSize); + ThrowIfFailed(m_device->CreateCommittedResource( + &heapProps, D3D12_HEAP_FLAG_NONE, &cbDesc, + D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, + IID_PPV_ARGS(&m_constantBuffer))); + + CD3DX12_RANGE readRange(0, 0); + ThrowIfFailed(m_constantBuffer->Map(0, &readRange, + reinterpret_cast(&m_cbMappedData))); + memset(m_cbMappedData, 0, m_cbufferAlignedSize); + } + + // Get the OCIO HLSL shader text + std::string ocioShader = m_hlslBuilder->getShaderText(); + + // Build the full HLSL shader source with a full-screen triangle vertex shader + // and pixel shader that applies OCIO color transform + std::ostringstream hlslSource; + + // Add the OCIO shader functions first + hlslSource << ocioShader << "\n\n"; + + // Declare the image texture and its sampler. + // OCIO's generated shader always starts LUT texture bindings at t1+ (textureBindingStart=1), + // so t0/s0 are always free for the input image. + hlslSource << "Texture2D img : register(t0);\n"; + hlslSource << "SamplerState linearSampler : register(s0);\n\n"; + + // Vertex shader: full-screen triangle using SV_VertexID (no vertex buffer needed) + hlslSource << "struct VSOutput {\n"; + hlslSource << " float4 position : SV_Position;\n"; + hlslSource << " float2 texcoord : TEXCOORD0;\n"; + hlslSource << "};\n\n"; + + hlslSource << "VSOutput VSMain(uint vertexID : SV_VertexID) {\n"; + hlslSource << " VSOutput output;\n"; + hlslSource << " // Full-screen triangle: vertices at (-1,-1), (3,-1), (-1,3)\n"; + hlslSource << " float2 texcoord = float2((vertexID << 1) & 2, vertexID & 2);\n"; + hlslSource << " output.position = float4(texcoord * float2(2, -2) + float2(-1, 1), 0, 1);\n"; + hlslSource << " output.texcoord = texcoord;\n"; + hlslSource << " return output;\n"; + hlslSource << "}\n\n"; + + // Pixel shader: sample image and apply OCIO color transform + hlslSource << "float4 PSMain(VSOutput input) : SV_Target {\n"; + hlslSource << " float4 col = img.Sample(linearSampler, input.texcoord);\n"; + hlslSource << " return " << shaderDesc->getFunctionName() << "(col);\n"; + hlslSource << "}\n"; + + std::string fullShader = hlslSource.str(); + + if (isShaderVerbose()) + { + std::cout << std::endl; + std::cout << "GPU Shader Program:" << std::endl; + std::cout << std::endl; + std::cout << fullShader << std::endl; + std::cout << std::endl; + } + + // The DXC compiler instances and the full-screen-triangle VS bytecode are + // cached across tests — both are invariant. + ensureVertexShaderCompiled(); + + // Create a source blob from the shader string + ComPtr sourceBlob; + ThrowIfFailed(m_dxcUtils->CreateBlobFromPinned( + fullShader.c_str(), static_cast(fullShader.size()), + DXC_CP_UTF8, &sourceBlob)); + + DxcBuffer sourceBuffer; + sourceBuffer.Ptr = sourceBlob->GetBufferPointer(); + sourceBuffer.Size = sourceBlob->GetBufferSize(); + sourceBuffer.Encoding = DXC_CP_UTF8; + + // Compile pixel shader (ps_6_0). + LPCWSTR psArgs[] = { L"-T", L"ps_6_0", L"-E", L"PSMain" }; + ComPtr psResult; + ThrowIfFailed(m_dxcCompiler->Compile(&sourceBuffer, psArgs, _countof(psArgs), + nullptr, IID_PPV_ARGS(&psResult))); + HRESULT psHr; + psResult->GetStatus(&psHr); + if (FAILED(psHr)) + { + ComPtr errors; + psResult->GetOutput(DXC_OUT_ERRORS, IID_PPV_ARGS(&errors), nullptr); + std::ostringstream oss; + oss << "Pixel shader compilation failed (" << HrToString(psHr) << ")"; + if (errors && errors->GetStringLength()) + oss << ":\n" << errors->GetStringPointer(); + std::cerr << oss.str() << std::endl; + throw Exception(oss.str().c_str()); + } + ComPtr pixelShaderBlob; + ThrowIfFailed(psResult->GetOutput(DXC_OUT_OBJECT, IID_PPV_ARGS(&pixelShaderBlob), nullptr)); + + // Build root signature with a descriptor table for all SRVs and a static sampler. + // Total SRVs = 1 (image at t0) + total LUT count (at t1..tN). + // We use the total texture count from shaderDesc to cover all possible binding slots, + // since LUT heap slots are derived from binding indices and may not be sequential. + const UINT numLUTs = shaderDesc->getNumTextures() + shaderDesc->getNum3DTextures(); + UINT totalSRVs = 1 + numLUTs; + + CD3DX12_DESCRIPTOR_RANGE1 srvRange; + srvRange.Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, totalSRVs, 0, 0, D3D12_DESCRIPTOR_RANGE_FLAG_DATA_STATIC); + + // Root parameter 0: descriptor table for all SRVs (image + LUTs). + // Root parameter 1: root CBV at b0 for OCIO uniform variables. + CD3DX12_ROOT_PARAMETER1 rootParameters[2]; + rootParameters[0].InitAsDescriptorTable(1, &srvRange, D3D12_SHADER_VISIBILITY_PIXEL); + rootParameters[1].InitAsConstantBufferView(0, 0, + D3D12_ROOT_DESCRIPTOR_FLAG_DATA_VOLATILE, + D3D12_SHADER_VISIBILITY_PIXEL); + + // Build static samplers: s0 for the input image, s1..sN for each OCIO LUT texture. + std::vector staticSamplers(1 + numLUTs); + for (UINT i = 0; i <= numLUTs; ++i) + { + staticSamplers[i] = {}; + staticSamplers[i].Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR; + staticSamplers[i].AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; + staticSamplers[i].AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; + staticSamplers[i].AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; + staticSamplers[i].MipLODBias = 0; + staticSamplers[i].MaxAnisotropy = 0; + staticSamplers[i].ComparisonFunc = D3D12_COMPARISON_FUNC_NEVER; + staticSamplers[i].BorderColor = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK; + staticSamplers[i].MinLOD = 0.0f; + staticSamplers[i].MaxLOD = D3D12_FLOAT32_MAX; + staticSamplers[i].ShaderRegister = i; // s0 = image, s1..sN = OCIO LUT samplers + staticSamplers[i].RegisterSpace = 0; + staticSamplers[i].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL; + } + + CD3DX12_VERSIONED_ROOT_SIGNATURE_DESC rootSignatureDesc; + rootSignatureDesc.Init_1_1(_countof(rootParameters), rootParameters, + static_cast(staticSamplers.size()), staticSamplers.data(), + D3D12_ROOT_SIGNATURE_FLAG_NONE); + + ComPtr signature; + ComPtr sigErrorBlob; + HRESULT hr = D3DX12SerializeVersionedRootSignature(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1_1, + &signature, &sigErrorBlob); + if (FAILED(hr)) + { + if (sigErrorBlob) + { + std::cerr << "Root signature serialization error:\n" + << static_cast(sigErrorBlob->GetBufferPointer()) << std::endl; + } + ThrowIfFailed(hr); + } + + // Release previous root signature if it exists + m_rootSignature.Reset(); + + hr = m_device->CreateRootSignature(0, signature->GetBufferPointer(), + signature->GetBufferSize(), + IID_PPV_ARGS(&m_rootSignature)); + if (FAILED(hr)) + { + throw Exception(("CreateRootSignature failed: " + HrToString(hr)).c_str()); + } + + // Create the pipeline state object (PSO) + D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc = {}; + psoDesc.InputLayout = { nullptr, 0 }; // No vertex input layout (using SV_VertexID) + psoDesc.pRootSignature = m_rootSignature.Get(); + psoDesc.VS = { m_vertexShaderBlob->GetBufferPointer(), m_vertexShaderBlob->GetBufferSize() }; + psoDesc.PS = { pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize() }; + psoDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT); + psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT); + psoDesc.DepthStencilState.DepthEnable = FALSE; + psoDesc.DepthStencilState.StencilEnable = FALSE; + psoDesc.SampleMask = UINT_MAX; + psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + psoDesc.NumRenderTargets = 1; + psoDesc.RTVFormats[0] = DXGI_FORMAT_R32G32B32A32_FLOAT; + psoDesc.SampleDesc.Count = 1; + + // Release previous pipeline state if it exists + m_pipelineState.Reset(); + + hr = m_device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&m_pipelineState)); + if (FAILED(hr)) + { + std::cerr << "CreateGraphicsPipelineState failed (" << HrToString(hr) << ")\n" + << "Full HLSL shader:\n" << fullShader << std::endl; + throw Exception(("CreateGraphicsPipelineState failed: " + HrToString(hr)).c_str()); + } +} + +void DxApp::reshape(int width, int height) +{ + // Skip if nothing changed and resources are already initialized + if (m_viewportWidth == width && m_viewportHeight == height && m_floatRenderTarget) + return; + + // Wait for any in-flight GPU work before resizing resources + waitForPreviousFrame(); + + m_viewportWidth = width; + m_viewportHeight = height; + + // Release swap chain render target references before ResizeBuffers + for (UINT n = 0; n < FrameCount; n++) + m_renderTargets[n].Reset(); + + // Resize swap chain back buffers to the new dimensions + ThrowIfFailed(m_swapChain->ResizeBuffers( + FrameCount, + static_cast(width), + static_cast(height), + DXGI_FORMAT_R8G8B8A8_UNORM, + 0)); + + // Recreate RTVs for the resized swap chain back buffers + { + CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart()); + for (UINT n = 0; n < FrameCount; n++) + { + ThrowIfFailed(m_swapChain->GetBuffer(n, IID_PPV_ARGS(&m_renderTargets[n]))); + m_device->CreateRenderTargetView(m_renderTargets[n].Get(), nullptr, rtvHandle); + rtvHandle.Offset(1, m_rtvDescriptorSize); + } + } + + // Create (or recreate) the off-screen R32G32B32A32_FLOAT render target for OCIO rendering. + // This avoids 8-bit UNORM quantization errors when comparing GPU vs CPU results. + m_floatRenderTarget.Reset(); + + D3D12_RESOURCE_DESC floatRtDesc = {}; + floatRtDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + floatRtDesc.Width = static_cast(width); + floatRtDesc.Height = static_cast(height); + floatRtDesc.DepthOrArraySize = 1; + floatRtDesc.MipLevels = 1; + floatRtDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + floatRtDesc.SampleDesc.Count = 1; + floatRtDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET; + + D3D12_CLEAR_VALUE floatClearValue = {}; + floatClearValue.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + + CD3DX12_HEAP_PROPERTIES defaultHeapProps(D3D12_HEAP_TYPE_DEFAULT); + ThrowIfFailed(m_device->CreateCommittedResource( + &defaultHeapProps, + D3D12_HEAP_FLAG_NONE, + &floatRtDesc, + D3D12_RESOURCE_STATE_RENDER_TARGET, + &floatClearValue, + IID_PPV_ARGS(&m_floatRenderTarget))); + + // Create a single-slot RTV heap for the float render target (created once) + if (!m_floatRtvHeap) + { + D3D12_DESCRIPTOR_HEAP_DESC floatRtvHeapDesc = {}; + floatRtvHeapDesc.NumDescriptors = 1; + floatRtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; + floatRtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; + ThrowIfFailed(m_device->CreateDescriptorHeap(&floatRtvHeapDesc, IID_PPV_ARGS(&m_floatRtvHeap))); + } + + // Create the float RTV + D3D12_RENDER_TARGET_VIEW_DESC floatRtvDesc = {}; + floatRtvDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + floatRtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; + m_device->CreateRenderTargetView(m_floatRenderTarget.Get(), &floatRtvDesc, + m_floatRtvHeap->GetCPUDescriptorHandleForHeapStart()); + + // Recreate readback buffer with updated dimensions (if already allocated by createBuffers) + if (m_readbackBuffer) + { + m_readbackBuffer.Reset(); + const UINT pixelSize = 4 * sizeof(float); // R32G32B32A32_FLOAT = 16 bytes per pixel + m_readbackRowPitch = AlignRowPitch(static_cast(width), pixelSize); + const UINT64 readbackBufferSize = m_readbackRowPitch * static_cast(height); + + CD3DX12_HEAP_PROPERTIES readbackHeapProps(D3D12_HEAP_TYPE_READBACK); + CD3DX12_RESOURCE_DESC readbackBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(readbackBufferSize); + ThrowIfFailed(m_device->CreateCommittedResource( + &readbackHeapProps, + D3D12_HEAP_FLAG_NONE, + &readbackBufferDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&m_readbackBuffer))); + } +} + +void DxApp::redisplay() +{ + ThrowIfFailed(m_commandAllocator->Reset()); + ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), m_pipelineState.Get())); + + UINT frameIndex = m_swapChain->GetCurrentBackBufferIndex(); + + // Transition swap chain back buffer to render target for clearing + auto barrierPresentToRt = CD3DX12_RESOURCE_BARRIER::Transition( + m_renderTargets[frameIndex].Get(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET); + m_commandList->ResourceBarrier(1, &barrierPresentToRt); + + CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle( + m_rtvHeap->GetCPUDescriptorHandleForHeapStart(), frameIndex, m_rtvDescriptorSize); + + // Clear the swap chain back buffer (used for display only) + const float clearColor[] = { 0.0f, 0.0f, 0.0f, 0.0f }; + m_commandList->ClearRenderTargetView(rtvHandle, clearColor, 0, nullptr); + + // If pipeline state is ready, render the OCIO transform to the off-screen float render target. + // The float RT preserves full precision for accurate GPU vs CPU comparison in tests. + if (m_pipelineState && m_floatRenderTarget) + { + CD3DX12_CPU_DESCRIPTOR_HANDLE floatRtvHandle( + m_floatRtvHeap->GetCPUDescriptorHandleForHeapStart()); + + // Clear the float render target + m_commandList->ClearRenderTargetView(floatRtvHandle, clearColor, 0, nullptr); + + // Set descriptor heap for shader resources + ID3D12DescriptorHeap* descriptorHeaps[] = { m_cbvSrvHeap.Get() }; + m_commandList->SetDescriptorHeaps(_countof(descriptorHeaps), descriptorHeaps); + + // Set the root signature and pipeline state + m_commandList->SetGraphicsRootSignature(m_rootSignature.Get()); + m_commandList->SetPipelineState(m_pipelineState.Get()); + + // Set the root descriptor table to the start of the SRV heap (image + LUTs) + CD3DX12_GPU_DESCRIPTOR_HANDLE srvHandle(m_cbvSrvHeap->GetGPUDescriptorHandleForHeapStart()); + m_commandList->SetGraphicsRootDescriptorTable(0, srvHandle); + + // Update and bind the constant buffer (root parameter 1, b0). + // This fills in any OCIO uniform variables (dynamic properties like exposure, curves). + if (m_constantBuffer && m_cbMappedData && m_currentShaderDesc) + { + memset(m_cbMappedData, 0, m_cbufferAlignedSize); + + const unsigned numUniforms = m_currentShaderDesc->getNumUniforms(); + for (unsigned i = 0; i < numUniforms; ++i) + { + GpuShaderDesc::UniformData data; + m_currentShaderDesc->getUniform(i, data); + UINT8* dst = m_cbMappedData + data.m_bufferOffset; + + switch (data.m_type) + { + case UNIFORM_DOUBLE: + if (data.m_getDouble) + { + const float val = static_cast(data.m_getDouble()); + memcpy(dst, &val, sizeof(float)); + } + break; + case UNIFORM_BOOL: + if (data.m_getBool) + { + const int val = data.m_getBool() ? 1 : 0; + memcpy(dst, &val, sizeof(int)); + } + break; + case UNIFORM_FLOAT3: + if (data.m_getFloat3) + { + const Float3& f3 = data.m_getFloat3(); + memcpy(dst, f3.data(), 3 * sizeof(float)); + } + break; + // HLSL constant-buffer array entries (float or int) occupy a full float4 (16-byte) slot. + case UNIFORM_VECTOR_FLOAT: + if (data.m_vectorFloat.m_getSize && data.m_vectorFloat.m_getVector) + { + const int sz = data.m_vectorFloat.m_getSize(); + const float* vals = data.m_vectorFloat.m_getVector(); + for (int j = 0; j < sz; ++j) + memcpy(dst + j * 16, &vals[j], sizeof(float)); + } + break; + case UNIFORM_VECTOR_INT: + if (data.m_vectorInt.m_getSize && data.m_vectorInt.m_getVector) + { + const int sz = data.m_vectorInt.m_getSize(); + const int* vals = data.m_vectorInt.m_getVector(); + for (int j = 0; j < sz; ++j) + memcpy(dst + j * 16, &vals[j], sizeof(int)); + } + break; + default: + break; + } + } + + m_commandList->SetGraphicsRootConstantBufferView( + 1, m_constantBuffer->GetGPUVirtualAddress()); + } + + // Set viewport and scissor rect + D3D12_VIEWPORT viewport = {}; + viewport.TopLeftX = 0.0f; + viewport.TopLeftY = 0.0f; + viewport.Width = static_cast(m_viewportWidth); + viewport.Height = static_cast(m_viewportHeight); + viewport.MinDepth = 0.0f; + viewport.MaxDepth = 1.0f; + m_commandList->RSSetViewports(1, &viewport); + + D3D12_RECT scissorRect = { 0, 0, m_viewportWidth, m_viewportHeight }; + m_commandList->RSSetScissorRects(1, &scissorRect); + + // Render to the off-screen float render target + m_commandList->OMSetRenderTargets(1, &floatRtvHandle, FALSE, nullptr); + m_commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + m_commandList->DrawInstanced(3, 1, 0, 0); + } + + // Transition swap chain back buffer back to PRESENT state + auto barrierRtToPresent = CD3DX12_RESOURCE_BARRIER::Transition( + m_renderTargets[frameIndex].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); + m_commandList->ResourceBarrier(1, &barrierRtToPresent); + + ThrowIfFailed(m_commandList->Close()); + + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + + // SyncInterval = 0: no VSync. Tests render to an off-screen float RT and + // read back from it; the swap chain back buffer is never used as a source + // of truth, so there is no reason to wait for a vblank. + ThrowIfFailed(m_swapChain->Present(0, 0)); + + waitForPreviousFrame(); +} + +void DxApp::readImage(float* imageBuffer) +{ + ThrowIfFailed(m_commandAllocator->Reset()); + ThrowIfFailed(m_commandList->Reset(m_commandAllocator.Get(), nullptr)); + + // Transition the float render target from RENDER_TARGET to COPY_SOURCE for readback + auto barrierReadback1 = CD3DX12_RESOURCE_BARRIER::Transition( + m_floatRenderTarget.Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_COPY_SOURCE); + m_commandList->ResourceBarrier(1, &barrierReadback1); + + // Copy from float render target to readback buffer + D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {}; + footprint.Offset = 0; + footprint.Footprint.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + footprint.Footprint.Width = static_cast(m_viewportWidth); + footprint.Footprint.Height = static_cast(m_viewportHeight); + footprint.Footprint.Depth = 1; + footprint.Footprint.RowPitch = m_readbackRowPitch; + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = m_floatRenderTarget.Get(); + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + srcLocation.SubresourceIndex = 0; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = m_readbackBuffer.Get(); + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + dstLocation.PlacedFootprint = footprint; + + m_commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + + // Transition the float render target back to RENDER_TARGET for the next frame + auto barrierReadback2 = CD3DX12_RESOURCE_BARRIER::Transition( + m_floatRenderTarget.Get(), D3D12_RESOURCE_STATE_COPY_SOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET); + m_commandList->ResourceBarrier(1, &barrierReadback2); + + ThrowIfFailed(m_commandList->Close()); + + ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() }; + m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists); + + waitForPreviousFrame(); + + // Map the readback buffer and copy float data row-by-row to caller's buffer, + // stripping D3D12 row-pitch alignment padding + BYTE* pData = nullptr; + ThrowIfFailed(m_readbackBuffer->Map(0, nullptr, reinterpret_cast(&pData))); + + const UINT dstRowPitch = static_cast(m_viewportWidth) * 4 * sizeof(float); + for (int y = 0; y < m_viewportHeight; ++y) + { + const BYTE* srcRow = pData + y * m_readbackRowPitch; + BYTE* dstRow = reinterpret_cast(imageBuffer) + y * dstRowPitch; + memcpy(dstRow, srcRow, dstRowPitch); + } + + m_readbackBuffer->Unmap(0, nullptr); +} + +void DxApp::printGraphicsInfo() const noexcept +{ + try + { + // Query IDXGIDevice from the D3D12 device + ComPtr dxgiDevice; + if (FAILED(m_device.As(&dxgiDevice))) + { + return; // Silently ignore failure + } + + // Get the adapter from the DXGI device + ComPtr adapter; + if (FAILED(dxgiDevice->GetAdapter(&adapter))) + { + return; // Silently ignore failure + } + + // Get adapter description + DXGI_ADAPTER_DESC desc; + if (FAILED(adapter->GetDesc(&desc))) + { + return; // Silently ignore failure + } + + // Convert wide string to narrow string for Description + char narrowDesc[128]; + WideCharToMultiByte(CP_UTF8, 0, desc.Description, -1, narrowDesc, sizeof(narrowDesc), nullptr, nullptr); + + // Print adapter name and dedicated video memory + std::cout << "Adapter: " << narrowDesc << std::endl; + std::cout << "Dedicated Video Memory: " << (desc.DedicatedVideoMemory / (1024 * 1024)) << " MB" << std::endl; + } + catch (...) + { + // Silently ignore any exceptions + } +} + +void DxApp::ensureVertexShaderCompiled() +{ + if (m_vertexShaderBlob) + return; + + ThrowIfFailed(DxcCreateInstance(CLSID_DxcUtils, IID_PPV_ARGS(&m_dxcUtils))); + ThrowIfFailed(DxcCreateInstance(CLSID_DxcCompiler, IID_PPV_ARGS(&m_dxcCompiler))); + + // Full-screen triangle using SV_VertexID — no vertex buffer, no bindings, + // identical across every test. Kept inline here so the VS source is + // self-contained and does not depend on the OCIO-generated fragment. + static const char * kVsSource = + "struct VSOutput {\n" + " float4 position : SV_Position;\n" + " float2 texcoord : TEXCOORD0;\n" + "};\n" + "VSOutput VSMain(uint vertexID : SV_VertexID) {\n" + " VSOutput output;\n" + " float2 texcoord = float2((vertexID << 1) & 2, vertexID & 2);\n" + " output.position = float4(texcoord * float2(2, -2) + float2(-1, 1), 0, 1);\n" + " output.texcoord = texcoord;\n" + " return output;\n" + "}\n"; + + const UINT32 vsLen = static_cast(strlen(kVsSource)); + ComPtr vsSourceBlob; + ThrowIfFailed(m_dxcUtils->CreateBlobFromPinned(kVsSource, vsLen, DXC_CP_UTF8, &vsSourceBlob)); + + DxcBuffer vsBuffer; + vsBuffer.Ptr = vsSourceBlob->GetBufferPointer(); + vsBuffer.Size = vsSourceBlob->GetBufferSize(); + vsBuffer.Encoding = DXC_CP_UTF8; + + LPCWSTR vsArgs[] = { L"-T", L"vs_6_0", L"-E", L"VSMain" }; + ComPtr vsResult; + ThrowIfFailed(m_dxcCompiler->Compile(&vsBuffer, vsArgs, _countof(vsArgs), + nullptr, IID_PPV_ARGS(&vsResult))); + HRESULT vsHr; + vsResult->GetStatus(&vsHr); + if (FAILED(vsHr)) + { + ComPtr errors; + vsResult->GetOutput(DXC_OUT_ERRORS, IID_PPV_ARGS(&errors), nullptr); + std::ostringstream oss; + oss << "Vertex shader compilation failed (" << HrToString(vsHr) << ")"; + if (errors && errors->GetStringLength()) + oss << ":\n" << errors->GetStringPointer(); + std::cerr << oss.str() << std::endl; + throw Exception(oss.str().c_str()); + } + ThrowIfFailed(vsResult->GetOutput(DXC_OUT_OBJECT, IID_PPV_ARGS(&m_vertexShaderBlob), nullptr)); +} + +void DxApp::waitForPreviousFrame() +{ + // Signal and increment the fence value. + const UINT64 fence = m_fenceValue; + ThrowIfFailed(m_commandQueue->Signal(m_fence.Get(), fence)); + m_fenceValue++; + + // Wait until the previous frame is finished. + if (m_fence->GetCompletedValue() < fence) + { + ThrowIfFailed(m_fence->SetEventOnCompletion(fence, m_fenceEvent)); + WaitForSingleObject(m_fenceEvent, INFINITE); + } +} + +} // namespace OCIO_NAMESPACE diff --git a/src/libutils/oglapphelpers/dxapp.h b/src/libutils/oglapphelpers/dxapp.h new file mode 100644 index 0000000000..f7fb54e9a5 --- /dev/null +++ b/src/libutils/oglapphelpers/dxapp.h @@ -0,0 +1,124 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + + +#pragma once +#include +#include + +#include "graphicalapp.h" +#include "hlsl.h" + +#include + +struct IDxcUtils; +struct IDxcCompiler3; +struct IDxcBlob; + +using Microsoft::WRL::ComPtr; + +namespace OCIO_NAMESPACE +{ + +class DxApp : public GraphicalApp +{ +public: + DxApp() = delete; + DxApp(const DxApp&) = delete; + DxApp& operator=(const DxApp&) = delete; + + DxApp(const char* winTitle, int winWidth, int winHeight); + ~DxApp(); + + virtual void initImage(int imageWidth, int imageHeight, + Components comp, const float* imageBuffer) override; + + virtual void updateImage(const float* imageBuffer) override; + + virtual void createBuffers() override; + + virtual void setShader(GpuShaderDescRcPtr& shaderDesc) override; + + virtual void reshape(int width, int height) override; + + virtual void redisplay() override; + + virtual void readImage(float* imageBuffer) override; + + virtual void printGraphicsInfo() const noexcept override; + +private: + void waitForPreviousFrame(); + + // Compile the (constant) full-screen-triangle vertex shader once and cache + // the blob. Called lazily from setShader(). + void ensureVertexShaderCompiled(); + + static const UINT FrameCount = 2; + + // Slot 0 for the input image; remaining slots for OCIO LUT textures. + static const UINT CbvSrvHeapSize = 16; + + int m_viewportWidth{ 0 }; + int m_viewportHeight{ 0 }; + + int m_imageWidth{ 0 }; + int m_imageHeight{ 0 }; + Components m_comp{ COMPONENTS_RGBA }; + + ComPtr m_swapChain; + ComPtr m_device; + ComPtr m_renderTargets[FrameCount]; + ComPtr m_commandAllocator; + ComPtr m_commandQueue; + ComPtr m_rootSignature; + ComPtr m_rtvHeap; + ComPtr m_cbvSrvHeap; + ComPtr m_pipelineState; + ComPtr m_commandList; + UINT m_rtvDescriptorSize; + UINT m_cbvSrvDescriptorSize; + + // Synchronization objects. + HANDLE m_fenceEvent{ nullptr }; + ComPtr m_fence; + UINT64 m_fenceValue{ 0 }; + + // Image texture and upload resources. + ComPtr m_imageTexture; + ComPtr m_imageUploadBuffer; + ComPtr m_readbackBuffer; + UINT m_readbackRowPitch{ 0 }; + + // Off-screen float render target (R32G32B32A32_FLOAT) for OCIO rendering and readback. + // The swap chain back buffers (UNORM) are required for windowing but unused in tests. + ComPtr m_floatRenderTarget; + ComPtr m_floatRtvHeap; + + // HLSL shader builder + HLSLBuilderRcPtr m_hlslBuilder; + + // Constant buffer for OCIO uniform variables (dynamic properties like exposure, curves). + // Always allocated; root signature always includes a CBV at b0. + ComPtr m_constantBuffer; + UINT8* m_cbMappedData{ nullptr }; + UINT m_cbufferAlignedSize{ 0 }; + + // Current shader description, retained so redisplay() can update uniform values. + GpuShaderDescRcPtr m_currentShaderDesc; + + // Window handle and class name for cleanup. + HWND m_hwnd{ nullptr }; + std::string m_windowClassName; + + // DXC compiler — created once and reused across every setShader() call. + ComPtr m_dxcUtils; + ComPtr m_dxcCompiler; + + // Full-screen-triangle vertex shader blob — the VS source is identical for + // every test, so compile it once and reuse the bytecode. + ComPtr m_vertexShaderBlob; +}; + +} + diff --git a/src/libutils/oglapphelpers/dxutils.h b/src/libutils/oglapphelpers/dxutils.h new file mode 100644 index 0000000000..f7e4ec84a6 --- /dev/null +++ b/src/libutils/oglapphelpers/dxutils.h @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#pragma once + +#include + +#include + +#include + +namespace OCIO_NAMESPACE +{ + +inline std::string HrToString(HRESULT hr) +{ + char s_str[64] = {}; + sprintf_s(s_str, "HRESULT of 0x%08X", static_cast(hr)); + return std::string(s_str); +} + +inline void ThrowIfFailed(HRESULT hr) +{ + if (FAILED(hr)) + { + throw Exception(HrToString(hr).c_str()); + } +} + +// Align a row pitch to D3D12_TEXTURE_DATA_PITCH_ALIGNMENT (256 bytes). +inline UINT AlignRowPitch(UINT width, UINT pixelSize) +{ + return (width * pixelSize + D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - 1) + & ~(D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - 1); +} + +} // namespace OCIO_NAMESPACE diff --git a/src/libutils/oglapphelpers/graphicalapp.cpp b/src/libutils/oglapphelpers/graphicalapp.cpp new file mode 100644 index 0000000000..75fdb5c9a3 --- /dev/null +++ b/src/libutils/oglapphelpers/graphicalapp.cpp @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#include "graphicalapp.h" + +#ifdef OCIO_GL_ENABLED +#include "oglapp.h" +#endif + +#ifdef OCIO_DIRECTX_ENABLED +#include "dxapp.h" +#endif + +namespace OCIO_NAMESPACE +{ + +// Factory for windowed backends (OGL, DX). For headless Vulkan use +// VulkanApp::CreateVulkanApp(). Metal is always paired with OGL (MetalApp +// inherits ScreenOglApp) and is covered by the OCIO_GL_ENABLED branch. +GraphicalAppRcPtr GraphicalApp::CreateApp(const char * winTitle, int winWidth, int winHeight) +{ +#ifdef OCIO_GL_ENABLED + return OglApp::CreateApp(winTitle, winWidth, winHeight); +#elif defined(OCIO_DIRECTX_ENABLED) + return std::make_shared(winTitle, winWidth, winHeight); +#else + (void)winTitle; (void)winWidth; (void)winHeight; + throw Exception("No suitable GPU backend available for GraphicalApp::CreateApp"); +#endif +} + +} // namespace OCIO_NAMESPACE diff --git a/src/libutils/oglapphelpers/graphicalapp.h b/src/libutils/oglapphelpers/graphicalapp.h new file mode 100644 index 0000000000..a17730070a --- /dev/null +++ b/src/libutils/oglapphelpers/graphicalapp.h @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#pragma once + +#include + +namespace OCIO_NAMESPACE +{ +// Forward declaration of GraphicalApp. +class GraphicalApp; +typedef OCIO_SHARED_PTR GraphicalAppRcPtr; + +class GraphicalApp +{ +public: + virtual ~GraphicalApp() = default; + enum Components + { + COMPONENTS_RGB = 0, + COMPONENTS_RGBA + }; + + // Shader code will be printed when generated. + void setShaderVerbose(bool print) + { + m_verboseShader = print; + } + + bool isShaderVerbose() const { return m_verboseShader; } + + // When displaying the processed image in a window, enable Y-axis mirroring. + void setYMirror() + { + m_yMirror = true; + } + + bool isYMirror() const { return m_yMirror; } + + // Initialize the image. + virtual void initImage(int imageWidth, int imageHeight, + Components comp, const float* imageBuffer) = 0; + + // Update the image if it changes. + virtual void updateImage(const float* imageBuffer) = 0; + + // Create frame and rendering buffers. Needed if readImage will be used. + virtual void createBuffers() = 0; + + // Set the shader code. + virtual void setShader(GpuShaderDescRcPtr& shaderDesc) = 0; + + // Update the size of the buffer of the viewport that will be used to process the image + // (it does not modify the UI). To be called at least one time. Use image size if we want to + // read back the processed image. To process another image with the same size or using a + // different shader, reshape does not need to be called again. In case of an interactive + // application it should be called by the glutReshapeFunc callback using the windows size. + virtual void reshape(int width, int height) = 0; + + // Process the image. + virtual void redisplay() = 0; + + // Read the image from the rendering buffer. It is not meant to be used by interactive + // applications used to display the image. + virtual void readImage(float* imageBuffer) = 0; + + // Helper to print graphics info. + virtual void printGraphicsInfo() const noexcept = 0; + + // Factory: returns a platform-appropriate GraphicalApp (OGL or DX). + static GraphicalAppRcPtr CreateApp(const char * winTitle, int winWidth, int winHeight); + +private: + // Will shader code be outputed when setShader is called. + bool m_verboseShader{ false }; + // For interactive applications displaying the processed image. + bool m_yMirror{ false }; +}; + +} // namespace OCIO_NAMESPACE + diff --git a/src/libutils/oglapphelpers/hlsl.cpp b/src/libutils/oglapphelpers/hlsl.cpp new file mode 100644 index 0000000000..e165e420a5 --- /dev/null +++ b/src/libutils/oglapphelpers/hlsl.cpp @@ -0,0 +1,498 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#include +#include + +#include + +#include "hlsl.h" +#include "dxutils.h" + +namespace OCIO_NAMESPACE +{ + +namespace +{ + +// Upload a TEXTURE_1D LUT as a real D3D12 1D texture with RGBA32F format. +// RGBA32F is used instead of RGB32F because DXGI_FORMAT_R32G32B32_FLOAT has +// limited hardware support in D3D12 (optional for most resource types). +void AllocateTexture1D(ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + UINT width, + UINT numChannels, + const float* values, + Microsoft::WRL::ComPtr& texture, + Microsoft::WRL::ComPtr& uploadBuffer) +{ + if (!values) + { + throw Exception("Missing 1D LUT texture data"); + } + + // Create a 1D texture resource in default heap. + D3D12_RESOURCE_DESC textureDesc = {}; + textureDesc.MipLevels = 1; + textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + textureDesc.Width = width; + textureDesc.Height = 1; + textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE; + textureDesc.DepthOrArraySize = 1; + textureDesc.SampleDesc.Count = 1; + textureDesc.SampleDesc.Quality = 0; + textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE1D; + + CD3DX12_HEAP_PROPERTIES defaultHeapProps(D3D12_HEAP_TYPE_DEFAULT); + ThrowIfFailed(device->CreateCommittedResource( + &defaultHeapProps, + D3D12_HEAP_FLAG_NONE, + &textureDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&texture))); + + // Create upload buffer with row-pitch alignment + const UINT dstPixelSize = 4 * sizeof(float); // RGBA32F + const UINT rowPitch = AlignRowPitch(width, dstPixelSize); + const UINT uploadBufferSize = rowPitch; // Only 1 row + + CD3DX12_HEAP_PROPERTIES uploadHeapProps(D3D12_HEAP_TYPE_UPLOAD); + CD3DX12_RESOURCE_DESC uploadBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(uploadBufferSize); + ThrowIfFailed(device->CreateCommittedResource( + &uploadHeapProps, + D3D12_HEAP_FLAG_NONE, + &uploadBufferDesc, + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&uploadBuffer))); + + // Map and expand source data (numChannels floats/pixel) to RGBA32F (4 floats/pixel) + BYTE* pData = nullptr; + ThrowIfFailed(uploadBuffer->Map(0, nullptr, reinterpret_cast(&pData))); + float* dst = reinterpret_cast(pData); + for (UINT i = 0; i < width; ++i) + { + dst[i * 4 + 0] = (numChannels > 0) ? values[i * numChannels + 0] : 0.0f; + dst[i * 4 + 1] = (numChannels > 1) ? values[i * numChannels + 1] : 0.0f; + dst[i * 4 + 2] = (numChannels > 2) ? values[i * numChannels + 2] : 0.0f; + dst[i * 4 + 3] = 1.0f; + } + uploadBuffer->Unmap(0, nullptr); + + // Copy from upload buffer to texture + D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {}; + footprint.Footprint.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + footprint.Footprint.Width = width; + footprint.Footprint.Height = 1; + footprint.Footprint.Depth = 1; + footprint.Footprint.RowPitch = rowPitch; + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = uploadBuffer.Get(); + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + srcLocation.PlacedFootprint = footprint; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = texture.Get(); + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dstLocation.SubresourceIndex = 0; + + commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + + // Transition to shader resource state + auto barrier1D = CD3DX12_RESOURCE_BARRIER::Transition( + texture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + commandList->ResourceBarrier(1, &barrier1D); +} + +// Upload a TEXTURE_2D (folded) 1D LUT as a 2D texture of width x height with RGBA32F format. +void AllocateTexture2D( ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + UINT width, + UINT height, + UINT numChannels, + const float* values, + Microsoft::WRL::ComPtr& texture, + Microsoft::WRL::ComPtr& uploadBuffer) +{ + if (!values) + { + throw Exception("Missing 2D LUT texture data"); + } + + // Create a 2D texture resource in default heap. + D3D12_RESOURCE_DESC textureDesc = {}; + textureDesc.MipLevels = 1; + textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + textureDesc.Width = width; + textureDesc.Height = height; + textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE; + textureDesc.DepthOrArraySize = 1; + textureDesc.SampleDesc.Count = 1; + textureDesc.SampleDesc.Quality = 0; + textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + + CD3DX12_HEAP_PROPERTIES defaultHeapProps2D(D3D12_HEAP_TYPE_DEFAULT); + ThrowIfFailed(device->CreateCommittedResource( + &defaultHeapProps2D, + D3D12_HEAP_FLAG_NONE, + &textureDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&texture))); + + // Create upload buffer: each row is padded to D3D12_TEXTURE_DATA_PITCH_ALIGNMENT + const UINT dstPixelSize = 4 * sizeof(float); // RGBA32F + const UINT rowPitch = AlignRowPitch(width, dstPixelSize); + const UINT uploadBufferSize = rowPitch * height; + + CD3DX12_HEAP_PROPERTIES uploadHeapProps2D(D3D12_HEAP_TYPE_UPLOAD); + CD3DX12_RESOURCE_DESC uploadBufferDesc2D = CD3DX12_RESOURCE_DESC::Buffer(uploadBufferSize); + ThrowIfFailed(device->CreateCommittedResource( + &uploadHeapProps2D, + D3D12_HEAP_FLAG_NONE, + &uploadBufferDesc2D, + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&uploadBuffer))); + + // Map and expand all rows: source is row-major (width * numChannels floats per row) + BYTE* pData = nullptr; + ThrowIfFailed(uploadBuffer->Map(0, nullptr, reinterpret_cast(&pData))); + for (UINT y = 0; y < height; ++y) + { + const float* srcRow = values + y * width * numChannels; + float* dstRow = reinterpret_cast(pData + y * rowPitch); + for (UINT x = 0; x < width; ++x) + { + dstRow[x * 4 + 0] = (numChannels > 0) ? srcRow[x * numChannels + 0] : 0.0f; + dstRow[x * 4 + 1] = (numChannels > 1) ? srcRow[x * numChannels + 1] : 0.0f; + dstRow[x * 4 + 2] = (numChannels > 2) ? srcRow[x * numChannels + 2] : 0.0f; + dstRow[x * 4 + 3] = 1.0f; + } + } + uploadBuffer->Unmap(0, nullptr); + + // Copy from upload buffer to texture + D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {}; + footprint.Footprint.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + footprint.Footprint.Width = width; + footprint.Footprint.Height = height; + footprint.Footprint.Depth = 1; + footprint.Footprint.RowPitch = rowPitch; + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = uploadBuffer.Get(); + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + srcLocation.PlacedFootprint = footprint; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = texture.Get(); + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dstLocation.SubresourceIndex = 0; + + commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + + // Transition to shader resource state + auto barrier2D = CD3DX12_RESOURCE_BARRIER::Transition( + texture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + commandList->ResourceBarrier(1, &barrier2D); +} + +// Upload a 3D LUT as a 3D texture with RGBA32F format. +void AllocateTexture3D(ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + UINT edgelen, + const float* values, + Microsoft::WRL::ComPtr& texture, + Microsoft::WRL::ComPtr& uploadBuffer) +{ + if (!values) + { + throw Exception("Missing 3D LUT texture data"); + } + + // Create 3D texture in default heap + D3D12_RESOURCE_DESC textureDesc = {}; + textureDesc.MipLevels = 1; + textureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + textureDesc.Width = edgelen; + textureDesc.Height = edgelen; + textureDesc.Flags = D3D12_RESOURCE_FLAG_NONE; + textureDesc.DepthOrArraySize = edgelen; + textureDesc.SampleDesc.Count = 1; + textureDesc.SampleDesc.Quality = 0; + textureDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE3D; + + CD3DX12_HEAP_PROPERTIES defaultHeapProps3D(D3D12_HEAP_TYPE_DEFAULT); + ThrowIfFailed(device->CreateCommittedResource( + &defaultHeapProps3D, + D3D12_HEAP_FLAG_NONE, + &textureDesc, + D3D12_RESOURCE_STATE_COPY_DEST, + nullptr, + IID_PPV_ARGS(&texture))); + + // Create upload buffer with row-pitch alignment + // Source data is always RGB (3 floats/voxel) for OCIO 3D LUTs. + const UINT srcNumChannels = 3; // OCIO 3D LUTs always provide RGB data + const UINT dstPixelSize = 4 * sizeof(float); // RGBA32F + const UINT rowPitch = AlignRowPitch(edgelen, dstPixelSize); + const UINT slicePitch = rowPitch * edgelen; + const UINT uploadBufferSize = slicePitch * edgelen; + + CD3DX12_HEAP_PROPERTIES uploadHeapProps3D(D3D12_HEAP_TYPE_UPLOAD); + CD3DX12_RESOURCE_DESC uploadBufferDesc3D = CD3DX12_RESOURCE_DESC::Buffer(uploadBufferSize); + ThrowIfFailed(device->CreateCommittedResource( + &uploadHeapProps3D, + D3D12_HEAP_FLAG_NONE, + &uploadBufferDesc3D, + D3D12_RESOURCE_STATE_GENERIC_READ, + nullptr, + IID_PPV_ARGS(&uploadBuffer))); + + // Map RGB source data and expand to RGBA32F + BYTE* pData = nullptr; + ThrowIfFailed(uploadBuffer->Map(0, nullptr, reinterpret_cast(&pData))); + + for (UINT z = 0; z < edgelen; ++z) + { + for (UINT y = 0; y < edgelen; ++y) + { + const float* srcRow = values + (z * edgelen * edgelen + y * edgelen) * srcNumChannels; + float* dstRow = reinterpret_cast(pData + z * slicePitch + y * rowPitch); + for (UINT x = 0; x < edgelen; ++x) + { + dstRow[x * 4 + 0] = srcRow[x * srcNumChannels + 0]; // R + dstRow[x * 4 + 1] = srcRow[x * srcNumChannels + 1]; // G + dstRow[x * 4 + 2] = srcRow[x * srcNumChannels + 2]; // B + dstRow[x * 4 + 3] = 1.0f; // A + } + } + } + + uploadBuffer->Unmap(0, nullptr); + + // Copy from upload buffer to texture + D3D12_PLACED_SUBRESOURCE_FOOTPRINT footprint = {}; + footprint.Footprint.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + footprint.Footprint.Width = edgelen; + footprint.Footprint.Height = edgelen; + footprint.Footprint.Depth = edgelen; + footprint.Footprint.RowPitch = rowPitch; + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = uploadBuffer.Get(); + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + srcLocation.PlacedFootprint = footprint; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = texture.Get(); + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dstLocation.SubresourceIndex = 0; + + commandList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + + // Transition to shader resource state + auto barrier3D = CD3DX12_RESOURCE_BARRIER::Transition( + texture.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); + commandList->ResourceBarrier(1, &barrier3D); +} + +} // anonymous namespace + + +////////////////////////////////////////////////////////// + +HLSLBuilderRcPtr HLSLBuilder::Create(const GpuShaderDescRcPtr& shaderDesc, + ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + ID3D12DescriptorHeap* cbvSrvHeap) +{ + if (!shaderDesc) + { + throw Exception("HLSLBuilder: shaderDesc is null"); + } + if (!device) + { + throw Exception("HLSLBuilder: device is null"); + } + if (!commandList) + { + throw Exception("HLSLBuilder: commandList is null"); + } + if (!cbvSrvHeap) + { + throw Exception("HLSLBuilder: cbvSrvHeap is null"); + } + + HLSLBuilderRcPtr builder(new HLSLBuilder(shaderDesc, device, commandList, cbvSrvHeap)); + builder->allocateAllTextures(); + + // Close the command list; the caller executes and fence-waits. + ThrowIfFailed(commandList->Close()); + + return builder; +} + +HLSLBuilder::HLSLBuilder(const GpuShaderDescRcPtr& shaderDesc, + ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + ID3D12DescriptorHeap* cbvSrvHeap) + : m_shaderDesc(shaderDesc) + , m_device(device) + , m_commandList(commandList) + , m_cbvSrvHeap(cbvSrvHeap) + , m_srvDescriptorSize(0) + , m_verbose(false) +{ + m_srvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV); +} + +HLSLBuilder::~HLSLBuilder() +{ + deleteAllTextures(); +} + +void HLSLBuilder::allocateAllTextures() +{ + deleteAllTextures(); + + // Process 3D LUTs + const unsigned maxTexture3D = m_shaderDesc->getNum3DTextures(); + for (unsigned idx = 0; idx < maxTexture3D; ++idx) + { + // Get 3D texture information + const char* textureName = nullptr; + const char* samplerName = nullptr; + unsigned edgelen = 0; + Interpolation interpolation = INTERP_LINEAR; + m_shaderDesc->get3DTexture(idx, textureName, samplerName, edgelen, interpolation); + + if (!textureName || !*textureName || !samplerName || !*samplerName || edgelen == 0) + { + throw Exception("HLSLBuilder: 3D texture data is corrupted"); + } + + const float* values = nullptr; + m_shaderDesc->get3DTextureValues(idx, values); + if (!values) + { + throw Exception("HLSLBuilder: 3D texture values are missing"); + } + + // Allocate the 3D texture + TextureResource texRes(textureName, samplerName); + AllocateTexture3D(m_device, m_commandList, edgelen, values, texRes.m_texture, texRes.m_uploadBuffer); + + // Create SRV at the slot matching the HLSL register assignment + const UINT heapSlot = m_shaderDesc->get3DTextureShaderBindingIndex(idx); + + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + srvDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D; + srvDesc.Texture3D.MipLevels = 1; + + CD3DX12_CPU_DESCRIPTOR_HANDLE srvHandle( + m_cbvSrvHeap->GetCPUDescriptorHandleForHeapStart(), + heapSlot, + m_srvDescriptorSize); + + m_device->CreateShaderResourceView(texRes.m_texture.Get(), &srvDesc, srvHandle); + + m_textures.push_back(texRes); + } + + // Process 1D LUTs (stored as 2D textures with height=1) + const unsigned maxTexture1D = m_shaderDesc->getNumTextures(); + for (unsigned idx = 0; idx < maxTexture1D; ++idx) + { + // Get 1D texture information + const char* textureName = nullptr; + const char* samplerName = nullptr; + unsigned width = 0; + unsigned height = 0; + GpuShaderDesc::TextureType channel = GpuShaderDesc::TEXTURE_RGB_CHANNEL; + Interpolation interpolation = INTERP_LINEAR; + GpuShaderDesc::TextureDimensions dimensions = GpuShaderDesc::TEXTURE_1D; + m_shaderDesc->getTexture(idx, textureName, samplerName, width, height, channel, dimensions, interpolation); + + if (!textureName || !*textureName || !samplerName || !*samplerName || width == 0) + { + throw Exception("HLSLBuilder: 1D texture data is corrupted"); + } + + const float* values = nullptr; + m_shaderDesc->getTextureValues(idx, values); + if (!values) + { + throw Exception("HLSLBuilder: 1D texture values are missing"); + } + + // Determine source channel count: RED=1, RGB=3 + const UINT numChannels = (channel == GpuShaderDesc::TEXTURE_RED_CHANNEL) ? 1u : 3u; + TextureResource texRes(textureName, samplerName); + + // Create SRV at the slot matching the HLSL register assignment + const UINT heapSlot = m_shaderDesc->getTextureShaderBindingIndex(idx); + + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + srvDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + + if (dimensions == GpuShaderDesc::TEXTURE_1D) + { + AllocateTexture1D(m_device, m_commandList, width, numChannels, values, + texRes.m_texture, texRes.m_uploadBuffer); + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1D; + srvDesc.Texture1D.MipLevels = 1; + } + else + { + AllocateTexture2D(m_device, m_commandList, width, height, numChannels, values, + texRes.m_texture, texRes.m_uploadBuffer); + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = 1; + } + + CD3DX12_CPU_DESCRIPTOR_HANDLE srvHandle( + m_cbvSrvHeap->GetCPUDescriptorHandleForHeapStart(), + heapSlot, + m_srvDescriptorSize); + + m_device->CreateShaderResourceView(texRes.m_texture.Get(), &srvDesc, srvHandle); + + m_textures.push_back(texRes); + } +} + +void HLSLBuilder::deleteAllTextures() +{ + m_textures.clear(); +} + +std::string HLSLBuilder::getShaderText() const +{ + if (!m_shaderDesc) + { + return ""; + } + + const char* shaderText = m_shaderDesc->getShaderText(); + + if (m_verbose && shaderText && *shaderText) + { + std::cout << "\nOCIO HLSL Shader:\n\n" << shaderText << std::endl; + } + + return shaderText ? std::string(shaderText) : std::string(); +} + +UINT HLSLBuilder::getNumSRVs() const +{ + return static_cast(m_textures.size()); +} + +} // namespace OCIO_NAMESPACE diff --git a/src/libutils/oglapphelpers/hlsl.h b/src/libutils/oglapphelpers/hlsl.h new file mode 100644 index 0000000000..a0338de3f9 --- /dev/null +++ b/src/libutils/oglapphelpers/hlsl.h @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#ifndef INCLUDED_OCIO_HLSL_H +#define INCLUDED_OCIO_HLSL_H + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#ifndef NOMINMAX +#define NOMINMAX +#endif + +#include + +#include +#include + +#include + +namespace OCIO_NAMESPACE +{ + +class HLSLBuilder; +typedef OCIO_SHARED_PTR HLSLBuilderRcPtr; + +// This is a DirectX implementation showing how to do texture upload & allocation +// for HLSL shaders, mirroring the role of OpenGLBuilder. + +class HLSLBuilder +{ +public: + // Create an HLSL builder using GPU shader information from a specific processor. + // Allocates D3D12 textures for all LUTs using binding indices from the shaderDesc. + // All GPU uploads are fence-synchronized before returning. + static HLSLBuilderRcPtr Create(const GpuShaderDescRcPtr& shaderDesc, + ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + ID3D12DescriptorHeap* cbvSrvHeap); + + ~HLSLBuilder(); + + inline void setVerbose(bool verbose) { m_verbose = verbose; } + inline bool isVerbose() const { return m_verbose; } + + // Get the OCIO-generated HLSL shader text. + std::string getShaderText() const; + + // Get the number of SRVs (texture slots) allocated for LUTs. + // This does not include the image texture at slot 0. + UINT getNumSRVs() const; + +protected: + HLSLBuilder(const GpuShaderDescRcPtr& shaderDesc, + ID3D12Device* device, + ID3D12GraphicsCommandList* commandList, + ID3D12DescriptorHeap* cbvSrvHeap); + + void allocateAllTextures(); + void deleteAllTextures(); + +private: + HLSLBuilder() = delete; + HLSLBuilder(const HLSLBuilder&) = delete; + HLSLBuilder& operator=(const HLSLBuilder&) = delete; + + struct TextureResource + { + Microsoft::WRL::ComPtr m_texture; + Microsoft::WRL::ComPtr m_uploadBuffer; + std::string m_textureName; + std::string m_samplerName; + + TextureResource(const std::string& textureName, + const std::string& samplerName) + : m_textureName(textureName) + , m_samplerName(samplerName) + {} + }; + + typedef std::vector TextureResources; + + const GpuShaderDescRcPtr m_shaderDesc; // Description of the shader + ID3D12Device* m_device; // D3D12 device (not owned) + ID3D12GraphicsCommandList* m_commandList; // Command list for uploads (not owned) + ID3D12DescriptorHeap* m_cbvSrvHeap; // Descriptor heap for SRVs (not owned) + UINT m_srvDescriptorSize; // Size of one SRV descriptor + TextureResources m_textures; // All allocated texture resources + bool m_verbose; // Print shader text for debugging +}; + +} // namespace OCIO_NAMESPACE + +#endif // INCLUDED_OCIO_HLSL_H diff --git a/src/libutils/oglapphelpers/metalapp.h b/src/libutils/oglapphelpers/metalapp.h index 37fba14018..cb8c7acc42 100644 --- a/src/libutils/oglapphelpers/metalapp.h +++ b/src/libutils/oglapphelpers/metalapp.h @@ -24,7 +24,7 @@ typedef OCIO_SHARED_PTR MetalAppRcPtr; class MtlTexture; typedef OCIO_SHARED_PTR MtlTextureRcPtr; -class MetalApp : public ScreenApp +class MetalApp : public ScreenOglApp { public: MetalApp() = delete; @@ -53,7 +53,7 @@ class MetalApp : public ScreenApp // Process the image. void redisplay() override; - // Return a pointer of either ScreenApp or HeadlessApp depending on the + // Return a pointer of either ScreenOglApp or HeadlessOglApp depending on the // OCIO_HEADLESS_ENABLED preprocessor. static MetalAppRcPtr CreateMetalGlApp(const char * winTitle, int winWidth, int winHeight); diff --git a/src/libutils/oglapphelpers/metalapp.mm b/src/libutils/oglapphelpers/metalapp.mm index be46d4e1b6..4114108848 100644 --- a/src/libutils/oglapphelpers/metalapp.mm +++ b/src/libutils/oglapphelpers/metalapp.mm @@ -43,7 +43,7 @@ }; MetalApp::MetalApp(const char * winTitle, int winWidth, int winHeight) - : ScreenApp(winTitle, winWidth, winHeight) + : ScreenOglApp(winTitle, winWidth, winHeight) { initContext(); } @@ -346,7 +346,7 @@ vertex VertexOut ColorCorrectionVS(unsigned int vId [[ vertex_id ]]) throw Exception("Metal renderer can only consume MSL shaders"); } - if(printShader()) + if(isShaderVerbose()) { std::cout << std::endl; std::cout << "GPU Shader Program:" << std::endl; @@ -380,7 +380,7 @@ vertex VertexOut ColorCorrectionVS(unsigned int vId [[ vertex_id ]]) prepareAndBindOpenGLState(); } - ScreenApp::redisplay(); + ScreenOglApp::redisplay(); } MetalAppRcPtr MetalApp::CreateMetalGlApp(const char * winTitle, int winWidth, int winHeight) diff --git a/src/libutils/oglapphelpers/oglapp.cpp b/src/libutils/oglapphelpers/oglapp.cpp index 32528a55cc..0b8e49fab6 100644 --- a/src/libutils/oglapphelpers/oglapp.cpp +++ b/src/libutils/oglapphelpers/oglapp.cpp @@ -12,10 +12,17 @@ #include #elif _WIN32 - #include -#include - +#ifndef NDEBUG + // freeglut's header uses a #pragma comment(lib) that links freeglutd.lib in + // debug builds, which we don't ship. Temporarily define NDEBUG so the header + // selects freeglut.lib instead, then restore the original state. + #define NDEBUG + #include + #undef NDEBUG +#else + #include +#endif // !NDEBUG #else #include @@ -33,6 +40,15 @@ namespace OCIO_NAMESPACE { +GraphicalAppRcPtr OglApp::CreateApp(const char* winTitle, int winWidth, int winHeight) +{ +#ifdef OCIO_HEADLESS_ENABLED + return std::make_shared(winTitle, winWidth, winHeight); +#else + return std::make_shared(winTitle, winWidth, winHeight); +#endif +} + OglApp::OglApp(int winWidth, int winHeight) : m_viewportWidth(winWidth) , m_viewportHeight(winHeight) @@ -113,7 +129,7 @@ void OglApp::redisplay() pts[3] = (float)m_viewportHeight * 0.5f + imgHeightScreenSpace * 0.5f; } - if (m_yMirror) + if (isYMirror()) { std::swap(pts[1], pts[3]); } @@ -162,7 +178,7 @@ void OglApp::reshape(int width, int height) glLoadIdentity(); } -void OglApp::createGLBuffers() +void OglApp::createBuffers() { // Create a framebuffer object, you need to delete them when program exits. GLuint fboId; @@ -197,7 +213,7 @@ void OglApp::setShader(GpuShaderDescRcPtr & shaderDesc) { // Create oglBuilder using the shaderDesc. m_oglBuilder = OpenGLBuilder::Create(shaderDesc); - m_oglBuilder->setVerbose(m_printShader); + m_oglBuilder->setVerbose(isShaderVerbose()); // Allocate & upload all the LUTs in a dedicated GPU texture. // Note: The start index for the texture indices is 1 as one texture @@ -227,7 +243,7 @@ void OglApp::setShader(GpuShaderDescRcPtr & shaderDesc) m_oglBuilder->useAllUniforms(); } -void OglApp::printGLInfo() const noexcept +void OglApp::printGraphicsInfo() const noexcept { std::cout << std::endl << "GL Vendor: " << glGetString(GL_VENDOR) << std::endl @@ -262,16 +278,7 @@ void OglApp::setupCommon() glEnable(GL_TEXTURE_2D); } -OglAppRcPtr OglApp::CreateOglApp(const char * winTitle, int winWidth, int winHeight) -{ -#ifdef OCIO_HEADLESS_ENABLED - return std::make_shared(winTitle, winWidth, winHeight); -#else - return std::make_shared(winTitle, winWidth, winHeight); -#endif -} - -ScreenApp::ScreenApp(const char * winTitle, int winWidth, int winHeight): +ScreenOglApp::ScreenOglApp(const char * winTitle, int winWidth, int winHeight): OglApp(winWidth, winHeight) { int argc = 2; @@ -288,25 +295,25 @@ ScreenApp::ScreenApp(const char * winTitle, int winWidth, int winHeight): setupCommon(); } -ScreenApp::~ScreenApp() +ScreenOglApp::~ScreenOglApp() { glutDestroyWindow(m_mainWin); } -void ScreenApp::redisplay() +void ScreenOglApp::redisplay() { OglApp::redisplay(); glutSwapBuffers(); } -void ScreenApp::printGLInfo() const noexcept +void ScreenOglApp::printGraphicsInfo() const noexcept { - OglApp::printGLInfo(); + OglApp::printGraphicsInfo(); } #ifdef OCIO_HEADLESS_ENABLED -HeadlessApp::HeadlessApp(const char * /* winTitle */, int bufWidth, int bufHeight) +HeadlessOglApp::HeadlessOglApp(const char * /* winTitle */, int bufWidth, int bufHeight) : OglApp(bufWidth, bufHeight) , m_pixBufferWidth(bufWidth) , m_pixBufferHeight(bufHeight) @@ -361,25 +368,25 @@ HeadlessApp::HeadlessApp(const char * /* winTitle */, int bufWidth, int bufHeigh setupCommon(); } -HeadlessApp::~HeadlessApp() +HeadlessOglApp::~HeadlessOglApp() { eglTerminate(m_eglDisplay); } -void HeadlessApp::printGLInfo() const noexcept +void HeadlessOglApp::printGraphicsInfo() const noexcept { - OglApp::printGLInfo(); + OglApp::printGraphicsInfo(); printEGLInfo(); } -void HeadlessApp::printEGLInfo() const noexcept +void HeadlessOglApp::printEGLInfo() const noexcept { std::cout << std::endl << "EGL Vendor: " << eglQueryString(m_eglDisplay, EGL_VENDOR) << std::endl << "EGL Version: " << eglQueryString(m_eglDisplay, EGL_VERSION) << std::endl; } -void HeadlessApp::redisplay() +void HeadlessOglApp::redisplay() { OglApp::redisplay(); eglSwapBuffers(m_eglDisplay, m_eglSurface); diff --git a/src/libutils/oglapphelpers/oglapp.h b/src/libutils/oglapphelpers/oglapp.h index 34b2f7d071..51de4c2281 100644 --- a/src/libutils/oglapphelpers/oglapp.h +++ b/src/libutils/oglapphelpers/oglapp.h @@ -9,29 +9,30 @@ #include #include "glsl.h" +#include "graphicalapp.h" namespace OCIO_NAMESPACE { // Here is some sample code to demonstrate how to use this in a simple app that wants to process // using the GPU and OpenGL. Processed image is expected to have the same size as the input image. -// For an interactive application, OglApp can be used, but other OGL code is required. +// For an interactive application, GraphicalApp can be used, but other OGL code is required. // // See ociodisplay for an example of an interactive app that displays an image in the UI and // ocioconvert and ociochecklut for examples of non-interactive apps that just process values with // the GPU. /* -// Create and initialize OglAppRcPtr by creating a shared pointer to ScreenApp. You have to -// specify the name of the window and its size. OglAppRcPtr that points to HeadlessApp object +// Create and initialize OglAppRcPtr by creating a shared pointer to ScreenOglApp. You have to +// specify the name of the window and its size. OglAppRcPtr that points to HeadlessOglApp object // can be created and used in the same way. -OglAppRcPtr scrApp = std::make_shared("Window Name", windowWidth, windowHeight); +OglAppRcPtr scrApp = std::make_shared("Window Name", windowWidth, windowHeight); float * imageBuffer = GetImageBuffer(); int imageWidth = GetImageWidth(); int imageHeight = GetImageHeight(); -scrApp->initImage(imagewidth, imageheight, OglApp::COMPONENTS_RGB, imageBuffer); -scrApp->createGLBuffers(); +scrApp->initImage(imagewidth, imageheight, GraphicalApp::COMPONENTS_RGB, imageBuffer); +scrApp->createBuffers(); // Set (or change) shader. GpuShaderDescRcPtr shader = GpuShaderDesc::CreateShaderDesc(); @@ -51,73 +52,49 @@ scrApp->readImage(imageBufferOut.data()); */ -// Forward declaration of OglApp. -class OglApp; -typedef OCIO_SHARED_PTR OglAppRcPtr; - -class OglApp +class OglApp : public GraphicalApp { public: OglApp() = delete; - OglApp(const OglApp &) = delete; - OglApp & operator=(const OglApp &) = delete; + OglApp(const OglApp&) = delete; + OglApp& operator=(const OglApp&) = delete; // Initialize the app with given window name & client rect size. OglApp(int winWidth, int winHeight); virtual ~OglApp(); - // When displaying the processed image in a window this needs to be done. - // In that case, when image is read, the result will be mirrored on Y. - void setYMirror() - { - m_yMirror = true; - } - - // Shader code will be printed when generated. - void setPrintShader(bool print) - { - m_printShader = print; - } - - enum Components - { - COMPONENTS_RGB = 0, - COMPONENTS_RGBA - }; - - // Initialize the image. virtual void initImage(int imageWidth, int imageHeight, - Components comp, const float * imageBuffer); - // Update the image if it changes. - virtual void updateImage(const float * imageBuffer); + Components comp, const float* imageBuffer) override; + + virtual void updateImage(const float* imageBuffer) override; - // Create GL frame and rendering buffers. Needed if readImage will be used. - void createGLBuffers(); + // Create frame and rendering buffers. Needed if readImage will be used. + void createBuffers() override; // Set the shader code. - virtual void setShader(GpuShaderDescRcPtr & shaderDesc); + virtual void setShader(GpuShaderDescRcPtr& shaderDesc) override; // Update the size of the buffer of the OpenGL viewport that will be used to process the image // (it does not modify the UI). To be called at least one time. Use image size if we want to // read back the processed image. To process another image with the same size or using a // different shader, reshape does not need to be called again. In case of an interactive // application it should be called by the glutReshapeFunc callback using the windows size. - void reshape(int width, int height); + void reshape(int width, int height) override; // Process the image. - void virtual redisplay(); + void virtual redisplay() override; // Read the image from the rendering buffer. It is not meant to be used by interactive // applications used to display the image. - virtual void readImage(float * imageBuffer); + virtual void readImage(float* imageBuffer) override; - // Helper to print GL info. - void virtual printGLInfo() const noexcept; + // Helper to print graphics info. + void virtual printGraphicsInfo() const noexcept override; - // Return a pointer of either ScreenApp or HeadlessApp depending on the + // Return a pointer of either ScreenOglApp or HeadlessOglApp depending on the // OCIO_HEADLESS_ENABLED preprocessor. - static OglAppRcPtr CreateOglApp(const char * winTitle, int winWidth, int winHeight); + static GraphicalAppRcPtr CreateApp(const char* winTitle, int winWidth, int winHeight); protected: // Window or output image size (set using reshape). @@ -133,8 +110,6 @@ class OglApp void setImageDimensions(int imgWidth, int imgHeight, Components comp); Components getImageComponents() const { return m_components; } - - bool printShader() const { return m_printShader; } OpenGLBuilderRcPtr m_oglBuilder; @@ -142,32 +117,27 @@ class OglApp // Keep track of the original image ratio. float m_imageAspect{ 1.0f }; - // For interactive application displaying the processed image, this needs to be true. - bool m_yMirror{ false }; - - // Will shader code be outputed when setShader is called. - bool m_printShader{ false }; - // Image information. int m_imageWidth{ 0 }; int m_imageHeight{ 0 }; Components m_components{ COMPONENTS_RGBA }; + unsigned int m_imageTexID; }; -class ScreenApp: public OglApp +class ScreenOglApp: public OglApp { public: - ScreenApp() = delete; - ScreenApp(const ScreenApp &) = delete; - ScreenApp & operator=(const ScreenApp &) = delete; + ScreenOglApp() = delete; + ScreenOglApp(const ScreenOglApp &) = delete; + ScreenOglApp & operator=(const ScreenOglApp &) = delete; - ScreenApp(const char * winTitle, int winWidth, int winHeight); + ScreenOglApp(const char * winTitle, int winWidth, int winHeight); - ~ScreenApp(); + ~ScreenOglApp(); void redisplay() override; - void printGLInfo() const noexcept override; + void printGraphicsInfo() const noexcept override; private: // Window identifier returned by glutCreateWindow. @@ -178,16 +148,16 @@ class ScreenApp: public OglApp #include -class HeadlessApp: public OglApp +class HeadlessOglApp: public OglApp { public: - HeadlessApp() = delete; + HeadlessOglApp() = delete; - HeadlessApp(const char * winTitle, int bufWidth, int bufHeight); + HeadlessOglApp(const char * winTitle, int bufWidth, int bufHeight); - ~HeadlessApp(); + ~HeadlessOglApp(); - void printGLInfo() const noexcept override; + void printGraphicsInfo() const noexcept override; void redisplay() override; protected: diff --git a/src/libutils/oglapphelpers/vulkanapp.cpp b/src/libutils/oglapphelpers/vulkanapp.cpp new file mode 100644 index 0000000000..91372c828c --- /dev/null +++ b/src/libutils/oglapphelpers/vulkanapp.cpp @@ -0,0 +1,1551 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + +#ifdef OCIO_VULKAN_ENABLED + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "vulkanapp.h" + +namespace OCIO_NAMESPACE +{ + +// +// VulkanApp Implementation +// + +VulkanApp::VulkanApp(int bufWidth, int bufHeight) + : m_bufferWidth(bufWidth) + , m_bufferHeight(bufHeight) +{ + initVulkan(); +} + +VulkanApp::~VulkanApp() +{ + cleanup(); +} + +void VulkanApp::initVulkan() +{ + // Create Vulkan instance + VkApplicationInfo appInfo{}; + appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; + appInfo.pApplicationName = "OCIO GPU Test"; + appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0); + appInfo.pEngineName = "OCIO"; + appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); + appInfo.apiVersion = VK_API_VERSION_1_2; + + VkInstanceCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + createInfo.pApplicationInfo = &appInfo; + + // Required extensions for MoltenVK on macOS + std::vector extensions; +#ifdef __APPLE__ + extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); + createInfo.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; +#endif + + createInfo.enabledExtensionCount = static_cast(extensions.size()); + createInfo.ppEnabledExtensionNames = extensions.data(); + + if (m_enableValidationLayers) + { + createInfo.enabledLayerCount = static_cast(m_validationLayers.size()); + createInfo.ppEnabledLayerNames = m_validationLayers.data(); + } + else + { + createInfo.enabledLayerCount = 0; + } + + if (vkCreateInstance(&createInfo, nullptr, &m_instance) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create Vulkan instance"); + } + + // Select physical device + uint32_t deviceCount = 0; + vkEnumeratePhysicalDevices(m_instance, &deviceCount, nullptr); + + if (deviceCount == 0) + { + throw std::runtime_error("Failed to find GPUs with Vulkan support"); + } + + std::vector devices(deviceCount); + vkEnumeratePhysicalDevices(m_instance, &deviceCount, devices.data()); + + // Find a device with compute queue support + for (const auto & device : devices) + { + uint32_t queueFamilyCount = 0; + vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr); + + std::vector queueFamilies(queueFamilyCount); + vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data()); + + for (uint32_t i = 0; i < queueFamilyCount; i++) + { + if (queueFamilies[i].queueFlags & VK_QUEUE_COMPUTE_BIT) + { + m_physicalDevice = device; + m_computeQueueFamilyIndex = i; + break; + } + } + + if (m_physicalDevice != VK_NULL_HANDLE) + { + break; + } + } + + if (m_physicalDevice == VK_NULL_HANDLE) + { + throw std::runtime_error("Failed to find a suitable GPU with compute support"); + } + + // Print GPU information for diagnostics + VkPhysicalDeviceProperties deviceProperties; + vkGetPhysicalDeviceProperties(m_physicalDevice, &deviceProperties); + std::cout << "Vulkan GPU: " << deviceProperties.deviceName << std::endl; + std::cout << " Device Type: "; + switch (deviceProperties.deviceType) + { + case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU: std::cout << "Discrete GPU"; break; + case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU: std::cout << "Integrated GPU"; break; + case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU: std::cout << "Virtual GPU"; break; + case VK_PHYSICAL_DEVICE_TYPE_CPU: std::cout << "CPU (Software)"; break; + case VK_PHYSICAL_DEVICE_TYPE_OTHER: + case VK_PHYSICAL_DEVICE_TYPE_MAX_ENUM: + default: std::cout << "Other"; break; + } + std::cout << std::endl; + std::cout << " API Version: " << VK_VERSION_MAJOR(deviceProperties.apiVersion) << "." + << VK_VERSION_MINOR(deviceProperties.apiVersion) << "." + << VK_VERSION_PATCH(deviceProperties.apiVersion) << std::endl; + + // Create logical device + float queuePriority = 1.0f; + VkDeviceQueueCreateInfo queueCreateInfo{}; + queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queueCreateInfo.queueFamilyIndex = m_computeQueueFamilyIndex; + queueCreateInfo.queueCount = 1; + queueCreateInfo.pQueuePriorities = &queuePriority; + + VkPhysicalDeviceFeatures deviceFeatures{}; + + VkDeviceCreateInfo deviceCreateInfo{}; + deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + deviceCreateInfo.pQueueCreateInfos = &queueCreateInfo; + deviceCreateInfo.queueCreateInfoCount = 1; + deviceCreateInfo.pEnabledFeatures = &deviceFeatures; + deviceCreateInfo.enabledExtensionCount = 0; + + if (m_enableValidationLayers) + { + deviceCreateInfo.enabledLayerCount = static_cast(m_validationLayers.size()); + deviceCreateInfo.ppEnabledLayerNames = m_validationLayers.data(); + } + else + { + deviceCreateInfo.enabledLayerCount = 0; + } + + if (vkCreateDevice(m_physicalDevice, &deviceCreateInfo, nullptr, &m_device) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create logical device"); + } + + vkGetDeviceQueue(m_device, m_computeQueueFamilyIndex, 0, &m_computeQueue); + + // Create command pool + VkCommandPoolCreateInfo poolInfo{}; + poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + poolInfo.queueFamilyIndex = m_computeQueueFamilyIndex; + poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + + if (vkCreateCommandPool(m_device, &poolInfo, nullptr, &m_commandPool) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create command pool"); + } + + // Allocate command buffer + VkCommandBufferAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + allocInfo.commandPool = m_commandPool; + allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocInfo.commandBufferCount = 1; + + if (vkAllocateCommandBuffers(m_device, &allocInfo, &m_commandBuffer) != VK_SUCCESS) + { + throw std::runtime_error("Failed to allocate command buffer"); + } + + m_initialized = true; +} + +void VulkanApp::cleanup() +{ + if (m_device != VK_NULL_HANDLE) + { + vkDeviceWaitIdle(m_device); + + // Destroy VulkanBuilder first (it holds shader module references) + m_vulkanBuilder.reset(); + + if (m_computePipeline != VK_NULL_HANDLE) + { + vkDestroyPipeline(m_device, m_computePipeline, nullptr); + } + if (m_pipelineLayout != VK_NULL_HANDLE) + { + vkDestroyPipelineLayout(m_device, m_pipelineLayout, nullptr); + } + if (m_descriptorSetLayout != VK_NULL_HANDLE) + { + vkDestroyDescriptorSetLayout(m_device, m_descriptorSetLayout, nullptr); + } + if (m_descriptorPool != VK_NULL_HANDLE) + { + vkDestroyDescriptorPool(m_device, m_descriptorPool, nullptr); + } + if (m_computeShaderModule != VK_NULL_HANDLE) + { + vkDestroyShaderModule(m_device, m_computeShaderModule, nullptr); + } + + if (m_inputBuffer != VK_NULL_HANDLE) + { + vkDestroyBuffer(m_device, m_inputBuffer, nullptr); + } + if (m_inputBufferMemory != VK_NULL_HANDLE) + { + vkFreeMemory(m_device, m_inputBufferMemory, nullptr); + } + if (m_outputBuffer != VK_NULL_HANDLE) + { + vkDestroyBuffer(m_device, m_outputBuffer, nullptr); + } + if (m_outputBufferMemory != VK_NULL_HANDLE) + { + vkFreeMemory(m_device, m_outputBufferMemory, nullptr); + } + if (m_stagingBuffer != VK_NULL_HANDLE) + { + vkDestroyBuffer(m_device, m_stagingBuffer, nullptr); + } + if (m_stagingBufferMemory != VK_NULL_HANDLE) + { + vkFreeMemory(m_device, m_stagingBufferMemory, nullptr); + } + + if (m_commandPool != VK_NULL_HANDLE) + { + vkDestroyCommandPool(m_device, m_commandPool, nullptr); + } + + vkDestroyDevice(m_device, nullptr); + } + + if (m_instance != VK_NULL_HANDLE) + { + vkDestroyInstance(m_instance, nullptr); + } +} + +uint32_t VulkanApp::findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties) +{ + VkPhysicalDeviceMemoryProperties memProperties; + vkGetPhysicalDeviceMemoryProperties(m_physicalDevice, &memProperties); + + for (uint32_t i = 0; i < memProperties.memoryTypeCount; i++) + { + if ((typeFilter & (1 << i)) && + (memProperties.memoryTypes[i].propertyFlags & properties) == properties) + { + return i; + } + } + + throw std::runtime_error("Failed to find suitable memory type"); +} + +void VulkanApp::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, + VkMemoryPropertyFlags properties, VkBuffer & buffer, + VkDeviceMemory & bufferMemory) +{ + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = size; + bufferInfo.usage = usage; + bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + if (vkCreateBuffer(m_device, &bufferInfo, nullptr, &buffer) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create buffer"); + } + + VkMemoryRequirements memRequirements; + vkGetBufferMemoryRequirements(m_device, buffer, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties); + + if (vkAllocateMemory(m_device, &allocInfo, nullptr, &bufferMemory) != VK_SUCCESS) + { + throw std::runtime_error("Failed to allocate buffer memory"); + } + + vkBindBufferMemory(m_device, buffer, bufferMemory, 0); +} + +void VulkanApp::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size) +{ + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + + vkBeginCommandBuffer(m_commandBuffer, &beginInfo); + + VkBufferCopy copyRegion{}; + copyRegion.size = size; + vkCmdCopyBuffer(m_commandBuffer, srcBuffer, dstBuffer, 1, ©Region); + + vkEndCommandBuffer(m_commandBuffer); + + VkSubmitInfo submitInfo{}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &m_commandBuffer; + + vkQueueSubmit(m_computeQueue, 1, &submitInfo, VK_NULL_HANDLE); + vkQueueWaitIdle(m_computeQueue); + + vkResetCommandBuffer(m_commandBuffer, 0); +} + +void VulkanApp::initImage(int imageWidth, int imageHeight, Components comp, const float * imageBuffer) +{ + m_imageWidth = imageWidth; + m_imageHeight = imageHeight; + m_components = comp; + + createVulkanBuffers(); + updateImage(imageBuffer); +} + +void VulkanApp::createVulkanBuffers() +{ + const int numComponents = (m_components == COMPONENTS_RGB) ? 3 : 4; + const VkDeviceSize bufferSize = m_imageWidth * m_imageHeight * numComponents * sizeof(float); + + // Create staging buffer (CPU accessible) + createBuffer(bufferSize, + VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + m_stagingBuffer, m_stagingBufferMemory); + + // Create input buffer (GPU only) + createBuffer(bufferSize, + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + m_inputBuffer, m_inputBufferMemory); + + // Create output buffer (GPU only) + createBuffer(bufferSize, + VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + m_outputBuffer, m_outputBufferMemory); +} + +void VulkanApp::updateImage(const float * imageBuffer) +{ + const int numComponents = (m_components == COMPONENTS_RGB) ? 3 : 4; + const VkDeviceSize bufferSize = m_imageWidth * m_imageHeight * numComponents * sizeof(float); + + // Copy data to staging buffer + void * data; + vkMapMemory(m_device, m_stagingBufferMemory, 0, bufferSize, 0, &data); + memcpy(data, imageBuffer, static_cast(bufferSize)); + vkUnmapMemory(m_device, m_stagingBufferMemory); + + // Copy from staging to input buffer + copyBuffer(m_stagingBuffer, m_inputBuffer, bufferSize); +} + +void VulkanApp::setShader(GpuShaderDescRcPtr & shaderDesc) +{ + if (!m_vulkanBuilder) + { + m_vulkanBuilder = std::make_shared(m_device, m_physicalDevice, + m_commandPool, m_computeQueue); + } + + // Allocate textures and uniforms before building shader + m_vulkanBuilder->allocateAllTextures(shaderDesc); + m_vulkanBuilder->buildShader(shaderDesc); + + if (isShaderVerbose()) + { + std::cout << "Vulkan Compute Shader:\n" << m_vulkanBuilder->getShaderSource() << std::endl; + } + + createComputePipeline(); +} + +void VulkanApp::createComputePipeline() +{ + // Create descriptor set layout + // Use bindings 1 and 2 for input/output buffers + // OCIO uses binding 0 for uniforms and 3+ for textures (via setDescriptorSetIndex(0, 3)) + std::vector bindings = { + // Input buffer binding + {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr}, + // Output buffer binding + {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr} + }; + + // Add texture and uniform bindings from shader builder + auto textureBindings = m_vulkanBuilder->getDescriptorSetLayoutBindings(); + bindings.insert(bindings.end(), textureBindings.begin(), textureBindings.end()); + + VkDescriptorSetLayoutCreateInfo layoutInfo{}; + layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + layoutInfo.bindingCount = static_cast(bindings.size()); + layoutInfo.pBindings = bindings.data(); + + if (vkCreateDescriptorSetLayout(m_device, &layoutInfo, nullptr, &m_descriptorSetLayout) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create descriptor set layout"); + } + + // Create pipeline layout + VkPipelineLayoutCreateInfo pipelineLayoutInfo{}; + pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + pipelineLayoutInfo.setLayoutCount = 1; + pipelineLayoutInfo.pSetLayouts = &m_descriptorSetLayout; + + if (vkCreatePipelineLayout(m_device, &pipelineLayoutInfo, nullptr, &m_pipelineLayout) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create pipeline layout"); + } + + // Create compute pipeline + VkComputePipelineCreateInfo pipelineInfo{}; + pipelineInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + pipelineInfo.layout = m_pipelineLayout; + pipelineInfo.stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + pipelineInfo.stage.stage = VK_SHADER_STAGE_COMPUTE_BIT; + pipelineInfo.stage.module = m_vulkanBuilder->getShaderModule(); + pipelineInfo.stage.pName = "main"; + + if (vkCreateComputePipelines(m_device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &m_computePipeline) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create compute pipeline"); + } + + // Create descriptor pool with sizes from VulkanBuilder + std::vector poolSizes = m_vulkanBuilder->getDescriptorPoolSizes(); + + VkDescriptorPoolCreateInfo poolInfo{}; + poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + poolInfo.poolSizeCount = static_cast(poolSizes.size()); + poolInfo.pPoolSizes = poolSizes.data(); + poolInfo.maxSets = 1; + + if (vkCreateDescriptorPool(m_device, &poolInfo, nullptr, &m_descriptorPool) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create descriptor pool"); + } + + // Allocate descriptor set + VkDescriptorSetAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; + allocInfo.descriptorPool = m_descriptorPool; + allocInfo.descriptorSetCount = 1; + allocInfo.pSetLayouts = &m_descriptorSetLayout; + + if (vkAllocateDescriptorSets(m_device, &allocInfo, &m_descriptorSet) != VK_SUCCESS) + { + throw std::runtime_error("Failed to allocate descriptor set"); + } + + // Update descriptor set with buffer bindings + const int numComponents = (m_components == COMPONENTS_RGB) ? 3 : 4; + const VkDeviceSize bufferSize = m_imageWidth * m_imageHeight * numComponents * sizeof(float); + + VkDescriptorBufferInfo inputBufferInfo{}; + inputBufferInfo.buffer = m_inputBuffer; + inputBufferInfo.offset = 0; + inputBufferInfo.range = bufferSize; + + VkDescriptorBufferInfo outputBufferInfo{}; + outputBufferInfo.buffer = m_outputBuffer; + outputBufferInfo.offset = 0; + outputBufferInfo.range = bufferSize; + + // Use bindings 1 and 2 for input/output buffers + // OCIO uses binding 0 for uniforms and 3+ for textures (via setDescriptorSetIndex(0, 3)) + std::vector descriptorWrites = { + {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, nullptr, m_descriptorSet, 1, 0, 1, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, nullptr, &inputBufferInfo, nullptr}, + {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, nullptr, m_descriptorSet, 2, 0, 1, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, nullptr, &outputBufferInfo, nullptr} + }; + + vkUpdateDescriptorSets(m_device, static_cast(descriptorWrites.size()), + descriptorWrites.data(), 0, nullptr); + + // Update texture and uniform bindings + m_vulkanBuilder->updateDescriptorSet(m_descriptorSet); +} + +void VulkanApp::reshape(int width, int height) +{ + m_bufferWidth = width; + m_bufferHeight = height; +} + +void VulkanApp::redisplay() +{ + // Update uniform values before dispatch (for dynamic parameters) + if (m_vulkanBuilder) + { + m_vulkanBuilder->updateUniforms(); + } + + // Record command buffer + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + + vkBeginCommandBuffer(m_commandBuffer, &beginInfo); + + vkCmdBindPipeline(m_commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, m_computePipeline); + vkCmdBindDescriptorSets(m_commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, + m_pipelineLayout, 0, 1, &m_descriptorSet, 0, nullptr); + + // Dispatch compute shader + const uint32_t groupCountX = (m_imageWidth + 15) / 16; + const uint32_t groupCountY = (m_imageHeight + 15) / 16; + vkCmdDispatch(m_commandBuffer, groupCountX, groupCountY, 1); + + vkEndCommandBuffer(m_commandBuffer); + + // Submit command buffer + VkSubmitInfo submitInfo{}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &m_commandBuffer; + + vkQueueSubmit(m_computeQueue, 1, &submitInfo, VK_NULL_HANDLE); + vkQueueWaitIdle(m_computeQueue); + + vkResetCommandBuffer(m_commandBuffer, 0); +} + +void VulkanApp::readImage(float * imageBuffer) +{ + const int numComponents = (m_components == COMPONENTS_RGB) ? 3 : 4; + const VkDeviceSize bufferSize = m_imageWidth * m_imageHeight * numComponents * sizeof(float); + + // Copy from output buffer to staging buffer + copyBuffer(m_outputBuffer, m_stagingBuffer, bufferSize); + + // Read from staging buffer + void * data; + vkMapMemory(m_device, m_stagingBufferMemory, 0, bufferSize, 0, &data); + memcpy(imageBuffer, data, static_cast(bufferSize)); + vkUnmapMemory(m_device, m_stagingBufferMemory); +} + +void VulkanApp::printVulkanInfo() const noexcept +{ + if (m_physicalDevice == VK_NULL_HANDLE) + { + std::cout << "Vulkan not initialized" << std::endl; + return; + } + + VkPhysicalDeviceProperties properties; + vkGetPhysicalDeviceProperties(m_physicalDevice, &properties); + + std::cout << "Vulkan Device: " << properties.deviceName << std::endl; + std::cout << "Vulkan API Version: " + << VK_VERSION_MAJOR(properties.apiVersion) << "." + << VK_VERSION_MINOR(properties.apiVersion) << "." + << VK_VERSION_PATCH(properties.apiVersion) << std::endl; + std::cout << "Driver Version: " << properties.driverVersion << std::endl; +} + +VulkanAppRcPtr VulkanApp::CreateVulkanApp(int bufWidth, int bufHeight) +{ + return std::make_shared(bufWidth, bufHeight); +} + +// +// VulkanBuilder Implementation +// + +VulkanBuilder::VulkanBuilder(VkDevice device, VkPhysicalDevice physicalDevice, + VkCommandPool commandPool, VkQueue queue) + : m_device(device) + , m_physicalDevice(physicalDevice) + , m_commandPool(commandPool) + , m_queue(queue) +{ +} + +VulkanBuilder::~VulkanBuilder() +{ + deleteAllTextures(); + deleteUniformBuffer(); + + if (m_device != VK_NULL_HANDLE && m_shaderModule != VK_NULL_HANDLE) + { + vkDestroyShaderModule(m_device, m_shaderModule, nullptr); + } +} + +void VulkanBuilder::deleteAllTextures() +{ + if (m_device == VK_NULL_HANDLE) return; + + auto deleteTextures = [this](std::vector & textures) { + for (auto & tex : textures) + { + if (tex.sampler != VK_NULL_HANDLE) + vkDestroySampler(m_device, tex.sampler, nullptr); + if (tex.imageView != VK_NULL_HANDLE) + vkDestroyImageView(m_device, tex.imageView, nullptr); + if (tex.image != VK_NULL_HANDLE) + vkDestroyImage(m_device, tex.image, nullptr); + if (tex.memory != VK_NULL_HANDLE) + vkFreeMemory(m_device, tex.memory, nullptr); + } + textures.clear(); + }; + + deleteTextures(m_textures3D); + deleteTextures(m_textures1D2D); +} + +void VulkanBuilder::deleteUniformBuffer() +{ + if (m_device == VK_NULL_HANDLE) return; + + if (m_uniformBuffer != VK_NULL_HANDLE) + { + vkDestroyBuffer(m_device, m_uniformBuffer, nullptr); + m_uniformBuffer = VK_NULL_HANDLE; + } + if (m_uniformBufferMemory != VK_NULL_HANDLE) + { + vkFreeMemory(m_device, m_uniformBufferMemory, nullptr); + m_uniformBufferMemory = VK_NULL_HANDLE; + } + m_uniformBufferSize = 0; + m_uniforms.clear(); +} + +uint32_t VulkanBuilder::findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties) +{ + VkPhysicalDeviceMemoryProperties memProperties; + vkGetPhysicalDeviceMemoryProperties(m_physicalDevice, &memProperties); + + for (uint32_t i = 0; i < memProperties.memoryTypeCount; i++) + { + if ((typeFilter & (1 << i)) && + (memProperties.memoryTypes[i].propertyFlags & properties) == properties) + { + return i; + } + } + throw std::runtime_error("Failed to find suitable memory type"); +} + +void VulkanBuilder::createImage(uint32_t width, uint32_t height, uint32_t depth, + VkFormat format, VkImageType imageType, + VkImageUsageFlags usage, VkMemoryPropertyFlags properties, + VkImage & image, VkDeviceMemory & imageMemory) +{ + VkImageCreateInfo imageInfo{}; + imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; + imageInfo.imageType = imageType; + imageInfo.extent.width = width; + imageInfo.extent.height = height; + imageInfo.extent.depth = depth; + imageInfo.mipLevels = 1; + imageInfo.arrayLayers = 1; + imageInfo.format = format; + imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; + imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + imageInfo.usage = usage; + imageInfo.samples = VK_SAMPLE_COUNT_1_BIT; + imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + if (vkCreateImage(m_device, &imageInfo, nullptr, &image) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create image"); + } + + VkMemoryRequirements memRequirements; + vkGetImageMemoryRequirements(m_device, image, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties); + + if (vkAllocateMemory(m_device, &allocInfo, nullptr, &imageMemory) != VK_SUCCESS) + { + throw std::runtime_error("Failed to allocate image memory"); + } + + vkBindImageMemory(m_device, image, imageMemory, 0); +} + +VkImageView VulkanBuilder::createImageView(VkImage image, VkFormat format, VkImageViewType viewType) +{ + VkImageViewCreateInfo viewInfo{}; + viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + viewInfo.image = image; + viewInfo.viewType = viewType; + viewInfo.format = format; + viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + viewInfo.subresourceRange.baseMipLevel = 0; + viewInfo.subresourceRange.levelCount = 1; + viewInfo.subresourceRange.baseArrayLayer = 0; + viewInfo.subresourceRange.layerCount = 1; + + VkImageView imageView; + if (vkCreateImageView(m_device, &viewInfo, nullptr, &imageView) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create image view"); + } + return imageView; +} + +VkSampler VulkanBuilder::createSampler(Interpolation interpolation) +{ + VkSamplerCreateInfo samplerInfo{}; + samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; + + if (interpolation == INTERP_NEAREST) + { + samplerInfo.magFilter = VK_FILTER_NEAREST; + samplerInfo.minFilter = VK_FILTER_NEAREST; + } + else + { + samplerInfo.magFilter = VK_FILTER_LINEAR; + samplerInfo.minFilter = VK_FILTER_LINEAR; + } + + samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; + samplerInfo.anisotropyEnable = VK_FALSE; + samplerInfo.maxAnisotropy = 1.0f; + samplerInfo.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK; + samplerInfo.unnormalizedCoordinates = VK_FALSE; + samplerInfo.compareEnable = VK_FALSE; + samplerInfo.compareOp = VK_COMPARE_OP_ALWAYS; + samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; + samplerInfo.mipLodBias = 0.0f; + samplerInfo.minLod = 0.0f; + samplerInfo.maxLod = 0.0f; + + VkSampler sampler; + if (vkCreateSampler(m_device, &samplerInfo, nullptr, &sampler) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create sampler"); + } + return sampler; +} + +void VulkanBuilder::transitionImageLayout(VkImage image, VkFormat /*format*/, + VkImageLayout oldLayout, VkImageLayout newLayout) +{ + VkCommandBufferAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocInfo.commandPool = m_commandPool; + allocInfo.commandBufferCount = 1; + + VkCommandBuffer commandBuffer; + vkAllocateCommandBuffers(m_device, &allocInfo, &commandBuffer); + + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + + vkBeginCommandBuffer(commandBuffer, &beginInfo); + + VkImageMemoryBarrier barrier{}; + barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier.oldLayout = oldLayout; + barrier.newLayout = newLayout; + barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.image = image; + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + barrier.subresourceRange.baseMipLevel = 0; + barrier.subresourceRange.levelCount = 1; + barrier.subresourceRange.baseArrayLayer = 0; + barrier.subresourceRange.layerCount = 1; + + VkPipelineStageFlags sourceStage; + VkPipelineStageFlags destinationStage; + + if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && newLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) + { + barrier.srcAccessMask = 0; + barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + sourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + destinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + } + else if (oldLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) + { + barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + sourceStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + destinationStage = VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT; + } + else + { + throw std::runtime_error("Unsupported layout transition"); + } + + vkCmdPipelineBarrier(commandBuffer, sourceStage, destinationStage, 0, + 0, nullptr, 0, nullptr, 1, &barrier); + + vkEndCommandBuffer(commandBuffer); + + VkSubmitInfo submitInfo{}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &commandBuffer; + + vkQueueSubmit(m_queue, 1, &submitInfo, VK_NULL_HANDLE); + vkQueueWaitIdle(m_queue); + + vkFreeCommandBuffers(m_device, m_commandPool, 1, &commandBuffer); +} + +void VulkanBuilder::copyBufferToImage(VkBuffer buffer, VkImage image, + uint32_t width, uint32_t height, uint32_t depth) +{ + VkCommandBufferAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocInfo.commandPool = m_commandPool; + allocInfo.commandBufferCount = 1; + + VkCommandBuffer commandBuffer; + vkAllocateCommandBuffers(m_device, &allocInfo, &commandBuffer); + + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + + vkBeginCommandBuffer(commandBuffer, &beginInfo); + + VkBufferImageCopy region{}; + region.bufferOffset = 0; + region.bufferRowLength = 0; + region.bufferImageHeight = 0; + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.mipLevel = 0; + region.imageSubresource.baseArrayLayer = 0; + region.imageSubresource.layerCount = 1; + region.imageOffset = {0, 0, 0}; + region.imageExtent = {width, height, depth}; + + vkCmdCopyBufferToImage(commandBuffer, buffer, image, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); + + vkEndCommandBuffer(commandBuffer); + + VkSubmitInfo submitInfo{}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &commandBuffer; + + vkQueueSubmit(m_queue, 1, &submitInfo, VK_NULL_HANDLE); + vkQueueWaitIdle(m_queue); + + vkFreeCommandBuffers(m_device, m_commandPool, 1, &commandBuffer); +} + +void VulkanBuilder::createUniformBuffer(GpuShaderDescRcPtr & shaderDesc) +{ + deleteUniformBuffer(); + + const unsigned numUniforms = shaderDesc->getNumUniforms(); + if (numUniforms == 0) return; + + // Use OCIO's provided buffer size and offsets - these are calculated correctly + // for the scalar layout used in Vulkan shaders + m_uniformBufferSize = shaderDesc->getUniformBufferSize(); + if (m_uniformBufferSize == 0) return; + + // Store uniform metadata using OCIO's provided offsets + for (unsigned idx = 0; idx < numUniforms; ++idx) + { + GpuShaderDesc::UniformData data; + const char * name = shaderDesc->getUniform(idx, data); + + UniformData uniformData; + uniformData.name = name; + uniformData.data = data; + uniformData.offset = data.m_bufferOffset; // Use OCIO's calculated offset + + // Calculate size based on type (for debugging/verification) + if (data.m_getDouble) + { + uniformData.size = sizeof(float); + } + else if (data.m_getBool) + { + uniformData.size = sizeof(int); + } + else if (data.m_getFloat3) + { + uniformData.size = 3 * sizeof(float); + } + else if (data.m_vectorFloat.m_getSize) + { + // Size will be determined when writing data + uniformData.size = 0; + } + else if (data.m_vectorInt.m_getSize) + { + // Size will be determined when writing data + uniformData.size = 0; + } + else + { + std::cerr << "Warning: Unknown uniform type for '" << name << "'" << std::endl; + continue; + } + + m_uniforms.push_back(uniformData); + } + + // Create uniform buffer + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = m_uniformBufferSize; + bufferInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; + bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + if (vkCreateBuffer(m_device, &bufferInfo, nullptr, &m_uniformBuffer) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create uniform buffer"); + } + + VkMemoryRequirements memRequirements; + vkGetBufferMemoryRequirements(m_device, m_uniformBuffer, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + if (vkAllocateMemory(m_device, &allocInfo, nullptr, &m_uniformBufferMemory) != VK_SUCCESS) + { + throw std::runtime_error("Failed to allocate uniform buffer memory"); + } + + vkBindBufferMemory(m_device, m_uniformBuffer, m_uniformBufferMemory, 0); + + // Initialize uniform values + updateUniforms(); +} + +void VulkanBuilder::updateUniforms() +{ + if (m_uniformBufferSize == 0 || m_uniformBuffer == VK_NULL_HANDLE || !m_shaderDesc) return; + + void * data; + vkMapMemory(m_device, m_uniformBufferMemory, 0, m_uniformBufferSize, 0, &data); + + // Zero-initialize the buffer first to ensure clean state + memset(data, 0, m_uniformBufferSize); + + // Query uniform values directly from shader description (callbacks may have updated) + const unsigned numUniforms = m_shaderDesc->getNumUniforms(); + for (unsigned idx = 0; idx < numUniforms && idx < m_uniforms.size(); ++idx) + { + GpuShaderDesc::UniformData uniformData; + m_shaderDesc->getUniform(idx, uniformData); + + char * dest = static_cast(data) + m_uniforms[idx].offset; + + if (uniformData.m_getDouble) + { + float val = static_cast(uniformData.m_getDouble()); + memcpy(dest, &val, sizeof(float)); + } + else if (uniformData.m_getBool) + { + int val = uniformData.m_getBool() ? 1 : 0; + memcpy(dest, &val, sizeof(int)); + } + else if (uniformData.m_getFloat3) + { + // vec3 in std140: write 3 floats (12 bytes), padded to 16 bytes + auto vals = uniformData.m_getFloat3(); + memcpy(dest, vals.data(), 3 * sizeof(float)); + } + else if (uniformData.m_vectorFloat.m_getSize && uniformData.m_vectorFloat.m_getVector) + { + // In std140, each array element is padded to 16 bytes + const float * vals = uniformData.m_vectorFloat.m_getVector(); + size_t count = uniformData.m_vectorFloat.m_getSize(); + for (size_t i = 0; i < count; ++i) + { + memcpy(dest + i * 16, &vals[i], sizeof(float)); + } + } + else if (uniformData.m_vectorInt.m_getSize && uniformData.m_vectorInt.m_getVector) + { + // In std140, each array element is padded to 16 bytes + const int * vals = uniformData.m_vectorInt.m_getVector(); + size_t count = uniformData.m_vectorInt.m_getSize(); + for (size_t i = 0; i < count; ++i) + { + memcpy(dest + i * 16, &vals[i], sizeof(int)); + } + } + } + + vkUnmapMemory(m_device, m_uniformBufferMemory); +} + +void VulkanBuilder::allocateAllTextures(GpuShaderDescRcPtr & shaderDesc) +{ + deleteAllTextures(); + m_shaderDesc = shaderDesc; + + // Create uniform buffer for dynamic parameters + createUniformBuffer(shaderDesc); + + // Process 3D LUTs - use OCIO's get3DTextureShaderBindingIndex for correct bindings + const unsigned num3DTextures = shaderDesc->getNum3DTextures(); + for (unsigned idx = 0; idx < num3DTextures; ++idx) + { + const char * textureName = nullptr; + const char * samplerName = nullptr; + unsigned edgelen = 0; + Interpolation interpolation = INTERP_LINEAR; + shaderDesc->get3DTexture(idx, textureName, samplerName, edgelen, interpolation); + + if (!textureName || !samplerName || edgelen == 0) + { + throw std::runtime_error("Invalid 3D texture data"); + } + + const float * values = nullptr; + shaderDesc->get3DTextureValues(idx, values); + if (!values) + { + throw std::runtime_error("Missing 3D texture values"); + } + + // Use RGBA format since RGB32F is not widely supported (especially on MoltenVK/macOS) + // Convert RGB to RGBA by adding alpha = 1.0 + const size_t numTexels = edgelen * edgelen * edgelen; + std::vector rgbaValues(numTexels * 4); + for (size_t i = 0; i < numTexels; ++i) + { + rgbaValues[i * 4 + 0] = values[i * 3 + 0]; + rgbaValues[i * 4 + 1] = values[i * 3 + 1]; + rgbaValues[i * 4 + 2] = values[i * 3 + 2]; + rgbaValues[i * 4 + 3] = 1.0f; + } + + // Create staging buffer + VkDeviceSize imageSize = numTexels * 4 * sizeof(float); + + VkBuffer stagingBuffer; + VkDeviceMemory stagingBufferMemory; + + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = imageSize; + bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + vkCreateBuffer(m_device, &bufferInfo, nullptr, &stagingBuffer); + + VkMemoryRequirements memRequirements; + vkGetBufferMemoryRequirements(m_device, stagingBuffer, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + vkAllocateMemory(m_device, &allocInfo, nullptr, &stagingBufferMemory); + vkBindBufferMemory(m_device, stagingBuffer, stagingBufferMemory, 0); + + // Copy RGBA data to staging buffer + void * data; + vkMapMemory(m_device, stagingBufferMemory, 0, imageSize, 0, &data); + memcpy(data, rgbaValues.data(), static_cast(imageSize)); + vkUnmapMemory(m_device, stagingBufferMemory); + + // Create 3D image with RGBA format + // Use OCIO's get3DTextureShaderBindingIndex for the correct binding index + TextureResource tex; + tex.samplerName = samplerName; + tex.binding = shaderDesc->get3DTextureShaderBindingIndex(idx); + + createImage(edgelen, edgelen, edgelen, VK_FORMAT_R32G32B32A32_SFLOAT, VK_IMAGE_TYPE_3D, + VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, tex.image, tex.memory); + + // Transition and copy + transitionImageLayout(tex.image, VK_FORMAT_R32G32B32A32_SFLOAT, + VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + copyBufferToImage(stagingBuffer, tex.image, edgelen, edgelen, edgelen); + transitionImageLayout(tex.image, VK_FORMAT_R32G32B32A32_SFLOAT, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + + // Create image view and sampler + tex.imageView = createImageView(tex.image, VK_FORMAT_R32G32B32A32_SFLOAT, VK_IMAGE_VIEW_TYPE_3D); + tex.sampler = createSampler(interpolation); + + m_textures3D.push_back(tex); + + // Cleanup staging buffer + vkDestroyBuffer(m_device, stagingBuffer, nullptr); + vkFreeMemory(m_device, stagingBufferMemory, nullptr); + } + + // Process 1D/2D LUTs + const unsigned numTextures = shaderDesc->getNumTextures(); + for (unsigned idx = 0; idx < numTextures; ++idx) + { + const char * textureName = nullptr; + const char * samplerName = nullptr; + unsigned width = 0; + unsigned height = 0; + GpuShaderDesc::TextureType channel = GpuShaderDesc::TEXTURE_RGB_CHANNEL; + Interpolation interpolation = INTERP_LINEAR; + GpuShaderDesc::TextureDimensions dimensions = GpuShaderDesc::TEXTURE_1D; + shaderDesc->getTexture(idx, textureName, samplerName, width, height, channel, dimensions, interpolation); + + if (!textureName || !samplerName || width == 0) + { + throw std::runtime_error("Invalid texture data"); + } + + const float * values = nullptr; + shaderDesc->getTextureValues(idx, values); + if (!values) + { + throw std::runtime_error("Missing texture values"); + } + + // Use R32 for single channel, RGBA32 for RGB (since RGB32F not supported on MoltenVK) + unsigned imgHeight = (height > 0) ? height : 1; + const size_t numTexels = width * imgHeight; + VkFormat format; + VkDeviceSize imageSize; + std::vector convertedValues; + + if (channel == GpuShaderDesc::TEXTURE_RED_CHANNEL) + { + format = VK_FORMAT_R32_SFLOAT; + imageSize = numTexels * sizeof(float); + } + else + { + // Convert RGB to RGBA + format = VK_FORMAT_R32G32B32A32_SFLOAT; + imageSize = numTexels * 4 * sizeof(float); + convertedValues.resize(numTexels * 4); + for (size_t i = 0; i < numTexels; ++i) + { + convertedValues[i * 4 + 0] = values[i * 3 + 0]; + convertedValues[i * 4 + 1] = values[i * 3 + 1]; + convertedValues[i * 4 + 2] = values[i * 3 + 2]; + convertedValues[i * 4 + 3] = 1.0f; + } + } + + // Create staging buffer + VkBuffer stagingBuffer; + VkDeviceMemory stagingBufferMemory; + + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = imageSize; + bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + + vkCreateBuffer(m_device, &bufferInfo, nullptr, &stagingBuffer); + + VkMemoryRequirements memRequirements; + vkGetBufferMemoryRequirements(m_device, stagingBuffer, &memRequirements); + + VkMemoryAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + allocInfo.allocationSize = memRequirements.size; + allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + vkAllocateMemory(m_device, &allocInfo, nullptr, &stagingBufferMemory); + vkBindBufferMemory(m_device, stagingBuffer, stagingBufferMemory, 0); + + // Copy data + void * data; + vkMapMemory(m_device, stagingBufferMemory, 0, imageSize, 0, &data); + if (channel == GpuShaderDesc::TEXTURE_RED_CHANNEL) + { + memcpy(data, values, static_cast(imageSize)); + } + else + { + memcpy(data, convertedValues.data(), static_cast(imageSize)); + } + vkUnmapMemory(m_device, stagingBufferMemory); + + // Create image (use 2D for both 1D and 2D textures in Vulkan) + // Use OCIO's getTextureShaderBindingIndex for the correct binding index + TextureResource tex; + tex.samplerName = samplerName; + tex.binding = shaderDesc->getTextureShaderBindingIndex(idx); + + createImage(width, imgHeight, 1, format, VK_IMAGE_TYPE_2D, + VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, tex.image, tex.memory); + + // Transition and copy + transitionImageLayout(tex.image, format, + VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + copyBufferToImage(stagingBuffer, tex.image, width, imgHeight, 1); + transitionImageLayout(tex.image, format, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + + // Create image view and sampler + tex.imageView = createImageView(tex.image, format, VK_IMAGE_VIEW_TYPE_2D); + tex.sampler = createSampler(interpolation); + + m_textures1D2D.push_back(tex); + + // Cleanup staging buffer + vkDestroyBuffer(m_device, stagingBuffer, nullptr); + vkFreeMemory(m_device, stagingBufferMemory, nullptr); + } +} + +void VulkanBuilder::buildShader(GpuShaderDescRcPtr & shaderDesc) +{ + // Generate GLSL compute shader source from OCIO shader description + std::ostringstream shader; + + shader << "#version 460\n"; + shader << "#extension GL_EXT_scalar_block_layout : enable\n"; + shader << "\n"; + shader << "layout(local_size_x = 16, local_size_y = 16, local_size_z = 1) in;\n"; + shader << "\n"; + // Use bindings 1 and 2 for input/output buffers. + // OCIO uses binding 0 for uniforms and 3+ for textures (via setDescriptorSetIndex(0, 3)). + shader << "layout(std430, set = 0, binding = 1) readonly buffer InputBuffer {\n"; + shader << " vec4 inputPixels[];\n"; + shader << "};\n"; + shader << "\n"; + shader << "layout(std430, set = 0, binding = 2) writeonly buffer OutputBuffer {\n"; + shader << " vec4 outputPixels[];\n"; + shader << "};\n"; + shader << "\n"; + + // OCIO generates texture sampler declarations with correct bindings when using + // GPU_LANGUAGE_GLSL_VK_4_6 and setDescriptorSetIndex(0, 3) is called on the shader descriptor. + // OCIO uses binding 0 for uniforms (by design) and 3+ for textures. + + // Get OCIO shader text - it already contains sampler and uniform declarations with correct bindings + const char * shaderText = shaderDesc->getShaderText(); + if (shaderText && strlen(shaderText) > 0) + { + shader << shaderText; + } + + shader << "\n"; + shader << "void main() {\n"; + shader << " uvec2 gid = gl_GlobalInvocationID.xy;\n"; + shader << " uint width = 256u;\n"; + shader << " uint height = 256u;\n"; + shader << " \n"; + shader << " // Bounds check to avoid out-of-bounds access\n"; + shader << " if (gid.x >= width || gid.y >= height) return;\n"; + shader << " \n"; + shader << " uint idx = gid.y * width + gid.x;\n"; + shader << " \n"; + shader << " vec4 " << shaderDesc->getPixelName() << " = inputPixels[idx];\n"; + shader << " \n"; + + // Call the OCIO color transformation function + const char * functionName = shaderDesc->getFunctionName(); + if (functionName && strlen(functionName) > 0) + { + shader << " " << shaderDesc->getPixelName() << " = " << functionName + << "(" << shaderDesc->getPixelName() << ");\n"; + } + + shader << " \n"; + shader << " outputPixels[idx] = " << shaderDesc->getPixelName() << ";\n"; + shader << "}\n"; + + m_shaderSource = shader.str(); + + // Compile GLSL to SPIR-V + std::vector spirvCode = compileGLSLToSPIRV(m_shaderSource); + + // Create shader module + VkShaderModuleCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + createInfo.codeSize = spirvCode.size() * sizeof(uint32_t); + createInfo.pCode = spirvCode.data(); + + if (vkCreateShaderModule(m_device, &createInfo, nullptr, &m_shaderModule) != VK_SUCCESS) + { + throw std::runtime_error("Failed to create shader module"); + } +} + +std::vector VulkanBuilder::compileGLSLToSPIRV(const std::string & glslSource) +{ + // Initialize glslang (safe to call multiple times) + static bool glslangInitialized = false; + if (!glslangInitialized) + { + glslang::InitializeProcess(); + glslangInitialized = true; + } + + // Create shader object + glslang::TShader shader(EShLangCompute); + + const char * shaderStrings[1] = { glslSource.c_str() }; + shader.setStrings(shaderStrings, 1); + + // Set up Vulkan 1.2 / SPIR-V 1.5 environment + shader.setEnvInput(glslang::EShSourceGlsl, EShLangCompute, glslang::EShClientVulkan, 460); + shader.setEnvClient(glslang::EShClientVulkan, glslang::EShTargetVulkan_1_2); + shader.setEnvTarget(glslang::EShTargetSpv, glslang::EShTargetSpv_1_5); + + // Get default resource limits + const TBuiltInResource * resources = GetDefaultResources(); + + // Parse the shader + const int defaultVersion = 460; + const bool forwardCompatible = false; + const EShMessages messages = static_cast(EShMsgSpvRules | EShMsgVulkanRules); + + if (!shader.parse(resources, defaultVersion, forwardCompatible, messages)) + { + std::string errorMsg = "GLSL parsing failed:\n"; + errorMsg += shader.getInfoLog(); + errorMsg += "\n"; + errorMsg += shader.getInfoDebugLog(); + throw std::runtime_error(errorMsg); + } + + // Create program and link + glslang::TProgram program; + program.addShader(&shader); + + if (!program.link(messages)) + { + std::string errorMsg = "GLSL linking failed:\n"; + errorMsg += program.getInfoLog(); + errorMsg += "\n"; + errorMsg += program.getInfoDebugLog(); + throw std::runtime_error(errorMsg); + } + + // Convert to SPIR-V + std::vector spirv; + glslang::SpvOptions spvOptions; + spvOptions.generateDebugInfo = false; + spvOptions.stripDebugInfo = true; + spvOptions.disableOptimizer = false; + spvOptions.optimizeSize = false; + + glslang::GlslangToSpv(*program.getIntermediate(EShLangCompute), spirv, &spvOptions); + + if (spirv.empty()) + { + throw std::runtime_error("SPIR-V generation produced empty output"); + } + + return spirv; +} + +std::vector VulkanBuilder::getDescriptorSetLayoutBindings() const +{ + std::vector bindings; + + // Add uniform buffer binding at binding 0 (OCIO's default) + // OCIO generates uniform blocks with binding = 0 by design + if (hasUniforms()) + { + VkDescriptorSetLayoutBinding binding{}; + binding.binding = 0; + binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + binding.descriptorCount = 1; + binding.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + binding.pImmutableSamplers = nullptr; + bindings.push_back(binding); + } + + // Add bindings for 3D LUT textures (starting at binding 1 via setDescriptorSetIndex(0, 1)) + for (const auto & tex : m_textures3D) + { + VkDescriptorSetLayoutBinding binding{}; + binding.binding = tex.binding; + binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + binding.descriptorCount = 1; + binding.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + binding.pImmutableSamplers = nullptr; + bindings.push_back(binding); + } + + // Add bindings for 1D/2D LUT textures + for (const auto & tex : m_textures1D2D) + { + VkDescriptorSetLayoutBinding binding{}; + binding.binding = tex.binding; + binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + binding.descriptorCount = 1; + binding.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + binding.pImmutableSamplers = nullptr; + bindings.push_back(binding); + } + + return bindings; +} + +std::vector VulkanBuilder::getDescriptorPoolSizes() const +{ + std::vector poolSizes; + + // Storage buffers for input/output + poolSizes.push_back({VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2}); + + // Uniform buffer for dynamic parameters + if (hasUniforms()) + { + poolSizes.push_back({VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1}); + } + + // Combined image samplers for textures + uint32_t numTextures = static_cast(m_textures3D.size() + m_textures1D2D.size()); + if (numTextures > 0) + { + poolSizes.push_back({VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, numTextures}); + } + + return poolSizes; +} + +void VulkanBuilder::updateDescriptorSet(VkDescriptorSet descriptorSet) +{ + std::vector descriptorWrites; + std::vector imageInfos; + + // Use a single buffer info for uniform buffer (allocated on stack to avoid reallocation issues) + VkDescriptorBufferInfo uniformBufferInfo{}; + + // Reserve space to prevent reallocation + imageInfos.reserve(m_textures3D.size() + m_textures1D2D.size()); + + // Add uniform buffer binding at binding 0 (OCIO's default) + if (hasUniforms()) + { + uniformBufferInfo.buffer = m_uniformBuffer; + uniformBufferInfo.offset = 0; + uniformBufferInfo.range = m_uniformBufferSize; + + VkWriteDescriptorSet uniformWrite{}; + uniformWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + uniformWrite.dstSet = descriptorSet; + uniformWrite.dstBinding = 0; + uniformWrite.dstArrayElement = 0; + uniformWrite.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + uniformWrite.descriptorCount = 1; + uniformWrite.pBufferInfo = &uniformBufferInfo; + descriptorWrites.push_back(uniformWrite); + } + + // Add 3D texture bindings (starting at binding 1 via setDescriptorSetIndex(0, 1)) + for (const auto & tex : m_textures3D) + { + VkDescriptorImageInfo imageInfo{}; + imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + imageInfo.imageView = tex.imageView; + imageInfo.sampler = tex.sampler; + imageInfos.push_back(imageInfo); + + VkWriteDescriptorSet imageWrite{}; + imageWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + imageWrite.dstSet = descriptorSet; + imageWrite.dstBinding = tex.binding; + imageWrite.dstArrayElement = 0; + imageWrite.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + imageWrite.descriptorCount = 1; + imageWrite.pImageInfo = &imageInfos.back(); + descriptorWrites.push_back(imageWrite); + } + + // Add 1D/2D texture bindings + for (const auto & tex : m_textures1D2D) + { + VkDescriptorImageInfo imageInfo{}; + imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + imageInfo.imageView = tex.imageView; + imageInfo.sampler = tex.sampler; + imageInfos.push_back(imageInfo); + + VkWriteDescriptorSet imageWrite{}; + imageWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + imageWrite.dstSet = descriptorSet; + imageWrite.dstBinding = tex.binding; + imageWrite.dstArrayElement = 0; + imageWrite.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + imageWrite.descriptorCount = 1; + imageWrite.pImageInfo = &imageInfos.back(); + descriptorWrites.push_back(imageWrite); + } + + if (!descriptorWrites.empty()) + { + vkUpdateDescriptorSets(m_device, static_cast(descriptorWrites.size()), + descriptorWrites.data(), 0, nullptr); + } +} + +} // namespace OCIO_NAMESPACE + +#endif // OCIO_VULKAN_ENABLED diff --git a/src/libutils/oglapphelpers/vulkanapp.h b/src/libutils/oglapphelpers/vulkanapp.h new file mode 100644 index 0000000000..caa879d92e --- /dev/null +++ b/src/libutils/oglapphelpers/vulkanapp.h @@ -0,0 +1,272 @@ +// SPDX-License-Identifier: BSD-3-Clause +// Copyright Contributors to the OpenColorIO Project. + + +#ifndef INCLUDED_OCIO_VULKANAPP_H +#define INCLUDED_OCIO_VULKANAPP_H + +#ifdef OCIO_VULKAN_ENABLED + +#include +#include +#include + +#include + +#include + +#include "graphicalapp.h" + +namespace OCIO_NAMESPACE +{ + +class VulkanBuilder; +typedef OCIO_SHARED_PTR VulkanBuilderRcPtr; + +class VulkanApp; +typedef OCIO_SHARED_PTR VulkanAppRcPtr; + +// VulkanApp provides headless Vulkan rendering for GPU unit testing. +// This class is designed to process images using OCIO GPU shaders via Vulkan compute pipelines. +class VulkanApp : public GraphicalApp +{ +public: + VulkanApp() = delete; + VulkanApp(const VulkanApp &) = delete; + VulkanApp & operator=(const VulkanApp &) = delete; + + // Initialize the app with given buffer size for headless rendering. + VulkanApp(int bufWidth, int bufHeight); + + virtual ~VulkanApp(); + + // Initialize the image buffer. + void initImage(int imageWidth, int imageHeight, Components comp, const float * imageBuffer) override; + + // Update the image if it changes. + void updateImage(const float * imageBuffer) override; + + // No-op: Vulkan buffers are created during initImage(). + void createBuffers() override {} + + // Set the shader code from OCIO GpuShaderDesc. + void setShader(GpuShaderDescRcPtr & shaderDesc) override; + + // Update the size of the buffer used to process the image. + void reshape(int width, int height) override; + + // Process the image using the Vulkan compute pipeline. + void redisplay() override; + + // Read the processed image from the GPU buffer. + void readImage(float * imageBuffer) override; + + // Print Vulkan device and instance info. + void printVulkanInfo() const noexcept; + + // Implements GraphicalApp::printGraphicsInfo(). + void printGraphicsInfo() const noexcept override { printVulkanInfo(); } + + // Factory method to create a VulkanApp instance. + static VulkanAppRcPtr CreateVulkanApp(int bufWidth, int bufHeight); + +protected: + // Initialize Vulkan instance, device, and queues. + void initVulkan(); + + // Create Vulkan compute pipeline for shader processing. + void createComputePipeline(); + + // Create Vulkan buffers for image data (called internally from initImage). + void createVulkanBuffers(); + + // Clean up Vulkan resources. + void cleanup(); + + // Helper to find a suitable memory type. + uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties); + + // Helper to create a Vulkan buffer. + void createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, + VkMemoryPropertyFlags properties, VkBuffer & buffer, + VkDeviceMemory & bufferMemory); + + // Helper to copy buffer data. + void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); + +private: + // Vulkan core objects + VkInstance m_instance{ VK_NULL_HANDLE }; + VkPhysicalDevice m_physicalDevice{ VK_NULL_HANDLE }; + VkDevice m_device{ VK_NULL_HANDLE }; + VkQueue m_computeQueue{ VK_NULL_HANDLE }; + uint32_t m_computeQueueFamilyIndex{ 0 }; + + // Command pool and buffer + VkCommandPool m_commandPool{ VK_NULL_HANDLE }; + VkCommandBuffer m_commandBuffer{ VK_NULL_HANDLE }; + + // Compute pipeline + VkPipelineLayout m_pipelineLayout{ VK_NULL_HANDLE }; + VkPipeline m_computePipeline{ VK_NULL_HANDLE }; + VkDescriptorSetLayout m_descriptorSetLayout{ VK_NULL_HANDLE }; + VkDescriptorPool m_descriptorPool{ VK_NULL_HANDLE }; + VkDescriptorSet m_descriptorSet{ VK_NULL_HANDLE }; + + // Shader module + VkShaderModule m_computeShaderModule{ VK_NULL_HANDLE }; + + // Image buffers + VkBuffer m_inputBuffer{ VK_NULL_HANDLE }; + VkDeviceMemory m_inputBufferMemory{ VK_NULL_HANDLE }; + VkBuffer m_outputBuffer{ VK_NULL_HANDLE }; + VkDeviceMemory m_outputBufferMemory{ VK_NULL_HANDLE }; + VkBuffer m_stagingBuffer{ VK_NULL_HANDLE }; + VkDeviceMemory m_stagingBufferMemory{ VK_NULL_HANDLE }; + + // Image dimensions + int m_imageWidth{ 0 }; + int m_imageHeight{ 0 }; + int m_bufferWidth{ 0 }; + int m_bufferHeight{ 0 }; + Components m_components{ GraphicalApp::COMPONENTS_RGBA }; + + // Shader builder + VulkanBuilderRcPtr m_vulkanBuilder; + + // Debug and configuration + bool m_initialized{ false }; + + // Validation layers (debug builds) +#ifdef NDEBUG + const bool m_enableValidationLayers{ false }; +#else + const bool m_enableValidationLayers{ true }; +#endif + const std::vector m_validationLayers = { + "VK_LAYER_KHRONOS_validation" + }; +}; + +// VulkanBuilder handles OCIO shader compilation for Vulkan. +class VulkanBuilder +{ +public: + VulkanBuilder() = delete; + VulkanBuilder(const VulkanBuilder &) = delete; + VulkanBuilder & operator=(const VulkanBuilder &) = delete; + + explicit VulkanBuilder(VkDevice device, VkPhysicalDevice physicalDevice, + VkCommandPool commandPool, VkQueue queue); + ~VulkanBuilder(); + + // Build compute shader from OCIO GpuShaderDesc. + void buildShader(GpuShaderDescRcPtr & shaderDesc); + + // Get the compiled shader module. + VkShaderModule getShaderModule() const { return m_shaderModule; } + + // Get the shader source code (for debugging). + const std::string & getShaderSource() const { return m_shaderSource; } + + // Allocate and setup all textures (3D LUTs and 1D/2D LUTs). + void allocateAllTextures(GpuShaderDescRcPtr & shaderDesc); + + // Get descriptor set layout bindings for textures and uniforms. + std::vector getDescriptorSetLayoutBindings() const; + + // Get descriptor pool sizes for textures and uniforms. + std::vector getDescriptorPoolSizes() const; + + // Update descriptor set with texture and uniform bindings. + void updateDescriptorSet(VkDescriptorSet descriptorSet); + + // Update uniform values before each dispatch. + void updateUniforms(); + + // Get the uniform buffer for binding. + VkBuffer getUniformBuffer() const { return m_uniformBuffer; } + VkDeviceSize getUniformBufferSize() const { return m_uniformBufferSize; } + + // Check if uniforms are used. + bool hasUniforms() const { return m_uniformBufferSize > 0; } + + // Check if textures are used. + bool hasTextures() const { return !m_textures3D.empty() || !m_textures1D2D.empty(); } + +private: + // Compile GLSL to SPIR-V. + std::vector compileGLSLToSPIRV(const std::string & glslSource); + + // Helper to find memory type. + uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties); + + // Helper to create image. + void createImage(uint32_t width, uint32_t height, uint32_t depth, + VkFormat format, VkImageType imageType, + VkImageUsageFlags usage, VkMemoryPropertyFlags properties, + VkImage & image, VkDeviceMemory & imageMemory); + + // Helper to create image view. + VkImageView createImageView(VkImage image, VkFormat format, VkImageViewType viewType); + + // Helper to create sampler. + VkSampler createSampler(Interpolation interpolation); + + // Helper to transition image layout. + void transitionImageLayout(VkImage image, VkFormat format, + VkImageLayout oldLayout, VkImageLayout newLayout); + + // Helper to copy buffer to image. + void copyBufferToImage(VkBuffer buffer, VkImage image, + uint32_t width, uint32_t height, uint32_t depth); + + // Create uniform buffer. + void createUniformBuffer(GpuShaderDescRcPtr & shaderDesc); + + // Delete all resources. + void deleteAllTextures(); + void deleteUniformBuffer(); + + VkDevice m_device{ VK_NULL_HANDLE }; + VkPhysicalDevice m_physicalDevice{ VK_NULL_HANDLE }; + VkCommandPool m_commandPool{ VK_NULL_HANDLE }; + VkQueue m_queue{ VK_NULL_HANDLE }; + VkShaderModule m_shaderModule{ VK_NULL_HANDLE }; + std::string m_shaderSource; + GpuShaderDescRcPtr m_shaderDesc; + + // Texture resources for 3D LUTs + struct TextureResource + { + VkImage image{ VK_NULL_HANDLE }; + VkDeviceMemory memory{ VK_NULL_HANDLE }; + VkImageView imageView{ VK_NULL_HANDLE }; + VkSampler sampler{ VK_NULL_HANDLE }; + std::string samplerName; + uint32_t binding{ 0 }; + }; + std::vector m_textures3D; + std::vector m_textures1D2D; + + // Uniform buffer for dynamic parameters + VkBuffer m_uniformBuffer{ VK_NULL_HANDLE }; + VkDeviceMemory m_uniformBufferMemory{ VK_NULL_HANDLE }; + VkDeviceSize m_uniformBufferSize{ 0 }; + + // Uniform data structure matching shader layout + struct UniformData + { + std::string name; + GpuShaderDesc::UniformData data; + size_t offset; + size_t size; + }; + std::vector m_uniforms; +}; + +} // namespace OCIO_NAMESPACE + +#endif // OCIO_VULKAN_ENABLED + +#endif // INCLUDED_OCIO_VULKANAPP_H diff --git a/src/utils/StringUtils.h b/src/utils/StringUtils.h index 7dbfaa1a4b..25600a2760 100644 --- a/src/utils/StringUtils.h +++ b/src/utils/StringUtils.h @@ -252,6 +252,8 @@ inline std::string::size_type ReverseFind(const std::string & subject, const std // In place replace the 'search' substring by the 'replace' string in 'str'. inline bool ReplaceInPlace(std::string & subject, const std::string & search, const std::string & replace) { + if (search.empty()) return false; + bool changed = false; size_t pos = 0; diff --git a/tests/cpu/CMakeLists.txt b/tests/cpu/CMakeLists.txt index 12fd06c1ba..2dab084f3e 100755 --- a/tests/cpu/CMakeLists.txt +++ b/tests/cpu/CMakeLists.txt @@ -19,10 +19,28 @@ macro(add_ocio_test_variant NAME BINARY) endif() endmacro() -function(add_ocio_test NAME SOURCES PRIVATE_INCLUDES) +function(prepend var prefix) + set(new "") + foreach(f ${ARGN}) + list(APPEND new "${prefix}${f}") + endforeach(f) + set(${var} "${new}" PARENT_SCOPE) +endfunction(prepend) + +function(add_ocio_test NAME SOURCES TESTS PRIVATE_INCLUDES) set(TEST_BINARY "test_${NAME}_exec") set(TEST_NAME "test_${NAME}") - add_executable(${TEST_BINARY} ${SOURCES}) + + prepend(SOURCES "${PROJECT_SOURCE_DIR}/src/OpenColorIO/" ${SOURCES}) + set(SOURCES_ALL ${SOURCES}) + list(APPEND SOURCES_ALL ${TESTS}) + + add_executable(${TEST_BINARY} ${SOURCES_ALL}) + + # Group the source files to replicate the source tree structure in the IDEs. + source_group(TREE "${PROJECT_SOURCE_DIR}/src/OpenColorIO/" PREFIX "OpenColorIO Library" FILES ${SOURCES}) + source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" PREFIX "Tests" FILES ${TESTS}) + target_compile_definitions(${TEST_BINARY} PRIVATE OpenColorIO_SKIP_IMPORTS @@ -331,18 +349,6 @@ set(TESTS ViewTransform_tests.cpp ) -function(prepend var prefix) - set(new "") - foreach(f ${ARGN}) - list(APPEND new "${prefix}${f}") - endforeach(f) - set(${var} "${new}" PARENT_SCOPE) -endfunction(prepend) - -prepend(SOURCES "${PROJECT_SOURCE_DIR}/src/OpenColorIO/" ${SOURCES}) - -list(APPEND SOURCES ${TESTS}) - if(OCIO_USE_SIMD AND (OCIO_ARCH_X86 OR OCIO_USE_SSE2NEON)) # Note that these files are gated by preprocessors to remove them based on the OCIO_USE_* vars. set_property(SOURCE "${CMAKE_SOURCE_DIR}/src/OpenColorIO/ops/lut1d/Lut1DOpCPU_SSE2.cpp" APPEND PROPERTY COMPILE_OPTIONS ${OCIO_SSE2_ARGS}) @@ -359,4 +365,4 @@ if(OCIO_USE_SIMD AND (OCIO_ARCH_X86 OR OCIO_USE_SSE2NEON)) set_property(SOURCE "AVX512_tests.cpp" APPEND PROPERTY COMPILE_OPTIONS ${OCIO_AVX512_ARGS}) endif() -add_ocio_test(cpu "${SOURCES}" TRUE) +add_ocio_test(cpu "${SOURCES}" "${TESTS}" TRUE) diff --git a/tests/cpu/CPUProcessor_tests.cpp b/tests/cpu/CPUProcessor_tests.cpp index 925a75397c..e7f37912cc 100644 --- a/tests/cpu/CPUProcessor_tests.cpp +++ b/tests/cpu/CPUProcessor_tests.cpp @@ -276,9 +276,9 @@ OCIO_ADD_TEST(CPUProcessor, with_one_matrix) 1.0000f, 1.2500f, 1.9900f }; const std::vector resImg - = { -0.01929f, -0.3995f, 0.4002f, 0.5f, - 1.58960f, 0.9050f, 1.5025f, 0.5f, - 2.070699f, 1.6505f, 2.4002f, 0.5f }; + = { -0.01929f, -0.3995f, 0.4002f, 1.5f, + 1.58960f, 0.9050f, 1.5025f, 1.5f, + 2.070699f, 1.6505f, 2.4002f, 1.5f }; ComputeValues( __LINE__, processor, @@ -620,10 +620,10 @@ OCIO_ADD_TEST(CPUProcessor, with_one_1d_lut) 5120, 20480, 65535 }; const std::vector resImg - = { 95, 24, 0, 0, - 268, 178, 123, 0, - 955, 598, 394, 0, - 65535, 8589, 1986, 0 }; + = { 95, 24, 0, 65535, + 268, 178, 123, 65535, + 955, 598, 394, 65535, + 65535, 8589, 1986, 65535 }; ComputeValues( __LINE__, processor, @@ -656,10 +656,10 @@ OCIO_ADD_TEST(CPUProcessor, with_one_1d_lut) 128, 1023, 640 }; const std::vector ui10_resImg - = { 0, 6, 15, 0, - 26, 48, 106, 0, - 36, 106, 252, 0, - 48, 1023, 384, 0 }; + = { 0, 6, 15, 1023, + 26, 48, 106, 1023, + 36, 106, 252, 1023, + 48, 1023, 384, 1023 }; ComputeValues( __LINE__, processor, @@ -668,10 +668,10 @@ OCIO_ADD_TEST(CPUProcessor, with_one_1d_lut) NB_PIXELS); const std::vector ui16_resImg - = { 0, 394, 955, 0, - 1656, 3092, 6794, 0, - 2301, 6794, 16162, 0, - 3092, 65535, 24593, 0 }; + = { 0, 394, 955, 65535, + 1656, 3092, 6794, 65535, + 2301, 6794, 16162, 65535, + 3092, 65535, 24593, 65535 }; ComputeValues( __LINE__, processor, @@ -704,10 +704,10 @@ OCIO_ADD_TEST(CPUProcessor, with_one_1d_lut) 1024, 2048, 4095 }; const std::vector ui12_resImg - = { 0, 11, 25, 0, - 37, 60, 103, 0, - 49, 103, 193, 0, - 424, 1009, 4095, 0 }; + = { 0, 11, 25, 4095, + 37, 60, 103, 4095, + 49, 103, 193, 4095, + 424, 1009, 4095, 4095 }; ComputeValues( __LINE__, processor, @@ -715,10 +715,10 @@ OCIO_ADD_TEST(CPUProcessor, with_one_1d_lut) &ui12_resImg[0], OCIO::CHANNEL_ORDERING_RGBA, NB_PIXELS); const std::vector ui16_resImg - = { 0, 178, 394, 0, - 598, 955, 1655, 0, - 779, 1655, 3089, 0, - 6789, 16143, 65535, 0 }; + = { 0, 178, 394, 65535, + 598, 955, 1655, 65535, + 779, 1655, 3089, 65535, + 6789, 16143, 65535, 65535 }; ComputeValues( __LINE__, processor, diff --git a/tests/cpu/ColorSpace_tests.cpp b/tests/cpu/ColorSpace_tests.cpp index 6bdbaa77ad..09819632e6 100644 --- a/tests/cpu/ColorSpace_tests.cpp +++ b/tests/cpu/ColorSpace_tests.cpp @@ -715,7 +715,7 @@ active_views: [] OCIO_CHECK_THROW_WHAT(config->validate(), OCIO::Exception, "Config failed color space validation. The color space 'raw' refers " - "to an interop ID, 'data', which is not defined in this config."); + "to an interop ID, 'data', which is not a color space name or alias."); } // Test that the interop id can be found in another color space. diff --git a/tests/cpu/Config_tests.cpp b/tests/cpu/Config_tests.cpp index b3d69c1688..28d5e430b1 100644 --- a/tests/cpu/Config_tests.cpp +++ b/tests/cpu/Config_tests.cpp @@ -10416,3 +10416,153 @@ OCIO_ADD_TEST(Config, interchange_attributes) } } +OCIO_ADD_TEST(Config, cyclic_color_space_transform) +{ + // Regression test for a stack overflow triggered by a self-referential + // ColorSpaceTransform (a ColorSpace whose from_reference is a ColorSpaceTransform + // that points back to itself). getProcessor() must throw a clean exception + // rather than recursing until the stack guard page is hit. + + constexpr char CYCLIC_PROFILE[] = + "ocio_profile_version: 2\n" + "roles:\n" + " default: cs0\n" + "colorspaces:\n" + " - !\n" + " name: cs0\n" + " isdata: true\n" + " - !\n" + " name: cs1\n" + " from_scene_reference: ! {src: cs0, dst: cs1}\n"; + + std::istringstream is; + is.str(CYCLIC_PROFILE); + OCIO::ConstConfigRcPtr config; + OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); + + OCIO_CHECK_THROW_WHAT(config->getProcessor("cs0", "cs1"), + OCIO::Exception, + "Cycle detected"); +} + +OCIO_ADD_TEST(Config, cyclic_color_space_two_step) +{ + // Two-step cycle: cs1 -> cs2 -> cs1. Verify the depth guard catches indirect cycles too. + + constexpr char CYCLIC_PROFILE[] = + "ocio_profile_version: 2\n" + "roles:\n" + " default: cs0\n" + "colorspaces:\n" + " - !\n" + " name: cs0\n" + " isdata: true\n" + " - !\n" + " name: cs1\n" + " from_scene_reference: ! {src: cs0, dst: cs2}\n" + " - !\n" + " name: cs2\n" + " from_scene_reference: ! {src: cs0, dst: cs1}\n"; + + std::istringstream is; + is.str(CYCLIC_PROFILE); + OCIO::ConstConfigRcPtr config; + OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); + + OCIO_CHECK_THROW_WHAT(config->getProcessor("cs0", "cs1"), + OCIO::Exception, + "Cycle detected"); +} + +OCIO_ADD_TEST(Config, cyclic_look_transform) +{ + // Regression test: a Look whose transform is a LookTransform that references the + // same look must not crash via stack overflow on getProcessor(). Triggered here + // by a ColorSpace whose from_scene_reference is a LookTransform invoking lookA, + // whose own transform is another LookTransform invoking lookA. + + constexpr char CYCLIC_PROFILE[] = + "ocio_profile_version: 2\n" + "roles:\n" + " default: cs0\n" + "looks:\n" + " - !\n" + " name: lookA\n" + " process_space: cs0\n" + " transform: ! {src: cs0, dst: cs0, looks: lookA}\n" + "colorspaces:\n" + " - !\n" + " name: cs0\n" + " - !\n" + " name: cs1\n" + " from_scene_reference: ! {src: cs0, dst: cs0, looks: lookA}\n"; + + std::istringstream is; + is.str(CYCLIC_PROFILE); + OCIO::ConstConfigRcPtr config; + OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); + + OCIO_CHECK_THROW_WHAT(config->getProcessor("cs0", "cs1"), + OCIO::Exception, + "Cycle detected"); +} + +OCIO_ADD_TEST(Config, cyclic_color_space_linearity_check) +{ + // Regression test for the BuildOps depth guard. Config::isColorSpaceLinear() reaches + // the op-builder via Config::Impl::getProcessorWithoutCaching(), which does NOT call + // CollectContextVariables() first. So even with the CollectContextVariables guard, + // this path will still infinite-recurse on a cyclic color space unless BuildOps + // independently guards against it. + + constexpr char CYCLIC_PROFILE[] = + "ocio_profile_version: 2\n" + "roles:\n" + " default: cs0\n" + "colorspaces:\n" + " - !\n" + " name: cs0\n" + " - !\n" + " name: cs1\n" + " from_scene_reference: ! {src: cs0, dst: cs1}\n"; + + std::istringstream is; + is.str(CYCLIC_PROFILE); + OCIO::ConstConfigRcPtr config; + OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); + + OCIO_CHECK_THROW_WHAT(config->isColorSpaceLinear("cs1", OCIO::REFERENCE_SPACE_SCENE), + OCIO::Exception, + "Cycle detected"); +} + +OCIO_ADD_TEST(Config, cyclic_display_view_transform) +{ + // Regression test: a ColorSpace whose from_scene_reference is a DisplayViewTransform + // that ultimately points back to the same ColorSpace (via the view's color space) + // must not crash via stack overflow on getProcessor(). + + constexpr char CYCLIC_PROFILE[] = + "ocio_profile_version: 2\n" + "roles:\n" + " default: cs0\n" + "displays:\n" + " D1:\n" + " - ! {name: V1, colorspace: cs_loop}\n" + "colorspaces:\n" + " - !\n" + " name: cs0\n" + " - !\n" + " name: cs_loop\n" + " from_scene_reference: ! {src: cs0, display: D1, view: V1}\n"; + + std::istringstream is; + is.str(CYCLIC_PROFILE); + OCIO::ConstConfigRcPtr config; + OCIO_CHECK_NO_THROW(config = OCIO::Config::CreateFromStream(is)); + + OCIO_CHECK_THROW_WHAT(config->getProcessor("cs0", "cs_loop"), + OCIO::Exception, + "Cycle detected"); +} + diff --git a/tests/cpu/GpuShader_tests.cpp b/tests/cpu/GpuShader_tests.cpp index 569358239b..eb2bc09dc8 100644 --- a/tests/cpu/GpuShader_tests.cpp +++ b/tests/cpu/GpuShader_tests.cpp @@ -36,7 +36,7 @@ OCIO_ADD_TEST(GpuShader, generic_shader) OCIO_CHECK_NO_THROW(shaderDesc->finalize()); const std::string id(shaderDesc->getCacheID()); - OCIO_CHECK_EQUAL(id, std::string("glsl_1.3 1sd234_ res_1sd234_ pxl_1sd234_ 0 " + OCIO_CHECK_EQUAL(id, std::string("glsl_1.3 1sd234_ res_1sd234_ pxl_1sd234_ 0 0 1 " "6001c324468d497f99aa06d3014798d8")); OCIO_CHECK_NO_THROW(shaderDesc->setResourcePrefix("res_1")); OCIO_CHECK_NO_THROW(shaderDesc->finalize()); @@ -53,15 +53,18 @@ OCIO_ADD_TEST(GpuShader, generic_shader) 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f }; OCIO_CHECK_EQUAL(shaderDesc->getNumTextures(), 0U); - OCIO_CHECK_NO_THROW(shaderDesc->addTexture("lut1", - "lut1Sampler", - width, height, - OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL, - OCIO::GpuShaderDesc::TEXTURE_2D, - OCIO::INTERP_TETRAHEDRAL, - &values[0])); + unsigned textureShaderBindingIndex = 0U; + OCIO_CHECK_NO_THROW( + textureShaderBindingIndex = shaderDesc->addTexture("lut1", "lut1Sampler", + width, height, + OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL, + OCIO::GpuShaderDesc::TEXTURE_2D, + OCIO::INTERP_TETRAHEDRAL, + &values[0]) + ); OCIO_CHECK_EQUAL(shaderDesc->getNumTextures(), 1U); + OCIO_CHECK_EQUAL(textureShaderBindingIndex, 1U); const char * textureName = nullptr; const char * samplerName = nullptr; @@ -98,13 +101,15 @@ OCIO_ADD_TEST(GpuShader, generic_shader) // Support several 1D LUTs - OCIO_CHECK_NO_THROW(shaderDesc->addTexture("lut2", "lut2Sampler", width, height, - OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL, - d, - OCIO::INTERP_TETRAHEDRAL, - &values[0])); - + OCIO_CHECK_NO_THROW( + textureShaderBindingIndex = shaderDesc->addTexture("lut2", "lut2Sampler", + width, height, + OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL, + d, OCIO::INTERP_TETRAHEDRAL, + &values[0]) + ); OCIO_CHECK_EQUAL(shaderDesc->getNumTextures(), 2U); + OCIO_CHECK_EQUAL(textureShaderBindingIndex, 2U); OCIO_CHECK_NO_THROW(shaderDesc->getTextureValues(0, vals)); OCIO_CHECK_NO_THROW(shaderDesc->getTextureValues(1, vals)); @@ -121,11 +126,14 @@ OCIO_ADD_TEST(GpuShader, generic_shader) 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 0.7f, 0.8f, 0.9f, }; OCIO_CHECK_EQUAL(shaderDesc->getNum3DTextures(), 0U); - OCIO_CHECK_NO_THROW(shaderDesc->add3DTexture("lut1", "lut1Sampler", edgelen, - OCIO::INTERP_TETRAHEDRAL, - &values[0])); - + unsigned textureShaderBindingIndex = 0U; + OCIO_CHECK_NO_THROW( + textureShaderBindingIndex = shaderDesc->add3DTexture("lut1", "lut1Sampler", edgelen, + OCIO::INTERP_TETRAHEDRAL, + &values[0]) + ); OCIO_CHECK_EQUAL(shaderDesc->getNum3DTextures(), 1U); + OCIO_CHECK_EQUAL(textureShaderBindingIndex, 3U); const char * textureName = nullptr; const char * samplerName = nullptr; @@ -157,11 +165,13 @@ OCIO_ADD_TEST(GpuShader, generic_shader) // Supports several 3D LUTs - OCIO_CHECK_NO_THROW(shaderDesc->add3DTexture("lut1", "lut1Sampler", edgelen, - OCIO::INTERP_TETRAHEDRAL, - &values[0])); - + OCIO_CHECK_NO_THROW( + textureShaderBindingIndex = shaderDesc->add3DTexture("lut2", "lut2Sampler", edgelen, + OCIO::INTERP_TETRAHEDRAL, + &values[0]) + ); OCIO_CHECK_EQUAL(shaderDesc->getNum3DTextures(), 2U); + OCIO_CHECK_EQUAL(textureShaderBindingIndex, 4U); // Check the 3D LUT limit @@ -1354,3 +1364,168 @@ float4 OCIOMain( OCIO_CHECK_EQUAL(expected, text); } + +OCIO_ADD_TEST(GpuShader, VulkanSupport) +{ + OCIO::ConfigRcPtr config = OCIO::Config::Create(); + auto ft = OCIO::FileTransform::Create(); + std::vector paths = { + std::string(OCIO::GetTestFilesDir()), + std::string("clf"), + std::string("lut1d_lut3d_lut1d.clf") + }; + const std::string filePath = pystring::os::path::normpath( + pystring::os::path::join(paths) + ); + ft->setSrc(filePath.c_str()); + + auto processor = config->getProcessor(ft); + auto gpuProcessor = processor->getOptimizedGPUProcessor(OCIO::OPTIMIZATION_NONE); + + auto shaderDesc = OCIO::GpuShaderDesc::CreateShaderDesc(); + OCIO_CHECK_NO_THROW(shaderDesc->setLanguage(OCIO::GPU_LANGUAGE_GLSL_VK_4_6)); + OCIO_CHECK_NO_THROW(shaderDesc->setDescriptorSetIndex(2, 10)); + + gpuProcessor->extractGpuShaderInfo(shaderDesc); + + OCIO_CHECK_EQUAL(shaderDesc->getDescriptorSetIndex(), 2U); + OCIO_CHECK_EQUAL(shaderDesc->getNumTextures(), 2U); + OCIO_CHECK_EQUAL(shaderDesc->getNum3DTextures(), 1U); + + // Check Lut1D textures. + { + const char * textureName = nullptr; + const char * samplerName = nullptr; + unsigned w = 0; + unsigned h = 0; + OCIO::GpuShaderDesc::TextureType t = OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL; + OCIO::GpuShaderDesc::TextureDimensions d = OCIO::GpuShaderDesc::TEXTURE_2D; + OCIO::Interpolation i = OCIO::INTERP_UNKNOWN; + + const unsigned index = 0; + OCIO_CHECK_NO_THROW(shaderDesc->getTexture(index, textureName, samplerName, w, h, t, d, i)); + + OCIO_CHECK_EQUAL(std::string(textureName), "ocio_lut1d_0"); + OCIO_CHECK_EQUAL(std::string(samplerName), "ocio_lut1d_0Sampler"); + OCIO_CHECK_EQUAL(w, 65); + OCIO_CHECK_EQUAL(h, 1); + OCIO_CHECK_EQUAL(OCIO::GpuShaderDesc::TEXTURE_RED_CHANNEL, t); + OCIO_CHECK_EQUAL(OCIO::GpuShaderDesc::TEXTURE_1D, d); + OCIO_CHECK_EQUAL(OCIO::INTERP_LINEAR, i); + + OCIO_CHECK_EQUAL(shaderDesc->getTextureShaderBindingIndex(index), 10U); + } + { + const char * textureName = nullptr; + const char * samplerName = nullptr; + unsigned w = 0; + unsigned h = 0; + OCIO::GpuShaderDesc::TextureType t = OCIO::GpuShaderDesc::TEXTURE_RGB_CHANNEL; + OCIO::GpuShaderDesc::TextureDimensions d = OCIO::GpuShaderDesc::TEXTURE_1D; + OCIO::Interpolation i = OCIO::INTERP_UNKNOWN; + + const unsigned index = 1; + OCIO_CHECK_NO_THROW(shaderDesc->getTexture(index, textureName, samplerName, w, h, t, d, i)); + + OCIO_CHECK_EQUAL(std::string(textureName), "ocio_lut1d_2"); + OCIO_CHECK_EQUAL(std::string(samplerName), "ocio_lut1d_2Sampler"); + OCIO_CHECK_EQUAL(w, 4096); + OCIO_CHECK_EQUAL(h, 17); + OCIO_CHECK_EQUAL(OCIO::GpuShaderDesc::TEXTURE_RED_CHANNEL, t); + OCIO_CHECK_EQUAL(OCIO::GpuShaderDesc::TEXTURE_2D, d); + OCIO_CHECK_EQUAL(OCIO::INTERP_LINEAR, i); + + OCIO_CHECK_EQUAL(shaderDesc->getTextureShaderBindingIndex(index), 12U); + } + // Check Lut3D textures. + { + const char * textureName = nullptr; + const char * samplerName = nullptr; + unsigned edgelen = 0; + OCIO::Interpolation i = OCIO::INTERP_UNKNOWN; + + const unsigned index = 0; + OCIO_CHECK_NO_THROW(shaderDesc->get3DTexture(index, textureName, samplerName, edgelen, i)); + + OCIO_CHECK_EQUAL(std::string(textureName), "ocio_lut3d_1"); + OCIO_CHECK_EQUAL(std::string(samplerName), "ocio_lut3d_1Sampler"); + OCIO_CHECK_EQUAL(edgelen, 3); + OCIO_CHECK_EQUAL(OCIO::INTERP_LINEAR, i); + + OCIO_CHECK_EQUAL(shaderDesc->get3DTextureShaderBindingIndex(index), 11U); + } + + const std::string text(shaderDesc->getShaderText()); + + // Note that the binding index increments properly for the three LUTs. + + static constexpr char expected[] = { R"( +// Declaration of all textures + +layout(set=2, binding = 10) uniform sampler1D ocio_lut1d_0Sampler; +layout(set=2, binding = 11) uniform sampler3D ocio_lut3d_1Sampler; +layout(set=2, binding = 12) uniform sampler2D ocio_lut1d_2Sampler; + +// Declaration of all helper methods + +vec2 ocio_lut1d_2_computePos(float f) +{ + float dep; + float abs_f = abs(f); + if (abs_f > 6.10351562e-05) + { + vec3 fComp = vec3(15., 15., 15.); + float absarr = min( abs_f, 65504.); + fComp.x = floor( log2( absarr ) ); + float lower = pow( 2.0, fComp.x ); + fComp.y = ( absarr - lower ) / lower; + vec3 scale = vec3(1024., 1024., 1024.); + dep = dot( fComp, scale ); + } + else + { + dep = abs_f * 16777216.; + } + dep += (f < 0.) ? 32768.0 : 0.0; + vec2 retVal; + retVal.y = floor(dep / 4095.); + retVal.x = dep - retVal.y * 4095.; + retVal.x = (retVal.x + 0.5) / 4096.; + retVal.y = (retVal.y + 0.5) / 17.; + return retVal; +} + +// Declaration of the OCIO shader function + +vec4 OCIOMain(vec4 inPixel) +{ + vec4 outColor = inPixel; + + // Add LUT 1D processing for ocio_lut1d_0 + + { + vec3 ocio_lut1d_0_coords = (outColor.rgb * vec3(64., 64., 64.) + vec3(0.5, 0.5, 0.5) ) / vec3(65., 65., 65.); + outColor.r = texture(ocio_lut1d_0Sampler, ocio_lut1d_0_coords.r).r; + outColor.g = texture(ocio_lut1d_0Sampler, ocio_lut1d_0_coords.g).r; + outColor.b = texture(ocio_lut1d_0Sampler, ocio_lut1d_0_coords.b).r; + } + + // Add LUT 3D processing for ocio_lut3d_1 + + vec3 ocio_lut3d_1_coords = (outColor.zyx * vec3(2., 2., 2.) + vec3(0.5, 0.5, 0.5)) / vec3(3., 3., 3.); + outColor.rgb = texture(ocio_lut3d_1Sampler, ocio_lut3d_1_coords).rgb; + + // Add LUT 1D processing for ocio_lut1d_2 + + { + outColor.r = texture(ocio_lut1d_2Sampler, ocio_lut1d_2_computePos(outColor.r)).r; + outColor.g = texture(ocio_lut1d_2Sampler, ocio_lut1d_2_computePos(outColor.g)).r; + outColor.b = texture(ocio_lut1d_2Sampler, ocio_lut1d_2_computePos(outColor.b)).r; + } + + return outColor; +} +)" }; + + OCIO_CHECK_EQUAL(expected, text); +} diff --git a/tests/cpu/OpOptimizers_tests.cpp b/tests/cpu/OpOptimizers_tests.cpp index bffb1b6ad1..5b2f771a72 100644 --- a/tests/cpu/OpOptimizers_tests.cpp +++ b/tests/cpu/OpOptimizers_tests.cpp @@ -729,7 +729,7 @@ OCIO_ADD_TEST(OpOptimizers, lut1d_identity_replacement_order) OCIO::OpRcPtrVec optOps = fwd_inv_ops.clone(); OCIO_CHECK_NO_THROW(optOps.finalize()); OCIO_CHECK_NO_THROW(optOps.optimize(OCIO::OPTIMIZATION_DEFAULT)); - OCIO_CHECK_EQUAL(optOps.size(), 1); + OCIO_REQUIRE_EQUAL(optOps.size(), 1); OCIO_CHECK_EQUAL(optOps[0]->getInfo(), ""); // Compare renders. @@ -748,7 +748,7 @@ OCIO_ADD_TEST(OpOptimizers, lut1d_identity_replacement_order) OCIO::OpRcPtrVec optOps = inv_fwd_ops.clone(); OCIO_CHECK_NO_THROW(optOps.finalize()); OCIO_CHECK_NO_THROW(optOps.optimize(OCIO::OPTIMIZATION_DEFAULT)); - OCIO_CHECK_EQUAL(optOps.size(), 1); + OCIO_REQUIRE_EQUAL(optOps.size(), 1); OCIO_CHECK_EQUAL(optOps[0]->getInfo(), ""); // Compare renders. @@ -1052,7 +1052,7 @@ OCIO_ADD_TEST(OpOptimizers, gamma_comp) OCIO_CHECK_NO_THROW(optOps_noComp.finalize()); OCIO_CHECK_NO_THROW(optOps_noComp.optimize(AllBut(OCIO::OPTIMIZATION_COMP_GAMMA))); // Identity matrix is removed but gamma are not combined. - OCIO_CHECK_EQUAL(optOps_noComp.size(), 3); + OCIO_REQUIRE_EQUAL(optOps_noComp.size(), 3); OCIO_CHECK_EQUAL(optOps_noComp[0]->getInfo(), ""); OCIO_CHECK_EQUAL(optOps_noComp[1]->getInfo(), ""); OCIO_CHECK_EQUAL(optOps_noComp[2]->getInfo(), ""); @@ -1100,7 +1100,7 @@ OCIO_ADD_TEST(OpOptimizers, gamma_comp_test2) OCIO_CHECK_NO_THROW(optOps_noComp.finalize()); // NB: The op->apply function used here hard-codes OPTIMIZATION_FAST_LOG_EXP_POW to off. OCIO_CHECK_NO_THROW(optOps_noComp.optimize(AllBut(OCIO::OPTIMIZATION_COMP_GAMMA))); - OCIO_CHECK_EQUAL(optOps_noComp.size(), 2); + OCIO_REQUIRE_EQUAL(optOps_noComp.size(), 2); OCIO_CHECK_EQUAL(optOps_noComp[0]->getInfo(), ""); OCIO_CHECK_EQUAL(optOps_noComp[1]->getInfo(), ""); diff --git a/tests/cpu/Processor_tests.cpp b/tests/cpu/Processor_tests.cpp index d2e0087251..3188bb6b4b 100644 --- a/tests/cpu/Processor_tests.cpp +++ b/tests/cpu/Processor_tests.cpp @@ -19,7 +19,7 @@ OCIO_ADD_TEST(Processor, basic_cache) auto processorEmptyGroup = config->getProcessor(group); OCIO_CHECK_EQUAL(processorEmptyGroup->getNumTransforms(), 0); - OCIO_CHECK_EQUAL(std::string(processorEmptyGroup->getCacheID()), ""); + OCIO_CHECK_EQUAL(std::string(processorEmptyGroup->getCacheID()), "99aa06d3-0147-98d8-6001-c324468d497f"); auto mat = OCIO::MatrixTransform::Create(); double matrix[16]{ @@ -34,26 +34,26 @@ OCIO_ADD_TEST(Processor, basic_cache) auto processorMat = config->getProcessor(mat); OCIO_CHECK_EQUAL(processorMat->getNumTransforms(), 1); - OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "1b1880136f7669351adb0dcae0f4f9fd"); + OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "1adb0dca-e0f4-f9fd-1b18-80136f766935"); // Check behaviour of the cacheID offset[0] = 0.0; mat->setOffset(offset); processorMat = config->getProcessor(mat); - OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "675ca29c0f7d28fbdc865818c8cf5c4c"); + OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "dc865818-c8cf-5c4c-675c-a29c0f7d28fb"); matrix[0] = 2.0; mat->setMatrix(matrix); processorMat = config->getProcessor(mat); - OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "1ebac7d1c2d833943e1d1d3c26a7eb18"); + OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "3e1d1d3c-26a7-eb18-1eba-c7d1c2d83394"); offset[0] = 0.1; matrix[0] = 1.0; mat->setOffset(offset); mat->setMatrix(matrix); processorMat = config->getProcessor(mat); - OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "1b1880136f7669351adb0dcae0f4f9fd"); + OCIO_CHECK_EQUAL(std::string(processorMat->getCacheID()), "1adb0dca-e0f4-f9fd-1b18-80136f766935"); } OCIO_ADD_TEST(Processor, basic_cache_lut) @@ -63,7 +63,7 @@ OCIO_ADD_TEST(Processor, basic_cache_lut) auto processorEmptyGroup = config->getProcessor(group); OCIO_CHECK_EQUAL(processorEmptyGroup->getNumTransforms(), 0); - OCIO_CHECK_EQUAL(std::string(processorEmptyGroup->getCacheID()), ""); + OCIO_CHECK_EQUAL(std::string(processorEmptyGroup->getCacheID()), "99aa06d3-0147-98d8-6001-c324468d497f"); auto lut = OCIO::Lut3DTransform::Create(3); // Make sure it's not an identity. @@ -71,19 +71,19 @@ OCIO_ADD_TEST(Processor, basic_cache_lut) auto processorLut = config->getProcessor(lut); OCIO_CHECK_EQUAL(processorLut->getNumTransforms(), 1); - OCIO_CHECK_EQUAL(std::string(processorLut->getCacheID()), "2b26d0097cdcf8f141fe3b3d6e21b5ec"); + OCIO_CHECK_EQUAL(std::string(processorLut->getCacheID()), "41fe3b3d-6e21-b5ec-2b26-d0097cdcf8f1"); // Check behaviour of the cacheID // Change a value and check that the cacheID changes. lut->setValue(2, 2, 2, 1.f, 3.f, 4.f); processorLut = config->getProcessor(lut); - OCIO_CHECK_EQUAL(std::string(processorLut->getCacheID()), "288ec8ea132adaca5b5aed24a296a1a2"); + OCIO_CHECK_EQUAL(std::string(processorLut->getCacheID()), "5b5aed24-a296-a1a2-288e-c8ea132adaca"); // Restore the original value, check that the cache ID matches what it used to be. lut->setValue(2, 2, 2, 2.f, 3.f, 4.f); processorLut = config->getProcessor(lut); - OCIO_CHECK_EQUAL(std::string(processorLut->getCacheID()), "2b26d0097cdcf8f141fe3b3d6e21b5ec"); + OCIO_CHECK_EQUAL(std::string(processorLut->getCacheID()), "41fe3b3d-6e21-b5ec-2b26-d0097cdcf8f1"); } OCIO_ADD_TEST(Processor, unique_dynamic_properties) diff --git a/tests/cpu/apphelpers/MergeConfigsHelpers_tests.cpp b/tests/cpu/apphelpers/MergeConfigsHelpers_tests.cpp index 26dd83acc0..2114a9054a 100644 --- a/tests/cpu/apphelpers/MergeConfigsHelpers_tests.cpp +++ b/tests/cpu/apphelpers/MergeConfigsHelpers_tests.cpp @@ -2318,7 +2318,7 @@ OCIO_ADD_TEST(MergeConfigs, view_transforms_section) constexpr char PREFIX[] { "The Input config contains a value that would override the Base config: " }; - // Test that an error is thrown when the the input values are different. + // Test that an error is thrown when the input values are different. { OCIO::MergeHandlerOptions options = { baseConfig, inputConfig, params, mergedConfig }; checkForLogOrException(LOG_TYPE_ERROR, __LINE__, diff --git a/tests/cpu/builtinconfigs/BuiltinConfig_tests.cpp b/tests/cpu/builtinconfigs/BuiltinConfig_tests.cpp index c58c3edd24..74a6298efa 100644 --- a/tests/cpu/builtinconfigs/BuiltinConfig_tests.cpp +++ b/tests/cpu/builtinconfigs/BuiltinConfig_tests.cpp @@ -446,8 +446,8 @@ OCIO_ADD_TEST(BuiltinConfigs, create_builtin_config) // Test that CreateFromFile does not work without ocio:// prefix for built-in config. OCIO_CHECK_THROW_WHAT( OCIO::Config::CreateFromFile("cg-config-v1.0.0_aces-v1.3_ocio-v2.1"), - OCIO::Exception, - "Error could not read 'cg-config-v1.0.0_aces-v1.3_ocio-v2.1' OCIO profile." + OCIO::ExceptionMissingFile, + "'cg-config-v1.0.0_aces-v1.3_ocio-v2.1' file does not exist." ); { diff --git a/tests/cpu/fileformats/FileFormatCTF_tests.cpp b/tests/cpu/fileformats/FileFormatCTF_tests.cpp index 4dc12578a0..fad4d45ba6 100644 --- a/tests/cpu/fileformats/FileFormatCTF_tests.cpp +++ b/tests/cpu/fileformats/FileFormatCTF_tests.cpp @@ -27,6 +27,27 @@ OCIO::LocalCachedFileRcPtr LoadCLFFile(const std::string & fileName) return OCIO::LoadTestFile( fileName, std::ios_base::in); } + +const OCIO::FormatMetadataImpl::Elements getChildrenMetadata( + const OCIO::CTFReaderTransformPtr transform, + const char* elementName) +{ + return transform->getFormatMetadata().getChildrenElements(elementName); +} + +OCIO::LocalCachedFileRcPtr ParseString(const std::string & str) +{ + std::istringstream ctf; + ctf.str(str); + + // Parse stream. + std::string emptyString; + OCIO::LocalFileFormat tester; + OCIO::CachedFileRcPtr file = tester.read(ctf, emptyString, OCIO::INTERP_DEFAULT); + + return OCIO_DYNAMIC_POINTER_CAST(file); +} + } OCIO_ADD_TEST(FileFormatCTF, missing_file) @@ -49,10 +70,11 @@ OCIO_ADD_TEST(FileFormatCTF, clf_examples) OCIO_CHECK_EQUAL(cachedFile->m_transform->getName(), "transform example lut1d"); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "exlut1"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions().size(), 1); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], + auto descriptions = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_DESCRIPTION); + OCIO_REQUIRE_EQUAL(descriptions.size(), 1); + OCIO_CHECK_EQUAL_STR(descriptions[0].getElementValue(), "1D LUT with legal out of range values"); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); OCIO_CHECK_EQUAL(opList[0]->getType(), OCIO::OpData::Lut1DType); OCIO_CHECK_EQUAL(opList[0]->getName(), "65valueLut"); @@ -75,10 +97,10 @@ OCIO_ADD_TEST(FileFormatCTF, clf_examples) OCIO_CHECK_EQUAL(cachedFile->m_transform->getName(), "transform example lut3d"); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "exlut2"); - OCIO_REQUIRE_EQUAL(cachedFile->m_transform->getDescriptions().size(), 1); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], - " 3D LUT example "); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + auto descriptions = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_DESCRIPTION); + OCIO_REQUIRE_EQUAL(descriptions.size(), 1); + OCIO_CHECK_EQUAL_STR(descriptions[0].getElementValue(), " 3D LUT example "); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); OCIO_CHECK_EQUAL(opList[0]->getName(), "identity"); OCIO_CHECK_EQUAL(opList[0]->getID(), "lut-24"); @@ -100,12 +122,15 @@ OCIO_ADD_TEST(FileFormatCTF, clf_examples) OCIO_CHECK_EQUAL(cachedFile->m_transform->getName(), "transform example matrix"); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "exmat1"); - OCIO_REQUIRE_EQUAL(cachedFile->m_transform->getDescriptions().size(), 2); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], - " Matrix example "); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[1], - " Used by unit tests "); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 2); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(), " Matrix example "); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementValue(), " Used by unit tests "); + + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); OCIO_CHECK_EQUAL(opList[0]->getName(), "colorspace conversion"); OCIO_CHECK_EQUAL(opList[0]->getID(), "mat-25"); @@ -167,10 +192,15 @@ OCIO_ADD_TEST(FileFormatCTF, clf_examples) OCIO_CHECK_EQUAL(cachedFile->m_transform->getName(), "transform example lut IndexMap"); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "exlut3"); - OCIO_REQUIRE_EQUAL(cachedFile->m_transform->getDescriptions().size(), 1); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], - " IndexMap LUT example from spec "); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 1); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), + "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(), + " IndexMap LUT example from spec "); + + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto pR = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pR); @@ -205,13 +235,18 @@ OCIO_ADD_TEST(FileFormatCTF, matrix4x4) cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_ASSERT(OCIO::CTF_PROCESS_LIST_VERSION_1_2 == ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); - OCIO_CHECK_ASSERT(cachedFile->m_transform->getInputDescriptor() == "XYZ"); - OCIO_CHECK_ASSERT(cachedFile->m_transform->getOutputDescriptor() == "RGB"); + auto inDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_INPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(inDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(inDescs[0].getElementValue(), "XYZ"); + + auto outDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_OUTPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(outDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(outDescs[0].getElementValue(), "RGB"); OCIO_CHECK_EQUAL(pMatrix->getFileInputBitDepth(), OCIO::BIT_DEPTH_F32); OCIO_CHECK_EQUAL(pMatrix->getFileOutputBitDepth(), OCIO::BIT_DEPTH_F32); @@ -266,7 +301,7 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_with_offset) cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_EQUAL(OCIO::CTF_PROCESS_LIST_VERSION_1_2, ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); @@ -324,13 +359,18 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_1_3_3x3) cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_ASSERT(OCIO::CTF_PROCESS_LIST_VERSION_1_3 == ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); - OCIO_CHECK_ASSERT(cachedFile->m_transform->getInputDescriptor() == "XYZ"); - OCIO_CHECK_ASSERT(cachedFile->m_transform->getOutputDescriptor() == "RGB"); + auto inDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_INPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(inDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(inDescs[0].getElementValue(), "XYZ"); + + auto outDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_OUTPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(outDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(outDescs[0].getElementValue(), "RGB"); OCIO_CHECK_EQUAL(pMatrix->getFileInputBitDepth(), OCIO::BIT_DEPTH_UINT10); OCIO_CHECK_EQUAL(pMatrix->getFileOutputBitDepth(), OCIO::BIT_DEPTH_UINT10); @@ -382,7 +422,7 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_1_3_4x4) cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_ASSERT(OCIO::CTF_PROCESS_LIST_VERSION_1_3 == ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); @@ -434,7 +474,7 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_1_3_offsets) cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_ASSERT(OCIO::CTF_PROCESS_LIST_VERSION_1_3 == ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); @@ -485,7 +525,7 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_1_3_alpha_offsets) cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_ASSERT(OCIO::CTF_PROCESS_LIST_VERSION_1_3 == ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); @@ -534,7 +574,8 @@ void CheckIdentity(std::istringstream & ctfStream, unsigned line) OCIO::CachedFileRcPtr file; OCIO_CHECK_NO_THROW_FROM(file = tester.read(ctfStream, emptyString, OCIO::INTERP_DEFAULT), line); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); - const auto & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL_FROM(fileOps.size(), 1, line); const auto op = fileOps[0]; @@ -639,12 +680,25 @@ OCIO_ADD_TEST(FileFormatCTF, lut_1d) OCIO_CHECK_EQUAL(cachedFile->m_transform->getName(), "1d-lut example"); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "9843a859-e41e-40a8-a51c-840889c3774e"); - OCIO_REQUIRE_EQUAL(cachedFile->m_transform->getDescriptions().size(), 1); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], - "Apply a 1/2.2 gamma."); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getInputDescriptor(), "RGB"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getOutputDescriptor(), "RGB"); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 3); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(),"Apply a 1/2.2 gamma."); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementName(), "InputDescriptor"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementValue(),"RGB"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(2).getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(2).getElementValue(),"RGB"); + + auto inDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_INPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(inDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(inDescs[0].getElementValue(), "RGB"); + + auto outDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_OUTPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(outDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(outDescs[0].getElementValue(), "RGB"); + + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut = std::dynamic_pointer_cast(opList[0]); @@ -695,7 +749,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut_1d) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pLut); @@ -717,7 +771,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut_3by1d_with_nan_infinity) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut1d = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pLut1d); @@ -769,7 +823,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut1d_half_domain_raw_half_set) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut1d = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pLut1d); @@ -806,7 +860,7 @@ OCIO_ADD_TEST(FileFormatCTF, 3by1d_lut) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 3); auto pMatrix = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pMatrix); @@ -875,7 +929,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut1d_long_lut) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pLut); @@ -895,7 +949,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut1d_inv) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto pMatrix = std::dynamic_pointer_cast(opList[0]); @@ -966,7 +1020,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut1d_inv_scaling) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut = std::dynamic_pointer_cast(opList[0]); @@ -991,22 +1045,6 @@ OCIO_ADD_TEST(FileFormatCTF, lut1d_inv_scaling) OCIO_CHECK_CLOSE(a2.getValues()[31743 * 3], 0.84031434f, error); } -namespace -{ -OCIO::LocalCachedFileRcPtr ParseString(const std::string & str) -{ - std::istringstream ctf; - ctf.str(str); - - // Parse stream. - std::string emptyString; - OCIO::LocalFileFormat tester; - OCIO::CachedFileRcPtr file = tester.read(ctf, emptyString, OCIO::INTERP_DEFAULT); - - return OCIO_DYNAMIC_POINTER_CAST(file); -} -} - OCIO_ADD_TEST(FileFormatCTF, invlut1d_clf) { const std::string clf{ R"( @@ -1045,7 +1083,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut3d) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut = std::dynamic_pointer_cast(opList[0]); @@ -1086,7 +1124,7 @@ OCIO_ADD_TEST(FileFormatCTF, lut3d_inv) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pLut = std::dynamic_pointer_cast(opList[0]); @@ -1134,7 +1172,8 @@ OCIO_ADD_TEST(FileFormatCTF, tabluation_support) // series of numbers. const std::string ctfFile("clf/tabulation_support.clf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "e0a0ae4b-adc2-4c25-ad70-fa6f31ba219d"); OCIO_REQUIRE_EQUAL(opList.size(), 1); @@ -1179,7 +1218,8 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_windows_eol) // with the ?xml header. const std::string ctfFile("clf/matrix_windows.clf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "42"); OCIO_REQUIRE_EQUAL(opList.size(), 1); OCIO_CHECK_EQUAL(opList[0]->getType(), OCIO::OpData::MatrixType); @@ -1192,7 +1232,8 @@ OCIO_ADD_TEST(FileFormatCTF, matrix_no_newlines) OCIO::LocalCachedFileRcPtr cachedFile; const std::string ctfFile("clf/matrix_no_newlines.clf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); OCIO_CHECK_EQUAL(opList[0]->getType(), OCIO::OpData::MatrixType); auto pMatrix = std::dynamic_pointer_cast(opList[0]); @@ -1229,7 +1270,7 @@ OCIO_ADD_TEST(FileFormatCTF, check_utf8) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); StringUtils::StringVec descList; GetElementsValues(opList[0]->getFormatMetadata().getChildrenElements(), @@ -1245,6 +1286,87 @@ OCIO_ADD_TEST(FileFormatCTF, check_utf8) } +OCIO_ADD_TEST(FileFormatCTF, smpte_id_element) +{ + const std::string ctfFile("clf/bit_depth_identity.clf"); + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + OCIO_REQUIRE_ASSERT((bool)cachedFile); + OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "urn:uuid:9d768121-0cf9-40a3-a8e3-7b49f79858a7"); + + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 3); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), + "Id"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(), + "urn:uuid:9d768121-0cf9-40a3-a8e3-7b49f79858a7"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementName(), + "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementValue(), + "Identity transform illustrating Array bit depth scaling"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(2).getElementName(), + "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(2).getElementValue(), + "Can be loaded by either SMPTE or CLF v3 parsers"); + + // Check the ops. + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); + OCIO_REQUIRE_EQUAL(opList.size(), 3); + + auto mat1 = OCIO::DynamicPtrCast(opList[0]); + OCIO_REQUIRE_ASSERT(mat1); + OCIO_CHECK_EQUAL(mat1->getFileInputBitDepth(), OCIO::BIT_DEPTH_UINT8); + OCIO_CHECK_EQUAL(mat1->getFileOutputBitDepth(), OCIO::BIT_DEPTH_UINT16); + + auto lut = OCIO::DynamicPtrCast(opList[1]); + OCIO_REQUIRE_ASSERT(lut); + OCIO_CHECK_EQUAL(lut->getFileOutputBitDepth(), OCIO::BIT_DEPTH_UINT16); + + auto mat2 = OCIO::DynamicPtrCast(opList[2]); + OCIO_REQUIRE_ASSERT(mat2); + OCIO_CHECK_EQUAL(mat2->getFileInputBitDepth(), OCIO::BIT_DEPTH_UINT16); + OCIO_CHECK_EQUAL(mat2->getFileOutputBitDepth(), OCIO::BIT_DEPTH_UINT16); + + // Check identity. + // Using float bit-depths returns a Range clamping at [0,1], due to the + // LUT1D. Thus setting arbitrary integer in and out depths to avoid the + // Range and allow isIdentity to be true. + OCIO::ConstProcessorRcPtr processor; + OCIO_CHECK_NO_THROW(processor = OCIO::GetFileTransformProcessor(ctfFile)); + OCIO_REQUIRE_ASSERT(processor); + auto procOpt = processor->getOptimizedCPUProcessor( + OCIO::BIT_DEPTH_UINT10, + OCIO::BIT_DEPTH_UINT12, + OCIO::OPTIMIZATION_DEFAULT); + OCIO_CHECK_ASSERT(procOpt->isIdentity()); + + // Check the Id element + auto& meta = processor->getFormatMetadata(); + OCIO_REQUIRE_ASSERT(meta.getNumChildrenElements() == 3); + auto& idElement = meta.getChildElement(0); + OCIO_CHECK_EQUAL_STR(idElement.getElementName(), "Id"); + OCIO_CHECK_EQUAL_STR(idElement.getElementValue(), "urn:uuid:9d768121-0cf9-40a3-a8e3-7b49f79858a7"); +} + +OCIO_ADD_TEST(FileFormatCTF, smpte_id_bad_value) +{ + const std::string ctfFile("clf/smpte_only/illegal/id_bad_value.clf"); + + // Add a log guard to catch warnings. + OCIO::LogGuard guard; + OCIO::SetLoggingLevel(OCIO::LOGGING_LEVEL_WARNING); + + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + OCIO_REQUIRE_ASSERT((bool)cachedFile); + + // Check the expected warning. + static constexpr char Warning[1024] = + "id_bad_value.clf(3): '3bae2da8' is not a SMPTE ST 2136-1 compliant Id value."; + OCIO_CHECK_NE(std::string::npos, + StringUtils::Find( StringUtils::RightTrim(guard.output()), Warning )); +} + OCIO_ADD_TEST(FileFormatCTF, info_example) { OCIO::LocalCachedFileRcPtr cachedFile; @@ -1252,18 +1374,19 @@ OCIO_ADD_TEST(FileFormatCTF, info_example) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions().size(), 2); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], - "Example of using the Info element"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[1], - "A second description"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getInputDescriptor(), - "input desc"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getOutputDescriptor(), - "output desc"); + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 4); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(), "Example of using the Info element"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementValue(), "A second description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(2).getElementName(), "InputDescriptor"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(2).getElementValue(), "input desc"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(3).getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(3).getElementValue(), "output desc"); // Ensure ops were not affected by metadata parsing. - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pMatrix = @@ -1278,45 +1401,45 @@ OCIO_ADD_TEST(FileFormatCTF, info_example) // Check element values. // - OCIO_CHECK_EQUAL(std::string(info.getElementName()), OCIO::METADATA_INFO); + OCIO_CHECK_EQUAL_STR(info.getElementName(), OCIO::METADATA_INFO); auto items = info.getChildrenElements(); OCIO_REQUIRE_EQUAL(items.size(), 6); - OCIO_CHECK_EQUAL(std::string(items[0].getElementName()), "Copyright"); - OCIO_CHECK_EQUAL(std::string(items[0].getElementValue()), + OCIO_CHECK_EQUAL_STR(items[0].getElementName(), "Copyright"); + OCIO_CHECK_EQUAL_STR(items[0].getElementValue(), "Copyright Contributors to the OpenColorIO Project."); - OCIO_CHECK_EQUAL(std::string(items[1].getElementName()), "AppRelease"); - OCIO_CHECK_EQUAL(std::string(items[1].getElementValue()), "2020.0.63"); - OCIO_CHECK_EQUAL(std::string(items[2].getElementName()), "Revision"); - OCIO_CHECK_EQUAL(std::string(items[2].getElementValue()), "1"); + OCIO_CHECK_EQUAL_STR(items[1].getElementName(), "AppRelease"); + OCIO_CHECK_EQUAL_STR(items[1].getElementValue(), "2020.0.63"); + OCIO_CHECK_EQUAL_STR(items[2].getElementName(), "Revision"); + OCIO_CHECK_EQUAL_STR(items[2].getElementValue(), "1"); - OCIO_CHECK_EQUAL(std::string(items[3].getElementName()), "Category"); - OCIO_CHECK_EQUAL(std::string(items[3].getElementValue()), ""); + OCIO_CHECK_EQUAL_STR(items[3].getElementName(), "Category"); + OCIO_CHECK_EQUAL_STR(items[3].getElementValue(), ""); auto catItems = items[3].getChildrenElements(); OCIO_REQUIRE_EQUAL(catItems.size(), 1); - OCIO_CHECK_EQUAL(std::string(catItems[0].getElementName()), "Tags"); + OCIO_CHECK_EQUAL_STR(catItems[0].getElementName(), "Tags"); auto tagsItems = catItems[0].getChildrenElements(); OCIO_REQUIRE_EQUAL(tagsItems.size(), 2); - OCIO_CHECK_EQUAL(std::string(tagsItems[0].getElementName()), "SceneLinearWorkingSpace"); - OCIO_CHECK_EQUAL(std::string(tagsItems[0].getElementValue()), ""); - OCIO_CHECK_EQUAL(std::string(tagsItems[1].getElementName()), "Input"); - OCIO_CHECK_EQUAL(std::string(tagsItems[1].getElementValue()), ""); + OCIO_CHECK_EQUAL_STR(tagsItems[0].getElementName(), "SceneLinearWorkingSpace"); + OCIO_CHECK_EQUAL_STR(tagsItems[0].getElementValue(), ""); + OCIO_CHECK_EQUAL_STR(tagsItems[1].getElementName(), "Input"); + OCIO_CHECK_EQUAL_STR(tagsItems[1].getElementValue(), ""); - OCIO_CHECK_EQUAL(std::string(items[4].getElementName()), "InputColorSpace"); - OCIO_CHECK_EQUAL(std::string(items[4].getElementValue()), ""); + OCIO_CHECK_EQUAL_STR(items[4].getElementName(), "InputColorSpace"); + OCIO_CHECK_EQUAL_STR(items[4].getElementValue(), ""); auto icItems = items[4].getChildrenElements(); OCIO_REQUIRE_EQUAL(icItems.size(), 4); - OCIO_CHECK_EQUAL(std::string(icItems[0].getElementName()), OCIO::METADATA_DESCRIPTION); - OCIO_CHECK_EQUAL(std::string(icItems[0].getElementValue()), "Input color space description"); - OCIO_CHECK_EQUAL(std::string(icItems[1].getElementName()), "ImageState"); - OCIO_CHECK_EQUAL(std::string(icItems[1].getElementValue()), "video"); - OCIO_CHECK_EQUAL(std::string(icItems[2].getElementName()), "ShortName"); - OCIO_CHECK_EQUAL(std::string(icItems[2].getElementValue()), "no_version"); - OCIO_CHECK_EQUAL(std::string(icItems[3].getElementName()), "ID"); - OCIO_CHECK_EQUAL(std::string(icItems[3].getElementValue()), + OCIO_CHECK_EQUAL_STR(icItems[0].getElementName(), OCIO::METADATA_DESCRIPTION); + OCIO_CHECK_EQUAL_STR(icItems[0].getElementValue(), "Input color space description"); + OCIO_CHECK_EQUAL_STR(icItems[1].getElementName(), "ImageState"); + OCIO_CHECK_EQUAL_STR(icItems[1].getElementValue(), "video"); + OCIO_CHECK_EQUAL_STR(icItems[2].getElementName(), "ShortName"); + OCIO_CHECK_EQUAL_STR(icItems[2].getElementValue(), "no_version"); + OCIO_CHECK_EQUAL_STR(icItems[3].getElementName(), "ID"); + OCIO_CHECK_EQUAL_STR(icItems[3].getElementValue(), "387b23d1-f1ce-3f69-8544-e5601f45f78b"); - OCIO_CHECK_EQUAL(std::string(items[5].getElementName()), "OutputColorSpace"); - OCIO_CHECK_EQUAL(std::string(items[5].getElementValue()), ""); + OCIO_CHECK_EQUAL_STR(items[5].getElementName(), "OutputColorSpace"); + OCIO_CHECK_EQUAL_STR(items[5].getElementValue(), ""); auto ocItems = items[5].getChildrenElements(); OCIO_REQUIRE_EQUAL(ocItems.size(), 3); auto attribs = items[5].getAttributes(); @@ -1325,12 +1448,200 @@ OCIO_ADD_TEST(FileFormatCTF, info_example) OCIO_CHECK_EQUAL(attribs[0].second, "test1"); OCIO_CHECK_EQUAL(attribs[1].first, "att2"); OCIO_CHECK_EQUAL(attribs[1].second, "test2"); - OCIO_CHECK_EQUAL(std::string(ocItems[0].getElementName()), "ImageState"); - OCIO_CHECK_EQUAL(std::string(ocItems[0].getElementValue()), "scene"); - OCIO_CHECK_EQUAL(std::string(ocItems[1].getElementName()), "ShortName"); - OCIO_CHECK_EQUAL(std::string(ocItems[1].getElementValue()), "ACES"); - OCIO_CHECK_EQUAL(std::string(ocItems[2].getElementName()), "ID"); - OCIO_CHECK_EQUAL(std::string(ocItems[2].getElementValue()), "1"); + OCIO_CHECK_EQUAL_STR(ocItems[0].getElementName(), "ImageState"); + OCIO_CHECK_EQUAL_STR(ocItems[0].getElementValue(), "scene"); + OCIO_CHECK_EQUAL_STR(ocItems[1].getElementName(), "ShortName"); + OCIO_CHECK_EQUAL_STR(ocItems[1].getElementValue(), "ACES"); + OCIO_CHECK_EQUAL_STR(ocItems[2].getElementName(), "ID"); + OCIO_CHECK_EQUAL_STR(ocItems[2].getElementValue(), "1"); +} + +OCIO_ADD_TEST(FileFormatCTF, smpte_all_metadata) +{ + // Function to check children elements and their attributes. + auto checkCommonMetadata = [](const OCIO::FormatMetadataImpl& md) + { + auto & items = md.getChildrenElements(); + OCIO_REQUIRE_EQUAL(items.size(), 9); + OCIO_CHECK_EQUAL_STR(items[0].getElementName(), "Id"); + OCIO_CHECK_EQUAL_STR(items[0].getElementValue(), "urn:uuid:a8f91bfa-b79f-5d4d-b750-a411c476bb47"); + + OCIO_CHECK_EQUAL_STR(items[1].getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(items[1].getElementValue(), "Demo Advanced LUT with dummy values"); + OCIO_CHECK_EQUAL_STR(items[1].getAttributeValue("language"), "en"); + + OCIO_CHECK_EQUAL_STR(items[2].getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(items[2].getElementValue(), "Démonstration d'une LUT avancée avec des valeurs factices"); + OCIO_CHECK_EQUAL_STR(items[2].getAttributeValue("language"), "fr"); + + OCIO_CHECK_EQUAL_STR(items[3].getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(items[3].getElementValue(), "Demo Erweiterte LUT mit Dummy-Werten"); + OCIO_CHECK_EQUAL_STR(items[3].getAttributeValue("language"), "de"); + + OCIO_CHECK_EQUAL_STR(items[4].getElementName(), "InputDescriptor"); + OCIO_CHECK_EQUAL_STR(items[4].getElementValue(), "ITU-R BT.709"); + OCIO_CHECK_EQUAL_STR(items[4].getAttributeValue("language"), "en-GB"); + + OCIO_CHECK_EQUAL_STR(items[5].getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(items[5].getElementValue(), "Same as Input"); + OCIO_CHECK_EQUAL_STR(items[5].getAttributeValue("language"), "en-US"); + + OCIO_CHECK_EQUAL_STR(items[6].getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(items[6].getElementValue(), "Identique à l'entrée"); + OCIO_CHECK_EQUAL_STR(items[6].getAttributeValue("language"), "fr"); + + OCIO_CHECK_EQUAL_STR(items[7].getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(items[7].getElementValue(), "Gleiches wie Eingabe"); + OCIO_CHECK_EQUAL_STR(items[7].getAttributeValue("language"), "de"); + + OCIO_CHECK_EQUAL_STR(items[8].getElementName(), "Info"); + OCIO_CHECK_EQUAL_STR(items[8].getElementValue(), ""); + + // Info block (name spaces are retained) + auto & info = items[8].getChildrenElements(); + OCIO_REQUIRE_EQUAL(info.size(), 9); + OCIO_CHECK_EQUAL_STR(info[0].getElementName(), "Profile"); + OCIO_CHECK_EQUAL_STR(info[0].getElementValue(), "http://www.smpte-ra.org/ns/2136-10/2026#Live_Broadcast_LUT33"); + + OCIO_CHECK_EQUAL_STR(info[1].getElementName(), "AppRelease"); + OCIO_CHECK_EQUAL_STR(info[1].getElementValue(), "SMPTE_2136-10_Example"); + + OCIO_CHECK_EQUAL_STR(info[2].getElementName(), "Copyright"); + OCIO_CHECK_EQUAL_STR(info[2].getElementValue(), "OCIO contributors"); + + OCIO_CHECK_EQUAL_STR(info[3].getElementName(), "Revision"); + OCIO_CHECK_EQUAL_STR(info[3].getElementValue(), "1.0"); + + OCIO_CHECK_EQUAL_STR(info[4].getElementName(), "clfbp:InputCharacteristics"); + OCIO_CHECK_EQUAL_STR(info[4].getElementValue(), ""); + + OCIO_CHECK_EQUAL_STR(info[5].getElementName(), "clfbp:OutputCharacteristics"); + OCIO_CHECK_EQUAL_STR(info[5].getElementValue(), ""); + + OCIO_CHECK_EQUAL_STR(info[6].getElementName(), "clfbp:OutputVideoSignalClipping"); + OCIO_CHECK_EQUAL_STR(info[6].getElementValue(), "sdiClip"); + + OCIO_CHECK_EQUAL_STR(info[7].getElementName(), "Keywords"); + OCIO_CHECK_EQUAL_STR(info[7].getElementValue(), "Test, Display-light"); + + OCIO_CHECK_EQUAL_STR(info[8].getElementName(), "clfbp:ContactEmail"); + OCIO_CHECK_EQUAL_STR(info[8].getElementValue(), "fake-email@ocio.org"); + + // Info / InputCharacteristics + auto & input = info[4].getChildrenElements(); + OCIO_REQUIRE_EQUAL(input.size(), 3); + OCIO_CHECK_EQUAL_STR(input[0].getElementName(), "clfbp:ColorPrimaries"); + OCIO_CHECK_EQUAL_STR(input[0].getElementValue(), "ColorPrimaries_ITU709"); + + OCIO_CHECK_EQUAL_STR(input[1].getElementName(), "clfbp:TransferCharacteristic"); + OCIO_CHECK_EQUAL_STR(input[1].getElementValue(), "TransferCharacteristic_ITU709"); + + OCIO_CHECK_EQUAL_STR(input[2].getElementName(), "clfbp:CodingEquations"); + OCIO_CHECK_EQUAL_STR(input[2].getElementValue(), "CodingEquations_ITU709"); + + // Info / OutputCharacteristics + auto & output = info[5].getChildrenElements(); + OCIO_REQUIRE_EQUAL(output.size(), 3); + OCIO_CHECK_EQUAL_STR(output[0].getElementName(), "clfbp:ColorPrimaries"); + OCIO_CHECK_EQUAL_STR(output[0].getElementValue(), "ColorPrimaries_ITU2020"); + + OCIO_CHECK_EQUAL_STR(output[1].getElementName(), "clfbp:TransferCharacteristic"); + OCIO_CHECK_EQUAL_STR(output[1].getElementValue(), "TransferCharacteristic_SMPTEST2084"); + + OCIO_CHECK_EQUAL_STR(output[2].getElementName(), "clfbp:CodingEquations"); + OCIO_CHECK_EQUAL_STR(output[2].getElementValue(), "CodingEquations_ITU2100_ICtCp"); + }; + + // Read the file and check the metadata content. + const std::string ctfFile("clf/smpte_only/broadcast_profile_lut33.clf"); + OCIO::ConstProcessorRcPtr processor; + OCIO_CHECK_NO_THROW(processor = OCIO::GetFileTransformProcessor(ctfFile)); + OCIO_REQUIRE_ASSERT(processor); + + // Check the metadata + { + const auto& md1 = dynamic_cast( + processor->getFormatMetadata()); + + // Root attributes. + OCIO_REQUIRE_EQUAL(md1.getNumAttributes(), 2); + + OCIO_CHECK_EQUAL_STR(md1.getAttributeName(0), "name"); + OCIO_CHECK_EQUAL_STR(md1.getAttributeValue(0),"SMPTE Example Live Broadcast LUT33 Profile"); + + OCIO_CHECK_EQUAL_STR(md1.getAttributeName(1), "xmlns:clfbp"); + OCIO_CHECK_EQUAL_STR(md1.getAttributeValue(1),"http://www.smpte-ra.org/ns/2136-10/2026"); + + // Child nodes. + checkCommonMetadata(md1); + } + + // Write, read back and check if metadata survives the roundtrip. + { + std::ostringstream oss; + const auto group = processor->createGroupTransform(); + OCIO::ConstConfigRcPtr config = OCIO::Config::CreateRaw(); + OCIO_CHECK_NO_THROW(group->write(config, "Academy/ASC Common LUT Format", oss)); + auto str = oss.str(); + + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_NO_THROW(cachedFile = ParseString(str)); + + // Get the combined metadata from the the transform. + OCIO::FormatMetadataImpl md2; + cachedFile->m_transform->toMetadata(md2); + + // Root Attributes (will be different as id is added) + OCIO_REQUIRE_EQUAL(md2.getNumAttributes(), 3); + + OCIO_CHECK_EQUAL_STR(md2.getAttributeName(0), "id"); + OCIO_CHECK_EQUAL_STR(md2.getAttributeValue(0), "urn:uuid:9656a363-bf0a-c5f9-debe-8a083b88107f"); + + OCIO_CHECK_EQUAL_STR(md2.getAttributeName(1), "name"); + OCIO_CHECK_EQUAL_STR(md2.getAttributeValue(1), "SMPTE Example Live Broadcast LUT33 Profile"); + + OCIO_CHECK_EQUAL_STR(md2.getAttributeName(2), "xmlns:clfbp"); + OCIO_CHECK_EQUAL_STR(md2.getAttributeValue(2), "http://www.smpte-ra.org/ns/2136-10/2026"); + + // Child nodes should be identical. + checkCommonMetadata(md2); + } +} + +OCIO_ADD_TEST(FileFormatCTF, smpte_namespaces) +{ + const std::string ctfFile("clf/smpte_only/namespaces.clf"); + + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + + // Check the op. + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); + OCIO_REQUIRE_EQUAL(opList.size(), 1); + + auto lut1d = OCIO::DynamicPtrCast(opList[0]); + OCIO_CHECK_ASSERT(lut1d); + + // Check the meta data. + OCIO::ConstProcessorRcPtr processor; + OCIO_CHECK_NO_THROW(processor = OCIO::GetFileTransformProcessor(ctfFile)); + OCIO_REQUIRE_ASSERT(processor); + const auto& md = processor->getFormatMetadata(); + + // Attributes. + OCIO_REQUIRE_EQUAL(md.getNumAttributes(), 3); + OCIO_CHECK_EQUAL_STR(md.getAttributeName(0), "id"); + OCIO_CHECK_EQUAL_STR(md.getAttributeValue(0),"pl1"); + OCIO_CHECK_EQUAL_STR(md.getAttributeName(1), "xmlns:clf"); + OCIO_CHECK_EQUAL_STR(md.getAttributeValue(1),"http://www.smpte-ra.org/ns/2136-1/2024"); + OCIO_CHECK_EQUAL_STR(md.getAttributeName(2), "xmlns:ds"); + OCIO_CHECK_EQUAL_STR(md.getAttributeValue(2),"http://www.w3.org/2000/09/xmldsig#"); + + // Name-spaced description will be available without the namespace prefix. + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 1); + const auto& desc = md.getChildElement(0); + OCIO_CHECK_EQUAL_STR(desc.getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(desc.getElementValue(),"Example CLF file using namespaces."); } OCIO_ADD_TEST(FileFormatCTF, difficult_syntax) @@ -1341,30 +1652,45 @@ OCIO_ADD_TEST(FileFormatCTF, difficult_syntax) OCIO::LocalCachedFileRcPtr cachedFile; const std::string ctfFile("clf/difficult_syntax.clf"); + // Add a log guard to catch warnings. + OCIO::LogGuard guard; + OCIO::SetLoggingLevel(OCIO::LOGGING_LEVEL_WARNING); + OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); + // Check the expected warning. + static constexpr char Warning[1024] = + "difficult_syntax.clf(41): Unrecognized attribute 'unknown' of 'LUT1D'."; + OCIO_CHECK_NE(std::string::npos, + StringUtils::Find( StringUtils::RightTrim(guard.output()), Warning )); + const OCIO::CTFVersion clfVersion = cachedFile->m_transform->getCLFVersion(); - const OCIO::CTFVersion ver(3, 0, 0); + const OCIO::CTFVersion ver("http://www.smpte-ra.org/ns/2136-1/2024", OCIO::CTFVersion::VERSION_SMPTE_XMLNS); OCIO_CHECK_EQUAL(clfVersion, ver); OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "id1"); - OCIO_REQUIRE_EQUAL(cachedFile->m_transform->getDescriptions().size(), 2); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], - "This is the ProcessList description."); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[1], - "yet 'another' \"valid\" desc"); + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 2); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), + "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(), + "This is the ProcessList description."); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementName(), + "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(1).getElementValue(), + "yet 'another' \"valid\" desc"); const OCIO::FormatMetadataImpl & info = cachedFile->m_transform->getInfoMetadata(); - OCIO_CHECK_EQUAL(std::string(info.getElementName()), OCIO::METADATA_INFO); + OCIO_CHECK_EQUAL_STR(info.getElementName(), OCIO::METADATA_INFO); auto items = info.getChildrenElements(); OCIO_REQUIRE_EQUAL(items.size(), 1); - OCIO_CHECK_EQUAL(std::string(items[0].getElementName()), "Stuff"); - OCIO_CHECK_EQUAL(std::string(items[0].getElementValue()), + OCIO_CHECK_EQUAL_STR(items[0].getElementName(), "Stuff"); + OCIO_CHECK_EQUAL_STR(items[0].getElementValue(), "This is a \"difficult\" but 'legal' color transform file."); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); { auto pMatrix = std::dynamic_pointer_cast(opList[0]); @@ -1480,7 +1806,7 @@ OCIO_ADD_TEST(FileFormatCTF, difficult_xml_unknown_elements) const OCIO::CTFVersion ctfVersion = cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_ASSERT(OCIO::CTF_PROCESS_LIST_VERSION_1_2 == ctfVersion); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto pMatrix = std::dynamic_pointer_cast(opList[0]); @@ -1564,7 +1890,7 @@ OCIO_ADD_TEST(FileFormatCTF, unknown_elements) } } - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 4); auto pMatrix = std::dynamic_pointer_cast(opList[0]); @@ -1673,7 +1999,7 @@ OCIO_ADD_TEST(FileFormatCTF, process_list_invalid_version) OCIO_ADD_TEST(FileFormatCTF, clf_process_list_bad_version) { - std::string fileName("clf/illegal/process_list_bad_version.clf"); + std::string fileName("clf/pre-smpte_only/illegal/process_list_bad_version.clf"); OCIO_CHECK_THROW_WHAT(LoadCLFFile(fileName), OCIO::Exception, "is not a valid version"); @@ -1684,12 +2010,29 @@ OCIO_ADD_TEST(FileFormatCTF, process_list_valid_version) OCIO::LocalCachedFileRcPtr cachedFile; const std::string ctfFile("process_list_valid_version.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + OCIO_REQUIRE_ASSERT(cachedFile); const OCIO::CTFVersion ctfVersion = cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_EQUAL(ctfVersion, OCIO::CTF_PROCESS_LIST_VERSION_1_4); } +OCIO_ADD_TEST(FileFormatCTF, non_smpte_xmlns) +{ + const std::string ctfFile("clf/pre-smpte_only/process_list_v3_namespace.clf"); + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + + // Check the op. + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); + OCIO_REQUIRE_EQUAL(opList.size(), 1); + + auto mat = OCIO::DynamicPtrCast(opList[0]); + OCIO_REQUIRE_ASSERT(mat); + OCIO_CHECK_EQUAL(mat->getFileInputBitDepth(), OCIO::BIT_DEPTH_F32); + OCIO_CHECK_EQUAL(mat->getFileOutputBitDepth(), OCIO::BIT_DEPTH_F32); +} + OCIO_ADD_TEST(FileFormatCTF, process_list_higher_version) { const std::string ctfFile("process_list_higher_version.ctf"); @@ -1700,7 +2043,7 @@ OCIO_ADD_TEST(FileFormatCTF, process_list_higher_version) OCIO_ADD_TEST(FileFormatCTF, clf_process_list_higher_version) { - const std::string ctfFile("clf/illegal/process_list_higher_version.clf"); + const std::string ctfFile("clf/pre-smpte_only/illegal/process_list_higher_version.clf"); OCIO_CHECK_THROW_WHAT(LoadCLFFile(ctfFile), OCIO::Exception, "Unsupported transform file version"); @@ -1711,6 +2054,7 @@ OCIO_ADD_TEST(FileFormatCTF, process_list_version_revision) OCIO::LocalCachedFileRcPtr cachedFile; const std::string ctfFile("process_list_version_revision.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + OCIO_REQUIRE_ASSERT(cachedFile); const OCIO::CTFVersion ctfVersion = cachedFile->m_transform->getCTFVersion(); @@ -1725,12 +2069,34 @@ OCIO_ADD_TEST(FileFormatCTF, process_list_no_version) OCIO::LocalCachedFileRcPtr cachedFile; const std::string ctfFile("process_list_no_version.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); + OCIO_REQUIRE_ASSERT(cachedFile); const OCIO::CTFVersion ctfVersion = cachedFile->m_transform->getCTFVersion(); OCIO_CHECK_EQUAL(ctfVersion, OCIO::CTF_PROCESS_LIST_VERSION_1_2); } +OCIO_ADD_TEST(FileFormatCTF, smpte_conflicting_version) +{ + const std::string ctfFile("process_list_conflicting_versions.ctf"); + + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_THROW_WHAT(cachedFile = LoadCLFFile(ctfFile), + OCIO::Exception, + "SMPTE 'xmlns' version and 'Version' attribute cannot both be present.") +} + +OCIO_ADD_TEST(FileFormatCTF, smpte_higher_ns_version) +{ + const std::string ctfFile("clf/smpte_only/illegal/process_list_higher_ns_version.clf"); + + OCIO::LocalCachedFileRcPtr cachedFile; + OCIO_CHECK_THROW_WHAT(cachedFile = LoadCLFFile(ctfFile), + OCIO::Exception, + "No valid 'version', 'compCLFversion', or 'xmlns' attributes " + "were found; at least one of them is required."); +} + OCIO_ADD_TEST(FileFormatCTF, info_element_version_test) { // VALID - No Version. @@ -1788,7 +2154,7 @@ OCIO_ADD_TEST(FileFormatCTF, transform_element_end_missing) OCIO_ADD_TEST(FileFormatCTF, transform_missing_id) { - const std::string ctfFile("clf/illegal/transform_missing_id.clf"); + const std::string ctfFile("clf/pre-smpte_only/illegal/transform_missing_id.clf"); OCIO_CHECK_THROW_WHAT(LoadCLFFile(ctfFile), OCIO::Exception, "Required attribute 'id'"); @@ -1884,10 +2250,10 @@ OCIO_ADD_TEST(FileFormatCTF, transform_empty) OCIO_ADD_TEST(FileFormatCTF, transform_id_empty) { - const std::string ctfFile("clf/illegal/transform_id_empty.clf"); + const std::string ctfFile("clf/pre-smpte_only/illegal/transform_id_empty.clf"); OCIO_CHECK_THROW_WHAT(LoadCLFFile(ctfFile), OCIO::Exception, - "Required attribute 'id' does not have a value"); + "Attribute 'id' does not have a value"); } OCIO_ADD_TEST(FileFormatCTF, transform_with_bitdepth_mismatch) @@ -1908,8 +2274,11 @@ OCIO_ADD_TEST(FileFormatCTF, inverse_of_id_test) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - OCIO_CHECK_ASSERT(cachedFile->m_transform->getInverseOfId() == - "inverseOfIdTest"); + + auto& meta = cachedFile->m_transform->getFormatMetadata(); + + OCIO_CHECK_EQUAL_STR(meta.getAttributeValue("inverseOf"), + "inverseOfIdTest"); } OCIO_ADD_TEST(FileFormatCTF, range_default) @@ -1920,7 +2289,7 @@ OCIO_ADD_TEST(FileFormatCTF, range_default) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pR = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pR); @@ -1945,7 +2314,7 @@ OCIO_ADD_TEST(FileFormatCTF, range_test1_clamp) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pR = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pR); @@ -1970,7 +2339,7 @@ OCIO_ADD_TEST(FileFormatCTF, range_test1_noclamp) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); // Check that the noClamp style Range became a Matrix. @@ -2018,7 +2387,7 @@ OCIO_ADD_TEST(FileFormatCTF, range_test2) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pR = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pR); @@ -2074,7 +2443,7 @@ OCIO_ADD_TEST(FileFormatCTF, indexMap_test1_clfv2) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto pR = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pR); @@ -2101,7 +2470,7 @@ OCIO_ADD_TEST(FileFormatCTF, indexMap_test2_clfv2) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto pR = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pR); @@ -2159,10 +2528,12 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_test1) OCIO_CHECK_EQUAL(cachedFile->m_transform->getID(), "id"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions().size(), 1); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getDescriptions()[0], "2.4 gamma"); + auto & md = cachedFile->m_transform->getFormatMetadata(); + OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 1); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(md.getChildElement(0).getElementValue(),"2.4 gamma"); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2191,7 +2562,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_test2) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2222,7 +2593,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_test3) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2252,7 +2623,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_test4) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2299,7 +2670,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_test6) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2321,7 +2692,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_alpha_test1) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2352,7 +2723,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_alpha_test2) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2388,7 +2759,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_alpha_test3) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2420,7 +2791,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_alpha_test4) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2461,7 +2832,7 @@ OCIO_ADD_TEST(FileFormatCTF, gamma_alpha_test5) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pG = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pG); @@ -2517,7 +2888,8 @@ OCIO_ADD_TEST(FileFormatCTF, exponent_all_styles) OCIO::LocalCachedFileRcPtr cachedFile; const std::string fileName("clf/exponent_all_styles.clf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 12); { // Op 0 == basicFwd. @@ -2703,11 +3075,16 @@ OCIO_ADD_TEST(FileFormatCTF, cdl_clamp_fwd) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getInputDescriptor(), - "inputDesc"); - OCIO_CHECK_EQUAL(cachedFile->m_transform->getOutputDescriptor(), - "outputDesc"); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); + + auto inDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_INPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(inDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(inDescs[0].getElementValue(), "inputDesc"); + + auto outDescs = getChildrenMetadata(cachedFile->m_transform, OCIO::METADATA_OUTPUT_DESCRIPTOR); + OCIO_CHECK_EQUAL(outDescs.size(), 1); + OCIO_CHECK_EQUAL_STR(outDescs[0].getElementValue(), "outputDesc"); + OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pCDL = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pCDL); @@ -2742,7 +3119,7 @@ OCIO_ADD_TEST(FileFormatCTF, cdl_missing_style) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pCDL = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pCDL); @@ -2766,7 +3143,7 @@ OCIO_ADD_TEST(FileFormatCTF, cdl_all_styles) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 4); auto pCDL = std::dynamic_pointer_cast(opList[0]); @@ -2842,7 +3219,7 @@ OCIO_ADD_TEST(FileFormatCTF, cdl_missing_sop) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pCDL = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pCDL); @@ -2863,7 +3240,7 @@ OCIO_ADD_TEST(FileFormatCTF, cdl_missing_sat) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto pCDL = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(pCDL); @@ -2886,7 +3263,7 @@ OCIO_ADD_TEST(FileFormatCTF, cdl_various_in_ctf) OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT((bool)cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 8); auto pCDL = std::dynamic_pointer_cast(opList[0]); @@ -2927,7 +3304,8 @@ OCIO_ADD_TEST(FileFormatCTF, log_all_styles) OCIO::LocalCachedFileRcPtr cachedFile; const std::string fileName("clf/log_all_styles.clf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 11); double error = 1e-9; @@ -3098,7 +3476,8 @@ OCIO_ADD_TEST(FileFormatCTF, log_logtolin) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("log_logtolin.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); auto op = fileOps[0]; auto log = std::dynamic_pointer_cast(op); @@ -3125,7 +3504,8 @@ OCIO_ADD_TEST(FileFormatCTF, log_logtolinv2) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("log_logtolinv2.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); auto op = fileOps[0]; auto log = std::dynamic_pointer_cast(op); @@ -3151,7 +3531,8 @@ OCIO_ADD_TEST(FileFormatCTF, log_lintolog_3chan) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("log_lintolog_3chan.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); auto op = fileOps[0]; auto log = std::dynamic_pointer_cast(op); @@ -3194,7 +3575,7 @@ OCIO_ADD_TEST(FileFormatCTF, log_bad_style) OCIO_ADD_TEST(FileFormatCTF, log_bad_version) { - std::string fileName("clf/illegal/log_bad_version.clf"); + std::string fileName("clf/pre-smpte_only/illegal/log_bad_version.clf"); OCIO_CHECK_THROW_WHAT(LoadCLFFile(fileName), OCIO::Exception, "CLF file version '2' does not support operator 'Log'"); } @@ -3227,7 +3608,7 @@ OCIO_ADD_TEST(FileFormatCTF, log_ocio_params_channels) strebuf << "\n"; OCIO::LocalCachedFileRcPtr cachedFile = ParseString(strebuf.str()); - OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); auto op = fileOps[0]; @@ -3280,7 +3661,8 @@ OCIO_ADD_TEST(FileFormatCTF, log_default_params) OCIO::LocalCachedFileRcPtr cachedFile; OCIO_CHECK_NO_THROW(cachedFile = ParseString(strebuf.str())); - OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 2); auto op = fileOps[0]; @@ -3314,7 +3696,8 @@ OCIO_ADD_TEST(FileFormatCTF, multiple_ops) OCIO::LocalCachedFileRcPtr cachedFile; const std::string ctfFile("clf/multiple_ops.clf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 9); { // Op 0 == CDL. @@ -3427,7 +3810,8 @@ OCIO_ADD_TEST(FileFormatCTF, reference_load_alias) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("reference_alias.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; @@ -3446,7 +3830,8 @@ OCIO_ADD_TEST(FileFormatCTF, reference_load_path) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("reference_path_missing_file.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; @@ -3464,7 +3849,8 @@ OCIO_ADD_TEST(FileFormatCTF, reference_load_multiple) // File contains 2 references, 1 range and 1 reference. std::string fileName("references_some_inverted.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 4); OCIO::ConstOpDataRcPtr op0 = fileOps[0]; @@ -3500,7 +3886,8 @@ OCIO_ADD_TEST(FileFormatCTF, reference_load_path_utf8) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("reference_utf8.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstReferenceOpDataRcPtr ref = std::dynamic_pointer_cast(op); @@ -3524,7 +3911,7 @@ OCIO_ADD_TEST(FileFormatCTF, exposure_contrast_video) const std::string ctfFile("exposure_contrast_video.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT(cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); @@ -3557,7 +3944,7 @@ OCIO_ADD_TEST(FileFormatCTF, exposure_contrast_log) const std::string ctfFile("exposure_contrast_log.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT(cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); @@ -3594,7 +3981,7 @@ OCIO_ADD_TEST(FileFormatCTF, exposure_contrast_linear) const std::string ctfFile("exposure_contrast_linear.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT(cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); @@ -3631,7 +4018,7 @@ OCIO_ADD_TEST(FileFormatCTF, exposure_contrast_no_gamma) const std::string ctfFile("exposure_contrast_no_gamma.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(ctfFile)); OCIO_REQUIRE_ASSERT(cachedFile); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); @@ -3703,7 +4090,7 @@ OCIO_ADD_TEST(FileFormatCTF, attribute_float_parse_leading_spaces) OCIO::CachedFileRcPtr file; OCIO_CHECK_NO_THROW(file = tester.read(ctf, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); const auto op = fileOps[0]; @@ -3718,7 +4105,8 @@ OCIO_ADD_TEST(FileFormatCTF, load_deprecated_ops_file) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("deprecated_ops.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 3); @@ -3761,7 +4149,8 @@ OCIO_ADD_TEST(FileFormatCTF, load_fixed_function_file) OCIO::LocalCachedFileRcPtr cachedFile; std::string fileName("fixed_function.ctf"); OCIO_CHECK_NO_THROW(cachedFile = LoadCLFFile(fileName)); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 2); @@ -3829,7 +4218,8 @@ void ValidateFixedFunctionStyle(OCIO::FixedFunctionOpData::Style style, // Test parsing. OCIO::LocalCachedFileRcPtr cachedFile; OCIO_CHECK_NO_THROW_FROM(cachedFile = ParseString(strebuf.str()), lineNo); - OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + OCIO_REQUIRE_ASSERT(cachedFile); + OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL_FROM(fileOps.size(), 1, lineNo); auto opData = fileOps[0]; @@ -4050,7 +4440,7 @@ OCIO_ADD_TEST(FileFormatCTF, load_grading_primary_log) OCIO_CHECK_NO_THROW(file = tester.read(ctfLog, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 4); const auto op0 = fileOps[0]; @@ -4154,7 +4544,7 @@ OCIO_ADD_TEST(FileFormatCTF, load_grading_primary_lin) OCIO_CHECK_NO_THROW(file = tester.read(ctfLin, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 4); const auto op0 = fileOps[0]; @@ -4255,7 +4645,7 @@ OCIO_ADD_TEST(FileFormatCTF, load_grading_primary_video) OCIO_CHECK_NO_THROW(file = tester.read(ctfVideo, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 4); const auto op0 = fileOps[0]; @@ -4454,7 +4844,7 @@ OCIO_ADD_TEST(FileFormatCTF, load_grading_rgbcurves_lin) OCIO_CHECK_NO_THROW(file = tester.read(ctfLin, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 3); const auto op0 = fileOps[0]; @@ -4542,7 +4932,7 @@ OCIO_ADD_TEST(FileFormatCTF, load_grading_rgbcurves_log) OCIO_CHECK_NO_THROW(file = tester.read(ctfLog, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); const auto op0 = fileOps[0]; @@ -4640,7 +5030,7 @@ OCIO_ADD_TEST(FileFormatCTF, load_grading_huecurves_log) OCIO_CHECK_NO_THROW(file = tester.read(ctfLog, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); const auto op0 = fileOps[0]; @@ -4848,7 +5238,7 @@ OCIO_ADD_TEST(CTFTransform, load_grading_tone) OCIO_CHECK_NO_THROW(file = tester.read(ctfLog, emptyString, OCIO::INTERP_DEFAULT)); OCIO::LocalCachedFileRcPtr cachedFile = OCIO_DYNAMIC_POINTER_CAST(file); OCIO_REQUIRE_ASSERT(cachedFile); - const auto & fileOps = cachedFile->m_transform->getOps(); + const auto & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 6); @@ -4937,7 +5327,7 @@ OCIO_ADD_TEST(CTFTransform, load_grading_tone_errors) OCIO_ADD_TEST(CTFTransform, load_edit_save_matrix) { - const std::string ctfFile("clf/matrix_example.clf"); + const std::string ctfFile("clf/pre-smpte_only/matrix_example.clf"); OCIO::ConstProcessorRcPtr processor; OCIO_CHECK_NO_THROW(processor = OCIO::GetFileTransformProcessor(ctfFile)); OCIO_REQUIRE_ASSERT(processor); @@ -4979,7 +5369,7 @@ OCIO_ADD_TEST(CTFTransform, load_edit_save_matrix) // Output matrix array as '3 4 3'. const std::string expectedCTF{ R"( - + Basic matrix example using CLF v2 dim syntax RGB XYZ @@ -5013,25 +5403,25 @@ OCIO_ADD_TEST(CTFTransform, load_edit_save_matrix) OCIO::CachedFileRcPtr file = tester.read(inputTransform, emptyString, OCIO::INTERP_DEFAULT); OCIO::LocalCachedFileRcPtr cachedFile = OCIO::DynamicPtrCast(file); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstMatrixOpDataRcPtr mat = OCIO::DynamicPtrCast(op); OCIO_REQUIRE_ASSERT(mat); const auto & md = mat->getFormatMetadata(); OCIO_REQUIRE_EQUAL(md.getNumAttributes(), 2); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_ID), md.getAttributeName(0)); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_NAME), md.getAttributeName(1)); + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_ID, md.getAttributeName(0)); + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_NAME, md.getAttributeName(1)); OCIO_CHECK_EQUAL(shortName, md.getAttributeValue(1)); OCIO_REQUIRE_EQUAL(md.getNumChildrenElements(), 4); const auto & desc0 = md.getChildElement(0); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_DESCRIPTION), desc0.getElementName()); - OCIO_CHECK_EQUAL(std::string(R"(Legacy matrix)"), desc0.getElementValue()); + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_DESCRIPTION, desc0.getElementName()); + OCIO_CHECK_EQUAL_STR("Legacy matrix", desc0.getElementValue()); const auto & desc1 = md.getChildElement(2); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_DESCRIPTION), desc1.getElementName()); + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_DESCRIPTION, desc1.getElementName()); OCIO_CHECK_EQUAL(description1, desc1.getElementValue()); const auto & desc2 = md.getChildElement(3); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_DESCRIPTION), desc2.getElementName()); + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_DESCRIPTION, desc2.getElementName()); OCIO_CHECK_EQUAL(description2, desc2.getElementValue()); } @@ -5063,7 +5453,7 @@ OCIO_ADD_TEST(CTFTransform, save_matrix) matTransform->setDirection(OCIO::TRANSFORM_DIR_FORWARD); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(matTransform); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstMatrixOpDataRcPtr mat = OCIO::DynamicPtrCast(op); @@ -5097,7 +5487,7 @@ OCIO_ADD_TEST(CTFTransform, save_cdl) cdlTransform->getFormatMetadata().addChildElement(OCIO::METADATA_SAT_DESCRIPTION, "Sat description 2"); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(cdlTransform); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstCDLOpDataRcPtr cdl = OCIO::DynamicPtrCast(op); @@ -5105,21 +5495,21 @@ OCIO_ADD_TEST(CTFTransform, save_cdl) OCIO_CHECK_EQUAL(cdl->getID(), "test-cdl-1"); const auto & metadata = cdl->getFormatMetadata(); OCIO_REQUIRE_EQUAL(metadata.getNumChildrenElements(), 8); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_DESCRIPTION, metadata.getChildElement(0).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_DESCRIPTION, metadata.getChildElement(1).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_INPUT_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_INPUT_DESCRIPTION, metadata.getChildElement(2).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_VIEWING_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_VIEWING_DESCRIPTION, metadata.getChildElement(3).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_SOP_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_SOP_DESCRIPTION, metadata.getChildElement(4).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_SOP_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_SOP_DESCRIPTION, metadata.getChildElement(5).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_SAT_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_SAT_DESCRIPTION, metadata.getChildElement(6).getElementName()); - OCIO_CHECK_EQUAL(std::string(OCIO::METADATA_SAT_DESCRIPTION), + OCIO_CHECK_EQUAL_STR(OCIO::METADATA_SAT_DESCRIPTION, metadata.getChildElement(7).getElementName()); auto params = cdl->getSlopeParams(); OCIO_CHECK_EQUAL(params[0], slope[0]); @@ -5145,7 +5535,7 @@ void TestSaveLog(double base, unsigned line) logT->setBase(base); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(logT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL_FROM(fileOps.size(), 1, line); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstLogOpDataRcPtr log = OCIO::DynamicPtrCast(op); @@ -5170,7 +5560,7 @@ OCIO_ADD_TEST(CTFTransform, save_log_affine) logT->setLinSideSlopeValue(vals); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(logT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstLogOpDataRcPtr log = OCIO::DynamicPtrCast(op); @@ -5193,7 +5583,7 @@ OCIO_ADD_TEST(CTFTransform, save_log_camera) logT->setLinearSlopeValue(vals_ls); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(logT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstLogOpDataRcPtr log = OCIO::DynamicPtrCast(op); @@ -5273,7 +5663,7 @@ OCIO_ADD_TEST(CTFTransform, save_lut1d_halfdomain) } OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(lutT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstLut1DOpDataRcPtr lut = OCIO::DynamicPtrCast(op); @@ -5322,7 +5712,7 @@ OCIO_ADD_TEST(CTFTransform, save_lut1d_f16_raw) lutT->setValue(1, values[3], values[4], values[5]); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(lutT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstLut1DOpDataRcPtr lut = OCIO::DynamicPtrCast(op); @@ -5364,7 +5754,7 @@ OCIO_ADD_TEST(CTFTransform, save_lut1d_f32) lutT->setValue(7, values[7], values[7], values[7]); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(lutT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstLut1DOpDataRcPtr lut = OCIO::DynamicPtrCast(op); @@ -5479,7 +5869,7 @@ OCIO_ADD_TEST(CTFTransform, save_range) rangeT->setMaxOutValue(1.5); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(rangeT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 1); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstRangeOpDataRcPtr range = OCIO::DynamicPtrCast(op); @@ -5509,7 +5899,7 @@ OCIO_ADD_TEST(CTFTransform, save_group) groupT->appendTransform(matT); OCIO::LocalCachedFileRcPtr cachedFile = WriteRead(groupT); - const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & fileOps = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(fileOps.size(), 2); OCIO::ConstOpDataRcPtr op = fileOps[0]; OCIO::ConstRangeOpDataRcPtr range = OCIO::DynamicPtrCast(op); @@ -5522,7 +5912,7 @@ OCIO_ADD_TEST(CTFTransform, save_group) OCIO_ADD_TEST(CTFTransform, load_save_matrix) { - const std::string ctfFile("clf/matrix_example.clf"); + const std::string ctfFile("clf/pre-smpte_only/matrix_example.clf"); OCIO::ConstProcessorRcPtr processor; OCIO_CHECK_NO_THROW(processor = OCIO::GetFileTransformProcessor(ctfFile)); OCIO_REQUIRE_ASSERT(processor); @@ -5533,7 +5923,7 @@ OCIO_ADD_TEST(CTFTransform, load_save_matrix) // Output matrix array as '3 3 3'. const std::string expected{ R"( - + Basic matrix example using CLF v2 dim syntax RGB XYZ @@ -5580,7 +5970,7 @@ OCIO_ADD_TEST(CTFTransform, save_matrix_444) OCIO_ADD_TEST(CTFTransform, load_edit_save_matrix_clf) { - const std::string ctfFile("clf/matrix_example.clf"); + const std::string ctfFile("clf/pre-smpte_only/matrix_example.clf"); OCIO::ConstProcessorRcPtr processor; OCIO_CHECK_NO_THROW(processor = OCIO::GetFileTransformProcessor(ctfFile)); OCIO_REQUIRE_ASSERT(processor); @@ -5595,12 +5985,14 @@ OCIO_ADD_TEST(CTFTransform, load_edit_save_matrix_clf) const double offset[] = { 0.1, 1.2, 2.3, 0.0 }; matTrans->setOffset(offset); - std::ostringstream outputTransform; - OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransform)); + // CLF Academy + { + std::ostringstream outputTransform; + OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransform)); - const std::string expectedCLF{ -R"( - + const std::string expectedCLF_Academy{ + R"( + Basic matrix example using CLF v2 dim syntax RGB XYZ @@ -5615,20 +6007,23 @@ R"( -)" }; +)"}; - OCIO_CHECK_EQUAL(expectedCLF.size(), outputTransform.str().size()); - OCIO_CHECK_EQUAL(expectedCLF, outputTransform.str()); + OCIO_CHECK_EQUAL(expectedCLF_Academy.size(), outputTransform.str().size()); + OCIO_CHECK_EQUAL(expectedCLF_Academy, outputTransform.str()); + } - const double offsetAlpha[] = { 0.1, 1.2, 2.3, 0.9 }; - matTrans->setOffset(offsetAlpha); + // CTF + { + const double offsetAlpha[] = { 0.1, 1.2, 2.3, 0.9 }; + matTrans->setOffset(offsetAlpha); - std::ostringstream outputTransformCTF; - OCIO_CHECK_NO_THROW(WriteGroupCTF(group, outputTransformCTF)); + std::ostringstream outputTransformCTF; + OCIO_CHECK_NO_THROW(WriteGroupCTF(group, outputTransformCTF)); - const std::string expectedCTF{ -R"( - + const std::string expectedCTF{ + R"( + Basic matrix example using CLF v2 dim syntax RGB XYZ @@ -5644,10 +6039,13 @@ R"( -)" }; +)"}; + + OCIO_CHECK_EQUAL(expectedCTF.size(), outputTransformCTF.str().size()); + OCIO_CHECK_EQUAL(expectedCTF, outputTransformCTF.str()); + } + - OCIO_CHECK_EQUAL(expectedCTF.size(), outputTransformCTF.str().size()); - OCIO_CHECK_EQUAL(expectedCTF, outputTransformCTF.str()); } OCIO_ADD_TEST(CTFTransform, matrix3x3_clf) @@ -5671,7 +6069,7 @@ OCIO_ADD_TEST(CTFTransform, matrix3x3_clf) // In/out bit-depth equal, matrix not scaled. const std::string expected{ R"( - + 0.333333333333333 3.33333333333333 33.3333333333333 @@ -5919,7 +6317,7 @@ OCIO_ADD_TEST(CTFTransform, cdl_clf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransform)); const std::string expected{ R"( - + ProcessList description ======================= @@ -5965,7 +6363,7 @@ OCIO_ADD_TEST(CTFTransform, cdl_clf) OCIO::CachedFileRcPtr file = tester.read(ctfStream, emptyString, OCIO::INTERP_DEFAULT); auto cachedFile = OCIO::DynamicPtrCast(file); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto cdlData = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(cdlData); @@ -6084,7 +6482,7 @@ OCIO_ADD_TEST(CTFTransform, range1_clf) const std::string expected{ "\n" - "\n" + "\n" " Input descriptor\n" " Output descriptor\n" " \n" @@ -6119,7 +6517,7 @@ OCIO_ADD_TEST(CTFTransform, range2_clf) const std::string expected{ "\n" - "\n" + "\n" " \n" " 102.3 \n" " 25.5 \n" @@ -6150,7 +6548,7 @@ OCIO_ADD_TEST(CTFTransform, range3_clf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransform)); const std::string expected{ R"( - + 0 0 @@ -6185,7 +6583,7 @@ OCIO_ADD_TEST(CTFTransform, range4_clf) // Range is saved in the forward direction. const std::string expected{ R"( - + 2047.5 4095 @@ -6259,7 +6657,7 @@ OCIO_ADD_TEST(CTFTransform, gamma1_ctf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransformCLF)); const std::string expectedCLF{ R"( - + @@ -6302,7 +6700,7 @@ OCIO_ADD_TEST(CTFTransform, gamma1_mirror_ctf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransformCLF)); const std::string expectedCLF{ R"( - + @@ -6345,7 +6743,7 @@ OCIO_ADD_TEST(CTFTransform, gamma1_pass_thru_ctf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransformCLF)); const std::string expectedCLF{ R"( - + @@ -6430,7 +6828,7 @@ OCIO_ADD_TEST(CTFTransform, gamma3_ctf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransformCLF)); const std::string expectedCLF{ R"( - + @@ -7680,7 +8078,7 @@ OCIO_ADD_TEST(CTFTransform, lut1d_clf) OCIO_CHECK_NO_THROW(WriteGroupCLF(group, outputTransform)); const std::string expected{ R"( - + 0 @@ -8455,7 +8853,7 @@ OCIO_ADD_TEST(FileFormatCTF, bake_1d) const std::string expectedCLF{ R"( - + 0 @@ -8531,7 +8929,7 @@ OCIO_ADD_TEST(FileFormatCTF, bake_1d_shaper) OCIO::CachedFileRcPtr file = tester.read(outputCTF, emptyString, OCIO::INTERP_DEFAULT); auto cachedFile = OCIO::DynamicPtrCast(file); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto range = OCIO_DYNAMIC_POINTER_CAST(opList[0]); @@ -8573,7 +8971,7 @@ OCIO_ADD_TEST(FileFormatCTF, bake_1d_shaper) OCIO::CachedFileRcPtr file = tester.read(outputCTF, emptyString, OCIO::INTERP_DEFAULT); auto cachedFile = OCIO::DynamicPtrCast(file); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 1); auto lut = OCIO_DYNAMIC_POINTER_CAST(opList[0]); @@ -8625,11 +9023,12 @@ OCIO_ADD_TEST(FileFormatCTF, bake_3d) data.addChildElement(OCIO::METADATA_DESCRIPTION, "OpenColorIO Test Line 2"); data.addChildElement("Anything", "Not Saved"); - data.addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "Input descriptor"); - data.addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "Only first is saved"); - data.addChildElement(OCIO::METADATA_OUTPUT_DESCRIPTOR, "Output descriptor"); + data.addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "Input descriptor 1"); + data.addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "Input descriptor 2"); + data.addChildElement(OCIO::METADATA_OUTPUT_DESCRIPTOR, "Output descriptor 1"); + data.addChildElement(OCIO::METADATA_OUTPUT_DESCRIPTOR, "Output descriptor 2"); data.addChildElement(OCIO::METADATA_INFO, ""); - auto & info = data.getChildElement(6); + auto & info = data.getChildElement(7); info.addAttribute("attrib1", "val1"); info.addAttribute("attrib2", "val2"); info.addChildElement("anything", "is saved"); @@ -8644,11 +9043,13 @@ OCIO_ADD_TEST(FileFormatCTF, bake_3d) const std::string expectedCLF{ R"( - + OpenColorIO Test Line 1 OpenColorIO Test Line 2 - Input descriptor - Output descriptor + Input descriptor 1 + Input descriptor 2 + Output descriptor 1 + Output descriptor 2 is saved is also saved @@ -8726,7 +9127,7 @@ OCIO_ADD_TEST(FileFormatCTF, bake_1d_3d) OCIO::CachedFileRcPtr file = tester.read(output, emptyString, OCIO::INTERP_DEFAULT); auto cachedFile = OCIO::DynamicPtrCast(file); - const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOps(); + const OCIO::ConstOpDataVec & opList = cachedFile->m_transform->getOpDataVec(); OCIO_REQUIRE_EQUAL(opList.size(), 2); auto shaperLut = std::dynamic_pointer_cast(opList[0]); OCIO_REQUIRE_ASSERT(shaperLut); @@ -8776,7 +9177,7 @@ OCIO_ADD_TEST(FileFormatCTF, bake_1d_3d) const std::string expectedCLF{ R"( - + -0.125 1.125 diff --git a/tests/cpu/fileformats/FileFormatICC_tests.cpp b/tests/cpu/fileformats/FileFormatICC_tests.cpp index e0c816093c..d120e24871 100644 --- a/tests/cpu/fileformats/FileFormatICC_tests.cpp +++ b/tests/cpu/fileformats/FileFormatICC_tests.cpp @@ -244,6 +244,8 @@ OCIO_ADD_TEST(FileFormatICC, test_apply) { OCIO::ContextRcPtr context = OCIO::Context::Create(); { + // This test uses a profile where the TRC is a 1024 element LUT. + static const std::string iccFileName("icc-test-3.icm"); OCIO::OpRcPtrVec ops; OCIO_CHECK_NO_THROW(BuildOpsTest(ops, iccFileName, context, OCIO::TRANSFORM_DIR_INVERSE)); @@ -287,7 +289,8 @@ OCIO_ADD_TEST(FileFormatICC, test_apply) op->apply(srcImage, 3); } - // Values outside [0.0, 1.0] are clamped and won't round-trip. + // Currently the LUT-based TRC's clamp the values outside + // [0.0, 1.0], thus those values won't round-trip. static constexpr float bckImage[] = { 0.0f, 0.0f, 0.3f, 0.0f, 0.4f, 0.5f, 0.6f, 0.5f, @@ -301,26 +304,35 @@ OCIO_ADD_TEST(FileFormatICC, test_apply) } { + // This test uses a profile where the TRC is + // a parametric curve of type 0 (basic gamma) with + // gamma values {2.174, 2.174, 2.174, 1.0}. + static const std::string iccFileName("icc-test-2.pf"); OCIO::OpRcPtrVec ops; OCIO_CHECK_NO_THROW(BuildOpsTest(ops, iccFileName, context, OCIO::TRANSFORM_DIR_INVERSE)); OCIO_CHECK_NO_THROW(ops.finalize()); OCIO_CHECK_NO_THROW(ops.optimize(OCIO::OPTIMIZATION_LOSSLESS)); + OCIO_REQUIRE_EQUAL(2, ops.size()); + OCIO_CHECK_EQUAL("", ops[0]->getInfo()); + OCIO_CHECK_EQUAL("", ops[1]->getInfo()); // apply ops - float srcImage[] = { + const std::array srcImage{ -0.1f, 0.0f, 0.3f, 0.0f, 0.4f, 0.5f, 0.6f, 0.5f, 0.7f, 1.0f, 1.9f, 1.0f }; - const float dstImage[] = { - 0.012437f, 0.004702f, 0.070333f, 0.0f, + const std::array dstImage{ + 0.009241f, 0.003003f, 0.070198f, 0.0f, 0.188392f, 0.206965f, 0.343595f, 0.5f, - 0.693246f, 0.863199f, 1.07867f , 1.0f }; + 1.210462f, 1.058761f, 4.003706f, 1.0f }; + + std::array testImage = srcImage; for (const auto & op : ops) { - op->apply(srcImage, 3); + op->apply(testImage.data(), 3); } // Compare results @@ -328,7 +340,7 @@ OCIO_ADD_TEST(FileFormatICC, test_apply) for (unsigned int i = 0; i<12; ++i) { - OCIO_CHECK_CLOSE(srcImage[i], dstImage[i], error); + OCIO_CHECK_CLOSE(testImage[i], dstImage[i], error); } // Invert the processing. @@ -337,24 +349,22 @@ OCIO_ADD_TEST(FileFormatICC, test_apply) OCIO_CHECK_NO_THROW(BuildOpsTest(opsInv, iccFileName, context, OCIO::TRANSFORM_DIR_FORWARD)); OCIO_CHECK_NO_THROW(opsInv.finalize()); OCIO_CHECK_NO_THROW(opsInv.optimize(OCIO::OPTIMIZATION_LOSSLESS)); + OCIO_REQUIRE_EQUAL(2, opsInv.size()); + OCIO_CHECK_EQUAL("", opsInv[0]->getInfo()); + OCIO_CHECK_EQUAL("", opsInv[1]->getInfo()); for (const auto & op : opsInv) { - op->apply(srcImage, 3); + op->apply(testImage.data(), 3); } - // Values outside [0.0, 1.0] are clamped and won't round-trip. - const float bckImage[] = { - 0.0f, 0.0f, 0.3f, 0.0f, - 0.4f, 0.5f, 0.6f, 0.5f, - 0.7f, 1.0f, 1.0f, 1.0f }; - - // Compare results + // For pure-gamma TRCs, values outside [0.0, 1.0] are NOT clamped + // thus those values should round-trip correctly. const float error2 = 2e-4f; for (unsigned int i = 0; i<12; ++i) { - OCIO_CHECK_CLOSE(srcImage[i], bckImage[i], error2); + OCIO_CHECK_CLOSE(testImage[i], srcImage[i], error2); } } diff --git a/tests/cpu/fileformats/ctf/CTFTransform_tests.cpp b/tests/cpu/fileformats/ctf/CTFTransform_tests.cpp index c5ec9c2e9e..f04d3155a8 100644 --- a/tests/cpu/fileformats/ctf/CTFTransform_tests.cpp +++ b/tests/cpu/fileformats/ctf/CTFTransform_tests.cpp @@ -47,58 +47,114 @@ OCIO_ADD_TEST(CTFVersion, read_version) OCIO::CTFVersion versionRead; { - OCIO_CHECK_NO_THROW(OCIO::CTFVersion::ReadVersion("1.2.3", versionRead)); + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("1.2.3")); const OCIO::CTFVersion version(1, 2, 3); OCIO_CHECK_EQUAL(version, versionRead); } { - OCIO_CHECK_NO_THROW(OCIO::CTFVersion::ReadVersion("1.2", versionRead)); + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("1.2")); const OCIO::CTFVersion version(1, 2, 0); OCIO_CHECK_EQUAL(version, versionRead); } { - OCIO_CHECK_NO_THROW(OCIO::CTFVersion::ReadVersion("1", versionRead)); + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("1")); const OCIO::CTFVersion version(1, 0, 0); OCIO_CHECK_EQUAL(version, versionRead); } { - OCIO_CHECK_NO_THROW(OCIO::CTFVersion::ReadVersion("1.10", versionRead)); + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("1.10")); const OCIO::CTFVersion version(1, 10, 0); OCIO_CHECK_EQUAL(version, versionRead); } { - OCIO_CHECK_NO_THROW(OCIO::CTFVersion::ReadVersion("1.1.0", versionRead)); + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("1.1.0")); const OCIO::CTFVersion version(1, 1, 0); OCIO_CHECK_EQUAL(version, versionRead); } { - OCIO_CHECK_NO_THROW(OCIO::CTFVersion::ReadVersion("1.01", versionRead)); + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("1.01")); const OCIO::CTFVersion version(1, 1, 0); OCIO_CHECK_EQUAL(version, versionRead); } - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("", versionRead), + { + // Numeric format is always accepted. + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion("2.0.0", OCIO::CTFVersion::VERSION_SMPTE_CLF)); + const OCIO::CTFVersion version(2, 0, 0); + OCIO_CHECK_EQUAL(version, versionRead); + } + + { + // Short SMPTE should be accepted only when the format is allowed. + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion( + "ST2136-1:2024"), + OCIO::Exception, + "is not a valid version. Expecting MAJOR[.MINOR[.REVISION]]"); + } + + { + // Long SMPTE should be accepted only when the format is allowed. + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion( + "http://www.smpte-ra.org/ns/2136-1/2024"), + OCIO::Exception, + "is not a valid version. Expecting MAJOR[.MINOR[.REVISION]]"); + } + + { + // SMPTE version is regarded as v3.0.0. + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion( + "ST2136-1:2024", OCIO::CTFVersion::VERSION_SMPTE_CLF)); + const OCIO::CTFVersion version(3, 0, 0); + OCIO_CHECK_EQUAL(version, versionRead); + } + + { + // Short SMPTE string is not allowed when only the long format is accepted. + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion( + "ST2136-1:2024", OCIO::CTFVersion::VERSION_SMPTE_XMLNS), + OCIO::Exception, + "is not a valid version. Expecting 'http://www.smpte-ra.org/ns/2136-1/2024' or MAJOR[.MINOR[.REVISION]]"); + } + + { + // Long SMPTE should be accepted only when the format is allowed and + // should be regarded as v3.0.0. + OCIO_CHECK_NO_THROW(versionRead = OCIO::CTFVersion( + "http://www.smpte-ra.org/ns/2136-1/2024", OCIO::CTFVersion::VERSION_SMPTE_XMLNS)); + const OCIO::CTFVersion version(3, 0, 0); + OCIO_CHECK_EQUAL(version, versionRead); + } + + { + // Long SMPTE string is not allowed when only the short format is accepted. + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion( + "http://www.smpte-ra.org/ns/2136-1/2024", OCIO::CTFVersion::VERSION_SMPTE_CLF), + OCIO::Exception, + "is not a valid version. Expecting 'ST2136-1:2024' or MAJOR[.MINOR[.REVISION]]"); + } + + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion(""), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("1 2", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion("1 2"), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("1-2", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion("1-2"), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("a", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion("a"), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("1.", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion("1."), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion(".2", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion(".2"), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("1.0 2", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion("1.0 2"), OCIO::Exception, "is not a valid version"); - OCIO_CHECK_THROW_WHAT(OCIO::CTFVersion::ReadVersion("-1", versionRead), + OCIO_CHECK_THROW_WHAT(versionRead = OCIO::CTFVersion("-1"), OCIO::Exception, "is not a valid version"); } @@ -141,13 +197,32 @@ OCIO_ADD_TEST(CTFVersion, version_write) ostream << version; OCIO_CHECK_EQUAL(ostream.str(), "0"); } + { + const OCIO::CTFVersion version( + "ST2136-1:2024", + OCIO::CTFVersion::VERSION_SMPTE_CLF); + std::ostringstream ostream; + ostream << version; + OCIO_CHECK_EQUAL(ostream.str(), "ST2136-1:2024"); + } + { + const OCIO::CTFVersion version( + "http://www.smpte-ra.org/ns/2136-1/2024", + OCIO::CTFVersion::VERSION_SMPTE_XMLNS); + std::ostringstream ostream; + ostream << version; + OCIO_CHECK_EQUAL(ostream.str(), "http://www.smpte-ra.org/ns/2136-1/2024"); + } + } OCIO_ADD_TEST(CTFReaderTransform, accessors) { OCIO::CTFReaderTransform t; + OCIO::FormatMetadataImpl & meta = t.getInfoMetadata(); { const OCIO::CTFReaderTransform & ct = t; + const OCIO::FormatMetadataImpl & cmeta = t.getInfoMetadata(); OCIO::FormatMetadataImpl & info = t.getInfoMetadata(); const OCIO::FormatMetadataImpl & cinfo = t.getInfoMetadata(); @@ -159,53 +234,61 @@ OCIO_ADD_TEST(CTFReaderTransform, accessors) OCIO_CHECK_EQUAL(ct.getID(), ""); OCIO_CHECK_EQUAL(t.getName(), ""); OCIO_CHECK_EQUAL(ct.getName(), ""); - OCIO_CHECK_EQUAL(t.getInverseOfId(), ""); - OCIO_CHECK_EQUAL(ct.getInverseOfId(), ""); - OCIO_CHECK_EQUAL(t.getInputDescriptor(), ""); - OCIO_CHECK_EQUAL(ct.getInputDescriptor(), ""); - OCIO_CHECK_EQUAL(t.getOutputDescriptor(), ""); - OCIO_CHECK_EQUAL(ct.getOutputDescriptor(), ""); + OCIO_CHECK_EQUAL_STR(meta.getAttributeValue("inverseOf"), ""); + OCIO_CHECK_EQUAL_STR(cmeta.getAttributeValue("inverseOf"), ""); - OCIO_CHECK_ASSERT(t.getOps().empty()); - OCIO_CHECK_ASSERT(ct.getOps().empty()); + OCIO_CHECK_ASSERT(t.getOpDataVec().empty()); + OCIO_CHECK_ASSERT(ct.getOpDataVec().empty()); - OCIO_CHECK_ASSERT(t.getDescriptions().empty()); - OCIO_CHECK_ASSERT(ct.getDescriptions().empty()); + OCIO_REQUIRE_EQUAL(meta.getNumChildrenElements(), 0); + OCIO_REQUIRE_EQUAL(cmeta.getNumChildrenElements(), 0); } t.setName("Name"); t.setID("123"); - t.setInverseOfId("654"); - t.setInputDescriptor("input"); - t.setOutputDescriptor("output"); + meta.addAttribute(OCIO::ATTR_INVERSE_OF, "654"); + meta.addChildElement(OCIO::METADATA_ID_ELEMENT, "urn:uuid:123e4567-e89b-12d3-a456-426655440000"); auto matrixOp = std::make_shared(); - t.getOps().push_back(matrixOp); + t.getOpDataVec().push_back(matrixOp); - t.getDescriptions().push_back("One"); - t.getDescriptions().push_back("Two"); + meta.addChildElement(OCIO::METADATA_DESCRIPTION, "One"); + meta.addChildElement(OCIO::METADATA_DESCRIPTION, "Two"); + meta.addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "input 1"); + meta.addChildElement(OCIO::METADATA_INPUT_DESCRIPTOR, "input 2"); + meta.addChildElement(OCIO::METADATA_OUTPUT_DESCRIPTOR, "output 1"); + meta.addChildElement(OCIO::METADATA_OUTPUT_DESCRIPTOR, "output 2"); + auto & outDesc2 = meta.getChildElement(meta.getNumChildrenElements()-1); + outDesc2.addAttribute(OCIO::ATTR_LANGUAGE, "tr"); { const OCIO::CTFReaderTransform & ct = t; + const OCIO::FormatMetadataImpl & cmeta = t.getInfoMetadata(); OCIO_CHECK_EQUAL(t.getID(), "123"); OCIO_CHECK_EQUAL(ct.getID(), "123"); OCIO_CHECK_EQUAL(t.getName(), "Name"); OCIO_CHECK_EQUAL(ct.getName(), "Name"); - OCIO_CHECK_EQUAL(t.getInverseOfId(), "654"); - OCIO_CHECK_EQUAL(ct.getInverseOfId(), "654"); - OCIO_CHECK_EQUAL(t.getInputDescriptor(), "input"); - OCIO_CHECK_EQUAL(ct.getInputDescriptor(), "input"); - OCIO_CHECK_EQUAL(t.getOutputDescriptor(), "output"); - OCIO_CHECK_EQUAL(ct.getOutputDescriptor(), "output"); - - OCIO_CHECK_EQUAL(t.getOps().size(), 1); - OCIO_CHECK_EQUAL(ct.getOps().size(), 1); - - OCIO_CHECK_EQUAL(t.getDescriptions().size(), 2); - OCIO_CHECK_EQUAL(ct.getDescriptions().size(), 2); - OCIO_CHECK_EQUAL(t.getDescriptions()[0], "One"); - OCIO_CHECK_EQUAL(ct.getDescriptions()[0], "One"); - OCIO_CHECK_EQUAL(t.getDescriptions()[1], "Two"); - OCIO_CHECK_EQUAL(ct.getDescriptions()[1], "Two"); + OCIO_CHECK_EQUAL_STR(meta.getAttributeValue("inverseOf"), "654"); + OCIO_CHECK_EQUAL_STR(cmeta.getAttributeValue("inverseOf"), "654"); + + OCIO_CHECK_EQUAL(t.getOpDataVec().size(), 1); + OCIO_CHECK_EQUAL(ct.getOpDataVec().size(), 1); + + OCIO_REQUIRE_EQUAL(meta.getNumChildrenElements(), 7); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(0).getElementName(), "Id"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(0).getElementValue(), "urn:uuid:123e4567-e89b-12d3-a456-426655440000"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(1).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(1).getElementValue(), "One"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(2).getElementName(), "Description"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(2).getElementValue(), "Two"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(3).getElementName(), "InputDescriptor"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(3).getElementValue(), "input 1"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(4).getElementName(), "InputDescriptor"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(4).getElementValue(), "input 2"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(5).getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(5).getElementValue(), "output 1"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(6).getElementName(), "OutputDescriptor"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(6).getElementValue(), "output 2"); + OCIO_CHECK_EQUAL_STR(meta.getChildElement(6).getAttributeValue("language"), "tr"); } } diff --git a/tests/cpu/ops/fixedfunction/FixedFunctionOpCPU_tests.cpp b/tests/cpu/ops/fixedfunction/FixedFunctionOpCPU_tests.cpp index 9593c9cd8e..7af081d047 100644 --- a/tests/cpu/ops/fixedfunction/FixedFunctionOpCPU_tests.cpp +++ b/tests/cpu/ops/fixedfunction/FixedFunctionOpCPU_tests.cpp @@ -586,6 +586,37 @@ OCIO_ADD_TEST(FixedFunctionOpCPU, aces_ot_20_rec709_100n_rt) __LINE__); } +OCIO_ADD_TEST(FixedFunctionOpCPU, aces_ot_20_edge_cases) +{ + constexpr int test_cases = 2; + constexpr int num_channels = 4; + std::array input_32f = { + 0.0f, 0.0f, 0.0f, 1.0f, + 0.742242277f, 0.0931933373f, 0.321542144f, 1.0f // Bug #2220: related to hue angle calculation + // triggering an out of bounds access in the tables + // at exactly 360 degrees + }; + constexpr std::array expected_32f = { + 0.0f, 0.0f, 0.0f, 1.0f, + 0.74736571311951f, -0.0019352473318577f, 0.19451357424259f, 1.0f, // Note: exact output value is not + // significant to the test as the bug + // was in the internal table access logic + }; + + OCIO::FixedFunctionOpData::Params params = { + // Peak luminance + 100.f, + // Rec709 gamut + 0.6400, 0.3300, 0.3000, 0.6000, 0.1500, 0.0600, 0.3127, 0.3290 + }; + + OCIO::ConstFixedFunctionOpDataRcPtr funcData + = std::make_shared(OCIO::FixedFunctionOpData::ACES_OUTPUT_TRANSFORM_20_FWD, + params); + + ApplyFixedFunction(input_32f.data(), expected_32f.data(), test_cases, funcData, 1e-4f, __LINE__); +} + OCIO_ADD_TEST(FixedFunctionOpCPU, aces_ot_20_p3d65_100n_rt) { const int lut_size = 8; diff --git a/tests/cpu/ops/lut3d/Lut3DOpData_tests.cpp b/tests/cpu/ops/lut3d/Lut3DOpData_tests.cpp index 69d2234b92..27d7f6d537 100644 --- a/tests/cpu/ops/lut3d/Lut3DOpData_tests.cpp +++ b/tests/cpu/ops/lut3d/Lut3DOpData_tests.cpp @@ -67,8 +67,8 @@ OCIO_ADD_TEST(Lut3DOpData, clone) OCIO_ADD_TEST(Lut3DOpData, not_supported_length) { - OCIO_CHECK_NO_THROW(OCIO::Lut3DOpData{ OCIO::Lut3DOpData::maxSupportedLength }); - OCIO_CHECK_THROW_WHAT(OCIO::Lut3DOpData{ OCIO::Lut3DOpData::maxSupportedLength + 1 }, + OCIO_CHECK_NO_THROW(OCIO::Lut3DOpData{ OCIO::Max3DLUTLength }); + OCIO_CHECK_THROW_WHAT(OCIO::Lut3DOpData{ OCIO::Max3DLUTLength + 1 }, OCIO::Exception, "must not be greater"); } diff --git a/tests/cpu/ops/reference/ReferenceOpData_tests.cpp b/tests/cpu/ops/reference/ReferenceOpData_tests.cpp index 100650d7c2..96f8402bbc 100644 --- a/tests/cpu/ops/reference/ReferenceOpData_tests.cpp +++ b/tests/cpu/ops/reference/ReferenceOpData_tests.cpp @@ -233,7 +233,7 @@ OCIO_ADD_TEST(Reference, load_nested_resolve_internal) op = ops[2]; OCIO_REQUIRE_ASSERT(op); OCIO_REQUIRE_ASSERT(GetFilePath(path, op)); - OCIO_CHECK_NE(path.find("matrix_example.clf"), std::string::npos); + OCIO_CHECK_NE(path.find("matrix_example_utf8.clf"), std::string::npos); op = ops[3]; OCIO_REQUIRE_ASSERT(op); diff --git a/tests/cpu/transforms/FileTransform_tests.cpp b/tests/cpu/transforms/FileTransform_tests.cpp index 9b78b9c50f..101358f29a 100644 --- a/tests/cpu/transforms/FileTransform_tests.cpp +++ b/tests/cpu/transforms/FileTransform_tests.cpp @@ -80,7 +80,7 @@ OCIO_ADD_TEST(FileTransform, load_file_ok) OCIO_CHECK_ASSERT(!proc->isNoOp()); // Academy/ASC common LUT format. - const std::string clfMatTransform("clf/matrix_example.clf"); + const std::string clfMatTransform("clf/pre-smpte_only/matrix_example.clf"); OCIO_CHECK_NO_THROW(proc = OCIO::GetFileTransformProcessor(clfMatTransform)); OCIO_CHECK_ASSERT(!proc->isNoOp()); diff --git a/tests/data/files/clf/aces_to_video_with_look.clf b/tests/data/files/clf/aces_to_video_with_look.clf index 4478c03f70..e2c428403e 100644 --- a/tests/data/files/clf/aces_to_video_with_look.clf +++ b/tests/data/files/clf/aces_to_video_with_look.clf @@ -1,5 +1,5 @@ - + Converts ACES to ACEScct, applies ASC CDL, then applies a 3D-LUT to convert back to ACES and apply the RRT+ODT.Academy.Rec709_100nits_dim ACES2065-1 HD (Rec 709) video diff --git a/tests/data/files/clf/bit_depth_identity.clf b/tests/data/files/clf/bit_depth_identity.clf new file mode 100644 index 0000000000..0ee6d7bb7a --- /dev/null +++ b/tests/data/files/clf/bit_depth_identity.clf @@ -0,0 +1,25 @@ + + + urn:uuid:9d768121-0cf9-40a3-a8e3-7b49f79858a7 + Identity transform illustrating Array bit depth scaling + Can be loaded by either SMPTE or CLF v3 parsers + + + 257.0 0.0 0.0 + 0.0 257.0 0.0 + 0.0 0.0 257.0 + + + + + 0.0 10922.5 21845.0 32767.5 43690.0 54612.5 65535.0 + + + + + 1.0 0.0 0.0 + 0.0 1.0 0.0 + 0.0 0.0 1.0 + + + diff --git a/tests/data/files/clf/cdl_all_styles.clf b/tests/data/files/clf/cdl_all_styles.clf index 53e1f428bb..75fb4d9d80 100644 --- a/tests/data/files/clf/cdl_all_styles.clf +++ b/tests/data/files/clf/cdl_all_styles.clf @@ -1,5 +1,5 @@ - + Test all CDL style values diff --git a/tests/data/files/clf/cdl_clamp_fwd.clf b/tests/data/files/clf/cdl_clamp_fwd.clf index 3a298fa13e..633d84346e 100644 --- a/tests/data/files/clf/cdl_clamp_fwd.clf +++ b/tests/data/files/clf/cdl_clamp_fwd.clf @@ -1,5 +1,5 @@ - + Example of ASC CDL operation inputDesc outputDesc diff --git a/tests/data/files/clf/cdl_missing_sat.clf b/tests/data/files/clf/cdl_missing_sat.clf index 40fa7f8851..f44958c6be 100644 --- a/tests/data/files/clf/cdl_missing_sat.clf +++ b/tests/data/files/clf/cdl_missing_sat.clf @@ -1,5 +1,5 @@ - + Missing Sat defaults to 1 ASC CDL operation diff --git a/tests/data/files/clf/cdl_missing_sop.clf b/tests/data/files/clf/cdl_missing_sop.clf index 99ab40eb4c..3a35b2f1ca 100644 --- a/tests/data/files/clf/cdl_missing_sop.clf +++ b/tests/data/files/clf/cdl_missing_sop.clf @@ -1,5 +1,5 @@ - + Missing SOP defaults to identity params inputDesc outputDesc diff --git a/tests/data/files/clf/cdl_missing_style.clf b/tests/data/files/clf/cdl_missing_style.clf index 2c407b929d..a4b76ef97f 100644 --- a/tests/data/files/clf/cdl_missing_style.clf +++ b/tests/data/files/clf/cdl_missing_style.clf @@ -1,5 +1,5 @@ - + Missing style defaults to "Fwd" diff --git a/tests/data/files/clf/difficult_syntax.clf b/tests/data/files/clf/difficult_syntax.clf index 4a48375b9f..9e16a0170b 100644 --- a/tests/data/files/clf/difficult_syntax.clf +++ b/tests/data/files/clf/difficult_syntax.clf @@ -5,7 +5,11 @@ - + + + This is the ProcessList description. + yet 'another' "valid" desc + This is a "difficult" but 'legal' color transform file. @@ -20,7 +24,7 @@ third array dim value is ignored - + 3.24000 -1.53700 -0.49850 -0.96930 1.87600 +0.04156 0.05560 -0.20400 0.105730e+1 @@ -29,12 +33,19 @@ third array dim value is ignored - This is the ProcessList description. - + name' unknown="attr"> the n–dash description + + another valid +description +element + + + + & another <valid> desc + @@ -168,16 +179,8 @@ only tabs used to separate next few triplets 1.00000 0.95000 0.90000 - another valid -description -element - - - - & another <valid> desc - yet 'another' "valid" desc diff --git a/tests/data/files/clf/exponent_all_styles.clf b/tests/data/files/clf/exponent_all_styles.clf index 157df5e411..a7a3392ca2 100644 --- a/tests/data/files/clf/exponent_all_styles.clf +++ b/tests/data/files/clf/exponent_all_styles.clf @@ -1,5 +1,5 @@ - + Test all Exponent style values If there is only one Params, use it for R, G, and B. diff --git a/tests/data/files/clf/illegal/array_bad_dimension.clf b/tests/data/files/clf/illegal/array_bad_dimension.clf index 918b1720c4..03305c37cf 100644 --- a/tests/data/files/clf/illegal/array_bad_dimension.clf +++ b/tests/data/files/clf/illegal/array_bad_dimension.clf @@ -1,5 +1,5 @@ - + Array dim attribute is not legal. diff --git a/tests/data/files/clf/illegal/array_bad_value.clf b/tests/data/files/clf/illegal/array_bad_value.clf index 28f607b9d2..7cfab661de 100644 --- a/tests/data/files/clf/illegal/array_bad_value.clf +++ b/tests/data/files/clf/illegal/array_bad_value.clf @@ -1,5 +1,5 @@ - + Array has a non-numeric character diff --git a/tests/data/files/clf/illegal/array_missing_values.clf b/tests/data/files/clf/illegal/array_missing_values.clf index fafd66361e..20d0e1b110 100644 --- a/tests/data/files/clf/illegal/array_missing_values.clf +++ b/tests/data/files/clf/illegal/array_missing_values.clf @@ -1,5 +1,5 @@ - + Matrix has too few values. diff --git a/tests/data/files/clf/illegal/array_too_many_values.clf b/tests/data/files/clf/illegal/array_too_many_values.clf index 49957befdc..972c2d0ca8 100644 --- a/tests/data/files/clf/illegal/array_too_many_values.clf +++ b/tests/data/files/clf/illegal/array_too_many_values.clf @@ -1,5 +1,5 @@ - + Matrix has too many values. diff --git a/tests/data/files/clf/illegal/cdl_bad_power.clf b/tests/data/files/clf/illegal/cdl_bad_power.clf index e39c8a611f..fc4715c16c 100644 --- a/tests/data/files/clf/illegal/cdl_bad_power.clf +++ b/tests/data/files/clf/illegal/cdl_bad_power.clf @@ -1,5 +1,5 @@ - + CDL power must be > 0 diff --git a/tests/data/files/clf/illegal/cdl_bad_sat.clf b/tests/data/files/clf/illegal/cdl_bad_sat.clf index bca68a6813..06a5ea1453 100644 --- a/tests/data/files/clf/illegal/cdl_bad_sat.clf +++ b/tests/data/files/clf/illegal/cdl_bad_sat.clf @@ -1,5 +1,5 @@ - + Sat may only have 1 value. diff --git a/tests/data/files/clf/illegal/cdl_bad_slope.clf b/tests/data/files/clf/illegal/cdl_bad_slope.clf index b267e9cf45..582299ec32 100644 --- a/tests/data/files/clf/illegal/cdl_bad_slope.clf +++ b/tests/data/files/clf/illegal/cdl_bad_slope.clf @@ -1,5 +1,5 @@ - + Slope must have 3 values. diff --git a/tests/data/files/clf/illegal/cdl_bad_style.clf b/tests/data/files/clf/illegal/cdl_bad_style.clf index 40dc6420b9..6d62bc44ee 100644 --- a/tests/data/files/clf/illegal/cdl_bad_style.clf +++ b/tests/data/files/clf/illegal/cdl_bad_style.clf @@ -1,5 +1,5 @@ - + CDL style is not a legal value diff --git a/tests/data/files/clf/illegal/cdl_missing_offset.clf b/tests/data/files/clf/illegal/cdl_missing_offset.clf index 0ee0dbf2f8..3a4024cd69 100644 --- a/tests/data/files/clf/illegal/cdl_missing_offset.clf +++ b/tests/data/files/clf/illegal/cdl_missing_offset.clf @@ -1,5 +1,5 @@ - + The SOPNode is optional, but if present, must contain Slope, Offset, and Power diff --git a/tests/data/files/clf/illegal/cdl_missing_power.clf b/tests/data/files/clf/illegal/cdl_missing_power.clf index a759f90576..ca3f66cad7 100644 --- a/tests/data/files/clf/illegal/cdl_missing_power.clf +++ b/tests/data/files/clf/illegal/cdl_missing_power.clf @@ -1,5 +1,5 @@ - + The SOPNode is optional, but if present, must contain Slope, Offset, and Power diff --git a/tests/data/files/clf/illegal/cdl_missing_slope.clf b/tests/data/files/clf/illegal/cdl_missing_slope.clf index efd3e9d274..ded6bf15a5 100644 --- a/tests/data/files/clf/illegal/cdl_missing_slope.clf +++ b/tests/data/files/clf/illegal/cdl_missing_slope.clf @@ -1,5 +1,5 @@ - + The SOPNode is optional, but if present, must contain Slope, Offset, and Power diff --git a/tests/data/files/clf/illegal/exponent_bad_param.clf b/tests/data/files/clf/illegal/exponent_bad_param.clf index 5e3094f70c..8d48ba2683 100644 --- a/tests/data/files/clf/illegal/exponent_bad_param.clf +++ b/tests/data/files/clf/illegal/exponent_bad_param.clf @@ -1,5 +1,5 @@ - + The basic styles may not use the offset param diff --git a/tests/data/files/clf/illegal/exponent_bad_value.clf b/tests/data/files/clf/illegal/exponent_bad_value.clf index 2a358d5313..2d4e8ec295 100644 --- a/tests/data/files/clf/illegal/exponent_bad_value.clf +++ b/tests/data/files/clf/illegal/exponent_bad_value.clf @@ -1,5 +1,5 @@ - + The moncurve style requires an exponent >= 1. diff --git a/tests/data/files/clf/illegal/indexMap_test2.clf b/tests/data/files/clf/illegal/indexMap_test2.clf index 498ac6454e..d0b2a10b0f 100644 --- a/tests/data/files/clf/illegal/indexMap_test2.clf +++ b/tests/data/files/clf/illegal/indexMap_test2.clf @@ -1,5 +1,5 @@ - + Index map was only allowed up to CLF v2 diff --git a/tests/data/files/clf/illegal/log_bad_param.clf b/tests/data/files/clf/illegal/log_bad_param.clf index db03820476..880fa5c723 100644 --- a/tests/data/files/clf/illegal/log_bad_param.clf +++ b/tests/data/files/clf/illegal/log_bad_param.clf @@ -1,5 +1,5 @@ - + The linToLog style may not contain the linSideBreak param. diff --git a/tests/data/files/clf/illegal/log_bad_style.clf b/tests/data/files/clf/illegal/log_bad_style.clf index dbc1ac9319..0e1b491b4d 100644 --- a/tests/data/files/clf/illegal/log_bad_style.clf +++ b/tests/data/files/clf/illegal/log_bad_style.clf @@ -1,5 +1,5 @@ - + Illegal log style value. diff --git a/tests/data/files/clf/illegal/log_missing_breakpnt.clf b/tests/data/files/clf/illegal/log_missing_breakpnt.clf index 4282f23df7..1d5e478556 100644 --- a/tests/data/files/clf/illegal/log_missing_breakpnt.clf +++ b/tests/data/files/clf/illegal/log_missing_breakpnt.clf @@ -1,5 +1,5 @@ - + The camera styles must have the linSideBreak param. - + Half-domain must have 65536 values. RGB RGB diff --git a/tests/data/files/clf/illegal/lut1d_half_domain_set_false.clf b/tests/data/files/clf/illegal/lut1d_half_domain_set_false.clf index fca07d882f..d9e650d90f 100644 --- a/tests/data/files/clf/illegal/lut1d_half_domain_set_false.clf +++ b/tests/data/files/clf/illegal/lut1d_half_domain_set_false.clf @@ -1,5 +1,5 @@ - + The only legal value for halfDomain is "true". RGB RGB diff --git a/tests/data/files/clf/illegal/lut1d_raw_half_set_false.clf b/tests/data/files/clf/illegal/lut1d_raw_half_set_false.clf index 94daa1e6f9..3ea1d67594 100644 --- a/tests/data/files/clf/illegal/lut1d_raw_half_set_false.clf +++ b/tests/data/files/clf/illegal/lut1d_raw_half_set_false.clf @@ -1,5 +1,5 @@ - + The only legal value for rawHhalfs is "true". RGB RGB diff --git a/tests/data/files/clf/illegal/lut3d_unequal_size.clf b/tests/data/files/clf/illegal/lut3d_unequal_size.clf index 1be11cfab9..3c4c11361e 100644 --- a/tests/data/files/clf/illegal/lut3d_unequal_size.clf +++ b/tests/data/files/clf/illegal/lut3d_unequal_size.clf @@ -1,5 +1,5 @@ - + Lut3d must have equal grid dimensions diff --git a/tests/data/files/clf/illegal/matrix_end_missing.clf b/tests/data/files/clf/illegal/matrix_end_missing.clf index b00cddd8cd..1c19332dc0 100644 --- a/tests/data/files/clf/illegal/matrix_end_missing.clf +++ b/tests/data/files/clf/illegal/matrix_end_missing.clf @@ -1,5 +1,5 @@ - + The Matrix element is not complete. diff --git a/tests/data/files/clf/illegal/process_list_missing.clf b/tests/data/files/clf/illegal/process_list_missing.clf index 0dbe66c238..10e25f4e93 100644 --- a/tests/data/files/clf/illegal/process_list_missing.clf +++ b/tests/data/files/clf/illegal/process_list_missing.clf @@ -1,4 +1,4 @@ - + Missing ProcesssList element 3.24000 -1.53700 -0.49850 diff --git a/tests/data/files/clf/illegal/range_bad_noclamp.clf b/tests/data/files/clf/illegal/range_bad_noclamp.clf index 3751a6bfb6..977f996977 100644 --- a/tests/data/files/clf/illegal/range_bad_noclamp.clf +++ b/tests/data/files/clf/illegal/range_bad_noclamp.clf @@ -1,8 +1,8 @@ - + The noClamp style may not be used when there are only two values. - 0.1 1e-1 + 0.1 diff --git a/tests/data/files/clf/illegal/range_bad_values.clf b/tests/data/files/clf/illegal/range_bad_values.clf index 8987272907..6a2416dc87 100644 --- a/tests/data/files/clf/illegal/range_bad_values.clf +++ b/tests/data/files/clf/illegal/range_bad_values.clf @@ -1,5 +1,5 @@ - + Illegal values -- the minInValue must be less than the maxInValue. 240 diff --git a/tests/data/files/clf/illegal/range_empty.clf b/tests/data/files/clf/illegal/range_empty.clf index f4bb850cfa..904436b8a2 100644 --- a/tests/data/files/clf/illegal/range_empty.clf +++ b/tests/data/files/clf/illegal/range_empty.clf @@ -1,5 +1,5 @@ - + Starting in CLF v3, a Range may not be empty diff --git a/tests/data/files/clf/illegal/range_nonmatching_clamp.clf b/tests/data/files/clf/illegal/range_nonmatching_clamp.clf index b8fee78a67..5c2a9b3c8a 100644 --- a/tests/data/files/clf/illegal/range_nonmatching_clamp.clf +++ b/tests/data/files/clf/illegal/range_nonmatching_clamp.clf @@ -1,5 +1,5 @@ - + If there is only a min or only a max, the InValue must equal OutValue. Since the bit-depths are different, they are not actually the same here. diff --git a/tests/data/files/clf/illegal/transform_bad_outdepth.clf b/tests/data/files/clf/illegal/transform_bad_outdepth.clf index 8d65b6db95..27ec7b4337 100644 --- a/tests/data/files/clf/illegal/transform_bad_outdepth.clf +++ b/tests/data/files/clf/illegal/transform_bad_outdepth.clf @@ -1,5 +1,5 @@ - + The outBitDepth is illegal diff --git a/tests/data/files/clf/illegal/transform_bitdepth_mismatch.clf b/tests/data/files/clf/illegal/transform_bitdepth_mismatch.clf index 1153df6a4e..ca5892b92c 100644 --- a/tests/data/files/clf/illegal/transform_bitdepth_mismatch.clf +++ b/tests/data/files/clf/illegal/transform_bitdepth_mismatch.clf @@ -1,14 +1,14 @@ - + All bit-depths in a file must match at adjacent ops - + 3.24000 -1.53700 -0.49850 -0.96930 1.87600 0.04156 0.05560 -0.20400 1.05730 - Note in-depth does not == out-depth of previous + Note in-depth does not == out-depth of previous 0.00000 0.00000 1e-2 0.28358 0.28358 1e+2 diff --git a/tests/data/files/clf/illegal/transform_corrupted_tag.clf b/tests/data/files/clf/illegal/transform_corrupted_tag.clf index 1f82247b18..11d606530f 100644 --- a/tests/data/files/clf/illegal/transform_corrupted_tag.clf +++ b/tests/data/files/clf/illegal/transform_corrupted_tag.clf @@ -1,6 +1,7 @@ - + Note closing element is bad + ProcessList is not spelled correctly 3.24000 -1.53700 -0.49850 @@ -8,5 +9,4 @@ 0.05560 -0.20400 1.05730 - ProcessList is not spelled correctly diff --git a/tests/data/files/clf/illegal/transform_element_end_missing.clf b/tests/data/files/clf/illegal/transform_element_end_missing.clf index 136c8453cb..c7464ce1cc 100644 --- a/tests/data/files/clf/illegal/transform_element_end_missing.clf +++ b/tests/data/files/clf/illegal/transform_element_end_missing.clf @@ -1,6 +1,7 @@ - + ProcessList must have an end tag + Note closing element is missing 3.24000 -1.53700 -0.49850 @@ -8,4 +9,3 @@ 0.05560 -0.20400 1.05730 - Note closing element is missing diff --git a/tests/data/files/clf/illegal/transform_empty.clf b/tests/data/files/clf/illegal/transform_empty.clf index b07de5aa5b..2d12809949 100644 --- a/tests/data/files/clf/illegal/transform_empty.clf +++ b/tests/data/files/clf/illegal/transform_empty.clf @@ -1,4 +1,4 @@ - - There must be at least on process node + + There must be at least one process node diff --git a/tests/data/files/clf/illegal/transform_id_empty.clf b/tests/data/files/clf/illegal/transform_id_empty.clf deleted file mode 100644 index bda57d36ef..0000000000 --- a/tests/data/files/clf/illegal/transform_id_empty.clf +++ /dev/null @@ -1,5 +0,0 @@ - - - The id string must not be empty - - diff --git a/tests/data/files/clf/illegal/transform_missing_id.clf b/tests/data/files/clf/illegal/transform_missing_id.clf deleted file mode 100644 index a72ed5577b..0000000000 --- a/tests/data/files/clf/illegal/transform_missing_id.clf +++ /dev/null @@ -1,5 +0,0 @@ - - - The ProcessList id attribute is missing - - diff --git a/tests/data/files/clf/illegal/transform_missing_inbitdepth.clf b/tests/data/files/clf/illegal/transform_missing_inbitdepth.clf index 011ff246d7..94fa26d73c 100644 --- a/tests/data/files/clf/illegal/transform_missing_inbitdepth.clf +++ b/tests/data/files/clf/illegal/transform_missing_inbitdepth.clf @@ -1,5 +1,5 @@ - + The inBitDepth is missing diff --git a/tests/data/files/clf/illegal/transform_missing_outbitdepth.clf b/tests/data/files/clf/illegal/transform_missing_outbitdepth.clf index 26d7cd176d..fdc4dfd7ba 100644 --- a/tests/data/files/clf/illegal/transform_missing_outbitdepth.clf +++ b/tests/data/files/clf/illegal/transform_missing_outbitdepth.clf @@ -1,5 +1,5 @@ - + The outBitDepth is missing diff --git a/tests/data/files/clf/illegal/unknown_elements.clf b/tests/data/files/clf/illegal/unknown_elements.clf index adc9dd3886..000826cfad 100644 --- a/tests/data/files/clf/illegal/unknown_elements.clf +++ b/tests/data/files/clf/illegal/unknown_elements.clf @@ -1,10 +1,10 @@ - + This example contains unknown elements See section 5.4 of the spec: Unrecognized elements that are not children of the Info element should either raise an error or at least provide a warning message - + 3.24000 -1.53700 -0.49850 -0.96930 1.87600 0.04156 0.05560 -0.20400 1.05730 diff --git a/tests/data/files/clf/info_example.clf b/tests/data/files/clf/info_example.clf index c4cf5b602c..f521f15bef 100644 --- a/tests/data/files/clf/info_example.clf +++ b/tests/data/files/clf/info_example.clf @@ -1,9 +1,9 @@ - + Example of using the Info element + A second description input desc output desc - A second description diff --git a/tests/data/files/clf/inverseOf_id_test.clf b/tests/data/files/clf/inverseOf_id_test.clf index 31752d8aaa..dd27a8828b 100644 --- a/tests/data/files/clf/inverseOf_id_test.clf +++ b/tests/data/files/clf/inverseOf_id_test.clf @@ -1,5 +1,5 @@ - + The inverseOf attribute is used to identify inverse pairs RGB RGB diff --git a/tests/data/files/clf/log_all_styles.clf b/tests/data/files/clf/log_all_styles.clf index df9f7eb44d..ca80d2c3bd 100644 --- a/tests/data/files/clf/log_all_styles.clf +++ b/tests/data/files/clf/log_all_styles.clf @@ -1,5 +1,5 @@ - + Test all Logarithmic style values diff --git a/tests/data/files/clf/lut1d_32f_example.clf b/tests/data/files/clf/lut1d_32f_example.clf index c8c97728ce..bffd267de2 100644 --- a/tests/data/files/clf/lut1d_32f_example.clf +++ b/tests/data/files/clf/lut1d_32f_example.clf @@ -1,5 +1,5 @@ - + Basic Lut1D example, formula: 1.25 - 1.5 * x^2.2 1D LUT diff --git a/tests/data/files/clf/lut1d_comp.clf b/tests/data/files/clf/lut1d_comp.clf index 41fc81de11..91d31f516e 100644 --- a/tests/data/files/clf/lut1d_comp.clf +++ b/tests/data/files/clf/lut1d_comp.clf @@ -1,5 +1,5 @@ - + Two Lut1D ops Linear spacing between 64 and 196 diff --git a/tests/data/files/clf/lut1d_example.clf b/tests/data/files/clf/lut1d_example.clf index ebd7677407..a6e54f9c27 100644 --- a/tests/data/files/clf/lut1d_example.clf +++ b/tests/data/files/clf/lut1d_example.clf @@ -1,5 +1,5 @@ - + 1D LUT with legal out of range values Note that the bit-depth does not constrain the legal range of values. diff --git a/tests/data/files/clf/lut1d_half_domain_raw_half_set.clf b/tests/data/files/clf/lut1d_half_domain_raw_half_set.clf index f6a35d0189..288eaa61fd 100644 --- a/tests/data/files/clf/lut1d_half_domain_raw_half_set.clf +++ b/tests/data/files/clf/lut1d_half_domain_raw_half_set.clf @@ -1,10 +1,10 @@ - + + Lut1D testing half-domain layout and raw-halfs value encoding + Function is sign(x)*(abs(x)^0.45) - 0.1 None - Lut1D testing half-domain layout and raw-halfs value encoding - Function is sign(x)*(abs(x)^0.45) - 0.1 44646 diff --git a/tests/data/files/clf/lut1d_long.clf b/tests/data/files/clf/lut1d_long.clf index f0c5f7ee21..3f5bcf254f 100644 --- a/tests/data/files/clf/lut1d_long.clf +++ b/tests/data/files/clf/lut1d_long.clf @@ -1,5 +1,5 @@ - + Very long Lut1D test (x^2.2 * 1.3 - 0.007) Also demonstrates repeating quantized values diff --git a/tests/data/files/clf/lut1d_lut3d_lut1d.clf b/tests/data/files/clf/lut1d_lut3d_lut1d.clf new file mode 100644 index 0000000000..34bdc0a1de --- /dev/null +++ b/tests/data/files/clf/lut1d_lut3d_lut1d.clf @@ -0,0 +1,65601 @@ + + + Lut1D + Lut3D + long Lut1D + Tests usage of 1D, 3D, and 2D GPU textures + + +-1023.75 -814.57901062 -609.35459116 -408.06413206 -210.69486002 -17.23383306 172.33206451 +358.01612748 539.83183532 717.79285803 891.91306235 1062.20651821 1228.68750559 1391.3705217 +1550.27028852 1705.40176087 1856.7801348 2004.42085656 2148.33963205 2288.55243686 2425.07552692 +2557.92544981 2687.11905684 2812.6735158 2934.60632479 3052.93532674 3167.6787252 3278.85510108 +3386.48343078 3490.58310562 3591.17395287 3688.27625839 3781.91079124 3872.09883039 3958.86219376 +4042.22326999 4122.20505311 4198.83118074 4272.12597606 4342.11449427 4408.8225741 4472.27689524 +4532.50504253 4589.53557817 4643.39812331 4694.12345067 4741.7435906 4786.29195292 4827.80346844 +4866.31475423 4901.86430878 4934.49274476 4964.24306987 4991.16103051 5015.295539 5036.69921448 +5055.42908327 5071.54750984 5085.12347624 5096.23441517 5104.96898507 5111.4316027 5115.75073242 +5118.09724648 5118.75 + + + + +-60 5 75 +-10 50 400 + 0 100 1200 + +-40 500 -30 +-80 400 500 +-20 300 900 + +-30 1500 -20 +-50 1023 100 +-10 800 300 + + +100 -5 -75 +200 -50 600 +300 100 1200 + +40 600 30 +380 400 400 +20 200 1100 + +530 1500 -50 +450 1230 500 +610 1800 300 + + +1660 -50 -100 +1510 150 200 +900 -40 900 + +1240 300 -50 +980 500 600 +820 400 800 + +1030 -100 -50 +1050 823 200 +1110 900 1200 + + + + +44646 +44637 +44634 +44631 +44629 +44627 +44626 +44624 +44623 +44622 +44621 +44619 +44618 +44617 +44616 +44615 +44614 +44614 +44613 +44612 +44611 +44610 +44609 +44609 +44608 +44607 +44607 +44606 +44605 +44605 +44604 +44603 +44603 +44602 +44601 +44601 +44600 +44600 +44599 +44599 +44598 +44598 +44597 +44596 +44596 +44595 +44595 +44594 +44594 +44593 +44593 +44592 +44592 +44592 +44591 +44591 +44590 +44590 +44589 +44589 +44588 +44588 +44588 +44587 +44587 +44586 +44586 +44585 +44585 +44585 +44584 +44584 +44583 +44583 +44583 +44582 +44582 +44582 +44581 +44581 +44580 +44580 +44580 +44579 +44579 +44579 +44578 +44578 +44577 +44577 +44577 +44576 +44576 +44576 +44575 +44575 +44575 +44574 +44574 +44574 +44573 +44573 +44573 +44572 +44572 +44572 +44571 +44571 +44571 +44571 +44570 +44570 +44570 +44569 +44569 +44569 +44568 +44568 +44568 +44567 +44567 +44567 +44567 +44566 +44566 +44566 +44565 +44565 +44565 +44565 +44564 +44564 +44564 +44563 +44563 +44563 +44563 +44562 +44562 +44562 +44561 +44561 +44561 +44561 +44560 +44560 +44560 +44560 +44559 +44559 +44559 +44559 +44558 +44558 +44558 +44557 +44557 +44557 +44557 +44556 +44556 +44556 +44556 +44555 +44555 +44555 +44555 +44554 +44554 +44554 +44554 +44553 +44553 +44553 +44553 +44553 +44552 +44552 +44552 +44552 +44551 +44551 +44551 +44551 +44550 +44550 +44550 +44550 +44549 +44549 +44549 +44549 +44549 +44548 +44548 +44548 +44548 +44547 +44547 +44547 +44547 +44546 +44546 +44546 +44546 +44546 +44545 +44545 +44545 +44545 +44544 +44544 +44544 +44544 +44544 +44543 +44543 +44543 +44543 +44543 +44542 +44542 +44542 +44542 +44541 +44541 +44541 +44541 +44541 +44540 +44540 +44540 +44540 +44540 +44539 +44539 +44539 +44539 +44539 +44538 +44538 +44538 +44538 +44538 +44537 +44537 +44537 +44537 +44537 +44536 +44536 +44536 +44536 +44536 +44535 +44535 +44535 +44535 +44535 +44534 +44534 +44534 +44534 +44534 +44533 +44533 +44533 +44533 +44533 +44532 +44532 +44532 +44532 +44532 +44532 +44531 +44531 +44531 +44531 +44531 +44530 +44530 +44530 +44530 +44530 +44529 +44529 +44529 +44529 +44529 +44529 +44528 +44528 +44528 +44528 +44528 +44527 +44527 +44527 +44527 +44527 +44527 +44526 +44526 +44526 +44526 +44526 +44525 +44525 +44525 +44525 +44525 +44525 +44524 +44524 +44524 +44524 +44524 +44524 +44523 +44523 +44523 +44523 +44523 +44523 +44522 +44522 +44522 +44522 +44522 +44521 +44521 +44521 +44521 +44521 +44521 +44520 +44520 +44520 +44520 +44520 +44520 +44519 +44519 +44519 +44519 +44519 +44519 +44518 +44518 +44518 +44518 +44518 +44518 +44517 +44517 +44517 +44517 +44517 +44517 +44516 +44516 +44516 +44516 +44516 +44516 +44516 +44515 +44515 +44515 +44515 +44515 +44515 +44514 +44514 +44514 +44514 +44514 +44514 +44513 +44513 +44513 +44513 +44513 +44513 +44513 +44512 +44512 +44512 +44512 +44512 +44512 +44511 +44511 +44511 +44511 +44511 +44511 +44510 +44510 +44510 +44510 +44510 +44510 +44510 +44509 +44509 +44509 +44509 +44509 +44509 +44509 +44508 +44508 +44508 +44508 +44508 +44508 +44507 +44507 +44507 +44507 +44507 +44507 +44507 +44506 +44506 +44506 +44506 +44506 +44506 +44506 +44505 +44505 +44505 +44505 +44505 +44505 +44505 +44504 +44504 +44504 +44504 +44504 +44504 +44503 +44503 +44503 +44503 +44503 +44503 +44503 +44502 +44502 +44502 +44502 +44502 +44502 +44502 +44501 +44501 +44501 +44501 +44501 +44501 +44501 +44500 +44500 +44500 +44500 +44500 +44500 +44500 +44500 +44499 +44499 +44499 +44499 +44499 +44499 +44499 +44498 +44498 +44498 +44498 +44498 +44498 +44498 +44497 +44497 +44497 +44497 +44497 +44497 +44497 +44496 +44496 +44496 +44496 +44496 +44496 +44496 +44496 +44495 +44495 +44495 +44495 +44495 +44495 +44495 +44494 +44494 +44494 +44494 +44494 +44494 +44494 +44494 +44493 +44493 +44493 +44493 +44493 +44493 +44493 +44492 +44492 +44492 +44492 +44492 +44492 +44492 +44492 +44491 +44491 +44491 +44491 +44491 +44491 +44491 +44490 +44490 +44490 +44490 +44490 +44490 +44490 +44490 +44489 +44489 +44489 +44489 +44489 +44489 +44489 +44489 +44488 +44488 +44488 +44488 +44488 +44488 +44488 +44488 +44487 +44487 +44487 +44487 +44487 +44487 +44487 +44487 +44486 +44486 +44486 +44486 +44486 +44486 +44486 +44486 +44485 +44485 +44485 +44485 +44485 +44485 +44485 +44485 +44484 +44484 +44484 +44484 +44484 +44484 +44484 +44484 +44483 +44483 +44483 +44483 +44483 +44483 +44483 +44483 +44482 +44482 +44482 +44482 +44482 +44482 +44482 +44482 +44481 +44481 +44481 +44481 +44481 +44481 +44481 +44481 +44480 +44480 +44480 +44480 +44480 +44480 +44480 +44480 +44480 +44479 +44479 +44479 +44479 +44479 +44479 +44479 +44479 +44478 +44478 +44478 +44478 +44478 +44478 +44478 +44478 +44478 +44477 +44477 +44477 +44477 +44477 +44477 +44477 +44477 +44476 +44476 +44476 +44476 +44476 +44476 +44476 +44476 +44476 +44475 +44475 +44475 +44475 +44475 +44475 +44475 +44475 +44474 +44474 +44474 +44474 +44474 +44474 +44474 +44474 +44474 +44473 +44473 +44473 +44473 +44473 +44473 +44473 +44473 +44473 +44472 +44472 +44472 +44472 +44472 +44472 +44472 +44472 +44472 +44471 +44471 +44471 +44471 +44471 +44471 +44471 +44471 +44471 +44470 +44470 +44470 +44470 +44470 +44470 +44470 +44470 +44469 +44469 +44469 +44469 +44469 +44469 +44469 +44469 +44469 +44468 +44468 +44468 +44468 +44468 +44468 +44468 +44468 +44468 +44468 +44467 +44467 +44467 +44467 +44467 +44467 +44467 +44467 +44467 +44466 +44466 +44466 +44466 +44466 +44466 +44466 +44466 +44466 +44465 +44465 +44465 +44465 +44465 +44465 +44465 +44465 +44465 +44464 +44464 +44464 +44464 +44464 +44464 +44464 +44464 +44464 +44463 +44463 +44463 +44463 +44463 +44463 +44463 +44463 +44463 +44463 +44462 +44462 +44462 +44462 +44462 +44462 +44462 +44462 +44462 +44461 +44461 +44461 +44461 +44461 +44461 +44461 +44461 +44461 +44461 +44460 +44460 +44460 +44460 +44460 +44460 +44460 +44460 +44460 +44459 +44459 +44459 +44459 +44459 +44459 +44459 +44459 +44459 +44459 +44458 +44458 +44458 +44458 +44458 +44458 +44458 +44458 +44458 +44458 +44457 +44457 +44457 +44457 +44457 +44457 +44457 +44457 +44457 +44457 +44456 +44456 +44456 +44456 +44456 +44456 +44456 +44456 +44456 +44455 +44455 +44455 +44455 +44455 +44455 +44455 +44455 +44455 +44455 +44454 +44454 +44454 +44454 +44454 +44454 +44454 +44454 +44454 +44454 +44453 +44453 +44453 +44453 +44453 +44453 +44453 +44453 +44453 +44453 +44452 +44452 +44452 +44452 +44452 +44452 +44452 +44452 +44452 +44452 +44451 +44451 +44451 +44451 +44451 +44451 +44451 +44451 +44451 +44451 +44450 +44450 +44450 +44450 +44450 +44450 +44450 +44450 +44450 +44450 +44450 +44449 +44449 +44449 +44449 +44449 +44449 +44449 +44449 +44449 +44449 +44448 +44448 +44448 +44448 +44448 +44448 +44448 +44448 +44448 +44448 +44447 +44447 +44447 +44447 +44447 +44447 +44447 +44447 +44447 +44447 +44447 +44446 +44446 +44446 +44446 +44446 +44446 +44446 +44446 +44446 +44446 +44445 +44445 +44445 +44445 +44445 +44445 +44445 +44445 +44445 +44445 +44445 +44444 +44444 +44444 +44444 +44444 +44444 +44444 +44444 +44444 +44444 +44443 +44443 +44443 +44443 +44443 +44443 +44443 +44443 +44443 +44443 +44443 +44442 +44442 +44442 +44442 +44442 +44442 +44442 +44442 +44442 +44442 +44442 +44441 +44441 +44441 +44441 +44441 +44441 +44441 +44441 +44441 +44441 +44440 +44440 +44440 +44440 +44440 +44440 +44440 +44440 +44440 +44440 +44440 +44439 +44439 +44439 +44439 +44439 +44439 +44439 +44439 +44439 +44439 +44439 +44438 +44438 +44438 +44438 +44438 +44438 +44438 +44438 +44438 +44438 +44438 +44437 +44437 +44437 +44437 +44437 +44437 +44437 +44437 +44437 +44437 +44437 +44436 +44436 +44436 +44436 +44436 +44436 +44436 +44436 +44436 +44436 +44436 +44435 +44435 +44435 +44435 +44435 +44435 +44435 +44435 +44435 +44435 +44435 +44434 +44434 +44434 +44434 +44434 +44434 +44434 +44434 +44434 +44434 +44434 +44434 +44433 +44433 +44433 +44433 +44433 +44433 +44433 +44433 +44433 +44433 +44433 +44432 +44432 +44432 +44432 +44432 +44432 +44432 +44432 +44432 +44432 +44432 +44431 +44431 +44431 +44431 +44431 +44431 +44431 +44431 +44431 +44431 +44431 +44431 +44430 +44430 +44430 +44430 +44430 +44430 +44430 +44430 +44430 +44430 +44430 +44429 +44429 +44429 +44429 +44429 +44429 +44429 +44429 +44429 +44429 +44429 +44429 +44428 +44428 +44428 +44428 +44428 +44428 +44428 +44428 +44428 +44428 +44428 +44427 +44427 +44427 +44427 +44427 +44427 +44427 +44427 +44427 +44427 +44427 +44427 +44426 +44426 +44426 +44426 +44426 +44426 +44426 +44426 +44426 +44426 +44426 +44426 +44425 +44425 +44425 +44425 +44425 +44425 +44425 +44425 +44425 +44425 +44425 +44425 +44424 +44424 +44424 +44424 +44424 +44424 +44424 +44424 +44424 +44424 +44424 +44423 +44423 +44423 +44423 +44423 +44423 +44423 +44423 +44423 +44423 +44423 +44423 +44422 +44422 +44422 +44422 +44422 +44422 +44422 +44422 +44422 +44422 +44422 +44422 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44421 +44420 +44420 +44420 +44420 +44420 +44420 +44420 +44420 +44420 +44420 +44420 +44420 +44419 +44419 +44419 +44419 +44419 +44419 +44419 +44419 +44419 +44419 +44419 +44419 +44418 +44418 +44418 +44418 +44418 +44418 +44418 +44418 +44418 +44418 +44418 +44418 +44417 +44417 +44417 +44417 +44417 +44417 +44417 +44417 +44417 +44417 +44417 +44417 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44416 +44415 +44415 +44415 +44415 +44415 +44415 +44415 +44415 +44415 +44415 +44415 +44415 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44414 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44413 +44412 +44412 +44412 +44412 +44412 +44412 +44412 +44412 +44412 +44412 +44412 +44412 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44411 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44410 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44409 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44408 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44407 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44406 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44405 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44404 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44403 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44402 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44401 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44400 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44399 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44398 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44397 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44396 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44395 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44394 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44393 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44392 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44391 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44390 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44389 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44388 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44387 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44386 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44385 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44384 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44383 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44382 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44381 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44380 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44379 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44378 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44377 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44376 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44375 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44374 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44373 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44372 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44371 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44370 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44369 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44368 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44367 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44366 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44365 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44364 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44363 +44362 +44362 +44362 +44362 +44362 +44362 +44362 +44362 +44362 +44361 +44361 +44361 +44361 +44361 +44361 +44361 +44361 +44360 +44360 +44360 +44360 +44360 +44360 +44360 +44360 +44359 +44359 +44359 +44359 +44359 +44359 +44359 +44359 +44359 +44358 +44358 +44358 +44358 +44358 +44358 +44358 +44358 +44357 +44357 +44357 +44357 +44357 +44357 +44357 +44357 +44356 +44356 +44356 +44356 +44356 +44356 +44356 +44356 +44355 +44355 +44355 +44355 +44355 +44355 +44355 +44355 +44354 +44354 +44354 +44354 +44354 +44354 +44354 +44354 +44354 +44353 +44353 +44353 +44353 +44353 +44353 +44353 +44353 +44352 +44352 +44352 +44352 +44352 +44352 +44352 +44352 +44351 +44351 +44351 +44351 +44351 +44351 +44351 +44351 +44351 +44350 +44350 +44350 +44350 +44350 +44350 +44350 +44350 +44349 +44349 +44349 +44349 +44349 +44349 +44349 +44349 +44349 +44348 +44348 +44348 +44348 +44348 +44348 +44348 +44348 +44347 +44347 +44347 +44347 +44347 +44347 +44347 +44347 +44347 +44346 +44346 +44346 +44346 +44346 +44346 +44346 +44346 +44345 +44345 +44345 +44345 +44345 +44345 +44345 +44345 +44345 +44344 +44344 +44344 +44344 +44344 +44344 +44344 +44344 +44344 +44343 +44343 +44343 +44343 +44343 +44343 +44343 +44343 +44342 +44342 +44342 +44342 +44342 +44342 +44342 +44342 +44342 +44341 +44341 +44341 +44341 +44341 +44341 +44341 +44341 +44341 +44340 +44340 +44340 +44340 +44340 +44340 +44340 +44340 +44340 +44339 +44339 +44339 +44339 +44339 +44339 +44339 +44339 +44338 +44338 +44338 +44338 +44338 +44338 +44338 +44338 +44338 +44337 +44337 +44337 +44337 +44337 +44337 +44337 +44337 +44337 +44336 +44336 +44336 +44336 +44336 +44336 +44336 +44336 +44336 +44335 +44335 +44335 +44335 +44335 +44335 +44335 +44335 +44335 +44334 +44334 +44334 +44334 +44334 +44334 +44334 +44334 +44334 +44333 +44333 +44333 +44333 +44333 +44333 +44333 +44333 +44333 +44332 +44332 +44332 +44332 +44332 +44332 +44332 +44332 +44332 +44331 +44331 +44331 +44331 +44331 +44331 +44331 +44331 +44331 +44330 +44330 +44330 +44330 +44330 +44330 +44330 +44330 +44330 +44329 +44329 +44329 +44329 +44329 +44329 +44329 +44329 +44329 +44329 +44328 +44328 +44328 +44328 +44328 +44328 +44328 +44328 +44328 +44327 +44327 +44327 +44327 +44327 +44327 +44327 +44327 +44327 +44326 +44326 +44326 +44326 +44326 +44326 +44326 +44326 +44326 +44325 +44325 +44325 +44325 +44325 +44325 +44325 +44325 +44325 +44325 +44324 +44324 +44324 +44324 +44324 +44324 +44324 +44324 +44324 +44323 +44323 +44323 +44323 +44323 +44323 +44323 +44323 +44323 +44322 +44322 +44322 +44322 +44322 +44322 +44322 +44322 +44322 +44322 +44321 +44321 +44321 +44321 +44321 +44321 +44321 +44321 +44321 +44320 +44320 +44320 +44320 +44320 +44320 +44320 +44320 +44320 +44320 +44319 +44319 +44319 +44319 +44319 +44319 +44319 +44319 +44319 +44318 +44318 +44318 +44318 +44318 +44318 +44318 +44318 +44318 +44318 +44317 +44317 +44317 +44317 +44317 +44317 +44317 +44317 +44317 +44316 +44316 +44316 +44316 +44316 +44316 +44316 +44316 +44316 +44316 +44315 +44315 +44315 +44315 +44315 +44315 +44315 +44315 +44315 +44315 +44314 +44314 +44314 +44314 +44314 +44314 +44314 +44314 +44314 +44313 +44313 +44313 +44313 +44313 +44313 +44313 +44313 +44313 +44313 +44312 +44312 +44312 +44312 +44312 +44312 +44312 +44312 +44312 +44312 +44311 +44311 +44311 +44311 +44311 +44311 +44311 +44311 +44311 +44311 +44310 +44310 +44310 +44310 +44310 +44310 +44310 +44310 +44310 +44310 +44309 +44309 +44309 +44309 +44309 +44309 +44309 +44309 +44309 +44309 +44308 +44308 +44308 +44308 +44308 +44308 +44308 +44308 +44308 +44307 +44307 +44307 +44307 +44307 +44307 +44307 +44307 +44307 +44307 +44306 +44306 +44306 +44306 +44306 +44306 +44306 +44306 +44306 +44306 +44305 +44305 +44305 +44305 +44305 +44305 +44305 +44305 +44305 +44305 +44304 +44304 +44304 +44304 +44304 +44304 +44304 +44304 +44304 +44304 +44304 +44303 +44303 +44303 +44303 +44303 +44303 +44303 +44303 +44303 +44303 +44302 +44302 +44302 +44302 +44302 +44302 +44302 +44302 +44302 +44302 +44301 +44301 +44301 +44301 +44301 +44301 +44301 +44301 +44301 +44301 +44300 +44300 +44300 +44300 +44300 +44300 +44300 +44300 +44300 +44300 +44299 +44299 +44299 +44299 +44299 +44299 +44299 +44299 +44299 +44299 +44298 +44298 +44298 +44298 +44298 +44298 +44298 +44298 +44298 +44298 +44298 +44297 +44297 +44297 +44297 +44297 +44297 +44297 +44297 +44297 +44297 +44296 +44296 +44296 +44296 +44296 +44296 +44296 +44296 +44296 +44296 +44295 +44295 +44295 +44295 +44295 +44295 +44295 +44295 +44295 +44295 +44295 +44294 +44294 +44294 +44294 +44294 +44294 +44294 +44294 +44294 +44294 +44293 +44293 +44293 +44293 +44293 +44293 +44293 +44293 +44293 +44293 +44293 +44292 +44292 +44292 +44292 +44292 +44292 +44292 +44292 +44292 +44292 +44291 +44291 +44291 +44291 +44291 +44291 +44291 +44291 +44291 +44291 +44291 +44290 +44290 +44290 +44290 +44290 +44290 +44290 +44290 +44290 +44290 +44289 +44289 +44289 +44289 +44289 +44289 +44289 +44289 +44289 +44289 +44289 +44288 +44288 +44288 +44288 +44288 +44288 +44288 +44288 +44288 +44288 +44287 +44287 +44287 +44287 +44287 +44287 +44287 +44287 +44287 +44287 +44287 +44286 +44286 +44286 +44286 +44286 +44286 +44286 +44286 +44286 +44286 +44286 +44285 +44285 +44285 +44285 +44285 +44285 +44285 +44285 +44285 +44285 +44285 +44284 +44284 +44284 +44284 +44284 +44284 +44284 +44284 +44284 +44284 +44283 +44283 +44283 +44283 +44283 +44283 +44283 +44283 +44283 +44283 +44283 +44282 +44282 +44282 +44282 +44282 +44282 +44282 +44282 +44282 +44282 +44282 +44281 +44281 +44281 +44281 +44281 +44281 +44281 +44281 +44281 +44281 +44281 +44280 +44280 +44280 +44280 +44280 +44280 +44280 +44280 +44280 +44280 +44280 +44279 +44279 +44279 +44279 +44279 +44279 +44279 +44279 +44279 +44279 +44279 +44278 +44278 +44278 +44278 +44278 +44278 +44278 +44278 +44278 +44278 +44278 +44277 +44277 +44277 +44277 +44277 +44277 +44277 +44277 +44277 +44277 +44277 +44276 +44276 +44276 +44276 +44276 +44276 +44276 +44276 +44276 +44276 +44276 +44275 +44275 +44275 +44275 +44275 +44275 +44275 +44275 +44275 +44275 +44275 +44274 +44274 +44274 +44274 +44274 +44274 +44274 +44274 +44274 +44274 +44274 +44273 +44273 +44273 +44273 +44273 +44273 +44273 +44273 +44273 +44273 +44273 +44273 +44272 +44272 +44272 +44272 +44272 +44272 +44272 +44272 +44272 +44272 +44272 +44271 +44271 +44271 +44271 +44271 +44271 +44271 +44271 +44271 +44271 +44271 +44270 +44270 +44270 +44270 +44270 +44270 +44270 +44270 +44270 +44270 +44270 +44269 +44269 +44269 +44269 +44269 +44269 +44269 +44269 +44269 +44269 +44269 +44269 +44268 +44268 +44268 +44268 +44268 +44268 +44268 +44268 +44268 +44268 +44268 +44267 +44267 +44267 +44267 +44267 +44267 +44267 +44267 +44267 +44267 +44267 +44266 +44266 +44266 +44266 +44266 +44266 +44266 +44266 +44266 +44266 +44266 +44266 +44265 +44265 +44265 +44265 +44265 +44265 +44265 +44265 +44265 +44265 +44265 +44264 +44264 +44264 +44264 +44264 +44264 +44264 +44264 +44264 +44264 +44264 +44264 +44263 +44263 +44263 +44263 +44263 +44263 +44263 +44263 +44263 +44263 +44263 +44262 +44262 +44262 +44262 +44262 +44262 +44262 +44262 +44262 +44262 +44262 +44262 +44261 +44261 +44261 +44261 +44261 +44261 +44261 +44261 +44261 +44261 +44261 +44261 +44260 +44260 +44260 +44260 +44260 +44260 +44260 +44260 +44260 +44260 +44260 +44259 +44259 +44259 +44259 +44259 +44259 +44259 +44259 +44259 +44259 +44259 +44259 +44258 +44258 +44258 +44258 +44258 +44258 +44258 +44257 +44257 +44257 +44257 +44257 +44257 +44256 +44256 +44256 +44256 +44256 +44255 +44255 +44255 +44255 +44255 +44255 +44254 +44254 +44254 +44254 +44254 +44254 +44253 +44253 +44253 +44253 +44253 +44253 +44252 +44252 +44252 +44252 +44252 +44252 +44251 +44251 +44251 +44251 +44251 +44251 +44250 +44250 +44250 +44250 +44250 +44250 +44249 +44249 +44249 +44249 +44249 +44249 +44248 +44248 +44248 +44248 +44248 +44248 +44247 +44247 +44247 +44247 +44247 +44247 +44246 +44246 +44246 +44246 +44246 +44246 +44246 +44245 +44245 +44245 +44245 +44245 +44245 +44244 +44244 +44244 +44244 +44244 +44244 +44243 +44243 +44243 +44243 +44243 +44243 +44242 +44242 +44242 +44242 +44242 +44242 +44241 +44241 +44241 +44241 +44241 +44241 +44240 +44240 +44240 +44240 +44240 +44240 +44240 +44239 +44239 +44239 +44239 +44239 +44239 +44238 +44238 +44238 +44238 +44238 +44238 +44237 +44237 +44237 +44237 +44237 +44237 +44236 +44236 +44236 +44236 +44236 +44236 +44236 +44235 +44235 +44235 +44235 +44235 +44235 +44234 +44234 +44234 +44234 +44234 +44234 +44233 +44233 +44233 +44233 +44233 +44233 +44232 +44232 +44232 +44232 +44232 +44232 +44232 +44231 +44231 +44231 +44231 +44231 +44231 +44230 +44230 +44230 +44230 +44230 +44230 +44230 +44229 +44229 +44229 +44229 +44229 +44229 +44228 +44228 +44228 +44228 +44228 +44228 +44227 +44227 +44227 +44227 +44227 +44227 +44227 +44226 +44226 +44226 +44226 +44226 +44226 +44225 +44225 +44225 +44225 +44225 +44225 +44225 +44224 +44224 +44224 +44224 +44224 +44224 +44223 +44223 +44223 +44223 +44223 +44223 +44223 +44222 +44222 +44222 +44222 +44222 +44222 +44221 +44221 +44221 +44221 +44221 +44221 +44221 +44220 +44220 +44220 +44220 +44220 +44220 +44220 +44219 +44219 +44219 +44219 +44219 +44219 +44218 +44218 +44218 +44218 +44218 +44218 +44218 +44217 +44217 +44217 +44217 +44217 +44217 +44216 +44216 +44216 +44216 +44216 +44216 +44216 +44215 +44215 +44215 +44215 +44215 +44215 +44215 +44214 +44214 +44214 +44214 +44214 +44214 +44213 +44213 +44213 +44213 +44213 +44213 +44213 +44212 +44212 +44212 +44212 +44212 +44212 +44212 +44211 +44211 +44211 +44211 +44211 +44211 +44211 +44210 +44210 +44210 +44210 +44210 +44210 +44209 +44209 +44209 +44209 +44209 +44209 +44209 +44208 +44208 +44208 +44208 +44208 +44208 +44208 +44207 +44207 +44207 +44207 +44207 +44207 +44207 +44206 +44206 +44206 +44206 +44206 +44206 +44206 +44205 +44205 +44205 +44205 +44205 +44205 +44205 +44204 +44204 +44204 +44204 +44204 +44204 +44203 +44203 +44203 +44203 +44203 +44203 +44203 +44202 +44202 +44202 +44202 +44202 +44202 +44202 +44201 +44201 +44201 +44201 +44201 +44201 +44201 +44200 +44200 +44200 +44200 +44200 +44200 +44200 +44199 +44199 +44199 +44199 +44199 +44199 +44199 +44198 +44198 +44198 +44198 +44198 +44198 +44198 +44197 +44197 +44197 +44197 +44197 +44197 +44197 +44196 +44196 +44196 +44196 +44196 +44196 +44196 +44195 +44195 +44195 +44195 +44195 +44195 +44195 +44194 +44194 +44194 +44194 +44194 +44194 +44194 +44193 +44193 +44193 +44193 +44193 +44193 +44193 +44192 +44192 +44192 +44192 +44192 +44192 +44192 +44192 +44191 +44191 +44191 +44191 +44191 +44191 +44191 +44190 +44190 +44190 +44190 +44190 +44190 +44190 +44189 +44189 +44189 +44189 +44189 +44189 +44189 +44188 +44188 +44188 +44188 +44188 +44188 +44188 +44187 +44187 +44187 +44187 +44187 +44187 +44187 +44186 +44186 +44186 +44186 +44186 +44186 +44186 +44186 +44185 +44185 +44185 +44185 +44185 +44185 +44185 +44184 +44184 +44184 +44184 +44184 +44184 +44184 +44183 +44183 +44183 +44183 +44183 +44183 +44183 +44182 +44182 +44182 +44182 +44182 +44182 +44182 +44182 +44181 +44181 +44181 +44181 +44181 +44181 +44181 +44180 +44180 +44180 +44180 +44180 +44180 +44180 +44179 +44179 +44179 +44179 +44179 +44179 +44179 +44179 +44178 +44178 +44178 +44178 +44178 +44178 +44178 +44177 +44177 +44177 +44177 +44177 +44177 +44177 +44177 +44176 +44176 +44176 +44176 +44176 +44176 +44176 +44175 +44175 +44175 +44175 +44175 +44175 +44175 +44174 +44174 +44174 +44174 +44174 +44174 +44174 +44174 +44173 +44173 +44173 +44173 +44173 +44173 +44173 +44172 +44172 +44172 +44172 +44172 +44172 +44172 +44172 +44171 +44171 +44171 +44171 +44171 +44171 +44171 +44170 +44170 +44170 +44170 +44170 +44170 +44170 +44170 +44169 +44169 +44169 +44169 +44169 +44169 +44169 +44168 +44168 +44168 +44168 +44168 +44168 +44168 +44168 +44167 +44167 +44167 +44167 +44167 +44167 +44167 +44167 +44166 +44166 +44166 +44166 +44166 +44166 +44166 +44165 +44165 +44165 +44165 +44165 +44165 +44165 +44165 +44164 +44164 +44164 +44164 +44164 +44164 +44164 +44163 +44163 +44163 +44163 +44163 +44163 +44163 +44163 +44162 +44162 +44162 +44162 +44162 +44162 +44162 +44162 +44161 +44161 +44161 +44161 +44161 +44161 +44161 +44161 +44160 +44160 +44160 +44160 +44160 +44160 +44160 +44159 +44159 +44159 +44159 +44159 +44159 +44159 +44159 +44158 +44158 +44158 +44158 +44158 +44158 +44158 +44158 +44157 +44157 +44157 +44157 +44157 +44157 +44157 +44157 +44156 +44156 +44156 +44156 +44156 +44156 +44156 +44155 +44155 +44155 +44155 +44155 +44155 +44155 +44155 +44154 +44154 +44154 +44154 +44154 +44154 +44154 +44154 +44153 +44153 +44153 +44153 +44153 +44153 +44153 +44153 +44152 +44152 +44152 +44152 +44152 +44152 +44152 +44152 +44151 +44151 +44151 +44151 +44151 +44151 +44151 +44151 +44150 +44150 +44150 +44150 +44150 +44150 +44150 +44150 +44149 +44149 +44149 +44149 +44149 +44149 +44149 +44149 +44148 +44148 +44148 +44148 +44148 +44148 +44148 +44148 +44147 +44147 +44147 +44147 +44147 +44147 +44147 +44147 +44146 +44146 +44146 +44146 +44146 +44146 +44146 +44146 +44145 +44145 +44145 +44145 +44145 +44145 +44145 +44145 +44144 +44144 +44144 +44144 +44144 +44144 +44144 +44144 +44143 +44143 +44143 +44143 +44143 +44143 +44143 +44143 +44142 +44142 +44142 +44142 +44142 +44142 +44142 +44142 +44141 +44141 +44141 +44141 +44141 +44141 +44141 +44141 +44140 +44140 +44140 +44140 +44140 +44140 +44140 +44140 +44139 +44139 +44139 +44139 +44139 +44139 +44139 +44139 +44138 +44138 +44138 +44138 +44138 +44138 +44138 +44138 +44137 +44137 +44137 +44137 +44137 +44137 +44137 +44137 +44136 +44136 +44136 +44136 +44136 +44136 +44136 +44136 +44136 +44135 +44135 +44135 +44135 +44135 +44135 +44135 +44135 +44134 +44134 +44134 +44134 +44134 +44134 +44134 +44134 +44133 +44133 +44133 +44133 +44133 +44133 +44133 +44133 +44132 +44132 +44132 +44132 +44132 +44132 +44132 +44132 +44132 +44131 +44131 +44131 +44131 +44131 +44131 +44131 +44131 +44130 +44130 +44130 +44130 +44130 +44130 +44130 +44130 +44129 +44129 +44129 +44129 +44129 +44129 +44129 +44129 +44129 +44128 +44128 +44128 +44128 +44128 +44128 +44128 +44128 +44127 +44127 +44127 +44127 +44127 +44127 +44127 +44127 +44126 +44126 +44126 +44126 +44126 +44126 +44126 +44126 +44126 +44125 +44125 +44125 +44125 +44125 +44125 +44125 +44125 +44124 +44124 +44124 +44124 +44124 +44124 +44124 +44124 +44124 +44123 +44123 +44123 +44123 +44123 +44123 +44123 +44123 +44122 +44122 +44122 +44122 +44122 +44122 +44122 +44122 +44121 +44121 +44121 +44121 +44121 +44121 +44121 +44121 +44121 +44120 +44120 +44120 +44120 +44120 +44120 +44120 +44120 +44120 +44119 +44119 +44119 +44119 +44119 +44119 +44119 +44119 +44118 +44118 +44118 +44118 +44118 +44118 +44118 +44118 +44118 +44117 +44117 +44117 +44117 +44117 +44117 +44117 +44117 +44116 +44116 +44116 +44116 +44116 +44115 +44115 +44115 +44115 +44114 +44114 +44114 +44114 +44114 +44113 +44113 +44113 +44113 +44112 +44112 +44112 +44112 +44111 +44111 +44111 +44111 +44111 +44110 +44110 +44110 +44110 +44109 +44109 +44109 +44109 +44108 +44108 +44108 +44108 +44108 +44107 +44107 +44107 +44107 +44106 +44106 +44106 +44106 +44106 +44105 +44105 +44105 +44105 +44104 +44104 +44104 +44104 +44103 +44103 +44103 +44103 +44103 +44102 +44102 +44102 +44102 +44101 +44101 +44101 +44101 +44101 +44100 +44100 +44100 +44100 +44099 +44099 +44099 +44099 +44099 +44098 +44098 +44098 +44098 +44097 +44097 +44097 +44097 +44097 +44096 +44096 +44096 +44096 +44095 +44095 +44095 +44095 +44095 +44094 +44094 +44094 +44094 +44093 +44093 +44093 +44093 +44093 +44092 +44092 +44092 +44092 +44091 +44091 +44091 +44091 +44091 +44090 +44090 +44090 +44090 +44089 +44089 +44089 +44089 +44089 +44088 +44088 +44088 +44088 +44087 +44087 +44087 +44087 +44087 +44086 +44086 +44086 +44086 +44086 +44085 +44085 +44085 +44085 +44084 +44084 +44084 +44084 +44084 +44083 +44083 +44083 +44083 +44082 +44082 +44082 +44082 +44082 +44081 +44081 +44081 +44081 +44081 +44080 +44080 +44080 +44080 +44079 +44079 +44079 +44079 +44079 +44078 +44078 +44078 +44078 +44078 +44077 +44077 +44077 +44077 +44076 +44076 +44076 +44076 +44076 +44075 +44075 +44075 +44075 +44075 +44074 +44074 +44074 +44074 +44074 +44073 +44073 +44073 +44073 +44072 +44072 +44072 +44072 +44072 +44071 +44071 +44071 +44071 +44071 +44070 +44070 +44070 +44070 +44070 +44069 +44069 +44069 +44069 +44068 +44068 +44068 +44068 +44068 +44067 +44067 +44067 +44067 +44067 +44066 +44066 +44066 +44066 +44066 +44065 +44065 +44065 +44065 +44064 +44064 +44064 +44064 +44064 +44063 +44063 +44063 +44063 +44063 +44062 +44062 +44062 +44062 +44062 +44061 +44061 +44061 +44061 +44061 +44060 +44060 +44060 +44060 +44060 +44059 +44059 +44059 +44059 +44059 +44058 +44058 +44058 +44058 +44057 +44057 +44057 +44057 +44057 +44056 +44056 +44056 +44056 +44056 +44055 +44055 +44055 +44055 +44055 +44054 +44054 +44054 +44054 +44054 +44053 +44053 +44053 +44053 +44053 +44052 +44052 +44052 +44052 +44052 +44051 +44051 +44051 +44051 +44051 +44050 +44050 +44050 +44050 +44050 +44049 +44049 +44049 +44049 +44049 +44048 +44048 +44048 +44048 +44048 +44047 +44047 +44047 +44047 +44047 +44046 +44046 +44046 +44046 +44046 +44045 +44045 +44045 +44045 +44045 +44044 +44044 +44044 +44044 +44044 +44043 +44043 +44043 +44043 +44043 +44042 +44042 +44042 +44042 +44042 +44041 +44041 +44041 +44041 +44041 +44040 +44040 +44040 +44040 +44040 +44039 +44039 +44039 +44039 +44039 +44038 +44038 +44038 +44038 +44038 +44037 +44037 +44037 +44037 +44037 +44036 +44036 +44036 +44036 +44036 +44035 +44035 +44035 +44035 +44035 +44034 +44034 +44034 +44034 +44034 +44034 +44033 +44033 +44033 +44033 +44033 +44032 +44032 +44032 +44031 +44031 +44031 +44030 +44030 +44030 +44029 +44029 +44028 +44028 +44028 +44027 +44027 +44026 +44026 +44026 +44025 +44025 +44025 +44024 +44024 +44023 +44023 +44023 +44022 +44022 +44021 +44021 +44021 +44020 +44020 +44020 +44019 +44019 +44018 +44018 +44018 +44017 +44017 +44016 +44016 +44016 +44015 +44015 +44015 +44014 +44014 +44013 +44013 +44013 +44012 +44012 +44011 +44011 +44011 +44010 +44010 +44010 +44009 +44009 +44008 +44008 +44008 +44007 +44007 +44007 +44006 +44006 +44005 +44005 +44005 +44004 +44004 +44004 +44003 +44003 +44002 +44002 +44002 +44001 +44001 +44000 +44000 +44000 +43999 +43999 +43999 +43998 +43998 +43997 +43997 +43997 +43996 +43996 +43996 +43995 +43995 +43994 +43994 +43994 +43993 +43993 +43993 +43992 +43992 +43991 +43991 +43991 +43990 +43990 +43990 +43989 +43989 +43988 +43988 +43988 +43987 +43987 +43987 +43986 +43986 +43986 +43985 +43985 +43984 +43984 +43984 +43983 +43983 +43983 +43982 +43982 +43981 +43981 +43981 +43980 +43980 +43980 +43979 +43979 +43978 +43978 +43978 +43977 +43977 +43977 +43976 +43976 +43976 +43975 +43975 +43974 +43974 +43974 +43973 +43973 +43973 +43972 +43972 +43971 +43971 +43971 +43970 +43970 +43970 +43969 +43969 +43969 +43968 +43968 +43967 +43967 +43967 +43966 +43966 +43966 +43965 +43965 +43965 +43964 +43964 +43963 +43963 +43963 +43962 +43962 +43962 +43961 +43961 +43961 +43960 +43960 +43959 +43959 +43959 +43958 +43958 +43958 +43957 +43957 +43957 +43956 +43956 +43955 +43955 +43955 +43954 +43954 +43954 +43953 +43953 +43953 +43952 +43952 +43952 +43951 +43951 +43950 +43950 +43950 +43949 +43949 +43949 +43948 +43948 +43948 +43947 +43947 +43946 +43946 +43946 +43945 +43945 +43945 +43944 +43944 +43944 +43943 +43943 +43943 +43942 +43942 +43941 +43941 +43941 +43940 +43940 +43940 +43939 +43939 +43939 +43938 +43938 +43938 +43937 +43937 +43936 +43936 +43936 +43935 +43935 +43935 +43934 +43934 +43934 +43933 +43933 +43933 +43932 +43932 +43932 +43931 +43931 +43930 +43930 +43930 +43929 +43929 +43929 +43928 +43928 +43928 +43927 +43927 +43927 +43926 +43926 +43926 +43925 +43925 +43924 +43924 +43924 +43923 +43923 +43923 +43922 +43922 +43922 +43921 +43921 +43921 +43920 +43920 +43920 +43919 +43919 +43919 +43918 +43918 +43917 +43917 +43917 +43916 +43916 +43916 +43915 +43915 +43915 +43914 +43914 +43914 +43913 +43913 +43913 +43912 +43912 +43912 +43911 +43911 +43911 +43910 +43910 +43909 +43909 +43909 +43908 +43908 +43908 +43907 +43907 +43907 +43906 +43906 +43906 +43905 +43905 +43905 +43904 +43904 +43904 +43903 +43903 +43903 +43902 +43902 +43902 +43901 +43901 +43901 +43900 +43900 +43900 +43899 +43899 +43898 +43898 +43898 +43897 +43897 +43897 +43896 +43896 +43896 +43895 +43895 +43895 +43894 +43894 +43894 +43893 +43893 +43893 +43892 +43892 +43892 +43891 +43891 +43891 +43890 +43890 +43890 +43889 +43889 +43889 +43888 +43888 +43888 +43887 +43887 +43887 +43886 +43886 +43886 +43885 +43885 +43885 +43884 +43884 +43883 +43883 +43883 +43882 +43882 +43882 +43881 +43881 +43881 +43880 +43880 +43880 +43879 +43879 +43879 +43878 +43878 +43878 +43877 +43877 +43877 +43876 +43876 +43876 +43875 +43875 +43875 +43874 +43874 +43874 +43873 +43873 +43873 +43872 +43872 +43872 +43871 +43871 +43871 +43870 +43870 +43870 +43869 +43869 +43869 +43868 +43868 +43868 +43867 +43867 +43867 +43866 +43866 +43866 +43865 +43865 +43865 +43864 +43864 +43864 +43863 +43863 +43863 +43862 +43862 +43862 +43861 +43861 +43861 +43860 +43860 +43860 +43859 +43859 +43859 +43858 +43858 +43858 +43857 +43857 +43857 +43856 +43856 +43856 +43855 +43855 +43855 +43854 +43854 +43854 +43853 +43853 +43853 +43852 +43852 +43852 +43851 +43851 +43851 +43850 +43850 +43850 +43849 +43849 +43849 +43849 +43848 +43848 +43848 +43847 +43847 +43847 +43846 +43846 +43846 +43845 +43845 +43845 +43844 +43844 +43844 +43843 +43843 +43843 +43842 +43842 +43842 +43841 +43841 +43841 +43840 +43840 +43840 +43839 +43839 +43839 +43838 +43838 +43838 +43837 +43837 +43837 +43836 +43836 +43836 +43835 +43835 +43835 +43834 +43834 +43834 +43834 +43833 +43833 +43833 +43832 +43832 +43832 +43831 +43831 +43831 +43830 +43830 +43830 +43829 +43829 +43829 +43828 +43828 +43828 +43827 +43827 +43827 +43826 +43826 +43826 +43825 +43825 +43825 +43824 +43824 +43824 +43824 +43823 +43823 +43823 +43822 +43822 +43822 +43821 +43821 +43821 +43820 +43820 +43820 +43819 +43819 +43819 +43818 +43818 +43818 +43817 +43817 +43817 +43816 +43816 +43816 +43816 +43815 +43815 +43815 +43814 +43814 +43814 +43813 +43813 +43813 +43812 +43811 +43811 +43810 +43809 +43809 +43808 +43808 +43807 +43806 +43806 +43805 +43804 +43804 +43803 +43803 +43802 +43801 +43801 +43800 +43799 +43799 +43798 +43797 +43797 +43796 +43796 +43795 +43794 +43794 +43793 +43792 +43792 +43791 +43791 +43790 +43789 +43789 +43788 +43787 +43787 +43786 +43786 +43785 +43784 +43784 +43783 +43782 +43782 +43781 +43781 +43780 +43779 +43779 +43778 +43778 +43777 +43776 +43776 +43775 +43774 +43774 +43773 +43773 +43772 +43771 +43771 +43770 +43770 +43769 +43768 +43768 +43767 +43766 +43766 +43765 +43765 +43764 +43763 +43763 +43762 +43762 +43761 +43760 +43760 +43759 +43759 +43758 +43757 +43757 +43756 +43755 +43755 +43754 +43754 +43753 +43752 +43752 +43751 +43751 +43750 +43749 +43749 +43748 +43748 +43747 +43746 +43746 +43745 +43745 +43744 +43743 +43743 +43742 +43742 +43741 +43740 +43740 +43739 +43739 +43738 +43737 +43737 +43736 +43736 +43735 +43734 +43734 +43733 +43733 +43732 +43731 +43731 +43730 +43730 +43729 +43728 +43728 +43727 +43727 +43726 +43725 +43725 +43724 +43724 +43723 +43723 +43722 +43721 +43721 +43720 +43720 +43719 +43718 +43718 +43717 +43717 +43716 +43715 +43715 +43714 +43714 +43713 +43713 +43712 +43711 +43711 +43710 +43710 +43709 +43708 +43708 +43707 +43707 +43706 +43706 +43705 +43704 +43704 +43703 +43703 +43702 +43701 +43701 +43700 +43700 +43699 +43699 +43698 +43697 +43697 +43696 +43696 +43695 +43694 +43694 +43693 +43693 +43692 +43692 +43691 +43690 +43690 +43689 +43689 +43688 +43688 +43687 +43686 +43686 +43685 +43685 +43684 +43684 +43683 +43682 +43682 +43681 +43681 +43680 +43680 +43679 +43678 +43678 +43677 +43677 +43676 +43676 +43675 +43674 +43674 +43673 +43673 +43672 +43672 +43671 +43670 +43670 +43669 +43669 +43668 +43668 +43667 +43666 +43666 +43665 +43665 +43664 +43664 +43663 +43662 +43662 +43661 +43661 +43660 +43660 +43659 +43659 +43658 +43657 +43657 +43656 +43656 +43655 +43655 +43654 +43654 +43653 +43652 +43652 +43651 +43651 +43650 +43650 +43649 +43648 +43648 +43647 +43647 +43646 +43646 +43645 +43645 +43644 +43643 +43643 +43642 +43642 +43641 +43641 +43640 +43640 +43639 +43638 +43638 +43637 +43637 +43636 +43636 +43635 +43635 +43634 +43633 +43633 +43632 +43632 +43631 +43631 +43630 +43630 +43629 +43629 +43628 +43627 +43627 +43626 +43626 +43625 +43625 +43624 +43624 +43623 +43622 +43622 +43621 +43621 +43620 +43620 +43619 +43619 +43618 +43618 +43617 +43616 +43616 +43615 +43615 +43614 +43614 +43613 +43613 +43612 +43612 +43611 +43611 +43610 +43609 +43609 +43608 +43608 +43607 +43607 +43606 +43606 +43605 +43605 +43604 +43603 +43603 +43602 +43602 +43601 +43601 +43600 +43600 +43599 +43599 +43598 +43598 +43597 +43596 +43596 +43595 +43595 +43594 +43594 +43593 +43593 +43592 +43592 +43591 +43591 +43590 +43590 +43589 +43588 +43588 +43587 +43587 +43586 +43586 +43585 +43585 +43584 +43584 +43583 +43583 +43582 +43582 +43581 +43580 +43580 +43579 +43579 +43578 +43578 +43577 +43577 +43576 +43576 +43575 +43575 +43574 +43574 +43573 +43573 +43572 +43571 +43571 +43570 +43570 +43569 +43569 +43568 +43568 +43567 +43567 +43566 +43566 +43565 +43565 +43564 +43564 +43563 +43563 +43562 +43561 +43561 +43560 +43560 +43559 +43559 +43558 +43558 +43557 +43557 +43556 +43556 +43555 +43555 +43554 +43554 +43553 +43553 +43552 +43552 +43551 +43551 +43550 +43550 +43549 +43548 +43548 +43547 +43547 +43546 +43546 +43545 +43545 +43544 +43544 +43543 +43543 +43542 +43542 +43541 +43541 +43540 +43540 +43539 +43539 +43538 +43538 +43537 +43537 +43536 +43536 +43535 +43535 +43534 +43534 +43533 +43532 +43532 +43531 +43531 +43530 +43530 +43529 +43529 +43528 +43528 +43527 +43527 +43526 +43526 +43525 +43525 +43524 +43524 +43523 +43523 +43522 +43522 +43521 +43521 +43520 +43520 +43519 +43519 +43518 +43518 +43517 +43517 +43516 +43516 +43515 +43515 +43514 +43514 +43513 +43513 +43512 +43512 +43511 +43511 +43510 +43510 +43509 +43509 +43508 +43508 +43507 +43507 +43506 +43506 +43505 +43505 +43504 +43504 +43503 +43503 +43502 +43502 +43501 +43501 +43500 +43500 +43499 +43499 +43498 +43498 +43497 +43497 +43496 +43496 +43495 +43495 +43494 +43494 +43493 +43493 +43492 +43492 +43491 +43491 +43490 +43490 +43489 +43489 +43488 +43488 +43487 +43487 +43486 +43486 +43485 +43485 +43484 +43484 +43483 +43483 +43482 +43482 +43481 +43481 +43480 +43480 +43479 +43479 +43478 +43478 +43477 +43477 +43476 +43476 +43475 +43475 +43474 +43474 +43473 +43473 +43472 +43472 +43471 +43471 +43470 +43470 +43469 +43469 +43468 +43468 +43467 +43467 +43466 +43466 +43465 +43465 +43464 +43464 +43463 +43463 +43462 +43462 +43461 +43461 +43460 +43460 +43460 +43459 +43459 +43458 +43458 +43457 +43457 +43456 +43456 +43455 +43455 +43454 +43454 +43453 +43453 +43452 +43452 +43451 +43451 +43450 +43450 +43449 +43449 +43448 +43448 +43447 +43447 +43446 +43446 +43445 +43445 +43444 +43444 +43444 +43443 +43443 +43442 +43442 +43441 +43441 +43440 +43440 +43439 +43439 +43438 +43438 +43437 +43437 +43436 +43436 +43435 +43435 +43434 +43434 +43433 +43433 +43432 +43432 +43432 +43431 +43431 +43430 +43430 +43429 +43429 +43428 +43428 +43427 +43427 +43426 +43426 +43425 +43425 +43424 +43424 +43423 +43423 +43422 +43422 +43422 +43421 +43421 +43420 +43420 +43419 +43419 +43418 +43418 +43417 +43417 +43416 +43416 +43415 +43415 +43414 +43414 +43413 +43413 +43413 +43412 +43412 +43411 +43411 +43410 +43410 +43409 +43409 +43408 +43408 +43407 +43407 +43406 +43406 +43405 +43405 +43404 +43404 +43404 +43403 +43403 +43402 +43402 +43401 +43401 +43400 +43400 +43399 +43399 +43398 +43398 +43397 +43397 +43397 +43396 +43396 +43395 +43395 +43394 +43394 +43393 +43393 +43392 +43392 +43391 +43391 +43390 +43390 +43390 +43389 +43389 +43388 +43388 +43387 +43387 +43386 +43386 +43385 +43385 +43384 +43384 +43383 +43383 +43383 +43382 +43382 +43381 +43381 +43380 +43380 +43379 +43379 +43378 +43378 +43377 +43377 +43377 +43376 +43376 +43375 +43375 +43374 +43374 +43373 +43373 +43372 +43372 +43371 +43371 +43371 +43370 +43370 +43369 +43369 +43368 +43368 +43367 +43367 +43366 +43366 +43366 +43365 +43365 +43364 +43364 +43363 +43363 +43362 +43362 +43361 +43361 +43361 +43360 +43360 +43359 +43359 +43358 +43358 +43357 +43357 +43356 +43356 +43355 +43355 +43355 +43354 +43354 +43353 +43353 +43352 +43352 +43351 +43351 +43350 +43350 +43350 +43349 +43349 +43348 +43348 +43347 +43347 +43346 +43346 +43346 +43345 +43345 +43344 +43344 +43343 +43343 +43342 +43342 +43341 +43341 +43341 +43340 +43340 +43339 +43339 +43338 +43338 +43337 +43337 +43336 +43336 +43336 +43335 +43335 +43334 +43334 +43333 +43333 +43332 +43332 +43332 +43331 +43331 +43330 +43330 +43329 +43329 +43328 +43328 +43328 +43327 +43327 +43326 +43326 +43325 +43325 +43324 +43324 +43324 +43323 +43323 +43322 +43322 +43321 +43321 +43320 +43320 +43319 +43319 +43319 +43318 +43318 +43317 +43317 +43316 +43316 +43315 +43315 +43315 +43314 +43314 +43313 +43313 +43312 +43312 +43312 +43311 +43311 +43310 +43310 +43309 +43309 +43308 +43308 +43308 +43307 +43307 +43306 +43306 +43305 +43305 +43304 +43304 +43304 +43303 +43303 +43302 +43302 +43301 +43301 +43300 +43300 +43300 +43299 +43299 +43298 +43298 +43297 +43297 +43297 +43296 +43296 +43295 +43295 +43294 +43294 +43293 +43293 +43293 +43292 +43292 +43291 +43291 +43290 +43290 +43290 +43289 +43289 +43288 +43288 +43287 +43287 +43286 +43286 +43286 +43285 +43285 +43284 +43284 +43283 +43283 +43283 +43282 +43281 +43280 +43279 +43278 +43277 +43276 +43276 +43275 +43274 +43273 +43272 +43271 +43270 +43270 +43269 +43268 +43267 +43266 +43265 +43264 +43264 +43263 +43262 +43261 +43260 +43259 +43258 +43258 +43257 +43256 +43255 +43254 +43253 +43252 +43252 +43251 +43250 +43249 +43248 +43247 +43246 +43246 +43245 +43244 +43243 +43242 +43241 +43241 +43240 +43239 +43238 +43237 +43236 +43235 +43235 +43234 +43233 +43232 +43231 +43230 +43230 +43229 +43228 +43227 +43226 +43225 +43224 +43224 +43223 +43222 +43221 +43220 +43219 +43219 +43218 +43217 +43216 +43215 +43214 +43214 +43213 +43212 +43211 +43210 +43209 +43209 +43208 +43207 +43206 +43205 +43204 +43204 +43203 +43202 +43201 +43200 +43200 +43199 +43198 +43197 +43196 +43195 +43195 +43194 +43193 +43192 +43191 +43190 +43190 +43189 +43188 +43187 +43186 +43186 +43185 +43184 +43183 +43182 +43181 +43181 +43180 +43179 +43178 +43177 +43177 +43176 +43175 +43174 +43173 +43172 +43172 +43171 +43170 +43169 +43168 +43168 +43167 +43166 +43165 +43164 +43164 +43163 +43162 +43161 +43160 +43159 +43159 +43158 +43157 +43156 +43155 +43155 +43154 +43153 +43152 +43151 +43151 +43150 +43149 +43148 +43147 +43147 +43146 +43145 +43144 +43143 +43143 +43142 +43141 +43140 +43139 +43139 +43138 +43137 +43136 +43135 +43135 +43134 +43133 +43132 +43131 +43131 +43130 +43129 +43128 +43127 +43127 +43126 +43125 +43124 +43124 +43123 +43122 +43121 +43120 +43120 +43119 +43118 +43117 +43116 +43116 +43115 +43114 +43113 +43112 +43112 +43111 +43110 +43109 +43109 +43108 +43107 +43106 +43105 +43105 +43104 +43103 +43102 +43102 +43101 +43100 +43099 +43098 +43098 +43097 +43096 +43095 +43094 +43094 +43093 +43092 +43091 +43091 +43090 +43089 +43088 +43087 +43087 +43086 +43085 +43084 +43084 +43083 +43082 +43081 +43081 +43080 +43079 +43078 +43077 +43077 +43076 +43075 +43074 +43074 +43073 +43072 +43071 +43071 +43070 +43069 +43068 +43067 +43067 +43066 +43065 +43064 +43064 +43063 +43062 +43061 +43061 +43060 +43059 +43058 +43058 +43057 +43056 +43055 +43054 +43054 +43053 +43052 +43051 +43051 +43050 +43049 +43048 +43048 +43047 +43046 +43045 +43045 +43044 +43043 +43042 +43042 +43041 +43040 +43039 +43039 +43038 +43037 +43036 +43036 +43035 +43034 +43033 +43033 +43032 +43031 +43030 +43030 +43029 +43028 +43027 +43027 +43026 +43025 +43024 +43024 +43023 +43022 +43021 +43021 +43020 +43019 +43018 +43018 +43017 +43016 +43015 +43015 +43014 +43013 +43012 +43012 +43011 +43010 +43009 +43009 +43008 +43006 +43005 +43003 +43002 +43000 +42999 +42997 +42996 +42995 +42993 +42992 +42990 +42989 +42987 +42986 +42984 +42983 +42981 +42980 +42978 +42977 +42975 +42974 +42972 +42971 +42969 +42968 +42967 +42965 +42964 +42962 +42961 +42959 +42958 +42956 +42955 +42953 +42952 +42950 +42949 +42948 +42946 +42945 +42943 +42942 +42940 +42939 +42937 +42936 +42934 +42933 +42931 +42930 +42929 +42927 +42926 +42924 +42923 +42921 +42920 +42918 +42917 +42916 +42914 +42913 +42911 +42910 +42908 +42907 +42905 +42904 +42903 +42901 +42900 +42898 +42897 +42895 +42894 +42892 +42891 +42890 +42888 +42887 +42885 +42884 +42882 +42881 +42880 +42878 +42877 +42875 +42874 +42872 +42871 +42870 +42868 +42867 +42865 +42864 +42862 +42861 +42860 +42858 +42857 +42855 +42854 +42852 +42851 +42850 +42848 +42847 +42845 +42844 +42842 +42841 +42840 +42838 +42837 +42835 +42834 +42833 +42831 +42830 +42828 +42827 +42825 +42824 +42823 +42821 +42820 +42818 +42817 +42816 +42814 +42813 +42811 +42810 +42809 +42807 +42806 +42804 +42803 +42802 +42800 +42799 +42797 +42796 +42794 +42793 +42792 +42790 +42789 +42787 +42786 +42785 +42783 +42782 +42781 +42779 +42778 +42776 +42775 +42774 +42772 +42771 +42769 +42768 +42767 +42765 +42764 +42762 +42761 +42760 +42758 +42757 +42755 +42754 +42753 +42751 +42750 +42749 +42747 +42746 +42744 +42743 +42742 +42740 +42739 +42737 +42736 +42735 +42733 +42732 +42731 +42729 +42728 +42726 +42725 +42724 +42722 +42721 +42720 +42718 +42717 +42715 +42714 +42713 +42711 +42710 +42709 +42707 +42706 +42704 +42703 +42702 +42700 +42699 +42698 +42696 +42695 +42693 +42692 +42691 +42689 +42688 +42687 +42685 +42684 +42683 +42681 +42680 +42679 +42677 +42676 +42674 +42673 +42672 +42670 +42669 +42668 +42666 +42665 +42664 +42662 +42661 +42659 +42658 +42657 +42655 +42654 +42653 +42651 +42650 +42649 +42647 +42646 +42645 +42643 +42642 +42641 +42639 +42638 +42637 +42635 +42634 +42633 +42631 +42630 +42628 +42627 +42626 +42624 +42623 +42622 +42620 +42619 +42618 +42616 +42615 +42614 +42612 +42611 +42610 +42608 +42607 +42606 +42604 +42603 +42602 +42600 +42599 +42598 +42596 +42595 +42594 +42592 +42591 +42590 +42588 +42587 +42586 +42584 +42583 +42582 +42580 +42579 +42578 +42576 +42575 +42574 +42572 +42571 +42570 +42568 +42567 +42566 +42564 +42563 +42562 +42561 +42559 +42558 +42557 +42555 +42554 +42553 +42551 +42550 +42549 +42547 +42546 +42545 +42543 +42542 +42541 +42539 +42538 +42537 +42535 +42534 +42533 +42532 +42530 +42529 +42528 +42526 +42525 +42524 +42522 +42521 +42520 +42518 +42517 +42516 +42515 +42513 +42512 +42511 +42509 +42508 +42507 +42505 +42504 +42503 +42501 +42500 +42499 +42498 +42496 +42495 +42494 +42492 +42491 +42490 +42488 +42487 +42486 +42485 +42483 +42482 +42481 +42479 +42478 +42477 +42476 +42474 +42473 +42472 +42470 +42469 +42468 +42466 +42465 +42464 +42463 +42461 +42460 +42459 +42457 +42456 +42455 +42454 +42452 +42451 +42450 +42448 +42447 +42446 +42445 +42443 +42442 +42441 +42439 +42438 +42437 +42436 +42434 +42433 +42432 +42430 +42429 +42428 +42427 +42425 +42424 +42423 +42422 +42420 +42419 +42418 +42416 +42415 +42414 +42413 +42411 +42410 +42409 +42408 +42406 +42405 +42404 +42402 +42401 +42400 +42399 +42397 +42396 +42395 +42394 +42392 +42391 +42390 +42388 +42387 +42386 +42385 +42383 +42382 +42381 +42380 +42378 +42377 +42376 +42375 +42373 +42372 +42371 +42369 +42368 +42367 +42366 +42364 +42363 +42362 +42361 +42359 +42358 +42357 +42356 +42354 +42353 +42352 +42351 +42349 +42348 +42347 +42346 +42344 +42343 +42342 +42341 +42339 +42338 +42337 +42336 +42334 +42333 +42332 +42331 +42329 +42328 +42327 +42326 +42324 +42323 +42322 +42321 +42319 +42318 +42317 +42316 +42314 +42313 +42312 +42311 +42309 +42308 +42307 +42306 +42304 +42303 +42302 +42301 +42299 +42298 +42297 +42296 +42294 +42293 +42292 +42291 +42290 +42288 +42287 +42286 +42285 +42283 +42282 +42281 +42280 +42278 +42277 +42276 +42275 +42273 +42272 +42271 +42270 +42269 +42267 +42266 +42265 +42264 +42262 +42261 +42260 +42259 +42257 +42256 +42255 +42254 +42253 +42251 +42250 +42249 +42248 +42246 +42245 +42244 +42243 +42242 +42240 +42239 +42238 +42237 +42235 +42234 +42233 +42232 +42231 +42229 +42228 +42227 +42226 +42224 +42223 +42222 +42221 +42220 +42218 +42217 +42216 +42215 +42213 +42212 +42211 +42210 +42209 +42207 +42206 +42205 +42204 +42203 +42201 +42200 +42199 +42198 +42196 +42195 +42194 +42193 +42192 +42190 +42189 +42188 +42187 +42186 +42184 +42183 +42182 +42181 +42180 +42178 +42177 +42176 +42175 +42173 +42172 +42171 +42170 +42169 +42167 +42166 +42165 +42164 +42163 +42161 +42160 +42159 +42158 +42157 +42155 +42154 +42153 +42152 +42151 +42149 +42148 +42147 +42146 +42145 +42143 +42142 +42141 +42140 +42139 +42137 +42136 +42135 +42134 +42133 +42132 +42130 +42129 +42128 +42127 +42126 +42124 +42123 +42122 +42121 +42120 +42118 +42117 +42116 +42115 +42114 +42112 +42111 +42110 +42109 +42107 +42104 +42102 +42099 +42097 +42095 +42092 +42090 +42088 +42085 +42083 +42080 +42078 +42076 +42073 +42071 +42069 +42066 +42064 +42062 +42059 +42057 +42055 +42052 +42050 +42048 +42045 +42043 +42041 +42038 +42036 +42034 +42031 +42029 +42027 +42024 +42022 +42020 +42017 +42015 +42013 +42010 +42008 +42006 +42003 +42001 +41999 +41996 +41994 +41992 +41989 +41987 +41985 +41981 +41976 +41972 +41967 +41962 +41958 +41953 +41949 +41944 +41939 +41935 +41930 +41926 +41921 +41916 +41912 +41907 +41903 +41898 +41894 +41889 +41884 +41880 +41875 +41871 +41866 +41862 +41857 +41853 +41848 +41843 +41839 +41834 +41830 +41825 +41821 +41816 +41812 +41807 +41803 +41798 +41794 +41789 +41784 +41780 +41775 +41771 +41766 +41762 +41757 +41753 +41748 +41744 +41739 +41735 +41730 +41726 +41721 +41717 +41712 +41708 +41703 +41699 +41695 +41690 +41686 +41681 +41677 +41672 +41668 +41663 +41659 +41654 +41650 +41645 +41641 +41637 +41632 +41628 +41623 +41619 +41614 +41610 +41605 +41601 +41597 +41592 +41588 +41583 +41579 +41574 +41570 +41566 +41561 +41557 +41552 +41548 +41544 +41539 +41535 +41530 +41526 +41522 +41517 +41513 +41508 +41504 +41500 +41495 +41491 +41486 +41482 +41478 +41473 +41469 +41465 +41460 +41456 +41452 +41447 +41443 +41438 +41434 +41430 +41425 +41421 +41417 +41412 +41408 +41404 +41399 +41395 +41391 +41386 +41382 +41378 +41373 +41369 +41365 +41360 +41356 +41352 +41347 +41343 +41339 +41334 +41330 +41326 +41322 +41317 +41313 +41309 +41304 +41300 +41296 +41292 +41287 +41283 +41279 +41274 +41270 +41266 +41262 +41257 +41253 +41249 +41244 +41240 +41236 +41232 +41227 +41223 +41219 +41215 +41210 +41206 +41202 +41198 +41193 +41189 +41185 +41181 +41176 +41172 +41168 +41164 +41159 +41155 +41151 +41147 +41143 +41138 +41134 +41130 +41126 +41121 +41117 +41113 +41109 +41105 +41100 +41096 +41092 +41088 +41084 +41079 +41075 +41071 +41067 +41063 +41058 +41054 +41050 +41046 +41042 +41038 +41033 +41029 +41025 +41021 +41017 +41012 +41008 +41004 +41000 +40996 +40992 +40988 +40983 +40979 +40975 +40971 +40967 +40963 +40957 +40949 +40940 +40932 +40924 +40916 +40907 +40899 +40891 +40882 +40874 +40866 +40858 +40849 +40841 +40833 +40825 +40816 +40808 +40800 +40792 +40784 +40775 +40767 +40759 +40751 +40743 +40734 +40726 +40718 +40710 +40702 +40693 +40685 +40677 +40669 +40661 +40653 +40644 +40636 +40628 +40620 +40612 +40604 +40595 +40587 +40579 +40571 +40563 +40555 +40547 +40539 +40530 +40522 +40514 +40506 +40498 +40490 +40482 +40474 +40466 +40458 +40449 +40441 +40433 +40425 +40417 +40409 +40401 +40393 +40385 +40377 +40369 +40361 +40353 +40345 +40337 +40329 +40321 +40313 +40305 +40296 +40288 +40280 +40272 +40264 +40256 +40248 +40240 +40232 +40224 +40216 +40208 +40200 +40192 +40185 +40177 +40169 +40161 +40153 +40145 +40137 +40129 +40121 +40113 +40105 +40097 +40089 +40081 +40073 +40065 +40057 +40049 +40041 +40034 +40026 +40018 +40010 +40002 +39994 +39986 +39978 +39970 +39962 +39954 +39947 +39939 +39926 +39910 +39894 +39878 +39863 +39847 +39831 +39815 +39800 +39784 +39768 +39753 +39737 +39721 +39706 +39690 +39674 +39659 +39643 +39627 +39612 +39596 +39580 +39565 +39549 +39534 +39518 +39502 +39487 +39471 +39456 +39440 +39424 +39409 +39393 +39378 +39362 +39347 +39331 +39316 +39300 +39285 +39269 +39254 +39238 +39223 +39207 +39192 +39176 +39161 +39145 +39130 +39114 +39099 +39083 +39068 +39052 +39037 +39022 +39006 +38991 +38975 +38960 +38945 +38929 +38914 +38885 +38854 +38823 +38793 +38762 +38731 +38701 +38670 +38639 +38609 +38578 +38547 +38517 +38486 +38455 +38425 +38394 +38364 +38333 +38303 +38272 +38242 +38211 +38181 +38150 +38120 +38089 +38059 +38028 +37998 +37967 +37937 +37907 +37864 +37804 +37743 +37682 +37621 +37561 +37500 +37440 +37379 +37318 +37258 +37197 +37137 +37076 +37016 +36955 +36895 +36805 +36684 +36563 +36443 +36322 +36201 +36081 +35960 +35840 +35599 +35358 +35117 +34877 +34456 +33975 +33494 +33014 + 234 + 715 + 1195 + 1675 + 2101 + 2341 + 2581 + 2820 + 3060 + 3186 + 3305 + 3425 + 3545 + 3664 + 3784 + 3903 + 4023 + 4119 + 4179 + 4238 + 4298 + 4358 + 4417 + 4477 + 4536 + 4596 + 4655 + 4715 + 4774 + 4834 + 4893 + 4953 + 5012 + 5071 + 5125 + 5155 + 5185 + 5214 + 5244 + 5274 + 5303 + 5333 + 5362 + 5392 + 5422 + 5451 + 5481 + 5510 + 5540 + 5569 + 5599 + 5628 + 5658 + 5687 + 5717 + 5746 + 5776 + 5805 + 5835 + 5864 + 5893 + 5923 + 5952 + 5982 + 6011 + 6040 + 6070 + 6099 + 6128 + 6151 + 6165 + 6180 + 6195 + 6209 + 6224 + 6239 + 6253 + 6268 + 6283 + 6297 + 6312 + 6326 + 6341 + 6356 + 6370 + 6385 + 6399 + 6414 + 6428 + 6443 + 6458 + 6472 + 6487 + 6501 + 6516 + 6530 + 6545 + 6559 + 6574 + 6588 + 6603 + 6617 + 6632 + 6646 + 6661 + 6675 + 6690 + 6704 + 6719 + 6733 + 6748 + 6762 + 6777 + 6791 + 6806 + 6820 + 6834 + 6849 + 6863 + 6878 + 6892 + 6907 + 6921 + 6935 + 6950 + 6964 + 6979 + 6993 + 7007 + 7022 + 7036 + 7050 + 7065 + 7079 + 7094 + 7108 + 7122 + 7137 + 7151 + 7165 + 7174 + 7181 + 7188 + 7195 + 7202 + 7210 + 7217 + 7224 + 7231 + 7238 + 7245 + 7252 + 7260 + 7267 + 7274 + 7281 + 7288 + 7295 + 7302 + 7309 + 7317 + 7324 + 7331 + 7338 + 7345 + 7352 + 7359 + 7366 + 7373 + 7380 + 7388 + 7395 + 7402 + 7409 + 7416 + 7423 + 7430 + 7437 + 7444 + 7451 + 7458 + 7465 + 7473 + 7480 + 7487 + 7494 + 7501 + 7508 + 7515 + 7522 + 7529 + 7536 + 7543 + 7550 + 7557 + 7564 + 7571 + 7578 + 7585 + 7592 + 7599 + 7606 + 7613 + 7620 + 7627 + 7634 + 7641 + 7649 + 7656 + 7663 + 7670 + 7677 + 7684 + 7691 + 7698 + 7705 + 7712 + 7719 + 7726 + 7732 + 7739 + 7746 + 7753 + 7760 + 7767 + 7774 + 7781 + 7788 + 7795 + 7802 + 7809 + 7816 + 7823 + 7830 + 7837 + 7844 + 7851 + 7858 + 7865 + 7872 + 7879 + 7886 + 7893 + 7900 + 7906 + 7913 + 7920 + 7927 + 7934 + 7941 + 7948 + 7955 + 7962 + 7969 + 7976 + 7983 + 7990 + 7996 + 8003 + 8010 + 8017 + 8024 + 8031 + 8038 + 8045 + 8052 + 8058 + 8065 + 8072 + 8079 + 8086 + 8093 + 8100 + 8107 + 8114 + 8120 + 8127 + 8134 + 8141 + 8148 + 8155 + 8162 + 8168 + 8175 + 8182 + 8189 + 8194 + 8197 + 8201 + 8204 + 8208 + 8211 + 8214 + 8218 + 8221 + 8225 + 8228 + 8231 + 8235 + 8238 + 8242 + 8245 + 8249 + 8252 + 8255 + 8259 + 8262 + 8266 + 8269 + 8272 + 8276 + 8279 + 8283 + 8286 + 8289 + 8293 + 8296 + 8300 + 8303 + 8306 + 8310 + 8313 + 8316 + 8320 + 8323 + 8327 + 8330 + 8333 + 8337 + 8340 + 8344 + 8347 + 8350 + 8354 + 8357 + 8360 + 8364 + 8367 + 8371 + 8374 + 8377 + 8381 + 8384 + 8387 + 8391 + 8394 + 8397 + 8401 + 8404 + 8408 + 8411 + 8414 + 8418 + 8421 + 8424 + 8428 + 8431 + 8434 + 8438 + 8441 + 8444 + 8448 + 8451 + 8455 + 8458 + 8461 + 8465 + 8468 + 8471 + 8475 + 8478 + 8481 + 8485 + 8488 + 8491 + 8495 + 8498 + 8501 + 8505 + 8508 + 8511 + 8515 + 8518 + 8521 + 8525 + 8528 + 8531 + 8535 + 8538 + 8541 + 8545 + 8548 + 8551 + 8555 + 8558 + 8561 + 8564 + 8568 + 8571 + 8574 + 8578 + 8581 + 8584 + 8588 + 8591 + 8594 + 8598 + 8601 + 8604 + 8608 + 8611 + 8614 + 8617 + 8621 + 8624 + 8627 + 8631 + 8634 + 8637 + 8641 + 8644 + 8647 + 8650 + 8654 + 8657 + 8660 + 8664 + 8667 + 8670 + 8673 + 8677 + 8680 + 8683 + 8687 + 8690 + 8693 + 8696 + 8700 + 8703 + 8706 + 8710 + 8713 + 8716 + 8719 + 8723 + 8726 + 8729 + 8732 + 8736 + 8739 + 8742 + 8746 + 8749 + 8752 + 8755 + 8759 + 8762 + 8765 + 8768 + 8772 + 8775 + 8778 + 8781 + 8785 + 8788 + 8791 + 8794 + 8798 + 8801 + 8804 + 8807 + 8811 + 8814 + 8817 + 8820 + 8824 + 8827 + 8833 + 8840 + 8846 + 8853 + 8859 + 8866 + 8872 + 8879 + 8885 + 8892 + 8898 + 8905 + 8911 + 8917 + 8924 + 8930 + 8937 + 8943 + 8950 + 8956 + 8962 + 8969 + 8975 + 8982 + 8988 + 8994 + 9001 + 9007 + 9014 + 9020 + 9026 + 9033 + 9039 + 9046 + 9052 + 9058 + 9065 + 9071 + 9077 + 9084 + 9090 + 9096 + 9103 + 9109 + 9115 + 9122 + 9128 + 9134 + 9141 + 9147 + 9153 + 9160 + 9166 + 9172 + 9179 + 9185 + 9191 + 9198 + 9204 + 9210 + 9216 + 9219 + 9222 + 9226 + 9229 + 9232 + 9235 + 9238 + 9241 + 9244 + 9248 + 9251 + 9254 + 9257 + 9260 + 9263 + 9266 + 9269 + 9273 + 9276 + 9279 + 9282 + 9285 + 9288 + 9291 + 9294 + 9297 + 9300 + 9304 + 9307 + 9310 + 9313 + 9316 + 9319 + 9322 + 9325 + 9328 + 9331 + 9335 + 9338 + 9341 + 9344 + 9347 + 9350 + 9353 + 9356 + 9359 + 9362 + 9365 + 9368 + 9371 + 9374 + 9378 + 9381 + 9384 + 9387 + 9390 + 9393 + 9396 + 9399 + 9402 + 9405 + 9408 + 9411 + 9414 + 9417 + 9420 + 9423 + 9426 + 9429 + 9432 + 9435 + 9439 + 9442 + 9445 + 9448 + 9451 + 9454 + 9457 + 9460 + 9463 + 9466 + 9469 + 9472 + 9475 + 9478 + 9481 + 9484 + 9487 + 9490 + 9493 + 9496 + 9499 + 9502 + 9505 + 9508 + 9511 + 9514 + 9517 + 9520 + 9523 + 9526 + 9529 + 9532 + 9535 + 9538 + 9541 + 9544 + 9547 + 9550 + 9553 + 9556 + 9559 + 9562 + 9565 + 9568 + 9571 + 9574 + 9577 + 9580 + 9582 + 9585 + 9588 + 9591 + 9594 + 9597 + 9600 + 9603 + 9606 + 9609 + 9612 + 9615 + 9618 + 9621 + 9624 + 9627 + 9630 + 9633 + 9636 + 9639 + 9642 + 9645 + 9647 + 9650 + 9653 + 9656 + 9659 + 9662 + 9665 + 9668 + 9671 + 9674 + 9677 + 9680 + 9683 + 9686 + 9688 + 9691 + 9694 + 9697 + 9700 + 9703 + 9706 + 9709 + 9712 + 9715 + 9718 + 9720 + 9723 + 9726 + 9729 + 9732 + 9735 + 9738 + 9741 + 9744 + 9747 + 9749 + 9752 + 9755 + 9758 + 9761 + 9764 + 9767 + 9770 + 9773 + 9775 + 9778 + 9781 + 9784 + 9787 + 9790 + 9793 + 9796 + 9798 + 9801 + 9804 + 9807 + 9810 + 9813 + 9816 + 9819 + 9821 + 9824 + 9827 + 9830 + 9833 + 9836 + 9839 + 9841 + 9844 + 9847 + 9850 + 9853 + 9856 + 9858 + 9861 + 9864 + 9867 + 9870 + 9873 + 9876 + 9878 + 9881 + 9884 + 9887 + 9890 + 9893 + 9895 + 9898 + 9901 + 9904 + 9907 + 9909 + 9912 + 9915 + 9918 + 9921 + 9924 + 9926 + 9929 + 9932 + 9935 + 9938 + 9940 + 9943 + 9946 + 9949 + 9952 + 9955 + 9957 + 9960 + 9963 + 9966 + 9969 + 9971 + 9974 + 9977 + 9980 + 9983 + 9985 + 9988 + 9991 + 9994 + 9996 + 9999 +10002 +10005 +10008 +10010 +10013 +10016 +10019 +10022 +10024 +10027 +10030 +10033 +10035 +10038 +10041 +10044 +10046 +10049 +10052 +10055 +10058 +10060 +10063 +10066 +10069 +10071 +10074 +10077 +10080 +10082 +10085 +10088 +10091 +10093 +10096 +10099 +10102 +10104 +10107 +10110 +10113 +10115 +10118 +10121 +10124 +10126 +10129 +10132 +10134 +10137 +10140 +10143 +10145 +10148 +10151 +10154 +10156 +10159 +10162 +10164 +10167 +10170 +10173 +10175 +10178 +10181 +10183 +10186 +10189 +10192 +10194 +10197 +10200 +10202 +10205 +10208 +10211 +10213 +10216 +10219 +10221 +10224 +10227 +10229 +10232 +10235 +10238 +10240 +10241 +10243 +10244 +10246 +10247 +10248 +10250 +10251 +10252 +10254 +10255 +10256 +10258 +10259 +10260 +10262 +10263 +10264 +10266 +10267 +10268 +10270 +10271 +10272 +10274 +10275 +10276 +10278 +10279 +10280 +10282 +10283 +10284 +10286 +10287 +10288 +10290 +10291 +10292 +10294 +10295 +10296 +10298 +10299 +10300 +10302 +10303 +10304 +10305 +10307 +10308 +10309 +10311 +10312 +10313 +10315 +10316 +10317 +10319 +10320 +10321 +10323 +10324 +10325 +10327 +10328 +10329 +10330 +10332 +10333 +10334 +10336 +10337 +10338 +10340 +10341 +10342 +10344 +10345 +10346 +10348 +10349 +10350 +10351 +10353 +10354 +10355 +10357 +10358 +10359 +10361 +10362 +10363 +10364 +10366 +10367 +10368 +10370 +10371 +10372 +10374 +10375 +10376 +10377 +10379 +10380 +10381 +10383 +10384 +10385 +10386 +10388 +10389 +10390 +10392 +10393 +10394 +10396 +10397 +10398 +10399 +10401 +10402 +10403 +10405 +10406 +10407 +10408 +10410 +10411 +10412 +10414 +10415 +10416 +10417 +10419 +10420 +10421 +10422 +10424 +10425 +10426 +10428 +10429 +10430 +10431 +10433 +10434 +10435 +10437 +10438 +10439 +10440 +10442 +10443 +10444 +10445 +10447 +10448 +10449 +10451 +10452 +10453 +10454 +10456 +10457 +10458 +10459 +10461 +10462 +10463 +10464 +10466 +10467 +10468 +10470 +10471 +10472 +10473 +10475 +10476 +10477 +10478 +10480 +10481 +10482 +10483 +10485 +10486 +10487 +10488 +10490 +10491 +10492 +10493 +10495 +10496 +10497 +10498 +10500 +10501 +10502 +10503 +10505 +10506 +10507 +10508 +10510 +10511 +10512 +10513 +10515 +10516 +10517 +10518 +10520 +10521 +10522 +10523 +10525 +10526 +10527 +10528 +10530 +10531 +10532 +10533 +10535 +10536 +10537 +10538 +10540 +10541 +10542 +10543 +10545 +10546 +10547 +10548 +10549 +10551 +10552 +10553 +10554 +10556 +10557 +10558 +10559 +10561 +10562 +10563 +10564 +10566 +10567 +10568 +10569 +10570 +10572 +10573 +10574 +10575 +10577 +10578 +10579 +10580 +10581 +10583 +10584 +10585 +10586 +10588 +10589 +10590 +10591 +10593 +10594 +10595 +10596 +10597 +10599 +10600 +10601 +10602 +10603 +10605 +10606 +10607 +10608 +10610 +10611 +10612 +10613 +10614 +10616 +10617 +10618 +10619 +10621 +10622 +10623 +10624 +10625 +10627 +10628 +10629 +10630 +10631 +10633 +10634 +10635 +10636 +10637 +10639 +10640 +10641 +10642 +10644 +10645 +10646 +10647 +10648 +10650 +10651 +10652 +10653 +10654 +10656 +10657 +10658 +10659 +10660 +10662 +10663 +10664 +10665 +10666 +10668 +10669 +10670 +10671 +10672 +10674 +10675 +10676 +10677 +10678 +10680 +10681 +10682 +10683 +10684 +10685 +10687 +10688 +10689 +10690 +10691 +10693 +10694 +10695 +10696 +10697 +10699 +10700 +10701 +10702 +10703 +10705 +10706 +10707 +10708 +10709 +10710 +10712 +10713 +10714 +10715 +10716 +10718 +10719 +10720 +10721 +10722 +10723 +10725 +10726 +10727 +10728 +10729 +10731 +10732 +10733 +10734 +10735 +10736 +10738 +10739 +10740 +10741 +10742 +10744 +10745 +10746 +10747 +10748 +10749 +10751 +10752 +10753 +10754 +10755 +10756 +10758 +10759 +10760 +10761 +10762 +10763 +10765 +10766 +10767 +10768 +10769 +10770 +10772 +10773 +10774 +10775 +10776 +10777 +10779 +10780 +10781 +10782 +10783 +10784 +10786 +10787 +10788 +10789 +10790 +10791 +10793 +10794 +10795 +10796 +10797 +10798 +10800 +10801 +10802 +10803 +10804 +10805 +10807 +10808 +10809 +10810 +10811 +10812 +10813 +10815 +10816 +10817 +10818 +10819 +10820 +10822 +10823 +10824 +10825 +10826 +10827 +10828 +10830 +10831 +10832 +10833 +10834 +10835 +10836 +10838 +10839 +10840 +10841 +10842 +10843 +10845 +10846 +10847 +10848 +10849 +10850 +10851 +10853 +10854 +10855 +10856 +10857 +10858 +10859 +10861 +10862 +10863 +10864 +10865 +10866 +10867 +10868 +10870 +10871 +10872 +10873 +10874 +10875 +10876 +10878 +10879 +10880 +10881 +10882 +10883 +10884 +10886 +10887 +10888 +10889 +10890 +10891 +10892 +10893 +10895 +10896 +10897 +10898 +10899 +10900 +10901 +10903 +10904 +10905 +10906 +10907 +10908 +10909 +10910 +10912 +10913 +10914 +10915 +10916 +10917 +10918 +10919 +10921 +10922 +10923 +10924 +10925 +10926 +10927 +10928 +10930 +10931 +10932 +10933 +10934 +10935 +10936 +10937 +10939 +10940 +10941 +10942 +10943 +10944 +10945 +10946 +10947 +10949 +10950 +10951 +10952 +10953 +10954 +10955 +10956 +10958 +10959 +10960 +10961 +10962 +10963 +10964 +10965 +10966 +10968 +10969 +10970 +10971 +10972 +10973 +10974 +10975 +10976 +10978 +10979 +10980 +10981 +10982 +10984 +10986 +10989 +10991 +10993 +10995 +10997 +11000 +11002 +11004 +11006 +11008 +11011 +11013 +11015 +11017 +11019 +11022 +11024 +11026 +11028 +11030 +11033 +11035 +11037 +11039 +11041 +11044 +11046 +11048 +11050 +11052 +11054 +11057 +11059 +11061 +11063 +11065 +11068 +11070 +11072 +11074 +11076 +11078 +11081 +11083 +11085 +11087 +11089 +11091 +11093 +11096 +11098 +11100 +11102 +11104 +11106 +11109 +11111 +11113 +11115 +11117 +11119 +11121 +11124 +11126 +11128 +11130 +11132 +11134 +11136 +11139 +11141 +11143 +11145 +11147 +11149 +11151 +11153 +11156 +11158 +11160 +11162 +11164 +11166 +11168 +11170 +11173 +11175 +11177 +11179 +11181 +11183 +11185 +11187 +11189 +11192 +11194 +11196 +11198 +11200 +11202 +11204 +11206 +11208 +11211 +11213 +11215 +11217 +11219 +11221 +11223 +11225 +11227 +11229 +11231 +11234 +11236 +11238 +11240 +11242 +11244 +11246 +11248 +11250 +11252 +11254 +11256 +11259 +11261 +11263 +11264 +11265 +11266 +11267 +11269 +11270 +11271 +11272 +11273 +11274 +11275 +11276 +11277 +11278 +11279 +11280 +11281 +11282 +11283 +11284 +11285 +11286 +11287 +11288 +11289 +11290 +11291 +11292 +11293 +11294 +11295 +11296 +11297 +11298 +11299 +11300 +11301 +11302 +11303 +11304 +11305 +11306 +11307 +11309 +11310 +11311 +11312 +11313 +11314 +11315 +11316 +11317 +11318 +11319 +11320 +11321 +11322 +11323 +11324 +11325 +11326 +11327 +11328 +11329 +11330 +11331 +11332 +11333 +11334 +11335 +11336 +11337 +11338 +11339 +11340 +11341 +11342 +11343 +11344 +11345 +11346 +11347 +11348 +11349 +11350 +11351 +11352 +11353 +11354 +11355 +11356 +11357 +11358 +11359 +11360 +11361 +11362 +11363 +11364 +11365 +11366 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11374 +11375 +11376 +11377 +11378 +11379 +11379 +11380 +11381 +11382 +11383 +11384 +11385 +11386 +11387 +11388 +11389 +11390 +11391 +11392 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11492 +11493 +11494 +11495 +11496 +11497 +11497 +11498 +11499 +11500 +11501 +11502 +11503 +11504 +11505 +11506 +11507 +11508 +11509 +11510 +11511 +11511 +11512 +11513 +11514 +11515 +11516 +11517 +11518 +11519 +11520 +11521 +11522 +11523 +11524 +11524 +11525 +11526 +11527 +11528 +11529 +11530 +11531 +11532 +11533 +11534 +11535 +11536 +11536 +11537 +11538 +11539 +11540 +11541 +11542 +11543 +11544 +11545 +11546 +11547 +11547 +11548 +11549 +11550 +11551 +11552 +11553 +11554 +11555 +11556 +11557 +11558 +11558 +11559 +11560 +11561 +11562 +11563 +11564 +11565 +11566 +11567 +11568 +11568 +11569 +11570 +11571 +11572 +11573 +11574 +11575 +11576 +11577 +11578 +11578 +11579 +11580 +11581 +11582 +11583 +11584 +11585 +11586 +11587 +11587 +11588 +11589 +11590 +11591 +11592 +11593 +11594 +11595 +11596 +11596 +11597 +11598 +11599 +11600 +11601 +11602 +11603 +11604 +11605 +11605 +11606 +11607 +11608 +11609 +11610 +11611 +11612 +11613 +11613 +11614 +11615 +11616 +11617 +11618 +11619 +11620 +11621 +11621 +11622 +11623 +11624 +11625 +11626 +11627 +11628 +11629 +11629 +11630 +11631 +11632 +11633 +11634 +11635 +11636 +11637 +11637 +11638 +11639 +11640 +11641 +11642 +11643 +11644 +11644 +11645 +11646 +11647 +11648 +11649 +11650 +11651 +11651 +11652 +11653 +11654 +11655 +11656 +11657 +11658 +11659 +11659 +11660 +11661 +11662 +11663 +11664 +11665 +11666 +11666 +11667 +11668 +11669 +11670 +11671 +11672 +11672 +11673 +11674 +11675 +11676 +11677 +11678 +11679 +11679 +11680 +11681 +11682 +11683 +11684 +11685 +11686 +11686 +11687 +11688 +11689 +11690 +11691 +11692 +11692 +11693 +11694 +11695 +11696 +11697 +11698 +11698 +11699 +11700 +11701 +11702 +11703 +11704 +11704 +11705 +11706 +11707 +11708 +11709 +11710 +11711 +11711 +11712 +11713 +11714 +11715 +11716 +11717 +11717 +11718 +11719 +11720 +11721 +11722 +11722 +11723 +11724 +11725 +11726 +11727 +11728 +11728 +11729 +11730 +11731 +11732 +11733 +11734 +11734 +11735 +11736 +11737 +11738 +11739 +11740 +11740 +11741 +11742 +11743 +11744 +11745 +11745 +11746 +11747 +11748 +11749 +11750 +11751 +11751 +11752 +11753 +11754 +11755 +11756 +11756 +11757 +11758 +11759 +11760 +11761 +11761 +11762 +11763 +11764 +11765 +11766 +11767 +11767 +11768 +11769 +11770 +11771 +11772 +11772 +11773 +11774 +11775 +11776 +11777 +11777 +11778 +11779 +11780 +11781 +11782 +11782 +11783 +11784 +11785 +11786 +11787 +11787 +11788 +11789 +11790 +11791 +11792 +11792 +11793 +11794 +11795 +11796 +11797 +11797 +11798 +11799 +11800 +11801 +11802 +11802 +11803 +11804 +11805 +11806 +11806 +11807 +11808 +11809 +11810 +11811 +11811 +11812 +11813 +11814 +11815 +11816 +11816 +11817 +11818 +11819 +11820 +11820 +11821 +11822 +11823 +11824 +11825 +11825 +11826 +11827 +11828 +11829 +11830 +11830 +11831 +11832 +11833 +11834 +11834 +11835 +11836 +11837 +11838 +11839 +11839 +11840 +11841 +11842 +11843 +11843 +11844 +11845 +11846 +11847 +11847 +11848 +11849 +11850 +11851 +11852 +11852 +11853 +11854 +11855 +11856 +11856 +11857 +11858 +11859 +11860 +11860 +11861 +11862 +11863 +11864 +11865 +11865 +11866 +11867 +11868 +11869 +11869 +11870 +11871 +11872 +11873 +11873 +11874 +11875 +11876 +11877 +11877 +11878 +11879 +11880 +11881 +11881 +11882 +11883 +11884 +11885 +11885 +11886 +11887 +11888 +11889 +11889 +11890 +11891 +11892 +11893 +11893 +11894 +11895 +11896 +11897 +11897 +11898 +11899 +11900 +11901 +11901 +11902 +11903 +11904 +11905 +11905 +11906 +11907 +11908 +11909 +11909 +11910 +11911 +11912 +11913 +11913 +11914 +11915 +11916 +11917 +11917 +11918 +11919 +11920 +11921 +11921 +11922 +11923 +11924 +11924 +11925 +11926 +11927 +11928 +11928 +11929 +11930 +11931 +11932 +11932 +11933 +11934 +11935 +11936 +11936 +11937 +11938 +11939 +11939 +11940 +11941 +11942 +11943 +11943 +11944 +11945 +11946 +11947 +11947 +11948 +11949 +11950 +11950 +11951 +11952 +11953 +11954 +11954 +11955 +11956 +11957 +11957 +11958 +11959 +11960 +11961 +11961 +11962 +11963 +11964 +11965 +11965 +11966 +11967 +11968 +11968 +11969 +11970 +11971 +11972 +11972 +11973 +11974 +11975 +11975 +11976 +11977 +11978 +11979 +11979 +11980 +11981 +11982 +11982 +11983 +11984 +11985 +11985 +11986 +11987 +11988 +11989 +11989 +11990 +11991 +11992 +11992 +11993 +11994 +11995 +11996 +11996 +11997 +11998 +11999 +11999 +12000 +12001 +12002 +12002 +12003 +12004 +12005 +12006 +12006 +12007 +12008 +12009 +12009 +12010 +12011 +12012 +12012 +12013 +12014 +12015 +12015 +12016 +12017 +12018 +12019 +12019 +12020 +12021 +12022 +12022 +12023 +12024 +12025 +12025 +12026 +12027 +12028 +12028 +12029 +12030 +12031 +12031 +12032 +12033 +12034 +12035 +12035 +12036 +12037 +12038 +12038 +12039 +12040 +12041 +12041 +12042 +12043 +12044 +12044 +12045 +12046 +12047 +12049 +12050 +12052 +12053 +12055 +12056 +12058 +12060 +12061 +12063 +12064 +12066 +12067 +12069 +12070 +12072 +12073 +12075 +12076 +12078 +12079 +12081 +12082 +12084 +12085 +12086 +12088 +12089 +12091 +12092 +12094 +12095 +12097 +12098 +12100 +12101 +12103 +12104 +12106 +12107 +12109 +12110 +12112 +12113 +12115 +12116 +12118 +12119 +12121 +12122 +12124 +12125 +12126 +12128 +12129 +12131 +12132 +12134 +12135 +12137 +12138 +12140 +12141 +12143 +12144 +12146 +12147 +12148 +12150 +12151 +12153 +12154 +12156 +12157 +12159 +12160 +12162 +12163 +12164 +12166 +12167 +12169 +12170 +12172 +12173 +12175 +12176 +12178 +12179 +12180 +12182 +12183 +12185 +12186 +12188 +12189 +12191 +12192 +12193 +12195 +12196 +12198 +12199 +12201 +12202 +12203 +12205 +12206 +12208 +12209 +12211 +12212 +12213 +12215 +12216 +12218 +12219 +12221 +12222 +12223 +12225 +12226 +12228 +12229 +12231 +12232 +12233 +12235 +12236 +12238 +12239 +12240 +12242 +12243 +12245 +12246 +12248 +12249 +12250 +12252 +12253 +12255 +12256 +12257 +12259 +12260 +12262 +12263 +12264 +12266 +12267 +12269 +12270 +12271 +12273 +12274 +12276 +12277 +12278 +12280 +12281 +12283 +12284 +12285 +12287 +12288 +12289 +12289 +12290 +12291 +12292 +12292 +12293 +12294 +12294 +12295 +12296 +12296 +12297 +12298 +12299 +12299 +12300 +12301 +12301 +12302 +12303 +12303 +12304 +12305 +12305 +12306 +12307 +12307 +12308 +12309 +12310 +12310 +12311 +12312 +12312 +12313 +12314 +12314 +12315 +12316 +12316 +12317 +12318 +12318 +12319 +12320 +12320 +12321 +12322 +12323 +12323 +12324 +12325 +12325 +12326 +12327 +12327 +12328 +12329 +12329 +12330 +12331 +12331 +12332 +12333 +12333 +12334 +12335 +12335 +12336 +12337 +12337 +12338 +12339 +12339 +12340 +12341 +12341 +12342 +12343 +12344 +12344 +12345 +12346 +12346 +12347 +12348 +12348 +12349 +12350 +12350 +12351 +12352 +12352 +12353 +12354 +12354 +12355 +12356 +12356 +12357 +12358 +12358 +12359 +12360 +12360 +12361 +12362 +12362 +12363 +12364 +12364 +12365 +12366 +12366 +12367 +12367 +12368 +12369 +12369 +12370 +12371 +12371 +12372 +12373 +12373 +12374 +12375 +12375 +12376 +12377 +12377 +12378 +12379 +12379 +12380 +12381 +12381 +12382 +12383 +12383 +12384 +12385 +12385 +12386 +12387 +12387 +12388 +12389 +12389 +12390 +12390 +12391 +12392 +12392 +12393 +12394 +12394 +12395 +12396 +12396 +12397 +12398 +12398 +12399 +12400 +12400 +12401 +12402 +12402 +12403 +12403 +12404 +12405 +12405 +12406 +12407 +12407 +12408 +12409 +12409 +12410 +12411 +12411 +12412 +12412 +12413 +12414 +12414 +12415 +12416 +12416 +12417 +12418 +12418 +12419 +12420 +12420 +12421 +12421 +12422 +12423 +12423 +12424 +12425 +12425 +12426 +12427 +12427 +12428 +12428 +12429 +12430 +12430 +12431 +12432 +12432 +12433 +12434 +12434 +12435 +12435 +12436 +12437 +12437 +12438 +12439 +12439 +12440 +12441 +12441 +12442 +12442 +12443 +12444 +12444 +12445 +12446 +12446 +12447 +12447 +12448 +12449 +12449 +12450 +12451 +12451 +12452 +12453 +12453 +12454 +12454 +12455 +12456 +12456 +12457 +12458 +12458 +12459 +12459 +12460 +12461 +12461 +12462 +12463 +12463 +12464 +12464 +12465 +12466 +12466 +12467 +12467 +12468 +12469 +12469 +12470 +12471 +12471 +12472 +12472 +12473 +12474 +12474 +12475 +12476 +12476 +12477 +12477 +12478 +12479 +12479 +12480 +12481 +12481 +12482 +12482 +12483 +12484 +12484 +12485 +12485 +12486 +12487 +12487 +12488 +12489 +12489 +12490 +12490 +12491 +12492 +12492 +12493 +12493 +12494 +12495 +12495 +12496 +12496 +12497 +12498 +12498 +12499 +12500 +12500 +12501 +12501 +12502 +12503 +12503 +12504 +12504 +12505 +12506 +12506 +12507 +12507 +12508 +12509 +12509 +12510 +12510 +12511 +12512 +12512 +12513 +12513 +12514 +12515 +12515 +12516 +12517 +12517 +12518 +12518 +12519 +12520 +12520 +12521 +12521 +12522 +12523 +12523 +12524 +12524 +12525 +12526 +12526 +12527 +12527 +12528 +12529 +12529 +12530 +12530 +12531 +12532 +12532 +12533 +12533 +12534 +12535 +12535 +12536 +12536 +12537 +12538 +12538 +12539 +12539 +12540 +12540 +12541 +12542 +12542 +12543 +12543 +12544 +12545 +12545 +12546 +12546 +12547 +12548 +12548 +12549 +12549 +12550 +12551 +12551 +12552 +12552 +12553 +12554 +12554 +12555 +12555 +12556 +12556 +12557 +12558 +12558 +12559 +12559 +12560 +12561 +12561 +12562 +12562 +12563 +12564 +12564 +12565 +12565 +12566 +12566 +12567 +12568 +12568 +12569 +12569 +12570 +12571 +12571 +12572 +12572 +12573 +12574 +12574 +12575 +12575 +12576 +12576 +12577 +12578 +12578 +12579 +12579 +12580 +12581 +12581 +12582 +12582 +12583 +12583 +12584 +12585 +12585 +12586 +12586 +12587 +12587 +12588 +12589 +12589 +12590 +12590 +12591 +12592 +12592 +12593 +12593 +12594 +12594 +12595 +12596 +12596 +12597 +12597 +12598 +12598 +12599 +12600 +12600 +12601 +12601 +12602 +12602 +12603 +12604 +12604 +12605 +12605 +12606 +12606 +12607 +12608 +12608 +12609 +12609 +12610 +12611 +12611 +12612 +12612 +12613 +12613 +12614 +12615 +12615 +12616 +12616 +12617 +12617 +12618 +12618 +12619 +12620 +12620 +12621 +12621 +12622 +12622 +12623 +12624 +12624 +12625 +12625 +12626 +12626 +12627 +12628 +12628 +12629 +12629 +12630 +12630 +12631 +12632 +12632 +12633 +12633 +12634 +12634 +12635 +12635 +12636 +12637 +12637 +12638 +12638 +12639 +12639 +12640 +12641 +12641 +12642 +12642 +12643 +12643 +12644 +12644 +12645 +12646 +12646 +12647 +12647 +12648 +12648 +12649 +12650 +12650 +12651 +12651 +12652 +12652 +12653 +12653 +12654 +12655 +12655 +12656 +12656 +12657 +12657 +12658 +12658 +12659 +12660 +12660 +12661 +12661 +12662 +12662 +12663 +12663 +12664 +12665 +12665 +12666 +12666 +12667 +12667 +12668 +12668 +12669 +12670 +12670 +12671 +12671 +12672 +12672 +12673 +12673 +12674 +12675 +12675 +12676 +12676 +12677 +12677 +12678 +12678 +12679 +12680 +12680 +12681 +12681 +12682 +12682 +12683 +12683 +12684 +12684 +12685 +12686 +12686 +12687 +12687 +12688 +12688 +12689 +12689 +12690 +12690 +12691 +12692 +12692 +12693 +12693 +12694 +12694 +12695 +12695 +12696 +12696 +12697 +12698 +12698 +12699 +12699 +12700 +12700 +12701 +12701 +12702 +12702 +12703 +12704 +12704 +12705 +12705 +12706 +12706 +12707 +12707 +12708 +12708 +12709 +12710 +12710 +12711 +12711 +12712 +12712 +12713 +12713 +12714 +12714 +12715 +12715 +12716 +12717 +12717 +12718 +12718 +12719 +12719 +12720 +12720 +12721 +12721 +12722 +12722 +12723 +12724 +12724 +12725 +12725 +12726 +12726 +12727 +12727 +12728 +12728 +12729 +12729 +12730 +12731 +12731 +12732 +12732 +12733 +12733 +12734 +12734 +12735 +12735 +12736 +12736 +12737 +12737 +12738 +12739 +12739 +12740 +12740 +12741 +12741 +12742 +12742 +12743 +12743 +12744 +12744 +12745 +12745 +12746 +12747 +12747 +12748 +12748 +12749 +12749 +12750 +12750 +12751 +12751 +12752 +12752 +12753 +12753 +12754 +12754 +12755 +12756 +12756 +12757 +12757 +12758 +12758 +12759 +12759 +12760 +12760 +12761 +12761 +12762 +12762 +12763 +12763 +12764 +12764 +12765 +12766 +12766 +12767 +12767 +12768 +12768 +12769 +12769 +12770 +12770 +12771 +12771 +12772 +12772 +12773 +12773 +12774 +12774 +12775 +12776 +12776 +12777 +12777 +12778 +12778 +12779 +12779 +12780 +12780 +12781 +12781 +12782 +12782 +12783 +12783 +12784 +12784 +12785 +12785 +12786 +12786 +12787 +12787 +12788 +12789 +12789 +12790 +12790 +12791 +12791 +12792 +12792 +12793 +12793 +12794 +12794 +12795 +12795 +12796 +12796 +12797 +12797 +12798 +12799 +12800 +12801 +12802 +12804 +12805 +12806 +12807 +12808 +12809 +12810 +12811 +12812 +12813 +12814 +12815 +12816 +12817 +12818 +12819 +12820 +12821 +12822 +12823 +12824 +12825 +12826 +12827 +12828 +12829 +12830 +12831 +12832 +12833 +12834 +12835 +12836 +12837 +12838 +12839 +12840 +12841 +12842 +12843 +12844 +12845 +12846 +12847 +12848 +12849 +12850 +12851 +12852 +12853 +12854 +12855 +12856 +12857 +12858 +12859 +12860 +12861 +12862 +12863 +12864 +12865 +12866 +12867 +12868 +12869 +12870 +12871 +12872 +12873 +12874 +12875 +12876 +12877 +12878 +12879 +12880 +12881 +12882 +12883 +12884 +12885 +12886 +12887 +12888 +12889 +12890 +12891 +12892 +12893 +12894 +12895 +12896 +12897 +12898 +12899 +12900 +12901 +12902 +12903 +12904 +12905 +12906 +12907 +12908 +12909 +12910 +12911 +12912 +12913 +12914 +12915 +12916 +12917 +12918 +12919 +12920 +12921 +12922 +12922 +12923 +12924 +12925 +12926 +12927 +12928 +12929 +12930 +12931 +12932 +12933 +12934 +12935 +12936 +12937 +12938 +12939 +12940 +12941 +12942 +12943 +12944 +12945 +12946 +12947 +12948 +12949 +12949 +12950 +12951 +12952 +12953 +12954 +12955 +12956 +12957 +12958 +12959 +12960 +12961 +12962 +12963 +12964 +12965 +12966 +12967 +12968 +12969 +12969 +12970 +12971 +12972 +12973 +12974 +12975 +12976 +12977 +12978 +12979 +12980 +12981 +12982 +12983 +12984 +12985 +12986 +12986 +12987 +12988 +12989 +12990 +12991 +12992 +12993 +12994 +12995 +12996 +12997 +12998 +12999 +13000 +13001 +13001 +13002 +13003 +13004 +13005 +13006 +13007 +13008 +13009 +13010 +13011 +13012 +13013 +13014 +13015 +13015 +13016 +13017 +13018 +13019 +13020 +13021 +13022 +13023 +13024 +13025 +13026 +13027 +13027 +13028 +13029 +13030 +13031 +13032 +13033 +13034 +13035 +13036 +13037 +13038 +13039 +13039 +13040 +13041 +13042 +13043 +13044 +13045 +13046 +13047 +13048 +13049 +13049 +13050 +13051 +13052 +13053 +13054 +13055 +13056 +13057 +13058 +13059 +13060 +13060 +13061 +13062 +13063 +13064 +13065 +13066 +13067 +13068 +13069 +13069 +13070 +13071 +13072 +13073 +13074 +13075 +13076 +13077 +13078 +13078 +13079 +13080 +13081 +13082 +13083 +13084 +13085 +13086 +13087 +13087 +13088 +13089 +13090 +13091 +13092 +13093 +13094 +13095 +13096 +13096 +13097 +13098 +13099 +13100 +13101 +13102 +13103 +13104 +13104 +13105 +13106 +13107 +13108 +13109 +13110 +13111 +13112 +13112 +13113 +13114 +13115 +13116 +13117 +13118 +13119 +13120 +13120 +13121 +13122 +13123 +13124 +13125 +13126 +13127 +13127 +13128 +13129 +13130 +13131 +13132 +13133 +13134 +13135 +13135 +13136 +13137 +13138 +13139 +13140 +13141 +13142 +13142 +13143 +13144 +13145 +13146 +13147 +13148 +13149 +13149 +13150 +13151 +13152 +13153 +13154 +13155 +13155 +13156 +13157 +13158 +13159 +13160 +13161 +13162 +13162 +13163 +13164 +13165 +13166 +13167 +13168 +13168 +13169 +13170 +13171 +13172 +13173 +13174 +13175 +13175 +13176 +13177 +13178 +13179 +13180 +13181 +13181 +13182 +13183 +13184 +13185 +13186 +13187 +13187 +13188 +13189 +13190 +13191 +13192 +13193 +13193 +13194 +13195 +13196 +13197 +13198 +13199 +13199 +13200 +13201 +13202 +13203 +13204 +13204 +13205 +13206 +13207 +13208 +13209 +13210 +13210 +13211 +13212 +13213 +13214 +13215 +13216 +13216 +13217 +13218 +13219 +13220 +13221 +13221 +13222 +13223 +13224 +13225 +13226 +13226 +13227 +13228 +13229 +13230 +13231 +13232 +13232 +13233 +13234 +13235 +13236 +13237 +13237 +13238 +13239 +13240 +13241 +13242 +13242 +13243 +13244 +13245 +13246 +13247 +13247 +13248 +13249 +13250 +13251 +13252 +13252 +13253 +13254 +13255 +13256 +13257 +13257 +13258 +13259 +13260 +13261 +13262 +13262 +13263 +13264 +13265 +13266 +13267 +13267 +13268 +13269 +13270 +13271 +13272 +13272 +13273 +13274 +13275 +13276 +13276 +13277 +13278 +13279 +13280 +13281 +13281 +13282 +13283 +13284 +13285 +13286 +13286 +13287 +13288 +13289 +13290 +13290 +13291 +13292 +13293 +13294 +13295 +13295 +13296 +13297 +13298 +13299 +13299 +13300 +13301 +13302 +13303 +13304 +13304 +13305 +13306 +13307 +13308 +13308 +13309 +13310 +13311 +13312 +13312 +13313 +13313 +13313 +13314 +13314 +13315 +13315 +13315 +13316 +13316 +13317 +13317 +13318 +13318 +13318 +13319 +13319 +13320 +13320 +13320 +13321 +13321 +13322 +13322 +13322 +13323 +13323 +13324 +13324 +13324 +13325 +13325 +13326 +13326 +13326 +13327 +13327 +13328 +13328 +13328 +13329 +13329 +13330 +13330 +13330 +13331 +13331 +13332 +13332 +13332 +13333 +13333 +13334 +13334 +13334 +13335 +13335 +13336 +13336 +13336 +13337 +13337 +13338 +13338 +13338 +13339 +13339 +13340 +13340 +13340 +13341 +13341 +13341 +13342 +13342 +13343 +13343 +13343 +13344 +13344 +13345 +13345 +13345 +13346 +13346 +13347 +13347 +13347 +13348 +13348 +13349 +13349 +13349 +13350 +13350 +13351 +13351 +13351 +13352 +13352 +13353 +13353 +13353 +13354 +13354 +13354 +13355 +13355 +13356 +13356 +13356 +13357 +13357 +13358 +13358 +13358 +13359 +13359 +13360 +13360 +13360 +13361 +13361 +13362 +13362 +13362 +13363 +13363 +13363 +13364 +13364 +13365 +13365 +13365 +13366 +13366 +13367 +13367 +13367 +13368 +13368 +13369 +13369 +13369 +13370 +13370 +13370 +13371 +13371 +13372 +13372 +13372 +13373 +13373 +13374 +13374 +13374 +13375 +13375 +13375 +13376 +13376 +13377 +13377 +13377 +13378 +13378 +13379 +13379 +13379 +13380 +13380 +13380 +13381 +13381 +13382 +13382 +13382 +13383 +13383 +13384 +13384 +13384 +13385 +13385 +13385 +13386 +13386 +13387 +13387 +13387 +13388 +13388 +13388 +13389 +13389 +13390 +13390 +13390 +13391 +13391 +13392 +13392 +13392 +13393 +13393 +13393 +13394 +13394 +13395 +13395 +13395 +13396 +13396 +13396 +13397 +13397 +13398 +13398 +13398 +13399 +13399 +13399 +13400 +13400 +13401 +13401 +13401 +13402 +13402 +13402 +13403 +13403 +13404 +13404 +13404 +13405 +13405 +13405 +13406 +13406 +13407 +13407 +13407 +13408 +13408 +13409 +13409 +13409 +13410 +13410 +13410 +13411 +13411 +13411 +13412 +13412 +13413 +13413 +13413 +13414 +13414 +13414 +13415 +13415 +13416 +13416 +13416 +13417 +13417 +13417 +13418 +13418 +13419 +13419 +13419 +13420 +13420 +13420 +13421 +13421 +13422 +13422 +13422 +13423 +13423 +13423 +13424 +13424 +13425 +13425 +13425 +13426 +13426 +13426 +13427 +13427 +13427 +13428 +13428 +13429 +13429 +13429 +13430 +13430 +13430 +13431 +13431 +13432 +13432 +13432 +13433 +13433 +13433 +13434 +13434 +13434 +13435 +13435 +13436 +13436 +13436 +13437 +13437 +13437 +13438 +13438 +13439 +13439 +13439 +13440 +13440 +13440 +13441 +13441 +13441 +13442 +13442 +13443 +13443 +13443 +13444 +13444 +13444 +13445 +13445 +13445 +13446 +13446 +13447 +13447 +13447 +13448 +13448 +13448 +13449 +13449 +13449 +13450 +13450 +13451 +13451 +13451 +13452 +13452 +13452 +13453 +13453 +13453 +13454 +13454 +13455 +13455 +13455 +13456 +13456 +13456 +13457 +13457 +13457 +13458 +13458 +13458 +13459 +13459 +13460 +13460 +13460 +13461 +13461 +13461 +13462 +13462 +13462 +13463 +13463 +13464 +13464 +13464 +13465 +13465 +13465 +13466 +13466 +13466 +13467 +13467 +13467 +13468 +13468 +13469 +13469 +13469 +13470 +13470 +13470 +13471 +13471 +13471 +13472 +13472 +13472 +13473 +13473 +13474 +13474 +13474 +13475 +13475 +13475 +13476 +13476 +13476 +13477 +13477 +13477 +13478 +13478 +13479 +13479 +13479 +13480 +13480 +13480 +13481 +13481 +13481 +13482 +13482 +13482 +13483 +13483 +13483 +13484 +13484 +13485 +13485 +13485 +13486 +13487 +13487 +13488 +13489 +13489 +13490 +13491 +13492 +13492 +13493 +13494 +13494 +13495 +13496 +13496 +13497 +13498 +13499 +13499 +13500 +13501 +13501 +13502 +13503 +13503 +13504 +13505 +13506 +13506 +13507 +13508 +13508 +13509 +13510 +13510 +13511 +13512 +13512 +13513 +13514 +13515 +13515 +13516 +13517 +13517 +13518 +13519 +13519 +13520 +13521 +13521 +13522 +13523 +13524 +13524 +13525 +13526 +13526 +13527 +13528 +13528 +13529 +13530 +13530 +13531 +13532 +13532 +13533 +13534 +13534 +13535 +13536 +13536 +13537 +13538 +13539 +13539 +13540 +13541 +13541 +13542 +13543 +13543 +13544 +13545 +13545 +13546 +13547 +13547 +13548 +13549 +13549 +13550 +13551 +13551 +13552 +13553 +13553 +13554 +13555 +13555 +13556 +13557 +13557 +13558 +13559 +13559 +13560 +13561 +13561 +13562 +13563 +13563 +13564 +13565 +13565 +13566 +13567 +13567 +13568 +13569 +13569 +13570 +13571 +13571 +13572 +13573 +13573 +13574 +13575 +13575 +13576 +13577 +13577 +13578 +13579 +13579 +13580 +13581 +13581 +13582 +13583 +13583 +13584 +13585 +13585 +13586 +13587 +13587 +13588 +13588 +13589 +13590 +13590 +13591 +13592 +13592 +13593 +13594 +13594 +13595 +13596 +13596 +13597 +13598 +13598 +13599 +13600 +13600 +13601 +13602 +13602 +13603 +13603 +13604 +13605 +13605 +13606 +13607 +13607 +13608 +13609 +13609 +13610 +13611 +13611 +13612 +13612 +13613 +13614 +13614 +13615 +13616 +13616 +13617 +13618 +13618 +13619 +13620 +13620 +13621 +13621 +13622 +13623 +13623 +13624 +13625 +13625 +13626 +13627 +13627 +13628 +13628 +13629 +13630 +13630 +13631 +13632 +13632 +13633 +13634 +13634 +13635 +13635 +13636 +13637 +13637 +13638 +13639 +13639 +13640 +13641 +13641 +13642 +13642 +13643 +13644 +13644 +13645 +13646 +13646 +13647 +13647 +13648 +13649 +13649 +13650 +13651 +13651 +13652 +13652 +13653 +13654 +13654 +13655 +13656 +13656 +13657 +13657 +13658 +13659 +13659 +13660 +13661 +13661 +13662 +13662 +13663 +13664 +13664 +13665 +13666 +13666 +13667 +13667 +13668 +13669 +13669 +13670 +13670 +13671 +13672 +13672 +13673 +13674 +13674 +13675 +13675 +13676 +13677 +13677 +13678 +13678 +13679 +13680 +13680 +13681 +13682 +13682 +13683 +13683 +13684 +13685 +13685 +13686 +13686 +13687 +13688 +13688 +13689 +13690 +13690 +13691 +13691 +13692 +13693 +13693 +13694 +13694 +13695 +13696 +13696 +13697 +13697 +13698 +13699 +13699 +13700 +13700 +13701 +13702 +13702 +13703 +13703 +13704 +13705 +13705 +13706 +13707 +13707 +13708 +13708 +13709 +13710 +13710 +13711 +13711 +13712 +13713 +13713 +13714 +13714 +13715 +13716 +13716 +13717 +13717 +13718 +13719 +13719 +13720 +13720 +13721 +13722 +13722 +13723 +13723 +13724 +13724 +13725 +13726 +13726 +13727 +13727 +13728 +13729 +13729 +13730 +13730 +13731 +13732 +13732 +13733 +13733 +13734 +13735 +13735 +13736 +13736 +13737 +13738 +13738 +13739 +13739 +13740 +13740 +13741 +13742 +13742 +13743 +13743 +13744 +13745 +13745 +13746 +13746 +13747 +13748 +13748 +13749 +13749 +13750 +13750 +13751 +13752 +13752 +13753 +13753 +13754 +13755 +13755 +13756 +13756 +13757 +13758 +13758 +13759 +13759 +13760 +13760 +13761 +13762 +13762 +13763 +13763 +13764 +13764 +13765 +13766 +13766 +13767 +13767 +13768 +13769 +13769 +13770 +13770 +13771 +13771 +13772 +13773 +13773 +13774 +13774 +13775 +13775 +13776 +13777 +13777 +13778 +13778 +13779 +13780 +13780 +13781 +13781 +13782 +13782 +13783 +13784 +13784 +13785 +13785 +13786 +13786 +13787 +13788 +13788 +13789 +13789 +13790 +13790 +13791 +13792 +13792 +13793 +13793 +13794 +13794 +13795 +13796 +13796 +13797 +13797 +13798 +13798 +13799 +13799 +13800 +13801 +13801 +13802 +13802 +13803 +13803 +13804 +13805 +13805 +13806 +13806 +13807 +13807 +13808 +13809 +13809 +13810 +13810 +13811 +13811 +13812 +13812 +13813 +13814 +13814 +13815 +13815 +13816 +13816 +13817 +13818 +13818 +13819 +13819 +13820 +13820 +13821 +13821 +13822 +13823 +13823 +13824 +13824 +13825 +13825 +13826 +13827 +13827 +13828 +13828 +13829 +13829 +13830 +13830 +13831 +13832 +13832 +13833 +13833 +13834 +13834 +13835 +13835 +13836 +13837 +13837 +13838 +13838 +13839 +13839 +13840 +13840 +13841 +13842 +13842 +13843 +13843 +13844 +13844 +13845 +13845 +13846 +13846 +13847 +13848 +13848 +13849 +13849 +13850 +13850 +13851 +13851 +13852 +13853 +13853 +13854 +13854 +13855 +13855 +13856 +13856 +13857 +13857 +13858 +13859 +13859 +13860 +13860 +13861 +13861 +13862 +13862 +13863 +13863 +13864 +13865 +13865 +13866 +13866 +13867 +13867 +13868 +13868 +13869 +13869 +13870 +13871 +13871 +13872 +13872 +13873 +13873 +13874 +13874 +13875 +13875 +13876 +13877 +13877 +13878 +13878 +13879 +13879 +13880 +13880 +13881 +13881 +13882 +13882 +13883 +13884 +13884 +13885 +13885 +13886 +13886 +13887 +13887 +13888 +13888 +13889 +13889 +13890 +13891 +13891 +13892 +13892 +13893 +13893 +13894 +13894 +13895 +13895 +13896 +13896 +13897 +13897 +13898 +13899 +13899 +13900 +13900 +13901 +13901 +13902 +13902 +13903 +13903 +13904 +13904 +13905 +13905 +13906 +13907 +13907 +13908 +13908 +13909 +13909 +13910 +13910 +13911 +13911 +13912 +13912 +13913 +13913 +13914 +13914 +13915 +13916 +13916 +13917 +13917 +13918 +13918 +13919 +13919 +13920 +13920 +13921 +13921 +13922 +13922 +13923 +13923 +13924 +13924 +13925 +13926 +13926 +13927 +13927 +13928 +13928 +13929 +13929 +13930 +13930 +13931 +13931 +13932 +13932 +13933 +13933 +13934 +13934 +13935 +13935 +13936 +13937 +13937 +13938 +13938 +13939 +13939 +13940 +13940 +13941 +13941 +13942 +13942 +13943 +13943 +13944 +13944 +13945 +13945 +13946 +13946 +13947 +13947 +13948 +13948 +13949 +13950 +13950 +13951 +13951 +13952 +13952 +13953 +13953 +13954 +13954 +13955 +13955 +13956 +13956 +13957 +13957 +13958 +13958 +13959 +13959 +13960 +13960 +13961 +13961 +13962 +13962 +13963 +13963 +13964 +13964 +13965 +13966 +13966 +13967 +13967 +13968 +13968 +13969 +13969 +13970 +13970 +13971 +13971 +13972 +13972 +13973 +13973 +13974 +13974 +13975 +13975 +13976 +13976 +13977 +13977 +13978 +13978 +13979 +13979 +13980 +13980 +13981 +13981 +13982 +13982 +13983 +13983 +13984 +13984 +13985 +13985 +13986 +13986 +13987 +13987 +13988 +13988 +13989 +13989 +13990 +13990 +13991 +13991 +13992 +13992 +13993 +13993 +13994 +13994 +13995 +13996 +13996 +13997 +13997 +13998 +13998 +13999 +13999 +14000 +14000 +14001 +14001 +14002 +14002 +14003 +14003 +14004 +14004 +14005 +14005 +14006 +14006 +14007 +14007 +14008 +14008 +14009 +14009 +14010 +14010 +14011 +14011 +14012 +14012 +14013 +14013 +14014 +14014 +14015 +14015 +14016 +14016 +14017 +14017 +14018 +14018 +14019 +14019 +14020 +14020 +14021 +14021 +14022 +14022 +14023 +14023 +14024 +14024 +14024 +14025 +14025 +14026 +14026 +14027 +14027 +14028 +14028 +14029 +14029 +14030 +14030 +14031 +14031 +14032 +14032 +14033 +14033 +14034 +14034 +14035 +14035 +14036 +14036 +14037 +14037 +14038 +14038 +14039 +14039 +14040 +14040 +14041 +14041 +14042 +14042 +14043 +14043 +14044 +14044 +14045 +14045 +14046 +14046 +14047 +14047 +14048 +14048 +14049 +14049 +14050 +14050 +14051 +14051 +14052 +14052 +14053 +14053 +14054 +14054 +14054 +14055 +14055 +14056 +14056 +14057 +14057 +14058 +14058 +14059 +14059 +14060 +14060 +14061 +14061 +14062 +14062 +14063 +14063 +14064 +14064 +14065 +14065 +14066 +14066 +14067 +14067 +14068 +14068 +14069 +14069 +14070 +14070 +14070 +14071 +14071 +14072 +14072 +14073 +14073 +14074 +14075 +14076 +14077 +14078 +14079 +14080 +14081 +14082 +14083 +14084 +14085 +14086 +14087 +14088 +14089 +14090 +14091 +14092 +14093 +14094 +14094 +14095 +14096 +14097 +14098 +14099 +14100 +14101 +14102 +14103 +14104 +14105 +14106 +14107 +14108 +14109 +14110 +14111 +14112 +14113 +14113 +14114 +14115 +14116 +14117 +14118 +14119 +14120 +14121 +14122 +14123 +14124 +14125 +14126 +14127 +14128 +14128 +14129 +14130 +14131 +14132 +14133 +14134 +14135 +14136 +14137 +14138 +14139 +14140 +14141 +14142 +14142 +14143 +14144 +14145 +14146 +14147 +14148 +14149 +14150 +14151 +14152 +14153 +14154 +14155 +14155 +14156 +14157 +14158 +14159 +14160 +14161 +14162 +14163 +14164 +14165 +14166 +14166 +14167 +14168 +14169 +14170 +14171 +14172 +14173 +14174 +14175 +14176 +14177 +14177 +14178 +14179 +14180 +14181 +14182 +14183 +14184 +14185 +14186 +14187 +14187 +14188 +14189 +14190 +14191 +14192 +14193 +14194 +14195 +14196 +14196 +14197 +14198 +14199 +14200 +14201 +14202 +14203 +14204 +14205 +14205 +14206 +14207 +14208 +14209 +14210 +14211 +14212 +14213 +14214 +14214 +14215 +14216 +14217 +14218 +14219 +14220 +14221 +14222 +14222 +14223 +14224 +14225 +14226 +14227 +14228 +14229 +14230 +14230 +14231 +14232 +14233 +14234 +14235 +14236 +14237 +14238 +14238 +14239 +14240 +14241 +14242 +14243 +14244 +14245 +14245 +14246 +14247 +14248 +14249 +14250 +14251 +14252 +14253 +14253 +14254 +14255 +14256 +14257 +14258 +14259 +14260 +14260 +14261 +14262 +14263 +14264 +14265 +14266 +14266 +14267 +14268 +14269 +14270 +14271 +14272 +14273 +14273 +14274 +14275 +14276 +14277 +14278 +14279 +14279 +14280 +14281 +14282 +14283 +14284 +14285 +14286 +14286 +14287 +14288 +14289 +14290 +14291 +14292 +14292 +14293 +14294 +14295 +14296 +14297 +14298 +14298 +14299 +14300 +14301 +14302 +14303 +14304 +14304 +14305 +14306 +14307 +14308 +14309 +14310 +14310 +14311 +14312 +14313 +14314 +14315 +14315 +14316 +14317 +14318 +14319 +14320 +14321 +14321 +14322 +14323 +14324 +14325 +14326 +14326 +14327 +14328 +14329 +14330 +14331 +14332 +14332 +14333 +14334 +14335 +14336 +14336 +14337 +14337 +14338 +14338 +14338 +14339 +14339 +14340 +14340 +14340 +14341 +14341 +14342 +14342 +14343 +14343 +14343 +14344 +14344 +14345 +14345 +14345 +14346 +14346 +14347 +14347 +14348 +14348 +14348 +14349 +14349 +14350 +14350 +14350 +14351 +14351 +14352 +14352 +14353 +14353 +14353 +14354 +14354 +14355 +14355 +14355 +14356 +14356 +14357 +14357 +14357 +14358 +14358 +14359 +14359 +14360 +14360 +14360 +14361 +14361 +14362 +14362 +14362 +14363 +14363 +14364 +14364 +14364 +14365 +14365 +14366 +14366 +14366 +14367 +14367 +14368 +14368 +14369 +14369 +14369 +14370 +14370 +14371 +14371 +14371 +14372 +14372 +14373 +14373 +14373 +14374 +14374 +14375 +14375 +14375 +14376 +14376 +14377 +14377 +14377 +14378 +14378 +14379 +14379 +14379 +14380 +14380 +14381 +14381 +14381 +14382 +14382 +14383 +14383 +14383 +14384 +14384 +14385 +14385 +14385 +14386 +14386 +14387 +14387 +14387 +14388 +14388 +14389 +14389 +14389 +14390 +14390 +14391 +14391 +14391 +14392 +14392 +14393 +14393 +14393 +14394 +14394 +14395 +14395 +14395 +14396 +14396 +14397 +14397 +14397 +14398 +14398 +14399 +14399 +14399 +14400 +14400 +14401 +14401 +14401 +14402 +14402 +14403 +14403 +14403 +14404 +14404 +14405 +14405 +14405 +14406 +14406 +14406 +14407 +14407 +14408 +14408 +14408 +14409 +14409 +14410 +14410 +14410 +14411 +14411 +14412 +14412 +14412 +14413 +14413 +14414 +14414 +14414 +14415 +14415 +14415 +14416 +14416 +14417 +14417 +14417 +14418 +14418 +14419 +14419 +14419 +14420 +14420 +14421 +14421 +14421 +14422 +14422 +14422 +14423 +14423 +14424 +14424 +14424 +14425 +14425 +14426 +14426 +14426 +14427 +14427 +14427 +14428 +14428 +14429 +14429 +14429 +14430 +14430 +14431 +14431 +14431 +14432 +14432 +14432 +14433 +14433 +14434 +14434 +14434 +14435 +14435 +14436 +14436 +14436 +14437 +14437 +14437 +14438 +14438 +14439 +14439 +14439 +14440 +14440 +14440 +14441 +14441 +14442 +14442 +14442 +14443 +14443 +14444 +14444 +14444 +14445 +14445 +14445 +14446 +14446 +14447 +14447 +14447 +14448 +14448 +14448 +14449 +14449 +14450 +14450 +14450 +14451 +14451 +14451 +14452 +14452 +14453 +14453 +14453 +14454 +14454 +14454 +14455 +14455 +14456 +14456 +14456 +14457 +14457 +14457 +14458 +14458 +14459 +14459 +14459 +14460 +14460 +14460 +14461 +14461 +14462 +14462 +14462 +14463 +14463 +14463 +14464 +14464 +14465 +14465 +14465 +14466 +14466 +14466 +14467 +14467 +14468 +14468 +14468 +14469 +14469 +14469 +14470 +14470 +14470 +14471 +14471 +14472 +14472 +14472 +14473 +14473 +14473 +14474 +14474 +14475 +14475 +14475 +14476 +14476 +14476 +14477 +14477 +14477 +14478 +14478 +14479 +14479 +14479 +14480 +14480 +14480 +14481 +14481 +14482 +14482 +14482 +14483 +14483 +14483 +14484 +14484 +14484 +14485 +14485 +14486 +14486 +14486 +14487 +14487 +14487 +14488 +14488 +14488 +14489 +14489 +14490 +14490 +14490 +14491 +14491 +14491 +14492 +14492 +14492 +14493 +14493 +14494 +14494 +14494 +14495 +14495 +14495 +14496 +14496 +14496 +14497 +14497 +14498 +14498 +14498 +14499 +14499 +14499 +14500 +14500 +14500 +14501 +14501 +14501 +14502 +14502 +14503 +14503 +14503 +14504 +14504 +14504 +14505 +14505 +14505 +14506 +14506 +14507 +14507 +14507 +14508 +14508 +14508 +14509 +14509 +14509 +14510 +14510 +14510 +14511 +14511 +14512 +14512 +14512 +14513 +14513 +14513 +14514 +14514 +14514 +14515 +14515 +14515 +14516 +14516 +14517 +14517 +14517 +14518 +14518 +14518 +14519 +14519 +14519 +14520 +14520 +14520 +14521 +14521 +14521 +14522 +14522 +14523 +14523 +14523 +14524 +14524 +14524 +14525 +14525 +14525 +14526 +14526 +14526 +14527 +14527 +14527 +14528 +14528 +14529 +14529 +14529 +14530 +14530 +14530 +14531 +14531 +14531 +14532 +14532 +14532 +14533 +14533 +14533 +14534 +14534 +14534 +14535 +14535 +14536 +14536 +14536 +14537 +14537 +14537 +14538 +14538 +14538 +14539 +14539 +14539 +14540 +14540 +14540 +14541 +14541 +14541 +14542 +14542 +14543 +14543 +14543 +14544 +14544 +14544 +14545 +14545 +14545 +14546 +14546 +14546 +14547 +14547 +14547 +14548 +14548 +14548 +14549 +14549 +14549 +14550 +14550 +14550 +14551 +14551 +14552 +14552 +14552 +14553 +14553 +14553 +14554 +14554 +14554 +14555 +14555 +14555 +14556 +14556 +14556 +14557 +14557 +14557 +14558 +14558 +14558 +14559 +14559 +14559 +14560 +14560 +14560 +14561 +14561 +14561 +14562 +14562 +14562 +14563 +14563 +14564 +14564 +14564 +14565 +14565 +14565 +14566 +14566 +14566 +14567 +14567 +14567 +14568 +14568 +14568 +14569 +14569 +14569 +14570 +14570 +14570 +14571 +14571 +14571 +14572 +14572 +14572 +14573 +14573 +14573 +14574 +14574 +14574 +14575 +14575 +14575 +14576 +14576 +14576 +14577 +14577 +14577 +14578 +14578 +14578 +14579 +14579 +14579 +14580 +14580 +14580 +14581 +14581 +14581 +14582 +14582 +14582 +14583 +14583 +14583 +14584 +14584 +14584 +14585 +14585 +14585 +14586 +14586 +14586 +14587 +14587 +14588 +14588 +14588 +14589 +14589 +14589 +14590 +14590 +14590 +14591 +14591 +14591 +14592 +14592 +14592 +14593 +14593 +14593 +14594 +14594 +14594 +14595 +14595 +14595 +14596 +14596 +14596 +14597 +14597 +14597 +14597 +14598 +14598 +14598 +14599 +14599 +14599 +14600 +14600 +14600 +14601 +14601 +14601 +14602 +14602 +14602 +14603 +14603 +14603 +14604 +14604 +14604 +14605 +14605 +14605 +14606 +14606 +14606 +14607 +14608 +14608 +14609 +14610 +14610 +14611 +14612 +14612 +14613 +14614 +14614 +14615 +14616 +14616 +14617 +14618 +14618 +14619 +14620 +14620 +14621 +14621 +14622 +14623 +14623 +14624 +14625 +14625 +14626 +14627 +14627 +14628 +14629 +14629 +14630 +14631 +14631 +14632 +14632 +14633 +14634 +14634 +14635 +14636 +14636 +14637 +14638 +14638 +14639 +14640 +14640 +14641 +14641 +14642 +14643 +14643 +14644 +14645 +14645 +14646 +14647 +14647 +14648 +14649 +14649 +14650 +14650 +14651 +14652 +14652 +14653 +14654 +14654 +14655 +14656 +14656 +14657 +14657 +14658 +14659 +14659 +14660 +14661 +14661 +14662 +14662 +14663 +14664 +14664 +14665 +14666 +14666 +14667 +14667 +14668 +14669 +14669 +14670 +14671 +14671 +14672 +14672 +14673 +14674 +14674 +14675 +14676 +14676 +14677 +14677 +14678 +14679 +14679 +14680 +14681 +14681 +14682 +14682 +14683 +14684 +14684 +14685 +14686 +14686 +14687 +14687 +14688 +14689 +14689 +14690 +14690 +14691 +14692 +14692 +14693 +14694 +14694 +14695 +14695 +14696 +14697 +14697 +14698 +14698 +14699 +14700 +14700 +14701 +14702 +14702 +14703 +14703 +14704 +14705 +14705 +14706 +14706 +14707 +14708 +14708 +14709 +14709 +14710 +14711 +14711 +14712 +14712 +14713 +14714 +14714 +14715 +14716 +14716 +14717 +14717 +14718 +14719 +14719 +14720 +14720 +14721 +14722 +14722 +14723 +14723 +14724 +14725 +14725 +14726 +14726 +14727 +14728 +14728 +14729 +14729 +14730 +14731 +14731 +14732 +14732 +14733 +14734 +14734 +14735 +14735 +14736 +14737 +14737 +14738 +14738 +14739 +14739 +14740 +14741 +14741 +14742 +14742 +14743 +14744 +14744 +14745 +14745 +14746 +14747 +14747 +14748 +14748 +14749 +14750 +14750 +14751 +14751 +14752 +14752 +14753 +14754 +14754 +14755 +14755 +14756 +14757 +14757 +14758 +14758 +14759 +14760 +14760 +14761 +14761 +14762 +14762 +14763 +14764 +14764 +14765 +14765 +14766 +14767 +14767 +14768 +14768 +14769 +14769 +14770 +14771 +14771 +14772 +14772 +14773 +14773 +14774 +14775 +14775 +14776 +14776 +14777 +14778 +14778 +14779 +14779 +14780 +14780 +14781 +14782 +14782 +14783 +14783 +14784 +14784 +14785 +14786 +14786 +14787 +14787 +14788 +14788 +14789 +14790 +14790 +14791 +14791 +14792 +14792 +14793 +14794 +14794 +14795 +14795 +14796 +14796 +14797 +14798 +14798 +14799 +14799 +14800 +14800 +14801 +14802 +14802 +14803 +14803 +14804 +14804 +14805 +14806 +14806 +14807 +14807 +14808 +14808 +14809 +14810 +14810 +14811 +14811 +14812 +14812 +14813 +14813 +14814 +14815 +14815 +14816 +14816 +14817 +14817 +14818 +14818 +14819 +14820 +14820 +14821 +14821 +14822 +14822 +14823 +14824 +14824 +14825 +14825 +14826 +14826 +14827 +14827 +14828 +14829 +14829 +14830 +14830 +14831 +14831 +14832 +14832 +14833 +14834 +14834 +14835 +14835 +14836 +14836 +14837 +14837 +14838 +14839 +14839 +14840 +14840 +14841 +14841 +14842 +14842 +14843 +14843 +14844 +14845 +14845 +14846 +14846 +14847 +14847 +14848 +14848 +14849 +14850 +14850 +14851 +14851 +14852 +14852 +14853 +14853 +14854 +14854 +14855 +14856 +14856 +14857 +14857 +14858 +14858 +14859 +14859 +14860 +14860 +14861 +14862 +14862 +14863 +14863 +14864 +14864 +14865 +14865 +14866 +14866 +14867 +14868 +14868 +14869 +14869 +14870 +14870 +14871 +14871 +14872 +14872 +14873 +14873 +14874 +14875 +14875 +14876 +14876 +14877 +14877 +14878 +14878 +14879 +14879 +14880 +14880 +14881 +14882 +14882 +14883 +14883 +14884 +14884 +14885 +14885 +14886 +14886 +14887 +14887 +14888 +14888 +14889 +14890 +14890 +14891 +14891 +14892 +14892 +14893 +14893 +14894 +14894 +14895 +14895 +14896 +14896 +14897 +14898 +14898 +14899 +14899 +14900 +14900 +14901 +14901 +14902 +14902 +14903 +14903 +14904 +14904 +14905 +14905 +14906 +14907 +14907 +14908 +14908 +14909 +14909 +14910 +14910 +14911 +14911 +14912 +14912 +14913 +14913 +14914 +14914 +14915 +14915 +14916 +14916 +14917 +14918 +14918 +14919 +14919 +14920 +14920 +14921 +14921 +14922 +14922 +14923 +14923 +14924 +14924 +14925 +14925 +14926 +14926 +14927 +14927 +14928 +14928 +14929 +14930 +14930 +14931 +14931 +14932 +14932 +14933 +14933 +14934 +14934 +14935 +14935 +14936 +14936 +14937 +14937 +14938 +14938 +14939 +14939 +14940 +14940 +14941 +14941 +14942 +14942 +14943 +14943 +14944 +14945 +14945 +14946 +14946 +14947 +14947 +14948 +14948 +14949 +14949 +14950 +14950 +14951 +14951 +14952 +14952 +14953 +14953 +14954 +14954 +14955 +14955 +14956 +14956 +14957 +14957 +14958 +14958 +14959 +14959 +14960 +14960 +14961 +14961 +14962 +14962 +14963 +14963 +14964 +14964 +14965 +14965 +14966 +14966 +14967 +14967 +14968 +14968 +14969 +14969 +14970 +14970 +14971 +14971 +14972 +14973 +14973 +14974 +14974 +14975 +14975 +14976 +14976 +14977 +14977 +14978 +14978 +14979 +14979 +14980 +14980 +14981 +14981 +14982 +14982 +14983 +14983 +14984 +14984 +14985 +14985 +14986 +14986 +14987 +14987 +14988 +14988 +14989 +14989 +14990 +14990 +14991 +14991 +14992 +14992 +14993 +14993 +14994 +14994 +14995 +14995 +14996 +14996 +14997 +14997 +14998 +14998 +14999 +14999 +15000 +15000 +15000 +15001 +15001 +15002 +15002 +15003 +15003 +15004 +15004 +15005 +15005 +15006 +15006 +15007 +15007 +15008 +15008 +15009 +15009 +15010 +15010 +15011 +15011 +15012 +15012 +15013 +15013 +15014 +15014 +15015 +15015 +15016 +15016 +15017 +15017 +15018 +15018 +15019 +15019 +15020 +15020 +15021 +15021 +15022 +15022 +15023 +15023 +15024 +15024 +15025 +15025 +15026 +15026 +15027 +15027 +15028 +15028 +15028 +15029 +15029 +15030 +15030 +15031 +15031 +15032 +15032 +15033 +15033 +15034 +15034 +15035 +15035 +15036 +15036 +15037 +15037 +15038 +15038 +15039 +15039 +15040 +15040 +15041 +15041 +15042 +15042 +15043 +15043 +15043 +15044 +15044 +15045 +15045 +15046 +15046 +15047 +15047 +15048 +15048 +15049 +15049 +15050 +15050 +15051 +15051 +15052 +15052 +15053 +15053 +15054 +15054 +15055 +15055 +15055 +15056 +15056 +15057 +15057 +15058 +15058 +15059 +15059 +15060 +15060 +15061 +15061 +15062 +15062 +15063 +15063 +15064 +15064 +15065 +15065 +15066 +15066 +15066 +15067 +15067 +15068 +15068 +15069 +15069 +15070 +15070 +15071 +15071 +15072 +15072 +15073 +15073 +15074 +15074 +15075 +15075 +15075 +15076 +15076 +15077 +15077 +15078 +15078 +15079 +15079 +15080 +15080 +15081 +15081 +15082 +15082 +15083 +15083 +15083 +15084 +15084 +15085 +15085 +15086 +15086 +15087 +15087 +15088 +15088 +15089 +15089 +15090 +15090 +15091 +15091 +15091 +15092 +15092 +15093 +15093 +15094 +15094 +15095 +15095 +15096 +15096 +15097 +15097 +15098 +15098 +15098 +15099 +15099 +15100 +15100 +15101 +15101 +15102 +15102 +15103 +15103 +15104 +15104 +15104 +15105 +15105 +15106 +15106 +15107 +15107 +15108 +15108 +15109 +15109 +15110 +15110 +15111 +15111 +15111 +15112 +15112 +15113 +15113 +15114 +15114 +15115 +15115 +15116 +15116 +15117 +15117 +15117 +15118 +15118 +15119 +15119 +15120 +15120 +15121 +15121 +15122 +15122 +15122 +15123 +15123 +15124 +15124 +15125 +15125 +15126 +15126 +15127 +15127 +15128 +15128 +15128 +15129 +15129 +15130 +15130 +15131 +15131 +15132 +15132 +15133 +15133 +15133 +15134 +15134 +15135 +15135 +15136 +15136 +15137 +15137 +15138 +15138 +15138 +15139 +15139 +15140 +15140 +15141 +15141 +15142 +15142 +15143 +15143 +15143 +15144 +15144 +15145 +15145 +15146 +15146 +15147 +15147 +15148 +15148 +15148 +15149 +15149 +15150 +15150 +15151 +15151 +15152 +15152 +15152 +15153 +15153 +15154 +15154 +15155 +15155 +15156 +15157 +15158 +15159 +15160 +15161 +15161 +15162 +15163 +15164 +15165 +15166 +15167 +15168 +15169 +15170 +15170 +15171 +15172 +15173 +15174 +15175 +15176 +15177 +15178 +15178 +15179 +15180 +15181 +15182 +15183 +15184 +15185 +15186 +15186 +15187 +15188 +15189 +15190 +15191 +15192 +15193 +15193 +15194 +15195 +15196 +15197 +15198 +15199 +15200 +15200 +15201 +15202 +15203 +15204 +15205 +15206 +15207 +15207 +15208 +15209 +15210 +15211 +15212 +15213 +15214 +15214 +15215 +15216 +15217 +15218 +15219 +15220 +15221 +15221 +15222 +15223 +15224 +15225 +15226 +15227 +15227 +15228 +15229 +15230 +15231 +15232 +15233 +15233 +15234 +15235 +15236 +15237 +15238 +15239 +15239 +15240 +15241 +15242 +15243 +15244 +15245 +15245 +15246 +15247 +15248 +15249 +15250 +15251 +15251 +15252 +15253 +15254 +15255 +15256 +15257 +15257 +15258 +15259 +15260 +15261 +15262 +15262 +15263 +15264 +15265 +15266 +15267 +15268 +15268 +15269 +15270 +15271 +15272 +15273 +15273 +15274 +15275 +15276 +15277 +15278 +15278 +15279 +15280 +15281 +15282 +15283 +15283 +15284 +15285 +15286 +15287 +15288 +15288 +15289 +15290 +15291 +15292 +15293 +15293 +15294 +15295 +15296 +15297 +15298 +15298 +15299 +15300 +15301 +15302 +15303 +15303 +15304 +15305 +15306 +15307 +15308 +15308 +15309 +15310 +15311 +15312 +15312 +15313 +15314 +15315 +15316 +15317 +15317 +15318 +15319 +15320 +15321 +15321 +15322 +15323 +15324 +15325 +15326 +15326 +15327 +15328 +15329 +15330 +15330 +15331 +15332 +15333 +15334 +15335 +15335 +15336 +15337 +15338 +15339 +15339 +15340 +15341 +15342 +15343 +15343 +15344 +15345 +15346 +15347 +15347 +15348 +15349 +15350 +15351 +15352 +15352 +15353 +15354 +15355 +15356 +15356 +15357 +15358 +15359 +15360 +15360 +15361 +15361 +15361 +15362 +15362 +15363 +15363 +15363 +15364 +15364 +15365 +15365 +15365 +15366 +15366 +15367 +15367 +15367 +15368 +15368 +15369 +15369 +15369 +15370 +15370 +15371 +15371 +15371 +15372 +15372 +15373 +15373 +15373 +15374 +15374 +15374 +15375 +15375 +15376 +15376 +15376 +15377 +15377 +15378 +15378 +15378 +15379 +15379 +15380 +15380 +15380 +15381 +15381 +15382 +15382 +15382 +15383 +15383 +15384 +15384 +15384 +15385 +15385 +15385 +15386 +15386 +15387 +15387 +15387 +15388 +15388 +15389 +15389 +15389 +15390 +15390 +15391 +15391 +15391 +15392 +15392 +15392 +15393 +15393 +15394 +15394 +15394 +15395 +15395 +15396 +15396 +15396 +15397 +15397 +15397 +15398 +15398 +15399 +15399 +15399 +15400 +15400 +15401 +15401 +15401 +15402 +15402 +15402 +15403 +15403 +15404 +15404 +15404 +15405 +15405 +15406 +15406 +15406 +15407 +15407 +15407 +15408 +15408 +15409 +15409 +15409 +15410 +15410 +15410 +15411 +15411 +15412 +15412 +15412 +15413 +15413 +15413 +15414 +15414 +15415 +15415 +15415 +15416 +15416 +15417 +15417 +15417 +15418 +15418 +15418 +15419 +15419 +15420 +15420 +15420 +15421 +15421 +15421 +15422 +15422 +15423 +15423 +15423 +15424 +15424 +15424 +15425 +15425 +15426 +15426 +15426 +15427 +15427 +15427 +15428 +15428 +15429 +15429 +15429 +15430 +15430 +15430 +15431 +15431 +15431 +15432 +15432 +15433 +15433 +15433 +15434 +15434 +15434 +15435 +15435 +15436 +15436 +15436 +15437 +15437 +15437 +15438 +15438 +15439 +15439 +15439 +15440 +15440 +15440 +15441 +15441 +15441 +15442 +15442 +15443 +15443 +15443 +15444 +15444 +15444 +15445 +15445 +15446 +15446 +15446 +15447 +15447 +15447 +15448 +15448 +15448 +15449 +15449 +15450 +15450 +15450 +15451 +15451 +15451 +15452 +15452 +15452 +15453 +15453 +15454 +15454 +15454 +15455 +15455 +15455 +15456 +15456 +15456 +15457 +15457 +15458 +15458 +15458 +15459 +15459 +15459 +15460 +15460 +15460 +15461 +15461 +15461 +15462 +15462 +15463 +15463 +15463 +15464 +15464 +15464 +15465 +15465 +15465 +15466 +15466 +15467 +15467 +15467 +15468 +15468 +15468 +15469 +15469 +15469 +15470 +15470 +15470 +15471 +15471 +15472 +15472 +15472 +15473 +15473 +15473 +15474 +15474 +15474 +15475 +15475 +15475 +15476 +15476 +15477 +15477 +15477 +15478 +15478 +15478 +15479 +15479 +15479 +15480 +15480 +15480 +15481 +15481 +15481 +15482 +15482 +15483 +15483 +15483 +15484 +15484 +15484 +15485 +15485 +15485 +15486 +15486 +15486 +15487 +15487 +15487 +15488 +15488 +15489 +15489 +15489 +15490 +15490 +15490 +15491 +15491 +15491 +15492 +15492 +15492 +15493 +15493 +15493 +15494 +15494 +15494 +15495 +15495 +15496 +15496 +15496 +15497 +15497 +15497 +15498 +15498 +15498 +15499 +15499 +15499 +15500 +15500 +15500 +15501 +15501 +15501 +15502 +15502 +15502 +15503 +15503 +15503 +15504 +15504 +15505 +15505 +15505 +15506 +15506 +15506 +15507 +15507 +15507 +15508 +15508 +15508 +15509 +15509 +15509 +15510 +15510 +15510 +15511 +15511 +15511 +15512 +15512 +15512 +15513 +15513 +15513 +15514 +15514 +15515 +15515 +15515 +15516 +15516 +15516 +15517 +15517 +15517 +15518 +15518 +15518 +15519 +15519 +15519 +15520 +15520 +15520 +15521 +15521 +15521 +15522 +15522 +15522 +15523 +15523 +15523 +15524 +15524 +15524 +15525 +15525 +15525 +15526 +15526 +15526 +15527 +15527 +15527 +15528 +15528 +15528 +15529 +15529 +15529 +15530 +15530 +15530 +15531 +15531 +15531 +15532 +15532 +15532 +15533 +15533 +15534 +15534 +15534 +15535 +15535 +15535 +15536 +15536 +15536 +15537 +15537 +15537 +15538 +15538 +15538 +15539 +15539 +15539 +15540 +15540 +15540 +15541 +15541 +15541 +15542 +15542 +15542 +15543 +15543 +15543 +15544 +15544 +15544 +15545 +15545 +15545 +15546 +15546 +15546 +15547 +15547 +15547 +15548 +15548 +15548 +15549 +15549 +15549 +15550 +15550 +15550 +15551 +15551 +15551 +15552 +15552 +15552 +15552 +15553 +15553 +15553 +15554 +15554 +15554 +15555 +15555 +15555 +15556 +15556 +15556 +15557 +15557 +15557 +15558 +15558 +15558 +15559 +15559 +15559 +15560 +15560 +15560 +15561 +15561 +15561 +15562 +15562 +15562 +15563 +15563 +15563 +15564 +15564 +15564 +15565 +15565 +15565 +15566 +15566 +15566 +15567 +15567 +15567 +15568 +15568 +15568 +15569 +15569 +15569 +15570 +15570 +15570 +15571 +15571 +15571 +15571 +15572 +15572 +15572 +15573 +15573 +15573 +15574 +15574 +15574 +15575 +15575 +15575 +15576 +15576 +15576 +15577 +15577 +15577 +15578 +15578 +15578 +15579 +15579 +15579 +15580 +15580 +15580 +15581 +15581 +15581 +15582 +15582 +15582 +15582 +15583 +15583 +15583 +15584 +15584 +15584 +15585 +15585 +15585 +15586 +15586 +15586 +15587 +15587 +15587 +15588 +15588 +15588 +15589 +15589 +15589 +15590 +15590 +15590 +15590 +15591 +15591 +15591 +15592 +15592 +15592 +15593 +15593 +15593 +15594 +15594 +15594 +15595 +15595 +15595 +15596 +15596 +15596 +15597 +15597 +15597 +15597 +15598 +15598 +15598 +15599 +15599 +15599 +15600 +15600 +15600 +15601 +15601 +15601 +15602 +15602 +15602 +15603 +15603 +15603 +15603 +15604 +15604 +15604 +15605 +15605 +15605 +15606 +15606 +15606 +15607 +15607 +15607 +15608 +15608 +15608 +15609 +15609 +15609 +15609 +15610 +15610 +15610 +15611 +15611 +15611 +15612 +15612 +15612 +15613 +15613 +15613 +15614 +15614 +15614 +15614 +15615 +15615 +15615 +15616 +15616 +15616 +15617 +15617 +15617 +15618 +15618 +15618 +15619 +15619 +15619 +15619 +15620 +15620 +15620 +15621 +15621 +15621 +15622 +15622 +15622 +15623 +15623 +15623 +15623 +15624 +15624 +15624 +15625 +15625 +15625 +15626 +15626 +15626 +15627 +15627 +15627 +15627 +15628 +15628 +15628 +15629 +15629 +15629 +15630 +15630 +15630 +15631 +15631 +15631 +15632 +15632 +15632 +15632 +15633 +15634 +15634 +15635 +15635 +15636 +15637 +15637 +15638 +15639 +15639 +15640 +15640 +15641 +15642 +15642 +15643 +15643 +15644 +15645 +15645 +15646 +15646 +15647 +15648 +15648 +15649 +15650 +15650 +15651 +15651 +15652 +15653 +15653 +15654 +15654 +15655 +15656 +15656 +15657 +15657 +15658 +15659 +15659 +15660 +15660 +15661 +15662 +15662 +15663 +15663 +15664 +15665 +15665 +15666 +15666 +15667 +15668 +15668 +15669 +15669 +15670 +15671 +15671 +15672 +15672 +15673 +15673 +15674 +15675 +15675 +15676 +15676 +15677 +15678 +15678 +15679 +15679 +15680 +15681 +15681 +15682 +15682 +15683 +15684 +15684 +15685 +15685 +15686 +15686 +15687 +15688 +15688 +15689 +15689 +15690 +15691 +15691 +15692 +15692 +15693 +15693 +15694 +15695 +15695 +15696 +15696 +15697 +15698 +15698 +15699 +15699 +15700 +15700 +15701 +15702 +15702 +15703 +15703 +15704 +15705 +15705 +15706 +15706 +15707 +15707 +15708 +15709 +15709 +15710 +15710 +15711 +15711 +15712 +15713 +15713 +15714 +15714 +15715 +15715 +15716 +15717 +15717 +15718 +15718 +15719 +15719 +15720 +15721 +15721 +15722 +15722 +15723 +15723 +15724 +15725 +15725 +15726 +15726 +15727 +15727 +15728 +15729 +15729 +15730 +15730 +15731 +15731 +15732 +15733 +15733 +15734 +15734 +15735 +15735 +15736 +15736 +15737 +15738 +15738 +15739 +15739 +15740 +15740 +15741 +15742 +15742 +15743 +15743 +15744 +15744 +15745 +15745 +15746 +15747 +15747 +15748 +15748 +15749 +15749 +15750 +15750 +15751 +15752 +15752 +15753 +15753 +15754 +15754 +15755 +15755 +15756 +15757 +15757 +15758 +15758 +15759 +15759 +15760 +15760 +15761 +15762 +15762 +15763 +15763 +15764 +15764 +15765 +15765 +15766 +15767 +15767 +15768 +15768 +15769 +15769 +15770 +15770 +15771 +15771 +15772 +15773 +15773 +15774 +15774 +15775 +15775 +15776 +15776 +15777 +15777 +15778 +15779 +15779 +15780 +15780 +15781 +15781 +15782 +15782 +15783 +15783 +15784 +15785 +15785 +15786 +15786 +15787 +15787 +15788 +15788 +15789 +15789 +15790 +15790 +15791 +15792 +15792 +15793 +15793 +15794 +15794 +15795 +15795 +15796 +15796 +15797 +15797 +15798 +15799 +15799 +15800 +15800 +15801 +15801 +15802 +15802 +15803 +15803 +15804 +15804 +15805 +15805 +15806 +15807 +15807 +15808 +15808 +15809 +15809 +15810 +15810 +15811 +15811 +15812 +15812 +15813 +15813 +15814 +15815 +15815 +15816 +15816 +15817 +15817 +15818 +15818 +15819 +15819 +15820 +15820 +15821 +15821 +15822 +15822 +15823 +15823 +15824 +15825 +15825 +15826 +15826 +15827 +15827 +15828 +15828 +15829 +15829 +15830 +15830 +15831 +15831 +15832 +15832 +15833 +15833 +15834 +15834 +15835 +15836 +15836 +15837 +15837 +15838 +15838 +15839 +15839 +15840 +15840 +15841 +15841 +15842 +15842 +15843 +15843 +15844 +15844 +15845 +15845 +15846 +15846 +15847 +15847 +15848 +15848 +15849 +15850 +15850 +15851 +15851 +15852 +15852 +15853 +15853 +15854 +15854 +15855 +15855 +15856 +15856 +15857 +15857 +15858 +15858 +15859 +15859 +15860 +15860 +15861 +15861 +15862 +15862 +15863 +15863 +15864 +15864 +15865 +15865 +15866 +15866 +15867 +15867 +15868 +15868 +15869 +15869 +15870 +15870 +15871 +15871 +15872 +15872 +15873 +15874 +15874 +15875 +15875 +15876 +15876 +15877 +15877 +15878 +15878 +15879 +15879 +15880 +15880 +15881 +15881 +15882 +15882 +15883 +15883 +15884 +15884 +15885 +15885 +15886 +15886 +15887 +15887 +15888 +15888 +15889 +15889 +15890 +15890 +15891 +15891 +15892 +15892 +15893 +15893 +15894 +15894 +15895 +15895 +15896 +15896 +15897 +15897 +15898 +15898 +15899 +15899 +15900 +15900 +15901 +15901 +15902 +15902 +15903 +15903 +15904 +15904 +15905 +15905 +15906 +15906 +15907 +15907 +15907 +15908 +15908 +15909 +15909 +15910 +15910 +15911 +15911 +15912 +15912 +15913 +15913 +15914 +15914 +15915 +15915 +15916 +15916 +15917 +15917 +15918 +15918 +15919 +15919 +15920 +15920 +15921 +15921 +15922 +15922 +15923 +15923 +15924 +15924 +15925 +15925 +15926 +15926 +15927 +15927 +15928 +15928 +15929 +15929 +15930 +15930 +15931 +15931 +15931 +15932 +15932 +15933 +15933 +15934 +15934 +15935 +15935 +15936 +15936 +15937 +15937 +15938 +15938 +15939 +15939 +15940 +15940 +15941 +15941 +15942 +15942 +15943 +15943 +15944 +15944 +15945 +15945 +15945 +15946 +15946 +15947 +15947 +15948 +15948 +15949 +15949 +15950 +15950 +15951 +15951 +15952 +15952 +15953 +15953 +15954 +15954 +15955 +15955 +15956 +15956 +15956 +15957 +15957 +15958 +15958 +15959 +15959 +15960 +15960 +15961 +15961 +15962 +15962 +15963 +15963 +15964 +15964 +15965 +15965 +15965 +15966 +15966 +15967 +15967 +15968 +15968 +15969 +15969 +15970 +15970 +15971 +15971 +15972 +15972 +15973 +15973 +15974 +15974 +15974 +15975 +15975 +15976 +15976 +15977 +15977 +15978 +15978 +15979 +15979 +15980 +15980 +15981 +15981 +15982 +15982 +15982 +15983 +15983 +15984 +15984 +15985 +15985 +15986 +15986 +15987 +15987 +15988 +15988 +15989 +15989 +15989 +15990 +15990 +15991 +15991 +15992 +15992 +15993 +15993 +15994 +15994 +15995 +15995 +15995 +15996 +15996 +15997 +15997 +15998 +15998 +15999 +15999 +16000 +16000 +16001 +16001 +16001 +16002 +16002 +16003 +16003 +16004 +16004 +16005 +16005 +16006 +16006 +16007 +16007 +16007 +16008 +16008 +16009 +16009 +16010 +16010 +16011 +16011 +16012 +16012 +16013 +16013 +16013 +16014 +16014 +16015 +16015 +16016 +16016 +16017 +16017 +16018 +16018 +16018 +16019 +16019 +16020 +16020 +16021 +16021 +16022 +16022 +16023 +16023 +16023 +16024 +16024 +16025 +16025 +16026 +16026 +16027 +16027 +16028 +16028 +16028 +16029 +16029 +16030 +16030 +16031 +16031 +16032 +16032 +16033 +16033 +16033 +16034 +16034 +16035 +16035 +16036 +16036 +16037 +16037 +16038 +16038 +16038 +16039 +16039 +16040 +16040 +16041 +16041 +16042 +16042 +16042 +16043 +16043 +16044 +16044 +16045 +16045 +16046 +16046 +16047 +16047 +16047 +16048 +16048 +16049 +16049 +16050 +16050 +16051 +16051 +16051 +16052 +16052 +16053 +16053 +16054 +16054 +16055 +16055 +16055 +16056 +16056 +16057 +16057 +16058 +16058 +16059 +16059 +16059 +16060 +16060 +16061 +16061 +16062 +16062 +16063 +16063 +16063 +16064 +16064 +16065 +16065 +16066 +16066 +16067 +16067 +16067 +16068 +16068 +16069 +16069 +16070 +16070 +16070 +16071 +16071 +16072 +16072 +16073 +16073 +16074 +16074 +16074 +16075 +16075 +16076 +16076 +16077 +16077 +16078 +16078 +16078 +16079 +16079 +16080 +16080 +16081 +16081 +16081 +16082 +16082 +16083 +16083 +16084 +16084 +16085 +16085 +16085 +16086 +16086 +16087 +16087 +16088 +16088 +16088 +16089 +16089 +16090 +16090 +16091 +16091 +16091 +16092 +16092 +16093 +16093 +16094 +16094 +16095 +16095 +16095 +16096 +16096 +16097 +16097 +16098 +16098 +16098 +16099 +16099 +16100 +16100 +16101 +16101 +16101 +16102 +16102 +16103 +16103 +16104 +16104 +16104 +16105 +16105 +16106 +16106 +16107 +16107 +16107 +16108 +16108 +16109 +16109 +16110 +16110 +16110 +16111 +16111 +16112 +16112 +16113 +16113 +16113 +16114 +16114 +16115 +16115 +16116 +16116 +16116 +16117 +16117 +16118 +16118 +16119 +16119 +16119 +16120 +16120 +16121 +16121 +16122 +16122 +16122 +16123 +16123 +16124 +16124 +16125 +16125 +16125 +16126 +16126 +16127 +16127 +16128 +16128 +16128 +16129 +16129 +16130 +16130 +16131 +16131 +16131 +16132 +16132 +16133 +16133 +16133 +16134 +16134 +16135 +16135 +16136 +16136 +16136 +16137 +16137 +16138 +16138 +16139 +16139 +16139 +16140 +16140 +16141 +16141 +16142 +16142 +16142 +16143 +16143 +16144 +16144 +16144 +16145 +16146 +16147 +16148 +16149 +16149 +16150 +16151 +16152 +16153 +16154 +16154 +16155 +16156 +16157 +16158 +16159 +16159 +16160 +16161 +16162 +16163 +16164 +16164 +16165 +16166 +16167 +16168 +16169 +16169 +16170 +16171 +16172 +16173 +16174 +16174 +16175 +16176 +16177 +16178 +16179 +16179 +16180 +16181 +16182 +16183 +16183 +16184 +16185 +16186 +16187 +16188 +16188 +16189 +16190 +16191 +16192 +16192 +16193 +16194 +16195 +16196 +16196 +16197 +16198 +16199 +16200 +16201 +16201 +16202 +16203 +16204 +16205 +16205 +16206 +16207 +16208 +16209 +16209 +16210 +16211 +16212 +16213 +16213 +16214 +16215 +16216 +16217 +16217 +16218 +16219 +16220 +16221 +16221 +16222 +16223 +16224 +16225 +16225 +16226 +16227 +16228 +16229 +16229 +16230 +16231 +16232 +16233 +16233 +16234 +16235 +16236 +16237 +16237 +16238 +16239 +16240 +16241 +16241 +16242 +16243 +16244 +16245 +16245 +16246 +16247 +16248 +16248 +16249 +16250 +16251 +16252 +16252 +16253 +16254 +16255 +16256 +16256 +16257 +16258 +16259 +16259 +16260 +16261 +16262 +16263 +16263 +16264 +16265 +16266 +16266 +16267 +16268 +16269 +16270 +16270 +16271 +16272 +16273 +16273 +16274 +16275 +16276 +16277 +16277 +16278 +16279 +16280 +16280 +16281 +16282 +16283 +16284 +16284 +16285 +16286 +16287 +16287 +16288 +16289 +16290 +16290 +16291 +16292 +16293 +16293 +16294 +16295 +16296 +16297 +16297 +16298 +16299 +16300 +16300 +16301 +16302 +16303 +16303 +16304 +16305 +16306 +16306 +16307 +16308 +16309 +16310 +16310 +16311 +16312 +16313 +16313 +16314 +16315 +16316 +16316 +16317 +16318 +16319 +16319 +16320 +16321 +16322 +16322 +16323 +16324 +16325 +16325 +16326 +16327 +16328 +16328 +16329 +16330 +16331 +16331 +16332 +16333 +16334 +16334 +16335 +16336 +16337 +16337 +16338 +16339 +16340 +16340 +16341 +16342 +16343 +16343 +16344 +16345 +16346 +16346 +16347 +16348 +16349 +16349 +16350 +16351 +16351 +16352 +16353 +16354 +16354 +16355 +16356 +16357 +16357 +16358 +16359 +16360 +16360 +16361 +16362 +16363 +16363 +16364 +16365 +16365 +16366 +16367 +16368 +16368 +16369 +16370 +16371 +16371 +16372 +16373 +16374 +16374 +16375 +16376 +16376 +16377 +16378 +16379 +16379 +16380 +16381 +16382 +16382 +16383 +16384 +16384 +16385 +16385 +16385 +16386 +16386 +16386 +16387 +16387 +16388 +16388 +16388 +16389 +16389 +16389 +16390 +16390 +16390 +16391 +16391 +16391 +16392 +16392 +16393 +16393 +16393 +16394 +16394 +16394 +16395 +16395 +16395 +16396 +16396 +16397 +16397 +16397 +16398 +16398 +16398 +16399 +16399 +16399 +16400 +16400 +16400 +16401 +16401 +16402 +16402 +16402 +16403 +16403 +16403 +16404 +16404 +16404 +16405 +16405 +16405 +16406 +16406 +16406 +16407 +16407 +16408 +16408 +16408 +16409 +16409 +16409 +16410 +16410 +16410 +16411 +16411 +16411 +16412 +16412 +16412 +16413 +16413 +16414 +16414 +16414 +16415 +16415 +16415 +16416 +16416 +16416 +16417 +16417 +16417 +16418 +16418 +16418 +16419 +16419 +16420 +16420 +16420 +16421 +16421 +16421 +16422 +16422 +16422 +16423 +16423 +16423 +16424 +16424 +16424 +16425 +16425 +16425 +16426 +16426 +16426 +16427 +16427 +16428 +16428 +16428 +16429 +16429 +16429 +16430 +16430 +16430 +16431 +16431 +16431 +16432 +16432 +16432 +16433 +16433 +16433 +16434 +16434 +16434 +16435 +16435 +16435 +16436 +16436 +16436 +16437 +16437 +16437 +16438 +16438 +16439 +16439 +16439 +16440 +16440 +16440 +16441 +16441 +16441 +16442 +16442 +16442 +16443 +16443 +16443 +16444 +16444 +16444 +16445 +16445 +16445 +16446 +16446 +16446 +16447 +16447 +16447 +16448 +16448 +16448 +16449 +16449 +16449 +16450 +16450 +16450 +16451 +16451 +16451 +16452 +16452 +16452 +16453 +16453 +16453 +16454 +16454 +16454 +16455 +16455 +16455 +16456 +16456 +16456 +16457 +16457 +16457 +16458 +16458 +16458 +16459 +16459 +16459 +16460 +16460 +16460 +16461 +16461 +16461 +16462 +16462 +16462 +16463 +16463 +16463 +16464 +16464 +16464 +16465 +16465 +16465 +16466 +16466 +16466 +16467 +16467 +16467 +16468 +16468 +16468 +16469 +16469 +16469 +16470 +16470 +16470 +16471 +16471 +16471 +16472 +16472 +16472 +16473 +16473 +16473 +16474 +16474 +16474 +16475 +16475 +16475 +16476 +16476 +16476 +16477 +16477 +16477 +16478 +16478 +16478 +16479 +16479 +16479 +16480 +16480 +16480 +16481 +16481 +16481 +16482 +16482 +16482 +16483 +16483 +16483 +16484 +16484 +16484 +16485 +16485 +16485 +16486 +16486 +16486 +16487 +16487 +16487 +16488 +16488 +16488 +16488 +16489 +16489 +16489 +16490 +16490 +16490 +16491 +16491 +16491 +16492 +16492 +16492 +16493 +16493 +16493 +16494 +16494 +16494 +16495 +16495 +16495 +16496 +16496 +16496 +16497 +16497 +16497 +16498 +16498 +16498 +16498 +16499 +16499 +16499 +16500 +16500 +16500 +16501 +16501 +16501 +16502 +16502 +16502 +16503 +16503 +16503 +16504 +16504 +16504 +16505 +16505 +16505 +16506 +16506 +16506 +16506 +16507 +16507 +16507 +16508 +16508 +16508 +16509 +16509 +16509 +16510 +16510 +16510 +16511 +16511 +16511 +16512 +16512 +16512 +16513 +16513 +16513 +16513 +16514 +16514 +16514 +16515 +16515 +16515 +16516 +16516 +16516 +16517 +16517 +16517 +16518 +16518 +16518 +16519 +16519 +16519 +16519 +16520 +16520 +16520 +16521 +16521 +16521 +16522 +16522 +16522 +16523 +16523 +16523 +16524 +16524 +16524 +16524 +16525 +16525 +16525 +16526 +16526 +16526 +16527 +16527 +16527 +16528 +16528 +16528 +16529 +16529 +16529 +16529 +16530 +16530 +16530 +16531 +16531 +16531 +16532 +16532 +16532 +16533 +16533 +16533 +16534 +16534 +16534 +16534 +16535 +16535 +16535 +16536 +16536 +16536 +16537 +16537 +16537 +16538 +16538 +16538 +16538 +16539 +16539 +16539 +16540 +16540 +16540 +16541 +16541 +16541 +16542 +16542 +16542 +16542 +16543 +16543 +16543 +16544 +16544 +16544 +16545 +16545 +16545 +16546 +16546 +16546 +16546 +16547 +16547 +16547 +16548 +16548 +16548 +16549 +16549 +16549 +16549 +16550 +16550 +16550 +16551 +16551 +16551 +16552 +16552 +16552 +16553 +16553 +16553 +16553 +16554 +16554 +16554 +16555 +16555 +16555 +16556 +16556 +16556 +16556 +16557 +16557 +16557 +16558 +16558 +16558 +16559 +16559 +16559 +16560 +16560 +16560 +16560 +16561 +16561 +16561 +16562 +16562 +16562 +16563 +16563 +16563 +16563 +16564 +16564 +16564 +16565 +16565 +16565 +16566 +16566 +16566 +16566 +16567 +16567 +16567 +16568 +16568 +16568 +16569 +16569 +16569 +16569 +16570 +16570 +16570 +16571 +16571 +16571 +16572 +16572 +16572 +16572 +16573 +16573 +16573 +16574 +16574 +16574 +16575 +16575 +16575 +16575 +16576 +16576 +16576 +16577 +16577 +16577 +16577 +16578 +16578 +16578 +16579 +16579 +16579 +16580 +16580 +16580 +16580 +16581 +16581 +16581 +16582 +16582 +16582 +16583 +16583 +16583 +16583 +16584 +16584 +16584 +16585 +16585 +16585 +16585 +16586 +16586 +16586 +16587 +16587 +16587 +16588 +16588 +16588 +16588 +16589 +16589 +16589 +16590 +16590 +16590 +16590 +16591 +16591 +16591 +16592 +16592 +16592 +16593 +16593 +16593 +16593 +16594 +16594 +16594 +16595 +16595 +16595 +16595 +16596 +16596 +16596 +16597 +16597 +16597 +16597 +16598 +16598 +16598 +16599 +16599 +16599 +16600 +16600 +16600 +16600 +16601 +16601 +16601 +16602 +16602 +16602 +16602 +16603 +16603 +16603 +16604 +16604 +16604 +16604 +16605 +16605 +16605 +16606 +16606 +16606 +16606 +16607 +16607 +16607 +16608 +16608 +16608 +16608 +16609 +16609 +16609 +16610 +16610 +16610 +16611 +16611 +16611 +16611 +16612 +16612 +16612 +16613 +16613 +16613 +16613 +16614 +16614 +16615 +16615 +16616 +16616 +16617 +16617 +16618 +16619 +16619 +16620 +16620 +16621 +16621 +16622 +16623 +16623 +16624 +16624 +16625 +16625 +16626 +16626 +16627 +16628 +16628 +16629 +16629 +16630 +16630 +16631 +16632 +16632 +16633 +16633 +16634 +16634 +16635 +16636 +16636 +16637 +16637 +16638 +16638 +16639 +16639 +16640 +16641 +16641 +16642 +16642 +16643 +16643 +16644 +16644 +16645 +16646 +16646 +16647 +16647 +16648 +16648 +16649 +16649 +16650 +16651 +16651 +16652 +16652 +16653 +16653 +16654 +16654 +16655 +16656 +16656 +16657 +16657 +16658 +16658 +16659 +16659 +16660 +16661 +16661 +16662 +16662 +16663 +16663 +16664 +16664 +16665 +16665 +16666 +16667 +16667 +16668 +16668 +16669 +16669 +16670 +16670 +16671 +16671 +16672 +16673 +16673 +16674 +16674 +16675 +16675 +16676 +16676 +16677 +16677 +16678 +16679 +16679 +16680 +16680 +16681 +16681 +16682 +16682 +16683 +16683 +16684 +16684 +16685 +16686 +16686 +16687 +16687 +16688 +16688 +16689 +16689 +16690 +16690 +16691 +16691 +16692 +16692 +16693 +16694 +16694 +16695 +16695 +16696 +16696 +16697 +16697 +16698 +16698 +16699 +16699 +16700 +16700 +16701 +16702 +16702 +16703 +16703 +16704 +16704 +16705 +16705 +16706 +16706 +16707 +16707 +16708 +16708 +16709 +16709 +16710 +16711 +16711 +16712 +16712 +16713 +16713 +16714 +16714 +16715 +16715 +16716 +16716 +16717 +16717 +16718 +16718 +16719 +16719 +16720 +16720 +16721 +16721 +16722 +16723 +16723 +16724 +16724 +16725 +16725 +16726 +16726 +16727 +16727 +16728 +16728 +16729 +16729 +16730 +16730 +16731 +16731 +16732 +16732 +16733 +16733 +16734 +16734 +16735 +16735 +16736 +16736 +16737 +16738 +16738 +16739 +16739 +16740 +16740 +16741 +16741 +16742 +16742 +16743 +16743 +16744 +16744 +16745 +16745 +16746 +16746 +16747 +16747 +16748 +16748 +16749 +16749 +16750 +16750 +16751 +16751 +16752 +16752 +16753 +16753 +16754 +16754 +16755 +16755 +16756 +16756 +16757 +16757 +16758 +16758 +16759 +16759 +16760 +16760 +16761 +16761 +16762 +16762 +16763 +16763 +16764 +16764 +16765 +16765 +16766 +16766 +16767 +16767 +16768 +16768 +16769 +16769 +16770 +16770 +16771 +16771 +16772 +16772 +16773 +16773 +16774 +16774 +16775 +16775 +16776 +16776 +16777 +16777 +16778 +16778 +16779 +16779 +16780 +16780 +16781 +16781 +16782 +16782 +16783 +16783 +16784 +16784 +16785 +16785 +16786 +16786 +16787 +16787 +16788 +16788 +16789 +16789 +16790 +16790 +16791 +16791 +16792 +16792 +16793 +16793 +16794 +16794 +16795 +16795 +16796 +16796 +16797 +16797 +16798 +16798 +16799 +16799 +16800 +16800 +16801 +16801 +16801 +16802 +16802 +16803 +16803 +16804 +16804 +16805 +16805 +16806 +16806 +16807 +16807 +16808 +16808 +16809 +16809 +16810 +16810 +16811 +16811 +16812 +16812 +16813 +16813 +16814 +16814 +16815 +16815 +16816 +16816 +16816 +16817 +16817 +16818 +16818 +16819 +16819 +16820 +16820 +16821 +16821 +16822 +16822 +16823 +16823 +16824 +16824 +16825 +16825 +16826 +16826 +16827 +16827 +16828 +16828 +16828 +16829 +16829 +16830 +16830 +16831 +16831 +16832 +16832 +16833 +16833 +16834 +16834 +16835 +16835 +16836 +16836 +16837 +16837 +16837 +16838 +16838 +16839 +16839 +16840 +16840 +16841 +16841 +16842 +16842 +16843 +16843 +16844 +16844 +16845 +16845 +16845 +16846 +16846 +16847 +16847 +16848 +16848 +16849 +16849 +16850 +16850 +16851 +16851 +16852 +16852 +16853 +16853 +16853 +16854 +16854 +16855 +16855 +16856 +16856 +16857 +16857 +16858 +16858 +16859 +16859 +16859 +16860 +16860 +16861 +16861 +16862 +16862 +16863 +16863 +16864 +16864 +16865 +16865 +16866 +16866 +16866 +16867 +16867 +16868 +16868 +16869 +16869 +16870 +16870 +16871 +16871 +16872 +16872 +16872 +16873 +16873 +16874 +16874 +16875 +16875 +16876 +16876 +16877 +16877 +16877 +16878 +16878 +16879 +16879 +16880 +16880 +16881 +16881 +16882 +16882 +16883 +16883 +16883 +16884 +16884 +16885 +16885 +16886 +16886 +16887 +16887 +16888 +16888 +16888 +16889 +16889 +16890 +16890 +16891 +16891 +16892 +16892 +16893 +16893 +16893 +16894 +16894 +16895 +16895 +16896 +16896 +16897 +16897 +16897 +16898 +16898 +16899 +16899 +16900 +16900 +16901 +16901 +16902 +16902 +16902 +16903 +16903 +16904 +16904 +16905 +16905 +16906 +16906 +16906 +16907 +16907 +16908 +16908 +16909 +16909 +16910 +16910 +16911 +16911 +16911 +16912 +16912 +16913 +16913 +16914 +16914 +16915 +16915 +16915 +16916 +16916 +16917 +16917 +16918 +16918 +16919 +16919 +16919 +16920 +16920 +16921 +16921 +16922 +16922 +16923 +16923 +16923 +16924 +16924 +16925 +16925 +16926 +16926 +16926 +16927 +16927 +16928 +16928 +16929 +16929 +16930 +16930 +16930 +16931 +16931 +16932 +16932 +16933 +16933 +16934 +16934 +16934 +16935 +16935 +16936 +16936 +16937 +16937 +16937 +16938 +16938 +16939 +16939 +16940 +16940 +16941 +16941 +16941 +16942 +16942 +16943 +16943 +16944 +16944 +16944 +16945 +16945 +16946 +16946 +16947 +16947 +16947 +16948 +16948 +16949 +16949 +16950 +16950 +16951 +16951 +16951 +16952 +16952 +16953 +16953 +16954 +16954 +16954 +16955 +16955 +16956 +16956 +16957 +16957 +16957 +16958 +16958 +16959 +16959 +16960 +16960 +16960 +16961 +16961 +16962 +16962 +16963 +16963 +16963 +16964 +16964 +16965 +16965 +16966 +16966 +16966 +16967 +16967 +16968 +16968 +16969 +16969 +16969 +16970 +16970 +16971 +16971 +16972 +16972 +16972 +16973 +16973 +16974 +16974 +16975 +16975 +16975 +16976 +16976 +16977 +16977 +16978 +16978 +16978 +16979 +16979 +16980 +16980 +16981 +16981 +16981 +16982 +16982 +16983 +16983 +16983 +16984 +16984 +16985 +16985 +16986 +16986 +16986 +16987 +16987 +16988 +16988 +16989 +16989 +16989 +16990 +16990 +16991 +16991 +16991 +16992 +16992 +16993 +16993 +16994 +16994 +16994 +16995 +16995 +16996 +16996 +16997 +16997 +16997 +16998 +16998 +16999 +16999 +16999 +17000 +17000 +17001 +17001 +17002 +17002 +17002 +17003 +17003 +17004 +17004 +17004 +17005 +17005 +17006 +17006 +17007 +17007 +17007 +17008 +17008 +17009 +17009 +17009 +17010 +17010 +17011 +17011 +17012 +17012 +17012 +17013 +17013 +17014 +17014 +17014 +17015 +17015 +17016 +17016 +17016 +17017 +17017 +17018 +17018 +17019 +17019 +17019 +17020 +17020 +17021 +17021 +17021 +17022 +17022 +17023 +17023 +17024 +17024 +17024 +17025 +17025 +17026 +17026 +17026 +17027 +17027 +17028 +17028 +17028 +17029 +17029 +17030 +17030 +17030 +17031 +17031 +17032 +17032 +17033 +17033 +17033 +17034 +17034 +17035 +17035 +17035 +17036 +17036 +17037 +17037 +17037 +17038 +17038 +17039 +17039 +17039 +17040 +17040 +17041 +17041 +17041 +17042 +17042 +17043 +17043 +17043 +17044 +17044 +17045 +17045 +17046 +17046 +17046 +17047 +17047 +17048 +17048 +17048 +17049 +17049 +17050 +17050 +17050 +17051 +17051 +17052 +17052 +17052 +17053 +17053 +17054 +17054 +17054 +17055 +17055 +17056 +17056 +17056 +17057 +17057 +17058 +17058 +17058 +17059 +17059 +17060 +17060 +17060 +17061 +17061 +17062 +17062 +17062 +17063 +17063 +17064 +17064 +17064 +17065 +17065 +17066 +17066 +17066 +17067 +17067 +17068 +17068 +17068 +17069 +17069 +17070 +17070 +17070 +17071 +17071 +17072 +17072 +17072 +17073 +17073 +17074 +17074 +17074 +17075 +17075 +17076 +17076 +17076 +17077 +17077 +17078 +17078 +17078 +17079 +17079 +17079 +17080 +17080 +17081 +17081 +17081 +17082 +17082 +17083 +17083 +17083 +17084 +17084 +17085 +17085 +17085 +17086 +17086 +17087 +17087 +17087 +17088 +17088 +17089 +17089 +17089 +17090 +17090 +17091 +17091 +17091 +17092 +17092 +17093 +17094 +17095 +17096 +17096 +17097 +17098 +17099 +17100 +17100 +17101 +17102 +17103 +17103 +17104 +17105 +17106 +17106 +17107 +17108 +17109 +17110 +17110 +17111 +17112 +17113 +17113 +17114 +17115 +17116 +17117 +17117 +17118 +17119 +17120 +17120 +17121 +17122 +17123 +17123 +17124 +17125 +17126 +17127 +17127 +17128 +17129 +17130 +17130 +17131 +17132 +17133 +17133 +17134 +17135 +17136 +17136 +17137 +17138 +17139 +17139 +17140 +17141 +17142 +17143 +17143 +17144 +17145 +17146 +17146 +17147 +17148 +17149 +17149 +17150 +17151 +17152 +17152 +17153 +17154 +17155 +17155 +17156 +17157 +17158 +17158 +17159 +17160 +17161 +17161 +17162 +17163 +17164 +17164 +17165 +17166 +17167 +17167 +17168 +17169 +17170 +17170 +17171 +17172 +17172 +17173 +17174 +17175 +17175 +17176 +17177 +17178 +17178 +17179 +17180 +17181 +17181 +17182 +17183 +17184 +17184 +17185 +17186 +17187 +17187 +17188 +17189 +17189 +17190 +17191 +17192 +17192 +17193 +17194 +17195 +17195 +17196 +17197 +17198 +17198 +17199 +17200 +17200 +17201 +17202 +17203 +17203 +17204 +17205 +17206 +17206 +17207 +17208 +17208 +17209 +17210 +17211 +17211 +17212 +17213 +17214 +17214 +17215 +17216 +17216 +17217 +17218 +17219 +17219 +17220 +17221 +17221 +17222 +17223 +17224 +17224 +17225 +17226 +17226 +17227 +17228 +17229 +17229 +17230 +17231 +17231 +17232 +17233 +17234 +17234 +17235 +17236 +17236 +17237 +17238 +17239 +17239 +17240 +17241 +17241 +17242 +17243 +17244 +17244 +17245 +17246 +17246 +17247 +17248 +17249 +17249 +17250 +17251 +17251 +17252 +17253 +17253 +17254 +17255 +17256 +17256 +17257 +17258 +17258 +17259 +17260 +17260 +17261 +17262 +17263 +17263 +17264 +17265 +17265 +17266 +17267 +17267 +17268 +17269 +17270 +17270 +17271 +17272 +17272 +17273 +17274 +17274 +17275 +17276 +17277 +17277 +17278 +17279 +17279 +17280 +17281 +17281 +17282 +17283 +17283 +17284 +17285 +17286 +17286 +17287 +17288 +17288 +17289 +17290 +17290 +17291 +17292 +17292 +17293 +17294 +17295 +17295 +17296 +17297 +17297 +17298 +17299 +17299 +17300 +17301 +17301 +17302 +17303 +17303 +17304 +17305 +17305 +17306 +17307 +17307 +17308 +17309 +17310 +17310 +17311 +17312 +17312 +17313 +17314 +17314 +17315 +17316 +17316 +17317 +17318 +17318 +17319 +17320 +17320 +17321 +17322 +17322 +17323 +17324 +17324 +17325 +17326 +17326 +17327 +17328 +17328 +17329 +17330 +17331 +17331 +17332 +17333 +17333 +17334 +17335 +17335 +17336 +17337 +17337 +17338 +17339 +17339 +17340 +17341 +17341 +17342 +17343 +17343 +17344 +17345 +17345 +17346 +17347 +17347 +17348 +17349 +17349 +17350 +17351 +17351 +17352 +17353 +17353 +17354 +17355 +17355 +17356 +17357 +17357 +17358 +17358 +17359 +17360 +17360 +17361 +17362 +17362 +17363 +17364 +17364 +17365 +17366 +17366 +17367 +17368 +17368 +17369 +17370 +17370 +17371 +17372 +17372 +17373 +17374 +17374 +17375 +17376 +17376 +17377 +17378 +17378 +17379 +17379 +17380 +17381 +17381 +17382 +17383 +17383 +17384 +17385 +17385 +17386 +17387 +17387 +17388 +17389 +17389 +17390 +17391 +17391 +17392 +17392 +17393 +17394 +17394 +17395 +17396 +17396 +17397 +17398 +17398 +17399 +17400 +17400 +17401 +17402 +17402 +17403 +17403 +17404 +17405 +17405 +17406 +17407 +17407 +17408 +17408 +17409 +17409 +17409 +17410 +17410 +17410 +17411 +17411 +17411 +17412 +17412 +17412 +17412 +17413 +17413 +17413 +17414 +17414 +17414 +17415 +17415 +17415 +17416 +17416 +17416 +17417 +17417 +17417 +17418 +17418 +17418 +17419 +17419 +17419 +17419 +17420 +17420 +17420 +17421 +17421 +17421 +17422 +17422 +17422 +17423 +17423 +17423 +17424 +17424 +17424 +17425 +17425 +17425 +17425 +17426 +17426 +17426 +17427 +17427 +17427 +17428 +17428 +17428 +17429 +17429 +17429 +17430 +17430 +17430 +17430 +17431 +17431 +17431 +17432 +17432 +17432 +17433 +17433 +17433 +17434 +17434 +17434 +17435 +17435 +17435 +17435 +17436 +17436 +17436 +17437 +17437 +17437 +17438 +17438 +17438 +17439 +17439 +17439 +17439 +17440 +17440 +17440 +17441 +17441 +17441 +17442 +17442 +17442 +17443 +17443 +17443 +17444 +17444 +17444 +17444 +17445 +17445 +17445 +17446 +17446 +17446 +17447 +17447 +17447 +17448 +17448 +17448 +17448 +17449 +17449 +17449 +17450 +17450 +17450 +17451 +17451 +17451 +17451 +17452 +17452 +17452 +17453 +17453 +17453 +17454 +17454 +17454 +17455 +17455 +17455 +17455 +17456 +17456 +17456 +17457 +17457 +17457 +17458 +17458 +17458 +17458 +17459 +17459 +17459 +17460 +17460 +17460 +17461 +17461 +17461 +17461 +17462 +17462 +17462 +17463 +17463 +17463 +17464 +17464 +17464 +17465 +17465 +17465 +17465 +17466 +17466 +17466 +17467 +17467 +17467 +17468 +17468 +17468 +17468 +17469 +17469 +17469 +17470 +17470 +17470 +17471 +17471 +17471 +17471 +17472 +17472 +17472 +17473 +17473 +17473 +17473 +17474 +17474 +17474 +17475 +17475 +17475 +17476 +17476 +17476 +17476 +17477 +17477 +17477 +17478 +17478 +17478 +17479 +17479 +17479 +17479 +17480 +17480 +17480 +17481 +17481 +17481 +17482 +17482 +17482 +17482 +17483 +17483 +17483 +17484 +17484 +17484 +17484 +17485 +17485 +17485 +17486 +17486 +17486 +17487 +17487 +17487 +17487 +17488 +17488 +17488 +17489 +17489 +17489 +17489 +17490 +17490 +17490 +17491 +17491 +17491 +17491 +17492 +17492 +17492 +17493 +17493 +17493 +17494 +17494 +17494 +17494 +17495 +17495 +17495 +17496 +17496 +17496 +17496 +17497 +17497 +17497 +17498 +17498 +17498 +17498 +17499 +17499 +17499 +17500 +17500 +17500 +17501 +17501 +17501 +17501 +17502 +17502 +17502 +17503 +17503 +17503 +17503 +17504 +17504 +17504 +17505 +17505 +17505 +17505 +17506 +17506 +17506 +17507 +17507 +17507 +17507 +17508 +17508 +17508 +17509 +17509 +17509 +17509 +17510 +17510 +17510 +17511 +17511 +17511 +17511 +17512 +17512 +17512 +17513 +17513 +17513 +17513 +17514 +17514 +17514 +17515 +17515 +17515 +17515 +17516 +17516 +17516 +17517 +17517 +17517 +17517 +17518 +17518 +17518 +17519 +17519 +17519 +17519 +17520 +17520 +17520 +17521 +17521 +17521 +17521 +17522 +17522 +17522 +17523 +17523 +17523 +17523 +17524 +17524 +17524 +17525 +17525 +17525 +17525 +17526 +17526 +17526 +17526 +17527 +17527 +17527 +17528 +17528 +17528 +17528 +17529 +17529 +17529 +17530 +17530 +17530 +17530 +17531 +17531 +17531 +17532 +17532 +17532 +17532 +17533 +17533 +17533 +17533 +17534 +17534 +17534 +17535 +17535 +17535 +17535 +17536 +17536 +17536 +17537 +17537 +17537 +17537 +17538 +17538 +17538 +17539 +17539 +17539 +17539 +17540 +17540 +17540 +17540 +17541 +17541 +17541 +17542 +17542 +17542 +17542 +17543 +17543 +17543 +17544 +17544 +17544 +17544 +17545 +17545 +17545 +17545 +17546 +17546 +17546 +17547 +17547 +17547 +17547 +17548 +17548 +17548 +17548 +17549 +17549 +17549 +17550 +17550 +17550 +17550 +17551 +17551 +17551 +17551 +17552 +17552 +17552 +17553 +17553 +17553 +17553 +17554 +17554 +17554 +17555 +17555 +17555 +17555 +17556 +17556 +17556 +17556 +17557 +17557 +17557 +17558 +17558 +17558 +17558 +17559 +17559 +17559 +17559 +17560 +17560 +17560 +17561 +17561 +17561 +17561 +17562 +17562 +17562 +17562 +17563 +17563 +17563 +17563 +17564 +17564 +17564 +17565 +17565 +17565 +17565 +17566 +17566 +17566 +17566 +17567 +17567 +17567 +17568 +17568 +17568 +17568 +17569 +17569 +17569 +17569 +17570 +17570 +17570 +17571 +17571 +17571 +17571 +17572 +17572 +17572 +17572 +17573 +17573 +17573 +17573 +17574 +17574 +17574 +17575 +17575 +17575 +17575 +17576 +17576 +17576 +17577 +17577 +17578 +17578 +17579 +17579 +17580 +17580 +17581 +17581 +17582 +17583 +17583 +17584 +17584 +17585 +17585 +17586 +17586 +17587 +17587 +17588 +17588 +17589 +17589 +17590 +17590 +17591 +17592 +17592 +17593 +17593 +17594 +17594 +17595 +17595 +17596 +17596 +17597 +17597 +17598 +17598 +17599 +17599 +17600 +17600 +17601 +17602 +17602 +17603 +17603 +17604 +17604 +17605 +17605 +17606 +17606 +17607 +17607 +17608 +17608 +17609 +17609 +17610 +17610 +17611 +17611 +17612 +17612 +17613 +17613 +17614 +17614 +17615 +17616 +17616 +17617 +17617 +17618 +17618 +17619 +17619 +17620 +17620 +17621 +17621 +17622 +17622 +17623 +17623 +17624 +17624 +17625 +17625 +17626 +17626 +17627 +17627 +17628 +17628 +17629 +17629 +17630 +17630 +17631 +17631 +17632 +17632 +17633 +17633 +17634 +17634 +17635 +17635 +17636 +17636 +17637 +17637 +17638 +17638 +17639 +17639 +17640 +17640 +17641 +17641 +17642 +17642 +17643 +17643 +17644 +17644 +17645 +17645 +17646 +17646 +17647 +17647 +17648 +17648 +17649 +17649 +17650 +17650 +17651 +17651 +17652 +17652 +17653 +17653 +17654 +17654 +17655 +17655 +17656 +17656 +17657 +17657 +17658 +17658 +17659 +17659 +17660 +17660 +17661 +17661 +17662 +17662 +17663 +17663 +17664 +17664 +17665 +17665 +17666 +17666 +17667 +17667 +17668 +17668 +17669 +17669 +17670 +17670 +17671 +17671 +17672 +17672 +17673 +17673 +17674 +17674 +17675 +17675 +17676 +17676 +17676 +17677 +17677 +17678 +17678 +17679 +17679 +17680 +17680 +17681 +17681 +17682 +17682 +17683 +17683 +17684 +17684 +17685 +17685 +17686 +17686 +17687 +17687 +17688 +17688 +17689 +17689 +17690 +17690 +17690 +17691 +17691 +17692 +17692 +17693 +17693 +17694 +17694 +17695 +17695 +17696 +17696 +17697 +17697 +17698 +17698 +17699 +17699 +17700 +17700 +17701 +17701 +17701 +17702 +17702 +17703 +17703 +17704 +17704 +17705 +17705 +17706 +17706 +17707 +17707 +17708 +17708 +17709 +17709 +17710 +17710 +17710 +17711 +17711 +17712 +17712 +17713 +17713 +17714 +17714 +17715 +17715 +17716 +17716 +17717 +17717 +17717 +17718 +17718 +17719 +17719 +17720 +17720 +17721 +17721 +17722 +17722 +17723 +17723 +17724 +17724 +17724 +17725 +17725 +17726 +17726 +17727 +17727 +17728 +17728 +17729 +17729 +17730 +17730 +17731 +17731 +17731 +17732 +17732 +17733 +17733 +17734 +17734 +17735 +17735 +17736 +17736 +17737 +17737 +17737 +17738 +17738 +17739 +17739 +17740 +17740 +17741 +17741 +17742 +17742 +17742 +17743 +17743 +17744 +17744 +17745 +17745 +17746 +17746 +17747 +17747 +17747 +17748 +17748 +17749 +17749 +17750 +17750 +17751 +17751 +17752 +17752 +17752 +17753 +17753 +17754 +17754 +17755 +17755 +17756 +17756 +17757 +17757 +17757 +17758 +17758 +17759 +17759 +17760 +17760 +17761 +17761 +17762 +17762 +17762 +17763 +17763 +17764 +17764 +17765 +17765 +17766 +17766 +17766 +17767 +17767 +17768 +17768 +17769 +17769 +17770 +17770 +17770 +17771 +17771 +17772 +17772 +17773 +17773 +17774 +17774 +17775 +17775 +17775 +17776 +17776 +17777 +17777 +17778 +17778 +17779 +17779 +17779 +17780 +17780 +17781 +17781 +17782 +17782 +17782 +17783 +17783 +17784 +17784 +17785 +17785 +17786 +17786 +17786 +17787 +17787 +17788 +17788 +17789 +17789 +17790 +17790 +17790 +17791 +17791 +17792 +17792 +17793 +17793 +17793 +17794 +17794 +17795 +17795 +17796 +17796 +17797 +17797 +17797 +17798 +17798 +17799 +17799 +17800 +17800 +17800 +17801 +17801 +17802 +17802 +17803 +17803 +17804 +17804 +17804 +17805 +17805 +17806 +17806 +17807 +17807 +17807 +17808 +17808 +17809 +17809 +17810 +17810 +17810 +17811 +17811 +17812 +17812 +17813 +17813 +17813 +17814 +17814 +17815 +17815 +17816 +17816 +17816 +17817 +17817 +17818 +17818 +17819 +17819 +17819 +17820 +17820 +17821 +17821 +17822 +17822 +17822 +17823 +17823 +17824 +17824 +17825 +17825 +17825 +17826 +17826 +17827 +17827 +17828 +17828 +17828 +17829 +17829 +17830 +17830 +17831 +17831 +17831 +17832 +17832 +17833 +17833 +17834 +17834 +17834 +17835 +17835 +17836 +17836 +17836 +17837 +17837 +17838 +17838 +17839 +17839 +17839 +17840 +17840 +17841 +17841 +17842 +17842 +17842 +17843 +17843 +17844 +17844 +17844 +17845 +17845 +17846 +17846 +17847 +17847 +17847 +17848 +17848 +17849 +17849 +17850 +17850 +17850 +17851 +17851 +17852 +17852 +17852 +17853 +17853 +17854 +17854 +17855 +17855 +17855 +17856 +17856 +17857 +17857 +17857 +17858 +17858 +17859 +17859 +17859 +17860 +17860 +17861 +17861 +17862 +17862 +17862 +17863 +17863 +17864 +17864 +17864 +17865 +17865 +17866 +17866 +17867 +17867 +17867 +17868 +17868 +17869 +17869 +17869 +17870 +17870 +17871 +17871 +17871 +17872 +17872 +17873 +17873 +17874 +17874 +17874 +17875 +17875 +17876 +17876 +17876 +17877 +17877 +17878 +17878 +17878 +17879 +17879 +17880 +17880 +17880 +17881 +17881 +17882 +17882 +17882 +17883 +17883 +17884 +17884 +17885 +17885 +17885 +17886 +17886 +17887 +17887 +17887 +17888 +17888 +17889 +17889 +17889 +17890 +17890 +17891 +17891 +17891 +17892 +17892 +17893 +17893 +17893 +17894 +17894 +17895 +17895 +17895 +17896 +17896 +17897 +17897 +17897 +17898 +17898 +17899 +17899 +17899 +17900 +17900 +17901 +17901 +17901 +17902 +17902 +17903 +17903 +17903 +17904 +17904 +17905 +17905 +17905 +17906 +17906 +17907 +17907 +17907 +17908 +17908 +17909 +17909 +17909 +17910 +17910 +17911 +17911 +17911 +17912 +17912 +17913 +17913 +17913 +17914 +17914 +17915 +17915 +17915 +17916 +17916 +17917 +17917 +17917 +17918 +17918 +17919 +17919 +17919 +17920 +17920 +17921 +17921 +17921 +17922 +17922 +17923 +17923 +17923 +17924 +17924 +17924 +17925 +17925 +17926 +17926 +17926 +17927 +17927 +17928 +17928 +17928 +17929 +17929 +17930 +17930 +17930 +17931 +17931 +17932 +17932 +17932 +17933 +17933 +17934 +17934 +17934 +17935 +17935 +17935 +17936 +17936 +17937 +17937 +17937 +17938 +17938 +17939 +17939 +17939 +17940 +17940 +17941 +17941 +17941 +17942 +17942 +17942 +17943 +17943 +17944 +17944 +17944 +17945 +17945 +17946 +17946 +17946 +17947 +17947 +17947 +17948 +17948 +17949 +17949 +17949 +17950 +17950 +17951 +17951 +17951 +17952 +17952 +17953 +17953 +17953 +17954 +17954 +17954 +17955 +17955 +17956 +17956 +17956 +17957 +17957 +17958 +17958 +17958 +17959 +17959 +17959 +17960 +17960 +17961 +17961 +17961 +17962 +17962 +17962 +17963 +17963 +17964 +17964 +17964 +17965 +17965 +17966 +17966 +17966 +17967 +17967 +17967 +17968 +17968 +17969 +17969 +17969 +17970 +17970 +17970 +17971 +17971 +17972 +17972 +17972 +17973 +17973 +17974 +17974 +17974 +17975 +17975 +17975 +17976 +17976 +17977 +17977 +17977 +17978 +17978 +17978 +17979 +17979 +17980 +17980 +17980 +17981 +17981 +17981 +17982 +17982 +17983 +17983 +17983 +17984 +17984 +17984 +17985 +17985 +17986 +17986 +17986 +17987 +17987 +17987 +17988 +17988 +17989 +17989 +17989 +17990 +17990 +17990 +17991 +17991 +17992 +17992 +17992 +17993 +17993 +17993 +17994 +17994 +17995 +17995 +17995 +17996 +17996 +17996 +17997 +17997 +17998 +17998 +17998 +17999 +17999 +17999 +18000 +18000 +18001 +18001 +18001 +18002 +18002 +18002 +18003 +18003 +18003 +18004 +18004 +18005 +18005 +18005 +18006 +18006 +18006 +18007 +18007 +18008 +18008 +18008 +18009 +18009 +18009 +18010 +18010 +18011 +18011 +18011 +18012 +18012 +18012 +18013 +18013 +18013 +18014 +18014 +18015 +18015 +18015 +18016 +18016 +18016 +18017 +18017 +18017 +18018 +18018 +18019 +18019 +18019 +18020 +18020 +18020 +18021 +18021 +18022 +18022 +18023 +18023 +18024 +18025 +18026 +18026 +18027 +18028 +18028 +18029 +18030 +18031 +18031 +18032 +18033 +18034 +18034 +18035 +18036 +18036 +18037 +18038 +18039 +18039 +18040 +18041 +18041 +18042 +18043 +18044 +18044 +18045 +18046 +18047 +18047 +18048 +18049 +18049 +18050 +18051 +18052 +18052 +18053 +18054 +18054 +18055 +18056 +18057 +18057 +18058 +18059 +18059 +18060 +18061 +18062 +18062 +18063 +18064 +18064 +18065 +18066 +18066 +18067 +18068 +18069 +18069 +18070 +18071 +18071 +18072 +18073 +18074 +18074 +18075 +18076 +18076 +18077 +18078 +18078 +18079 +18080 +18081 +18081 +18082 +18083 +18083 +18084 +18085 +18085 +18086 +18087 +18088 +18088 +18089 +18090 +18090 +18091 +18092 +18092 +18093 +18094 +18095 +18095 +18096 +18097 +18097 +18098 +18099 +18099 +18100 +18101 +18101 +18102 +18103 +18104 +18104 +18105 +18106 +18106 +18107 +18108 +18108 +18109 +18110 +18110 +18111 +18112 +18112 +18113 +18114 +18114 +18115 +18116 +18117 +18117 +18118 +18119 +18119 +18120 +18121 +18121 +18122 +18123 +18123 +18124 +18125 +18125 +18126 +18127 +18127 +18128 +18129 +18129 +18130 +18131 +18131 +18132 +18133 +18134 +18134 +18135 +18136 +18136 +18137 +18138 +18138 +18139 +18140 +18140 +18141 +18142 +18142 +18143 +18144 +18144 +18145 +18146 +18146 +18147 +18148 +18148 +18149 +18150 +18150 +18151 +18152 +18152 +18153 +18154 +18154 +18155 +18156 +18156 +18157 +18158 +18158 +18159 +18160 +18160 +18161 +18162 +18162 +18163 +18164 +18164 +18165 +18166 +18166 +18167 +18168 +18168 +18169 +18170 +18170 +18171 +18172 +18172 +18173 +18173 +18174 +18175 +18175 +18176 +18177 +18177 +18178 +18179 +18179 +18180 +18181 +18181 +18182 +18183 +18183 +18184 +18185 +18185 +18186 +18187 +18187 +18188 +18189 +18189 +18190 +18190 +18191 +18192 +18192 +18193 +18194 +18194 +18195 +18196 +18196 +18197 +18198 +18198 +18199 +18200 +18200 +18201 +18201 +18202 +18203 +18203 +18204 +18205 +18205 +18206 +18207 +18207 +18208 +18209 +18209 +18210 +18210 +18211 +18212 +18212 +18213 +18214 +18214 +18215 +18216 +18216 +18217 +18218 +18218 +18219 +18219 +18220 +18221 +18221 +18222 +18223 +18223 +18224 +18225 +18225 +18226 +18226 +18227 +18228 +18228 +18229 +18230 +18230 +18231 +18231 +18232 +18233 +18233 +18234 +18235 +18235 +18236 +18237 +18237 +18238 +18238 +18239 +18240 +18240 +18241 +18242 +18242 +18243 +18243 +18244 +18245 +18245 +18246 +18247 +18247 +18248 +18248 +18249 +18250 +18250 +18251 +18252 +18252 +18253 +18253 +18254 +18255 +18255 +18256 +18257 +18257 +18258 +18258 +18259 +18260 +18260 +18261 +18262 +18262 +18263 +18263 +18264 +18265 +18265 +18266 +18267 +18267 +18268 +18268 +18269 +18270 +18270 +18271 +18271 +18272 +18273 +18273 +18274 +18275 +18275 +18276 +18276 +18277 +18278 +18278 +18279 +18279 +18280 +18281 +18281 +18282 +18282 +18283 +18284 +18284 +18285 +18286 +18286 +18287 +18287 +18288 +18289 +18289 +18290 +18290 +18291 +18292 +18292 +18293 +18293 +18294 +18295 +18295 +18296 +18297 +18297 +18298 +18298 +18299 +18300 +18300 +18301 +18301 +18302 +18303 +18303 +18304 +18304 +18305 +18306 +18306 +18307 +18307 +18308 +18309 +18309 +18310 +18310 +18311 +18312 +18312 +18313 +18313 +18314 +18315 +18315 +18316 +18316 +18317 +18318 +18318 +18319 +18319 +18320 +18321 +18321 +18322 +18322 +18323 +18324 +18324 +18325 +18325 +18326 +18327 +18327 +18328 +18328 +18329 +18330 +18330 +18331 +18331 +18332 +18332 +18333 +18334 +18334 +18335 +18335 +18336 +18337 +18337 +18338 +18338 +18339 +18340 +18340 +18341 +18341 +18342 +18343 +18343 +18344 +18344 +18345 +18345 +18346 +18347 +18347 +18348 +18348 +18349 +18350 +18350 +18351 +18351 +18352 +18353 +18353 +18354 +18354 +18355 +18355 +18356 +18357 +18357 +18358 +18358 +18359 +18360 +18360 +18361 +18361 +18362 +18362 +18363 +18364 +18364 +18365 +18365 +18366 +18367 +18367 +18368 +18368 +18369 +18369 +18370 +18371 +18371 +18372 +18372 +18373 +18373 +18374 +18375 +18375 +18376 +18376 +18377 +18378 +18378 +18379 +18379 +18380 +18380 +18381 +18382 +18382 +18383 +18383 +18384 +18384 +18385 +18386 +18386 +18387 +18387 +18388 +18388 +18389 +18390 +18390 +18391 +18391 +18392 +18392 +18393 +18394 +18394 +18395 +18395 +18396 +18396 +18397 +18398 +18398 +18399 +18399 +18400 +18400 +18401 +18402 +18402 +18403 +18403 +18404 +18404 +18405 +18406 +18406 +18407 +18407 +18408 +18408 +18409 +18410 +18410 +18411 +18411 +18412 +18412 +18413 +18413 +18414 +18415 +18415 +18416 +18416 +18417 +18417 +18418 +18419 +18419 +18420 +18420 +18421 +18421 +18422 +18422 +18423 +18424 +18424 +18425 +18425 +18426 +18426 +18427 +18428 +18428 +18429 +18429 +18430 +18430 +18431 +18431 +18432 +18432 +18433 +18433 +18433 +18433 +18434 +18434 +18434 +18435 +18435 +18435 +18435 +18436 +18436 +18436 +18436 +18437 +18437 +18437 +18438 +18438 +18438 +18438 +18439 +18439 +18439 +18440 +18440 +18440 +18440 +18441 +18441 +18441 +18441 +18442 +18442 +18442 +18443 +18443 +18443 +18443 +18444 +18444 +18444 +18444 +18445 +18445 +18445 +18446 +18446 +18446 +18446 +18447 +18447 +18447 +18447 +18448 +18448 +18448 +18449 +18449 +18449 +18449 +18450 +18450 +18450 +18451 +18451 +18451 +18451 +18452 +18452 +18452 +18452 +18453 +18453 +18453 +18454 +18454 +18454 +18454 +18455 +18455 +18455 +18455 +18456 +18456 +18456 +18456 +18457 +18457 +18457 +18458 +18458 +18458 +18458 +18459 +18459 +18459 +18459 +18460 +18460 +18460 +18461 +18461 +18461 +18461 +18462 +18462 +18462 +18462 +18463 +18463 +18463 +18464 +18464 +18464 +18464 +18465 +18465 +18465 +18465 +18466 +18466 +18466 +18466 +18467 +18467 +18467 +18468 +18468 +18468 +18468 +18469 +18469 +18469 +18469 +18470 +18470 +18470 +18470 +18471 +18471 +18471 +18472 +18472 +18472 +18472 +18473 +18473 +18473 +18473 +18474 +18474 +18474 +18474 +18475 +18475 +18475 +18476 +18476 +18476 +18476 +18477 +18477 +18477 +18477 +18478 +18478 +18478 +18478 +18479 +18479 +18479 +18480 +18480 +18480 +18480 +18481 +18481 +18481 +18481 +18482 +18482 +18482 +18482 +18483 +18483 +18483 +18483 +18484 +18484 +18484 +18485 +18485 +18485 +18485 +18486 +18486 +18486 +18486 +18487 +18487 +18487 +18487 +18488 +18488 +18488 +18488 +18489 +18489 +18489 +18490 +18490 +18490 +18490 +18491 +18491 +18491 +18491 +18492 +18492 +18492 +18492 +18493 +18493 +18493 +18493 +18494 +18494 +18494 +18494 +18495 +18495 +18495 +18496 +18496 +18496 +18496 +18497 +18497 +18497 +18497 +18498 +18498 +18498 +18498 +18499 +18499 +18499 +18499 +18500 +18500 +18500 +18500 +18501 +18501 +18501 +18501 +18502 +18502 +18502 +18502 +18503 +18503 +18503 +18504 +18504 +18504 +18504 +18505 +18505 +18505 +18505 +18506 +18506 +18506 +18506 +18507 +18507 +18507 +18507 +18508 +18508 +18508 +18508 +18509 +18509 +18509 +18509 +18510 +18510 +18510 +18510 +18511 +18511 +18511 +18511 +18512 +18512 +18512 +18512 +18513 +18513 +18513 +18514 +18514 +18514 +18514 +18515 +18515 +18515 +18515 +18516 +18516 +18516 +18516 +18517 +18517 +18517 +18517 +18518 +18518 +18518 +18518 +18519 +18519 +18519 +18519 +18520 +18520 +18520 +18520 +18521 +18521 +18521 +18521 +18522 +18522 +18522 +18522 +18523 +18523 +18523 +18523 +18524 +18524 +18524 +18524 +18525 +18525 +18525 +18525 +18526 +18526 +18526 +18526 +18527 +18527 +18527 +18527 +18528 +18528 +18528 +18528 +18529 +18529 +18529 +18529 +18530 +18530 +18530 +18530 +18531 +18531 +18531 +18531 +18532 +18532 +18533 +18533 +18534 +18534 +18535 +18535 +18536 +18536 +18537 +18537 +18538 +18538 +18539 +18539 +18540 +18540 +18541 +18541 +18542 +18542 +18543 +18543 +18544 +18544 +18545 +18545 +18546 +18546 +18547 +18547 +18548 +18548 +18549 +18549 +18550 +18550 +18551 +18551 +18552 +18552 +18553 +18553 +18554 +18554 +18555 +18555 +18556 +18556 +18557 +18557 +18557 +18558 +18558 +18559 +18559 +18560 +18560 +18561 +18561 +18562 +18562 +18563 +18563 +18564 +18564 +18565 +18565 +18566 +18566 +18567 +18567 +18568 +18568 +18569 +18569 +18570 +18570 +18571 +18571 +18571 +18572 +18572 +18573 +18573 +18574 +18574 +18575 +18575 +18576 +18576 +18577 +18577 +18578 +18578 +18579 +18579 +18580 +18580 +18581 +18581 +18581 +18582 +18582 +18583 +18583 +18584 +18584 +18585 +18585 +18586 +18586 +18587 +18587 +18588 +18588 +18589 +18589 +18589 +18590 +18590 +18591 +18591 +18592 +18592 +18593 +18593 +18594 +18594 +18595 +18595 +18596 +18596 +18597 +18597 +18597 +18598 +18598 +18599 +18599 +18600 +18600 +18601 +18601 +18602 +18602 +18603 +18603 +18603 +18604 +18604 +18605 +18605 +18606 +18606 +18607 +18607 +18608 +18608 +18609 +18609 +18609 +18610 +18610 +18611 +18611 +18612 +18612 +18613 +18613 +18614 +18614 +18615 +18615 +18615 +18616 +18616 +18617 +18617 +18618 +18618 +18619 +18619 +18620 +18620 +18620 +18621 +18621 +18622 +18622 +18623 +18623 +18624 +18624 +18625 +18625 +18625 +18626 +18626 +18627 +18627 +18628 +18628 +18629 +18629 +18630 +18630 +18630 +18631 +18631 +18632 +18632 +18633 +18633 +18634 +18634 +18634 +18635 +18635 +18636 +18636 +18637 +18637 +18638 +18638 +18639 +18639 +18639 +18640 +18640 +18641 +18641 +18642 +18642 +18643 +18643 +18643 +18644 +18644 +18645 +18645 +18646 +18646 +18647 +18647 +18647 +18648 +18648 +18649 +18649 +18650 +18650 +18651 +18651 +18651 +18652 +18652 +18653 +18653 +18654 +18654 +18655 +18655 +18655 +18656 +18656 +18657 +18657 +18658 +18658 +18658 +18659 +18659 +18660 +18660 +18661 +18661 +18662 +18662 +18662 +18663 +18663 +18664 +18664 +18665 +18665 +18665 +18666 +18666 +18667 +18667 +18668 +18668 +18668 +18669 +18669 +18670 +18670 +18671 +18671 +18672 +18672 +18672 +18673 +18673 +18674 +18674 +18675 +18675 +18675 +18676 +18676 +18677 +18677 +18678 +18678 +18678 +18679 +18679 +18680 +18680 +18681 +18681 +18681 +18682 +18682 +18683 +18683 +18684 +18684 +18684 +18685 +18685 +18686 +18686 +18687 +18687 +18687 +18688 +18688 +18689 +18689 +18690 +18690 +18690 +18691 +18691 +18692 +18692 +18693 +18693 +18693 +18694 +18694 +18695 +18695 +18696 +18696 +18696 +18697 +18697 +18698 +18698 +18698 +18699 +18699 +18700 +18700 +18701 +18701 +18701 +18702 +18702 +18703 +18703 +18704 +18704 +18704 +18705 +18705 +18706 +18706 +18706 +18707 +18707 +18708 +18708 +18709 +18709 +18709 +18710 +18710 +18711 +18711 +18711 +18712 +18712 +18713 +18713 +18714 +18714 +18714 +18715 +18715 +18716 +18716 +18716 +18717 +18717 +18718 +18718 +18719 +18719 +18719 +18720 +18720 +18721 +18721 +18721 +18722 +18722 +18723 +18723 +18724 +18724 +18724 +18725 +18725 +18726 +18726 +18726 +18727 +18727 +18728 +18728 +18728 +18729 +18729 +18730 +18730 +18731 +18731 +18731 +18732 +18732 +18733 +18733 +18733 +18734 +18734 +18735 +18735 +18735 +18736 +18736 +18737 +18737 +18737 +18738 +18738 +18739 +18739 +18739 +18740 +18740 +18741 +18741 +18742 +18742 +18742 +18743 +18743 +18744 +18744 +18744 +18745 +18745 +18746 +18746 +18746 +18747 +18747 +18748 +18748 +18748 +18749 +18749 +18750 +18750 +18750 +18751 +18751 +18752 +18752 +18752 +18753 +18753 +18754 +18754 +18754 +18755 +18755 +18756 +18756 +18756 +18757 +18757 +18758 +18758 +18758 +18759 +18759 +18760 +18760 +18760 +18761 +18761 +18762 +18762 +18762 +18763 +18763 +18764 +18764 +18764 +18765 +18765 +18766 +18766 +18766 +18767 +18767 +18768 +18768 +18768 +18769 +18769 +18770 +18770 +18770 +18771 +18771 +18772 +18772 +18772 +18773 +18773 +18774 +18774 +18774 +18775 +18775 +18775 +18776 +18776 +18777 +18777 +18777 +18778 +18778 +18779 +18779 +18779 +18780 +18780 +18781 +18781 +18781 +18782 +18782 +18783 +18783 +18783 +18784 +18784 +18784 +18785 +18785 +18786 +18786 +18786 +18787 +18787 +18788 +18788 +18788 +18789 +18789 +18790 +18790 +18790 +18791 +18791 +18792 +18792 +18792 +18793 +18793 +18793 +18794 +18794 +18795 +18795 +18795 +18796 +18796 +18797 +18797 +18797 +18798 +18798 +18798 +18799 +18799 +18800 +18800 +18800 +18801 +18801 +18802 +18802 +18802 +18803 +18803 +18803 +18804 +18804 +18805 +18805 +18805 +18806 +18806 +18807 +18807 +18807 +18808 +18808 +18808 +18809 +18809 +18810 +18810 +18810 +18811 +18811 +18812 +18812 +18812 +18813 +18813 +18813 +18814 +18814 +18815 +18815 +18815 +18816 +18816 +18816 +18817 +18817 +18818 +18818 +18818 +18819 +18819 +18819 +18820 +18820 +18821 +18821 +18821 +18822 +18822 +18823 +18823 +18823 +18824 +18824 +18824 +18825 +18825 +18826 +18826 +18826 +18827 +18827 +18827 +18828 +18828 +18829 +18829 +18829 +18830 +18830 +18830 +18831 +18831 +18832 +18832 +18832 +18833 +18833 +18833 +18834 +18834 +18835 +18835 +18835 +18836 +18836 +18836 +18837 +18837 +18838 +18838 +18838 +18839 +18839 +18839 +18840 +18840 +18841 +18841 +18841 +18842 +18842 +18842 +18843 +18843 +18843 +18844 +18844 +18845 +18845 +18845 +18846 +18846 +18846 +18847 +18847 +18848 +18848 +18848 +18849 +18849 +18849 +18850 +18850 +18851 +18851 +18851 +18852 +18852 +18852 +18853 +18853 +18853 +18854 +18854 +18855 +18855 +18855 +18856 +18856 +18856 +18857 +18857 +18858 +18858 +18858 +18859 +18859 +18859 +18860 +18860 +18860 +18861 +18861 +18862 +18862 +18862 +18863 +18863 +18863 +18864 +18864 +18864 +18865 +18865 +18866 +18866 +18866 +18867 +18867 +18867 +18868 +18868 +18868 +18869 +18869 +18870 +18870 +18870 +18871 +18871 +18871 +18872 +18872 +18872 +18873 +18873 +18874 +18874 +18874 +18875 +18875 +18875 +18876 +18876 +18876 +18877 +18877 +18878 +18878 +18878 +18879 +18879 +18879 +18880 +18880 +18880 +18881 +18881 +18881 +18882 +18882 +18883 +18883 +18883 +18884 +18884 +18884 +18885 +18885 +18885 +18886 +18886 +18887 +18887 +18887 +18888 +18888 +18888 +18889 +18889 +18889 +18890 +18890 +18890 +18891 +18891 +18892 +18892 +18892 +18893 +18893 +18893 +18894 +18894 +18894 +18895 +18895 +18895 +18896 +18896 +18896 +18897 +18897 +18898 +18898 +18898 +18899 +18899 +18899 +18900 +18900 +18900 +18901 +18901 +18901 +18902 +18902 +18903 +18903 +18903 +18904 +18904 +18904 +18905 +18905 +18905 +18906 +18906 +18906 +18907 +18907 +18907 +18908 +18908 +18909 +18909 +18909 +18910 +18910 +18910 +18911 +18911 +18911 +18912 +18912 +18912 +18913 +18913 +18913 +18914 +18914 +18914 +18915 +18915 +18916 +18916 +18916 +18917 +18917 +18917 +18918 +18918 +18918 +18919 +18919 +18919 +18920 +18920 +18920 +18921 +18921 +18921 +18922 +18922 +18922 +18923 +18923 +18924 +18924 +18924 +18925 +18925 +18925 +18926 +18926 +18926 +18927 +18927 +18927 +18928 +18928 +18928 +18929 +18929 +18929 +18930 +18930 +18930 +18931 +18931 +18932 +18932 +18932 +18933 +18933 +18933 +18934 +18934 +18934 +18935 +18935 +18935 +18936 +18936 +18936 +18937 +18937 +18937 +18938 +18938 +18938 +18939 +18939 +18939 +18940 +18940 +18940 +18941 +18941 +18941 +18942 +18942 +18943 +18943 +18943 +18944 +18944 +18944 +18945 +18945 +18945 +18946 +18946 +18946 +18947 +18947 +18947 +18948 +18949 +18949 +18950 +18951 +18951 +18952 +18953 +18953 +18954 +18955 +18955 +18956 +18957 +18957 +18958 +18959 +18960 +18960 +18961 +18962 +18962 +18963 +18964 +18964 +18965 +18966 +18966 +18967 +18968 +18968 +18969 +18970 +18970 +18971 +18972 +18972 +18973 +18974 +18974 +18975 +18976 +18976 +18977 +18978 +18978 +18979 +18980 +18980 +18981 +18982 +18982 +18983 +18984 +18984 +18985 +18986 +18986 +18987 +18988 +18988 +18989 +18990 +18990 +18991 +18992 +18992 +18993 +18994 +18994 +18995 +18995 +18996 +18997 +18997 +18998 +18999 +18999 +19000 +19001 +19001 +19002 +19003 +19003 +19004 +19005 +19005 +19006 +19007 +19007 +19008 +19009 +19009 +19010 +19011 +19011 +19012 +19012 +19013 +19014 +19014 +19015 +19016 +19016 +19017 +19018 +19018 +19019 +19020 +19020 +19021 +19022 +19022 +19023 +19023 +19024 +19025 +19025 +19026 +19027 +19027 +19028 +19029 +19029 +19030 +19030 +19031 +19032 +19032 +19033 +19034 +19034 +19035 +19036 +19036 +19037 +19038 +19038 +19039 +19039 +19040 +19041 +19041 +19042 +19043 +19043 +19044 +19045 +19045 +19046 +19046 +19047 +19048 +19048 +19049 +19050 +19050 +19051 +19051 +19052 +19053 +19053 +19054 +19055 +19055 +19056 +19056 +19057 +19058 +19058 +19059 +19060 +19060 +19061 +19061 +19062 +19063 +19063 +19064 +19065 +19065 +19066 +19066 +19067 +19068 +19068 +19069 +19070 +19070 +19071 +19071 +19072 +19073 +19073 +19074 +19075 +19075 +19076 +19076 +19077 +19078 +19078 +19079 +19080 +19080 +19081 +19081 +19082 +19083 +19083 +19084 +19084 +19085 +19086 +19086 +19087 +19088 +19088 +19089 +19089 +19090 +19091 +19091 +19092 +19092 +19093 +19094 +19094 +19095 +19095 +19096 +19097 +19097 +19098 +19099 +19099 +19100 +19100 +19101 +19102 +19102 +19103 +19103 +19104 +19105 +19105 +19106 +19106 +19107 +19108 +19108 +19109 +19109 +19110 +19111 +19111 +19112 +19112 +19113 +19114 +19114 +19115 +19115 +19116 +19117 +19117 +19118 +19118 +19119 +19120 +19120 +19121 +19121 +19122 +19123 +19123 +19124 +19124 +19125 +19126 +19126 +19127 +19127 +19128 +19129 +19129 +19130 +19130 +19131 +19132 +19132 +19133 +19133 +19134 +19135 +19135 +19136 +19136 +19137 +19138 +19138 +19139 +19139 +19140 +19140 +19141 +19142 +19142 +19143 +19143 +19144 +19145 +19145 +19146 +19146 +19147 +19148 +19148 +19149 +19149 +19150 +19151 +19151 +19152 +19152 +19153 +19153 +19154 +19155 +19155 +19156 +19156 +19157 +19158 +19158 +19159 +19159 +19160 +19160 +19161 +19162 +19162 +19163 +19163 +19164 +19165 +19165 +19166 +19166 +19167 +19167 +19168 +19169 +19169 +19170 +19170 +19171 +19171 +19172 +19173 +19173 +19174 +19174 +19175 +19176 +19176 +19177 +19177 +19178 +19178 +19179 +19180 +19180 +19181 +19181 +19182 +19182 +19183 +19184 +19184 +19185 +19185 +19186 +19186 +19187 +19188 +19188 +19189 +19189 +19190 +19190 +19191 +19192 +19192 +19193 +19193 +19194 +19194 +19195 +19196 +19196 +19197 +19197 +19198 +19198 +19199 +19200 +19200 +19201 +19201 +19202 +19202 +19203 +19204 +19204 +19205 +19205 +19206 +19206 +19207 +19207 +19208 +19209 +19209 +19210 +19210 +19211 +19211 +19212 +19213 +19213 +19214 +19214 +19215 +19215 +19216 +19216 +19217 +19218 +19218 +19219 +19219 +19220 +19220 +19221 +19222 +19222 +19223 +19223 +19224 +19224 +19225 +19225 +19226 +19227 +19227 +19228 +19228 +19229 +19229 +19230 +19230 +19231 +19232 +19232 +19233 +19233 +19234 +19234 +19235 +19235 +19236 +19237 +19237 +19238 +19238 +19239 +19239 +19240 +19240 +19241 +19242 +19242 +19243 +19243 +19244 +19244 +19245 +19245 +19246 +19246 +19247 +19248 +19248 +19249 +19249 +19250 +19250 +19251 +19251 +19252 +19253 +19253 +19254 +19254 +19255 +19255 +19256 +19256 +19257 +19257 +19258 +19259 +19259 +19260 +19260 +19261 +19261 +19262 +19262 +19263 +19263 +19264 +19265 +19265 +19266 +19266 +19267 +19267 +19268 +19268 +19269 +19269 +19270 +19270 +19271 +19272 +19272 +19273 +19273 +19274 +19274 +19275 +19275 +19276 +19276 +19277 +19277 +19278 +19279 +19279 +19280 +19280 +19281 +19281 +19282 +19282 +19283 +19283 +19284 +19284 +19285 +19286 +19286 +19287 +19287 +19288 +19288 +19289 +19289 +19290 +19290 +19291 +19291 +19292 +19293 +19293 +19294 +19294 +19295 +19295 +19296 +19296 +19297 +19297 +19298 +19298 +19299 +19299 +19300 +19300 +19301 +19302 +19302 +19303 +19303 +19304 +19304 +19305 +19305 +19306 +19306 +19307 +19307 +19308 +19308 +19309 +19309 +19310 +19311 +19311 +19312 +19312 +19313 +19313 +19314 +19314 +19315 +19315 +19316 +19316 +19317 +19317 +19318 +19318 +19319 +19319 +19320 +19321 +19321 +19322 +19322 +19323 +19323 +19324 +19324 +19325 +19325 +19326 +19326 +19327 +19327 +19328 +19328 +19329 +19329 +19330 +19330 +19331 +19332 +19332 +19333 +19333 +19334 +19334 +19335 +19335 +19336 +19336 +19337 +19337 +19338 +19338 +19339 +19339 +19340 +19340 +19341 +19341 +19342 +19342 +19343 +19343 +19344 +19344 +19345 +19345 +19346 +19347 +19347 +19348 +19348 +19349 +19349 +19350 +19350 +19351 +19351 +19352 +19352 +19353 +19353 +19354 +19354 +19355 +19355 +19356 +19356 +19357 +19357 +19358 +19358 +19359 +19359 +19360 +19360 +19361 +19361 +19362 +19362 +19363 +19363 +19364 +19364 +19365 +19365 +19366 +19367 +19367 +19368 +19368 +19369 +19369 +19370 +19370 +19371 +19371 +19372 +19372 +19373 +19373 +19374 +19374 +19375 +19375 +19376 +19376 +19377 +19377 +19378 +19378 +19379 +19379 +19380 +19380 +19381 +19381 +19382 +19382 +19383 +19383 +19384 +19384 +19385 +19385 +19386 +19386 +19387 +19387 +19388 +19388 +19389 +19389 +19390 +19390 +19391 +19391 +19392 +19392 +19393 +19393 +19394 +19394 +19395 +19395 +19396 +19396 +19397 +19397 +19398 +19398 +19399 +19399 +19400 +19400 +19401 +19401 +19402 +19402 +19403 +19403 +19404 +19404 +19405 +19405 +19406 +19406 +19407 +19407 +19408 +19408 +19409 +19409 +19410 +19410 +19411 +19411 +19412 +19412 +19413 +19413 +19414 +19414 +19415 +19415 +19416 +19416 +19417 +19417 +19418 +19418 +19419 +19419 +19420 +19420 +19421 +19421 +19422 +19422 +19423 +19423 +19424 +19424 +19425 +19425 +19426 +19426 +19426 +19427 +19427 +19428 +19428 +19429 +19429 +19430 +19430 +19431 +19431 +19432 +19432 +19433 +19433 +19434 +19434 +19435 +19435 +19436 +19436 +19437 +19437 +19438 +19438 +19439 +19439 +19440 +19440 +19441 +19441 +19442 +19442 +19443 +19443 +19444 +19444 +19445 +19445 +19446 +19446 +19447 +19447 +19447 +19448 +19448 +19449 +19449 +19450 +19450 +19451 +19451 +19452 +19452 +19453 +19453 +19454 +19454 +19455 +19455 +19456 +19456 +19456 +19457 +19457 +19457 +19457 +19458 +19458 +19458 +19458 +19458 +19459 +19459 +19459 +19459 +19460 +19460 +19460 +19460 +19461 +19461 +19461 +19461 +19462 +19462 +19462 +19462 +19463 +19463 +19463 +19463 +19464 +19464 +19464 +19464 +19464 +19465 +19465 +19465 +19465 +19466 +19466 +19466 +19466 +19467 +19467 +19467 +19467 +19468 +19468 +19468 +19468 +19469 +19469 +19469 +19469 +19469 +19470 +19470 +19470 +19470 +19471 +19471 +19471 +19471 +19472 +19472 +19472 +19472 +19473 +19473 +19473 +19473 +19474 +19474 +19474 +19474 +19474 +19475 +19475 +19475 +19475 +19476 +19476 +19476 +19476 +19477 +19477 +19477 +19477 +19478 +19478 +19478 +19478 +19478 +19479 +19479 +19479 +19479 +19480 +19480 +19480 +19480 +19481 +19481 +19481 +19481 +19482 +19482 +19482 +19482 +19482 +19483 +19483 +19483 +19483 +19484 +19484 +19484 +19484 +19485 +19485 +19485 +19485 +19485 +19486 +19486 +19487 +19487 +19488 +19488 +19489 +19489 +19489 +19490 +19490 +19491 +19491 +19492 +19492 +19493 +19493 +19494 +19494 +19495 +19495 +19495 +19496 +19496 +19497 +19497 +19498 +19498 +19499 +19499 +19500 +19500 +19500 +19501 +19501 +19502 +19502 +19503 +19503 +19504 +19504 +19505 +19505 +19506 +19506 +19506 +19507 +19507 +19508 +19508 +19509 +19509 +19510 +19510 +19511 +19511 +19511 +19512 +19512 +19513 +19513 +19514 +19514 +19515 +19515 +19515 +19516 +19516 +19517 +19517 +19518 +19518 +19519 +19519 +19520 +19520 +19520 +19521 +19521 +19522 +19522 +19523 +19523 +19524 +19524 +19524 +19525 +19525 +19526 +19526 +19527 +19527 +19528 +19528 +19528 +19529 +19529 +19530 +19530 +19531 +19531 +19532 +19532 +19532 +19533 +19533 +19534 +19534 +19535 +19535 +19536 +19536 +19536 +19537 +19537 +19538 +19538 +19539 +19539 +19539 +19540 +19540 +19541 +19541 +19542 +19542 +19543 +19543 +19543 +19544 +19544 +19545 +19545 +19546 +19546 +19546 +19547 +19547 +19548 +19548 +19549 +19549 +19550 +19550 +19550 +19551 +19551 +19552 +19552 +19553 +19553 +19553 +19554 +19554 +19555 +19555 +19556 +19556 +19556 +19557 +19557 +19558 +19558 +19559 +19559 +19559 +19560 +19560 +19561 +19561 +19562 +19562 +19562 +19563 +19563 +19564 +19564 +19565 +19565 +19565 +19566 +19566 +19567 +19567 +19568 +19568 +19568 +19569 +19569 +19570 +19570 +19571 +19571 +19571 +19572 +19572 +19573 +19573 +19573 +19574 +19574 +19575 +19575 +19576 +19576 +19576 +19577 +19577 +19578 +19578 +19579 +19579 +19579 +19580 +19580 +19581 +19581 +19581 +19582 +19582 +19583 +19583 +19584 +19584 +19584 +19585 +19585 +19586 +19586 +19586 +19587 +19587 +19588 +19588 +19589 +19589 +19589 +19590 +19590 +19591 +19591 +19591 +19592 +19592 +19593 +19593 +19594 +19594 +19594 +19595 +19595 +19596 +19596 +19596 +19597 +19597 +19598 +19598 +19599 +19599 +19599 +19600 +19600 +19601 +19601 +19601 +19602 +19602 +19603 +19603 +19603 +19604 +19604 +19605 +19605 +19605 +19606 +19606 +19607 +19607 +19608 +19608 +19608 +19609 +19609 +19610 +19610 +19610 +19611 +19611 +19612 +19612 +19612 +19613 +19613 +19614 +19614 +19614 +19615 +19615 +19616 +19616 +19616 +19617 +19617 +19618 +19618 +19618 +19619 +19619 +19620 +19620 +19620 +19621 +19621 +19622 +19622 +19623 +19623 +19623 +19624 +19624 +19625 +19625 +19625 +19626 +19626 +19627 +19627 +19627 +19628 +19628 +19629 +19629 +19629 +19630 +19630 +19631 +19631 +19631 +19632 +19632 +19632 +19633 +19633 +19634 +19634 +19634 +19635 +19635 +19636 +19636 +19636 +19637 +19637 +19638 +19638 +19638 +19639 +19639 +19640 +19640 +19640 +19641 +19641 +19642 +19642 +19642 +19643 +19643 +19644 +19644 +19644 +19645 +19645 +19646 +19646 +19646 +19647 +19647 +19647 +19648 +19648 +19649 +19649 +19649 +19650 +19650 +19651 +19651 +19651 +19652 +19652 +19653 +19653 +19653 +19654 +19654 +19655 +19655 +19655 +19656 +19656 +19656 +19657 +19657 +19658 +19658 +19658 +19659 +19659 +19660 +19660 +19660 +19661 +19661 +19661 +19662 +19662 +19663 +19663 +19663 +19664 +19664 +19665 +19665 +19665 +19666 +19666 +19666 +19667 +19667 +19668 +19668 +19668 +19669 +19669 +19670 +19670 +19670 +19671 +19671 +19671 +19672 +19672 +19673 +19673 +19673 +19674 +19674 +19675 +19675 +19675 +19676 +19676 +19676 +19677 +19677 +19678 +19678 +19678 +19679 +19679 +19679 +19680 +19680 +19681 +19681 +19681 +19682 +19682 +19683 +19683 +19683 +19684 +19684 +19684 +19685 +19685 +19686 +19686 +19686 +19687 +19687 +19687 +19688 +19688 +19689 +19689 +19689 +19690 +19690 +19690 +19691 +19691 +19692 +19692 +19692 +19693 +19693 +19693 +19694 +19694 +19695 +19695 +19695 +19696 +19696 +19696 +19697 +19697 +19698 +19698 +19698 +19699 +19699 +19699 +19700 +19700 +19701 +19701 +19701 +19702 +19702 +19702 +19703 +19703 +19703 +19704 +19704 +19705 +19705 +19705 +19706 +19706 +19706 +19707 +19707 +19708 +19708 +19708 +19709 +19709 +19709 +19710 +19710 +19711 +19711 +19711 +19712 +19712 +19712 +19713 +19713 +19713 +19714 +19714 +19715 +19715 +19715 +19716 +19716 +19716 +19717 +19717 +19717 +19718 +19718 +19719 +19719 +19719 +19720 +19720 +19720 +19721 +19721 +19721 +19722 +19722 +19723 +19723 +19723 +19724 +19724 +19724 +19725 +19725 +19725 +19726 +19726 +19727 +19727 +19727 +19728 +19728 +19728 +19729 +19729 +19729 +19730 +19730 +19731 +19731 +19731 +19732 +19732 +19732 +19733 +19733 +19733 +19734 +19734 +19735 +19735 +19735 +19736 +19736 +19736 +19737 +19737 +19737 +19738 +19738 +19738 +19739 +19739 +19740 +19740 +19740 +19741 +19741 +19741 +19742 +19742 +19742 +19743 +19743 +19744 +19744 +19744 +19745 +19745 +19745 +19746 +19746 +19746 +19747 +19747 +19747 +19748 +19748 +19748 +19749 +19749 +19750 +19750 +19750 +19751 +19751 +19751 +19752 +19752 +19752 +19753 +19753 +19753 +19754 +19754 +19755 +19755 +19755 +19756 +19756 +19756 +19757 +19757 +19757 +19758 +19758 +19758 +19759 +19759 +19759 +19760 +19760 +19761 +19761 +19761 +19762 +19762 +19762 +19763 +19763 +19763 +19764 +19764 +19764 +19765 +19765 +19765 +19766 +19766 +19766 +19767 +19767 +19768 +19768 +19768 +19769 +19769 +19769 +19770 +19770 +19770 +19771 +19771 +19771 +19772 +19772 +19772 +19773 +19773 +19773 +19774 +19774 +19774 +19775 +19775 +19776 +19776 +19776 +19777 +19777 +19777 +19778 +19778 +19778 +19779 +19779 +19779 +19780 +19780 +19780 +19781 +19781 +19781 +19782 +19782 +19782 +19783 +19783 +19783 +19784 +19784 +19784 +19785 +19785 +19786 +19786 +19786 +19787 +19787 +19787 +19788 +19788 +19788 +19789 +19789 +19789 +19790 +19790 +19790 +19791 +19791 +19791 +19792 +19792 +19792 +19793 +19793 +19793 +19794 +19794 +19794 +19795 +19795 +19795 +19796 +19796 +19796 +19797 +19797 +19797 +19798 +19798 +19799 +19799 +19799 +19800 +19800 +19800 +19801 +19801 +19801 +19802 +19802 +19802 +19803 +19803 +19803 +19804 +19804 +19804 +19805 +19805 +19805 +19806 +19806 +19806 +19807 +19807 +19807 +19808 +19808 +19808 +19809 +19809 +19809 +19810 +19810 +19810 +19811 +19811 +19811 +19812 +19812 +19812 +19813 +19813 +19813 +19814 +19814 +19814 +19815 +19815 +19815 +19816 +19816 +19816 +19817 +19817 +19817 +19818 +19818 +19818 +19819 +19819 +19819 +19820 +19820 +19820 +19821 +19821 +19821 +19822 +19822 +19822 +19823 +19823 +19823 +19824 +19824 +19824 +19825 +19825 +19825 +19826 +19826 +19826 +19827 +19827 +19827 +19828 +19828 +19828 +19829 +19829 +19829 +19830 +19830 +19830 +19831 +19831 +19831 +19832 +19832 +19832 +19833 +19833 +19833 +19834 +19834 +19834 +19835 +19835 +19835 +19836 +19836 +19836 +19837 +19837 +19837 +19838 +19838 +19838 +19839 +19839 +19839 +19840 +19840 +19840 +19841 +19841 +19841 +19841 +19842 +19842 +19842 +19843 +19843 +19843 +19844 +19844 +19844 +19845 +19845 +19845 +19846 +19846 +19846 +19847 +19847 +19847 +19848 +19848 +19848 +19849 +19849 +19849 +19850 +19850 +19850 +19851 +19851 +19851 +19852 +19852 +19852 +19853 +19853 +19853 +19854 +19854 +19854 +19855 +19855 +19855 +19855 +19856 +19856 +19856 +19857 +19857 +19857 +19858 +19858 +19858 +19859 +19859 +19859 +19860 +19860 +19860 +19861 +19861 +19861 +19862 +19862 +19862 +19863 +19863 +19863 +19864 +19864 +19864 +19864 +19865 +19865 +19865 +19866 +19866 +19866 +19867 +19867 +19867 +19868 +19868 +19868 +19869 +19869 +19869 +19870 +19870 +19870 +19871 +19871 +19871 +19872 +19872 +19872 +19872 +19873 +19873 +19873 +19874 +19874 +19875 +19876 +19876 +19877 +19878 +19878 +19879 +19879 +19880 +19881 +19881 +19882 +19883 +19883 +19884 +19885 +19885 +19886 +19886 +19887 +19888 +19888 +19889 +19890 +19890 +19891 +19891 +19892 +19893 +19893 +19894 +19895 +19895 +19896 +19896 +19897 +19898 +19898 +19899 +19900 +19900 +19901 +19901 +19902 +19903 +19903 +19904 +19905 +19905 +19906 +19906 +19907 +19908 +19908 +19909 +19909 +19910 +19911 +19911 +19912 +19913 +19913 +19914 +19914 +19915 +19916 +19916 +19917 +19917 +19918 +19919 +19919 +19920 +19921 +19921 +19922 +19922 +19923 +19924 +19924 +19925 +19925 +19926 +19927 +19927 +19928 +19928 +19929 +19930 +19930 +19931 +19932 +19932 +19933 +19933 +19934 +19935 +19935 +19936 +19936 +19937 +19938 +19938 +19939 +19939 +19940 +19941 +19941 +19942 +19942 +19943 +19944 +19944 +19945 +19945 +19946 +19947 +19947 +19948 +19948 +19949 +19950 +19950 +19951 +19951 +19952 +19953 +19953 +19954 +19954 +19955 +19956 +19956 +19957 +19957 +19958 +19959 +19959 +19960 +19960 +19961 +19961 +19962 +19963 +19963 +19964 +19964 +19965 +19966 +19966 +19967 +19967 +19968 +19969 +19969 +19970 +19970 +19971 +19972 +19972 +19973 +19973 +19974 +19974 +19975 +19976 +19976 +19977 +19977 +19978 +19979 +19979 +19980 +19980 +19981 +19981 +19982 +19983 +19983 +19984 +19984 +19985 +19986 +19986 +19987 +19987 +19988 +19988 +19989 +19990 +19990 +19991 +19991 +19992 +19993 +19993 +19994 +19994 +19995 +19995 +19996 +19997 +19997 +19998 +19998 +19999 +19999 +20000 +20001 +20001 +20002 +20002 +20003 +20003 +20004 +20005 +20005 +20006 +20006 +20007 +20007 +20008 +20009 +20009 +20010 +20010 +20011 +20011 +20012 +20013 +20013 +20014 +20014 +20015 +20015 +20016 +20017 +20017 +20018 +20018 +20019 +20019 +20020 +20021 +20021 +20022 +20022 +20023 +20023 +20024 +20024 +20025 +20026 +20026 +20027 +20027 +20028 +20028 +20029 +20030 +20030 +20031 +20031 +20032 +20032 +20033 +20033 +20034 +20035 +20035 +20036 +20036 +20037 +20037 +20038 +20038 +20039 +20040 +20040 +20041 +20041 +20042 +20042 +20043 +20044 +20044 +20045 +20045 +20046 +20046 +20047 +20047 +20048 +20048 +20049 +20050 +20050 +20051 +20051 +20052 +20052 +20053 +20053 +20054 +20055 +20055 +20056 +20056 +20057 +20057 +20058 +20058 +20059 +20060 +20060 +20061 +20061 +20062 +20062 +20063 +20063 +20064 +20064 +20065 +20066 +20066 +20067 +20067 +20068 +20068 +20069 +20069 +20070 +20070 +20071 +20072 +20072 +20073 +20073 +20074 +20074 +20075 +20075 +20076 +20076 +20077 +20078 +20078 +20079 +20079 +20080 +20080 +20081 +20081 +20082 +20082 +20083 +20083 +20084 +20085 +20085 +20086 +20086 +20087 +20087 +20088 +20088 +20089 +20089 +20090 +20090 +20091 +20092 +20092 +20093 +20093 +20094 +20094 +20095 +20095 +20096 +20096 +20097 +20097 +20098 +20098 +20099 +20100 +20100 +20101 +20101 +20102 +20102 +20103 +20103 +20104 +20104 +20105 +20105 +20106 +20106 +20107 +20108 +20108 +20109 +20109 +20110 +20110 +20111 +20111 +20112 +20112 +20113 +20113 +20114 +20114 +20115 +20115 +20116 +20117 +20117 +20118 +20118 +20119 +20119 +20120 +20120 +20121 +20121 +20122 +20122 +20123 +20123 +20124 +20124 +20125 +20125 +20126 +20126 +20127 +20128 +20128 +20129 +20129 +20130 +20130 +20131 +20131 +20132 +20132 +20133 +20133 +20134 +20134 +20135 +20135 +20136 +20136 +20137 +20137 +20138 +20138 +20139 +20139 +20140 +20141 +20141 +20142 +20142 +20143 +20143 +20144 +20144 +20145 +20145 +20146 +20146 +20147 +20147 +20148 +20148 +20149 +20149 +20150 +20150 +20151 +20151 +20152 +20152 +20153 +20153 +20154 +20154 +20155 +20155 +20156 +20156 +20157 +20158 +20158 +20159 +20159 +20160 +20160 +20161 +20161 +20162 +20162 +20163 +20163 +20164 +20164 +20165 +20165 +20166 +20166 +20167 +20167 +20168 +20168 +20169 +20169 +20170 +20170 +20171 +20171 +20172 +20172 +20173 +20173 +20174 +20174 +20175 +20175 +20176 +20176 +20177 +20177 +20178 +20178 +20179 +20179 +20180 +20180 +20181 +20181 +20182 +20182 +20183 +20183 +20184 +20184 +20185 +20185 +20186 +20186 +20187 +20187 +20188 +20188 +20189 +20189 +20190 +20190 +20191 +20191 +20192 +20192 +20193 +20193 +20194 +20194 +20195 +20195 +20196 +20196 +20197 +20197 +20198 +20198 +20199 +20199 +20200 +20200 +20201 +20201 +20202 +20202 +20203 +20203 +20204 +20204 +20205 +20205 +20206 +20206 +20207 +20207 +20208 +20208 +20209 +20209 +20210 +20210 +20211 +20211 +20212 +20212 +20213 +20213 +20214 +20214 +20215 +20215 +20216 +20216 +20217 +20217 +20218 +20218 +20219 +20219 +20220 +20220 +20221 +20221 +20222 +20222 +20222 +20223 +20223 +20224 +20224 +20225 +20225 +20226 +20226 +20227 +20227 +20228 +20228 +20229 +20229 +20230 +20230 +20231 +20231 +20232 +20232 +20233 +20233 +20234 +20234 +20235 +20235 +20236 +20236 +20237 +20237 +20238 +20238 +20239 +20239 +20239 +20240 +20240 +20241 +20241 +20242 +20242 +20243 +20243 +20244 +20244 +20245 +20245 +20246 +20246 +20247 +20247 +20248 +20248 +20249 +20249 +20250 +20250 +20251 +20251 +20252 +20252 +20252 +20253 +20253 +20254 +20254 +20255 +20255 +20256 +20256 +20257 +20257 +20258 +20258 +20259 +20259 +20260 +20260 +20261 +20261 +20262 +20262 +20263 +20263 +20263 +20264 +20264 +20265 +20265 +20266 +20266 +20267 +20267 +20268 +20268 +20269 +20269 +20270 +20270 +20271 +20271 +20272 +20272 +20272 +20273 +20273 +20274 +20274 +20275 +20275 +20276 +20276 +20277 +20277 +20278 +20278 +20279 +20279 +20280 +20280 +20280 +20281 +20281 +20282 +20282 +20283 +20283 +20284 +20284 +20285 +20285 +20286 +20286 +20287 +20287 +20288 +20288 +20288 +20289 +20289 +20290 +20290 +20291 +20291 +20292 +20292 +20293 +20293 +20294 +20294 +20295 +20295 +20295 +20296 +20296 +20297 +20297 +20298 +20298 +20299 +20299 +20300 +20300 +20301 +20301 +20302 +20302 +20302 +20303 +20303 +20304 +20304 +20305 +20305 +20306 +20306 +20307 +20307 +20308 +20308 +20308 +20309 +20309 +20310 +20310 +20311 +20311 +20312 +20312 +20313 +20313 +20314 +20314 +20314 +20315 +20315 +20316 +20316 +20317 +20317 +20318 +20318 +20319 +20319 +20319 +20320 +20320 +20321 +20321 +20322 +20322 +20323 +20323 +20324 +20324 +20325 +20325 +20325 +20326 +20326 +20327 +20327 +20328 +20328 +20329 +20329 +20330 +20330 +20330 +20331 +20331 +20332 +20332 +20333 +20333 +20334 +20334 +20335 +20335 +20335 +20336 +20336 +20337 +20337 +20338 +20338 +20339 +20339 +20340 +20340 +20340 +20341 +20341 +20342 +20342 +20343 +20343 +20344 +20344 +20345 +20345 +20345 +20346 +20346 +20347 +20347 +20348 +20348 +20349 +20349 +20349 +20350 +20350 +20351 +20351 +20352 +20352 +20353 +20353 +20354 +20354 +20354 +20355 +20355 +20356 +20356 +20357 +20357 +20358 +20358 +20358 +20359 +20359 +20360 +20360 +20361 +20361 +20362 +20362 +20362 +20363 +20363 +20364 +20364 +20365 +20365 +20366 +20366 +20366 +20367 +20367 +20368 +20368 +20369 +20369 +20370 +20370 +20370 +20371 +20371 +20372 +20372 +20373 +20373 +20374 +20374 +20374 +20375 +20375 +20376 +20376 +20377 +20377 +20378 +20378 +20378 +20379 +20379 +20380 +20380 +20381 +20381 +20382 +20382 +20382 +20383 +20383 +20384 +20384 +20385 +20385 +20385 +20386 +20386 +20387 +20387 +20388 +20388 +20389 +20389 +20389 +20390 +20390 +20391 +20391 +20392 +20392 +20392 +20393 +20393 +20394 +20394 +20395 +20395 +20396 +20396 +20396 +20397 +20397 +20398 +20398 +20399 +20399 +20399 +20400 +20400 +20401 +20401 +20402 +20402 +20403 +20403 +20403 +20404 +20405 +20406 +20406 +20407 +20408 +20409 +20410 +20411 +20412 +20413 +20413 +20414 +20415 +20416 +20417 +20418 +20419 +20419 +20420 +20421 +20422 +20423 +20424 +20425 +20425 +20426 +20427 +20428 +20429 +20430 +20431 +20431 +20432 +20433 +20434 +20435 +20436 +20437 +20437 +20438 +20439 +20440 +20441 +20442 +20442 +20443 +20444 +20445 +20446 +20447 +20448 +20448 +20449 +20450 +20451 +20452 +20453 +20453 +20454 +20455 +20456 +20457 +20458 +20459 +20459 +20460 +20461 +20462 +20463 +20464 +20464 +20465 +20466 +20467 +20468 +20469 +20469 +20470 +20471 +20472 +20473 +20474 +20474 +20475 +20476 +20477 +20478 +20479 +20479 +20480 +20481 +20481 +20481 +20482 +20482 +20483 +20483 +20483 +20484 +20484 +20485 +20485 +20486 +20486 +20486 +20487 +20487 +20488 +20488 +20488 +20489 +20489 +20490 +20490 +20490 +20491 +20491 +20492 +20492 +20492 +20493 +20493 +20494 +20494 +20495 +20495 +20495 +20496 +20496 +20497 +20497 +20497 +20498 +20498 +20499 +20499 +20499 +20500 +20500 +20501 +20501 +20501 +20502 +20502 +20503 +20503 +20503 +20504 +20504 +20505 +20505 +20505 +20506 +20506 +20507 +20507 +20507 +20508 +20508 +20509 +20509 +20509 +20510 +20510 +20511 +20511 +20512 +20512 +20512 +20513 +20513 +20513 +20514 +20514 +20515 +20515 +20515 +20516 +20516 +20517 +20517 +20517 +20518 +20518 +20519 +20519 +20519 +20520 +20520 +20521 +20521 +20521 +20522 +20522 +20523 +20523 +20523 +20524 +20524 +20525 +20525 +20525 +20526 +20526 +20527 +20527 +20527 +20528 +20528 +20529 +20529 +20529 +20530 +20530 +20530 +20531 +20531 +20532 +20532 +20532 +20533 +20533 +20534 +20534 +20534 +20535 +20535 +20536 +20536 +20536 +20537 +20537 +20538 +20538 +20538 +20539 +20539 +20539 +20540 +20540 +20541 +20541 +20541 +20542 +20542 +20543 +20543 +20543 +20544 +20544 +20544 +20545 +20545 +20546 +20546 +20546 +20547 +20547 +20548 +20548 +20548 +20549 +20549 +20549 +20550 +20550 +20551 +20551 +20551 +20552 +20552 +20553 +20553 +20553 +20554 +20554 +20554 +20555 +20555 +20556 +20556 +20556 +20557 +20557 +20557 +20558 +20558 +20559 +20559 +20559 +20560 +20560 +20561 +20561 +20561 +20562 +20562 +20562 +20563 +20563 +20564 +20564 +20564 +20565 +20565 +20565 +20566 +20566 +20567 +20567 +20567 +20568 +20568 +20568 +20569 +20569 +20570 +20570 +20570 +20571 +20571 +20571 +20572 +20572 +20573 +20573 +20573 +20574 +20574 +20574 +20575 +20575 +20576 +20576 +20576 +20577 +20577 +20577 +20578 +20578 +20579 +20579 +20579 +20580 +20580 +20580 +20581 +20581 +20581 +20582 +20582 +20583 +20583 +20583 +20584 +20584 +20584 +20585 +20585 +20586 +20586 +20586 +20587 +20587 +20587 +20588 +20588 +20588 +20589 +20589 +20590 +20590 +20590 +20591 +20591 +20591 +20592 +20592 +20592 +20593 +20593 +20594 +20594 +20594 +20595 +20595 +20595 +20596 +20596 +20597 +20597 +20597 +20598 +20598 +20598 +20599 +20599 +20599 +20600 +20600 +20601 +20601 +20601 +20602 +20602 +20602 +20603 +20603 +20603 +20604 +20604 +20604 +20605 +20605 +20606 +20606 +20606 +20607 +20607 +20607 +20608 +20608 +20608 +20609 +20609 +20610 +20610 +20610 +20611 +20611 +20611 +20612 +20612 +20612 +20613 +20613 +20613 +20614 +20614 +20615 +20615 +20615 +20616 +20616 +20616 +20617 +20617 +20617 +20618 +20618 +20618 +20619 +20619 +20620 +20620 +20620 +20621 +20621 +20621 +20622 +20622 +20622 +20623 +20623 +20623 +20624 +20624 +20624 +20625 +20625 +20626 +20626 +20626 +20627 +20627 +20627 +20628 +20628 +20628 +20629 +20629 +20629 +20630 +20630 +20630 +20631 +20631 +20632 +20632 +20632 +20633 +20633 +20633 +20634 +20634 +20634 +20635 +20635 +20635 +20636 +20636 +20636 +20637 +20637 +20637 +20638 +20638 +20639 +20639 +20639 +20640 +20640 +20640 +20641 +20641 +20641 +20642 +20642 +20642 +20643 +20643 +20643 +20644 +20644 +20644 +20645 +20645 +20645 +20646 +20646 +20646 +20647 +20647 +20648 +20648 +20648 +20649 +20649 +20649 +20650 +20650 +20650 +20651 +20651 +20651 +20652 +20652 +20652 +20653 +20653 +20653 +20654 +20654 +20654 +20655 +20655 +20655 +20656 +20656 +20656 +20657 +20657 +20657 +20658 +20658 +20659 +20659 +20659 +20660 +20660 +20660 +20661 +20661 +20661 +20662 +20662 +20662 +20663 +20663 +20663 +20664 +20664 +20664 +20665 +20665 +20665 +20666 +20666 +20666 +20667 +20667 +20667 +20668 +20668 +20668 +20669 +20669 +20669 +20670 +20670 +20670 +20671 +20671 +20671 +20672 +20672 +20672 +20673 +20673 +20673 +20674 +20674 +20674 +20675 +20675 +20675 +20676 +20676 +20676 +20677 +20677 +20677 +20678 +20678 +20678 +20679 +20679 +20679 +20680 +20680 +20680 +20681 +20681 +20681 +20682 +20682 +20682 +20683 +20683 +20683 +20684 +20684 +20684 +20685 +20685 +20685 +20686 +20686 +20686 +20687 +20687 +20687 +20688 +20688 +20688 +20689 +20689 +20689 +20690 +20690 +20690 +20691 +20691 +20691 +20692 +20692 +20692 +20693 +20693 +20693 +20694 +20694 +20694 +20695 +20695 +20695 +20696 +20696 +20696 +20697 +20697 +20697 +20698 +20698 +20698 +20699 +20699 +20699 +20700 +20700 +20700 +20701 +20701 +20701 +20702 +20702 +20702 +20703 +20703 +20703 +20704 +20704 +20704 +20705 +20705 +20705 +20706 +20706 +20706 +20706 +20707 +20707 +20707 +20708 +20708 +20708 +20709 +20709 +20709 +20710 +20710 +20710 +20711 +20711 +20711 +20712 +20712 +20712 +20713 +20713 +20713 +20714 +20714 +20714 +20715 +20715 +20715 +20716 +20716 +20716 +20717 +20717 +20717 +20717 +20718 +20718 +20718 +20719 +20719 +20719 +20720 +20720 +20720 +20721 +20721 +20721 +20722 +20722 +20722 +20723 +20723 +20723 +20724 +20724 +20724 +20725 +20725 +20725 +20725 +20726 +20726 +20726 +20727 +20727 +20727 +20728 +20728 +20728 +20729 +20729 +20729 +20730 +20730 +20730 +20731 +20731 +20731 +20732 +20732 +20732 +20732 +20733 +20733 +20733 +20734 +20734 +20734 +20735 +20735 +20735 +20736 +20736 +20736 +20737 +20737 +20737 +20738 +20738 +20738 +20739 +20739 +20739 +20739 +20740 +20740 +20740 +20741 +20741 +20741 +20742 +20742 +20742 +20743 +20743 +20743 +20744 +20744 +20744 +20744 +20745 +20745 +20745 +20746 +20746 +20746 +20747 +20747 +20747 +20748 +20748 +20748 +20749 +20749 +20749 +20749 +20750 +20750 +20750 +20751 +20751 +20751 +20752 +20752 +20752 +20753 +20753 +20753 +20754 +20754 +20754 +20754 +20755 +20755 +20755 +20756 +20756 +20756 +20757 +20757 +20757 +20758 +20758 +20758 +20759 +20759 +20759 +20759 +20760 +20760 +20760 +20761 +20761 +20761 +20762 +20762 +20762 +20763 +20763 +20763 +20763 +20764 +20764 +20764 +20765 +20765 +20765 +20766 +20766 +20766 +20767 +20767 +20767 +20767 +20768 +20768 +20768 +20769 +20769 +20769 +20770 +20770 +20770 +20771 +20771 +20771 +20771 +20772 +20772 +20772 +20773 +20773 +20773 +20774 +20774 +20774 +20774 +20775 +20775 +20775 +20776 +20776 +20776 +20777 +20777 +20777 +20778 +20778 +20778 +20778 +20779 +20779 +20779 +20780 +20780 +20780 +20781 +20781 +20781 +20781 +20782 +20782 +20782 +20783 +20783 +20783 +20784 +20784 +20784 +20785 +20785 +20785 +20785 +20786 +20786 +20786 +20787 +20787 +20787 +20788 +20788 +20788 +20788 +20789 +20789 +20789 +20790 +20790 +20790 +20791 +20791 +20791 +20791 +20792 +20792 +20792 +20793 +20793 +20793 +20794 +20794 +20794 +20794 +20795 +20795 +20795 +20796 +20796 +20796 +20797 +20797 +20797 +20797 +20798 +20798 +20798 +20799 +20799 +20799 +20800 +20800 +20800 +20800 +20801 +20801 +20801 +20802 +20802 +20802 +20802 +20803 +20803 +20803 +20804 +20804 +20805 +20805 +20806 +20806 +20807 +20808 +20808 +20809 +20809 +20810 +20810 +20811 +20812 +20812 +20813 +20813 +20814 +20815 +20815 +20816 +20816 +20817 +20818 +20818 +20819 +20819 +20820 +20820 +20821 +20822 +20822 +20823 +20823 +20824 +20825 +20825 +20826 +20826 +20827 +20827 +20828 +20829 +20829 +20830 +20830 +20831 +20832 +20832 +20833 +20833 +20834 +20834 +20835 +20836 +20836 +20837 +20837 +20838 +20838 +20839 +20840 +20840 +20841 +20841 +20842 +20842 +20843 +20844 +20844 +20845 +20845 +20846 +20847 +20847 +20848 +20848 +20849 +20849 +20850 +20850 +20851 +20852 +20852 +20853 +20853 +20854 +20854 +20855 +20856 +20856 +20857 +20857 +20858 +20858 +20859 +20860 +20860 +20861 +20861 +20862 +20862 +20863 +20864 +20864 +20865 +20865 +20866 +20866 +20867 +20867 +20868 +20869 +20869 +20870 +20870 +20871 +20871 +20872 +20873 +20873 +20874 +20874 +20875 +20875 +20876 +20876 +20877 +20878 +20878 +20879 +20879 +20880 +20880 +20881 +20881 +20882 +20883 +20883 +20884 +20884 +20885 +20885 +20886 +20886 +20887 +20887 +20888 +20889 +20889 +20890 +20890 +20891 +20891 +20892 +20892 +20893 +20894 +20894 +20895 +20895 +20896 +20896 +20897 +20897 +20898 +20898 +20899 +20900 +20900 +20901 +20901 +20902 +20902 +20903 +20903 +20904 +20904 +20905 +20906 +20906 +20907 +20907 +20908 +20908 +20909 +20909 +20910 +20910 +20911 +20912 +20912 +20913 +20913 +20914 +20914 +20915 +20915 +20916 +20916 +20917 +20917 +20918 +20919 +20919 +20920 +20920 +20921 +20921 +20922 +20922 +20923 +20923 +20924 +20924 +20925 +20926 +20926 +20927 +20927 +20928 +20928 +20929 +20929 +20930 +20930 +20931 +20931 +20932 +20932 +20933 +20933 +20934 +20935 +20935 +20936 +20936 +20937 +20937 +20938 +20938 +20939 +20939 +20940 +20940 +20941 +20941 +20942 +20942 +20943 +20944 +20944 +20945 +20945 +20946 +20946 +20947 +20947 +20948 +20948 +20949 +20949 +20950 +20950 +20951 +20951 +20952 +20952 +20953 +20954 +20954 +20955 +20955 +20956 +20956 +20957 +20957 +20958 +20958 +20959 +20959 +20960 +20960 +20961 +20961 +20962 +20962 +20963 +20963 +20964 +20964 +20965 +20965 +20966 +20966 +20967 +20968 +20968 +20969 +20969 +20970 +20970 +20971 +20971 +20972 +20972 +20973 +20973 +20974 +20974 +20975 +20975 +20976 +20976 +20977 +20977 +20978 +20978 +20979 +20979 +20980 +20980 +20981 +20981 +20982 +20982 +20983 +20983 +20984 +20984 +20985 +20985 +20986 +20986 +20987 +20988 +20988 +20989 +20989 +20990 +20990 +20991 +20991 +20992 +20992 +20993 +20993 +20994 +20994 +20995 +20995 +20996 +20996 +20997 +20997 +20998 +20998 +20999 +20999 +21000 +21000 +21001 +21001 +21002 +21002 +21003 +21003 +21004 +21004 +21005 +21005 +21006 +21006 +21007 +21007 +21008 +21008 +21009 +21009 +21010 +21010 +21011 +21011 +21012 +21012 +21013 +21013 +21014 +21014 +21015 +21015 +21016 +21016 +21017 +21017 +21018 +21018 +21019 +21019 +21020 +21020 +21021 +21021 +21022 +21022 +21023 +21023 +21024 +21024 +21025 +21025 +21026 +21026 +21027 +21027 +21028 +21028 +21029 +21029 +21029 +21030 +21030 +21031 +21031 +21032 +21032 +21033 +21033 +21034 +21034 +21035 +21035 +21036 +21036 +21037 +21037 +21038 +21038 +21039 +21039 +21040 +21040 +21041 +21041 +21042 +21042 +21043 +21043 +21044 +21044 +21045 +21045 +21046 +21046 +21047 +21047 +21048 +21048 +21049 +21049 +21049 +21050 +21050 +21051 +21051 +21052 +21052 +21053 +21053 +21054 +21054 +21055 +21055 +21056 +21056 +21057 +21057 +21058 +21058 +21059 +21059 +21060 +21060 +21061 +21061 +21062 +21062 +21063 +21063 +21063 +21064 +21064 +21065 +21065 +21066 +21066 +21067 +21067 +21068 +21068 +21069 +21069 +21070 +21070 +21071 +21071 +21072 +21072 +21073 +21073 +21073 +21074 +21074 +21075 +21075 +21076 +21076 +21077 +21077 +21078 +21078 +21079 +21079 +21080 +21080 +21081 +21081 +21082 +21082 +21082 +21083 +21083 +21084 +21084 +21085 +21085 +21086 +21086 +21087 +21087 +21088 +21088 +21089 +21089 +21090 +21090 +21090 +21091 +21091 +21092 +21092 +21093 +21093 +21094 +21094 +21095 +21095 +21096 +21096 +21097 +21097 +21098 +21098 +21098 +21099 +21099 +21100 +21100 +21101 +21101 +21102 +21102 +21103 +21103 +21104 +21104 +21104 +21105 +21105 +21106 +21106 +21107 +21107 +21108 +21108 +21109 +21109 +21110 +21110 +21111 +21111 +21111 +21112 +21112 +21113 +21113 +21114 +21114 +21115 +21115 +21116 +21116 +21117 +21117 +21117 +21118 +21118 +21119 +21119 +21120 +21120 +21121 +21121 +21122 +21122 +21122 +21123 +21123 +21124 +21124 +21125 +21125 +21126 +21126 +21127 +21127 +21128 +21128 +21128 +21129 +21129 +21130 +21130 +21131 +21131 +21132 +21132 +21133 +21133 +21133 +21134 +21134 +21135 +21135 +21136 +21136 +21137 +21137 +21138 +21138 +21138 +21139 +21139 +21140 +21140 +21141 +21141 +21142 +21142 +21143 +21143 +21143 +21144 +21144 +21145 +21145 +21146 +21146 +21147 +21147 +21147 +21148 +21148 +21149 +21149 +21150 +21150 +21151 +21151 +21152 +21152 +21152 +21153 +21153 +21154 +21154 +21155 +21155 +21156 +21156 +21156 +21157 +21157 +21158 +21158 +21159 +21159 +21160 +21160 +21160 +21161 +21161 +21162 +21162 +21163 +21163 +21164 +21164 +21164 +21165 +21165 +21166 +21166 +21167 +21167 +21168 +21168 +21168 +21169 +21169 +21170 +21170 +21171 +21171 +21172 +21172 +21172 +21173 +21173 +21174 +21174 +21175 +21175 +21176 +21176 +21176 +21177 +21177 +21178 +21178 +21179 +21179 +21180 +21180 +21180 +21181 +21181 +21182 +21182 +21183 +21183 +21183 +21184 +21184 +21185 +21185 +21186 +21186 +21187 +21187 +21187 +21188 +21188 +21189 +21189 +21190 +21190 +21190 +21191 +21191 +21192 +21192 +21193 +21193 +21194 +21194 +21194 +21195 +21195 +21196 +21196 +21197 +21197 +21197 +21198 +21198 +21199 +21199 +21200 +21200 +21200 +21201 +21201 +21202 +21202 +21203 +21203 +21204 +21204 +21204 +21205 +21205 +21206 +21206 +21207 +21207 +21207 +21208 +21208 +21209 +21209 +21210 +21210 +21210 +21211 +21211 +21212 +21212 +21213 +21213 +21213 +21214 +21214 +21215 +21215 +21216 +21216 +21216 +21217 +21217 +21218 +21218 +21219 +21219 +21219 +21220 +21220 +21221 +21221 +21222 +21222 +21222 +21223 +21223 +21224 +21224 +21225 +21225 +21225 +21226 +21226 +21227 +21227 +21228 +21228 +21228 +21229 +21229 +21230 +21230 +21231 +21231 +21231 +21232 +21232 +21233 +21233 +21233 +21234 +21234 +21235 +21235 +21236 +21236 +21236 +21237 +21237 +21238 +21238 +21239 +21239 +21239 +21240 +21240 +21241 +21241 +21242 +21242 +21242 +21243 +21243 +21244 +21244 +21244 +21245 +21245 +21246 +21246 +21247 +21247 +21247 +21248 +21248 +21249 +21249 +21250 +21250 +21250 +21251 +21251 +21252 +21252 +21252 +21253 +21253 +21254 +21254 +21255 +21255 +21255 +21256 +21256 +21257 +21257 +21257 +21258 +21258 +21259 +21259 +21260 +21260 +21260 +21261 +21261 +21262 +21262 +21262 +21263 +21263 +21264 +21264 +21265 +21265 +21265 +21266 +21266 +21267 +21267 +21267 +21268 +21268 +21269 +21269 +21269 +21270 +21270 +21271 +21271 +21272 +21272 +21272 +21273 +21273 +21274 +21274 +21274 +21275 +21275 +21276 +21276 +21276 +21277 +21277 +21278 +21278 +21279 +21279 +21279 +21280 +21280 +21281 +21281 +21281 +21282 +21282 +21283 +21283 +21283 +21284 +21284 +21285 +21285 +21286 +21286 +21286 +21287 +21287 +21288 +21288 +21288 +21289 +21289 +21290 +21290 +21290 +21291 +21291 +21292 +21292 +21292 +21293 +21293 +21294 +21294 +21294 +21295 +21295 +21296 +21296 +21297 +21297 +21297 +21298 +21298 +21299 +21299 +21300 +21301 +21302 +21303 +21303 +21304 +21305 +21306 +21307 +21307 +21308 +21309 +21310 +21311 +21311 +21312 +21313 +21314 +21315 +21315 +21316 +21317 +21318 +21319 +21320 +21320 +21321 +21322 +21323 +21323 +21324 +21325 +21326 +21327 +21327 +21328 +21329 +21330 +21331 +21331 +21332 +21333 +21334 +21335 +21335 +21336 +21337 +21338 +21339 +21339 +21340 +21341 +21342 +21343 +21343 +21344 +21345 +21346 +21346 +21347 +21348 +21349 +21350 +21350 +21351 +21352 +21353 +21354 +21354 +21355 +21356 +21357 +21357 +21358 +21359 +21360 +21361 +21361 +21362 +21363 +21364 +21364 +21365 +21366 +21367 +21368 +21368 +21369 +21370 +21371 +21371 +21372 +21373 +21374 +21375 +21375 +21376 +21377 +21378 +21378 +21379 +21380 +21381 +21381 +21382 +21383 +21384 +21385 +21385 +21386 +21387 +21388 +21388 +21389 +21390 +21391 +21391 +21392 +21393 +21394 +21394 +21395 +21396 +21397 +21398 +21398 +21399 +21400 +21401 +21401 +21402 +21403 +21404 +21404 +21405 +21406 +21407 +21407 +21408 +21409 +21410 +21410 +21411 +21412 +21413 +21413 +21414 +21415 +21416 +21416 +21417 +21418 +21419 +21419 +21420 +21421 +21422 +21422 +21423 +21424 +21425 +21425 +21426 +21427 +21428 +21428 +21429 +21430 +21431 +21431 +21432 +21433 +21434 +21434 +21435 +21436 +21437 +21437 +21438 +21439 +21440 +21440 +21441 +21442 +21443 +21443 +21444 +21445 +21445 +21446 +21447 +21448 +21448 +21449 +21450 +21451 +21451 +21452 +21453 +21454 +21454 +21455 +21456 +21457 +21457 +21458 +21459 +21459 +21460 +21461 +21462 +21462 +21463 +21464 +21465 +21465 +21466 +21467 +21467 +21468 +21469 +21470 +21470 +21471 +21472 +21473 +21473 +21474 +21475 +21475 +21476 +21477 +21478 +21478 +21479 +21480 +21481 +21481 +21482 +21483 +21483 +21484 +21485 +21486 +21486 +21487 +21488 +21488 +21489 +21490 +21491 +21491 +21492 +21493 +21494 +21494 +21495 +21496 +21496 +21497 +21498 +21499 +21499 +21500 +21501 +21501 +21502 +21503 +21504 +21504 +21504 +21505 +21505 +21506 +21506 +21506 +21507 +21507 +21507 +21508 +21508 +21508 +21509 +21509 +21509 +21510 +21510 +21511 +21511 +21511 +21512 +21512 +21512 +21513 +21513 +21513 +21514 +21514 +21514 +21515 +21515 +21515 +21516 +21516 +21517 +21517 +21517 +21518 +21518 +21518 +21519 +21519 +21519 +21520 +21520 +21520 +21521 +21521 +21521 +21522 +21522 +21522 +21523 +21523 +21524 +21524 +21524 +21525 +21525 +21525 +21526 +21526 +21526 +21527 +21527 +21527 +21528 +21528 +21528 +21529 +21529 +21529 +21530 +21530 +21530 +21531 +21531 +21531 +21532 +21532 +21533 +21533 +21533 +21534 +21534 +21534 +21535 +21535 +21535 +21536 +21536 +21536 +21537 +21537 +21537 +21538 +21538 +21538 +21539 +21539 +21539 +21540 +21540 +21540 +21541 +21541 +21541 +21542 +21542 +21542 +21543 +21543 +21543 +21544 +21544 +21544 +21545 +21545 +21546 +21546 +21546 +21547 +21547 +21547 +21548 +21548 +21548 +21549 +21549 +21549 +21550 +21550 +21550 +21551 +21551 +21551 +21552 +21552 +21552 +21553 +21553 +21553 +21554 +21554 +21554 +21555 +21555 +21555 +21556 +21556 +21556 +21557 +21557 +21557 +21558 +21558 +21558 +21559 +21559 +21559 +21560 +21560 +21560 +21561 +21561 +21561 +21562 +21562 +21562 +21563 +21563 +21563 +21564 +21564 +21564 +21565 +21565 +21565 +21566 +21566 +21566 +21567 +21567 +21567 +21568 +21568 +21568 +21569 +21569 +21569 +21570 +21570 +21570 +21571 +21571 +21571 +21572 +21572 +21572 +21573 +21573 +21573 +21574 +21574 +21574 +21575 +21575 +21575 +21576 +21576 +21576 +21577 +21577 +21577 +21578 +21578 +21578 +21579 +21579 +21579 +21579 +21580 +21580 +21580 +21581 +21581 +21581 +21582 +21582 +21582 +21583 +21583 +21583 +21584 +21584 +21584 +21585 +21585 +21585 +21586 +21586 +21586 +21587 +21587 +21587 +21588 +21588 +21588 +21589 +21589 +21589 +21590 +21590 +21590 +21591 +21591 +21591 +21592 +21592 +21592 +21592 +21593 +21593 +21593 +21594 +21594 +21594 +21595 +21595 +21595 +21596 +21596 +21596 +21597 +21597 +21597 +21598 +21598 +21598 +21599 +21599 +21599 +21600 +21600 +21600 +21600 +21601 +21601 +21601 +21602 +21602 +21602 +21603 +21603 +21603 +21604 +21604 +21604 +21605 +21605 +21605 +21606 +21606 +21606 +21607 +21607 +21607 +21607 +21608 +21608 +21608 +21609 +21609 +21609 +21610 +21610 +21610 +21611 +21611 +21611 +21612 +21612 +21612 +21613 +21613 +21613 +21613 +21614 +21614 +21614 +21615 +21615 +21615 +21616 +21616 +21616 +21617 +21617 +21617 +21618 +21618 +21618 +21619 +21619 +21619 +21619 +21620 +21620 +21620 +21621 +21621 +21621 +21622 +21622 +21622 +21623 +21623 +21623 +21624 +21624 +21624 +21624 +21625 +21625 +21625 +21626 +21626 +21626 +21627 +21627 +21627 +21628 +21628 +21628 +21628 +21629 +21629 +21629 +21630 +21630 +21630 +21631 +21631 +21631 +21632 +21632 +21632 +21633 +21633 +21633 +21633 +21634 +21634 +21634 +21635 +21635 +21635 +21636 +21636 +21636 +21637 +21637 +21637 +21637 +21638 +21638 +21638 +21639 +21639 +21639 +21640 +21640 +21640 +21641 +21641 +21641 +21641 +21642 +21642 +21642 +21643 +21643 +21643 +21644 +21644 +21644 +21644 +21645 +21645 +21645 +21646 +21646 +21646 +21647 +21647 +21647 +21648 +21648 +21648 +21648 +21649 +21649 +21649 +21650 +21650 +21650 +21651 +21651 +21651 +21651 +21652 +21652 +21652 +21653 +21653 +21653 +21654 +21654 +21654 +21654 +21655 +21655 +21655 +21656 +21656 +21656 +21657 +21657 +21657 +21657 +21658 +21658 +21658 +21659 +21659 +21659 +21660 +21660 +21660 +21660 +21661 +21661 +21661 +21662 +21662 +21662 +21663 +21663 +21663 +21663 +21664 +21664 +21664 +21665 +21665 +21665 +21666 +21666 +21666 +21666 +21667 +21667 +21667 +21668 +21668 +21668 +21669 +21669 +21669 +21669 +21670 +21670 +21670 +21671 +21671 +21671 +21672 +21672 +21672 +21672 +21673 +21673 +21673 +21674 +21674 +21674 +21674 +21675 +21675 +21675 +21676 +21676 +21676 +21677 +21677 +21677 +21677 +21678 +21678 +21678 +21679 +21679 +21679 +21679 +21680 +21680 +21680 +21681 +21681 +21681 +21682 +21682 +21682 +21682 +21683 +21683 +21683 +21684 +21684 +21684 +21684 +21685 +21685 +21685 +21686 +21686 +21686 +21687 +21687 +21687 +21687 +21688 +21688 +21688 +21689 +21689 +21689 +21689 +21690 +21690 +21690 +21691 +21691 +21691 +21691 +21692 +21692 +21692 +21693 +21693 +21693 +21693 +21694 +21694 +21694 +21695 +21695 +21695 +21696 +21696 +21696 +21696 +21697 +21697 +21697 +21698 +21698 +21698 +21698 +21699 +21699 +21699 +21700 +21700 +21700 +21700 +21701 +21701 +21701 +21702 +21702 +21702 +21702 +21703 +21703 +21703 +21704 +21704 +21704 +21704 +21705 +21705 +21705 +21706 +21706 +21706 +21706 +21707 +21707 +21707 +21708 +21708 +21708 +21708 +21709 +21709 +21709 +21710 +21710 +21710 +21710 +21711 +21711 +21711 +21712 +21712 +21712 +21712 +21713 +21713 +21713 +21714 +21714 +21714 +21714 +21715 +21715 +21715 +21716 +21716 +21716 +21716 +21717 +21717 +21717 +21718 +21718 +21718 +21718 +21719 +21719 +21719 +21720 +21720 +21720 +21720 +21721 +21721 +21721 +21721 +21722 +21722 +21722 +21723 +21723 +21723 +21723 +21724 +21724 +21724 +21725 +21725 +21725 +21725 +21726 +21726 +21726 +21727 +21727 +21727 +21727 +21728 +21728 +21728 +21729 +21729 +21729 +21729 +21730 +21730 +21730 +21730 +21731 +21731 +21731 +21732 +21732 +21732 +21732 +21733 +21733 +21733 +21734 +21734 +21734 +21734 +21735 +21735 +21735 +21735 +21736 +21736 +21736 +21737 +21737 +21737 +21737 +21738 +21738 +21738 +21739 +21739 +21739 +21740 +21740 +21741 +21741 +21742 +21742 +21743 +21744 +21744 +21745 +21745 +21746 +21746 +21747 +21747 +21748 +21748 +21749 +21750 +21750 +21751 +21751 +21752 +21752 +21753 +21753 +21754 +21754 +21755 +21756 +21756 +21757 +21757 +21758 +21758 +21759 +21759 +21760 +21760 +21761 +21762 +21762 +21763 +21763 +21764 +21764 +21765 +21765 +21766 +21766 +21767 +21768 +21768 +21769 +21769 +21770 +21770 +21771 +21771 +21772 +21772 +21773 +21773 +21774 +21774 +21775 +21776 +21776 +21777 +21777 +21778 +21778 +21779 +21779 +21780 +21780 +21781 +21781 +21782 +21782 +21783 +21784 +21784 +21785 +21785 +21786 +21786 +21787 +21787 +21788 +21788 +21789 +21789 +21790 +21790 +21791 +21791 +21792 +21793 +21793 +21794 +21794 +21795 +21795 +21796 +21796 +21797 +21797 +21798 +21798 +21799 +21799 +21800 +21800 +21801 +21801 +21802 +21803 +21803 +21804 +21804 +21805 +21805 +21806 +21806 +21807 +21807 +21808 +21808 +21809 +21809 +21810 +21810 +21811 +21811 +21812 +21812 +21813 +21813 +21814 +21814 +21815 +21815 +21816 +21817 +21817 +21818 +21818 +21819 +21819 +21820 +21820 +21821 +21821 +21822 +21822 +21823 +21823 +21824 +21824 +21825 +21825 +21826 +21826 +21827 +21827 +21828 +21828 +21829 +21829 +21830 +21830 +21831 +21831 +21832 +21832 +21833 +21833 +21834 +21834 +21835 +21835 +21836 +21836 +21837 +21837 +21838 +21838 +21839 +21839 +21840 +21840 +21841 +21841 +21842 +21842 +21843 +21843 +21844 +21844 +21845 +21845 +21846 +21846 +21847 +21847 +21848 +21848 +21849 +21849 +21850 +21850 +21851 +21851 +21852 +21852 +21853 +21853 +21854 +21854 +21855 +21855 +21856 +21856 +21857 +21857 +21858 +21858 +21859 +21859 +21860 +21860 +21861 +21861 +21862 +21862 +21863 +21863 +21864 +21864 +21865 +21865 +21866 +21866 +21867 +21867 +21868 +21868 +21869 +21869 +21870 +21870 +21871 +21871 +21872 +21872 +21873 +21873 +21874 +21874 +21875 +21875 +21876 +21876 +21877 +21877 +21878 +21878 +21879 +21879 +21880 +21880 +21881 +21881 +21882 +21882 +21883 +21883 +21883 +21884 +21884 +21885 +21885 +21886 +21886 +21887 +21887 +21888 +21888 +21889 +21889 +21890 +21890 +21891 +21891 +21892 +21892 +21893 +21893 +21894 +21894 +21895 +21895 +21896 +21896 +21897 +21897 +21897 +21898 +21898 +21899 +21899 +21900 +21900 +21901 +21901 +21902 +21902 +21903 +21903 +21904 +21904 +21905 +21905 +21906 +21906 +21907 +21907 +21907 +21908 +21908 +21909 +21909 +21910 +21910 +21911 +21911 +21912 +21912 +21913 +21913 +21914 +21914 +21915 +21915 +21916 +21916 +21916 +21917 +21917 +21918 +21918 +21919 +21919 +21920 +21920 +21921 +21921 +21922 +21922 +21923 +21923 +21924 +21924 +21924 +21925 +21925 +21926 +21926 +21927 +21927 +21928 +21928 +21929 +21929 +21930 +21930 +21931 +21931 +21931 +21932 +21932 +21933 +21933 +21934 +21934 +21935 +21935 +21936 +21936 +21937 +21937 +21938 +21938 +21938 +21939 +21939 +21940 +21940 +21941 +21941 +21942 +21942 +21943 +21943 +21944 +21944 +21944 +21945 +21945 +21946 +21946 +21947 +21947 +21948 +21948 +21949 +21949 +21950 +21950 +21950 +21951 +21951 +21952 +21952 +21953 +21953 +21954 +21954 +21955 +21955 +21955 +21956 +21956 +21957 +21957 +21958 +21958 +21959 +21959 +21960 +21960 +21960 +21961 +21961 +21962 +21962 +21963 +21963 +21964 +21964 +21965 +21965 +21965 +21966 +21966 +21967 +21967 +21968 +21968 +21969 +21969 +21970 +21970 +21970 +21971 +21971 +21972 +21972 +21973 +21973 +21974 +21974 +21974 +21975 +21975 +21976 +21976 +21977 +21977 +21978 +21978 +21979 +21979 +21979 +21980 +21980 +21981 +21981 +21982 +21982 +21983 +21983 +21983 +21984 +21984 +21985 +21985 +21986 +21986 +21987 +21987 +21987 +21988 +21988 +21989 +21989 +21990 +21990 +21991 +21991 +21991 +21992 +21992 +21993 +21993 +21994 +21994 +21995 +21995 +21995 +21996 +21996 +21997 +21997 +21998 +21998 +21999 +21999 +21999 +22000 +22000 +22001 +22001 +22002 +22002 +22002 +22003 +22003 +22004 +22004 +22005 +22005 +22006 +22006 +22006 +22007 +22007 +22008 +22008 +22009 +22009 +22009 +22010 +22010 +22011 +22011 +22012 +22012 +22013 +22013 +22013 +22014 +22014 +22015 +22015 +22016 +22016 +22016 +22017 +22017 +22018 +22018 +22019 +22019 +22019 +22020 +22020 +22021 +22021 +22022 +22022 +22023 +22023 +22023 +22024 +22024 +22025 +22025 +22026 +22026 +22026 +22027 +22027 +22028 +22028 +22029 +22029 +22029 +22030 +22030 +22031 +22031 +22032 +22032 +22032 +22033 +22033 +22034 +22034 +22035 +22035 +22035 +22036 +22036 +22037 +22037 +22038 +22038 +22038 +22039 +22039 +22040 +22040 +22041 +22041 +22041 +22042 +22042 +22043 +22043 +22044 +22044 +22044 +22045 +22045 +22046 +22046 +22047 +22047 +22047 +22048 +22048 +22049 +22049 +22049 +22050 +22050 +22051 +22051 +22052 +22052 +22052 +22053 +22053 +22054 +22054 +22055 +22055 +22055 +22056 +22056 +22057 +22057 +22057 +22058 +22058 +22059 +22059 +22060 +22060 +22060 +22061 +22061 +22062 +22062 +22063 +22063 +22063 +22064 +22064 +22065 +22065 +22065 +22066 +22066 +22067 +22067 +22068 +22068 +22068 +22069 +22069 +22070 +22070 +22070 +22071 +22071 +22072 +22072 +22073 +22073 +22073 +22074 +22074 +22075 +22075 +22075 +22076 +22076 +22077 +22077 +22078 +22078 +22078 +22079 +22079 +22080 +22080 +22080 +22081 +22081 +22082 +22082 +22082 +22083 +22083 +22084 +22084 +22085 +22085 +22085 +22086 +22086 +22087 +22087 +22087 +22088 +22088 +22089 +22089 +22089 +22090 +22090 +22091 +22091 +22092 +22092 +22092 +22093 +22093 +22094 +22094 +22094 +22095 +22095 +22096 +22096 +22096 +22097 +22097 +22098 +22098 +22098 +22099 +22099 +22100 +22100 +22101 +22101 +22101 +22102 +22102 +22103 +22103 +22103 +22104 +22104 +22105 +22105 +22105 +22106 +22106 +22107 +22107 +22107 +22108 +22108 +22109 +22109 +22109 +22110 +22110 +22111 +22111 +22111 +22112 +22112 +22113 +22113 +22113 +22114 +22114 +22115 +22115 +22116 +22116 +22116 +22117 +22117 +22118 +22118 +22118 +22119 +22119 +22120 +22120 +22120 +22121 +22121 +22122 +22122 +22122 +22123 +22123 +22124 +22124 +22124 +22125 +22125 +22126 +22126 +22126 +22127 +22127 +22128 +22128 +22128 +22129 +22129 +22130 +22130 +22130 +22131 +22131 +22132 +22132 +22132 +22133 +22133 +22134 +22134 +22134 +22135 +22135 +22135 +22136 +22136 +22137 +22137 +22137 +22138 +22138 +22139 +22139 +22139 +22140 +22140 +22141 +22141 +22141 +22142 +22142 +22143 +22143 +22143 +22144 +22144 +22145 +22145 +22145 +22146 +22146 +22147 +22147 +22147 +22148 +22148 +22149 +22149 +22149 +22150 +22150 +22150 +22151 +22151 +22152 +22152 +22152 +22153 +22153 +22154 +22154 +22154 +22155 +22155 +22156 +22156 +22156 +22157 +22157 +22158 +22158 +22158 +22159 +22159 +22159 +22160 +22160 +22161 +22161 +22161 +22162 +22162 +22163 +22163 +22163 +22164 +22164 +22165 +22165 +22165 +22166 +22166 +22166 +22167 +22167 +22168 +22168 +22168 +22169 +22169 +22170 +22170 +22170 +22171 +22171 +22171 +22172 +22172 +22173 +22173 +22173 +22174 +22174 +22175 +22175 +22175 +22176 +22176 +22177 +22177 +22177 +22178 +22178 +22178 +22179 +22179 +22180 +22180 +22180 +22181 +22181 +22182 +22182 +22182 +22183 +22183 +22183 +22184 +22184 +22185 +22185 +22185 +22186 +22186 +22186 +22187 +22187 +22188 +22188 +22188 +22189 +22189 +22190 +22190 +22190 +22191 +22191 +22191 +22192 +22192 +22193 +22193 +22193 +22194 +22194 +22194 +22195 +22195 +22196 +22196 +22196 +22197 +22197 +22198 +22198 +22198 +22199 +22199 +22199 +22200 +22200 +22201 +22201 +22202 +22203 +22204 +22204 +22205 +22206 +22207 +22207 +22208 +22209 +22210 +22210 +22211 +22212 +22213 +22213 +22214 +22215 +22216 +22216 +22217 +22218 +22219 +22219 +22220 +22221 +22222 +22222 +22223 +22224 +22225 +22225 +22226 +22227 +22228 +22228 +22229 +22230 +22231 +22231 +22232 +22233 +22233 +22234 +22235 +22236 +22236 +22237 +22238 +22239 +22239 +22240 +22241 +22242 +22242 +22243 +22244 +22245 +22245 +22246 +22247 +22247 +22248 +22249 +22250 +22250 +22251 +22252 +22253 +22253 +22254 +22255 +22255 +22256 +22257 +22258 +22258 +22259 +22260 +22261 +22261 +22262 +22263 +22263 +22264 +22265 +22266 +22266 +22267 +22268 +22269 +22269 +22270 +22271 +22271 +22272 +22273 +22274 +22274 +22275 +22276 +22276 +22277 +22278 +22279 +22279 +22280 +22281 +22281 +22282 +22283 +22284 +22284 +22285 +22286 +22286 +22287 +22288 +22289 +22289 +22290 +22291 +22291 +22292 +22293 +22294 +22294 +22295 +22296 +22296 +22297 +22298 +22299 +22299 +22300 +22301 +22301 +22302 +22303 +22303 +22304 +22305 +22306 +22306 +22307 +22308 +22308 +22309 +22310 +22311 +22311 +22312 +22313 +22313 +22314 +22315 +22315 +22316 +22317 +22318 +22318 +22319 +22320 +22320 +22321 +22322 +22322 +22323 +22324 +22324 +22325 +22326 +22327 +22327 +22328 +22329 +22329 +22330 +22331 +22331 +22332 +22333 +22334 +22334 +22335 +22336 +22336 +22337 +22338 +22338 +22339 +22340 +22340 +22341 +22342 +22342 +22343 +22344 +22345 +22345 +22346 +22347 +22347 +22348 +22349 +22349 +22350 +22351 +22351 +22352 +22353 +22353 +22354 +22355 +22355 +22356 +22357 +22357 +22358 +22359 +22360 +22360 +22361 +22362 +22362 +22363 +22364 +22364 +22365 +22366 +22366 +22367 +22368 +22368 +22369 +22370 +22370 +22371 +22372 +22372 +22373 +22374 +22374 +22375 +22376 +22376 +22377 +22378 +22378 +22379 +22380 +22380 +22381 +22382 +22382 +22383 +22384 +22384 +22385 +22386 +22386 +22387 +22388 +22388 +22389 +22390 +22390 +22391 +22392 +22392 +22393 +22394 +22394 +22395 +22396 +22396 +22397 +22398 +22398 +22399 +22400 +22400 +22401 +22402 +22402 +22403 +22404 +22404 +22405 +22406 +22406 +22407 +22408 +22408 +22409 +22410 +22410 +22411 +22412 +22412 +22413 +22414 +22414 +22415 +22416 +22416 +22417 +22418 +22418 +22419 +22420 +22420 +22421 +22421 +22422 +22423 +22423 +22424 +22425 +22425 +22426 +22427 +22427 +22428 +22429 +22429 +22430 +22431 +22431 +22432 +22433 +22433 +22434 +22434 +22435 +22436 +22436 +22437 +22438 +22438 +22439 +22440 +22440 +22441 +22442 +22442 +22443 +22444 +22444 +22445 +22445 +22446 +22447 +22447 +22448 +22449 +22449 +22450 +22451 +22451 +22452 +22453 +22453 +22454 +22454 +22455 +22456 +22456 +22457 +22458 +22458 +22459 +22460 +22460 +22461 +22461 +22462 +22463 +22463 +22464 +22465 +22465 +22466 +22467 +22467 +22468 +22468 +22469 +22470 +22470 +22471 +22472 +22472 +22473 +22474 +22474 +22475 +22475 +22476 +22477 +22477 +22478 +22479 +22479 +22480 +22480 +22481 +22482 +22482 +22483 +22484 +22484 +22485 +22485 +22486 +22487 +22487 +22488 +22489 +22489 +22490 +22490 +22491 +22492 +22492 +22493 +22494 +22494 +22495 +22495 +22496 +22497 +22497 +22498 +22499 +22499 +22500 +22500 +22501 +22502 +22502 +22503 +22504 +22504 +22505 +22505 +22506 +22507 +22507 +22508 +22509 +22509 +22510 +22510 +22511 +22512 +22512 +22513 +22513 +22514 +22515 +22515 +22516 +22517 +22517 +22518 +22518 +22519 +22520 +22520 +22521 +22521 +22522 +22523 +22523 +22524 +22525 +22525 +22526 +22526 +22527 +22528 +22528 +22528 +22529 +22529 +22529 +22530 +22530 +22530 +22531 +22531 +22531 +22531 +22532 +22532 +22532 +22533 +22533 +22533 +22534 +22534 +22534 +22535 +22535 +22535 +22535 +22536 +22536 +22536 +22537 +22537 +22537 +22538 +22538 +22538 +22538 +22539 +22539 +22539 +22540 +22540 +22540 +22541 +22541 +22541 +22541 +22542 +22542 +22542 +22543 +22543 +22543 +22544 +22544 +22544 +22544 +22545 +22545 +22545 +22546 +22546 +22546 +22547 +22547 +22547 +22547 +22548 +22548 +22548 +22549 +22549 +22549 +22550 +22550 +22550 +22550 +22551 +22551 +22551 +22552 +22552 +22552 +22553 +22553 +22553 +22553 +22554 +22554 +22554 +22555 +22555 +22555 +22555 +22556 +22556 +22556 +22557 +22557 +22557 +22558 +22558 +22558 +22558 +22559 +22559 +22559 +22560 +22560 +22560 +22561 +22561 +22561 +22561 +22562 +22562 +22562 +22563 +22563 +22563 +22563 +22564 +22564 +22564 +22565 +22565 +22565 +22566 +22566 +22566 +22566 +22567 +22567 +22567 +22568 +22568 +22568 +22568 +22569 +22569 +22569 +22570 +22570 +22570 +22570 +22571 +22571 +22571 +22572 +22572 +22572 +22573 +22573 +22573 +22573 +22574 +22574 +22574 +22575 +22575 +22575 +22575 +22576 +22576 +22576 +22577 +22577 +22577 +22577 +22578 +22578 +22578 +22579 +22579 +22579 +22579 +22580 +22580 +22580 +22581 +22581 +22581 +22581 +22582 +22582 +22582 +22583 +22583 +22583 +22583 +22584 +22584 +22584 +22585 +22585 +22585 +22585 +22586 +22586 +22586 +22587 +22587 +22587 +22587 +22588 +22588 +22588 +22589 +22589 +22589 +22589 +22590 +22590 +22590 +22591 +22591 +22591 +22591 +22592 +22592 +22592 +22593 +22593 +22593 +22593 +22594 +22594 +22594 +22595 +22595 +22595 +22595 +22596 +22596 +22596 +22597 +22597 +22597 +22597 +22598 +22598 +22598 +22599 +22599 +22599 +22599 +22600 +22600 +22600 +22601 +22601 +22601 +22601 +22602 +22602 +22602 +22602 +22603 +22603 +22603 +22604 +22604 +22604 +22604 +22605 +22605 +22605 +22606 +22606 +22606 +22606 +22607 +22607 +22607 +22608 +22608 +22608 +22608 +22609 +22609 +22609 +22609 +22610 +22610 +22610 +22611 +22611 +22611 +22611 +22612 +22612 +22612 +22613 +22613 +22613 +22613 +22614 +22614 +22614 +22614 +22615 +22615 +22615 +22616 +22616 +22616 +22616 +22617 +22617 +22617 +22618 +22618 +22618 +22618 +22619 +22619 +22619 +22619 +22620 +22620 +22620 +22621 +22621 +22621 +22621 +22622 +22622 +22622 +22622 +22623 +22623 +22623 +22624 +22624 +22624 +22624 +22625 +22625 +22625 +22625 +22626 +22626 +22626 +22627 +22627 +22627 +22627 +22628 +22628 +22628 +22628 +22629 +22629 +22629 +22630 +22630 +22630 +22630 +22631 +22631 +22631 +22631 +22632 +22632 +22632 +22633 +22633 +22633 +22633 +22634 +22634 +22634 +22634 +22635 +22635 +22635 +22636 +22636 +22636 +22636 +22637 +22637 +22637 +22637 +22638 +22638 +22638 +22639 +22639 +22639 +22639 +22640 +22640 +22640 +22640 +22641 +22641 +22641 +22642 +22642 +22642 +22642 +22643 +22643 +22643 +22643 +22644 +22644 +22644 +22644 +22645 +22645 +22645 +22646 +22646 +22646 +22646 +22647 +22647 +22647 +22647 +22648 +22648 +22648 +22648 +22649 +22649 +22649 +22650 +22650 +22650 +22650 +22651 +22651 +22651 +22651 +22652 +22652 +22652 +22652 +22653 +22653 +22653 +22654 +22654 +22654 +22654 +22655 +22655 +22655 +22655 +22656 +22656 +22656 +22656 +22657 +22657 +22657 +22658 +22658 +22658 +22658 +22659 +22659 +22659 +22659 +22660 +22660 +22660 +22660 +22661 +22661 +22661 +22661 +22662 +22662 +22662 +22663 +22663 +22663 +22663 +22664 +22664 +22664 +22664 +22665 +22665 +22665 +22665 +22666 +22666 +22666 +22666 +22667 +22667 +22667 +22668 +22668 +22668 +22668 +22669 +22669 +22669 +22669 +22670 +22670 +22670 +22670 +22671 +22671 +22671 +22671 +22672 +22672 +22672 +22672 +22673 +22673 +22673 +22674 +22674 +22674 +22674 +22675 +22675 +22675 +22675 +22676 +22676 +22676 +22676 +22677 +22677 +22677 +22677 +22678 +22678 +22678 +22678 +22679 +22679 +22679 +22679 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44656 +44659 +44661 +44664 +44665 +44667 +44668 +44670 +44671 +44672 +44673 +44675 +44676 +44677 +44677 +44678 +44679 +44680 +44681 +44682 +44683 +44683 +44684 +44685 +44686 +44686 +44687 +44688 +44688 +44689 +44689 +44690 +44691 +44691 +44692 +44692 +44693 +44694 +44694 +44695 +44695 +44696 +44696 +44697 +44697 +44698 +44698 +44699 +44699 +44700 +44700 +44701 +44701 +44702 +44702 +44703 +44703 +44704 +44704 +44704 +44705 +44705 +44706 +44706 +44707 +44707 +44707 +44708 +44708 +44709 +44709 +44709 +44710 +44710 +44711 +44711 +44711 +44712 +44712 +44712 +44713 +44713 +44714 +44714 +44714 +44715 +44715 +44715 +44716 +44716 +44716 +44717 +44717 +44717 +44718 +44718 +44718 +44719 +44719 +44719 +44720 +44720 +44720 +44721 +44721 +44721 +44722 +44722 +44722 +44723 +44723 +44723 +44724 +44724 +44724 +44724 +44725 +44725 +44725 +44726 +44726 +44726 +44727 +44727 +44727 +44727 +44728 +44728 +44728 +44729 +44729 +44729 +44729 +44730 +44730 +44730 +44731 +44731 +44731 +44731 +44732 +44732 +44732 +44732 +44733 +44733 +44733 +44733 +44734 +44734 +44734 +44735 +44735 +44735 +44735 +44736 +44736 +44736 +44736 +44737 +44737 +44737 +44737 +44738 +44738 +44738 +44738 +44739 +44739 +44739 +44739 +44740 +44740 +44740 +44740 +44741 +44741 +44741 +44741 +44741 +44742 +44742 +44742 +44742 +44743 +44743 +44743 +44743 +44744 +44744 +44744 +44744 +44745 +44745 +44745 +44745 +44745 +44746 +44746 +44746 +44746 +44747 +44747 +44747 +44747 +44747 +44748 +44748 +44748 +44748 +44749 +44749 +44749 +44749 +44749 +44750 +44750 +44750 +44750 +44750 +44751 +44751 +44751 +44751 +44752 +44752 +44752 +44752 +44752 +44753 +44753 +44753 +44753 +44753 +44754 +44754 +44754 +44754 +44754 +44755 +44755 +44755 +44755 +44755 +44756 +44756 +44756 +44756 +44756 +44757 +44757 +44757 +44757 +44757 +44758 +44758 +44758 +44758 +44758 +44759 +44759 +44759 +44759 +44759 +44760 +44760 +44760 +44760 +44760 +44761 +44761 +44761 +44761 +44761 +44761 +44762 +44762 +44762 +44762 +44762 +44763 +44763 +44763 +44763 +44763 +44764 +44764 +44764 +44764 +44764 +44764 +44765 +44765 +44765 +44765 +44765 +44766 +44766 +44766 +44766 +44766 +44766 +44767 +44767 +44767 +44767 +44767 +44768 +44768 +44768 +44768 +44768 +44768 +44769 +44769 +44769 +44769 +44769 +44769 +44770 +44770 +44770 +44770 +44770 +44770 +44771 +44771 +44771 +44771 +44771 +44771 +44772 +44772 +44772 +44772 +44772 +44773 +44773 +44773 +44773 +44773 +44773 +44774 +44774 +44774 +44774 +44774 +44774 +44775 +44775 +44775 +44775 +44775 +44775 +44775 +44776 +44776 +44776 +44776 +44776 +44776 +44777 +44777 +44777 +44777 +44777 +44777 +44778 +44778 +44778 +44778 +44778 +44778 +44779 +44779 +44779 +44779 +44779 +44779 +44780 +44780 +44780 +44780 +44780 +44780 +44780 +44781 +44781 +44781 +44781 +44781 +44781 +44782 +44782 +44782 +44782 +44782 +44782 +44782 +44783 +44783 +44783 +44783 +44783 +44783 +44784 +44784 +44784 +44784 +44784 +44784 +44784 +44785 +44785 +44785 +44785 +44785 +44785 +44785 +44786 +44786 +44786 +44786 +44786 +44786 +44787 +44787 +44787 +44787 +44787 +44787 +44787 +44788 +44788 +44788 +44788 +44788 +44788 +44788 +44789 +44789 +44789 +44789 +44789 +44789 +44789 +44790 +44790 +44790 +44790 +44790 +44790 +44790 +44791 +44791 +44791 +44791 +44791 +44791 +44791 +44792 +44792 +44792 +44792 +44792 +44792 +44792 +44793 +44793 +44793 +44793 +44793 +44793 +44793 +44794 +44794 +44794 +44794 +44794 +44794 +44794 +44795 +44795 +44795 +44795 +44795 +44795 +44795 +44796 +44796 +44796 +44796 +44796 +44796 +44796 +44796 +44797 +44797 +44797 +44797 +44797 +44797 +44797 +44798 +44798 +44798 +44798 +44798 +44798 +44798 +44798 +44799 +44799 +44799 +44799 +44799 +44799 +44799 +44800 +44800 +44800 +44800 +44800 +44800 +44800 +44800 +44801 +44801 +44801 +44801 +44801 +44801 +44801 +44802 +44802 +44802 +44802 +44802 +44802 +44802 +44802 +44803 +44803 +44803 +44803 +44803 +44803 +44803 +44803 +44804 +44804 +44804 +44804 +44804 +44804 +44804 +44804 +44805 +44805 +44805 +44805 +44805 +44805 +44805 +44806 +44806 +44806 +44806 +44806 +44806 +44806 +44806 +44807 +44807 +44807 +44807 +44807 +44807 +44807 +44807 +44808 +44808 +44808 +44808 +44808 +44808 +44808 +44808 +44809 +44809 +44809 +44809 +44809 +44809 +44809 +44809 +44810 +44810 +44810 +44810 +44810 +44810 +44810 +44810 +44810 +44811 +44811 +44811 +44811 +44811 +44811 +44811 +44811 +44812 +44812 +44812 +44812 +44812 +44812 +44812 +44812 +44813 +44813 +44813 +44813 +44813 +44813 +44813 +44813 +44814 +44814 +44814 +44814 +44814 +44814 +44814 +44814 +44814 +44815 +44815 +44815 +44815 +44815 +44815 +44815 +44815 +44816 +44816 +44816 +44816 +44816 +44816 +44816 +44816 +44816 +44817 +44817 +44817 +44817 +44817 +44817 +44817 +44817 +44818 +44818 +44818 +44818 +44818 +44818 +44818 +44818 +44818 +44819 +44819 +44819 +44819 +44819 +44819 +44819 +44819 +44819 +44820 +44820 +44820 +44820 +44820 +44820 +44820 +44820 +44820 +44821 +44821 +44821 +44821 +44821 +44821 +44821 +44821 +44822 +44822 +44822 +44822 +44822 +44822 +44822 +44822 +44822 +44823 +44823 +44823 +44823 +44823 +44823 +44823 +44823 +44823 +44824 +44824 +44824 +44824 +44824 +44824 +44824 +44824 +44824 +44825 +44825 +44825 +44825 +44825 +44825 +44825 +44825 +44825 +44826 +44826 +44826 +44826 +44826 +44826 +44826 +44826 +44826 +44826 +44827 +44827 +44827 +44827 +44827 +44827 +44827 +44827 +44827 +44828 +44828 +44828 +44828 +44828 +44828 +44828 +44828 +44828 +44829 +44829 +44829 +44829 +44829 +44829 +44829 +44829 +44829 +44830 +44830 +44830 +44830 +44830 +44830 +44830 +44830 +44830 +44830 +44831 +44831 +44831 +44831 +44831 +44831 +44831 +44831 +44831 +44832 +44832 +44832 +44832 +44832 +44832 +44832 +44832 +44832 +44832 +44833 +44833 +44833 +44833 +44833 +44833 +44833 +44833 +44833 +44834 +44834 +44834 +44834 +44834 +44834 +44834 +44834 +44834 +44834 +44835 +44835 +44835 +44835 +44835 +44835 +44835 +44835 +44835 +44835 +44836 +44836 +44836 +44836 +44836 +44836 +44836 +44836 +44836 +44837 +44837 +44837 +44837 +44837 +44837 +44837 +44837 +44837 +44837 +44838 +44838 +44838 +44838 +44838 +44838 +44838 +44838 +44838 +44838 +44839 +44839 +44839 +44839 +44839 +44839 +44839 +44839 +44839 +44839 +44840 +44840 +44840 +44840 +44840 +44840 +44840 +44840 +44840 +44840 +44841 +44841 +44841 +44841 +44841 +44841 +44841 +44841 +44841 +44841 +44842 +44842 +44842 +44842 +44842 +44842 +44842 +44842 +44842 +44842 +44843 +44843 +44843 +44843 +44843 +44843 +44843 +44843 +44843 +44843 +44843 +44844 +44844 +44844 +44844 +44844 +44844 +44844 +44844 +44844 +44844 +44845 +44845 +44845 +44845 +44845 +44845 +44845 +44845 +44845 +44845 +44846 +44846 +44846 +44846 +44846 +44846 +44846 +44846 +44846 +44846 +44846 +44847 +44847 +44847 +44847 +44847 +44847 +44847 +44847 +44847 +44847 +44848 +44848 +44848 +44848 +44848 +44848 +44848 +44848 +44848 +44848 +44848 +44849 +44849 +44849 +44849 +44849 +44849 +44849 +44849 +44849 +44849 +44850 +44850 +44850 +44850 +44850 +44850 +44850 +44850 +44850 +44850 +44850 +44851 +44851 +44851 +44851 +44851 +44851 +44851 +44851 +44851 +44851 +44851 +44852 +44852 +44852 +44852 +44852 +44852 +44852 +44852 +44852 +44852 +44852 +44853 +44853 +44853 +44853 +44853 +44853 +44853 +44853 +44853 +44853 +44854 +44854 +44854 +44854 +44854 +44854 +44854 +44854 +44854 +44854 +44854 +44855 +44855 +44855 +44855 +44855 +44855 +44855 +44855 +44855 +44855 +44855 +44856 +44856 +44856 +44856 +44856 +44856 +44856 +44856 +44856 +44856 +44856 +44857 +44857 +44857 +44857 +44857 +44857 +44857 +44857 +44857 +44857 +44857 +44858 +44858 +44858 +44858 +44858 +44858 +44858 +44858 +44858 +44858 +44858 +44858 +44859 +44859 +44859 +44859 +44859 +44859 +44859 +44859 +44859 +44859 +44859 +44860 +44860 +44860 +44860 +44860 +44860 +44860 +44860 +44860 +44860 +44860 +44861 +44861 +44861 +44861 +44861 +44861 +44861 +44861 +44861 +44861 +44861 +44861 +44862 +44862 +44862 +44862 +44862 +44862 +44862 +44862 +44862 +44862 +44862 +44863 +44863 +44863 +44863 +44863 +44863 +44863 +44863 +44863 +44863 +44863 +44864 +44864 +44864 +44864 +44864 +44864 +44864 +44864 +44864 +44864 +44864 +44864 +44865 +44865 +44865 +44865 +44865 +44865 +44865 +44865 +44865 +44865 +44865 +44865 +44866 +44866 +44866 +44866 +44866 +44866 +44866 +44866 +44866 +44866 +44866 +44867 +44867 +44867 +44867 +44867 +44867 +44867 +44867 +44867 +44867 +44867 +44867 +44868 +44868 +44868 +44868 +44868 +44868 +44868 +44868 +44868 +44868 +44868 +44868 +44869 +44869 +44869 +44869 +44869 +44869 +44869 +44869 +44869 +44869 +44869 +44869 +44870 +44870 +44870 +44870 +44870 +44870 +44870 +44870 +44870 +44870 +44870 +44870 +44871 +44871 +44871 +44871 +44871 +44871 +44871 +44871 +44871 +44871 +44871 +44871 +44872 +44872 +44872 +44872 +44872 +44872 +44872 +44872 +44872 +44872 +44872 +44872 +44873 +44873 +44873 +44873 +44873 +44873 +44873 +44873 +44873 +44873 +44873 +44873 +44874 +44874 +44874 +44874 +44874 +44874 +44874 +44874 +44874 +44874 +44874 +44874 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44875 +44876 +44876 +44876 +44876 +44876 +44876 +44876 +44876 +44876 +44876 +44876 +44876 +44877 +44877 +44877 +44877 +44877 +44877 +44877 +44877 +44877 +44877 +44877 +44877 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44878 +44879 +44879 +44879 +44879 +44879 +44879 +44879 +44879 +44879 +44879 +44879 +44879 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44880 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44881 +44882 +44882 +44882 +44882 +44882 +44882 +44882 +44882 +44882 +44882 +44882 +44882 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44883 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44884 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44885 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44886 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44887 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44888 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44889 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44890 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44891 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44892 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44893 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44894 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44895 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44896 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44897 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44898 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44899 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44900 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44901 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44902 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44903 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44904 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44905 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44906 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44907 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44908 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44909 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44910 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44911 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44912 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44913 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44914 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44915 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44916 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44917 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44918 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44919 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44920 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44921 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44922 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44923 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44924 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44925 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44926 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44927 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44928 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44929 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44930 +44931 +44931 +44931 +44931 +44931 +44931 +44931 +44931 +44932 +44932 +44932 +44932 +44932 +44932 +44932 +44932 +44933 +44933 +44933 +44933 +44933 +44933 +44933 +44933 +44934 +44934 +44934 +44934 +44934 +44934 +44934 +44934 +44935 +44935 +44935 +44935 +44935 +44935 +44935 +44935 +44936 +44936 +44936 +44936 +44936 +44936 +44936 +44936 +44936 +44937 +44937 +44937 +44937 +44937 +44937 +44937 +44937 +44938 +44938 +44938 +44938 +44938 +44938 +44938 +44938 +44939 +44939 +44939 +44939 +44939 +44939 +44939 +44939 +44940 +44940 +44940 +44940 +44940 +44940 +44940 +44940 +44940 +44941 +44941 +44941 +44941 +44941 +44941 +44941 +44941 +44942 +44942 +44942 +44942 +44942 +44942 +44942 +44942 +44942 +44943 +44943 +44943 +44943 +44943 +44943 +44943 +44943 +44944 +44944 +44944 +44944 +44944 +44944 +44944 +44944 +44945 +44945 +44945 +44945 +44945 +44945 +44945 +44945 +44945 +44946 +44946 +44946 +44946 +44946 +44946 +44946 +44946 +44946 +44947 +44947 +44947 +44947 +44947 +44947 +44947 +44947 +44948 +44948 +44948 +44948 +44948 +44948 +44948 +44948 +44948 +44949 +44949 +44949 +44949 +44949 +44949 +44949 +44949 +44950 +44950 +44950 +44950 +44950 +44950 +44950 +44950 +44950 +44951 +44951 +44951 +44951 +44951 +44951 +44951 +44951 +44951 +44952 +44952 +44952 +44952 +44952 +44952 +44952 +44952 +44952 +44953 +44953 +44953 +44953 +44953 +44953 +44953 +44953 +44954 +44954 +44954 +44954 +44954 +44954 +44954 +44954 +44954 +44955 +44955 +44955 +44955 +44955 +44955 +44955 +44955 +44955 +44956 +44956 +44956 +44956 +44956 +44956 +44956 +44956 +44956 +44957 +44957 +44957 +44957 +44957 +44957 +44957 +44957 +44957 +44958 +44958 +44958 +44958 +44958 +44958 +44958 +44958 +44958 +44959 +44959 +44959 +44959 +44959 +44959 +44959 +44959 +44959 +44960 +44960 +44960 +44960 +44960 +44960 +44960 +44960 +44960 +44961 +44961 +44961 +44961 +44961 +44961 +44961 +44961 +44961 +44962 +44962 +44962 +44962 +44962 +44962 +44962 +44962 +44962 +44963 +44963 +44963 +44963 +44963 +44963 +44963 +44963 +44963 +44964 +44964 +44964 +44964 +44964 +44964 +44964 +44964 +44964 +44965 +44965 +44965 +44965 +44965 +44965 +44965 +44965 +44965 +44965 +44966 +44966 +44966 +44966 +44966 +44966 +44966 +44966 +44966 +44967 +44967 +44967 +44967 +44967 +44967 +44967 +44967 +44967 +44968 +44968 +44968 +44968 +44968 +44968 +44968 +44968 +44968 +44968 +44969 +44969 +44969 +44969 +44969 +44969 +44969 +44969 +44969 +44970 +44970 +44970 +44970 +44970 +44970 +44970 +44970 +44970 +44971 +44971 +44971 +44971 +44971 +44971 +44971 +44971 +44971 +44971 +44972 +44972 +44972 +44972 +44972 +44972 +44972 +44972 +44972 +44973 +44973 +44973 +44973 +44973 +44973 +44973 +44973 +44973 +44973 +44974 +44974 +44974 +44974 +44974 +44974 +44974 +44974 +44974 +44975 +44975 +44975 +44975 +44975 +44975 +44975 +44975 +44975 +44975 +44976 +44976 +44976 +44976 +44976 +44976 +44976 +44976 +44976 +44977 +44977 +44977 +44977 +44977 +44977 +44977 +44977 +44977 +44977 +44978 +44978 +44978 +44978 +44978 +44978 +44978 +44978 +44978 +44978 +44979 +44979 +44979 +44979 +44979 +44979 +44979 +44979 +44979 +44980 +44980 +44980 +44980 +44980 +44980 +44980 +44980 +44980 +44980 +44981 +44981 +44981 +44981 +44981 +44981 +44981 +44981 +44981 +44981 +44982 +44982 +44982 +44982 +44982 +44982 +44982 +44982 +44982 +44982 +44983 +44983 +44983 +44983 +44983 +44983 +44983 +44983 +44983 +44983 +44984 +44984 +44984 +44984 +44984 +44984 +44984 +44984 +44984 +44984 +44985 +44985 +44985 +44985 +44985 +44985 +44985 +44985 +44985 +44986 +44986 +44986 +44986 +44986 +44986 +44986 +44986 +44986 +44986 +44987 +44987 +44987 +44987 +44987 +44987 +44987 +44987 +44987 +44987 +44988 +44988 +44988 +44988 +44988 +44988 +44988 +44988 +44988 +44988 +44989 +44989 +44989 +44989 +44989 +44989 +44989 +44989 +44989 +44989 +44989 +44990 +44990 +44990 +44990 +44990 +44990 +44990 +44990 +44990 +44990 +44991 +44991 +44991 +44991 +44991 +44991 +44991 +44991 +44991 +44991 +44992 +44992 +44992 +44992 +44992 +44992 +44992 +44992 +44992 +44992 +44993 +44993 +44993 +44993 +44993 +44993 +44993 +44993 +44993 +44993 +44994 +44994 +44994 +44994 +44994 +44994 +44994 +44994 +44994 +44994 +44995 +44995 +44995 +44995 +44995 +44995 +44995 +44995 +44995 +44995 +44995 +44996 +44996 +44996 +44996 +44996 +44996 +44996 +44996 +44996 +44996 +44997 +44997 +44997 +44997 +44997 +44997 +44997 +44997 +44997 +44997 +44998 +44998 +44998 +44998 +44998 +44998 +44998 +44998 +44998 +44998 +44998 +44999 +44999 +44999 +44999 +44999 +44999 +44999 +44999 +44999 +44999 +45000 +45000 +45000 +45000 +45000 +45000 +45000 +45000 +45000 +45000 +45000 +45001 +45001 +45001 +45001 +45001 +45001 +45001 +45001 +45001 +45001 +45002 +45002 +45002 +45002 +45002 +45002 +45002 +45002 +45002 +45002 +45002 +45003 +45003 +45003 +45003 +45003 +45003 +45003 +45003 +45003 +45003 +45004 +45004 +45004 +45004 +45004 +45004 +45004 +45004 +45004 +45004 +45004 +45005 +45005 +45005 +45005 +45005 +45005 +45005 +45005 +45005 +45005 +45005 +45006 +45006 +45006 +45006 +45006 +45006 +45006 +45006 +45006 +45006 +45007 +45007 +45007 +45007 +45007 +45007 +45007 +45007 +45007 +45007 +45007 +45008 +45008 +45008 +45008 +45008 +45008 +45008 +45008 +45008 +45008 +45008 +45009 +45009 +45009 +45009 +45009 +45009 +45009 +45009 +45009 +45009 +45009 +45010 +45010 +45010 +45010 +45010 +45010 +45010 +45010 +45010 +45010 +45011 +45011 +45011 +45011 +45011 +45011 +45011 +45011 +45011 +45011 +45011 +45012 +45012 +45012 +45012 +45012 +45012 +45012 +45012 +45012 +45012 +45012 +45013 +45013 +45013 +45013 +45013 +45013 +45013 +45013 +45013 +45013 +45013 +45014 +45014 +45014 +45014 +45014 +45014 +45014 +45014 +45014 +45014 +45014 +45015 +45015 +45015 +45015 +45015 +45015 +45015 +45015 +45015 +45015 +45015 +45016 +45016 +45016 +45016 +45016 +45016 +45016 +45016 +45016 +45016 +45016 +45017 +45017 +45017 +45017 +45017 +45017 +45017 +45017 +45017 +45017 +45017 +45018 +45018 +45018 +45018 +45018 +45018 +45018 +45018 +45018 +45018 +45018 +45019 +45019 +45019 +45019 +45019 +45019 +45019 +45019 +45019 +45019 +45019 +45019 +45020 +45020 +45020 +45020 +45020 +45020 +45020 +45020 +45020 +45020 +45020 +45021 +45021 +45021 +45021 +45021 +45021 +45021 +45021 +45021 +45021 +45021 +45022 +45022 +45022 +45022 +45022 +45022 +45022 +45022 +45022 +45022 +45022 +45023 +45023 +45023 +45023 +45023 +45023 +45023 +45023 +45023 +45023 +45023 +45023 +45024 +45024 +45024 +45024 +45024 +45024 +45024 +45024 +45024 +45024 +45024 +45025 +45025 +45025 +45025 +45025 +45025 +45025 +45025 +45025 +45025 +45025 +45026 +45026 +45026 +45026 +45026 +45026 +45026 +45026 +45026 +45026 +45026 +45026 +45027 +45027 +45027 +45027 +45027 +45027 +45027 +45027 +45027 +45027 +45027 +45028 +45028 +45028 +45028 +45028 +45028 +45028 +45028 +45028 +45028 +45028 +45028 +45029 +45029 +45029 +45029 +45029 +45029 +45029 +45029 +45029 +45029 +45029 +45030 +45030 +45030 +45030 +45030 +45030 +45030 +45030 +45030 +45030 +45030 +45030 +45031 +45031 +45031 +45031 +45031 +45031 +45031 +45031 +45031 +45031 +45031 +45032 +45032 +45032 +45032 +45032 +45032 +45032 +45032 +45032 +45032 +45032 +45032 +45033 +45033 +45033 +45033 +45033 +45033 +45033 +45033 +45033 +45033 +45033 +45033 +45034 +45034 +45034 +45034 +45034 +45034 +45034 +45034 +45034 +45034 +45034 +45035 +45035 +45035 +45035 +45035 +45035 +45036 +45036 +45036 +45036 +45036 +45036 +45037 +45037 +45037 +45037 +45037 +45037 +45038 +45038 +45038 +45038 +45038 +45038 +45039 +45039 +45039 +45039 +45039 +45039 +45040 +45040 +45040 +45040 +45040 +45041 +45041 +45041 +45041 +45041 +45041 +45042 +45042 +45042 +45042 +45042 +45042 +45043 +45043 +45043 +45043 +45043 +45043 +45044 +45044 +45044 +45044 +45044 +45044 +45044 +45045 +45045 +45045 +45045 +45045 +45045 +45046 +45046 +45046 +45046 +45046 +45046 +45047 +45047 +45047 +45047 +45047 +45047 +45048 +45048 +45048 +45048 +45048 +45048 +45049 +45049 +45049 +45049 +45049 +45049 +45050 +45050 +45050 +45050 +45050 +45050 +45051 +45051 +45051 +45051 +45051 +45051 +45052 +45052 +45052 +45052 +45052 +45052 +45052 +45053 +45053 +45053 +45053 +45053 +45053 +45054 +45054 +45054 +45054 +45054 +45054 +45055 +45055 +45055 +45055 +45055 +45055 +45056 +45056 +45056 +45056 +45056 +45056 +45056 +45056 +45056 +45056 +45057 +45057 +45057 +45057 +45057 +45057 +45057 +45057 +45057 +45057 +45057 +45057 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45058 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45059 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45060 +45061 +45061 +45061 +45061 +45061 +45061 +45061 +45061 +45061 +45061 +45061 +45061 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45062 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45063 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45064 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45065 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45066 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45067 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45068 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45069 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45070 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45071 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45072 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45073 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45074 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45075 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45076 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45077 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45078 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45079 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45080 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45081 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45082 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45083 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45084 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45085 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45086 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45087 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45088 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45089 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45090 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45091 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45092 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45093 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45094 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45095 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45096 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45097 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45098 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45099 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45100 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45101 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45102 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45103 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45104 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45105 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45106 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45107 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45108 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45109 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45110 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45111 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45112 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45113 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45114 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45115 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45116 +45117 +45117 +45117 +45117 +45117 +45117 +45117 +45117 +45118 +45118 +45118 +45118 +45118 +45118 +45118 +45118 +45118 +45119 +45119 +45119 +45119 +45119 +45119 +45119 +45119 +45119 +45120 +45120 +45120 +45120 +45120 +45120 +45120 +45120 +45120 +45121 +45121 +45121 +45121 +45121 +45121 +45121 +45121 +45122 +45122 +45122 +45122 +45122 +45122 +45122 +45122 +45122 +45123 +45123 +45123 +45123 +45123 +45123 +45123 +45123 +45123 +45124 +45124 +45124 +45124 +45124 +45124 +45124 +45124 +45124 +45125 +45125 +45125 +45125 +45125 +45125 +45125 +45125 +45125 +45126 +45126 +45126 +45126 +45126 +45126 +45126 +45126 +45126 +45127 +45127 +45127 +45127 +45127 +45127 +45127 +45127 +45127 +45128 +45128 +45128 +45128 +45128 +45128 +45128 +45128 +45128 +45129 +45129 +45129 +45129 +45129 +45129 +45129 +45129 +45129 +45130 +45130 +45130 +45130 +45130 +45130 +45130 +45130 +45130 +45131 +45131 +45131 +45131 +45131 +45131 +45131 +45131 +45131 +45132 +45132 +45132 +45132 +45132 +45132 +45132 +45132 +45132 +45133 +45133 +45133 +45133 +45133 +45133 +45133 +45133 +45133 +45133 +45134 +45134 +45134 +45134 +45134 +45134 +45134 +45134 +45134 +45135 +45135 +45135 +45135 +45135 +45135 +45135 +45135 +45135 +45136 +45136 +45136 +45136 +45136 +45136 +45136 +45136 +45136 +45136 +45137 +45137 +45137 +45137 +45137 +45137 +45137 +45137 +45137 +45138 +45138 +45138 +45138 +45138 +45138 +45138 +45138 +45138 +45138 +45139 +45139 +45139 +45139 +45139 +45139 +45139 +45139 +45139 +45140 +45140 +45140 +45140 +45140 +45140 +45140 +45140 +45140 +45140 +45141 +45141 +45141 +45141 +45141 +45141 +45141 +45141 +45141 +45142 +45142 +45142 +45142 +45142 +45142 +45142 +45142 +45142 +45142 +45143 +45143 +45143 +45143 +45143 +45143 +45143 +45143 +45143 +45144 +45144 +45144 +45144 +45144 +45144 +45144 +45144 +45144 +45144 +45145 +45145 +45145 +45145 +45145 +45145 +45145 +45145 +45145 +45145 +45146 +45146 +45146 +45146 +45146 +45146 +45146 +45146 +45146 +45146 +45147 +45147 +45147 +45147 +45147 +45147 +45147 +45147 +45147 +45147 +45148 +45148 +45148 +45148 +45148 +45148 +45148 +45148 +45148 +45149 +45149 +45149 +45149 +45149 +45149 +45149 +45149 +45149 +45149 +45150 +45150 +45150 +45150 +45150 +45150 +45150 +45150 +45150 +45150 +45151 +45151 +45151 +45151 +45151 +45151 +45151 +45151 +45151 +45151 +45152 +45152 +45152 +45152 +45152 +45152 +45152 +45152 +45152 +45152 +45153 +45153 +45153 +45153 +45153 +45153 +45153 +45153 +45153 +45153 +45154 +45154 +45154 +45154 +45154 +45154 +45154 +45154 +45154 +45154 +45155 +45155 +45155 +45155 +45155 +45155 +45155 +45155 +45155 +45155 +45155 +45156 +45156 +45156 +45156 +45156 +45156 +45156 +45156 +45156 +45156 +45157 +45157 +45157 +45157 +45157 +45157 +45157 +45157 +45157 +45157 +45158 +45158 +45158 +45158 +45158 +45158 +45158 +45158 +45158 +45158 +45159 +45159 +45159 +45159 +45159 +45159 +45159 +45159 +45159 +45159 +45159 +45160 +45160 +45160 +45160 +45160 +45160 +45160 +45160 +45160 +45160 +45161 +45161 +45161 +45161 +45161 +45161 +45161 +45161 +45161 +45161 +45162 +45162 +45162 +45162 +45162 +45162 +45162 +45162 +45162 +45162 +45162 +45163 +45163 +45163 +45163 +45163 +45163 +45163 +45163 +45163 +45163 +45164 +45164 +45164 +45164 +45164 +45164 +45164 +45164 +45164 +45164 +45164 +45165 +45165 +45165 +45165 +45165 +45165 +45165 +45165 +45165 +45165 +45166 +45166 +45166 +45166 +45166 +45166 +45166 +45166 +45166 +45166 +45166 +45167 +45167 +45167 +45167 +45167 +45167 +45167 +45167 +45167 +45167 +45168 +45168 +45168 +45168 +45168 +45168 +45168 +45168 +45168 +45168 +45168 +45169 +45169 +45169 +45169 +45169 +45169 +45169 +45169 +45169 +45169 +45169 +45170 +45170 +45170 +45170 +45170 +45170 +45170 +45170 +45170 +45170 +45170 +45171 +45171 +45171 +45171 +45171 +45171 +45171 +45171 +45171 +45171 +45172 +45172 +45172 +45172 +45172 +45172 +45172 +45172 +45172 +45172 +45172 +45173 +45173 +45173 +45173 +45173 +45173 +45173 +45173 +45173 +45173 +45173 +45174 +45174 +45174 +45174 +45174 +45174 +45174 +45174 +45174 +45174 +45174 +45175 +45175 +45175 +45175 +45175 +45175 +45175 +45175 +45175 +45175 +45175 +45176 +45176 +45176 +45176 +45176 +45176 +45176 +45176 +45176 +45176 +45176 +45177 +45177 +45177 +45177 +45177 +45177 +45177 +45177 +45177 +45177 +45177 +45178 +45178 +45178 +45178 +45178 +45178 +45178 +45178 +45178 +45178 +45178 +45179 +45179 +45179 +45179 +45179 +45179 +45179 +45179 +45179 +45179 +45179 +45180 +45180 +45180 +45180 +45180 +45180 +45180 +45180 +45180 +45180 +45180 +45180 +45181 +45181 +45181 +45181 +45181 +45181 +45181 +45181 +45181 +45181 +45181 +45182 +45182 +45182 +45182 +45182 +45182 +45182 +45182 +45182 +45182 +45182 +45183 +45183 +45183 +45183 +45183 +45183 +45183 +45183 +45183 +45183 +45183 +45184 +45184 +45184 +45184 +45184 +45184 +45184 +45184 +45184 +45184 +45184 +45184 +45185 +45185 +45185 +45185 +45185 +45185 +45185 +45185 +45185 +45185 +45185 +45186 +45186 +45186 +45186 +45186 +45186 +45186 +45186 +45186 +45186 +45186 +45187 +45187 +45187 +45187 +45187 +45187 +45187 +45187 +45187 +45187 +45187 +45187 +45188 +45188 +45188 +45188 +45188 +45188 +45188 +45188 +45188 +45188 +45188 +45189 +45189 +45189 +45189 +45189 +45189 +45189 +45189 +45189 +45189 +45189 +45189 +45190 +45190 +45190 +45190 +45190 +45190 +45190 +45190 +45190 +45190 +45190 +45190 +45191 +45191 +45191 +45191 +45191 +45191 +45191 +45191 +45191 +45191 +45191 +45192 +45192 +45192 +45192 +45192 +45192 +45192 +45192 +45192 +45192 +45192 +45192 +45193 +45193 +45193 +45193 +45193 +45193 +45193 +45193 +45193 +45193 +45193 +45193 +45194 +45194 +45194 +45194 +45194 +45194 +45194 +45194 +45194 +45194 +45194 +45195 +45195 +45195 +45195 +45195 +45195 +45195 +45195 +45195 +45195 +45195 +45195 +45196 +45196 +45196 +45196 +45196 +45196 +45196 +45196 +45196 +45196 +45196 +45196 +45197 +45197 +45197 +45197 +45197 +45197 +45197 +45197 +45197 +45197 +45197 +45197 +45198 +45198 +45198 +45198 +45198 +45198 +45198 +45198 +45198 +45198 +45198 +45198 +45199 +45199 +45199 +45199 +45199 +45199 +45199 +45199 +45199 +45199 +45199 +45199 +45200 +45200 +45200 +45200 +45200 +45200 +45200 +45200 +45200 +45200 +45200 +45200 +45201 +45201 +45201 +45201 +45201 +45201 +45201 +45201 +45201 +45201 +45201 +45201 +45202 +45202 +45202 +45202 +45202 +45202 +45202 +45202 +45202 +45202 +45202 +45202 +45203 +45203 +45203 +45203 +45203 +45203 +45203 +45203 +45203 +45203 +45203 +45203 +45204 +45204 +45204 +45204 +45204 +45204 +45204 +45204 +45204 +45204 +45204 +45204 +45205 +45205 +45205 +45205 +45205 +45205 +45205 +45205 +45205 +45205 +45205 +45205 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45206 +45207 +45207 +45207 +45207 +45207 +45207 +45207 +45207 +45207 +45207 +45207 +45207 +45208 +45208 +45208 +45208 +45208 +45208 +45208 +45208 +45208 +45208 +45208 +45208 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45209 +45210 +45210 +45210 +45210 +45210 +45210 +45210 +45210 +45210 +45210 +45210 +45210 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45211 +45212 +45212 +45212 +45212 +45212 +45212 +45212 +45212 +45212 +45212 +45212 +45212 +45213 +45213 +45213 +45213 +45213 +45213 +45213 +45213 +45213 +45213 +45213 +45214 +45214 +45214 +45214 +45214 +45214 +45215 +45215 +45215 +45215 +45215 +45215 +45215 +45216 +45216 +45216 +45216 +45216 +45216 +45217 +45217 +45217 +45217 +45217 +45217 +45218 +45218 +45218 +45218 +45218 +45218 +45218 +45219 +45219 +45219 +45219 +45219 +45219 +45220 +45220 +45220 +45220 +45220 +45220 +45220 +45221 +45221 +45221 +45221 +45221 +45221 +45222 +45222 +45222 +45222 +45222 +45222 +45222 +45223 +45223 +45223 +45223 +45223 +45223 +45224 +45224 +45224 +45224 +45224 +45224 +45224 +45225 +45225 +45225 +45225 +45225 +45225 +45226 +45226 +45226 +45226 +45226 +45226 +45226 +45227 +45227 +45227 +45227 +45227 +45227 +45228 +45228 +45228 +45228 +45228 +45228 +45228 +45229 +45229 +45229 +45229 +45229 +45229 +45229 +45230 +45230 +45230 +45230 +45230 +45230 +45231 +45231 +45231 +45231 +45231 +45231 +45231 +45232 +45232 +45232 +45232 +45232 +45232 +45232 +45233 +45233 +45233 +45233 +45233 +45233 +45234 +45234 +45234 +45234 +45234 +45234 +45234 +45235 +45235 +45235 +45235 +45235 +45235 +45235 +45236 +45236 +45236 +45236 +45236 +45236 +45237 +45237 +45237 +45237 +45237 +45237 +45237 +45238 +45238 +45238 +45238 +45238 +45238 +45238 +45239 +45239 +45239 +45239 +45239 +45239 +45239 +45240 +45240 +45240 +45240 +45240 +45240 +45240 +45241 +45241 +45241 +45241 +45241 +45241 +45241 +45242 +45242 +45242 +45242 +45242 +45242 +45242 +45243 +45243 +45243 +45243 +45243 +45243 +45244 +45244 +45244 +45244 +45244 +45244 +45244 +45245 +45245 +45245 +45245 +45245 +45245 +45245 +45246 +45246 +45246 +45246 +45246 +45246 +45246 +45247 +45247 +45247 +45247 +45247 +45247 +45247 +45248 +45248 +45248 +45248 +45248 +45248 +45248 +45249 +45249 +45249 +45249 +45249 +45249 +45249 +45250 +45250 +45250 +45250 +45250 +45250 +45250 +45250 +45251 +45251 +45251 +45251 +45251 +45251 +45251 +45252 +45252 +45252 +45252 +45252 +45252 +45252 +45253 +45253 +45253 +45253 +45253 +45253 +45253 +45254 +45254 +45254 +45254 +45254 +45254 +45254 +45255 +45255 +45255 +45255 +45255 +45255 +45255 +45256 +45256 +45256 +45256 +45256 +45256 +45256 +45257 +45257 +45257 +45257 +45257 +45257 +45257 +45257 +45258 +45258 +45258 +45258 +45258 +45258 +45258 +45259 +45259 +45259 +45259 +45259 +45259 +45259 +45260 +45260 +45260 +45260 +45260 +45260 +45260 +45261 +45261 +45261 +45261 +45261 +45261 +45261 +45261 +45262 +45262 +45262 +45262 +45262 +45262 +45262 +45263 +45263 +45263 +45263 +45263 +45263 +45263 +45264 +45264 +45264 +45264 +45264 +45264 +45264 +45264 +45265 +45265 +45265 +45265 +45265 +45265 +45265 +45266 +45266 +45266 +45266 +45266 +45266 +45266 +45266 +45267 +45267 +45267 +45267 +45267 +45267 +45267 +45268 +45268 +45268 +45268 +45268 +45268 +45268 +45268 +45269 +45269 +45269 +45269 +45269 +45269 +45269 +45270 +45270 +45270 +45270 +45270 +45270 +45270 +45270 +45271 +45271 +45271 +45271 +45271 +45271 +45271 +45272 +45272 +45272 +45272 +45272 +45272 +45272 +45272 +45273 +45273 +45273 +45273 +45273 +45273 +45273 +45274 +45274 +45274 +45274 +45274 +45274 +45274 +45274 +45275 +45275 +45275 +45275 +45275 +45275 +45275 +45276 +45276 +45276 +45276 +45276 +45276 +45276 +45276 +45277 +45277 +45277 +45277 +45277 +45277 +45277 +45277 +45278 +45278 +45278 +45278 +45278 +45278 +45278 +45279 +45279 +45279 +45279 +45279 +45279 +45279 +45279 +45280 +45280 +45280 +45280 +45280 +45280 +45280 +45280 +45281 +45281 +45281 +45281 +45281 +45281 +45281 +45281 +45282 +45282 +45282 +45282 +45282 +45282 +45282 +45283 +45283 +45283 +45283 +45283 +45283 +45283 +45283 +45284 +45284 +45284 +45284 +45284 +45284 +45284 +45284 +45285 +45285 +45285 +45285 +45285 +45285 +45285 +45285 +45286 +45286 +45286 +45286 +45286 +45286 +45286 +45286 +45287 +45287 +45287 +45287 +45287 +45287 +45287 +45287 +45288 +45288 +45288 +45288 +45288 +45288 +45288 +45288 +45289 +45289 +45289 +45289 +45289 +45289 +45289 +45290 +45290 +45290 +45290 +45290 +45290 +45290 +45290 +45291 +45291 +45291 +45291 +45291 +45291 +45291 +45291 +45292 +45292 +45292 +45292 +45292 +45292 +45292 +45292 +45293 +45293 +45293 +45293 +45293 +45293 +45293 +45293 +45294 +45294 +45294 +45294 +45294 +45294 +45294 +45294 +45295 +45295 +45295 +45295 +45295 +45295 +45295 +45295 +45296 +45296 +45296 +45296 +45296 +45296 +45296 +45296 +45296 +45297 +45297 +45297 +45297 +45297 +45297 +45297 +45297 +45298 +45298 +45298 +45298 +45298 +45298 +45298 +45298 +45299 +45299 +45299 +45299 +45299 +45299 +45299 +45299 +45300 +45300 +45300 +45300 +45300 +45300 +45300 +45300 +45301 +45301 +45301 +45301 +45301 +45301 +45301 +45301 +45302 +45302 +45302 +45302 +45302 +45302 +45302 +45302 +45302 +45303 +45303 +45303 +45303 +45303 +45303 +45303 +45303 +45304 +45304 +45304 +45304 +45304 +45304 +45304 +45304 +45305 +45305 +45305 +45305 +45305 +45305 +45305 +45305 +45306 +45306 +45306 +45306 +45306 +45306 +45306 +45306 +45306 +45307 +45307 +45307 +45307 +45307 +45307 +45307 +45307 +45308 +45308 +45308 +45308 +45308 +45308 +45308 +45308 +45309 +45309 +45309 +45309 +45309 +45309 +45309 +45309 +45309 +45310 +45310 +45310 +45310 +45310 +45310 +45310 +45310 +45311 +45311 +45311 +45311 +45311 +45311 +45311 +45311 +45311 +45312 +45312 +45312 +45312 +45312 +45312 +45312 +45312 +45313 +45313 +45313 +45313 +45313 +45313 +45313 +45313 +45314 +45314 +45314 +45314 +45314 +45314 +45314 +45314 +45314 +45315 +45315 +45315 +45315 +45315 +45315 +45315 +45315 +45316 +45316 +45316 +45316 +45316 +45316 +45316 +45316 +45316 +45317 +45317 +45317 +45317 +45317 +45317 +45317 +45317 +45318 +45318 +45318 +45318 +45318 +45318 +45318 +45318 +45318 +45319 +45319 +45319 +45319 +45319 +45319 +45319 +45319 +45319 +45320 +45320 +45320 +45320 +45320 +45320 +45320 +45320 +45321 +45321 +45321 +45321 +45321 +45321 +45321 +45321 +45321 +45322 +45322 +45322 +45322 +45322 +45322 +45322 +45322 +45322 +45323 +45323 +45323 +45323 +45323 +45323 +45323 +45323 +45324 +45324 +45324 +45324 +45324 +45324 +45324 +45324 +45324 +45325 +45325 +45325 +45325 +45325 +45325 +45325 +45325 +45325 +45326 +45326 +45326 +45326 +45326 +45326 +45326 +45326 +45327 +45327 +45327 +45327 +45327 +45327 +45327 +45327 +45327 +45328 +45328 +45328 +45328 +45328 +45328 +45328 +45328 +45328 +45329 +45329 +45329 +45329 +45329 +45329 +45329 +45329 +45329 +45330 +45330 +45330 +45330 +45330 +45330 +45330 +45330 +45330 +45331 +45331 +45331 +45331 +45331 +45331 +45331 +45331 +45331 +45332 +45332 +45332 +45332 +45332 +45332 +45332 +45332 +45333 +45333 +45333 +45333 +45333 +45333 +45333 +45333 +45333 +45334 +45334 +45334 +45334 +45334 +45334 +45334 +45334 +45334 +45335 +45335 +45335 +45335 +45335 +45335 +45335 +45335 +45335 +45336 +45336 +45336 +45336 +45336 +45336 +45336 +45336 +45336 +45337 +45337 +45337 +45337 +45337 +45337 +45337 +45337 +45337 +45338 +45338 +45338 +45338 +45338 +45338 +45338 +45338 +45338 +45339 +45339 +45339 +45339 +45339 +45339 +45339 +45339 +45339 +45340 +45340 +45340 +45340 +45340 +45340 +45340 +45340 +45340 +45341 +45341 +45341 +45341 +45341 +45341 +45341 +45341 +45341 +45341 +45342 +45342 +45342 +45342 +45342 +45342 +45342 +45342 +45342 +45343 +45343 +45343 +45343 +45343 +45343 +45343 +45343 +45343 +45344 +45344 +45344 +45344 +45344 +45344 +45344 +45344 +45344 +45345 +45345 +45345 +45345 +45345 +45345 +45345 +45345 +45345 +45346 +45346 +45346 +45346 +45346 +45346 +45347 +45347 +45347 +45347 +45347 +45348 +45348 +45348 +45348 +45349 +45349 +45349 +45349 +45349 +45350 +45350 +45350 +45350 +45351 +45351 +45351 +45351 +45351 +45352 +45352 +45352 +45352 +45352 +45353 +45353 +45353 +45353 +45354 +45354 +45354 +45354 +45354 +45355 +45355 +45355 +45355 +45355 +45356 +45356 +45356 +45356 +45356 +45357 +45357 +45357 +45357 +45358 +45358 +45358 +45358 +45358 +45359 +45359 +45359 +45359 +45359 +45360 +45360 +45360 +45360 +45360 +45361 +45361 +45361 +45361 +45362 +45362 +45362 +45362 +45362 +45363 +45363 +45363 +45363 +45363 +45364 +45364 +45364 +45364 +45364 +45365 +45365 +45365 +45365 +45365 +45366 +45366 +45366 +45366 +45367 +45367 +45367 +45367 +45367 +45368 +45368 +45368 +45368 +45368 +45369 +45369 +45369 +45369 +45369 +45370 +45370 +45370 +45370 +45370 +45371 +45371 +45371 +45371 +45371 +45372 +45372 +45372 +45372 +45372 +45373 +45373 +45373 +45373 +45373 +45374 +45374 +45374 +45374 +45375 +45375 +45375 +45375 +45375 +45376 +45376 +45376 +45376 +45376 +45377 +45377 +45377 +45377 +45377 +45378 +45378 +45378 +45378 +45378 +45379 +45379 +45379 +45379 +45379 +45380 +45380 +45380 +45380 +45380 +45381 +45381 +45381 +45381 +45381 +45382 +45382 +45382 +45382 +45382 +45383 +45383 +45383 +45383 +45383 +45384 +45384 +45384 +45384 +45384 +45385 +45385 +45385 +45385 +45385 +45386 +45386 +45386 +45386 +45386 +45387 +45387 +45387 +45387 +45387 +45387 +45388 +45388 +45388 +45388 +45388 +45389 +45389 +45389 +45389 +45389 +45390 +45390 +45390 +45390 +45390 +45391 +45391 +45391 +45391 +45391 +45392 +45392 +45392 +45392 +45392 +45393 +45393 +45393 +45393 +45393 +45394 +45394 +45394 +45394 +45394 +45395 +45395 +45395 +45395 +45395 +45395 +45396 +45396 +45396 +45396 +45396 +45397 +45397 +45397 +45397 +45397 +45398 +45398 +45398 +45398 +45398 +45399 +45399 +45399 +45399 +45399 +45400 +45400 +45400 +45400 +45400 +45400 +45401 +45401 +45401 +45401 +45401 +45402 +45402 +45402 +45402 +45402 +45403 +45403 +45403 +45403 +45403 +45404 +45404 +45404 +45404 +45404 +45404 +45405 +45405 +45405 +45405 +45405 +45406 +45406 +45406 +45406 +45406 +45407 +45407 +45407 +45407 +45407 +45408 +45408 +45408 +45408 +45408 +45408 +45409 +45409 +45409 +45409 +45409 +45410 +45410 +45410 +45410 +45410 +45411 +45411 +45411 +45411 +45411 +45411 +45412 +45412 +45412 +45412 +45412 +45413 +45413 +45413 +45413 +45413 +45413 +45414 +45414 +45414 +45414 +45414 +45415 +45415 +45415 +45415 +45415 +45416 +45416 +45416 +45416 +45416 +45416 +45417 +45417 +45417 +45417 +45417 +45418 +45418 +45418 +45418 +45418 +45418 +45419 +45419 +45419 +45419 +45419 +45420 +45420 +45420 +45420 +45420 +45420 +45421 +45421 +45421 +45421 +45421 +45422 +45422 +45422 +45422 +45422 +45423 +45423 +45423 +45423 +45423 +45423 +45424 +45424 +45424 +45424 +45424 +45425 +45425 +45425 +45425 +45425 +45425 +45426 +45426 +45426 +45426 +45426 +45426 +45427 +45427 +45427 +45427 +45427 +45428 +45428 +45428 +45428 +45428 +45428 +45429 +45429 +45429 +45429 +45429 +45430 +45430 +45430 +45430 +45430 +45430 +45431 +45431 +45431 +45431 +45431 +45432 +45432 +45432 +45432 +45432 +45432 +45433 +45433 +45433 +45433 +45433 +45433 +45434 +45434 +45434 +45434 +45434 +45435 +45435 +45435 +45435 +45435 +45435 +45436 +45436 +45436 +45436 +45436 +45437 +45437 +45437 +45437 +45437 +45437 +45438 +45438 +45438 +45438 +45438 +45438 +45439 +45439 +45439 +45439 +45439 +45440 +45440 +45440 +45440 +45440 +45440 +45441 +45441 +45441 +45441 +45441 +45441 +45442 +45442 +45442 +45442 +45442 +45442 +45443 +45443 +45443 +45443 +45443 +45444 +45444 +45444 +45444 +45444 +45444 +45445 +45445 +45445 +45445 +45445 +45445 +45446 +45446 +45446 +45446 +45446 +45446 +45447 +45447 +45447 +45447 +45447 +45448 +45448 +45448 +45448 +45448 +45448 +45449 +45449 +45449 +45449 +45449 +45449 +45450 +45450 +45450 +45450 +45450 +45450 +45451 +45451 +45451 +45451 +45451 +45451 +45452 +45452 +45452 +45452 +45452 +45453 +45453 +45453 +45453 +45453 +45453 +45454 +45454 +45454 +45454 +45454 +45454 +45455 +45455 +45455 +45455 +45455 +45455 +45456 +45456 +45456 +45456 +45456 +45456 +45457 +45457 +45457 +45457 +45457 +45457 +45458 +45458 +45458 +45458 +45458 +45458 +45459 +45459 +45459 +45459 +45459 +45459 +45460 +45460 +45460 +45460 +45460 +45460 +45461 +45461 +45461 +45461 +45461 +45462 +45462 +45462 +45462 +45462 +45462 +45463 +45463 +45463 +45463 +45463 +45463 +45464 +45464 +45464 +45464 +45464 +45464 +45465 +45465 +45465 +45465 +45465 +45465 +45466 +45466 +45466 +45466 +45466 +45466 +45467 +45467 +45467 +45467 +45467 +45467 +45468 +45468 +45468 +45468 +45468 +45468 +45469 +45469 +45469 +45469 +45469 +45469 +45470 +45470 +45470 +45470 +45470 +45470 +45470 +45471 +45471 +45471 +45471 +45471 +45471 +45472 +45472 +45472 +45472 +45472 +45472 +45473 +45473 +45473 +45473 +45473 +45473 +45474 +45474 +45474 +45474 +45474 +45474 +45475 +45475 +45475 +45475 +45475 +45475 +45476 +45476 +45476 +45476 +45476 +45476 +45477 +45477 +45477 +45477 +45477 +45477 +45478 +45478 +45478 +45478 +45478 +45478 +45479 +45479 +45479 +45479 +45479 +45479 +45480 +45480 +45480 +45480 +45480 +45480 +45480 +45481 +45481 +45481 +45481 +45481 +45481 +45482 +45482 +45482 +45482 +45482 +45482 +45483 +45483 +45483 +45483 +45483 +45483 +45484 +45484 +45484 +45484 +45484 +45484 +45485 +45485 +45485 +45485 +45485 +45485 +45485 +45486 +45486 +45486 +45486 +45486 +45486 +45487 +45487 +45487 +45487 +45487 +45487 +45488 +45488 +45488 +45488 +45488 +45488 +45489 +45489 +45489 +45489 +45489 +45489 +45489 +45490 +45490 +45490 +45490 +45490 +45490 +45491 +45491 +45491 +45491 +45491 +45491 +45492 +45492 +45492 +45492 +45492 +45492 +45492 +45493 +45493 +45493 +45493 +45493 +45493 +45494 +45494 +45494 +45494 +45494 +45494 +45495 +45495 +45495 +45495 +45495 +45495 +45495 +45496 +45496 +45496 +45496 +45496 +45496 +45497 +45497 +45497 +45497 +45497 +45497 +45498 +45498 +45498 +45498 +45498 +45498 +45498 +45499 +45499 +45499 +45499 +45499 +45499 +45500 +45500 +45500 +45500 +45500 +45500 +45500 +45501 +45501 +45501 +45501 +45501 +45501 +45502 +45502 +45502 +45502 +45502 +45502 +45503 +45503 +45503 +45503 +45503 +45503 +45503 +45504 +45504 +45504 +45504 +45504 +45504 +45505 +45505 +45505 +45505 +45505 +45505 +45505 +45506 +45506 +45506 +45506 +45506 +45506 +45507 +45507 +45507 +45507 +45507 +45507 +45507 +45508 +45508 +45508 +45508 +45508 +45508 +45509 +45509 +45509 +45509 +45509 +45509 +45509 +45510 +45510 +45510 +45510 +45510 +45510 +45511 +45511 +45511 +45511 +45511 +45511 +45511 +45512 +45512 +45512 +45512 +45512 +45512 +45513 +45513 +45513 +45513 +45513 +45513 +45513 +45514 +45514 +45514 +45514 +45514 +45514 +45514 +45515 +45515 +45515 +45515 +45515 +45515 +45516 +45516 +45516 +45516 +45516 +45516 +45516 +45517 +45517 +45517 +45517 +45517 +45517 +45518 +45518 +45518 +45518 +45518 +45518 +45518 +45519 +45519 +45519 +45519 +45519 +45519 +45519 +45520 +45520 +45520 +45520 +45520 +45520 +45521 +45521 +45521 +45521 +45521 +45521 +45521 +45522 +45522 +45522 +45522 +45522 +45522 +45522 +45523 +45523 +45523 +45523 +45523 +45523 +45524 +45524 +45524 +45524 +45524 +45524 +45524 +45525 +45525 +45525 +45525 +45525 +45525 +45525 +45526 +45526 +45526 +45526 +45526 +45526 +45526 +45527 +45527 +45527 +45527 +45528 +45528 +45528 +45529 +45529 +45529 +45529 +45530 +45530 +45530 +45531 +45531 +45531 +45532 +45532 +45532 +45532 +45533 +45533 +45533 +45534 +45534 +45534 +45534 +45535 +45535 +45535 +45536 +45536 +45536 +45536 +45537 +45537 +45537 +45538 +45538 +45538 +45539 +45539 +45539 +45539 +45540 +45540 +45540 +45541 +45541 +45541 +45541 +45542 +45542 +45542 +45543 +45543 +45543 +45543 +45544 +45544 +45544 +45545 +45545 +45545 +45545 +45546 +45546 +45546 +45547 +45547 +45547 +45547 +45548 +45548 +45548 +45549 +45549 +45549 +45549 +45550 +45550 +45550 +45551 +45551 +45551 +45551 +45552 +45552 +45552 +45553 +45553 +45553 +45553 +45554 +45554 +45554 +45555 +45555 +45555 +45555 +45556 +45556 +45556 +45557 +45557 +45557 +45557 +45558 +45558 +45558 +45559 +45559 +45559 +45559 +45560 +45560 +45560 +45560 +45561 +45561 +45561 +45562 +45562 +45562 +45562 +45563 +45563 +45563 +45564 +45564 +45564 +45564 +45565 +45565 +45565 +45566 +45566 +45566 +45566 +45567 +45567 +45567 +45567 +45568 +45568 +45568 +45569 +45569 +45569 +45569 +45570 +45570 +45570 +45570 +45571 +45571 +45571 +45572 +45572 +45572 +45572 +45573 +45573 +45573 +45573 +45574 +45574 +45574 +45575 +45575 +45575 +45575 +45576 +45576 +45576 +45576 +45577 +45577 +45577 +45578 +45578 +45578 +45578 +45579 +45579 +45579 +45579 +45580 +45580 +45580 +45581 +45581 +45581 +45581 +45582 +45582 +45582 +45582 +45583 +45583 +45583 +45584 +45584 +45584 +45584 +45585 +45585 +45585 +45585 +45586 +45586 +45586 +45586 +45587 +45587 +45587 +45588 +45588 +45588 +45588 +45589 +45589 +45589 +45589 +45590 +45590 +45590 +45590 +45591 +45591 +45591 +45592 +45592 +45592 +45592 +45593 +45593 +45593 +45593 +45594 +45594 +45594 +45594 +45595 +45595 +45595 +45596 +45596 +45596 +45596 +45597 +45597 +45597 +45597 +45598 +45598 +45598 +45598 +45599 +45599 +45599 +45599 +45600 +45600 +45600 +45601 +45601 +45601 +45601 +45602 +45602 +45602 +45602 +45603 +45603 +45603 +45603 +45604 +45604 +45604 +45604 +45605 +45605 +45605 +45605 +45606 +45606 +45606 +45606 +45607 +45607 +45607 +45608 +45608 +45608 +45608 +45609 +45609 +45609 +45609 +45610 +45610 +45610 +45610 +45611 +45611 +45611 +45611 +45612 +45612 +45612 +45612 +45613 +45613 +45613 +45613 +45614 +45614 +45614 +45614 +45615 +45615 +45615 +45615 +45616 +45616 +45616 +45617 +45617 +45617 +45617 +45618 +45618 +45618 +45618 +45619 +45619 +45619 +45619 +45620 +45620 +45620 +45620 +45621 +45621 +45621 +45621 +45622 +45622 +45622 +45622 +45623 +45623 +45623 +45623 +45624 +45624 +45624 +45624 +45625 +45625 +45625 +45625 +45626 +45626 +45626 +45626 +45627 +45627 +45627 +45627 +45628 +45628 +45628 +45628 +45629 +45629 +45629 +45629 +45630 +45630 +45630 +45630 +45631 +45631 +45631 +45631 +45632 +45632 +45632 +45632 +45633 +45633 +45633 +45633 +45634 +45634 +45634 +45634 +45635 +45635 +45635 +45635 +45636 +45636 +45636 +45636 +45637 +45637 +45637 +45637 +45638 +45638 +45638 +45638 +45639 +45639 +45639 +45639 +45640 +45640 +45640 +45640 +45641 +45641 +45641 +45641 +45642 +45642 +45642 +45642 +45642 +45643 +45643 +45643 +45643 +45644 +45644 +45644 +45644 +45645 +45645 +45645 +45645 +45646 +45646 +45646 +45646 +45647 +45647 +45647 +45647 +45648 +45648 +45648 +45648 +45649 +45649 +45649 +45649 +45650 +45650 +45650 +45650 +45651 +45651 +45651 +45651 +45651 +45652 +45652 +45652 +45652 +45653 +45653 +45653 +45653 +45654 +45654 +45654 +45654 +45655 +45655 +45655 +45655 +45656 +45656 +45656 +45656 +45657 +45657 +45657 +45657 +45657 +45658 +45658 +45658 +45658 +45659 +45659 +45659 +45659 +45660 +45660 +45660 +45660 +45661 +45661 +45661 +45661 +45662 +45662 +45662 +45662 +45662 +45663 +45663 +45663 +45663 +45664 +45664 +45664 +45664 +45665 +45665 +45665 +45665 +45666 +45666 +45666 +45666 +45667 +45667 +45667 +45667 +45667 +45668 +45668 +45668 +45668 +45669 +45669 +45669 +45669 +45670 +45670 +45670 +45670 +45671 +45671 +45671 +45671 +45671 +45672 +45672 +45672 +45672 +45673 +45673 +45673 +45673 +45674 +45674 +45674 +45674 +45674 +45675 +45675 +45675 +45675 +45676 +45676 +45676 +45676 +45677 +45677 +45677 +45677 +45678 +45678 +45678 +45678 +45678 +45679 +45679 +45679 +45679 +45680 +45680 +45680 +45680 +45681 +45681 +45681 +45681 +45681 +45682 +45682 +45682 +45682 +45683 +45683 +45683 +45683 +45684 +45684 +45684 +45684 +45684 +45685 +45685 +45685 +45685 +45686 +45686 +45686 +45686 +45687 +45687 +45687 +45687 +45687 +45688 +45688 +45688 +45688 +45689 +45689 +45689 +45689 +45689 +45690 +45690 +45690 +45690 +45691 +45691 +45691 +45691 +45692 +45692 +45692 +45692 +45692 +45693 +45693 +45693 +45693 +45694 +45694 +45694 +45694 +45694 +45695 +45695 +45695 +45695 +45696 +45696 +45696 +45696 +45697 +45697 +45697 +45697 +45697 +45698 +45698 +45698 +45698 +45699 +45699 +45699 +45699 +45699 +45700 +45700 +45700 +45700 +45701 +45701 +45701 +45701 +45701 +45702 +45702 +45702 +45702 +45703 +45703 +45703 +45703 +45703 +45704 +45704 +45704 +45704 +45705 +45705 +45705 +45705 +45705 +45706 +45706 +45706 +45706 +45707 +45707 +45707 +45707 +45707 +45708 +45708 +45708 +45708 +45709 +45709 +45709 +45709 +45709 +45710 +45710 +45710 +45710 +45711 +45711 +45711 +45711 +45711 +45712 +45712 +45712 +45712 +45713 +45713 +45713 +45713 +45713 +45714 +45714 +45714 +45714 +45715 +45715 +45715 +45715 +45715 +45716 +45716 +45716 +45716 +45717 +45717 +45717 +45717 +45717 +45718 +45718 +45718 +45718 +45719 +45719 +45719 +45719 +45719 +45720 +45720 +45720 +45720 +45720 +45721 +45721 +45721 +45721 +45722 +45722 +45722 +45722 +45722 +45723 +45723 +45723 +45723 +45724 +45724 +45724 +45724 +45724 +45725 +45725 +45725 +45725 +45725 +45726 +45726 +45726 +45726 +45727 +45727 +45727 +45727 +45727 +45728 +45728 +45728 +45728 +45729 +45729 +45729 +45729 +45729 +45730 +45730 +45730 +45730 +45730 +45731 +45731 +45731 +45731 +45732 +45732 +45732 +45732 +45732 +45733 +45733 +45733 +45733 +45733 +45734 +45734 +45734 +45734 +45735 +45735 +45735 +45735 +45735 +45736 +45736 +45736 +45736 +45736 +45737 +45737 +45737 +45737 +45738 +45738 +45738 +45738 +45738 +45739 +45739 +45739 +45739 +45739 +45740 +45740 +45740 +45740 +45740 +45741 +45741 +45741 +45741 +45742 +45742 +45742 +45742 +45742 +45743 +45743 +45743 +45743 +45743 +45744 +45744 +45744 +45744 +45745 +45745 +45745 +45745 +45745 +45746 +45746 +45746 +45746 +45746 +45747 +45747 +45747 +45747 +45747 +45748 +45748 +45748 +45748 +45749 +45749 +45749 +45749 +45749 +45750 +45750 +45750 +45750 +45750 +45751 +45751 +45751 +45751 +45751 +45752 +45752 +45752 +45752 +45752 +45753 +45753 +45753 +45753 +45754 +45754 +45754 +45754 +45754 +45755 +45755 +45755 +45755 +45755 +45756 +45756 +45756 +45756 +45756 +45757 +45757 +45757 +45757 +45757 +45758 +45758 +45758 +45758 +45759 +45759 +45759 +45759 +45759 +45760 +45760 +45760 +45760 +45760 +45761 +45761 +45761 +45761 +45761 +45762 +45762 +45762 +45762 +45762 +45763 +45763 +45763 +45763 +45763 +45764 +45764 +45764 +45764 +45764 +45765 +45765 +45765 +45765 +45766 +45766 +45766 +45766 +45766 +45767 +45767 +45767 +45767 +45767 +45768 +45768 +45768 +45768 +45768 +45769 +45769 +45769 +45769 +45769 +45770 +45770 +45770 +45770 +45770 +45771 +45771 +45771 +45771 +45771 +45772 +45772 +45772 +45772 +45772 +45773 +45773 +45773 +45773 +45773 +45774 +45774 +45774 +45774 +45775 +45775 +45776 +45776 +45777 +45777 +45777 +45778 +45778 +45779 +45779 +45779 +45780 +45780 +45781 +45781 +45781 +45782 +45782 +45783 +45783 +45783 +45784 +45784 +45785 +45785 +45785 +45786 +45786 +45787 +45787 +45787 +45788 +45788 +45789 +45789 +45789 +45790 +45790 +45791 +45791 +45791 +45792 +45792 +45793 +45793 +45793 +45794 +45794 +45794 +45795 +45795 +45796 +45796 +45796 +45797 +45797 +45798 +45798 +45798 +45799 +45799 +45800 +45800 +45800 +45801 +45801 +45802 +45802 +45802 +45803 +45803 +45804 +45804 +45804 +45805 +45805 +45805 +45806 +45806 +45807 +45807 +45807 +45808 +45808 +45809 +45809 +45809 +45810 +45810 +45811 +45811 +45811 +45812 +45812 +45812 +45813 +45813 +45814 +45814 +45814 +45815 +45815 +45816 +45816 +45816 +45817 +45817 +45817 +45818 +45818 +45819 +45819 +45819 +45820 +45820 +45821 +45821 +45821 +45822 +45822 +45822 +45823 +45823 +45824 +45824 +45824 +45825 +45825 +45825 +45826 +45826 +45827 +45827 +45827 +45828 +45828 +45828 +45829 +45829 +45830 +45830 +45830 +45831 +45831 +45832 +45832 +45832 +45833 +45833 +45833 +45834 +45834 +45835 +45835 +45835 +45836 +45836 +45836 +45837 +45837 +45838 +45838 +45838 +45839 +45839 +45839 +45840 +45840 +45840 +45841 +45841 +45842 +45842 +45842 +45843 +45843 +45843 +45844 +45844 +45845 +45845 +45845 +45846 +45846 +45846 +45847 +45847 +45848 +45848 +45848 +45849 +45849 +45849 +45850 +45850 +45850 +45851 +45851 +45852 +45852 +45852 +45853 +45853 +45853 +45854 +45854 +45855 +45855 +45855 +45856 +45856 +45856 +45857 +45857 +45857 +45858 +45858 +45859 +45859 +45859 +45860 +45860 +45860 +45861 +45861 +45861 +45862 +45862 +45863 +45863 +45863 +45864 +45864 +45864 +45865 +45865 +45865 +45866 +45866 +45867 +45867 +45867 +45868 +45868 +45868 +45869 +45869 +45869 +45870 +45870 +45870 +45871 +45871 +45872 +45872 +45872 +45873 +45873 +45873 +45874 +45874 +45874 +45875 +45875 +45876 +45876 +45876 +45877 +45877 +45877 +45878 +45878 +45878 +45879 +45879 +45879 +45880 +45880 +45880 +45881 +45881 +45882 +45882 +45882 +45883 +45883 +45883 +45884 +45884 +45884 +45885 +45885 +45885 +45886 +45886 +45886 +45887 +45887 +45888 +45888 +45888 +45889 +45889 +45889 +45890 +45890 +45890 +45891 +45891 +45891 +45892 +45892 +45892 +45893 +45893 +45894 +45894 +45894 +45895 +45895 +45895 +45896 +45896 +45896 +45897 +45897 +45897 +45898 +45898 +45898 +45899 +45899 +45899 +45900 +45900 +45900 +45901 +45901 +45902 +45902 +45902 +45903 +45903 +45903 +45904 +45904 +45904 +45905 +45905 +45905 +45906 +45906 +45906 +45907 +45907 +45907 +45908 +45908 +45908 +45909 +45909 +45909 +45910 +45910 +45910 +45911 +45911 +45912 +45912 +45912 +45913 +45913 +45913 +45914 +45914 +45914 +45915 +45915 +45915 +45916 +45916 +45916 +45917 +45917 +45917 +45918 +45918 +45918 +45919 +45919 +45919 +45920 +45920 +45920 +45921 +45921 +45921 +45922 +45922 +45922 +45923 +45923 +45923 +45924 +45924 +45924 +45925 +45925 +45925 +45926 +45926 +45926 +45927 +45927 +45927 +45928 +45928 +45928 +45929 +45929 +45929 +45930 +45930 +45930 +45931 +45931 +45931 +45932 +45932 +45932 +45933 +45933 +45933 +45934 +45934 +45934 +45935 +45935 +45935 +45936 +45936 +45936 +45937 +45937 +45937 +45938 +45938 +45938 +45939 +45939 +45939 +45940 +45940 +45940 +45941 +45941 +45941 +45942 +45942 +45942 +45943 +45943 +45943 +45944 +45944 +45944 +45945 +45945 +45945 +45946 +45946 +45946 +45947 +45947 +45947 +45948 +45948 +45948 +45949 +45949 +45949 +45950 +45950 +45950 +45951 +45951 +45951 +45952 +45952 +45952 +45953 +45953 +45953 +45954 +45954 +45954 +45955 +45955 +45955 +45956 +45956 +45956 +45957 +45957 +45957 +45958 +45958 +45958 +45958 +45959 +45959 +45959 +45960 +45960 +45960 +45961 +45961 +45961 +45962 +45962 +45962 +45963 +45963 +45963 +45964 +45964 +45964 +45965 +45965 +45965 +45966 +45966 +45966 +45967 +45967 +45967 +45968 +45968 +45968 +45968 +45969 +45969 +45969 +45970 +45970 +45970 +45971 +45971 +45971 +45972 +45972 +45972 +45973 +45973 +45973 +45974 +45974 +45974 +45975 +45975 +45975 +45976 +45976 +45976 +45976 +45977 +45977 +45977 +45978 +45978 +45978 +45979 +45979 +45979 +45980 +45980 +45980 +45981 +45981 +45981 +45982 +45982 +45982 +45983 +45983 +45983 +45983 +45984 +45984 +45984 +45985 +45985 +45985 +45986 +45986 +45986 +45987 +45987 +45987 +45988 +45988 +45988 +45988 +45989 +45989 +45989 +45990 +45990 +45990 +45991 +45991 +45991 +45992 +45992 +45992 +45993 +45993 +45993 +45994 +45994 +45994 +45994 +45995 +45995 +45995 +45996 +45996 +45996 +45997 +45997 +45997 +45998 +45998 +45998 +45998 +45999 +45999 +45999 +46000 +46000 +46000 +46001 +46001 +46001 +46002 +46002 +46002 +46003 +46003 +46003 +46003 +46004 +46004 +46004 +46005 +46005 +46005 +46006 +46006 +46006 +46007 +46007 +46007 +46007 +46008 +46008 +46008 +46009 +46009 +46009 +46010 +46010 +46010 +46011 +46011 +46011 +46011 +46012 +46012 +46012 +46013 +46013 +46013 +46014 +46014 +46014 +46015 +46015 +46015 +46015 +46016 +46016 +46016 +46017 +46017 +46017 +46018 +46018 +46018 +46018 +46019 +46019 +46019 +46020 +46020 +46020 +46021 +46021 +46021 +46022 +46022 +46022 +46022 +46023 +46023 +46023 +46024 +46024 +46024 +46025 +46025 +46025 +46025 +46026 +46026 +46026 +46027 +46027 +46027 +46028 +46028 +46028 +46028 +46029 +46029 +46029 +46030 +46030 +46030 +46031 +46031 +46031 +46031 +46032 +46032 +46032 +46033 +46033 +46033 +46034 +46034 +46034 +46034 +46035 +46035 +46035 +46036 +46036 +46036 +46037 +46037 +46037 +46037 +46038 +46038 +46038 +46039 +46039 +46039 +46040 +46040 +46040 +46040 +46041 +46041 +46041 +46042 +46042 +46042 +46043 +46043 +46043 +46043 +46044 +46044 +46044 +46045 +46045 +46045 +46045 +46046 +46046 +46046 +46047 +46047 +46047 +46048 +46048 +46048 +46048 +46049 +46049 +46049 +46050 +46050 +46050 +46051 +46051 +46051 +46051 +46052 +46052 +46052 +46053 +46053 +46053 +46053 +46054 +46054 +46054 +46055 +46055 +46055 +46056 +46056 +46056 +46056 +46057 +46057 +46057 +46058 +46058 +46058 +46058 +46059 +46059 +46059 +46060 +46060 +46060 +46060 +46061 +46061 +46061 +46062 +46062 +46062 +46063 +46063 +46063 +46063 +46064 +46064 +46064 +46065 +46065 +46065 +46065 +46066 +46066 +46066 +46067 +46067 +46067 +46067 +46068 +46068 +46068 +46069 +46069 +46069 +46069 +46070 +46070 +46070 +46071 +46071 +46071 +46071 +46072 +46072 +46072 +46073 +46073 +46073 +46074 +46074 +46074 +46074 +46075 +46075 +46075 +46076 +46076 +46076 +46076 +46077 +46077 +46077 +46078 +46078 +46078 +46078 +46079 +46079 +46079 +46080 +46080 +46080 +46080 +46080 +46080 +46081 +46081 +46081 +46081 +46081 +46081 +46081 +46082 +46082 +46082 +46082 +46082 +46082 +46082 +46083 +46083 +46083 +46083 +46083 +46083 +46083 +46084 +46084 +46084 +46084 +46084 +46084 +46084 +46085 +46085 +46085 +46085 +46085 +46085 +46085 +46086 +46086 +46086 +46086 +46086 +46086 +46086 +46087 +46087 +46087 +46087 +46087 +46087 +46087 +46088 +46088 +46088 +46088 +46088 +46088 +46088 +46089 +46089 +46089 +46089 +46089 +46089 +46089 +46090 +46090 +46090 +46090 +46090 +46090 +46090 +46091 +46091 +46091 +46091 +46091 +46091 +46091 +46091 +46092 +46092 +46092 +46092 +46092 +46092 +46092 +46093 +46093 +46093 +46093 +46093 +46093 +46093 +46094 +46094 +46094 +46094 +46094 +46094 +46094 +46095 +46095 +46095 +46095 +46095 +46095 +46095 +46096 +46096 +46096 +46096 +46096 +46096 +46097 +46097 +46097 +46098 +46098 +46098 +46098 +46099 +46099 +46099 +46100 +46100 +46100 +46100 +46101 +46101 +46101 +46101 +46102 +46102 +46102 +46103 +46103 +46103 +46103 +46104 +46104 +46104 +46104 +46105 +46105 +46105 +46106 +46106 +46106 +46106 +46107 +46107 +46107 +46107 +46108 +46108 +46108 +46109 +46109 +46109 +46109 +46110 +46110 +46110 +46110 +46111 +46111 +46111 +46112 +46112 +46112 +46112 +46113 +46113 +46113 +46113 +46114 +46114 +46114 +46114 +46115 +46115 +46115 +46116 +46116 +46116 +46116 +46117 +46117 +46117 +46117 +46118 +46118 +46118 +46118 +46119 +46119 +46119 +46120 +46120 +46120 +46120 +46121 +46121 +46121 +46121 +46122 +46122 +46122 +46122 +46123 +46123 +46123 +46123 +46124 +46124 +46124 +46125 +46125 +46125 +46125 +46126 +46126 +46126 +46126 +46127 +46127 +46127 +46127 +46128 +46128 +46128 +46128 +46129 +46129 +46129 +46129 +46130 +46130 +46130 +46131 +46131 +46131 +46131 +46132 +46132 +46132 +46132 +46133 +46133 +46133 +46133 +46134 +46134 +46134 +46134 +46135 +46135 +46135 +46135 +46136 +46136 +46136 +46136 +46137 +46137 +46137 +46137 +46138 +46138 +46138 +46139 +46139 +46139 +46139 +46140 +46140 +46140 +46140 +46141 +46141 +46141 +46141 +46142 +46142 +46142 +46142 +46143 +46143 +46143 +46143 +46144 +46144 +46144 +46144 +46145 +46145 +46145 +46145 +46146 +46146 +46146 +46146 +46147 +46147 +46147 +46147 +46148 +46148 +46148 +46148 +46149 +46149 +46149 +46149 +46150 +46150 +46150 +46150 +46151 +46151 +46151 +46151 +46152 +46152 +46152 +46152 +46153 +46153 +46153 +46153 +46154 +46154 +46154 +46154 +46155 +46155 +46155 +46155 +46156 +46156 +46156 +46156 +46157 +46157 +46157 +46157 +46158 +46158 +46158 +46158 +46159 +46159 +46159 +46159 +46160 +46160 +46160 +46160 +46161 +46161 +46161 +46161 +46162 +46162 +46162 +46162 +46163 +46163 +46163 +46163 +46164 +46164 +46164 +46164 +46164 +46165 +46165 +46165 +46165 +46166 +46166 +46166 +46166 +46167 +46167 +46167 +46167 +46168 +46168 +46168 +46168 +46169 +46169 +46169 +46169 +46170 +46170 +46170 +46170 +46171 +46171 +46171 +46171 +46172 +46172 +46172 +46172 +46172 +46173 +46173 +46173 +46173 +46174 +46174 +46174 +46174 +46175 +46175 +46175 +46175 +46176 +46176 +46176 +46176 +46177 +46177 +46177 +46177 +46178 +46178 +46178 +46178 +46178 +46179 +46179 +46179 +46179 +46180 +46180 +46180 +46180 +46181 +46181 +46181 +46181 +46182 +46182 +46182 +46182 +46183 +46183 +46183 +46183 +46183 +46184 +46184 +46184 +46184 +46185 +46185 +46185 +46185 +46186 +46186 +46186 +46186 +46187 +46187 +46187 +46187 +46187 +46188 +46188 +46188 +46188 +46189 +46189 +46189 +46189 +46190 +46190 +46190 +46190 +46191 +46191 +46191 +46191 +46191 +46192 +46192 +46192 +46192 +46193 +46193 +46193 +46193 +46194 +46194 +46194 +46194 +46194 +46195 +46195 +46195 +46195 +46196 +46196 +46196 +46196 +46197 +46197 +46197 +46197 +46197 +46198 +46198 +46198 +46198 +46199 +46199 +46199 +46199 +46200 +46200 +46200 +46200 +46200 +46201 +46201 +46201 +46201 +46202 +46202 +46202 +46202 +46203 +46203 +46203 +46203 +46203 +46204 +46204 +46204 +46204 +46205 +46205 +46205 +46205 +46205 +46206 +46206 +46206 +46206 +46207 +46207 +46207 +46207 +46208 +46208 +46208 +46208 +46208 +46209 +46209 +46209 +46209 +46210 +46210 +46210 +46210 +46210 +46211 +46211 +46211 +46211 +46212 +46212 +46212 +46212 +46213 +46213 +46213 +46213 +46213 +46214 +46214 +46214 +46214 +46215 +46215 +46215 +46215 +46215 +46216 +46216 +46216 +46216 +46217 +46217 +46217 +46217 +46217 +46218 +46218 +46218 +46218 +46219 +46219 +46219 +46219 +46219 +46220 +46220 +46220 +46220 +46221 +46221 +46221 +46221 +46221 +46222 +46222 +46222 +46222 +46223 +46223 +46223 +46223 +46223 +46224 +46224 +46224 +46224 +46225 +46225 +46225 +46225 +46225 +46226 +46226 +46226 +46226 +46227 +46227 +46227 +46227 +46227 +46228 +46228 +46228 +46228 +46229 +46229 +46229 +46229 +46229 +46230 +46230 +46230 +46230 +46230 +46231 +46231 +46231 +46231 +46232 +46232 +46232 +46232 +46232 +46233 +46233 +46233 +46233 +46234 +46234 +46234 +46234 +46234 +46235 +46235 +46235 +46235 +46235 +46236 +46236 +46236 +46236 +46237 +46237 +46237 +46237 +46237 +46238 +46238 +46238 +46238 +46239 +46239 +46239 +46239 +46239 +46240 +46240 +46240 +46240 +46240 +46241 +46241 +46241 +46241 +46242 +46242 +46242 +46242 +46242 +46243 +46243 +46243 +46243 +46243 +46244 +46244 +46244 +46244 +46245 +46245 +46245 +46245 +46245 +46246 +46246 +46246 +46246 +46246 +46247 +46247 +46247 +46247 +46248 +46248 +46248 +46248 +46248 +46249 +46249 +46249 +46249 +46249 +46250 +46250 +46250 +46250 +46251 +46251 +46251 +46251 +46251 +46252 +46252 +46252 +46252 +46252 +46253 +46253 +46253 +46253 +46253 +46254 +46254 +46254 +46254 +46255 +46255 +46255 +46255 +46255 +46256 +46256 +46256 +46256 +46256 +46257 +46257 +46257 +46257 +46257 +46258 +46258 +46258 +46258 +46259 +46259 +46259 +46259 +46259 +46260 +46260 +46260 +46260 +46260 +46261 +46261 +46261 +46261 +46261 +46262 +46262 +46262 +46262 +46262 +46263 +46263 +46263 +46263 +46264 +46264 +46264 +46264 +46264 +46265 +46265 +46265 +46265 +46265 +46266 +46266 +46266 +46266 +46266 +46267 +46267 +46267 +46267 +46267 +46268 +46268 +46268 +46268 +46268 +46269 +46269 +46269 +46269 +46270 +46270 +46270 +46270 +46270 +46271 +46271 +46271 +46271 +46271 +46272 +46272 +46272 +46272 +46272 +46273 +46273 +46273 +46273 +46273 +46274 +46274 +46274 +46274 +46274 +46275 +46275 +46275 +46275 +46275 +46276 +46276 +46276 +46276 +46276 +46277 +46277 +46277 +46277 +46277 +46278 +46278 +46278 +46278 +46278 +46279 +46279 +46279 +46279 +46280 +46280 +46280 +46280 +46280 +46281 +46281 +46281 +46281 +46281 +46282 +46282 +46282 +46282 +46282 +46283 +46283 +46283 +46283 +46283 +46284 +46284 +46284 +46284 +46284 +46285 +46285 +46285 +46285 +46285 +46286 +46286 +46286 +46286 +46286 +46287 +46287 +46287 +46287 +46287 +46288 +46288 +46288 +46288 +46288 +46289 +46289 +46289 +46289 +46289 +46290 +46290 +46290 +46290 +46290 +46291 +46291 +46291 +46291 +46291 +46292 +46292 +46292 +46292 +46292 +46293 +46293 +46293 +46293 +46293 +46294 +46294 +46294 +46294 +46294 +46295 +46295 +46295 +46295 +46295 +46296 +46296 +46296 +46296 +46296 +46297 +46297 +46297 +46297 +46297 +46298 +46298 +46298 +46298 +46298 +46298 +46299 +46299 +46299 +46299 +46299 +46300 +46300 +46300 +46300 +46300 +46301 +46301 +46301 +46301 +46301 +46302 +46302 +46302 +46302 +46302 +46303 +46303 +46303 +46303 +46303 +46304 +46304 +46304 +46304 +46304 +46305 +46305 +46305 +46305 +46305 +46306 +46306 +46306 +46306 +46306 +46307 +46307 +46307 +46307 +46307 +46307 +46308 +46308 +46308 +46308 +46308 +46309 +46309 +46309 +46309 +46309 +46310 +46310 +46310 +46310 +46310 +46311 +46311 +46311 +46311 +46311 +46312 +46312 +46312 +46312 +46312 +46313 +46313 +46313 +46313 +46313 +46314 +46314 +46314 +46314 +46314 +46314 +46315 +46315 +46315 +46315 +46315 +46316 +46316 +46316 +46316 +46316 +46317 +46317 +46317 +46317 +46317 +46318 +46318 +46318 +46318 +46318 +46318 +46319 +46319 +46319 +46319 +46319 +46320 +46320 +46320 +46320 +46320 +46321 +46321 +46321 +46321 +46321 +46322 +46322 +46322 +46322 +46322 +46323 +46323 +46323 +46323 +46323 +46323 +46324 +46324 +46324 +46324 +46324 +46325 +46325 +46325 +46325 +46325 +46326 +46326 +46326 +46326 +46326 +46326 +46327 +46327 +46327 +46328 +46328 +46329 +46329 +46329 +46330 +46330 +46330 +46331 +46331 +46332 +46332 +46332 +46333 +46333 +46333 +46334 +46334 +46335 +46335 +46335 +46336 +46336 +46336 +46337 +46337 +46338 +46338 +46338 +46339 +46339 +46339 +46340 +46340 +46341 +46341 +46341 +46342 +46342 +46342 +46343 +46343 +46344 +46344 +46344 +46345 +46345 +46345 +46346 +46346 +46346 +46347 +46347 +46348 +46348 +46348 +46349 +46349 +46349 +46350 +46350 +46350 +46351 +46351 +46352 +46352 +46352 +46353 +46353 +46353 +46354 +46354 +46355 +46355 +46355 +46356 +46356 +46356 +46357 +46357 +46357 +46358 +46358 +46358 +46359 +46359 +46360 +46360 +46360 +46361 +46361 +46361 +46362 +46362 +46362 +46363 +46363 +46364 +46364 +46364 +46365 +46365 +46365 +46366 +46366 +46366 +46367 +46367 +46367 +46368 +46368 +46369 +46369 +46369 +46370 +46370 +46370 +46371 +46371 +46371 +46372 +46372 +46372 +46373 +46373 +46374 +46374 +46374 +46375 +46375 +46375 +46376 +46376 +46376 +46377 +46377 +46377 +46378 +46378 +46378 +46379 +46379 +46380 +46380 +46380 +46381 +46381 +46381 +46382 +46382 +46382 +46383 +46383 +46383 +46384 +46384 +46384 +46385 +46385 +46386 +46386 +46386 +46387 +46387 +46387 +46388 +46388 +46388 +46389 +46389 +46389 +46390 +46390 +46390 +46391 +46391 +46391 +46392 +46392 +46392 +46393 +46393 +46393 +46394 +46394 +46395 +46395 +46395 +46396 +46396 +46396 +46397 +46397 +46397 +46398 +46398 +46398 +46399 +46399 +46399 +46400 +46400 +46400 +46401 +46401 +46401 +46402 +46402 +46402 +46403 +46403 +46403 +46404 +46404 +46404 +46405 +46405 +46405 +46406 +46406 +46407 +46407 +46407 +46408 +46408 +46408 +46409 +46409 +46409 +46410 +46410 +46410 +46411 +46411 +46411 +46412 +46412 +46412 +46413 +46413 +46413 +46414 +46414 +46414 +46415 +46415 +46415 +46416 +46416 +46416 +46417 +46417 +46417 +46418 +46418 +46418 +46419 +46419 +46419 +46420 +46420 +46420 +46421 +46421 +46421 +46422 +46422 +46422 +46423 +46423 +46423 +46424 +46424 +46424 +46425 +46425 +46425 +46426 +46426 +46426 +46427 +46427 +46427 +46428 +46428 +46428 +46429 +46429 +46429 +46430 +46430 +46430 +46431 +46431 +46431 +46432 +46432 +46432 +46433 +46433 +46433 +46434 +46434 +46434 +46435 +46435 +46435 +46436 +46436 +46436 +46436 +46437 +46437 +46437 +46438 +46438 +46438 +46439 +46439 +46439 +46440 +46440 +46440 +46441 +46441 +46441 +46442 +46442 +46442 +46443 +46443 +46443 +46444 +46444 +46444 +46445 +46445 +46445 +46446 +46446 +46446 +46447 +46447 +46447 +46448 +46448 +46448 +46448 +46449 +46449 +46449 +46450 +46450 +46450 +46451 +46451 +46451 +46452 +46452 +46452 +46453 +46453 +46453 +46454 +46454 +46454 +46455 +46455 +46455 +46456 +46456 +46456 +46456 +46457 +46457 +46457 +46458 +46458 +46458 +46459 +46459 +46459 +46460 +46460 +46460 +46461 +46461 +46461 +46462 +46462 +46462 +46463 +46463 +46463 +46463 +46464 +46464 +46464 +46465 +46465 +46465 +46466 +46466 +46466 +46467 +46467 +46467 +46468 +46468 +46468 +46469 +46469 +46469 +46469 +46470 +46470 +46470 +46471 +46471 +46471 +46472 +46472 +46472 +46473 +46473 +46473 +46474 +46474 +46474 +46474 +46475 +46475 +46475 +46476 +46476 +46476 +46477 +46477 +46477 +46478 +46478 +46478 +46479 +46479 +46479 +46479 +46480 +46480 +46480 +46481 +46481 +46481 +46482 +46482 +46482 +46483 +46483 +46483 +46483 +46484 +46484 +46484 +46485 +46485 +46485 +46486 +46486 +46486 +46487 +46487 +46487 +46487 +46488 +46488 +46488 +46489 +46489 +46489 +46490 +46490 +46490 +46491 +46491 +46491 +46491 +46492 +46492 +46492 +46493 +46493 +46493 +46494 +46494 +46494 +46494 +46495 +46495 +46495 +46496 +46496 +46496 +46497 +46497 +46497 +46498 +46498 +46498 +46498 +46499 +46499 +46499 +46500 +46500 +46500 +46501 +46501 +46501 +46501 +46502 +46502 +46502 +46503 +46503 +46503 +46504 +46504 +46504 +46504 +46505 +46505 +46505 +46506 +46506 +46506 +46507 +46507 +46507 +46507 +46508 +46508 +46508 +46509 +46509 +46509 +46510 +46510 +46510 +46510 +46511 +46511 +46511 +46512 +46512 +46512 +46513 +46513 +46513 +46513 +46514 +46514 +46514 +46515 +46515 +46515 +46516 +46516 +46516 +46516 +46517 +46517 +46517 +46518 +46518 +46518 +46518 +46519 +46519 +46519 +46520 +46520 +46520 +46521 +46521 +46521 +46521 +46522 +46522 +46522 +46523 +46523 +46523 +46524 +46524 +46524 +46524 +46525 +46525 +46525 +46526 +46526 +46526 +46526 +46527 +46527 +46527 +46528 +46528 +46528 +46528 +46529 +46529 +46529 +46530 +46530 +46530 +46531 +46531 +46531 +46531 +46532 +46532 +46532 +46533 +46533 +46533 +46533 +46534 +46534 +46534 +46535 +46535 +46535 +46535 +46536 +46536 +46536 +46537 +46537 +46537 +46538 +46538 +46538 +46538 +46539 +46539 +46539 +46540 +46540 +46540 +46540 +46541 +46541 +46541 +46542 +46542 +46542 +46542 +46543 +46543 +46543 +46544 +46544 +46544 +46544 +46545 +46545 +46545 +46546 +46546 +46546 +46546 +46547 +46547 +46547 +46548 +46548 +46548 +46548 +46549 +46549 +46549 +46550 +46550 +46550 +46550 +46551 +46551 +46551 +46552 +46552 +46552 +46552 +46553 +46553 +46553 +46554 +46554 +46554 +46554 +46555 +46555 +46555 +46556 +46556 +46556 +46556 +46557 +46557 +46557 +46558 +46558 +46558 +46558 +46559 +46559 +46559 +46560 +46560 +46560 +46560 +46561 +46561 +46561 +46562 +46562 +46562 +46562 +46563 +46563 +46563 +46563 +46564 +46564 +46564 +46565 +46565 +46565 +46565 +46566 +46566 +46566 +46567 +46567 +46567 +46567 +46568 +46568 +46568 +46569 +46569 +46569 +46569 +46570 +46570 +46570 +46570 +46571 +46571 +46571 +46572 +46572 +46572 +46572 +46573 +46573 +46573 +46574 +46574 +46574 +46574 +46575 +46575 +46575 +46575 +46576 +46576 +46576 +46577 +46577 +46577 +46577 +46578 +46578 +46578 +46579 +46579 +46579 +46579 +46580 +46580 +46580 +46580 +46581 +46581 +46581 +46582 +46582 +46582 +46582 +46583 +46583 +46583 +46584 +46584 +46584 +46584 +46585 +46585 +46585 +46585 +46586 +46586 +46586 +46587 +46587 +46587 +46587 +46588 +46588 +46588 +46588 +46589 +46589 +46589 +46590 +46590 +46590 +46590 +46591 +46591 +46591 +46591 +46592 +46592 +46592 +46593 +46593 +46593 +46593 +46594 +46594 +46594 +46594 +46595 +46595 +46595 +46596 +46596 +46596 +46596 +46597 +46597 +46597 +46597 +46598 +46598 +46598 +46599 +46599 +46599 +46599 +46600 +46600 +46600 +46600 +46601 +46601 +46601 +46601 +46602 +46602 +46602 +46603 +46603 +46603 +46603 +46604 +46604 +46604 +46604 +46605 +46605 +46605 +46606 +46606 +46606 +46606 +46607 +46607 +46607 +46607 +46608 +46608 +46608 +46608 +46609 +46609 +46609 +46610 +46610 +46610 +46610 +46611 +46611 +46611 +46611 +46612 +46612 +46612 +46612 +46613 +46613 +46613 +46614 +46614 +46614 +46614 +46615 +46615 +46615 +46615 +46616 +46616 +46616 +46616 +46617 +46617 +46617 +46618 +46618 +46618 +46618 +46619 +46619 +46619 +46619 +46620 +46620 +46620 +46620 +46621 +46621 +46621 +46621 +46622 +46622 +46622 +46623 +46623 +46623 +46623 +46624 +46624 +46624 +46624 +46625 +46625 +46625 +46625 +46626 +46626 +46626 +46626 +46627 +46627 +46627 +46628 +46628 +46628 +46628 +46629 +46629 +46629 +46629 +46630 +46630 +46630 +46630 +46631 +46631 +46631 +46631 +46632 +46632 +46632 +46633 +46633 +46633 +46633 +46634 +46634 +46634 +46634 +46635 +46635 +46635 +46635 +46636 +46636 +46636 +46636 +46637 +46637 +46637 +46637 +46638 +46638 +46638 +46639 +46639 +46639 +46639 +46640 +46640 +46640 +46640 +46641 +46641 +46641 +46641 +46642 +46642 +46642 +46643 +46643 +46644 +46644 +46645 +46645 +46646 +46647 +46647 +46648 +46648 +46649 +46649 +46650 +46650 +46651 +46651 +46652 +46652 +46653 +46653 +46654 +46654 +46655 +46655 +46656 +46656 +46657 +46657 +46658 +46658 +46659 +46659 +46660 +46660 +46661 +46661 +46662 +46662 +46663 +46663 +46664 +46664 +46665 +46665 +46666 +46666 +46667 +46667 +46668 +46668 +46669 +46669 +46670 +46670 +46671 +46671 +46672 +46672 +46673 +46673 +46674 +46674 +46675 +46675 +46676 +46676 +46677 +46677 +46678 +46678 +46679 +46679 +46680 +46680 +46681 +46681 +46682 +46682 +46683 +46683 +46684 +46684 +46685 +46685 +46686 +46686 +46687 +46687 +46688 +46688 +46689 +46689 +46690 +46690 +46691 +46691 +46692 +46692 +46693 +46693 +46694 +46694 +46695 +46695 +46696 +46696 +46697 +46697 +46698 +46698 +46699 +46699 +46700 +46700 +46701 +46701 +46702 +46702 +46702 +46703 +46703 +46704 +46704 +46705 +46705 +46706 +46706 +46707 +46707 +46708 +46708 +46709 +46709 +46710 +46710 +46711 +46711 +46712 +46712 +46713 +46713 +46714 +46714 +46715 +46715 +46716 +46716 +46716 +46717 +46717 +46718 +46718 +46719 +46719 +46720 +46720 +46721 +46721 +46722 +46722 +46723 +46723 +46724 +46724 +46725 +46725 +46726 +46726 +46727 +46727 +46727 +46728 +46728 +46729 +46729 +46730 +46730 +46731 +46731 +46732 +46732 +46733 +46733 +46734 +46734 +46735 +46735 +46735 +46736 +46736 +46737 +46737 +46738 +46738 +46739 +46739 +46740 +46740 +46741 +46741 +46742 +46742 +46743 +46743 +46743 +46744 +46744 +46745 +46745 +46746 +46746 +46747 +46747 +46748 +46748 +46749 +46749 +46750 +46750 +46750 +46751 +46751 +46752 +46752 +46753 +46753 +46754 +46754 +46755 +46755 +46756 +46756 +46756 +46757 +46757 +46758 +46758 +46759 +46759 +46760 +46760 +46761 +46761 +46762 +46762 +46762 +46763 +46763 +46764 +46764 +46765 +46765 +46766 +46766 +46767 +46767 +46767 +46768 +46768 +46769 +46769 +46770 +46770 +46771 +46771 +46772 +46772 +46772 +46773 +46773 +46774 +46774 +46775 +46775 +46776 +46776 +46777 +46777 +46777 +46778 +46778 +46779 +46779 +46780 +46780 +46781 +46781 +46782 +46782 +46782 +46783 +46783 +46784 +46784 +46785 +46785 +46786 +46786 +46786 +46787 +46787 +46788 +46788 +46789 +46789 +46790 +46790 +46791 +46791 +46791 +46792 +46792 +46793 +46793 +46794 +46794 +46795 +46795 +46795 +46796 +46796 +46797 +46797 +46798 +46798 +46799 +46799 +46799 +46800 +46800 +46801 +46801 +46802 +46802 +46803 +46803 +46803 +46804 +46804 +46805 +46805 +46806 +46806 +46806 +46807 +46807 +46808 +46808 +46809 +46809 +46810 +46810 +46810 +46811 +46811 +46812 +46812 +46813 +46813 +46814 +46814 +46814 +46815 +46815 +46816 +46816 +46817 +46817 +46817 +46818 +46818 +46819 +46819 +46820 +46820 +46821 +46821 +46821 +46822 +46822 +46823 +46823 +46824 +46824 +46824 +46825 +46825 +46826 +46826 +46827 +46827 +46827 +46828 +46828 +46829 +46829 +46830 +46830 +46830 +46831 +46831 +46832 +46832 +46833 +46833 +46833 +46834 +46834 +46835 +46835 +46836 +46836 +46836 +46837 +46837 +46838 +46838 +46839 +46839 +46839 +46840 +46840 +46841 +46841 +46842 +46842 +46842 +46843 +46843 +46844 +46844 +46845 +46845 +46845 +46846 +46846 +46847 +46847 +46848 +46848 +46848 +46849 +46849 +46850 +46850 +46851 +46851 +46851 +46852 +46852 +46853 +46853 +46853 +46854 +46854 +46855 +46855 +46856 +46856 +46856 +46857 +46857 +46858 +46858 +46859 +46859 +46859 +46860 +46860 +46861 +46861 +46861 +46862 +46862 +46863 +46863 +46864 +46864 +46864 +46865 +46865 +46866 +46866 +46867 +46867 +46867 +46868 +46868 +46869 +46869 +46869 +46870 +46870 +46871 +46871 +46872 +46872 +46872 +46873 +46873 +46874 +46874 +46874 +46875 +46875 +46876 +46876 +46876 +46877 +46877 +46878 +46878 +46879 +46879 +46879 +46880 +46880 +46881 +46881 +46881 +46882 +46882 +46883 +46883 +46884 +46884 +46884 +46885 +46885 +46886 +46886 +46886 +46887 +46887 +46888 +46888 +46888 +46889 +46889 +46890 +46890 +46890 +46891 +46891 +46892 +46892 +46893 +46893 +46893 +46894 +46894 +46895 +46895 +46895 +46896 +46896 +46897 +46897 +46897 +46898 +46898 +46899 +46899 +46899 +46900 +46900 +46901 +46901 +46901 +46902 +46902 +46903 +46903 +46903 +46904 +46904 +46905 +46905 +46906 +46906 +46906 +46907 +46907 +46908 +46908 +46908 +46909 +46909 +46910 +46910 +46910 +46911 +46911 +46912 +46912 +46912 +46913 +46913 +46914 +46914 +46914 +46915 +46915 +46916 +46916 +46916 +46917 +46917 +46918 +46918 +46918 +46919 +46919 +46920 +46920 +46920 +46921 +46921 +46922 +46922 +46922 +46923 +46923 +46924 +46924 +46924 +46925 +46925 +46926 +46926 +46926 +46927 +46927 +46928 +46928 +46928 +46929 +46929 +46929 +46930 +46930 +46931 +46931 +46931 +46932 +46932 +46933 +46933 +46933 +46934 +46934 +46935 +46935 +46935 +46936 +46936 +46937 +46937 +46937 +46938 +46938 +46939 +46939 +46939 +46940 +46940 +46941 +46941 +46941 +46942 +46942 +46942 +46943 +46943 +46944 +46944 +46944 +46945 +46945 +46946 +46946 +46946 +46947 +46947 +46948 +46948 +46948 +46949 +46949 +46949 +46950 +46950 +46951 +46951 +46951 +46952 +46952 +46953 +46953 +46953 +46954 +46954 +46955 +46955 +46955 +46956 +46956 +46956 +46957 +46957 +46958 +46958 +46958 +46959 +46959 +46960 +46960 +46960 +46961 +46961 +46962 +46962 +46962 +46963 +46963 +46963 +46964 +46964 +46965 +46965 +46965 +46966 +46966 +46966 +46967 +46967 +46968 +46968 +46968 +46969 +46969 +46970 +46970 +46970 +46971 +46971 +46971 +46972 +46972 +46973 +46973 +46973 +46974 +46974 +46975 +46975 +46975 +46976 +46976 +46976 +46977 +46977 +46978 +46978 +46978 +46979 +46979 +46979 +46980 +46980 +46981 +46981 +46981 +46982 +46982 +46983 +46983 +46983 +46984 +46984 +46984 +46985 +46985 +46986 +46986 +46986 +46987 +46987 +46987 +46988 +46988 +46989 +46989 +46989 +46990 +46990 +46990 +46991 +46991 +46992 +46992 +46992 +46993 +46993 +46993 +46994 +46994 +46995 +46995 +46995 +46996 +46996 +46996 +46997 +46997 +46998 +46998 +46998 +46999 +46999 +46999 +47000 +47000 +47001 +47001 +47001 +47002 +47002 +47002 +47003 +47003 +47004 +47004 +47004 +47005 +47005 +47005 +47006 +47006 +47007 +47007 +47007 +47008 +47008 +47008 +47009 +47009 +47009 +47010 +47010 +47011 +47011 +47011 +47012 +47012 +47012 +47013 +47013 +47014 +47014 +47014 +47015 +47015 +47015 +47016 +47016 +47017 +47017 +47017 +47018 +47018 +47018 +47019 +47019 +47019 +47020 +47020 +47021 +47021 +47021 +47022 +47022 +47022 +47023 +47023 +47024 +47024 +47024 +47025 +47025 +47025 +47026 +47026 +47026 +47027 +47027 +47028 +47028 +47028 +47029 +47029 +47029 +47030 +47030 +47030 +47031 +47031 +47032 +47032 +47032 +47033 +47033 +47033 +47034 +47034 +47034 +47035 +47035 +47036 +47036 +47036 +47037 +47037 +47037 +47038 +47038 +47038 +47039 +47039 +47040 +47040 +47040 +47041 +47041 +47041 +47042 +47042 +47042 +47043 +47043 +47044 +47044 +47044 +47045 +47045 +47045 +47046 +47046 +47046 +47047 +47047 +47047 +47048 +47048 +47049 +47049 +47049 +47050 +47050 +47050 +47051 +47051 +47051 +47052 +47052 +47053 +47053 +47053 +47054 +47054 +47054 +47055 +47055 +47055 +47056 +47056 +47056 +47057 +47057 +47058 +47058 +47058 +47059 +47059 +47059 +47060 +47060 +47060 +47061 +47061 +47061 +47062 +47062 +47063 +47063 +47063 +47064 +47064 +47064 +47065 +47065 +47065 +47066 +47066 +47066 +47067 +47067 +47067 +47068 +47068 +47069 +47069 +47069 +47070 +47070 +47070 +47071 +47071 +47071 +47072 +47072 +47072 +47073 +47074 +47075 +47075 +47076 +47077 +47077 +47078 +47079 +47079 +47080 +47081 +47082 +47082 +47083 +47084 +47084 +47085 +47086 +47086 +47087 +47088 +47089 +47089 +47090 +47091 +47091 +47092 +47093 +47093 +47094 +47095 +47096 +47096 +47097 +47098 +47098 +47099 +47100 +47100 +47101 +47102 +47102 +47103 +47104 +47104 +47105 +47105 +47105 +47106 +47106 +47106 +47107 +47107 +47107 +47108 +47108 +47108 +47109 +47109 +47109 +47110 +47110 +47110 +47111 +47111 +47111 +47112 +47112 +47112 +47113 +47113 +47114 +47114 +47114 +47115 +47115 +47115 +47116 +47116 +47116 +47117 +47117 +47117 +47118 +47118 +47118 +47119 +47119 +47119 +47120 +47120 +47120 +47121 +47121 +47121 +47122 +47122 +47122 +47123 +47123 +47123 +47124 +47124 +47124 +47125 +47125 +47125 +47126 +47126 +47126 +47127 +47127 +47127 +47128 +47128 +47128 +47129 +47129 +47129 +47130 +47130 +47130 +47131 +47131 +47131 +47132 +47132 +47132 +47133 +47133 +47133 +47134 +47134 +47134 +47135 +47135 +47135 +47136 +47136 +47136 +47137 +47137 +47137 +47138 +47138 +47138 +47139 +47139 +47139 +47140 +47140 +47140 +47140 +47141 +47141 +47141 +47142 +47142 +47142 +47143 +47143 +47143 +47144 +47144 +47144 +47145 +47145 +47145 +47146 +47146 +47146 +47147 +47147 +47147 +47148 +47148 +47148 +47149 +47149 +47149 +47150 +47150 +47150 +47151 +47151 +47151 +47152 +47152 +47152 +47152 +47153 +47153 +47153 +47154 +47154 +47154 +47155 +47155 +47155 +47156 +47156 +47156 +47157 +47157 +47157 +47158 +47158 +47158 +47159 +47159 +47159 +47160 +47160 +47160 +47160 +47161 +47161 +47161 +47162 +47162 +47162 +47163 +47163 +47163 +47164 +47164 +47164 +47165 +47165 +47165 +47166 +47166 +47166 +47166 +47167 +47167 +47167 +47168 +47168 +47168 +47169 +47169 +47169 +47170 +47170 +47170 +47171 +47171 +47171 +47172 +47172 +47172 +47172 +47173 +47173 +47173 +47174 +47174 +47174 +47175 +47175 +47175 +47176 +47176 +47176 +47177 +47177 +47177 +47177 +47178 +47178 +47178 +47179 +47179 +47179 +47180 +47180 +47180 +47181 +47181 +47181 +47181 +47182 +47182 +47182 +47183 +47183 +47183 +47184 +47184 +47184 +47185 +47185 +47185 +47185 +47186 +47186 +47186 +47187 +47187 +47187 +47188 +47188 +47188 +47189 +47189 +47189 +47189 +47190 +47190 +47190 +47191 +47191 +47191 +47192 +47192 +47192 +47192 +47193 +47193 +47193 +47194 +47194 +47194 +47195 +47195 +47195 +47196 +47196 +47196 +47196 +47197 +47197 +47197 +47198 +47198 +47198 +47199 +47199 +47199 +47199 +47200 +47200 +47200 +47201 +47201 +47201 +47202 +47202 +47202 +47202 +47203 +47203 +47203 +47204 +47204 +47204 +47205 +47205 +47205 +47205 +47206 +47206 +47206 +47207 +47207 +47207 +47208 +47208 +47208 +47208 +47209 +47209 +47209 +47210 +47210 +47210 +47211 +47211 +47211 +47211 +47212 +47212 +47212 +47213 +47213 +47213 +47213 +47214 +47214 +47214 +47215 +47215 +47215 +47216 +47216 +47216 +47216 +47217 +47217 +47217 +47218 +47218 +47218 +47218 +47219 +47219 +47219 +47220 +47220 +47220 +47221 +47221 +47221 +47221 +47222 +47222 +47222 +47223 +47223 +47223 +47223 +47224 +47224 +47224 +47225 +47225 +47225 +47226 +47226 +47226 +47226 +47227 +47227 +47227 +47228 +47228 +47228 +47228 +47229 +47229 +47229 +47230 +47230 +47230 +47230 +47231 +47231 +47231 +47232 +47232 +47232 +47232 +47233 +47233 +47233 +47234 +47234 +47234 +47234 +47235 +47235 +47235 +47236 +47236 +47236 +47237 +47237 +47237 +47237 +47238 +47238 +47238 +47239 +47239 +47239 +47239 +47240 +47240 +47240 +47241 +47241 +47241 +47241 +47242 +47242 +47242 +47243 +47243 +47243 +47243 +47244 +47244 +47244 +47244 +47245 +47245 +47245 +47246 +47246 +47246 +47246 +47247 +47247 +47247 +47248 +47248 +47248 +47248 +47249 +47249 +47249 +47250 +47250 +47250 +47250 +47251 +47251 +47251 +47252 +47252 +47252 +47252 +47253 +47253 +47253 +47254 +47254 +47254 +47254 +47255 +47255 +47255 +47256 +47256 +47256 +47256 +47257 +47257 +47257 +47257 +47258 +47258 +47258 +47259 +47259 +47259 +47259 +47260 +47260 +47260 +47261 +47261 +47261 +47261 +47262 +47262 +47262 +47262 +47263 +47263 +47263 +47264 +47264 +47264 +47264 +47265 +47265 +47265 +47266 +47266 +47266 +47266 +47267 +47267 +47267 +47267 +47268 +47268 +47268 +47269 +47269 +47269 +47269 +47270 +47270 +47270 +47270 +47271 +47271 +47271 +47272 +47272 +47272 +47272 +47273 +47273 +47273 +47274 +47274 +47274 +47274 +47275 +47275 +47275 +47275 +47276 +47276 +47276 +47277 +47277 +47277 +47277 +47278 +47278 +47278 +47278 +47279 +47279 +47279 +47280 +47280 +47280 +47280 +47281 +47281 +47281 +47281 +47282 +47282 +47282 +47282 +47283 +47283 +47283 +47284 +47284 +47284 +47284 +47285 +47285 +47285 +47285 +47286 +47286 +47286 +47287 +47287 +47287 +47287 +47288 +47288 +47288 +47288 +47289 +47289 +47289 +47290 +47290 +47290 +47290 +47291 +47291 +47291 +47291 +47292 +47292 +47292 +47292 +47293 +47293 +47293 +47294 +47294 +47294 +47294 +47295 +47295 +47295 +47295 +47296 +47296 +47296 +47296 +47297 +47297 +47297 +47298 +47298 +47298 +47298 +47299 +47299 +47299 +47299 +47300 +47300 +47300 +47300 +47301 +47301 +47301 +47302 +47302 +47302 +47302 +47303 +47303 +47303 +47303 +47304 +47304 +47304 +47304 +47305 +47305 +47305 +47305 +47306 +47306 +47306 +47307 +47307 +47307 +47307 +47308 +47308 +47308 +47308 +47309 +47309 +47309 +47309 +47310 +47310 +47310 +47310 +47311 +47311 +47311 +47312 +47312 +47312 +47312 +47313 +47313 +47313 +47313 +47314 +47314 +47314 +47314 +47315 +47315 +47315 +47315 +47316 +47316 +47316 +47316 +47317 +47317 +47317 +47318 +47318 +47318 +47318 +47319 +47319 +47319 +47319 +47320 +47320 +47320 +47320 +47321 +47321 +47321 +47321 +47322 +47322 +47322 +47322 +47323 +47323 +47323 +47323 +47324 +47324 +47324 +47324 +47325 +47325 +47325 +47326 +47326 +47326 +47326 +47327 +47327 +47327 +47327 +47328 +47328 +47328 +47328 +47329 +47329 +47329 +47329 +47330 +47330 +47330 +47330 +47331 +47331 +47331 +47331 +47332 +47332 +47332 +47332 +47333 +47333 +47333 +47333 +47334 +47334 +47334 +47334 +47335 +47335 +47335 +47336 +47336 +47336 +47336 +47337 +47337 +47337 +47337 +47338 +47338 +47338 +47338 +47339 +47339 +47339 +47339 +47340 +47340 +47340 +47340 +47341 +47341 +47341 +47341 +47342 +47342 +47342 +47342 +47343 +47343 +47343 +47343 +47344 +47344 +47344 +47344 +47345 +47345 +47345 +47345 +47346 +47346 +47346 +47346 +47347 +47347 +47347 +47347 +47348 +47348 +47348 +47348 +47349 +47349 +47349 +47349 +47350 +47350 +47350 +47350 +47351 +47351 +47351 +47351 +47352 +47352 +47352 +47352 +47353 +47353 +47353 +47353 +47354 +47354 +47354 +47354 +47355 +47355 +47355 +47355 +47356 +47356 +47356 +47356 +47357 +47357 +47357 +47357 +47358 +47358 +47358 +47358 +47359 +47359 +47359 +47359 +47360 +47360 +47360 +47360 +47361 +47361 +47361 +47361 +47362 +47362 +47362 +47362 +47363 +47363 +47363 +47363 +47364 +47364 +47364 +47364 +47365 +47365 +47365 +47365 +47365 +47366 +47366 +47366 +47366 +47367 +47367 +47367 +47367 +47368 +47368 +47368 +47368 +47369 +47369 +47369 +47369 +47370 +47370 +47370 +47370 +47371 +47371 +47371 +47371 +47372 +47372 +47372 +47372 +47373 +47373 +47373 +47373 +47374 +47374 +47374 +47374 +47375 +47375 +47375 +47375 +47376 +47376 +47376 +47376 +47376 +47377 +47377 +47377 +47377 +47378 +47378 +47378 +47378 +47379 +47379 +47379 +47379 +47380 +47380 +47380 +47380 +47381 +47381 +47381 +47381 +47382 +47382 +47382 +47382 +47383 +47383 +47384 +47384 +47385 +47385 +47386 +47386 +47387 +47387 +47388 +47388 +47389 +47389 +47390 +47390 +47390 +47391 +47391 +47392 +47392 +47393 +47393 +47394 +47394 +47395 +47395 +47396 +47396 +47397 +47397 +47398 +47398 +47399 +47399 +47399 +47400 +47400 +47401 +47401 +47402 +47402 +47403 +47403 +47404 +47404 +47405 +47405 +47406 +47406 +47407 +47407 +47408 +47408 +47408 +47409 +47409 +47410 +47410 +47411 +47411 +47412 +47412 +47413 +47413 +47414 +47414 +47415 +47415 +47415 +47416 +47416 +47417 +47417 +47418 +47418 +47419 +47419 +47420 +47420 +47421 +47421 +47421 +47422 +47422 +47423 +47423 +47424 +47424 +47425 +47425 +47426 +47426 +47427 +47427 +47427 +47428 +47428 +47429 +47429 +47430 +47430 +47431 +47431 +47432 +47432 +47432 +47433 +47433 +47434 +47434 +47435 +47435 +47436 +47436 +47437 +47437 +47438 +47438 +47438 +47439 +47439 +47440 +47440 +47441 +47441 +47442 +47442 +47442 +47443 +47443 +47444 +47444 +47445 +47445 +47446 +47446 +47447 +47447 +47447 +47448 +47448 +47449 +47449 +47450 +47450 +47451 +47451 +47451 +47452 +47452 +47453 +47453 +47454 +47454 +47455 +47455 +47456 +47456 +47456 +47457 +47457 +47458 +47458 +47459 +47459 +47460 +47460 +47460 +47461 +47461 +47462 +47462 +47463 +47463 +47463 +47464 +47464 +47465 +47465 +47466 +47466 +47467 +47467 +47467 +47468 +47468 +47469 +47469 +47470 +47470 +47471 +47471 +47471 +47472 +47472 +47473 +47473 +47474 +47474 +47474 +47475 +47475 +47476 +47476 +47477 +47477 +47478 +47478 +47478 +47479 +47479 +47480 +47480 +47481 +47481 +47481 +47482 +47482 +47483 +47483 +47484 +47484 +47484 +47485 +47485 +47486 +47486 +47487 +47487 +47488 +47488 +47488 +47489 +47489 +47490 +47490 +47491 +47491 +47491 +47492 +47492 +47493 +47493 +47494 +47494 +47494 +47495 +47495 +47496 +47496 +47497 +47497 +47497 +47498 +47498 +47499 +47499 +47500 +47500 +47500 +47501 +47501 +47502 +47502 +47502 +47503 +47503 +47504 +47504 +47505 +47505 +47505 +47506 +47506 +47507 +47507 +47508 +47508 +47508 +47509 +47509 +47510 +47510 +47511 +47511 +47511 +47512 +47512 +47513 +47513 +47513 +47514 +47514 +47515 +47515 +47516 +47516 +47516 +47517 +47517 +47518 +47518 +47518 +47519 +47519 +47520 +47520 +47521 +47521 +47521 +47522 +47522 +47523 +47523 +47523 +47524 +47524 +47525 +47525 +47526 +47526 +47526 +47527 +47527 +47528 +47528 +47528 +47529 +47529 +47530 +47530 +47531 +47531 +47531 +47532 +47532 +47533 +47533 +47533 +47534 +47534 +47535 +47535 +47535 +47536 +47536 +47537 +47537 +47538 +47538 +47538 +47539 +47539 +47540 +47540 +47540 +47541 +47541 +47542 +47542 +47542 +47543 +47543 +47544 +47544 +47544 +47545 +47545 +47546 +47546 +47547 +47547 +47547 +47548 +47548 +47549 +47549 +47549 +47550 +47550 +47551 +47551 +47551 +47552 +47552 +47553 +47553 +47553 +47554 +47554 +47555 +47555 +47555 +47556 +47556 +47557 +47557 +47557 +47558 +47558 +47559 +47559 +47559 +47560 +47560 +47561 +47561 +47561 +47562 +47562 +47563 +47563 +47563 +47564 +47564 +47565 +47565 +47565 +47566 +47566 +47567 +47567 +47567 +47568 +47568 +47569 +47569 +47569 +47570 +47570 +47571 +47571 +47571 +47572 +47572 +47573 +47573 +47573 +47574 +47574 +47575 +47575 +47575 +47576 +47576 +47577 +47577 +47577 +47578 +47578 +47579 +47579 +47579 +47580 +47580 +47581 +47581 +47581 +47582 +47582 +47583 +47583 +47583 +47584 +47584 +47584 +47585 +47585 +47586 +47586 +47586 +47587 +47587 +47588 +47588 +47588 +47589 +47589 +47590 +47590 +47590 +47591 +47591 +47592 +47592 +47592 +47593 +47593 +47593 +47594 +47594 +47595 +47595 +47595 +47596 +47596 +47597 +47597 +47597 +47598 +47598 +47598 +47599 +47599 +47600 +47600 +47600 +47601 +47601 +47602 +47602 +47602 +47603 +47603 +47604 +47604 +47604 +47605 +47605 +47605 +47606 +47606 +47607 +47607 +47607 +47608 +47608 +47609 +47609 +47609 +47610 +47610 +47610 +47611 +47611 +47612 +47612 +47612 +47613 +47613 +47613 +47614 +47614 +47615 +47615 +47615 +47616 +47616 +47617 +47617 +47617 +47618 +47618 +47618 +47619 +47619 +47620 +47620 +47620 +47621 +47621 +47621 +47622 +47622 +47623 +47623 +47623 +47624 +47624 +47625 +47625 +47625 +47626 +47626 +47626 +47627 +47627 +47628 +47628 +47628 +47629 +47629 +47629 +47630 +47630 +47631 +47631 +47631 +47632 +47632 +47632 +47633 +47633 +47634 +47634 +47634 +47635 +47635 +47635 +47636 +47636 +47637 +47637 +47637 +47638 +47638 +47638 +47639 +47639 +47640 +47640 +47640 +47641 +47641 +47641 +47642 +47642 +47643 +47643 +47643 +47644 +47644 +47644 +47645 +47645 +47645 +47646 +47646 +47647 +47647 +47647 +47648 +47648 +47648 +47649 +47649 +47650 +47650 +47650 +47651 +47651 +47651 +47652 +47652 +47652 +47653 +47653 +47654 +47654 +47654 +47655 +47655 +47655 +47656 +47656 +47657 +47657 +47657 +47658 +47658 +47658 +47659 +47659 +47659 +47660 +47660 +47661 +47661 +47661 +47662 +47662 +47662 +47663 +47663 +47664 +47664 +47664 +47665 +47665 +47665 +47666 +47666 +47666 +47667 +47667 +47668 +47668 +47668 +47669 +47669 +47669 +47670 +47670 +47670 +47671 +47671 +47672 +47672 +47672 +47673 +47673 +47673 +47674 +47674 +47674 +47675 +47675 +47675 +47676 +47676 +47677 +47677 +47677 +47678 +47678 +47678 +47679 +47679 +47679 +47680 +47680 +47681 +47681 +47681 +47682 +47682 +47682 +47683 +47683 +47683 +47684 +47684 +47684 +47685 +47685 +47686 +47686 +47686 +47687 +47687 +47687 +47688 +47688 +47688 +47689 +47689 +47689 +47690 +47690 +47691 +47691 +47691 +47692 +47692 +47692 +47693 +47693 +47693 +47694 +47694 +47694 +47695 +47695 +47696 +47696 +47696 +47697 +47697 +47697 +47698 +47698 +47698 +47699 +47699 +47699 +47700 +47700 +47700 +47701 +47701 +47702 +47702 +47702 +47703 +47703 +47703 +47704 +47704 +47704 +47705 +47705 +47705 +47706 +47706 +47706 +47707 +47707 +47708 +47708 +47708 +47709 +47709 +47709 +47710 +47710 +47710 +47711 +47711 +47711 +47712 +47712 +47712 +47713 +47713 +47713 +47714 +47714 +47715 +47715 +47715 +47716 +47716 +47716 +47717 +47717 +47717 +47718 +47718 +47718 +47719 +47719 +47719 +47720 +47720 +47720 +47721 +47721 +47721 +47722 +47722 +47723 +47723 +47723 +47724 +47724 +47724 +47725 +47725 +47725 +47726 +47726 +47726 +47727 +47727 +47727 +47728 +47728 +47728 +47729 +47729 +47729 +47730 +47730 +47730 +47731 +47731 +47732 +47732 +47732 +47733 +47733 +47733 +47734 +47734 +47734 +47735 +47735 +47735 +47736 +47736 +47736 +47737 +47737 +47737 +47738 +47738 +47738 +47739 +47739 +47739 +47740 +47740 +47740 +47741 +47741 +47741 +47742 +47742 +47742 +47743 +47743 +47743 +47744 +47744 +47745 +47745 +47745 +47746 +47746 +47746 +47747 +47747 +47747 +47748 +47748 +47748 +47749 +47749 +47749 +47750 +47750 +47750 +47751 +47751 +47751 +47752 +47752 +47752 +47753 +47753 +47753 +47754 +47754 +47754 +47755 +47755 +47755 +47756 +47756 +47756 +47757 +47757 +47757 +47758 +47758 +47758 +47759 +47759 +47759 +47760 +47760 +47760 +47761 +47761 +47761 +47762 +47762 +47762 +47763 +47763 +47763 +47764 +47764 +47764 +47765 +47765 +47765 +47766 +47766 +47766 +47767 +47767 +47767 +47768 +47768 +47768 +47769 +47769 +47769 +47770 +47770 +47770 +47771 +47771 +47771 +47772 +47772 +47772 +47773 +47773 +47773 +47774 +47774 +47774 +47775 +47775 +47775 +47776 +47776 +47776 +47777 +47777 +47777 +47778 +47778 +47778 +47779 +47779 +47779 +47780 +47780 +47780 +47781 +47781 +47781 +47782 +47782 +47782 +47783 +47783 +47783 +47784 +47784 +47785 +47785 +47786 +47787 +47787 +47788 +47789 +47789 +47790 +47791 +47791 +47792 +47793 +47793 +47794 +47795 +47795 +47796 +47796 +47797 +47798 +47798 +47799 +47800 +47800 +47801 +47802 +47802 +47803 +47804 +47804 +47805 +47806 +47806 +47807 +47808 +47808 +47809 +47809 +47810 +47811 +47811 +47812 +47813 +47813 +47814 +47815 +47815 +47816 +47817 +47817 +47818 +47818 +47819 +47820 +47820 +47821 +47822 +47822 +47823 +47824 +47824 +47825 +47825 +47826 +47827 +47827 +47828 +47829 +47829 +47830 +47831 +47831 +47832 +47832 +47833 +47834 +47834 +47835 +47836 +47836 +47837 +47838 +47838 +47839 +47839 +47840 +47841 +47841 +47842 +47843 +47843 +47844 +47844 +47845 +47846 +47846 +47847 +47848 +47848 +47849 +47849 +47850 +47851 +47851 +47852 +47853 +47853 +47854 +47854 +47855 +47856 +47856 +47857 +47858 +47858 +47859 +47859 +47860 +47861 +47861 +47862 +47863 +47863 +47864 +47864 +47865 +47866 +47866 +47867 +47867 +47868 +47869 +47869 +47870 +47871 +47871 +47872 +47872 +47873 +47874 +47874 +47875 +47875 +47876 +47877 +47877 +47878 +47879 +47879 +47880 +47880 +47881 +47882 +47882 +47883 +47883 +47884 +47885 +47885 +47886 +47886 +47887 +47888 +47888 +47889 +47889 +47890 +47891 +47891 +47892 +47893 +47893 +47894 +47894 +47895 +47896 +47896 +47897 +47897 +47898 +47899 +47899 +47900 +47900 +47901 +47902 +47902 +47903 +47903 +47904 +47905 +47905 +47906 +47906 +47907 +47908 +47908 +47909 +47909 +47910 +47911 +47911 +47912 +47912 +47913 +47914 +47914 +47915 +47915 +47916 +47916 +47917 +47918 +47918 +47919 +47919 +47920 +47921 +47921 +47922 +47922 +47923 +47924 +47924 +47925 +47925 +47926 +47927 +47927 +47928 +47928 +47929 +47930 +47930 +47931 +47931 +47932 +47932 +47933 +47934 +47934 +47935 +47935 +47936 +47937 +47937 +47938 +47938 +47939 +47939 +47940 +47941 +47941 +47942 +47942 +47943 +47944 +47944 +47945 +47945 +47946 +47946 +47947 +47948 +47948 +47949 +47949 +47950 +47951 +47951 +47952 +47952 +47953 +47953 +47954 +47955 +47955 +47956 +47956 +47957 +47957 +47958 +47959 +47959 +47960 +47960 +47961 +47961 +47962 +47963 +47963 +47964 +47964 +47965 +47965 +47966 +47967 +47967 +47968 +47968 +47969 +47970 +47970 +47971 +47971 +47972 +47972 +47973 +47973 +47974 +47975 +47975 +47976 +47976 +47977 +47977 +47978 +47979 +47979 +47980 +47980 +47981 +47981 +47982 +47983 +47983 +47984 +47984 +47985 +47985 +47986 +47987 +47987 +47988 +47988 +47989 +47989 +47990 +47990 +47991 +47992 +47992 +47993 +47993 +47994 +47994 +47995 +47996 +47996 +47997 +47997 +47998 +47998 +47999 +47999 +48000 +48001 +48001 +48002 +48002 +48003 +48003 +48004 +48004 +48005 +48006 +48006 +48007 +48007 +48008 +48008 +48009 +48009 +48010 +48011 +48011 +48012 +48012 +48013 +48013 +48014 +48014 +48015 +48016 +48016 +48017 +48017 +48018 +48018 +48019 +48019 +48020 +48021 +48021 +48022 +48022 +48023 +48023 +48024 +48024 +48025 +48025 +48026 +48027 +48027 +48028 +48028 +48029 +48029 +48030 +48030 +48031 +48032 +48032 +48033 +48033 +48034 +48034 +48035 +48035 +48036 +48036 +48037 +48038 +48038 +48039 +48039 +48040 +48040 +48041 +48041 +48042 +48042 +48043 +48043 +48044 +48045 +48045 +48046 +48046 +48047 +48047 +48048 +48048 +48049 +48049 +48050 +48051 +48051 +48052 +48052 +48053 +48053 +48054 +48054 +48055 +48055 +48056 +48056 +48057 +48058 +48058 +48059 +48059 +48060 +48060 +48061 +48061 +48062 +48062 +48063 +48063 +48064 +48064 +48065 +48066 +48066 +48067 +48067 +48068 +48068 +48069 +48069 +48070 +48070 +48071 +48071 +48072 +48072 +48073 +48074 +48074 +48075 +48075 +48076 +48076 +48077 +48077 +48078 +48078 +48079 +48079 +48080 +48080 +48081 +48081 +48082 +48083 +48083 +48084 +48084 +48085 +48085 +48086 +48086 +48087 +48087 +48088 +48088 +48089 +48089 +48090 +48090 +48091 +48091 +48092 +48093 +48093 +48094 +48094 +48095 +48095 +48096 +48096 +48097 +48097 +48098 +48098 +48099 +48099 +48100 +48100 +48101 +48101 +48102 +48102 +48103 +48103 +48104 +48105 +48105 +48106 +48106 +48107 +48107 +48108 +48108 +48109 +48109 +48110 +48110 +48111 +48111 +48112 +48112 +48113 +48113 +48114 +48114 +48115 +48115 +48116 +48116 +48117 +48117 +48118 +48119 +48119 +48120 +48120 +48121 +48121 +48122 +48122 +48123 +48123 +48124 +48124 +48125 +48125 +48126 +48126 +48127 +48127 +48128 +48128 +48128 +48129 +48129 +48129 +48129 +48130 +48130 +48130 +48130 +48131 +48131 +48131 +48131 +48132 +48132 +48132 +48132 +48133 +48133 +48133 +48133 +48134 +48134 +48134 +48135 +48135 +48135 +48135 +48136 +48136 +48136 +48136 +48137 +48137 +48137 +48137 +48138 +48138 +48138 +48138 +48139 +48139 +48139 +48139 +48140 +48140 +48140 +48140 +48141 +48141 +48141 +48141 +48142 +48142 +48142 +48142 +48143 +48143 +48143 +48143 +48144 +48144 +48144 +48144 +48145 +48145 +48145 +48145 +48146 +48146 +48146 +48146 +48147 +48147 +48147 +48147 +48148 +48148 +48148 +48148 +48149 +48149 +48149 +48149 +48150 +48150 +48150 +48150 +48151 +48151 +48151 +48151 +48152 +48152 +48152 +48152 +48153 +48153 +48153 +48153 +48154 +48154 +48154 +48154 +48155 +48155 +48155 +48155 +48156 +48156 +48156 +48156 +48157 +48157 +48157 +48157 +48157 +48158 +48158 +48158 +48158 +48159 +48159 +48159 +48159 +48160 +48160 +48160 +48160 +48161 +48161 +48161 +48161 +48162 +48162 +48162 +48162 +48163 +48163 +48163 +48163 +48164 +48164 +48164 +48164 +48165 +48165 +48165 +48165 +48166 +48166 +48166 +48166 +48167 +48167 +48167 +48167 +48168 +48168 +48168 +48168 +48168 +48169 +48169 +48169 +48169 +48170 +48170 +48170 +48170 +48171 +48171 +48171 +48171 +48172 +48172 +48172 +48172 +48173 +48173 +48173 +48173 +48174 +48174 +48174 +48174 +48175 +48175 +48175 +48175 +48176 +48176 +48176 +48176 +48176 +48177 +48177 +48177 +48177 +48178 +48178 +48178 +48178 +48179 +48179 +48179 +48179 +48180 +48180 +48180 +48180 +48181 +48181 +48181 +48181 +48182 +48182 +48182 +48182 +48182 +48183 +48183 +48183 +48183 +48184 +48184 +48184 +48184 +48185 +48185 +48185 +48185 +48186 +48186 +48186 +48186 +48187 +48187 +48187 +48187 +48187 +48188 +48188 +48188 +48188 +48189 +48189 +48189 +48189 +48190 +48190 +48190 +48190 +48191 +48191 +48191 +48191 +48191 +48192 +48192 +48192 +48192 +48193 +48193 +48193 +48193 +48194 +48194 +48194 +48194 +48195 +48195 +48195 +48195 +48195 +48196 +48196 +48196 +48196 +48197 +48197 +48197 +48197 +48198 +48198 +48198 +48198 +48199 +48199 +48199 +48199 +48199 +48200 +48200 +48200 +48200 +48201 +48201 +48201 +48201 +48202 +48202 +48202 +48202 +48202 +48203 +48203 +48203 +48203 +48204 +48204 +48204 +48204 +48205 +48205 +48205 +48205 +48206 +48206 +48206 +48206 +48206 +48207 +48207 +48207 +48207 +48208 +48208 +48208 +48208 +48209 +48209 +48209 +48209 +48209 +48210 +48210 +48210 +48210 +48211 +48211 +48211 +48211 +48212 +48212 +48212 +48212 +48212 +48213 +48213 +48213 +48213 +48214 +48214 +48214 +48214 +48214 +48215 +48215 +48215 +48215 +48216 +48216 +48216 +48216 +48217 +48217 +48217 +48217 +48217 +48218 +48218 +48218 +48218 +48219 +48219 +48219 +48219 +48220 +48220 +48220 +48220 +48220 +48221 +48221 +48221 +48221 +48222 +48222 +48222 +48222 +48222 +48223 +48223 +48223 +48223 +48224 +48224 +48224 +48224 +48225 +48225 +48225 +48225 +48225 +48226 +48226 +48226 +48226 +48227 +48227 +48227 +48227 +48227 +48228 +48228 +48228 +48228 +48229 +48229 +48229 +48229 +48229 +48230 +48230 +48230 +48230 +48231 +48231 +48232 +48232 +48233 +48233 +48234 +48234 +48234 +48235 +48235 +48236 +48236 +48237 +48237 +48238 +48238 +48238 +48239 +48239 +48240 +48240 +48241 +48241 +48242 +48242 +48242 +48243 +48243 +48244 +48244 +48245 +48245 +48246 +48246 +48246 +48247 +48247 +48248 +48248 +48249 +48249 +48250 +48250 +48250 +48251 +48251 +48252 +48252 +48253 +48253 +48253 +48254 +48254 +48255 +48255 +48256 +48256 +48257 +48257 +48257 +48258 +48258 +48259 +48259 +48260 +48260 +48260 +48261 +48261 +48262 +48262 +48263 +48263 +48263 +48264 +48264 +48265 +48265 +48266 +48266 +48267 +48267 +48267 +48268 +48268 +48269 +48269 +48270 +48270 +48270 +48271 +48271 +48272 +48272 +48273 +48273 +48273 +48274 +48274 +48275 +48275 +48276 +48276 +48276 +48277 +48277 +48278 +48278 +48279 +48279 +48279 +48280 +48280 +48281 +48281 +48281 +48282 +48282 +48283 +48283 +48284 +48284 +48284 +48285 +48285 +48286 +48286 +48287 +48287 +48287 +48288 +48288 +48289 +48289 +48290 +48290 +48290 +48291 +48291 +48292 +48292 +48292 +48293 +48293 +48294 +48294 +48295 +48295 +48295 +48296 +48296 +48297 +48297 +48297 +48298 +48298 +48299 +48299 +48300 +48300 +48300 +48301 +48301 +48302 +48302 +48302 +48303 +48303 +48304 +48304 +48305 +48305 +48305 +48306 +48306 +48307 +48307 +48307 +48308 +48308 +48309 +48309 +48309 +48310 +48310 +48311 +48311 +48312 +48312 +48312 +48313 +48313 +48314 +48314 +48314 +48315 +48315 +48316 +48316 +48316 +48317 +48317 +48318 +48318 +48318 +48319 +48319 +48320 +48320 +48320 +48321 +48321 +48322 +48322 +48323 +48323 +48323 +48324 +48324 +48325 +48325 +48325 +48326 +48326 +48327 +48327 +48327 +48328 +48328 +48329 +48329 +48329 +48330 +48330 +48331 +48331 +48331 +48332 +48332 +48333 +48333 +48333 +48334 +48334 +48335 +48335 +48335 +48336 +48336 +48337 +48337 +48337 +48338 +48338 +48339 +48339 +48339 +48340 +48340 +48341 +48341 +48341 +48342 +48342 +48343 +48343 +48343 +48344 +48344 +48345 +48345 +48345 +48346 +48346 +48346 +48347 +48347 +48348 +48348 +48348 +48349 +48349 +48350 +48350 +48350 +48351 +48351 +48352 +48352 +48352 +48353 +48353 +48354 +48354 +48354 +48355 +48355 +48356 +48356 +48356 +48357 +48357 +48357 +48358 +48358 +48359 +48359 +48359 +48360 +48360 +48361 +48361 +48361 +48362 +48362 +48363 +48363 +48363 +48364 +48364 +48364 +48365 +48365 +48366 +48366 +48366 +48367 +48367 +48368 +48368 +48368 +48369 +48369 +48369 +48370 +48370 +48371 +48371 +48371 +48372 +48372 +48373 +48373 +48373 +48374 +48374 +48374 +48375 +48375 +48376 +48376 +48376 +48377 +48377 +48378 +48378 +48378 +48379 +48379 +48379 +48380 +48380 +48381 +48381 +48381 +48382 +48382 +48382 +48383 +48383 +48384 +48384 +48384 +48385 +48385 +48386 +48386 +48386 +48387 +48387 +48387 +48388 +48388 +48389 +48389 +48389 +48390 +48390 +48390 +48391 +48391 +48392 +48392 +48392 +48393 +48393 +48393 +48394 +48394 +48395 +48395 +48395 +48396 +48396 +48396 +48397 +48397 +48398 +48398 +48398 +48399 +48399 +48399 +48400 +48400 +48401 +48401 +48401 +48402 +48402 +48402 +48403 +48403 +48404 +48404 +48404 +48405 +48405 +48405 +48406 +48406 +48407 +48407 +48407 +48408 +48408 +48408 +48409 +48409 +48409 +48410 +48410 +48411 +48411 +48411 +48412 +48412 +48412 +48413 +48413 +48414 +48414 +48414 +48415 +48415 +48415 +48416 +48416 +48416 +48417 +48417 +48418 +48418 +48418 +48419 +48419 +48419 +48420 +48420 +48420 +48421 +48421 +48422 +48422 +48422 +48423 +48423 +48423 +48424 +48424 +48425 +48425 +48425 +48426 +48426 +48426 +48427 +48427 +48427 +48428 +48428 +48429 +48429 +48429 +48430 +48430 +48430 +48431 +48431 +48431 +48432 +48432 +48432 +48433 +48433 +48434 +48434 +48434 +48435 +48435 +48435 +48436 +48436 +48436 +48437 +48437 +48438 +48438 +48438 +48439 +48439 +48439 +48440 +48440 +48440 +48441 +48441 +48441 +48442 +48442 +48443 +48443 +48443 +48444 +48444 +48444 +48445 +48445 +48445 +48446 +48446 +48446 +48447 +48447 +48448 +48448 +48448 +48449 +48449 +48449 +48450 +48450 +48450 +48451 +48451 +48451 +48452 +48452 +48453 +48453 +48453 +48454 +48454 +48454 +48455 +48455 +48455 +48456 +48456 +48456 +48457 +48457 +48457 +48458 +48458 +48459 +48459 +48459 +48460 +48460 +48460 +48461 +48461 +48461 +48462 +48462 +48462 +48463 +48463 +48463 +48464 +48464 +48464 +48465 +48465 +48466 +48466 +48466 +48467 +48467 +48467 +48468 +48468 +48468 +48469 +48469 +48469 +48470 +48470 +48470 +48471 +48471 +48471 +48472 +48472 +48472 +48473 +48473 +48474 +48474 +48474 +48475 +48475 +48475 +48476 +48476 +48476 +48477 +48477 +48477 +48478 +48478 +48478 +48479 +48479 +48479 +48480 +48480 +48480 +48481 +48481 +48481 +48482 +48482 +48483 +48483 +48483 +48484 +48484 +48484 +48485 +48485 +48485 +48486 +48486 +48486 +48487 +48487 +48487 +48488 +48488 +48488 +48489 +48489 +48489 +48490 +48490 +48490 +48491 +48491 +48491 +48492 +48492 +48492 +48493 +48493 +48493 +48494 +48494 +48494 +48495 +48495 +48495 +48496 +48496 +48497 +48497 +48497 +48498 +48498 +48498 +48499 +48499 +48499 +48500 +48500 +48500 +48501 +48501 +48501 +48502 +48502 +48502 +48503 +48503 +48503 +48504 +48504 +48504 +48505 +48505 +48505 +48506 +48506 +48506 +48507 +48507 +48507 +48508 +48508 +48508 +48509 +48509 +48509 +48510 +48510 +48510 +48511 +48511 +48511 +48512 +48512 +48512 +48513 +48513 +48513 +48514 +48514 +48514 +48515 +48515 +48515 +48516 +48516 +48516 +48517 +48517 +48517 +48518 +48518 +48518 +48519 +48519 +48519 +48520 +48520 +48520 +48521 +48521 +48521 +48522 +48522 +48522 +48523 +48523 +48523 +48524 +48524 +48524 +48525 +48525 +48525 +48526 +48526 +48526 +48527 +48527 +48527 +48528 +48528 +48528 +48529 +48529 +48529 +48530 +48530 +48530 +48531 +48531 +48531 +48532 +48532 +48532 +48533 +48533 +48533 +48534 +48534 +48534 +48535 +48535 +48535 +48535 +48536 +48536 +48536 +48537 +48537 +48537 +48538 +48538 +48538 +48539 +48539 +48539 +48540 +48540 +48540 +48541 +48541 +48541 +48542 +48542 +48542 +48543 +48543 +48543 +48544 +48544 +48544 +48545 +48545 +48545 +48546 +48546 +48546 +48547 +48547 +48547 +48548 +48548 +48548 +48548 +48549 +48549 +48549 +48550 +48550 +48550 +48551 +48551 +48551 +48552 +48552 +48552 +48553 +48553 +48553 +48554 +48554 +48554 +48555 +48555 +48555 +48556 +48556 +48556 +48557 +48557 +48557 +48558 +48558 +48558 +48558 +48559 +48559 +48559 +48560 +48560 +48560 +48561 +48561 +48561 +48562 +48562 +48562 +48563 +48563 +48563 +48564 +48564 +48564 +48565 +48565 +48565 +48566 +48566 +48566 +48566 +48567 +48567 +48567 +48568 +48568 +48568 +48569 +48569 +48569 +48570 +48570 +48570 +48571 +48571 +48571 +48572 +48572 +48572 +48572 +48573 +48573 +48573 +48574 +48574 +48574 +48575 +48575 +48575 +48576 +48576 +48576 +48577 +48577 +48577 +48578 +48578 +48578 +48578 +48579 +48579 +48579 +48580 +48580 +48580 +48581 +48581 +48581 +48582 +48582 +48582 +48583 +48583 +48583 +48584 +48584 +48584 +48584 +48585 +48585 +48585 +48586 +48586 +48586 +48587 +48587 +48587 +48588 +48588 +48588 +48589 +48589 +48589 +48589 +48590 +48590 +48590 +48591 +48591 +48591 +48592 +48592 +48592 +48593 +48593 +48593 +48593 +48594 +48594 +48594 +48595 +48595 +48595 +48596 +48596 +48596 +48597 +48597 +48597 +48598 +48598 +48598 +48598 +48599 +48599 +48599 +48600 +48600 +48600 +48601 +48601 +48601 +48602 +48602 +48602 +48602 +48603 +48603 +48603 +48604 +48604 +48604 +48605 +48605 +48605 +48606 +48606 +48607 +48608 +48608 +48609 +48610 +48610 +48611 +48611 +48612 +48613 +48613 +48614 +48614 +48615 +48616 +48616 +48617 +48617 +48618 +48619 +48619 +48620 +48620 +48621 +48622 +48622 +48623 +48624 +48624 +48625 +48625 +48626 +48627 +48627 +48628 +48628 +48629 +48630 +48630 +48631 +48631 +48632 +48633 +48633 +48634 +48634 +48635 +48636 +48636 +48637 +48637 +48638 +48639 +48639 +48640 +48640 +48641 +48642 +48642 +48643 +48643 +48644 +48645 +48645 +48646 +48646 +48647 +48647 +48648 +48649 +48649 +48650 +48650 +48651 +48652 +48652 +48653 +48653 +48654 +48655 +48655 +48656 +48656 +48657 +48658 +48658 +48659 +48659 +48660 +48660 +48661 +48662 +48662 +48663 +48663 +48664 +48665 +48665 +48666 +48666 +48667 +48667 +48668 +48669 +48669 +48670 +48670 +48671 +48672 +48672 +48673 +48673 +48674 +48674 +48675 +48676 +48676 +48677 +48677 +48678 +48678 +48679 +48680 +48680 +48681 +48681 +48682 +48683 +48683 +48684 +48684 +48685 +48685 +48686 +48687 +48687 +48688 +48688 +48689 +48689 +48690 +48691 +48691 +48692 +48692 +48693 +48693 +48694 +48695 +48695 +48696 +48696 +48697 +48697 +48698 +48699 +48699 +48700 +48700 +48701 +48701 +48702 +48702 +48703 +48704 +48704 +48705 +48705 +48706 +48706 +48707 +48708 +48708 +48709 +48709 +48710 +48710 +48711 +48712 +48712 +48713 +48713 +48714 +48714 +48715 +48715 +48716 +48717 +48717 +48718 +48718 +48719 +48719 +48720 +48720 +48721 +48722 +48722 +48723 +48723 +48724 +48724 +48725 +48725 +48726 +48727 +48727 +48728 +48728 +48729 +48729 +48730 +48730 +48731 +48732 +48732 +48733 +48733 +48734 +48734 +48735 +48735 +48736 +48737 +48737 +48738 +48738 +48739 +48739 +48740 +48740 +48741 +48742 +48742 +48743 +48743 +48744 +48744 +48745 +48745 +48746 +48746 +48747 +48748 +48748 +48749 +48749 +48750 +48750 +48751 +48751 +48752 +48752 +48753 +48754 +48754 +48755 +48755 +48756 +48756 +48757 +48757 +48758 +48758 +48759 +48759 +48760 +48761 +48761 +48762 +48762 +48763 +48763 +48764 +48764 +48765 +48765 +48766 +48767 +48767 +48768 +48768 +48769 +48769 +48770 +48770 +48771 +48771 +48772 +48772 +48773 +48773 +48774 +48775 +48775 +48776 +48776 +48777 +48777 +48778 +48778 +48779 +48779 +48780 +48780 +48781 +48781 +48782 +48783 +48783 +48784 +48784 +48785 +48785 +48786 +48786 +48787 +48787 +48788 +48788 +48789 +48789 +48790 +48790 +48791 +48792 +48792 +48793 +48793 +48794 +48794 +48795 +48795 +48796 +48796 +48797 +48797 +48798 +48798 +48799 +48799 +48800 +48800 +48801 +48802 +48802 +48803 +48803 +48804 +48804 +48805 +48805 +48806 +48806 +48807 +48807 +48808 +48808 +48809 +48809 +48810 +48810 +48811 +48811 +48812 +48812 +48813 +48814 +48814 +48815 +48815 +48816 +48816 +48817 +48817 +48818 +48818 +48819 +48819 +48820 +48820 +48821 +48821 +48822 +48822 +48823 +48823 +48824 +48824 +48825 +48825 +48826 +48826 +48827 +48827 +48828 +48828 +48829 +48829 +48830 +48831 +48831 +48832 +48832 +48833 +48833 +48834 +48834 +48835 +48835 +48836 +48836 +48837 +48837 +48838 +48838 +48839 +48839 +48840 +48840 +48841 +48841 +48842 +48842 +48843 +48843 +48844 +48844 +48845 +48845 +48846 +48846 +48847 +48847 +48848 +48848 +48849 +48849 +48850 +48850 +48851 +48851 +48852 +48852 +48853 +48853 +48854 +48854 +48855 +48855 +48856 +48856 +48857 +48857 +48858 +48858 +48859 +48859 +48860 +48860 +48861 +48861 +48862 +48862 +48863 +48863 +48864 +48864 +48865 +48865 +48866 +48866 +48867 +48867 +48868 +48868 +48869 +48869 +48870 +48870 +48871 +48871 +48872 +48872 +48873 +48873 +48874 +48874 +48875 +48875 +48876 +48876 +48877 +48877 +48878 +48878 +48879 +48879 +48880 +48880 +48881 +48881 +48882 +48882 +48883 +48883 +48884 +48884 +48885 +48885 +48886 +48886 +48887 +48887 +48888 +48888 +48889 +48889 +48890 +48890 +48891 +48891 +48892 +48892 +48893 +48893 +48894 +48894 +48895 +48895 +48896 +48896 +48896 +48897 +48897 +48898 +48898 +48899 +48899 +48900 +48900 +48901 +48901 +48902 +48902 +48903 +48903 +48904 +48904 +48905 +48905 +48906 +48906 +48907 +48907 +48908 +48908 +48909 +48909 +48910 +48910 +48911 +48911 +48912 +48912 +48912 +48913 +48913 +48914 +48914 +48915 +48915 +48916 +48916 +48917 +48917 +48918 +48918 +48919 +48919 +48920 +48920 +48921 +48921 +48922 +48922 +48923 +48923 +48924 +48924 +48924 +48925 +48925 +48926 +48926 +48927 +48927 +48928 +48928 +48929 +48929 +48930 +48930 +48931 +48931 +48932 +48932 +48933 +48933 +48934 +48934 +48935 +48935 +48935 +48936 +48936 +48937 +48937 +48938 +48938 +48939 +48939 +48940 +48940 +48941 +48941 +48942 +48942 +48943 +48943 +48943 +48944 +48944 +48945 +48945 +48946 +48946 +48947 +48947 +48948 +48948 +48949 +48949 +48950 +48950 +48951 +48951 +48951 +48952 +48952 +48953 +48953 +48954 +48954 +48955 +48955 +48956 +48956 +48957 +48957 +48958 +48958 +48959 +48959 +48959 +48960 +48960 +48961 +48961 +48962 +48962 +48963 +48963 +48964 +48964 +48965 +48965 +48965 +48966 +48966 +48967 +48967 +48968 +48968 +48969 +48969 +48970 +48970 +48971 +48971 +48972 +48972 +48972 +48973 +48973 +48974 +48974 +48975 +48975 +48976 +48976 +48977 +48977 +48978 +48978 +48978 +48979 +48979 +48980 +48980 +48981 +48981 +48982 +48982 +48983 +48983 +48984 +48984 +48984 +48985 +48985 +48986 +48986 +48987 +48987 +48988 +48988 +48989 +48989 +48989 +48990 +48990 +48991 +48991 +48992 +48992 +48993 +48993 +48994 +48994 +48994 +48995 +48995 +48996 +48996 +48997 +48997 +48998 +48998 +48999 +48999 +48999 +49000 +49000 +49001 +49001 +49002 +49002 +49003 +49003 +49004 +49004 +49004 +49005 +49005 +49006 +49006 +49007 +49007 +49008 +49008 +49009 +49009 +49009 +49010 +49010 +49011 +49011 +49012 +49012 +49013 +49013 +49013 +49014 +49014 +49015 +49015 +49016 +49016 +49017 +49017 +49018 +49018 +49018 +49019 +49019 +49020 +49020 +49021 +49021 +49022 +49022 +49022 +49023 +49023 +49024 +49024 +49025 +49025 +49026 +49026 +49026 +49027 +49027 +49028 +49028 +49029 +49029 +49030 +49030 +49030 +49031 +49031 +49032 +49032 +49033 +49033 +49034 +49034 +49034 +49035 +49035 +49036 +49036 +49037 +49037 +49038 +49038 +49038 +49039 +49039 +49040 +49040 +49041 +49041 +49042 +49042 +49042 +49043 +49043 +49044 +49044 +49045 +49045 +49045 +49046 +49046 +49047 +49047 +49048 +49048 +49049 +49049 +49049 +49050 +49050 +49051 +49051 +49052 +49052 +49053 +49053 +49053 +49054 +49054 +49055 +49055 +49056 +49056 +49056 +49057 +49057 +49058 +49058 +49059 +49059 +49060 +49060 +49060 +49061 +49061 +49062 +49062 +49063 +49063 +49063 +49064 +49064 +49065 +49065 +49066 +49066 +49066 +49067 +49067 +49068 +49068 +49069 +49069 +49069 +49070 +49070 +49071 +49071 +49072 +49072 +49073 +49073 +49073 +49074 +49074 +49075 +49075 +49076 +49076 +49076 +49077 +49077 +49078 +49078 +49079 +49079 +49079 +49080 +49080 +49081 +49081 +49082 +49082 +49082 +49083 +49083 +49084 +49084 +49085 +49085 +49085 +49086 +49086 +49087 +49087 +49088 +49088 +49088 +49089 +49089 +49090 +49090 +49091 +49091 +49091 +49092 +49092 +49093 +49093 +49094 +49094 +49094 +49095 +49095 +49096 +49096 +49097 +49097 +49097 +49098 +49098 +49099 +49099 +49100 +49100 +49100 +49101 +49101 +49102 +49102 +49102 +49103 +49103 +49104 +49104 +49105 +49105 +49105 +49106 +49106 +49107 +49107 +49108 +49108 +49108 +49109 +49109 +49110 +49110 +49111 +49111 +49111 +49112 +49112 +49113 +49113 +49113 +49114 +49114 +49115 +49115 +49116 +49116 +49116 +49117 +49117 +49118 +49119 +49120 +49121 +49121 +49122 +49123 +49124 +49125 +49126 +49126 +49127 +49128 +49129 +49130 +49131 +49131 +49132 +49133 +49134 +49135 +49136 +49136 +49137 +49138 +49139 +49140 +49141 +49141 +49142 +49143 +49144 +49145 +49146 +49146 +49147 +49148 +49149 +49150 +49150 +49151 +49152 +49152 +49153 +49153 +49154 +49154 +49155 +49155 +49155 +49156 +49156 +49157 +49157 +49157 +49158 +49158 +49159 +49159 +49159 +49160 +49160 +49161 +49161 +49161 +49162 +49162 +49163 +49163 +49163 +49164 +49164 +49165 +49165 +49166 +49166 +49166 +49167 +49167 +49168 +49168 +49168 +49169 +49169 +49170 +49170 +49170 +49171 +49171 +49172 +49172 +49172 +49173 +49173 +49174 +49174 +49174 +49175 +49175 +49176 +49176 +49176 +49177 +49177 +49178 +49178 +49178 +49179 +49179 +49180 +49180 +49180 +49181 +49181 +49181 +49182 +49182 +49183 +49183 +49183 +49184 +49184 +49185 +49185 +49185 +49186 +49186 +49187 +49187 +49187 +49188 +49188 +49189 +49189 +49189 +49190 +49190 +49191 +49191 +49191 +49192 +49192 +49193 +49193 +49193 +49194 +49194 +49194 +49195 +49195 +49196 +49196 +49196 +49197 +49197 +49198 +49198 +49198 +49199 +49199 +49200 +49200 +49200 +49201 +49201 +49201 +49202 +49202 +49203 +49203 +49203 +49204 +49204 +49205 +49205 +49205 +49206 +49206 +49206 +49207 +49207 +49208 +49208 +49208 +49209 +49209 +49210 +49210 +49210 +49211 +49211 +49211 +49212 +49212 +49213 +49213 +49213 +49214 +49214 +49214 +49215 +49215 +49216 +49216 +49216 +49217 +49217 +49218 +49218 +49218 +49219 +49219 +49219 +49220 +49220 +49221 +49221 +49221 +49222 +49222 +49222 +49223 +49223 +49224 +49224 +49224 +49225 +49225 +49225 +49226 +49226 +49227 +49227 +49227 +49228 +49228 +49228 +49229 +49229 +49230 +49230 +49230 +49231 +49231 +49231 +49232 +49232 +49233 +49233 +49233 +49234 +49234 +49234 +49235 +49235 +49236 +49236 +49236 +49237 +49237 +49237 +49238 +49238 +49239 +49239 +49239 +49240 +49240 +49240 +49241 +49241 +49241 +49242 +49242 +49243 +49243 +49243 +49244 +49244 +49244 +49245 +49245 +49246 +49246 +49246 +49247 +49247 +49247 +49248 +49248 +49248 +49249 +49249 +49250 +49250 +49250 +49251 +49251 +49251 +49252 +49252 +49252 +49253 +49253 +49254 +49254 +49254 +49255 +49255 +49255 +49256 +49256 +49256 +49257 +49257 +49258 +49258 +49258 +49259 +49259 +49259 +49260 +49260 +49260 +49261 +49261 +49262 +49262 +49262 +49263 +49263 +49263 +49264 +49264 +49264 +49265 +49265 +49265 +49266 +49266 +49267 +49267 +49267 +49268 +49268 +49268 +49269 +49269 +49269 +49270 +49270 +49270 +49271 +49271 +49272 +49272 +49272 +49273 +49273 +49273 +49274 +49274 +49274 +49275 +49275 +49275 +49276 +49276 +49277 +49277 +49277 +49278 +49278 +49278 +49279 +49279 +49279 +49280 +49280 +49280 +49281 +49281 +49281 +49282 +49282 +49283 +49283 +49283 +49284 +49284 +49284 +49285 +49285 +49285 +49286 +49286 +49286 +49287 +49287 +49287 +49288 +49288 +49289 +49289 +49289 +49290 +49290 +49290 +49291 +49291 +49291 +49292 +49292 +49292 +49293 +49293 +49293 +49294 +49294 +49294 +49295 +49295 +49295 +49296 +49296 +49297 +49297 +49297 +49298 +49298 +49298 +49299 +49299 +49299 +49300 +49300 +49300 +49301 +49301 +49301 +49302 +49302 +49302 +49303 +49303 +49303 +49304 +49304 +49304 +49305 +49305 +49305 +49306 +49306 +49307 +49307 +49307 +49308 +49308 +49308 +49309 +49309 +49309 +49310 +49310 +49310 +49311 +49311 +49311 +49312 +49312 +49312 +49313 +49313 +49313 +49314 +49314 +49314 +49315 +49315 +49315 +49316 +49316 +49316 +49317 +49317 +49317 +49318 +49318 +49318 +49319 +49319 +49319 +49320 +49320 +49320 +49321 +49321 +49321 +49322 +49322 +49323 +49323 +49323 +49324 +49324 +49324 +49325 +49325 +49325 +49326 +49326 +49326 +49327 +49327 +49327 +49328 +49328 +49328 +49329 +49329 +49329 +49330 +49330 +49330 +49331 +49331 +49331 +49332 +49332 +49332 +49333 +49333 +49333 +49334 +49334 +49334 +49335 +49335 +49335 +49336 +49336 +49336 +49337 +49337 +49337 +49338 +49338 +49338 +49339 +49339 +49339 +49340 +49340 +49340 +49341 +49341 +49341 +49342 +49342 +49342 +49343 +49343 +49343 +49344 +49344 +49344 +49344 +49345 +49345 +49345 +49346 +49346 +49346 +49347 +49347 +49347 +49348 +49348 +49348 +49349 +49349 +49349 +49350 +49350 +49350 +49351 +49351 +49351 +49352 +49352 +49352 +49353 +49353 +49353 +49354 +49354 +49354 +49355 +49355 +49355 +49356 +49356 +49356 +49357 +49357 +49357 +49358 +49358 +49358 +49359 +49359 +49359 +49360 +49360 +49360 +49361 +49361 +49361 +49361 +49362 +49362 +49362 +49363 +49363 +49363 +49364 +49364 +49364 +49365 +49365 +49365 +49366 +49366 +49366 +49367 +49367 +49367 +49368 +49368 +49368 +49369 +49369 +49369 +49370 +49370 +49370 +49370 +49371 +49371 +49371 +49372 +49372 +49372 +49373 +49373 +49373 +49374 +49374 +49374 +49375 +49375 +49375 +49376 +49376 +49376 +49377 +49377 +49377 +49378 +49378 +49378 +49378 +49379 +49379 +49379 +49380 +49380 +49380 +49381 +49381 +49381 +49382 +49382 +49382 +49383 +49383 +49383 +49384 +49384 +49384 +49384 +49385 +49385 +49385 +49386 +49386 +49386 +49387 +49387 +49387 +49388 +49388 +49388 +49389 +49389 +49389 +49390 +49390 +49390 +49390 +49391 +49391 +49391 +49392 +49392 +49392 +49393 +49393 +49393 +49394 +49394 +49394 +49395 +49395 +49395 +49396 +49396 +49396 +49396 +49397 +49397 +49397 +49398 +49398 +49398 +49399 +49399 +49399 +49400 +49400 +49400 +49400 +49401 +49401 +49401 +49402 +49402 +49402 +49403 +49403 +49403 +49404 +49404 +49404 +49405 +49405 +49405 +49405 +49406 +49406 +49406 +49407 +49407 +49407 +49408 +49408 +49408 +49409 +49409 +49409 +49409 +49410 +49410 +49410 +49411 +49411 +49411 +49412 +49412 +49412 +49413 +49413 +49413 +49413 +49414 +49414 +49414 +49415 +49415 +49415 +49416 +49416 +49416 +49417 +49417 +49417 +49417 +49418 +49418 +49418 +49419 +49419 +49419 +49420 +49420 +49420 +49421 +49421 +49421 +49421 +49422 +49422 +49422 +49423 +49423 +49423 +49424 +49424 +49424 +49424 +49425 +49425 +49425 +49426 +49426 +49426 +49427 +49427 +49427 +49427 +49428 +49428 +49428 +49429 +49429 +49429 +49430 +49430 +49430 +49431 +49431 +49431 +49431 +49432 +49432 +49432 +49433 +49433 +49433 +49434 +49434 +49434 +49434 +49435 +49435 +49435 +49436 +49436 +49436 +49437 +49437 +49437 +49437 +49438 +49438 +49438 +49439 +49439 +49439 +49440 +49440 +49440 +49440 +49441 +49441 +49441 +49442 +49442 +49442 +49443 +49443 +49443 +49443 +49444 +49444 +49444 +49445 +49445 +49445 +49446 +49446 +49446 +49446 +49447 +49447 +49447 +49448 +49448 +49448 +49448 +49449 +49449 +49449 +49450 +49450 +49450 +49451 +49451 +49451 +49451 +49452 +49452 +49452 +49453 +49453 +49453 +49454 +49454 +49454 +49454 +49455 +49455 +49455 +49456 +49456 +49456 +49456 +49457 +49457 +49457 +49458 +49458 +49458 +49459 +49459 +49459 +49459 +49460 +49460 +49460 +49461 +49461 +49461 +49461 +49462 +49462 +49462 +49463 +49463 +49463 +49463 +49464 +49464 +49464 +49465 +49465 +49465 +49466 +49466 +49466 +49466 +49467 +49467 +49467 +49468 +49468 +49468 +49468 +49469 +49469 +49469 +49470 +49470 +49470 +49470 +49471 +49471 +49471 +49472 +49472 +49472 +49473 +49473 +49473 +49473 +49474 +49474 +49474 +49475 +49475 +49475 +49475 +49476 +49476 +49476 +49477 +49477 +49477 +49477 +49478 +49478 +49478 +49479 +49479 +49479 +49479 +49480 +49480 +49480 +49481 +49481 +49481 +49481 +49482 +49482 +49482 +49483 +49483 +49483 +49483 +49484 +49484 +49484 +49485 +49485 +49486 +49487 +49487 +49488 +49488 +49489 +49489 +49490 +49491 +49491 +49492 +49492 +49493 +49493 +49494 +49495 +49495 +49496 +49496 +49497 +49497 +49498 +49499 +49499 +49500 +49500 +49501 +49501 +49502 +49503 +49503 +49504 +49504 +49505 +49505 +49506 +49506 +49507 +49508 +49508 +49509 +49509 +49510 +49510 +49511 +49512 +49512 +49513 +49513 +49514 +49514 +49515 +49515 +49516 +49517 +49517 +49518 +49518 +49519 +49519 +49520 +49520 +49521 +49522 +49522 +49523 +49523 +49524 +49524 +49525 +49525 +49526 +49527 +49527 +49528 +49528 +49529 +49529 +49530 +49530 +49531 +49531 +49532 +49533 +49533 +49534 +49534 +49535 +49535 +49536 +49536 +49537 +49538 +49538 +49539 +49539 +49540 +49540 +49541 +49541 +49542 +49542 +49543 +49544 +49544 +49545 +49545 +49546 +49546 +49547 +49547 +49548 +49548 +49549 +49549 +49550 +49551 +49551 +49552 +49552 +49553 +49553 +49554 +49554 +49555 +49555 +49556 +49556 +49557 +49558 +49558 +49559 +49559 +49560 +49560 +49561 +49561 +49562 +49562 +49563 +49563 +49564 +49564 +49565 +49566 +49566 +49567 +49567 +49568 +49568 +49569 +49569 +49570 +49570 +49571 +49571 +49572 +49572 +49573 +49574 +49574 +49575 +49575 +49576 +49576 +49577 +49577 +49578 +49578 +49579 +49579 +49580 +49580 +49581 +49581 +49582 +49582 +49583 +49584 +49584 +49585 +49585 +49586 +49586 +49587 +49587 +49588 +49588 +49589 +49589 +49590 +49590 +49591 +49591 +49592 +49592 +49593 +49593 +49594 +49594 +49595 +49596 +49596 +49597 +49597 +49598 +49598 +49599 +49599 +49600 +49600 +49601 +49601 +49602 +49602 +49603 +49603 +49604 +49604 +49605 +49605 +49606 +49606 +49607 +49607 +49608 +49608 +49609 +49609 +49610 +49610 +49611 +49612 +49612 +49613 +49613 +49614 +49614 +49615 +49615 +49616 +49616 +49617 +49617 +49618 +49618 +49619 +49619 +49620 +49620 +49621 +49621 +49622 +49622 +49623 +49623 +49624 +49624 +49625 +49625 +49626 +49626 +49627 +49627 +49628 +49628 +49629 +49629 +49630 +49630 +49631 +49631 +49632 +49632 +49633 +49633 +49634 +49634 +49635 +49635 +49636 +49636 +49637 +49637 +49638 +49638 +49639 +49639 +49640 +49640 +49641 +49641 +49642 +49642 +49643 +49643 +49644 +49644 +49645 +49645 +49646 +49646 +49647 +49647 +49648 +49648 +49649 +49649 +49650 +49650 +49651 +49651 +49652 +49652 +49653 +49653 +49654 +49654 +49655 +49655 +49656 +49656 +49657 +49657 +49658 +49658 +49659 +49659 +49660 +49660 +49661 +49661 +49662 +49662 +49663 +49663 +49664 +49664 +49665 +49665 +49666 +49666 +49667 +49667 +49668 +49668 +49668 +49669 +49669 +49670 +49670 +49671 +49671 +49672 +49672 +49673 +49673 +49674 +49674 +49675 +49675 +49676 +49676 +49677 +49677 +49678 +49678 +49679 +49679 +49680 +49680 +49681 +49681 +49682 +49682 +49683 +49683 +49684 +49684 +49684 +49685 +49685 +49686 +49686 +49687 +49687 +49688 +49688 +49689 +49689 +49690 +49690 +49691 +49691 +49692 +49692 +49693 +49693 +49694 +49694 +49695 +49695 +49696 +49696 +49696 +49697 +49697 +49698 +49698 +49699 +49699 +49700 +49700 +49701 +49701 +49702 +49702 +49703 +49703 +49704 +49704 +49705 +49705 +49706 +49706 +49706 +49707 +49707 +49708 +49708 +49709 +49709 +49710 +49710 +49711 +49711 +49712 +49712 +49713 +49713 +49714 +49714 +49714 +49715 +49715 +49716 +49716 +49717 +49717 +49718 +49718 +49719 +49719 +49720 +49720 +49721 +49721 +49722 +49722 +49722 +49723 +49723 +49724 +49724 +49725 +49725 +49726 +49726 +49727 +49727 +49728 +49728 +49729 +49729 +49729 +49730 +49730 +49731 +49731 +49732 +49732 +49733 +49733 +49734 +49734 +49735 +49735 +49735 +49736 +49736 +49737 +49737 +49738 +49738 +49739 +49739 +49740 +49740 +49741 +49741 +49741 +49742 +49742 +49743 +49743 +49744 +49744 +49745 +49745 +49746 +49746 +49747 +49747 +49747 +49748 +49748 +49749 +49749 +49750 +49750 +49751 +49751 +49752 +49752 +49752 +49753 +49753 +49754 +49754 +49755 +49755 +49756 +49756 +49757 +49757 +49757 +49758 +49758 +49759 +49759 +49760 +49760 +49761 +49761 +49762 +49762 +49762 +49763 +49763 +49764 +49764 +49765 +49765 +49766 +49766 +49767 +49767 +49767 +49768 +49768 +49769 +49769 +49770 +49770 +49771 +49771 +49771 +49772 +49772 +49773 +49773 +49774 +49774 +49775 +49775 +49776 +49776 +49776 +49777 +49777 +49778 +49778 +49779 +49779 +49780 +49780 +49780 +49781 +49781 +49782 +49782 +49783 +49783 +49784 +49784 +49784 +49785 +49785 +49786 +49786 +49787 +49787 +49788 +49788 +49788 +49789 +49789 +49790 +49790 +49791 +49791 +49792 +49792 +49792 +49793 +49793 +49794 +49794 +49795 +49795 +49796 +49796 +49796 +49797 +49797 +49798 +49798 +49799 +49799 +49800 +49800 +49800 +49801 +49801 +49802 +49802 +49803 +49803 +49803 +49804 +49804 +49805 +49805 +49806 +49806 +49807 +49807 +49807 +49808 +49808 +49809 +49809 +49810 +49810 +49810 +49811 +49811 +49812 +49812 +49813 +49813 +49814 +49814 +49814 +49815 +49815 +49816 +49816 +49817 +49817 +49817 +49818 +49818 +49819 +49819 +49820 +49820 +49820 +49821 +49821 +49822 +49822 +49823 +49823 +49824 +49824 +49824 +49825 +49825 +49826 +49826 +49827 +49827 +49827 +49828 +49828 +49829 +49829 +49830 +49830 +49830 +49831 +49831 +49832 +49832 +49833 +49833 +49833 +49834 +49834 +49835 +49835 +49836 +49836 +49836 +49837 +49837 +49838 +49838 +49839 +49839 +49839 +49840 +49840 +49841 +49841 +49842 +49842 +49842 +49843 +49843 +49844 +49844 +49845 +49845 +49845 +49846 +49846 +49847 +49847 +49848 +49848 +49848 +49849 +49849 +49850 +49850 +49851 +49851 +49851 +49852 +49852 +49853 +49853 +49853 +49854 +49854 +49855 +49855 +49856 +49856 +49856 +49857 +49857 +49858 +49858 +49859 +49859 +49859 +49860 +49860 +49861 +49861 +49861 +49862 +49862 +49863 +49863 +49864 +49864 +49864 +49865 +49865 +49866 +49866 +49867 +49867 +49867 +49868 +49868 +49869 +49869 +49869 +49870 +49870 +49871 +49871 +49872 +49872 +49872 +49873 +49873 +49874 +49874 +49874 +49875 +49875 +49876 +49876 +49877 +49877 +49877 +49878 +49878 +49879 +49879 +49879 +49880 +49880 +49881 +49881 +49882 +49882 +49882 +49883 +49883 +49884 +49884 +49884 +49885 +49885 +49886 +49886 +49886 +49887 +49887 +49888 +49888 +49889 +49889 +49889 +49890 +49890 +49891 +49891 +49891 +49892 +49892 +49893 +49893 +49893 +49894 +49894 +49895 +49895 +49896 +49896 +49896 +49897 +49897 +49898 +49898 +49898 +49899 +49899 +49900 +49900 +49900 +49901 +49901 +49902 +49902 +49903 +49903 +49903 +49904 +49904 +49905 +49905 +49905 +49906 +49906 +49907 +49907 +49907 +49908 +49908 +49909 +49909 +49909 +49910 +49910 +49911 +49911 +49911 +49912 +49912 +49913 +49913 +49913 +49914 +49914 +49915 +49915 +49916 +49916 +49916 +49917 +49917 +49918 +49918 +49918 +49919 +49919 +49920 +49920 +49920 +49921 +49921 +49922 +49922 +49922 +49923 +49923 +49924 +49924 +49924 +49925 +49925 +49926 +49926 +49926 +49927 +49927 +49928 +49928 +49928 +49929 +49929 +49930 +49930 +49930 +49931 +49931 +49932 +49932 +49932 +49933 +49933 +49934 +49934 +49934 +49935 +49935 +49936 +49936 +49936 +49937 +49937 +49938 +49938 +49938 +49939 +49939 +49940 +49940 +49940 +49941 +49941 +49942 +49942 +49942 +49943 +49943 +49944 +49944 +49944 +49945 +49945 +49946 +49946 +49946 +49947 +49947 +49948 +49948 +49948 +49949 +49949 +49949 +49950 +49950 +49951 +49951 +49951 +49952 +49952 +49953 +49953 +49953 +49954 +49954 +49955 +49955 +49955 +49956 +49956 +49957 +49957 +49957 +49958 +49958 +49959 +49959 +49959 +49960 +49960 +49961 +49961 +49961 +49962 +49962 +49963 +49964 +49964 +49965 +49966 +49967 +49968 +49968 +49969 +49970 +49971 +49971 +49972 +49973 +49974 +49975 +49975 +49976 +49977 +49978 +49978 +49979 +49980 +49981 +49982 +49982 +49983 +49984 +49985 +49985 +49986 +49987 +49988 +49988 +49989 +49990 +49991 +49992 +49992 +49993 +49994 +49995 +49995 +49996 +49997 +49998 +49998 +49999 +50000 +50001 +50002 +50002 +50003 +50004 +50005 +50005 +50006 +50007 +50008 +50008 +50009 +50010 +50011 +50011 +50012 +50013 +50014 +50014 +50015 +50016 +50017 +50017 +50018 +50019 +50020 +50020 +50021 +50022 +50023 +50023 +50024 +50025 +50026 +50026 +50027 +50028 +50029 +50029 +50030 +50031 +50032 +50032 +50033 +50034 +50035 +50035 +50036 +50037 +50038 +50038 +50039 +50040 +50041 +50041 +50042 +50043 +50044 +50044 +50045 +50046 +50047 +50047 +50048 +50049 +50050 +50050 +50051 +50052 +50053 +50053 +50054 +50055 +50055 +50056 +50057 +50058 +50058 +50059 +50060 +50061 +50061 +50062 +50063 +50064 +50064 +50065 +50066 +50066 +50067 +50068 +50069 +50069 +50070 +50071 +50072 +50072 +50073 +50074 +50074 +50075 +50076 +50077 +50077 +50078 +50079 +50080 +50080 +50081 +50082 +50082 +50083 +50084 +50085 +50085 +50086 +50087 +50088 +50088 +50089 +50090 +50090 +50091 +50092 +50093 +50093 +50094 +50095 +50095 +50096 +50097 +50098 +50098 +50099 +50100 +50100 +50101 +50102 +50103 +50103 +50104 +50105 +50105 +50106 +50107 +50108 +50108 +50109 +50110 +50110 +50111 +50112 +50113 +50113 +50114 +50115 +50115 +50116 +50117 +50118 +50118 +50119 +50120 +50120 +50121 +50122 +50122 +50123 +50124 +50125 +50125 +50126 +50127 +50127 +50128 +50129 +50129 +50130 +50131 +50132 +50132 +50133 +50134 +50134 +50135 +50136 +50136 +50137 +50138 +50139 +50139 +50140 +50141 +50141 +50142 +50143 +50143 +50144 +50145 +50146 +50146 +50147 +50148 +50148 +50149 +50150 +50150 +50151 +50152 +50152 +50153 +50154 +50155 +50155 +50156 +50157 +50157 +50158 +50159 +50159 +50160 +50161 +50161 +50162 +50163 +50164 +50164 +50165 +50166 +50166 +50167 +50168 +50168 +50169 +50170 +50170 +50171 +50172 +50172 +50173 +50174 +50174 +50175 +50176 +50176 +50177 +50177 +50177 +50178 +50178 +50178 +50179 +50179 +50179 +50180 +50180 +50180 +50181 +50181 +50181 +50182 +50182 +50182 +50183 +50183 +50183 +50184 +50184 +50184 +50185 +50185 +50185 +50186 +50186 +50186 +50187 +50187 +50187 +50188 +50188 +50188 +50189 +50189 +50189 +50190 +50190 +50190 +50191 +50191 +50191 +50192 +50192 +50192 +50193 +50193 +50193 +50194 +50194 +50194 +50195 +50195 +50195 +50196 +50196 +50196 +50197 +50197 +50197 +50198 +50198 +50198 +50199 +50199 +50199 +50200 +50200 +50200 +50201 +50201 +50201 +50202 +50202 +50202 +50203 +50203 +50203 +50204 +50204 +50204 +50205 +50205 +50205 +50206 +50206 +50206 +50207 +50207 +50207 +50208 +50208 +50208 +50209 +50209 +50209 +50210 +50210 +50210 +50211 +50211 +50211 +50212 +50212 +50212 +50213 +50213 +50213 +50214 +50214 +50214 +50215 +50215 +50215 +50216 +50216 +50216 +50217 +50217 +50217 +50218 +50218 +50218 +50218 +50219 +50219 +50219 +50220 +50220 +50220 +50221 +50221 +50221 +50222 +50222 +50222 +50223 +50223 +50223 +50224 +50224 +50224 +50225 +50225 +50225 +50226 +50226 +50226 +50227 +50227 +50227 +50228 +50228 +50228 +50228 +50229 +50229 +50229 +50230 +50230 +50230 +50231 +50231 +50231 +50232 +50232 +50232 +50233 +50233 +50233 +50234 +50234 +50234 +50235 +50235 +50235 +50235 +50236 +50236 +50236 +50237 +50237 +50237 +50238 +50238 +50238 +50239 +50239 +50239 +50240 +50240 +50240 +50241 +50241 +50241 +50242 +50242 +50242 +50242 +50243 +50243 +50243 +50244 +50244 +50244 +50245 +50245 +50245 +50246 +50246 +50246 +50247 +50247 +50247 +50247 +50248 +50248 +50248 +50249 +50249 +50249 +50250 +50250 +50250 +50251 +50251 +50251 +50252 +50252 +50252 +50252 +50253 +50253 +50253 +50254 +50254 +50254 +50255 +50255 +50255 +50256 +50256 +50256 +50257 +50257 +50257 +50257 +50258 +50258 +50258 +50259 +50259 +50259 +50260 +50260 +50260 +50261 +50261 +50261 +50261 +50262 +50262 +50262 +50263 +50263 +50263 +50264 +50264 +50264 +50265 +50265 +50265 +50265 +50266 +50266 +50266 +50267 +50267 +50267 +50268 +50268 +50268 +50269 +50269 +50269 +50269 +50270 +50270 +50270 +50271 +50271 +50271 +50272 +50272 +50272 +50273 +50273 +50273 +50273 +50274 +50274 +50274 +50275 +50275 +50275 +50276 +50276 +50276 +50276 +50277 +50277 +50277 +50278 +50278 +50278 +50279 +50279 +50279 +50279 +50280 +50280 +50280 +50281 +50281 +50281 +50282 +50282 +50282 +50283 +50283 +50283 +50283 +50284 +50284 +50284 +50285 +50285 +50285 +50286 +50286 +50286 +50286 +50287 +50287 +50287 +50288 +50288 +50288 +50289 +50289 +50289 +50289 +50290 +50290 +50290 +50291 +50291 +50291 +50292 +50292 +50292 +50292 +50293 +50293 +50293 +50294 +50294 +50294 +50294 +50295 +50295 +50295 +50296 +50296 +50296 +50297 +50297 +50297 +50297 +50298 +50298 +50298 +50299 +50299 +50299 +50300 +50300 +50300 +50300 +50301 +50301 +50301 +50302 +50302 +50302 +50302 +50303 +50303 +50303 +50304 +50304 +50304 +50305 +50305 +50305 +50305 +50306 +50306 +50306 +50307 +50307 +50307 +50307 +50308 +50308 +50308 +50309 +50309 +50309 +50310 +50310 +50310 +50310 +50311 +50311 +50311 +50312 +50312 +50312 +50312 +50313 +50313 +50313 +50314 +50314 +50314 +50314 +50315 +50315 +50315 +50316 +50316 +50316 +50317 +50317 +50317 +50317 +50318 +50318 +50318 +50319 +50319 +50319 +50319 +50320 +50320 +50320 +50321 +50321 +50321 +50321 +50322 +50322 +50322 +50323 +50323 +50323 +50323 +50324 +50324 +50324 +50325 +50325 +50325 +50325 +50326 +50326 +50326 +50327 +50327 +50327 +50327 +50328 +50328 +50328 +50329 +50329 +50329 +50329 +50330 +50330 +50330 +50331 +50331 +50331 +50332 +50332 +50332 +50332 +50333 +50333 +50333 +50333 +50334 +50334 +50334 +50335 +50335 +50335 +50335 +50336 +50336 +50336 +50337 +50337 +50337 +50337 +50338 +50338 +50338 +50339 +50339 +50339 +50339 +50340 +50340 +50340 +50341 +50341 +50341 +50341 +50342 +50342 +50342 +50343 +50343 +50343 +50343 +50344 +50344 +50344 +50345 +50345 +50345 +50345 +50346 +50346 +50346 +50347 +50347 +50347 +50347 +50348 +50348 +50348 +50348 +50349 +50349 +50349 +50350 +50350 +50350 +50350 +50351 +50351 +50351 +50352 +50352 +50352 +50352 +50353 +50353 +50353 +50354 +50354 +50354 +50354 +50355 +50355 +50355 +50355 +50356 +50356 +50356 +50357 +50357 +50357 +50357 +50358 +50358 +50358 +50359 +50359 +50359 +50359 +50360 +50360 +50360 +50360 +50361 +50361 +50361 +50362 +50362 +50362 +50362 +50363 +50363 +50363 +50364 +50364 +50364 +50364 +50365 +50365 +50365 +50365 +50366 +50366 +50366 +50367 +50367 +50367 +50367 +50368 +50368 +50368 +50368 +50369 +50369 +50369 +50370 +50370 +50370 +50370 +50371 +50371 +50371 +50372 +50372 +50372 +50372 +50373 +50373 +50373 +50373 +50374 +50374 +50374 +50375 +50375 +50375 +50375 +50376 +50376 +50376 +50376 +50377 +50377 +50377 +50378 +50378 +50378 +50378 +50379 +50379 +50379 +50379 +50380 +50380 +50380 +50381 +50381 +50381 +50381 +50382 +50382 +50382 +50382 +50383 +50383 +50383 +50384 +50384 +50384 +50384 +50385 +50385 +50385 +50385 +50386 +50386 +50386 +50386 +50387 +50387 +50387 +50388 +50388 +50388 +50388 +50389 +50389 +50389 +50389 +50390 +50390 +50390 +50391 +50391 +50391 +50391 +50392 +50392 +50392 +50392 +50393 +50393 +50393 +50393 +50394 +50394 +50394 +50395 +50395 +50395 +50395 +50396 +50396 +50397 +50397 +50398 +50399 +50399 +50400 +50400 +50401 +50401 +50402 +50402 +50403 +50403 +50404 +50404 +50405 +50405 +50406 +50407 +50407 +50408 +50408 +50409 +50409 +50410 +50410 +50411 +50411 +50412 +50412 +50413 +50413 +50414 +50414 +50415 +50415 +50416 +50417 +50417 +50418 +50418 +50419 +50419 +50420 +50420 +50421 +50421 +50422 +50422 +50423 +50423 +50424 +50424 +50425 +50425 +50426 +50426 +50427 +50427 +50428 +50429 +50429 +50430 +50430 +50431 +50431 +50432 +50432 +50433 +50433 +50434 +50434 +50435 +50435 +50436 +50436 +50437 +50437 +50438 +50438 +50439 +50439 +50440 +50440 +50441 +50441 +50442 +50442 +50443 +50443 +50444 +50444 +50445 +50445 +50446 +50446 +50447 +50447 +50448 +50449 +50449 +50450 +50450 +50451 +50451 +50452 +50452 +50453 +50453 +50454 +50454 +50455 +50455 +50456 +50456 +50457 +50457 +50458 +50458 +50459 +50459 +50460 +50460 +50461 +50461 +50462 +50462 +50463 +50463 +50464 +50464 +50465 +50465 +50466 +50466 +50467 +50467 +50468 +50468 +50469 +50469 +50470 +50470 +50471 +50471 +50472 +50472 +50473 +50473 +50474 +50474 +50475 +50475 +50476 +50476 +50477 +50477 +50478 +50478 +50479 +50479 +50480 +50480 +50481 +50481 +50482 +50482 +50482 +50483 +50483 +50484 +50484 +50485 +50485 +50486 +50486 +50487 +50487 +50488 +50488 +50489 +50489 +50490 +50490 +50491 +50491 +50492 +50492 +50493 +50493 +50494 +50494 +50495 +50495 +50496 +50496 +50497 +50497 +50498 +50498 +50499 +50499 +50500 +50500 +50501 +50501 +50502 +50502 +50502 +50503 +50503 +50504 +50504 +50505 +50505 +50506 +50506 +50507 +50507 +50508 +50508 +50509 +50509 +50510 +50510 +50511 +50511 +50512 +50512 +50513 +50513 +50514 +50514 +50514 +50515 +50515 +50516 +50516 +50517 +50517 +50518 +50518 +50519 +50519 +50520 +50520 +50521 +50521 +50522 +50522 +50523 +50523 +50524 +50524 +50524 +50525 +50525 +50526 +50526 +50527 +50527 +50528 +50528 +50529 +50529 +50530 +50530 +50531 +50531 +50532 +50532 +50532 +50533 +50533 +50534 +50534 +50535 +50535 +50536 +50536 +50537 +50537 +50538 +50538 +50539 +50539 +50539 +50540 +50540 +50541 +50541 +50542 +50542 +50543 +50543 +50544 +50544 +50545 +50545 +50546 +50546 +50546 +50547 +50547 +50548 +50548 +50549 +50549 +50550 +50550 +50551 +50551 +50552 +50552 +50552 +50553 +50553 +50554 +50554 +50555 +50555 +50556 +50556 +50557 +50557 +50558 +50558 +50558 +50559 +50559 +50560 +50560 +50561 +50561 +50562 +50562 +50563 +50563 +50564 +50564 +50564 +50565 +50565 +50566 +50566 +50567 +50567 +50568 +50568 +50569 +50569 +50569 +50570 +50570 +50571 +50571 +50572 +50572 +50573 +50573 +50574 +50574 +50574 +50575 +50575 +50576 +50576 +50577 +50577 +50578 +50578 +50578 +50579 +50579 +50580 +50580 +50581 +50581 +50582 +50582 +50583 +50583 +50583 +50584 +50584 +50585 +50585 +50586 +50586 +50587 +50587 +50587 +50588 +50588 +50589 +50589 +50590 +50590 +50591 +50591 +50591 +50592 +50592 +50593 +50593 +50594 +50594 +50595 +50595 +50595 +50596 +50596 +50597 +50597 +50598 +50598 +50599 +50599 +50599 +50600 +50600 +50601 +50601 +50602 +50602 +50603 +50603 +50603 +50604 +50604 +50605 +50605 +50606 +50606 +50607 +50607 +50607 +50608 +50608 +50609 +50609 +50610 +50610 +50610 +50611 +50611 +50612 +50612 +50613 +50613 +50614 +50614 +50614 +50615 +50615 +50616 +50616 +50617 +50617 +50617 +50618 +50618 +50619 +50619 +50620 +50620 +50621 +50621 +50621 +50622 +50622 +50623 +50623 +50624 +50624 +50624 +50625 +50625 +50626 +50626 +50627 +50627 +50627 +50628 +50628 +50629 +50629 +50630 +50630 +50631 +50631 +50631 +50632 +50632 +50633 +50633 +50634 +50634 +50634 +50635 +50635 +50636 +50636 +50637 +50637 +50637 +50638 +50638 +50639 +50639 +50640 +50640 +50640 +50641 +50641 +50642 +50642 +50643 +50643 +50643 +50644 +50644 +50645 +50645 +50646 +50646 +50646 +50647 +50647 +50648 +50648 +50648 +50649 +50649 +50650 +50650 +50651 +50651 +50651 +50652 +50652 +50653 +50653 +50654 +50654 +50654 +50655 +50655 +50656 +50656 +50657 +50657 +50657 +50658 +50658 +50659 +50659 +50659 +50660 +50660 +50661 +50661 +50662 +50662 +50662 +50663 +50663 +50664 +50664 +50665 +50665 +50665 +50666 +50666 +50667 +50667 +50667 +50668 +50668 +50669 +50669 +50670 +50670 +50670 +50671 +50671 +50672 +50672 +50672 +50673 +50673 +50674 +50674 +50675 +50675 +50675 +50676 +50676 +50677 +50677 +50677 +50678 +50678 +50679 +50679 +50680 +50680 +50680 +50681 +50681 +50682 +50682 +50682 +50683 +50683 +50684 +50684 +50684 +50685 +50685 +50686 +50686 +50687 +50687 +50687 +50688 +50688 +50689 +50689 +50689 +50690 +50690 +50691 +50691 +50691 +50692 +50692 +50693 +50693 +50694 +50694 +50694 +50695 +50695 +50696 +50696 +50696 +50697 +50697 +50698 +50698 +50698 +50699 +50699 +50700 +50700 +50700 +50701 +50701 +50702 +50702 +50702 +50703 +50703 +50704 +50704 +50705 +50705 +50705 +50706 +50706 +50707 +50707 +50707 +50708 +50708 +50709 +50709 +50709 +50710 +50710 +50711 +50711 +50711 +50712 +50712 +50713 +50713 +50713 +50714 +50714 +50715 +50715 +50715 +50716 +50716 +50717 +50717 +50717 +50718 +50718 +50719 +50719 +50719 +50720 +50720 +50721 +50721 +50721 +50722 +50722 +50723 +50723 +50723 +50724 +50724 +50725 +50725 +50725 +50726 +50726 +50727 +50727 +50727 +50728 +50728 +50729 +50729 +50729 +50730 +50730 +50731 +50731 +50731 +50732 +50732 +50733 +50733 +50733 +50734 +50734 +50735 +50735 +50735 +50736 +50736 +50737 +50737 +50737 +50738 +50738 +50739 +50739 +50739 +50740 +50740 +50741 +50741 +50741 +50742 +50742 +50743 +50743 +50743 +50744 +50744 +50744 +50745 +50745 +50746 +50746 +50746 +50747 +50747 +50748 +50748 +50748 +50749 +50749 +50750 +50750 +50750 +50751 +50751 +50752 +50752 +50752 +50753 +50753 +50753 +50754 +50754 +50755 +50755 +50755 +50756 +50756 +50757 +50757 +50757 +50758 +50758 +50759 +50759 +50759 +50760 +50760 +50760 +50761 +50761 +50762 +50762 +50762 +50763 +50763 +50764 +50764 +50764 +50765 +50765 +50766 +50766 +50766 +50767 +50767 +50767 +50768 +50768 +50769 +50769 +50769 +50770 +50770 +50771 +50771 +50771 +50772 +50772 +50772 +50773 +50773 +50774 +50774 +50774 +50775 +50775 +50776 +50776 +50776 +50777 +50777 +50777 +50778 +50778 +50779 +50779 +50779 +50780 +50780 +50781 +50781 +50781 +50782 +50782 +50782 +50783 +50783 +50784 +50784 +50784 +50785 +50785 +50785 +50786 +50786 +50787 +50787 +50787 +50788 +50788 +50789 +50789 +50789 +50790 +50790 +50790 +50791 +50791 +50792 +50792 +50792 +50793 +50793 +50793 +50794 +50794 +50795 +50795 +50795 +50796 +50796 +50797 +50797 +50797 +50798 +50798 +50798 +50799 +50799 +50800 +50800 +50800 +50801 +50801 +50801 +50802 +50802 +50803 +50803 +50803 +50804 +50804 +50804 +50805 +50805 +50806 +50806 +50806 +50807 +50807 +50807 +50808 +50808 +50809 +50809 +50809 +50810 +50810 +50810 +50811 +50811 +50812 +50812 +50812 +50813 +50813 +50813 +50814 +50814 +50815 +50815 +50815 +50816 +50816 +50816 +50817 +50817 +50817 +50818 +50818 +50819 +50819 +50819 +50820 +50820 +50820 +50821 +50821 +50822 +50822 +50822 +50823 +50823 +50823 +50824 +50824 +50825 +50825 +50825 +50826 +50826 +50826 +50827 +50827 +50828 +50828 +50828 +50829 +50829 +50829 +50830 +50830 +50830 +50831 +50831 +50832 +50832 +50832 +50833 +50833 +50833 +50834 +50834 +50834 +50835 +50835 +50836 +50836 +50836 +50837 +50837 +50837 +50838 +50838 +50839 +50839 +50839 +50840 +50840 +50840 +50841 +50841 +50842 +50843 +50843 +50844 +50845 +50845 +50846 +50847 +50848 +50848 +50849 +50850 +50851 +50851 +50852 +50853 +50853 +50854 +50855 +50856 +50856 +50857 +50858 +50859 +50859 +50860 +50861 +50861 +50862 +50863 +50864 +50864 +50865 +50866 +50866 +50867 +50868 +50869 +50869 +50870 +50871 +50871 +50872 +50873 +50874 +50874 +50875 +50876 +50876 +50877 +50878 +50879 +50879 +50880 +50881 +50881 +50882 +50883 +50884 +50884 +50885 +50886 +50886 +50887 +50888 +50889 +50889 +50890 +50891 +50891 +50892 +50893 +50893 +50894 +50895 +50896 +50896 +50897 +50898 +50898 +50899 +50900 +50900 +50901 +50902 +50903 +50903 +50904 +50905 +50905 +50906 +50907 +50907 +50908 +50909 +50910 +50910 +50911 +50912 +50912 +50913 +50914 +50914 +50915 +50916 +50916 +50917 +50918 +50919 +50919 +50920 +50921 +50921 +50922 +50923 +50923 +50924 +50925 +50925 +50926 +50927 +50928 +50928 +50929 +50930 +50930 +50931 +50932 +50932 +50933 +50934 +50934 +50935 +50936 +50936 +50937 +50938 +50938 +50939 +50940 +50941 +50941 +50942 +50943 +50943 +50944 +50945 +50945 +50946 +50947 +50947 +50948 +50949 +50949 +50950 +50951 +50951 +50952 +50953 +50953 +50954 +50955 +50955 +50956 +50957 +50957 +50958 +50959 +50959 +50960 +50961 +50961 +50962 +50963 +50963 +50964 +50965 +50965 +50966 +50967 +50968 +50968 +50969 +50970 +50970 +50971 +50972 +50972 +50973 +50974 +50974 +50975 +50976 +50976 +50977 +50977 +50978 +50979 +50979 +50980 +50981 +50981 +50982 +50983 +50983 +50984 +50985 +50985 +50986 +50987 +50987 +50988 +50989 +50989 +50990 +50991 +50991 +50992 +50993 +50993 +50994 +50995 +50995 +50996 +50997 +50997 +50998 +50999 +50999 +51000 +51001 +51001 +51002 +51003 +51003 +51004 +51004 +51005 +51006 +51006 +51007 +51008 +51008 +51009 +51010 +51010 +51011 +51012 +51012 +51013 +51014 +51014 +51015 +51016 +51016 +51017 +51017 +51018 +51019 +51019 +51020 +51021 +51021 +51022 +51023 +51023 +51024 +51025 +51025 +51026 +51026 +51027 +51028 +51028 +51029 +51030 +51030 +51031 +51032 +51032 +51033 +51034 +51034 +51035 +51035 +51036 +51037 +51037 +51038 +51039 +51039 +51040 +51041 +51041 +51042 +51042 +51043 +51044 +51044 +51045 +51046 +51046 +51047 +51048 +51048 +51049 +51049 +51050 +51051 +51051 +51052 +51053 +51053 +51054 +51054 +51055 +51056 +51056 +51057 +51058 +51058 +51059 +51060 +51060 +51061 +51061 +51062 +51063 +51063 +51064 +51065 +51065 +51066 +51066 +51067 +51068 +51068 +51069 +51070 +51070 +51071 +51071 +51072 +51073 +51073 +51074 +51075 +51075 +51076 +51076 +51077 +51078 +51078 +51079 +51080 +51080 +51081 +51081 +51082 +51083 +51083 +51084 +51084 +51085 +51086 +51086 +51087 +51088 +51088 +51089 +51089 +51090 +51091 +51091 +51092 +51092 +51093 +51094 +51094 +51095 +51096 +51096 +51097 +51097 +51098 +51099 +51099 +51100 +51100 +51101 +51102 +51102 +51103 +51104 +51104 +51105 +51105 +51106 +51107 +51107 +51108 +51108 +51109 +51110 +51110 +51111 +51111 +51112 +51113 +51113 +51114 +51114 +51115 +51116 +51116 +51117 +51118 +51118 +51119 +51119 +51120 +51121 +51121 +51122 +51122 +51123 +51124 +51124 +51125 +51125 +51126 +51127 +51127 +51128 +51128 +51129 +51130 +51130 +51131 +51131 +51132 +51133 +51133 +51134 +51134 +51135 +51136 +51136 +51137 +51137 +51138 +51139 +51139 +51140 +51140 +51141 +51142 +51142 +51143 +51143 +51144 +51145 +51145 +51146 +51146 +51147 +51148 +51148 +51149 +51149 +51150 +51151 +51151 +51152 +51152 +51153 +51153 +51154 +51155 +51155 +51156 +51156 +51157 +51158 +51158 +51159 +51159 +51160 +51161 +51161 +51162 +51162 +51163 +51164 +51164 +51165 +51165 +51166 +51166 +51167 +51168 +51168 +51169 +51169 +51170 +51171 +51171 +51172 +51172 +51173 +51173 +51174 +51175 +51175 +51176 +51176 +51177 +51178 +51178 +51179 +51179 +51180 +51180 +51181 +51182 +51182 +51183 +51183 +51184 +51185 +51185 +51186 +51186 +51187 +51187 +51188 +51189 +51189 +51190 +51190 +51191 +51192 +51192 +51193 +51193 +51194 +51194 +51195 +51196 +51196 +51197 +51197 +51198 +51198 +51199 +51200 +51200 +51200 +51201 +51201 +51201 +51202 +51202 +51202 +51202 +51203 +51203 +51203 +51204 +51204 +51204 +51204 +51205 +51205 +51205 +51206 +51206 +51206 +51206 +51207 +51207 +51207 +51208 +51208 +51208 +51208 +51209 +51209 +51209 +51210 +51210 +51210 +51210 +51211 +51211 +51211 +51212 +51212 +51212 +51212 +51213 +51213 +51213 +51214 +51214 +51214 +51214 +51215 +51215 +51215 +51215 +51216 +51216 +51216 +51217 +51217 +51217 +51217 +51218 +51218 +51218 +51219 +51219 +51219 +51219 +51220 +51220 +51220 +51221 +51221 +51221 +51221 +51222 +51222 +51222 +51223 +51223 +51223 +51223 +51224 +51224 +51224 +51224 +51225 +51225 +51225 +51226 +51226 +51226 +51226 +51227 +51227 +51227 +51228 +51228 +51228 +51228 +51229 +51229 +51229 +51230 +51230 +51230 +51230 +51231 +51231 +51231 +51231 +51232 +51232 +51232 +51233 +51233 +51233 +51233 +51234 +51234 +51234 +51234 +51235 +51235 +51235 +51236 +51236 +51236 +51236 +51237 +51237 +51237 +51238 +51238 +51238 +51238 +51239 +51239 +51239 +51239 +51240 +51240 +51240 +51241 +51241 +51241 +51241 +51242 +51242 +51242 +51242 +51243 +51243 +51243 +51244 +51244 +51244 +51244 +51245 +51245 +51245 +51245 +51246 +51246 +51246 +51247 +51247 +51247 +51247 +51248 +51248 +51248 +51248 +51249 +51249 +51249 +51250 +51250 +51250 +51250 +51251 +51251 +51251 +51251 +51252 +51252 +51252 +51253 +51253 +51253 +51253 +51254 +51254 +51254 +51254 +51255 +51255 +51255 +51256 +51256 +51256 +51256 +51257 +51257 +51257 +51257 +51258 +51258 +51258 +51258 +51259 +51259 +51259 +51260 +51260 +51260 +51260 +51261 +51261 +51261 +51261 +51262 +51262 +51262 +51262 +51263 +51263 +51263 +51264 +51264 +51264 +51264 +51265 +51265 +51265 +51265 +51266 +51266 +51266 +51266 +51267 +51267 +51267 +51268 +51268 +51268 +51268 +51269 +51269 +51269 +51269 +51270 +51270 +51270 +51270 +51271 +51271 +51271 +51272 +51272 +51272 +51272 +51273 +51273 +51273 +51273 +51274 +51274 +51274 +51274 +51275 +51275 +51275 +51276 +51276 +51276 +51276 +51277 +51277 +51277 +51277 +51278 +51278 +51278 +51278 +51279 +51279 +51279 +51279 +51280 +51280 +51280 +51280 +51281 +51281 +51281 +51282 +51282 +51282 +51282 +51283 +51283 +51283 +51283 +51284 +51284 +51284 +51284 +51285 +51285 +51285 +51285 +51286 +51286 +51286 +51287 +51287 +51287 +51287 +51288 +51288 +51288 +51288 +51289 +51289 +51289 +51289 +51290 +51290 +51290 +51290 +51291 +51291 +51291 +51291 +51292 +51292 +51292 +51292 +51293 +51293 +51293 +51294 +51294 +51294 +51294 +51295 +51295 +51295 +51295 +51296 +51296 +51296 +51296 +51297 +51297 +51297 +51297 +51298 +51298 +51298 +51298 +51299 +51299 +51299 +51299 +51300 +51300 +51300 +51300 +51301 +51301 +51301 +51301 +51302 +51302 +51302 +51303 +51303 +51303 +51303 +51304 +51304 +51304 +51304 +51305 +51305 +51305 +51305 +51306 +51306 +51306 +51306 +51307 +51307 +51307 +51307 +51308 +51308 +51308 +51308 +51309 +51309 +51309 +51309 +51310 +51310 +51310 +51310 +51311 +51311 +51311 +51311 +51312 +51312 +51312 +51312 +51313 +51313 +51313 +51313 +51314 +51314 +51314 +51314 +51315 +51315 +51315 +51315 +51316 +51316 +51316 +51316 +51317 +51317 +51317 +51317 +51318 +51318 +51318 +51318 +51319 +51319 +51319 +51319 +51320 +51320 +51320 +51320 +51321 +51321 +51321 +51321 +51322 +51322 +51322 +51322 +51323 +51323 +51323 +51324 +51324 +51324 +51324 +51324 +51325 +51325 +51325 +51326 +51326 +51327 +51327 +51328 +51328 +51329 +51329 +51330 +51330 +51331 +51331 +51332 +51332 +51333 +51333 +51334 +51334 +51335 +51335 +51336 +51336 +51337 +51337 +51338 +51338 +51339 +51339 +51340 +51340 +51341 +51341 +51342 +51342 +51343 +51343 +51344 +51344 +51345 +51345 +51346 +51346 +51347 +51347 +51348 +51348 +51349 +51349 +51350 +51350 +51351 +51351 +51352 +51352 +51353 +51353 +51354 +51354 +51354 +51355 +51355 +51356 +51356 +51357 +51357 +51358 +51358 +51359 +51359 +51360 +51360 +51361 +51361 +51362 +51362 +51363 +51363 +51364 +51364 +51365 +51365 +51366 +51366 +51367 +51367 +51367 +51368 +51368 +51369 +51369 +51370 +51370 +51371 +51371 +51372 +51372 +51373 +51373 +51374 +51374 +51375 +51375 +51376 +51376 +51376 +51377 +51377 +51378 +51378 +51379 +51379 +51380 +51380 +51381 +51381 +51382 +51382 +51383 +51383 +51384 +51384 +51385 +51385 +51385 +51386 +51386 +51387 +51387 +51388 +51388 +51389 +51389 +51390 +51390 +51391 +51391 +51392 +51392 +51392 +51393 +51393 +51394 +51394 +51395 +51395 +51396 +51396 +51397 +51397 +51398 +51398 +51398 +51399 +51399 +51400 +51400 +51401 +51401 +51402 +51402 +51403 +51403 +51404 +51404 +51404 +51405 +51405 +51406 +51406 +51407 +51407 +51408 +51408 +51409 +51409 +51410 +51410 +51410 +51411 +51411 +51412 +51412 +51413 +51413 +51414 +51414 +51415 +51415 +51415 +51416 +51416 +51417 +51417 +51418 +51418 +51419 +51419 +51420 +51420 +51420 +51421 +51421 +51422 +51422 +51423 +51423 +51424 +51424 +51424 +51425 +51425 +51426 +51426 +51427 +51427 +51428 +51428 +51429 +51429 +51429 +51430 +51430 +51431 +51431 +51432 +51432 +51433 +51433 +51433 +51434 +51434 +51435 +51435 +51436 +51436 +51437 +51437 +51437 +51438 +51438 +51439 +51439 +51440 +51440 +51441 +51441 +51441 +51442 +51442 +51443 +51443 +51444 +51444 +51445 +51445 +51445 +51446 +51446 +51447 +51447 +51448 +51448 +51449 +51449 +51449 +51450 +51450 +51451 +51451 +51452 +51452 +51452 +51453 +51453 +51454 +51454 +51455 +51455 +51456 +51456 +51456 +51457 +51457 +51458 +51458 +51459 +51459 +51459 +51460 +51460 +51461 +51461 +51462 +51462 +51463 +51463 +51463 +51464 +51464 +51465 +51465 +51466 +51466 +51466 +51467 +51467 +51468 +51468 +51469 +51469 +51469 +51470 +51470 +51471 +51471 +51472 +51472 +51472 +51473 +51473 +51474 +51474 +51475 +51475 +51475 +51476 +51476 +51477 +51477 +51478 +51478 +51478 +51479 +51479 +51480 +51480 +51481 +51481 +51481 +51482 +51482 +51483 +51483 +51484 +51484 +51484 +51485 +51485 +51486 +51486 +51487 +51487 +51487 +51488 +51488 +51489 +51489 +51490 +51490 +51490 +51491 +51491 +51492 +51492 +51492 +51493 +51493 +51494 +51494 +51495 +51495 +51495 +51496 +51496 +51497 +51497 +51498 +51498 +51498 +51499 +51499 +51500 +51500 +51500 +51501 +51501 +51502 +51502 +51503 +51503 +51503 +51504 +51504 +51505 +51505 +51505 +51506 +51506 +51507 +51507 +51508 +51508 +51508 +51509 +51509 +51510 +51510 +51510 +51511 +51511 +51512 +51512 +51513 +51513 +51513 +51514 +51514 +51515 +51515 +51515 +51516 +51516 +51517 +51517 +51518 +51518 +51518 +51519 +51519 +51520 +51520 +51520 +51521 +51521 +51522 +51522 +51522 +51523 +51523 +51524 +51524 +51525 +51525 +51525 +51526 +51526 +51527 +51527 +51527 +51528 +51528 +51529 +51529 +51529 +51530 +51530 +51531 +51531 +51531 +51532 +51532 +51533 +51533 +51533 +51534 +51534 +51535 +51535 +51536 +51536 +51536 +51537 +51537 +51538 +51538 +51538 +51539 +51539 +51540 +51540 +51540 +51541 +51541 +51542 +51542 +51542 +51543 +51543 +51544 +51544 +51544 +51545 +51545 +51546 +51546 +51546 +51547 +51547 +51548 +51548 +51548 +51549 +51549 +51550 +51550 +51550 +51551 +51551 +51552 +51552 +51552 +51553 +51553 +51554 +51554 +51554 +51555 +51555 +51556 +51556 +51556 +51557 +51557 +51558 +51558 +51558 +51559 +51559 +51560 +51560 +51560 +51561 +51561 +51562 +51562 +51562 +51563 +51563 +51564 +51564 +51564 +51565 +51565 +51566 +51566 +51566 +51567 +51567 +51568 +51568 +51568 +51569 +51569 +51569 +51570 +51570 +51571 +51571 +51571 +51572 +51572 +51573 +51573 +51573 +51574 +51574 +51575 +51575 +51575 +51576 +51576 +51577 +51577 +51577 +51578 +51578 +51578 +51579 +51579 +51580 +51580 +51580 +51581 +51581 +51582 +51582 +51582 +51583 +51583 +51584 +51584 +51584 +51585 +51585 +51585 +51586 +51586 +51587 +51587 +51587 +51588 +51588 +51589 +51589 +51589 +51590 +51590 +51591 +51591 +51591 +51592 +51592 +51592 +51593 +51593 +51594 +51594 +51594 +51595 +51595 +51596 +51596 +51596 +51597 +51597 +51597 +51598 +51598 +51599 +51599 +51599 +51600 +51600 +51601 +51601 +51601 +51602 +51602 +51602 +51603 +51603 +51604 +51604 +51604 +51605 +51605 +51605 +51606 +51606 +51607 +51607 +51607 +51608 +51608 +51609 +51609 +51609 +51610 +51610 +51610 +51611 +51611 +51612 +51612 +51612 +51613 +51613 +51613 +51614 +51614 +51615 +51615 +51615 +51616 +51616 +51616 +51617 +51617 +51618 +51618 +51618 +51619 +51619 +51620 +51620 +51620 +51621 +51621 +51621 +51622 +51622 +51623 +51623 +51623 +51624 +51624 +51624 +51625 +51625 +51626 +51626 +51626 +51627 +51627 +51627 +51628 +51628 +51629 +51629 +51629 +51630 +51630 +51630 +51631 +51631 +51632 +51632 +51632 +51633 +51633 +51633 +51634 +51634 +51634 +51635 +51635 +51636 +51636 +51636 +51637 +51637 +51637 +51638 +51638 +51639 +51639 +51639 +51640 +51640 +51640 +51641 +51641 +51642 +51642 +51642 +51643 +51643 +51643 +51644 +51644 +51644 +51645 +51645 +51646 +51646 +51646 +51647 +51647 +51647 +51648 +51648 +51649 +51649 +51649 +51650 +51650 +51650 +51651 +51651 +51651 +51652 +51652 +51653 +51653 +51653 +51654 +51654 +51654 +51655 +51655 +51656 +51656 +51656 +51657 +51657 +51657 +51658 +51658 +51658 +51659 +51659 +51660 +51660 +51660 +51661 +51661 +51661 +51662 +51662 +51662 +51663 +51663 +51664 +51664 +51664 +51665 +51665 +51665 +51666 +51666 +51666 +51667 +51667 +51668 +51668 +51668 +51669 +51669 +51669 +51670 +51670 +51670 +51671 +51671 +51671 +51672 +51672 +51673 +51673 +51673 +51674 +51674 +51674 +51675 +51675 +51675 +51676 +51676 +51677 +51677 +51677 +51678 +51678 +51678 +51679 +51679 +51679 +51680 +51680 +51680 +51681 +51681 +51682 +51682 +51682 +51683 +51683 +51683 +51684 +51684 +51684 +51685 +51685 +51685 +51686 +51686 +51687 +51687 +51687 +51688 +51688 +51688 +51689 +51689 +51689 +51690 +51690 +51690 +51691 +51691 +51692 +51692 +51692 +51693 +51693 +51693 +51694 +51694 +51694 +51695 +51695 +51695 +51696 +51696 +51696 +51697 +51697 +51698 +51698 +51698 +51699 +51699 +51699 +51700 +51700 +51700 +51701 +51701 +51701 +51702 +51702 +51702 +51703 +51703 +51704 +51704 +51704 +51705 +51705 +51705 +51706 +51706 +51706 +51707 +51707 +51707 +51708 +51708 +51708 +51709 +51709 +51709 +51710 +51710 +51711 +51711 +51711 +51712 +51712 +51712 +51713 +51713 +51713 +51714 +51714 +51714 +51715 +51715 +51715 +51716 +51716 +51716 +51717 +51717 +51717 +51718 +51718 +51719 +51719 +51719 +51720 +51720 +51720 +51721 +51721 +51721 +51722 +51722 +51722 +51723 +51723 +51723 +51724 +51724 +51724 +51725 +51725 +51725 +51726 +51726 +51726 +51727 +51727 +51728 +51728 +51728 +51729 +51729 +51729 +51730 +51730 +51730 +51731 +51731 +51731 +51732 +51732 +51732 +51733 +51733 +51733 +51734 +51734 +51734 +51735 +51735 +51735 +51736 +51736 +51736 +51737 +51737 +51737 +51738 +51738 +51739 +51739 +51739 +51740 +51740 +51740 +51741 +51741 +51742 +51742 +51743 +51744 +51744 +51745 +51746 +51746 +51747 +51748 +51748 +51749 +51750 +51750 +51751 +51752 +51752 +51753 +51754 +51754 +51755 +51756 +51756 +51757 +51758 +51759 +51759 +51760 +51761 +51761 +51762 +51763 +51763 +51764 +51765 +51765 +51766 +51767 +51767 +51768 +51769 +51769 +51770 +51771 +51771 +51772 +51773 +51773 +51774 +51775 +51775 +51776 +51777 +51777 +51778 +51779 +51779 +51780 +51781 +51781 +51782 +51782 +51783 +51784 +51784 +51785 +51786 +51786 +51787 +51788 +51788 +51789 +51790 +51790 +51791 +51792 +51792 +51793 +51794 +51794 +51795 +51796 +51796 +51797 +51798 +51798 +51799 +51800 +51800 +51801 +51802 +51802 +51803 +51803 +51804 +51805 +51805 +51806 +51807 +51807 +51808 +51809 +51809 +51810 +51811 +51811 +51812 +51813 +51813 +51814 +51814 +51815 +51816 +51816 +51817 +51818 +51818 +51819 +51820 +51820 +51821 +51822 +51822 +51823 +51823 +51824 +51825 +51825 +51826 +51827 +51827 +51828 +51829 +51829 +51830 +51830 +51831 +51832 +51832 +51833 +51834 +51834 +51835 +51836 +51836 +51837 +51837 +51838 +51839 +51839 +51840 +51841 +51841 +51842 +51843 +51843 +51844 +51844 +51845 +51846 +51846 +51847 +51848 +51848 +51849 +51849 +51850 +51851 +51851 +51852 +51853 +51853 +51854 +51854 +51855 +51856 +51856 +51857 +51858 +51858 +51859 +51859 +51860 +51861 +51861 +51862 +51863 +51863 +51864 +51864 +51865 +51866 +51866 +51867 +51868 +51868 +51869 +51869 +51870 +51871 +51871 +51872 +51872 +51873 +51874 +51874 +51875 +51876 +51876 +51877 +51877 +51878 +51879 +51879 +51880 +51880 +51881 +51882 +51882 +51883 +51884 +51884 +51885 +51885 +51886 +51887 +51887 +51888 +51888 +51889 +51890 +51890 +51891 +51892 +51892 +51893 +51893 +51894 +51895 +51895 +51896 +51896 +51897 +51898 +51898 +51899 +51899 +51900 +51901 +51901 +51902 +51902 +51903 +51904 +51904 +51905 +51905 +51906 +51907 +51907 +51908 +51908 +51909 +51910 +51910 +51911 +51911 +51912 +51913 +51913 +51914 +51914 +51915 +51916 +51916 +51917 +51917 +51918 +51919 +51919 +51920 +51920 +51921 +51922 +51922 +51923 +51923 +51924 +51925 +51925 +51926 +51926 +51927 +51928 +51928 +51929 +51929 +51930 +51931 +51931 +51932 +51932 +51933 +51934 +51934 +51935 +51935 +51936 +51936 +51937 +51938 +51938 +51939 +51939 +51940 +51941 +51941 +51942 +51942 +51943 +51944 +51944 +51945 +51945 +51946 +51946 +51947 +51948 +51948 +51949 +51949 +51950 +51951 +51951 +51952 +51952 +51953 +51953 +51954 +51955 +51955 +51956 +51956 +51957 +51958 +51958 +51959 +51959 +51960 +51960 +51961 +51962 +51962 +51963 +51963 +51964 +51965 +51965 +51966 +51966 +51967 +51967 +51968 +51969 +51969 +51970 +51970 +51971 +51971 +51972 +51973 +51973 +51974 +51974 +51975 +51975 +51976 +51977 +51977 +51978 +51978 +51979 +51979 +51980 +51981 +51981 +51982 +51982 +51983 +51983 +51984 +51985 +51985 +51986 +51986 +51987 +51987 +51988 +51989 +51989 +51990 +51990 +51991 +51991 +51992 +51993 +51993 +51994 +51994 +51995 +51995 +51996 +51997 +51997 +51998 +51998 +51999 +51999 +52000 +52001 +52001 +52002 +52002 +52003 +52003 +52004 +52004 +52005 +52006 +52006 +52007 +52007 +52008 +52008 +52009 +52010 +52010 +52011 +52011 +52012 +52012 +52013 +52013 +52014 +52015 +52015 +52016 +52016 +52017 +52017 +52018 +52018 +52019 +52020 +52020 +52021 +52021 +52022 +52022 +52023 +52023 +52024 +52025 +52025 +52026 +52026 +52027 +52027 +52028 +52028 +52029 +52030 +52030 +52031 +52031 +52032 +52032 +52033 +52033 +52034 +52035 +52035 +52036 +52036 +52037 +52037 +52038 +52038 +52039 +52040 +52040 +52041 +52041 +52042 +52042 +52043 +52043 +52044 +52044 +52045 +52046 +52046 +52047 +52047 +52048 +52048 +52049 +52049 +52050 +52050 +52051 +52052 +52052 +52053 +52053 +52054 +52054 +52055 +52055 +52056 +52056 +52057 +52058 +52058 +52059 +52059 +52060 +52060 +52061 +52061 +52062 +52062 +52063 +52064 +52064 +52065 +52065 +52066 +52066 +52067 +52067 +52068 +52068 +52069 +52069 +52070 +52071 +52071 +52072 +52072 +52073 +52073 +52074 +52074 +52075 +52075 +52076 +52076 +52077 +52078 +52078 +52079 +52079 +52080 +52080 +52081 +52081 +52082 +52082 +52083 +52083 +52084 +52085 +52085 +52086 +52086 +52087 +52087 +52088 +52088 +52089 +52089 +52090 +52090 +52091 +52091 +52092 +52092 +52093 +52094 +52094 +52095 +52095 +52096 +52096 +52097 +52097 +52098 +52098 +52099 +52099 +52100 +52100 +52101 +52102 +52102 +52103 +52103 +52104 +52104 +52105 +52105 +52106 +52106 +52107 +52107 +52108 +52108 +52109 +52109 +52110 +52110 +52111 +52112 +52112 +52113 +52113 +52114 +52114 +52115 +52115 +52116 +52116 +52117 +52117 +52118 +52118 +52119 +52119 +52120 +52120 +52121 +52121 +52122 +52122 +52123 +52124 +52124 +52125 +52125 +52126 +52126 +52127 +52127 +52128 +52128 +52129 +52129 +52130 +52130 +52131 +52131 +52132 +52132 +52133 +52133 +52134 +52134 +52135 +52135 +52136 +52137 +52137 +52138 +52138 +52139 +52139 +52140 +52140 +52141 +52141 +52142 +52142 +52143 +52143 +52144 +52144 +52145 +52145 +52146 +52146 +52147 +52147 +52148 +52148 +52149 +52149 +52150 +52150 +52151 +52151 +52152 +52152 +52153 +52153 +52154 +52154 +52155 +52156 +52156 +52157 +52157 +52158 +52158 +52159 +52159 +52160 +52160 +52161 +52161 +52162 +52162 +52163 +52163 +52164 +52164 +52165 +52165 +52166 +52166 +52167 +52167 +52168 +52168 +52169 +52169 +52170 +52170 +52171 +52171 +52172 +52172 +52173 +52173 +52174 +52174 +52175 +52175 +52176 +52176 +52177 +52177 +52178 +52178 +52179 +52179 +52180 +52180 +52181 +52181 +52182 +52182 +52183 +52183 +52184 +52184 +52185 +52185 +52186 +52186 +52187 +52187 +52188 +52188 +52189 +52189 +52190 +52190 +52191 +52191 +52192 +52192 +52193 +52193 +52194 +52194 +52195 +52195 +52196 +52196 +52197 +52197 +52198 +52198 +52199 +52199 +52200 +52200 +52201 +52201 +52202 +52202 +52203 +52203 +52204 +52204 +52205 +52205 +52206 +52206 +52207 +52207 +52208 +52208 +52209 +52209 +52210 +52210 +52211 +52211 +52212 +52212 +52213 +52213 +52214 +52214 +52215 +52215 +52216 +52216 +52217 +52217 +52218 +52218 +52219 +52219 +52220 +52220 +52221 +52221 +52222 +52222 +52223 +52223 +52224 +52224 +52224 +52225 +52225 +52225 +52225 +52225 +52226 +52226 +52226 +52226 +52227 +52227 +52227 +52227 +52228 +52228 +52228 +52228 +52229 +52229 +52229 +52229 +52230 +52230 +52230 +52230 +52231 +52231 +52231 +52231 +52232 +52232 +52232 +52232 +52233 +52233 +52233 +52233 +52234 +52234 +52234 +52234 +52234 +52235 +52235 +52235 +52235 +52236 +52236 +52236 +52236 +52237 +52237 +52237 +52237 +52238 +52238 +52238 +52238 +52239 +52239 +52239 +52239 +52240 +52240 +52240 +52240 +52240 +52241 +52241 +52241 +52241 +52242 +52242 +52242 +52242 +52243 +52243 +52243 +52243 +52244 +52244 +52244 +52244 +52245 +52245 +52245 +52245 +52246 +52246 +52246 +52246 +52246 +52247 +52247 +52247 +52247 +52248 +52248 +52248 +52248 +52249 +52249 +52249 +52249 +52250 +52250 +52250 +52250 +52251 +52251 +52251 +52251 +52251 +52252 +52252 +52252 +52252 +52253 +52253 +52253 +52253 +52254 +52254 +52254 +52254 +52255 +52255 +52255 +52255 +52255 +52256 +52256 +52256 +52256 +52257 +52257 +52257 +52257 +52258 +52258 +52258 +52258 +52259 +52259 +52259 +52259 +52259 +52260 +52260 +52260 +52260 +52261 +52261 +52261 +52261 +52262 +52262 +52262 +52262 +52263 +52263 +52263 +52263 +52263 +52264 +52264 +52264 +52264 +52265 +52265 +52265 +52265 +52266 +52266 +52266 +52266 +52267 +52267 +52267 +52268 +52268 +52269 +52269 +52270 +52270 +52271 +52271 +52272 +52272 +52273 +52273 +52273 +52274 +52274 +52275 +52275 +52276 +52276 +52277 +52277 +52278 +52278 +52279 +52279 +52279 +52280 +52280 +52281 +52281 +52282 +52282 +52283 +52283 +52284 +52284 +52284 +52285 +52285 +52286 +52286 +52287 +52287 +52288 +52288 +52289 +52289 +52289 +52290 +52290 +52291 +52291 +52292 +52292 +52293 +52293 +52294 +52294 +52294 +52295 +52295 +52296 +52296 +52297 +52297 +52298 +52298 +52299 +52299 +52299 +52300 +52300 +52301 +52301 +52302 +52302 +52303 +52303 +52303 +52304 +52304 +52305 +52305 +52306 +52306 +52307 +52307 +52307 +52308 +52308 +52309 +52309 +52310 +52310 +52311 +52311 +52311 +52312 +52312 +52313 +52313 +52314 +52314 +52315 +52315 +52315 +52316 +52316 +52317 +52317 +52318 +52318 +52319 +52319 +52319 +52320 +52320 +52321 +52321 +52322 +52322 +52322 +52323 +52323 +52324 +52324 +52325 +52325 +52326 +52326 +52326 +52327 +52327 +52328 +52328 +52329 +52329 +52329 +52330 +52330 +52331 +52331 +52332 +52332 +52332 +52333 +52333 +52334 +52334 +52335 +52335 +52335 +52336 +52336 +52337 +52337 +52338 +52338 +52339 +52339 +52339 +52340 +52340 +52341 +52341 +52342 +52342 +52342 +52343 +52343 +52344 +52344 +52345 +52345 +52345 +52346 +52346 +52347 +52347 +52347 +52348 +52348 +52349 +52349 +52350 +52350 +52350 +52351 +52351 +52352 +52352 +52353 +52353 +52353 +52354 +52354 +52355 +52355 +52356 +52356 +52356 +52357 +52357 +52358 +52358 +52359 +52359 +52359 +52360 +52360 +52361 +52361 +52361 +52362 +52362 +52363 +52363 +52364 +52364 +52364 +52365 +52365 +52366 +52366 +52366 +52367 +52367 +52368 +52368 +52369 +52369 +52369 +52370 +52370 +52371 +52371 +52371 +52372 +52372 +52373 +52373 +52374 +52374 +52374 +52375 +52375 +52376 +52376 +52376 +52377 +52377 +52378 +52378 +52378 +52379 +52379 +52380 +52380 +52381 +52381 +52381 +52382 +52382 +52383 +52383 +52383 +52384 +52384 +52385 +52385 +52385 +52386 +52386 +52387 +52387 +52388 +52388 +52388 +52389 +52389 +52390 +52390 +52390 +52391 +52391 +52392 +52392 +52392 +52393 +52393 +52394 +52394 +52394 +52395 +52395 +52396 +52396 +52396 +52397 +52397 +52398 +52398 +52398 +52399 +52399 +52400 +52400 +52400 +52401 +52401 +52402 +52402 +52403 +52403 +52403 +52404 +52404 +52405 +52405 +52405 +52406 +52406 +52407 +52407 +52407 +52408 +52408 +52409 +52409 +52409 +52410 +52410 +52411 +52411 +52411 +52412 +52412 +52412 +52413 +52413 +52414 +52414 +52414 +52415 +52415 +52416 +52416 +52416 +52417 +52417 +52418 +52418 +52418 +52419 +52419 +52420 +52420 +52420 +52421 +52421 +52422 +52422 +52422 +52423 +52423 +52424 +52424 +52424 +52425 +52425 +52426 +52426 +52426 +52427 +52427 +52428 +52428 +52428 +52429 +52429 +52429 +52430 +52430 +52431 +52431 +52431 +52432 +52432 +52433 +52433 +52433 +52434 +52434 +52435 +52435 +52435 +52436 +52436 +52436 +52437 +52437 +52438 +52438 +52438 +52439 +52439 +52440 +52440 +52440 +52441 +52441 +52442 +52442 +52442 +52443 +52443 +52443 +52444 +52444 +52445 +52445 +52445 +52446 +52446 +52447 +52447 +52447 +52448 +52448 +52448 +52449 +52449 +52450 +52450 +52450 +52451 +52451 +52452 +52452 +52452 +52453 +52453 +52453 +52454 +52454 +52455 +52455 +52455 +52456 +52456 +52456 +52457 +52457 +52458 +52458 +52458 +52459 +52459 +52460 +52460 +52460 +52461 +52461 +52461 +52462 +52462 +52463 +52463 +52463 +52464 +52464 +52464 +52465 +52465 +52466 +52466 +52466 +52467 +52467 +52467 +52468 +52468 +52469 +52469 +52469 +52470 +52470 +52470 +52471 +52471 +52472 +52472 +52472 +52473 +52473 +52473 +52474 +52474 +52475 +52475 +52475 +52476 +52476 +52476 +52477 +52477 +52478 +52478 +52478 +52479 +52479 +52479 +52480 +52480 +52481 +52481 +52481 +52482 +52482 +52482 +52483 +52483 +52484 +52484 +52484 +52485 +52485 +52485 +52486 +52486 +52487 +52487 +52487 +52488 +52488 +52488 +52489 +52489 +52489 +52490 +52490 +52491 +52491 +52491 +52492 +52492 +52492 +52493 +52493 +52494 +52494 +52494 +52495 +52495 +52495 +52496 +52496 +52496 +52497 +52497 +52498 +52498 +52498 +52499 +52499 +52499 +52500 +52500 +52500 +52501 +52501 +52502 +52502 +52502 +52503 +52503 +52503 +52504 +52504 +52504 +52505 +52505 +52506 +52506 +52506 +52507 +52507 +52507 +52508 +52508 +52508 +52509 +52509 +52510 +52510 +52510 +52511 +52511 +52511 +52512 +52512 +52512 +52513 +52513 +52514 +52514 +52514 +52515 +52515 +52515 +52516 +52516 +52516 +52517 +52517 +52517 +52518 +52518 +52519 +52519 +52519 +52520 +52520 +52520 +52521 +52521 +52521 +52522 +52522 +52523 +52523 +52523 +52524 +52524 +52524 +52525 +52525 +52525 +52526 +52526 +52526 +52527 +52527 +52528 +52528 +52528 +52529 +52529 +52529 +52530 +52530 +52530 +52531 +52531 +52531 +52532 +52532 +52532 +52533 +52533 +52534 +52534 +52534 +52535 +52535 +52535 +52536 +52536 +52536 +52537 +52537 +52537 +52538 +52538 +52538 +52539 +52539 +52540 +52540 +52540 +52541 +52541 +52541 +52542 +52542 +52542 +52543 +52543 +52543 +52544 +52544 +52544 +52545 +52545 +52546 +52546 +52546 +52547 +52547 +52547 +52548 +52548 +52548 +52549 +52549 +52549 +52550 +52550 +52550 +52551 +52551 +52551 +52552 +52552 +52552 +52553 +52553 +52554 +52554 +52554 +52555 +52555 +52555 +52556 +52556 +52556 +52557 +52557 +52557 +52558 +52558 +52558 +52559 +52559 +52559 +52560 +52560 +52560 +52561 +52561 +52562 +52562 +52562 +52563 +52563 +52563 +52564 +52564 +52564 +52565 +52565 +52565 +52566 +52566 +52566 +52567 +52567 +52567 +52568 +52568 +52568 +52569 +52569 +52569 +52570 +52570 +52570 +52571 +52571 +52571 +52572 +52572 +52572 +52573 +52573 +52574 +52574 +52574 +52575 +52575 +52575 +52576 +52576 +52576 +52577 +52577 +52577 +52578 +52578 +52578 +52579 +52579 +52579 +52580 +52580 +52580 +52581 +52581 +52581 +52582 +52582 +52582 +52583 +52583 +52583 +52584 +52584 +52584 +52585 +52585 +52585 +52586 +52586 +52586 +52587 +52587 +52587 +52588 +52588 +52588 +52589 +52589 +52589 +52590 +52590 +52590 +52591 +52591 +52591 +52592 +52592 +52592 +52593 +52593 +52593 +52594 +52594 +52594 +52595 +52595 +52595 +52596 +52596 +52596 +52597 +52597 +52598 +52598 +52598 +52599 +52599 +52599 +52600 +52600 +52600 +52601 +52601 +52601 +52602 +52602 +52602 +52603 +52603 +52603 +52604 +52604 +52604 +52604 +52605 +52605 +52605 +52606 +52606 +52606 +52607 +52607 +52607 +52608 +52608 +52608 +52609 +52609 +52609 +52610 +52610 +52610 +52611 +52611 +52611 +52612 +52612 +52612 +52613 +52613 +52613 +52614 +52614 +52614 +52615 +52615 +52615 +52616 +52616 +52616 +52617 +52617 +52617 +52618 +52618 +52618 +52619 +52619 +52619 +52620 +52620 +52620 +52621 +52621 +52621 +52622 +52622 +52622 +52623 +52623 +52623 +52624 +52624 +52624 +52625 +52625 +52625 +52626 +52626 +52626 +52627 +52627 +52627 +52628 +52628 +52628 +52628 +52629 +52629 +52629 +52630 +52630 +52630 +52631 +52631 +52631 +52632 +52632 +52632 +52633 +52633 +52633 +52634 +52634 +52634 +52635 +52635 +52635 +52636 +52636 +52636 +52637 +52637 +52637 +52638 +52638 +52638 +52639 +52639 +52639 +52640 +52640 +52640 +52640 +52641 +52641 +52641 +52642 +52642 +52642 +52643 +52643 +52643 +52644 +52644 +52644 +52645 +52645 +52645 +52646 +52646 +52646 +52647 +52647 +52647 +52648 +52648 +52648 +52648 +52649 +52649 +52649 +52650 +52650 +52650 +52651 +52651 +52651 +52652 +52652 +52652 +52653 +52653 +52653 +52654 +52654 +52654 +52655 +52655 +52656 +52656 +52657 +52658 +52658 +52659 +52660 +52660 +52661 +52662 +52662 +52663 +52663 +52664 +52665 +52665 +52666 +52667 +52667 +52668 +52668 +52669 +52670 +52670 +52671 +52672 +52672 +52673 +52673 +52674 +52675 +52675 +52676 +52677 +52677 +52678 +52678 +52679 +52680 +52680 +52681 +52682 +52682 +52683 +52683 +52684 +52685 +52685 +52686 +52687 +52687 +52688 +52688 +52689 +52690 +52690 +52691 +52692 +52692 +52693 +52693 +52694 +52695 +52695 +52696 +52696 +52697 +52698 +52698 +52699 +52700 +52700 +52701 +52701 +52702 +52703 +52703 +52704 +52704 +52705 +52706 +52706 +52707 +52707 +52708 +52709 +52709 +52710 +52711 +52711 +52712 +52712 +52713 +52714 +52714 +52715 +52715 +52716 +52717 +52717 +52718 +52718 +52719 +52720 +52720 +52721 +52721 +52722 +52723 +52723 +52724 +52724 +52725 +52726 +52726 +52727 +52727 +52728 +52729 +52729 +52730 +52730 +52731 +52732 +52732 +52733 +52733 +52734 +52735 +52735 +52736 +52736 +52737 +52738 +52738 +52739 +52739 +52740 +52741 +52741 +52742 +52742 +52743 +52743 +52744 +52745 +52745 +52746 +52746 +52747 +52748 +52748 +52749 +52749 +52750 +52751 +52751 +52752 +52752 +52753 +52753 +52754 +52755 +52755 +52756 +52756 +52757 +52758 +52758 +52759 +52759 +52760 +52761 +52761 +52762 +52762 +52763 +52763 +52764 +52765 +52765 +52766 +52766 +52767 +52768 +52768 +52769 +52769 +52770 +52770 +52771 +52772 +52772 +52773 +52773 +52774 +52774 +52775 +52776 +52776 +52777 +52777 +52778 +52778 +52779 +52780 +52780 +52781 +52781 +52782 +52783 +52783 +52784 +52784 +52785 +52785 +52786 +52787 +52787 +52788 +52788 +52789 +52789 +52790 +52791 +52791 +52792 +52792 +52793 +52793 +52794 +52795 +52795 +52796 +52796 +52797 +52797 +52798 +52798 +52799 +52800 +52800 +52801 +52801 +52802 +52802 +52803 +52804 +52804 +52805 +52805 +52806 +52806 +52807 +52808 +52808 +52809 +52809 +52810 +52810 +52811 +52811 +52812 +52813 +52813 +52814 +52814 +52815 +52815 +52816 +52816 +52817 +52818 +52818 +52819 +52819 +52820 +52820 +52821 +52822 +52822 +52823 +52823 +52824 +52824 +52825 +52825 +52826 +52827 +52827 +52828 +52828 +52829 +52829 +52830 +52830 +52831 +52832 +52832 +52833 +52833 +52834 +52834 +52835 +52835 +52836 +52836 +52837 +52838 +52838 +52839 +52839 +52840 +52840 +52841 +52841 +52842 +52843 +52843 +52844 +52844 +52845 +52845 +52846 +52846 +52847 +52847 +52848 +52849 +52849 +52850 +52850 +52851 +52851 +52852 +52852 +52853 +52853 +52854 +52855 +52855 +52856 +52856 +52857 +52857 +52858 +52858 +52859 +52859 +52860 +52860 +52861 +52862 +52862 +52863 +52863 +52864 +52864 +52865 +52865 +52866 +52866 +52867 +52868 +52868 +52869 +52869 +52870 +52870 +52871 +52871 +52872 +52872 +52873 +52873 +52874 +52874 +52875 +52876 +52876 +52877 +52877 +52878 +52878 +52879 +52879 +52880 +52880 +52881 +52881 +52882 +52882 +52883 +52884 +52884 +52885 +52885 +52886 +52886 +52887 +52887 +52888 +52888 +52889 +52889 +52890 +52890 +52891 +52892 +52892 +52893 +52893 +52894 +52894 +52895 +52895 +52896 +52896 +52897 +52897 +52898 +52898 +52899 +52899 +52900 +52900 +52901 +52902 +52902 +52903 +52903 +52904 +52904 +52905 +52905 +52906 +52906 +52907 +52907 +52908 +52908 +52909 +52909 +52910 +52910 +52911 +52911 +52912 +52912 +52913 +52914 +52914 +52915 +52915 +52916 +52916 +52917 +52917 +52918 +52918 +52919 +52919 +52920 +52920 +52921 +52921 +52922 +52922 +52923 +52923 +52924 +52924 +52925 +52925 +52926 +52926 +52927 +52928 +52928 +52929 +52929 +52930 +52930 +52931 +52931 +52932 +52932 +52933 +52933 +52934 +52934 +52935 +52935 +52936 +52936 +52937 +52937 +52938 +52938 +52939 +52939 +52940 +52940 +52941 +52941 +52942 +52942 +52943 +52943 +52944 +52944 +52945 +52945 +52946 +52946 +52947 +52947 +52948 +52948 +52949 +52950 +52950 +52951 +52951 +52952 +52952 +52953 +52953 +52954 +52954 +52955 +52955 +52956 +52956 +52957 +52957 +52958 +52958 +52959 +52959 +52960 +52960 +52961 +52961 +52962 +52962 +52963 +52963 +52964 +52964 +52965 +52965 +52966 +52966 +52967 +52967 +52968 +52968 +52969 +52969 +52970 +52970 +52971 +52971 +52972 +52972 +52973 +52973 +52974 +52974 +52975 +52975 +52976 +52976 +52977 +52977 +52978 +52978 +52979 +52979 +52980 +52980 +52981 +52981 +52982 +52982 +52983 +52983 +52984 +52984 +52985 +52985 +52986 +52986 +52987 +52987 +52988 +52988 +52989 +52989 +52990 +52990 +52991 +52991 +52992 +52992 +52992 +52993 +52993 +52994 +52994 +52995 +52995 +52996 +52996 +52997 +52997 +52998 +52998 +52999 +52999 +53000 +53000 +53001 +53001 +53002 +53002 +53003 +53003 +53004 +53004 +53005 +53005 +53006 +53006 +53007 +53007 +53008 +53008 +53009 +53009 +53010 +53010 +53011 +53011 +53012 +53012 +53013 +53013 +53014 +53014 +53014 +53015 +53015 +53016 +53016 +53017 +53017 +53018 +53018 +53019 +53019 +53020 +53020 +53021 +53021 +53022 +53022 +53023 +53023 +53024 +53024 +53025 +53025 +53026 +53026 +53027 +53027 +53028 +53028 +53028 +53029 +53029 +53030 +53030 +53031 +53031 +53032 +53032 +53033 +53033 +53034 +53034 +53035 +53035 +53036 +53036 +53037 +53037 +53038 +53038 +53039 +53039 +53040 +53040 +53040 +53041 +53041 +53042 +53042 +53043 +53043 +53044 +53044 +53045 +53045 +53046 +53046 +53047 +53047 +53048 +53048 +53049 +53049 +53049 +53050 +53050 +53051 +53051 +53052 +53052 +53053 +53053 +53054 +53054 +53055 +53055 +53056 +53056 +53057 +53057 +53058 +53058 +53058 +53059 +53059 +53060 +53060 +53061 +53061 +53062 +53062 +53063 +53063 +53064 +53064 +53065 +53065 +53066 +53066 +53066 +53067 +53067 +53068 +53068 +53069 +53069 +53070 +53070 +53071 +53071 +53072 +53072 +53073 +53073 +53073 +53074 +53074 +53075 +53075 +53076 +53076 +53077 +53077 +53078 +53078 +53079 +53079 +53080 +53080 +53080 +53081 +53081 +53082 +53082 +53083 +53083 +53084 +53084 +53085 +53085 +53086 +53086 +53086 +53087 +53087 +53088 +53088 +53089 +53089 +53090 +53090 +53091 +53091 +53092 +53092 +53092 +53093 +53093 +53094 +53094 +53095 +53095 +53096 +53096 +53097 +53097 +53098 +53098 +53098 +53099 +53099 +53100 +53100 +53101 +53101 +53102 +53102 +53103 +53103 +53103 +53104 +53104 +53105 +53105 +53106 +53106 +53107 +53107 +53108 +53108 +53109 +53109 +53109 +53110 +53110 +53111 +53111 +53112 +53112 +53113 +53113 +53114 +53114 +53114 +53115 +53115 +53116 +53116 +53117 +53117 +53118 +53118 +53119 +53119 +53119 +53120 +53120 +53121 +53121 +53122 +53122 +53123 +53123 +53124 +53124 +53124 +53125 +53125 +53126 +53126 +53127 +53127 +53128 +53128 +53128 +53129 +53129 +53130 +53130 +53131 +53131 +53132 +53132 +53133 +53133 +53133 +53134 +53134 +53135 +53135 +53136 +53136 +53137 +53137 +53137 +53138 +53138 +53139 +53139 +53140 +53140 +53141 +53141 +53141 +53142 +53142 +53143 +53143 +53144 +53144 +53145 +53145 +53145 +53146 +53146 +53147 +53147 +53148 +53148 +53149 +53149 +53149 +53150 +53150 +53151 +53151 +53152 +53152 +53153 +53153 +53153 +53154 +53154 +53155 +53155 +53156 +53156 +53157 +53157 +53157 +53158 +53158 +53159 +53159 +53160 +53160 +53161 +53161 +53161 +53162 +53162 +53163 +53163 +53164 +53164 +53165 +53165 +53165 +53166 +53166 +53167 +53167 +53168 +53168 +53168 +53169 +53169 +53170 +53170 +53171 +53171 +53172 +53172 +53172 +53173 +53173 +53174 +53174 +53175 +53175 +53175 +53176 +53176 +53177 +53177 +53178 +53178 +53179 +53179 +53179 +53180 +53180 +53181 +53181 +53182 +53182 +53182 +53183 +53183 +53184 +53184 +53185 +53186 +53186 +53187 +53188 +53189 +53190 +53191 +53192 +53192 +53193 +53194 +53195 +53196 +53197 +53198 +53198 +53199 +53200 +53201 +53202 +53203 +53204 +53205 +53205 +53206 +53207 +53208 +53209 +53210 +53211 +53211 +53212 +53213 +53214 +53215 +53216 +53216 +53217 +53218 +53219 +53220 +53221 +53222 +53222 +53223 +53224 +53225 +53226 +53227 +53228 +53228 +53229 +53230 +53231 +53232 +53233 +53233 +53234 +53235 +53236 +53237 +53238 +53239 +53239 +53240 +53241 +53242 +53243 +53244 +53244 +53245 +53246 +53247 +53248 +53248 +53249 +53249 +53250 +53250 +53250 +53251 +53251 +53252 +53252 +53252 +53253 +53253 +53254 +53254 +53255 +53255 +53255 +53256 +53256 +53257 +53257 +53257 +53258 +53258 +53259 +53259 +53259 +53260 +53260 +53261 +53261 +53262 +53262 +53262 +53263 +53263 +53264 +53264 +53264 +53265 +53265 +53266 +53266 +53266 +53267 +53267 +53268 +53268 +53269 +53269 +53269 +53270 +53270 +53271 +53271 +53271 +53272 +53272 +53273 +53273 +53273 +53274 +53274 +53275 +53275 +53275 +53276 +53276 +53277 +53277 +53277 +53278 +53278 +53279 +53279 +53279 +53280 +53280 +53281 +53281 +53281 +53282 +53282 +53283 +53283 +53283 +53284 +53284 +53285 +53285 +53286 +53286 +53286 +53287 +53287 +53288 +53288 +53288 +53289 +53289 +53289 +53290 +53290 +53291 +53291 +53291 +53292 +53292 +53293 +53293 +53293 +53294 +53294 +53295 +53295 +53295 +53296 +53296 +53297 +53297 +53297 +53298 +53298 +53299 +53299 +53299 +53300 +53300 +53301 +53301 +53301 +53302 +53302 +53303 +53303 +53303 +53304 +53304 +53305 +53305 +53305 +53306 +53306 +53306 +53307 +53307 +53308 +53308 +53308 +53309 +53309 +53310 +53310 +53310 +53311 +53311 +53312 +53312 +53312 +53313 +53313 +53313 +53314 +53314 +53315 +53315 +53315 +53316 +53316 +53317 +53317 +53317 +53318 +53318 +53318 +53319 +53319 +53320 +53320 +53320 +53321 +53321 +53322 +53322 +53322 +53323 +53323 +53323 +53324 +53324 +53325 +53325 +53325 +53326 +53326 +53327 +53327 +53327 +53328 +53328 +53328 +53329 +53329 +53330 +53330 +53330 +53331 +53331 +53331 +53332 +53332 +53333 +53333 +53333 +53334 +53334 +53335 +53335 +53335 +53336 +53336 +53336 +53337 +53337 +53338 +53338 +53338 +53339 +53339 +53339 +53340 +53340 +53341 +53341 +53341 +53342 +53342 +53342 +53343 +53343 +53344 +53344 +53344 +53345 +53345 +53345 +53346 +53346 +53347 +53347 +53347 +53348 +53348 +53348 +53349 +53349 +53350 +53350 +53350 +53351 +53351 +53351 +53352 +53352 +53353 +53353 +53353 +53354 +53354 +53354 +53355 +53355 +53355 +53356 +53356 +53357 +53357 +53357 +53358 +53358 +53358 +53359 +53359 +53360 +53360 +53360 +53361 +53361 +53361 +53362 +53362 +53362 +53363 +53363 +53364 +53364 +53364 +53365 +53365 +53365 +53366 +53366 +53367 +53367 +53367 +53368 +53368 +53368 +53369 +53369 +53369 +53370 +53370 +53371 +53371 +53371 +53372 +53372 +53372 +53373 +53373 +53373 +53374 +53374 +53375 +53375 +53375 +53376 +53376 +53376 +53377 +53377 +53377 +53378 +53378 +53379 +53379 +53379 +53380 +53380 +53380 +53381 +53381 +53381 +53382 +53382 +53382 +53383 +53383 +53384 +53384 +53384 +53385 +53385 +53385 +53386 +53386 +53386 +53387 +53387 +53388 +53388 +53388 +53389 +53389 +53389 +53390 +53390 +53390 +53391 +53391 +53391 +53392 +53392 +53392 +53393 +53393 +53394 +53394 +53394 +53395 +53395 +53395 +53396 +53396 +53396 +53397 +53397 +53397 +53398 +53398 +53399 +53399 +53399 +53400 +53400 +53400 +53401 +53401 +53401 +53402 +53402 +53402 +53403 +53403 +53403 +53404 +53404 +53405 +53405 +53405 +53406 +53406 +53406 +53407 +53407 +53407 +53408 +53408 +53408 +53409 +53409 +53409 +53410 +53410 +53410 +53411 +53411 +53412 +53412 +53412 +53413 +53413 +53413 +53414 +53414 +53414 +53415 +53415 +53415 +53416 +53416 +53416 +53417 +53417 +53417 +53418 +53418 +53418 +53419 +53419 +53420 +53420 +53420 +53421 +53421 +53421 +53422 +53422 +53422 +53423 +53423 +53423 +53424 +53424 +53424 +53425 +53425 +53425 +53426 +53426 +53426 +53427 +53427 +53427 +53428 +53428 +53428 +53429 +53429 +53429 +53430 +53430 +53431 +53431 +53431 +53432 +53432 +53432 +53433 +53433 +53433 +53434 +53434 +53434 +53435 +53435 +53435 +53436 +53436 +53436 +53437 +53437 +53437 +53438 +53438 +53438 +53439 +53439 +53439 +53440 +53440 +53440 +53441 +53441 +53441 +53442 +53442 +53442 +53443 +53443 +53443 +53444 +53444 +53444 +53445 +53445 +53445 +53446 +53446 +53446 +53447 +53447 +53447 +53448 +53448 +53448 +53449 +53449 +53449 +53450 +53450 +53450 +53451 +53451 +53452 +53452 +53452 +53453 +53453 +53453 +53454 +53454 +53454 +53455 +53455 +53455 +53456 +53456 +53456 +53457 +53457 +53457 +53458 +53458 +53458 +53459 +53459 +53459 +53460 +53460 +53460 +53461 +53461 +53461 +53461 +53462 +53462 +53462 +53463 +53463 +53463 +53464 +53464 +53464 +53465 +53465 +53465 +53466 +53466 +53466 +53467 +53467 +53467 +53468 +53468 +53468 +53469 +53469 +53469 +53470 +53470 +53470 +53471 +53471 +53471 +53472 +53472 +53472 +53473 +53473 +53473 +53474 +53474 +53474 +53475 +53475 +53475 +53476 +53476 +53476 +53477 +53477 +53477 +53478 +53478 +53478 +53479 +53479 +53479 +53480 +53480 +53480 +53481 +53481 +53481 +53482 +53482 +53482 +53483 +53483 +53483 +53483 +53484 +53484 +53484 +53485 +53485 +53485 +53486 +53486 +53486 +53487 +53487 +53487 +53488 +53488 +53488 +53489 +53489 +53489 +53490 +53490 +53490 +53491 +53491 +53491 +53492 +53492 +53492 +53493 +53493 +53493 +53493 +53494 +53494 +53494 +53495 +53495 +53495 +53496 +53496 +53496 +53497 +53497 +53497 +53498 +53498 +53498 +53499 +53499 +53499 +53500 +53500 +53500 +53501 +53501 +53501 +53501 +53502 +53502 +53502 +53503 +53503 +53503 +53504 +53504 +53504 +53505 +53505 +53505 +53506 +53506 +53506 +53507 +53507 +53507 +53508 +53508 +53508 +53508 +53509 +53509 +53509 +53510 +53510 +53510 +53511 +53511 +53511 +53512 +53512 +53512 +53513 +53513 +53513 +53514 +53514 +53514 +53514 +53515 +53515 +53515 +53516 +53516 +53516 +53517 +53517 +53517 +53518 +53518 +53518 +53519 +53519 +53519 +53520 +53520 +53520 +53520 +53521 +53521 +53521 +53522 +53522 +53522 +53523 +53523 +53523 +53524 +53524 +53524 +53525 +53525 +53525 +53525 +53526 +53526 +53526 +53527 +53527 +53527 +53528 +53528 +53528 +53529 +53529 +53529 +53529 +53530 +53530 +53530 +53531 +53531 +53531 +53532 +53532 +53532 +53533 +53533 +53533 +53534 +53534 +53534 +53534 +53535 +53535 +53535 +53536 +53536 +53536 +53537 +53537 +53537 +53538 +53538 +53538 +53538 +53539 +53539 +53539 +53540 +53540 +53540 +53541 +53541 +53541 +53542 +53542 +53542 +53542 +53543 +53543 +53543 +53544 +53544 +53544 +53545 +53545 +53545 +53546 +53546 +53546 +53546 +53547 +53547 +53547 +53548 +53548 +53548 +53549 +53549 +53549 +53549 +53550 +53550 +53550 +53551 +53551 +53551 +53552 +53552 +53552 +53553 +53553 +53553 +53553 +53554 +53554 +53554 +53555 +53555 +53555 +53556 +53556 +53556 +53556 +53557 +53557 +53557 +53558 +53558 +53558 +53559 +53559 +53559 +53560 +53560 +53560 +53560 +53561 +53561 +53561 +53562 +53562 +53562 +53563 +53563 +53563 +53563 +53564 +53564 +53564 +53565 +53565 +53565 +53566 +53566 +53566 +53566 +53567 +53567 +53567 +53568 +53568 +53568 +53569 +53569 +53569 +53569 +53570 +53570 +53570 +53571 +53571 +53571 +53572 +53572 +53572 +53572 +53573 +53573 +53573 +53574 +53574 +53574 +53575 +53575 +53575 +53575 +53576 +53576 +53576 +53577 +53577 +53577 +53577 +53578 +53578 +53578 +53579 +53580 +53580 +53581 +53581 +53582 +53583 +53583 +53584 +53584 +53585 +53585 +53586 +53587 +53587 +53588 +53588 +53589 +53590 +53590 +53591 +53591 +53592 +53593 +53593 +53594 +53594 +53595 +53595 +53596 +53597 +53597 +53598 +53598 +53599 +53600 +53600 +53601 +53601 +53602 +53602 +53603 +53604 +53604 +53605 +53605 +53606 +53607 +53607 +53608 +53608 +53609 +53609 +53610 +53611 +53611 +53612 +53612 +53613 +53613 +53614 +53615 +53615 +53616 +53616 +53617 +53617 +53618 +53619 +53619 +53620 +53620 +53621 +53621 +53622 +53623 +53623 +53624 +53624 +53625 +53625 +53626 +53627 +53627 +53628 +53628 +53629 +53629 +53630 +53631 +53631 +53632 +53632 +53633 +53633 +53634 +53635 +53635 +53636 +53636 +53637 +53637 +53638 +53638 +53639 +53640 +53640 +53641 +53641 +53642 +53642 +53643 +53644 +53644 +53645 +53645 +53646 +53646 +53647 +53647 +53648 +53649 +53649 +53650 +53650 +53651 +53651 +53652 +53652 +53653 +53654 +53654 +53655 +53655 +53656 +53656 +53657 +53657 +53658 +53659 +53659 +53660 +53660 +53661 +53661 +53662 +53662 +53663 +53664 +53664 +53665 +53665 +53666 +53666 +53667 +53667 +53668 +53669 +53669 +53670 +53670 +53671 +53671 +53672 +53672 +53673 +53673 +53674 +53675 +53675 +53676 +53676 +53677 +53677 +53678 +53678 +53679 +53679 +53680 +53681 +53681 +53682 +53682 +53683 +53683 +53684 +53684 +53685 +53685 +53686 +53686 +53687 +53688 +53688 +53689 +53689 +53690 +53690 +53691 +53691 +53692 +53692 +53693 +53693 +53694 +53695 +53695 +53696 +53696 +53697 +53697 +53698 +53698 +53699 +53699 +53700 +53700 +53701 +53702 +53702 +53703 +53703 +53704 +53704 +53705 +53705 +53706 +53706 +53707 +53707 +53708 +53708 +53709 +53709 +53710 +53711 +53711 +53712 +53712 +53713 +53713 +53714 +53714 +53715 +53715 +53716 +53716 +53717 +53717 +53718 +53718 +53719 +53720 +53720 +53721 +53721 +53722 +53722 +53723 +53723 +53724 +53724 +53725 +53725 +53726 +53726 +53727 +53727 +53728 +53728 +53729 +53729 +53730 +53731 +53731 +53732 +53732 +53733 +53733 +53734 +53734 +53735 +53735 +53736 +53736 +53737 +53737 +53738 +53738 +53739 +53739 +53740 +53740 +53741 +53741 +53742 +53742 +53743 +53743 +53744 +53745 +53745 +53746 +53746 +53747 +53747 +53748 +53748 +53749 +53749 +53750 +53750 +53751 +53751 +53752 +53752 +53753 +53753 +53754 +53754 +53755 +53755 +53756 +53756 +53757 +53757 +53758 +53758 +53759 +53759 +53760 +53760 +53761 +53761 +53762 +53762 +53763 +53763 +53764 +53764 +53765 +53765 +53766 +53766 +53767 +53767 +53768 +53768 +53769 +53770 +53770 +53771 +53771 +53772 +53772 +53773 +53773 +53774 +53774 +53775 +53775 +53776 +53776 +53777 +53777 +53778 +53778 +53779 +53779 +53780 +53780 +53781 +53781 +53782 +53782 +53783 +53783 +53784 +53784 +53785 +53785 +53786 +53786 +53787 +53787 +53788 +53788 +53789 +53789 +53790 +53790 +53791 +53791 +53792 +53792 +53793 +53793 +53794 +53794 +53795 +53795 +53796 +53796 +53796 +53797 +53797 +53798 +53798 +53799 +53799 +53800 +53800 +53801 +53801 +53802 +53802 +53803 +53803 +53804 +53804 +53805 +53805 +53806 +53806 +53807 +53807 +53808 +53808 +53809 +53809 +53810 +53810 +53811 +53811 +53812 +53812 +53813 +53813 +53814 +53814 +53815 +53815 +53816 +53816 +53817 +53817 +53818 +53818 +53819 +53819 +53820 +53820 +53821 +53821 +53821 +53822 +53822 +53823 +53823 +53824 +53824 +53825 +53825 +53826 +53826 +53827 +53827 +53828 +53828 +53829 +53829 +53830 +53830 +53831 +53831 +53832 +53832 +53833 +53833 +53834 +53834 +53835 +53835 +53835 +53836 +53836 +53837 +53837 +53838 +53838 +53839 +53839 +53840 +53840 +53841 +53841 +53842 +53842 +53843 +53843 +53844 +53844 +53845 +53845 +53846 +53846 +53846 +53847 +53847 +53848 +53848 +53849 +53849 +53850 +53850 +53851 +53851 +53852 +53852 +53853 +53853 +53854 +53854 +53855 +53855 +53855 +53856 +53856 +53857 +53857 +53858 +53858 +53859 +53859 +53860 +53860 +53861 +53861 +53862 +53862 +53863 +53863 +53863 +53864 +53864 +53865 +53865 +53866 +53866 +53867 +53867 +53868 +53868 +53869 +53869 +53870 +53870 +53871 +53871 +53871 +53872 +53872 +53873 +53873 +53874 +53874 +53875 +53875 +53876 +53876 +53877 +53877 +53878 +53878 +53878 +53879 +53879 +53880 +53880 +53881 +53881 +53882 +53882 +53883 +53883 +53884 +53884 +53884 +53885 +53885 +53886 +53886 +53887 +53887 +53888 +53888 +53889 +53889 +53890 +53890 +53890 +53891 +53891 +53892 +53892 +53893 +53893 +53894 +53894 +53895 +53895 +53896 +53896 +53896 +53897 +53897 +53898 +53898 +53899 +53899 +53900 +53900 +53901 +53901 +53901 +53902 +53902 +53903 +53903 +53904 +53904 +53905 +53905 +53906 +53906 +53906 +53907 +53907 +53908 +53908 +53909 +53909 +53910 +53910 +53911 +53911 +53911 +53912 +53912 +53913 +53913 +53914 +53914 +53915 +53915 +53916 +53916 +53916 +53917 +53917 +53918 +53918 +53919 +53919 +53920 +53920 +53921 +53921 +53921 +53922 +53922 +53923 +53923 +53924 +53924 +53925 +53925 +53925 +53926 +53926 +53927 +53927 +53928 +53928 +53929 +53929 +53930 +53930 +53930 +53931 +53931 +53932 +53932 +53933 +53933 +53934 +53934 +53934 +53935 +53935 +53936 +53936 +53937 +53937 +53938 +53938 +53938 +53939 +53939 +53940 +53940 +53941 +53941 +53942 +53942 +53942 +53943 +53943 +53944 +53944 +53945 +53945 +53946 +53946 +53946 +53947 +53947 +53948 +53948 +53949 +53949 +53950 +53950 +53950 +53951 +53951 +53952 +53952 +53953 +53953 +53953 +53954 +53954 +53955 +53955 +53956 +53956 +53957 +53957 +53957 +53958 +53958 +53959 +53959 +53960 +53960 +53961 +53961 +53961 +53962 +53962 +53963 +53963 +53964 +53964 +53964 +53965 +53965 +53966 +53966 +53967 +53967 +53967 +53968 +53968 +53969 +53969 +53970 +53970 +53971 +53971 +53971 +53972 +53972 +53973 +53973 +53974 +53974 +53974 +53975 +53975 +53976 +53976 +53977 +53977 +53977 +53978 +53978 +53979 +53979 +53980 +53980 +53981 +53981 +53981 +53982 +53982 +53983 +53983 +53984 +53984 +53984 +53985 +53985 +53986 +53986 +53987 +53987 +53987 +53988 +53988 +53989 +53989 +53990 +53990 +53990 +53991 +53991 +53992 +53992 +53993 +53993 +53993 +53994 +53994 +53995 +53995 +53996 +53996 +53996 +53997 +53997 +53998 +53998 +53999 +53999 +53999 +54000 +54000 +54001 +54001 +54002 +54002 +54002 +54003 +54003 +54004 +54004 +54004 +54005 +54005 +54006 +54006 +54007 +54007 +54007 +54008 +54008 +54009 +54009 +54010 +54010 +54010 +54011 +54011 +54012 +54012 +54013 +54013 +54013 +54014 +54014 +54015 +54015 +54015 +54016 +54016 +54017 +54017 +54018 +54018 +54018 +54019 +54019 +54020 +54020 +54021 +54021 +54021 +54022 +54022 +54023 +54023 +54023 +54024 +54024 +54025 +54025 +54026 +54026 +54026 +54027 +54027 +54028 +54028 +54029 +54029 +54029 +54030 +54030 +54031 +54031 +54031 +54032 +54032 +54033 +54033 +54034 +54034 +54034 +54035 +54035 +54036 +54036 +54036 +54037 +54037 +54038 +54038 +54039 +54039 +54039 +54040 +54040 +54041 +54041 +54041 +54042 +54042 +54043 +54043 +54043 +54044 +54044 +54045 +54045 +54046 +54046 +54046 +54047 +54047 +54048 +54048 +54048 +54049 +54049 +54050 +54050 +54050 +54051 +54051 +54052 +54052 +54053 +54053 +54053 +54054 +54054 +54055 +54055 +54055 +54056 +54056 +54057 +54057 +54057 +54058 +54058 +54059 +54059 +54060 +54060 +54060 +54061 +54061 +54062 +54062 +54062 +54063 +54063 +54064 +54064 +54064 +54065 +54065 +54066 +54066 +54066 +54067 +54067 +54068 +54068 +54068 +54069 +54069 +54070 +54070 +54071 +54071 +54071 +54072 +54072 +54073 +54073 +54074 +54075 +54075 +54076 +54077 +54078 +54079 +54079 +54080 +54081 +54082 +54083 +54083 +54084 +54085 +54086 +54087 +54087 +54088 +54089 +54090 +54091 +54092 +54092 +54093 +54094 +54095 +54096 +54096 +54097 +54098 +54099 +54099 +54100 +54101 +54102 +54103 +54103 +54104 +54105 +54106 +54107 +54107 +54108 +54109 +54110 +54111 +54111 +54112 +54113 +54114 +54115 +54115 +54116 +54117 +54118 +54119 +54119 +54120 +54121 +54122 +54122 +54123 +54124 +54125 +54126 +54126 +54127 +54128 +54129 +54129 +54130 +54131 +54132 +54133 +54133 +54134 +54135 +54136 +54137 +54137 +54138 +54139 +54140 +54140 +54141 +54142 +54143 +54143 +54144 +54145 +54146 +54147 +54147 +54148 +54149 +54150 +54150 +54151 +54152 +54153 +54154 +54154 +54155 +54156 +54157 +54157 +54158 +54159 +54160 +54160 +54161 +54162 +54163 +54164 +54164 +54165 +54166 +54167 +54167 +54168 +54169 +54170 +54170 +54171 +54172 +54173 +54173 +54174 +54175 +54176 +54176 +54177 +54178 +54179 +54179 +54180 +54181 +54182 +54183 +54183 +54184 +54185 +54186 +54186 +54187 +54188 +54189 +54189 +54190 +54191 +54192 +54192 +54193 +54194 +54195 +54195 +54196 +54197 +54198 +54198 +54199 +54200 +54201 +54201 +54202 +54203 +54204 +54204 +54205 +54206 +54207 +54207 +54208 +54209 +54210 +54210 +54211 +54212 +54212 +54213 +54214 +54215 +54215 +54216 +54217 +54218 +54218 +54219 +54220 +54221 +54221 +54222 +54223 +54224 +54224 +54225 +54226 +54227 +54227 +54228 +54229 +54229 +54230 +54231 +54232 +54232 +54233 +54234 +54235 +54235 +54236 +54237 +54238 +54238 +54239 +54240 +54240 +54241 +54242 +54243 +54243 +54244 +54245 +54246 +54246 +54247 +54248 +54248 +54249 +54250 +54251 +54251 +54252 +54253 +54254 +54254 +54255 +54256 +54256 +54257 +54258 +54259 +54259 +54260 +54261 +54261 +54262 +54263 +54264 +54264 +54265 +54266 +54266 +54267 +54268 +54269 +54269 +54270 +54271 +54272 +54272 +54272 +54273 +54273 +54274 +54274 +54274 +54275 +54275 +54275 +54276 +54276 +54276 +54277 +54277 +54277 +54278 +54278 +54279 +54279 +54279 +54280 +54280 +54280 +54281 +54281 +54281 +54282 +54282 +54282 +54283 +54283 +54283 +54284 +54284 +54285 +54285 +54285 +54286 +54286 +54286 +54287 +54287 +54287 +54288 +54288 +54288 +54289 +54289 +54289 +54290 +54290 +54291 +54291 +54291 +54292 +54292 +54292 +54293 +54293 +54293 +54294 +54294 +54294 +54295 +54295 +54295 +54296 +54296 +54296 +54297 +54297 +54297 +54298 +54298 +54299 +54299 +54299 +54300 +54300 +54300 +54301 +54301 +54301 +54302 +54302 +54302 +54303 +54303 +54303 +54304 +54304 +54304 +54305 +54305 +54305 +54306 +54306 +54306 +54307 +54307 +54308 +54308 +54308 +54309 +54309 +54309 +54310 +54310 +54310 +54311 +54311 +54311 +54312 +54312 +54312 +54313 +54313 +54313 +54314 +54314 +54314 +54315 +54315 +54315 +54316 +54316 +54316 +54317 +54317 +54317 +54318 +54318 +54318 +54319 +54319 +54319 +54320 +54320 +54320 +54321 +54321 +54321 +54322 +54322 +54322 +54323 +54323 +54323 +54324 +54324 +54324 +54325 +54325 +54326 +54326 +54326 +54327 +54327 +54327 +54328 +54328 +54328 +54329 +54329 +54329 +54330 +54330 +54330 +54331 +54331 +54331 +54332 +54332 +54332 +54333 +54333 +54333 +54334 +54334 +54334 +54335 +54335 +54335 +54336 +54336 +54336 +54337 +54337 +54337 +54338 +54338 +54338 +54339 +54339 +54339 +54340 +54340 +54340 +54341 +54341 +54341 +54341 +54342 +54342 +54342 +54343 +54343 +54343 +54344 +54344 +54344 +54345 +54345 +54345 +54346 +54346 +54346 +54347 +54347 +54347 +54348 +54348 +54348 +54349 +54349 +54349 +54350 +54350 +54350 +54351 +54351 +54351 +54352 +54352 +54352 +54353 +54353 +54353 +54354 +54354 +54354 +54355 +54355 +54355 +54356 +54356 +54356 +54357 +54357 +54357 +54358 +54358 +54358 +54359 +54359 +54359 +54359 +54360 +54360 +54360 +54361 +54361 +54361 +54362 +54362 +54362 +54363 +54363 +54363 +54364 +54364 +54364 +54365 +54365 +54365 +54366 +54366 +54366 +54367 +54367 +54367 +54368 +54368 +54368 +54368 +54369 +54369 +54369 +54370 +54370 +54370 +54371 +54371 +54371 +54372 +54372 +54372 +54373 +54373 +54373 +54374 +54374 +54374 +54375 +54375 +54375 +54376 +54376 +54376 +54376 +54377 +54377 +54377 +54378 +54378 +54378 +54379 +54379 +54379 +54380 +54380 +54380 +54381 +54381 +54381 +54382 +54382 +54382 +54382 +54383 +54383 +54383 +54384 +54384 +54384 +54385 +54385 +54385 +54386 +54386 +54386 +54387 +54387 +54387 +54388 +54388 +54388 +54388 +54389 +54389 +54389 +54390 +54390 +54390 +54391 +54391 +54391 +54392 +54392 +54392 +54393 +54393 +54393 +54393 +54394 +54394 +54394 +54395 +54395 +54395 +54396 +54396 +54396 +54397 +54397 +54397 +54398 +54398 +54398 +54398 +54399 +54399 +54399 +54400 +54400 +54400 +54401 +54401 +54401 +54402 +54402 +54402 +54402 +54403 +54403 +54403 +54404 +54404 +54404 +54405 +54405 +54405 +54406 +54406 +54406 +54406 +54407 +54407 +54407 +54408 +54408 +54408 +54409 +54409 +54409 +54410 +54410 +54410 +54410 +54411 +54411 +54411 +54412 +54412 +54412 +54413 +54413 +54413 +54414 +54414 +54414 +54414 +54415 +54415 +54415 +54416 +54416 +54416 +54417 +54417 +54417 +54417 +54418 +54418 +54418 +54419 +54419 +54419 +54420 +54420 +54420 +54421 +54421 +54421 +54421 +54422 +54422 +54422 +54423 +54423 +54423 +54424 +54424 +54424 +54424 +54425 +54425 +54425 +54426 +54426 +54426 +54427 +54427 +54427 +54427 +54428 +54428 +54428 +54429 +54429 +54429 +54430 +54430 +54430 +54430 +54431 +54431 +54431 +54432 +54432 +54432 +54433 +54433 +54433 +54433 +54434 +54434 +54434 +54435 +54435 +54435 +54436 +54436 +54436 +54436 +54437 +54437 +54437 +54438 +54438 +54438 +54439 +54439 +54439 +54439 +54440 +54440 +54440 +54441 +54441 +54441 +54442 +54442 +54442 +54442 +54443 +54443 +54443 +54444 +54444 +54444 +54444 +54445 +54445 +54445 +54446 +54446 +54446 +54447 +54447 +54447 +54447 +54448 +54448 +54448 +54449 +54449 +54449 +54450 +54450 +54450 +54450 +54451 +54451 +54451 +54452 +54452 +54452 +54452 +54453 +54453 +54453 +54454 +54454 +54454 +54454 +54455 +54455 +54455 +54456 +54456 +54456 +54457 +54457 +54457 +54457 +54458 +54458 +54458 +54459 +54459 +54459 +54459 +54460 +54460 +54460 +54461 +54461 +54461 +54461 +54462 +54462 +54462 +54463 +54463 +54463 +54464 +54464 +54464 +54464 +54465 +54465 +54465 +54466 +54466 +54466 +54466 +54467 +54467 +54467 +54468 +54468 +54468 +54468 +54469 +54469 +54469 +54470 +54470 +54470 +54470 +54471 +54471 +54471 +54472 +54472 +54472 +54472 +54473 +54473 +54473 +54474 +54474 +54474 +54474 +54475 +54475 +54475 +54476 +54476 +54476 +54476 +54477 +54477 +54477 +54478 +54478 +54478 +54479 +54479 +54479 +54479 +54480 +54480 +54480 +54480 +54481 +54481 +54481 +54482 +54482 +54482 +54482 +54483 +54483 +54483 +54484 +54484 +54484 +54484 +54485 +54485 +54485 +54486 +54486 +54486 +54486 +54487 +54487 +54487 +54488 +54488 +54488 +54488 +54489 +54489 +54489 +54490 +54490 +54490 +54490 +54491 +54491 +54491 +54492 +54492 +54492 +54492 +54493 +54493 +54493 +54494 +54494 +54494 +54494 +54495 +54495 +54495 +54496 +54496 +54496 +54496 +54497 +54497 +54497 +54497 +54498 +54498 +54498 +54499 +54499 +54499 +54499 +54500 +54500 +54500 +54501 +54501 +54501 +54501 +54502 +54502 +54502 +54503 +54503 +54503 +54503 +54504 +54504 +54504 +54504 +54505 +54505 +54505 +54506 +54506 +54506 +54506 +54507 +54507 +54507 +54508 +54508 +54508 +54508 +54509 +54509 +54509 +54509 +54510 +54510 +54510 +54511 +54511 +54512 +54513 +54513 +54514 +54514 +54515 +54515 +54516 +54516 +54517 +54517 +54518 +54519 +54519 +54520 +54520 +54521 +54521 +54522 +54522 +54523 +54524 +54524 +54525 +54525 +54526 +54526 +54527 +54527 +54528 +54528 +54529 +54530 +54530 +54531 +54531 +54532 +54532 +54533 +54533 +54534 +54534 +54535 +54535 +54536 +54537 +54537 +54538 +54538 +54539 +54539 +54540 +54540 +54541 +54541 +54542 +54542 +54543 +54544 +54544 +54545 +54545 +54546 +54546 +54547 +54547 +54548 +54548 +54549 +54549 +54550 +54551 +54551 +54552 +54552 +54553 +54553 +54554 +54554 +54555 +54555 +54556 +54556 +54557 +54557 +54558 +54558 +54559 +54560 +54560 +54561 +54561 +54562 +54562 +54563 +54563 +54564 +54564 +54565 +54565 +54566 +54566 +54567 +54567 +54568 +54568 +54569 +54570 +54570 +54571 +54571 +54572 +54572 +54573 +54573 +54574 +54574 +54575 +54575 +54576 +54576 +54577 +54577 +54578 +54578 +54579 +54579 +54580 +54580 +54581 +54582 +54582 +54583 +54583 +54584 +54584 +54585 +54585 +54586 +54586 +54587 +54587 +54588 +54588 +54589 +54589 +54590 +54590 +54591 +54591 +54592 +54592 +54593 +54593 +54594 +54594 +54595 +54595 +54596 +54596 +54597 +54597 +54598 +54598 +54599 +54599 +54600 +54601 +54601 +54602 +54602 +54603 +54603 +54604 +54604 +54605 +54605 +54606 +54606 +54607 +54607 +54608 +54608 +54609 +54609 +54610 +54610 +54611 +54611 +54612 +54612 +54613 +54613 +54614 +54614 +54615 +54615 +54616 +54616 +54617 +54617 +54618 +54618 +54619 +54619 +54620 +54620 +54621 +54621 +54622 +54622 +54623 +54623 +54624 +54624 +54625 +54625 +54626 +54626 +54627 +54627 +54628 +54628 +54629 +54629 +54630 +54630 +54631 +54631 +54632 +54632 +54633 +54633 +54634 +54634 +54635 +54635 +54636 +54636 +54637 +54637 +54638 +54638 +54639 +54639 +54640 +54640 +54641 +54641 +54641 +54642 +54642 +54643 +54643 +54644 +54644 +54645 +54645 +54646 +54646 +54647 +54647 +54648 +54648 +54649 +54649 +54650 +54650 +54651 +54651 +54652 +54652 +54653 +54653 +54654 +54654 +54655 +54655 +54656 +54656 +54657 +54657 +54658 +54658 +54659 +54659 +54660 +54660 +54660 +54661 +54661 +54662 +54662 +54663 +54663 +54664 +54664 +54665 +54665 +54666 +54666 +54667 +54667 +54668 +54668 +54669 +54669 +54670 +54670 +54671 +54671 +54672 +54672 +54672 +54673 +54673 +54674 +54674 +54675 +54675 +54676 +54676 +54677 +54677 +54678 +54678 +54679 +54679 +54680 +54680 +54681 +54681 +54682 +54682 +54682 +54683 +54683 +54684 +54684 +54685 +54685 +54686 +54686 +54687 +54687 +54688 +54688 +54689 +54689 +54690 +54690 +54691 +54691 +54691 +54692 +54692 +54693 +54693 +54694 +54694 +54695 +54695 +54696 +54696 +54697 +54697 +54698 +54698 +54698 +54699 +54699 +54700 +54700 +54701 +54701 +54702 +54702 +54703 +54703 +54704 +54704 +54705 +54705 +54705 +54706 +54706 +54707 +54707 +54708 +54708 +54709 +54709 +54710 +54710 +54711 +54711 +54711 +54712 +54712 +54713 +54713 +54714 +54714 +54715 +54715 +54716 +54716 +54717 +54717 +54717 +54718 +54718 +54719 +54719 +54720 +54720 +54721 +54721 +54722 +54722 +54723 +54723 +54723 +54724 +54724 +54725 +54725 +54726 +54726 +54727 +54727 +54728 +54728 +54728 +54729 +54729 +54730 +54730 +54731 +54731 +54732 +54732 +54733 +54733 +54733 +54734 +54734 +54735 +54735 +54736 +54736 +54737 +54737 +54738 +54738 +54738 +54739 +54739 +54740 +54740 +54741 +54741 +54742 +54742 +54743 +54743 +54743 +54744 +54744 +54745 +54745 +54746 +54746 +54747 +54747 +54747 +54748 +54748 +54749 +54749 +54750 +54750 +54751 +54751 +54752 +54752 +54752 +54753 +54753 +54754 +54754 +54755 +54755 +54756 +54756 +54756 +54757 +54757 +54758 +54758 +54759 +54759 +54760 +54760 +54760 +54761 +54761 +54762 +54762 +54763 +54763 +54764 +54764 +54764 +54765 +54765 +54766 +54766 +54767 +54767 +54768 +54768 +54768 +54769 +54769 +54770 +54770 +54771 +54771 +54771 +54772 +54772 +54773 +54773 +54774 +54774 +54775 +54775 +54775 +54776 +54776 +54777 +54777 +54778 +54778 +54778 +54779 +54779 +54780 +54780 +54781 +54781 +54782 +54782 +54782 +54783 +54783 +54784 +54784 +54785 +54785 +54785 +54786 +54786 +54787 +54787 +54788 +54788 +54789 +54789 +54789 +54790 +54790 +54791 +54791 +54792 +54792 +54792 +54793 +54793 +54794 +54794 +54795 +54795 +54795 +54796 +54796 +54797 +54797 +54798 +54798 +54798 +54799 +54799 +54800 +54800 +54801 +54801 +54801 +54802 +54802 +54803 +54803 +54804 +54804 +54804 +54805 +54805 +54806 +54806 +54807 +54807 +54807 +54808 +54808 +54809 +54809 +54810 +54810 +54810 +54811 +54811 +54812 +54812 +54813 +54813 +54813 +54814 +54814 +54815 +54815 +54816 +54816 +54816 +54817 +54817 +54818 +54818 +54819 +54819 +54819 +54820 +54820 +54821 +54821 +54822 +54822 +54822 +54823 +54823 +54824 +54824 +54824 +54825 +54825 +54826 +54826 +54827 +54827 +54827 +54828 +54828 +54829 +54829 +54830 +54830 +54830 +54831 +54831 +54832 +54832 +54832 +54833 +54833 +54834 +54834 +54835 +54835 +54835 +54836 +54836 +54837 +54837 +54837 +54838 +54838 +54839 +54839 +54840 +54840 +54840 +54841 +54841 +54842 +54842 +54843 +54843 +54843 +54844 +54844 +54845 +54845 +54845 +54846 +54846 +54847 +54847 +54847 +54848 +54848 +54849 +54849 +54850 +54850 +54850 +54851 +54851 +54852 +54852 +54852 +54853 +54853 +54854 +54854 +54855 +54855 +54855 +54856 +54856 +54857 +54857 +54857 +54858 +54858 +54859 +54859 +54859 +54860 +54860 +54861 +54861 +54862 +54862 +54862 +54863 +54863 +54864 +54864 +54864 +54865 +54865 +54866 +54866 +54866 +54867 +54867 +54868 +54868 +54868 +54869 +54869 +54870 +54870 +54871 +54871 +54871 +54872 +54872 +54873 +54873 +54873 +54874 +54874 +54875 +54875 +54875 +54876 +54876 +54877 +54877 +54877 +54878 +54878 +54879 +54879 +54879 +54880 +54880 +54881 +54881 +54881 +54882 +54882 +54883 +54883 +54883 +54884 +54884 +54885 +54885 +54885 +54886 +54886 +54887 +54887 +54888 +54888 +54888 +54889 +54889 +54890 +54890 +54890 +54891 +54891 +54892 +54892 +54892 +54893 +54893 +54894 +54894 +54894 +54895 +54895 +54896 +54896 +54896 +54897 +54897 +54898 +54898 +54898 +54899 +54899 +54900 +54900 +54900 +54901 +54901 +54902 +54902 +54902 +54903 +54903 +54904 +54904 +54904 +54905 +54905 +54905 +54906 +54906 +54907 +54907 +54907 +54908 +54908 +54909 +54909 +54909 +54910 +54910 +54911 +54911 +54911 +54912 +54912 +54913 +54913 +54913 +54914 +54914 +54915 +54915 +54915 +54916 +54916 +54917 +54917 +54917 +54918 +54918 +54919 +54919 +54919 +54920 +54920 +54920 +54921 +54921 +54922 +54922 +54922 +54923 +54923 +54924 +54924 +54924 +54925 +54925 +54926 +54926 +54926 +54927 +54927 +54928 +54928 +54928 +54929 +54929 +54929 +54930 +54930 +54931 +54931 +54931 +54932 +54932 +54933 +54933 +54933 +54934 +54934 +54935 +54935 +54935 +54936 +54936 +54937 +54937 +54937 +54938 +54938 +54938 +54939 +54939 +54940 +54940 +54940 +54941 +54941 +54942 +54942 +54942 +54943 +54943 +54943 +54944 +54944 +54945 +54945 +54945 +54946 +54946 +54947 +54947 +54947 +54948 +54948 +54948 +54949 +54949 +54950 +54950 +54950 +54951 +54951 +54952 +54952 +54952 +54953 +54953 +54953 +54954 +54954 +54955 +54955 +54955 +54956 +54956 +54957 +54957 +54957 +54958 +54958 +54958 +54959 +54959 +54960 +54960 +54960 +54961 +54961 +54962 +54962 +54962 +54963 +54963 +54963 +54964 +54964 +54965 +54965 +54965 +54966 +54966 +54966 +54967 +54967 +54968 +54968 +54968 +54969 +54969 +54969 +54970 +54970 +54971 +54971 +54971 +54972 +54973 +54973 +54974 +54975 +54976 +54976 +54977 +54978 +54979 +54979 +54980 +54981 +54982 +54982 +54983 +54984 +54985 +54985 +54986 +54987 +54988 +54988 +54989 +54990 +54991 +54991 +54992 +54993 +54994 +54994 +54995 +54996 +54997 +54997 +54998 +54999 +54999 +55000 +55001 +55002 +55002 +55003 +55004 +55005 +55005 +55006 +55007 +55008 +55008 +55009 +55010 +55011 +55011 +55012 +55013 +55014 +55014 +55015 +55016 +55016 +55017 +55018 +55019 +55019 +55020 +55021 +55022 +55022 +55023 +55024 +55024 +55025 +55026 +55027 +55027 +55028 +55029 +55030 +55030 +55031 +55032 +55033 +55033 +55034 +55035 +55035 +55036 +55037 +55038 +55038 +55039 +55040 +55040 +55041 +55042 +55043 +55043 +55044 +55045 +55046 +55046 +55047 +55048 +55048 +55049 +55050 +55051 +55051 +55052 +55053 +55053 +55054 +55055 +55056 +55056 +55057 +55058 +55058 +55059 +55060 +55061 +55061 +55062 +55063 +55063 +55064 +55065 +55065 +55066 +55067 +55068 +55068 +55069 +55070 +55070 +55071 +55072 +55073 +55073 +55074 +55075 +55075 +55076 +55077 +55078 +55078 +55079 +55080 +55080 +55081 +55082 +55082 +55083 +55084 +55085 +55085 +55086 +55087 +55087 +55088 +55089 +55089 +55090 +55091 +55092 +55092 +55093 +55094 +55094 +55095 +55096 +55096 +55097 +55098 +55098 +55099 +55100 +55101 +55101 +55102 +55103 +55103 +55104 +55105 +55105 +55106 +55107 +55107 +55108 +55109 +55110 +55110 +55111 +55112 +55112 +55113 +55114 +55114 +55115 +55116 +55116 +55117 +55118 +55118 +55119 +55120 +55121 +55121 +55122 +55123 +55123 +55124 +55125 +55125 +55126 +55127 +55127 +55128 +55129 +55129 +55130 +55131 +55131 +55132 +55133 +55133 +55134 +55135 +55135 +55136 +55137 +55138 +55138 +55139 +55140 +55140 +55141 +55142 +55142 +55143 +55144 +55144 +55145 +55146 +55146 +55147 +55148 +55148 +55149 +55150 +55150 +55151 +55152 +55152 +55153 +55154 +55154 +55155 +55156 +55156 +55157 +55158 +55158 +55159 +55160 +55160 +55161 +55162 +55162 +55163 +55164 +55164 +55165 +55166 +55166 +55167 +55168 +55168 +55169 +55170 +55170 +55171 +55172 +55172 +55173 +55174 +55174 +55175 +55176 +55176 +55177 +55178 +55178 +55179 +55180 +55180 +55181 +55182 +55182 +55183 +55184 +55184 +55185 +55185 +55186 +55187 +55187 +55188 +55189 +55189 +55190 +55191 +55191 +55192 +55193 +55193 +55194 +55195 +55195 +55196 +55197 +55197 +55198 +55199 +55199 +55200 +55200 +55201 +55202 +55202 +55203 +55204 +55204 +55205 +55206 +55206 +55207 +55208 +55208 +55209 +55210 +55210 +55211 +55211 +55212 +55213 +55213 +55214 +55215 +55215 +55216 +55217 +55217 +55218 +55219 +55219 +55220 +55221 +55221 +55222 +55222 +55223 +55224 +55224 +55225 +55226 +55226 +55227 +55228 +55228 +55229 +55229 +55230 +55231 +55231 +55232 +55233 +55233 +55234 +55235 +55235 +55236 +55236 +55237 +55238 +55238 +55239 +55240 +55240 +55241 +55242 +55242 +55243 +55243 +55244 +55245 +55245 +55246 +55247 +55247 +55248 +55249 +55249 +55250 +55250 +55251 +55252 +55252 +55253 +55254 +55254 +55255 +55255 +55256 +55257 +55257 +55258 +55259 +55259 +55260 +55260 +55261 +55262 +55262 +55263 +55264 +55264 +55265 +55265 +55266 +55267 +55267 +55268 +55269 +55269 +55270 +55270 +55271 +55272 +55272 +55273 +55274 +55274 +55275 +55275 +55276 +55277 +55277 +55278 +55279 +55279 +55280 +55280 +55281 +55282 +55282 +55283 +55283 +55284 +55285 +55285 +55286 +55287 +55287 +55288 +55288 +55289 +55290 +55290 +55291 +55291 +55292 +55293 +55293 +55294 +55295 +55295 +55296 +55296 +55296 +55297 +55297 +55297 +55298 +55298 +55298 +55299 +55299 +55299 +55300 +55300 +55300 +55300 +55301 +55301 +55301 +55302 +55302 +55302 +55303 +55303 +55303 +55304 +55304 +55304 +55304 +55305 +55305 +55305 +55306 +55306 +55306 +55307 +55307 +55307 +55307 +55308 +55308 +55308 +55309 +55309 +55309 +55310 +55310 +55310 +55310 +55311 +55311 +55311 +55312 +55312 +55312 +55313 +55313 +55313 +55313 +55314 +55314 +55314 +55315 +55315 +55315 +55316 +55316 +55316 +55316 +55317 +55317 +55317 +55318 +55318 +55318 +55319 +55319 +55319 +55319 +55320 +55320 +55320 +55321 +55321 +55321 +55322 +55322 +55322 +55322 +55323 +55323 +55323 +55324 +55324 +55324 +55325 +55325 +55325 +55325 +55326 +55326 +55326 +55327 +55327 +55327 +55327 +55328 +55328 +55328 +55329 +55329 +55329 +55330 +55330 +55330 +55330 +55331 +55331 +55331 +55332 +55332 +55332 +55332 +55333 +55333 +55333 +55334 +55334 +55334 +55335 +55335 +55335 +55335 +55336 +55336 +55336 +55337 +55337 +55337 +55337 +55338 +55338 +55338 +55339 +55339 +55339 +55339 +55340 +55340 +55340 +55341 +55341 +55341 +55342 +55342 +55342 +55342 +55343 +55343 +55343 +55344 +55344 +55344 +55344 +55345 +55345 +55345 +55346 +55346 +55346 +55346 +55347 +55347 +55347 +55348 +55348 +55348 +55348 +55349 +55349 +55349 +55350 +55350 +55350 +55350 +55351 +55351 +55351 +55352 +55352 +55352 +55352 +55353 +55353 +55353 +55354 +55354 +55354 +55355 +55355 +55355 +55355 +55356 +55356 +55356 +55357 +55357 +55357 +55357 +55358 +55358 +55358 +55359 +55359 +55359 +55359 +55360 +55360 +55360 +55360 +55361 +55361 +55361 +55362 +55362 +55362 +55362 +55363 +55363 +55363 +55364 +55364 +55364 +55364 +55365 +55365 +55365 +55366 +55366 +55366 +55366 +55367 +55367 +55367 +55368 +55368 +55368 +55368 +55369 +55369 +55369 +55370 +55370 +55370 +55370 +55371 +55371 +55371 +55372 +55372 +55372 +55372 +55373 +55373 +55373 +55373 +55374 +55374 +55374 +55375 +55375 +55375 +55375 +55376 +55376 +55376 +55377 +55377 +55377 +55377 +55378 +55378 +55378 +55379 +55379 +55379 +55379 +55380 +55380 +55380 +55380 +55381 +55381 +55381 +55382 +55382 +55382 +55382 +55383 +55383 +55383 +55384 +55384 +55384 +55384 +55385 +55385 +55385 +55385 +55386 +55386 +55386 +55387 +55387 +55387 +55387 +55388 +55388 +55388 +55388 +55389 +55389 +55389 +55390 +55390 +55390 +55390 +55391 +55391 +55391 +55392 +55392 +55392 +55392 +55393 +55393 +55393 +55393 +55394 +55394 +55394 +55395 +55395 +55395 +55395 +55396 +55396 +55396 +55396 +55397 +55397 +55397 +55398 +55398 +55398 +55398 +55399 +55399 +55399 +55399 +55400 +55400 +55400 +55401 +55401 +55401 +55401 +55402 +55402 +55402 +55402 +55403 +55403 +55403 +55404 +55404 +55404 +55404 +55405 +55405 +55405 +55405 +55406 +55406 +55406 +55407 +55407 +55407 +55407 +55408 +55408 +55408 +55408 +55409 +55409 +55409 +55409 +55410 +55410 +55410 +55411 +55411 +55411 +55411 +55412 +55412 +55412 +55412 +55413 +55413 +55413 +55414 +55414 +55414 +55414 +55415 +55415 +55415 +55415 +55416 +55416 +55416 +55416 +55417 +55417 +55417 +55418 +55418 +55418 +55418 +55419 +55419 +55419 +55419 +55420 +55420 +55420 +55420 +55421 +55421 +55421 +55422 +55422 +55422 +55422 +55423 +55423 +55423 +55423 +55424 +55424 +55424 +55424 +55425 +55425 +55425 +55426 +55426 +55426 +55426 +55427 +55427 +55427 +55427 +55428 +55428 +55428 +55428 +55429 +55429 +55429 +55429 +55430 +55430 +55430 +55431 +55431 +55431 +55431 +55432 +55432 +55432 +55432 +55433 +55433 +55433 +55433 +55434 +55434 +55434 +55434 +55435 +55435 +55435 +55436 +55436 +55436 +55436 +55437 +55437 +55437 +55437 +55438 +55438 +55438 +55438 +55439 +55439 +55439 +55439 +55440 +55440 +55440 +55440 +55441 +55441 +55441 +55442 +55442 +55442 +55442 +55443 +55443 +55443 +55443 +55444 +55444 +55444 +55444 +55445 +55445 +55445 +55445 +55446 +55446 +55446 +55446 +55447 +55447 +55447 +55448 +55448 +55448 +55448 +55449 +55449 +55449 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 +44646 + + + + diff --git a/tests/data/files/clf/lut3d_17x17x17_10i_12i.clf b/tests/data/files/clf/lut3d_17x17x17_10i_12i.clf index 3a94ab78fe..bdb8c39fb4 100644 --- a/tests/data/files/clf/lut3d_17x17x17_10i_12i.clf +++ b/tests/data/files/clf/lut3d_17x17x17_10i_12i.clf @@ -1,5 +1,5 @@ - + Basic 3d-LUT example. diff --git a/tests/data/files/clf/lut3d_as_matrix.clf b/tests/data/files/clf/lut3d_as_matrix.clf index f772f72168..967070e225 100644 --- a/tests/data/files/clf/lut3d_as_matrix.clf +++ b/tests/data/files/clf/lut3d_as_matrix.clf @@ -1,5 +1,5 @@ - + This Lut3D is equivalent (on its limited domain) to a matrix multiply from linear ap0 to linear rec 709 ap0 rec 709 diff --git a/tests/data/files/clf/lut3d_bizarre.clf b/tests/data/files/clf/lut3d_bizarre.clf index ef6fc8b045..80de3e54ff 100644 --- a/tests/data/files/clf/lut3d_bizarre.clf +++ b/tests/data/files/clf/lut3d_bizarre.clf @@ -1,5 +1,5 @@ - + Unusual 3d-LUT useful for showing interpolation errors 3d-LUT with extended range values diff --git a/tests/data/files/clf/lut3d_identity_12i_16f.clf b/tests/data/files/clf/lut3d_identity_12i_16f.clf index 463f31dcbd..972fb9775a 100644 --- a/tests/data/files/clf/lut3d_identity_12i_16f.clf +++ b/tests/data/files/clf/lut3d_identity_12i_16f.clf @@ -1,5 +1,5 @@ - + 3D LUT example 3D LUT diff --git a/tests/data/files/clf/lut3d_preview_tier_test.clf b/tests/data/files/clf/lut3d_preview_tier_test.clf index eae5b78a26..2bf09754c4 100644 --- a/tests/data/files/clf/lut3d_preview_tier_test.clf +++ b/tests/data/files/clf/lut3d_preview_tier_test.clf @@ -1,5 +1,5 @@ - + Test LUT for Preview-tier CLF validation test suite ACEScct Rec.1886 / Rec.709 video diff --git a/tests/data/files/clf/matrix_3x4_example.clf b/tests/data/files/clf/matrix_3x4_example.clf index a5f0722a13..1d011f90cc 100644 --- a/tests/data/files/clf/matrix_3x4_example.clf +++ b/tests/data/files/clf/matrix_3x4_example.clf @@ -1,5 +1,5 @@ - + Matrix example Used by unit tests diff --git a/tests/data/files/clf/matrix_example_utf8.clf b/tests/data/files/clf/matrix_example_utf8.clf index 2b5d8348a8..a921d2db23 100644 --- a/tests/data/files/clf/matrix_example_utf8.clf +++ b/tests/data/files/clf/matrix_example_utf8.clf @@ -1,5 +1,5 @@ - + Test utf8 character encoding support. 標準萬國碼 diff --git a/tests/data/files/clf/matrix_no_newlines.clf b/tests/data/files/clf/matrix_no_newlines.clf index 7ed434bee5..f7adde687c 100644 --- a/tests/data/files/clf/matrix_no_newlines.clf +++ b/tests/data/files/clf/matrix_no_newlines.clf @@ -1 +1 @@ -Example with minimal newlinesArray values separated only by tabs3.6 0.1 -0.2 0.3 0.2 3.5 +0.1 -0.05 1E-01 -0.3 0.34e+01 -4e-1 \ No newline at end of file +Example with minimal newlinesArray values separated only by tabs3.6 0.1 -0.2 0.3 0.2 3.5 +0.1 -0.05 1E-01 -0.3 0.34e+01 -4e-1 \ No newline at end of file diff --git a/tests/data/files/clf/matrix_windows.clf b/tests/data/files/clf/matrix_windows.clf index 7e7241610c..5a80b60e6a 100644 --- a/tests/data/files/clf/matrix_windows.clf +++ b/tests/data/files/clf/matrix_windows.clf @@ -1,4 +1,4 @@ - + This file has Windows line-endings. Also, the file does not start with a ?xml header. @@ -8,4 +8,4 @@ 0 0 4095 - \ No newline at end of file + diff --git a/tests/data/files/clf/multiple_ops.clf b/tests/data/files/clf/multiple_ops.clf index 5e0973790d..5ad43d7d01 100644 --- a/tests/data/files/clf/multiple_ops.clf +++ b/tests/data/files/clf/multiple_ops.clf @@ -1,5 +1,5 @@ - + Test with lots of different process nodes scene 1 exterior look diff --git a/tests/data/files/clf/illegal/log_bad_version.clf b/tests/data/files/clf/pre-smpte_only/illegal/log_bad_version.clf similarity index 80% rename from tests/data/files/clf/illegal/log_bad_version.clf rename to tests/data/files/clf/pre-smpte_only/illegal/log_bad_version.clf index 6aea455cd7..d0ad478c1a 100644 --- a/tests/data/files/clf/illegal/log_bad_version.clf +++ b/tests/data/files/clf/pre-smpte_only/illegal/log_bad_version.clf @@ -1,5 +1,5 @@ - + Version is too low to support Log. inputDesc outputDesc diff --git a/tests/data/files/clf/illegal/process_list_bad_version.clf b/tests/data/files/clf/pre-smpte_only/illegal/process_list_bad_version.clf similarity index 82% rename from tests/data/files/clf/illegal/process_list_bad_version.clf rename to tests/data/files/clf/pre-smpte_only/illegal/process_list_bad_version.clf index 11408a1c28..19aca3cd7c 100644 --- a/tests/data/files/clf/illegal/process_list_bad_version.clf +++ b/tests/data/files/clf/pre-smpte_only/illegal/process_list_bad_version.clf @@ -1,6 +1,6 @@ - Not a legal compCLFversion string + Does not contain a legal compCLFversion string. 3.24000 -1.53700 -0.49850 diff --git a/tests/data/files/clf/illegal/process_list_higher_version.clf b/tests/data/files/clf/pre-smpte_only/illegal/process_list_higher_version.clf similarity index 80% rename from tests/data/files/clf/illegal/process_list_higher_version.clf rename to tests/data/files/clf/pre-smpte_only/illegal/process_list_higher_version.clf index 8e1d97bff0..87c398fedb 100644 --- a/tests/data/files/clf/illegal/process_list_higher_version.clf +++ b/tests/data/files/clf/pre-smpte_only/illegal/process_list_higher_version.clf @@ -1,6 +1,6 @@ - Versions higher than current version must be rejected + Versions higher than the supported version must be rejected. 3.24000 -1.53700 -0.49850 diff --git a/tests/data/files/clf/pre-smpte_only/illegal/transform_id_empty.clf b/tests/data/files/clf/pre-smpte_only/illegal/transform_id_empty.clf new file mode 100644 index 0000000000..a3d6e465a3 --- /dev/null +++ b/tests/data/files/clf/pre-smpte_only/illegal/transform_id_empty.clf @@ -0,0 +1,5 @@ + + + The id string must not be empty in v3. + + diff --git a/tests/data/files/clf/pre-smpte_only/illegal/transform_missing_id.clf b/tests/data/files/clf/pre-smpte_only/illegal/transform_missing_id.clf new file mode 100644 index 0000000000..fdf1735321 --- /dev/null +++ b/tests/data/files/clf/pre-smpte_only/illegal/transform_missing_id.clf @@ -0,0 +1,5 @@ + + + The ProcessList id attribute may not be missing in v3. + + diff --git a/tests/data/files/clf/matrix_example.clf b/tests/data/files/clf/pre-smpte_only/matrix_example.clf similarity index 83% rename from tests/data/files/clf/matrix_example.clf rename to tests/data/files/clf/pre-smpte_only/matrix_example.clf index 7d2c833463..04041bdd15 100644 --- a/tests/data/files/clf/matrix_example.clf +++ b/tests/data/files/clf/pre-smpte_only/matrix_example.clf @@ -1,5 +1,5 @@ - + Basic matrix example using CLF v2 dim syntax RGB XYZ diff --git a/tests/data/files/clf/pre-smpte_only/process_list_v3_namespace.clf b/tests/data/files/clf/pre-smpte_only/process_list_v3_namespace.clf new file mode 100644 index 0000000000..086bfc86d6 --- /dev/null +++ b/tests/data/files/clf/pre-smpte_only/process_list_v3_namespace.clf @@ -0,0 +1,11 @@ + + + Uses the v3 namespace. + + + 3.24000 -1.53700 -0.49850 +-0.96930 1.87600 0.04156 + 0.05560 -0.20400 1.05730 + + + diff --git a/tests/data/files/clf/range.clf b/tests/data/files/clf/range.clf index 88c38cdedc..467787dc46 100644 --- a/tests/data/files/clf/range.clf +++ b/tests/data/files/clf/range.clf @@ -1,5 +1,5 @@ - + Basic range example with no style attribute RGB RGB diff --git a/tests/data/files/clf/range_test1_clamp.clf b/tests/data/files/clf/range_test1_clamp.clf index f7e436dee0..ec5f9edbd7 100644 --- a/tests/data/files/clf/range_test1_clamp.clf +++ b/tests/data/files/clf/range_test1_clamp.clf @@ -1,5 +1,5 @@ - + Basic range example 16 diff --git a/tests/data/files/clf/range_test1_noclamp.clf b/tests/data/files/clf/range_test1_noclamp.clf index f5872bd5b3..3e79f25eac 100644 --- a/tests/data/files/clf/range_test1_noclamp.clf +++ b/tests/data/files/clf/range_test1_noclamp.clf @@ -1,5 +1,5 @@ - + Basic range with noClamp style Note that the 8i bit-depth does not constrain the legal range of values diff --git a/tests/data/files/clf/range_test2.clf b/tests/data/files/clf/range_test2.clf index 7ae54b15c9..6a46eb075a 100644 --- a/tests/data/files/clf/range_test2.clf +++ b/tests/data/files/clf/range_test2.clf @@ -1,10 +1,10 @@ - + Range that clamps on the low side - 0.1 1e-1 + 0.1 diff --git a/tests/data/files/clf/smpte_only/broadcast_profile_lut33.clf b/tests/data/files/clf/smpte_only/broadcast_profile_lut33.clf new file mode 100644 index 0000000000..266a53e44b --- /dev/null +++ b/tests/data/files/clf/smpte_only/broadcast_profile_lut33.clf @@ -0,0 +1,35996 @@ + + + + urn:uuid:a8f91bfa-b79f-5d4d-b750-a411c476bb47 + + Demo Advanced LUT with dummy values + Démonstration d'une LUT avancée avec des valeurs factices + Demo Erweiterte LUT mit Dummy-Werten + + ITU-R BT.709 + + Same as Input + Identique à l'entrée + Gleiches wie Eingabe + + + http://www.smpte-ra.org/ns/2136-10/2026#Live_Broadcast_LUT33 + SMPTE_2136-10_Example + OCIO contributors + 1.0 + + ColorPrimaries_ITU709 + TransferCharacteristic_ITU709 + CodingEquations_ITU709 + + + ColorPrimaries_ITU2020 + TransferCharacteristic_SMPTEST2084 + CodingEquations_ITU2100_ICtCp + + sdiClip + Test, Display-light + fake-email@ocio.org + + + + Input Scaling - only used for full-range signals + 0. + 1. + 0.06256109481915934 + 0.91886608015640270 + + + + +0 0 0 +0 0 0.03125 +0 0 0.0625 +0 0 0.09375 +0 0 0.125 +0 0 0.1562 +0 0 0.1875 +0 0 0.2188 +0 0 0.25 +0 0 0.2812 +0 0 0.3125 +0 0 0.3438 +0 0 0.375 +0 0 0.4062 +0 0 0.4375 +0 0 0.4688 +0 0 0.5 +0 0 0.5312 +0 0 0.5625 +0 0 0.5938 +0 0 0.625 +0 0 0.6562 +0 0 0.6875 +0 0 0.7188 +0 0 0.75 +0 0 0.7812 +0 0 0.8125 +0 0 0.8438 +0 0 0.875 +0 0 0.9062 +0 0 0.9375 +0 0 0.9688 +0 0 1 +0 0.03125 0 +0 0.03125 0.03125 +0 0.03125 0.0625 +0 0.03125 0.09375 +0 0.03125 0.125 +0 0.03125 0.1562 +0 0.03125 0.1875 +0 0.03125 0.2188 +0 0.03125 0.25 +0 0.03125 0.2812 +0 0.03125 0.3125 +0 0.03125 0.3438 +0 0.03125 0.375 +0 0.03125 0.4062 +0 0.03125 0.4375 +0 0.03125 0.4688 +0 0.03125 0.5 +0 0.03125 0.5312 +0 0.03125 0.5625 +0 0.03125 0.5938 +0 0.03125 0.625 +0 0.03125 0.6562 +0 0.03125 0.6875 +0 0.03125 0.7188 +0 0.03125 0.75 +0 0.03125 0.7812 +0 0.03125 0.8125 +0 0.03125 0.8438 +0 0.03125 0.875 +0 0.03125 0.9062 +0 0.03125 0.9375 +0 0.03125 0.9688 +0 0.03125 1 +0 0.0625 0 +0 0.0625 0.03125 +0 0.0625 0.0625 +0 0.0625 0.09375 +0 0.0625 0.125 +0 0.0625 0.1562 +0 0.0625 0.1875 +0 0.0625 0.2188 +0 0.0625 0.25 +0 0.0625 0.2812 +0 0.0625 0.3125 +0 0.0625 0.3438 +0 0.0625 0.375 +0 0.0625 0.4062 +0 0.0625 0.4375 +0 0.0625 0.4688 +0 0.0625 0.5 +0 0.0625 0.5312 +0 0.0625 0.5625 +0 0.0625 0.5938 +0 0.0625 0.625 +0 0.0625 0.6562 +0 0.0625 0.6875 +0 0.0625 0.7188 +0 0.0625 0.75 +0 0.0625 0.7812 +0 0.0625 0.8125 +0 0.0625 0.8438 +0 0.0625 0.875 +0 0.0625 0.9062 +0 0.0625 0.9375 +0 0.0625 0.9688 +0 0.0625 1 +0 0.09375 0 +0 0.09375 0.03125 +0 0.09375 0.0625 +0 0.09375 0.09375 +0 0.09375 0.125 +0 0.09375 0.1562 +0 0.09375 0.1875 +0 0.09375 0.2188 +0 0.09375 0.25 +0 0.09375 0.2812 +0 0.09375 0.3125 +0 0.09375 0.3438 +0 0.09375 0.375 +0 0.09375 0.4062 +0 0.09375 0.4375 +0 0.09375 0.4688 +0 0.09375 0.5 +0 0.09375 0.5312 +0 0.09375 0.5625 +0 0.09375 0.5938 +0 0.09375 0.625 +0 0.09375 0.6562 +0 0.09375 0.6875 +0 0.09375 0.7188 +0 0.09375 0.75 +0 0.09375 0.7812 +0 0.09375 0.8125 +0 0.09375 0.8438 +0 0.09375 0.875 +0 0.09375 0.9062 +0 0.09375 0.9375 +0 0.09375 0.9688 +0 0.09375 1 +0 0.125 0 +0 0.125 0.03125 +0 0.125 0.0625 +0 0.125 0.09375 +0 0.125 0.125 +0 0.125 0.1562 +0 0.125 0.1875 +0 0.125 0.2188 +0 0.125 0.25 +0 0.125 0.2812 +0 0.125 0.3125 +0 0.125 0.3438 +0 0.125 0.375 +0 0.125 0.4062 +0 0.125 0.4375 +0 0.125 0.4688 +0 0.125 0.5 +0 0.125 0.5312 +0 0.125 0.5625 +0 0.125 0.5938 +0 0.125 0.625 +0 0.125 0.6562 +0 0.125 0.6875 +0 0.125 0.7188 +0 0.125 0.75 +0 0.125 0.7812 +0 0.125 0.8125 +0 0.125 0.8438 +0 0.125 0.875 +0 0.125 0.9062 +0 0.125 0.9375 +0 0.125 0.9688 +0 0.125 1 +0 0.1562 0 +0 0.1562 0.03125 +0 0.1562 0.0625 +0 0.1562 0.09375 +0 0.1562 0.125 +0 0.1562 0.1562 +0 0.1562 0.1875 +0 0.1562 0.2188 +0 0.1562 0.25 +0 0.1562 0.2812 +0 0.1562 0.3125 +0 0.1562 0.3438 +0 0.1562 0.375 +0 0.1562 0.4062 +0 0.1562 0.4375 +0 0.1562 0.4688 +0 0.1562 0.5 +0 0.1562 0.5312 +0 0.1562 0.5625 +0 0.1562 0.5938 +0 0.1562 0.625 +0 0.1562 0.6562 +0 0.1562 0.6875 +0 0.1562 0.7188 +0 0.1562 0.75 +0 0.1562 0.7812 +0 0.1562 0.8125 +0 0.1562 0.8438 +0 0.1562 0.875 +0 0.1562 0.9062 +0 0.1562 0.9375 +0 0.1562 0.9688 +0 0.1562 1 +0 0.1875 0 +0 0.1875 0.03125 +0 0.1875 0.0625 +0 0.1875 0.09375 +0 0.1875 0.125 +0 0.1875 0.1562 +0 0.1875 0.1875 +0 0.1875 0.2188 +0 0.1875 0.25 +0 0.1875 0.2812 +0 0.1875 0.3125 +0 0.1875 0.3438 +0 0.1875 0.375 +0 0.1875 0.4062 +0 0.1875 0.4375 +0 0.1875 0.4688 +0 0.1875 0.5 +0 0.1875 0.5312 +0 0.1875 0.5625 +0 0.1875 0.5938 +0 0.1875 0.625 +0 0.1875 0.6562 +0 0.1875 0.6875 +0 0.1875 0.7188 +0 0.1875 0.75 +0 0.1875 0.7812 +0 0.1875 0.8125 +0 0.1875 0.8438 +0 0.1875 0.875 +0 0.1875 0.9062 +0 0.1875 0.9375 +0 0.1875 0.9688 +0 0.1875 1 +0 0.2188 0 +0 0.2188 0.03125 +0 0.2188 0.0625 +0 0.2188 0.09375 +0 0.2188 0.125 +0 0.2188 0.1562 +0 0.2188 0.1875 +0 0.2188 0.2188 +0 0.2188 0.25 +0 0.2188 0.2812 +0 0.2188 0.3125 +0 0.2188 0.3438 +0 0.2188 0.375 +0 0.2188 0.4062 +0 0.2188 0.4375 +0 0.2188 0.4688 +0 0.2188 0.5 +0 0.2188 0.5312 +0 0.2188 0.5625 +0 0.2188 0.5938 +0 0.2188 0.625 +0 0.2188 0.6562 +0 0.2188 0.6875 +0 0.2188 0.7188 +0 0.2188 0.75 +0 0.2188 0.7812 +0 0.2188 0.8125 +0 0.2188 0.8438 +0 0.2188 0.875 +0 0.2188 0.9062 +0 0.2188 0.9375 +0 0.2188 0.9688 +0 0.2188 1 +0 0.25 0 +0 0.25 0.03125 +0 0.25 0.0625 +0 0.25 0.09375 +0 0.25 0.125 +0 0.25 0.1562 +0 0.25 0.1875 +0 0.25 0.2188 +0 0.25 0.25 +0 0.25 0.2812 +0 0.25 0.3125 +0 0.25 0.3438 +0 0.25 0.375 +0 0.25 0.4062 +0 0.25 0.4375 +0 0.25 0.4688 +0 0.25 0.5 +0 0.25 0.5312 +0 0.25 0.5625 +0 0.25 0.5938 +0 0.25 0.625 +0 0.25 0.6562 +0 0.25 0.6875 +0 0.25 0.7188 +0 0.25 0.75 +0 0.25 0.7812 +0 0.25 0.8125 +0 0.25 0.8438 +0 0.25 0.875 +0 0.25 0.9062 +0 0.25 0.9375 +0 0.25 0.9688 +0 0.25 1 +0 0.2812 0 +0 0.2812 0.03125 +0 0.2812 0.0625 +0 0.2812 0.09375 +0 0.2812 0.125 +0 0.2812 0.1562 +0 0.2812 0.1875 +0 0.2812 0.2188 +0 0.2812 0.25 +0 0.2812 0.2812 +0 0.2812 0.3125 +0 0.2812 0.3438 +0 0.2812 0.375 +0 0.2812 0.4062 +0 0.2812 0.4375 +0 0.2812 0.4688 +0 0.2812 0.5 +0 0.2812 0.5312 +0 0.2812 0.5625 +0 0.2812 0.5938 +0 0.2812 0.625 +0 0.2812 0.6562 +0 0.2812 0.6875 +0 0.2812 0.7188 +0 0.2812 0.75 +0 0.2812 0.7812 +0 0.2812 0.8125 +0 0.2812 0.8438 +0 0.2812 0.875 +0 0.2812 0.9062 +0 0.2812 0.9375 +0 0.2812 0.9688 +0 0.2812 1 +0 0.3125 0 +0 0.3125 0.03125 +0 0.3125 0.0625 +0 0.3125 0.09375 +0 0.3125 0.125 +0 0.3125 0.1562 +0 0.3125 0.1875 +0 0.3125 0.2188 +0 0.3125 0.25 +0 0.3125 0.2812 +0 0.3125 0.3125 +0 0.3125 0.3438 +0 0.3125 0.375 +0 0.3125 0.4062 +0 0.3125 0.4375 +0 0.3125 0.4688 +0 0.3125 0.5 +0 0.3125 0.5312 +0 0.3125 0.5625 +0 0.3125 0.5938 +0 0.3125 0.625 +0 0.3125 0.6562 +0 0.3125 0.6875 +0 0.3125 0.7188 +0 0.3125 0.75 +0 0.3125 0.7812 +0 0.3125 0.8125 +0 0.3125 0.8438 +0 0.3125 0.875 +0 0.3125 0.9062 +0 0.3125 0.9375 +0 0.3125 0.9688 +0 0.3125 1 +0 0.3438 0 +0 0.3438 0.03125 +0 0.3438 0.0625 +0 0.3438 0.09375 +0 0.3438 0.125 +0 0.3438 0.1562 +0 0.3438 0.1875 +0 0.3438 0.2188 +0 0.3438 0.25 +0 0.3438 0.2812 +0 0.3438 0.3125 +0 0.3438 0.3438 +0 0.3438 0.375 +0 0.3438 0.4062 +0 0.3438 0.4375 +0 0.3438 0.4688 +0 0.3438 0.5 +0 0.3438 0.5312 +0 0.3438 0.5625 +0 0.3438 0.5938 +0 0.3438 0.625 +0 0.3438 0.6562 +0 0.3438 0.6875 +0 0.3438 0.7188 +0 0.3438 0.75 +0 0.3438 0.7812 +0 0.3438 0.8125 +0 0.3438 0.8438 +0 0.3438 0.875 +0 0.3438 0.9062 +0 0.3438 0.9375 +0 0.3438 0.9688 +0 0.3438 1 +0 0.375 0 +0 0.375 0.03125 +0 0.375 0.0625 +0 0.375 0.09375 +0 0.375 0.125 +0 0.375 0.1562 +0 0.375 0.1875 +0 0.375 0.2188 +0 0.375 0.25 +0 0.375 0.2812 +0 0.375 0.3125 +0 0.375 0.3438 +0 0.375 0.375 +0 0.375 0.4062 +0 0.375 0.4375 +0 0.375 0.4688 +0 0.375 0.5 +0 0.375 0.5312 +0 0.375 0.5625 +0 0.375 0.5938 +0 0.375 0.625 +0 0.375 0.6562 +0 0.375 0.6875 +0 0.375 0.7188 +0 0.375 0.75 +0 0.375 0.7812 +0 0.375 0.8125 +0 0.375 0.8438 +0 0.375 0.875 +0 0.375 0.9062 +0 0.375 0.9375 +0 0.375 0.9688 +0 0.375 1 +0 0.4062 0 +0 0.4062 0.03125 +0 0.4062 0.0625 +0 0.4062 0.09375 +0 0.4062 0.125 +0 0.4062 0.1562 +0 0.4062 0.1875 +0 0.4062 0.2188 +0 0.4062 0.25 +0 0.4062 0.2812 +0 0.4062 0.3125 +0 0.4062 0.3438 +0 0.4062 0.375 +0 0.4062 0.4062 +0 0.4062 0.4375 +0 0.4062 0.4688 +0 0.4062 0.5 +0 0.4062 0.5312 +0 0.4062 0.5625 +0 0.4062 0.5938 +0 0.4062 0.625 +0 0.4062 0.6562 +0 0.4062 0.6875 +0 0.4062 0.7188 +0 0.4062 0.75 +0 0.4062 0.7812 +0 0.4062 0.8125 +0 0.4062 0.8438 +0 0.4062 0.875 +0 0.4062 0.9062 +0 0.4062 0.9375 +0 0.4062 0.9688 +0 0.4062 1 +0 0.4375 0 +0 0.4375 0.03125 +0 0.4375 0.0625 +0 0.4375 0.09375 +0 0.4375 0.125 +0 0.4375 0.1562 +0 0.4375 0.1875 +0 0.4375 0.2188 +0 0.4375 0.25 +0 0.4375 0.2812 +0 0.4375 0.3125 +0 0.4375 0.3438 +0 0.4375 0.375 +0 0.4375 0.4062 +0 0.4375 0.4375 +0 0.4375 0.4688 +0 0.4375 0.5 +0 0.4375 0.5312 +0 0.4375 0.5625 +0 0.4375 0.5938 +0 0.4375 0.625 +0 0.4375 0.6562 +0 0.4375 0.6875 +0 0.4375 0.7188 +0 0.4375 0.75 +0 0.4375 0.7812 +0 0.4375 0.8125 +0 0.4375 0.8438 +0 0.4375 0.875 +0 0.4375 0.9062 +0 0.4375 0.9375 +0 0.4375 0.9688 +0 0.4375 1 +0 0.4688 0 +0 0.4688 0.03125 +0 0.4688 0.0625 +0 0.4688 0.09375 +0 0.4688 0.125 +0 0.4688 0.1562 +0 0.4688 0.1875 +0 0.4688 0.2188 +0 0.4688 0.25 +0 0.4688 0.2812 +0 0.4688 0.3125 +0 0.4688 0.3438 +0 0.4688 0.375 +0 0.4688 0.4062 +0 0.4688 0.4375 +0 0.4688 0.4688 +0 0.4688 0.5 +0 0.4688 0.5312 +0 0.4688 0.5625 +0 0.4688 0.5938 +0 0.4688 0.625 +0 0.4688 0.6562 +0 0.4688 0.6875 +0 0.4688 0.7188 +0 0.4688 0.75 +0 0.4688 0.7812 +0 0.4688 0.8125 +0 0.4688 0.8438 +0 0.4688 0.875 +0 0.4688 0.9062 +0 0.4688 0.9375 +0 0.4688 0.9688 +0 0.4688 1 +0 0.5 0 +0 0.5 0.03125 +0 0.5 0.0625 +0 0.5 0.09375 +0 0.5 0.125 +0 0.5 0.1562 +0 0.5 0.1875 +0 0.5 0.2188 +0 0.5 0.25 +0 0.5 0.2812 +0 0.5 0.3125 +0 0.5 0.3438 +0 0.5 0.375 +0 0.5 0.4062 +0 0.5 0.4375 +0 0.5 0.4688 +0 0.5 0.5 +0 0.5 0.5312 +0 0.5 0.5625 +0 0.5 0.5938 +0 0.5 0.625 +0 0.5 0.6562 +0 0.5 0.6875 +0 0.5 0.7188 +0 0.5 0.75 +0 0.5 0.7812 +0 0.5 0.8125 +0 0.5 0.8438 +0 0.5 0.875 +0 0.5 0.9062 +0 0.5 0.9375 +0 0.5 0.9688 +0 0.5 1 +0 0.5312 0 +0 0.5312 0.03125 +0 0.5312 0.0625 +0 0.5312 0.09375 +0 0.5312 0.125 +0 0.5312 0.1562 +0 0.5312 0.1875 +0 0.5312 0.2188 +0 0.5312 0.25 +0 0.5312 0.2812 +0 0.5312 0.3125 +0 0.5312 0.3438 +0 0.5312 0.375 +0 0.5312 0.4062 +0 0.5312 0.4375 +0 0.5312 0.4688 +0 0.5312 0.5 +0 0.5312 0.5312 +0 0.5312 0.5625 +0 0.5312 0.5938 +0 0.5312 0.625 +0 0.5312 0.6562 +0 0.5312 0.6875 +0 0.5312 0.7188 +0 0.5312 0.75 +0 0.5312 0.7812 +0 0.5312 0.8125 +0 0.5312 0.8438 +0 0.5312 0.875 +0 0.5312 0.9062 +0 0.5312 0.9375 +0 0.5312 0.9688 +0 0.5312 1 +0 0.5625 0 +0 0.5625 0.03125 +0 0.5625 0.0625 +0 0.5625 0.09375 +0 0.5625 0.125 +0 0.5625 0.1562 +0 0.5625 0.1875 +0 0.5625 0.2188 +0 0.5625 0.25 +0 0.5625 0.2812 +0 0.5625 0.3125 +0 0.5625 0.3438 +0 0.5625 0.375 +0 0.5625 0.4062 +0 0.5625 0.4375 +0 0.5625 0.4688 +0 0.5625 0.5 +0 0.5625 0.5312 +0 0.5625 0.5625 +0 0.5625 0.5938 +0 0.5625 0.625 +0 0.5625 0.6562 +0 0.5625 0.6875 +0 0.5625 0.7188 +0 0.5625 0.75 +0 0.5625 0.7812 +0 0.5625 0.8125 +0 0.5625 0.8438 +0 0.5625 0.875 +0 0.5625 0.9062 +0 0.5625 0.9375 +0 0.5625 0.9688 +0 0.5625 1 +0 0.5938 0 +0 0.5938 0.03125 +0 0.5938 0.0625 +0 0.5938 0.09375 +0 0.5938 0.125 +0 0.5938 0.1562 +0 0.5938 0.1875 +0 0.5938 0.2188 +0 0.5938 0.25 +0 0.5938 0.2812 +0 0.5938 0.3125 +0 0.5938 0.3438 +0 0.5938 0.375 +0 0.5938 0.4062 +0 0.5938 0.4375 +0 0.5938 0.4688 +0 0.5938 0.5 +0 0.5938 0.5312 +0 0.5938 0.5625 +0 0.5938 0.5938 +0 0.5938 0.625 +0 0.5938 0.6562 +0 0.5938 0.6875 +0 0.5938 0.7188 +0 0.5938 0.75 +0 0.5938 0.7812 +0 0.5938 0.8125 +0 0.5938 0.8438 +0 0.5938 0.875 +0 0.5938 0.9062 +0 0.5938 0.9375 +0 0.5938 0.9688 +0 0.5938 1 +0 0.625 0 +0 0.625 0.03125 +0 0.625 0.0625 +0 0.625 0.09375 +0 0.625 0.125 +0 0.625 0.1562 +0 0.625 0.1875 +0 0.625 0.2188 +0 0.625 0.25 +0 0.625 0.2812 +0 0.625 0.3125 +0 0.625 0.3438 +0 0.625 0.375 +0 0.625 0.4062 +0 0.625 0.4375 +0 0.625 0.4688 +0 0.625 0.5 +0 0.625 0.5312 +0 0.625 0.5625 +0 0.625 0.5938 +0 0.625 0.625 +0 0.625 0.6562 +0 0.625 0.6875 +0 0.625 0.7188 +0 0.625 0.75 +0 0.625 0.7812 +0 0.625 0.8125 +0 0.625 0.8438 +0 0.625 0.875 +0 0.625 0.9062 +0 0.625 0.9375 +0 0.625 0.9688 +0 0.625 1 +0 0.6562 0 +0 0.6562 0.03125 +0 0.6562 0.0625 +0 0.6562 0.09375 +0 0.6562 0.125 +0 0.6562 0.1562 +0 0.6562 0.1875 +0 0.6562 0.2188 +0 0.6562 0.25 +0 0.6562 0.2812 +0 0.6562 0.3125 +0 0.6562 0.3438 +0 0.6562 0.375 +0 0.6562 0.4062 +0 0.6562 0.4375 +0 0.6562 0.4688 +0 0.6562 0.5 +0 0.6562 0.5312 +0 0.6562 0.5625 +0 0.6562 0.5938 +0 0.6562 0.625 +0 0.6562 0.6562 +0 0.6562 0.6875 +0 0.6562 0.7188 +0 0.6562 0.75 +0 0.6562 0.7812 +0 0.6562 0.8125 +0 0.6562 0.8438 +0 0.6562 0.875 +0 0.6562 0.9062 +0 0.6562 0.9375 +0 0.6562 0.9688 +0 0.6562 1 +0 0.6875 0 +0 0.6875 0.03125 +0 0.6875 0.0625 +0 0.6875 0.09375 +0 0.6875 0.125 +0 0.6875 0.1562 +0 0.6875 0.1875 +0 0.6875 0.2188 +0 0.6875 0.25 +0 0.6875 0.2812 +0 0.6875 0.3125 +0 0.6875 0.3438 +0 0.6875 0.375 +0 0.6875 0.4062 +0 0.6875 0.4375 +0 0.6875 0.4688 +0 0.6875 0.5 +0 0.6875 0.5312 +0 0.6875 0.5625 +0 0.6875 0.5938 +0 0.6875 0.625 +0 0.6875 0.6562 +0 0.6875 0.6875 +0 0.6875 0.7188 +0 0.6875 0.75 +0 0.6875 0.7812 +0 0.6875 0.8125 +0 0.6875 0.8438 +0 0.6875 0.875 +0 0.6875 0.9062 +0 0.6875 0.9375 +0 0.6875 0.9688 +0 0.6875 1 +0 0.7188 0 +0 0.7188 0.03125 +0 0.7188 0.0625 +0 0.7188 0.09375 +0 0.7188 0.125 +0 0.7188 0.1562 +0 0.7188 0.1875 +0 0.7188 0.2188 +0 0.7188 0.25 +0 0.7188 0.2812 +0 0.7188 0.3125 +0 0.7188 0.3438 +0 0.7188 0.375 +0 0.7188 0.4062 +0 0.7188 0.4375 +0 0.7188 0.4688 +0 0.7188 0.5 +0 0.7188 0.5312 +0 0.7188 0.5625 +0 0.7188 0.5938 +0 0.7188 0.625 +0 0.7188 0.6562 +0 0.7188 0.6875 +0 0.7188 0.7188 +0 0.7188 0.75 +0 0.7188 0.7812 +0 0.7188 0.8125 +0 0.7188 0.8438 +0 0.7188 0.875 +0 0.7188 0.9062 +0 0.7188 0.9375 +0 0.7188 0.9688 +0 0.7188 1 +0 0.75 0 +0 0.75 0.03125 +0 0.75 0.0625 +0 0.75 0.09375 +0 0.75 0.125 +0 0.75 0.1562 +0 0.75 0.1875 +0 0.75 0.2188 +0 0.75 0.25 +0 0.75 0.2812 +0 0.75 0.3125 +0 0.75 0.3438 +0 0.75 0.375 +0 0.75 0.4062 +0 0.75 0.4375 +0 0.75 0.4688 +0 0.75 0.5 +0 0.75 0.5312 +0 0.75 0.5625 +0 0.75 0.5938 +0 0.75 0.625 +0 0.75 0.6562 +0 0.75 0.6875 +0 0.75 0.7188 +0 0.75 0.75 +0 0.75 0.7812 +0 0.75 0.8125 +0 0.75 0.8438 +0 0.75 0.875 +0 0.75 0.9062 +0 0.75 0.9375 +0 0.75 0.9688 +0 0.75 1 +0 0.7812 0 +0 0.7812 0.03125 +0 0.7812 0.0625 +0 0.7812 0.09375 +0 0.7812 0.125 +0 0.7812 0.1562 +0 0.7812 0.1875 +0 0.7812 0.2188 +0 0.7812 0.25 +0 0.7812 0.2812 +0 0.7812 0.3125 +0 0.7812 0.3438 +0 0.7812 0.375 +0 0.7812 0.4062 +0 0.7812 0.4375 +0 0.7812 0.4688 +0 0.7812 0.5 +0 0.7812 0.5312 +0 0.7812 0.5625 +0 0.7812 0.5938 +0 0.7812 0.625 +0 0.7812 0.6562 +0 0.7812 0.6875 +0 0.7812 0.7188 +0 0.7812 0.75 +0 0.7812 0.7812 +0 0.7812 0.8125 +0 0.7812 0.8438 +0 0.7812 0.875 +0 0.7812 0.9062 +0 0.7812 0.9375 +0 0.7812 0.9688 +0 0.7812 1 +0 0.8125 0 +0 0.8125 0.03125 +0 0.8125 0.0625 +0 0.8125 0.09375 +0 0.8125 0.125 +0 0.8125 0.1562 +0 0.8125 0.1875 +0 0.8125 0.2188 +0 0.8125 0.25 +0 0.8125 0.2812 +0 0.8125 0.3125 +0 0.8125 0.3438 +0 0.8125 0.375 +0 0.8125 0.4062 +0 0.8125 0.4375 +0 0.8125 0.4688 +0 0.8125 0.5 +0 0.8125 0.5312 +0 0.8125 0.5625 +0 0.8125 0.5938 +0 0.8125 0.625 +0 0.8125 0.6562 +0 0.8125 0.6875 +0 0.8125 0.7188 +0 0.8125 0.75 +0 0.8125 0.7812 +0 0.8125 0.8125 +0 0.8125 0.8438 +0 0.8125 0.875 +0 0.8125 0.9062 +0 0.8125 0.9375 +0 0.8125 0.9688 +0 0.8125 1 +0 0.8438 0 +0 0.8438 0.03125 +0 0.8438 0.0625 +0 0.8438 0.09375 +0 0.8438 0.125 +0 0.8438 0.1562 +0 0.8438 0.1875 +0 0.8438 0.2188 +0 0.8438 0.25 +0 0.8438 0.2812 +0 0.8438 0.3125 +0 0.8438 0.3438 +0 0.8438 0.375 +0 0.8438 0.4062 +0 0.8438 0.4375 +0 0.8438 0.4688 +0 0.8438 0.5 +0 0.8438 0.5312 +0 0.8438 0.5625 +0 0.8438 0.5938 +0 0.8438 0.625 +0 0.8438 0.6562 +0 0.8438 0.6875 +0 0.8438 0.7188 +0 0.8438 0.75 +0 0.8438 0.7812 +0 0.8438 0.8125 +0 0.8438 0.8438 +0 0.8438 0.875 +0 0.8438 0.9062 +0 0.8438 0.9375 +0 0.8438 0.9688 +0 0.8438 1 +0 0.875 0 +0 0.875 0.03125 +0 0.875 0.0625 +0 0.875 0.09375 +0 0.875 0.125 +0 0.875 0.1562 +0 0.875 0.1875 +0 0.875 0.2188 +0 0.875 0.25 +0 0.875 0.2812 +0 0.875 0.3125 +0 0.875 0.3438 +0 0.875 0.375 +0 0.875 0.4062 +0 0.875 0.4375 +0 0.875 0.4688 +0 0.875 0.5 +0 0.875 0.5312 +0 0.875 0.5625 +0 0.875 0.5938 +0 0.875 0.625 +0 0.875 0.6562 +0 0.875 0.6875 +0 0.875 0.7188 +0 0.875 0.75 +0 0.875 0.7812 +0 0.875 0.8125 +0 0.875 0.8438 +0 0.875 0.875 +0 0.875 0.9062 +0 0.875 0.9375 +0 0.875 0.9688 +0 0.875 1 +0 0.9062 0 +0 0.9062 0.03125 +0 0.9062 0.0625 +0 0.9062 0.09375 +0 0.9062 0.125 +0 0.9062 0.1562 +0 0.9062 0.1875 +0 0.9062 0.2188 +0 0.9062 0.25 +0 0.9062 0.2812 +0 0.9062 0.3125 +0 0.9062 0.3438 +0 0.9062 0.375 +0 0.9062 0.4062 +0 0.9062 0.4375 +0 0.9062 0.4688 +0 0.9062 0.5 +0 0.9062 0.5312 +0 0.9062 0.5625 +0 0.9062 0.5938 +0 0.9062 0.625 +0 0.9062 0.6562 +0 0.9062 0.6875 +0 0.9062 0.7188 +0 0.9062 0.75 +0 0.9062 0.7812 +0 0.9062 0.8125 +0 0.9062 0.8438 +0 0.9062 0.875 +0 0.9062 0.9062 +0 0.9062 0.9375 +0 0.9062 0.9688 +0 0.9062 1 +0 0.9375 0 +0 0.9375 0.03125 +0 0.9375 0.0625 +0 0.9375 0.09375 +0 0.9375 0.125 +0 0.9375 0.1562 +0 0.9375 0.1875 +0 0.9375 0.2188 +0 0.9375 0.25 +0 0.9375 0.2812 +0 0.9375 0.3125 +0 0.9375 0.3438 +0 0.9375 0.375 +0 0.9375 0.4062 +0 0.9375 0.4375 +0 0.9375 0.4688 +0 0.9375 0.5 +0 0.9375 0.5312 +0 0.9375 0.5625 +0 0.9375 0.5938 +0 0.9375 0.625 +0 0.9375 0.6562 +0 0.9375 0.6875 +0 0.9375 0.7188 +0 0.9375 0.75 +0 0.9375 0.7812 +0 0.9375 0.8125 +0 0.9375 0.8438 +0 0.9375 0.875 +0 0.9375 0.9062 +0 0.9375 0.9375 +0 0.9375 0.9688 +0 0.9375 1 +0 0.9688 0 +0 0.9688 0.03125 +0 0.9688 0.0625 +0 0.9688 0.09375 +0 0.9688 0.125 +0 0.9688 0.1562 +0 0.9688 0.1875 +0 0.9688 0.2188 +0 0.9688 0.25 +0 0.9688 0.2812 +0 0.9688 0.3125 +0 0.9688 0.3438 +0 0.9688 0.375 +0 0.9688 0.4062 +0 0.9688 0.4375 +0 0.9688 0.4688 +0 0.9688 0.5 +0 0.9688 0.5312 +0 0.9688 0.5625 +0 0.9688 0.5938 +0 0.9688 0.625 +0 0.9688 0.6562 +0 0.9688 0.6875 +0 0.9688 0.7188 +0 0.9688 0.75 +0 0.9688 0.7812 +0 0.9688 0.8125 +0 0.9688 0.8438 +0 0.9688 0.875 +0 0.9688 0.9062 +0 0.9688 0.9375 +0 0.9688 0.9688 +0 0.9688 1 +0 1 0 +0 1 0.03125 +0 1 0.0625 +0 1 0.09375 +0 1 0.125 +0 1 0.1562 +0 1 0.1875 +0 1 0.2188 +0 1 0.25 +0 1 0.2812 +0 1 0.3125 +0 1 0.3438 +0 1 0.375 +0 1 0.4062 +0 1 0.4375 +0 1 0.4688 +0 1 0.5 +0 1 0.5312 +0 1 0.5625 +0 1 0.5938 +0 1 0.625 +0 1 0.6562 +0 1 0.6875 +0 1 0.7188 +0 1 0.75 +0 1 0.7812 +0 1 0.8125 +0 1 0.8438 +0 1 0.875 +0 1 0.9062 +0 1 0.9375 +0 1 0.9688 +0 1 1 +0.03125 0 0 +0.03125 0 0.03125 +0.03125 0 0.0625 +0.03125 0 0.09375 +0.03125 0 0.125 +0.03125 0 0.1562 +0.03125 0 0.1875 +0.03125 0 0.2188 +0.03125 0 0.25 +0.03125 0 0.2812 +0.03125 0 0.3125 +0.03125 0 0.3438 +0.03125 0 0.375 +0.03125 0 0.4062 +0.03125 0 0.4375 +0.03125 0 0.4688 +0.03125 0 0.5 +0.03125 0 0.5312 +0.03125 0 0.5625 +0.03125 0 0.5938 +0.03125 0 0.625 +0.03125 0 0.6562 +0.03125 0 0.6875 +0.03125 0 0.7188 +0.03125 0 0.75 +0.03125 0 0.7812 +0.03125 0 0.8125 +0.03125 0 0.8438 +0.03125 0 0.875 +0.03125 0 0.9062 +0.03125 0 0.9375 +0.03125 0 0.9688 +0.03125 0 1 +0.03125 0.03125 0 +0.03125 0.03125 0.03125 +0.03125 0.03125 0.0625 +0.03125 0.03125 0.09375 +0.03125 0.03125 0.125 +0.03125 0.03125 0.1562 +0.03125 0.03125 0.1875 +0.03125 0.03125 0.2188 +0.03125 0.03125 0.25 +0.03125 0.03125 0.2812 +0.03125 0.03125 0.3125 +0.03125 0.03125 0.3438 +0.03125 0.03125 0.375 +0.03125 0.03125 0.4062 +0.03125 0.03125 0.4375 +0.03125 0.03125 0.4688 +0.03125 0.03125 0.5 +0.03125 0.03125 0.5312 +0.03125 0.03125 0.5625 +0.03125 0.03125 0.5938 +0.03125 0.03125 0.625 +0.03125 0.03125 0.6562 +0.03125 0.03125 0.6875 +0.03125 0.03125 0.7188 +0.03125 0.03125 0.75 +0.03125 0.03125 0.7812 +0.03125 0.03125 0.8125 +0.03125 0.03125 0.8438 +0.03125 0.03125 0.875 +0.03125 0.03125 0.9062 +0.03125 0.03125 0.9375 +0.03125 0.03125 0.9688 +0.03125 0.03125 1 +0.03125 0.0625 0 +0.03125 0.0625 0.03125 +0.03125 0.0625 0.0625 +0.03125 0.0625 0.09375 +0.03125 0.0625 0.125 +0.03125 0.0625 0.1562 +0.03125 0.0625 0.1875 +0.03125 0.0625 0.2188 +0.03125 0.0625 0.25 +0.03125 0.0625 0.2812 +0.03125 0.0625 0.3125 +0.03125 0.0625 0.3438 +0.03125 0.0625 0.375 +0.03125 0.0625 0.4062 +0.03125 0.0625 0.4375 +0.03125 0.0625 0.4688 +0.03125 0.0625 0.5 +0.03125 0.0625 0.5312 +0.03125 0.0625 0.5625 +0.03125 0.0625 0.5938 +0.03125 0.0625 0.625 +0.03125 0.0625 0.6562 +0.03125 0.0625 0.6875 +0.03125 0.0625 0.7188 +0.03125 0.0625 0.75 +0.03125 0.0625 0.7812 +0.03125 0.0625 0.8125 +0.03125 0.0625 0.8438 +0.03125 0.0625 0.875 +0.03125 0.0625 0.9062 +0.03125 0.0625 0.9375 +0.03125 0.0625 0.9688 +0.03125 0.0625 1 +0.03125 0.09375 0 +0.03125 0.09375 0.03125 +0.03125 0.09375 0.0625 +0.03125 0.09375 0.09375 +0.03125 0.09375 0.125 +0.03125 0.09375 0.1562 +0.03125 0.09375 0.1875 +0.03125 0.09375 0.2188 +0.03125 0.09375 0.25 +0.03125 0.09375 0.2812 +0.03125 0.09375 0.3125 +0.03125 0.09375 0.3438 +0.03125 0.09375 0.375 +0.03125 0.09375 0.4062 +0.03125 0.09375 0.4375 +0.03125 0.09375 0.4688 +0.03125 0.09375 0.5 +0.03125 0.09375 0.5312 +0.03125 0.09375 0.5625 +0.03125 0.09375 0.5938 +0.03125 0.09375 0.625 +0.03125 0.09375 0.6562 +0.03125 0.09375 0.6875 +0.03125 0.09375 0.7188 +0.03125 0.09375 0.75 +0.03125 0.09375 0.7812 +0.03125 0.09375 0.8125 +0.03125 0.09375 0.8438 +0.03125 0.09375 0.875 +0.03125 0.09375 0.9062 +0.03125 0.09375 0.9375 +0.03125 0.09375 0.9688 +0.03125 0.09375 1 +0.03125 0.125 0 +0.03125 0.125 0.03125 +0.03125 0.125 0.0625 +0.03125 0.125 0.09375 +0.03125 0.125 0.125 +0.03125 0.125 0.1562 +0.03125 0.125 0.1875 +0.03125 0.125 0.2188 +0.03125 0.125 0.25 +0.03125 0.125 0.2812 +0.03125 0.125 0.3125 +0.03125 0.125 0.3438 +0.03125 0.125 0.375 +0.03125 0.125 0.4062 +0.03125 0.125 0.4375 +0.03125 0.125 0.4688 +0.03125 0.125 0.5 +0.03125 0.125 0.5312 +0.03125 0.125 0.5625 +0.03125 0.125 0.5938 +0.03125 0.125 0.625 +0.03125 0.125 0.6562 +0.03125 0.125 0.6875 +0.03125 0.125 0.7188 +0.03125 0.125 0.75 +0.03125 0.125 0.7812 +0.03125 0.125 0.8125 +0.03125 0.125 0.8438 +0.03125 0.125 0.875 +0.03125 0.125 0.9062 +0.03125 0.125 0.9375 +0.03125 0.125 0.9688 +0.03125 0.125 1 +0.03125 0.1562 0 +0.03125 0.1562 0.03125 +0.03125 0.1562 0.0625 +0.03125 0.1562 0.09375 +0.03125 0.1562 0.125 +0.03125 0.1562 0.1562 +0.03125 0.1562 0.1875 +0.03125 0.1562 0.2188 +0.03125 0.1562 0.25 +0.03125 0.1562 0.2812 +0.03125 0.1562 0.3125 +0.03125 0.1562 0.3438 +0.03125 0.1562 0.375 +0.03125 0.1562 0.4062 +0.03125 0.1562 0.4375 +0.03125 0.1562 0.4688 +0.03125 0.1562 0.5 +0.03125 0.1562 0.5312 +0.03125 0.1562 0.5625 +0.03125 0.1562 0.5938 +0.03125 0.1562 0.625 +0.03125 0.1562 0.6562 +0.03125 0.1562 0.6875 +0.03125 0.1562 0.7188 +0.03125 0.1562 0.75 +0.03125 0.1562 0.7812 +0.03125 0.1562 0.8125 +0.03125 0.1562 0.8438 +0.03125 0.1562 0.875 +0.03125 0.1562 0.9062 +0.03125 0.1562 0.9375 +0.03125 0.1562 0.9688 +0.03125 0.1562 1 +0.03125 0.1875 0 +0.03125 0.1875 0.03125 +0.03125 0.1875 0.0625 +0.03125 0.1875 0.09375 +0.03125 0.1875 0.125 +0.03125 0.1875 0.1562 +0.03125 0.1875 0.1875 +0.03125 0.1875 0.2188 +0.03125 0.1875 0.25 +0.03125 0.1875 0.2812 +0.03125 0.1875 0.3125 +0.03125 0.1875 0.3438 +0.03125 0.1875 0.375 +0.03125 0.1875 0.4062 +0.03125 0.1875 0.4375 +0.03125 0.1875 0.4688 +0.03125 0.1875 0.5 +0.03125 0.1875 0.5312 +0.03125 0.1875 0.5625 +0.03125 0.1875 0.5938 +0.03125 0.1875 0.625 +0.03125 0.1875 0.6562 +0.03125 0.1875 0.6875 +0.03125 0.1875 0.7188 +0.03125 0.1875 0.75 +0.03125 0.1875 0.7812 +0.03125 0.1875 0.8125 +0.03125 0.1875 0.8438 +0.03125 0.1875 0.875 +0.03125 0.1875 0.9062 +0.03125 0.1875 0.9375 +0.03125 0.1875 0.9688 +0.03125 0.1875 1 +0.03125 0.2188 0 +0.03125 0.2188 0.03125 +0.03125 0.2188 0.0625 +0.03125 0.2188 0.09375 +0.03125 0.2188 0.125 +0.03125 0.2188 0.1562 +0.03125 0.2188 0.1875 +0.03125 0.2188 0.2188 +0.03125 0.2188 0.25 +0.03125 0.2188 0.2812 +0.03125 0.2188 0.3125 +0.03125 0.2188 0.3438 +0.03125 0.2188 0.375 +0.03125 0.2188 0.4062 +0.03125 0.2188 0.4375 +0.03125 0.2188 0.4688 +0.03125 0.2188 0.5 +0.03125 0.2188 0.5312 +0.03125 0.2188 0.5625 +0.03125 0.2188 0.5938 +0.03125 0.2188 0.625 +0.03125 0.2188 0.6562 +0.03125 0.2188 0.6875 +0.03125 0.2188 0.7188 +0.03125 0.2188 0.75 +0.03125 0.2188 0.7812 +0.03125 0.2188 0.8125 +0.03125 0.2188 0.8438 +0.03125 0.2188 0.875 +0.03125 0.2188 0.9062 +0.03125 0.2188 0.9375 +0.03125 0.2188 0.9688 +0.03125 0.2188 1 +0.03125 0.25 0 +0.03125 0.25 0.03125 +0.03125 0.25 0.0625 +0.03125 0.25 0.09375 +0.03125 0.25 0.125 +0.03125 0.25 0.1562 +0.03125 0.25 0.1875 +0.03125 0.25 0.2188 +0.03125 0.25 0.25 +0.03125 0.25 0.2812 +0.03125 0.25 0.3125 +0.03125 0.25 0.3438 +0.03125 0.25 0.375 +0.03125 0.25 0.4062 +0.03125 0.25 0.4375 +0.03125 0.25 0.4688 +0.03125 0.25 0.5 +0.03125 0.25 0.5312 +0.03125 0.25 0.5625 +0.03125 0.25 0.5938 +0.03125 0.25 0.625 +0.03125 0.25 0.6562 +0.03125 0.25 0.6875 +0.03125 0.25 0.7188 +0.03125 0.25 0.75 +0.03125 0.25 0.7812 +0.03125 0.25 0.8125 +0.03125 0.25 0.8438 +0.03125 0.25 0.875 +0.03125 0.25 0.9062 +0.03125 0.25 0.9375 +0.03125 0.25 0.9688 +0.03125 0.25 1 +0.03125 0.2812 0 +0.03125 0.2812 0.03125 +0.03125 0.2812 0.0625 +0.03125 0.2812 0.09375 +0.03125 0.2812 0.125 +0.03125 0.2812 0.1562 +0.03125 0.2812 0.1875 +0.03125 0.2812 0.2188 +0.03125 0.2812 0.25 +0.03125 0.2812 0.2812 +0.03125 0.2812 0.3125 +0.03125 0.2812 0.3438 +0.03125 0.2812 0.375 +0.03125 0.2812 0.4062 +0.03125 0.2812 0.4375 +0.03125 0.2812 0.4688 +0.03125 0.2812 0.5 +0.03125 0.2812 0.5312 +0.03125 0.2812 0.5625 +0.03125 0.2812 0.5938 +0.03125 0.2812 0.625 +0.03125 0.2812 0.6562 +0.03125 0.2812 0.6875 +0.03125 0.2812 0.7188 +0.03125 0.2812 0.75 +0.03125 0.2812 0.7812 +0.03125 0.2812 0.8125 +0.03125 0.2812 0.8438 +0.03125 0.2812 0.875 +0.03125 0.2812 0.9062 +0.03125 0.2812 0.9375 +0.03125 0.2812 0.9688 +0.03125 0.2812 1 +0.03125 0.3125 0 +0.03125 0.3125 0.03125 +0.03125 0.3125 0.0625 +0.03125 0.3125 0.09375 +0.03125 0.3125 0.125 +0.03125 0.3125 0.1562 +0.03125 0.3125 0.1875 +0.03125 0.3125 0.2188 +0.03125 0.3125 0.25 +0.03125 0.3125 0.2812 +0.03125 0.3125 0.3125 +0.03125 0.3125 0.3438 +0.03125 0.3125 0.375 +0.03125 0.3125 0.4062 +0.03125 0.3125 0.4375 +0.03125 0.3125 0.4688 +0.03125 0.3125 0.5 +0.03125 0.3125 0.5312 +0.03125 0.3125 0.5625 +0.03125 0.3125 0.5938 +0.03125 0.3125 0.625 +0.03125 0.3125 0.6562 +0.03125 0.3125 0.6875 +0.03125 0.3125 0.7188 +0.03125 0.3125 0.75 +0.03125 0.3125 0.7812 +0.03125 0.3125 0.8125 +0.03125 0.3125 0.8438 +0.03125 0.3125 0.875 +0.03125 0.3125 0.9062 +0.03125 0.3125 0.9375 +0.03125 0.3125 0.9688 +0.03125 0.3125 1 +0.03125 0.3438 0 +0.03125 0.3438 0.03125 +0.03125 0.3438 0.0625 +0.03125 0.3438 0.09375 +0.03125 0.3438 0.125 +0.03125 0.3438 0.1562 +0.03125 0.3438 0.1875 +0.03125 0.3438 0.2188 +0.03125 0.3438 0.25 +0.03125 0.3438 0.2812 +0.03125 0.3438 0.3125 +0.03125 0.3438 0.3438 +0.03125 0.3438 0.375 +0.03125 0.3438 0.4062 +0.03125 0.3438 0.4375 +0.03125 0.3438 0.4688 +0.03125 0.3438 0.5 +0.03125 0.3438 0.5312 +0.03125 0.3438 0.5625 +0.03125 0.3438 0.5938 +0.03125 0.3438 0.625 +0.03125 0.3438 0.6562 +0.03125 0.3438 0.6875 +0.03125 0.3438 0.7188 +0.03125 0.3438 0.75 +0.03125 0.3438 0.7812 +0.03125 0.3438 0.8125 +0.03125 0.3438 0.8438 +0.03125 0.3438 0.875 +0.03125 0.3438 0.9062 +0.03125 0.3438 0.9375 +0.03125 0.3438 0.9688 +0.03125 0.3438 1 +0.03125 0.375 0 +0.03125 0.375 0.03125 +0.03125 0.375 0.0625 +0.03125 0.375 0.09375 +0.03125 0.375 0.125 +0.03125 0.375 0.1562 +0.03125 0.375 0.1875 +0.03125 0.375 0.2188 +0.03125 0.375 0.25 +0.03125 0.375 0.2812 +0.03125 0.375 0.3125 +0.03125 0.375 0.3438 +0.03125 0.375 0.375 +0.03125 0.375 0.4062 +0.03125 0.375 0.4375 +0.03125 0.375 0.4688 +0.03125 0.375 0.5 +0.03125 0.375 0.5312 +0.03125 0.375 0.5625 +0.03125 0.375 0.5938 +0.03125 0.375 0.625 +0.03125 0.375 0.6562 +0.03125 0.375 0.6875 +0.03125 0.375 0.7188 +0.03125 0.375 0.75 +0.03125 0.375 0.7812 +0.03125 0.375 0.8125 +0.03125 0.375 0.8438 +0.03125 0.375 0.875 +0.03125 0.375 0.9062 +0.03125 0.375 0.9375 +0.03125 0.375 0.9688 +0.03125 0.375 1 +0.03125 0.4062 0 +0.03125 0.4062 0.03125 +0.03125 0.4062 0.0625 +0.03125 0.4062 0.09375 +0.03125 0.4062 0.125 +0.03125 0.4062 0.1562 +0.03125 0.4062 0.1875 +0.03125 0.4062 0.2188 +0.03125 0.4062 0.25 +0.03125 0.4062 0.2812 +0.03125 0.4062 0.3125 +0.03125 0.4062 0.3438 +0.03125 0.4062 0.375 +0.03125 0.4062 0.4062 +0.03125 0.4062 0.4375 +0.03125 0.4062 0.4688 +0.03125 0.4062 0.5 +0.03125 0.4062 0.5312 +0.03125 0.4062 0.5625 +0.03125 0.4062 0.5938 +0.03125 0.4062 0.625 +0.03125 0.4062 0.6562 +0.03125 0.4062 0.6875 +0.03125 0.4062 0.7188 +0.03125 0.4062 0.75 +0.03125 0.4062 0.7812 +0.03125 0.4062 0.8125 +0.03125 0.4062 0.8438 +0.03125 0.4062 0.875 +0.03125 0.4062 0.9062 +0.03125 0.4062 0.9375 +0.03125 0.4062 0.9688 +0.03125 0.4062 1 +0.03125 0.4375 0 +0.03125 0.4375 0.03125 +0.03125 0.4375 0.0625 +0.03125 0.4375 0.09375 +0.03125 0.4375 0.125 +0.03125 0.4375 0.1562 +0.03125 0.4375 0.1875 +0.03125 0.4375 0.2188 +0.03125 0.4375 0.25 +0.03125 0.4375 0.2812 +0.03125 0.4375 0.3125 +0.03125 0.4375 0.3438 +0.03125 0.4375 0.375 +0.03125 0.4375 0.4062 +0.03125 0.4375 0.4375 +0.03125 0.4375 0.4688 +0.03125 0.4375 0.5 +0.03125 0.4375 0.5312 +0.03125 0.4375 0.5625 +0.03125 0.4375 0.5938 +0.03125 0.4375 0.625 +0.03125 0.4375 0.6562 +0.03125 0.4375 0.6875 +0.03125 0.4375 0.7188 +0.03125 0.4375 0.75 +0.03125 0.4375 0.7812 +0.03125 0.4375 0.8125 +0.03125 0.4375 0.8438 +0.03125 0.4375 0.875 +0.03125 0.4375 0.9062 +0.03125 0.4375 0.9375 +0.03125 0.4375 0.9688 +0.03125 0.4375 1 +0.03125 0.4688 0 +0.03125 0.4688 0.03125 +0.03125 0.4688 0.0625 +0.03125 0.4688 0.09375 +0.03125 0.4688 0.125 +0.03125 0.4688 0.1562 +0.03125 0.4688 0.1875 +0.03125 0.4688 0.2188 +0.03125 0.4688 0.25 +0.03125 0.4688 0.2812 +0.03125 0.4688 0.3125 +0.03125 0.4688 0.3438 +0.03125 0.4688 0.375 +0.03125 0.4688 0.4062 +0.03125 0.4688 0.4375 +0.03125 0.4688 0.4688 +0.03125 0.4688 0.5 +0.03125 0.4688 0.5312 +0.03125 0.4688 0.5625 +0.03125 0.4688 0.5938 +0.03125 0.4688 0.625 +0.03125 0.4688 0.6562 +0.03125 0.4688 0.6875 +0.03125 0.4688 0.7188 +0.03125 0.4688 0.75 +0.03125 0.4688 0.7812 +0.03125 0.4688 0.8125 +0.03125 0.4688 0.8438 +0.03125 0.4688 0.875 +0.03125 0.4688 0.9062 +0.03125 0.4688 0.9375 +0.03125 0.4688 0.9688 +0.03125 0.4688 1 +0.03125 0.5 0 +0.03125 0.5 0.03125 +0.03125 0.5 0.0625 +0.03125 0.5 0.09375 +0.03125 0.5 0.125 +0.03125 0.5 0.1562 +0.03125 0.5 0.1875 +0.03125 0.5 0.2188 +0.03125 0.5 0.25 +0.03125 0.5 0.2812 +0.03125 0.5 0.3125 +0.03125 0.5 0.3438 +0.03125 0.5 0.375 +0.03125 0.5 0.4062 +0.03125 0.5 0.4375 +0.03125 0.5 0.4688 +0.03125 0.5 0.5 +0.03125 0.5 0.5312 +0.03125 0.5 0.5625 +0.03125 0.5 0.5938 +0.03125 0.5 0.625 +0.03125 0.5 0.6562 +0.03125 0.5 0.6875 +0.03125 0.5 0.7188 +0.03125 0.5 0.75 +0.03125 0.5 0.7812 +0.03125 0.5 0.8125 +0.03125 0.5 0.8438 +0.03125 0.5 0.875 +0.03125 0.5 0.9062 +0.03125 0.5 0.9375 +0.03125 0.5 0.9688 +0.03125 0.5 1 +0.03125 0.5312 0 +0.03125 0.5312 0.03125 +0.03125 0.5312 0.0625 +0.03125 0.5312 0.09375 +0.03125 0.5312 0.125 +0.03125 0.5312 0.1562 +0.03125 0.5312 0.1875 +0.03125 0.5312 0.2188 +0.03125 0.5312 0.25 +0.03125 0.5312 0.2812 +0.03125 0.5312 0.3125 +0.03125 0.5312 0.3438 +0.03125 0.5312 0.375 +0.03125 0.5312 0.4062 +0.03125 0.5312 0.4375 +0.03125 0.5312 0.4688 +0.03125 0.5312 0.5 +0.03125 0.5312 0.5312 +0.03125 0.5312 0.5625 +0.03125 0.5312 0.5938 +0.03125 0.5312 0.625 +0.03125 0.5312 0.6562 +0.03125 0.5312 0.6875 +0.03125 0.5312 0.7188 +0.03125 0.5312 0.75 +0.03125 0.5312 0.7812 +0.03125 0.5312 0.8125 +0.03125 0.5312 0.8438 +0.03125 0.5312 0.875 +0.03125 0.5312 0.9062 +0.03125 0.5312 0.9375 +0.03125 0.5312 0.9688 +0.03125 0.5312 1 +0.03125 0.5625 0 +0.03125 0.5625 0.03125 +0.03125 0.5625 0.0625 +0.03125 0.5625 0.09375 +0.03125 0.5625 0.125 +0.03125 0.5625 0.1562 +0.03125 0.5625 0.1875 +0.03125 0.5625 0.2188 +0.03125 0.5625 0.25 +0.03125 0.5625 0.2812 +0.03125 0.5625 0.3125 +0.03125 0.5625 0.3438 +0.03125 0.5625 0.375 +0.03125 0.5625 0.4062 +0.03125 0.5625 0.4375 +0.03125 0.5625 0.4688 +0.03125 0.5625 0.5 +0.03125 0.5625 0.5312 +0.03125 0.5625 0.5625 +0.03125 0.5625 0.5938 +0.03125 0.5625 0.625 +0.03125 0.5625 0.6562 +0.03125 0.5625 0.6875 +0.03125 0.5625 0.7188 +0.03125 0.5625 0.75 +0.03125 0.5625 0.7812 +0.03125 0.5625 0.8125 +0.03125 0.5625 0.8438 +0.03125 0.5625 0.875 +0.03125 0.5625 0.9062 +0.03125 0.5625 0.9375 +0.03125 0.5625 0.9688 +0.03125 0.5625 1 +0.03125 0.5938 0 +0.03125 0.5938 0.03125 +0.03125 0.5938 0.0625 +0.03125 0.5938 0.09375 +0.03125 0.5938 0.125 +0.03125 0.5938 0.1562 +0.03125 0.5938 0.1875 +0.03125 0.5938 0.2188 +0.03125 0.5938 0.25 +0.03125 0.5938 0.2812 +0.03125 0.5938 0.3125 +0.03125 0.5938 0.3438 +0.03125 0.5938 0.375 +0.03125 0.5938 0.4062 +0.03125 0.5938 0.4375 +0.03125 0.5938 0.4688 +0.03125 0.5938 0.5 +0.03125 0.5938 0.5312 +0.03125 0.5938 0.5625 +0.03125 0.5938 0.5938 +0.03125 0.5938 0.625 +0.03125 0.5938 0.6562 +0.03125 0.5938 0.6875 +0.03125 0.5938 0.7188 +0.03125 0.5938 0.75 +0.03125 0.5938 0.7812 +0.03125 0.5938 0.8125 +0.03125 0.5938 0.8438 +0.03125 0.5938 0.875 +0.03125 0.5938 0.9062 +0.03125 0.5938 0.9375 +0.03125 0.5938 0.9688 +0.03125 0.5938 1 +0.03125 0.625 0 +0.03125 0.625 0.03125 +0.03125 0.625 0.0625 +0.03125 0.625 0.09375 +0.03125 0.625 0.125 +0.03125 0.625 0.1562 +0.03125 0.625 0.1875 +0.03125 0.625 0.2188 +0.03125 0.625 0.25 +0.03125 0.625 0.2812 +0.03125 0.625 0.3125 +0.03125 0.625 0.3438 +0.03125 0.625 0.375 +0.03125 0.625 0.4062 +0.03125 0.625 0.4375 +0.03125 0.625 0.4688 +0.03125 0.625 0.5 +0.03125 0.625 0.5312 +0.03125 0.625 0.5625 +0.03125 0.625 0.5938 +0.03125 0.625 0.625 +0.03125 0.625 0.6562 +0.03125 0.625 0.6875 +0.03125 0.625 0.7188 +0.03125 0.625 0.75 +0.03125 0.625 0.7812 +0.03125 0.625 0.8125 +0.03125 0.625 0.8438 +0.03125 0.625 0.875 +0.03125 0.625 0.9062 +0.03125 0.625 0.9375 +0.03125 0.625 0.9688 +0.03125 0.625 1 +0.03125 0.6562 0 +0.03125 0.6562 0.03125 +0.03125 0.6562 0.0625 +0.03125 0.6562 0.09375 +0.03125 0.6562 0.125 +0.03125 0.6562 0.1562 +0.03125 0.6562 0.1875 +0.03125 0.6562 0.2188 +0.03125 0.6562 0.25 +0.03125 0.6562 0.2812 +0.03125 0.6562 0.3125 +0.03125 0.6562 0.3438 +0.03125 0.6562 0.375 +0.03125 0.6562 0.4062 +0.03125 0.6562 0.4375 +0.03125 0.6562 0.4688 +0.03125 0.6562 0.5 +0.03125 0.6562 0.5312 +0.03125 0.6562 0.5625 +0.03125 0.6562 0.5938 +0.03125 0.6562 0.625 +0.03125 0.6562 0.6562 +0.03125 0.6562 0.6875 +0.03125 0.6562 0.7188 +0.03125 0.6562 0.75 +0.03125 0.6562 0.7812 +0.03125 0.6562 0.8125 +0.03125 0.6562 0.8438 +0.03125 0.6562 0.875 +0.03125 0.6562 0.9062 +0.03125 0.6562 0.9375 +0.03125 0.6562 0.9688 +0.03125 0.6562 1 +0.03125 0.6875 0 +0.03125 0.6875 0.03125 +0.03125 0.6875 0.0625 +0.03125 0.6875 0.09375 +0.03125 0.6875 0.125 +0.03125 0.6875 0.1562 +0.03125 0.6875 0.1875 +0.03125 0.6875 0.2188 +0.03125 0.6875 0.25 +0.03125 0.6875 0.2812 +0.03125 0.6875 0.3125 +0.03125 0.6875 0.3438 +0.03125 0.6875 0.375 +0.03125 0.6875 0.4062 +0.03125 0.6875 0.4375 +0.03125 0.6875 0.4688 +0.03125 0.6875 0.5 +0.03125 0.6875 0.5312 +0.03125 0.6875 0.5625 +0.03125 0.6875 0.5938 +0.03125 0.6875 0.625 +0.03125 0.6875 0.6562 +0.03125 0.6875 0.6875 +0.03125 0.6875 0.7188 +0.03125 0.6875 0.75 +0.03125 0.6875 0.7812 +0.03125 0.6875 0.8125 +0.03125 0.6875 0.8438 +0.03125 0.6875 0.875 +0.03125 0.6875 0.9062 +0.03125 0.6875 0.9375 +0.03125 0.6875 0.9688 +0.03125 0.6875 1 +0.03125 0.7188 0 +0.03125 0.7188 0.03125 +0.03125 0.7188 0.0625 +0.03125 0.7188 0.09375 +0.03125 0.7188 0.125 +0.03125 0.7188 0.1562 +0.03125 0.7188 0.1875 +0.03125 0.7188 0.2188 +0.03125 0.7188 0.25 +0.03125 0.7188 0.2812 +0.03125 0.7188 0.3125 +0.03125 0.7188 0.3438 +0.03125 0.7188 0.375 +0.03125 0.7188 0.4062 +0.03125 0.7188 0.4375 +0.03125 0.7188 0.4688 +0.03125 0.7188 0.5 +0.03125 0.7188 0.5312 +0.03125 0.7188 0.5625 +0.03125 0.7188 0.5938 +0.03125 0.7188 0.625 +0.03125 0.7188 0.6562 +0.03125 0.7188 0.6875 +0.03125 0.7188 0.7188 +0.03125 0.7188 0.75 +0.03125 0.7188 0.7812 +0.03125 0.7188 0.8125 +0.03125 0.7188 0.8438 +0.03125 0.7188 0.875 +0.03125 0.7188 0.9062 +0.03125 0.7188 0.9375 +0.03125 0.7188 0.9688 +0.03125 0.7188 1 +0.03125 0.75 0 +0.03125 0.75 0.03125 +0.03125 0.75 0.0625 +0.03125 0.75 0.09375 +0.03125 0.75 0.125 +0.03125 0.75 0.1562 +0.03125 0.75 0.1875 +0.03125 0.75 0.2188 +0.03125 0.75 0.25 +0.03125 0.75 0.2812 +0.03125 0.75 0.3125 +0.03125 0.75 0.3438 +0.03125 0.75 0.375 +0.03125 0.75 0.4062 +0.03125 0.75 0.4375 +0.03125 0.75 0.4688 +0.03125 0.75 0.5 +0.03125 0.75 0.5312 +0.03125 0.75 0.5625 +0.03125 0.75 0.5938 +0.03125 0.75 0.625 +0.03125 0.75 0.6562 +0.03125 0.75 0.6875 +0.03125 0.75 0.7188 +0.03125 0.75 0.75 +0.03125 0.75 0.7812 +0.03125 0.75 0.8125 +0.03125 0.75 0.8438 +0.03125 0.75 0.875 +0.03125 0.75 0.9062 +0.03125 0.75 0.9375 +0.03125 0.75 0.9688 +0.03125 0.75 1 +0.03125 0.7812 0 +0.03125 0.7812 0.03125 +0.03125 0.7812 0.0625 +0.03125 0.7812 0.09375 +0.03125 0.7812 0.125 +0.03125 0.7812 0.1562 +0.03125 0.7812 0.1875 +0.03125 0.7812 0.2188 +0.03125 0.7812 0.25 +0.03125 0.7812 0.2812 +0.03125 0.7812 0.3125 +0.03125 0.7812 0.3438 +0.03125 0.7812 0.375 +0.03125 0.7812 0.4062 +0.03125 0.7812 0.4375 +0.03125 0.7812 0.4688 +0.03125 0.7812 0.5 +0.03125 0.7812 0.5312 +0.03125 0.7812 0.5625 +0.03125 0.7812 0.5938 +0.03125 0.7812 0.625 +0.03125 0.7812 0.6562 +0.03125 0.7812 0.6875 +0.03125 0.7812 0.7188 +0.03125 0.7812 0.75 +0.03125 0.7812 0.7812 +0.03125 0.7812 0.8125 +0.03125 0.7812 0.8438 +0.03125 0.7812 0.875 +0.03125 0.7812 0.9062 +0.03125 0.7812 0.9375 +0.03125 0.7812 0.9688 +0.03125 0.7812 1 +0.03125 0.8125 0 +0.03125 0.8125 0.03125 +0.03125 0.8125 0.0625 +0.03125 0.8125 0.09375 +0.03125 0.8125 0.125 +0.03125 0.8125 0.1562 +0.03125 0.8125 0.1875 +0.03125 0.8125 0.2188 +0.03125 0.8125 0.25 +0.03125 0.8125 0.2812 +0.03125 0.8125 0.3125 +0.03125 0.8125 0.3438 +0.03125 0.8125 0.375 +0.03125 0.8125 0.4062 +0.03125 0.8125 0.4375 +0.03125 0.8125 0.4688 +0.03125 0.8125 0.5 +0.03125 0.8125 0.5312 +0.03125 0.8125 0.5625 +0.03125 0.8125 0.5938 +0.03125 0.8125 0.625 +0.03125 0.8125 0.6562 +0.03125 0.8125 0.6875 +0.03125 0.8125 0.7188 +0.03125 0.8125 0.75 +0.03125 0.8125 0.7812 +0.03125 0.8125 0.8125 +0.03125 0.8125 0.8438 +0.03125 0.8125 0.875 +0.03125 0.8125 0.9062 +0.03125 0.8125 0.9375 +0.03125 0.8125 0.9688 +0.03125 0.8125 1 +0.03125 0.8438 0 +0.03125 0.8438 0.03125 +0.03125 0.8438 0.0625 +0.03125 0.8438 0.09375 +0.03125 0.8438 0.125 +0.03125 0.8438 0.1562 +0.03125 0.8438 0.1875 +0.03125 0.8438 0.2188 +0.03125 0.8438 0.25 +0.03125 0.8438 0.2812 +0.03125 0.8438 0.3125 +0.03125 0.8438 0.3438 +0.03125 0.8438 0.375 +0.03125 0.8438 0.4062 +0.03125 0.8438 0.4375 +0.03125 0.8438 0.4688 +0.03125 0.8438 0.5 +0.03125 0.8438 0.5312 +0.03125 0.8438 0.5625 +0.03125 0.8438 0.5938 +0.03125 0.8438 0.625 +0.03125 0.8438 0.6562 +0.03125 0.8438 0.6875 +0.03125 0.8438 0.7188 +0.03125 0.8438 0.75 +0.03125 0.8438 0.7812 +0.03125 0.8438 0.8125 +0.03125 0.8438 0.8438 +0.03125 0.8438 0.875 +0.03125 0.8438 0.9062 +0.03125 0.8438 0.9375 +0.03125 0.8438 0.9688 +0.03125 0.8438 1 +0.03125 0.875 0 +0.03125 0.875 0.03125 +0.03125 0.875 0.0625 +0.03125 0.875 0.09375 +0.03125 0.875 0.125 +0.03125 0.875 0.1562 +0.03125 0.875 0.1875 +0.03125 0.875 0.2188 +0.03125 0.875 0.25 +0.03125 0.875 0.2812 +0.03125 0.875 0.3125 +0.03125 0.875 0.3438 +0.03125 0.875 0.375 +0.03125 0.875 0.4062 +0.03125 0.875 0.4375 +0.03125 0.875 0.4688 +0.03125 0.875 0.5 +0.03125 0.875 0.5312 +0.03125 0.875 0.5625 +0.03125 0.875 0.5938 +0.03125 0.875 0.625 +0.03125 0.875 0.6562 +0.03125 0.875 0.6875 +0.03125 0.875 0.7188 +0.03125 0.875 0.75 +0.03125 0.875 0.7812 +0.03125 0.875 0.8125 +0.03125 0.875 0.8438 +0.03125 0.875 0.875 +0.03125 0.875 0.9062 +0.03125 0.875 0.9375 +0.03125 0.875 0.9688 +0.03125 0.875 1 +0.03125 0.9062 0 +0.03125 0.9062 0.03125 +0.03125 0.9062 0.0625 +0.03125 0.9062 0.09375 +0.03125 0.9062 0.125 +0.03125 0.9062 0.1562 +0.03125 0.9062 0.1875 +0.03125 0.9062 0.2188 +0.03125 0.9062 0.25 +0.03125 0.9062 0.2812 +0.03125 0.9062 0.3125 +0.03125 0.9062 0.3438 +0.03125 0.9062 0.375 +0.03125 0.9062 0.4062 +0.03125 0.9062 0.4375 +0.03125 0.9062 0.4688 +0.03125 0.9062 0.5 +0.03125 0.9062 0.5312 +0.03125 0.9062 0.5625 +0.03125 0.9062 0.5938 +0.03125 0.9062 0.625 +0.03125 0.9062 0.6562 +0.03125 0.9062 0.6875 +0.03125 0.9062 0.7188 +0.03125 0.9062 0.75 +0.03125 0.9062 0.7812 +0.03125 0.9062 0.8125 +0.03125 0.9062 0.8438 +0.03125 0.9062 0.875 +0.03125 0.9062 0.9062 +0.03125 0.9062 0.9375 +0.03125 0.9062 0.9688 +0.03125 0.9062 1 +0.03125 0.9375 0 +0.03125 0.9375 0.03125 +0.03125 0.9375 0.0625 +0.03125 0.9375 0.09375 +0.03125 0.9375 0.125 +0.03125 0.9375 0.1562 +0.03125 0.9375 0.1875 +0.03125 0.9375 0.2188 +0.03125 0.9375 0.25 +0.03125 0.9375 0.2812 +0.03125 0.9375 0.3125 +0.03125 0.9375 0.3438 +0.03125 0.9375 0.375 +0.03125 0.9375 0.4062 +0.03125 0.9375 0.4375 +0.03125 0.9375 0.4688 +0.03125 0.9375 0.5 +0.03125 0.9375 0.5312 +0.03125 0.9375 0.5625 +0.03125 0.9375 0.5938 +0.03125 0.9375 0.625 +0.03125 0.9375 0.6562 +0.03125 0.9375 0.6875 +0.03125 0.9375 0.7188 +0.03125 0.9375 0.75 +0.03125 0.9375 0.7812 +0.03125 0.9375 0.8125 +0.03125 0.9375 0.8438 +0.03125 0.9375 0.875 +0.03125 0.9375 0.9062 +0.03125 0.9375 0.9375 +0.03125 0.9375 0.9688 +0.03125 0.9375 1 +0.03125 0.9688 0 +0.03125 0.9688 0.03125 +0.03125 0.9688 0.0625 +0.03125 0.9688 0.09375 +0.03125 0.9688 0.125 +0.03125 0.9688 0.1562 +0.03125 0.9688 0.1875 +0.03125 0.9688 0.2188 +0.03125 0.9688 0.25 +0.03125 0.9688 0.2812 +0.03125 0.9688 0.3125 +0.03125 0.9688 0.3438 +0.03125 0.9688 0.375 +0.03125 0.9688 0.4062 +0.03125 0.9688 0.4375 +0.03125 0.9688 0.4688 +0.03125 0.9688 0.5 +0.03125 0.9688 0.5312 +0.03125 0.9688 0.5625 +0.03125 0.9688 0.5938 +0.03125 0.9688 0.625 +0.03125 0.9688 0.6562 +0.03125 0.9688 0.6875 +0.03125 0.9688 0.7188 +0.03125 0.9688 0.75 +0.03125 0.9688 0.7812 +0.03125 0.9688 0.8125 +0.03125 0.9688 0.8438 +0.03125 0.9688 0.875 +0.03125 0.9688 0.9062 +0.03125 0.9688 0.9375 +0.03125 0.9688 0.9688 +0.03125 0.9688 1 +0.03125 1 0 +0.03125 1 0.03125 +0.03125 1 0.0625 +0.03125 1 0.09375 +0.03125 1 0.125 +0.03125 1 0.1562 +0.03125 1 0.1875 +0.03125 1 0.2188 +0.03125 1 0.25 +0.03125 1 0.2812 +0.03125 1 0.3125 +0.03125 1 0.3438 +0.03125 1 0.375 +0.03125 1 0.4062 +0.03125 1 0.4375 +0.03125 1 0.4688 +0.03125 1 0.5 +0.03125 1 0.5312 +0.03125 1 0.5625 +0.03125 1 0.5938 +0.03125 1 0.625 +0.03125 1 0.6562 +0.03125 1 0.6875 +0.03125 1 0.7188 +0.03125 1 0.75 +0.03125 1 0.7812 +0.03125 1 0.8125 +0.03125 1 0.8438 +0.03125 1 0.875 +0.03125 1 0.9062 +0.03125 1 0.9375 +0.03125 1 0.9688 +0.03125 1 1 +0.0625 0 0 +0.0625 0 0.03125 +0.0625 0 0.0625 +0.0625 0 0.09375 +0.0625 0 0.125 +0.0625 0 0.1562 +0.0625 0 0.1875 +0.0625 0 0.2188 +0.0625 0 0.25 +0.0625 0 0.2812 +0.0625 0 0.3125 +0.0625 0 0.3438 +0.0625 0 0.375 +0.0625 0 0.4062 +0.0625 0 0.4375 +0.0625 0 0.4688 +0.0625 0 0.5 +0.0625 0 0.5312 +0.0625 0 0.5625 +0.0625 0 0.5938 +0.0625 0 0.625 +0.0625 0 0.6562 +0.0625 0 0.6875 +0.0625 0 0.7188 +0.0625 0 0.75 +0.0625 0 0.7812 +0.0625 0 0.8125 +0.0625 0 0.8438 +0.0625 0 0.875 +0.0625 0 0.9062 +0.0625 0 0.9375 +0.0625 0 0.9688 +0.0625 0 1 +0.0625 0.03125 0 +0.0625 0.03125 0.03125 +0.0625 0.03125 0.0625 +0.0625 0.03125 0.09375 +0.0625 0.03125 0.125 +0.0625 0.03125 0.1562 +0.0625 0.03125 0.1875 +0.0625 0.03125 0.2188 +0.0625 0.03125 0.25 +0.0625 0.03125 0.2812 +0.0625 0.03125 0.3125 +0.0625 0.03125 0.3438 +0.0625 0.03125 0.375 +0.0625 0.03125 0.4062 +0.0625 0.03125 0.4375 +0.0625 0.03125 0.4688 +0.0625 0.03125 0.5 +0.0625 0.03125 0.5312 +0.0625 0.03125 0.5625 +0.0625 0.03125 0.5938 +0.0625 0.03125 0.625 +0.0625 0.03125 0.6562 +0.0625 0.03125 0.6875 +0.0625 0.03125 0.7188 +0.0625 0.03125 0.75 +0.0625 0.03125 0.7812 +0.0625 0.03125 0.8125 +0.0625 0.03125 0.8438 +0.0625 0.03125 0.875 +0.0625 0.03125 0.9062 +0.0625 0.03125 0.9375 +0.0625 0.03125 0.9688 +0.0625 0.03125 1 +0.0625 0.0625 0 +0.0625 0.0625 0.03125 +0.0625 0.0625 0.0625 +0.0625 0.0625 0.09375 +0.0625 0.0625 0.125 +0.0625 0.0625 0.1562 +0.0625 0.0625 0.1875 +0.0625 0.0625 0.2188 +0.0625 0.0625 0.25 +0.0625 0.0625 0.2812 +0.0625 0.0625 0.3125 +0.0625 0.0625 0.3438 +0.0625 0.0625 0.375 +0.0625 0.0625 0.4062 +0.0625 0.0625 0.4375 +0.0625 0.0625 0.4688 +0.0625 0.0625 0.5 +0.0625 0.0625 0.5312 +0.0625 0.0625 0.5625 +0.0625 0.0625 0.5938 +0.0625 0.0625 0.625 +0.0625 0.0625 0.6562 +0.0625 0.0625 0.6875 +0.0625 0.0625 0.7188 +0.0625 0.0625 0.75 +0.0625 0.0625 0.7812 +0.0625 0.0625 0.8125 +0.0625 0.0625 0.8438 +0.0625 0.0625 0.875 +0.0625 0.0625 0.9062 +0.0625 0.0625 0.9375 +0.0625 0.0625 0.9688 +0.0625 0.0625 1 +0.0625 0.09375 0 +0.0625 0.09375 0.03125 +0.0625 0.09375 0.0625 +0.0625 0.09375 0.09375 +0.0625 0.09375 0.125 +0.0625 0.09375 0.1562 +0.0625 0.09375 0.1875 +0.0625 0.09375 0.2188 +0.0625 0.09375 0.25 +0.0625 0.09375 0.2812 +0.0625 0.09375 0.3125 +0.0625 0.09375 0.3438 +0.0625 0.09375 0.375 +0.0625 0.09375 0.4062 +0.0625 0.09375 0.4375 +0.0625 0.09375 0.4688 +0.0625 0.09375 0.5 +0.0625 0.09375 0.5312 +0.0625 0.09375 0.5625 +0.0625 0.09375 0.5938 +0.0625 0.09375 0.625 +0.0625 0.09375 0.6562 +0.0625 0.09375 0.6875 +0.0625 0.09375 0.7188 +0.0625 0.09375 0.75 +0.0625 0.09375 0.7812 +0.0625 0.09375 0.8125 +0.0625 0.09375 0.8438 +0.0625 0.09375 0.875 +0.0625 0.09375 0.9062 +0.0625 0.09375 0.9375 +0.0625 0.09375 0.9688 +0.0625 0.09375 1 +0.0625 0.125 0 +0.0625 0.125 0.03125 +0.0625 0.125 0.0625 +0.0625 0.125 0.09375 +0.0625 0.125 0.125 +0.0625 0.125 0.1562 +0.0625 0.125 0.1875 +0.0625 0.125 0.2188 +0.0625 0.125 0.25 +0.0625 0.125 0.2812 +0.0625 0.125 0.3125 +0.0625 0.125 0.3438 +0.0625 0.125 0.375 +0.0625 0.125 0.4062 +0.0625 0.125 0.4375 +0.0625 0.125 0.4688 +0.0625 0.125 0.5 +0.0625 0.125 0.5312 +0.0625 0.125 0.5625 +0.0625 0.125 0.5938 +0.0625 0.125 0.625 +0.0625 0.125 0.6562 +0.0625 0.125 0.6875 +0.0625 0.125 0.7188 +0.0625 0.125 0.75 +0.0625 0.125 0.7812 +0.0625 0.125 0.8125 +0.0625 0.125 0.8438 +0.0625 0.125 0.875 +0.0625 0.125 0.9062 +0.0625 0.125 0.9375 +0.0625 0.125 0.9688 +0.0625 0.125 1 +0.0625 0.1562 0 +0.0625 0.1562 0.03125 +0.0625 0.1562 0.0625 +0.0625 0.1562 0.09375 +0.0625 0.1562 0.125 +0.0625 0.1562 0.1562 +0.0625 0.1562 0.1875 +0.0625 0.1562 0.2188 +0.0625 0.1562 0.25 +0.0625 0.1562 0.2812 +0.0625 0.1562 0.3125 +0.0625 0.1562 0.3438 +0.0625 0.1562 0.375 +0.0625 0.1562 0.4062 +0.0625 0.1562 0.4375 +0.0625 0.1562 0.4688 +0.0625 0.1562 0.5 +0.0625 0.1562 0.5312 +0.0625 0.1562 0.5625 +0.0625 0.1562 0.5938 +0.0625 0.1562 0.625 +0.0625 0.1562 0.6562 +0.0625 0.1562 0.6875 +0.0625 0.1562 0.7188 +0.0625 0.1562 0.75 +0.0625 0.1562 0.7812 +0.0625 0.1562 0.8125 +0.0625 0.1562 0.8438 +0.0625 0.1562 0.875 +0.0625 0.1562 0.9062 +0.0625 0.1562 0.9375 +0.0625 0.1562 0.9688 +0.0625 0.1562 1 +0.0625 0.1875 0 +0.0625 0.1875 0.03125 +0.0625 0.1875 0.0625 +0.0625 0.1875 0.09375 +0.0625 0.1875 0.125 +0.0625 0.1875 0.1562 +0.0625 0.1875 0.1875 +0.0625 0.1875 0.2188 +0.0625 0.1875 0.25 +0.0625 0.1875 0.2812 +0.0625 0.1875 0.3125 +0.0625 0.1875 0.3438 +0.0625 0.1875 0.375 +0.0625 0.1875 0.4062 +0.0625 0.1875 0.4375 +0.0625 0.1875 0.4688 +0.0625 0.1875 0.5 +0.0625 0.1875 0.5312 +0.0625 0.1875 0.5625 +0.0625 0.1875 0.5938 +0.0625 0.1875 0.625 +0.0625 0.1875 0.6562 +0.0625 0.1875 0.6875 +0.0625 0.1875 0.7188 +0.0625 0.1875 0.75 +0.0625 0.1875 0.7812 +0.0625 0.1875 0.8125 +0.0625 0.1875 0.8438 +0.0625 0.1875 0.875 +0.0625 0.1875 0.9062 +0.0625 0.1875 0.9375 +0.0625 0.1875 0.9688 +0.0625 0.1875 1 +0.0625 0.2188 0 +0.0625 0.2188 0.03125 +0.0625 0.2188 0.0625 +0.0625 0.2188 0.09375 +0.0625 0.2188 0.125 +0.0625 0.2188 0.1562 +0.0625 0.2188 0.1875 +0.0625 0.2188 0.2188 +0.0625 0.2188 0.25 +0.0625 0.2188 0.2812 +0.0625 0.2188 0.3125 +0.0625 0.2188 0.3438 +0.0625 0.2188 0.375 +0.0625 0.2188 0.4062 +0.0625 0.2188 0.4375 +0.0625 0.2188 0.4688 +0.0625 0.2188 0.5 +0.0625 0.2188 0.5312 +0.0625 0.2188 0.5625 +0.0625 0.2188 0.5938 +0.0625 0.2188 0.625 +0.0625 0.2188 0.6562 +0.0625 0.2188 0.6875 +0.0625 0.2188 0.7188 +0.0625 0.2188 0.75 +0.0625 0.2188 0.7812 +0.0625 0.2188 0.8125 +0.0625 0.2188 0.8438 +0.0625 0.2188 0.875 +0.0625 0.2188 0.9062 +0.0625 0.2188 0.9375 +0.0625 0.2188 0.9688 +0.0625 0.2188 1 +0.0625 0.25 0 +0.0625 0.25 0.03125 +0.0625 0.25 0.0625 +0.0625 0.25 0.09375 +0.0625 0.25 0.125 +0.0625 0.25 0.1562 +0.0625 0.25 0.1875 +0.0625 0.25 0.2188 +0.0625 0.25 0.25 +0.0625 0.25 0.2812 +0.0625 0.25 0.3125 +0.0625 0.25 0.3438 +0.0625 0.25 0.375 +0.0625 0.25 0.4062 +0.0625 0.25 0.4375 +0.0625 0.25 0.4688 +0.0625 0.25 0.5 +0.0625 0.25 0.5312 +0.0625 0.25 0.5625 +0.0625 0.25 0.5938 +0.0625 0.25 0.625 +0.0625 0.25 0.6562 +0.0625 0.25 0.6875 +0.0625 0.25 0.7188 +0.0625 0.25 0.75 +0.0625 0.25 0.7812 +0.0625 0.25 0.8125 +0.0625 0.25 0.8438 +0.0625 0.25 0.875 +0.0625 0.25 0.9062 +0.0625 0.25 0.9375 +0.0625 0.25 0.9688 +0.0625 0.25 1 +0.0625 0.2812 0 +0.0625 0.2812 0.03125 +0.0625 0.2812 0.0625 +0.0625 0.2812 0.09375 +0.0625 0.2812 0.125 +0.0625 0.2812 0.1562 +0.0625 0.2812 0.1875 +0.0625 0.2812 0.2188 +0.0625 0.2812 0.25 +0.0625 0.2812 0.2812 +0.0625 0.2812 0.3125 +0.0625 0.2812 0.3438 +0.0625 0.2812 0.375 +0.0625 0.2812 0.4062 +0.0625 0.2812 0.4375 +0.0625 0.2812 0.4688 +0.0625 0.2812 0.5 +0.0625 0.2812 0.5312 +0.0625 0.2812 0.5625 +0.0625 0.2812 0.5938 +0.0625 0.2812 0.625 +0.0625 0.2812 0.6562 +0.0625 0.2812 0.6875 +0.0625 0.2812 0.7188 +0.0625 0.2812 0.75 +0.0625 0.2812 0.7812 +0.0625 0.2812 0.8125 +0.0625 0.2812 0.8438 +0.0625 0.2812 0.875 +0.0625 0.2812 0.9062 +0.0625 0.2812 0.9375 +0.0625 0.2812 0.9688 +0.0625 0.2812 1 +0.0625 0.3125 0 +0.0625 0.3125 0.03125 +0.0625 0.3125 0.0625 +0.0625 0.3125 0.09375 +0.0625 0.3125 0.125 +0.0625 0.3125 0.1562 +0.0625 0.3125 0.1875 +0.0625 0.3125 0.2188 +0.0625 0.3125 0.25 +0.0625 0.3125 0.2812 +0.0625 0.3125 0.3125 +0.0625 0.3125 0.3438 +0.0625 0.3125 0.375 +0.0625 0.3125 0.4062 +0.0625 0.3125 0.4375 +0.0625 0.3125 0.4688 +0.0625 0.3125 0.5 +0.0625 0.3125 0.5312 +0.0625 0.3125 0.5625 +0.0625 0.3125 0.5938 +0.0625 0.3125 0.625 +0.0625 0.3125 0.6562 +0.0625 0.3125 0.6875 +0.0625 0.3125 0.7188 +0.0625 0.3125 0.75 +0.0625 0.3125 0.7812 +0.0625 0.3125 0.8125 +0.0625 0.3125 0.8438 +0.0625 0.3125 0.875 +0.0625 0.3125 0.9062 +0.0625 0.3125 0.9375 +0.0625 0.3125 0.9688 +0.0625 0.3125 1 +0.0625 0.3438 0 +0.0625 0.3438 0.03125 +0.0625 0.3438 0.0625 +0.0625 0.3438 0.09375 +0.0625 0.3438 0.125 +0.0625 0.3438 0.1562 +0.0625 0.3438 0.1875 +0.0625 0.3438 0.2188 +0.0625 0.3438 0.25 +0.0625 0.3438 0.2812 +0.0625 0.3438 0.3125 +0.0625 0.3438 0.3438 +0.0625 0.3438 0.375 +0.0625 0.3438 0.4062 +0.0625 0.3438 0.4375 +0.0625 0.3438 0.4688 +0.0625 0.3438 0.5 +0.0625 0.3438 0.5312 +0.0625 0.3438 0.5625 +0.0625 0.3438 0.5938 +0.0625 0.3438 0.625 +0.0625 0.3438 0.6562 +0.0625 0.3438 0.6875 +0.0625 0.3438 0.7188 +0.0625 0.3438 0.75 +0.0625 0.3438 0.7812 +0.0625 0.3438 0.8125 +0.0625 0.3438 0.8438 +0.0625 0.3438 0.875 +0.0625 0.3438 0.9062 +0.0625 0.3438 0.9375 +0.0625 0.3438 0.9688 +0.0625 0.3438 1 +0.0625 0.375 0 +0.0625 0.375 0.03125 +0.0625 0.375 0.0625 +0.0625 0.375 0.09375 +0.0625 0.375 0.125 +0.0625 0.375 0.1562 +0.0625 0.375 0.1875 +0.0625 0.375 0.2188 +0.0625 0.375 0.25 +0.0625 0.375 0.2812 +0.0625 0.375 0.3125 +0.0625 0.375 0.3438 +0.0625 0.375 0.375 +0.0625 0.375 0.4062 +0.0625 0.375 0.4375 +0.0625 0.375 0.4688 +0.0625 0.375 0.5 +0.0625 0.375 0.5312 +0.0625 0.375 0.5625 +0.0625 0.375 0.5938 +0.0625 0.375 0.625 +0.0625 0.375 0.6562 +0.0625 0.375 0.6875 +0.0625 0.375 0.7188 +0.0625 0.375 0.75 +0.0625 0.375 0.7812 +0.0625 0.375 0.8125 +0.0625 0.375 0.8438 +0.0625 0.375 0.875 +0.0625 0.375 0.9062 +0.0625 0.375 0.9375 +0.0625 0.375 0.9688 +0.0625 0.375 1 +0.0625 0.4062 0 +0.0625 0.4062 0.03125 +0.0625 0.4062 0.0625 +0.0625 0.4062 0.09375 +0.0625 0.4062 0.125 +0.0625 0.4062 0.1562 +0.0625 0.4062 0.1875 +0.0625 0.4062 0.2188 +0.0625 0.4062 0.25 +0.0625 0.4062 0.2812 +0.0625 0.4062 0.3125 +0.0625 0.4062 0.3438 +0.0625 0.4062 0.375 +0.0625 0.4062 0.4062 +0.0625 0.4062 0.4375 +0.0625 0.4062 0.4688 +0.0625 0.4062 0.5 +0.0625 0.4062 0.5312 +0.0625 0.4062 0.5625 +0.0625 0.4062 0.5938 +0.0625 0.4062 0.625 +0.0625 0.4062 0.6562 +0.0625 0.4062 0.6875 +0.0625 0.4062 0.7188 +0.0625 0.4062 0.75 +0.0625 0.4062 0.7812 +0.0625 0.4062 0.8125 +0.0625 0.4062 0.8438 +0.0625 0.4062 0.875 +0.0625 0.4062 0.9062 +0.0625 0.4062 0.9375 +0.0625 0.4062 0.9688 +0.0625 0.4062 1 +0.0625 0.4375 0 +0.0625 0.4375 0.03125 +0.0625 0.4375 0.0625 +0.0625 0.4375 0.09375 +0.0625 0.4375 0.125 +0.0625 0.4375 0.1562 +0.0625 0.4375 0.1875 +0.0625 0.4375 0.2188 +0.0625 0.4375 0.25 +0.0625 0.4375 0.2812 +0.0625 0.4375 0.3125 +0.0625 0.4375 0.3438 +0.0625 0.4375 0.375 +0.0625 0.4375 0.4062 +0.0625 0.4375 0.4375 +0.0625 0.4375 0.4688 +0.0625 0.4375 0.5 +0.0625 0.4375 0.5312 +0.0625 0.4375 0.5625 +0.0625 0.4375 0.5938 +0.0625 0.4375 0.625 +0.0625 0.4375 0.6562 +0.0625 0.4375 0.6875 +0.0625 0.4375 0.7188 +0.0625 0.4375 0.75 +0.0625 0.4375 0.7812 +0.0625 0.4375 0.8125 +0.0625 0.4375 0.8438 +0.0625 0.4375 0.875 +0.0625 0.4375 0.9062 +0.0625 0.4375 0.9375 +0.0625 0.4375 0.9688 +0.0625 0.4375 1 +0.0625 0.4688 0 +0.0625 0.4688 0.03125 +0.0625 0.4688 0.0625 +0.0625 0.4688 0.09375 +0.0625 0.4688 0.125 +0.0625 0.4688 0.1562 +0.0625 0.4688 0.1875 +0.0625 0.4688 0.2188 +0.0625 0.4688 0.25 +0.0625 0.4688 0.2812 +0.0625 0.4688 0.3125 +0.0625 0.4688 0.3438 +0.0625 0.4688 0.375 +0.0625 0.4688 0.4062 +0.0625 0.4688 0.4375 +0.0625 0.4688 0.4688 +0.0625 0.4688 0.5 +0.0625 0.4688 0.5312 +0.0625 0.4688 0.5625 +0.0625 0.4688 0.5938 +0.0625 0.4688 0.625 +0.0625 0.4688 0.6562 +0.0625 0.4688 0.6875 +0.0625 0.4688 0.7188 +0.0625 0.4688 0.75 +0.0625 0.4688 0.7812 +0.0625 0.4688 0.8125 +0.0625 0.4688 0.8438 +0.0625 0.4688 0.875 +0.0625 0.4688 0.9062 +0.0625 0.4688 0.9375 +0.0625 0.4688 0.9688 +0.0625 0.4688 1 +0.0625 0.5 0 +0.0625 0.5 0.03125 +0.0625 0.5 0.0625 +0.0625 0.5 0.09375 +0.0625 0.5 0.125 +0.0625 0.5 0.1562 +0.0625 0.5 0.1875 +0.0625 0.5 0.2188 +0.0625 0.5 0.25 +0.0625 0.5 0.2812 +0.0625 0.5 0.3125 +0.0625 0.5 0.3438 +0.0625 0.5 0.375 +0.0625 0.5 0.4062 +0.0625 0.5 0.4375 +0.0625 0.5 0.4688 +0.0625 0.5 0.5 +0.0625 0.5 0.5312 +0.0625 0.5 0.5625 +0.0625 0.5 0.5938 +0.0625 0.5 0.625 +0.0625 0.5 0.6562 +0.0625 0.5 0.6875 +0.0625 0.5 0.7188 +0.0625 0.5 0.75 +0.0625 0.5 0.7812 +0.0625 0.5 0.8125 +0.0625 0.5 0.8438 +0.0625 0.5 0.875 +0.0625 0.5 0.9062 +0.0625 0.5 0.9375 +0.0625 0.5 0.9688 +0.0625 0.5 1 +0.0625 0.5312 0 +0.0625 0.5312 0.03125 +0.0625 0.5312 0.0625 +0.0625 0.5312 0.09375 +0.0625 0.5312 0.125 +0.0625 0.5312 0.1562 +0.0625 0.5312 0.1875 +0.0625 0.5312 0.2188 +0.0625 0.5312 0.25 +0.0625 0.5312 0.2812 +0.0625 0.5312 0.3125 +0.0625 0.5312 0.3438 +0.0625 0.5312 0.375 +0.0625 0.5312 0.4062 +0.0625 0.5312 0.4375 +0.0625 0.5312 0.4688 +0.0625 0.5312 0.5 +0.0625 0.5312 0.5312 +0.0625 0.5312 0.5625 +0.0625 0.5312 0.5938 +0.0625 0.5312 0.625 +0.0625 0.5312 0.6562 +0.0625 0.5312 0.6875 +0.0625 0.5312 0.7188 +0.0625 0.5312 0.75 +0.0625 0.5312 0.7812 +0.0625 0.5312 0.8125 +0.0625 0.5312 0.8438 +0.0625 0.5312 0.875 +0.0625 0.5312 0.9062 +0.0625 0.5312 0.9375 +0.0625 0.5312 0.9688 +0.0625 0.5312 1 +0.0625 0.5625 0 +0.0625 0.5625 0.03125 +0.0625 0.5625 0.0625 +0.0625 0.5625 0.09375 +0.0625 0.5625 0.125 +0.0625 0.5625 0.1562 +0.0625 0.5625 0.1875 +0.0625 0.5625 0.2188 +0.0625 0.5625 0.25 +0.0625 0.5625 0.2812 +0.0625 0.5625 0.3125 +0.0625 0.5625 0.3438 +0.0625 0.5625 0.375 +0.0625 0.5625 0.4062 +0.0625 0.5625 0.4375 +0.0625 0.5625 0.4688 +0.0625 0.5625 0.5 +0.0625 0.5625 0.5312 +0.0625 0.5625 0.5625 +0.0625 0.5625 0.5938 +0.0625 0.5625 0.625 +0.0625 0.5625 0.6562 +0.0625 0.5625 0.6875 +0.0625 0.5625 0.7188 +0.0625 0.5625 0.75 +0.0625 0.5625 0.7812 +0.0625 0.5625 0.8125 +0.0625 0.5625 0.8438 +0.0625 0.5625 0.875 +0.0625 0.5625 0.9062 +0.0625 0.5625 0.9375 +0.0625 0.5625 0.9688 +0.0625 0.5625 1 +0.0625 0.5938 0 +0.0625 0.5938 0.03125 +0.0625 0.5938 0.0625 +0.0625 0.5938 0.09375 +0.0625 0.5938 0.125 +0.0625 0.5938 0.1562 +0.0625 0.5938 0.1875 +0.0625 0.5938 0.2188 +0.0625 0.5938 0.25 +0.0625 0.5938 0.2812 +0.0625 0.5938 0.3125 +0.0625 0.5938 0.3438 +0.0625 0.5938 0.375 +0.0625 0.5938 0.4062 +0.0625 0.5938 0.4375 +0.0625 0.5938 0.4688 +0.0625 0.5938 0.5 +0.0625 0.5938 0.5312 +0.0625 0.5938 0.5625 +0.0625 0.5938 0.5938 +0.0625 0.5938 0.625 +0.0625 0.5938 0.6562 +0.0625 0.5938 0.6875 +0.0625 0.5938 0.7188 +0.0625 0.5938 0.75 +0.0625 0.5938 0.7812 +0.0625 0.5938 0.8125 +0.0625 0.5938 0.8438 +0.0625 0.5938 0.875 +0.0625 0.5938 0.9062 +0.0625 0.5938 0.9375 +0.0625 0.5938 0.9688 +0.0625 0.5938 1 +0.0625 0.625 0 +0.0625 0.625 0.03125 +0.0625 0.625 0.0625 +0.0625 0.625 0.09375 +0.0625 0.625 0.125 +0.0625 0.625 0.1562 +0.0625 0.625 0.1875 +0.0625 0.625 0.2188 +0.0625 0.625 0.25 +0.0625 0.625 0.2812 +0.0625 0.625 0.3125 +0.0625 0.625 0.3438 +0.0625 0.625 0.375 +0.0625 0.625 0.4062 +0.0625 0.625 0.4375 +0.0625 0.625 0.4688 +0.0625 0.625 0.5 +0.0625 0.625 0.5312 +0.0625 0.625 0.5625 +0.0625 0.625 0.5938 +0.0625 0.625 0.625 +0.0625 0.625 0.6562 +0.0625 0.625 0.6875 +0.0625 0.625 0.7188 +0.0625 0.625 0.75 +0.0625 0.625 0.7812 +0.0625 0.625 0.8125 +0.0625 0.625 0.8438 +0.0625 0.625 0.875 +0.0625 0.625 0.9062 +0.0625 0.625 0.9375 +0.0625 0.625 0.9688 +0.0625 0.625 1 +0.0625 0.6562 0 +0.0625 0.6562 0.03125 +0.0625 0.6562 0.0625 +0.0625 0.6562 0.09375 +0.0625 0.6562 0.125 +0.0625 0.6562 0.1562 +0.0625 0.6562 0.1875 +0.0625 0.6562 0.2188 +0.0625 0.6562 0.25 +0.0625 0.6562 0.2812 +0.0625 0.6562 0.3125 +0.0625 0.6562 0.3438 +0.0625 0.6562 0.375 +0.0625 0.6562 0.4062 +0.0625 0.6562 0.4375 +0.0625 0.6562 0.4688 +0.0625 0.6562 0.5 +0.0625 0.6562 0.5312 +0.0625 0.6562 0.5625 +0.0625 0.6562 0.5938 +0.0625 0.6562 0.625 +0.0625 0.6562 0.6562 +0.0625 0.6562 0.6875 +0.0625 0.6562 0.7188 +0.0625 0.6562 0.75 +0.0625 0.6562 0.7812 +0.0625 0.6562 0.8125 +0.0625 0.6562 0.8438 +0.0625 0.6562 0.875 +0.0625 0.6562 0.9062 +0.0625 0.6562 0.9375 +0.0625 0.6562 0.9688 +0.0625 0.6562 1 +0.0625 0.6875 0 +0.0625 0.6875 0.03125 +0.0625 0.6875 0.0625 +0.0625 0.6875 0.09375 +0.0625 0.6875 0.125 +0.0625 0.6875 0.1562 +0.0625 0.6875 0.1875 +0.0625 0.6875 0.2188 +0.0625 0.6875 0.25 +0.0625 0.6875 0.2812 +0.0625 0.6875 0.3125 +0.0625 0.6875 0.3438 +0.0625 0.6875 0.375 +0.0625 0.6875 0.4062 +0.0625 0.6875 0.4375 +0.0625 0.6875 0.4688 +0.0625 0.6875 0.5 +0.0625 0.6875 0.5312 +0.0625 0.6875 0.5625 +0.0625 0.6875 0.5938 +0.0625 0.6875 0.625 +0.0625 0.6875 0.6562 +0.0625 0.6875 0.6875 +0.0625 0.6875 0.7188 +0.0625 0.6875 0.75 +0.0625 0.6875 0.7812 +0.0625 0.6875 0.8125 +0.0625 0.6875 0.8438 +0.0625 0.6875 0.875 +0.0625 0.6875 0.9062 +0.0625 0.6875 0.9375 +0.0625 0.6875 0.9688 +0.0625 0.6875 1 +0.0625 0.7188 0 +0.0625 0.7188 0.03125 +0.0625 0.7188 0.0625 +0.0625 0.7188 0.09375 +0.0625 0.7188 0.125 +0.0625 0.7188 0.1562 +0.0625 0.7188 0.1875 +0.0625 0.7188 0.2188 +0.0625 0.7188 0.25 +0.0625 0.7188 0.2812 +0.0625 0.7188 0.3125 +0.0625 0.7188 0.3438 +0.0625 0.7188 0.375 +0.0625 0.7188 0.4062 +0.0625 0.7188 0.4375 +0.0625 0.7188 0.4688 +0.0625 0.7188 0.5 +0.0625 0.7188 0.5312 +0.0625 0.7188 0.5625 +0.0625 0.7188 0.5938 +0.0625 0.7188 0.625 +0.0625 0.7188 0.6562 +0.0625 0.7188 0.6875 +0.0625 0.7188 0.7188 +0.0625 0.7188 0.75 +0.0625 0.7188 0.7812 +0.0625 0.7188 0.8125 +0.0625 0.7188 0.8438 +0.0625 0.7188 0.875 +0.0625 0.7188 0.9062 +0.0625 0.7188 0.9375 +0.0625 0.7188 0.9688 +0.0625 0.7188 1 +0.0625 0.75 0 +0.0625 0.75 0.03125 +0.0625 0.75 0.0625 +0.0625 0.75 0.09375 +0.0625 0.75 0.125 +0.0625 0.75 0.1562 +0.0625 0.75 0.1875 +0.0625 0.75 0.2188 +0.0625 0.75 0.25 +0.0625 0.75 0.2812 +0.0625 0.75 0.3125 +0.0625 0.75 0.3438 +0.0625 0.75 0.375 +0.0625 0.75 0.4062 +0.0625 0.75 0.4375 +0.0625 0.75 0.4688 +0.0625 0.75 0.5 +0.0625 0.75 0.5312 +0.0625 0.75 0.5625 +0.0625 0.75 0.5938 +0.0625 0.75 0.625 +0.0625 0.75 0.6562 +0.0625 0.75 0.6875 +0.0625 0.75 0.7188 +0.0625 0.75 0.75 +0.0625 0.75 0.7812 +0.0625 0.75 0.8125 +0.0625 0.75 0.8438 +0.0625 0.75 0.875 +0.0625 0.75 0.9062 +0.0625 0.75 0.9375 +0.0625 0.75 0.9688 +0.0625 0.75 1 +0.0625 0.7812 0 +0.0625 0.7812 0.03125 +0.0625 0.7812 0.0625 +0.0625 0.7812 0.09375 +0.0625 0.7812 0.125 +0.0625 0.7812 0.1562 +0.0625 0.7812 0.1875 +0.0625 0.7812 0.2188 +0.0625 0.7812 0.25 +0.0625 0.7812 0.2812 +0.0625 0.7812 0.3125 +0.0625 0.7812 0.3438 +0.0625 0.7812 0.375 +0.0625 0.7812 0.4062 +0.0625 0.7812 0.4375 +0.0625 0.7812 0.4688 +0.0625 0.7812 0.5 +0.0625 0.7812 0.5312 +0.0625 0.7812 0.5625 +0.0625 0.7812 0.5938 +0.0625 0.7812 0.625 +0.0625 0.7812 0.6562 +0.0625 0.7812 0.6875 +0.0625 0.7812 0.7188 +0.0625 0.7812 0.75 +0.0625 0.7812 0.7812 +0.0625 0.7812 0.8125 +0.0625 0.7812 0.8438 +0.0625 0.7812 0.875 +0.0625 0.7812 0.9062 +0.0625 0.7812 0.9375 +0.0625 0.7812 0.9688 +0.0625 0.7812 1 +0.0625 0.8125 0 +0.0625 0.8125 0.03125 +0.0625 0.8125 0.0625 +0.0625 0.8125 0.09375 +0.0625 0.8125 0.125 +0.0625 0.8125 0.1562 +0.0625 0.8125 0.1875 +0.0625 0.8125 0.2188 +0.0625 0.8125 0.25 +0.0625 0.8125 0.2812 +0.0625 0.8125 0.3125 +0.0625 0.8125 0.3438 +0.0625 0.8125 0.375 +0.0625 0.8125 0.4062 +0.0625 0.8125 0.4375 +0.0625 0.8125 0.4688 +0.0625 0.8125 0.5 +0.0625 0.8125 0.5312 +0.0625 0.8125 0.5625 +0.0625 0.8125 0.5938 +0.0625 0.8125 0.625 +0.0625 0.8125 0.6562 +0.0625 0.8125 0.6875 +0.0625 0.8125 0.7188 +0.0625 0.8125 0.75 +0.0625 0.8125 0.7812 +0.0625 0.8125 0.8125 +0.0625 0.8125 0.8438 +0.0625 0.8125 0.875 +0.0625 0.8125 0.9062 +0.0625 0.8125 0.9375 +0.0625 0.8125 0.9688 +0.0625 0.8125 1 +0.0625 0.8438 0 +0.0625 0.8438 0.03125 +0.0625 0.8438 0.0625 +0.0625 0.8438 0.09375 +0.0625 0.8438 0.125 +0.0625 0.8438 0.1562 +0.0625 0.8438 0.1875 +0.0625 0.8438 0.2188 +0.0625 0.8438 0.25 +0.0625 0.8438 0.2812 +0.0625 0.8438 0.3125 +0.0625 0.8438 0.3438 +0.0625 0.8438 0.375 +0.0625 0.8438 0.4062 +0.0625 0.8438 0.4375 +0.0625 0.8438 0.4688 +0.0625 0.8438 0.5 +0.0625 0.8438 0.5312 +0.0625 0.8438 0.5625 +0.0625 0.8438 0.5938 +0.0625 0.8438 0.625 +0.0625 0.8438 0.6562 +0.0625 0.8438 0.6875 +0.0625 0.8438 0.7188 +0.0625 0.8438 0.75 +0.0625 0.8438 0.7812 +0.0625 0.8438 0.8125 +0.0625 0.8438 0.8438 +0.0625 0.8438 0.875 +0.0625 0.8438 0.9062 +0.0625 0.8438 0.9375 +0.0625 0.8438 0.9688 +0.0625 0.8438 1 +0.0625 0.875 0 +0.0625 0.875 0.03125 +0.0625 0.875 0.0625 +0.0625 0.875 0.09375 +0.0625 0.875 0.125 +0.0625 0.875 0.1562 +0.0625 0.875 0.1875 +0.0625 0.875 0.2188 +0.0625 0.875 0.25 +0.0625 0.875 0.2812 +0.0625 0.875 0.3125 +0.0625 0.875 0.3438 +0.0625 0.875 0.375 +0.0625 0.875 0.4062 +0.0625 0.875 0.4375 +0.0625 0.875 0.4688 +0.0625 0.875 0.5 +0.0625 0.875 0.5312 +0.0625 0.875 0.5625 +0.0625 0.875 0.5938 +0.0625 0.875 0.625 +0.0625 0.875 0.6562 +0.0625 0.875 0.6875 +0.0625 0.875 0.7188 +0.0625 0.875 0.75 +0.0625 0.875 0.7812 +0.0625 0.875 0.8125 +0.0625 0.875 0.8438 +0.0625 0.875 0.875 +0.0625 0.875 0.9062 +0.0625 0.875 0.9375 +0.0625 0.875 0.9688 +0.0625 0.875 1 +0.0625 0.9062 0 +0.0625 0.9062 0.03125 +0.0625 0.9062 0.0625 +0.0625 0.9062 0.09375 +0.0625 0.9062 0.125 +0.0625 0.9062 0.1562 +0.0625 0.9062 0.1875 +0.0625 0.9062 0.2188 +0.0625 0.9062 0.25 +0.0625 0.9062 0.2812 +0.0625 0.9062 0.3125 +0.0625 0.9062 0.3438 +0.0625 0.9062 0.375 +0.0625 0.9062 0.4062 +0.0625 0.9062 0.4375 +0.0625 0.9062 0.4688 +0.0625 0.9062 0.5 +0.0625 0.9062 0.5312 +0.0625 0.9062 0.5625 +0.0625 0.9062 0.5938 +0.0625 0.9062 0.625 +0.0625 0.9062 0.6562 +0.0625 0.9062 0.6875 +0.0625 0.9062 0.7188 +0.0625 0.9062 0.75 +0.0625 0.9062 0.7812 +0.0625 0.9062 0.8125 +0.0625 0.9062 0.8438 +0.0625 0.9062 0.875 +0.0625 0.9062 0.9062 +0.0625 0.9062 0.9375 +0.0625 0.9062 0.9688 +0.0625 0.9062 1 +0.0625 0.9375 0 +0.0625 0.9375 0.03125 +0.0625 0.9375 0.0625 +0.0625 0.9375 0.09375 +0.0625 0.9375 0.125 +0.0625 0.9375 0.1562 +0.0625 0.9375 0.1875 +0.0625 0.9375 0.2188 +0.0625 0.9375 0.25 +0.0625 0.9375 0.2812 +0.0625 0.9375 0.3125 +0.0625 0.9375 0.3438 +0.0625 0.9375 0.375 +0.0625 0.9375 0.4062 +0.0625 0.9375 0.4375 +0.0625 0.9375 0.4688 +0.0625 0.9375 0.5 +0.0625 0.9375 0.5312 +0.0625 0.9375 0.5625 +0.0625 0.9375 0.5938 +0.0625 0.9375 0.625 +0.0625 0.9375 0.6562 +0.0625 0.9375 0.6875 +0.0625 0.9375 0.7188 +0.0625 0.9375 0.75 +0.0625 0.9375 0.7812 +0.0625 0.9375 0.8125 +0.0625 0.9375 0.8438 +0.0625 0.9375 0.875 +0.0625 0.9375 0.9062 +0.0625 0.9375 0.9375 +0.0625 0.9375 0.9688 +0.0625 0.9375 1 +0.0625 0.9688 0 +0.0625 0.9688 0.03125 +0.0625 0.9688 0.0625 +0.0625 0.9688 0.09375 +0.0625 0.9688 0.125 +0.0625 0.9688 0.1562 +0.0625 0.9688 0.1875 +0.0625 0.9688 0.2188 +0.0625 0.9688 0.25 +0.0625 0.9688 0.2812 +0.0625 0.9688 0.3125 +0.0625 0.9688 0.3438 +0.0625 0.9688 0.375 +0.0625 0.9688 0.4062 +0.0625 0.9688 0.4375 +0.0625 0.9688 0.4688 +0.0625 0.9688 0.5 +0.0625 0.9688 0.5312 +0.0625 0.9688 0.5625 +0.0625 0.9688 0.5938 +0.0625 0.9688 0.625 +0.0625 0.9688 0.6562 +0.0625 0.9688 0.6875 +0.0625 0.9688 0.7188 +0.0625 0.9688 0.75 +0.0625 0.9688 0.7812 +0.0625 0.9688 0.8125 +0.0625 0.9688 0.8438 +0.0625 0.9688 0.875 +0.0625 0.9688 0.9062 +0.0625 0.9688 0.9375 +0.0625 0.9688 0.9688 +0.0625 0.9688 1 +0.0625 1 0 +0.0625 1 0.03125 +0.0625 1 0.0625 +0.0625 1 0.09375 +0.0625 1 0.125 +0.0625 1 0.1562 +0.0625 1 0.1875 +0.0625 1 0.2188 +0.0625 1 0.25 +0.0625 1 0.2812 +0.0625 1 0.3125 +0.0625 1 0.3438 +0.0625 1 0.375 +0.0625 1 0.4062 +0.0625 1 0.4375 +0.0625 1 0.4688 +0.0625 1 0.5 +0.0625 1 0.5312 +0.0625 1 0.5625 +0.0625 1 0.5938 +0.0625 1 0.625 +0.0625 1 0.6562 +0.0625 1 0.6875 +0.0625 1 0.7188 +0.0625 1 0.75 +0.0625 1 0.7812 +0.0625 1 0.8125 +0.0625 1 0.8438 +0.0625 1 0.875 +0.0625 1 0.9062 +0.0625 1 0.9375 +0.0625 1 0.9688 +0.0625 1 1 +0.09375 0 0 +0.09375 0 0.03125 +0.09375 0 0.0625 +0.09375 0 0.09375 +0.09375 0 0.125 +0.09375 0 0.1562 +0.09375 0 0.1875 +0.09375 0 0.2188 +0.09375 0 0.25 +0.09375 0 0.2812 +0.09375 0 0.3125 +0.09375 0 0.3438 +0.09375 0 0.375 +0.09375 0 0.4062 +0.09375 0 0.4375 +0.09375 0 0.4688 +0.09375 0 0.5 +0.09375 0 0.5312 +0.09375 0 0.5625 +0.09375 0 0.5938 +0.09375 0 0.625 +0.09375 0 0.6562 +0.09375 0 0.6875 +0.09375 0 0.7188 +0.09375 0 0.75 +0.09375 0 0.7812 +0.09375 0 0.8125 +0.09375 0 0.8438 +0.09375 0 0.875 +0.09375 0 0.9062 +0.09375 0 0.9375 +0.09375 0 0.9688 +0.09375 0 1 +0.09375 0.03125 0 +0.09375 0.03125 0.03125 +0.09375 0.03125 0.0625 +0.09375 0.03125 0.09375 +0.09375 0.03125 0.125 +0.09375 0.03125 0.1562 +0.09375 0.03125 0.1875 +0.09375 0.03125 0.2188 +0.09375 0.03125 0.25 +0.09375 0.03125 0.2812 +0.09375 0.03125 0.3125 +0.09375 0.03125 0.3438 +0.09375 0.03125 0.375 +0.09375 0.03125 0.4062 +0.09375 0.03125 0.4375 +0.09375 0.03125 0.4688 +0.09375 0.03125 0.5 +0.09375 0.03125 0.5312 +0.09375 0.03125 0.5625 +0.09375 0.03125 0.5938 +0.09375 0.03125 0.625 +0.09375 0.03125 0.6562 +0.09375 0.03125 0.6875 +0.09375 0.03125 0.7188 +0.09375 0.03125 0.75 +0.09375 0.03125 0.7812 +0.09375 0.03125 0.8125 +0.09375 0.03125 0.8438 +0.09375 0.03125 0.875 +0.09375 0.03125 0.9062 +0.09375 0.03125 0.9375 +0.09375 0.03125 0.9688 +0.09375 0.03125 1 +0.09375 0.0625 0 +0.09375 0.0625 0.03125 +0.09375 0.0625 0.0625 +0.09375 0.0625 0.09375 +0.09375 0.0625 0.125 +0.09375 0.0625 0.1562 +0.09375 0.0625 0.1875 +0.09375 0.0625 0.2188 +0.09375 0.0625 0.25 +0.09375 0.0625 0.2812 +0.09375 0.0625 0.3125 +0.09375 0.0625 0.3438 +0.09375 0.0625 0.375 +0.09375 0.0625 0.4062 +0.09375 0.0625 0.4375 +0.09375 0.0625 0.4688 +0.09375 0.0625 0.5 +0.09375 0.0625 0.5312 +0.09375 0.0625 0.5625 +0.09375 0.0625 0.5938 +0.09375 0.0625 0.625 +0.09375 0.0625 0.6562 +0.09375 0.0625 0.6875 +0.09375 0.0625 0.7188 +0.09375 0.0625 0.75 +0.09375 0.0625 0.7812 +0.09375 0.0625 0.8125 +0.09375 0.0625 0.8438 +0.09375 0.0625 0.875 +0.09375 0.0625 0.9062 +0.09375 0.0625 0.9375 +0.09375 0.0625 0.9688 +0.09375 0.0625 1 +0.09375 0.09375 0 +0.09375 0.09375 0.03125 +0.09375 0.09375 0.0625 +0.09375 0.09375 0.09375 +0.09375 0.09375 0.125 +0.09375 0.09375 0.1562 +0.09375 0.09375 0.1875 +0.09375 0.09375 0.2188 +0.09375 0.09375 0.25 +0.09375 0.09375 0.2812 +0.09375 0.09375 0.3125 +0.09375 0.09375 0.3438 +0.09375 0.09375 0.375 +0.09375 0.09375 0.4062 +0.09375 0.09375 0.4375 +0.09375 0.09375 0.4688 +0.09375 0.09375 0.5 +0.09375 0.09375 0.5312 +0.09375 0.09375 0.5625 +0.09375 0.09375 0.5938 +0.09375 0.09375 0.625 +0.09375 0.09375 0.6562 +0.09375 0.09375 0.6875 +0.09375 0.09375 0.7188 +0.09375 0.09375 0.75 +0.09375 0.09375 0.7812 +0.09375 0.09375 0.8125 +0.09375 0.09375 0.8438 +0.09375 0.09375 0.875 +0.09375 0.09375 0.9062 +0.09375 0.09375 0.9375 +0.09375 0.09375 0.9688 +0.09375 0.09375 1 +0.09375 0.125 0 +0.09375 0.125 0.03125 +0.09375 0.125 0.0625 +0.09375 0.125 0.09375 +0.09375 0.125 0.125 +0.09375 0.125 0.1562 +0.09375 0.125 0.1875 +0.09375 0.125 0.2188 +0.09375 0.125 0.25 +0.09375 0.125 0.2812 +0.09375 0.125 0.3125 +0.09375 0.125 0.3438 +0.09375 0.125 0.375 +0.09375 0.125 0.4062 +0.09375 0.125 0.4375 +0.09375 0.125 0.4688 +0.09375 0.125 0.5 +0.09375 0.125 0.5312 +0.09375 0.125 0.5625 +0.09375 0.125 0.5938 +0.09375 0.125 0.625 +0.09375 0.125 0.6562 +0.09375 0.125 0.6875 +0.09375 0.125 0.7188 +0.09375 0.125 0.75 +0.09375 0.125 0.7812 +0.09375 0.125 0.8125 +0.09375 0.125 0.8438 +0.09375 0.125 0.875 +0.09375 0.125 0.9062 +0.09375 0.125 0.9375 +0.09375 0.125 0.9688 +0.09375 0.125 1 +0.09375 0.1562 0 +0.09375 0.1562 0.03125 +0.09375 0.1562 0.0625 +0.09375 0.1562 0.09375 +0.09375 0.1562 0.125 +0.09375 0.1562 0.1562 +0.09375 0.1562 0.1875 +0.09375 0.1562 0.2188 +0.09375 0.1562 0.25 +0.09375 0.1562 0.2812 +0.09375 0.1562 0.3125 +0.09375 0.1562 0.3438 +0.09375 0.1562 0.375 +0.09375 0.1562 0.4062 +0.09375 0.1562 0.4375 +0.09375 0.1562 0.4688 +0.09375 0.1562 0.5 +0.09375 0.1562 0.5312 +0.09375 0.1562 0.5625 +0.09375 0.1562 0.5938 +0.09375 0.1562 0.625 +0.09375 0.1562 0.6562 +0.09375 0.1562 0.6875 +0.09375 0.1562 0.7188 +0.09375 0.1562 0.75 +0.09375 0.1562 0.7812 +0.09375 0.1562 0.8125 +0.09375 0.1562 0.8438 +0.09375 0.1562 0.875 +0.09375 0.1562 0.9062 +0.09375 0.1562 0.9375 +0.09375 0.1562 0.9688 +0.09375 0.1562 1 +0.09375 0.1875 0 +0.09375 0.1875 0.03125 +0.09375 0.1875 0.0625 +0.09375 0.1875 0.09375 +0.09375 0.1875 0.125 +0.09375 0.1875 0.1562 +0.09375 0.1875 0.1875 +0.09375 0.1875 0.2188 +0.09375 0.1875 0.25 +0.09375 0.1875 0.2812 +0.09375 0.1875 0.3125 +0.09375 0.1875 0.3438 +0.09375 0.1875 0.375 +0.09375 0.1875 0.4062 +0.09375 0.1875 0.4375 +0.09375 0.1875 0.4688 +0.09375 0.1875 0.5 +0.09375 0.1875 0.5312 +0.09375 0.1875 0.5625 +0.09375 0.1875 0.5938 +0.09375 0.1875 0.625 +0.09375 0.1875 0.6562 +0.09375 0.1875 0.6875 +0.09375 0.1875 0.7188 +0.09375 0.1875 0.75 +0.09375 0.1875 0.7812 +0.09375 0.1875 0.8125 +0.09375 0.1875 0.8438 +0.09375 0.1875 0.875 +0.09375 0.1875 0.9062 +0.09375 0.1875 0.9375 +0.09375 0.1875 0.9688 +0.09375 0.1875 1 +0.09375 0.2188 0 +0.09375 0.2188 0.03125 +0.09375 0.2188 0.0625 +0.09375 0.2188 0.09375 +0.09375 0.2188 0.125 +0.09375 0.2188 0.1562 +0.09375 0.2188 0.1875 +0.09375 0.2188 0.2188 +0.09375 0.2188 0.25 +0.09375 0.2188 0.2812 +0.09375 0.2188 0.3125 +0.09375 0.2188 0.3438 +0.09375 0.2188 0.375 +0.09375 0.2188 0.4062 +0.09375 0.2188 0.4375 +0.09375 0.2188 0.4688 +0.09375 0.2188 0.5 +0.09375 0.2188 0.5312 +0.09375 0.2188 0.5625 +0.09375 0.2188 0.5938 +0.09375 0.2188 0.625 +0.09375 0.2188 0.6562 +0.09375 0.2188 0.6875 +0.09375 0.2188 0.7188 +0.09375 0.2188 0.75 +0.09375 0.2188 0.7812 +0.09375 0.2188 0.8125 +0.09375 0.2188 0.8438 +0.09375 0.2188 0.875 +0.09375 0.2188 0.9062 +0.09375 0.2188 0.9375 +0.09375 0.2188 0.9688 +0.09375 0.2188 1 +0.09375 0.25 0 +0.09375 0.25 0.03125 +0.09375 0.25 0.0625 +0.09375 0.25 0.09375 +0.09375 0.25 0.125 +0.09375 0.25 0.1562 +0.09375 0.25 0.1875 +0.09375 0.25 0.2188 +0.09375 0.25 0.25 +0.09375 0.25 0.2812 +0.09375 0.25 0.3125 +0.09375 0.25 0.3438 +0.09375 0.25 0.375 +0.09375 0.25 0.4062 +0.09375 0.25 0.4375 +0.09375 0.25 0.4688 +0.09375 0.25 0.5 +0.09375 0.25 0.5312 +0.09375 0.25 0.5625 +0.09375 0.25 0.5938 +0.09375 0.25 0.625 +0.09375 0.25 0.6562 +0.09375 0.25 0.6875 +0.09375 0.25 0.7188 +0.09375 0.25 0.75 +0.09375 0.25 0.7812 +0.09375 0.25 0.8125 +0.09375 0.25 0.8438 +0.09375 0.25 0.875 +0.09375 0.25 0.9062 +0.09375 0.25 0.9375 +0.09375 0.25 0.9688 +0.09375 0.25 1 +0.09375 0.2812 0 +0.09375 0.2812 0.03125 +0.09375 0.2812 0.0625 +0.09375 0.2812 0.09375 +0.09375 0.2812 0.125 +0.09375 0.2812 0.1562 +0.09375 0.2812 0.1875 +0.09375 0.2812 0.2188 +0.09375 0.2812 0.25 +0.09375 0.2812 0.2812 +0.09375 0.2812 0.3125 +0.09375 0.2812 0.3438 +0.09375 0.2812 0.375 +0.09375 0.2812 0.4062 +0.09375 0.2812 0.4375 +0.09375 0.2812 0.4688 +0.09375 0.2812 0.5 +0.09375 0.2812 0.5312 +0.09375 0.2812 0.5625 +0.09375 0.2812 0.5938 +0.09375 0.2812 0.625 +0.09375 0.2812 0.6562 +0.09375 0.2812 0.6875 +0.09375 0.2812 0.7188 +0.09375 0.2812 0.75 +0.09375 0.2812 0.7812 +0.09375 0.2812 0.8125 +0.09375 0.2812 0.8438 +0.09375 0.2812 0.875 +0.09375 0.2812 0.9062 +0.09375 0.2812 0.9375 +0.09375 0.2812 0.9688 +0.09375 0.2812 1 +0.09375 0.3125 0 +0.09375 0.3125 0.03125 +0.09375 0.3125 0.0625 +0.09375 0.3125 0.09375 +0.09375 0.3125 0.125 +0.09375 0.3125 0.1562 +0.09375 0.3125 0.1875 +0.09375 0.3125 0.2188 +0.09375 0.3125 0.25 +0.09375 0.3125 0.2812 +0.09375 0.3125 0.3125 +0.09375 0.3125 0.3438 +0.09375 0.3125 0.375 +0.09375 0.3125 0.4062 +0.09375 0.3125 0.4375 +0.09375 0.3125 0.4688 +0.09375 0.3125 0.5 +0.09375 0.3125 0.5312 +0.09375 0.3125 0.5625 +0.09375 0.3125 0.5938 +0.09375 0.3125 0.625 +0.09375 0.3125 0.6562 +0.09375 0.3125 0.6875 +0.09375 0.3125 0.7188 +0.09375 0.3125 0.75 +0.09375 0.3125 0.7812 +0.09375 0.3125 0.8125 +0.09375 0.3125 0.8438 +0.09375 0.3125 0.875 +0.09375 0.3125 0.9062 +0.09375 0.3125 0.9375 +0.09375 0.3125 0.9688 +0.09375 0.3125 1 +0.09375 0.3438 0 +0.09375 0.3438 0.03125 +0.09375 0.3438 0.0625 +0.09375 0.3438 0.09375 +0.09375 0.3438 0.125 +0.09375 0.3438 0.1562 +0.09375 0.3438 0.1875 +0.09375 0.3438 0.2188 +0.09375 0.3438 0.25 +0.09375 0.3438 0.2812 +0.09375 0.3438 0.3125 +0.09375 0.3438 0.3438 +0.09375 0.3438 0.375 +0.09375 0.3438 0.4062 +0.09375 0.3438 0.4375 +0.09375 0.3438 0.4688 +0.09375 0.3438 0.5 +0.09375 0.3438 0.5312 +0.09375 0.3438 0.5625 +0.09375 0.3438 0.5938 +0.09375 0.3438 0.625 +0.09375 0.3438 0.6562 +0.09375 0.3438 0.6875 +0.09375 0.3438 0.7188 +0.09375 0.3438 0.75 +0.09375 0.3438 0.7812 +0.09375 0.3438 0.8125 +0.09375 0.3438 0.8438 +0.09375 0.3438 0.875 +0.09375 0.3438 0.9062 +0.09375 0.3438 0.9375 +0.09375 0.3438 0.9688 +0.09375 0.3438 1 +0.09375 0.375 0 +0.09375 0.375 0.03125 +0.09375 0.375 0.0625 +0.09375 0.375 0.09375 +0.09375 0.375 0.125 +0.09375 0.375 0.1562 +0.09375 0.375 0.1875 +0.09375 0.375 0.2188 +0.09375 0.375 0.25 +0.09375 0.375 0.2812 +0.09375 0.375 0.3125 +0.09375 0.375 0.3438 +0.09375 0.375 0.375 +0.09375 0.375 0.4062 +0.09375 0.375 0.4375 +0.09375 0.375 0.4688 +0.09375 0.375 0.5 +0.09375 0.375 0.5312 +0.09375 0.375 0.5625 +0.09375 0.375 0.5938 +0.09375 0.375 0.625 +0.09375 0.375 0.6562 +0.09375 0.375 0.6875 +0.09375 0.375 0.7188 +0.09375 0.375 0.75 +0.09375 0.375 0.7812 +0.09375 0.375 0.8125 +0.09375 0.375 0.8438 +0.09375 0.375 0.875 +0.09375 0.375 0.9062 +0.09375 0.375 0.9375 +0.09375 0.375 0.9688 +0.09375 0.375 1 +0.09375 0.4062 0 +0.09375 0.4062 0.03125 +0.09375 0.4062 0.0625 +0.09375 0.4062 0.09375 +0.09375 0.4062 0.125 +0.09375 0.4062 0.1562 +0.09375 0.4062 0.1875 +0.09375 0.4062 0.2188 +0.09375 0.4062 0.25 +0.09375 0.4062 0.2812 +0.09375 0.4062 0.3125 +0.09375 0.4062 0.3438 +0.09375 0.4062 0.375 +0.09375 0.4062 0.4062 +0.09375 0.4062 0.4375 +0.09375 0.4062 0.4688 +0.09375 0.4062 0.5 +0.09375 0.4062 0.5312 +0.09375 0.4062 0.5625 +0.09375 0.4062 0.5938 +0.09375 0.4062 0.625 +0.09375 0.4062 0.6562 +0.09375 0.4062 0.6875 +0.09375 0.4062 0.7188 +0.09375 0.4062 0.75 +0.09375 0.4062 0.7812 +0.09375 0.4062 0.8125 +0.09375 0.4062 0.8438 +0.09375 0.4062 0.875 +0.09375 0.4062 0.9062 +0.09375 0.4062 0.9375 +0.09375 0.4062 0.9688 +0.09375 0.4062 1 +0.09375 0.4375 0 +0.09375 0.4375 0.03125 +0.09375 0.4375 0.0625 +0.09375 0.4375 0.09375 +0.09375 0.4375 0.125 +0.09375 0.4375 0.1562 +0.09375 0.4375 0.1875 +0.09375 0.4375 0.2188 +0.09375 0.4375 0.25 +0.09375 0.4375 0.2812 +0.09375 0.4375 0.3125 +0.09375 0.4375 0.3438 +0.09375 0.4375 0.375 +0.09375 0.4375 0.4062 +0.09375 0.4375 0.4375 +0.09375 0.4375 0.4688 +0.09375 0.4375 0.5 +0.09375 0.4375 0.5312 +0.09375 0.4375 0.5625 +0.09375 0.4375 0.5938 +0.09375 0.4375 0.625 +0.09375 0.4375 0.6562 +0.09375 0.4375 0.6875 +0.09375 0.4375 0.7188 +0.09375 0.4375 0.75 +0.09375 0.4375 0.7812 +0.09375 0.4375 0.8125 +0.09375 0.4375 0.8438 +0.09375 0.4375 0.875 +0.09375 0.4375 0.9062 +0.09375 0.4375 0.9375 +0.09375 0.4375 0.9688 +0.09375 0.4375 1 +0.09375 0.4688 0 +0.09375 0.4688 0.03125 +0.09375 0.4688 0.0625 +0.09375 0.4688 0.09375 +0.09375 0.4688 0.125 +0.09375 0.4688 0.1562 +0.09375 0.4688 0.1875 +0.09375 0.4688 0.2188 +0.09375 0.4688 0.25 +0.09375 0.4688 0.2812 +0.09375 0.4688 0.3125 +0.09375 0.4688 0.3438 +0.09375 0.4688 0.375 +0.09375 0.4688 0.4062 +0.09375 0.4688 0.4375 +0.09375 0.4688 0.4688 +0.09375 0.4688 0.5 +0.09375 0.4688 0.5312 +0.09375 0.4688 0.5625 +0.09375 0.4688 0.5938 +0.09375 0.4688 0.625 +0.09375 0.4688 0.6562 +0.09375 0.4688 0.6875 +0.09375 0.4688 0.7188 +0.09375 0.4688 0.75 +0.09375 0.4688 0.7812 +0.09375 0.4688 0.8125 +0.09375 0.4688 0.8438 +0.09375 0.4688 0.875 +0.09375 0.4688 0.9062 +0.09375 0.4688 0.9375 +0.09375 0.4688 0.9688 +0.09375 0.4688 1 +0.09375 0.5 0 +0.09375 0.5 0.03125 +0.09375 0.5 0.0625 +0.09375 0.5 0.09375 +0.09375 0.5 0.125 +0.09375 0.5 0.1562 +0.09375 0.5 0.1875 +0.09375 0.5 0.2188 +0.09375 0.5 0.25 +0.09375 0.5 0.2812 +0.09375 0.5 0.3125 +0.09375 0.5 0.3438 +0.09375 0.5 0.375 +0.09375 0.5 0.4062 +0.09375 0.5 0.4375 +0.09375 0.5 0.4688 +0.09375 0.5 0.5 +0.09375 0.5 0.5312 +0.09375 0.5 0.5625 +0.09375 0.5 0.5938 +0.09375 0.5 0.625 +0.09375 0.5 0.6562 +0.09375 0.5 0.6875 +0.09375 0.5 0.7188 +0.09375 0.5 0.75 +0.09375 0.5 0.7812 +0.09375 0.5 0.8125 +0.09375 0.5 0.8438 +0.09375 0.5 0.875 +0.09375 0.5 0.9062 +0.09375 0.5 0.9375 +0.09375 0.5 0.9688 +0.09375 0.5 1 +0.09375 0.5312 0 +0.09375 0.5312 0.03125 +0.09375 0.5312 0.0625 +0.09375 0.5312 0.09375 +0.09375 0.5312 0.125 +0.09375 0.5312 0.1562 +0.09375 0.5312 0.1875 +0.09375 0.5312 0.2188 +0.09375 0.5312 0.25 +0.09375 0.5312 0.2812 +0.09375 0.5312 0.3125 +0.09375 0.5312 0.3438 +0.09375 0.5312 0.375 +0.09375 0.5312 0.4062 +0.09375 0.5312 0.4375 +0.09375 0.5312 0.4688 +0.09375 0.5312 0.5 +0.09375 0.5312 0.5312 +0.09375 0.5312 0.5625 +0.09375 0.5312 0.5938 +0.09375 0.5312 0.625 +0.09375 0.5312 0.6562 +0.09375 0.5312 0.6875 +0.09375 0.5312 0.7188 +0.09375 0.5312 0.75 +0.09375 0.5312 0.7812 +0.09375 0.5312 0.8125 +0.09375 0.5312 0.8438 +0.09375 0.5312 0.875 +0.09375 0.5312 0.9062 +0.09375 0.5312 0.9375 +0.09375 0.5312 0.9688 +0.09375 0.5312 1 +0.09375 0.5625 0 +0.09375 0.5625 0.03125 +0.09375 0.5625 0.0625 +0.09375 0.5625 0.09375 +0.09375 0.5625 0.125 +0.09375 0.5625 0.1562 +0.09375 0.5625 0.1875 +0.09375 0.5625 0.2188 +0.09375 0.5625 0.25 +0.09375 0.5625 0.2812 +0.09375 0.5625 0.3125 +0.09375 0.5625 0.3438 +0.09375 0.5625 0.375 +0.09375 0.5625 0.4062 +0.09375 0.5625 0.4375 +0.09375 0.5625 0.4688 +0.09375 0.5625 0.5 +0.09375 0.5625 0.5312 +0.09375 0.5625 0.5625 +0.09375 0.5625 0.5938 +0.09375 0.5625 0.625 +0.09375 0.5625 0.6562 +0.09375 0.5625 0.6875 +0.09375 0.5625 0.7188 +0.09375 0.5625 0.75 +0.09375 0.5625 0.7812 +0.09375 0.5625 0.8125 +0.09375 0.5625 0.8438 +0.09375 0.5625 0.875 +0.09375 0.5625 0.9062 +0.09375 0.5625 0.9375 +0.09375 0.5625 0.9688 +0.09375 0.5625 1 +0.09375 0.5938 0 +0.09375 0.5938 0.03125 +0.09375 0.5938 0.0625 +0.09375 0.5938 0.09375 +0.09375 0.5938 0.125 +0.09375 0.5938 0.1562 +0.09375 0.5938 0.1875 +0.09375 0.5938 0.2188 +0.09375 0.5938 0.25 +0.09375 0.5938 0.2812 +0.09375 0.5938 0.3125 +0.09375 0.5938 0.3438 +0.09375 0.5938 0.375 +0.09375 0.5938 0.4062 +0.09375 0.5938 0.4375 +0.09375 0.5938 0.4688 +0.09375 0.5938 0.5 +0.09375 0.5938 0.5312 +0.09375 0.5938 0.5625 +0.09375 0.5938 0.5938 +0.09375 0.5938 0.625 +0.09375 0.5938 0.6562 +0.09375 0.5938 0.6875 +0.09375 0.5938 0.7188 +0.09375 0.5938 0.75 +0.09375 0.5938 0.7812 +0.09375 0.5938 0.8125 +0.09375 0.5938 0.8438 +0.09375 0.5938 0.875 +0.09375 0.5938 0.9062 +0.09375 0.5938 0.9375 +0.09375 0.5938 0.9688 +0.09375 0.5938 1 +0.09375 0.625 0 +0.09375 0.625 0.03125 +0.09375 0.625 0.0625 +0.09375 0.625 0.09375 +0.09375 0.625 0.125 +0.09375 0.625 0.1562 +0.09375 0.625 0.1875 +0.09375 0.625 0.2188 +0.09375 0.625 0.25 +0.09375 0.625 0.2812 +0.09375 0.625 0.3125 +0.09375 0.625 0.3438 +0.09375 0.625 0.375 +0.09375 0.625 0.4062 +0.09375 0.625 0.4375 +0.09375 0.625 0.4688 +0.09375 0.625 0.5 +0.09375 0.625 0.5312 +0.09375 0.625 0.5625 +0.09375 0.625 0.5938 +0.09375 0.625 0.625 +0.09375 0.625 0.6562 +0.09375 0.625 0.6875 +0.09375 0.625 0.7188 +0.09375 0.625 0.75 +0.09375 0.625 0.7812 +0.09375 0.625 0.8125 +0.09375 0.625 0.8438 +0.09375 0.625 0.875 +0.09375 0.625 0.9062 +0.09375 0.625 0.9375 +0.09375 0.625 0.9688 +0.09375 0.625 1 +0.09375 0.6562 0 +0.09375 0.6562 0.03125 +0.09375 0.6562 0.0625 +0.09375 0.6562 0.09375 +0.09375 0.6562 0.125 +0.09375 0.6562 0.1562 +0.09375 0.6562 0.1875 +0.09375 0.6562 0.2188 +0.09375 0.6562 0.25 +0.09375 0.6562 0.2812 +0.09375 0.6562 0.3125 +0.09375 0.6562 0.3438 +0.09375 0.6562 0.375 +0.09375 0.6562 0.4062 +0.09375 0.6562 0.4375 +0.09375 0.6562 0.4688 +0.09375 0.6562 0.5 +0.09375 0.6562 0.5312 +0.09375 0.6562 0.5625 +0.09375 0.6562 0.5938 +0.09375 0.6562 0.625 +0.09375 0.6562 0.6562 +0.09375 0.6562 0.6875 +0.09375 0.6562 0.7188 +0.09375 0.6562 0.75 +0.09375 0.6562 0.7812 +0.09375 0.6562 0.8125 +0.09375 0.6562 0.8438 +0.09375 0.6562 0.875 +0.09375 0.6562 0.9062 +0.09375 0.6562 0.9375 +0.09375 0.6562 0.9688 +0.09375 0.6562 1 +0.09375 0.6875 0 +0.09375 0.6875 0.03125 +0.09375 0.6875 0.0625 +0.09375 0.6875 0.09375 +0.09375 0.6875 0.125 +0.09375 0.6875 0.1562 +0.09375 0.6875 0.1875 +0.09375 0.6875 0.2188 +0.09375 0.6875 0.25 +0.09375 0.6875 0.2812 +0.09375 0.6875 0.3125 +0.09375 0.6875 0.3438 +0.09375 0.6875 0.375 +0.09375 0.6875 0.4062 +0.09375 0.6875 0.4375 +0.09375 0.6875 0.4688 +0.09375 0.6875 0.5 +0.09375 0.6875 0.5312 +0.09375 0.6875 0.5625 +0.09375 0.6875 0.5938 +0.09375 0.6875 0.625 +0.09375 0.6875 0.6562 +0.09375 0.6875 0.6875 +0.09375 0.6875 0.7188 +0.09375 0.6875 0.75 +0.09375 0.6875 0.7812 +0.09375 0.6875 0.8125 +0.09375 0.6875 0.8438 +0.09375 0.6875 0.875 +0.09375 0.6875 0.9062 +0.09375 0.6875 0.9375 +0.09375 0.6875 0.9688 +0.09375 0.6875 1 +0.09375 0.7188 0 +0.09375 0.7188 0.03125 +0.09375 0.7188 0.0625 +0.09375 0.7188 0.09375 +0.09375 0.7188 0.125 +0.09375 0.7188 0.1562 +0.09375 0.7188 0.1875 +0.09375 0.7188 0.2188 +0.09375 0.7188 0.25 +0.09375 0.7188 0.2812 +0.09375 0.7188 0.3125 +0.09375 0.7188 0.3438 +0.09375 0.7188 0.375 +0.09375 0.7188 0.4062 +0.09375 0.7188 0.4375 +0.09375 0.7188 0.4688 +0.09375 0.7188 0.5 +0.09375 0.7188 0.5312 +0.09375 0.7188 0.5625 +0.09375 0.7188 0.5938 +0.09375 0.7188 0.625 +0.09375 0.7188 0.6562 +0.09375 0.7188 0.6875 +0.09375 0.7188 0.7188 +0.09375 0.7188 0.75 +0.09375 0.7188 0.7812 +0.09375 0.7188 0.8125 +0.09375 0.7188 0.8438 +0.09375 0.7188 0.875 +0.09375 0.7188 0.9062 +0.09375 0.7188 0.9375 +0.09375 0.7188 0.9688 +0.09375 0.7188 1 +0.09375 0.75 0 +0.09375 0.75 0.03125 +0.09375 0.75 0.0625 +0.09375 0.75 0.09375 +0.09375 0.75 0.125 +0.09375 0.75 0.1562 +0.09375 0.75 0.1875 +0.09375 0.75 0.2188 +0.09375 0.75 0.25 +0.09375 0.75 0.2812 +0.09375 0.75 0.3125 +0.09375 0.75 0.3438 +0.09375 0.75 0.375 +0.09375 0.75 0.4062 +0.09375 0.75 0.4375 +0.09375 0.75 0.4688 +0.09375 0.75 0.5 +0.09375 0.75 0.5312 +0.09375 0.75 0.5625 +0.09375 0.75 0.5938 +0.09375 0.75 0.625 +0.09375 0.75 0.6562 +0.09375 0.75 0.6875 +0.09375 0.75 0.7188 +0.09375 0.75 0.75 +0.09375 0.75 0.7812 +0.09375 0.75 0.8125 +0.09375 0.75 0.8438 +0.09375 0.75 0.875 +0.09375 0.75 0.9062 +0.09375 0.75 0.9375 +0.09375 0.75 0.9688 +0.09375 0.75 1 +0.09375 0.7812 0 +0.09375 0.7812 0.03125 +0.09375 0.7812 0.0625 +0.09375 0.7812 0.09375 +0.09375 0.7812 0.125 +0.09375 0.7812 0.1562 +0.09375 0.7812 0.1875 +0.09375 0.7812 0.2188 +0.09375 0.7812 0.25 +0.09375 0.7812 0.2812 +0.09375 0.7812 0.3125 +0.09375 0.7812 0.3438 +0.09375 0.7812 0.375 +0.09375 0.7812 0.4062 +0.09375 0.7812 0.4375 +0.09375 0.7812 0.4688 +0.09375 0.7812 0.5 +0.09375 0.7812 0.5312 +0.09375 0.7812 0.5625 +0.09375 0.7812 0.5938 +0.09375 0.7812 0.625 +0.09375 0.7812 0.6562 +0.09375 0.7812 0.6875 +0.09375 0.7812 0.7188 +0.09375 0.7812 0.75 +0.09375 0.7812 0.7812 +0.09375 0.7812 0.8125 +0.09375 0.7812 0.8438 +0.09375 0.7812 0.875 +0.09375 0.7812 0.9062 +0.09375 0.7812 0.9375 +0.09375 0.7812 0.9688 +0.09375 0.7812 1 +0.09375 0.8125 0 +0.09375 0.8125 0.03125 +0.09375 0.8125 0.0625 +0.09375 0.8125 0.09375 +0.09375 0.8125 0.125 +0.09375 0.8125 0.1562 +0.09375 0.8125 0.1875 +0.09375 0.8125 0.2188 +0.09375 0.8125 0.25 +0.09375 0.8125 0.2812 +0.09375 0.8125 0.3125 +0.09375 0.8125 0.3438 +0.09375 0.8125 0.375 +0.09375 0.8125 0.4062 +0.09375 0.8125 0.4375 +0.09375 0.8125 0.4688 +0.09375 0.8125 0.5 +0.09375 0.8125 0.5312 +0.09375 0.8125 0.5625 +0.09375 0.8125 0.5938 +0.09375 0.8125 0.625 +0.09375 0.8125 0.6562 +0.09375 0.8125 0.6875 +0.09375 0.8125 0.7188 +0.09375 0.8125 0.75 +0.09375 0.8125 0.7812 +0.09375 0.8125 0.8125 +0.09375 0.8125 0.8438 +0.09375 0.8125 0.875 +0.09375 0.8125 0.9062 +0.09375 0.8125 0.9375 +0.09375 0.8125 0.9688 +0.09375 0.8125 1 +0.09375 0.8438 0 +0.09375 0.8438 0.03125 +0.09375 0.8438 0.0625 +0.09375 0.8438 0.09375 +0.09375 0.8438 0.125 +0.09375 0.8438 0.1562 +0.09375 0.8438 0.1875 +0.09375 0.8438 0.2188 +0.09375 0.8438 0.25 +0.09375 0.8438 0.2812 +0.09375 0.8438 0.3125 +0.09375 0.8438 0.3438 +0.09375 0.8438 0.375 +0.09375 0.8438 0.4062 +0.09375 0.8438 0.4375 +0.09375 0.8438 0.4688 +0.09375 0.8438 0.5 +0.09375 0.8438 0.5312 +0.09375 0.8438 0.5625 +0.09375 0.8438 0.5938 +0.09375 0.8438 0.625 +0.09375 0.8438 0.6562 +0.09375 0.8438 0.6875 +0.09375 0.8438 0.7188 +0.09375 0.8438 0.75 +0.09375 0.8438 0.7812 +0.09375 0.8438 0.8125 +0.09375 0.8438 0.8438 +0.09375 0.8438 0.875 +0.09375 0.8438 0.9062 +0.09375 0.8438 0.9375 +0.09375 0.8438 0.9688 +0.09375 0.8438 1 +0.09375 0.875 0 +0.09375 0.875 0.03125 +0.09375 0.875 0.0625 +0.09375 0.875 0.09375 +0.09375 0.875 0.125 +0.09375 0.875 0.1562 +0.09375 0.875 0.1875 +0.09375 0.875 0.2188 +0.09375 0.875 0.25 +0.09375 0.875 0.2812 +0.09375 0.875 0.3125 +0.09375 0.875 0.3438 +0.09375 0.875 0.375 +0.09375 0.875 0.4062 +0.09375 0.875 0.4375 +0.09375 0.875 0.4688 +0.09375 0.875 0.5 +0.09375 0.875 0.5312 +0.09375 0.875 0.5625 +0.09375 0.875 0.5938 +0.09375 0.875 0.625 +0.09375 0.875 0.6562 +0.09375 0.875 0.6875 +0.09375 0.875 0.7188 +0.09375 0.875 0.75 +0.09375 0.875 0.7812 +0.09375 0.875 0.8125 +0.09375 0.875 0.8438 +0.09375 0.875 0.875 +0.09375 0.875 0.9062 +0.09375 0.875 0.9375 +0.09375 0.875 0.9688 +0.09375 0.875 1 +0.09375 0.9062 0 +0.09375 0.9062 0.03125 +0.09375 0.9062 0.0625 +0.09375 0.9062 0.09375 +0.09375 0.9062 0.125 +0.09375 0.9062 0.1562 +0.09375 0.9062 0.1875 +0.09375 0.9062 0.2188 +0.09375 0.9062 0.25 +0.09375 0.9062 0.2812 +0.09375 0.9062 0.3125 +0.09375 0.9062 0.3438 +0.09375 0.9062 0.375 +0.09375 0.9062 0.4062 +0.09375 0.9062 0.4375 +0.09375 0.9062 0.4688 +0.09375 0.9062 0.5 +0.09375 0.9062 0.5312 +0.09375 0.9062 0.5625 +0.09375 0.9062 0.5938 +0.09375 0.9062 0.625 +0.09375 0.9062 0.6562 +0.09375 0.9062 0.6875 +0.09375 0.9062 0.7188 +0.09375 0.9062 0.75 +0.09375 0.9062 0.7812 +0.09375 0.9062 0.8125 +0.09375 0.9062 0.8438 +0.09375 0.9062 0.875 +0.09375 0.9062 0.9062 +0.09375 0.9062 0.9375 +0.09375 0.9062 0.9688 +0.09375 0.9062 1 +0.09375 0.9375 0 +0.09375 0.9375 0.03125 +0.09375 0.9375 0.0625 +0.09375 0.9375 0.09375 +0.09375 0.9375 0.125 +0.09375 0.9375 0.1562 +0.09375 0.9375 0.1875 +0.09375 0.9375 0.2188 +0.09375 0.9375 0.25 +0.09375 0.9375 0.2812 +0.09375 0.9375 0.3125 +0.09375 0.9375 0.3438 +0.09375 0.9375 0.375 +0.09375 0.9375 0.4062 +0.09375 0.9375 0.4375 +0.09375 0.9375 0.4688 +0.09375 0.9375 0.5 +0.09375 0.9375 0.5312 +0.09375 0.9375 0.5625 +0.09375 0.9375 0.5938 +0.09375 0.9375 0.625 +0.09375 0.9375 0.6562 +0.09375 0.9375 0.6875 +0.09375 0.9375 0.7188 +0.09375 0.9375 0.75 +0.09375 0.9375 0.7812 +0.09375 0.9375 0.8125 +0.09375 0.9375 0.8438 +0.09375 0.9375 0.875 +0.09375 0.9375 0.9062 +0.09375 0.9375 0.9375 +0.09375 0.9375 0.9688 +0.09375 0.9375 1 +0.09375 0.9688 0 +0.09375 0.9688 0.03125 +0.09375 0.9688 0.0625 +0.09375 0.9688 0.09375 +0.09375 0.9688 0.125 +0.09375 0.9688 0.1562 +0.09375 0.9688 0.1875 +0.09375 0.9688 0.2188 +0.09375 0.9688 0.25 +0.09375 0.9688 0.2812 +0.09375 0.9688 0.3125 +0.09375 0.9688 0.3438 +0.09375 0.9688 0.375 +0.09375 0.9688 0.4062 +0.09375 0.9688 0.4375 +0.09375 0.9688 0.4688 +0.09375 0.9688 0.5 +0.09375 0.9688 0.5312 +0.09375 0.9688 0.5625 +0.09375 0.9688 0.5938 +0.09375 0.9688 0.625 +0.09375 0.9688 0.6562 +0.09375 0.9688 0.6875 +0.09375 0.9688 0.7188 +0.09375 0.9688 0.75 +0.09375 0.9688 0.7812 +0.09375 0.9688 0.8125 +0.09375 0.9688 0.8438 +0.09375 0.9688 0.875 +0.09375 0.9688 0.9062 +0.09375 0.9688 0.9375 +0.09375 0.9688 0.9688 +0.09375 0.9688 1 +0.09375 1 0 +0.09375 1 0.03125 +0.09375 1 0.0625 +0.09375 1 0.09375 +0.09375 1 0.125 +0.09375 1 0.1562 +0.09375 1 0.1875 +0.09375 1 0.2188 +0.09375 1 0.25 +0.09375 1 0.2812 +0.09375 1 0.3125 +0.09375 1 0.3438 +0.09375 1 0.375 +0.09375 1 0.4062 +0.09375 1 0.4375 +0.09375 1 0.4688 +0.09375 1 0.5 +0.09375 1 0.5312 +0.09375 1 0.5625 +0.09375 1 0.5938 +0.09375 1 0.625 +0.09375 1 0.6562 +0.09375 1 0.6875 +0.09375 1 0.7188 +0.09375 1 0.75 +0.09375 1 0.7812 +0.09375 1 0.8125 +0.09375 1 0.8438 +0.09375 1 0.875 +0.09375 1 0.9062 +0.09375 1 0.9375 +0.09375 1 0.9688 +0.09375 1 1 +0.125 0 0 +0.125 0 0.03125 +0.125 0 0.0625 +0.125 0 0.09375 +0.125 0 0.125 +0.125 0 0.1562 +0.125 0 0.1875 +0.125 0 0.2188 +0.125 0 0.25 +0.125 0 0.2812 +0.125 0 0.3125 +0.125 0 0.3438 +0.125 0 0.375 +0.125 0 0.4062 +0.125 0 0.4375 +0.125 0 0.4688 +0.125 0 0.5 +0.125 0 0.5312 +0.125 0 0.5625 +0.125 0 0.5938 +0.125 0 0.625 +0.125 0 0.6562 +0.125 0 0.6875 +0.125 0 0.7188 +0.125 0 0.75 +0.125 0 0.7812 +0.125 0 0.8125 +0.125 0 0.8438 +0.125 0 0.875 +0.125 0 0.9062 +0.125 0 0.9375 +0.125 0 0.9688 +0.125 0 1 +0.125 0.03125 0 +0.125 0.03125 0.03125 +0.125 0.03125 0.0625 +0.125 0.03125 0.09375 +0.125 0.03125 0.125 +0.125 0.03125 0.1562 +0.125 0.03125 0.1875 +0.125 0.03125 0.2188 +0.125 0.03125 0.25 +0.125 0.03125 0.2812 +0.125 0.03125 0.3125 +0.125 0.03125 0.3438 +0.125 0.03125 0.375 +0.125 0.03125 0.4062 +0.125 0.03125 0.4375 +0.125 0.03125 0.4688 +0.125 0.03125 0.5 +0.125 0.03125 0.5312 +0.125 0.03125 0.5625 +0.125 0.03125 0.5938 +0.125 0.03125 0.625 +0.125 0.03125 0.6562 +0.125 0.03125 0.6875 +0.125 0.03125 0.7188 +0.125 0.03125 0.75 +0.125 0.03125 0.7812 +0.125 0.03125 0.8125 +0.125 0.03125 0.8438 +0.125 0.03125 0.875 +0.125 0.03125 0.9062 +0.125 0.03125 0.9375 +0.125 0.03125 0.9688 +0.125 0.03125 1 +0.125 0.0625 0 +0.125 0.0625 0.03125 +0.125 0.0625 0.0625 +0.125 0.0625 0.09375 +0.125 0.0625 0.125 +0.125 0.0625 0.1562 +0.125 0.0625 0.1875 +0.125 0.0625 0.2188 +0.125 0.0625 0.25 +0.125 0.0625 0.2812 +0.125 0.0625 0.3125 +0.125 0.0625 0.3438 +0.125 0.0625 0.375 +0.125 0.0625 0.4062 +0.125 0.0625 0.4375 +0.125 0.0625 0.4688 +0.125 0.0625 0.5 +0.125 0.0625 0.5312 +0.125 0.0625 0.5625 +0.125 0.0625 0.5938 +0.125 0.0625 0.625 +0.125 0.0625 0.6562 +0.125 0.0625 0.6875 +0.125 0.0625 0.7188 +0.125 0.0625 0.75 +0.125 0.0625 0.7812 +0.125 0.0625 0.8125 +0.125 0.0625 0.8438 +0.125 0.0625 0.875 +0.125 0.0625 0.9062 +0.125 0.0625 0.9375 +0.125 0.0625 0.9688 +0.125 0.0625 1 +0.125 0.09375 0 +0.125 0.09375 0.03125 +0.125 0.09375 0.0625 +0.125 0.09375 0.09375 +0.125 0.09375 0.125 +0.125 0.09375 0.1562 +0.125 0.09375 0.1875 +0.125 0.09375 0.2188 +0.125 0.09375 0.25 +0.125 0.09375 0.2812 +0.125 0.09375 0.3125 +0.125 0.09375 0.3438 +0.125 0.09375 0.375 +0.125 0.09375 0.4062 +0.125 0.09375 0.4375 +0.125 0.09375 0.4688 +0.125 0.09375 0.5 +0.125 0.09375 0.5312 +0.125 0.09375 0.5625 +0.125 0.09375 0.5938 +0.125 0.09375 0.625 +0.125 0.09375 0.6562 +0.125 0.09375 0.6875 +0.125 0.09375 0.7188 +0.125 0.09375 0.75 +0.125 0.09375 0.7812 +0.125 0.09375 0.8125 +0.125 0.09375 0.8438 +0.125 0.09375 0.875 +0.125 0.09375 0.9062 +0.125 0.09375 0.9375 +0.125 0.09375 0.9688 +0.125 0.09375 1 +0.125 0.125 0 +0.125 0.125 0.03125 +0.125 0.125 0.0625 +0.125 0.125 0.09375 +0.125 0.125 0.125 +0.125 0.125 0.1562 +0.125 0.125 0.1875 +0.125 0.125 0.2188 +0.125 0.125 0.25 +0.125 0.125 0.2812 +0.125 0.125 0.3125 +0.125 0.125 0.3438 +0.125 0.125 0.375 +0.125 0.125 0.4062 +0.125 0.125 0.4375 +0.125 0.125 0.4688 +0.125 0.125 0.5 +0.125 0.125 0.5312 +0.125 0.125 0.5625 +0.125 0.125 0.5938 +0.125 0.125 0.625 +0.125 0.125 0.6562 +0.125 0.125 0.6875 +0.125 0.125 0.7188 +0.125 0.125 0.75 +0.125 0.125 0.7812 +0.125 0.125 0.8125 +0.125 0.125 0.8438 +0.125 0.125 0.875 +0.125 0.125 0.9062 +0.125 0.125 0.9375 +0.125 0.125 0.9688 +0.125 0.125 1 +0.125 0.1562 0 +0.125 0.1562 0.03125 +0.125 0.1562 0.0625 +0.125 0.1562 0.09375 +0.125 0.1562 0.125 +0.125 0.1562 0.1562 +0.125 0.1562 0.1875 +0.125 0.1562 0.2188 +0.125 0.1562 0.25 +0.125 0.1562 0.2812 +0.125 0.1562 0.3125 +0.125 0.1562 0.3438 +0.125 0.1562 0.375 +0.125 0.1562 0.4062 +0.125 0.1562 0.4375 +0.125 0.1562 0.4688 +0.125 0.1562 0.5 +0.125 0.1562 0.5312 +0.125 0.1562 0.5625 +0.125 0.1562 0.5938 +0.125 0.1562 0.625 +0.125 0.1562 0.6562 +0.125 0.1562 0.6875 +0.125 0.1562 0.7188 +0.125 0.1562 0.75 +0.125 0.1562 0.7812 +0.125 0.1562 0.8125 +0.125 0.1562 0.8438 +0.125 0.1562 0.875 +0.125 0.1562 0.9062 +0.125 0.1562 0.9375 +0.125 0.1562 0.9688 +0.125 0.1562 1 +0.125 0.1875 0 +0.125 0.1875 0.03125 +0.125 0.1875 0.0625 +0.125 0.1875 0.09375 +0.125 0.1875 0.125 +0.125 0.1875 0.1562 +0.125 0.1875 0.1875 +0.125 0.1875 0.2188 +0.125 0.1875 0.25 +0.125 0.1875 0.2812 +0.125 0.1875 0.3125 +0.125 0.1875 0.3438 +0.125 0.1875 0.375 +0.125 0.1875 0.4062 +0.125 0.1875 0.4375 +0.125 0.1875 0.4688 +0.125 0.1875 0.5 +0.125 0.1875 0.5312 +0.125 0.1875 0.5625 +0.125 0.1875 0.5938 +0.125 0.1875 0.625 +0.125 0.1875 0.6562 +0.125 0.1875 0.6875 +0.125 0.1875 0.7188 +0.125 0.1875 0.75 +0.125 0.1875 0.7812 +0.125 0.1875 0.8125 +0.125 0.1875 0.8438 +0.125 0.1875 0.875 +0.125 0.1875 0.9062 +0.125 0.1875 0.9375 +0.125 0.1875 0.9688 +0.125 0.1875 1 +0.125 0.2188 0 +0.125 0.2188 0.03125 +0.125 0.2188 0.0625 +0.125 0.2188 0.09375 +0.125 0.2188 0.125 +0.125 0.2188 0.1562 +0.125 0.2188 0.1875 +0.125 0.2188 0.2188 +0.125 0.2188 0.25 +0.125 0.2188 0.2812 +0.125 0.2188 0.3125 +0.125 0.2188 0.3438 +0.125 0.2188 0.375 +0.125 0.2188 0.4062 +0.125 0.2188 0.4375 +0.125 0.2188 0.4688 +0.125 0.2188 0.5 +0.125 0.2188 0.5312 +0.125 0.2188 0.5625 +0.125 0.2188 0.5938 +0.125 0.2188 0.625 +0.125 0.2188 0.6562 +0.125 0.2188 0.6875 +0.125 0.2188 0.7188 +0.125 0.2188 0.75 +0.125 0.2188 0.7812 +0.125 0.2188 0.8125 +0.125 0.2188 0.8438 +0.125 0.2188 0.875 +0.125 0.2188 0.9062 +0.125 0.2188 0.9375 +0.125 0.2188 0.9688 +0.125 0.2188 1 +0.125 0.25 0 +0.125 0.25 0.03125 +0.125 0.25 0.0625 +0.125 0.25 0.09375 +0.125 0.25 0.125 +0.125 0.25 0.1562 +0.125 0.25 0.1875 +0.125 0.25 0.2188 +0.125 0.25 0.25 +0.125 0.25 0.2812 +0.125 0.25 0.3125 +0.125 0.25 0.3438 +0.125 0.25 0.375 +0.125 0.25 0.4062 +0.125 0.25 0.4375 +0.125 0.25 0.4688 +0.125 0.25 0.5 +0.125 0.25 0.5312 +0.125 0.25 0.5625 +0.125 0.25 0.5938 +0.125 0.25 0.625 +0.125 0.25 0.6562 +0.125 0.25 0.6875 +0.125 0.25 0.7188 +0.125 0.25 0.75 +0.125 0.25 0.7812 +0.125 0.25 0.8125 +0.125 0.25 0.8438 +0.125 0.25 0.875 +0.125 0.25 0.9062 +0.125 0.25 0.9375 +0.125 0.25 0.9688 +0.125 0.25 1 +0.125 0.2812 0 +0.125 0.2812 0.03125 +0.125 0.2812 0.0625 +0.125 0.2812 0.09375 +0.125 0.2812 0.125 +0.125 0.2812 0.1562 +0.125 0.2812 0.1875 +0.125 0.2812 0.2188 +0.125 0.2812 0.25 +0.125 0.2812 0.2812 +0.125 0.2812 0.3125 +0.125 0.2812 0.3438 +0.125 0.2812 0.375 +0.125 0.2812 0.4062 +0.125 0.2812 0.4375 +0.125 0.2812 0.4688 +0.125 0.2812 0.5 +0.125 0.2812 0.5312 +0.125 0.2812 0.5625 +0.125 0.2812 0.5938 +0.125 0.2812 0.625 +0.125 0.2812 0.6562 +0.125 0.2812 0.6875 +0.125 0.2812 0.7188 +0.125 0.2812 0.75 +0.125 0.2812 0.7812 +0.125 0.2812 0.8125 +0.125 0.2812 0.8438 +0.125 0.2812 0.875 +0.125 0.2812 0.9062 +0.125 0.2812 0.9375 +0.125 0.2812 0.9688 +0.125 0.2812 1 +0.125 0.3125 0 +0.125 0.3125 0.03125 +0.125 0.3125 0.0625 +0.125 0.3125 0.09375 +0.125 0.3125 0.125 +0.125 0.3125 0.1562 +0.125 0.3125 0.1875 +0.125 0.3125 0.2188 +0.125 0.3125 0.25 +0.125 0.3125 0.2812 +0.125 0.3125 0.3125 +0.125 0.3125 0.3438 +0.125 0.3125 0.375 +0.125 0.3125 0.4062 +0.125 0.3125 0.4375 +0.125 0.3125 0.4688 +0.125 0.3125 0.5 +0.125 0.3125 0.5312 +0.125 0.3125 0.5625 +0.125 0.3125 0.5938 +0.125 0.3125 0.625 +0.125 0.3125 0.6562 +0.125 0.3125 0.6875 +0.125 0.3125 0.7188 +0.125 0.3125 0.75 +0.125 0.3125 0.7812 +0.125 0.3125 0.8125 +0.125 0.3125 0.8438 +0.125 0.3125 0.875 +0.125 0.3125 0.9062 +0.125 0.3125 0.9375 +0.125 0.3125 0.9688 +0.125 0.3125 1 +0.125 0.3438 0 +0.125 0.3438 0.03125 +0.125 0.3438 0.0625 +0.125 0.3438 0.09375 +0.125 0.3438 0.125 +0.125 0.3438 0.1562 +0.125 0.3438 0.1875 +0.125 0.3438 0.2188 +0.125 0.3438 0.25 +0.125 0.3438 0.2812 +0.125 0.3438 0.3125 +0.125 0.3438 0.3438 +0.125 0.3438 0.375 +0.125 0.3438 0.4062 +0.125 0.3438 0.4375 +0.125 0.3438 0.4688 +0.125 0.3438 0.5 +0.125 0.3438 0.5312 +0.125 0.3438 0.5625 +0.125 0.3438 0.5938 +0.125 0.3438 0.625 +0.125 0.3438 0.6562 +0.125 0.3438 0.6875 +0.125 0.3438 0.7188 +0.125 0.3438 0.75 +0.125 0.3438 0.7812 +0.125 0.3438 0.8125 +0.125 0.3438 0.8438 +0.125 0.3438 0.875 +0.125 0.3438 0.9062 +0.125 0.3438 0.9375 +0.125 0.3438 0.9688 +0.125 0.3438 1 +0.125 0.375 0 +0.125 0.375 0.03125 +0.125 0.375 0.0625 +0.125 0.375 0.09375 +0.125 0.375 0.125 +0.125 0.375 0.1562 +0.125 0.375 0.1875 +0.125 0.375 0.2188 +0.125 0.375 0.25 +0.125 0.375 0.2812 +0.125 0.375 0.3125 +0.125 0.375 0.3438 +0.125 0.375 0.375 +0.125 0.375 0.4062 +0.125 0.375 0.4375 +0.125 0.375 0.4688 +0.125 0.375 0.5 +0.125 0.375 0.5312 +0.125 0.375 0.5625 +0.125 0.375 0.5938 +0.125 0.375 0.625 +0.125 0.375 0.6562 +0.125 0.375 0.6875 +0.125 0.375 0.7188 +0.125 0.375 0.75 +0.125 0.375 0.7812 +0.125 0.375 0.8125 +0.125 0.375 0.8438 +0.125 0.375 0.875 +0.125 0.375 0.9062 +0.125 0.375 0.9375 +0.125 0.375 0.9688 +0.125 0.375 1 +0.125 0.4062 0 +0.125 0.4062 0.03125 +0.125 0.4062 0.0625 +0.125 0.4062 0.09375 +0.125 0.4062 0.125 +0.125 0.4062 0.1562 +0.125 0.4062 0.1875 +0.125 0.4062 0.2188 +0.125 0.4062 0.25 +0.125 0.4062 0.2812 +0.125 0.4062 0.3125 +0.125 0.4062 0.3438 +0.125 0.4062 0.375 +0.125 0.4062 0.4062 +0.125 0.4062 0.4375 +0.125 0.4062 0.4688 +0.125 0.4062 0.5 +0.125 0.4062 0.5312 +0.125 0.4062 0.5625 +0.125 0.4062 0.5938 +0.125 0.4062 0.625 +0.125 0.4062 0.6562 +0.125 0.4062 0.6875 +0.125 0.4062 0.7188 +0.125 0.4062 0.75 +0.125 0.4062 0.7812 +0.125 0.4062 0.8125 +0.125 0.4062 0.8438 +0.125 0.4062 0.875 +0.125 0.4062 0.9062 +0.125 0.4062 0.9375 +0.125 0.4062 0.9688 +0.125 0.4062 1 +0.125 0.4375 0 +0.125 0.4375 0.03125 +0.125 0.4375 0.0625 +0.125 0.4375 0.09375 +0.125 0.4375 0.125 +0.125 0.4375 0.1562 +0.125 0.4375 0.1875 +0.125 0.4375 0.2188 +0.125 0.4375 0.25 +0.125 0.4375 0.2812 +0.125 0.4375 0.3125 +0.125 0.4375 0.3438 +0.125 0.4375 0.375 +0.125 0.4375 0.4062 +0.125 0.4375 0.4375 +0.125 0.4375 0.4688 +0.125 0.4375 0.5 +0.125 0.4375 0.5312 +0.125 0.4375 0.5625 +0.125 0.4375 0.5938 +0.125 0.4375 0.625 +0.125 0.4375 0.6562 +0.125 0.4375 0.6875 +0.125 0.4375 0.7188 +0.125 0.4375 0.75 +0.125 0.4375 0.7812 +0.125 0.4375 0.8125 +0.125 0.4375 0.8438 +0.125 0.4375 0.875 +0.125 0.4375 0.9062 +0.125 0.4375 0.9375 +0.125 0.4375 0.9688 +0.125 0.4375 1 +0.125 0.4688 0 +0.125 0.4688 0.03125 +0.125 0.4688 0.0625 +0.125 0.4688 0.09375 +0.125 0.4688 0.125 +0.125 0.4688 0.1562 +0.125 0.4688 0.1875 +0.125 0.4688 0.2188 +0.125 0.4688 0.25 +0.125 0.4688 0.2812 +0.125 0.4688 0.3125 +0.125 0.4688 0.3438 +0.125 0.4688 0.375 +0.125 0.4688 0.4062 +0.125 0.4688 0.4375 +0.125 0.4688 0.4688 +0.125 0.4688 0.5 +0.125 0.4688 0.5312 +0.125 0.4688 0.5625 +0.125 0.4688 0.5938 +0.125 0.4688 0.625 +0.125 0.4688 0.6562 +0.125 0.4688 0.6875 +0.125 0.4688 0.7188 +0.125 0.4688 0.75 +0.125 0.4688 0.7812 +0.125 0.4688 0.8125 +0.125 0.4688 0.8438 +0.125 0.4688 0.875 +0.125 0.4688 0.9062 +0.125 0.4688 0.9375 +0.125 0.4688 0.9688 +0.125 0.4688 1 +0.125 0.5 0 +0.125 0.5 0.03125 +0.125 0.5 0.0625 +0.125 0.5 0.09375 +0.125 0.5 0.125 +0.125 0.5 0.1562 +0.125 0.5 0.1875 +0.125 0.5 0.2188 +0.125 0.5 0.25 +0.125 0.5 0.2812 +0.125 0.5 0.3125 +0.125 0.5 0.3438 +0.125 0.5 0.375 +0.125 0.5 0.4062 +0.125 0.5 0.4375 +0.125 0.5 0.4688 +0.125 0.5 0.5 +0.125 0.5 0.5312 +0.125 0.5 0.5625 +0.125 0.5 0.5938 +0.125 0.5 0.625 +0.125 0.5 0.6562 +0.125 0.5 0.6875 +0.125 0.5 0.7188 +0.125 0.5 0.75 +0.125 0.5 0.7812 +0.125 0.5 0.8125 +0.125 0.5 0.8438 +0.125 0.5 0.875 +0.125 0.5 0.9062 +0.125 0.5 0.9375 +0.125 0.5 0.9688 +0.125 0.5 1 +0.125 0.5312 0 +0.125 0.5312 0.03125 +0.125 0.5312 0.0625 +0.125 0.5312 0.09375 +0.125 0.5312 0.125 +0.125 0.5312 0.1562 +0.125 0.5312 0.1875 +0.125 0.5312 0.2188 +0.125 0.5312 0.25 +0.125 0.5312 0.2812 +0.125 0.5312 0.3125 +0.125 0.5312 0.3438 +0.125 0.5312 0.375 +0.125 0.5312 0.4062 +0.125 0.5312 0.4375 +0.125 0.5312 0.4688 +0.125 0.5312 0.5 +0.125 0.5312 0.5312 +0.125 0.5312 0.5625 +0.125 0.5312 0.5938 +0.125 0.5312 0.625 +0.125 0.5312 0.6562 +0.125 0.5312 0.6875 +0.125 0.5312 0.7188 +0.125 0.5312 0.75 +0.125 0.5312 0.7812 +0.125 0.5312 0.8125 +0.125 0.5312 0.8438 +0.125 0.5312 0.875 +0.125 0.5312 0.9062 +0.125 0.5312 0.9375 +0.125 0.5312 0.9688 +0.125 0.5312 1 +0.125 0.5625 0 +0.125 0.5625 0.03125 +0.125 0.5625 0.0625 +0.125 0.5625 0.09375 +0.125 0.5625 0.125 +0.125 0.5625 0.1562 +0.125 0.5625 0.1875 +0.125 0.5625 0.2188 +0.125 0.5625 0.25 +0.125 0.5625 0.2812 +0.125 0.5625 0.3125 +0.125 0.5625 0.3438 +0.125 0.5625 0.375 +0.125 0.5625 0.4062 +0.125 0.5625 0.4375 +0.125 0.5625 0.4688 +0.125 0.5625 0.5 +0.125 0.5625 0.5312 +0.125 0.5625 0.5625 +0.125 0.5625 0.5938 +0.125 0.5625 0.625 +0.125 0.5625 0.6562 +0.125 0.5625 0.6875 +0.125 0.5625 0.7188 +0.125 0.5625 0.75 +0.125 0.5625 0.7812 +0.125 0.5625 0.8125 +0.125 0.5625 0.8438 +0.125 0.5625 0.875 +0.125 0.5625 0.9062 +0.125 0.5625 0.9375 +0.125 0.5625 0.9688 +0.125 0.5625 1 +0.125 0.5938 0 +0.125 0.5938 0.03125 +0.125 0.5938 0.0625 +0.125 0.5938 0.09375 +0.125 0.5938 0.125 +0.125 0.5938 0.1562 +0.125 0.5938 0.1875 +0.125 0.5938 0.2188 +0.125 0.5938 0.25 +0.125 0.5938 0.2812 +0.125 0.5938 0.3125 +0.125 0.5938 0.3438 +0.125 0.5938 0.375 +0.125 0.5938 0.4062 +0.125 0.5938 0.4375 +0.125 0.5938 0.4688 +0.125 0.5938 0.5 +0.125 0.5938 0.5312 +0.125 0.5938 0.5625 +0.125 0.5938 0.5938 +0.125 0.5938 0.625 +0.125 0.5938 0.6562 +0.125 0.5938 0.6875 +0.125 0.5938 0.7188 +0.125 0.5938 0.75 +0.125 0.5938 0.7812 +0.125 0.5938 0.8125 +0.125 0.5938 0.8438 +0.125 0.5938 0.875 +0.125 0.5938 0.9062 +0.125 0.5938 0.9375 +0.125 0.5938 0.9688 +0.125 0.5938 1 +0.125 0.625 0 +0.125 0.625 0.03125 +0.125 0.625 0.0625 +0.125 0.625 0.09375 +0.125 0.625 0.125 +0.125 0.625 0.1562 +0.125 0.625 0.1875 +0.125 0.625 0.2188 +0.125 0.625 0.25 +0.125 0.625 0.2812 +0.125 0.625 0.3125 +0.125 0.625 0.3438 +0.125 0.625 0.375 +0.125 0.625 0.4062 +0.125 0.625 0.4375 +0.125 0.625 0.4688 +0.125 0.625 0.5 +0.125 0.625 0.5312 +0.125 0.625 0.5625 +0.125 0.625 0.5938 +0.125 0.625 0.625 +0.125 0.625 0.6562 +0.125 0.625 0.6875 +0.125 0.625 0.7188 +0.125 0.625 0.75 +0.125 0.625 0.7812 +0.125 0.625 0.8125 +0.125 0.625 0.8438 +0.125 0.625 0.875 +0.125 0.625 0.9062 +0.125 0.625 0.9375 +0.125 0.625 0.9688 +0.125 0.625 1 +0.125 0.6562 0 +0.125 0.6562 0.03125 +0.125 0.6562 0.0625 +0.125 0.6562 0.09375 +0.125 0.6562 0.125 +0.125 0.6562 0.1562 +0.125 0.6562 0.1875 +0.125 0.6562 0.2188 +0.125 0.6562 0.25 +0.125 0.6562 0.2812 +0.125 0.6562 0.3125 +0.125 0.6562 0.3438 +0.125 0.6562 0.375 +0.125 0.6562 0.4062 +0.125 0.6562 0.4375 +0.125 0.6562 0.4688 +0.125 0.6562 0.5 +0.125 0.6562 0.5312 +0.125 0.6562 0.5625 +0.125 0.6562 0.5938 +0.125 0.6562 0.625 +0.125 0.6562 0.6562 +0.125 0.6562 0.6875 +0.125 0.6562 0.7188 +0.125 0.6562 0.75 +0.125 0.6562 0.7812 +0.125 0.6562 0.8125 +0.125 0.6562 0.8438 +0.125 0.6562 0.875 +0.125 0.6562 0.9062 +0.125 0.6562 0.9375 +0.125 0.6562 0.9688 +0.125 0.6562 1 +0.125 0.6875 0 +0.125 0.6875 0.03125 +0.125 0.6875 0.0625 +0.125 0.6875 0.09375 +0.125 0.6875 0.125 +0.125 0.6875 0.1562 +0.125 0.6875 0.1875 +0.125 0.6875 0.2188 +0.125 0.6875 0.25 +0.125 0.6875 0.2812 +0.125 0.6875 0.3125 +0.125 0.6875 0.3438 +0.125 0.6875 0.375 +0.125 0.6875 0.4062 +0.125 0.6875 0.4375 +0.125 0.6875 0.4688 +0.125 0.6875 0.5 +0.125 0.6875 0.5312 +0.125 0.6875 0.5625 +0.125 0.6875 0.5938 +0.125 0.6875 0.625 +0.125 0.6875 0.6562 +0.125 0.6875 0.6875 +0.125 0.6875 0.7188 +0.125 0.6875 0.75 +0.125 0.6875 0.7812 +0.125 0.6875 0.8125 +0.125 0.6875 0.8438 +0.125 0.6875 0.875 +0.125 0.6875 0.9062 +0.125 0.6875 0.9375 +0.125 0.6875 0.9688 +0.125 0.6875 1 +0.125 0.7188 0 +0.125 0.7188 0.03125 +0.125 0.7188 0.0625 +0.125 0.7188 0.09375 +0.125 0.7188 0.125 +0.125 0.7188 0.1562 +0.125 0.7188 0.1875 +0.125 0.7188 0.2188 +0.125 0.7188 0.25 +0.125 0.7188 0.2812 +0.125 0.7188 0.3125 +0.125 0.7188 0.3438 +0.125 0.7188 0.375 +0.125 0.7188 0.4062 +0.125 0.7188 0.4375 +0.125 0.7188 0.4688 +0.125 0.7188 0.5 +0.125 0.7188 0.5312 +0.125 0.7188 0.5625 +0.125 0.7188 0.5938 +0.125 0.7188 0.625 +0.125 0.7188 0.6562 +0.125 0.7188 0.6875 +0.125 0.7188 0.7188 +0.125 0.7188 0.75 +0.125 0.7188 0.7812 +0.125 0.7188 0.8125 +0.125 0.7188 0.8438 +0.125 0.7188 0.875 +0.125 0.7188 0.9062 +0.125 0.7188 0.9375 +0.125 0.7188 0.9688 +0.125 0.7188 1 +0.125 0.75 0 +0.125 0.75 0.03125 +0.125 0.75 0.0625 +0.125 0.75 0.09375 +0.125 0.75 0.125 +0.125 0.75 0.1562 +0.125 0.75 0.1875 +0.125 0.75 0.2188 +0.125 0.75 0.25 +0.125 0.75 0.2812 +0.125 0.75 0.3125 +0.125 0.75 0.3438 +0.125 0.75 0.375 +0.125 0.75 0.4062 +0.125 0.75 0.4375 +0.125 0.75 0.4688 +0.125 0.75 0.5 +0.125 0.75 0.5312 +0.125 0.75 0.5625 +0.125 0.75 0.5938 +0.125 0.75 0.625 +0.125 0.75 0.6562 +0.125 0.75 0.6875 +0.125 0.75 0.7188 +0.125 0.75 0.75 +0.125 0.75 0.7812 +0.125 0.75 0.8125 +0.125 0.75 0.8438 +0.125 0.75 0.875 +0.125 0.75 0.9062 +0.125 0.75 0.9375 +0.125 0.75 0.9688 +0.125 0.75 1 +0.125 0.7812 0 +0.125 0.7812 0.03125 +0.125 0.7812 0.0625 +0.125 0.7812 0.09375 +0.125 0.7812 0.125 +0.125 0.7812 0.1562 +0.125 0.7812 0.1875 +0.125 0.7812 0.2188 +0.125 0.7812 0.25 +0.125 0.7812 0.2812 +0.125 0.7812 0.3125 +0.125 0.7812 0.3438 +0.125 0.7812 0.375 +0.125 0.7812 0.4062 +0.125 0.7812 0.4375 +0.125 0.7812 0.4688 +0.125 0.7812 0.5 +0.125 0.7812 0.5312 +0.125 0.7812 0.5625 +0.125 0.7812 0.5938 +0.125 0.7812 0.625 +0.125 0.7812 0.6562 +0.125 0.7812 0.6875 +0.125 0.7812 0.7188 +0.125 0.7812 0.75 +0.125 0.7812 0.7812 +0.125 0.7812 0.8125 +0.125 0.7812 0.8438 +0.125 0.7812 0.875 +0.125 0.7812 0.9062 +0.125 0.7812 0.9375 +0.125 0.7812 0.9688 +0.125 0.7812 1 +0.125 0.8125 0 +0.125 0.8125 0.03125 +0.125 0.8125 0.0625 +0.125 0.8125 0.09375 +0.125 0.8125 0.125 +0.125 0.8125 0.1562 +0.125 0.8125 0.1875 +0.125 0.8125 0.2188 +0.125 0.8125 0.25 +0.125 0.8125 0.2812 +0.125 0.8125 0.3125 +0.125 0.8125 0.3438 +0.125 0.8125 0.375 +0.125 0.8125 0.4062 +0.125 0.8125 0.4375 +0.125 0.8125 0.4688 +0.125 0.8125 0.5 +0.125 0.8125 0.5312 +0.125 0.8125 0.5625 +0.125 0.8125 0.5938 +0.125 0.8125 0.625 +0.125 0.8125 0.6562 +0.125 0.8125 0.6875 +0.125 0.8125 0.7188 +0.125 0.8125 0.75 +0.125 0.8125 0.7812 +0.125 0.8125 0.8125 +0.125 0.8125 0.8438 +0.125 0.8125 0.875 +0.125 0.8125 0.9062 +0.125 0.8125 0.9375 +0.125 0.8125 0.9688 +0.125 0.8125 1 +0.125 0.8438 0 +0.125 0.8438 0.03125 +0.125 0.8438 0.0625 +0.125 0.8438 0.09375 +0.125 0.8438 0.125 +0.125 0.8438 0.1562 +0.125 0.8438 0.1875 +0.125 0.8438 0.2188 +0.125 0.8438 0.25 +0.125 0.8438 0.2812 +0.125 0.8438 0.3125 +0.125 0.8438 0.3438 +0.125 0.8438 0.375 +0.125 0.8438 0.4062 +0.125 0.8438 0.4375 +0.125 0.8438 0.4688 +0.125 0.8438 0.5 +0.125 0.8438 0.5312 +0.125 0.8438 0.5625 +0.125 0.8438 0.5938 +0.125 0.8438 0.625 +0.125 0.8438 0.6562 +0.125 0.8438 0.6875 +0.125 0.8438 0.7188 +0.125 0.8438 0.75 +0.125 0.8438 0.7812 +0.125 0.8438 0.8125 +0.125 0.8438 0.8438 +0.125 0.8438 0.875 +0.125 0.8438 0.9062 +0.125 0.8438 0.9375 +0.125 0.8438 0.9688 +0.125 0.8438 1 +0.125 0.875 0 +0.125 0.875 0.03125 +0.125 0.875 0.0625 +0.125 0.875 0.09375 +0.125 0.875 0.125 +0.125 0.875 0.1562 +0.125 0.875 0.1875 +0.125 0.875 0.2188 +0.125 0.875 0.25 +0.125 0.875 0.2812 +0.125 0.875 0.3125 +0.125 0.875 0.3438 +0.125 0.875 0.375 +0.125 0.875 0.4062 +0.125 0.875 0.4375 +0.125 0.875 0.4688 +0.125 0.875 0.5 +0.125 0.875 0.5312 +0.125 0.875 0.5625 +0.125 0.875 0.5938 +0.125 0.875 0.625 +0.125 0.875 0.6562 +0.125 0.875 0.6875 +0.125 0.875 0.7188 +0.125 0.875 0.75 +0.125 0.875 0.7812 +0.125 0.875 0.8125 +0.125 0.875 0.8438 +0.125 0.875 0.875 +0.125 0.875 0.9062 +0.125 0.875 0.9375 +0.125 0.875 0.9688 +0.125 0.875 1 +0.125 0.9062 0 +0.125 0.9062 0.03125 +0.125 0.9062 0.0625 +0.125 0.9062 0.09375 +0.125 0.9062 0.125 +0.125 0.9062 0.1562 +0.125 0.9062 0.1875 +0.125 0.9062 0.2188 +0.125 0.9062 0.25 +0.125 0.9062 0.2812 +0.125 0.9062 0.3125 +0.125 0.9062 0.3438 +0.125 0.9062 0.375 +0.125 0.9062 0.4062 +0.125 0.9062 0.4375 +0.125 0.9062 0.4688 +0.125 0.9062 0.5 +0.125 0.9062 0.5312 +0.125 0.9062 0.5625 +0.125 0.9062 0.5938 +0.125 0.9062 0.625 +0.125 0.9062 0.6562 +0.125 0.9062 0.6875 +0.125 0.9062 0.7188 +0.125 0.9062 0.75 +0.125 0.9062 0.7812 +0.125 0.9062 0.8125 +0.125 0.9062 0.8438 +0.125 0.9062 0.875 +0.125 0.9062 0.9062 +0.125 0.9062 0.9375 +0.125 0.9062 0.9688 +0.125 0.9062 1 +0.125 0.9375 0 +0.125 0.9375 0.03125 +0.125 0.9375 0.0625 +0.125 0.9375 0.09375 +0.125 0.9375 0.125 +0.125 0.9375 0.1562 +0.125 0.9375 0.1875 +0.125 0.9375 0.2188 +0.125 0.9375 0.25 +0.125 0.9375 0.2812 +0.125 0.9375 0.3125 +0.125 0.9375 0.3438 +0.125 0.9375 0.375 +0.125 0.9375 0.4062 +0.125 0.9375 0.4375 +0.125 0.9375 0.4688 +0.125 0.9375 0.5 +0.125 0.9375 0.5312 +0.125 0.9375 0.5625 +0.125 0.9375 0.5938 +0.125 0.9375 0.625 +0.125 0.9375 0.6562 +0.125 0.9375 0.6875 +0.125 0.9375 0.7188 +0.125 0.9375 0.75 +0.125 0.9375 0.7812 +0.125 0.9375 0.8125 +0.125 0.9375 0.8438 +0.125 0.9375 0.875 +0.125 0.9375 0.9062 +0.125 0.9375 0.9375 +0.125 0.9375 0.9688 +0.125 0.9375 1 +0.125 0.9688 0 +0.125 0.9688 0.03125 +0.125 0.9688 0.0625 +0.125 0.9688 0.09375 +0.125 0.9688 0.125 +0.125 0.9688 0.1562 +0.125 0.9688 0.1875 +0.125 0.9688 0.2188 +0.125 0.9688 0.25 +0.125 0.9688 0.2812 +0.125 0.9688 0.3125 +0.125 0.9688 0.3438 +0.125 0.9688 0.375 +0.125 0.9688 0.4062 +0.125 0.9688 0.4375 +0.125 0.9688 0.4688 +0.125 0.9688 0.5 +0.125 0.9688 0.5312 +0.125 0.9688 0.5625 +0.125 0.9688 0.5938 +0.125 0.9688 0.625 +0.125 0.9688 0.6562 +0.125 0.9688 0.6875 +0.125 0.9688 0.7188 +0.125 0.9688 0.75 +0.125 0.9688 0.7812 +0.125 0.9688 0.8125 +0.125 0.9688 0.8438 +0.125 0.9688 0.875 +0.125 0.9688 0.9062 +0.125 0.9688 0.9375 +0.125 0.9688 0.9688 +0.125 0.9688 1 +0.125 1 0 +0.125 1 0.03125 +0.125 1 0.0625 +0.125 1 0.09375 +0.125 1 0.125 +0.125 1 0.1562 +0.125 1 0.1875 +0.125 1 0.2188 +0.125 1 0.25 +0.125 1 0.2812 +0.125 1 0.3125 +0.125 1 0.3438 +0.125 1 0.375 +0.125 1 0.4062 +0.125 1 0.4375 +0.125 1 0.4688 +0.125 1 0.5 +0.125 1 0.5312 +0.125 1 0.5625 +0.125 1 0.5938 +0.125 1 0.625 +0.125 1 0.6562 +0.125 1 0.6875 +0.125 1 0.7188 +0.125 1 0.75 +0.125 1 0.7812 +0.125 1 0.8125 +0.125 1 0.8438 +0.125 1 0.875 +0.125 1 0.9062 +0.125 1 0.9375 +0.125 1 0.9688 +0.125 1 1 +0.1562 0 0 +0.1562 0 0.03125 +0.1562 0 0.0625 +0.1562 0 0.09375 +0.1562 0 0.125 +0.1562 0 0.1562 +0.1562 0 0.1875 +0.1562 0 0.2188 +0.1562 0 0.25 +0.1562 0 0.2812 +0.1562 0 0.3125 +0.1562 0 0.3438 +0.1562 0 0.375 +0.1562 0 0.4062 +0.1562 0 0.4375 +0.1562 0 0.4688 +0.1562 0 0.5 +0.1562 0 0.5312 +0.1562 0 0.5625 +0.1562 0 0.5938 +0.1562 0 0.625 +0.1562 0 0.6562 +0.1562 0 0.6875 +0.1562 0 0.7188 +0.1562 0 0.75 +0.1562 0 0.7812 +0.1562 0 0.8125 +0.1562 0 0.8438 +0.1562 0 0.875 +0.1562 0 0.9062 +0.1562 0 0.9375 +0.1562 0 0.9688 +0.1562 0 1 +0.1562 0.03125 0 +0.1562 0.03125 0.03125 +0.1562 0.03125 0.0625 +0.1562 0.03125 0.09375 +0.1562 0.03125 0.125 +0.1562 0.03125 0.1562 +0.1562 0.03125 0.1875 +0.1562 0.03125 0.2188 +0.1562 0.03125 0.25 +0.1562 0.03125 0.2812 +0.1562 0.03125 0.3125 +0.1562 0.03125 0.3438 +0.1562 0.03125 0.375 +0.1562 0.03125 0.4062 +0.1562 0.03125 0.4375 +0.1562 0.03125 0.4688 +0.1562 0.03125 0.5 +0.1562 0.03125 0.5312 +0.1562 0.03125 0.5625 +0.1562 0.03125 0.5938 +0.1562 0.03125 0.625 +0.1562 0.03125 0.6562 +0.1562 0.03125 0.6875 +0.1562 0.03125 0.7188 +0.1562 0.03125 0.75 +0.1562 0.03125 0.7812 +0.1562 0.03125 0.8125 +0.1562 0.03125 0.8438 +0.1562 0.03125 0.875 +0.1562 0.03125 0.9062 +0.1562 0.03125 0.9375 +0.1562 0.03125 0.9688 +0.1562 0.03125 1 +0.1562 0.0625 0 +0.1562 0.0625 0.03125 +0.1562 0.0625 0.0625 +0.1562 0.0625 0.09375 +0.1562 0.0625 0.125 +0.1562 0.0625 0.1562 +0.1562 0.0625 0.1875 +0.1562 0.0625 0.2188 +0.1562 0.0625 0.25 +0.1562 0.0625 0.2812 +0.1562 0.0625 0.3125 +0.1562 0.0625 0.3438 +0.1562 0.0625 0.375 +0.1562 0.0625 0.4062 +0.1562 0.0625 0.4375 +0.1562 0.0625 0.4688 +0.1562 0.0625 0.5 +0.1562 0.0625 0.5312 +0.1562 0.0625 0.5625 +0.1562 0.0625 0.5938 +0.1562 0.0625 0.625 +0.1562 0.0625 0.6562 +0.1562 0.0625 0.6875 +0.1562 0.0625 0.7188 +0.1562 0.0625 0.75 +0.1562 0.0625 0.7812 +0.1562 0.0625 0.8125 +0.1562 0.0625 0.8438 +0.1562 0.0625 0.875 +0.1562 0.0625 0.9062 +0.1562 0.0625 0.9375 +0.1562 0.0625 0.9688 +0.1562 0.0625 1 +0.1562 0.09375 0 +0.1562 0.09375 0.03125 +0.1562 0.09375 0.0625 +0.1562 0.09375 0.09375 +0.1562 0.09375 0.125 +0.1562 0.09375 0.1562 +0.1562 0.09375 0.1875 +0.1562 0.09375 0.2188 +0.1562 0.09375 0.25 +0.1562 0.09375 0.2812 +0.1562 0.09375 0.3125 +0.1562 0.09375 0.3438 +0.1562 0.09375 0.375 +0.1562 0.09375 0.4062 +0.1562 0.09375 0.4375 +0.1562 0.09375 0.4688 +0.1562 0.09375 0.5 +0.1562 0.09375 0.5312 +0.1562 0.09375 0.5625 +0.1562 0.09375 0.5938 +0.1562 0.09375 0.625 +0.1562 0.09375 0.6562 +0.1562 0.09375 0.6875 +0.1562 0.09375 0.7188 +0.1562 0.09375 0.75 +0.1562 0.09375 0.7812 +0.1562 0.09375 0.8125 +0.1562 0.09375 0.8438 +0.1562 0.09375 0.875 +0.1562 0.09375 0.9062 +0.1562 0.09375 0.9375 +0.1562 0.09375 0.9688 +0.1562 0.09375 1 +0.1562 0.125 0 +0.1562 0.125 0.03125 +0.1562 0.125 0.0625 +0.1562 0.125 0.09375 +0.1562 0.125 0.125 +0.1562 0.125 0.1562 +0.1562 0.125 0.1875 +0.1562 0.125 0.2188 +0.1562 0.125 0.25 +0.1562 0.125 0.2812 +0.1562 0.125 0.3125 +0.1562 0.125 0.3438 +0.1562 0.125 0.375 +0.1562 0.125 0.4062 +0.1562 0.125 0.4375 +0.1562 0.125 0.4688 +0.1562 0.125 0.5 +0.1562 0.125 0.5312 +0.1562 0.125 0.5625 +0.1562 0.125 0.5938 +0.1562 0.125 0.625 +0.1562 0.125 0.6562 +0.1562 0.125 0.6875 +0.1562 0.125 0.7188 +0.1562 0.125 0.75 +0.1562 0.125 0.7812 +0.1562 0.125 0.8125 +0.1562 0.125 0.8438 +0.1562 0.125 0.875 +0.1562 0.125 0.9062 +0.1562 0.125 0.9375 +0.1562 0.125 0.9688 +0.1562 0.125 1 +0.1562 0.1562 0 +0.1562 0.1562 0.03125 +0.1562 0.1562 0.0625 +0.1562 0.1562 0.09375 +0.1562 0.1562 0.125 +0.1562 0.1562 0.1562 +0.1562 0.1562 0.1875 +0.1562 0.1562 0.2188 +0.1562 0.1562 0.25 +0.1562 0.1562 0.2812 +0.1562 0.1562 0.3125 +0.1562 0.1562 0.3438 +0.1562 0.1562 0.375 +0.1562 0.1562 0.4062 +0.1562 0.1562 0.4375 +0.1562 0.1562 0.4688 +0.1562 0.1562 0.5 +0.1562 0.1562 0.5312 +0.1562 0.1562 0.5625 +0.1562 0.1562 0.5938 +0.1562 0.1562 0.625 +0.1562 0.1562 0.6562 +0.1562 0.1562 0.6875 +0.1562 0.1562 0.7188 +0.1562 0.1562 0.75 +0.1562 0.1562 0.7812 +0.1562 0.1562 0.8125 +0.1562 0.1562 0.8438 +0.1562 0.1562 0.875 +0.1562 0.1562 0.9062 +0.1562 0.1562 0.9375 +0.1562 0.1562 0.9688 +0.1562 0.1562 1 +0.1562 0.1875 0 +0.1562 0.1875 0.03125 +0.1562 0.1875 0.0625 +0.1562 0.1875 0.09375 +0.1562 0.1875 0.125 +0.1562 0.1875 0.1562 +0.1562 0.1875 0.1875 +0.1562 0.1875 0.2188 +0.1562 0.1875 0.25 +0.1562 0.1875 0.2812 +0.1562 0.1875 0.3125 +0.1562 0.1875 0.3438 +0.1562 0.1875 0.375 +0.1562 0.1875 0.4062 +0.1562 0.1875 0.4375 +0.1562 0.1875 0.4688 +0.1562 0.1875 0.5 +0.1562 0.1875 0.5312 +0.1562 0.1875 0.5625 +0.1562 0.1875 0.5938 +0.1562 0.1875 0.625 +0.1562 0.1875 0.6562 +0.1562 0.1875 0.6875 +0.1562 0.1875 0.7188 +0.1562 0.1875 0.75 +0.1562 0.1875 0.7812 +0.1562 0.1875 0.8125 +0.1562 0.1875 0.8438 +0.1562 0.1875 0.875 +0.1562 0.1875 0.9062 +0.1562 0.1875 0.9375 +0.1562 0.1875 0.9688 +0.1562 0.1875 1 +0.1562 0.2188 0 +0.1562 0.2188 0.03125 +0.1562 0.2188 0.0625 +0.1562 0.2188 0.09375 +0.1562 0.2188 0.125 +0.1562 0.2188 0.1562 +0.1562 0.2188 0.1875 +0.1562 0.2188 0.2188 +0.1562 0.2188 0.25 +0.1562 0.2188 0.2812 +0.1562 0.2188 0.3125 +0.1562 0.2188 0.3438 +0.1562 0.2188 0.375 +0.1562 0.2188 0.4062 +0.1562 0.2188 0.4375 +0.1562 0.2188 0.4688 +0.1562 0.2188 0.5 +0.1562 0.2188 0.5312 +0.1562 0.2188 0.5625 +0.1562 0.2188 0.5938 +0.1562 0.2188 0.625 +0.1562 0.2188 0.6562 +0.1562 0.2188 0.6875 +0.1562 0.2188 0.7188 +0.1562 0.2188 0.75 +0.1562 0.2188 0.7812 +0.1562 0.2188 0.8125 +0.1562 0.2188 0.8438 +0.1562 0.2188 0.875 +0.1562 0.2188 0.9062 +0.1562 0.2188 0.9375 +0.1562 0.2188 0.9688 +0.1562 0.2188 1 +0.1562 0.25 0 +0.1562 0.25 0.03125 +0.1562 0.25 0.0625 +0.1562 0.25 0.09375 +0.1562 0.25 0.125 +0.1562 0.25 0.1562 +0.1562 0.25 0.1875 +0.1562 0.25 0.2188 +0.1562 0.25 0.25 +0.1562 0.25 0.2812 +0.1562 0.25 0.3125 +0.1562 0.25 0.3438 +0.1562 0.25 0.375 +0.1562 0.25 0.4062 +0.1562 0.25 0.4375 +0.1562 0.25 0.4688 +0.1562 0.25 0.5 +0.1562 0.25 0.5312 +0.1562 0.25 0.5625 +0.1562 0.25 0.5938 +0.1562 0.25 0.625 +0.1562 0.25 0.6562 +0.1562 0.25 0.6875 +0.1562 0.25 0.7188 +0.1562 0.25 0.75 +0.1562 0.25 0.7812 +0.1562 0.25 0.8125 +0.1562 0.25 0.8438 +0.1562 0.25 0.875 +0.1562 0.25 0.9062 +0.1562 0.25 0.9375 +0.1562 0.25 0.9688 +0.1562 0.25 1 +0.1562 0.2812 0 +0.1562 0.2812 0.03125 +0.1562 0.2812 0.0625 +0.1562 0.2812 0.09375 +0.1562 0.2812 0.125 +0.1562 0.2812 0.1562 +0.1562 0.2812 0.1875 +0.1562 0.2812 0.2188 +0.1562 0.2812 0.25 +0.1562 0.2812 0.2812 +0.1562 0.2812 0.3125 +0.1562 0.2812 0.3438 +0.1562 0.2812 0.375 +0.1562 0.2812 0.4062 +0.1562 0.2812 0.4375 +0.1562 0.2812 0.4688 +0.1562 0.2812 0.5 +0.1562 0.2812 0.5312 +0.1562 0.2812 0.5625 +0.1562 0.2812 0.5938 +0.1562 0.2812 0.625 +0.1562 0.2812 0.6562 +0.1562 0.2812 0.6875 +0.1562 0.2812 0.7188 +0.1562 0.2812 0.75 +0.1562 0.2812 0.7812 +0.1562 0.2812 0.8125 +0.1562 0.2812 0.8438 +0.1562 0.2812 0.875 +0.1562 0.2812 0.9062 +0.1562 0.2812 0.9375 +0.1562 0.2812 0.9688 +0.1562 0.2812 1 +0.1562 0.3125 0 +0.1562 0.3125 0.03125 +0.1562 0.3125 0.0625 +0.1562 0.3125 0.09375 +0.1562 0.3125 0.125 +0.1562 0.3125 0.1562 +0.1562 0.3125 0.1875 +0.1562 0.3125 0.2188 +0.1562 0.3125 0.25 +0.1562 0.3125 0.2812 +0.1562 0.3125 0.3125 +0.1562 0.3125 0.3438 +0.1562 0.3125 0.375 +0.1562 0.3125 0.4062 +0.1562 0.3125 0.4375 +0.1562 0.3125 0.4688 +0.1562 0.3125 0.5 +0.1562 0.3125 0.5312 +0.1562 0.3125 0.5625 +0.1562 0.3125 0.5938 +0.1562 0.3125 0.625 +0.1562 0.3125 0.6562 +0.1562 0.3125 0.6875 +0.1562 0.3125 0.7188 +0.1562 0.3125 0.75 +0.1562 0.3125 0.7812 +0.1562 0.3125 0.8125 +0.1562 0.3125 0.8438 +0.1562 0.3125 0.875 +0.1562 0.3125 0.9062 +0.1562 0.3125 0.9375 +0.1562 0.3125 0.9688 +0.1562 0.3125 1 +0.1562 0.3438 0 +0.1562 0.3438 0.03125 +0.1562 0.3438 0.0625 +0.1562 0.3438 0.09375 +0.1562 0.3438 0.125 +0.1562 0.3438 0.1562 +0.1562 0.3438 0.1875 +0.1562 0.3438 0.2188 +0.1562 0.3438 0.25 +0.1562 0.3438 0.2812 +0.1562 0.3438 0.3125 +0.1562 0.3438 0.3438 +0.1562 0.3438 0.375 +0.1562 0.3438 0.4062 +0.1562 0.3438 0.4375 +0.1562 0.3438 0.4688 +0.1562 0.3438 0.5 +0.1562 0.3438 0.5312 +0.1562 0.3438 0.5625 +0.1562 0.3438 0.5938 +0.1562 0.3438 0.625 +0.1562 0.3438 0.6562 +0.1562 0.3438 0.6875 +0.1562 0.3438 0.7188 +0.1562 0.3438 0.75 +0.1562 0.3438 0.7812 +0.1562 0.3438 0.8125 +0.1562 0.3438 0.8438 +0.1562 0.3438 0.875 +0.1562 0.3438 0.9062 +0.1562 0.3438 0.9375 +0.1562 0.3438 0.9688 +0.1562 0.3438 1 +0.1562 0.375 0 +0.1562 0.375 0.03125 +0.1562 0.375 0.0625 +0.1562 0.375 0.09375 +0.1562 0.375 0.125 +0.1562 0.375 0.1562 +0.1562 0.375 0.1875 +0.1562 0.375 0.2188 +0.1562 0.375 0.25 +0.1562 0.375 0.2812 +0.1562 0.375 0.3125 +0.1562 0.375 0.3438 +0.1562 0.375 0.375 +0.1562 0.375 0.4062 +0.1562 0.375 0.4375 +0.1562 0.375 0.4688 +0.1562 0.375 0.5 +0.1562 0.375 0.5312 +0.1562 0.375 0.5625 +0.1562 0.375 0.5938 +0.1562 0.375 0.625 +0.1562 0.375 0.6562 +0.1562 0.375 0.6875 +0.1562 0.375 0.7188 +0.1562 0.375 0.75 +0.1562 0.375 0.7812 +0.1562 0.375 0.8125 +0.1562 0.375 0.8438 +0.1562 0.375 0.875 +0.1562 0.375 0.9062 +0.1562 0.375 0.9375 +0.1562 0.375 0.9688 +0.1562 0.375 1 +0.1562 0.4062 0 +0.1562 0.4062 0.03125 +0.1562 0.4062 0.0625 +0.1562 0.4062 0.09375 +0.1562 0.4062 0.125 +0.1562 0.4062 0.1562 +0.1562 0.4062 0.1875 +0.1562 0.4062 0.2188 +0.1562 0.4062 0.25 +0.1562 0.4062 0.2812 +0.1562 0.4062 0.3125 +0.1562 0.4062 0.3438 +0.1562 0.4062 0.375 +0.1562 0.4062 0.4062 +0.1562 0.4062 0.4375 +0.1562 0.4062 0.4688 +0.1562 0.4062 0.5 +0.1562 0.4062 0.5312 +0.1562 0.4062 0.5625 +0.1562 0.4062 0.5938 +0.1562 0.4062 0.625 +0.1562 0.4062 0.6562 +0.1562 0.4062 0.6875 +0.1562 0.4062 0.7188 +0.1562 0.4062 0.75 +0.1562 0.4062 0.7812 +0.1562 0.4062 0.8125 +0.1562 0.4062 0.8438 +0.1562 0.4062 0.875 +0.1562 0.4062 0.9062 +0.1562 0.4062 0.9375 +0.1562 0.4062 0.9688 +0.1562 0.4062 1 +0.1562 0.4375 0 +0.1562 0.4375 0.03125 +0.1562 0.4375 0.0625 +0.1562 0.4375 0.09375 +0.1562 0.4375 0.125 +0.1562 0.4375 0.1562 +0.1562 0.4375 0.1875 +0.1562 0.4375 0.2188 +0.1562 0.4375 0.25 +0.1562 0.4375 0.2812 +0.1562 0.4375 0.3125 +0.1562 0.4375 0.3438 +0.1562 0.4375 0.375 +0.1562 0.4375 0.4062 +0.1562 0.4375 0.4375 +0.1562 0.4375 0.4688 +0.1562 0.4375 0.5 +0.1562 0.4375 0.5312 +0.1562 0.4375 0.5625 +0.1562 0.4375 0.5938 +0.1562 0.4375 0.625 +0.1562 0.4375 0.6562 +0.1562 0.4375 0.6875 +0.1562 0.4375 0.7188 +0.1562 0.4375 0.75 +0.1562 0.4375 0.7812 +0.1562 0.4375 0.8125 +0.1562 0.4375 0.8438 +0.1562 0.4375 0.875 +0.1562 0.4375 0.9062 +0.1562 0.4375 0.9375 +0.1562 0.4375 0.9688 +0.1562 0.4375 1 +0.1562 0.4688 0 +0.1562 0.4688 0.03125 +0.1562 0.4688 0.0625 +0.1562 0.4688 0.09375 +0.1562 0.4688 0.125 +0.1562 0.4688 0.1562 +0.1562 0.4688 0.1875 +0.1562 0.4688 0.2188 +0.1562 0.4688 0.25 +0.1562 0.4688 0.2812 +0.1562 0.4688 0.3125 +0.1562 0.4688 0.3438 +0.1562 0.4688 0.375 +0.1562 0.4688 0.4062 +0.1562 0.4688 0.4375 +0.1562 0.4688 0.4688 +0.1562 0.4688 0.5 +0.1562 0.4688 0.5312 +0.1562 0.4688 0.5625 +0.1562 0.4688 0.5938 +0.1562 0.4688 0.625 +0.1562 0.4688 0.6562 +0.1562 0.4688 0.6875 +0.1562 0.4688 0.7188 +0.1562 0.4688 0.75 +0.1562 0.4688 0.7812 +0.1562 0.4688 0.8125 +0.1562 0.4688 0.8438 +0.1562 0.4688 0.875 +0.1562 0.4688 0.9062 +0.1562 0.4688 0.9375 +0.1562 0.4688 0.9688 +0.1562 0.4688 1 +0.1562 0.5 0 +0.1562 0.5 0.03125 +0.1562 0.5 0.0625 +0.1562 0.5 0.09375 +0.1562 0.5 0.125 +0.1562 0.5 0.1562 +0.1562 0.5 0.1875 +0.1562 0.5 0.2188 +0.1562 0.5 0.25 +0.1562 0.5 0.2812 +0.1562 0.5 0.3125 +0.1562 0.5 0.3438 +0.1562 0.5 0.375 +0.1562 0.5 0.4062 +0.1562 0.5 0.4375 +0.1562 0.5 0.4688 +0.1562 0.5 0.5 +0.1562 0.5 0.5312 +0.1562 0.5 0.5625 +0.1562 0.5 0.5938 +0.1562 0.5 0.625 +0.1562 0.5 0.6562 +0.1562 0.5 0.6875 +0.1562 0.5 0.7188 +0.1562 0.5 0.75 +0.1562 0.5 0.7812 +0.1562 0.5 0.8125 +0.1562 0.5 0.8438 +0.1562 0.5 0.875 +0.1562 0.5 0.9062 +0.1562 0.5 0.9375 +0.1562 0.5 0.9688 +0.1562 0.5 1 +0.1562 0.5312 0 +0.1562 0.5312 0.03125 +0.1562 0.5312 0.0625 +0.1562 0.5312 0.09375 +0.1562 0.5312 0.125 +0.1562 0.5312 0.1562 +0.1562 0.5312 0.1875 +0.1562 0.5312 0.2188 +0.1562 0.5312 0.25 +0.1562 0.5312 0.2812 +0.1562 0.5312 0.3125 +0.1562 0.5312 0.3438 +0.1562 0.5312 0.375 +0.1562 0.5312 0.4062 +0.1562 0.5312 0.4375 +0.1562 0.5312 0.4688 +0.1562 0.5312 0.5 +0.1562 0.5312 0.5312 +0.1562 0.5312 0.5625 +0.1562 0.5312 0.5938 +0.1562 0.5312 0.625 +0.1562 0.5312 0.6562 +0.1562 0.5312 0.6875 +0.1562 0.5312 0.7188 +0.1562 0.5312 0.75 +0.1562 0.5312 0.7812 +0.1562 0.5312 0.8125 +0.1562 0.5312 0.8438 +0.1562 0.5312 0.875 +0.1562 0.5312 0.9062 +0.1562 0.5312 0.9375 +0.1562 0.5312 0.9688 +0.1562 0.5312 1 +0.1562 0.5625 0 +0.1562 0.5625 0.03125 +0.1562 0.5625 0.0625 +0.1562 0.5625 0.09375 +0.1562 0.5625 0.125 +0.1562 0.5625 0.1562 +0.1562 0.5625 0.1875 +0.1562 0.5625 0.2188 +0.1562 0.5625 0.25 +0.1562 0.5625 0.2812 +0.1562 0.5625 0.3125 +0.1562 0.5625 0.3438 +0.1562 0.5625 0.375 +0.1562 0.5625 0.4062 +0.1562 0.5625 0.4375 +0.1562 0.5625 0.4688 +0.1562 0.5625 0.5 +0.1562 0.5625 0.5312 +0.1562 0.5625 0.5625 +0.1562 0.5625 0.5938 +0.1562 0.5625 0.625 +0.1562 0.5625 0.6562 +0.1562 0.5625 0.6875 +0.1562 0.5625 0.7188 +0.1562 0.5625 0.75 +0.1562 0.5625 0.7812 +0.1562 0.5625 0.8125 +0.1562 0.5625 0.8438 +0.1562 0.5625 0.875 +0.1562 0.5625 0.9062 +0.1562 0.5625 0.9375 +0.1562 0.5625 0.9688 +0.1562 0.5625 1 +0.1562 0.5938 0 +0.1562 0.5938 0.03125 +0.1562 0.5938 0.0625 +0.1562 0.5938 0.09375 +0.1562 0.5938 0.125 +0.1562 0.5938 0.1562 +0.1562 0.5938 0.1875 +0.1562 0.5938 0.2188 +0.1562 0.5938 0.25 +0.1562 0.5938 0.2812 +0.1562 0.5938 0.3125 +0.1562 0.5938 0.3438 +0.1562 0.5938 0.375 +0.1562 0.5938 0.4062 +0.1562 0.5938 0.4375 +0.1562 0.5938 0.4688 +0.1562 0.5938 0.5 +0.1562 0.5938 0.5312 +0.1562 0.5938 0.5625 +0.1562 0.5938 0.5938 +0.1562 0.5938 0.625 +0.1562 0.5938 0.6562 +0.1562 0.5938 0.6875 +0.1562 0.5938 0.7188 +0.1562 0.5938 0.75 +0.1562 0.5938 0.7812 +0.1562 0.5938 0.8125 +0.1562 0.5938 0.8438 +0.1562 0.5938 0.875 +0.1562 0.5938 0.9062 +0.1562 0.5938 0.9375 +0.1562 0.5938 0.9688 +0.1562 0.5938 1 +0.1562 0.625 0 +0.1562 0.625 0.03125 +0.1562 0.625 0.0625 +0.1562 0.625 0.09375 +0.1562 0.625 0.125 +0.1562 0.625 0.1562 +0.1562 0.625 0.1875 +0.1562 0.625 0.2188 +0.1562 0.625 0.25 +0.1562 0.625 0.2812 +0.1562 0.625 0.3125 +0.1562 0.625 0.3438 +0.1562 0.625 0.375 +0.1562 0.625 0.4062 +0.1562 0.625 0.4375 +0.1562 0.625 0.4688 +0.1562 0.625 0.5 +0.1562 0.625 0.5312 +0.1562 0.625 0.5625 +0.1562 0.625 0.5938 +0.1562 0.625 0.625 +0.1562 0.625 0.6562 +0.1562 0.625 0.6875 +0.1562 0.625 0.7188 +0.1562 0.625 0.75 +0.1562 0.625 0.7812 +0.1562 0.625 0.8125 +0.1562 0.625 0.8438 +0.1562 0.625 0.875 +0.1562 0.625 0.9062 +0.1562 0.625 0.9375 +0.1562 0.625 0.9688 +0.1562 0.625 1 +0.1562 0.6562 0 +0.1562 0.6562 0.03125 +0.1562 0.6562 0.0625 +0.1562 0.6562 0.09375 +0.1562 0.6562 0.125 +0.1562 0.6562 0.1562 +0.1562 0.6562 0.1875 +0.1562 0.6562 0.2188 +0.1562 0.6562 0.25 +0.1562 0.6562 0.2812 +0.1562 0.6562 0.3125 +0.1562 0.6562 0.3438 +0.1562 0.6562 0.375 +0.1562 0.6562 0.4062 +0.1562 0.6562 0.4375 +0.1562 0.6562 0.4688 +0.1562 0.6562 0.5 +0.1562 0.6562 0.5312 +0.1562 0.6562 0.5625 +0.1562 0.6562 0.5938 +0.1562 0.6562 0.625 +0.1562 0.6562 0.6562 +0.1562 0.6562 0.6875 +0.1562 0.6562 0.7188 +0.1562 0.6562 0.75 +0.1562 0.6562 0.7812 +0.1562 0.6562 0.8125 +0.1562 0.6562 0.8438 +0.1562 0.6562 0.875 +0.1562 0.6562 0.9062 +0.1562 0.6562 0.9375 +0.1562 0.6562 0.9688 +0.1562 0.6562 1 +0.1562 0.6875 0 +0.1562 0.6875 0.03125 +0.1562 0.6875 0.0625 +0.1562 0.6875 0.09375 +0.1562 0.6875 0.125 +0.1562 0.6875 0.1562 +0.1562 0.6875 0.1875 +0.1562 0.6875 0.2188 +0.1562 0.6875 0.25 +0.1562 0.6875 0.2812 +0.1562 0.6875 0.3125 +0.1562 0.6875 0.3438 +0.1562 0.6875 0.375 +0.1562 0.6875 0.4062 +0.1562 0.6875 0.4375 +0.1562 0.6875 0.4688 +0.1562 0.6875 0.5 +0.1562 0.6875 0.5312 +0.1562 0.6875 0.5625 +0.1562 0.6875 0.5938 +0.1562 0.6875 0.625 +0.1562 0.6875 0.6562 +0.1562 0.6875 0.6875 +0.1562 0.6875 0.7188 +0.1562 0.6875 0.75 +0.1562 0.6875 0.7812 +0.1562 0.6875 0.8125 +0.1562 0.6875 0.8438 +0.1562 0.6875 0.875 +0.1562 0.6875 0.9062 +0.1562 0.6875 0.9375 +0.1562 0.6875 0.9688 +0.1562 0.6875 1 +0.1562 0.7188 0 +0.1562 0.7188 0.03125 +0.1562 0.7188 0.0625 +0.1562 0.7188 0.09375 +0.1562 0.7188 0.125 +0.1562 0.7188 0.1562 +0.1562 0.7188 0.1875 +0.1562 0.7188 0.2188 +0.1562 0.7188 0.25 +0.1562 0.7188 0.2812 +0.1562 0.7188 0.3125 +0.1562 0.7188 0.3438 +0.1562 0.7188 0.375 +0.1562 0.7188 0.4062 +0.1562 0.7188 0.4375 +0.1562 0.7188 0.4688 +0.1562 0.7188 0.5 +0.1562 0.7188 0.5312 +0.1562 0.7188 0.5625 +0.1562 0.7188 0.5938 +0.1562 0.7188 0.625 +0.1562 0.7188 0.6562 +0.1562 0.7188 0.6875 +0.1562 0.7188 0.7188 +0.1562 0.7188 0.75 +0.1562 0.7188 0.7812 +0.1562 0.7188 0.8125 +0.1562 0.7188 0.8438 +0.1562 0.7188 0.875 +0.1562 0.7188 0.9062 +0.1562 0.7188 0.9375 +0.1562 0.7188 0.9688 +0.1562 0.7188 1 +0.1562 0.75 0 +0.1562 0.75 0.03125 +0.1562 0.75 0.0625 +0.1562 0.75 0.09375 +0.1562 0.75 0.125 +0.1562 0.75 0.1562 +0.1562 0.75 0.1875 +0.1562 0.75 0.2188 +0.1562 0.75 0.25 +0.1562 0.75 0.2812 +0.1562 0.75 0.3125 +0.1562 0.75 0.3438 +0.1562 0.75 0.375 +0.1562 0.75 0.4062 +0.1562 0.75 0.4375 +0.1562 0.75 0.4688 +0.1562 0.75 0.5 +0.1562 0.75 0.5312 +0.1562 0.75 0.5625 +0.1562 0.75 0.5938 +0.1562 0.75 0.625 +0.1562 0.75 0.6562 +0.1562 0.75 0.6875 +0.1562 0.75 0.7188 +0.1562 0.75 0.75 +0.1562 0.75 0.7812 +0.1562 0.75 0.8125 +0.1562 0.75 0.8438 +0.1562 0.75 0.875 +0.1562 0.75 0.9062 +0.1562 0.75 0.9375 +0.1562 0.75 0.9688 +0.1562 0.75 1 +0.1562 0.7812 0 +0.1562 0.7812 0.03125 +0.1562 0.7812 0.0625 +0.1562 0.7812 0.09375 +0.1562 0.7812 0.125 +0.1562 0.7812 0.1562 +0.1562 0.7812 0.1875 +0.1562 0.7812 0.2188 +0.1562 0.7812 0.25 +0.1562 0.7812 0.2812 +0.1562 0.7812 0.3125 +0.1562 0.7812 0.3438 +0.1562 0.7812 0.375 +0.1562 0.7812 0.4062 +0.1562 0.7812 0.4375 +0.1562 0.7812 0.4688 +0.1562 0.7812 0.5 +0.1562 0.7812 0.5312 +0.1562 0.7812 0.5625 +0.1562 0.7812 0.5938 +0.1562 0.7812 0.625 +0.1562 0.7812 0.6562 +0.1562 0.7812 0.6875 +0.1562 0.7812 0.7188 +0.1562 0.7812 0.75 +0.1562 0.7812 0.7812 +0.1562 0.7812 0.8125 +0.1562 0.7812 0.8438 +0.1562 0.7812 0.875 +0.1562 0.7812 0.9062 +0.1562 0.7812 0.9375 +0.1562 0.7812 0.9688 +0.1562 0.7812 1 +0.1562 0.8125 0 +0.1562 0.8125 0.03125 +0.1562 0.8125 0.0625 +0.1562 0.8125 0.09375 +0.1562 0.8125 0.125 +0.1562 0.8125 0.1562 +0.1562 0.8125 0.1875 +0.1562 0.8125 0.2188 +0.1562 0.8125 0.25 +0.1562 0.8125 0.2812 +0.1562 0.8125 0.3125 +0.1562 0.8125 0.3438 +0.1562 0.8125 0.375 +0.1562 0.8125 0.4062 +0.1562 0.8125 0.4375 +0.1562 0.8125 0.4688 +0.1562 0.8125 0.5 +0.1562 0.8125 0.5312 +0.1562 0.8125 0.5625 +0.1562 0.8125 0.5938 +0.1562 0.8125 0.625 +0.1562 0.8125 0.6562 +0.1562 0.8125 0.6875 +0.1562 0.8125 0.7188 +0.1562 0.8125 0.75 +0.1562 0.8125 0.7812 +0.1562 0.8125 0.8125 +0.1562 0.8125 0.8438 +0.1562 0.8125 0.875 +0.1562 0.8125 0.9062 +0.1562 0.8125 0.9375 +0.1562 0.8125 0.9688 +0.1562 0.8125 1 +0.1562 0.8438 0 +0.1562 0.8438 0.03125 +0.1562 0.8438 0.0625 +0.1562 0.8438 0.09375 +0.1562 0.8438 0.125 +0.1562 0.8438 0.1562 +0.1562 0.8438 0.1875 +0.1562 0.8438 0.2188 +0.1562 0.8438 0.25 +0.1562 0.8438 0.2812 +0.1562 0.8438 0.3125 +0.1562 0.8438 0.3438 +0.1562 0.8438 0.375 +0.1562 0.8438 0.4062 +0.1562 0.8438 0.4375 +0.1562 0.8438 0.4688 +0.1562 0.8438 0.5 +0.1562 0.8438 0.5312 +0.1562 0.8438 0.5625 +0.1562 0.8438 0.5938 +0.1562 0.8438 0.625 +0.1562 0.8438 0.6562 +0.1562 0.8438 0.6875 +0.1562 0.8438 0.7188 +0.1562 0.8438 0.75 +0.1562 0.8438 0.7812 +0.1562 0.8438 0.8125 +0.1562 0.8438 0.8438 +0.1562 0.8438 0.875 +0.1562 0.8438 0.9062 +0.1562 0.8438 0.9375 +0.1562 0.8438 0.9688 +0.1562 0.8438 1 +0.1562 0.875 0 +0.1562 0.875 0.03125 +0.1562 0.875 0.0625 +0.1562 0.875 0.09375 +0.1562 0.875 0.125 +0.1562 0.875 0.1562 +0.1562 0.875 0.1875 +0.1562 0.875 0.2188 +0.1562 0.875 0.25 +0.1562 0.875 0.2812 +0.1562 0.875 0.3125 +0.1562 0.875 0.3438 +0.1562 0.875 0.375 +0.1562 0.875 0.4062 +0.1562 0.875 0.4375 +0.1562 0.875 0.4688 +0.1562 0.875 0.5 +0.1562 0.875 0.5312 +0.1562 0.875 0.5625 +0.1562 0.875 0.5938 +0.1562 0.875 0.625 +0.1562 0.875 0.6562 +0.1562 0.875 0.6875 +0.1562 0.875 0.7188 +0.1562 0.875 0.75 +0.1562 0.875 0.7812 +0.1562 0.875 0.8125 +0.1562 0.875 0.8438 +0.1562 0.875 0.875 +0.1562 0.875 0.9062 +0.1562 0.875 0.9375 +0.1562 0.875 0.9688 +0.1562 0.875 1 +0.1562 0.9062 0 +0.1562 0.9062 0.03125 +0.1562 0.9062 0.0625 +0.1562 0.9062 0.09375 +0.1562 0.9062 0.125 +0.1562 0.9062 0.1562 +0.1562 0.9062 0.1875 +0.1562 0.9062 0.2188 +0.1562 0.9062 0.25 +0.1562 0.9062 0.2812 +0.1562 0.9062 0.3125 +0.1562 0.9062 0.3438 +0.1562 0.9062 0.375 +0.1562 0.9062 0.4062 +0.1562 0.9062 0.4375 +0.1562 0.9062 0.4688 +0.1562 0.9062 0.5 +0.1562 0.9062 0.5312 +0.1562 0.9062 0.5625 +0.1562 0.9062 0.5938 +0.1562 0.9062 0.625 +0.1562 0.9062 0.6562 +0.1562 0.9062 0.6875 +0.1562 0.9062 0.7188 +0.1562 0.9062 0.75 +0.1562 0.9062 0.7812 +0.1562 0.9062 0.8125 +0.1562 0.9062 0.8438 +0.1562 0.9062 0.875 +0.1562 0.9062 0.9062 +0.1562 0.9062 0.9375 +0.1562 0.9062 0.9688 +0.1562 0.9062 1 +0.1562 0.9375 0 +0.1562 0.9375 0.03125 +0.1562 0.9375 0.0625 +0.1562 0.9375 0.09375 +0.1562 0.9375 0.125 +0.1562 0.9375 0.1562 +0.1562 0.9375 0.1875 +0.1562 0.9375 0.2188 +0.1562 0.9375 0.25 +0.1562 0.9375 0.2812 +0.1562 0.9375 0.3125 +0.1562 0.9375 0.3438 +0.1562 0.9375 0.375 +0.1562 0.9375 0.4062 +0.1562 0.9375 0.4375 +0.1562 0.9375 0.4688 +0.1562 0.9375 0.5 +0.1562 0.9375 0.5312 +0.1562 0.9375 0.5625 +0.1562 0.9375 0.5938 +0.1562 0.9375 0.625 +0.1562 0.9375 0.6562 +0.1562 0.9375 0.6875 +0.1562 0.9375 0.7188 +0.1562 0.9375 0.75 +0.1562 0.9375 0.7812 +0.1562 0.9375 0.8125 +0.1562 0.9375 0.8438 +0.1562 0.9375 0.875 +0.1562 0.9375 0.9062 +0.1562 0.9375 0.9375 +0.1562 0.9375 0.9688 +0.1562 0.9375 1 +0.1562 0.9688 0 +0.1562 0.9688 0.03125 +0.1562 0.9688 0.0625 +0.1562 0.9688 0.09375 +0.1562 0.9688 0.125 +0.1562 0.9688 0.1562 +0.1562 0.9688 0.1875 +0.1562 0.9688 0.2188 +0.1562 0.9688 0.25 +0.1562 0.9688 0.2812 +0.1562 0.9688 0.3125 +0.1562 0.9688 0.3438 +0.1562 0.9688 0.375 +0.1562 0.9688 0.4062 +0.1562 0.9688 0.4375 +0.1562 0.9688 0.4688 +0.1562 0.9688 0.5 +0.1562 0.9688 0.5312 +0.1562 0.9688 0.5625 +0.1562 0.9688 0.5938 +0.1562 0.9688 0.625 +0.1562 0.9688 0.6562 +0.1562 0.9688 0.6875 +0.1562 0.9688 0.7188 +0.1562 0.9688 0.75 +0.1562 0.9688 0.7812 +0.1562 0.9688 0.8125 +0.1562 0.9688 0.8438 +0.1562 0.9688 0.875 +0.1562 0.9688 0.9062 +0.1562 0.9688 0.9375 +0.1562 0.9688 0.9688 +0.1562 0.9688 1 +0.1562 1 0 +0.1562 1 0.03125 +0.1562 1 0.0625 +0.1562 1 0.09375 +0.1562 1 0.125 +0.1562 1 0.1562 +0.1562 1 0.1875 +0.1562 1 0.2188 +0.1562 1 0.25 +0.1562 1 0.2812 +0.1562 1 0.3125 +0.1562 1 0.3438 +0.1562 1 0.375 +0.1562 1 0.4062 +0.1562 1 0.4375 +0.1562 1 0.4688 +0.1562 1 0.5 +0.1562 1 0.5312 +0.1562 1 0.5625 +0.1562 1 0.5938 +0.1562 1 0.625 +0.1562 1 0.6562 +0.1562 1 0.6875 +0.1562 1 0.7188 +0.1562 1 0.75 +0.1562 1 0.7812 +0.1562 1 0.8125 +0.1562 1 0.8438 +0.1562 1 0.875 +0.1562 1 0.9062 +0.1562 1 0.9375 +0.1562 1 0.9688 +0.1562 1 1 +0.1875 0 0 +0.1875 0 0.03125 +0.1875 0 0.0625 +0.1875 0 0.09375 +0.1875 0 0.125 +0.1875 0 0.1562 +0.1875 0 0.1875 +0.1875 0 0.2188 +0.1875 0 0.25 +0.1875 0 0.2812 +0.1875 0 0.3125 +0.1875 0 0.3438 +0.1875 0 0.375 +0.1875 0 0.4062 +0.1875 0 0.4375 +0.1875 0 0.4688 +0.1875 0 0.5 +0.1875 0 0.5312 +0.1875 0 0.5625 +0.1875 0 0.5938 +0.1875 0 0.625 +0.1875 0 0.6562 +0.1875 0 0.6875 +0.1875 0 0.7188 +0.1875 0 0.75 +0.1875 0 0.7812 +0.1875 0 0.8125 +0.1875 0 0.8438 +0.1875 0 0.875 +0.1875 0 0.9062 +0.1875 0 0.9375 +0.1875 0 0.9688 +0.1875 0 1 +0.1875 0.03125 0 +0.1875 0.03125 0.03125 +0.1875 0.03125 0.0625 +0.1875 0.03125 0.09375 +0.1875 0.03125 0.125 +0.1875 0.03125 0.1562 +0.1875 0.03125 0.1875 +0.1875 0.03125 0.2188 +0.1875 0.03125 0.25 +0.1875 0.03125 0.2812 +0.1875 0.03125 0.3125 +0.1875 0.03125 0.3438 +0.1875 0.03125 0.375 +0.1875 0.03125 0.4062 +0.1875 0.03125 0.4375 +0.1875 0.03125 0.4688 +0.1875 0.03125 0.5 +0.1875 0.03125 0.5312 +0.1875 0.03125 0.5625 +0.1875 0.03125 0.5938 +0.1875 0.03125 0.625 +0.1875 0.03125 0.6562 +0.1875 0.03125 0.6875 +0.1875 0.03125 0.7188 +0.1875 0.03125 0.75 +0.1875 0.03125 0.7812 +0.1875 0.03125 0.8125 +0.1875 0.03125 0.8438 +0.1875 0.03125 0.875 +0.1875 0.03125 0.9062 +0.1875 0.03125 0.9375 +0.1875 0.03125 0.9688 +0.1875 0.03125 1 +0.1875 0.0625 0 +0.1875 0.0625 0.03125 +0.1875 0.0625 0.0625 +0.1875 0.0625 0.09375 +0.1875 0.0625 0.125 +0.1875 0.0625 0.1562 +0.1875 0.0625 0.1875 +0.1875 0.0625 0.2188 +0.1875 0.0625 0.25 +0.1875 0.0625 0.2812 +0.1875 0.0625 0.3125 +0.1875 0.0625 0.3438 +0.1875 0.0625 0.375 +0.1875 0.0625 0.4062 +0.1875 0.0625 0.4375 +0.1875 0.0625 0.4688 +0.1875 0.0625 0.5 +0.1875 0.0625 0.5312 +0.1875 0.0625 0.5625 +0.1875 0.0625 0.5938 +0.1875 0.0625 0.625 +0.1875 0.0625 0.6562 +0.1875 0.0625 0.6875 +0.1875 0.0625 0.7188 +0.1875 0.0625 0.75 +0.1875 0.0625 0.7812 +0.1875 0.0625 0.8125 +0.1875 0.0625 0.8438 +0.1875 0.0625 0.875 +0.1875 0.0625 0.9062 +0.1875 0.0625 0.9375 +0.1875 0.0625 0.9688 +0.1875 0.0625 1 +0.1875 0.09375 0 +0.1875 0.09375 0.03125 +0.1875 0.09375 0.0625 +0.1875 0.09375 0.09375 +0.1875 0.09375 0.125 +0.1875 0.09375 0.1562 +0.1875 0.09375 0.1875 +0.1875 0.09375 0.2188 +0.1875 0.09375 0.25 +0.1875 0.09375 0.2812 +0.1875 0.09375 0.3125 +0.1875 0.09375 0.3438 +0.1875 0.09375 0.375 +0.1875 0.09375 0.4062 +0.1875 0.09375 0.4375 +0.1875 0.09375 0.4688 +0.1875 0.09375 0.5 +0.1875 0.09375 0.5312 +0.1875 0.09375 0.5625 +0.1875 0.09375 0.5938 +0.1875 0.09375 0.625 +0.1875 0.09375 0.6562 +0.1875 0.09375 0.6875 +0.1875 0.09375 0.7188 +0.1875 0.09375 0.75 +0.1875 0.09375 0.7812 +0.1875 0.09375 0.8125 +0.1875 0.09375 0.8438 +0.1875 0.09375 0.875 +0.1875 0.09375 0.9062 +0.1875 0.09375 0.9375 +0.1875 0.09375 0.9688 +0.1875 0.09375 1 +0.1875 0.125 0 +0.1875 0.125 0.03125 +0.1875 0.125 0.0625 +0.1875 0.125 0.09375 +0.1875 0.125 0.125 +0.1875 0.125 0.1562 +0.1875 0.125 0.1875 +0.1875 0.125 0.2188 +0.1875 0.125 0.25 +0.1875 0.125 0.2812 +0.1875 0.125 0.3125 +0.1875 0.125 0.3438 +0.1875 0.125 0.375 +0.1875 0.125 0.4062 +0.1875 0.125 0.4375 +0.1875 0.125 0.4688 +0.1875 0.125 0.5 +0.1875 0.125 0.5312 +0.1875 0.125 0.5625 +0.1875 0.125 0.5938 +0.1875 0.125 0.625 +0.1875 0.125 0.6562 +0.1875 0.125 0.6875 +0.1875 0.125 0.7188 +0.1875 0.125 0.75 +0.1875 0.125 0.7812 +0.1875 0.125 0.8125 +0.1875 0.125 0.8438 +0.1875 0.125 0.875 +0.1875 0.125 0.9062 +0.1875 0.125 0.9375 +0.1875 0.125 0.9688 +0.1875 0.125 1 +0.1875 0.1562 0 +0.1875 0.1562 0.03125 +0.1875 0.1562 0.0625 +0.1875 0.1562 0.09375 +0.1875 0.1562 0.125 +0.1875 0.1562 0.1562 +0.1875 0.1562 0.1875 +0.1875 0.1562 0.2188 +0.1875 0.1562 0.25 +0.1875 0.1562 0.2812 +0.1875 0.1562 0.3125 +0.1875 0.1562 0.3438 +0.1875 0.1562 0.375 +0.1875 0.1562 0.4062 +0.1875 0.1562 0.4375 +0.1875 0.1562 0.4688 +0.1875 0.1562 0.5 +0.1875 0.1562 0.5312 +0.1875 0.1562 0.5625 +0.1875 0.1562 0.5938 +0.1875 0.1562 0.625 +0.1875 0.1562 0.6562 +0.1875 0.1562 0.6875 +0.1875 0.1562 0.7188 +0.1875 0.1562 0.75 +0.1875 0.1562 0.7812 +0.1875 0.1562 0.8125 +0.1875 0.1562 0.8438 +0.1875 0.1562 0.875 +0.1875 0.1562 0.9062 +0.1875 0.1562 0.9375 +0.1875 0.1562 0.9688 +0.1875 0.1562 1 +0.1875 0.1875 0 +0.1875 0.1875 0.03125 +0.1875 0.1875 0.0625 +0.1875 0.1875 0.09375 +0.1875 0.1875 0.125 +0.1875 0.1875 0.1562 +0.1875 0.1875 0.1875 +0.1875 0.1875 0.2188 +0.1875 0.1875 0.25 +0.1875 0.1875 0.2812 +0.1875 0.1875 0.3125 +0.1875 0.1875 0.3438 +0.1875 0.1875 0.375 +0.1875 0.1875 0.4062 +0.1875 0.1875 0.4375 +0.1875 0.1875 0.4688 +0.1875 0.1875 0.5 +0.1875 0.1875 0.5312 +0.1875 0.1875 0.5625 +0.1875 0.1875 0.5938 +0.1875 0.1875 0.625 +0.1875 0.1875 0.6562 +0.1875 0.1875 0.6875 +0.1875 0.1875 0.7188 +0.1875 0.1875 0.75 +0.1875 0.1875 0.7812 +0.1875 0.1875 0.8125 +0.1875 0.1875 0.8438 +0.1875 0.1875 0.875 +0.1875 0.1875 0.9062 +0.1875 0.1875 0.9375 +0.1875 0.1875 0.9688 +0.1875 0.1875 1 +0.1875 0.2188 0 +0.1875 0.2188 0.03125 +0.1875 0.2188 0.0625 +0.1875 0.2188 0.09375 +0.1875 0.2188 0.125 +0.1875 0.2188 0.1562 +0.1875 0.2188 0.1875 +0.1875 0.2188 0.2188 +0.1875 0.2188 0.25 +0.1875 0.2188 0.2812 +0.1875 0.2188 0.3125 +0.1875 0.2188 0.3438 +0.1875 0.2188 0.375 +0.1875 0.2188 0.4062 +0.1875 0.2188 0.4375 +0.1875 0.2188 0.4688 +0.1875 0.2188 0.5 +0.1875 0.2188 0.5312 +0.1875 0.2188 0.5625 +0.1875 0.2188 0.5938 +0.1875 0.2188 0.625 +0.1875 0.2188 0.6562 +0.1875 0.2188 0.6875 +0.1875 0.2188 0.7188 +0.1875 0.2188 0.75 +0.1875 0.2188 0.7812 +0.1875 0.2188 0.8125 +0.1875 0.2188 0.8438 +0.1875 0.2188 0.875 +0.1875 0.2188 0.9062 +0.1875 0.2188 0.9375 +0.1875 0.2188 0.9688 +0.1875 0.2188 1 +0.1875 0.25 0 +0.1875 0.25 0.03125 +0.1875 0.25 0.0625 +0.1875 0.25 0.09375 +0.1875 0.25 0.125 +0.1875 0.25 0.1562 +0.1875 0.25 0.1875 +0.1875 0.25 0.2188 +0.1875 0.25 0.25 +0.1875 0.25 0.2812 +0.1875 0.25 0.3125 +0.1875 0.25 0.3438 +0.1875 0.25 0.375 +0.1875 0.25 0.4062 +0.1875 0.25 0.4375 +0.1875 0.25 0.4688 +0.1875 0.25 0.5 +0.1875 0.25 0.5312 +0.1875 0.25 0.5625 +0.1875 0.25 0.5938 +0.1875 0.25 0.625 +0.1875 0.25 0.6562 +0.1875 0.25 0.6875 +0.1875 0.25 0.7188 +0.1875 0.25 0.75 +0.1875 0.25 0.7812 +0.1875 0.25 0.8125 +0.1875 0.25 0.8438 +0.1875 0.25 0.875 +0.1875 0.25 0.9062 +0.1875 0.25 0.9375 +0.1875 0.25 0.9688 +0.1875 0.25 1 +0.1875 0.2812 0 +0.1875 0.2812 0.03125 +0.1875 0.2812 0.0625 +0.1875 0.2812 0.09375 +0.1875 0.2812 0.125 +0.1875 0.2812 0.1562 +0.1875 0.2812 0.1875 +0.1875 0.2812 0.2188 +0.1875 0.2812 0.25 +0.1875 0.2812 0.2812 +0.1875 0.2812 0.3125 +0.1875 0.2812 0.3438 +0.1875 0.2812 0.375 +0.1875 0.2812 0.4062 +0.1875 0.2812 0.4375 +0.1875 0.2812 0.4688 +0.1875 0.2812 0.5 +0.1875 0.2812 0.5312 +0.1875 0.2812 0.5625 +0.1875 0.2812 0.5938 +0.1875 0.2812 0.625 +0.1875 0.2812 0.6562 +0.1875 0.2812 0.6875 +0.1875 0.2812 0.7188 +0.1875 0.2812 0.75 +0.1875 0.2812 0.7812 +0.1875 0.2812 0.8125 +0.1875 0.2812 0.8438 +0.1875 0.2812 0.875 +0.1875 0.2812 0.9062 +0.1875 0.2812 0.9375 +0.1875 0.2812 0.9688 +0.1875 0.2812 1 +0.1875 0.3125 0 +0.1875 0.3125 0.03125 +0.1875 0.3125 0.0625 +0.1875 0.3125 0.09375 +0.1875 0.3125 0.125 +0.1875 0.3125 0.1562 +0.1875 0.3125 0.1875 +0.1875 0.3125 0.2188 +0.1875 0.3125 0.25 +0.1875 0.3125 0.2812 +0.1875 0.3125 0.3125 +0.1875 0.3125 0.3438 +0.1875 0.3125 0.375 +0.1875 0.3125 0.4062 +0.1875 0.3125 0.4375 +0.1875 0.3125 0.4688 +0.1875 0.3125 0.5 +0.1875 0.3125 0.5312 +0.1875 0.3125 0.5625 +0.1875 0.3125 0.5938 +0.1875 0.3125 0.625 +0.1875 0.3125 0.6562 +0.1875 0.3125 0.6875 +0.1875 0.3125 0.7188 +0.1875 0.3125 0.75 +0.1875 0.3125 0.7812 +0.1875 0.3125 0.8125 +0.1875 0.3125 0.8438 +0.1875 0.3125 0.875 +0.1875 0.3125 0.9062 +0.1875 0.3125 0.9375 +0.1875 0.3125 0.9688 +0.1875 0.3125 1 +0.1875 0.3438 0 +0.1875 0.3438 0.03125 +0.1875 0.3438 0.0625 +0.1875 0.3438 0.09375 +0.1875 0.3438 0.125 +0.1875 0.3438 0.1562 +0.1875 0.3438 0.1875 +0.1875 0.3438 0.2188 +0.1875 0.3438 0.25 +0.1875 0.3438 0.2812 +0.1875 0.3438 0.3125 +0.1875 0.3438 0.3438 +0.1875 0.3438 0.375 +0.1875 0.3438 0.4062 +0.1875 0.3438 0.4375 +0.1875 0.3438 0.4688 +0.1875 0.3438 0.5 +0.1875 0.3438 0.5312 +0.1875 0.3438 0.5625 +0.1875 0.3438 0.5938 +0.1875 0.3438 0.625 +0.1875 0.3438 0.6562 +0.1875 0.3438 0.6875 +0.1875 0.3438 0.7188 +0.1875 0.3438 0.75 +0.1875 0.3438 0.7812 +0.1875 0.3438 0.8125 +0.1875 0.3438 0.8438 +0.1875 0.3438 0.875 +0.1875 0.3438 0.9062 +0.1875 0.3438 0.9375 +0.1875 0.3438 0.9688 +0.1875 0.3438 1 +0.1875 0.375 0 +0.1875 0.375 0.03125 +0.1875 0.375 0.0625 +0.1875 0.375 0.09375 +0.1875 0.375 0.125 +0.1875 0.375 0.1562 +0.1875 0.375 0.1875 +0.1875 0.375 0.2188 +0.1875 0.375 0.25 +0.1875 0.375 0.2812 +0.1875 0.375 0.3125 +0.1875 0.375 0.3438 +0.1875 0.375 0.375 +0.1875 0.375 0.4062 +0.1875 0.375 0.4375 +0.1875 0.375 0.4688 +0.1875 0.375 0.5 +0.1875 0.375 0.5312 +0.1875 0.375 0.5625 +0.1875 0.375 0.5938 +0.1875 0.375 0.625 +0.1875 0.375 0.6562 +0.1875 0.375 0.6875 +0.1875 0.375 0.7188 +0.1875 0.375 0.75 +0.1875 0.375 0.7812 +0.1875 0.375 0.8125 +0.1875 0.375 0.8438 +0.1875 0.375 0.875 +0.1875 0.375 0.9062 +0.1875 0.375 0.9375 +0.1875 0.375 0.9688 +0.1875 0.375 1 +0.1875 0.4062 0 +0.1875 0.4062 0.03125 +0.1875 0.4062 0.0625 +0.1875 0.4062 0.09375 +0.1875 0.4062 0.125 +0.1875 0.4062 0.1562 +0.1875 0.4062 0.1875 +0.1875 0.4062 0.2188 +0.1875 0.4062 0.25 +0.1875 0.4062 0.2812 +0.1875 0.4062 0.3125 +0.1875 0.4062 0.3438 +0.1875 0.4062 0.375 +0.1875 0.4062 0.4062 +0.1875 0.4062 0.4375 +0.1875 0.4062 0.4688 +0.1875 0.4062 0.5 +0.1875 0.4062 0.5312 +0.1875 0.4062 0.5625 +0.1875 0.4062 0.5938 +0.1875 0.4062 0.625 +0.1875 0.4062 0.6562 +0.1875 0.4062 0.6875 +0.1875 0.4062 0.7188 +0.1875 0.4062 0.75 +0.1875 0.4062 0.7812 +0.1875 0.4062 0.8125 +0.1875 0.4062 0.8438 +0.1875 0.4062 0.875 +0.1875 0.4062 0.9062 +0.1875 0.4062 0.9375 +0.1875 0.4062 0.9688 +0.1875 0.4062 1 +0.1875 0.4375 0 +0.1875 0.4375 0.03125 +0.1875 0.4375 0.0625 +0.1875 0.4375 0.09375 +0.1875 0.4375 0.125 +0.1875 0.4375 0.1562 +0.1875 0.4375 0.1875 +0.1875 0.4375 0.2188 +0.1875 0.4375 0.25 +0.1875 0.4375 0.2812 +0.1875 0.4375 0.3125 +0.1875 0.4375 0.3438 +0.1875 0.4375 0.375 +0.1875 0.4375 0.4062 +0.1875 0.4375 0.4375 +0.1875 0.4375 0.4688 +0.1875 0.4375 0.5 +0.1875 0.4375 0.5312 +0.1875 0.4375 0.5625 +0.1875 0.4375 0.5938 +0.1875 0.4375 0.625 +0.1875 0.4375 0.6562 +0.1875 0.4375 0.6875 +0.1875 0.4375 0.7188 +0.1875 0.4375 0.75 +0.1875 0.4375 0.7812 +0.1875 0.4375 0.8125 +0.1875 0.4375 0.8438 +0.1875 0.4375 0.875 +0.1875 0.4375 0.9062 +0.1875 0.4375 0.9375 +0.1875 0.4375 0.9688 +0.1875 0.4375 1 +0.1875 0.4688 0 +0.1875 0.4688 0.03125 +0.1875 0.4688 0.0625 +0.1875 0.4688 0.09375 +0.1875 0.4688 0.125 +0.1875 0.4688 0.1562 +0.1875 0.4688 0.1875 +0.1875 0.4688 0.2188 +0.1875 0.4688 0.25 +0.1875 0.4688 0.2812 +0.1875 0.4688 0.3125 +0.1875 0.4688 0.3438 +0.1875 0.4688 0.375 +0.1875 0.4688 0.4062 +0.1875 0.4688 0.4375 +0.1875 0.4688 0.4688 +0.1875 0.4688 0.5 +0.1875 0.4688 0.5312 +0.1875 0.4688 0.5625 +0.1875 0.4688 0.5938 +0.1875 0.4688 0.625 +0.1875 0.4688 0.6562 +0.1875 0.4688 0.6875 +0.1875 0.4688 0.7188 +0.1875 0.4688 0.75 +0.1875 0.4688 0.7812 +0.1875 0.4688 0.8125 +0.1875 0.4688 0.8438 +0.1875 0.4688 0.875 +0.1875 0.4688 0.9062 +0.1875 0.4688 0.9375 +0.1875 0.4688 0.9688 +0.1875 0.4688 1 +0.1875 0.5 0 +0.1875 0.5 0.03125 +0.1875 0.5 0.0625 +0.1875 0.5 0.09375 +0.1875 0.5 0.125 +0.1875 0.5 0.1562 +0.1875 0.5 0.1875 +0.1875 0.5 0.2188 +0.1875 0.5 0.25 +0.1875 0.5 0.2812 +0.1875 0.5 0.3125 +0.1875 0.5 0.3438 +0.1875 0.5 0.375 +0.1875 0.5 0.4062 +0.1875 0.5 0.4375 +0.1875 0.5 0.4688 +0.1875 0.5 0.5 +0.1875 0.5 0.5312 +0.1875 0.5 0.5625 +0.1875 0.5 0.5938 +0.1875 0.5 0.625 +0.1875 0.5 0.6562 +0.1875 0.5 0.6875 +0.1875 0.5 0.7188 +0.1875 0.5 0.75 +0.1875 0.5 0.7812 +0.1875 0.5 0.8125 +0.1875 0.5 0.8438 +0.1875 0.5 0.875 +0.1875 0.5 0.9062 +0.1875 0.5 0.9375 +0.1875 0.5 0.9688 +0.1875 0.5 1 +0.1875 0.5312 0 +0.1875 0.5312 0.03125 +0.1875 0.5312 0.0625 +0.1875 0.5312 0.09375 +0.1875 0.5312 0.125 +0.1875 0.5312 0.1562 +0.1875 0.5312 0.1875 +0.1875 0.5312 0.2188 +0.1875 0.5312 0.25 +0.1875 0.5312 0.2812 +0.1875 0.5312 0.3125 +0.1875 0.5312 0.3438 +0.1875 0.5312 0.375 +0.1875 0.5312 0.4062 +0.1875 0.5312 0.4375 +0.1875 0.5312 0.4688 +0.1875 0.5312 0.5 +0.1875 0.5312 0.5312 +0.1875 0.5312 0.5625 +0.1875 0.5312 0.5938 +0.1875 0.5312 0.625 +0.1875 0.5312 0.6562 +0.1875 0.5312 0.6875 +0.1875 0.5312 0.7188 +0.1875 0.5312 0.75 +0.1875 0.5312 0.7812 +0.1875 0.5312 0.8125 +0.1875 0.5312 0.8438 +0.1875 0.5312 0.875 +0.1875 0.5312 0.9062 +0.1875 0.5312 0.9375 +0.1875 0.5312 0.9688 +0.1875 0.5312 1 +0.1875 0.5625 0 +0.1875 0.5625 0.03125 +0.1875 0.5625 0.0625 +0.1875 0.5625 0.09375 +0.1875 0.5625 0.125 +0.1875 0.5625 0.1562 +0.1875 0.5625 0.1875 +0.1875 0.5625 0.2188 +0.1875 0.5625 0.25 +0.1875 0.5625 0.2812 +0.1875 0.5625 0.3125 +0.1875 0.5625 0.3438 +0.1875 0.5625 0.375 +0.1875 0.5625 0.4062 +0.1875 0.5625 0.4375 +0.1875 0.5625 0.4688 +0.1875 0.5625 0.5 +0.1875 0.5625 0.5312 +0.1875 0.5625 0.5625 +0.1875 0.5625 0.5938 +0.1875 0.5625 0.625 +0.1875 0.5625 0.6562 +0.1875 0.5625 0.6875 +0.1875 0.5625 0.7188 +0.1875 0.5625 0.75 +0.1875 0.5625 0.7812 +0.1875 0.5625 0.8125 +0.1875 0.5625 0.8438 +0.1875 0.5625 0.875 +0.1875 0.5625 0.9062 +0.1875 0.5625 0.9375 +0.1875 0.5625 0.9688 +0.1875 0.5625 1 +0.1875 0.5938 0 +0.1875 0.5938 0.03125 +0.1875 0.5938 0.0625 +0.1875 0.5938 0.09375 +0.1875 0.5938 0.125 +0.1875 0.5938 0.1562 +0.1875 0.5938 0.1875 +0.1875 0.5938 0.2188 +0.1875 0.5938 0.25 +0.1875 0.5938 0.2812 +0.1875 0.5938 0.3125 +0.1875 0.5938 0.3438 +0.1875 0.5938 0.375 +0.1875 0.5938 0.4062 +0.1875 0.5938 0.4375 +0.1875 0.5938 0.4688 +0.1875 0.5938 0.5 +0.1875 0.5938 0.5312 +0.1875 0.5938 0.5625 +0.1875 0.5938 0.5938 +0.1875 0.5938 0.625 +0.1875 0.5938 0.6562 +0.1875 0.5938 0.6875 +0.1875 0.5938 0.7188 +0.1875 0.5938 0.75 +0.1875 0.5938 0.7812 +0.1875 0.5938 0.8125 +0.1875 0.5938 0.8438 +0.1875 0.5938 0.875 +0.1875 0.5938 0.9062 +0.1875 0.5938 0.9375 +0.1875 0.5938 0.9688 +0.1875 0.5938 1 +0.1875 0.625 0 +0.1875 0.625 0.03125 +0.1875 0.625 0.0625 +0.1875 0.625 0.09375 +0.1875 0.625 0.125 +0.1875 0.625 0.1562 +0.1875 0.625 0.1875 +0.1875 0.625 0.2188 +0.1875 0.625 0.25 +0.1875 0.625 0.2812 +0.1875 0.625 0.3125 +0.1875 0.625 0.3438 +0.1875 0.625 0.375 +0.1875 0.625 0.4062 +0.1875 0.625 0.4375 +0.1875 0.625 0.4688 +0.1875 0.625 0.5 +0.1875 0.625 0.5312 +0.1875 0.625 0.5625 +0.1875 0.625 0.5938 +0.1875 0.625 0.625 +0.1875 0.625 0.6562 +0.1875 0.625 0.6875 +0.1875 0.625 0.7188 +0.1875 0.625 0.75 +0.1875 0.625 0.7812 +0.1875 0.625 0.8125 +0.1875 0.625 0.8438 +0.1875 0.625 0.875 +0.1875 0.625 0.9062 +0.1875 0.625 0.9375 +0.1875 0.625 0.9688 +0.1875 0.625 1 +0.1875 0.6562 0 +0.1875 0.6562 0.03125 +0.1875 0.6562 0.0625 +0.1875 0.6562 0.09375 +0.1875 0.6562 0.125 +0.1875 0.6562 0.1562 +0.1875 0.6562 0.1875 +0.1875 0.6562 0.2188 +0.1875 0.6562 0.25 +0.1875 0.6562 0.2812 +0.1875 0.6562 0.3125 +0.1875 0.6562 0.3438 +0.1875 0.6562 0.375 +0.1875 0.6562 0.4062 +0.1875 0.6562 0.4375 +0.1875 0.6562 0.4688 +0.1875 0.6562 0.5 +0.1875 0.6562 0.5312 +0.1875 0.6562 0.5625 +0.1875 0.6562 0.5938 +0.1875 0.6562 0.625 +0.1875 0.6562 0.6562 +0.1875 0.6562 0.6875 +0.1875 0.6562 0.7188 +0.1875 0.6562 0.75 +0.1875 0.6562 0.7812 +0.1875 0.6562 0.8125 +0.1875 0.6562 0.8438 +0.1875 0.6562 0.875 +0.1875 0.6562 0.9062 +0.1875 0.6562 0.9375 +0.1875 0.6562 0.9688 +0.1875 0.6562 1 +0.1875 0.6875 0 +0.1875 0.6875 0.03125 +0.1875 0.6875 0.0625 +0.1875 0.6875 0.09375 +0.1875 0.6875 0.125 +0.1875 0.6875 0.1562 +0.1875 0.6875 0.1875 +0.1875 0.6875 0.2188 +0.1875 0.6875 0.25 +0.1875 0.6875 0.2812 +0.1875 0.6875 0.3125 +0.1875 0.6875 0.3438 +0.1875 0.6875 0.375 +0.1875 0.6875 0.4062 +0.1875 0.6875 0.4375 +0.1875 0.6875 0.4688 +0.1875 0.6875 0.5 +0.1875 0.6875 0.5312 +0.1875 0.6875 0.5625 +0.1875 0.6875 0.5938 +0.1875 0.6875 0.625 +0.1875 0.6875 0.6562 +0.1875 0.6875 0.6875 +0.1875 0.6875 0.7188 +0.1875 0.6875 0.75 +0.1875 0.6875 0.7812 +0.1875 0.6875 0.8125 +0.1875 0.6875 0.8438 +0.1875 0.6875 0.875 +0.1875 0.6875 0.9062 +0.1875 0.6875 0.9375 +0.1875 0.6875 0.9688 +0.1875 0.6875 1 +0.1875 0.7188 0 +0.1875 0.7188 0.03125 +0.1875 0.7188 0.0625 +0.1875 0.7188 0.09375 +0.1875 0.7188 0.125 +0.1875 0.7188 0.1562 +0.1875 0.7188 0.1875 +0.1875 0.7188 0.2188 +0.1875 0.7188 0.25 +0.1875 0.7188 0.2812 +0.1875 0.7188 0.3125 +0.1875 0.7188 0.3438 +0.1875 0.7188 0.375 +0.1875 0.7188 0.4062 +0.1875 0.7188 0.4375 +0.1875 0.7188 0.4688 +0.1875 0.7188 0.5 +0.1875 0.7188 0.5312 +0.1875 0.7188 0.5625 +0.1875 0.7188 0.5938 +0.1875 0.7188 0.625 +0.1875 0.7188 0.6562 +0.1875 0.7188 0.6875 +0.1875 0.7188 0.7188 +0.1875 0.7188 0.75 +0.1875 0.7188 0.7812 +0.1875 0.7188 0.8125 +0.1875 0.7188 0.8438 +0.1875 0.7188 0.875 +0.1875 0.7188 0.9062 +0.1875 0.7188 0.9375 +0.1875 0.7188 0.9688 +0.1875 0.7188 1 +0.1875 0.75 0 +0.1875 0.75 0.03125 +0.1875 0.75 0.0625 +0.1875 0.75 0.09375 +0.1875 0.75 0.125 +0.1875 0.75 0.1562 +0.1875 0.75 0.1875 +0.1875 0.75 0.2188 +0.1875 0.75 0.25 +0.1875 0.75 0.2812 +0.1875 0.75 0.3125 +0.1875 0.75 0.3438 +0.1875 0.75 0.375 +0.1875 0.75 0.4062 +0.1875 0.75 0.4375 +0.1875 0.75 0.4688 +0.1875 0.75 0.5 +0.1875 0.75 0.5312 +0.1875 0.75 0.5625 +0.1875 0.75 0.5938 +0.1875 0.75 0.625 +0.1875 0.75 0.6562 +0.1875 0.75 0.6875 +0.1875 0.75 0.7188 +0.1875 0.75 0.75 +0.1875 0.75 0.7812 +0.1875 0.75 0.8125 +0.1875 0.75 0.8438 +0.1875 0.75 0.875 +0.1875 0.75 0.9062 +0.1875 0.75 0.9375 +0.1875 0.75 0.9688 +0.1875 0.75 1 +0.1875 0.7812 0 +0.1875 0.7812 0.03125 +0.1875 0.7812 0.0625 +0.1875 0.7812 0.09375 +0.1875 0.7812 0.125 +0.1875 0.7812 0.1562 +0.1875 0.7812 0.1875 +0.1875 0.7812 0.2188 +0.1875 0.7812 0.25 +0.1875 0.7812 0.2812 +0.1875 0.7812 0.3125 +0.1875 0.7812 0.3438 +0.1875 0.7812 0.375 +0.1875 0.7812 0.4062 +0.1875 0.7812 0.4375 +0.1875 0.7812 0.4688 +0.1875 0.7812 0.5 +0.1875 0.7812 0.5312 +0.1875 0.7812 0.5625 +0.1875 0.7812 0.5938 +0.1875 0.7812 0.625 +0.1875 0.7812 0.6562 +0.1875 0.7812 0.6875 +0.1875 0.7812 0.7188 +0.1875 0.7812 0.75 +0.1875 0.7812 0.7812 +0.1875 0.7812 0.8125 +0.1875 0.7812 0.8438 +0.1875 0.7812 0.875 +0.1875 0.7812 0.9062 +0.1875 0.7812 0.9375 +0.1875 0.7812 0.9688 +0.1875 0.7812 1 +0.1875 0.8125 0 +0.1875 0.8125 0.03125 +0.1875 0.8125 0.0625 +0.1875 0.8125 0.09375 +0.1875 0.8125 0.125 +0.1875 0.8125 0.1562 +0.1875 0.8125 0.1875 +0.1875 0.8125 0.2188 +0.1875 0.8125 0.25 +0.1875 0.8125 0.2812 +0.1875 0.8125 0.3125 +0.1875 0.8125 0.3438 +0.1875 0.8125 0.375 +0.1875 0.8125 0.4062 +0.1875 0.8125 0.4375 +0.1875 0.8125 0.4688 +0.1875 0.8125 0.5 +0.1875 0.8125 0.5312 +0.1875 0.8125 0.5625 +0.1875 0.8125 0.5938 +0.1875 0.8125 0.625 +0.1875 0.8125 0.6562 +0.1875 0.8125 0.6875 +0.1875 0.8125 0.7188 +0.1875 0.8125 0.75 +0.1875 0.8125 0.7812 +0.1875 0.8125 0.8125 +0.1875 0.8125 0.8438 +0.1875 0.8125 0.875 +0.1875 0.8125 0.9062 +0.1875 0.8125 0.9375 +0.1875 0.8125 0.9688 +0.1875 0.8125 1 +0.1875 0.8438 0 +0.1875 0.8438 0.03125 +0.1875 0.8438 0.0625 +0.1875 0.8438 0.09375 +0.1875 0.8438 0.125 +0.1875 0.8438 0.1562 +0.1875 0.8438 0.1875 +0.1875 0.8438 0.2188 +0.1875 0.8438 0.25 +0.1875 0.8438 0.2812 +0.1875 0.8438 0.3125 +0.1875 0.8438 0.3438 +0.1875 0.8438 0.375 +0.1875 0.8438 0.4062 +0.1875 0.8438 0.4375 +0.1875 0.8438 0.4688 +0.1875 0.8438 0.5 +0.1875 0.8438 0.5312 +0.1875 0.8438 0.5625 +0.1875 0.8438 0.5938 +0.1875 0.8438 0.625 +0.1875 0.8438 0.6562 +0.1875 0.8438 0.6875 +0.1875 0.8438 0.7188 +0.1875 0.8438 0.75 +0.1875 0.8438 0.7812 +0.1875 0.8438 0.8125 +0.1875 0.8438 0.8438 +0.1875 0.8438 0.875 +0.1875 0.8438 0.9062 +0.1875 0.8438 0.9375 +0.1875 0.8438 0.9688 +0.1875 0.8438 1 +0.1875 0.875 0 +0.1875 0.875 0.03125 +0.1875 0.875 0.0625 +0.1875 0.875 0.09375 +0.1875 0.875 0.125 +0.1875 0.875 0.1562 +0.1875 0.875 0.1875 +0.1875 0.875 0.2188 +0.1875 0.875 0.25 +0.1875 0.875 0.2812 +0.1875 0.875 0.3125 +0.1875 0.875 0.3438 +0.1875 0.875 0.375 +0.1875 0.875 0.4062 +0.1875 0.875 0.4375 +0.1875 0.875 0.4688 +0.1875 0.875 0.5 +0.1875 0.875 0.5312 +0.1875 0.875 0.5625 +0.1875 0.875 0.5938 +0.1875 0.875 0.625 +0.1875 0.875 0.6562 +0.1875 0.875 0.6875 +0.1875 0.875 0.7188 +0.1875 0.875 0.75 +0.1875 0.875 0.7812 +0.1875 0.875 0.8125 +0.1875 0.875 0.8438 +0.1875 0.875 0.875 +0.1875 0.875 0.9062 +0.1875 0.875 0.9375 +0.1875 0.875 0.9688 +0.1875 0.875 1 +0.1875 0.9062 0 +0.1875 0.9062 0.03125 +0.1875 0.9062 0.0625 +0.1875 0.9062 0.09375 +0.1875 0.9062 0.125 +0.1875 0.9062 0.1562 +0.1875 0.9062 0.1875 +0.1875 0.9062 0.2188 +0.1875 0.9062 0.25 +0.1875 0.9062 0.2812 +0.1875 0.9062 0.3125 +0.1875 0.9062 0.3438 +0.1875 0.9062 0.375 +0.1875 0.9062 0.4062 +0.1875 0.9062 0.4375 +0.1875 0.9062 0.4688 +0.1875 0.9062 0.5 +0.1875 0.9062 0.5312 +0.1875 0.9062 0.5625 +0.1875 0.9062 0.5938 +0.1875 0.9062 0.625 +0.1875 0.9062 0.6562 +0.1875 0.9062 0.6875 +0.1875 0.9062 0.7188 +0.1875 0.9062 0.75 +0.1875 0.9062 0.7812 +0.1875 0.9062 0.8125 +0.1875 0.9062 0.8438 +0.1875 0.9062 0.875 +0.1875 0.9062 0.9062 +0.1875 0.9062 0.9375 +0.1875 0.9062 0.9688 +0.1875 0.9062 1 +0.1875 0.9375 0 +0.1875 0.9375 0.03125 +0.1875 0.9375 0.0625 +0.1875 0.9375 0.09375 +0.1875 0.9375 0.125 +0.1875 0.9375 0.1562 +0.1875 0.9375 0.1875 +0.1875 0.9375 0.2188 +0.1875 0.9375 0.25 +0.1875 0.9375 0.2812 +0.1875 0.9375 0.3125 +0.1875 0.9375 0.3438 +0.1875 0.9375 0.375 +0.1875 0.9375 0.4062 +0.1875 0.9375 0.4375 +0.1875 0.9375 0.4688 +0.1875 0.9375 0.5 +0.1875 0.9375 0.5312 +0.1875 0.9375 0.5625 +0.1875 0.9375 0.5938 +0.1875 0.9375 0.625 +0.1875 0.9375 0.6562 +0.1875 0.9375 0.6875 +0.1875 0.9375 0.7188 +0.1875 0.9375 0.75 +0.1875 0.9375 0.7812 +0.1875 0.9375 0.8125 +0.1875 0.9375 0.8438 +0.1875 0.9375 0.875 +0.1875 0.9375 0.9062 +0.1875 0.9375 0.9375 +0.1875 0.9375 0.9688 +0.1875 0.9375 1 +0.1875 0.9688 0 +0.1875 0.9688 0.03125 +0.1875 0.9688 0.0625 +0.1875 0.9688 0.09375 +0.1875 0.9688 0.125 +0.1875 0.9688 0.1562 +0.1875 0.9688 0.1875 +0.1875 0.9688 0.2188 +0.1875 0.9688 0.25 +0.1875 0.9688 0.2812 +0.1875 0.9688 0.3125 +0.1875 0.9688 0.3438 +0.1875 0.9688 0.375 +0.1875 0.9688 0.4062 +0.1875 0.9688 0.4375 +0.1875 0.9688 0.4688 +0.1875 0.9688 0.5 +0.1875 0.9688 0.5312 +0.1875 0.9688 0.5625 +0.1875 0.9688 0.5938 +0.1875 0.9688 0.625 +0.1875 0.9688 0.6562 +0.1875 0.9688 0.6875 +0.1875 0.9688 0.7188 +0.1875 0.9688 0.75 +0.1875 0.9688 0.7812 +0.1875 0.9688 0.8125 +0.1875 0.9688 0.8438 +0.1875 0.9688 0.875 +0.1875 0.9688 0.9062 +0.1875 0.9688 0.9375 +0.1875 0.9688 0.9688 +0.1875 0.9688 1 +0.1875 1 0 +0.1875 1 0.03125 +0.1875 1 0.0625 +0.1875 1 0.09375 +0.1875 1 0.125 +0.1875 1 0.1562 +0.1875 1 0.1875 +0.1875 1 0.2188 +0.1875 1 0.25 +0.1875 1 0.2812 +0.1875 1 0.3125 +0.1875 1 0.3438 +0.1875 1 0.375 +0.1875 1 0.4062 +0.1875 1 0.4375 +0.1875 1 0.4688 +0.1875 1 0.5 +0.1875 1 0.5312 +0.1875 1 0.5625 +0.1875 1 0.5938 +0.1875 1 0.625 +0.1875 1 0.6562 +0.1875 1 0.6875 +0.1875 1 0.7188 +0.1875 1 0.75 +0.1875 1 0.7812 +0.1875 1 0.8125 +0.1875 1 0.8438 +0.1875 1 0.875 +0.1875 1 0.9062 +0.1875 1 0.9375 +0.1875 1 0.9688 +0.1875 1 1 +0.2188 0 0 +0.2188 0 0.03125 +0.2188 0 0.0625 +0.2188 0 0.09375 +0.2188 0 0.125 +0.2188 0 0.1562 +0.2188 0 0.1875 +0.2188 0 0.2188 +0.2188 0 0.25 +0.2188 0 0.2812 +0.2188 0 0.3125 +0.2188 0 0.3438 +0.2188 0 0.375 +0.2188 0 0.4062 +0.2188 0 0.4375 +0.2188 0 0.4688 +0.2188 0 0.5 +0.2188 0 0.5312 +0.2188 0 0.5625 +0.2188 0 0.5938 +0.2188 0 0.625 +0.2188 0 0.6562 +0.2188 0 0.6875 +0.2188 0 0.7188 +0.2188 0 0.75 +0.2188 0 0.7812 +0.2188 0 0.8125 +0.2188 0 0.8438 +0.2188 0 0.875 +0.2188 0 0.9062 +0.2188 0 0.9375 +0.2188 0 0.9688 +0.2188 0 1 +0.2188 0.03125 0 +0.2188 0.03125 0.03125 +0.2188 0.03125 0.0625 +0.2188 0.03125 0.09375 +0.2188 0.03125 0.125 +0.2188 0.03125 0.1562 +0.2188 0.03125 0.1875 +0.2188 0.03125 0.2188 +0.2188 0.03125 0.25 +0.2188 0.03125 0.2812 +0.2188 0.03125 0.3125 +0.2188 0.03125 0.3438 +0.2188 0.03125 0.375 +0.2188 0.03125 0.4062 +0.2188 0.03125 0.4375 +0.2188 0.03125 0.4688 +0.2188 0.03125 0.5 +0.2188 0.03125 0.5312 +0.2188 0.03125 0.5625 +0.2188 0.03125 0.5938 +0.2188 0.03125 0.625 +0.2188 0.03125 0.6562 +0.2188 0.03125 0.6875 +0.2188 0.03125 0.7188 +0.2188 0.03125 0.75 +0.2188 0.03125 0.7812 +0.2188 0.03125 0.8125 +0.2188 0.03125 0.8438 +0.2188 0.03125 0.875 +0.2188 0.03125 0.9062 +0.2188 0.03125 0.9375 +0.2188 0.03125 0.9688 +0.2188 0.03125 1 +0.2188 0.0625 0 +0.2188 0.0625 0.03125 +0.2188 0.0625 0.0625 +0.2188 0.0625 0.09375 +0.2188 0.0625 0.125 +0.2188 0.0625 0.1562 +0.2188 0.0625 0.1875 +0.2188 0.0625 0.2188 +0.2188 0.0625 0.25 +0.2188 0.0625 0.2812 +0.2188 0.0625 0.3125 +0.2188 0.0625 0.3438 +0.2188 0.0625 0.375 +0.2188 0.0625 0.4062 +0.2188 0.0625 0.4375 +0.2188 0.0625 0.4688 +0.2188 0.0625 0.5 +0.2188 0.0625 0.5312 +0.2188 0.0625 0.5625 +0.2188 0.0625 0.5938 +0.2188 0.0625 0.625 +0.2188 0.0625 0.6562 +0.2188 0.0625 0.6875 +0.2188 0.0625 0.7188 +0.2188 0.0625 0.75 +0.2188 0.0625 0.7812 +0.2188 0.0625 0.8125 +0.2188 0.0625 0.8438 +0.2188 0.0625 0.875 +0.2188 0.0625 0.9062 +0.2188 0.0625 0.9375 +0.2188 0.0625 0.9688 +0.2188 0.0625 1 +0.2188 0.09375 0 +0.2188 0.09375 0.03125 +0.2188 0.09375 0.0625 +0.2188 0.09375 0.09375 +0.2188 0.09375 0.125 +0.2188 0.09375 0.1562 +0.2188 0.09375 0.1875 +0.2188 0.09375 0.2188 +0.2188 0.09375 0.25 +0.2188 0.09375 0.2812 +0.2188 0.09375 0.3125 +0.2188 0.09375 0.3438 +0.2188 0.09375 0.375 +0.2188 0.09375 0.4062 +0.2188 0.09375 0.4375 +0.2188 0.09375 0.4688 +0.2188 0.09375 0.5 +0.2188 0.09375 0.5312 +0.2188 0.09375 0.5625 +0.2188 0.09375 0.5938 +0.2188 0.09375 0.625 +0.2188 0.09375 0.6562 +0.2188 0.09375 0.6875 +0.2188 0.09375 0.7188 +0.2188 0.09375 0.75 +0.2188 0.09375 0.7812 +0.2188 0.09375 0.8125 +0.2188 0.09375 0.8438 +0.2188 0.09375 0.875 +0.2188 0.09375 0.9062 +0.2188 0.09375 0.9375 +0.2188 0.09375 0.9688 +0.2188 0.09375 1 +0.2188 0.125 0 +0.2188 0.125 0.03125 +0.2188 0.125 0.0625 +0.2188 0.125 0.09375 +0.2188 0.125 0.125 +0.2188 0.125 0.1562 +0.2188 0.125 0.1875 +0.2188 0.125 0.2188 +0.2188 0.125 0.25 +0.2188 0.125 0.2812 +0.2188 0.125 0.3125 +0.2188 0.125 0.3438 +0.2188 0.125 0.375 +0.2188 0.125 0.4062 +0.2188 0.125 0.4375 +0.2188 0.125 0.4688 +0.2188 0.125 0.5 +0.2188 0.125 0.5312 +0.2188 0.125 0.5625 +0.2188 0.125 0.5938 +0.2188 0.125 0.625 +0.2188 0.125 0.6562 +0.2188 0.125 0.6875 +0.2188 0.125 0.7188 +0.2188 0.125 0.75 +0.2188 0.125 0.7812 +0.2188 0.125 0.8125 +0.2188 0.125 0.8438 +0.2188 0.125 0.875 +0.2188 0.125 0.9062 +0.2188 0.125 0.9375 +0.2188 0.125 0.9688 +0.2188 0.125 1 +0.2188 0.1562 0 +0.2188 0.1562 0.03125 +0.2188 0.1562 0.0625 +0.2188 0.1562 0.09375 +0.2188 0.1562 0.125 +0.2188 0.1562 0.1562 +0.2188 0.1562 0.1875 +0.2188 0.1562 0.2188 +0.2188 0.1562 0.25 +0.2188 0.1562 0.2812 +0.2188 0.1562 0.3125 +0.2188 0.1562 0.3438 +0.2188 0.1562 0.375 +0.2188 0.1562 0.4062 +0.2188 0.1562 0.4375 +0.2188 0.1562 0.4688 +0.2188 0.1562 0.5 +0.2188 0.1562 0.5312 +0.2188 0.1562 0.5625 +0.2188 0.1562 0.5938 +0.2188 0.1562 0.625 +0.2188 0.1562 0.6562 +0.2188 0.1562 0.6875 +0.2188 0.1562 0.7188 +0.2188 0.1562 0.75 +0.2188 0.1562 0.7812 +0.2188 0.1562 0.8125 +0.2188 0.1562 0.8438 +0.2188 0.1562 0.875 +0.2188 0.1562 0.9062 +0.2188 0.1562 0.9375 +0.2188 0.1562 0.9688 +0.2188 0.1562 1 +0.2188 0.1875 0 +0.2188 0.1875 0.03125 +0.2188 0.1875 0.0625 +0.2188 0.1875 0.09375 +0.2188 0.1875 0.125 +0.2188 0.1875 0.1562 +0.2188 0.1875 0.1875 +0.2188 0.1875 0.2188 +0.2188 0.1875 0.25 +0.2188 0.1875 0.2812 +0.2188 0.1875 0.3125 +0.2188 0.1875 0.3438 +0.2188 0.1875 0.375 +0.2188 0.1875 0.4062 +0.2188 0.1875 0.4375 +0.2188 0.1875 0.4688 +0.2188 0.1875 0.5 +0.2188 0.1875 0.5312 +0.2188 0.1875 0.5625 +0.2188 0.1875 0.5938 +0.2188 0.1875 0.625 +0.2188 0.1875 0.6562 +0.2188 0.1875 0.6875 +0.2188 0.1875 0.7188 +0.2188 0.1875 0.75 +0.2188 0.1875 0.7812 +0.2188 0.1875 0.8125 +0.2188 0.1875 0.8438 +0.2188 0.1875 0.875 +0.2188 0.1875 0.9062 +0.2188 0.1875 0.9375 +0.2188 0.1875 0.9688 +0.2188 0.1875 1 +0.2188 0.2188 0 +0.2188 0.2188 0.03125 +0.2188 0.2188 0.0625 +0.2188 0.2188 0.09375 +0.2188 0.2188 0.125 +0.2188 0.2188 0.1562 +0.2188 0.2188 0.1875 +0.2188 0.2188 0.2188 +0.2188 0.2188 0.25 +0.2188 0.2188 0.2812 +0.2188 0.2188 0.3125 +0.2188 0.2188 0.3438 +0.2188 0.2188 0.375 +0.2188 0.2188 0.4062 +0.2188 0.2188 0.4375 +0.2188 0.2188 0.4688 +0.2188 0.2188 0.5 +0.2188 0.2188 0.5312 +0.2188 0.2188 0.5625 +0.2188 0.2188 0.5938 +0.2188 0.2188 0.625 +0.2188 0.2188 0.6562 +0.2188 0.2188 0.6875 +0.2188 0.2188 0.7188 +0.2188 0.2188 0.75 +0.2188 0.2188 0.7812 +0.2188 0.2188 0.8125 +0.2188 0.2188 0.8438 +0.2188 0.2188 0.875 +0.2188 0.2188 0.9062 +0.2188 0.2188 0.9375 +0.2188 0.2188 0.9688 +0.2188 0.2188 1 +0.2188 0.25 0 +0.2188 0.25 0.03125 +0.2188 0.25 0.0625 +0.2188 0.25 0.09375 +0.2188 0.25 0.125 +0.2188 0.25 0.1562 +0.2188 0.25 0.1875 +0.2188 0.25 0.2188 +0.2188 0.25 0.25 +0.2188 0.25 0.2812 +0.2188 0.25 0.3125 +0.2188 0.25 0.3438 +0.2188 0.25 0.375 +0.2188 0.25 0.4062 +0.2188 0.25 0.4375 +0.2188 0.25 0.4688 +0.2188 0.25 0.5 +0.2188 0.25 0.5312 +0.2188 0.25 0.5625 +0.2188 0.25 0.5938 +0.2188 0.25 0.625 +0.2188 0.25 0.6562 +0.2188 0.25 0.6875 +0.2188 0.25 0.7188 +0.2188 0.25 0.75 +0.2188 0.25 0.7812 +0.2188 0.25 0.8125 +0.2188 0.25 0.8438 +0.2188 0.25 0.875 +0.2188 0.25 0.9062 +0.2188 0.25 0.9375 +0.2188 0.25 0.9688 +0.2188 0.25 1 +0.2188 0.2812 0 +0.2188 0.2812 0.03125 +0.2188 0.2812 0.0625 +0.2188 0.2812 0.09375 +0.2188 0.2812 0.125 +0.2188 0.2812 0.1562 +0.2188 0.2812 0.1875 +0.2188 0.2812 0.2188 +0.2188 0.2812 0.25 +0.2188 0.2812 0.2812 +0.2188 0.2812 0.3125 +0.2188 0.2812 0.3438 +0.2188 0.2812 0.375 +0.2188 0.2812 0.4062 +0.2188 0.2812 0.4375 +0.2188 0.2812 0.4688 +0.2188 0.2812 0.5 +0.2188 0.2812 0.5312 +0.2188 0.2812 0.5625 +0.2188 0.2812 0.5938 +0.2188 0.2812 0.625 +0.2188 0.2812 0.6562 +0.2188 0.2812 0.6875 +0.2188 0.2812 0.7188 +0.2188 0.2812 0.75 +0.2188 0.2812 0.7812 +0.2188 0.2812 0.8125 +0.2188 0.2812 0.8438 +0.2188 0.2812 0.875 +0.2188 0.2812 0.9062 +0.2188 0.2812 0.9375 +0.2188 0.2812 0.9688 +0.2188 0.2812 1 +0.2188 0.3125 0 +0.2188 0.3125 0.03125 +0.2188 0.3125 0.0625 +0.2188 0.3125 0.09375 +0.2188 0.3125 0.125 +0.2188 0.3125 0.1562 +0.2188 0.3125 0.1875 +0.2188 0.3125 0.2188 +0.2188 0.3125 0.25 +0.2188 0.3125 0.2812 +0.2188 0.3125 0.3125 +0.2188 0.3125 0.3438 +0.2188 0.3125 0.375 +0.2188 0.3125 0.4062 +0.2188 0.3125 0.4375 +0.2188 0.3125 0.4688 +0.2188 0.3125 0.5 +0.2188 0.3125 0.5312 +0.2188 0.3125 0.5625 +0.2188 0.3125 0.5938 +0.2188 0.3125 0.625 +0.2188 0.3125 0.6562 +0.2188 0.3125 0.6875 +0.2188 0.3125 0.7188 +0.2188 0.3125 0.75 +0.2188 0.3125 0.7812 +0.2188 0.3125 0.8125 +0.2188 0.3125 0.8438 +0.2188 0.3125 0.875 +0.2188 0.3125 0.9062 +0.2188 0.3125 0.9375 +0.2188 0.3125 0.9688 +0.2188 0.3125 1 +0.2188 0.3438 0 +0.2188 0.3438 0.03125 +0.2188 0.3438 0.0625 +0.2188 0.3438 0.09375 +0.2188 0.3438 0.125 +0.2188 0.3438 0.1562 +0.2188 0.3438 0.1875 +0.2188 0.3438 0.2188 +0.2188 0.3438 0.25 +0.2188 0.3438 0.2812 +0.2188 0.3438 0.3125 +0.2188 0.3438 0.3438 +0.2188 0.3438 0.375 +0.2188 0.3438 0.4062 +0.2188 0.3438 0.4375 +0.2188 0.3438 0.4688 +0.2188 0.3438 0.5 +0.2188 0.3438 0.5312 +0.2188 0.3438 0.5625 +0.2188 0.3438 0.5938 +0.2188 0.3438 0.625 +0.2188 0.3438 0.6562 +0.2188 0.3438 0.6875 +0.2188 0.3438 0.7188 +0.2188 0.3438 0.75 +0.2188 0.3438 0.7812 +0.2188 0.3438 0.8125 +0.2188 0.3438 0.8438 +0.2188 0.3438 0.875 +0.2188 0.3438 0.9062 +0.2188 0.3438 0.9375 +0.2188 0.3438 0.9688 +0.2188 0.3438 1 +0.2188 0.375 0 +0.2188 0.375 0.03125 +0.2188 0.375 0.0625 +0.2188 0.375 0.09375 +0.2188 0.375 0.125 +0.2188 0.375 0.1562 +0.2188 0.375 0.1875 +0.2188 0.375 0.2188 +0.2188 0.375 0.25 +0.2188 0.375 0.2812 +0.2188 0.375 0.3125 +0.2188 0.375 0.3438 +0.2188 0.375 0.375 +0.2188 0.375 0.4062 +0.2188 0.375 0.4375 +0.2188 0.375 0.4688 +0.2188 0.375 0.5 +0.2188 0.375 0.5312 +0.2188 0.375 0.5625 +0.2188 0.375 0.5938 +0.2188 0.375 0.625 +0.2188 0.375 0.6562 +0.2188 0.375 0.6875 +0.2188 0.375 0.7188 +0.2188 0.375 0.75 +0.2188 0.375 0.7812 +0.2188 0.375 0.8125 +0.2188 0.375 0.8438 +0.2188 0.375 0.875 +0.2188 0.375 0.9062 +0.2188 0.375 0.9375 +0.2188 0.375 0.9688 +0.2188 0.375 1 +0.2188 0.4062 0 +0.2188 0.4062 0.03125 +0.2188 0.4062 0.0625 +0.2188 0.4062 0.09375 +0.2188 0.4062 0.125 +0.2188 0.4062 0.1562 +0.2188 0.4062 0.1875 +0.2188 0.4062 0.2188 +0.2188 0.4062 0.25 +0.2188 0.4062 0.2812 +0.2188 0.4062 0.3125 +0.2188 0.4062 0.3438 +0.2188 0.4062 0.375 +0.2188 0.4062 0.4062 +0.2188 0.4062 0.4375 +0.2188 0.4062 0.4688 +0.2188 0.4062 0.5 +0.2188 0.4062 0.5312 +0.2188 0.4062 0.5625 +0.2188 0.4062 0.5938 +0.2188 0.4062 0.625 +0.2188 0.4062 0.6562 +0.2188 0.4062 0.6875 +0.2188 0.4062 0.7188 +0.2188 0.4062 0.75 +0.2188 0.4062 0.7812 +0.2188 0.4062 0.8125 +0.2188 0.4062 0.8438 +0.2188 0.4062 0.875 +0.2188 0.4062 0.9062 +0.2188 0.4062 0.9375 +0.2188 0.4062 0.9688 +0.2188 0.4062 1 +0.2188 0.4375 0 +0.2188 0.4375 0.03125 +0.2188 0.4375 0.0625 +0.2188 0.4375 0.09375 +0.2188 0.4375 0.125 +0.2188 0.4375 0.1562 +0.2188 0.4375 0.1875 +0.2188 0.4375 0.2188 +0.2188 0.4375 0.25 +0.2188 0.4375 0.2812 +0.2188 0.4375 0.3125 +0.2188 0.4375 0.3438 +0.2188 0.4375 0.375 +0.2188 0.4375 0.4062 +0.2188 0.4375 0.4375 +0.2188 0.4375 0.4688 +0.2188 0.4375 0.5 +0.2188 0.4375 0.5312 +0.2188 0.4375 0.5625 +0.2188 0.4375 0.5938 +0.2188 0.4375 0.625 +0.2188 0.4375 0.6562 +0.2188 0.4375 0.6875 +0.2188 0.4375 0.7188 +0.2188 0.4375 0.75 +0.2188 0.4375 0.7812 +0.2188 0.4375 0.8125 +0.2188 0.4375 0.8438 +0.2188 0.4375 0.875 +0.2188 0.4375 0.9062 +0.2188 0.4375 0.9375 +0.2188 0.4375 0.9688 +0.2188 0.4375 1 +0.2188 0.4688 0 +0.2188 0.4688 0.03125 +0.2188 0.4688 0.0625 +0.2188 0.4688 0.09375 +0.2188 0.4688 0.125 +0.2188 0.4688 0.1562 +0.2188 0.4688 0.1875 +0.2188 0.4688 0.2188 +0.2188 0.4688 0.25 +0.2188 0.4688 0.2812 +0.2188 0.4688 0.3125 +0.2188 0.4688 0.3438 +0.2188 0.4688 0.375 +0.2188 0.4688 0.4062 +0.2188 0.4688 0.4375 +0.2188 0.4688 0.4688 +0.2188 0.4688 0.5 +0.2188 0.4688 0.5312 +0.2188 0.4688 0.5625 +0.2188 0.4688 0.5938 +0.2188 0.4688 0.625 +0.2188 0.4688 0.6562 +0.2188 0.4688 0.6875 +0.2188 0.4688 0.7188 +0.2188 0.4688 0.75 +0.2188 0.4688 0.7812 +0.2188 0.4688 0.8125 +0.2188 0.4688 0.8438 +0.2188 0.4688 0.875 +0.2188 0.4688 0.9062 +0.2188 0.4688 0.9375 +0.2188 0.4688 0.9688 +0.2188 0.4688 1 +0.2188 0.5 0 +0.2188 0.5 0.03125 +0.2188 0.5 0.0625 +0.2188 0.5 0.09375 +0.2188 0.5 0.125 +0.2188 0.5 0.1562 +0.2188 0.5 0.1875 +0.2188 0.5 0.2188 +0.2188 0.5 0.25 +0.2188 0.5 0.2812 +0.2188 0.5 0.3125 +0.2188 0.5 0.3438 +0.2188 0.5 0.375 +0.2188 0.5 0.4062 +0.2188 0.5 0.4375 +0.2188 0.5 0.4688 +0.2188 0.5 0.5 +0.2188 0.5 0.5312 +0.2188 0.5 0.5625 +0.2188 0.5 0.5938 +0.2188 0.5 0.625 +0.2188 0.5 0.6562 +0.2188 0.5 0.6875 +0.2188 0.5 0.7188 +0.2188 0.5 0.75 +0.2188 0.5 0.7812 +0.2188 0.5 0.8125 +0.2188 0.5 0.8438 +0.2188 0.5 0.875 +0.2188 0.5 0.9062 +0.2188 0.5 0.9375 +0.2188 0.5 0.9688 +0.2188 0.5 1 +0.2188 0.5312 0 +0.2188 0.5312 0.03125 +0.2188 0.5312 0.0625 +0.2188 0.5312 0.09375 +0.2188 0.5312 0.125 +0.2188 0.5312 0.1562 +0.2188 0.5312 0.1875 +0.2188 0.5312 0.2188 +0.2188 0.5312 0.25 +0.2188 0.5312 0.2812 +0.2188 0.5312 0.3125 +0.2188 0.5312 0.3438 +0.2188 0.5312 0.375 +0.2188 0.5312 0.4062 +0.2188 0.5312 0.4375 +0.2188 0.5312 0.4688 +0.2188 0.5312 0.5 +0.2188 0.5312 0.5312 +0.2188 0.5312 0.5625 +0.2188 0.5312 0.5938 +0.2188 0.5312 0.625 +0.2188 0.5312 0.6562 +0.2188 0.5312 0.6875 +0.2188 0.5312 0.7188 +0.2188 0.5312 0.75 +0.2188 0.5312 0.7812 +0.2188 0.5312 0.8125 +0.2188 0.5312 0.8438 +0.2188 0.5312 0.875 +0.2188 0.5312 0.9062 +0.2188 0.5312 0.9375 +0.2188 0.5312 0.9688 +0.2188 0.5312 1 +0.2188 0.5625 0 +0.2188 0.5625 0.03125 +0.2188 0.5625 0.0625 +0.2188 0.5625 0.09375 +0.2188 0.5625 0.125 +0.2188 0.5625 0.1562 +0.2188 0.5625 0.1875 +0.2188 0.5625 0.2188 +0.2188 0.5625 0.25 +0.2188 0.5625 0.2812 +0.2188 0.5625 0.3125 +0.2188 0.5625 0.3438 +0.2188 0.5625 0.375 +0.2188 0.5625 0.4062 +0.2188 0.5625 0.4375 +0.2188 0.5625 0.4688 +0.2188 0.5625 0.5 +0.2188 0.5625 0.5312 +0.2188 0.5625 0.5625 +0.2188 0.5625 0.5938 +0.2188 0.5625 0.625 +0.2188 0.5625 0.6562 +0.2188 0.5625 0.6875 +0.2188 0.5625 0.7188 +0.2188 0.5625 0.75 +0.2188 0.5625 0.7812 +0.2188 0.5625 0.8125 +0.2188 0.5625 0.8438 +0.2188 0.5625 0.875 +0.2188 0.5625 0.9062 +0.2188 0.5625 0.9375 +0.2188 0.5625 0.9688 +0.2188 0.5625 1 +0.2188 0.5938 0 +0.2188 0.5938 0.03125 +0.2188 0.5938 0.0625 +0.2188 0.5938 0.09375 +0.2188 0.5938 0.125 +0.2188 0.5938 0.1562 +0.2188 0.5938 0.1875 +0.2188 0.5938 0.2188 +0.2188 0.5938 0.25 +0.2188 0.5938 0.2812 +0.2188 0.5938 0.3125 +0.2188 0.5938 0.3438 +0.2188 0.5938 0.375 +0.2188 0.5938 0.4062 +0.2188 0.5938 0.4375 +0.2188 0.5938 0.4688 +0.2188 0.5938 0.5 +0.2188 0.5938 0.5312 +0.2188 0.5938 0.5625 +0.2188 0.5938 0.5938 +0.2188 0.5938 0.625 +0.2188 0.5938 0.6562 +0.2188 0.5938 0.6875 +0.2188 0.5938 0.7188 +0.2188 0.5938 0.75 +0.2188 0.5938 0.7812 +0.2188 0.5938 0.8125 +0.2188 0.5938 0.8438 +0.2188 0.5938 0.875 +0.2188 0.5938 0.9062 +0.2188 0.5938 0.9375 +0.2188 0.5938 0.9688 +0.2188 0.5938 1 +0.2188 0.625 0 +0.2188 0.625 0.03125 +0.2188 0.625 0.0625 +0.2188 0.625 0.09375 +0.2188 0.625 0.125 +0.2188 0.625 0.1562 +0.2188 0.625 0.1875 +0.2188 0.625 0.2188 +0.2188 0.625 0.25 +0.2188 0.625 0.2812 +0.2188 0.625 0.3125 +0.2188 0.625 0.3438 +0.2188 0.625 0.375 +0.2188 0.625 0.4062 +0.2188 0.625 0.4375 +0.2188 0.625 0.4688 +0.2188 0.625 0.5 +0.2188 0.625 0.5312 +0.2188 0.625 0.5625 +0.2188 0.625 0.5938 +0.2188 0.625 0.625 +0.2188 0.625 0.6562 +0.2188 0.625 0.6875 +0.2188 0.625 0.7188 +0.2188 0.625 0.75 +0.2188 0.625 0.7812 +0.2188 0.625 0.8125 +0.2188 0.625 0.8438 +0.2188 0.625 0.875 +0.2188 0.625 0.9062 +0.2188 0.625 0.9375 +0.2188 0.625 0.9688 +0.2188 0.625 1 +0.2188 0.6562 0 +0.2188 0.6562 0.03125 +0.2188 0.6562 0.0625 +0.2188 0.6562 0.09375 +0.2188 0.6562 0.125 +0.2188 0.6562 0.1562 +0.2188 0.6562 0.1875 +0.2188 0.6562 0.2188 +0.2188 0.6562 0.25 +0.2188 0.6562 0.2812 +0.2188 0.6562 0.3125 +0.2188 0.6562 0.3438 +0.2188 0.6562 0.375 +0.2188 0.6562 0.4062 +0.2188 0.6562 0.4375 +0.2188 0.6562 0.4688 +0.2188 0.6562 0.5 +0.2188 0.6562 0.5312 +0.2188 0.6562 0.5625 +0.2188 0.6562 0.5938 +0.2188 0.6562 0.625 +0.2188 0.6562 0.6562 +0.2188 0.6562 0.6875 +0.2188 0.6562 0.7188 +0.2188 0.6562 0.75 +0.2188 0.6562 0.7812 +0.2188 0.6562 0.8125 +0.2188 0.6562 0.8438 +0.2188 0.6562 0.875 +0.2188 0.6562 0.9062 +0.2188 0.6562 0.9375 +0.2188 0.6562 0.9688 +0.2188 0.6562 1 +0.2188 0.6875 0 +0.2188 0.6875 0.03125 +0.2188 0.6875 0.0625 +0.2188 0.6875 0.09375 +0.2188 0.6875 0.125 +0.2188 0.6875 0.1562 +0.2188 0.6875 0.1875 +0.2188 0.6875 0.2188 +0.2188 0.6875 0.25 +0.2188 0.6875 0.2812 +0.2188 0.6875 0.3125 +0.2188 0.6875 0.3438 +0.2188 0.6875 0.375 +0.2188 0.6875 0.4062 +0.2188 0.6875 0.4375 +0.2188 0.6875 0.4688 +0.2188 0.6875 0.5 +0.2188 0.6875 0.5312 +0.2188 0.6875 0.5625 +0.2188 0.6875 0.5938 +0.2188 0.6875 0.625 +0.2188 0.6875 0.6562 +0.2188 0.6875 0.6875 +0.2188 0.6875 0.7188 +0.2188 0.6875 0.75 +0.2188 0.6875 0.7812 +0.2188 0.6875 0.8125 +0.2188 0.6875 0.8438 +0.2188 0.6875 0.875 +0.2188 0.6875 0.9062 +0.2188 0.6875 0.9375 +0.2188 0.6875 0.9688 +0.2188 0.6875 1 +0.2188 0.7188 0 +0.2188 0.7188 0.03125 +0.2188 0.7188 0.0625 +0.2188 0.7188 0.09375 +0.2188 0.7188 0.125 +0.2188 0.7188 0.1562 +0.2188 0.7188 0.1875 +0.2188 0.7188 0.2188 +0.2188 0.7188 0.25 +0.2188 0.7188 0.2812 +0.2188 0.7188 0.3125 +0.2188 0.7188 0.3438 +0.2188 0.7188 0.375 +0.2188 0.7188 0.4062 +0.2188 0.7188 0.4375 +0.2188 0.7188 0.4688 +0.2188 0.7188 0.5 +0.2188 0.7188 0.5312 +0.2188 0.7188 0.5625 +0.2188 0.7188 0.5938 +0.2188 0.7188 0.625 +0.2188 0.7188 0.6562 +0.2188 0.7188 0.6875 +0.2188 0.7188 0.7188 +0.2188 0.7188 0.75 +0.2188 0.7188 0.7812 +0.2188 0.7188 0.8125 +0.2188 0.7188 0.8438 +0.2188 0.7188 0.875 +0.2188 0.7188 0.9062 +0.2188 0.7188 0.9375 +0.2188 0.7188 0.9688 +0.2188 0.7188 1 +0.2188 0.75 0 +0.2188 0.75 0.03125 +0.2188 0.75 0.0625 +0.2188 0.75 0.09375 +0.2188 0.75 0.125 +0.2188 0.75 0.1562 +0.2188 0.75 0.1875 +0.2188 0.75 0.2188 +0.2188 0.75 0.25 +0.2188 0.75 0.2812 +0.2188 0.75 0.3125 +0.2188 0.75 0.3438 +0.2188 0.75 0.375 +0.2188 0.75 0.4062 +0.2188 0.75 0.4375 +0.2188 0.75 0.4688 +0.2188 0.75 0.5 +0.2188 0.75 0.5312 +0.2188 0.75 0.5625 +0.2188 0.75 0.5938 +0.2188 0.75 0.625 +0.2188 0.75 0.6562 +0.2188 0.75 0.6875 +0.2188 0.75 0.7188 +0.2188 0.75 0.75 +0.2188 0.75 0.7812 +0.2188 0.75 0.8125 +0.2188 0.75 0.8438 +0.2188 0.75 0.875 +0.2188 0.75 0.9062 +0.2188 0.75 0.9375 +0.2188 0.75 0.9688 +0.2188 0.75 1 +0.2188 0.7812 0 +0.2188 0.7812 0.03125 +0.2188 0.7812 0.0625 +0.2188 0.7812 0.09375 +0.2188 0.7812 0.125 +0.2188 0.7812 0.1562 +0.2188 0.7812 0.1875 +0.2188 0.7812 0.2188 +0.2188 0.7812 0.25 +0.2188 0.7812 0.2812 +0.2188 0.7812 0.3125 +0.2188 0.7812 0.3438 +0.2188 0.7812 0.375 +0.2188 0.7812 0.4062 +0.2188 0.7812 0.4375 +0.2188 0.7812 0.4688 +0.2188 0.7812 0.5 +0.2188 0.7812 0.5312 +0.2188 0.7812 0.5625 +0.2188 0.7812 0.5938 +0.2188 0.7812 0.625 +0.2188 0.7812 0.6562 +0.2188 0.7812 0.6875 +0.2188 0.7812 0.7188 +0.2188 0.7812 0.75 +0.2188 0.7812 0.7812 +0.2188 0.7812 0.8125 +0.2188 0.7812 0.8438 +0.2188 0.7812 0.875 +0.2188 0.7812 0.9062 +0.2188 0.7812 0.9375 +0.2188 0.7812 0.9688 +0.2188 0.7812 1 +0.2188 0.8125 0 +0.2188 0.8125 0.03125 +0.2188 0.8125 0.0625 +0.2188 0.8125 0.09375 +0.2188 0.8125 0.125 +0.2188 0.8125 0.1562 +0.2188 0.8125 0.1875 +0.2188 0.8125 0.2188 +0.2188 0.8125 0.25 +0.2188 0.8125 0.2812 +0.2188 0.8125 0.3125 +0.2188 0.8125 0.3438 +0.2188 0.8125 0.375 +0.2188 0.8125 0.4062 +0.2188 0.8125 0.4375 +0.2188 0.8125 0.4688 +0.2188 0.8125 0.5 +0.2188 0.8125 0.5312 +0.2188 0.8125 0.5625 +0.2188 0.8125 0.5938 +0.2188 0.8125 0.625 +0.2188 0.8125 0.6562 +0.2188 0.8125 0.6875 +0.2188 0.8125 0.7188 +0.2188 0.8125 0.75 +0.2188 0.8125 0.7812 +0.2188 0.8125 0.8125 +0.2188 0.8125 0.8438 +0.2188 0.8125 0.875 +0.2188 0.8125 0.9062 +0.2188 0.8125 0.9375 +0.2188 0.8125 0.9688 +0.2188 0.8125 1 +0.2188 0.8438 0 +0.2188 0.8438 0.03125 +0.2188 0.8438 0.0625 +0.2188 0.8438 0.09375 +0.2188 0.8438 0.125 +0.2188 0.8438 0.1562 +0.2188 0.8438 0.1875 +0.2188 0.8438 0.2188 +0.2188 0.8438 0.25 +0.2188 0.8438 0.2812 +0.2188 0.8438 0.3125 +0.2188 0.8438 0.3438 +0.2188 0.8438 0.375 +0.2188 0.8438 0.4062 +0.2188 0.8438 0.4375 +0.2188 0.8438 0.4688 +0.2188 0.8438 0.5 +0.2188 0.8438 0.5312 +0.2188 0.8438 0.5625 +0.2188 0.8438 0.5938 +0.2188 0.8438 0.625 +0.2188 0.8438 0.6562 +0.2188 0.8438 0.6875 +0.2188 0.8438 0.7188 +0.2188 0.8438 0.75 +0.2188 0.8438 0.7812 +0.2188 0.8438 0.8125 +0.2188 0.8438 0.8438 +0.2188 0.8438 0.875 +0.2188 0.8438 0.9062 +0.2188 0.8438 0.9375 +0.2188 0.8438 0.9688 +0.2188 0.8438 1 +0.2188 0.875 0 +0.2188 0.875 0.03125 +0.2188 0.875 0.0625 +0.2188 0.875 0.09375 +0.2188 0.875 0.125 +0.2188 0.875 0.1562 +0.2188 0.875 0.1875 +0.2188 0.875 0.2188 +0.2188 0.875 0.25 +0.2188 0.875 0.2812 +0.2188 0.875 0.3125 +0.2188 0.875 0.3438 +0.2188 0.875 0.375 +0.2188 0.875 0.4062 +0.2188 0.875 0.4375 +0.2188 0.875 0.4688 +0.2188 0.875 0.5 +0.2188 0.875 0.5312 +0.2188 0.875 0.5625 +0.2188 0.875 0.5938 +0.2188 0.875 0.625 +0.2188 0.875 0.6562 +0.2188 0.875 0.6875 +0.2188 0.875 0.7188 +0.2188 0.875 0.75 +0.2188 0.875 0.7812 +0.2188 0.875 0.8125 +0.2188 0.875 0.8438 +0.2188 0.875 0.875 +0.2188 0.875 0.9062 +0.2188 0.875 0.9375 +0.2188 0.875 0.9688 +0.2188 0.875 1 +0.2188 0.9062 0 +0.2188 0.9062 0.03125 +0.2188 0.9062 0.0625 +0.2188 0.9062 0.09375 +0.2188 0.9062 0.125 +0.2188 0.9062 0.1562 +0.2188 0.9062 0.1875 +0.2188 0.9062 0.2188 +0.2188 0.9062 0.25 +0.2188 0.9062 0.2812 +0.2188 0.9062 0.3125 +0.2188 0.9062 0.3438 +0.2188 0.9062 0.375 +0.2188 0.9062 0.4062 +0.2188 0.9062 0.4375 +0.2188 0.9062 0.4688 +0.2188 0.9062 0.5 +0.2188 0.9062 0.5312 +0.2188 0.9062 0.5625 +0.2188 0.9062 0.5938 +0.2188 0.9062 0.625 +0.2188 0.9062 0.6562 +0.2188 0.9062 0.6875 +0.2188 0.9062 0.7188 +0.2188 0.9062 0.75 +0.2188 0.9062 0.7812 +0.2188 0.9062 0.8125 +0.2188 0.9062 0.8438 +0.2188 0.9062 0.875 +0.2188 0.9062 0.9062 +0.2188 0.9062 0.9375 +0.2188 0.9062 0.9688 +0.2188 0.9062 1 +0.2188 0.9375 0 +0.2188 0.9375 0.03125 +0.2188 0.9375 0.0625 +0.2188 0.9375 0.09375 +0.2188 0.9375 0.125 +0.2188 0.9375 0.1562 +0.2188 0.9375 0.1875 +0.2188 0.9375 0.2188 +0.2188 0.9375 0.25 +0.2188 0.9375 0.2812 +0.2188 0.9375 0.3125 +0.2188 0.9375 0.3438 +0.2188 0.9375 0.375 +0.2188 0.9375 0.4062 +0.2188 0.9375 0.4375 +0.2188 0.9375 0.4688 +0.2188 0.9375 0.5 +0.2188 0.9375 0.5312 +0.2188 0.9375 0.5625 +0.2188 0.9375 0.5938 +0.2188 0.9375 0.625 +0.2188 0.9375 0.6562 +0.2188 0.9375 0.6875 +0.2188 0.9375 0.7188 +0.2188 0.9375 0.75 +0.2188 0.9375 0.7812 +0.2188 0.9375 0.8125 +0.2188 0.9375 0.8438 +0.2188 0.9375 0.875 +0.2188 0.9375 0.9062 +0.2188 0.9375 0.9375 +0.2188 0.9375 0.9688 +0.2188 0.9375 1 +0.2188 0.9688 0 +0.2188 0.9688 0.03125 +0.2188 0.9688 0.0625 +0.2188 0.9688 0.09375 +0.2188 0.9688 0.125 +0.2188 0.9688 0.1562 +0.2188 0.9688 0.1875 +0.2188 0.9688 0.2188 +0.2188 0.9688 0.25 +0.2188 0.9688 0.2812 +0.2188 0.9688 0.3125 +0.2188 0.9688 0.3438 +0.2188 0.9688 0.375 +0.2188 0.9688 0.4062 +0.2188 0.9688 0.4375 +0.2188 0.9688 0.4688 +0.2188 0.9688 0.5 +0.2188 0.9688 0.5312 +0.2188 0.9688 0.5625 +0.2188 0.9688 0.5938 +0.2188 0.9688 0.625 +0.2188 0.9688 0.6562 +0.2188 0.9688 0.6875 +0.2188 0.9688 0.7188 +0.2188 0.9688 0.75 +0.2188 0.9688 0.7812 +0.2188 0.9688 0.8125 +0.2188 0.9688 0.8438 +0.2188 0.9688 0.875 +0.2188 0.9688 0.9062 +0.2188 0.9688 0.9375 +0.2188 0.9688 0.9688 +0.2188 0.9688 1 +0.2188 1 0 +0.2188 1 0.03125 +0.2188 1 0.0625 +0.2188 1 0.09375 +0.2188 1 0.125 +0.2188 1 0.1562 +0.2188 1 0.1875 +0.2188 1 0.2188 +0.2188 1 0.25 +0.2188 1 0.2812 +0.2188 1 0.3125 +0.2188 1 0.3438 +0.2188 1 0.375 +0.2188 1 0.4062 +0.2188 1 0.4375 +0.2188 1 0.4688 +0.2188 1 0.5 +0.2188 1 0.5312 +0.2188 1 0.5625 +0.2188 1 0.5938 +0.2188 1 0.625 +0.2188 1 0.6562 +0.2188 1 0.6875 +0.2188 1 0.7188 +0.2188 1 0.75 +0.2188 1 0.7812 +0.2188 1 0.8125 +0.2188 1 0.8438 +0.2188 1 0.875 +0.2188 1 0.9062 +0.2188 1 0.9375 +0.2188 1 0.9688 +0.2188 1 1 +0.25 0 0 +0.25 0 0.03125 +0.25 0 0.0625 +0.25 0 0.09375 +0.25 0 0.125 +0.25 0 0.1562 +0.25 0 0.1875 +0.25 0 0.2188 +0.25 0 0.25 +0.25 0 0.2812 +0.25 0 0.3125 +0.25 0 0.3438 +0.25 0 0.375 +0.25 0 0.4062 +0.25 0 0.4375 +0.25 0 0.4688 +0.25 0 0.5 +0.25 0 0.5312 +0.25 0 0.5625 +0.25 0 0.5938 +0.25 0 0.625 +0.25 0 0.6562 +0.25 0 0.6875 +0.25 0 0.7188 +0.25 0 0.75 +0.25 0 0.7812 +0.25 0 0.8125 +0.25 0 0.8438 +0.25 0 0.875 +0.25 0 0.9062 +0.25 0 0.9375 +0.25 0 0.9688 +0.25 0 1 +0.25 0.03125 0 +0.25 0.03125 0.03125 +0.25 0.03125 0.0625 +0.25 0.03125 0.09375 +0.25 0.03125 0.125 +0.25 0.03125 0.1562 +0.25 0.03125 0.1875 +0.25 0.03125 0.2188 +0.25 0.03125 0.25 +0.25 0.03125 0.2812 +0.25 0.03125 0.3125 +0.25 0.03125 0.3438 +0.25 0.03125 0.375 +0.25 0.03125 0.4062 +0.25 0.03125 0.4375 +0.25 0.03125 0.4688 +0.25 0.03125 0.5 +0.25 0.03125 0.5312 +0.25 0.03125 0.5625 +0.25 0.03125 0.5938 +0.25 0.03125 0.625 +0.25 0.03125 0.6562 +0.25 0.03125 0.6875 +0.25 0.03125 0.7188 +0.25 0.03125 0.75 +0.25 0.03125 0.7812 +0.25 0.03125 0.8125 +0.25 0.03125 0.8438 +0.25 0.03125 0.875 +0.25 0.03125 0.9062 +0.25 0.03125 0.9375 +0.25 0.03125 0.9688 +0.25 0.03125 1 +0.25 0.0625 0 +0.25 0.0625 0.03125 +0.25 0.0625 0.0625 +0.25 0.0625 0.09375 +0.25 0.0625 0.125 +0.25 0.0625 0.1562 +0.25 0.0625 0.1875 +0.25 0.0625 0.2188 +0.25 0.0625 0.25 +0.25 0.0625 0.2812 +0.25 0.0625 0.3125 +0.25 0.0625 0.3438 +0.25 0.0625 0.375 +0.25 0.0625 0.4062 +0.25 0.0625 0.4375 +0.25 0.0625 0.4688 +0.25 0.0625 0.5 +0.25 0.0625 0.5312 +0.25 0.0625 0.5625 +0.25 0.0625 0.5938 +0.25 0.0625 0.625 +0.25 0.0625 0.6562 +0.25 0.0625 0.6875 +0.25 0.0625 0.7188 +0.25 0.0625 0.75 +0.25 0.0625 0.7812 +0.25 0.0625 0.8125 +0.25 0.0625 0.8438 +0.25 0.0625 0.875 +0.25 0.0625 0.9062 +0.25 0.0625 0.9375 +0.25 0.0625 0.9688 +0.25 0.0625 1 +0.25 0.09375 0 +0.25 0.09375 0.03125 +0.25 0.09375 0.0625 +0.25 0.09375 0.09375 +0.25 0.09375 0.125 +0.25 0.09375 0.1562 +0.25 0.09375 0.1875 +0.25 0.09375 0.2188 +0.25 0.09375 0.25 +0.25 0.09375 0.2812 +0.25 0.09375 0.3125 +0.25 0.09375 0.3438 +0.25 0.09375 0.375 +0.25 0.09375 0.4062 +0.25 0.09375 0.4375 +0.25 0.09375 0.4688 +0.25 0.09375 0.5 +0.25 0.09375 0.5312 +0.25 0.09375 0.5625 +0.25 0.09375 0.5938 +0.25 0.09375 0.625 +0.25 0.09375 0.6562 +0.25 0.09375 0.6875 +0.25 0.09375 0.7188 +0.25 0.09375 0.75 +0.25 0.09375 0.7812 +0.25 0.09375 0.8125 +0.25 0.09375 0.8438 +0.25 0.09375 0.875 +0.25 0.09375 0.9062 +0.25 0.09375 0.9375 +0.25 0.09375 0.9688 +0.25 0.09375 1 +0.25 0.125 0 +0.25 0.125 0.03125 +0.25 0.125 0.0625 +0.25 0.125 0.09375 +0.25 0.125 0.125 +0.25 0.125 0.1562 +0.25 0.125 0.1875 +0.25 0.125 0.2188 +0.25 0.125 0.25 +0.25 0.125 0.2812 +0.25 0.125 0.3125 +0.25 0.125 0.3438 +0.25 0.125 0.375 +0.25 0.125 0.4062 +0.25 0.125 0.4375 +0.25 0.125 0.4688 +0.25 0.125 0.5 +0.25 0.125 0.5312 +0.25 0.125 0.5625 +0.25 0.125 0.5938 +0.25 0.125 0.625 +0.25 0.125 0.6562 +0.25 0.125 0.6875 +0.25 0.125 0.7188 +0.25 0.125 0.75 +0.25 0.125 0.7812 +0.25 0.125 0.8125 +0.25 0.125 0.8438 +0.25 0.125 0.875 +0.25 0.125 0.9062 +0.25 0.125 0.9375 +0.25 0.125 0.9688 +0.25 0.125 1 +0.25 0.1562 0 +0.25 0.1562 0.03125 +0.25 0.1562 0.0625 +0.25 0.1562 0.09375 +0.25 0.1562 0.125 +0.25 0.1562 0.1562 +0.25 0.1562 0.1875 +0.25 0.1562 0.2188 +0.25 0.1562 0.25 +0.25 0.1562 0.2812 +0.25 0.1562 0.3125 +0.25 0.1562 0.3438 +0.25 0.1562 0.375 +0.25 0.1562 0.4062 +0.25 0.1562 0.4375 +0.25 0.1562 0.4688 +0.25 0.1562 0.5 +0.25 0.1562 0.5312 +0.25 0.1562 0.5625 +0.25 0.1562 0.5938 +0.25 0.1562 0.625 +0.25 0.1562 0.6562 +0.25 0.1562 0.6875 +0.25 0.1562 0.7188 +0.25 0.1562 0.75 +0.25 0.1562 0.7812 +0.25 0.1562 0.8125 +0.25 0.1562 0.8438 +0.25 0.1562 0.875 +0.25 0.1562 0.9062 +0.25 0.1562 0.9375 +0.25 0.1562 0.9688 +0.25 0.1562 1 +0.25 0.1875 0 +0.25 0.1875 0.03125 +0.25 0.1875 0.0625 +0.25 0.1875 0.09375 +0.25 0.1875 0.125 +0.25 0.1875 0.1562 +0.25 0.1875 0.1875 +0.25 0.1875 0.2188 +0.25 0.1875 0.25 +0.25 0.1875 0.2812 +0.25 0.1875 0.3125 +0.25 0.1875 0.3438 +0.25 0.1875 0.375 +0.25 0.1875 0.4062 +0.25 0.1875 0.4375 +0.25 0.1875 0.4688 +0.25 0.1875 0.5 +0.25 0.1875 0.5312 +0.25 0.1875 0.5625 +0.25 0.1875 0.5938 +0.25 0.1875 0.625 +0.25 0.1875 0.6562 +0.25 0.1875 0.6875 +0.25 0.1875 0.7188 +0.25 0.1875 0.75 +0.25 0.1875 0.7812 +0.25 0.1875 0.8125 +0.25 0.1875 0.8438 +0.25 0.1875 0.875 +0.25 0.1875 0.9062 +0.25 0.1875 0.9375 +0.25 0.1875 0.9688 +0.25 0.1875 1 +0.25 0.2188 0 +0.25 0.2188 0.03125 +0.25 0.2188 0.0625 +0.25 0.2188 0.09375 +0.25 0.2188 0.125 +0.25 0.2188 0.1562 +0.25 0.2188 0.1875 +0.25 0.2188 0.2188 +0.25 0.2188 0.25 +0.25 0.2188 0.2812 +0.25 0.2188 0.3125 +0.25 0.2188 0.3438 +0.25 0.2188 0.375 +0.25 0.2188 0.4062 +0.25 0.2188 0.4375 +0.25 0.2188 0.4688 +0.25 0.2188 0.5 +0.25 0.2188 0.5312 +0.25 0.2188 0.5625 +0.25 0.2188 0.5938 +0.25 0.2188 0.625 +0.25 0.2188 0.6562 +0.25 0.2188 0.6875 +0.25 0.2188 0.7188 +0.25 0.2188 0.75 +0.25 0.2188 0.7812 +0.25 0.2188 0.8125 +0.25 0.2188 0.8438 +0.25 0.2188 0.875 +0.25 0.2188 0.9062 +0.25 0.2188 0.9375 +0.25 0.2188 0.9688 +0.25 0.2188 1 +0.25 0.25 0 +0.25 0.25 0.03125 +0.25 0.25 0.0625 +0.25 0.25 0.09375 +0.25 0.25 0.125 +0.25 0.25 0.1562 +0.25 0.25 0.1875 +0.25 0.25 0.2188 +0.25 0.25 0.25 +0.25 0.25 0.2812 +0.25 0.25 0.3125 +0.25 0.25 0.3438 +0.25 0.25 0.375 +0.25 0.25 0.4062 +0.25 0.25 0.4375 +0.25 0.25 0.4688 +0.25 0.25 0.5 +0.25 0.25 0.5312 +0.25 0.25 0.5625 +0.25 0.25 0.5938 +0.25 0.25 0.625 +0.25 0.25 0.6562 +0.25 0.25 0.6875 +0.25 0.25 0.7188 +0.25 0.25 0.75 +0.25 0.25 0.7812 +0.25 0.25 0.8125 +0.25 0.25 0.8438 +0.25 0.25 0.875 +0.25 0.25 0.9062 +0.25 0.25 0.9375 +0.25 0.25 0.9688 +0.25 0.25 1 +0.25 0.2812 0 +0.25 0.2812 0.03125 +0.25 0.2812 0.0625 +0.25 0.2812 0.09375 +0.25 0.2812 0.125 +0.25 0.2812 0.1562 +0.25 0.2812 0.1875 +0.25 0.2812 0.2188 +0.25 0.2812 0.25 +0.25 0.2812 0.2812 +0.25 0.2812 0.3125 +0.25 0.2812 0.3438 +0.25 0.2812 0.375 +0.25 0.2812 0.4062 +0.25 0.2812 0.4375 +0.25 0.2812 0.4688 +0.25 0.2812 0.5 +0.25 0.2812 0.5312 +0.25 0.2812 0.5625 +0.25 0.2812 0.5938 +0.25 0.2812 0.625 +0.25 0.2812 0.6562 +0.25 0.2812 0.6875 +0.25 0.2812 0.7188 +0.25 0.2812 0.75 +0.25 0.2812 0.7812 +0.25 0.2812 0.8125 +0.25 0.2812 0.8438 +0.25 0.2812 0.875 +0.25 0.2812 0.9062 +0.25 0.2812 0.9375 +0.25 0.2812 0.9688 +0.25 0.2812 1 +0.25 0.3125 0 +0.25 0.3125 0.03125 +0.25 0.3125 0.0625 +0.25 0.3125 0.09375 +0.25 0.3125 0.125 +0.25 0.3125 0.1562 +0.25 0.3125 0.1875 +0.25 0.3125 0.2188 +0.25 0.3125 0.25 +0.25 0.3125 0.2812 +0.25 0.3125 0.3125 +0.25 0.3125 0.3438 +0.25 0.3125 0.375 +0.25 0.3125 0.4062 +0.25 0.3125 0.4375 +0.25 0.3125 0.4688 +0.25 0.3125 0.5 +0.25 0.3125 0.5312 +0.25 0.3125 0.5625 +0.25 0.3125 0.5938 +0.25 0.3125 0.625 +0.25 0.3125 0.6562 +0.25 0.3125 0.6875 +0.25 0.3125 0.7188 +0.25 0.3125 0.75 +0.25 0.3125 0.7812 +0.25 0.3125 0.8125 +0.25 0.3125 0.8438 +0.25 0.3125 0.875 +0.25 0.3125 0.9062 +0.25 0.3125 0.9375 +0.25 0.3125 0.9688 +0.25 0.3125 1 +0.25 0.3438 0 +0.25 0.3438 0.03125 +0.25 0.3438 0.0625 +0.25 0.3438 0.09375 +0.25 0.3438 0.125 +0.25 0.3438 0.1562 +0.25 0.3438 0.1875 +0.25 0.3438 0.2188 +0.25 0.3438 0.25 +0.25 0.3438 0.2812 +0.25 0.3438 0.3125 +0.25 0.3438 0.3438 +0.25 0.3438 0.375 +0.25 0.3438 0.4062 +0.25 0.3438 0.4375 +0.25 0.3438 0.4688 +0.25 0.3438 0.5 +0.25 0.3438 0.5312 +0.25 0.3438 0.5625 +0.25 0.3438 0.5938 +0.25 0.3438 0.625 +0.25 0.3438 0.6562 +0.25 0.3438 0.6875 +0.25 0.3438 0.7188 +0.25 0.3438 0.75 +0.25 0.3438 0.7812 +0.25 0.3438 0.8125 +0.25 0.3438 0.8438 +0.25 0.3438 0.875 +0.25 0.3438 0.9062 +0.25 0.3438 0.9375 +0.25 0.3438 0.9688 +0.25 0.3438 1 +0.25 0.375 0 +0.25 0.375 0.03125 +0.25 0.375 0.0625 +0.25 0.375 0.09375 +0.25 0.375 0.125 +0.25 0.375 0.1562 +0.25 0.375 0.1875 +0.25 0.375 0.2188 +0.25 0.375 0.25 +0.25 0.375 0.2812 +0.25 0.375 0.3125 +0.25 0.375 0.3438 +0.25 0.375 0.375 +0.25 0.375 0.4062 +0.25 0.375 0.4375 +0.25 0.375 0.4688 +0.25 0.375 0.5 +0.25 0.375 0.5312 +0.25 0.375 0.5625 +0.25 0.375 0.5938 +0.25 0.375 0.625 +0.25 0.375 0.6562 +0.25 0.375 0.6875 +0.25 0.375 0.7188 +0.25 0.375 0.75 +0.25 0.375 0.7812 +0.25 0.375 0.8125 +0.25 0.375 0.8438 +0.25 0.375 0.875 +0.25 0.375 0.9062 +0.25 0.375 0.9375 +0.25 0.375 0.9688 +0.25 0.375 1 +0.25 0.4062 0 +0.25 0.4062 0.03125 +0.25 0.4062 0.0625 +0.25 0.4062 0.09375 +0.25 0.4062 0.125 +0.25 0.4062 0.1562 +0.25 0.4062 0.1875 +0.25 0.4062 0.2188 +0.25 0.4062 0.25 +0.25 0.4062 0.2812 +0.25 0.4062 0.3125 +0.25 0.4062 0.3438 +0.25 0.4062 0.375 +0.25 0.4062 0.4062 +0.25 0.4062 0.4375 +0.25 0.4062 0.4688 +0.25 0.4062 0.5 +0.25 0.4062 0.5312 +0.25 0.4062 0.5625 +0.25 0.4062 0.5938 +0.25 0.4062 0.625 +0.25 0.4062 0.6562 +0.25 0.4062 0.6875 +0.25 0.4062 0.7188 +0.25 0.4062 0.75 +0.25 0.4062 0.7812 +0.25 0.4062 0.8125 +0.25 0.4062 0.8438 +0.25 0.4062 0.875 +0.25 0.4062 0.9062 +0.25 0.4062 0.9375 +0.25 0.4062 0.9688 +0.25 0.4062 1 +0.25 0.4375 0 +0.25 0.4375 0.03125 +0.25 0.4375 0.0625 +0.25 0.4375 0.09375 +0.25 0.4375 0.125 +0.25 0.4375 0.1562 +0.25 0.4375 0.1875 +0.25 0.4375 0.2188 +0.25 0.4375 0.25 +0.25 0.4375 0.2812 +0.25 0.4375 0.3125 +0.25 0.4375 0.3438 +0.25 0.4375 0.375 +0.25 0.4375 0.4062 +0.25 0.4375 0.4375 +0.25 0.4375 0.4688 +0.25 0.4375 0.5 +0.25 0.4375 0.5312 +0.25 0.4375 0.5625 +0.25 0.4375 0.5938 +0.25 0.4375 0.625 +0.25 0.4375 0.6562 +0.25 0.4375 0.6875 +0.25 0.4375 0.7188 +0.25 0.4375 0.75 +0.25 0.4375 0.7812 +0.25 0.4375 0.8125 +0.25 0.4375 0.8438 +0.25 0.4375 0.875 +0.25 0.4375 0.9062 +0.25 0.4375 0.9375 +0.25 0.4375 0.9688 +0.25 0.4375 1 +0.25 0.4688 0 +0.25 0.4688 0.03125 +0.25 0.4688 0.0625 +0.25 0.4688 0.09375 +0.25 0.4688 0.125 +0.25 0.4688 0.1562 +0.25 0.4688 0.1875 +0.25 0.4688 0.2188 +0.25 0.4688 0.25 +0.25 0.4688 0.2812 +0.25 0.4688 0.3125 +0.25 0.4688 0.3438 +0.25 0.4688 0.375 +0.25 0.4688 0.4062 +0.25 0.4688 0.4375 +0.25 0.4688 0.4688 +0.25 0.4688 0.5 +0.25 0.4688 0.5312 +0.25 0.4688 0.5625 +0.25 0.4688 0.5938 +0.25 0.4688 0.625 +0.25 0.4688 0.6562 +0.25 0.4688 0.6875 +0.25 0.4688 0.7188 +0.25 0.4688 0.75 +0.25 0.4688 0.7812 +0.25 0.4688 0.8125 +0.25 0.4688 0.8438 +0.25 0.4688 0.875 +0.25 0.4688 0.9062 +0.25 0.4688 0.9375 +0.25 0.4688 0.9688 +0.25 0.4688 1 +0.25 0.5 0 +0.25 0.5 0.03125 +0.25 0.5 0.0625 +0.25 0.5 0.09375 +0.25 0.5 0.125 +0.25 0.5 0.1562 +0.25 0.5 0.1875 +0.25 0.5 0.2188 +0.25 0.5 0.25 +0.25 0.5 0.2812 +0.25 0.5 0.3125 +0.25 0.5 0.3438 +0.25 0.5 0.375 +0.25 0.5 0.4062 +0.25 0.5 0.4375 +0.25 0.5 0.4688 +0.25 0.5 0.5 +0.25 0.5 0.5312 +0.25 0.5 0.5625 +0.25 0.5 0.5938 +0.25 0.5 0.625 +0.25 0.5 0.6562 +0.25 0.5 0.6875 +0.25 0.5 0.7188 +0.25 0.5 0.75 +0.25 0.5 0.7812 +0.25 0.5 0.8125 +0.25 0.5 0.8438 +0.25 0.5 0.875 +0.25 0.5 0.9062 +0.25 0.5 0.9375 +0.25 0.5 0.9688 +0.25 0.5 1 +0.25 0.5312 0 +0.25 0.5312 0.03125 +0.25 0.5312 0.0625 +0.25 0.5312 0.09375 +0.25 0.5312 0.125 +0.25 0.5312 0.1562 +0.25 0.5312 0.1875 +0.25 0.5312 0.2188 +0.25 0.5312 0.25 +0.25 0.5312 0.2812 +0.25 0.5312 0.3125 +0.25 0.5312 0.3438 +0.25 0.5312 0.375 +0.25 0.5312 0.4062 +0.25 0.5312 0.4375 +0.25 0.5312 0.4688 +0.25 0.5312 0.5 +0.25 0.5312 0.5312 +0.25 0.5312 0.5625 +0.25 0.5312 0.5938 +0.25 0.5312 0.625 +0.25 0.5312 0.6562 +0.25 0.5312 0.6875 +0.25 0.5312 0.7188 +0.25 0.5312 0.75 +0.25 0.5312 0.7812 +0.25 0.5312 0.8125 +0.25 0.5312 0.8438 +0.25 0.5312 0.875 +0.25 0.5312 0.9062 +0.25 0.5312 0.9375 +0.25 0.5312 0.9688 +0.25 0.5312 1 +0.25 0.5625 0 +0.25 0.5625 0.03125 +0.25 0.5625 0.0625 +0.25 0.5625 0.09375 +0.25 0.5625 0.125 +0.25 0.5625 0.1562 +0.25 0.5625 0.1875 +0.25 0.5625 0.2188 +0.25 0.5625 0.25 +0.25 0.5625 0.2812 +0.25 0.5625 0.3125 +0.25 0.5625 0.3438 +0.25 0.5625 0.375 +0.25 0.5625 0.4062 +0.25 0.5625 0.4375 +0.25 0.5625 0.4688 +0.25 0.5625 0.5 +0.25 0.5625 0.5312 +0.25 0.5625 0.5625 +0.25 0.5625 0.5938 +0.25 0.5625 0.625 +0.25 0.5625 0.6562 +0.25 0.5625 0.6875 +0.25 0.5625 0.7188 +0.25 0.5625 0.75 +0.25 0.5625 0.7812 +0.25 0.5625 0.8125 +0.25 0.5625 0.8438 +0.25 0.5625 0.875 +0.25 0.5625 0.9062 +0.25 0.5625 0.9375 +0.25 0.5625 0.9688 +0.25 0.5625 1 +0.25 0.5938 0 +0.25 0.5938 0.03125 +0.25 0.5938 0.0625 +0.25 0.5938 0.09375 +0.25 0.5938 0.125 +0.25 0.5938 0.1562 +0.25 0.5938 0.1875 +0.25 0.5938 0.2188 +0.25 0.5938 0.25 +0.25 0.5938 0.2812 +0.25 0.5938 0.3125 +0.25 0.5938 0.3438 +0.25 0.5938 0.375 +0.25 0.5938 0.4062 +0.25 0.5938 0.4375 +0.25 0.5938 0.4688 +0.25 0.5938 0.5 +0.25 0.5938 0.5312 +0.25 0.5938 0.5625 +0.25 0.5938 0.5938 +0.25 0.5938 0.625 +0.25 0.5938 0.6562 +0.25 0.5938 0.6875 +0.25 0.5938 0.7188 +0.25 0.5938 0.75 +0.25 0.5938 0.7812 +0.25 0.5938 0.8125 +0.25 0.5938 0.8438 +0.25 0.5938 0.875 +0.25 0.5938 0.9062 +0.25 0.5938 0.9375 +0.25 0.5938 0.9688 +0.25 0.5938 1 +0.25 0.625 0 +0.25 0.625 0.03125 +0.25 0.625 0.0625 +0.25 0.625 0.09375 +0.25 0.625 0.125 +0.25 0.625 0.1562 +0.25 0.625 0.1875 +0.25 0.625 0.2188 +0.25 0.625 0.25 +0.25 0.625 0.2812 +0.25 0.625 0.3125 +0.25 0.625 0.3438 +0.25 0.625 0.375 +0.25 0.625 0.4062 +0.25 0.625 0.4375 +0.25 0.625 0.4688 +0.25 0.625 0.5 +0.25 0.625 0.5312 +0.25 0.625 0.5625 +0.25 0.625 0.5938 +0.25 0.625 0.625 +0.25 0.625 0.6562 +0.25 0.625 0.6875 +0.25 0.625 0.7188 +0.25 0.625 0.75 +0.25 0.625 0.7812 +0.25 0.625 0.8125 +0.25 0.625 0.8438 +0.25 0.625 0.875 +0.25 0.625 0.9062 +0.25 0.625 0.9375 +0.25 0.625 0.9688 +0.25 0.625 1 +0.25 0.6562 0 +0.25 0.6562 0.03125 +0.25 0.6562 0.0625 +0.25 0.6562 0.09375 +0.25 0.6562 0.125 +0.25 0.6562 0.1562 +0.25 0.6562 0.1875 +0.25 0.6562 0.2188 +0.25 0.6562 0.25 +0.25 0.6562 0.2812 +0.25 0.6562 0.3125 +0.25 0.6562 0.3438 +0.25 0.6562 0.375 +0.25 0.6562 0.4062 +0.25 0.6562 0.4375 +0.25 0.6562 0.4688 +0.25 0.6562 0.5 +0.25 0.6562 0.5312 +0.25 0.6562 0.5625 +0.25 0.6562 0.5938 +0.25 0.6562 0.625 +0.25 0.6562 0.6562 +0.25 0.6562 0.6875 +0.25 0.6562 0.7188 +0.25 0.6562 0.75 +0.25 0.6562 0.7812 +0.25 0.6562 0.8125 +0.25 0.6562 0.8438 +0.25 0.6562 0.875 +0.25 0.6562 0.9062 +0.25 0.6562 0.9375 +0.25 0.6562 0.9688 +0.25 0.6562 1 +0.25 0.6875 0 +0.25 0.6875 0.03125 +0.25 0.6875 0.0625 +0.25 0.6875 0.09375 +0.25 0.6875 0.125 +0.25 0.6875 0.1562 +0.25 0.6875 0.1875 +0.25 0.6875 0.2188 +0.25 0.6875 0.25 +0.25 0.6875 0.2812 +0.25 0.6875 0.3125 +0.25 0.6875 0.3438 +0.25 0.6875 0.375 +0.25 0.6875 0.4062 +0.25 0.6875 0.4375 +0.25 0.6875 0.4688 +0.25 0.6875 0.5 +0.25 0.6875 0.5312 +0.25 0.6875 0.5625 +0.25 0.6875 0.5938 +0.25 0.6875 0.625 +0.25 0.6875 0.6562 +0.25 0.6875 0.6875 +0.25 0.6875 0.7188 +0.25 0.6875 0.75 +0.25 0.6875 0.7812 +0.25 0.6875 0.8125 +0.25 0.6875 0.8438 +0.25 0.6875 0.875 +0.25 0.6875 0.9062 +0.25 0.6875 0.9375 +0.25 0.6875 0.9688 +0.25 0.6875 1 +0.25 0.7188 0 +0.25 0.7188 0.03125 +0.25 0.7188 0.0625 +0.25 0.7188 0.09375 +0.25 0.7188 0.125 +0.25 0.7188 0.1562 +0.25 0.7188 0.1875 +0.25 0.7188 0.2188 +0.25 0.7188 0.25 +0.25 0.7188 0.2812 +0.25 0.7188 0.3125 +0.25 0.7188 0.3438 +0.25 0.7188 0.375 +0.25 0.7188 0.4062 +0.25 0.7188 0.4375 +0.25 0.7188 0.4688 +0.25 0.7188 0.5 +0.25 0.7188 0.5312 +0.25 0.7188 0.5625 +0.25 0.7188 0.5938 +0.25 0.7188 0.625 +0.25 0.7188 0.6562 +0.25 0.7188 0.6875 +0.25 0.7188 0.7188 +0.25 0.7188 0.75 +0.25 0.7188 0.7812 +0.25 0.7188 0.8125 +0.25 0.7188 0.8438 +0.25 0.7188 0.875 +0.25 0.7188 0.9062 +0.25 0.7188 0.9375 +0.25 0.7188 0.9688 +0.25 0.7188 1 +0.25 0.75 0 +0.25 0.75 0.03125 +0.25 0.75 0.0625 +0.25 0.75 0.09375 +0.25 0.75 0.125 +0.25 0.75 0.1562 +0.25 0.75 0.1875 +0.25 0.75 0.2188 +0.25 0.75 0.25 +0.25 0.75 0.2812 +0.25 0.75 0.3125 +0.25 0.75 0.3438 +0.25 0.75 0.375 +0.25 0.75 0.4062 +0.25 0.75 0.4375 +0.25 0.75 0.4688 +0.25 0.75 0.5 +0.25 0.75 0.5312 +0.25 0.75 0.5625 +0.25 0.75 0.5938 +0.25 0.75 0.625 +0.25 0.75 0.6562 +0.25 0.75 0.6875 +0.25 0.75 0.7188 +0.25 0.75 0.75 +0.25 0.75 0.7812 +0.25 0.75 0.8125 +0.25 0.75 0.8438 +0.25 0.75 0.875 +0.25 0.75 0.9062 +0.25 0.75 0.9375 +0.25 0.75 0.9688 +0.25 0.75 1 +0.25 0.7812 0 +0.25 0.7812 0.03125 +0.25 0.7812 0.0625 +0.25 0.7812 0.09375 +0.25 0.7812 0.125 +0.25 0.7812 0.1562 +0.25 0.7812 0.1875 +0.25 0.7812 0.2188 +0.25 0.7812 0.25 +0.25 0.7812 0.2812 +0.25 0.7812 0.3125 +0.25 0.7812 0.3438 +0.25 0.7812 0.375 +0.25 0.7812 0.4062 +0.25 0.7812 0.4375 +0.25 0.7812 0.4688 +0.25 0.7812 0.5 +0.25 0.7812 0.5312 +0.25 0.7812 0.5625 +0.25 0.7812 0.5938 +0.25 0.7812 0.625 +0.25 0.7812 0.6562 +0.25 0.7812 0.6875 +0.25 0.7812 0.7188 +0.25 0.7812 0.75 +0.25 0.7812 0.7812 +0.25 0.7812 0.8125 +0.25 0.7812 0.8438 +0.25 0.7812 0.875 +0.25 0.7812 0.9062 +0.25 0.7812 0.9375 +0.25 0.7812 0.9688 +0.25 0.7812 1 +0.25 0.8125 0 +0.25 0.8125 0.03125 +0.25 0.8125 0.0625 +0.25 0.8125 0.09375 +0.25 0.8125 0.125 +0.25 0.8125 0.1562 +0.25 0.8125 0.1875 +0.25 0.8125 0.2188 +0.25 0.8125 0.25 +0.25 0.8125 0.2812 +0.25 0.8125 0.3125 +0.25 0.8125 0.3438 +0.25 0.8125 0.375 +0.25 0.8125 0.4062 +0.25 0.8125 0.4375 +0.25 0.8125 0.4688 +0.25 0.8125 0.5 +0.25 0.8125 0.5312 +0.25 0.8125 0.5625 +0.25 0.8125 0.5938 +0.25 0.8125 0.625 +0.25 0.8125 0.6562 +0.25 0.8125 0.6875 +0.25 0.8125 0.7188 +0.25 0.8125 0.75 +0.25 0.8125 0.7812 +0.25 0.8125 0.8125 +0.25 0.8125 0.8438 +0.25 0.8125 0.875 +0.25 0.8125 0.9062 +0.25 0.8125 0.9375 +0.25 0.8125 0.9688 +0.25 0.8125 1 +0.25 0.8438 0 +0.25 0.8438 0.03125 +0.25 0.8438 0.0625 +0.25 0.8438 0.09375 +0.25 0.8438 0.125 +0.25 0.8438 0.1562 +0.25 0.8438 0.1875 +0.25 0.8438 0.2188 +0.25 0.8438 0.25 +0.25 0.8438 0.2812 +0.25 0.8438 0.3125 +0.25 0.8438 0.3438 +0.25 0.8438 0.375 +0.25 0.8438 0.4062 +0.25 0.8438 0.4375 +0.25 0.8438 0.4688 +0.25 0.8438 0.5 +0.25 0.8438 0.5312 +0.25 0.8438 0.5625 +0.25 0.8438 0.5938 +0.25 0.8438 0.625 +0.25 0.8438 0.6562 +0.25 0.8438 0.6875 +0.25 0.8438 0.7188 +0.25 0.8438 0.75 +0.25 0.8438 0.7812 +0.25 0.8438 0.8125 +0.25 0.8438 0.8438 +0.25 0.8438 0.875 +0.25 0.8438 0.9062 +0.25 0.8438 0.9375 +0.25 0.8438 0.9688 +0.25 0.8438 1 +0.25 0.875 0 +0.25 0.875 0.03125 +0.25 0.875 0.0625 +0.25 0.875 0.09375 +0.25 0.875 0.125 +0.25 0.875 0.1562 +0.25 0.875 0.1875 +0.25 0.875 0.2188 +0.25 0.875 0.25 +0.25 0.875 0.2812 +0.25 0.875 0.3125 +0.25 0.875 0.3438 +0.25 0.875 0.375 +0.25 0.875 0.4062 +0.25 0.875 0.4375 +0.25 0.875 0.4688 +0.25 0.875 0.5 +0.25 0.875 0.5312 +0.25 0.875 0.5625 +0.25 0.875 0.5938 +0.25 0.875 0.625 +0.25 0.875 0.6562 +0.25 0.875 0.6875 +0.25 0.875 0.7188 +0.25 0.875 0.75 +0.25 0.875 0.7812 +0.25 0.875 0.8125 +0.25 0.875 0.8438 +0.25 0.875 0.875 +0.25 0.875 0.9062 +0.25 0.875 0.9375 +0.25 0.875 0.9688 +0.25 0.875 1 +0.25 0.9062 0 +0.25 0.9062 0.03125 +0.25 0.9062 0.0625 +0.25 0.9062 0.09375 +0.25 0.9062 0.125 +0.25 0.9062 0.1562 +0.25 0.9062 0.1875 +0.25 0.9062 0.2188 +0.25 0.9062 0.25 +0.25 0.9062 0.2812 +0.25 0.9062 0.3125 +0.25 0.9062 0.3438 +0.25 0.9062 0.375 +0.25 0.9062 0.4062 +0.25 0.9062 0.4375 +0.25 0.9062 0.4688 +0.25 0.9062 0.5 +0.25 0.9062 0.5312 +0.25 0.9062 0.5625 +0.25 0.9062 0.5938 +0.25 0.9062 0.625 +0.25 0.9062 0.6562 +0.25 0.9062 0.6875 +0.25 0.9062 0.7188 +0.25 0.9062 0.75 +0.25 0.9062 0.7812 +0.25 0.9062 0.8125 +0.25 0.9062 0.8438 +0.25 0.9062 0.875 +0.25 0.9062 0.9062 +0.25 0.9062 0.9375 +0.25 0.9062 0.9688 +0.25 0.9062 1 +0.25 0.9375 0 +0.25 0.9375 0.03125 +0.25 0.9375 0.0625 +0.25 0.9375 0.09375 +0.25 0.9375 0.125 +0.25 0.9375 0.1562 +0.25 0.9375 0.1875 +0.25 0.9375 0.2188 +0.25 0.9375 0.25 +0.25 0.9375 0.2812 +0.25 0.9375 0.3125 +0.25 0.9375 0.3438 +0.25 0.9375 0.375 +0.25 0.9375 0.4062 +0.25 0.9375 0.4375 +0.25 0.9375 0.4688 +0.25 0.9375 0.5 +0.25 0.9375 0.5312 +0.25 0.9375 0.5625 +0.25 0.9375 0.5938 +0.25 0.9375 0.625 +0.25 0.9375 0.6562 +0.25 0.9375 0.6875 +0.25 0.9375 0.7188 +0.25 0.9375 0.75 +0.25 0.9375 0.7812 +0.25 0.9375 0.8125 +0.25 0.9375 0.8438 +0.25 0.9375 0.875 +0.25 0.9375 0.9062 +0.25 0.9375 0.9375 +0.25 0.9375 0.9688 +0.25 0.9375 1 +0.25 0.9688 0 +0.25 0.9688 0.03125 +0.25 0.9688 0.0625 +0.25 0.9688 0.09375 +0.25 0.9688 0.125 +0.25 0.9688 0.1562 +0.25 0.9688 0.1875 +0.25 0.9688 0.2188 +0.25 0.9688 0.25 +0.25 0.9688 0.2812 +0.25 0.9688 0.3125 +0.25 0.9688 0.3438 +0.25 0.9688 0.375 +0.25 0.9688 0.4062 +0.25 0.9688 0.4375 +0.25 0.9688 0.4688 +0.25 0.9688 0.5 +0.25 0.9688 0.5312 +0.25 0.9688 0.5625 +0.25 0.9688 0.5938 +0.25 0.9688 0.625 +0.25 0.9688 0.6562 +0.25 0.9688 0.6875 +0.25 0.9688 0.7188 +0.25 0.9688 0.75 +0.25 0.9688 0.7812 +0.25 0.9688 0.8125 +0.25 0.9688 0.8438 +0.25 0.9688 0.875 +0.25 0.9688 0.9062 +0.25 0.9688 0.9375 +0.25 0.9688 0.9688 +0.25 0.9688 1 +0.25 1 0 +0.25 1 0.03125 +0.25 1 0.0625 +0.25 1 0.09375 +0.25 1 0.125 +0.25 1 0.1562 +0.25 1 0.1875 +0.25 1 0.2188 +0.25 1 0.25 +0.25 1 0.2812 +0.25 1 0.3125 +0.25 1 0.3438 +0.25 1 0.375 +0.25 1 0.4062 +0.25 1 0.4375 +0.25 1 0.4688 +0.25 1 0.5 +0.25 1 0.5312 +0.25 1 0.5625 +0.25 1 0.5938 +0.25 1 0.625 +0.25 1 0.6562 +0.25 1 0.6875 +0.25 1 0.7188 +0.25 1 0.75 +0.25 1 0.7812 +0.25 1 0.8125 +0.25 1 0.8438 +0.25 1 0.875 +0.25 1 0.9062 +0.25 1 0.9375 +0.25 1 0.9688 +0.25 1 1 +0.2812 0 0 +0.2812 0 0.03125 +0.2812 0 0.0625 +0.2812 0 0.09375 +0.2812 0 0.125 +0.2812 0 0.1562 +0.2812 0 0.1875 +0.2812 0 0.2188 +0.2812 0 0.25 +0.2812 0 0.2812 +0.2812 0 0.3125 +0.2812 0 0.3438 +0.2812 0 0.375 +0.2812 0 0.4062 +0.2812 0 0.4375 +0.2812 0 0.4688 +0.2812 0 0.5 +0.2812 0 0.5312 +0.2812 0 0.5625 +0.2812 0 0.5938 +0.2812 0 0.625 +0.2812 0 0.6562 +0.2812 0 0.6875 +0.2812 0 0.7188 +0.2812 0 0.75 +0.2812 0 0.7812 +0.2812 0 0.8125 +0.2812 0 0.8438 +0.2812 0 0.875 +0.2812 0 0.9062 +0.2812 0 0.9375 +0.2812 0 0.9688 +0.2812 0 1 +0.2812 0.03125 0 +0.2812 0.03125 0.03125 +0.2812 0.03125 0.0625 +0.2812 0.03125 0.09375 +0.2812 0.03125 0.125 +0.2812 0.03125 0.1562 +0.2812 0.03125 0.1875 +0.2812 0.03125 0.2188 +0.2812 0.03125 0.25 +0.2812 0.03125 0.2812 +0.2812 0.03125 0.3125 +0.2812 0.03125 0.3438 +0.2812 0.03125 0.375 +0.2812 0.03125 0.4062 +0.2812 0.03125 0.4375 +0.2812 0.03125 0.4688 +0.2812 0.03125 0.5 +0.2812 0.03125 0.5312 +0.2812 0.03125 0.5625 +0.2812 0.03125 0.5938 +0.2812 0.03125 0.625 +0.2812 0.03125 0.6562 +0.2812 0.03125 0.6875 +0.2812 0.03125 0.7188 +0.2812 0.03125 0.75 +0.2812 0.03125 0.7812 +0.2812 0.03125 0.8125 +0.2812 0.03125 0.8438 +0.2812 0.03125 0.875 +0.2812 0.03125 0.9062 +0.2812 0.03125 0.9375 +0.2812 0.03125 0.9688 +0.2812 0.03125 1 +0.2812 0.0625 0 +0.2812 0.0625 0.03125 +0.2812 0.0625 0.0625 +0.2812 0.0625 0.09375 +0.2812 0.0625 0.125 +0.2812 0.0625 0.1562 +0.2812 0.0625 0.1875 +0.2812 0.0625 0.2188 +0.2812 0.0625 0.25 +0.2812 0.0625 0.2812 +0.2812 0.0625 0.3125 +0.2812 0.0625 0.3438 +0.2812 0.0625 0.375 +0.2812 0.0625 0.4062 +0.2812 0.0625 0.4375 +0.2812 0.0625 0.4688 +0.2812 0.0625 0.5 +0.2812 0.0625 0.5312 +0.2812 0.0625 0.5625 +0.2812 0.0625 0.5938 +0.2812 0.0625 0.625 +0.2812 0.0625 0.6562 +0.2812 0.0625 0.6875 +0.2812 0.0625 0.7188 +0.2812 0.0625 0.75 +0.2812 0.0625 0.7812 +0.2812 0.0625 0.8125 +0.2812 0.0625 0.8438 +0.2812 0.0625 0.875 +0.2812 0.0625 0.9062 +0.2812 0.0625 0.9375 +0.2812 0.0625 0.9688 +0.2812 0.0625 1 +0.2812 0.09375 0 +0.2812 0.09375 0.03125 +0.2812 0.09375 0.0625 +0.2812 0.09375 0.09375 +0.2812 0.09375 0.125 +0.2812 0.09375 0.1562 +0.2812 0.09375 0.1875 +0.2812 0.09375 0.2188 +0.2812 0.09375 0.25 +0.2812 0.09375 0.2812 +0.2812 0.09375 0.3125 +0.2812 0.09375 0.3438 +0.2812 0.09375 0.375 +0.2812 0.09375 0.4062 +0.2812 0.09375 0.4375 +0.2812 0.09375 0.4688 +0.2812 0.09375 0.5 +0.2812 0.09375 0.5312 +0.2812 0.09375 0.5625 +0.2812 0.09375 0.5938 +0.2812 0.09375 0.625 +0.2812 0.09375 0.6562 +0.2812 0.09375 0.6875 +0.2812 0.09375 0.7188 +0.2812 0.09375 0.75 +0.2812 0.09375 0.7812 +0.2812 0.09375 0.8125 +0.2812 0.09375 0.8438 +0.2812 0.09375 0.875 +0.2812 0.09375 0.9062 +0.2812 0.09375 0.9375 +0.2812 0.09375 0.9688 +0.2812 0.09375 1 +0.2812 0.125 0 +0.2812 0.125 0.03125 +0.2812 0.125 0.0625 +0.2812 0.125 0.09375 +0.2812 0.125 0.125 +0.2812 0.125 0.1562 +0.2812 0.125 0.1875 +0.2812 0.125 0.2188 +0.2812 0.125 0.25 +0.2812 0.125 0.2812 +0.2812 0.125 0.3125 +0.2812 0.125 0.3438 +0.2812 0.125 0.375 +0.2812 0.125 0.4062 +0.2812 0.125 0.4375 +0.2812 0.125 0.4688 +0.2812 0.125 0.5 +0.2812 0.125 0.5312 +0.2812 0.125 0.5625 +0.2812 0.125 0.5938 +0.2812 0.125 0.625 +0.2812 0.125 0.6562 +0.2812 0.125 0.6875 +0.2812 0.125 0.7188 +0.2812 0.125 0.75 +0.2812 0.125 0.7812 +0.2812 0.125 0.8125 +0.2812 0.125 0.8438 +0.2812 0.125 0.875 +0.2812 0.125 0.9062 +0.2812 0.125 0.9375 +0.2812 0.125 0.9688 +0.2812 0.125 1 +0.2812 0.1562 0 +0.2812 0.1562 0.03125 +0.2812 0.1562 0.0625 +0.2812 0.1562 0.09375 +0.2812 0.1562 0.125 +0.2812 0.1562 0.1562 +0.2812 0.1562 0.1875 +0.2812 0.1562 0.2188 +0.2812 0.1562 0.25 +0.2812 0.1562 0.2812 +0.2812 0.1562 0.3125 +0.2812 0.1562 0.3438 +0.2812 0.1562 0.375 +0.2812 0.1562 0.4062 +0.2812 0.1562 0.4375 +0.2812 0.1562 0.4688 +0.2812 0.1562 0.5 +0.2812 0.1562 0.5312 +0.2812 0.1562 0.5625 +0.2812 0.1562 0.5938 +0.2812 0.1562 0.625 +0.2812 0.1562 0.6562 +0.2812 0.1562 0.6875 +0.2812 0.1562 0.7188 +0.2812 0.1562 0.75 +0.2812 0.1562 0.7812 +0.2812 0.1562 0.8125 +0.2812 0.1562 0.8438 +0.2812 0.1562 0.875 +0.2812 0.1562 0.9062 +0.2812 0.1562 0.9375 +0.2812 0.1562 0.9688 +0.2812 0.1562 1 +0.2812 0.1875 0 +0.2812 0.1875 0.03125 +0.2812 0.1875 0.0625 +0.2812 0.1875 0.09375 +0.2812 0.1875 0.125 +0.2812 0.1875 0.1562 +0.2812 0.1875 0.1875 +0.2812 0.1875 0.2188 +0.2812 0.1875 0.25 +0.2812 0.1875 0.2812 +0.2812 0.1875 0.3125 +0.2812 0.1875 0.3438 +0.2812 0.1875 0.375 +0.2812 0.1875 0.4062 +0.2812 0.1875 0.4375 +0.2812 0.1875 0.4688 +0.2812 0.1875 0.5 +0.2812 0.1875 0.5312 +0.2812 0.1875 0.5625 +0.2812 0.1875 0.5938 +0.2812 0.1875 0.625 +0.2812 0.1875 0.6562 +0.2812 0.1875 0.6875 +0.2812 0.1875 0.7188 +0.2812 0.1875 0.75 +0.2812 0.1875 0.7812 +0.2812 0.1875 0.8125 +0.2812 0.1875 0.8438 +0.2812 0.1875 0.875 +0.2812 0.1875 0.9062 +0.2812 0.1875 0.9375 +0.2812 0.1875 0.9688 +0.2812 0.1875 1 +0.2812 0.2188 0 +0.2812 0.2188 0.03125 +0.2812 0.2188 0.0625 +0.2812 0.2188 0.09375 +0.2812 0.2188 0.125 +0.2812 0.2188 0.1562 +0.2812 0.2188 0.1875 +0.2812 0.2188 0.2188 +0.2812 0.2188 0.25 +0.2812 0.2188 0.2812 +0.2812 0.2188 0.3125 +0.2812 0.2188 0.3438 +0.2812 0.2188 0.375 +0.2812 0.2188 0.4062 +0.2812 0.2188 0.4375 +0.2812 0.2188 0.4688 +0.2812 0.2188 0.5 +0.2812 0.2188 0.5312 +0.2812 0.2188 0.5625 +0.2812 0.2188 0.5938 +0.2812 0.2188 0.625 +0.2812 0.2188 0.6562 +0.2812 0.2188 0.6875 +0.2812 0.2188 0.7188 +0.2812 0.2188 0.75 +0.2812 0.2188 0.7812 +0.2812 0.2188 0.8125 +0.2812 0.2188 0.8438 +0.2812 0.2188 0.875 +0.2812 0.2188 0.9062 +0.2812 0.2188 0.9375 +0.2812 0.2188 0.9688 +0.2812 0.2188 1 +0.2812 0.25 0 +0.2812 0.25 0.03125 +0.2812 0.25 0.0625 +0.2812 0.25 0.09375 +0.2812 0.25 0.125 +0.2812 0.25 0.1562 +0.2812 0.25 0.1875 +0.2812 0.25 0.2188 +0.2812 0.25 0.25 +0.2812 0.25 0.2812 +0.2812 0.25 0.3125 +0.2812 0.25 0.3438 +0.2812 0.25 0.375 +0.2812 0.25 0.4062 +0.2812 0.25 0.4375 +0.2812 0.25 0.4688 +0.2812 0.25 0.5 +0.2812 0.25 0.5312 +0.2812 0.25 0.5625 +0.2812 0.25 0.5938 +0.2812 0.25 0.625 +0.2812 0.25 0.6562 +0.2812 0.25 0.6875 +0.2812 0.25 0.7188 +0.2812 0.25 0.75 +0.2812 0.25 0.7812 +0.2812 0.25 0.8125 +0.2812 0.25 0.8438 +0.2812 0.25 0.875 +0.2812 0.25 0.9062 +0.2812 0.25 0.9375 +0.2812 0.25 0.9688 +0.2812 0.25 1 +0.2812 0.2812 0 +0.2812 0.2812 0.03125 +0.2812 0.2812 0.0625 +0.2812 0.2812 0.09375 +0.2812 0.2812 0.125 +0.2812 0.2812 0.1562 +0.2812 0.2812 0.1875 +0.2812 0.2812 0.2188 +0.2812 0.2812 0.25 +0.2812 0.2812 0.2812 +0.2812 0.2812 0.3125 +0.2812 0.2812 0.3438 +0.2812 0.2812 0.375 +0.2812 0.2812 0.4062 +0.2812 0.2812 0.4375 +0.2812 0.2812 0.4688 +0.2812 0.2812 0.5 +0.2812 0.2812 0.5312 +0.2812 0.2812 0.5625 +0.2812 0.2812 0.5938 +0.2812 0.2812 0.625 +0.2812 0.2812 0.6562 +0.2812 0.2812 0.6875 +0.2812 0.2812 0.7188 +0.2812 0.2812 0.75 +0.2812 0.2812 0.7812 +0.2812 0.2812 0.8125 +0.2812 0.2812 0.8438 +0.2812 0.2812 0.875 +0.2812 0.2812 0.9062 +0.2812 0.2812 0.9375 +0.2812 0.2812 0.9688 +0.2812 0.2812 1 +0.2812 0.3125 0 +0.2812 0.3125 0.03125 +0.2812 0.3125 0.0625 +0.2812 0.3125 0.09375 +0.2812 0.3125 0.125 +0.2812 0.3125 0.1562 +0.2812 0.3125 0.1875 +0.2812 0.3125 0.2188 +0.2812 0.3125 0.25 +0.2812 0.3125 0.2812 +0.2812 0.3125 0.3125 +0.2812 0.3125 0.3438 +0.2812 0.3125 0.375 +0.2812 0.3125 0.4062 +0.2812 0.3125 0.4375 +0.2812 0.3125 0.4688 +0.2812 0.3125 0.5 +0.2812 0.3125 0.5312 +0.2812 0.3125 0.5625 +0.2812 0.3125 0.5938 +0.2812 0.3125 0.625 +0.2812 0.3125 0.6562 +0.2812 0.3125 0.6875 +0.2812 0.3125 0.7188 +0.2812 0.3125 0.75 +0.2812 0.3125 0.7812 +0.2812 0.3125 0.8125 +0.2812 0.3125 0.8438 +0.2812 0.3125 0.875 +0.2812 0.3125 0.9062 +0.2812 0.3125 0.9375 +0.2812 0.3125 0.9688 +0.2812 0.3125 1 +0.2812 0.3438 0 +0.2812 0.3438 0.03125 +0.2812 0.3438 0.0625 +0.2812 0.3438 0.09375 +0.2812 0.3438 0.125 +0.2812 0.3438 0.1562 +0.2812 0.3438 0.1875 +0.2812 0.3438 0.2188 +0.2812 0.3438 0.25 +0.2812 0.3438 0.2812 +0.2812 0.3438 0.3125 +0.2812 0.3438 0.3438 +0.2812 0.3438 0.375 +0.2812 0.3438 0.4062 +0.2812 0.3438 0.4375 +0.2812 0.3438 0.4688 +0.2812 0.3438 0.5 +0.2812 0.3438 0.5312 +0.2812 0.3438 0.5625 +0.2812 0.3438 0.5938 +0.2812 0.3438 0.625 +0.2812 0.3438 0.6562 +0.2812 0.3438 0.6875 +0.2812 0.3438 0.7188 +0.2812 0.3438 0.75 +0.2812 0.3438 0.7812 +0.2812 0.3438 0.8125 +0.2812 0.3438 0.8438 +0.2812 0.3438 0.875 +0.2812 0.3438 0.9062 +0.2812 0.3438 0.9375 +0.2812 0.3438 0.9688 +0.2812 0.3438 1 +0.2812 0.375 0 +0.2812 0.375 0.03125 +0.2812 0.375 0.0625 +0.2812 0.375 0.09375 +0.2812 0.375 0.125 +0.2812 0.375 0.1562 +0.2812 0.375 0.1875 +0.2812 0.375 0.2188 +0.2812 0.375 0.25 +0.2812 0.375 0.2812 +0.2812 0.375 0.3125 +0.2812 0.375 0.3438 +0.2812 0.375 0.375 +0.2812 0.375 0.4062 +0.2812 0.375 0.4375 +0.2812 0.375 0.4688 +0.2812 0.375 0.5 +0.2812 0.375 0.5312 +0.2812 0.375 0.5625 +0.2812 0.375 0.5938 +0.2812 0.375 0.625 +0.2812 0.375 0.6562 +0.2812 0.375 0.6875 +0.2812 0.375 0.7188 +0.2812 0.375 0.75 +0.2812 0.375 0.7812 +0.2812 0.375 0.8125 +0.2812 0.375 0.8438 +0.2812 0.375 0.875 +0.2812 0.375 0.9062 +0.2812 0.375 0.9375 +0.2812 0.375 0.9688 +0.2812 0.375 1 +0.2812 0.4062 0 +0.2812 0.4062 0.03125 +0.2812 0.4062 0.0625 +0.2812 0.4062 0.09375 +0.2812 0.4062 0.125 +0.2812 0.4062 0.1562 +0.2812 0.4062 0.1875 +0.2812 0.4062 0.2188 +0.2812 0.4062 0.25 +0.2812 0.4062 0.2812 +0.2812 0.4062 0.3125 +0.2812 0.4062 0.3438 +0.2812 0.4062 0.375 +0.2812 0.4062 0.4062 +0.2812 0.4062 0.4375 +0.2812 0.4062 0.4688 +0.2812 0.4062 0.5 +0.2812 0.4062 0.5312 +0.2812 0.4062 0.5625 +0.2812 0.4062 0.5938 +0.2812 0.4062 0.625 +0.2812 0.4062 0.6562 +0.2812 0.4062 0.6875 +0.2812 0.4062 0.7188 +0.2812 0.4062 0.75 +0.2812 0.4062 0.7812 +0.2812 0.4062 0.8125 +0.2812 0.4062 0.8438 +0.2812 0.4062 0.875 +0.2812 0.4062 0.9062 +0.2812 0.4062 0.9375 +0.2812 0.4062 0.9688 +0.2812 0.4062 1 +0.2812 0.4375 0 +0.2812 0.4375 0.03125 +0.2812 0.4375 0.0625 +0.2812 0.4375 0.09375 +0.2812 0.4375 0.125 +0.2812 0.4375 0.1562 +0.2812 0.4375 0.1875 +0.2812 0.4375 0.2188 +0.2812 0.4375 0.25 +0.2812 0.4375 0.2812 +0.2812 0.4375 0.3125 +0.2812 0.4375 0.3438 +0.2812 0.4375 0.375 +0.2812 0.4375 0.4062 +0.2812 0.4375 0.4375 +0.2812 0.4375 0.4688 +0.2812 0.4375 0.5 +0.2812 0.4375 0.5312 +0.2812 0.4375 0.5625 +0.2812 0.4375 0.5938 +0.2812 0.4375 0.625 +0.2812 0.4375 0.6562 +0.2812 0.4375 0.6875 +0.2812 0.4375 0.7188 +0.2812 0.4375 0.75 +0.2812 0.4375 0.7812 +0.2812 0.4375 0.8125 +0.2812 0.4375 0.8438 +0.2812 0.4375 0.875 +0.2812 0.4375 0.9062 +0.2812 0.4375 0.9375 +0.2812 0.4375 0.9688 +0.2812 0.4375 1 +0.2812 0.4688 0 +0.2812 0.4688 0.03125 +0.2812 0.4688 0.0625 +0.2812 0.4688 0.09375 +0.2812 0.4688 0.125 +0.2812 0.4688 0.1562 +0.2812 0.4688 0.1875 +0.2812 0.4688 0.2188 +0.2812 0.4688 0.25 +0.2812 0.4688 0.2812 +0.2812 0.4688 0.3125 +0.2812 0.4688 0.3438 +0.2812 0.4688 0.375 +0.2812 0.4688 0.4062 +0.2812 0.4688 0.4375 +0.2812 0.4688 0.4688 +0.2812 0.4688 0.5 +0.2812 0.4688 0.5312 +0.2812 0.4688 0.5625 +0.2812 0.4688 0.5938 +0.2812 0.4688 0.625 +0.2812 0.4688 0.6562 +0.2812 0.4688 0.6875 +0.2812 0.4688 0.7188 +0.2812 0.4688 0.75 +0.2812 0.4688 0.7812 +0.2812 0.4688 0.8125 +0.2812 0.4688 0.8438 +0.2812 0.4688 0.875 +0.2812 0.4688 0.9062 +0.2812 0.4688 0.9375 +0.2812 0.4688 0.9688 +0.2812 0.4688 1 +0.2812 0.5 0 +0.2812 0.5 0.03125 +0.2812 0.5 0.0625 +0.2812 0.5 0.09375 +0.2812 0.5 0.125 +0.2812 0.5 0.1562 +0.2812 0.5 0.1875 +0.2812 0.5 0.2188 +0.2812 0.5 0.25 +0.2812 0.5 0.2812 +0.2812 0.5 0.3125 +0.2812 0.5 0.3438 +0.2812 0.5 0.375 +0.2812 0.5 0.4062 +0.2812 0.5 0.4375 +0.2812 0.5 0.4688 +0.2812 0.5 0.5 +0.2812 0.5 0.5312 +0.2812 0.5 0.5625 +0.2812 0.5 0.5938 +0.2812 0.5 0.625 +0.2812 0.5 0.6562 +0.2812 0.5 0.6875 +0.2812 0.5 0.7188 +0.2812 0.5 0.75 +0.2812 0.5 0.7812 +0.2812 0.5 0.8125 +0.2812 0.5 0.8438 +0.2812 0.5 0.875 +0.2812 0.5 0.9062 +0.2812 0.5 0.9375 +0.2812 0.5 0.9688 +0.2812 0.5 1 +0.2812 0.5312 0 +0.2812 0.5312 0.03125 +0.2812 0.5312 0.0625 +0.2812 0.5312 0.09375 +0.2812 0.5312 0.125 +0.2812 0.5312 0.1562 +0.2812 0.5312 0.1875 +0.2812 0.5312 0.2188 +0.2812 0.5312 0.25 +0.2812 0.5312 0.2812 +0.2812 0.5312 0.3125 +0.2812 0.5312 0.3438 +0.2812 0.5312 0.375 +0.2812 0.5312 0.4062 +0.2812 0.5312 0.4375 +0.2812 0.5312 0.4688 +0.2812 0.5312 0.5 +0.2812 0.5312 0.5312 +0.2812 0.5312 0.5625 +0.2812 0.5312 0.5938 +0.2812 0.5312 0.625 +0.2812 0.5312 0.6562 +0.2812 0.5312 0.6875 +0.2812 0.5312 0.7188 +0.2812 0.5312 0.75 +0.2812 0.5312 0.7812 +0.2812 0.5312 0.8125 +0.2812 0.5312 0.8438 +0.2812 0.5312 0.875 +0.2812 0.5312 0.9062 +0.2812 0.5312 0.9375 +0.2812 0.5312 0.9688 +0.2812 0.5312 1 +0.2812 0.5625 0 +0.2812 0.5625 0.03125 +0.2812 0.5625 0.0625 +0.2812 0.5625 0.09375 +0.2812 0.5625 0.125 +0.2812 0.5625 0.1562 +0.2812 0.5625 0.1875 +0.2812 0.5625 0.2188 +0.2812 0.5625 0.25 +0.2812 0.5625 0.2812 +0.2812 0.5625 0.3125 +0.2812 0.5625 0.3438 +0.2812 0.5625 0.375 +0.2812 0.5625 0.4062 +0.2812 0.5625 0.4375 +0.2812 0.5625 0.4688 +0.2812 0.5625 0.5 +0.2812 0.5625 0.5312 +0.2812 0.5625 0.5625 +0.2812 0.5625 0.5938 +0.2812 0.5625 0.625 +0.2812 0.5625 0.6562 +0.2812 0.5625 0.6875 +0.2812 0.5625 0.7188 +0.2812 0.5625 0.75 +0.2812 0.5625 0.7812 +0.2812 0.5625 0.8125 +0.2812 0.5625 0.8438 +0.2812 0.5625 0.875 +0.2812 0.5625 0.9062 +0.2812 0.5625 0.9375 +0.2812 0.5625 0.9688 +0.2812 0.5625 1 +0.2812 0.5938 0 +0.2812 0.5938 0.03125 +0.2812 0.5938 0.0625 +0.2812 0.5938 0.09375 +0.2812 0.5938 0.125 +0.2812 0.5938 0.1562 +0.2812 0.5938 0.1875 +0.2812 0.5938 0.2188 +0.2812 0.5938 0.25 +0.2812 0.5938 0.2812 +0.2812 0.5938 0.3125 +0.2812 0.5938 0.3438 +0.2812 0.5938 0.375 +0.2812 0.5938 0.4062 +0.2812 0.5938 0.4375 +0.2812 0.5938 0.4688 +0.2812 0.5938 0.5 +0.2812 0.5938 0.5312 +0.2812 0.5938 0.5625 +0.2812 0.5938 0.5938 +0.2812 0.5938 0.625 +0.2812 0.5938 0.6562 +0.2812 0.5938 0.6875 +0.2812 0.5938 0.7188 +0.2812 0.5938 0.75 +0.2812 0.5938 0.7812 +0.2812 0.5938 0.8125 +0.2812 0.5938 0.8438 +0.2812 0.5938 0.875 +0.2812 0.5938 0.9062 +0.2812 0.5938 0.9375 +0.2812 0.5938 0.9688 +0.2812 0.5938 1 +0.2812 0.625 0 +0.2812 0.625 0.03125 +0.2812 0.625 0.0625 +0.2812 0.625 0.09375 +0.2812 0.625 0.125 +0.2812 0.625 0.1562 +0.2812 0.625 0.1875 +0.2812 0.625 0.2188 +0.2812 0.625 0.25 +0.2812 0.625 0.2812 +0.2812 0.625 0.3125 +0.2812 0.625 0.3438 +0.2812 0.625 0.375 +0.2812 0.625 0.4062 +0.2812 0.625 0.4375 +0.2812 0.625 0.4688 +0.2812 0.625 0.5 +0.2812 0.625 0.5312 +0.2812 0.625 0.5625 +0.2812 0.625 0.5938 +0.2812 0.625 0.625 +0.2812 0.625 0.6562 +0.2812 0.625 0.6875 +0.2812 0.625 0.7188 +0.2812 0.625 0.75 +0.2812 0.625 0.7812 +0.2812 0.625 0.8125 +0.2812 0.625 0.8438 +0.2812 0.625 0.875 +0.2812 0.625 0.9062 +0.2812 0.625 0.9375 +0.2812 0.625 0.9688 +0.2812 0.625 1 +0.2812 0.6562 0 +0.2812 0.6562 0.03125 +0.2812 0.6562 0.0625 +0.2812 0.6562 0.09375 +0.2812 0.6562 0.125 +0.2812 0.6562 0.1562 +0.2812 0.6562 0.1875 +0.2812 0.6562 0.2188 +0.2812 0.6562 0.25 +0.2812 0.6562 0.2812 +0.2812 0.6562 0.3125 +0.2812 0.6562 0.3438 +0.2812 0.6562 0.375 +0.2812 0.6562 0.4062 +0.2812 0.6562 0.4375 +0.2812 0.6562 0.4688 +0.2812 0.6562 0.5 +0.2812 0.6562 0.5312 +0.2812 0.6562 0.5625 +0.2812 0.6562 0.5938 +0.2812 0.6562 0.625 +0.2812 0.6562 0.6562 +0.2812 0.6562 0.6875 +0.2812 0.6562 0.7188 +0.2812 0.6562 0.75 +0.2812 0.6562 0.7812 +0.2812 0.6562 0.8125 +0.2812 0.6562 0.8438 +0.2812 0.6562 0.875 +0.2812 0.6562 0.9062 +0.2812 0.6562 0.9375 +0.2812 0.6562 0.9688 +0.2812 0.6562 1 +0.2812 0.6875 0 +0.2812 0.6875 0.03125 +0.2812 0.6875 0.0625 +0.2812 0.6875 0.09375 +0.2812 0.6875 0.125 +0.2812 0.6875 0.1562 +0.2812 0.6875 0.1875 +0.2812 0.6875 0.2188 +0.2812 0.6875 0.25 +0.2812 0.6875 0.2812 +0.2812 0.6875 0.3125 +0.2812 0.6875 0.3438 +0.2812 0.6875 0.375 +0.2812 0.6875 0.4062 +0.2812 0.6875 0.4375 +0.2812 0.6875 0.4688 +0.2812 0.6875 0.5 +0.2812 0.6875 0.5312 +0.2812 0.6875 0.5625 +0.2812 0.6875 0.5938 +0.2812 0.6875 0.625 +0.2812 0.6875 0.6562 +0.2812 0.6875 0.6875 +0.2812 0.6875 0.7188 +0.2812 0.6875 0.75 +0.2812 0.6875 0.7812 +0.2812 0.6875 0.8125 +0.2812 0.6875 0.8438 +0.2812 0.6875 0.875 +0.2812 0.6875 0.9062 +0.2812 0.6875 0.9375 +0.2812 0.6875 0.9688 +0.2812 0.6875 1 +0.2812 0.7188 0 +0.2812 0.7188 0.03125 +0.2812 0.7188 0.0625 +0.2812 0.7188 0.09375 +0.2812 0.7188 0.125 +0.2812 0.7188 0.1562 +0.2812 0.7188 0.1875 +0.2812 0.7188 0.2188 +0.2812 0.7188 0.25 +0.2812 0.7188 0.2812 +0.2812 0.7188 0.3125 +0.2812 0.7188 0.3438 +0.2812 0.7188 0.375 +0.2812 0.7188 0.4062 +0.2812 0.7188 0.4375 +0.2812 0.7188 0.4688 +0.2812 0.7188 0.5 +0.2812 0.7188 0.5312 +0.2812 0.7188 0.5625 +0.2812 0.7188 0.5938 +0.2812 0.7188 0.625 +0.2812 0.7188 0.6562 +0.2812 0.7188 0.6875 +0.2812 0.7188 0.7188 +0.2812 0.7188 0.75 +0.2812 0.7188 0.7812 +0.2812 0.7188 0.8125 +0.2812 0.7188 0.8438 +0.2812 0.7188 0.875 +0.2812 0.7188 0.9062 +0.2812 0.7188 0.9375 +0.2812 0.7188 0.9688 +0.2812 0.7188 1 +0.2812 0.75 0 +0.2812 0.75 0.03125 +0.2812 0.75 0.0625 +0.2812 0.75 0.09375 +0.2812 0.75 0.125 +0.2812 0.75 0.1562 +0.2812 0.75 0.1875 +0.2812 0.75 0.2188 +0.2812 0.75 0.25 +0.2812 0.75 0.2812 +0.2812 0.75 0.3125 +0.2812 0.75 0.3438 +0.2812 0.75 0.375 +0.2812 0.75 0.4062 +0.2812 0.75 0.4375 +0.2812 0.75 0.4688 +0.2812 0.75 0.5 +0.2812 0.75 0.5312 +0.2812 0.75 0.5625 +0.2812 0.75 0.5938 +0.2812 0.75 0.625 +0.2812 0.75 0.6562 +0.2812 0.75 0.6875 +0.2812 0.75 0.7188 +0.2812 0.75 0.75 +0.2812 0.75 0.7812 +0.2812 0.75 0.8125 +0.2812 0.75 0.8438 +0.2812 0.75 0.875 +0.2812 0.75 0.9062 +0.2812 0.75 0.9375 +0.2812 0.75 0.9688 +0.2812 0.75 1 +0.2812 0.7812 0 +0.2812 0.7812 0.03125 +0.2812 0.7812 0.0625 +0.2812 0.7812 0.09375 +0.2812 0.7812 0.125 +0.2812 0.7812 0.1562 +0.2812 0.7812 0.1875 +0.2812 0.7812 0.2188 +0.2812 0.7812 0.25 +0.2812 0.7812 0.2812 +0.2812 0.7812 0.3125 +0.2812 0.7812 0.3438 +0.2812 0.7812 0.375 +0.2812 0.7812 0.4062 +0.2812 0.7812 0.4375 +0.2812 0.7812 0.4688 +0.2812 0.7812 0.5 +0.2812 0.7812 0.5312 +0.2812 0.7812 0.5625 +0.2812 0.7812 0.5938 +0.2812 0.7812 0.625 +0.2812 0.7812 0.6562 +0.2812 0.7812 0.6875 +0.2812 0.7812 0.7188 +0.2812 0.7812 0.75 +0.2812 0.7812 0.7812 +0.2812 0.7812 0.8125 +0.2812 0.7812 0.8438 +0.2812 0.7812 0.875 +0.2812 0.7812 0.9062 +0.2812 0.7812 0.9375 +0.2812 0.7812 0.9688 +0.2812 0.7812 1 +0.2812 0.8125 0 +0.2812 0.8125 0.03125 +0.2812 0.8125 0.0625 +0.2812 0.8125 0.09375 +0.2812 0.8125 0.125 +0.2812 0.8125 0.1562 +0.2812 0.8125 0.1875 +0.2812 0.8125 0.2188 +0.2812 0.8125 0.25 +0.2812 0.8125 0.2812 +0.2812 0.8125 0.3125 +0.2812 0.8125 0.3438 +0.2812 0.8125 0.375 +0.2812 0.8125 0.4062 +0.2812 0.8125 0.4375 +0.2812 0.8125 0.4688 +0.2812 0.8125 0.5 +0.2812 0.8125 0.5312 +0.2812 0.8125 0.5625 +0.2812 0.8125 0.5938 +0.2812 0.8125 0.625 +0.2812 0.8125 0.6562 +0.2812 0.8125 0.6875 +0.2812 0.8125 0.7188 +0.2812 0.8125 0.75 +0.2812 0.8125 0.7812 +0.2812 0.8125 0.8125 +0.2812 0.8125 0.8438 +0.2812 0.8125 0.875 +0.2812 0.8125 0.9062 +0.2812 0.8125 0.9375 +0.2812 0.8125 0.9688 +0.2812 0.8125 1 +0.2812 0.8438 0 +0.2812 0.8438 0.03125 +0.2812 0.8438 0.0625 +0.2812 0.8438 0.09375 +0.2812 0.8438 0.125 +0.2812 0.8438 0.1562 +0.2812 0.8438 0.1875 +0.2812 0.8438 0.2188 +0.2812 0.8438 0.25 +0.2812 0.8438 0.2812 +0.2812 0.8438 0.3125 +0.2812 0.8438 0.3438 +0.2812 0.8438 0.375 +0.2812 0.8438 0.4062 +0.2812 0.8438 0.4375 +0.2812 0.8438 0.4688 +0.2812 0.8438 0.5 +0.2812 0.8438 0.5312 +0.2812 0.8438 0.5625 +0.2812 0.8438 0.5938 +0.2812 0.8438 0.625 +0.2812 0.8438 0.6562 +0.2812 0.8438 0.6875 +0.2812 0.8438 0.7188 +0.2812 0.8438 0.75 +0.2812 0.8438 0.7812 +0.2812 0.8438 0.8125 +0.2812 0.8438 0.8438 +0.2812 0.8438 0.875 +0.2812 0.8438 0.9062 +0.2812 0.8438 0.9375 +0.2812 0.8438 0.9688 +0.2812 0.8438 1 +0.2812 0.875 0 +0.2812 0.875 0.03125 +0.2812 0.875 0.0625 +0.2812 0.875 0.09375 +0.2812 0.875 0.125 +0.2812 0.875 0.1562 +0.2812 0.875 0.1875 +0.2812 0.875 0.2188 +0.2812 0.875 0.25 +0.2812 0.875 0.2812 +0.2812 0.875 0.3125 +0.2812 0.875 0.3438 +0.2812 0.875 0.375 +0.2812 0.875 0.4062 +0.2812 0.875 0.4375 +0.2812 0.875 0.4688 +0.2812 0.875 0.5 +0.2812 0.875 0.5312 +0.2812 0.875 0.5625 +0.2812 0.875 0.5938 +0.2812 0.875 0.625 +0.2812 0.875 0.6562 +0.2812 0.875 0.6875 +0.2812 0.875 0.7188 +0.2812 0.875 0.75 +0.2812 0.875 0.7812 +0.2812 0.875 0.8125 +0.2812 0.875 0.8438 +0.2812 0.875 0.875 +0.2812 0.875 0.9062 +0.2812 0.875 0.9375 +0.2812 0.875 0.9688 +0.2812 0.875 1 +0.2812 0.9062 0 +0.2812 0.9062 0.03125 +0.2812 0.9062 0.0625 +0.2812 0.9062 0.09375 +0.2812 0.9062 0.125 +0.2812 0.9062 0.1562 +0.2812 0.9062 0.1875 +0.2812 0.9062 0.2188 +0.2812 0.9062 0.25 +0.2812 0.9062 0.2812 +0.2812 0.9062 0.3125 +0.2812 0.9062 0.3438 +0.2812 0.9062 0.375 +0.2812 0.9062 0.4062 +0.2812 0.9062 0.4375 +0.2812 0.9062 0.4688 +0.2812 0.9062 0.5 +0.2812 0.9062 0.5312 +0.2812 0.9062 0.5625 +0.2812 0.9062 0.5938 +0.2812 0.9062 0.625 +0.2812 0.9062 0.6562 +0.2812 0.9062 0.6875 +0.2812 0.9062 0.7188 +0.2812 0.9062 0.75 +0.2812 0.9062 0.7812 +0.2812 0.9062 0.8125 +0.2812 0.9062 0.8438 +0.2812 0.9062 0.875 +0.2812 0.9062 0.9062 +0.2812 0.9062 0.9375 +0.2812 0.9062 0.9688 +0.2812 0.9062 1 +0.2812 0.9375 0 +0.2812 0.9375 0.03125 +0.2812 0.9375 0.0625 +0.2812 0.9375 0.09375 +0.2812 0.9375 0.125 +0.2812 0.9375 0.1562 +0.2812 0.9375 0.1875 +0.2812 0.9375 0.2188 +0.2812 0.9375 0.25 +0.2812 0.9375 0.2812 +0.2812 0.9375 0.3125 +0.2812 0.9375 0.3438 +0.2812 0.9375 0.375 +0.2812 0.9375 0.4062 +0.2812 0.9375 0.4375 +0.2812 0.9375 0.4688 +0.2812 0.9375 0.5 +0.2812 0.9375 0.5312 +0.2812 0.9375 0.5625 +0.2812 0.9375 0.5938 +0.2812 0.9375 0.625 +0.2812 0.9375 0.6562 +0.2812 0.9375 0.6875 +0.2812 0.9375 0.7188 +0.2812 0.9375 0.75 +0.2812 0.9375 0.7812 +0.2812 0.9375 0.8125 +0.2812 0.9375 0.8438 +0.2812 0.9375 0.875 +0.2812 0.9375 0.9062 +0.2812 0.9375 0.9375 +0.2812 0.9375 0.9688 +0.2812 0.9375 1 +0.2812 0.9688 0 +0.2812 0.9688 0.03125 +0.2812 0.9688 0.0625 +0.2812 0.9688 0.09375 +0.2812 0.9688 0.125 +0.2812 0.9688 0.1562 +0.2812 0.9688 0.1875 +0.2812 0.9688 0.2188 +0.2812 0.9688 0.25 +0.2812 0.9688 0.2812 +0.2812 0.9688 0.3125 +0.2812 0.9688 0.3438 +0.2812 0.9688 0.375 +0.2812 0.9688 0.4062 +0.2812 0.9688 0.4375 +0.2812 0.9688 0.4688 +0.2812 0.9688 0.5 +0.2812 0.9688 0.5312 +0.2812 0.9688 0.5625 +0.2812 0.9688 0.5938 +0.2812 0.9688 0.625 +0.2812 0.9688 0.6562 +0.2812 0.9688 0.6875 +0.2812 0.9688 0.7188 +0.2812 0.9688 0.75 +0.2812 0.9688 0.7812 +0.2812 0.9688 0.8125 +0.2812 0.9688 0.8438 +0.2812 0.9688 0.875 +0.2812 0.9688 0.9062 +0.2812 0.9688 0.9375 +0.2812 0.9688 0.9688 +0.2812 0.9688 1 +0.2812 1 0 +0.2812 1 0.03125 +0.2812 1 0.0625 +0.2812 1 0.09375 +0.2812 1 0.125 +0.2812 1 0.1562 +0.2812 1 0.1875 +0.2812 1 0.2188 +0.2812 1 0.25 +0.2812 1 0.2812 +0.2812 1 0.3125 +0.2812 1 0.3438 +0.2812 1 0.375 +0.2812 1 0.4062 +0.2812 1 0.4375 +0.2812 1 0.4688 +0.2812 1 0.5 +0.2812 1 0.5312 +0.2812 1 0.5625 +0.2812 1 0.5938 +0.2812 1 0.625 +0.2812 1 0.6562 +0.2812 1 0.6875 +0.2812 1 0.7188 +0.2812 1 0.75 +0.2812 1 0.7812 +0.2812 1 0.8125 +0.2812 1 0.8438 +0.2812 1 0.875 +0.2812 1 0.9062 +0.2812 1 0.9375 +0.2812 1 0.9688 +0.2812 1 1 +0.3125 0 0 +0.3125 0 0.03125 +0.3125 0 0.0625 +0.3125 0 0.09375 +0.3125 0 0.125 +0.3125 0 0.1562 +0.3125 0 0.1875 +0.3125 0 0.2188 +0.3125 0 0.25 +0.3125 0 0.2812 +0.3125 0 0.3125 +0.3125 0 0.3438 +0.3125 0 0.375 +0.3125 0 0.4062 +0.3125 0 0.4375 +0.3125 0 0.4688 +0.3125 0 0.5 +0.3125 0 0.5312 +0.3125 0 0.5625 +0.3125 0 0.5938 +0.3125 0 0.625 +0.3125 0 0.6562 +0.3125 0 0.6875 +0.3125 0 0.7188 +0.3125 0 0.75 +0.3125 0 0.7812 +0.3125 0 0.8125 +0.3125 0 0.8438 +0.3125 0 0.875 +0.3125 0 0.9062 +0.3125 0 0.9375 +0.3125 0 0.9688 +0.3125 0 1 +0.3125 0.03125 0 +0.3125 0.03125 0.03125 +0.3125 0.03125 0.0625 +0.3125 0.03125 0.09375 +0.3125 0.03125 0.125 +0.3125 0.03125 0.1562 +0.3125 0.03125 0.1875 +0.3125 0.03125 0.2188 +0.3125 0.03125 0.25 +0.3125 0.03125 0.2812 +0.3125 0.03125 0.3125 +0.3125 0.03125 0.3438 +0.3125 0.03125 0.375 +0.3125 0.03125 0.4062 +0.3125 0.03125 0.4375 +0.3125 0.03125 0.4688 +0.3125 0.03125 0.5 +0.3125 0.03125 0.5312 +0.3125 0.03125 0.5625 +0.3125 0.03125 0.5938 +0.3125 0.03125 0.625 +0.3125 0.03125 0.6562 +0.3125 0.03125 0.6875 +0.3125 0.03125 0.7188 +0.3125 0.03125 0.75 +0.3125 0.03125 0.7812 +0.3125 0.03125 0.8125 +0.3125 0.03125 0.8438 +0.3125 0.03125 0.875 +0.3125 0.03125 0.9062 +0.3125 0.03125 0.9375 +0.3125 0.03125 0.9688 +0.3125 0.03125 1 +0.3125 0.0625 0 +0.3125 0.0625 0.03125 +0.3125 0.0625 0.0625 +0.3125 0.0625 0.09375 +0.3125 0.0625 0.125 +0.3125 0.0625 0.1562 +0.3125 0.0625 0.1875 +0.3125 0.0625 0.2188 +0.3125 0.0625 0.25 +0.3125 0.0625 0.2812 +0.3125 0.0625 0.3125 +0.3125 0.0625 0.3438 +0.3125 0.0625 0.375 +0.3125 0.0625 0.4062 +0.3125 0.0625 0.4375 +0.3125 0.0625 0.4688 +0.3125 0.0625 0.5 +0.3125 0.0625 0.5312 +0.3125 0.0625 0.5625 +0.3125 0.0625 0.5938 +0.3125 0.0625 0.625 +0.3125 0.0625 0.6562 +0.3125 0.0625 0.6875 +0.3125 0.0625 0.7188 +0.3125 0.0625 0.75 +0.3125 0.0625 0.7812 +0.3125 0.0625 0.8125 +0.3125 0.0625 0.8438 +0.3125 0.0625 0.875 +0.3125 0.0625 0.9062 +0.3125 0.0625 0.9375 +0.3125 0.0625 0.9688 +0.3125 0.0625 1 +0.3125 0.09375 0 +0.3125 0.09375 0.03125 +0.3125 0.09375 0.0625 +0.3125 0.09375 0.09375 +0.3125 0.09375 0.125 +0.3125 0.09375 0.1562 +0.3125 0.09375 0.1875 +0.3125 0.09375 0.2188 +0.3125 0.09375 0.25 +0.3125 0.09375 0.2812 +0.3125 0.09375 0.3125 +0.3125 0.09375 0.3438 +0.3125 0.09375 0.375 +0.3125 0.09375 0.4062 +0.3125 0.09375 0.4375 +0.3125 0.09375 0.4688 +0.3125 0.09375 0.5 +0.3125 0.09375 0.5312 +0.3125 0.09375 0.5625 +0.3125 0.09375 0.5938 +0.3125 0.09375 0.625 +0.3125 0.09375 0.6562 +0.3125 0.09375 0.6875 +0.3125 0.09375 0.7188 +0.3125 0.09375 0.75 +0.3125 0.09375 0.7812 +0.3125 0.09375 0.8125 +0.3125 0.09375 0.8438 +0.3125 0.09375 0.875 +0.3125 0.09375 0.9062 +0.3125 0.09375 0.9375 +0.3125 0.09375 0.9688 +0.3125 0.09375 1 +0.3125 0.125 0 +0.3125 0.125 0.03125 +0.3125 0.125 0.0625 +0.3125 0.125 0.09375 +0.3125 0.125 0.125 +0.3125 0.125 0.1562 +0.3125 0.125 0.1875 +0.3125 0.125 0.2188 +0.3125 0.125 0.25 +0.3125 0.125 0.2812 +0.3125 0.125 0.3125 +0.3125 0.125 0.3438 +0.3125 0.125 0.375 +0.3125 0.125 0.4062 +0.3125 0.125 0.4375 +0.3125 0.125 0.4688 +0.3125 0.125 0.5 +0.3125 0.125 0.5312 +0.3125 0.125 0.5625 +0.3125 0.125 0.5938 +0.3125 0.125 0.625 +0.3125 0.125 0.6562 +0.3125 0.125 0.6875 +0.3125 0.125 0.7188 +0.3125 0.125 0.75 +0.3125 0.125 0.7812 +0.3125 0.125 0.8125 +0.3125 0.125 0.8438 +0.3125 0.125 0.875 +0.3125 0.125 0.9062 +0.3125 0.125 0.9375 +0.3125 0.125 0.9688 +0.3125 0.125 1 +0.3125 0.1562 0 +0.3125 0.1562 0.03125 +0.3125 0.1562 0.0625 +0.3125 0.1562 0.09375 +0.3125 0.1562 0.125 +0.3125 0.1562 0.1562 +0.3125 0.1562 0.1875 +0.3125 0.1562 0.2188 +0.3125 0.1562 0.25 +0.3125 0.1562 0.2812 +0.3125 0.1562 0.3125 +0.3125 0.1562 0.3438 +0.3125 0.1562 0.375 +0.3125 0.1562 0.4062 +0.3125 0.1562 0.4375 +0.3125 0.1562 0.4688 +0.3125 0.1562 0.5 +0.3125 0.1562 0.5312 +0.3125 0.1562 0.5625 +0.3125 0.1562 0.5938 +0.3125 0.1562 0.625 +0.3125 0.1562 0.6562 +0.3125 0.1562 0.6875 +0.3125 0.1562 0.7188 +0.3125 0.1562 0.75 +0.3125 0.1562 0.7812 +0.3125 0.1562 0.8125 +0.3125 0.1562 0.8438 +0.3125 0.1562 0.875 +0.3125 0.1562 0.9062 +0.3125 0.1562 0.9375 +0.3125 0.1562 0.9688 +0.3125 0.1562 1 +0.3125 0.1875 0 +0.3125 0.1875 0.03125 +0.3125 0.1875 0.0625 +0.3125 0.1875 0.09375 +0.3125 0.1875 0.125 +0.3125 0.1875 0.1562 +0.3125 0.1875 0.1875 +0.3125 0.1875 0.2188 +0.3125 0.1875 0.25 +0.3125 0.1875 0.2812 +0.3125 0.1875 0.3125 +0.3125 0.1875 0.3438 +0.3125 0.1875 0.375 +0.3125 0.1875 0.4062 +0.3125 0.1875 0.4375 +0.3125 0.1875 0.4688 +0.3125 0.1875 0.5 +0.3125 0.1875 0.5312 +0.3125 0.1875 0.5625 +0.3125 0.1875 0.5938 +0.3125 0.1875 0.625 +0.3125 0.1875 0.6562 +0.3125 0.1875 0.6875 +0.3125 0.1875 0.7188 +0.3125 0.1875 0.75 +0.3125 0.1875 0.7812 +0.3125 0.1875 0.8125 +0.3125 0.1875 0.8438 +0.3125 0.1875 0.875 +0.3125 0.1875 0.9062 +0.3125 0.1875 0.9375 +0.3125 0.1875 0.9688 +0.3125 0.1875 1 +0.3125 0.2188 0 +0.3125 0.2188 0.03125 +0.3125 0.2188 0.0625 +0.3125 0.2188 0.09375 +0.3125 0.2188 0.125 +0.3125 0.2188 0.1562 +0.3125 0.2188 0.1875 +0.3125 0.2188 0.2188 +0.3125 0.2188 0.25 +0.3125 0.2188 0.2812 +0.3125 0.2188 0.3125 +0.3125 0.2188 0.3438 +0.3125 0.2188 0.375 +0.3125 0.2188 0.4062 +0.3125 0.2188 0.4375 +0.3125 0.2188 0.4688 +0.3125 0.2188 0.5 +0.3125 0.2188 0.5312 +0.3125 0.2188 0.5625 +0.3125 0.2188 0.5938 +0.3125 0.2188 0.625 +0.3125 0.2188 0.6562 +0.3125 0.2188 0.6875 +0.3125 0.2188 0.7188 +0.3125 0.2188 0.75 +0.3125 0.2188 0.7812 +0.3125 0.2188 0.8125 +0.3125 0.2188 0.8438 +0.3125 0.2188 0.875 +0.3125 0.2188 0.9062 +0.3125 0.2188 0.9375 +0.3125 0.2188 0.9688 +0.3125 0.2188 1 +0.3125 0.25 0 +0.3125 0.25 0.03125 +0.3125 0.25 0.0625 +0.3125 0.25 0.09375 +0.3125 0.25 0.125 +0.3125 0.25 0.1562 +0.3125 0.25 0.1875 +0.3125 0.25 0.2188 +0.3125 0.25 0.25 +0.3125 0.25 0.2812 +0.3125 0.25 0.3125 +0.3125 0.25 0.3438 +0.3125 0.25 0.375 +0.3125 0.25 0.4062 +0.3125 0.25 0.4375 +0.3125 0.25 0.4688 +0.3125 0.25 0.5 +0.3125 0.25 0.5312 +0.3125 0.25 0.5625 +0.3125 0.25 0.5938 +0.3125 0.25 0.625 +0.3125 0.25 0.6562 +0.3125 0.25 0.6875 +0.3125 0.25 0.7188 +0.3125 0.25 0.75 +0.3125 0.25 0.7812 +0.3125 0.25 0.8125 +0.3125 0.25 0.8438 +0.3125 0.25 0.875 +0.3125 0.25 0.9062 +0.3125 0.25 0.9375 +0.3125 0.25 0.9688 +0.3125 0.25 1 +0.3125 0.2812 0 +0.3125 0.2812 0.03125 +0.3125 0.2812 0.0625 +0.3125 0.2812 0.09375 +0.3125 0.2812 0.125 +0.3125 0.2812 0.1562 +0.3125 0.2812 0.1875 +0.3125 0.2812 0.2188 +0.3125 0.2812 0.25 +0.3125 0.2812 0.2812 +0.3125 0.2812 0.3125 +0.3125 0.2812 0.3438 +0.3125 0.2812 0.375 +0.3125 0.2812 0.4062 +0.3125 0.2812 0.4375 +0.3125 0.2812 0.4688 +0.3125 0.2812 0.5 +0.3125 0.2812 0.5312 +0.3125 0.2812 0.5625 +0.3125 0.2812 0.5938 +0.3125 0.2812 0.625 +0.3125 0.2812 0.6562 +0.3125 0.2812 0.6875 +0.3125 0.2812 0.7188 +0.3125 0.2812 0.75 +0.3125 0.2812 0.7812 +0.3125 0.2812 0.8125 +0.3125 0.2812 0.8438 +0.3125 0.2812 0.875 +0.3125 0.2812 0.9062 +0.3125 0.2812 0.9375 +0.3125 0.2812 0.9688 +0.3125 0.2812 1 +0.3125 0.3125 0 +0.3125 0.3125 0.03125 +0.3125 0.3125 0.0625 +0.3125 0.3125 0.09375 +0.3125 0.3125 0.125 +0.3125 0.3125 0.1562 +0.3125 0.3125 0.1875 +0.3125 0.3125 0.2188 +0.3125 0.3125 0.25 +0.3125 0.3125 0.2812 +0.3125 0.3125 0.3125 +0.3125 0.3125 0.3438 +0.3125 0.3125 0.375 +0.3125 0.3125 0.4062 +0.3125 0.3125 0.4375 +0.3125 0.3125 0.4688 +0.3125 0.3125 0.5 +0.3125 0.3125 0.5312 +0.3125 0.3125 0.5625 +0.3125 0.3125 0.5938 +0.3125 0.3125 0.625 +0.3125 0.3125 0.6562 +0.3125 0.3125 0.6875 +0.3125 0.3125 0.7188 +0.3125 0.3125 0.75 +0.3125 0.3125 0.7812 +0.3125 0.3125 0.8125 +0.3125 0.3125 0.8438 +0.3125 0.3125 0.875 +0.3125 0.3125 0.9062 +0.3125 0.3125 0.9375 +0.3125 0.3125 0.9688 +0.3125 0.3125 1 +0.3125 0.3438 0 +0.3125 0.3438 0.03125 +0.3125 0.3438 0.0625 +0.3125 0.3438 0.09375 +0.3125 0.3438 0.125 +0.3125 0.3438 0.1562 +0.3125 0.3438 0.1875 +0.3125 0.3438 0.2188 +0.3125 0.3438 0.25 +0.3125 0.3438 0.2812 +0.3125 0.3438 0.3125 +0.3125 0.3438 0.3438 +0.3125 0.3438 0.375 +0.3125 0.3438 0.4062 +0.3125 0.3438 0.4375 +0.3125 0.3438 0.4688 +0.3125 0.3438 0.5 +0.3125 0.3438 0.5312 +0.3125 0.3438 0.5625 +0.3125 0.3438 0.5938 +0.3125 0.3438 0.625 +0.3125 0.3438 0.6562 +0.3125 0.3438 0.6875 +0.3125 0.3438 0.7188 +0.3125 0.3438 0.75 +0.3125 0.3438 0.7812 +0.3125 0.3438 0.8125 +0.3125 0.3438 0.8438 +0.3125 0.3438 0.875 +0.3125 0.3438 0.9062 +0.3125 0.3438 0.9375 +0.3125 0.3438 0.9688 +0.3125 0.3438 1 +0.3125 0.375 0 +0.3125 0.375 0.03125 +0.3125 0.375 0.0625 +0.3125 0.375 0.09375 +0.3125 0.375 0.125 +0.3125 0.375 0.1562 +0.3125 0.375 0.1875 +0.3125 0.375 0.2188 +0.3125 0.375 0.25 +0.3125 0.375 0.2812 +0.3125 0.375 0.3125 +0.3125 0.375 0.3438 +0.3125 0.375 0.375 +0.3125 0.375 0.4062 +0.3125 0.375 0.4375 +0.3125 0.375 0.4688 +0.3125 0.375 0.5 +0.3125 0.375 0.5312 +0.3125 0.375 0.5625 +0.3125 0.375 0.5938 +0.3125 0.375 0.625 +0.3125 0.375 0.6562 +0.3125 0.375 0.6875 +0.3125 0.375 0.7188 +0.3125 0.375 0.75 +0.3125 0.375 0.7812 +0.3125 0.375 0.8125 +0.3125 0.375 0.8438 +0.3125 0.375 0.875 +0.3125 0.375 0.9062 +0.3125 0.375 0.9375 +0.3125 0.375 0.9688 +0.3125 0.375 1 +0.3125 0.4062 0 +0.3125 0.4062 0.03125 +0.3125 0.4062 0.0625 +0.3125 0.4062 0.09375 +0.3125 0.4062 0.125 +0.3125 0.4062 0.1562 +0.3125 0.4062 0.1875 +0.3125 0.4062 0.2188 +0.3125 0.4062 0.25 +0.3125 0.4062 0.2812 +0.3125 0.4062 0.3125 +0.3125 0.4062 0.3438 +0.3125 0.4062 0.375 +0.3125 0.4062 0.4062 +0.3125 0.4062 0.4375 +0.3125 0.4062 0.4688 +0.3125 0.4062 0.5 +0.3125 0.4062 0.5312 +0.3125 0.4062 0.5625 +0.3125 0.4062 0.5938 +0.3125 0.4062 0.625 +0.3125 0.4062 0.6562 +0.3125 0.4062 0.6875 +0.3125 0.4062 0.7188 +0.3125 0.4062 0.75 +0.3125 0.4062 0.7812 +0.3125 0.4062 0.8125 +0.3125 0.4062 0.8438 +0.3125 0.4062 0.875 +0.3125 0.4062 0.9062 +0.3125 0.4062 0.9375 +0.3125 0.4062 0.9688 +0.3125 0.4062 1 +0.3125 0.4375 0 +0.3125 0.4375 0.03125 +0.3125 0.4375 0.0625 +0.3125 0.4375 0.09375 +0.3125 0.4375 0.125 +0.3125 0.4375 0.1562 +0.3125 0.4375 0.1875 +0.3125 0.4375 0.2188 +0.3125 0.4375 0.25 +0.3125 0.4375 0.2812 +0.3125 0.4375 0.3125 +0.3125 0.4375 0.3438 +0.3125 0.4375 0.375 +0.3125 0.4375 0.4062 +0.3125 0.4375 0.4375 +0.3125 0.4375 0.4688 +0.3125 0.4375 0.5 +0.3125 0.4375 0.5312 +0.3125 0.4375 0.5625 +0.3125 0.4375 0.5938 +0.3125 0.4375 0.625 +0.3125 0.4375 0.6562 +0.3125 0.4375 0.6875 +0.3125 0.4375 0.7188 +0.3125 0.4375 0.75 +0.3125 0.4375 0.7812 +0.3125 0.4375 0.8125 +0.3125 0.4375 0.8438 +0.3125 0.4375 0.875 +0.3125 0.4375 0.9062 +0.3125 0.4375 0.9375 +0.3125 0.4375 0.9688 +0.3125 0.4375 1 +0.3125 0.4688 0 +0.3125 0.4688 0.03125 +0.3125 0.4688 0.0625 +0.3125 0.4688 0.09375 +0.3125 0.4688 0.125 +0.3125 0.4688 0.1562 +0.3125 0.4688 0.1875 +0.3125 0.4688 0.2188 +0.3125 0.4688 0.25 +0.3125 0.4688 0.2812 +0.3125 0.4688 0.3125 +0.3125 0.4688 0.3438 +0.3125 0.4688 0.375 +0.3125 0.4688 0.4062 +0.3125 0.4688 0.4375 +0.3125 0.4688 0.4688 +0.3125 0.4688 0.5 +0.3125 0.4688 0.5312 +0.3125 0.4688 0.5625 +0.3125 0.4688 0.5938 +0.3125 0.4688 0.625 +0.3125 0.4688 0.6562 +0.3125 0.4688 0.6875 +0.3125 0.4688 0.7188 +0.3125 0.4688 0.75 +0.3125 0.4688 0.7812 +0.3125 0.4688 0.8125 +0.3125 0.4688 0.8438 +0.3125 0.4688 0.875 +0.3125 0.4688 0.9062 +0.3125 0.4688 0.9375 +0.3125 0.4688 0.9688 +0.3125 0.4688 1 +0.3125 0.5 0 +0.3125 0.5 0.03125 +0.3125 0.5 0.0625 +0.3125 0.5 0.09375 +0.3125 0.5 0.125 +0.3125 0.5 0.1562 +0.3125 0.5 0.1875 +0.3125 0.5 0.2188 +0.3125 0.5 0.25 +0.3125 0.5 0.2812 +0.3125 0.5 0.3125 +0.3125 0.5 0.3438 +0.3125 0.5 0.375 +0.3125 0.5 0.4062 +0.3125 0.5 0.4375 +0.3125 0.5 0.4688 +0.3125 0.5 0.5 +0.3125 0.5 0.5312 +0.3125 0.5 0.5625 +0.3125 0.5 0.5938 +0.3125 0.5 0.625 +0.3125 0.5 0.6562 +0.3125 0.5 0.6875 +0.3125 0.5 0.7188 +0.3125 0.5 0.75 +0.3125 0.5 0.7812 +0.3125 0.5 0.8125 +0.3125 0.5 0.8438 +0.3125 0.5 0.875 +0.3125 0.5 0.9062 +0.3125 0.5 0.9375 +0.3125 0.5 0.9688 +0.3125 0.5 1 +0.3125 0.5312 0 +0.3125 0.5312 0.03125 +0.3125 0.5312 0.0625 +0.3125 0.5312 0.09375 +0.3125 0.5312 0.125 +0.3125 0.5312 0.1562 +0.3125 0.5312 0.1875 +0.3125 0.5312 0.2188 +0.3125 0.5312 0.25 +0.3125 0.5312 0.2812 +0.3125 0.5312 0.3125 +0.3125 0.5312 0.3438 +0.3125 0.5312 0.375 +0.3125 0.5312 0.4062 +0.3125 0.5312 0.4375 +0.3125 0.5312 0.4688 +0.3125 0.5312 0.5 +0.3125 0.5312 0.5312 +0.3125 0.5312 0.5625 +0.3125 0.5312 0.5938 +0.3125 0.5312 0.625 +0.3125 0.5312 0.6562 +0.3125 0.5312 0.6875 +0.3125 0.5312 0.7188 +0.3125 0.5312 0.75 +0.3125 0.5312 0.7812 +0.3125 0.5312 0.8125 +0.3125 0.5312 0.8438 +0.3125 0.5312 0.875 +0.3125 0.5312 0.9062 +0.3125 0.5312 0.9375 +0.3125 0.5312 0.9688 +0.3125 0.5312 1 +0.3125 0.5625 0 +0.3125 0.5625 0.03125 +0.3125 0.5625 0.0625 +0.3125 0.5625 0.09375 +0.3125 0.5625 0.125 +0.3125 0.5625 0.1562 +0.3125 0.5625 0.1875 +0.3125 0.5625 0.2188 +0.3125 0.5625 0.25 +0.3125 0.5625 0.2812 +0.3125 0.5625 0.3125 +0.3125 0.5625 0.3438 +0.3125 0.5625 0.375 +0.3125 0.5625 0.4062 +0.3125 0.5625 0.4375 +0.3125 0.5625 0.4688 +0.3125 0.5625 0.5 +0.3125 0.5625 0.5312 +0.3125 0.5625 0.5625 +0.3125 0.5625 0.5938 +0.3125 0.5625 0.625 +0.3125 0.5625 0.6562 +0.3125 0.5625 0.6875 +0.3125 0.5625 0.7188 +0.3125 0.5625 0.75 +0.3125 0.5625 0.7812 +0.3125 0.5625 0.8125 +0.3125 0.5625 0.8438 +0.3125 0.5625 0.875 +0.3125 0.5625 0.9062 +0.3125 0.5625 0.9375 +0.3125 0.5625 0.9688 +0.3125 0.5625 1 +0.3125 0.5938 0 +0.3125 0.5938 0.03125 +0.3125 0.5938 0.0625 +0.3125 0.5938 0.09375 +0.3125 0.5938 0.125 +0.3125 0.5938 0.1562 +0.3125 0.5938 0.1875 +0.3125 0.5938 0.2188 +0.3125 0.5938 0.25 +0.3125 0.5938 0.2812 +0.3125 0.5938 0.3125 +0.3125 0.5938 0.3438 +0.3125 0.5938 0.375 +0.3125 0.5938 0.4062 +0.3125 0.5938 0.4375 +0.3125 0.5938 0.4688 +0.3125 0.5938 0.5 +0.3125 0.5938 0.5312 +0.3125 0.5938 0.5625 +0.3125 0.5938 0.5938 +0.3125 0.5938 0.625 +0.3125 0.5938 0.6562 +0.3125 0.5938 0.6875 +0.3125 0.5938 0.7188 +0.3125 0.5938 0.75 +0.3125 0.5938 0.7812 +0.3125 0.5938 0.8125 +0.3125 0.5938 0.8438 +0.3125 0.5938 0.875 +0.3125 0.5938 0.9062 +0.3125 0.5938 0.9375 +0.3125 0.5938 0.9688 +0.3125 0.5938 1 +0.3125 0.625 0 +0.3125 0.625 0.03125 +0.3125 0.625 0.0625 +0.3125 0.625 0.09375 +0.3125 0.625 0.125 +0.3125 0.625 0.1562 +0.3125 0.625 0.1875 +0.3125 0.625 0.2188 +0.3125 0.625 0.25 +0.3125 0.625 0.2812 +0.3125 0.625 0.3125 +0.3125 0.625 0.3438 +0.3125 0.625 0.375 +0.3125 0.625 0.4062 +0.3125 0.625 0.4375 +0.3125 0.625 0.4688 +0.3125 0.625 0.5 +0.3125 0.625 0.5312 +0.3125 0.625 0.5625 +0.3125 0.625 0.5938 +0.3125 0.625 0.625 +0.3125 0.625 0.6562 +0.3125 0.625 0.6875 +0.3125 0.625 0.7188 +0.3125 0.625 0.75 +0.3125 0.625 0.7812 +0.3125 0.625 0.8125 +0.3125 0.625 0.8438 +0.3125 0.625 0.875 +0.3125 0.625 0.9062 +0.3125 0.625 0.9375 +0.3125 0.625 0.9688 +0.3125 0.625 1 +0.3125 0.6562 0 +0.3125 0.6562 0.03125 +0.3125 0.6562 0.0625 +0.3125 0.6562 0.09375 +0.3125 0.6562 0.125 +0.3125 0.6562 0.1562 +0.3125 0.6562 0.1875 +0.3125 0.6562 0.2188 +0.3125 0.6562 0.25 +0.3125 0.6562 0.2812 +0.3125 0.6562 0.3125 +0.3125 0.6562 0.3438 +0.3125 0.6562 0.375 +0.3125 0.6562 0.4062 +0.3125 0.6562 0.4375 +0.3125 0.6562 0.4688 +0.3125 0.6562 0.5 +0.3125 0.6562 0.5312 +0.3125 0.6562 0.5625 +0.3125 0.6562 0.5938 +0.3125 0.6562 0.625 +0.3125 0.6562 0.6562 +0.3125 0.6562 0.6875 +0.3125 0.6562 0.7188 +0.3125 0.6562 0.75 +0.3125 0.6562 0.7812 +0.3125 0.6562 0.8125 +0.3125 0.6562 0.8438 +0.3125 0.6562 0.875 +0.3125 0.6562 0.9062 +0.3125 0.6562 0.9375 +0.3125 0.6562 0.9688 +0.3125 0.6562 1 +0.3125 0.6875 0 +0.3125 0.6875 0.03125 +0.3125 0.6875 0.0625 +0.3125 0.6875 0.09375 +0.3125 0.6875 0.125 +0.3125 0.6875 0.1562 +0.3125 0.6875 0.1875 +0.3125 0.6875 0.2188 +0.3125 0.6875 0.25 +0.3125 0.6875 0.2812 +0.3125 0.6875 0.3125 +0.3125 0.6875 0.3438 +0.3125 0.6875 0.375 +0.3125 0.6875 0.4062 +0.3125 0.6875 0.4375 +0.3125 0.6875 0.4688 +0.3125 0.6875 0.5 +0.3125 0.6875 0.5312 +0.3125 0.6875 0.5625 +0.3125 0.6875 0.5938 +0.3125 0.6875 0.625 +0.3125 0.6875 0.6562 +0.3125 0.6875 0.6875 +0.3125 0.6875 0.7188 +0.3125 0.6875 0.75 +0.3125 0.6875 0.7812 +0.3125 0.6875 0.8125 +0.3125 0.6875 0.8438 +0.3125 0.6875 0.875 +0.3125 0.6875 0.9062 +0.3125 0.6875 0.9375 +0.3125 0.6875 0.9688 +0.3125 0.6875 1 +0.3125 0.7188 0 +0.3125 0.7188 0.03125 +0.3125 0.7188 0.0625 +0.3125 0.7188 0.09375 +0.3125 0.7188 0.125 +0.3125 0.7188 0.1562 +0.3125 0.7188 0.1875 +0.3125 0.7188 0.2188 +0.3125 0.7188 0.25 +0.3125 0.7188 0.2812 +0.3125 0.7188 0.3125 +0.3125 0.7188 0.3438 +0.3125 0.7188 0.375 +0.3125 0.7188 0.4062 +0.3125 0.7188 0.4375 +0.3125 0.7188 0.4688 +0.3125 0.7188 0.5 +0.3125 0.7188 0.5312 +0.3125 0.7188 0.5625 +0.3125 0.7188 0.5938 +0.3125 0.7188 0.625 +0.3125 0.7188 0.6562 +0.3125 0.7188 0.6875 +0.3125 0.7188 0.7188 +0.3125 0.7188 0.75 +0.3125 0.7188 0.7812 +0.3125 0.7188 0.8125 +0.3125 0.7188 0.8438 +0.3125 0.7188 0.875 +0.3125 0.7188 0.9062 +0.3125 0.7188 0.9375 +0.3125 0.7188 0.9688 +0.3125 0.7188 1 +0.3125 0.75 0 +0.3125 0.75 0.03125 +0.3125 0.75 0.0625 +0.3125 0.75 0.09375 +0.3125 0.75 0.125 +0.3125 0.75 0.1562 +0.3125 0.75 0.1875 +0.3125 0.75 0.2188 +0.3125 0.75 0.25 +0.3125 0.75 0.2812 +0.3125 0.75 0.3125 +0.3125 0.75 0.3438 +0.3125 0.75 0.375 +0.3125 0.75 0.4062 +0.3125 0.75 0.4375 +0.3125 0.75 0.4688 +0.3125 0.75 0.5 +0.3125 0.75 0.5312 +0.3125 0.75 0.5625 +0.3125 0.75 0.5938 +0.3125 0.75 0.625 +0.3125 0.75 0.6562 +0.3125 0.75 0.6875 +0.3125 0.75 0.7188 +0.3125 0.75 0.75 +0.3125 0.75 0.7812 +0.3125 0.75 0.8125 +0.3125 0.75 0.8438 +0.3125 0.75 0.875 +0.3125 0.75 0.9062 +0.3125 0.75 0.9375 +0.3125 0.75 0.9688 +0.3125 0.75 1 +0.3125 0.7812 0 +0.3125 0.7812 0.03125 +0.3125 0.7812 0.0625 +0.3125 0.7812 0.09375 +0.3125 0.7812 0.125 +0.3125 0.7812 0.1562 +0.3125 0.7812 0.1875 +0.3125 0.7812 0.2188 +0.3125 0.7812 0.25 +0.3125 0.7812 0.2812 +0.3125 0.7812 0.3125 +0.3125 0.7812 0.3438 +0.3125 0.7812 0.375 +0.3125 0.7812 0.4062 +0.3125 0.7812 0.4375 +0.3125 0.7812 0.4688 +0.3125 0.7812 0.5 +0.3125 0.7812 0.5312 +0.3125 0.7812 0.5625 +0.3125 0.7812 0.5938 +0.3125 0.7812 0.625 +0.3125 0.7812 0.6562 +0.3125 0.7812 0.6875 +0.3125 0.7812 0.7188 +0.3125 0.7812 0.75 +0.3125 0.7812 0.7812 +0.3125 0.7812 0.8125 +0.3125 0.7812 0.8438 +0.3125 0.7812 0.875 +0.3125 0.7812 0.9062 +0.3125 0.7812 0.9375 +0.3125 0.7812 0.9688 +0.3125 0.7812 1 +0.3125 0.8125 0 +0.3125 0.8125 0.03125 +0.3125 0.8125 0.0625 +0.3125 0.8125 0.09375 +0.3125 0.8125 0.125 +0.3125 0.8125 0.1562 +0.3125 0.8125 0.1875 +0.3125 0.8125 0.2188 +0.3125 0.8125 0.25 +0.3125 0.8125 0.2812 +0.3125 0.8125 0.3125 +0.3125 0.8125 0.3438 +0.3125 0.8125 0.375 +0.3125 0.8125 0.4062 +0.3125 0.8125 0.4375 +0.3125 0.8125 0.4688 +0.3125 0.8125 0.5 +0.3125 0.8125 0.5312 +0.3125 0.8125 0.5625 +0.3125 0.8125 0.5938 +0.3125 0.8125 0.625 +0.3125 0.8125 0.6562 +0.3125 0.8125 0.6875 +0.3125 0.8125 0.7188 +0.3125 0.8125 0.75 +0.3125 0.8125 0.7812 +0.3125 0.8125 0.8125 +0.3125 0.8125 0.8438 +0.3125 0.8125 0.875 +0.3125 0.8125 0.9062 +0.3125 0.8125 0.9375 +0.3125 0.8125 0.9688 +0.3125 0.8125 1 +0.3125 0.8438 0 +0.3125 0.8438 0.03125 +0.3125 0.8438 0.0625 +0.3125 0.8438 0.09375 +0.3125 0.8438 0.125 +0.3125 0.8438 0.1562 +0.3125 0.8438 0.1875 +0.3125 0.8438 0.2188 +0.3125 0.8438 0.25 +0.3125 0.8438 0.2812 +0.3125 0.8438 0.3125 +0.3125 0.8438 0.3438 +0.3125 0.8438 0.375 +0.3125 0.8438 0.4062 +0.3125 0.8438 0.4375 +0.3125 0.8438 0.4688 +0.3125 0.8438 0.5 +0.3125 0.8438 0.5312 +0.3125 0.8438 0.5625 +0.3125 0.8438 0.5938 +0.3125 0.8438 0.625 +0.3125 0.8438 0.6562 +0.3125 0.8438 0.6875 +0.3125 0.8438 0.7188 +0.3125 0.8438 0.75 +0.3125 0.8438 0.7812 +0.3125 0.8438 0.8125 +0.3125 0.8438 0.8438 +0.3125 0.8438 0.875 +0.3125 0.8438 0.9062 +0.3125 0.8438 0.9375 +0.3125 0.8438 0.9688 +0.3125 0.8438 1 +0.3125 0.875 0 +0.3125 0.875 0.03125 +0.3125 0.875 0.0625 +0.3125 0.875 0.09375 +0.3125 0.875 0.125 +0.3125 0.875 0.1562 +0.3125 0.875 0.1875 +0.3125 0.875 0.2188 +0.3125 0.875 0.25 +0.3125 0.875 0.2812 +0.3125 0.875 0.3125 +0.3125 0.875 0.3438 +0.3125 0.875 0.375 +0.3125 0.875 0.4062 +0.3125 0.875 0.4375 +0.3125 0.875 0.4688 +0.3125 0.875 0.5 +0.3125 0.875 0.5312 +0.3125 0.875 0.5625 +0.3125 0.875 0.5938 +0.3125 0.875 0.625 +0.3125 0.875 0.6562 +0.3125 0.875 0.6875 +0.3125 0.875 0.7188 +0.3125 0.875 0.75 +0.3125 0.875 0.7812 +0.3125 0.875 0.8125 +0.3125 0.875 0.8438 +0.3125 0.875 0.875 +0.3125 0.875 0.9062 +0.3125 0.875 0.9375 +0.3125 0.875 0.9688 +0.3125 0.875 1 +0.3125 0.9062 0 +0.3125 0.9062 0.03125 +0.3125 0.9062 0.0625 +0.3125 0.9062 0.09375 +0.3125 0.9062 0.125 +0.3125 0.9062 0.1562 +0.3125 0.9062 0.1875 +0.3125 0.9062 0.2188 +0.3125 0.9062 0.25 +0.3125 0.9062 0.2812 +0.3125 0.9062 0.3125 +0.3125 0.9062 0.3438 +0.3125 0.9062 0.375 +0.3125 0.9062 0.4062 +0.3125 0.9062 0.4375 +0.3125 0.9062 0.4688 +0.3125 0.9062 0.5 +0.3125 0.9062 0.5312 +0.3125 0.9062 0.5625 +0.3125 0.9062 0.5938 +0.3125 0.9062 0.625 +0.3125 0.9062 0.6562 +0.3125 0.9062 0.6875 +0.3125 0.9062 0.7188 +0.3125 0.9062 0.75 +0.3125 0.9062 0.7812 +0.3125 0.9062 0.8125 +0.3125 0.9062 0.8438 +0.3125 0.9062 0.875 +0.3125 0.9062 0.9062 +0.3125 0.9062 0.9375 +0.3125 0.9062 0.9688 +0.3125 0.9062 1 +0.3125 0.9375 0 +0.3125 0.9375 0.03125 +0.3125 0.9375 0.0625 +0.3125 0.9375 0.09375 +0.3125 0.9375 0.125 +0.3125 0.9375 0.1562 +0.3125 0.9375 0.1875 +0.3125 0.9375 0.2188 +0.3125 0.9375 0.25 +0.3125 0.9375 0.2812 +0.3125 0.9375 0.3125 +0.3125 0.9375 0.3438 +0.3125 0.9375 0.375 +0.3125 0.9375 0.4062 +0.3125 0.9375 0.4375 +0.3125 0.9375 0.4688 +0.3125 0.9375 0.5 +0.3125 0.9375 0.5312 +0.3125 0.9375 0.5625 +0.3125 0.9375 0.5938 +0.3125 0.9375 0.625 +0.3125 0.9375 0.6562 +0.3125 0.9375 0.6875 +0.3125 0.9375 0.7188 +0.3125 0.9375 0.75 +0.3125 0.9375 0.7812 +0.3125 0.9375 0.8125 +0.3125 0.9375 0.8438 +0.3125 0.9375 0.875 +0.3125 0.9375 0.9062 +0.3125 0.9375 0.9375 +0.3125 0.9375 0.9688 +0.3125 0.9375 1 +0.3125 0.9688 0 +0.3125 0.9688 0.03125 +0.3125 0.9688 0.0625 +0.3125 0.9688 0.09375 +0.3125 0.9688 0.125 +0.3125 0.9688 0.1562 +0.3125 0.9688 0.1875 +0.3125 0.9688 0.2188 +0.3125 0.9688 0.25 +0.3125 0.9688 0.2812 +0.3125 0.9688 0.3125 +0.3125 0.9688 0.3438 +0.3125 0.9688 0.375 +0.3125 0.9688 0.4062 +0.3125 0.9688 0.4375 +0.3125 0.9688 0.4688 +0.3125 0.9688 0.5 +0.3125 0.9688 0.5312 +0.3125 0.9688 0.5625 +0.3125 0.9688 0.5938 +0.3125 0.9688 0.625 +0.3125 0.9688 0.6562 +0.3125 0.9688 0.6875 +0.3125 0.9688 0.7188 +0.3125 0.9688 0.75 +0.3125 0.9688 0.7812 +0.3125 0.9688 0.8125 +0.3125 0.9688 0.8438 +0.3125 0.9688 0.875 +0.3125 0.9688 0.9062 +0.3125 0.9688 0.9375 +0.3125 0.9688 0.9688 +0.3125 0.9688 1 +0.3125 1 0 +0.3125 1 0.03125 +0.3125 1 0.0625 +0.3125 1 0.09375 +0.3125 1 0.125 +0.3125 1 0.1562 +0.3125 1 0.1875 +0.3125 1 0.2188 +0.3125 1 0.25 +0.3125 1 0.2812 +0.3125 1 0.3125 +0.3125 1 0.3438 +0.3125 1 0.375 +0.3125 1 0.4062 +0.3125 1 0.4375 +0.3125 1 0.4688 +0.3125 1 0.5 +0.3125 1 0.5312 +0.3125 1 0.5625 +0.3125 1 0.5938 +0.3125 1 0.625 +0.3125 1 0.6562 +0.3125 1 0.6875 +0.3125 1 0.7188 +0.3125 1 0.75 +0.3125 1 0.7812 +0.3125 1 0.8125 +0.3125 1 0.8438 +0.3125 1 0.875 +0.3125 1 0.9062 +0.3125 1 0.9375 +0.3125 1 0.9688 +0.3125 1 1 +0.3438 0 0 +0.3438 0 0.03125 +0.3438 0 0.0625 +0.3438 0 0.09375 +0.3438 0 0.125 +0.3438 0 0.1562 +0.3438 0 0.1875 +0.3438 0 0.2188 +0.3438 0 0.25 +0.3438 0 0.2812 +0.3438 0 0.3125 +0.3438 0 0.3438 +0.3438 0 0.375 +0.3438 0 0.4062 +0.3438 0 0.4375 +0.3438 0 0.4688 +0.3438 0 0.5 +0.3438 0 0.5312 +0.3438 0 0.5625 +0.3438 0 0.5938 +0.3438 0 0.625 +0.3438 0 0.6562 +0.3438 0 0.6875 +0.3438 0 0.7188 +0.3438 0 0.75 +0.3438 0 0.7812 +0.3438 0 0.8125 +0.3438 0 0.8438 +0.3438 0 0.875 +0.3438 0 0.9062 +0.3438 0 0.9375 +0.3438 0 0.9688 +0.3438 0 1 +0.3438 0.03125 0 +0.3438 0.03125 0.03125 +0.3438 0.03125 0.0625 +0.3438 0.03125 0.09375 +0.3438 0.03125 0.125 +0.3438 0.03125 0.1562 +0.3438 0.03125 0.1875 +0.3438 0.03125 0.2188 +0.3438 0.03125 0.25 +0.3438 0.03125 0.2812 +0.3438 0.03125 0.3125 +0.3438 0.03125 0.3438 +0.3438 0.03125 0.375 +0.3438 0.03125 0.4062 +0.3438 0.03125 0.4375 +0.3438 0.03125 0.4688 +0.3438 0.03125 0.5 +0.3438 0.03125 0.5312 +0.3438 0.03125 0.5625 +0.3438 0.03125 0.5938 +0.3438 0.03125 0.625 +0.3438 0.03125 0.6562 +0.3438 0.03125 0.6875 +0.3438 0.03125 0.7188 +0.3438 0.03125 0.75 +0.3438 0.03125 0.7812 +0.3438 0.03125 0.8125 +0.3438 0.03125 0.8438 +0.3438 0.03125 0.875 +0.3438 0.03125 0.9062 +0.3438 0.03125 0.9375 +0.3438 0.03125 0.9688 +0.3438 0.03125 1 +0.3438 0.0625 0 +0.3438 0.0625 0.03125 +0.3438 0.0625 0.0625 +0.3438 0.0625 0.09375 +0.3438 0.0625 0.125 +0.3438 0.0625 0.1562 +0.3438 0.0625 0.1875 +0.3438 0.0625 0.2188 +0.3438 0.0625 0.25 +0.3438 0.0625 0.2812 +0.3438 0.0625 0.3125 +0.3438 0.0625 0.3438 +0.3438 0.0625 0.375 +0.3438 0.0625 0.4062 +0.3438 0.0625 0.4375 +0.3438 0.0625 0.4688 +0.3438 0.0625 0.5 +0.3438 0.0625 0.5312 +0.3438 0.0625 0.5625 +0.3438 0.0625 0.5938 +0.3438 0.0625 0.625 +0.3438 0.0625 0.6562 +0.3438 0.0625 0.6875 +0.3438 0.0625 0.7188 +0.3438 0.0625 0.75 +0.3438 0.0625 0.7812 +0.3438 0.0625 0.8125 +0.3438 0.0625 0.8438 +0.3438 0.0625 0.875 +0.3438 0.0625 0.9062 +0.3438 0.0625 0.9375 +0.3438 0.0625 0.9688 +0.3438 0.0625 1 +0.3438 0.09375 0 +0.3438 0.09375 0.03125 +0.3438 0.09375 0.0625 +0.3438 0.09375 0.09375 +0.3438 0.09375 0.125 +0.3438 0.09375 0.1562 +0.3438 0.09375 0.1875 +0.3438 0.09375 0.2188 +0.3438 0.09375 0.25 +0.3438 0.09375 0.2812 +0.3438 0.09375 0.3125 +0.3438 0.09375 0.3438 +0.3438 0.09375 0.375 +0.3438 0.09375 0.4062 +0.3438 0.09375 0.4375 +0.3438 0.09375 0.4688 +0.3438 0.09375 0.5 +0.3438 0.09375 0.5312 +0.3438 0.09375 0.5625 +0.3438 0.09375 0.5938 +0.3438 0.09375 0.625 +0.3438 0.09375 0.6562 +0.3438 0.09375 0.6875 +0.3438 0.09375 0.7188 +0.3438 0.09375 0.75 +0.3438 0.09375 0.7812 +0.3438 0.09375 0.8125 +0.3438 0.09375 0.8438 +0.3438 0.09375 0.875 +0.3438 0.09375 0.9062 +0.3438 0.09375 0.9375 +0.3438 0.09375 0.9688 +0.3438 0.09375 1 +0.3438 0.125 0 +0.3438 0.125 0.03125 +0.3438 0.125 0.0625 +0.3438 0.125 0.09375 +0.3438 0.125 0.125 +0.3438 0.125 0.1562 +0.3438 0.125 0.1875 +0.3438 0.125 0.2188 +0.3438 0.125 0.25 +0.3438 0.125 0.2812 +0.3438 0.125 0.3125 +0.3438 0.125 0.3438 +0.3438 0.125 0.375 +0.3438 0.125 0.4062 +0.3438 0.125 0.4375 +0.3438 0.125 0.4688 +0.3438 0.125 0.5 +0.3438 0.125 0.5312 +0.3438 0.125 0.5625 +0.3438 0.125 0.5938 +0.3438 0.125 0.625 +0.3438 0.125 0.6562 +0.3438 0.125 0.6875 +0.3438 0.125 0.7188 +0.3438 0.125 0.75 +0.3438 0.125 0.7812 +0.3438 0.125 0.8125 +0.3438 0.125 0.8438 +0.3438 0.125 0.875 +0.3438 0.125 0.9062 +0.3438 0.125 0.9375 +0.3438 0.125 0.9688 +0.3438 0.125 1 +0.3438 0.1562 0 +0.3438 0.1562 0.03125 +0.3438 0.1562 0.0625 +0.3438 0.1562 0.09375 +0.3438 0.1562 0.125 +0.3438 0.1562 0.1562 +0.3438 0.1562 0.1875 +0.3438 0.1562 0.2188 +0.3438 0.1562 0.25 +0.3438 0.1562 0.2812 +0.3438 0.1562 0.3125 +0.3438 0.1562 0.3438 +0.3438 0.1562 0.375 +0.3438 0.1562 0.4062 +0.3438 0.1562 0.4375 +0.3438 0.1562 0.4688 +0.3438 0.1562 0.5 +0.3438 0.1562 0.5312 +0.3438 0.1562 0.5625 +0.3438 0.1562 0.5938 +0.3438 0.1562 0.625 +0.3438 0.1562 0.6562 +0.3438 0.1562 0.6875 +0.3438 0.1562 0.7188 +0.3438 0.1562 0.75 +0.3438 0.1562 0.7812 +0.3438 0.1562 0.8125 +0.3438 0.1562 0.8438 +0.3438 0.1562 0.875 +0.3438 0.1562 0.9062 +0.3438 0.1562 0.9375 +0.3438 0.1562 0.9688 +0.3438 0.1562 1 +0.3438 0.1875 0 +0.3438 0.1875 0.03125 +0.3438 0.1875 0.0625 +0.3438 0.1875 0.09375 +0.3438 0.1875 0.125 +0.3438 0.1875 0.1562 +0.3438 0.1875 0.1875 +0.3438 0.1875 0.2188 +0.3438 0.1875 0.25 +0.3438 0.1875 0.2812 +0.3438 0.1875 0.3125 +0.3438 0.1875 0.3438 +0.3438 0.1875 0.375 +0.3438 0.1875 0.4062 +0.3438 0.1875 0.4375 +0.3438 0.1875 0.4688 +0.3438 0.1875 0.5 +0.3438 0.1875 0.5312 +0.3438 0.1875 0.5625 +0.3438 0.1875 0.5938 +0.3438 0.1875 0.625 +0.3438 0.1875 0.6562 +0.3438 0.1875 0.6875 +0.3438 0.1875 0.7188 +0.3438 0.1875 0.75 +0.3438 0.1875 0.7812 +0.3438 0.1875 0.8125 +0.3438 0.1875 0.8438 +0.3438 0.1875 0.875 +0.3438 0.1875 0.9062 +0.3438 0.1875 0.9375 +0.3438 0.1875 0.9688 +0.3438 0.1875 1 +0.3438 0.2188 0 +0.3438 0.2188 0.03125 +0.3438 0.2188 0.0625 +0.3438 0.2188 0.09375 +0.3438 0.2188 0.125 +0.3438 0.2188 0.1562 +0.3438 0.2188 0.1875 +0.3438 0.2188 0.2188 +0.3438 0.2188 0.25 +0.3438 0.2188 0.2812 +0.3438 0.2188 0.3125 +0.3438 0.2188 0.3438 +0.3438 0.2188 0.375 +0.3438 0.2188 0.4062 +0.3438 0.2188 0.4375 +0.3438 0.2188 0.4688 +0.3438 0.2188 0.5 +0.3438 0.2188 0.5312 +0.3438 0.2188 0.5625 +0.3438 0.2188 0.5938 +0.3438 0.2188 0.625 +0.3438 0.2188 0.6562 +0.3438 0.2188 0.6875 +0.3438 0.2188 0.7188 +0.3438 0.2188 0.75 +0.3438 0.2188 0.7812 +0.3438 0.2188 0.8125 +0.3438 0.2188 0.8438 +0.3438 0.2188 0.875 +0.3438 0.2188 0.9062 +0.3438 0.2188 0.9375 +0.3438 0.2188 0.9688 +0.3438 0.2188 1 +0.3438 0.25 0 +0.3438 0.25 0.03125 +0.3438 0.25 0.0625 +0.3438 0.25 0.09375 +0.3438 0.25 0.125 +0.3438 0.25 0.1562 +0.3438 0.25 0.1875 +0.3438 0.25 0.2188 +0.3438 0.25 0.25 +0.3438 0.25 0.2812 +0.3438 0.25 0.3125 +0.3438 0.25 0.3438 +0.3438 0.25 0.375 +0.3438 0.25 0.4062 +0.3438 0.25 0.4375 +0.3438 0.25 0.4688 +0.3438 0.25 0.5 +0.3438 0.25 0.5312 +0.3438 0.25 0.5625 +0.3438 0.25 0.5938 +0.3438 0.25 0.625 +0.3438 0.25 0.6562 +0.3438 0.25 0.6875 +0.3438 0.25 0.7188 +0.3438 0.25 0.75 +0.3438 0.25 0.7812 +0.3438 0.25 0.8125 +0.3438 0.25 0.8438 +0.3438 0.25 0.875 +0.3438 0.25 0.9062 +0.3438 0.25 0.9375 +0.3438 0.25 0.9688 +0.3438 0.25 1 +0.3438 0.2812 0 +0.3438 0.2812 0.03125 +0.3438 0.2812 0.0625 +0.3438 0.2812 0.09375 +0.3438 0.2812 0.125 +0.3438 0.2812 0.1562 +0.3438 0.2812 0.1875 +0.3438 0.2812 0.2188 +0.3438 0.2812 0.25 +0.3438 0.2812 0.2812 +0.3438 0.2812 0.3125 +0.3438 0.2812 0.3438 +0.3438 0.2812 0.375 +0.3438 0.2812 0.4062 +0.3438 0.2812 0.4375 +0.3438 0.2812 0.4688 +0.3438 0.2812 0.5 +0.3438 0.2812 0.5312 +0.3438 0.2812 0.5625 +0.3438 0.2812 0.5938 +0.3438 0.2812 0.625 +0.3438 0.2812 0.6562 +0.3438 0.2812 0.6875 +0.3438 0.2812 0.7188 +0.3438 0.2812 0.75 +0.3438 0.2812 0.7812 +0.3438 0.2812 0.8125 +0.3438 0.2812 0.8438 +0.3438 0.2812 0.875 +0.3438 0.2812 0.9062 +0.3438 0.2812 0.9375 +0.3438 0.2812 0.9688 +0.3438 0.2812 1 +0.3438 0.3125 0 +0.3438 0.3125 0.03125 +0.3438 0.3125 0.0625 +0.3438 0.3125 0.09375 +0.3438 0.3125 0.125 +0.3438 0.3125 0.1562 +0.3438 0.3125 0.1875 +0.3438 0.3125 0.2188 +0.3438 0.3125 0.25 +0.3438 0.3125 0.2812 +0.3438 0.3125 0.3125 +0.3438 0.3125 0.3438 +0.3438 0.3125 0.375 +0.3438 0.3125 0.4062 +0.3438 0.3125 0.4375 +0.3438 0.3125 0.4688 +0.3438 0.3125 0.5 +0.3438 0.3125 0.5312 +0.3438 0.3125 0.5625 +0.3438 0.3125 0.5938 +0.3438 0.3125 0.625 +0.3438 0.3125 0.6562 +0.3438 0.3125 0.6875 +0.3438 0.3125 0.7188 +0.3438 0.3125 0.75 +0.3438 0.3125 0.7812 +0.3438 0.3125 0.8125 +0.3438 0.3125 0.8438 +0.3438 0.3125 0.875 +0.3438 0.3125 0.9062 +0.3438 0.3125 0.9375 +0.3438 0.3125 0.9688 +0.3438 0.3125 1 +0.3438 0.3438 0 +0.3438 0.3438 0.03125 +0.3438 0.3438 0.0625 +0.3438 0.3438 0.09375 +0.3438 0.3438 0.125 +0.3438 0.3438 0.1562 +0.3438 0.3438 0.1875 +0.3438 0.3438 0.2188 +0.3438 0.3438 0.25 +0.3438 0.3438 0.2812 +0.3438 0.3438 0.3125 +0.3438 0.3438 0.3438 +0.3438 0.3438 0.375 +0.3438 0.3438 0.4062 +0.3438 0.3438 0.4375 +0.3438 0.3438 0.4688 +0.3438 0.3438 0.5 +0.3438 0.3438 0.5312 +0.3438 0.3438 0.5625 +0.3438 0.3438 0.5938 +0.3438 0.3438 0.625 +0.3438 0.3438 0.6562 +0.3438 0.3438 0.6875 +0.3438 0.3438 0.7188 +0.3438 0.3438 0.75 +0.3438 0.3438 0.7812 +0.3438 0.3438 0.8125 +0.3438 0.3438 0.8438 +0.3438 0.3438 0.875 +0.3438 0.3438 0.9062 +0.3438 0.3438 0.9375 +0.3438 0.3438 0.9688 +0.3438 0.3438 1 +0.3438 0.375 0 +0.3438 0.375 0.03125 +0.3438 0.375 0.0625 +0.3438 0.375 0.09375 +0.3438 0.375 0.125 +0.3438 0.375 0.1562 +0.3438 0.375 0.1875 +0.3438 0.375 0.2188 +0.3438 0.375 0.25 +0.3438 0.375 0.2812 +0.3438 0.375 0.3125 +0.3438 0.375 0.3438 +0.3438 0.375 0.375 +0.3438 0.375 0.4062 +0.3438 0.375 0.4375 +0.3438 0.375 0.4688 +0.3438 0.375 0.5 +0.3438 0.375 0.5312 +0.3438 0.375 0.5625 +0.3438 0.375 0.5938 +0.3438 0.375 0.625 +0.3438 0.375 0.6562 +0.3438 0.375 0.6875 +0.3438 0.375 0.7188 +0.3438 0.375 0.75 +0.3438 0.375 0.7812 +0.3438 0.375 0.8125 +0.3438 0.375 0.8438 +0.3438 0.375 0.875 +0.3438 0.375 0.9062 +0.3438 0.375 0.9375 +0.3438 0.375 0.9688 +0.3438 0.375 1 +0.3438 0.4062 0 +0.3438 0.4062 0.03125 +0.3438 0.4062 0.0625 +0.3438 0.4062 0.09375 +0.3438 0.4062 0.125 +0.3438 0.4062 0.1562 +0.3438 0.4062 0.1875 +0.3438 0.4062 0.2188 +0.3438 0.4062 0.25 +0.3438 0.4062 0.2812 +0.3438 0.4062 0.3125 +0.3438 0.4062 0.3438 +0.3438 0.4062 0.375 +0.3438 0.4062 0.4062 +0.3438 0.4062 0.4375 +0.3438 0.4062 0.4688 +0.3438 0.4062 0.5 +0.3438 0.4062 0.5312 +0.3438 0.4062 0.5625 +0.3438 0.4062 0.5938 +0.3438 0.4062 0.625 +0.3438 0.4062 0.6562 +0.3438 0.4062 0.6875 +0.3438 0.4062 0.7188 +0.3438 0.4062 0.75 +0.3438 0.4062 0.7812 +0.3438 0.4062 0.8125 +0.3438 0.4062 0.8438 +0.3438 0.4062 0.875 +0.3438 0.4062 0.9062 +0.3438 0.4062 0.9375 +0.3438 0.4062 0.9688 +0.3438 0.4062 1 +0.3438 0.4375 0 +0.3438 0.4375 0.03125 +0.3438 0.4375 0.0625 +0.3438 0.4375 0.09375 +0.3438 0.4375 0.125 +0.3438 0.4375 0.1562 +0.3438 0.4375 0.1875 +0.3438 0.4375 0.2188 +0.3438 0.4375 0.25 +0.3438 0.4375 0.2812 +0.3438 0.4375 0.3125 +0.3438 0.4375 0.3438 +0.3438 0.4375 0.375 +0.3438 0.4375 0.4062 +0.3438 0.4375 0.4375 +0.3438 0.4375 0.4688 +0.3438 0.4375 0.5 +0.3438 0.4375 0.5312 +0.3438 0.4375 0.5625 +0.3438 0.4375 0.5938 +0.3438 0.4375 0.625 +0.3438 0.4375 0.6562 +0.3438 0.4375 0.6875 +0.3438 0.4375 0.7188 +0.3438 0.4375 0.75 +0.3438 0.4375 0.7812 +0.3438 0.4375 0.8125 +0.3438 0.4375 0.8438 +0.3438 0.4375 0.875 +0.3438 0.4375 0.9062 +0.3438 0.4375 0.9375 +0.3438 0.4375 0.9688 +0.3438 0.4375 1 +0.3438 0.4688 0 +0.3438 0.4688 0.03125 +0.3438 0.4688 0.0625 +0.3438 0.4688 0.09375 +0.3438 0.4688 0.125 +0.3438 0.4688 0.1562 +0.3438 0.4688 0.1875 +0.3438 0.4688 0.2188 +0.3438 0.4688 0.25 +0.3438 0.4688 0.2812 +0.3438 0.4688 0.3125 +0.3438 0.4688 0.3438 +0.3438 0.4688 0.375 +0.3438 0.4688 0.4062 +0.3438 0.4688 0.4375 +0.3438 0.4688 0.4688 +0.3438 0.4688 0.5 +0.3438 0.4688 0.5312 +0.3438 0.4688 0.5625 +0.3438 0.4688 0.5938 +0.3438 0.4688 0.625 +0.3438 0.4688 0.6562 +0.3438 0.4688 0.6875 +0.3438 0.4688 0.7188 +0.3438 0.4688 0.75 +0.3438 0.4688 0.7812 +0.3438 0.4688 0.8125 +0.3438 0.4688 0.8438 +0.3438 0.4688 0.875 +0.3438 0.4688 0.9062 +0.3438 0.4688 0.9375 +0.3438 0.4688 0.9688 +0.3438 0.4688 1 +0.3438 0.5 0 +0.3438 0.5 0.03125 +0.3438 0.5 0.0625 +0.3438 0.5 0.09375 +0.3438 0.5 0.125 +0.3438 0.5 0.1562 +0.3438 0.5 0.1875 +0.3438 0.5 0.2188 +0.3438 0.5 0.25 +0.3438 0.5 0.2812 +0.3438 0.5 0.3125 +0.3438 0.5 0.3438 +0.3438 0.5 0.375 +0.3438 0.5 0.4062 +0.3438 0.5 0.4375 +0.3438 0.5 0.4688 +0.3438 0.5 0.5 +0.3438 0.5 0.5312 +0.3438 0.5 0.5625 +0.3438 0.5 0.5938 +0.3438 0.5 0.625 +0.3438 0.5 0.6562 +0.3438 0.5 0.6875 +0.3438 0.5 0.7188 +0.3438 0.5 0.75 +0.3438 0.5 0.7812 +0.3438 0.5 0.8125 +0.3438 0.5 0.8438 +0.3438 0.5 0.875 +0.3438 0.5 0.9062 +0.3438 0.5 0.9375 +0.3438 0.5 0.9688 +0.3438 0.5 1 +0.3438 0.5312 0 +0.3438 0.5312 0.03125 +0.3438 0.5312 0.0625 +0.3438 0.5312 0.09375 +0.3438 0.5312 0.125 +0.3438 0.5312 0.1562 +0.3438 0.5312 0.1875 +0.3438 0.5312 0.2188 +0.3438 0.5312 0.25 +0.3438 0.5312 0.2812 +0.3438 0.5312 0.3125 +0.3438 0.5312 0.3438 +0.3438 0.5312 0.375 +0.3438 0.5312 0.4062 +0.3438 0.5312 0.4375 +0.3438 0.5312 0.4688 +0.3438 0.5312 0.5 +0.3438 0.5312 0.5312 +0.3438 0.5312 0.5625 +0.3438 0.5312 0.5938 +0.3438 0.5312 0.625 +0.3438 0.5312 0.6562 +0.3438 0.5312 0.6875 +0.3438 0.5312 0.7188 +0.3438 0.5312 0.75 +0.3438 0.5312 0.7812 +0.3438 0.5312 0.8125 +0.3438 0.5312 0.8438 +0.3438 0.5312 0.875 +0.3438 0.5312 0.9062 +0.3438 0.5312 0.9375 +0.3438 0.5312 0.9688 +0.3438 0.5312 1 +0.3438 0.5625 0 +0.3438 0.5625 0.03125 +0.3438 0.5625 0.0625 +0.3438 0.5625 0.09375 +0.3438 0.5625 0.125 +0.3438 0.5625 0.1562 +0.3438 0.5625 0.1875 +0.3438 0.5625 0.2188 +0.3438 0.5625 0.25 +0.3438 0.5625 0.2812 +0.3438 0.5625 0.3125 +0.3438 0.5625 0.3438 +0.3438 0.5625 0.375 +0.3438 0.5625 0.4062 +0.3438 0.5625 0.4375 +0.3438 0.5625 0.4688 +0.3438 0.5625 0.5 +0.3438 0.5625 0.5312 +0.3438 0.5625 0.5625 +0.3438 0.5625 0.5938 +0.3438 0.5625 0.625 +0.3438 0.5625 0.6562 +0.3438 0.5625 0.6875 +0.3438 0.5625 0.7188 +0.3438 0.5625 0.75 +0.3438 0.5625 0.7812 +0.3438 0.5625 0.8125 +0.3438 0.5625 0.8438 +0.3438 0.5625 0.875 +0.3438 0.5625 0.9062 +0.3438 0.5625 0.9375 +0.3438 0.5625 0.9688 +0.3438 0.5625 1 +0.3438 0.5938 0 +0.3438 0.5938 0.03125 +0.3438 0.5938 0.0625 +0.3438 0.5938 0.09375 +0.3438 0.5938 0.125 +0.3438 0.5938 0.1562 +0.3438 0.5938 0.1875 +0.3438 0.5938 0.2188 +0.3438 0.5938 0.25 +0.3438 0.5938 0.2812 +0.3438 0.5938 0.3125 +0.3438 0.5938 0.3438 +0.3438 0.5938 0.375 +0.3438 0.5938 0.4062 +0.3438 0.5938 0.4375 +0.3438 0.5938 0.4688 +0.3438 0.5938 0.5 +0.3438 0.5938 0.5312 +0.3438 0.5938 0.5625 +0.3438 0.5938 0.5938 +0.3438 0.5938 0.625 +0.3438 0.5938 0.6562 +0.3438 0.5938 0.6875 +0.3438 0.5938 0.7188 +0.3438 0.5938 0.75 +0.3438 0.5938 0.7812 +0.3438 0.5938 0.8125 +0.3438 0.5938 0.8438 +0.3438 0.5938 0.875 +0.3438 0.5938 0.9062 +0.3438 0.5938 0.9375 +0.3438 0.5938 0.9688 +0.3438 0.5938 1 +0.3438 0.625 0 +0.3438 0.625 0.03125 +0.3438 0.625 0.0625 +0.3438 0.625 0.09375 +0.3438 0.625 0.125 +0.3438 0.625 0.1562 +0.3438 0.625 0.1875 +0.3438 0.625 0.2188 +0.3438 0.625 0.25 +0.3438 0.625 0.2812 +0.3438 0.625 0.3125 +0.3438 0.625 0.3438 +0.3438 0.625 0.375 +0.3438 0.625 0.4062 +0.3438 0.625 0.4375 +0.3438 0.625 0.4688 +0.3438 0.625 0.5 +0.3438 0.625 0.5312 +0.3438 0.625 0.5625 +0.3438 0.625 0.5938 +0.3438 0.625 0.625 +0.3438 0.625 0.6562 +0.3438 0.625 0.6875 +0.3438 0.625 0.7188 +0.3438 0.625 0.75 +0.3438 0.625 0.7812 +0.3438 0.625 0.8125 +0.3438 0.625 0.8438 +0.3438 0.625 0.875 +0.3438 0.625 0.9062 +0.3438 0.625 0.9375 +0.3438 0.625 0.9688 +0.3438 0.625 1 +0.3438 0.6562 0 +0.3438 0.6562 0.03125 +0.3438 0.6562 0.0625 +0.3438 0.6562 0.09375 +0.3438 0.6562 0.125 +0.3438 0.6562 0.1562 +0.3438 0.6562 0.1875 +0.3438 0.6562 0.2188 +0.3438 0.6562 0.25 +0.3438 0.6562 0.2812 +0.3438 0.6562 0.3125 +0.3438 0.6562 0.3438 +0.3438 0.6562 0.375 +0.3438 0.6562 0.4062 +0.3438 0.6562 0.4375 +0.3438 0.6562 0.4688 +0.3438 0.6562 0.5 +0.3438 0.6562 0.5312 +0.3438 0.6562 0.5625 +0.3438 0.6562 0.5938 +0.3438 0.6562 0.625 +0.3438 0.6562 0.6562 +0.3438 0.6562 0.6875 +0.3438 0.6562 0.7188 +0.3438 0.6562 0.75 +0.3438 0.6562 0.7812 +0.3438 0.6562 0.8125 +0.3438 0.6562 0.8438 +0.3438 0.6562 0.875 +0.3438 0.6562 0.9062 +0.3438 0.6562 0.9375 +0.3438 0.6562 0.9688 +0.3438 0.6562 1 +0.3438 0.6875 0 +0.3438 0.6875 0.03125 +0.3438 0.6875 0.0625 +0.3438 0.6875 0.09375 +0.3438 0.6875 0.125 +0.3438 0.6875 0.1562 +0.3438 0.6875 0.1875 +0.3438 0.6875 0.2188 +0.3438 0.6875 0.25 +0.3438 0.6875 0.2812 +0.3438 0.6875 0.3125 +0.3438 0.6875 0.3438 +0.3438 0.6875 0.375 +0.3438 0.6875 0.4062 +0.3438 0.6875 0.4375 +0.3438 0.6875 0.4688 +0.3438 0.6875 0.5 +0.3438 0.6875 0.5312 +0.3438 0.6875 0.5625 +0.3438 0.6875 0.5938 +0.3438 0.6875 0.625 +0.3438 0.6875 0.6562 +0.3438 0.6875 0.6875 +0.3438 0.6875 0.7188 +0.3438 0.6875 0.75 +0.3438 0.6875 0.7812 +0.3438 0.6875 0.8125 +0.3438 0.6875 0.8438 +0.3438 0.6875 0.875 +0.3438 0.6875 0.9062 +0.3438 0.6875 0.9375 +0.3438 0.6875 0.9688 +0.3438 0.6875 1 +0.3438 0.7188 0 +0.3438 0.7188 0.03125 +0.3438 0.7188 0.0625 +0.3438 0.7188 0.09375 +0.3438 0.7188 0.125 +0.3438 0.7188 0.1562 +0.3438 0.7188 0.1875 +0.3438 0.7188 0.2188 +0.3438 0.7188 0.25 +0.3438 0.7188 0.2812 +0.3438 0.7188 0.3125 +0.3438 0.7188 0.3438 +0.3438 0.7188 0.375 +0.3438 0.7188 0.4062 +0.3438 0.7188 0.4375 +0.3438 0.7188 0.4688 +0.3438 0.7188 0.5 +0.3438 0.7188 0.5312 +0.3438 0.7188 0.5625 +0.3438 0.7188 0.5938 +0.3438 0.7188 0.625 +0.3438 0.7188 0.6562 +0.3438 0.7188 0.6875 +0.3438 0.7188 0.7188 +0.3438 0.7188 0.75 +0.3438 0.7188 0.7812 +0.3438 0.7188 0.8125 +0.3438 0.7188 0.8438 +0.3438 0.7188 0.875 +0.3438 0.7188 0.9062 +0.3438 0.7188 0.9375 +0.3438 0.7188 0.9688 +0.3438 0.7188 1 +0.3438 0.75 0 +0.3438 0.75 0.03125 +0.3438 0.75 0.0625 +0.3438 0.75 0.09375 +0.3438 0.75 0.125 +0.3438 0.75 0.1562 +0.3438 0.75 0.1875 +0.3438 0.75 0.2188 +0.3438 0.75 0.25 +0.3438 0.75 0.2812 +0.3438 0.75 0.3125 +0.3438 0.75 0.3438 +0.3438 0.75 0.375 +0.3438 0.75 0.4062 +0.3438 0.75 0.4375 +0.3438 0.75 0.4688 +0.3438 0.75 0.5 +0.3438 0.75 0.5312 +0.3438 0.75 0.5625 +0.3438 0.75 0.5938 +0.3438 0.75 0.625 +0.3438 0.75 0.6562 +0.3438 0.75 0.6875 +0.3438 0.75 0.7188 +0.3438 0.75 0.75 +0.3438 0.75 0.7812 +0.3438 0.75 0.8125 +0.3438 0.75 0.8438 +0.3438 0.75 0.875 +0.3438 0.75 0.9062 +0.3438 0.75 0.9375 +0.3438 0.75 0.9688 +0.3438 0.75 1 +0.3438 0.7812 0 +0.3438 0.7812 0.03125 +0.3438 0.7812 0.0625 +0.3438 0.7812 0.09375 +0.3438 0.7812 0.125 +0.3438 0.7812 0.1562 +0.3438 0.7812 0.1875 +0.3438 0.7812 0.2188 +0.3438 0.7812 0.25 +0.3438 0.7812 0.2812 +0.3438 0.7812 0.3125 +0.3438 0.7812 0.3438 +0.3438 0.7812 0.375 +0.3438 0.7812 0.4062 +0.3438 0.7812 0.4375 +0.3438 0.7812 0.4688 +0.3438 0.7812 0.5 +0.3438 0.7812 0.5312 +0.3438 0.7812 0.5625 +0.3438 0.7812 0.5938 +0.3438 0.7812 0.625 +0.3438 0.7812 0.6562 +0.3438 0.7812 0.6875 +0.3438 0.7812 0.7188 +0.3438 0.7812 0.75 +0.3438 0.7812 0.7812 +0.3438 0.7812 0.8125 +0.3438 0.7812 0.8438 +0.3438 0.7812 0.875 +0.3438 0.7812 0.9062 +0.3438 0.7812 0.9375 +0.3438 0.7812 0.9688 +0.3438 0.7812 1 +0.3438 0.8125 0 +0.3438 0.8125 0.03125 +0.3438 0.8125 0.0625 +0.3438 0.8125 0.09375 +0.3438 0.8125 0.125 +0.3438 0.8125 0.1562 +0.3438 0.8125 0.1875 +0.3438 0.8125 0.2188 +0.3438 0.8125 0.25 +0.3438 0.8125 0.2812 +0.3438 0.8125 0.3125 +0.3438 0.8125 0.3438 +0.3438 0.8125 0.375 +0.3438 0.8125 0.4062 +0.3438 0.8125 0.4375 +0.3438 0.8125 0.4688 +0.3438 0.8125 0.5 +0.3438 0.8125 0.5312 +0.3438 0.8125 0.5625 +0.3438 0.8125 0.5938 +0.3438 0.8125 0.625 +0.3438 0.8125 0.6562 +0.3438 0.8125 0.6875 +0.3438 0.8125 0.7188 +0.3438 0.8125 0.75 +0.3438 0.8125 0.7812 +0.3438 0.8125 0.8125 +0.3438 0.8125 0.8438 +0.3438 0.8125 0.875 +0.3438 0.8125 0.9062 +0.3438 0.8125 0.9375 +0.3438 0.8125 0.9688 +0.3438 0.8125 1 +0.3438 0.8438 0 +0.3438 0.8438 0.03125 +0.3438 0.8438 0.0625 +0.3438 0.8438 0.09375 +0.3438 0.8438 0.125 +0.3438 0.8438 0.1562 +0.3438 0.8438 0.1875 +0.3438 0.8438 0.2188 +0.3438 0.8438 0.25 +0.3438 0.8438 0.2812 +0.3438 0.8438 0.3125 +0.3438 0.8438 0.3438 +0.3438 0.8438 0.375 +0.3438 0.8438 0.4062 +0.3438 0.8438 0.4375 +0.3438 0.8438 0.4688 +0.3438 0.8438 0.5 +0.3438 0.8438 0.5312 +0.3438 0.8438 0.5625 +0.3438 0.8438 0.5938 +0.3438 0.8438 0.625 +0.3438 0.8438 0.6562 +0.3438 0.8438 0.6875 +0.3438 0.8438 0.7188 +0.3438 0.8438 0.75 +0.3438 0.8438 0.7812 +0.3438 0.8438 0.8125 +0.3438 0.8438 0.8438 +0.3438 0.8438 0.875 +0.3438 0.8438 0.9062 +0.3438 0.8438 0.9375 +0.3438 0.8438 0.9688 +0.3438 0.8438 1 +0.3438 0.875 0 +0.3438 0.875 0.03125 +0.3438 0.875 0.0625 +0.3438 0.875 0.09375 +0.3438 0.875 0.125 +0.3438 0.875 0.1562 +0.3438 0.875 0.1875 +0.3438 0.875 0.2188 +0.3438 0.875 0.25 +0.3438 0.875 0.2812 +0.3438 0.875 0.3125 +0.3438 0.875 0.3438 +0.3438 0.875 0.375 +0.3438 0.875 0.4062 +0.3438 0.875 0.4375 +0.3438 0.875 0.4688 +0.3438 0.875 0.5 +0.3438 0.875 0.5312 +0.3438 0.875 0.5625 +0.3438 0.875 0.5938 +0.3438 0.875 0.625 +0.3438 0.875 0.6562 +0.3438 0.875 0.6875 +0.3438 0.875 0.7188 +0.3438 0.875 0.75 +0.3438 0.875 0.7812 +0.3438 0.875 0.8125 +0.3438 0.875 0.8438 +0.3438 0.875 0.875 +0.3438 0.875 0.9062 +0.3438 0.875 0.9375 +0.3438 0.875 0.9688 +0.3438 0.875 1 +0.3438 0.9062 0 +0.3438 0.9062 0.03125 +0.3438 0.9062 0.0625 +0.3438 0.9062 0.09375 +0.3438 0.9062 0.125 +0.3438 0.9062 0.1562 +0.3438 0.9062 0.1875 +0.3438 0.9062 0.2188 +0.3438 0.9062 0.25 +0.3438 0.9062 0.2812 +0.3438 0.9062 0.3125 +0.3438 0.9062 0.3438 +0.3438 0.9062 0.375 +0.3438 0.9062 0.4062 +0.3438 0.9062 0.4375 +0.3438 0.9062 0.4688 +0.3438 0.9062 0.5 +0.3438 0.9062 0.5312 +0.3438 0.9062 0.5625 +0.3438 0.9062 0.5938 +0.3438 0.9062 0.625 +0.3438 0.9062 0.6562 +0.3438 0.9062 0.6875 +0.3438 0.9062 0.7188 +0.3438 0.9062 0.75 +0.3438 0.9062 0.7812 +0.3438 0.9062 0.8125 +0.3438 0.9062 0.8438 +0.3438 0.9062 0.875 +0.3438 0.9062 0.9062 +0.3438 0.9062 0.9375 +0.3438 0.9062 0.9688 +0.3438 0.9062 1 +0.3438 0.9375 0 +0.3438 0.9375 0.03125 +0.3438 0.9375 0.0625 +0.3438 0.9375 0.09375 +0.3438 0.9375 0.125 +0.3438 0.9375 0.1562 +0.3438 0.9375 0.1875 +0.3438 0.9375 0.2188 +0.3438 0.9375 0.25 +0.3438 0.9375 0.2812 +0.3438 0.9375 0.3125 +0.3438 0.9375 0.3438 +0.3438 0.9375 0.375 +0.3438 0.9375 0.4062 +0.3438 0.9375 0.4375 +0.3438 0.9375 0.4688 +0.3438 0.9375 0.5 +0.3438 0.9375 0.5312 +0.3438 0.9375 0.5625 +0.3438 0.9375 0.5938 +0.3438 0.9375 0.625 +0.3438 0.9375 0.6562 +0.3438 0.9375 0.6875 +0.3438 0.9375 0.7188 +0.3438 0.9375 0.75 +0.3438 0.9375 0.7812 +0.3438 0.9375 0.8125 +0.3438 0.9375 0.8438 +0.3438 0.9375 0.875 +0.3438 0.9375 0.9062 +0.3438 0.9375 0.9375 +0.3438 0.9375 0.9688 +0.3438 0.9375 1 +0.3438 0.9688 0 +0.3438 0.9688 0.03125 +0.3438 0.9688 0.0625 +0.3438 0.9688 0.09375 +0.3438 0.9688 0.125 +0.3438 0.9688 0.1562 +0.3438 0.9688 0.1875 +0.3438 0.9688 0.2188 +0.3438 0.9688 0.25 +0.3438 0.9688 0.2812 +0.3438 0.9688 0.3125 +0.3438 0.9688 0.3438 +0.3438 0.9688 0.375 +0.3438 0.9688 0.4062 +0.3438 0.9688 0.4375 +0.3438 0.9688 0.4688 +0.3438 0.9688 0.5 +0.3438 0.9688 0.5312 +0.3438 0.9688 0.5625 +0.3438 0.9688 0.5938 +0.3438 0.9688 0.625 +0.3438 0.9688 0.6562 +0.3438 0.9688 0.6875 +0.3438 0.9688 0.7188 +0.3438 0.9688 0.75 +0.3438 0.9688 0.7812 +0.3438 0.9688 0.8125 +0.3438 0.9688 0.8438 +0.3438 0.9688 0.875 +0.3438 0.9688 0.9062 +0.3438 0.9688 0.9375 +0.3438 0.9688 0.9688 +0.3438 0.9688 1 +0.3438 1 0 +0.3438 1 0.03125 +0.3438 1 0.0625 +0.3438 1 0.09375 +0.3438 1 0.125 +0.3438 1 0.1562 +0.3438 1 0.1875 +0.3438 1 0.2188 +0.3438 1 0.25 +0.3438 1 0.2812 +0.3438 1 0.3125 +0.3438 1 0.3438 +0.3438 1 0.375 +0.3438 1 0.4062 +0.3438 1 0.4375 +0.3438 1 0.4688 +0.3438 1 0.5 +0.3438 1 0.5312 +0.3438 1 0.5625 +0.3438 1 0.5938 +0.3438 1 0.625 +0.3438 1 0.6562 +0.3438 1 0.6875 +0.3438 1 0.7188 +0.3438 1 0.75 +0.3438 1 0.7812 +0.3438 1 0.8125 +0.3438 1 0.8438 +0.3438 1 0.875 +0.3438 1 0.9062 +0.3438 1 0.9375 +0.3438 1 0.9688 +0.3438 1 1 +0.375 0 0 +0.375 0 0.03125 +0.375 0 0.0625 +0.375 0 0.09375 +0.375 0 0.125 +0.375 0 0.1562 +0.375 0 0.1875 +0.375 0 0.2188 +0.375 0 0.25 +0.375 0 0.2812 +0.375 0 0.3125 +0.375 0 0.3438 +0.375 0 0.375 +0.375 0 0.4062 +0.375 0 0.4375 +0.375 0 0.4688 +0.375 0 0.5 +0.375 0 0.5312 +0.375 0 0.5625 +0.375 0 0.5938 +0.375 0 0.625 +0.375 0 0.6562 +0.375 0 0.6875 +0.375 0 0.7188 +0.375 0 0.75 +0.375 0 0.7812 +0.375 0 0.8125 +0.375 0 0.8438 +0.375 0 0.875 +0.375 0 0.9062 +0.375 0 0.9375 +0.375 0 0.9688 +0.375 0 1 +0.375 0.03125 0 +0.375 0.03125 0.03125 +0.375 0.03125 0.0625 +0.375 0.03125 0.09375 +0.375 0.03125 0.125 +0.375 0.03125 0.1562 +0.375 0.03125 0.1875 +0.375 0.03125 0.2188 +0.375 0.03125 0.25 +0.375 0.03125 0.2812 +0.375 0.03125 0.3125 +0.375 0.03125 0.3438 +0.375 0.03125 0.375 +0.375 0.03125 0.4062 +0.375 0.03125 0.4375 +0.375 0.03125 0.4688 +0.375 0.03125 0.5 +0.375 0.03125 0.5312 +0.375 0.03125 0.5625 +0.375 0.03125 0.5938 +0.375 0.03125 0.625 +0.375 0.03125 0.6562 +0.375 0.03125 0.6875 +0.375 0.03125 0.7188 +0.375 0.03125 0.75 +0.375 0.03125 0.7812 +0.375 0.03125 0.8125 +0.375 0.03125 0.8438 +0.375 0.03125 0.875 +0.375 0.03125 0.9062 +0.375 0.03125 0.9375 +0.375 0.03125 0.9688 +0.375 0.03125 1 +0.375 0.0625 0 +0.375 0.0625 0.03125 +0.375 0.0625 0.0625 +0.375 0.0625 0.09375 +0.375 0.0625 0.125 +0.375 0.0625 0.1562 +0.375 0.0625 0.1875 +0.375 0.0625 0.2188 +0.375 0.0625 0.25 +0.375 0.0625 0.2812 +0.375 0.0625 0.3125 +0.375 0.0625 0.3438 +0.375 0.0625 0.375 +0.375 0.0625 0.4062 +0.375 0.0625 0.4375 +0.375 0.0625 0.4688 +0.375 0.0625 0.5 +0.375 0.0625 0.5312 +0.375 0.0625 0.5625 +0.375 0.0625 0.5938 +0.375 0.0625 0.625 +0.375 0.0625 0.6562 +0.375 0.0625 0.6875 +0.375 0.0625 0.7188 +0.375 0.0625 0.75 +0.375 0.0625 0.7812 +0.375 0.0625 0.8125 +0.375 0.0625 0.8438 +0.375 0.0625 0.875 +0.375 0.0625 0.9062 +0.375 0.0625 0.9375 +0.375 0.0625 0.9688 +0.375 0.0625 1 +0.375 0.09375 0 +0.375 0.09375 0.03125 +0.375 0.09375 0.0625 +0.375 0.09375 0.09375 +0.375 0.09375 0.125 +0.375 0.09375 0.1562 +0.375 0.09375 0.1875 +0.375 0.09375 0.2188 +0.375 0.09375 0.25 +0.375 0.09375 0.2812 +0.375 0.09375 0.3125 +0.375 0.09375 0.3438 +0.375 0.09375 0.375 +0.375 0.09375 0.4062 +0.375 0.09375 0.4375 +0.375 0.09375 0.4688 +0.375 0.09375 0.5 +0.375 0.09375 0.5312 +0.375 0.09375 0.5625 +0.375 0.09375 0.5938 +0.375 0.09375 0.625 +0.375 0.09375 0.6562 +0.375 0.09375 0.6875 +0.375 0.09375 0.7188 +0.375 0.09375 0.75 +0.375 0.09375 0.7812 +0.375 0.09375 0.8125 +0.375 0.09375 0.8438 +0.375 0.09375 0.875 +0.375 0.09375 0.9062 +0.375 0.09375 0.9375 +0.375 0.09375 0.9688 +0.375 0.09375 1 +0.375 0.125 0 +0.375 0.125 0.03125 +0.375 0.125 0.0625 +0.375 0.125 0.09375 +0.375 0.125 0.125 +0.375 0.125 0.1562 +0.375 0.125 0.1875 +0.375 0.125 0.2188 +0.375 0.125 0.25 +0.375 0.125 0.2812 +0.375 0.125 0.3125 +0.375 0.125 0.3438 +0.375 0.125 0.375 +0.375 0.125 0.4062 +0.375 0.125 0.4375 +0.375 0.125 0.4688 +0.375 0.125 0.5 +0.375 0.125 0.5312 +0.375 0.125 0.5625 +0.375 0.125 0.5938 +0.375 0.125 0.625 +0.375 0.125 0.6562 +0.375 0.125 0.6875 +0.375 0.125 0.7188 +0.375 0.125 0.75 +0.375 0.125 0.7812 +0.375 0.125 0.8125 +0.375 0.125 0.8438 +0.375 0.125 0.875 +0.375 0.125 0.9062 +0.375 0.125 0.9375 +0.375 0.125 0.9688 +0.375 0.125 1 +0.375 0.1562 0 +0.375 0.1562 0.03125 +0.375 0.1562 0.0625 +0.375 0.1562 0.09375 +0.375 0.1562 0.125 +0.375 0.1562 0.1562 +0.375 0.1562 0.1875 +0.375 0.1562 0.2188 +0.375 0.1562 0.25 +0.375 0.1562 0.2812 +0.375 0.1562 0.3125 +0.375 0.1562 0.3438 +0.375 0.1562 0.375 +0.375 0.1562 0.4062 +0.375 0.1562 0.4375 +0.375 0.1562 0.4688 +0.375 0.1562 0.5 +0.375 0.1562 0.5312 +0.375 0.1562 0.5625 +0.375 0.1562 0.5938 +0.375 0.1562 0.625 +0.375 0.1562 0.6562 +0.375 0.1562 0.6875 +0.375 0.1562 0.7188 +0.375 0.1562 0.75 +0.375 0.1562 0.7812 +0.375 0.1562 0.8125 +0.375 0.1562 0.8438 +0.375 0.1562 0.875 +0.375 0.1562 0.9062 +0.375 0.1562 0.9375 +0.375 0.1562 0.9688 +0.375 0.1562 1 +0.375 0.1875 0 +0.375 0.1875 0.03125 +0.375 0.1875 0.0625 +0.375 0.1875 0.09375 +0.375 0.1875 0.125 +0.375 0.1875 0.1562 +0.375 0.1875 0.1875 +0.375 0.1875 0.2188 +0.375 0.1875 0.25 +0.375 0.1875 0.2812 +0.375 0.1875 0.3125 +0.375 0.1875 0.3438 +0.375 0.1875 0.375 +0.375 0.1875 0.4062 +0.375 0.1875 0.4375 +0.375 0.1875 0.4688 +0.375 0.1875 0.5 +0.375 0.1875 0.5312 +0.375 0.1875 0.5625 +0.375 0.1875 0.5938 +0.375 0.1875 0.625 +0.375 0.1875 0.6562 +0.375 0.1875 0.6875 +0.375 0.1875 0.7188 +0.375 0.1875 0.75 +0.375 0.1875 0.7812 +0.375 0.1875 0.8125 +0.375 0.1875 0.8438 +0.375 0.1875 0.875 +0.375 0.1875 0.9062 +0.375 0.1875 0.9375 +0.375 0.1875 0.9688 +0.375 0.1875 1 +0.375 0.2188 0 +0.375 0.2188 0.03125 +0.375 0.2188 0.0625 +0.375 0.2188 0.09375 +0.375 0.2188 0.125 +0.375 0.2188 0.1562 +0.375 0.2188 0.1875 +0.375 0.2188 0.2188 +0.375 0.2188 0.25 +0.375 0.2188 0.2812 +0.375 0.2188 0.3125 +0.375 0.2188 0.3438 +0.375 0.2188 0.375 +0.375 0.2188 0.4062 +0.375 0.2188 0.4375 +0.375 0.2188 0.4688 +0.375 0.2188 0.5 +0.375 0.2188 0.5312 +0.375 0.2188 0.5625 +0.375 0.2188 0.5938 +0.375 0.2188 0.625 +0.375 0.2188 0.6562 +0.375 0.2188 0.6875 +0.375 0.2188 0.7188 +0.375 0.2188 0.75 +0.375 0.2188 0.7812 +0.375 0.2188 0.8125 +0.375 0.2188 0.8438 +0.375 0.2188 0.875 +0.375 0.2188 0.9062 +0.375 0.2188 0.9375 +0.375 0.2188 0.9688 +0.375 0.2188 1 +0.375 0.25 0 +0.375 0.25 0.03125 +0.375 0.25 0.0625 +0.375 0.25 0.09375 +0.375 0.25 0.125 +0.375 0.25 0.1562 +0.375 0.25 0.1875 +0.375 0.25 0.2188 +0.375 0.25 0.25 +0.375 0.25 0.2812 +0.375 0.25 0.3125 +0.375 0.25 0.3438 +0.375 0.25 0.375 +0.375 0.25 0.4062 +0.375 0.25 0.4375 +0.375 0.25 0.4688 +0.375 0.25 0.5 +0.375 0.25 0.5312 +0.375 0.25 0.5625 +0.375 0.25 0.5938 +0.375 0.25 0.625 +0.375 0.25 0.6562 +0.375 0.25 0.6875 +0.375 0.25 0.7188 +0.375 0.25 0.75 +0.375 0.25 0.7812 +0.375 0.25 0.8125 +0.375 0.25 0.8438 +0.375 0.25 0.875 +0.375 0.25 0.9062 +0.375 0.25 0.9375 +0.375 0.25 0.9688 +0.375 0.25 1 +0.375 0.2812 0 +0.375 0.2812 0.03125 +0.375 0.2812 0.0625 +0.375 0.2812 0.09375 +0.375 0.2812 0.125 +0.375 0.2812 0.1562 +0.375 0.2812 0.1875 +0.375 0.2812 0.2188 +0.375 0.2812 0.25 +0.375 0.2812 0.2812 +0.375 0.2812 0.3125 +0.375 0.2812 0.3438 +0.375 0.2812 0.375 +0.375 0.2812 0.4062 +0.375 0.2812 0.4375 +0.375 0.2812 0.4688 +0.375 0.2812 0.5 +0.375 0.2812 0.5312 +0.375 0.2812 0.5625 +0.375 0.2812 0.5938 +0.375 0.2812 0.625 +0.375 0.2812 0.6562 +0.375 0.2812 0.6875 +0.375 0.2812 0.7188 +0.375 0.2812 0.75 +0.375 0.2812 0.7812 +0.375 0.2812 0.8125 +0.375 0.2812 0.8438 +0.375 0.2812 0.875 +0.375 0.2812 0.9062 +0.375 0.2812 0.9375 +0.375 0.2812 0.9688 +0.375 0.2812 1 +0.375 0.3125 0 +0.375 0.3125 0.03125 +0.375 0.3125 0.0625 +0.375 0.3125 0.09375 +0.375 0.3125 0.125 +0.375 0.3125 0.1562 +0.375 0.3125 0.1875 +0.375 0.3125 0.2188 +0.375 0.3125 0.25 +0.375 0.3125 0.2812 +0.375 0.3125 0.3125 +0.375 0.3125 0.3438 +0.375 0.3125 0.375 +0.375 0.3125 0.4062 +0.375 0.3125 0.4375 +0.375 0.3125 0.4688 +0.375 0.3125 0.5 +0.375 0.3125 0.5312 +0.375 0.3125 0.5625 +0.375 0.3125 0.5938 +0.375 0.3125 0.625 +0.375 0.3125 0.6562 +0.375 0.3125 0.6875 +0.375 0.3125 0.7188 +0.375 0.3125 0.75 +0.375 0.3125 0.7812 +0.375 0.3125 0.8125 +0.375 0.3125 0.8438 +0.375 0.3125 0.875 +0.375 0.3125 0.9062 +0.375 0.3125 0.9375 +0.375 0.3125 0.9688 +0.375 0.3125 1 +0.375 0.3438 0 +0.375 0.3438 0.03125 +0.375 0.3438 0.0625 +0.375 0.3438 0.09375 +0.375 0.3438 0.125 +0.375 0.3438 0.1562 +0.375 0.3438 0.1875 +0.375 0.3438 0.2188 +0.375 0.3438 0.25 +0.375 0.3438 0.2812 +0.375 0.3438 0.3125 +0.375 0.3438 0.3438 +0.375 0.3438 0.375 +0.375 0.3438 0.4062 +0.375 0.3438 0.4375 +0.375 0.3438 0.4688 +0.375 0.3438 0.5 +0.375 0.3438 0.5312 +0.375 0.3438 0.5625 +0.375 0.3438 0.5938 +0.375 0.3438 0.625 +0.375 0.3438 0.6562 +0.375 0.3438 0.6875 +0.375 0.3438 0.7188 +0.375 0.3438 0.75 +0.375 0.3438 0.7812 +0.375 0.3438 0.8125 +0.375 0.3438 0.8438 +0.375 0.3438 0.875 +0.375 0.3438 0.9062 +0.375 0.3438 0.9375 +0.375 0.3438 0.9688 +0.375 0.3438 1 +0.375 0.375 0 +0.375 0.375 0.03125 +0.375 0.375 0.0625 +0.375 0.375 0.09375 +0.375 0.375 0.125 +0.375 0.375 0.1562 +0.375 0.375 0.1875 +0.375 0.375 0.2188 +0.375 0.375 0.25 +0.375 0.375 0.2812 +0.375 0.375 0.3125 +0.375 0.375 0.3438 +0.375 0.375 0.375 +0.375 0.375 0.4062 +0.375 0.375 0.4375 +0.375 0.375 0.4688 +0.375 0.375 0.5 +0.375 0.375 0.5312 +0.375 0.375 0.5625 +0.375 0.375 0.5938 +0.375 0.375 0.625 +0.375 0.375 0.6562 +0.375 0.375 0.6875 +0.375 0.375 0.7188 +0.375 0.375 0.75 +0.375 0.375 0.7812 +0.375 0.375 0.8125 +0.375 0.375 0.8438 +0.375 0.375 0.875 +0.375 0.375 0.9062 +0.375 0.375 0.9375 +0.375 0.375 0.9688 +0.375 0.375 1 +0.375 0.4062 0 +0.375 0.4062 0.03125 +0.375 0.4062 0.0625 +0.375 0.4062 0.09375 +0.375 0.4062 0.125 +0.375 0.4062 0.1562 +0.375 0.4062 0.1875 +0.375 0.4062 0.2188 +0.375 0.4062 0.25 +0.375 0.4062 0.2812 +0.375 0.4062 0.3125 +0.375 0.4062 0.3438 +0.375 0.4062 0.375 +0.375 0.4062 0.4062 +0.375 0.4062 0.4375 +0.375 0.4062 0.4688 +0.375 0.4062 0.5 +0.375 0.4062 0.5312 +0.375 0.4062 0.5625 +0.375 0.4062 0.5938 +0.375 0.4062 0.625 +0.375 0.4062 0.6562 +0.375 0.4062 0.6875 +0.375 0.4062 0.7188 +0.375 0.4062 0.75 +0.375 0.4062 0.7812 +0.375 0.4062 0.8125 +0.375 0.4062 0.8438 +0.375 0.4062 0.875 +0.375 0.4062 0.9062 +0.375 0.4062 0.9375 +0.375 0.4062 0.9688 +0.375 0.4062 1 +0.375 0.4375 0 +0.375 0.4375 0.03125 +0.375 0.4375 0.0625 +0.375 0.4375 0.09375 +0.375 0.4375 0.125 +0.375 0.4375 0.1562 +0.375 0.4375 0.1875 +0.375 0.4375 0.2188 +0.375 0.4375 0.25 +0.375 0.4375 0.2812 +0.375 0.4375 0.3125 +0.375 0.4375 0.3438 +0.375 0.4375 0.375 +0.375 0.4375 0.4062 +0.375 0.4375 0.4375 +0.375 0.4375 0.4688 +0.375 0.4375 0.5 +0.375 0.4375 0.5312 +0.375 0.4375 0.5625 +0.375 0.4375 0.5938 +0.375 0.4375 0.625 +0.375 0.4375 0.6562 +0.375 0.4375 0.6875 +0.375 0.4375 0.7188 +0.375 0.4375 0.75 +0.375 0.4375 0.7812 +0.375 0.4375 0.8125 +0.375 0.4375 0.8438 +0.375 0.4375 0.875 +0.375 0.4375 0.9062 +0.375 0.4375 0.9375 +0.375 0.4375 0.9688 +0.375 0.4375 1 +0.375 0.4688 0 +0.375 0.4688 0.03125 +0.375 0.4688 0.0625 +0.375 0.4688 0.09375 +0.375 0.4688 0.125 +0.375 0.4688 0.1562 +0.375 0.4688 0.1875 +0.375 0.4688 0.2188 +0.375 0.4688 0.25 +0.375 0.4688 0.2812 +0.375 0.4688 0.3125 +0.375 0.4688 0.3438 +0.375 0.4688 0.375 +0.375 0.4688 0.4062 +0.375 0.4688 0.4375 +0.375 0.4688 0.4688 +0.375 0.4688 0.5 +0.375 0.4688 0.5312 +0.375 0.4688 0.5625 +0.375 0.4688 0.5938 +0.375 0.4688 0.625 +0.375 0.4688 0.6562 +0.375 0.4688 0.6875 +0.375 0.4688 0.7188 +0.375 0.4688 0.75 +0.375 0.4688 0.7812 +0.375 0.4688 0.8125 +0.375 0.4688 0.8438 +0.375 0.4688 0.875 +0.375 0.4688 0.9062 +0.375 0.4688 0.9375 +0.375 0.4688 0.9688 +0.375 0.4688 1 +0.375 0.5 0 +0.375 0.5 0.03125 +0.375 0.5 0.0625 +0.375 0.5 0.09375 +0.375 0.5 0.125 +0.375 0.5 0.1562 +0.375 0.5 0.1875 +0.375 0.5 0.2188 +0.375 0.5 0.25 +0.375 0.5 0.2812 +0.375 0.5 0.3125 +0.375 0.5 0.3438 +0.375 0.5 0.375 +0.375 0.5 0.4062 +0.375 0.5 0.4375 +0.375 0.5 0.4688 +0.375 0.5 0.5 +0.375 0.5 0.5312 +0.375 0.5 0.5625 +0.375 0.5 0.5938 +0.375 0.5 0.625 +0.375 0.5 0.6562 +0.375 0.5 0.6875 +0.375 0.5 0.7188 +0.375 0.5 0.75 +0.375 0.5 0.7812 +0.375 0.5 0.8125 +0.375 0.5 0.8438 +0.375 0.5 0.875 +0.375 0.5 0.9062 +0.375 0.5 0.9375 +0.375 0.5 0.9688 +0.375 0.5 1 +0.375 0.5312 0 +0.375 0.5312 0.03125 +0.375 0.5312 0.0625 +0.375 0.5312 0.09375 +0.375 0.5312 0.125 +0.375 0.5312 0.1562 +0.375 0.5312 0.1875 +0.375 0.5312 0.2188 +0.375 0.5312 0.25 +0.375 0.5312 0.2812 +0.375 0.5312 0.3125 +0.375 0.5312 0.3438 +0.375 0.5312 0.375 +0.375 0.5312 0.4062 +0.375 0.5312 0.4375 +0.375 0.5312 0.4688 +0.375 0.5312 0.5 +0.375 0.5312 0.5312 +0.375 0.5312 0.5625 +0.375 0.5312 0.5938 +0.375 0.5312 0.625 +0.375 0.5312 0.6562 +0.375 0.5312 0.6875 +0.375 0.5312 0.7188 +0.375 0.5312 0.75 +0.375 0.5312 0.7812 +0.375 0.5312 0.8125 +0.375 0.5312 0.8438 +0.375 0.5312 0.875 +0.375 0.5312 0.9062 +0.375 0.5312 0.9375 +0.375 0.5312 0.9688 +0.375 0.5312 1 +0.375 0.5625 0 +0.375 0.5625 0.03125 +0.375 0.5625 0.0625 +0.375 0.5625 0.09375 +0.375 0.5625 0.125 +0.375 0.5625 0.1562 +0.375 0.5625 0.1875 +0.375 0.5625 0.2188 +0.375 0.5625 0.25 +0.375 0.5625 0.2812 +0.375 0.5625 0.3125 +0.375 0.5625 0.3438 +0.375 0.5625 0.375 +0.375 0.5625 0.4062 +0.375 0.5625 0.4375 +0.375 0.5625 0.4688 +0.375 0.5625 0.5 +0.375 0.5625 0.5312 +0.375 0.5625 0.5625 +0.375 0.5625 0.5938 +0.375 0.5625 0.625 +0.375 0.5625 0.6562 +0.375 0.5625 0.6875 +0.375 0.5625 0.7188 +0.375 0.5625 0.75 +0.375 0.5625 0.7812 +0.375 0.5625 0.8125 +0.375 0.5625 0.8438 +0.375 0.5625 0.875 +0.375 0.5625 0.9062 +0.375 0.5625 0.9375 +0.375 0.5625 0.9688 +0.375 0.5625 1 +0.375 0.5938 0 +0.375 0.5938 0.03125 +0.375 0.5938 0.0625 +0.375 0.5938 0.09375 +0.375 0.5938 0.125 +0.375 0.5938 0.1562 +0.375 0.5938 0.1875 +0.375 0.5938 0.2188 +0.375 0.5938 0.25 +0.375 0.5938 0.2812 +0.375 0.5938 0.3125 +0.375 0.5938 0.3438 +0.375 0.5938 0.375 +0.375 0.5938 0.4062 +0.375 0.5938 0.4375 +0.375 0.5938 0.4688 +0.375 0.5938 0.5 +0.375 0.5938 0.5312 +0.375 0.5938 0.5625 +0.375 0.5938 0.5938 +0.375 0.5938 0.625 +0.375 0.5938 0.6562 +0.375 0.5938 0.6875 +0.375 0.5938 0.7188 +0.375 0.5938 0.75 +0.375 0.5938 0.7812 +0.375 0.5938 0.8125 +0.375 0.5938 0.8438 +0.375 0.5938 0.875 +0.375 0.5938 0.9062 +0.375 0.5938 0.9375 +0.375 0.5938 0.9688 +0.375 0.5938 1 +0.375 0.625 0 +0.375 0.625 0.03125 +0.375 0.625 0.0625 +0.375 0.625 0.09375 +0.375 0.625 0.125 +0.375 0.625 0.1562 +0.375 0.625 0.1875 +0.375 0.625 0.2188 +0.375 0.625 0.25 +0.375 0.625 0.2812 +0.375 0.625 0.3125 +0.375 0.625 0.3438 +0.375 0.625 0.375 +0.375 0.625 0.4062 +0.375 0.625 0.4375 +0.375 0.625 0.4688 +0.375 0.625 0.5 +0.375 0.625 0.5312 +0.375 0.625 0.5625 +0.375 0.625 0.5938 +0.375 0.625 0.625 +0.375 0.625 0.6562 +0.375 0.625 0.6875 +0.375 0.625 0.7188 +0.375 0.625 0.75 +0.375 0.625 0.7812 +0.375 0.625 0.8125 +0.375 0.625 0.8438 +0.375 0.625 0.875 +0.375 0.625 0.9062 +0.375 0.625 0.9375 +0.375 0.625 0.9688 +0.375 0.625 1 +0.375 0.6562 0 +0.375 0.6562 0.03125 +0.375 0.6562 0.0625 +0.375 0.6562 0.09375 +0.375 0.6562 0.125 +0.375 0.6562 0.1562 +0.375 0.6562 0.1875 +0.375 0.6562 0.2188 +0.375 0.6562 0.25 +0.375 0.6562 0.2812 +0.375 0.6562 0.3125 +0.375 0.6562 0.3438 +0.375 0.6562 0.375 +0.375 0.6562 0.4062 +0.375 0.6562 0.4375 +0.375 0.6562 0.4688 +0.375 0.6562 0.5 +0.375 0.6562 0.5312 +0.375 0.6562 0.5625 +0.375 0.6562 0.5938 +0.375 0.6562 0.625 +0.375 0.6562 0.6562 +0.375 0.6562 0.6875 +0.375 0.6562 0.7188 +0.375 0.6562 0.75 +0.375 0.6562 0.7812 +0.375 0.6562 0.8125 +0.375 0.6562 0.8438 +0.375 0.6562 0.875 +0.375 0.6562 0.9062 +0.375 0.6562 0.9375 +0.375 0.6562 0.9688 +0.375 0.6562 1 +0.375 0.6875 0 +0.375 0.6875 0.03125 +0.375 0.6875 0.0625 +0.375 0.6875 0.09375 +0.375 0.6875 0.125 +0.375 0.6875 0.1562 +0.375 0.6875 0.1875 +0.375 0.6875 0.2188 +0.375 0.6875 0.25 +0.375 0.6875 0.2812 +0.375 0.6875 0.3125 +0.375 0.6875 0.3438 +0.375 0.6875 0.375 +0.375 0.6875 0.4062 +0.375 0.6875 0.4375 +0.375 0.6875 0.4688 +0.375 0.6875 0.5 +0.375 0.6875 0.5312 +0.375 0.6875 0.5625 +0.375 0.6875 0.5938 +0.375 0.6875 0.625 +0.375 0.6875 0.6562 +0.375 0.6875 0.6875 +0.375 0.6875 0.7188 +0.375 0.6875 0.75 +0.375 0.6875 0.7812 +0.375 0.6875 0.8125 +0.375 0.6875 0.8438 +0.375 0.6875 0.875 +0.375 0.6875 0.9062 +0.375 0.6875 0.9375 +0.375 0.6875 0.9688 +0.375 0.6875 1 +0.375 0.7188 0 +0.375 0.7188 0.03125 +0.375 0.7188 0.0625 +0.375 0.7188 0.09375 +0.375 0.7188 0.125 +0.375 0.7188 0.1562 +0.375 0.7188 0.1875 +0.375 0.7188 0.2188 +0.375 0.7188 0.25 +0.375 0.7188 0.2812 +0.375 0.7188 0.3125 +0.375 0.7188 0.3438 +0.375 0.7188 0.375 +0.375 0.7188 0.4062 +0.375 0.7188 0.4375 +0.375 0.7188 0.4688 +0.375 0.7188 0.5 +0.375 0.7188 0.5312 +0.375 0.7188 0.5625 +0.375 0.7188 0.5938 +0.375 0.7188 0.625 +0.375 0.7188 0.6562 +0.375 0.7188 0.6875 +0.375 0.7188 0.7188 +0.375 0.7188 0.75 +0.375 0.7188 0.7812 +0.375 0.7188 0.8125 +0.375 0.7188 0.8438 +0.375 0.7188 0.875 +0.375 0.7188 0.9062 +0.375 0.7188 0.9375 +0.375 0.7188 0.9688 +0.375 0.7188 1 +0.375 0.75 0 +0.375 0.75 0.03125 +0.375 0.75 0.0625 +0.375 0.75 0.09375 +0.375 0.75 0.125 +0.375 0.75 0.1562 +0.375 0.75 0.1875 +0.375 0.75 0.2188 +0.375 0.75 0.25 +0.375 0.75 0.2812 +0.375 0.75 0.3125 +0.375 0.75 0.3438 +0.375 0.75 0.375 +0.375 0.75 0.4062 +0.375 0.75 0.4375 +0.375 0.75 0.4688 +0.375 0.75 0.5 +0.375 0.75 0.5312 +0.375 0.75 0.5625 +0.375 0.75 0.5938 +0.375 0.75 0.625 +0.375 0.75 0.6562 +0.375 0.75 0.6875 +0.375 0.75 0.7188 +0.375 0.75 0.75 +0.375 0.75 0.7812 +0.375 0.75 0.8125 +0.375 0.75 0.8438 +0.375 0.75 0.875 +0.375 0.75 0.9062 +0.375 0.75 0.9375 +0.375 0.75 0.9688 +0.375 0.75 1 +0.375 0.7812 0 +0.375 0.7812 0.03125 +0.375 0.7812 0.0625 +0.375 0.7812 0.09375 +0.375 0.7812 0.125 +0.375 0.7812 0.1562 +0.375 0.7812 0.1875 +0.375 0.7812 0.2188 +0.375 0.7812 0.25 +0.375 0.7812 0.2812 +0.375 0.7812 0.3125 +0.375 0.7812 0.3438 +0.375 0.7812 0.375 +0.375 0.7812 0.4062 +0.375 0.7812 0.4375 +0.375 0.7812 0.4688 +0.375 0.7812 0.5 +0.375 0.7812 0.5312 +0.375 0.7812 0.5625 +0.375 0.7812 0.5938 +0.375 0.7812 0.625 +0.375 0.7812 0.6562 +0.375 0.7812 0.6875 +0.375 0.7812 0.7188 +0.375 0.7812 0.75 +0.375 0.7812 0.7812 +0.375 0.7812 0.8125 +0.375 0.7812 0.8438 +0.375 0.7812 0.875 +0.375 0.7812 0.9062 +0.375 0.7812 0.9375 +0.375 0.7812 0.9688 +0.375 0.7812 1 +0.375 0.8125 0 +0.375 0.8125 0.03125 +0.375 0.8125 0.0625 +0.375 0.8125 0.09375 +0.375 0.8125 0.125 +0.375 0.8125 0.1562 +0.375 0.8125 0.1875 +0.375 0.8125 0.2188 +0.375 0.8125 0.25 +0.375 0.8125 0.2812 +0.375 0.8125 0.3125 +0.375 0.8125 0.3438 +0.375 0.8125 0.375 +0.375 0.8125 0.4062 +0.375 0.8125 0.4375 +0.375 0.8125 0.4688 +0.375 0.8125 0.5 +0.375 0.8125 0.5312 +0.375 0.8125 0.5625 +0.375 0.8125 0.5938 +0.375 0.8125 0.625 +0.375 0.8125 0.6562 +0.375 0.8125 0.6875 +0.375 0.8125 0.7188 +0.375 0.8125 0.75 +0.375 0.8125 0.7812 +0.375 0.8125 0.8125 +0.375 0.8125 0.8438 +0.375 0.8125 0.875 +0.375 0.8125 0.9062 +0.375 0.8125 0.9375 +0.375 0.8125 0.9688 +0.375 0.8125 1 +0.375 0.8438 0 +0.375 0.8438 0.03125 +0.375 0.8438 0.0625 +0.375 0.8438 0.09375 +0.375 0.8438 0.125 +0.375 0.8438 0.1562 +0.375 0.8438 0.1875 +0.375 0.8438 0.2188 +0.375 0.8438 0.25 +0.375 0.8438 0.2812 +0.375 0.8438 0.3125 +0.375 0.8438 0.3438 +0.375 0.8438 0.375 +0.375 0.8438 0.4062 +0.375 0.8438 0.4375 +0.375 0.8438 0.4688 +0.375 0.8438 0.5 +0.375 0.8438 0.5312 +0.375 0.8438 0.5625 +0.375 0.8438 0.5938 +0.375 0.8438 0.625 +0.375 0.8438 0.6562 +0.375 0.8438 0.6875 +0.375 0.8438 0.7188 +0.375 0.8438 0.75 +0.375 0.8438 0.7812 +0.375 0.8438 0.8125 +0.375 0.8438 0.8438 +0.375 0.8438 0.875 +0.375 0.8438 0.9062 +0.375 0.8438 0.9375 +0.375 0.8438 0.9688 +0.375 0.8438 1 +0.375 0.875 0 +0.375 0.875 0.03125 +0.375 0.875 0.0625 +0.375 0.875 0.09375 +0.375 0.875 0.125 +0.375 0.875 0.1562 +0.375 0.875 0.1875 +0.375 0.875 0.2188 +0.375 0.875 0.25 +0.375 0.875 0.2812 +0.375 0.875 0.3125 +0.375 0.875 0.3438 +0.375 0.875 0.375 +0.375 0.875 0.4062 +0.375 0.875 0.4375 +0.375 0.875 0.4688 +0.375 0.875 0.5 +0.375 0.875 0.5312 +0.375 0.875 0.5625 +0.375 0.875 0.5938 +0.375 0.875 0.625 +0.375 0.875 0.6562 +0.375 0.875 0.6875 +0.375 0.875 0.7188 +0.375 0.875 0.75 +0.375 0.875 0.7812 +0.375 0.875 0.8125 +0.375 0.875 0.8438 +0.375 0.875 0.875 +0.375 0.875 0.9062 +0.375 0.875 0.9375 +0.375 0.875 0.9688 +0.375 0.875 1 +0.375 0.9062 0 +0.375 0.9062 0.03125 +0.375 0.9062 0.0625 +0.375 0.9062 0.09375 +0.375 0.9062 0.125 +0.375 0.9062 0.1562 +0.375 0.9062 0.1875 +0.375 0.9062 0.2188 +0.375 0.9062 0.25 +0.375 0.9062 0.2812 +0.375 0.9062 0.3125 +0.375 0.9062 0.3438 +0.375 0.9062 0.375 +0.375 0.9062 0.4062 +0.375 0.9062 0.4375 +0.375 0.9062 0.4688 +0.375 0.9062 0.5 +0.375 0.9062 0.5312 +0.375 0.9062 0.5625 +0.375 0.9062 0.5938 +0.375 0.9062 0.625 +0.375 0.9062 0.6562 +0.375 0.9062 0.6875 +0.375 0.9062 0.7188 +0.375 0.9062 0.75 +0.375 0.9062 0.7812 +0.375 0.9062 0.8125 +0.375 0.9062 0.8438 +0.375 0.9062 0.875 +0.375 0.9062 0.9062 +0.375 0.9062 0.9375 +0.375 0.9062 0.9688 +0.375 0.9062 1 +0.375 0.9375 0 +0.375 0.9375 0.03125 +0.375 0.9375 0.0625 +0.375 0.9375 0.09375 +0.375 0.9375 0.125 +0.375 0.9375 0.1562 +0.375 0.9375 0.1875 +0.375 0.9375 0.2188 +0.375 0.9375 0.25 +0.375 0.9375 0.2812 +0.375 0.9375 0.3125 +0.375 0.9375 0.3438 +0.375 0.9375 0.375 +0.375 0.9375 0.4062 +0.375 0.9375 0.4375 +0.375 0.9375 0.4688 +0.375 0.9375 0.5 +0.375 0.9375 0.5312 +0.375 0.9375 0.5625 +0.375 0.9375 0.5938 +0.375 0.9375 0.625 +0.375 0.9375 0.6562 +0.375 0.9375 0.6875 +0.375 0.9375 0.7188 +0.375 0.9375 0.75 +0.375 0.9375 0.7812 +0.375 0.9375 0.8125 +0.375 0.9375 0.8438 +0.375 0.9375 0.875 +0.375 0.9375 0.9062 +0.375 0.9375 0.9375 +0.375 0.9375 0.9688 +0.375 0.9375 1 +0.375 0.9688 0 +0.375 0.9688 0.03125 +0.375 0.9688 0.0625 +0.375 0.9688 0.09375 +0.375 0.9688 0.125 +0.375 0.9688 0.1562 +0.375 0.9688 0.1875 +0.375 0.9688 0.2188 +0.375 0.9688 0.25 +0.375 0.9688 0.2812 +0.375 0.9688 0.3125 +0.375 0.9688 0.3438 +0.375 0.9688 0.375 +0.375 0.9688 0.4062 +0.375 0.9688 0.4375 +0.375 0.9688 0.4688 +0.375 0.9688 0.5 +0.375 0.9688 0.5312 +0.375 0.9688 0.5625 +0.375 0.9688 0.5938 +0.375 0.9688 0.625 +0.375 0.9688 0.6562 +0.375 0.9688 0.6875 +0.375 0.9688 0.7188 +0.375 0.9688 0.75 +0.375 0.9688 0.7812 +0.375 0.9688 0.8125 +0.375 0.9688 0.8438 +0.375 0.9688 0.875 +0.375 0.9688 0.9062 +0.375 0.9688 0.9375 +0.375 0.9688 0.9688 +0.375 0.9688 1 +0.375 1 0 +0.375 1 0.03125 +0.375 1 0.0625 +0.375 1 0.09375 +0.375 1 0.125 +0.375 1 0.1562 +0.375 1 0.1875 +0.375 1 0.2188 +0.375 1 0.25 +0.375 1 0.2812 +0.375 1 0.3125 +0.375 1 0.3438 +0.375 1 0.375 +0.375 1 0.4062 +0.375 1 0.4375 +0.375 1 0.4688 +0.375 1 0.5 +0.375 1 0.5312 +0.375 1 0.5625 +0.375 1 0.5938 +0.375 1 0.625 +0.375 1 0.6562 +0.375 1 0.6875 +0.375 1 0.7188 +0.375 1 0.75 +0.375 1 0.7812 +0.375 1 0.8125 +0.375 1 0.8438 +0.375 1 0.875 +0.375 1 0.9062 +0.375 1 0.9375 +0.375 1 0.9688 +0.375 1 1 +0.4062 0 0 +0.4062 0 0.03125 +0.4062 0 0.0625 +0.4062 0 0.09375 +0.4062 0 0.125 +0.4062 0 0.1562 +0.4062 0 0.1875 +0.4062 0 0.2188 +0.4062 0 0.25 +0.4062 0 0.2812 +0.4062 0 0.3125 +0.4062 0 0.3438 +0.4062 0 0.375 +0.4062 0 0.4062 +0.4062 0 0.4375 +0.4062 0 0.4688 +0.4062 0 0.5 +0.4062 0 0.5312 +0.4062 0 0.5625 +0.4062 0 0.5938 +0.4062 0 0.625 +0.4062 0 0.6562 +0.4062 0 0.6875 +0.4062 0 0.7188 +0.4062 0 0.75 +0.4062 0 0.7812 +0.4062 0 0.8125 +0.4062 0 0.8438 +0.4062 0 0.875 +0.4062 0 0.9062 +0.4062 0 0.9375 +0.4062 0 0.9688 +0.4062 0 1 +0.4062 0.03125 0 +0.4062 0.03125 0.03125 +0.4062 0.03125 0.0625 +0.4062 0.03125 0.09375 +0.4062 0.03125 0.125 +0.4062 0.03125 0.1562 +0.4062 0.03125 0.1875 +0.4062 0.03125 0.2188 +0.4062 0.03125 0.25 +0.4062 0.03125 0.2812 +0.4062 0.03125 0.3125 +0.4062 0.03125 0.3438 +0.4062 0.03125 0.375 +0.4062 0.03125 0.4062 +0.4062 0.03125 0.4375 +0.4062 0.03125 0.4688 +0.4062 0.03125 0.5 +0.4062 0.03125 0.5312 +0.4062 0.03125 0.5625 +0.4062 0.03125 0.5938 +0.4062 0.03125 0.625 +0.4062 0.03125 0.6562 +0.4062 0.03125 0.6875 +0.4062 0.03125 0.7188 +0.4062 0.03125 0.75 +0.4062 0.03125 0.7812 +0.4062 0.03125 0.8125 +0.4062 0.03125 0.8438 +0.4062 0.03125 0.875 +0.4062 0.03125 0.9062 +0.4062 0.03125 0.9375 +0.4062 0.03125 0.9688 +0.4062 0.03125 1 +0.4062 0.0625 0 +0.4062 0.0625 0.03125 +0.4062 0.0625 0.0625 +0.4062 0.0625 0.09375 +0.4062 0.0625 0.125 +0.4062 0.0625 0.1562 +0.4062 0.0625 0.1875 +0.4062 0.0625 0.2188 +0.4062 0.0625 0.25 +0.4062 0.0625 0.2812 +0.4062 0.0625 0.3125 +0.4062 0.0625 0.3438 +0.4062 0.0625 0.375 +0.4062 0.0625 0.4062 +0.4062 0.0625 0.4375 +0.4062 0.0625 0.4688 +0.4062 0.0625 0.5 +0.4062 0.0625 0.5312 +0.4062 0.0625 0.5625 +0.4062 0.0625 0.5938 +0.4062 0.0625 0.625 +0.4062 0.0625 0.6562 +0.4062 0.0625 0.6875 +0.4062 0.0625 0.7188 +0.4062 0.0625 0.75 +0.4062 0.0625 0.7812 +0.4062 0.0625 0.8125 +0.4062 0.0625 0.8438 +0.4062 0.0625 0.875 +0.4062 0.0625 0.9062 +0.4062 0.0625 0.9375 +0.4062 0.0625 0.9688 +0.4062 0.0625 1 +0.4062 0.09375 0 +0.4062 0.09375 0.03125 +0.4062 0.09375 0.0625 +0.4062 0.09375 0.09375 +0.4062 0.09375 0.125 +0.4062 0.09375 0.1562 +0.4062 0.09375 0.1875 +0.4062 0.09375 0.2188 +0.4062 0.09375 0.25 +0.4062 0.09375 0.2812 +0.4062 0.09375 0.3125 +0.4062 0.09375 0.3438 +0.4062 0.09375 0.375 +0.4062 0.09375 0.4062 +0.4062 0.09375 0.4375 +0.4062 0.09375 0.4688 +0.4062 0.09375 0.5 +0.4062 0.09375 0.5312 +0.4062 0.09375 0.5625 +0.4062 0.09375 0.5938 +0.4062 0.09375 0.625 +0.4062 0.09375 0.6562 +0.4062 0.09375 0.6875 +0.4062 0.09375 0.7188 +0.4062 0.09375 0.75 +0.4062 0.09375 0.7812 +0.4062 0.09375 0.8125 +0.4062 0.09375 0.8438 +0.4062 0.09375 0.875 +0.4062 0.09375 0.9062 +0.4062 0.09375 0.9375 +0.4062 0.09375 0.9688 +0.4062 0.09375 1 +0.4062 0.125 0 +0.4062 0.125 0.03125 +0.4062 0.125 0.0625 +0.4062 0.125 0.09375 +0.4062 0.125 0.125 +0.4062 0.125 0.1562 +0.4062 0.125 0.1875 +0.4062 0.125 0.2188 +0.4062 0.125 0.25 +0.4062 0.125 0.2812 +0.4062 0.125 0.3125 +0.4062 0.125 0.3438 +0.4062 0.125 0.375 +0.4062 0.125 0.4062 +0.4062 0.125 0.4375 +0.4062 0.125 0.4688 +0.4062 0.125 0.5 +0.4062 0.125 0.5312 +0.4062 0.125 0.5625 +0.4062 0.125 0.5938 +0.4062 0.125 0.625 +0.4062 0.125 0.6562 +0.4062 0.125 0.6875 +0.4062 0.125 0.7188 +0.4062 0.125 0.75 +0.4062 0.125 0.7812 +0.4062 0.125 0.8125 +0.4062 0.125 0.8438 +0.4062 0.125 0.875 +0.4062 0.125 0.9062 +0.4062 0.125 0.9375 +0.4062 0.125 0.9688 +0.4062 0.125 1 +0.4062 0.1562 0 +0.4062 0.1562 0.03125 +0.4062 0.1562 0.0625 +0.4062 0.1562 0.09375 +0.4062 0.1562 0.125 +0.4062 0.1562 0.1562 +0.4062 0.1562 0.1875 +0.4062 0.1562 0.2188 +0.4062 0.1562 0.25 +0.4062 0.1562 0.2812 +0.4062 0.1562 0.3125 +0.4062 0.1562 0.3438 +0.4062 0.1562 0.375 +0.4062 0.1562 0.4062 +0.4062 0.1562 0.4375 +0.4062 0.1562 0.4688 +0.4062 0.1562 0.5 +0.4062 0.1562 0.5312 +0.4062 0.1562 0.5625 +0.4062 0.1562 0.5938 +0.4062 0.1562 0.625 +0.4062 0.1562 0.6562 +0.4062 0.1562 0.6875 +0.4062 0.1562 0.7188 +0.4062 0.1562 0.75 +0.4062 0.1562 0.7812 +0.4062 0.1562 0.8125 +0.4062 0.1562 0.8438 +0.4062 0.1562 0.875 +0.4062 0.1562 0.9062 +0.4062 0.1562 0.9375 +0.4062 0.1562 0.9688 +0.4062 0.1562 1 +0.4062 0.1875 0 +0.4062 0.1875 0.03125 +0.4062 0.1875 0.0625 +0.4062 0.1875 0.09375 +0.4062 0.1875 0.125 +0.4062 0.1875 0.1562 +0.4062 0.1875 0.1875 +0.4062 0.1875 0.2188 +0.4062 0.1875 0.25 +0.4062 0.1875 0.2812 +0.4062 0.1875 0.3125 +0.4062 0.1875 0.3438 +0.4062 0.1875 0.375 +0.4062 0.1875 0.4062 +0.4062 0.1875 0.4375 +0.4062 0.1875 0.4688 +0.4062 0.1875 0.5 +0.4062 0.1875 0.5312 +0.4062 0.1875 0.5625 +0.4062 0.1875 0.5938 +0.4062 0.1875 0.625 +0.4062 0.1875 0.6562 +0.4062 0.1875 0.6875 +0.4062 0.1875 0.7188 +0.4062 0.1875 0.75 +0.4062 0.1875 0.7812 +0.4062 0.1875 0.8125 +0.4062 0.1875 0.8438 +0.4062 0.1875 0.875 +0.4062 0.1875 0.9062 +0.4062 0.1875 0.9375 +0.4062 0.1875 0.9688 +0.4062 0.1875 1 +0.4062 0.2188 0 +0.4062 0.2188 0.03125 +0.4062 0.2188 0.0625 +0.4062 0.2188 0.09375 +0.4062 0.2188 0.125 +0.4062 0.2188 0.1562 +0.4062 0.2188 0.1875 +0.4062 0.2188 0.2188 +0.4062 0.2188 0.25 +0.4062 0.2188 0.2812 +0.4062 0.2188 0.3125 +0.4062 0.2188 0.3438 +0.4062 0.2188 0.375 +0.4062 0.2188 0.4062 +0.4062 0.2188 0.4375 +0.4062 0.2188 0.4688 +0.4062 0.2188 0.5 +0.4062 0.2188 0.5312 +0.4062 0.2188 0.5625 +0.4062 0.2188 0.5938 +0.4062 0.2188 0.625 +0.4062 0.2188 0.6562 +0.4062 0.2188 0.6875 +0.4062 0.2188 0.7188 +0.4062 0.2188 0.75 +0.4062 0.2188 0.7812 +0.4062 0.2188 0.8125 +0.4062 0.2188 0.8438 +0.4062 0.2188 0.875 +0.4062 0.2188 0.9062 +0.4062 0.2188 0.9375 +0.4062 0.2188 0.9688 +0.4062 0.2188 1 +0.4062 0.25 0 +0.4062 0.25 0.03125 +0.4062 0.25 0.0625 +0.4062 0.25 0.09375 +0.4062 0.25 0.125 +0.4062 0.25 0.1562 +0.4062 0.25 0.1875 +0.4062 0.25 0.2188 +0.4062 0.25 0.25 +0.4062 0.25 0.2812 +0.4062 0.25 0.3125 +0.4062 0.25 0.3438 +0.4062 0.25 0.375 +0.4062 0.25 0.4062 +0.4062 0.25 0.4375 +0.4062 0.25 0.4688 +0.4062 0.25 0.5 +0.4062 0.25 0.5312 +0.4062 0.25 0.5625 +0.4062 0.25 0.5938 +0.4062 0.25 0.625 +0.4062 0.25 0.6562 +0.4062 0.25 0.6875 +0.4062 0.25 0.7188 +0.4062 0.25 0.75 +0.4062 0.25 0.7812 +0.4062 0.25 0.8125 +0.4062 0.25 0.8438 +0.4062 0.25 0.875 +0.4062 0.25 0.9062 +0.4062 0.25 0.9375 +0.4062 0.25 0.9688 +0.4062 0.25 1 +0.4062 0.2812 0 +0.4062 0.2812 0.03125 +0.4062 0.2812 0.0625 +0.4062 0.2812 0.09375 +0.4062 0.2812 0.125 +0.4062 0.2812 0.1562 +0.4062 0.2812 0.1875 +0.4062 0.2812 0.2188 +0.4062 0.2812 0.25 +0.4062 0.2812 0.2812 +0.4062 0.2812 0.3125 +0.4062 0.2812 0.3438 +0.4062 0.2812 0.375 +0.4062 0.2812 0.4062 +0.4062 0.2812 0.4375 +0.4062 0.2812 0.4688 +0.4062 0.2812 0.5 +0.4062 0.2812 0.5312 +0.4062 0.2812 0.5625 +0.4062 0.2812 0.5938 +0.4062 0.2812 0.625 +0.4062 0.2812 0.6562 +0.4062 0.2812 0.6875 +0.4062 0.2812 0.7188 +0.4062 0.2812 0.75 +0.4062 0.2812 0.7812 +0.4062 0.2812 0.8125 +0.4062 0.2812 0.8438 +0.4062 0.2812 0.875 +0.4062 0.2812 0.9062 +0.4062 0.2812 0.9375 +0.4062 0.2812 0.9688 +0.4062 0.2812 1 +0.4062 0.3125 0 +0.4062 0.3125 0.03125 +0.4062 0.3125 0.0625 +0.4062 0.3125 0.09375 +0.4062 0.3125 0.125 +0.4062 0.3125 0.1562 +0.4062 0.3125 0.1875 +0.4062 0.3125 0.2188 +0.4062 0.3125 0.25 +0.4062 0.3125 0.2812 +0.4062 0.3125 0.3125 +0.4062 0.3125 0.3438 +0.4062 0.3125 0.375 +0.4062 0.3125 0.4062 +0.4062 0.3125 0.4375 +0.4062 0.3125 0.4688 +0.4062 0.3125 0.5 +0.4062 0.3125 0.5312 +0.4062 0.3125 0.5625 +0.4062 0.3125 0.5938 +0.4062 0.3125 0.625 +0.4062 0.3125 0.6562 +0.4062 0.3125 0.6875 +0.4062 0.3125 0.7188 +0.4062 0.3125 0.75 +0.4062 0.3125 0.7812 +0.4062 0.3125 0.8125 +0.4062 0.3125 0.8438 +0.4062 0.3125 0.875 +0.4062 0.3125 0.9062 +0.4062 0.3125 0.9375 +0.4062 0.3125 0.9688 +0.4062 0.3125 1 +0.4062 0.3438 0 +0.4062 0.3438 0.03125 +0.4062 0.3438 0.0625 +0.4062 0.3438 0.09375 +0.4062 0.3438 0.125 +0.4062 0.3438 0.1562 +0.4062 0.3438 0.1875 +0.4062 0.3438 0.2188 +0.4062 0.3438 0.25 +0.4062 0.3438 0.2812 +0.4062 0.3438 0.3125 +0.4062 0.3438 0.3438 +0.4062 0.3438 0.375 +0.4062 0.3438 0.4062 +0.4062 0.3438 0.4375 +0.4062 0.3438 0.4688 +0.4062 0.3438 0.5 +0.4062 0.3438 0.5312 +0.4062 0.3438 0.5625 +0.4062 0.3438 0.5938 +0.4062 0.3438 0.625 +0.4062 0.3438 0.6562 +0.4062 0.3438 0.6875 +0.4062 0.3438 0.7188 +0.4062 0.3438 0.75 +0.4062 0.3438 0.7812 +0.4062 0.3438 0.8125 +0.4062 0.3438 0.8438 +0.4062 0.3438 0.875 +0.4062 0.3438 0.9062 +0.4062 0.3438 0.9375 +0.4062 0.3438 0.9688 +0.4062 0.3438 1 +0.4062 0.375 0 +0.4062 0.375 0.03125 +0.4062 0.375 0.0625 +0.4062 0.375 0.09375 +0.4062 0.375 0.125 +0.4062 0.375 0.1562 +0.4062 0.375 0.1875 +0.4062 0.375 0.2188 +0.4062 0.375 0.25 +0.4062 0.375 0.2812 +0.4062 0.375 0.3125 +0.4062 0.375 0.3438 +0.4062 0.375 0.375 +0.4062 0.375 0.4062 +0.4062 0.375 0.4375 +0.4062 0.375 0.4688 +0.4062 0.375 0.5 +0.4062 0.375 0.5312 +0.4062 0.375 0.5625 +0.4062 0.375 0.5938 +0.4062 0.375 0.625 +0.4062 0.375 0.6562 +0.4062 0.375 0.6875 +0.4062 0.375 0.7188 +0.4062 0.375 0.75 +0.4062 0.375 0.7812 +0.4062 0.375 0.8125 +0.4062 0.375 0.8438 +0.4062 0.375 0.875 +0.4062 0.375 0.9062 +0.4062 0.375 0.9375 +0.4062 0.375 0.9688 +0.4062 0.375 1 +0.4062 0.4062 0 +0.4062 0.4062 0.03125 +0.4062 0.4062 0.0625 +0.4062 0.4062 0.09375 +0.4062 0.4062 0.125 +0.4062 0.4062 0.1562 +0.4062 0.4062 0.1875 +0.4062 0.4062 0.2188 +0.4062 0.4062 0.25 +0.4062 0.4062 0.2812 +0.4062 0.4062 0.3125 +0.4062 0.4062 0.3438 +0.4062 0.4062 0.375 +0.4062 0.4062 0.4062 +0.4062 0.4062 0.4375 +0.4062 0.4062 0.4688 +0.4062 0.4062 0.5 +0.4062 0.4062 0.5312 +0.4062 0.4062 0.5625 +0.4062 0.4062 0.5938 +0.4062 0.4062 0.625 +0.4062 0.4062 0.6562 +0.4062 0.4062 0.6875 +0.4062 0.4062 0.7188 +0.4062 0.4062 0.75 +0.4062 0.4062 0.7812 +0.4062 0.4062 0.8125 +0.4062 0.4062 0.8438 +0.4062 0.4062 0.875 +0.4062 0.4062 0.9062 +0.4062 0.4062 0.9375 +0.4062 0.4062 0.9688 +0.4062 0.4062 1 +0.4062 0.4375 0 +0.4062 0.4375 0.03125 +0.4062 0.4375 0.0625 +0.4062 0.4375 0.09375 +0.4062 0.4375 0.125 +0.4062 0.4375 0.1562 +0.4062 0.4375 0.1875 +0.4062 0.4375 0.2188 +0.4062 0.4375 0.25 +0.4062 0.4375 0.2812 +0.4062 0.4375 0.3125 +0.4062 0.4375 0.3438 +0.4062 0.4375 0.375 +0.4062 0.4375 0.4062 +0.4062 0.4375 0.4375 +0.4062 0.4375 0.4688 +0.4062 0.4375 0.5 +0.4062 0.4375 0.5312 +0.4062 0.4375 0.5625 +0.4062 0.4375 0.5938 +0.4062 0.4375 0.625 +0.4062 0.4375 0.6562 +0.4062 0.4375 0.6875 +0.4062 0.4375 0.7188 +0.4062 0.4375 0.75 +0.4062 0.4375 0.7812 +0.4062 0.4375 0.8125 +0.4062 0.4375 0.8438 +0.4062 0.4375 0.875 +0.4062 0.4375 0.9062 +0.4062 0.4375 0.9375 +0.4062 0.4375 0.9688 +0.4062 0.4375 1 +0.4062 0.4688 0 +0.4062 0.4688 0.03125 +0.4062 0.4688 0.0625 +0.4062 0.4688 0.09375 +0.4062 0.4688 0.125 +0.4062 0.4688 0.1562 +0.4062 0.4688 0.1875 +0.4062 0.4688 0.2188 +0.4062 0.4688 0.25 +0.4062 0.4688 0.2812 +0.4062 0.4688 0.3125 +0.4062 0.4688 0.3438 +0.4062 0.4688 0.375 +0.4062 0.4688 0.4062 +0.4062 0.4688 0.4375 +0.4062 0.4688 0.4688 +0.4062 0.4688 0.5 +0.4062 0.4688 0.5312 +0.4062 0.4688 0.5625 +0.4062 0.4688 0.5938 +0.4062 0.4688 0.625 +0.4062 0.4688 0.6562 +0.4062 0.4688 0.6875 +0.4062 0.4688 0.7188 +0.4062 0.4688 0.75 +0.4062 0.4688 0.7812 +0.4062 0.4688 0.8125 +0.4062 0.4688 0.8438 +0.4062 0.4688 0.875 +0.4062 0.4688 0.9062 +0.4062 0.4688 0.9375 +0.4062 0.4688 0.9688 +0.4062 0.4688 1 +0.4062 0.5 0 +0.4062 0.5 0.03125 +0.4062 0.5 0.0625 +0.4062 0.5 0.09375 +0.4062 0.5 0.125 +0.4062 0.5 0.1562 +0.4062 0.5 0.1875 +0.4062 0.5 0.2188 +0.4062 0.5 0.25 +0.4062 0.5 0.2812 +0.4062 0.5 0.3125 +0.4062 0.5 0.3438 +0.4062 0.5 0.375 +0.4062 0.5 0.4062 +0.4062 0.5 0.4375 +0.4062 0.5 0.4688 +0.4062 0.5 0.5 +0.4062 0.5 0.5312 +0.4062 0.5 0.5625 +0.4062 0.5 0.5938 +0.4062 0.5 0.625 +0.4062 0.5 0.6562 +0.4062 0.5 0.6875 +0.4062 0.5 0.7188 +0.4062 0.5 0.75 +0.4062 0.5 0.7812 +0.4062 0.5 0.8125 +0.4062 0.5 0.8438 +0.4062 0.5 0.875 +0.4062 0.5 0.9062 +0.4062 0.5 0.9375 +0.4062 0.5 0.9688 +0.4062 0.5 1 +0.4062 0.5312 0 +0.4062 0.5312 0.03125 +0.4062 0.5312 0.0625 +0.4062 0.5312 0.09375 +0.4062 0.5312 0.125 +0.4062 0.5312 0.1562 +0.4062 0.5312 0.1875 +0.4062 0.5312 0.2188 +0.4062 0.5312 0.25 +0.4062 0.5312 0.2812 +0.4062 0.5312 0.3125 +0.4062 0.5312 0.3438 +0.4062 0.5312 0.375 +0.4062 0.5312 0.4062 +0.4062 0.5312 0.4375 +0.4062 0.5312 0.4688 +0.4062 0.5312 0.5 +0.4062 0.5312 0.5312 +0.4062 0.5312 0.5625 +0.4062 0.5312 0.5938 +0.4062 0.5312 0.625 +0.4062 0.5312 0.6562 +0.4062 0.5312 0.6875 +0.4062 0.5312 0.7188 +0.4062 0.5312 0.75 +0.4062 0.5312 0.7812 +0.4062 0.5312 0.8125 +0.4062 0.5312 0.8438 +0.4062 0.5312 0.875 +0.4062 0.5312 0.9062 +0.4062 0.5312 0.9375 +0.4062 0.5312 0.9688 +0.4062 0.5312 1 +0.4062 0.5625 0 +0.4062 0.5625 0.03125 +0.4062 0.5625 0.0625 +0.4062 0.5625 0.09375 +0.4062 0.5625 0.125 +0.4062 0.5625 0.1562 +0.4062 0.5625 0.1875 +0.4062 0.5625 0.2188 +0.4062 0.5625 0.25 +0.4062 0.5625 0.2812 +0.4062 0.5625 0.3125 +0.4062 0.5625 0.3438 +0.4062 0.5625 0.375 +0.4062 0.5625 0.4062 +0.4062 0.5625 0.4375 +0.4062 0.5625 0.4688 +0.4062 0.5625 0.5 +0.4062 0.5625 0.5312 +0.4062 0.5625 0.5625 +0.4062 0.5625 0.5938 +0.4062 0.5625 0.625 +0.4062 0.5625 0.6562 +0.4062 0.5625 0.6875 +0.4062 0.5625 0.7188 +0.4062 0.5625 0.75 +0.4062 0.5625 0.7812 +0.4062 0.5625 0.8125 +0.4062 0.5625 0.8438 +0.4062 0.5625 0.875 +0.4062 0.5625 0.9062 +0.4062 0.5625 0.9375 +0.4062 0.5625 0.9688 +0.4062 0.5625 1 +0.4062 0.5938 0 +0.4062 0.5938 0.03125 +0.4062 0.5938 0.0625 +0.4062 0.5938 0.09375 +0.4062 0.5938 0.125 +0.4062 0.5938 0.1562 +0.4062 0.5938 0.1875 +0.4062 0.5938 0.2188 +0.4062 0.5938 0.25 +0.4062 0.5938 0.2812 +0.4062 0.5938 0.3125 +0.4062 0.5938 0.3438 +0.4062 0.5938 0.375 +0.4062 0.5938 0.4062 +0.4062 0.5938 0.4375 +0.4062 0.5938 0.4688 +0.4062 0.5938 0.5 +0.4062 0.5938 0.5312 +0.4062 0.5938 0.5625 +0.4062 0.5938 0.5938 +0.4062 0.5938 0.625 +0.4062 0.5938 0.6562 +0.4062 0.5938 0.6875 +0.4062 0.5938 0.7188 +0.4062 0.5938 0.75 +0.4062 0.5938 0.7812 +0.4062 0.5938 0.8125 +0.4062 0.5938 0.8438 +0.4062 0.5938 0.875 +0.4062 0.5938 0.9062 +0.4062 0.5938 0.9375 +0.4062 0.5938 0.9688 +0.4062 0.5938 1 +0.4062 0.625 0 +0.4062 0.625 0.03125 +0.4062 0.625 0.0625 +0.4062 0.625 0.09375 +0.4062 0.625 0.125 +0.4062 0.625 0.1562 +0.4062 0.625 0.1875 +0.4062 0.625 0.2188 +0.4062 0.625 0.25 +0.4062 0.625 0.2812 +0.4062 0.625 0.3125 +0.4062 0.625 0.3438 +0.4062 0.625 0.375 +0.4062 0.625 0.4062 +0.4062 0.625 0.4375 +0.4062 0.625 0.4688 +0.4062 0.625 0.5 +0.4062 0.625 0.5312 +0.4062 0.625 0.5625 +0.4062 0.625 0.5938 +0.4062 0.625 0.625 +0.4062 0.625 0.6562 +0.4062 0.625 0.6875 +0.4062 0.625 0.7188 +0.4062 0.625 0.75 +0.4062 0.625 0.7812 +0.4062 0.625 0.8125 +0.4062 0.625 0.8438 +0.4062 0.625 0.875 +0.4062 0.625 0.9062 +0.4062 0.625 0.9375 +0.4062 0.625 0.9688 +0.4062 0.625 1 +0.4062 0.6562 0 +0.4062 0.6562 0.03125 +0.4062 0.6562 0.0625 +0.4062 0.6562 0.09375 +0.4062 0.6562 0.125 +0.4062 0.6562 0.1562 +0.4062 0.6562 0.1875 +0.4062 0.6562 0.2188 +0.4062 0.6562 0.25 +0.4062 0.6562 0.2812 +0.4062 0.6562 0.3125 +0.4062 0.6562 0.3438 +0.4062 0.6562 0.375 +0.4062 0.6562 0.4062 +0.4062 0.6562 0.4375 +0.4062 0.6562 0.4688 +0.4062 0.6562 0.5 +0.4062 0.6562 0.5312 +0.4062 0.6562 0.5625 +0.4062 0.6562 0.5938 +0.4062 0.6562 0.625 +0.4062 0.6562 0.6562 +0.4062 0.6562 0.6875 +0.4062 0.6562 0.7188 +0.4062 0.6562 0.75 +0.4062 0.6562 0.7812 +0.4062 0.6562 0.8125 +0.4062 0.6562 0.8438 +0.4062 0.6562 0.875 +0.4062 0.6562 0.9062 +0.4062 0.6562 0.9375 +0.4062 0.6562 0.9688 +0.4062 0.6562 1 +0.4062 0.6875 0 +0.4062 0.6875 0.03125 +0.4062 0.6875 0.0625 +0.4062 0.6875 0.09375 +0.4062 0.6875 0.125 +0.4062 0.6875 0.1562 +0.4062 0.6875 0.1875 +0.4062 0.6875 0.2188 +0.4062 0.6875 0.25 +0.4062 0.6875 0.2812 +0.4062 0.6875 0.3125 +0.4062 0.6875 0.3438 +0.4062 0.6875 0.375 +0.4062 0.6875 0.4062 +0.4062 0.6875 0.4375 +0.4062 0.6875 0.4688 +0.4062 0.6875 0.5 +0.4062 0.6875 0.5312 +0.4062 0.6875 0.5625 +0.4062 0.6875 0.5938 +0.4062 0.6875 0.625 +0.4062 0.6875 0.6562 +0.4062 0.6875 0.6875 +0.4062 0.6875 0.7188 +0.4062 0.6875 0.75 +0.4062 0.6875 0.7812 +0.4062 0.6875 0.8125 +0.4062 0.6875 0.8438 +0.4062 0.6875 0.875 +0.4062 0.6875 0.9062 +0.4062 0.6875 0.9375 +0.4062 0.6875 0.9688 +0.4062 0.6875 1 +0.4062 0.7188 0 +0.4062 0.7188 0.03125 +0.4062 0.7188 0.0625 +0.4062 0.7188 0.09375 +0.4062 0.7188 0.125 +0.4062 0.7188 0.1562 +0.4062 0.7188 0.1875 +0.4062 0.7188 0.2188 +0.4062 0.7188 0.25 +0.4062 0.7188 0.2812 +0.4062 0.7188 0.3125 +0.4062 0.7188 0.3438 +0.4062 0.7188 0.375 +0.4062 0.7188 0.4062 +0.4062 0.7188 0.4375 +0.4062 0.7188 0.4688 +0.4062 0.7188 0.5 +0.4062 0.7188 0.5312 +0.4062 0.7188 0.5625 +0.4062 0.7188 0.5938 +0.4062 0.7188 0.625 +0.4062 0.7188 0.6562 +0.4062 0.7188 0.6875 +0.4062 0.7188 0.7188 +0.4062 0.7188 0.75 +0.4062 0.7188 0.7812 +0.4062 0.7188 0.8125 +0.4062 0.7188 0.8438 +0.4062 0.7188 0.875 +0.4062 0.7188 0.9062 +0.4062 0.7188 0.9375 +0.4062 0.7188 0.9688 +0.4062 0.7188 1 +0.4062 0.75 0 +0.4062 0.75 0.03125 +0.4062 0.75 0.0625 +0.4062 0.75 0.09375 +0.4062 0.75 0.125 +0.4062 0.75 0.1562 +0.4062 0.75 0.1875 +0.4062 0.75 0.2188 +0.4062 0.75 0.25 +0.4062 0.75 0.2812 +0.4062 0.75 0.3125 +0.4062 0.75 0.3438 +0.4062 0.75 0.375 +0.4062 0.75 0.4062 +0.4062 0.75 0.4375 +0.4062 0.75 0.4688 +0.4062 0.75 0.5 +0.4062 0.75 0.5312 +0.4062 0.75 0.5625 +0.4062 0.75 0.5938 +0.4062 0.75 0.625 +0.4062 0.75 0.6562 +0.4062 0.75 0.6875 +0.4062 0.75 0.7188 +0.4062 0.75 0.75 +0.4062 0.75 0.7812 +0.4062 0.75 0.8125 +0.4062 0.75 0.8438 +0.4062 0.75 0.875 +0.4062 0.75 0.9062 +0.4062 0.75 0.9375 +0.4062 0.75 0.9688 +0.4062 0.75 1 +0.4062 0.7812 0 +0.4062 0.7812 0.03125 +0.4062 0.7812 0.0625 +0.4062 0.7812 0.09375 +0.4062 0.7812 0.125 +0.4062 0.7812 0.1562 +0.4062 0.7812 0.1875 +0.4062 0.7812 0.2188 +0.4062 0.7812 0.25 +0.4062 0.7812 0.2812 +0.4062 0.7812 0.3125 +0.4062 0.7812 0.3438 +0.4062 0.7812 0.375 +0.4062 0.7812 0.4062 +0.4062 0.7812 0.4375 +0.4062 0.7812 0.4688 +0.4062 0.7812 0.5 +0.4062 0.7812 0.5312 +0.4062 0.7812 0.5625 +0.4062 0.7812 0.5938 +0.4062 0.7812 0.625 +0.4062 0.7812 0.6562 +0.4062 0.7812 0.6875 +0.4062 0.7812 0.7188 +0.4062 0.7812 0.75 +0.4062 0.7812 0.7812 +0.4062 0.7812 0.8125 +0.4062 0.7812 0.8438 +0.4062 0.7812 0.875 +0.4062 0.7812 0.9062 +0.4062 0.7812 0.9375 +0.4062 0.7812 0.9688 +0.4062 0.7812 1 +0.4062 0.8125 0 +0.4062 0.8125 0.03125 +0.4062 0.8125 0.0625 +0.4062 0.8125 0.09375 +0.4062 0.8125 0.125 +0.4062 0.8125 0.1562 +0.4062 0.8125 0.1875 +0.4062 0.8125 0.2188 +0.4062 0.8125 0.25 +0.4062 0.8125 0.2812 +0.4062 0.8125 0.3125 +0.4062 0.8125 0.3438 +0.4062 0.8125 0.375 +0.4062 0.8125 0.4062 +0.4062 0.8125 0.4375 +0.4062 0.8125 0.4688 +0.4062 0.8125 0.5 +0.4062 0.8125 0.5312 +0.4062 0.8125 0.5625 +0.4062 0.8125 0.5938 +0.4062 0.8125 0.625 +0.4062 0.8125 0.6562 +0.4062 0.8125 0.6875 +0.4062 0.8125 0.7188 +0.4062 0.8125 0.75 +0.4062 0.8125 0.7812 +0.4062 0.8125 0.8125 +0.4062 0.8125 0.8438 +0.4062 0.8125 0.875 +0.4062 0.8125 0.9062 +0.4062 0.8125 0.9375 +0.4062 0.8125 0.9688 +0.4062 0.8125 1 +0.4062 0.8438 0 +0.4062 0.8438 0.03125 +0.4062 0.8438 0.0625 +0.4062 0.8438 0.09375 +0.4062 0.8438 0.125 +0.4062 0.8438 0.1562 +0.4062 0.8438 0.1875 +0.4062 0.8438 0.2188 +0.4062 0.8438 0.25 +0.4062 0.8438 0.2812 +0.4062 0.8438 0.3125 +0.4062 0.8438 0.3438 +0.4062 0.8438 0.375 +0.4062 0.8438 0.4062 +0.4062 0.8438 0.4375 +0.4062 0.8438 0.4688 +0.4062 0.8438 0.5 +0.4062 0.8438 0.5312 +0.4062 0.8438 0.5625 +0.4062 0.8438 0.5938 +0.4062 0.8438 0.625 +0.4062 0.8438 0.6562 +0.4062 0.8438 0.6875 +0.4062 0.8438 0.7188 +0.4062 0.8438 0.75 +0.4062 0.8438 0.7812 +0.4062 0.8438 0.8125 +0.4062 0.8438 0.8438 +0.4062 0.8438 0.875 +0.4062 0.8438 0.9062 +0.4062 0.8438 0.9375 +0.4062 0.8438 0.9688 +0.4062 0.8438 1 +0.4062 0.875 0 +0.4062 0.875 0.03125 +0.4062 0.875 0.0625 +0.4062 0.875 0.09375 +0.4062 0.875 0.125 +0.4062 0.875 0.1562 +0.4062 0.875 0.1875 +0.4062 0.875 0.2188 +0.4062 0.875 0.25 +0.4062 0.875 0.2812 +0.4062 0.875 0.3125 +0.4062 0.875 0.3438 +0.4062 0.875 0.375 +0.4062 0.875 0.4062 +0.4062 0.875 0.4375 +0.4062 0.875 0.4688 +0.4062 0.875 0.5 +0.4062 0.875 0.5312 +0.4062 0.875 0.5625 +0.4062 0.875 0.5938 +0.4062 0.875 0.625 +0.4062 0.875 0.6562 +0.4062 0.875 0.6875 +0.4062 0.875 0.7188 +0.4062 0.875 0.75 +0.4062 0.875 0.7812 +0.4062 0.875 0.8125 +0.4062 0.875 0.8438 +0.4062 0.875 0.875 +0.4062 0.875 0.9062 +0.4062 0.875 0.9375 +0.4062 0.875 0.9688 +0.4062 0.875 1 +0.4062 0.9062 0 +0.4062 0.9062 0.03125 +0.4062 0.9062 0.0625 +0.4062 0.9062 0.09375 +0.4062 0.9062 0.125 +0.4062 0.9062 0.1562 +0.4062 0.9062 0.1875 +0.4062 0.9062 0.2188 +0.4062 0.9062 0.25 +0.4062 0.9062 0.2812 +0.4062 0.9062 0.3125 +0.4062 0.9062 0.3438 +0.4062 0.9062 0.375 +0.4062 0.9062 0.4062 +0.4062 0.9062 0.4375 +0.4062 0.9062 0.4688 +0.4062 0.9062 0.5 +0.4062 0.9062 0.5312 +0.4062 0.9062 0.5625 +0.4062 0.9062 0.5938 +0.4062 0.9062 0.625 +0.4062 0.9062 0.6562 +0.4062 0.9062 0.6875 +0.4062 0.9062 0.7188 +0.4062 0.9062 0.75 +0.4062 0.9062 0.7812 +0.4062 0.9062 0.8125 +0.4062 0.9062 0.8438 +0.4062 0.9062 0.875 +0.4062 0.9062 0.9062 +0.4062 0.9062 0.9375 +0.4062 0.9062 0.9688 +0.4062 0.9062 1 +0.4062 0.9375 0 +0.4062 0.9375 0.03125 +0.4062 0.9375 0.0625 +0.4062 0.9375 0.09375 +0.4062 0.9375 0.125 +0.4062 0.9375 0.1562 +0.4062 0.9375 0.1875 +0.4062 0.9375 0.2188 +0.4062 0.9375 0.25 +0.4062 0.9375 0.2812 +0.4062 0.9375 0.3125 +0.4062 0.9375 0.3438 +0.4062 0.9375 0.375 +0.4062 0.9375 0.4062 +0.4062 0.9375 0.4375 +0.4062 0.9375 0.4688 +0.4062 0.9375 0.5 +0.4062 0.9375 0.5312 +0.4062 0.9375 0.5625 +0.4062 0.9375 0.5938 +0.4062 0.9375 0.625 +0.4062 0.9375 0.6562 +0.4062 0.9375 0.6875 +0.4062 0.9375 0.7188 +0.4062 0.9375 0.75 +0.4062 0.9375 0.7812 +0.4062 0.9375 0.8125 +0.4062 0.9375 0.8438 +0.4062 0.9375 0.875 +0.4062 0.9375 0.9062 +0.4062 0.9375 0.9375 +0.4062 0.9375 0.9688 +0.4062 0.9375 1 +0.4062 0.9688 0 +0.4062 0.9688 0.03125 +0.4062 0.9688 0.0625 +0.4062 0.9688 0.09375 +0.4062 0.9688 0.125 +0.4062 0.9688 0.1562 +0.4062 0.9688 0.1875 +0.4062 0.9688 0.2188 +0.4062 0.9688 0.25 +0.4062 0.9688 0.2812 +0.4062 0.9688 0.3125 +0.4062 0.9688 0.3438 +0.4062 0.9688 0.375 +0.4062 0.9688 0.4062 +0.4062 0.9688 0.4375 +0.4062 0.9688 0.4688 +0.4062 0.9688 0.5 +0.4062 0.9688 0.5312 +0.4062 0.9688 0.5625 +0.4062 0.9688 0.5938 +0.4062 0.9688 0.625 +0.4062 0.9688 0.6562 +0.4062 0.9688 0.6875 +0.4062 0.9688 0.7188 +0.4062 0.9688 0.75 +0.4062 0.9688 0.7812 +0.4062 0.9688 0.8125 +0.4062 0.9688 0.8438 +0.4062 0.9688 0.875 +0.4062 0.9688 0.9062 +0.4062 0.9688 0.9375 +0.4062 0.9688 0.9688 +0.4062 0.9688 1 +0.4062 1 0 +0.4062 1 0.03125 +0.4062 1 0.0625 +0.4062 1 0.09375 +0.4062 1 0.125 +0.4062 1 0.1562 +0.4062 1 0.1875 +0.4062 1 0.2188 +0.4062 1 0.25 +0.4062 1 0.2812 +0.4062 1 0.3125 +0.4062 1 0.3438 +0.4062 1 0.375 +0.4062 1 0.4062 +0.4062 1 0.4375 +0.4062 1 0.4688 +0.4062 1 0.5 +0.4062 1 0.5312 +0.4062 1 0.5625 +0.4062 1 0.5938 +0.4062 1 0.625 +0.4062 1 0.6562 +0.4062 1 0.6875 +0.4062 1 0.7188 +0.4062 1 0.75 +0.4062 1 0.7812 +0.4062 1 0.8125 +0.4062 1 0.8438 +0.4062 1 0.875 +0.4062 1 0.9062 +0.4062 1 0.9375 +0.4062 1 0.9688 +0.4062 1 1 +0.4375 0 0 +0.4375 0 0.03125 +0.4375 0 0.0625 +0.4375 0 0.09375 +0.4375 0 0.125 +0.4375 0 0.1562 +0.4375 0 0.1875 +0.4375 0 0.2188 +0.4375 0 0.25 +0.4375 0 0.2812 +0.4375 0 0.3125 +0.4375 0 0.3438 +0.4375 0 0.375 +0.4375 0 0.4062 +0.4375 0 0.4375 +0.4375 0 0.4688 +0.4375 0 0.5 +0.4375 0 0.5312 +0.4375 0 0.5625 +0.4375 0 0.5938 +0.4375 0 0.625 +0.4375 0 0.6562 +0.4375 0 0.6875 +0.4375 0 0.7188 +0.4375 0 0.75 +0.4375 0 0.7812 +0.4375 0 0.8125 +0.4375 0 0.8438 +0.4375 0 0.875 +0.4375 0 0.9062 +0.4375 0 0.9375 +0.4375 0 0.9688 +0.4375 0 1 +0.4375 0.03125 0 +0.4375 0.03125 0.03125 +0.4375 0.03125 0.0625 +0.4375 0.03125 0.09375 +0.4375 0.03125 0.125 +0.4375 0.03125 0.1562 +0.4375 0.03125 0.1875 +0.4375 0.03125 0.2188 +0.4375 0.03125 0.25 +0.4375 0.03125 0.2812 +0.4375 0.03125 0.3125 +0.4375 0.03125 0.3438 +0.4375 0.03125 0.375 +0.4375 0.03125 0.4062 +0.4375 0.03125 0.4375 +0.4375 0.03125 0.4688 +0.4375 0.03125 0.5 +0.4375 0.03125 0.5312 +0.4375 0.03125 0.5625 +0.4375 0.03125 0.5938 +0.4375 0.03125 0.625 +0.4375 0.03125 0.6562 +0.4375 0.03125 0.6875 +0.4375 0.03125 0.7188 +0.4375 0.03125 0.75 +0.4375 0.03125 0.7812 +0.4375 0.03125 0.8125 +0.4375 0.03125 0.8438 +0.4375 0.03125 0.875 +0.4375 0.03125 0.9062 +0.4375 0.03125 0.9375 +0.4375 0.03125 0.9688 +0.4375 0.03125 1 +0.4375 0.0625 0 +0.4375 0.0625 0.03125 +0.4375 0.0625 0.0625 +0.4375 0.0625 0.09375 +0.4375 0.0625 0.125 +0.4375 0.0625 0.1562 +0.4375 0.0625 0.1875 +0.4375 0.0625 0.2188 +0.4375 0.0625 0.25 +0.4375 0.0625 0.2812 +0.4375 0.0625 0.3125 +0.4375 0.0625 0.3438 +0.4375 0.0625 0.375 +0.4375 0.0625 0.4062 +0.4375 0.0625 0.4375 +0.4375 0.0625 0.4688 +0.4375 0.0625 0.5 +0.4375 0.0625 0.5312 +0.4375 0.0625 0.5625 +0.4375 0.0625 0.5938 +0.4375 0.0625 0.625 +0.4375 0.0625 0.6562 +0.4375 0.0625 0.6875 +0.4375 0.0625 0.7188 +0.4375 0.0625 0.75 +0.4375 0.0625 0.7812 +0.4375 0.0625 0.8125 +0.4375 0.0625 0.8438 +0.4375 0.0625 0.875 +0.4375 0.0625 0.9062 +0.4375 0.0625 0.9375 +0.4375 0.0625 0.9688 +0.4375 0.0625 1 +0.4375 0.09375 0 +0.4375 0.09375 0.03125 +0.4375 0.09375 0.0625 +0.4375 0.09375 0.09375 +0.4375 0.09375 0.125 +0.4375 0.09375 0.1562 +0.4375 0.09375 0.1875 +0.4375 0.09375 0.2188 +0.4375 0.09375 0.25 +0.4375 0.09375 0.2812 +0.4375 0.09375 0.3125 +0.4375 0.09375 0.3438 +0.4375 0.09375 0.375 +0.4375 0.09375 0.4062 +0.4375 0.09375 0.4375 +0.4375 0.09375 0.4688 +0.4375 0.09375 0.5 +0.4375 0.09375 0.5312 +0.4375 0.09375 0.5625 +0.4375 0.09375 0.5938 +0.4375 0.09375 0.625 +0.4375 0.09375 0.6562 +0.4375 0.09375 0.6875 +0.4375 0.09375 0.7188 +0.4375 0.09375 0.75 +0.4375 0.09375 0.7812 +0.4375 0.09375 0.8125 +0.4375 0.09375 0.8438 +0.4375 0.09375 0.875 +0.4375 0.09375 0.9062 +0.4375 0.09375 0.9375 +0.4375 0.09375 0.9688 +0.4375 0.09375 1 +0.4375 0.125 0 +0.4375 0.125 0.03125 +0.4375 0.125 0.0625 +0.4375 0.125 0.09375 +0.4375 0.125 0.125 +0.4375 0.125 0.1562 +0.4375 0.125 0.1875 +0.4375 0.125 0.2188 +0.4375 0.125 0.25 +0.4375 0.125 0.2812 +0.4375 0.125 0.3125 +0.4375 0.125 0.3438 +0.4375 0.125 0.375 +0.4375 0.125 0.4062 +0.4375 0.125 0.4375 +0.4375 0.125 0.4688 +0.4375 0.125 0.5 +0.4375 0.125 0.5312 +0.4375 0.125 0.5625 +0.4375 0.125 0.5938 +0.4375 0.125 0.625 +0.4375 0.125 0.6562 +0.4375 0.125 0.6875 +0.4375 0.125 0.7188 +0.4375 0.125 0.75 +0.4375 0.125 0.7812 +0.4375 0.125 0.8125 +0.4375 0.125 0.8438 +0.4375 0.125 0.875 +0.4375 0.125 0.9062 +0.4375 0.125 0.9375 +0.4375 0.125 0.9688 +0.4375 0.125 1 +0.4375 0.1562 0 +0.4375 0.1562 0.03125 +0.4375 0.1562 0.0625 +0.4375 0.1562 0.09375 +0.4375 0.1562 0.125 +0.4375 0.1562 0.1562 +0.4375 0.1562 0.1875 +0.4375 0.1562 0.2188 +0.4375 0.1562 0.25 +0.4375 0.1562 0.2812 +0.4375 0.1562 0.3125 +0.4375 0.1562 0.3438 +0.4375 0.1562 0.375 +0.4375 0.1562 0.4062 +0.4375 0.1562 0.4375 +0.4375 0.1562 0.4688 +0.4375 0.1562 0.5 +0.4375 0.1562 0.5312 +0.4375 0.1562 0.5625 +0.4375 0.1562 0.5938 +0.4375 0.1562 0.625 +0.4375 0.1562 0.6562 +0.4375 0.1562 0.6875 +0.4375 0.1562 0.7188 +0.4375 0.1562 0.75 +0.4375 0.1562 0.7812 +0.4375 0.1562 0.8125 +0.4375 0.1562 0.8438 +0.4375 0.1562 0.875 +0.4375 0.1562 0.9062 +0.4375 0.1562 0.9375 +0.4375 0.1562 0.9688 +0.4375 0.1562 1 +0.4375 0.1875 0 +0.4375 0.1875 0.03125 +0.4375 0.1875 0.0625 +0.4375 0.1875 0.09375 +0.4375 0.1875 0.125 +0.4375 0.1875 0.1562 +0.4375 0.1875 0.1875 +0.4375 0.1875 0.2188 +0.4375 0.1875 0.25 +0.4375 0.1875 0.2812 +0.4375 0.1875 0.3125 +0.4375 0.1875 0.3438 +0.4375 0.1875 0.375 +0.4375 0.1875 0.4062 +0.4375 0.1875 0.4375 +0.4375 0.1875 0.4688 +0.4375 0.1875 0.5 +0.4375 0.1875 0.5312 +0.4375 0.1875 0.5625 +0.4375 0.1875 0.5938 +0.4375 0.1875 0.625 +0.4375 0.1875 0.6562 +0.4375 0.1875 0.6875 +0.4375 0.1875 0.7188 +0.4375 0.1875 0.75 +0.4375 0.1875 0.7812 +0.4375 0.1875 0.8125 +0.4375 0.1875 0.8438 +0.4375 0.1875 0.875 +0.4375 0.1875 0.9062 +0.4375 0.1875 0.9375 +0.4375 0.1875 0.9688 +0.4375 0.1875 1 +0.4375 0.2188 0 +0.4375 0.2188 0.03125 +0.4375 0.2188 0.0625 +0.4375 0.2188 0.09375 +0.4375 0.2188 0.125 +0.4375 0.2188 0.1562 +0.4375 0.2188 0.1875 +0.4375 0.2188 0.2188 +0.4375 0.2188 0.25 +0.4375 0.2188 0.2812 +0.4375 0.2188 0.3125 +0.4375 0.2188 0.3438 +0.4375 0.2188 0.375 +0.4375 0.2188 0.4062 +0.4375 0.2188 0.4375 +0.4375 0.2188 0.4688 +0.4375 0.2188 0.5 +0.4375 0.2188 0.5312 +0.4375 0.2188 0.5625 +0.4375 0.2188 0.5938 +0.4375 0.2188 0.625 +0.4375 0.2188 0.6562 +0.4375 0.2188 0.6875 +0.4375 0.2188 0.7188 +0.4375 0.2188 0.75 +0.4375 0.2188 0.7812 +0.4375 0.2188 0.8125 +0.4375 0.2188 0.8438 +0.4375 0.2188 0.875 +0.4375 0.2188 0.9062 +0.4375 0.2188 0.9375 +0.4375 0.2188 0.9688 +0.4375 0.2188 1 +0.4375 0.25 0 +0.4375 0.25 0.03125 +0.4375 0.25 0.0625 +0.4375 0.25 0.09375 +0.4375 0.25 0.125 +0.4375 0.25 0.1562 +0.4375 0.25 0.1875 +0.4375 0.25 0.2188 +0.4375 0.25 0.25 +0.4375 0.25 0.2812 +0.4375 0.25 0.3125 +0.4375 0.25 0.3438 +0.4375 0.25 0.375 +0.4375 0.25 0.4062 +0.4375 0.25 0.4375 +0.4375 0.25 0.4688 +0.4375 0.25 0.5 +0.4375 0.25 0.5312 +0.4375 0.25 0.5625 +0.4375 0.25 0.5938 +0.4375 0.25 0.625 +0.4375 0.25 0.6562 +0.4375 0.25 0.6875 +0.4375 0.25 0.7188 +0.4375 0.25 0.75 +0.4375 0.25 0.7812 +0.4375 0.25 0.8125 +0.4375 0.25 0.8438 +0.4375 0.25 0.875 +0.4375 0.25 0.9062 +0.4375 0.25 0.9375 +0.4375 0.25 0.9688 +0.4375 0.25 1 +0.4375 0.2812 0 +0.4375 0.2812 0.03125 +0.4375 0.2812 0.0625 +0.4375 0.2812 0.09375 +0.4375 0.2812 0.125 +0.4375 0.2812 0.1562 +0.4375 0.2812 0.1875 +0.4375 0.2812 0.2188 +0.4375 0.2812 0.25 +0.4375 0.2812 0.2812 +0.4375 0.2812 0.3125 +0.4375 0.2812 0.3438 +0.4375 0.2812 0.375 +0.4375 0.2812 0.4062 +0.4375 0.2812 0.4375 +0.4375 0.2812 0.4688 +0.4375 0.2812 0.5 +0.4375 0.2812 0.5312 +0.4375 0.2812 0.5625 +0.4375 0.2812 0.5938 +0.4375 0.2812 0.625 +0.4375 0.2812 0.6562 +0.4375 0.2812 0.6875 +0.4375 0.2812 0.7188 +0.4375 0.2812 0.75 +0.4375 0.2812 0.7812 +0.4375 0.2812 0.8125 +0.4375 0.2812 0.8438 +0.4375 0.2812 0.875 +0.4375 0.2812 0.9062 +0.4375 0.2812 0.9375 +0.4375 0.2812 0.9688 +0.4375 0.2812 1 +0.4375 0.3125 0 +0.4375 0.3125 0.03125 +0.4375 0.3125 0.0625 +0.4375 0.3125 0.09375 +0.4375 0.3125 0.125 +0.4375 0.3125 0.1562 +0.4375 0.3125 0.1875 +0.4375 0.3125 0.2188 +0.4375 0.3125 0.25 +0.4375 0.3125 0.2812 +0.4375 0.3125 0.3125 +0.4375 0.3125 0.3438 +0.4375 0.3125 0.375 +0.4375 0.3125 0.4062 +0.4375 0.3125 0.4375 +0.4375 0.3125 0.4688 +0.4375 0.3125 0.5 +0.4375 0.3125 0.5312 +0.4375 0.3125 0.5625 +0.4375 0.3125 0.5938 +0.4375 0.3125 0.625 +0.4375 0.3125 0.6562 +0.4375 0.3125 0.6875 +0.4375 0.3125 0.7188 +0.4375 0.3125 0.75 +0.4375 0.3125 0.7812 +0.4375 0.3125 0.8125 +0.4375 0.3125 0.8438 +0.4375 0.3125 0.875 +0.4375 0.3125 0.9062 +0.4375 0.3125 0.9375 +0.4375 0.3125 0.9688 +0.4375 0.3125 1 +0.4375 0.3438 0 +0.4375 0.3438 0.03125 +0.4375 0.3438 0.0625 +0.4375 0.3438 0.09375 +0.4375 0.3438 0.125 +0.4375 0.3438 0.1562 +0.4375 0.3438 0.1875 +0.4375 0.3438 0.2188 +0.4375 0.3438 0.25 +0.4375 0.3438 0.2812 +0.4375 0.3438 0.3125 +0.4375 0.3438 0.3438 +0.4375 0.3438 0.375 +0.4375 0.3438 0.4062 +0.4375 0.3438 0.4375 +0.4375 0.3438 0.4688 +0.4375 0.3438 0.5 +0.4375 0.3438 0.5312 +0.4375 0.3438 0.5625 +0.4375 0.3438 0.5938 +0.4375 0.3438 0.625 +0.4375 0.3438 0.6562 +0.4375 0.3438 0.6875 +0.4375 0.3438 0.7188 +0.4375 0.3438 0.75 +0.4375 0.3438 0.7812 +0.4375 0.3438 0.8125 +0.4375 0.3438 0.8438 +0.4375 0.3438 0.875 +0.4375 0.3438 0.9062 +0.4375 0.3438 0.9375 +0.4375 0.3438 0.9688 +0.4375 0.3438 1 +0.4375 0.375 0 +0.4375 0.375 0.03125 +0.4375 0.375 0.0625 +0.4375 0.375 0.09375 +0.4375 0.375 0.125 +0.4375 0.375 0.1562 +0.4375 0.375 0.1875 +0.4375 0.375 0.2188 +0.4375 0.375 0.25 +0.4375 0.375 0.2812 +0.4375 0.375 0.3125 +0.4375 0.375 0.3438 +0.4375 0.375 0.375 +0.4375 0.375 0.4062 +0.4375 0.375 0.4375 +0.4375 0.375 0.4688 +0.4375 0.375 0.5 +0.4375 0.375 0.5312 +0.4375 0.375 0.5625 +0.4375 0.375 0.5938 +0.4375 0.375 0.625 +0.4375 0.375 0.6562 +0.4375 0.375 0.6875 +0.4375 0.375 0.7188 +0.4375 0.375 0.75 +0.4375 0.375 0.7812 +0.4375 0.375 0.8125 +0.4375 0.375 0.8438 +0.4375 0.375 0.875 +0.4375 0.375 0.9062 +0.4375 0.375 0.9375 +0.4375 0.375 0.9688 +0.4375 0.375 1 +0.4375 0.4062 0 +0.4375 0.4062 0.03125 +0.4375 0.4062 0.0625 +0.4375 0.4062 0.09375 +0.4375 0.4062 0.125 +0.4375 0.4062 0.1562 +0.4375 0.4062 0.1875 +0.4375 0.4062 0.2188 +0.4375 0.4062 0.25 +0.4375 0.4062 0.2812 +0.4375 0.4062 0.3125 +0.4375 0.4062 0.3438 +0.4375 0.4062 0.375 +0.4375 0.4062 0.4062 +0.4375 0.4062 0.4375 +0.4375 0.4062 0.4688 +0.4375 0.4062 0.5 +0.4375 0.4062 0.5312 +0.4375 0.4062 0.5625 +0.4375 0.4062 0.5938 +0.4375 0.4062 0.625 +0.4375 0.4062 0.6562 +0.4375 0.4062 0.6875 +0.4375 0.4062 0.7188 +0.4375 0.4062 0.75 +0.4375 0.4062 0.7812 +0.4375 0.4062 0.8125 +0.4375 0.4062 0.8438 +0.4375 0.4062 0.875 +0.4375 0.4062 0.9062 +0.4375 0.4062 0.9375 +0.4375 0.4062 0.9688 +0.4375 0.4062 1 +0.4375 0.4375 0 +0.4375 0.4375 0.03125 +0.4375 0.4375 0.0625 +0.4375 0.4375 0.09375 +0.4375 0.4375 0.125 +0.4375 0.4375 0.1562 +0.4375 0.4375 0.1875 +0.4375 0.4375 0.2188 +0.4375 0.4375 0.25 +0.4375 0.4375 0.2812 +0.4375 0.4375 0.3125 +0.4375 0.4375 0.3438 +0.4375 0.4375 0.375 +0.4375 0.4375 0.4062 +0.4375 0.4375 0.4375 +0.4375 0.4375 0.4688 +0.4375 0.4375 0.5 +0.4375 0.4375 0.5312 +0.4375 0.4375 0.5625 +0.4375 0.4375 0.5938 +0.4375 0.4375 0.625 +0.4375 0.4375 0.6562 +0.4375 0.4375 0.6875 +0.4375 0.4375 0.7188 +0.4375 0.4375 0.75 +0.4375 0.4375 0.7812 +0.4375 0.4375 0.8125 +0.4375 0.4375 0.8438 +0.4375 0.4375 0.875 +0.4375 0.4375 0.9062 +0.4375 0.4375 0.9375 +0.4375 0.4375 0.9688 +0.4375 0.4375 1 +0.4375 0.4688 0 +0.4375 0.4688 0.03125 +0.4375 0.4688 0.0625 +0.4375 0.4688 0.09375 +0.4375 0.4688 0.125 +0.4375 0.4688 0.1562 +0.4375 0.4688 0.1875 +0.4375 0.4688 0.2188 +0.4375 0.4688 0.25 +0.4375 0.4688 0.2812 +0.4375 0.4688 0.3125 +0.4375 0.4688 0.3438 +0.4375 0.4688 0.375 +0.4375 0.4688 0.4062 +0.4375 0.4688 0.4375 +0.4375 0.4688 0.4688 +0.4375 0.4688 0.5 +0.4375 0.4688 0.5312 +0.4375 0.4688 0.5625 +0.4375 0.4688 0.5938 +0.4375 0.4688 0.625 +0.4375 0.4688 0.6562 +0.4375 0.4688 0.6875 +0.4375 0.4688 0.7188 +0.4375 0.4688 0.75 +0.4375 0.4688 0.7812 +0.4375 0.4688 0.8125 +0.4375 0.4688 0.8438 +0.4375 0.4688 0.875 +0.4375 0.4688 0.9062 +0.4375 0.4688 0.9375 +0.4375 0.4688 0.9688 +0.4375 0.4688 1 +0.4375 0.5 0 +0.4375 0.5 0.03125 +0.4375 0.5 0.0625 +0.4375 0.5 0.09375 +0.4375 0.5 0.125 +0.4375 0.5 0.1562 +0.4375 0.5 0.1875 +0.4375 0.5 0.2188 +0.4375 0.5 0.25 +0.4375 0.5 0.2812 +0.4375 0.5 0.3125 +0.4375 0.5 0.3438 +0.4375 0.5 0.375 +0.4375 0.5 0.4062 +0.4375 0.5 0.4375 +0.4375 0.5 0.4688 +0.4375 0.5 0.5 +0.4375 0.5 0.5312 +0.4375 0.5 0.5625 +0.4375 0.5 0.5938 +0.4375 0.5 0.625 +0.4375 0.5 0.6562 +0.4375 0.5 0.6875 +0.4375 0.5 0.7188 +0.4375 0.5 0.75 +0.4375 0.5 0.7812 +0.4375 0.5 0.8125 +0.4375 0.5 0.8438 +0.4375 0.5 0.875 +0.4375 0.5 0.9062 +0.4375 0.5 0.9375 +0.4375 0.5 0.9688 +0.4375 0.5 1 +0.4375 0.5312 0 +0.4375 0.5312 0.03125 +0.4375 0.5312 0.0625 +0.4375 0.5312 0.09375 +0.4375 0.5312 0.125 +0.4375 0.5312 0.1562 +0.4375 0.5312 0.1875 +0.4375 0.5312 0.2188 +0.4375 0.5312 0.25 +0.4375 0.5312 0.2812 +0.4375 0.5312 0.3125 +0.4375 0.5312 0.3438 +0.4375 0.5312 0.375 +0.4375 0.5312 0.4062 +0.4375 0.5312 0.4375 +0.4375 0.5312 0.4688 +0.4375 0.5312 0.5 +0.4375 0.5312 0.5312 +0.4375 0.5312 0.5625 +0.4375 0.5312 0.5938 +0.4375 0.5312 0.625 +0.4375 0.5312 0.6562 +0.4375 0.5312 0.6875 +0.4375 0.5312 0.7188 +0.4375 0.5312 0.75 +0.4375 0.5312 0.7812 +0.4375 0.5312 0.8125 +0.4375 0.5312 0.8438 +0.4375 0.5312 0.875 +0.4375 0.5312 0.9062 +0.4375 0.5312 0.9375 +0.4375 0.5312 0.9688 +0.4375 0.5312 1 +0.4375 0.5625 0 +0.4375 0.5625 0.03125 +0.4375 0.5625 0.0625 +0.4375 0.5625 0.09375 +0.4375 0.5625 0.125 +0.4375 0.5625 0.1562 +0.4375 0.5625 0.1875 +0.4375 0.5625 0.2188 +0.4375 0.5625 0.25 +0.4375 0.5625 0.2812 +0.4375 0.5625 0.3125 +0.4375 0.5625 0.3438 +0.4375 0.5625 0.375 +0.4375 0.5625 0.4062 +0.4375 0.5625 0.4375 +0.4375 0.5625 0.4688 +0.4375 0.5625 0.5 +0.4375 0.5625 0.5312 +0.4375 0.5625 0.5625 +0.4375 0.5625 0.5938 +0.4375 0.5625 0.625 +0.4375 0.5625 0.6562 +0.4375 0.5625 0.6875 +0.4375 0.5625 0.7188 +0.4375 0.5625 0.75 +0.4375 0.5625 0.7812 +0.4375 0.5625 0.8125 +0.4375 0.5625 0.8438 +0.4375 0.5625 0.875 +0.4375 0.5625 0.9062 +0.4375 0.5625 0.9375 +0.4375 0.5625 0.9688 +0.4375 0.5625 1 +0.4375 0.5938 0 +0.4375 0.5938 0.03125 +0.4375 0.5938 0.0625 +0.4375 0.5938 0.09375 +0.4375 0.5938 0.125 +0.4375 0.5938 0.1562 +0.4375 0.5938 0.1875 +0.4375 0.5938 0.2188 +0.4375 0.5938 0.25 +0.4375 0.5938 0.2812 +0.4375 0.5938 0.3125 +0.4375 0.5938 0.3438 +0.4375 0.5938 0.375 +0.4375 0.5938 0.4062 +0.4375 0.5938 0.4375 +0.4375 0.5938 0.4688 +0.4375 0.5938 0.5 +0.4375 0.5938 0.5312 +0.4375 0.5938 0.5625 +0.4375 0.5938 0.5938 +0.4375 0.5938 0.625 +0.4375 0.5938 0.6562 +0.4375 0.5938 0.6875 +0.4375 0.5938 0.7188 +0.4375 0.5938 0.75 +0.4375 0.5938 0.7812 +0.4375 0.5938 0.8125 +0.4375 0.5938 0.8438 +0.4375 0.5938 0.875 +0.4375 0.5938 0.9062 +0.4375 0.5938 0.9375 +0.4375 0.5938 0.9688 +0.4375 0.5938 1 +0.4375 0.625 0 +0.4375 0.625 0.03125 +0.4375 0.625 0.0625 +0.4375 0.625 0.09375 +0.4375 0.625 0.125 +0.4375 0.625 0.1562 +0.4375 0.625 0.1875 +0.4375 0.625 0.2188 +0.4375 0.625 0.25 +0.4375 0.625 0.2812 +0.4375 0.625 0.3125 +0.4375 0.625 0.3438 +0.4375 0.625 0.375 +0.4375 0.625 0.4062 +0.4375 0.625 0.4375 +0.4375 0.625 0.4688 +0.4375 0.625 0.5 +0.4375 0.625 0.5312 +0.4375 0.625 0.5625 +0.4375 0.625 0.5938 +0.4375 0.625 0.625 +0.4375 0.625 0.6562 +0.4375 0.625 0.6875 +0.4375 0.625 0.7188 +0.4375 0.625 0.75 +0.4375 0.625 0.7812 +0.4375 0.625 0.8125 +0.4375 0.625 0.8438 +0.4375 0.625 0.875 +0.4375 0.625 0.9062 +0.4375 0.625 0.9375 +0.4375 0.625 0.9688 +0.4375 0.625 1 +0.4375 0.6562 0 +0.4375 0.6562 0.03125 +0.4375 0.6562 0.0625 +0.4375 0.6562 0.09375 +0.4375 0.6562 0.125 +0.4375 0.6562 0.1562 +0.4375 0.6562 0.1875 +0.4375 0.6562 0.2188 +0.4375 0.6562 0.25 +0.4375 0.6562 0.2812 +0.4375 0.6562 0.3125 +0.4375 0.6562 0.3438 +0.4375 0.6562 0.375 +0.4375 0.6562 0.4062 +0.4375 0.6562 0.4375 +0.4375 0.6562 0.4688 +0.4375 0.6562 0.5 +0.4375 0.6562 0.5312 +0.4375 0.6562 0.5625 +0.4375 0.6562 0.5938 +0.4375 0.6562 0.625 +0.4375 0.6562 0.6562 +0.4375 0.6562 0.6875 +0.4375 0.6562 0.7188 +0.4375 0.6562 0.75 +0.4375 0.6562 0.7812 +0.4375 0.6562 0.8125 +0.4375 0.6562 0.8438 +0.4375 0.6562 0.875 +0.4375 0.6562 0.9062 +0.4375 0.6562 0.9375 +0.4375 0.6562 0.9688 +0.4375 0.6562 1 +0.4375 0.6875 0 +0.4375 0.6875 0.03125 +0.4375 0.6875 0.0625 +0.4375 0.6875 0.09375 +0.4375 0.6875 0.125 +0.4375 0.6875 0.1562 +0.4375 0.6875 0.1875 +0.4375 0.6875 0.2188 +0.4375 0.6875 0.25 +0.4375 0.6875 0.2812 +0.4375 0.6875 0.3125 +0.4375 0.6875 0.3438 +0.4375 0.6875 0.375 +0.4375 0.6875 0.4062 +0.4375 0.6875 0.4375 +0.4375 0.6875 0.4688 +0.4375 0.6875 0.5 +0.4375 0.6875 0.5312 +0.4375 0.6875 0.5625 +0.4375 0.6875 0.5938 +0.4375 0.6875 0.625 +0.4375 0.6875 0.6562 +0.4375 0.6875 0.6875 +0.4375 0.6875 0.7188 +0.4375 0.6875 0.75 +0.4375 0.6875 0.7812 +0.4375 0.6875 0.8125 +0.4375 0.6875 0.8438 +0.4375 0.6875 0.875 +0.4375 0.6875 0.9062 +0.4375 0.6875 0.9375 +0.4375 0.6875 0.9688 +0.4375 0.6875 1 +0.4375 0.7188 0 +0.4375 0.7188 0.03125 +0.4375 0.7188 0.0625 +0.4375 0.7188 0.09375 +0.4375 0.7188 0.125 +0.4375 0.7188 0.1562 +0.4375 0.7188 0.1875 +0.4375 0.7188 0.2188 +0.4375 0.7188 0.25 +0.4375 0.7188 0.2812 +0.4375 0.7188 0.3125 +0.4375 0.7188 0.3438 +0.4375 0.7188 0.375 +0.4375 0.7188 0.4062 +0.4375 0.7188 0.4375 +0.4375 0.7188 0.4688 +0.4375 0.7188 0.5 +0.4375 0.7188 0.5312 +0.4375 0.7188 0.5625 +0.4375 0.7188 0.5938 +0.4375 0.7188 0.625 +0.4375 0.7188 0.6562 +0.4375 0.7188 0.6875 +0.4375 0.7188 0.7188 +0.4375 0.7188 0.75 +0.4375 0.7188 0.7812 +0.4375 0.7188 0.8125 +0.4375 0.7188 0.8438 +0.4375 0.7188 0.875 +0.4375 0.7188 0.9062 +0.4375 0.7188 0.9375 +0.4375 0.7188 0.9688 +0.4375 0.7188 1 +0.4375 0.75 0 +0.4375 0.75 0.03125 +0.4375 0.75 0.0625 +0.4375 0.75 0.09375 +0.4375 0.75 0.125 +0.4375 0.75 0.1562 +0.4375 0.75 0.1875 +0.4375 0.75 0.2188 +0.4375 0.75 0.25 +0.4375 0.75 0.2812 +0.4375 0.75 0.3125 +0.4375 0.75 0.3438 +0.4375 0.75 0.375 +0.4375 0.75 0.4062 +0.4375 0.75 0.4375 +0.4375 0.75 0.4688 +0.4375 0.75 0.5 +0.4375 0.75 0.5312 +0.4375 0.75 0.5625 +0.4375 0.75 0.5938 +0.4375 0.75 0.625 +0.4375 0.75 0.6562 +0.4375 0.75 0.6875 +0.4375 0.75 0.7188 +0.4375 0.75 0.75 +0.4375 0.75 0.7812 +0.4375 0.75 0.8125 +0.4375 0.75 0.8438 +0.4375 0.75 0.875 +0.4375 0.75 0.9062 +0.4375 0.75 0.9375 +0.4375 0.75 0.9688 +0.4375 0.75 1 +0.4375 0.7812 0 +0.4375 0.7812 0.03125 +0.4375 0.7812 0.0625 +0.4375 0.7812 0.09375 +0.4375 0.7812 0.125 +0.4375 0.7812 0.1562 +0.4375 0.7812 0.1875 +0.4375 0.7812 0.2188 +0.4375 0.7812 0.25 +0.4375 0.7812 0.2812 +0.4375 0.7812 0.3125 +0.4375 0.7812 0.3438 +0.4375 0.7812 0.375 +0.4375 0.7812 0.4062 +0.4375 0.7812 0.4375 +0.4375 0.7812 0.4688 +0.4375 0.7812 0.5 +0.4375 0.7812 0.5312 +0.4375 0.7812 0.5625 +0.4375 0.7812 0.5938 +0.4375 0.7812 0.625 +0.4375 0.7812 0.6562 +0.4375 0.7812 0.6875 +0.4375 0.7812 0.7188 +0.4375 0.7812 0.75 +0.4375 0.7812 0.7812 +0.4375 0.7812 0.8125 +0.4375 0.7812 0.8438 +0.4375 0.7812 0.875 +0.4375 0.7812 0.9062 +0.4375 0.7812 0.9375 +0.4375 0.7812 0.9688 +0.4375 0.7812 1 +0.4375 0.8125 0 +0.4375 0.8125 0.03125 +0.4375 0.8125 0.0625 +0.4375 0.8125 0.09375 +0.4375 0.8125 0.125 +0.4375 0.8125 0.1562 +0.4375 0.8125 0.1875 +0.4375 0.8125 0.2188 +0.4375 0.8125 0.25 +0.4375 0.8125 0.2812 +0.4375 0.8125 0.3125 +0.4375 0.8125 0.3438 +0.4375 0.8125 0.375 +0.4375 0.8125 0.4062 +0.4375 0.8125 0.4375 +0.4375 0.8125 0.4688 +0.4375 0.8125 0.5 +0.4375 0.8125 0.5312 +0.4375 0.8125 0.5625 +0.4375 0.8125 0.5938 +0.4375 0.8125 0.625 +0.4375 0.8125 0.6562 +0.4375 0.8125 0.6875 +0.4375 0.8125 0.7188 +0.4375 0.8125 0.75 +0.4375 0.8125 0.7812 +0.4375 0.8125 0.8125 +0.4375 0.8125 0.8438 +0.4375 0.8125 0.875 +0.4375 0.8125 0.9062 +0.4375 0.8125 0.9375 +0.4375 0.8125 0.9688 +0.4375 0.8125 1 +0.4375 0.8438 0 +0.4375 0.8438 0.03125 +0.4375 0.8438 0.0625 +0.4375 0.8438 0.09375 +0.4375 0.8438 0.125 +0.4375 0.8438 0.1562 +0.4375 0.8438 0.1875 +0.4375 0.8438 0.2188 +0.4375 0.8438 0.25 +0.4375 0.8438 0.2812 +0.4375 0.8438 0.3125 +0.4375 0.8438 0.3438 +0.4375 0.8438 0.375 +0.4375 0.8438 0.4062 +0.4375 0.8438 0.4375 +0.4375 0.8438 0.4688 +0.4375 0.8438 0.5 +0.4375 0.8438 0.5312 +0.4375 0.8438 0.5625 +0.4375 0.8438 0.5938 +0.4375 0.8438 0.625 +0.4375 0.8438 0.6562 +0.4375 0.8438 0.6875 +0.4375 0.8438 0.7188 +0.4375 0.8438 0.75 +0.4375 0.8438 0.7812 +0.4375 0.8438 0.8125 +0.4375 0.8438 0.8438 +0.4375 0.8438 0.875 +0.4375 0.8438 0.9062 +0.4375 0.8438 0.9375 +0.4375 0.8438 0.9688 +0.4375 0.8438 1 +0.4375 0.875 0 +0.4375 0.875 0.03125 +0.4375 0.875 0.0625 +0.4375 0.875 0.09375 +0.4375 0.875 0.125 +0.4375 0.875 0.1562 +0.4375 0.875 0.1875 +0.4375 0.875 0.2188 +0.4375 0.875 0.25 +0.4375 0.875 0.2812 +0.4375 0.875 0.3125 +0.4375 0.875 0.3438 +0.4375 0.875 0.375 +0.4375 0.875 0.4062 +0.4375 0.875 0.4375 +0.4375 0.875 0.4688 +0.4375 0.875 0.5 +0.4375 0.875 0.5312 +0.4375 0.875 0.5625 +0.4375 0.875 0.5938 +0.4375 0.875 0.625 +0.4375 0.875 0.6562 +0.4375 0.875 0.6875 +0.4375 0.875 0.7188 +0.4375 0.875 0.75 +0.4375 0.875 0.7812 +0.4375 0.875 0.8125 +0.4375 0.875 0.8438 +0.4375 0.875 0.875 +0.4375 0.875 0.9062 +0.4375 0.875 0.9375 +0.4375 0.875 0.9688 +0.4375 0.875 1 +0.4375 0.9062 0 +0.4375 0.9062 0.03125 +0.4375 0.9062 0.0625 +0.4375 0.9062 0.09375 +0.4375 0.9062 0.125 +0.4375 0.9062 0.1562 +0.4375 0.9062 0.1875 +0.4375 0.9062 0.2188 +0.4375 0.9062 0.25 +0.4375 0.9062 0.2812 +0.4375 0.9062 0.3125 +0.4375 0.9062 0.3438 +0.4375 0.9062 0.375 +0.4375 0.9062 0.4062 +0.4375 0.9062 0.4375 +0.4375 0.9062 0.4688 +0.4375 0.9062 0.5 +0.4375 0.9062 0.5312 +0.4375 0.9062 0.5625 +0.4375 0.9062 0.5938 +0.4375 0.9062 0.625 +0.4375 0.9062 0.6562 +0.4375 0.9062 0.6875 +0.4375 0.9062 0.7188 +0.4375 0.9062 0.75 +0.4375 0.9062 0.7812 +0.4375 0.9062 0.8125 +0.4375 0.9062 0.8438 +0.4375 0.9062 0.875 +0.4375 0.9062 0.9062 +0.4375 0.9062 0.9375 +0.4375 0.9062 0.9688 +0.4375 0.9062 1 +0.4375 0.9375 0 +0.4375 0.9375 0.03125 +0.4375 0.9375 0.0625 +0.4375 0.9375 0.09375 +0.4375 0.9375 0.125 +0.4375 0.9375 0.1562 +0.4375 0.9375 0.1875 +0.4375 0.9375 0.2188 +0.4375 0.9375 0.25 +0.4375 0.9375 0.2812 +0.4375 0.9375 0.3125 +0.4375 0.9375 0.3438 +0.4375 0.9375 0.375 +0.4375 0.9375 0.4062 +0.4375 0.9375 0.4375 +0.4375 0.9375 0.4688 +0.4375 0.9375 0.5 +0.4375 0.9375 0.5312 +0.4375 0.9375 0.5625 +0.4375 0.9375 0.5938 +0.4375 0.9375 0.625 +0.4375 0.9375 0.6562 +0.4375 0.9375 0.6875 +0.4375 0.9375 0.7188 +0.4375 0.9375 0.75 +0.4375 0.9375 0.7812 +0.4375 0.9375 0.8125 +0.4375 0.9375 0.8438 +0.4375 0.9375 0.875 +0.4375 0.9375 0.9062 +0.4375 0.9375 0.9375 +0.4375 0.9375 0.9688 +0.4375 0.9375 1 +0.4375 0.9688 0 +0.4375 0.9688 0.03125 +0.4375 0.9688 0.0625 +0.4375 0.9688 0.09375 +0.4375 0.9688 0.125 +0.4375 0.9688 0.1562 +0.4375 0.9688 0.1875 +0.4375 0.9688 0.2188 +0.4375 0.9688 0.25 +0.4375 0.9688 0.2812 +0.4375 0.9688 0.3125 +0.4375 0.9688 0.3438 +0.4375 0.9688 0.375 +0.4375 0.9688 0.4062 +0.4375 0.9688 0.4375 +0.4375 0.9688 0.4688 +0.4375 0.9688 0.5 +0.4375 0.9688 0.5312 +0.4375 0.9688 0.5625 +0.4375 0.9688 0.5938 +0.4375 0.9688 0.625 +0.4375 0.9688 0.6562 +0.4375 0.9688 0.6875 +0.4375 0.9688 0.7188 +0.4375 0.9688 0.75 +0.4375 0.9688 0.7812 +0.4375 0.9688 0.8125 +0.4375 0.9688 0.8438 +0.4375 0.9688 0.875 +0.4375 0.9688 0.9062 +0.4375 0.9688 0.9375 +0.4375 0.9688 0.9688 +0.4375 0.9688 1 +0.4375 1 0 +0.4375 1 0.03125 +0.4375 1 0.0625 +0.4375 1 0.09375 +0.4375 1 0.125 +0.4375 1 0.1562 +0.4375 1 0.1875 +0.4375 1 0.2188 +0.4375 1 0.25 +0.4375 1 0.2812 +0.4375 1 0.3125 +0.4375 1 0.3438 +0.4375 1 0.375 +0.4375 1 0.4062 +0.4375 1 0.4375 +0.4375 1 0.4688 +0.4375 1 0.5 +0.4375 1 0.5312 +0.4375 1 0.5625 +0.4375 1 0.5938 +0.4375 1 0.625 +0.4375 1 0.6562 +0.4375 1 0.6875 +0.4375 1 0.7188 +0.4375 1 0.75 +0.4375 1 0.7812 +0.4375 1 0.8125 +0.4375 1 0.8438 +0.4375 1 0.875 +0.4375 1 0.9062 +0.4375 1 0.9375 +0.4375 1 0.9688 +0.4375 1 1 +0.4688 0 0 +0.4688 0 0.03125 +0.4688 0 0.0625 +0.4688 0 0.09375 +0.4688 0 0.125 +0.4688 0 0.1562 +0.4688 0 0.1875 +0.4688 0 0.2188 +0.4688 0 0.25 +0.4688 0 0.2812 +0.4688 0 0.3125 +0.4688 0 0.3438 +0.4688 0 0.375 +0.4688 0 0.4062 +0.4688 0 0.4375 +0.4688 0 0.4688 +0.4688 0 0.5 +0.4688 0 0.5312 +0.4688 0 0.5625 +0.4688 0 0.5938 +0.4688 0 0.625 +0.4688 0 0.6562 +0.4688 0 0.6875 +0.4688 0 0.7188 +0.4688 0 0.75 +0.4688 0 0.7812 +0.4688 0 0.8125 +0.4688 0 0.8438 +0.4688 0 0.875 +0.4688 0 0.9062 +0.4688 0 0.9375 +0.4688 0 0.9688 +0.4688 0 1 +0.4688 0.03125 0 +0.4688 0.03125 0.03125 +0.4688 0.03125 0.0625 +0.4688 0.03125 0.09375 +0.4688 0.03125 0.125 +0.4688 0.03125 0.1562 +0.4688 0.03125 0.1875 +0.4688 0.03125 0.2188 +0.4688 0.03125 0.25 +0.4688 0.03125 0.2812 +0.4688 0.03125 0.3125 +0.4688 0.03125 0.3438 +0.4688 0.03125 0.375 +0.4688 0.03125 0.4062 +0.4688 0.03125 0.4375 +0.4688 0.03125 0.4688 +0.4688 0.03125 0.5 +0.4688 0.03125 0.5312 +0.4688 0.03125 0.5625 +0.4688 0.03125 0.5938 +0.4688 0.03125 0.625 +0.4688 0.03125 0.6562 +0.4688 0.03125 0.6875 +0.4688 0.03125 0.7188 +0.4688 0.03125 0.75 +0.4688 0.03125 0.7812 +0.4688 0.03125 0.8125 +0.4688 0.03125 0.8438 +0.4688 0.03125 0.875 +0.4688 0.03125 0.9062 +0.4688 0.03125 0.9375 +0.4688 0.03125 0.9688 +0.4688 0.03125 1 +0.4688 0.0625 0 +0.4688 0.0625 0.03125 +0.4688 0.0625 0.0625 +0.4688 0.0625 0.09375 +0.4688 0.0625 0.125 +0.4688 0.0625 0.1562 +0.4688 0.0625 0.1875 +0.4688 0.0625 0.2188 +0.4688 0.0625 0.25 +0.4688 0.0625 0.2812 +0.4688 0.0625 0.3125 +0.4688 0.0625 0.3438 +0.4688 0.0625 0.375 +0.4688 0.0625 0.4062 +0.4688 0.0625 0.4375 +0.4688 0.0625 0.4688 +0.4688 0.0625 0.5 +0.4688 0.0625 0.5312 +0.4688 0.0625 0.5625 +0.4688 0.0625 0.5938 +0.4688 0.0625 0.625 +0.4688 0.0625 0.6562 +0.4688 0.0625 0.6875 +0.4688 0.0625 0.7188 +0.4688 0.0625 0.75 +0.4688 0.0625 0.7812 +0.4688 0.0625 0.8125 +0.4688 0.0625 0.8438 +0.4688 0.0625 0.875 +0.4688 0.0625 0.9062 +0.4688 0.0625 0.9375 +0.4688 0.0625 0.9688 +0.4688 0.0625 1 +0.4688 0.09375 0 +0.4688 0.09375 0.03125 +0.4688 0.09375 0.0625 +0.4688 0.09375 0.09375 +0.4688 0.09375 0.125 +0.4688 0.09375 0.1562 +0.4688 0.09375 0.1875 +0.4688 0.09375 0.2188 +0.4688 0.09375 0.25 +0.4688 0.09375 0.2812 +0.4688 0.09375 0.3125 +0.4688 0.09375 0.3438 +0.4688 0.09375 0.375 +0.4688 0.09375 0.4062 +0.4688 0.09375 0.4375 +0.4688 0.09375 0.4688 +0.4688 0.09375 0.5 +0.4688 0.09375 0.5312 +0.4688 0.09375 0.5625 +0.4688 0.09375 0.5938 +0.4688 0.09375 0.625 +0.4688 0.09375 0.6562 +0.4688 0.09375 0.6875 +0.4688 0.09375 0.7188 +0.4688 0.09375 0.75 +0.4688 0.09375 0.7812 +0.4688 0.09375 0.8125 +0.4688 0.09375 0.8438 +0.4688 0.09375 0.875 +0.4688 0.09375 0.9062 +0.4688 0.09375 0.9375 +0.4688 0.09375 0.9688 +0.4688 0.09375 1 +0.4688 0.125 0 +0.4688 0.125 0.03125 +0.4688 0.125 0.0625 +0.4688 0.125 0.09375 +0.4688 0.125 0.125 +0.4688 0.125 0.1562 +0.4688 0.125 0.1875 +0.4688 0.125 0.2188 +0.4688 0.125 0.25 +0.4688 0.125 0.2812 +0.4688 0.125 0.3125 +0.4688 0.125 0.3438 +0.4688 0.125 0.375 +0.4688 0.125 0.4062 +0.4688 0.125 0.4375 +0.4688 0.125 0.4688 +0.4688 0.125 0.5 +0.4688 0.125 0.5312 +0.4688 0.125 0.5625 +0.4688 0.125 0.5938 +0.4688 0.125 0.625 +0.4688 0.125 0.6562 +0.4688 0.125 0.6875 +0.4688 0.125 0.7188 +0.4688 0.125 0.75 +0.4688 0.125 0.7812 +0.4688 0.125 0.8125 +0.4688 0.125 0.8438 +0.4688 0.125 0.875 +0.4688 0.125 0.9062 +0.4688 0.125 0.9375 +0.4688 0.125 0.9688 +0.4688 0.125 1 +0.4688 0.1562 0 +0.4688 0.1562 0.03125 +0.4688 0.1562 0.0625 +0.4688 0.1562 0.09375 +0.4688 0.1562 0.125 +0.4688 0.1562 0.1562 +0.4688 0.1562 0.1875 +0.4688 0.1562 0.2188 +0.4688 0.1562 0.25 +0.4688 0.1562 0.2812 +0.4688 0.1562 0.3125 +0.4688 0.1562 0.3438 +0.4688 0.1562 0.375 +0.4688 0.1562 0.4062 +0.4688 0.1562 0.4375 +0.4688 0.1562 0.4688 +0.4688 0.1562 0.5 +0.4688 0.1562 0.5312 +0.4688 0.1562 0.5625 +0.4688 0.1562 0.5938 +0.4688 0.1562 0.625 +0.4688 0.1562 0.6562 +0.4688 0.1562 0.6875 +0.4688 0.1562 0.7188 +0.4688 0.1562 0.75 +0.4688 0.1562 0.7812 +0.4688 0.1562 0.8125 +0.4688 0.1562 0.8438 +0.4688 0.1562 0.875 +0.4688 0.1562 0.9062 +0.4688 0.1562 0.9375 +0.4688 0.1562 0.9688 +0.4688 0.1562 1 +0.4688 0.1875 0 +0.4688 0.1875 0.03125 +0.4688 0.1875 0.0625 +0.4688 0.1875 0.09375 +0.4688 0.1875 0.125 +0.4688 0.1875 0.1562 +0.4688 0.1875 0.1875 +0.4688 0.1875 0.2188 +0.4688 0.1875 0.25 +0.4688 0.1875 0.2812 +0.4688 0.1875 0.3125 +0.4688 0.1875 0.3438 +0.4688 0.1875 0.375 +0.4688 0.1875 0.4062 +0.4688 0.1875 0.4375 +0.4688 0.1875 0.4688 +0.4688 0.1875 0.5 +0.4688 0.1875 0.5312 +0.4688 0.1875 0.5625 +0.4688 0.1875 0.5938 +0.4688 0.1875 0.625 +0.4688 0.1875 0.6562 +0.4688 0.1875 0.6875 +0.4688 0.1875 0.7188 +0.4688 0.1875 0.75 +0.4688 0.1875 0.7812 +0.4688 0.1875 0.8125 +0.4688 0.1875 0.8438 +0.4688 0.1875 0.875 +0.4688 0.1875 0.9062 +0.4688 0.1875 0.9375 +0.4688 0.1875 0.9688 +0.4688 0.1875 1 +0.4688 0.2188 0 +0.4688 0.2188 0.03125 +0.4688 0.2188 0.0625 +0.4688 0.2188 0.09375 +0.4688 0.2188 0.125 +0.4688 0.2188 0.1562 +0.4688 0.2188 0.1875 +0.4688 0.2188 0.2188 +0.4688 0.2188 0.25 +0.4688 0.2188 0.2812 +0.4688 0.2188 0.3125 +0.4688 0.2188 0.3438 +0.4688 0.2188 0.375 +0.4688 0.2188 0.4062 +0.4688 0.2188 0.4375 +0.4688 0.2188 0.4688 +0.4688 0.2188 0.5 +0.4688 0.2188 0.5312 +0.4688 0.2188 0.5625 +0.4688 0.2188 0.5938 +0.4688 0.2188 0.625 +0.4688 0.2188 0.6562 +0.4688 0.2188 0.6875 +0.4688 0.2188 0.7188 +0.4688 0.2188 0.75 +0.4688 0.2188 0.7812 +0.4688 0.2188 0.8125 +0.4688 0.2188 0.8438 +0.4688 0.2188 0.875 +0.4688 0.2188 0.9062 +0.4688 0.2188 0.9375 +0.4688 0.2188 0.9688 +0.4688 0.2188 1 +0.4688 0.25 0 +0.4688 0.25 0.03125 +0.4688 0.25 0.0625 +0.4688 0.25 0.09375 +0.4688 0.25 0.125 +0.4688 0.25 0.1562 +0.4688 0.25 0.1875 +0.4688 0.25 0.2188 +0.4688 0.25 0.25 +0.4688 0.25 0.2812 +0.4688 0.25 0.3125 +0.4688 0.25 0.3438 +0.4688 0.25 0.375 +0.4688 0.25 0.4062 +0.4688 0.25 0.4375 +0.4688 0.25 0.4688 +0.4688 0.25 0.5 +0.4688 0.25 0.5312 +0.4688 0.25 0.5625 +0.4688 0.25 0.5938 +0.4688 0.25 0.625 +0.4688 0.25 0.6562 +0.4688 0.25 0.6875 +0.4688 0.25 0.7188 +0.4688 0.25 0.75 +0.4688 0.25 0.7812 +0.4688 0.25 0.8125 +0.4688 0.25 0.8438 +0.4688 0.25 0.875 +0.4688 0.25 0.9062 +0.4688 0.25 0.9375 +0.4688 0.25 0.9688 +0.4688 0.25 1 +0.4688 0.2812 0 +0.4688 0.2812 0.03125 +0.4688 0.2812 0.0625 +0.4688 0.2812 0.09375 +0.4688 0.2812 0.125 +0.4688 0.2812 0.1562 +0.4688 0.2812 0.1875 +0.4688 0.2812 0.2188 +0.4688 0.2812 0.25 +0.4688 0.2812 0.2812 +0.4688 0.2812 0.3125 +0.4688 0.2812 0.3438 +0.4688 0.2812 0.375 +0.4688 0.2812 0.4062 +0.4688 0.2812 0.4375 +0.4688 0.2812 0.4688 +0.4688 0.2812 0.5 +0.4688 0.2812 0.5312 +0.4688 0.2812 0.5625 +0.4688 0.2812 0.5938 +0.4688 0.2812 0.625 +0.4688 0.2812 0.6562 +0.4688 0.2812 0.6875 +0.4688 0.2812 0.7188 +0.4688 0.2812 0.75 +0.4688 0.2812 0.7812 +0.4688 0.2812 0.8125 +0.4688 0.2812 0.8438 +0.4688 0.2812 0.875 +0.4688 0.2812 0.9062 +0.4688 0.2812 0.9375 +0.4688 0.2812 0.9688 +0.4688 0.2812 1 +0.4688 0.3125 0 +0.4688 0.3125 0.03125 +0.4688 0.3125 0.0625 +0.4688 0.3125 0.09375 +0.4688 0.3125 0.125 +0.4688 0.3125 0.1562 +0.4688 0.3125 0.1875 +0.4688 0.3125 0.2188 +0.4688 0.3125 0.25 +0.4688 0.3125 0.2812 +0.4688 0.3125 0.3125 +0.4688 0.3125 0.3438 +0.4688 0.3125 0.375 +0.4688 0.3125 0.4062 +0.4688 0.3125 0.4375 +0.4688 0.3125 0.4688 +0.4688 0.3125 0.5 +0.4688 0.3125 0.5312 +0.4688 0.3125 0.5625 +0.4688 0.3125 0.5938 +0.4688 0.3125 0.625 +0.4688 0.3125 0.6562 +0.4688 0.3125 0.6875 +0.4688 0.3125 0.7188 +0.4688 0.3125 0.75 +0.4688 0.3125 0.7812 +0.4688 0.3125 0.8125 +0.4688 0.3125 0.8438 +0.4688 0.3125 0.875 +0.4688 0.3125 0.9062 +0.4688 0.3125 0.9375 +0.4688 0.3125 0.9688 +0.4688 0.3125 1 +0.4688 0.3438 0 +0.4688 0.3438 0.03125 +0.4688 0.3438 0.0625 +0.4688 0.3438 0.09375 +0.4688 0.3438 0.125 +0.4688 0.3438 0.1562 +0.4688 0.3438 0.1875 +0.4688 0.3438 0.2188 +0.4688 0.3438 0.25 +0.4688 0.3438 0.2812 +0.4688 0.3438 0.3125 +0.4688 0.3438 0.3438 +0.4688 0.3438 0.375 +0.4688 0.3438 0.4062 +0.4688 0.3438 0.4375 +0.4688 0.3438 0.4688 +0.4688 0.3438 0.5 +0.4688 0.3438 0.5312 +0.4688 0.3438 0.5625 +0.4688 0.3438 0.5938 +0.4688 0.3438 0.625 +0.4688 0.3438 0.6562 +0.4688 0.3438 0.6875 +0.4688 0.3438 0.7188 +0.4688 0.3438 0.75 +0.4688 0.3438 0.7812 +0.4688 0.3438 0.8125 +0.4688 0.3438 0.8438 +0.4688 0.3438 0.875 +0.4688 0.3438 0.9062 +0.4688 0.3438 0.9375 +0.4688 0.3438 0.9688 +0.4688 0.3438 1 +0.4688 0.375 0 +0.4688 0.375 0.03125 +0.4688 0.375 0.0625 +0.4688 0.375 0.09375 +0.4688 0.375 0.125 +0.4688 0.375 0.1562 +0.4688 0.375 0.1875 +0.4688 0.375 0.2188 +0.4688 0.375 0.25 +0.4688 0.375 0.2812 +0.4688 0.375 0.3125 +0.4688 0.375 0.3438 +0.4688 0.375 0.375 +0.4688 0.375 0.4062 +0.4688 0.375 0.4375 +0.4688 0.375 0.4688 +0.4688 0.375 0.5 +0.4688 0.375 0.5312 +0.4688 0.375 0.5625 +0.4688 0.375 0.5938 +0.4688 0.375 0.625 +0.4688 0.375 0.6562 +0.4688 0.375 0.6875 +0.4688 0.375 0.7188 +0.4688 0.375 0.75 +0.4688 0.375 0.7812 +0.4688 0.375 0.8125 +0.4688 0.375 0.8438 +0.4688 0.375 0.875 +0.4688 0.375 0.9062 +0.4688 0.375 0.9375 +0.4688 0.375 0.9688 +0.4688 0.375 1 +0.4688 0.4062 0 +0.4688 0.4062 0.03125 +0.4688 0.4062 0.0625 +0.4688 0.4062 0.09375 +0.4688 0.4062 0.125 +0.4688 0.4062 0.1562 +0.4688 0.4062 0.1875 +0.4688 0.4062 0.2188 +0.4688 0.4062 0.25 +0.4688 0.4062 0.2812 +0.4688 0.4062 0.3125 +0.4688 0.4062 0.3438 +0.4688 0.4062 0.375 +0.4688 0.4062 0.4062 +0.4688 0.4062 0.4375 +0.4688 0.4062 0.4688 +0.4688 0.4062 0.5 +0.4688 0.4062 0.5312 +0.4688 0.4062 0.5625 +0.4688 0.4062 0.5938 +0.4688 0.4062 0.625 +0.4688 0.4062 0.6562 +0.4688 0.4062 0.6875 +0.4688 0.4062 0.7188 +0.4688 0.4062 0.75 +0.4688 0.4062 0.7812 +0.4688 0.4062 0.8125 +0.4688 0.4062 0.8438 +0.4688 0.4062 0.875 +0.4688 0.4062 0.9062 +0.4688 0.4062 0.9375 +0.4688 0.4062 0.9688 +0.4688 0.4062 1 +0.4688 0.4375 0 +0.4688 0.4375 0.03125 +0.4688 0.4375 0.0625 +0.4688 0.4375 0.09375 +0.4688 0.4375 0.125 +0.4688 0.4375 0.1562 +0.4688 0.4375 0.1875 +0.4688 0.4375 0.2188 +0.4688 0.4375 0.25 +0.4688 0.4375 0.2812 +0.4688 0.4375 0.3125 +0.4688 0.4375 0.3438 +0.4688 0.4375 0.375 +0.4688 0.4375 0.4062 +0.4688 0.4375 0.4375 +0.4688 0.4375 0.4688 +0.4688 0.4375 0.5 +0.4688 0.4375 0.5312 +0.4688 0.4375 0.5625 +0.4688 0.4375 0.5938 +0.4688 0.4375 0.625 +0.4688 0.4375 0.6562 +0.4688 0.4375 0.6875 +0.4688 0.4375 0.7188 +0.4688 0.4375 0.75 +0.4688 0.4375 0.7812 +0.4688 0.4375 0.8125 +0.4688 0.4375 0.8438 +0.4688 0.4375 0.875 +0.4688 0.4375 0.9062 +0.4688 0.4375 0.9375 +0.4688 0.4375 0.9688 +0.4688 0.4375 1 +0.4688 0.4688 0 +0.4688 0.4688 0.03125 +0.4688 0.4688 0.0625 +0.4688 0.4688 0.09375 +0.4688 0.4688 0.125 +0.4688 0.4688 0.1562 +0.4688 0.4688 0.1875 +0.4688 0.4688 0.2188 +0.4688 0.4688 0.25 +0.4688 0.4688 0.2812 +0.4688 0.4688 0.3125 +0.4688 0.4688 0.3438 +0.4688 0.4688 0.375 +0.4688 0.4688 0.4062 +0.4688 0.4688 0.4375 +0.4688 0.4688 0.4688 +0.4688 0.4688 0.5 +0.4688 0.4688 0.5312 +0.4688 0.4688 0.5625 +0.4688 0.4688 0.5938 +0.4688 0.4688 0.625 +0.4688 0.4688 0.6562 +0.4688 0.4688 0.6875 +0.4688 0.4688 0.7188 +0.4688 0.4688 0.75 +0.4688 0.4688 0.7812 +0.4688 0.4688 0.8125 +0.4688 0.4688 0.8438 +0.4688 0.4688 0.875 +0.4688 0.4688 0.9062 +0.4688 0.4688 0.9375 +0.4688 0.4688 0.9688 +0.4688 0.4688 1 +0.4688 0.5 0 +0.4688 0.5 0.03125 +0.4688 0.5 0.0625 +0.4688 0.5 0.09375 +0.4688 0.5 0.125 +0.4688 0.5 0.1562 +0.4688 0.5 0.1875 +0.4688 0.5 0.2188 +0.4688 0.5 0.25 +0.4688 0.5 0.2812 +0.4688 0.5 0.3125 +0.4688 0.5 0.3438 +0.4688 0.5 0.375 +0.4688 0.5 0.4062 +0.4688 0.5 0.4375 +0.4688 0.5 0.4688 +0.4688 0.5 0.5 +0.4688 0.5 0.5312 +0.4688 0.5 0.5625 +0.4688 0.5 0.5938 +0.4688 0.5 0.625 +0.4688 0.5 0.6562 +0.4688 0.5 0.6875 +0.4688 0.5 0.7188 +0.4688 0.5 0.75 +0.4688 0.5 0.7812 +0.4688 0.5 0.8125 +0.4688 0.5 0.8438 +0.4688 0.5 0.875 +0.4688 0.5 0.9062 +0.4688 0.5 0.9375 +0.4688 0.5 0.9688 +0.4688 0.5 1 +0.4688 0.5312 0 +0.4688 0.5312 0.03125 +0.4688 0.5312 0.0625 +0.4688 0.5312 0.09375 +0.4688 0.5312 0.125 +0.4688 0.5312 0.1562 +0.4688 0.5312 0.1875 +0.4688 0.5312 0.2188 +0.4688 0.5312 0.25 +0.4688 0.5312 0.2812 +0.4688 0.5312 0.3125 +0.4688 0.5312 0.3438 +0.4688 0.5312 0.375 +0.4688 0.5312 0.4062 +0.4688 0.5312 0.4375 +0.4688 0.5312 0.4688 +0.4688 0.5312 0.5 +0.4688 0.5312 0.5312 +0.4688 0.5312 0.5625 +0.4688 0.5312 0.5938 +0.4688 0.5312 0.625 +0.4688 0.5312 0.6562 +0.4688 0.5312 0.6875 +0.4688 0.5312 0.7188 +0.4688 0.5312 0.75 +0.4688 0.5312 0.7812 +0.4688 0.5312 0.8125 +0.4688 0.5312 0.8438 +0.4688 0.5312 0.875 +0.4688 0.5312 0.9062 +0.4688 0.5312 0.9375 +0.4688 0.5312 0.9688 +0.4688 0.5312 1 +0.4688 0.5625 0 +0.4688 0.5625 0.03125 +0.4688 0.5625 0.0625 +0.4688 0.5625 0.09375 +0.4688 0.5625 0.125 +0.4688 0.5625 0.1562 +0.4688 0.5625 0.1875 +0.4688 0.5625 0.2188 +0.4688 0.5625 0.25 +0.4688 0.5625 0.2812 +0.4688 0.5625 0.3125 +0.4688 0.5625 0.3438 +0.4688 0.5625 0.375 +0.4688 0.5625 0.4062 +0.4688 0.5625 0.4375 +0.4688 0.5625 0.4688 +0.4688 0.5625 0.5 +0.4688 0.5625 0.5312 +0.4688 0.5625 0.5625 +0.4688 0.5625 0.5938 +0.4688 0.5625 0.625 +0.4688 0.5625 0.6562 +0.4688 0.5625 0.6875 +0.4688 0.5625 0.7188 +0.4688 0.5625 0.75 +0.4688 0.5625 0.7812 +0.4688 0.5625 0.8125 +0.4688 0.5625 0.8438 +0.4688 0.5625 0.875 +0.4688 0.5625 0.9062 +0.4688 0.5625 0.9375 +0.4688 0.5625 0.9688 +0.4688 0.5625 1 +0.4688 0.5938 0 +0.4688 0.5938 0.03125 +0.4688 0.5938 0.0625 +0.4688 0.5938 0.09375 +0.4688 0.5938 0.125 +0.4688 0.5938 0.1562 +0.4688 0.5938 0.1875 +0.4688 0.5938 0.2188 +0.4688 0.5938 0.25 +0.4688 0.5938 0.2812 +0.4688 0.5938 0.3125 +0.4688 0.5938 0.3438 +0.4688 0.5938 0.375 +0.4688 0.5938 0.4062 +0.4688 0.5938 0.4375 +0.4688 0.5938 0.4688 +0.4688 0.5938 0.5 +0.4688 0.5938 0.5312 +0.4688 0.5938 0.5625 +0.4688 0.5938 0.5938 +0.4688 0.5938 0.625 +0.4688 0.5938 0.6562 +0.4688 0.5938 0.6875 +0.4688 0.5938 0.7188 +0.4688 0.5938 0.75 +0.4688 0.5938 0.7812 +0.4688 0.5938 0.8125 +0.4688 0.5938 0.8438 +0.4688 0.5938 0.875 +0.4688 0.5938 0.9062 +0.4688 0.5938 0.9375 +0.4688 0.5938 0.9688 +0.4688 0.5938 1 +0.4688 0.625 0 +0.4688 0.625 0.03125 +0.4688 0.625 0.0625 +0.4688 0.625 0.09375 +0.4688 0.625 0.125 +0.4688 0.625 0.1562 +0.4688 0.625 0.1875 +0.4688 0.625 0.2188 +0.4688 0.625 0.25 +0.4688 0.625 0.2812 +0.4688 0.625 0.3125 +0.4688 0.625 0.3438 +0.4688 0.625 0.375 +0.4688 0.625 0.4062 +0.4688 0.625 0.4375 +0.4688 0.625 0.4688 +0.4688 0.625 0.5 +0.4688 0.625 0.5312 +0.4688 0.625 0.5625 +0.4688 0.625 0.5938 +0.4688 0.625 0.625 +0.4688 0.625 0.6562 +0.4688 0.625 0.6875 +0.4688 0.625 0.7188 +0.4688 0.625 0.75 +0.4688 0.625 0.7812 +0.4688 0.625 0.8125 +0.4688 0.625 0.8438 +0.4688 0.625 0.875 +0.4688 0.625 0.9062 +0.4688 0.625 0.9375 +0.4688 0.625 0.9688 +0.4688 0.625 1 +0.4688 0.6562 0 +0.4688 0.6562 0.03125 +0.4688 0.6562 0.0625 +0.4688 0.6562 0.09375 +0.4688 0.6562 0.125 +0.4688 0.6562 0.1562 +0.4688 0.6562 0.1875 +0.4688 0.6562 0.2188 +0.4688 0.6562 0.25 +0.4688 0.6562 0.2812 +0.4688 0.6562 0.3125 +0.4688 0.6562 0.3438 +0.4688 0.6562 0.375 +0.4688 0.6562 0.4062 +0.4688 0.6562 0.4375 +0.4688 0.6562 0.4688 +0.4688 0.6562 0.5 +0.4688 0.6562 0.5312 +0.4688 0.6562 0.5625 +0.4688 0.6562 0.5938 +0.4688 0.6562 0.625 +0.4688 0.6562 0.6562 +0.4688 0.6562 0.6875 +0.4688 0.6562 0.7188 +0.4688 0.6562 0.75 +0.4688 0.6562 0.7812 +0.4688 0.6562 0.8125 +0.4688 0.6562 0.8438 +0.4688 0.6562 0.875 +0.4688 0.6562 0.9062 +0.4688 0.6562 0.9375 +0.4688 0.6562 0.9688 +0.4688 0.6562 1 +0.4688 0.6875 0 +0.4688 0.6875 0.03125 +0.4688 0.6875 0.0625 +0.4688 0.6875 0.09375 +0.4688 0.6875 0.125 +0.4688 0.6875 0.1562 +0.4688 0.6875 0.1875 +0.4688 0.6875 0.2188 +0.4688 0.6875 0.25 +0.4688 0.6875 0.2812 +0.4688 0.6875 0.3125 +0.4688 0.6875 0.3438 +0.4688 0.6875 0.375 +0.4688 0.6875 0.4062 +0.4688 0.6875 0.4375 +0.4688 0.6875 0.4688 +0.4688 0.6875 0.5 +0.4688 0.6875 0.5312 +0.4688 0.6875 0.5625 +0.4688 0.6875 0.5938 +0.4688 0.6875 0.625 +0.4688 0.6875 0.6562 +0.4688 0.6875 0.6875 +0.4688 0.6875 0.7188 +0.4688 0.6875 0.75 +0.4688 0.6875 0.7812 +0.4688 0.6875 0.8125 +0.4688 0.6875 0.8438 +0.4688 0.6875 0.875 +0.4688 0.6875 0.9062 +0.4688 0.6875 0.9375 +0.4688 0.6875 0.9688 +0.4688 0.6875 1 +0.4688 0.7188 0 +0.4688 0.7188 0.03125 +0.4688 0.7188 0.0625 +0.4688 0.7188 0.09375 +0.4688 0.7188 0.125 +0.4688 0.7188 0.1562 +0.4688 0.7188 0.1875 +0.4688 0.7188 0.2188 +0.4688 0.7188 0.25 +0.4688 0.7188 0.2812 +0.4688 0.7188 0.3125 +0.4688 0.7188 0.3438 +0.4688 0.7188 0.375 +0.4688 0.7188 0.4062 +0.4688 0.7188 0.4375 +0.4688 0.7188 0.4688 +0.4688 0.7188 0.5 +0.4688 0.7188 0.5312 +0.4688 0.7188 0.5625 +0.4688 0.7188 0.5938 +0.4688 0.7188 0.625 +0.4688 0.7188 0.6562 +0.4688 0.7188 0.6875 +0.4688 0.7188 0.7188 +0.4688 0.7188 0.75 +0.4688 0.7188 0.7812 +0.4688 0.7188 0.8125 +0.4688 0.7188 0.8438 +0.4688 0.7188 0.875 +0.4688 0.7188 0.9062 +0.4688 0.7188 0.9375 +0.4688 0.7188 0.9688 +0.4688 0.7188 1 +0.4688 0.75 0 +0.4688 0.75 0.03125 +0.4688 0.75 0.0625 +0.4688 0.75 0.09375 +0.4688 0.75 0.125 +0.4688 0.75 0.1562 +0.4688 0.75 0.1875 +0.4688 0.75 0.2188 +0.4688 0.75 0.25 +0.4688 0.75 0.2812 +0.4688 0.75 0.3125 +0.4688 0.75 0.3438 +0.4688 0.75 0.375 +0.4688 0.75 0.4062 +0.4688 0.75 0.4375 +0.4688 0.75 0.4688 +0.4688 0.75 0.5 +0.4688 0.75 0.5312 +0.4688 0.75 0.5625 +0.4688 0.75 0.5938 +0.4688 0.75 0.625 +0.4688 0.75 0.6562 +0.4688 0.75 0.6875 +0.4688 0.75 0.7188 +0.4688 0.75 0.75 +0.4688 0.75 0.7812 +0.4688 0.75 0.8125 +0.4688 0.75 0.8438 +0.4688 0.75 0.875 +0.4688 0.75 0.9062 +0.4688 0.75 0.9375 +0.4688 0.75 0.9688 +0.4688 0.75 1 +0.4688 0.7812 0 +0.4688 0.7812 0.03125 +0.4688 0.7812 0.0625 +0.4688 0.7812 0.09375 +0.4688 0.7812 0.125 +0.4688 0.7812 0.1562 +0.4688 0.7812 0.1875 +0.4688 0.7812 0.2188 +0.4688 0.7812 0.25 +0.4688 0.7812 0.2812 +0.4688 0.7812 0.3125 +0.4688 0.7812 0.3438 +0.4688 0.7812 0.375 +0.4688 0.7812 0.4062 +0.4688 0.7812 0.4375 +0.4688 0.7812 0.4688 +0.4688 0.7812 0.5 +0.4688 0.7812 0.5312 +0.4688 0.7812 0.5625 +0.4688 0.7812 0.5938 +0.4688 0.7812 0.625 +0.4688 0.7812 0.6562 +0.4688 0.7812 0.6875 +0.4688 0.7812 0.7188 +0.4688 0.7812 0.75 +0.4688 0.7812 0.7812 +0.4688 0.7812 0.8125 +0.4688 0.7812 0.8438 +0.4688 0.7812 0.875 +0.4688 0.7812 0.9062 +0.4688 0.7812 0.9375 +0.4688 0.7812 0.9688 +0.4688 0.7812 1 +0.4688 0.8125 0 +0.4688 0.8125 0.03125 +0.4688 0.8125 0.0625 +0.4688 0.8125 0.09375 +0.4688 0.8125 0.125 +0.4688 0.8125 0.1562 +0.4688 0.8125 0.1875 +0.4688 0.8125 0.2188 +0.4688 0.8125 0.25 +0.4688 0.8125 0.2812 +0.4688 0.8125 0.3125 +0.4688 0.8125 0.3438 +0.4688 0.8125 0.375 +0.4688 0.8125 0.4062 +0.4688 0.8125 0.4375 +0.4688 0.8125 0.4688 +0.4688 0.8125 0.5 +0.4688 0.8125 0.5312 +0.4688 0.8125 0.5625 +0.4688 0.8125 0.5938 +0.4688 0.8125 0.625 +0.4688 0.8125 0.6562 +0.4688 0.8125 0.6875 +0.4688 0.8125 0.7188 +0.4688 0.8125 0.75 +0.4688 0.8125 0.7812 +0.4688 0.8125 0.8125 +0.4688 0.8125 0.8438 +0.4688 0.8125 0.875 +0.4688 0.8125 0.9062 +0.4688 0.8125 0.9375 +0.4688 0.8125 0.9688 +0.4688 0.8125 1 +0.4688 0.8438 0 +0.4688 0.8438 0.03125 +0.4688 0.8438 0.0625 +0.4688 0.8438 0.09375 +0.4688 0.8438 0.125 +0.4688 0.8438 0.1562 +0.4688 0.8438 0.1875 +0.4688 0.8438 0.2188 +0.4688 0.8438 0.25 +0.4688 0.8438 0.2812 +0.4688 0.8438 0.3125 +0.4688 0.8438 0.3438 +0.4688 0.8438 0.375 +0.4688 0.8438 0.4062 +0.4688 0.8438 0.4375 +0.4688 0.8438 0.4688 +0.4688 0.8438 0.5 +0.4688 0.8438 0.5312 +0.4688 0.8438 0.5625 +0.4688 0.8438 0.5938 +0.4688 0.8438 0.625 +0.4688 0.8438 0.6562 +0.4688 0.8438 0.6875 +0.4688 0.8438 0.7188 +0.4688 0.8438 0.75 +0.4688 0.8438 0.7812 +0.4688 0.8438 0.8125 +0.4688 0.8438 0.8438 +0.4688 0.8438 0.875 +0.4688 0.8438 0.9062 +0.4688 0.8438 0.9375 +0.4688 0.8438 0.9688 +0.4688 0.8438 1 +0.4688 0.875 0 +0.4688 0.875 0.03125 +0.4688 0.875 0.0625 +0.4688 0.875 0.09375 +0.4688 0.875 0.125 +0.4688 0.875 0.1562 +0.4688 0.875 0.1875 +0.4688 0.875 0.2188 +0.4688 0.875 0.25 +0.4688 0.875 0.2812 +0.4688 0.875 0.3125 +0.4688 0.875 0.3438 +0.4688 0.875 0.375 +0.4688 0.875 0.4062 +0.4688 0.875 0.4375 +0.4688 0.875 0.4688 +0.4688 0.875 0.5 +0.4688 0.875 0.5312 +0.4688 0.875 0.5625 +0.4688 0.875 0.5938 +0.4688 0.875 0.625 +0.4688 0.875 0.6562 +0.4688 0.875 0.6875 +0.4688 0.875 0.7188 +0.4688 0.875 0.75 +0.4688 0.875 0.7812 +0.4688 0.875 0.8125 +0.4688 0.875 0.8438 +0.4688 0.875 0.875 +0.4688 0.875 0.9062 +0.4688 0.875 0.9375 +0.4688 0.875 0.9688 +0.4688 0.875 1 +0.4688 0.9062 0 +0.4688 0.9062 0.03125 +0.4688 0.9062 0.0625 +0.4688 0.9062 0.09375 +0.4688 0.9062 0.125 +0.4688 0.9062 0.1562 +0.4688 0.9062 0.1875 +0.4688 0.9062 0.2188 +0.4688 0.9062 0.25 +0.4688 0.9062 0.2812 +0.4688 0.9062 0.3125 +0.4688 0.9062 0.3438 +0.4688 0.9062 0.375 +0.4688 0.9062 0.4062 +0.4688 0.9062 0.4375 +0.4688 0.9062 0.4688 +0.4688 0.9062 0.5 +0.4688 0.9062 0.5312 +0.4688 0.9062 0.5625 +0.4688 0.9062 0.5938 +0.4688 0.9062 0.625 +0.4688 0.9062 0.6562 +0.4688 0.9062 0.6875 +0.4688 0.9062 0.7188 +0.4688 0.9062 0.75 +0.4688 0.9062 0.7812 +0.4688 0.9062 0.8125 +0.4688 0.9062 0.8438 +0.4688 0.9062 0.875 +0.4688 0.9062 0.9062 +0.4688 0.9062 0.9375 +0.4688 0.9062 0.9688 +0.4688 0.9062 1 +0.4688 0.9375 0 +0.4688 0.9375 0.03125 +0.4688 0.9375 0.0625 +0.4688 0.9375 0.09375 +0.4688 0.9375 0.125 +0.4688 0.9375 0.1562 +0.4688 0.9375 0.1875 +0.4688 0.9375 0.2188 +0.4688 0.9375 0.25 +0.4688 0.9375 0.2812 +0.4688 0.9375 0.3125 +0.4688 0.9375 0.3438 +0.4688 0.9375 0.375 +0.4688 0.9375 0.4062 +0.4688 0.9375 0.4375 +0.4688 0.9375 0.4688 +0.4688 0.9375 0.5 +0.4688 0.9375 0.5312 +0.4688 0.9375 0.5625 +0.4688 0.9375 0.5938 +0.4688 0.9375 0.625 +0.4688 0.9375 0.6562 +0.4688 0.9375 0.6875 +0.4688 0.9375 0.7188 +0.4688 0.9375 0.75 +0.4688 0.9375 0.7812 +0.4688 0.9375 0.8125 +0.4688 0.9375 0.8438 +0.4688 0.9375 0.875 +0.4688 0.9375 0.9062 +0.4688 0.9375 0.9375 +0.4688 0.9375 0.9688 +0.4688 0.9375 1 +0.4688 0.9688 0 +0.4688 0.9688 0.03125 +0.4688 0.9688 0.0625 +0.4688 0.9688 0.09375 +0.4688 0.9688 0.125 +0.4688 0.9688 0.1562 +0.4688 0.9688 0.1875 +0.4688 0.9688 0.2188 +0.4688 0.9688 0.25 +0.4688 0.9688 0.2812 +0.4688 0.9688 0.3125 +0.4688 0.9688 0.3438 +0.4688 0.9688 0.375 +0.4688 0.9688 0.4062 +0.4688 0.9688 0.4375 +0.4688 0.9688 0.4688 +0.4688 0.9688 0.5 +0.4688 0.9688 0.5312 +0.4688 0.9688 0.5625 +0.4688 0.9688 0.5938 +0.4688 0.9688 0.625 +0.4688 0.9688 0.6562 +0.4688 0.9688 0.6875 +0.4688 0.9688 0.7188 +0.4688 0.9688 0.75 +0.4688 0.9688 0.7812 +0.4688 0.9688 0.8125 +0.4688 0.9688 0.8438 +0.4688 0.9688 0.875 +0.4688 0.9688 0.9062 +0.4688 0.9688 0.9375 +0.4688 0.9688 0.9688 +0.4688 0.9688 1 +0.4688 1 0 +0.4688 1 0.03125 +0.4688 1 0.0625 +0.4688 1 0.09375 +0.4688 1 0.125 +0.4688 1 0.1562 +0.4688 1 0.1875 +0.4688 1 0.2188 +0.4688 1 0.25 +0.4688 1 0.2812 +0.4688 1 0.3125 +0.4688 1 0.3438 +0.4688 1 0.375 +0.4688 1 0.4062 +0.4688 1 0.4375 +0.4688 1 0.4688 +0.4688 1 0.5 +0.4688 1 0.5312 +0.4688 1 0.5625 +0.4688 1 0.5938 +0.4688 1 0.625 +0.4688 1 0.6562 +0.4688 1 0.6875 +0.4688 1 0.7188 +0.4688 1 0.75 +0.4688 1 0.7812 +0.4688 1 0.8125 +0.4688 1 0.8438 +0.4688 1 0.875 +0.4688 1 0.9062 +0.4688 1 0.9375 +0.4688 1 0.9688 +0.4688 1 1 +0.5 0 0 +0.5 0 0.03125 +0.5 0 0.0625 +0.5 0 0.09375 +0.5 0 0.125 +0.5 0 0.1562 +0.5 0 0.1875 +0.5 0 0.2188 +0.5 0 0.25 +0.5 0 0.2812 +0.5 0 0.3125 +0.5 0 0.3438 +0.5 0 0.375 +0.5 0 0.4062 +0.5 0 0.4375 +0.5 0 0.4688 +0.5 0 0.5 +0.5 0 0.5312 +0.5 0 0.5625 +0.5 0 0.5938 +0.5 0 0.625 +0.5 0 0.6562 +0.5 0 0.6875 +0.5 0 0.7188 +0.5 0 0.75 +0.5 0 0.7812 +0.5 0 0.8125 +0.5 0 0.8438 +0.5 0 0.875 +0.5 0 0.9062 +0.5 0 0.9375 +0.5 0 0.9688 +0.5 0 1 +0.5 0.03125 0 +0.5 0.03125 0.03125 +0.5 0.03125 0.0625 +0.5 0.03125 0.09375 +0.5 0.03125 0.125 +0.5 0.03125 0.1562 +0.5 0.03125 0.1875 +0.5 0.03125 0.2188 +0.5 0.03125 0.25 +0.5 0.03125 0.2812 +0.5 0.03125 0.3125 +0.5 0.03125 0.3438 +0.5 0.03125 0.375 +0.5 0.03125 0.4062 +0.5 0.03125 0.4375 +0.5 0.03125 0.4688 +0.5 0.03125 0.5 +0.5 0.03125 0.5312 +0.5 0.03125 0.5625 +0.5 0.03125 0.5938 +0.5 0.03125 0.625 +0.5 0.03125 0.6562 +0.5 0.03125 0.6875 +0.5 0.03125 0.7188 +0.5 0.03125 0.75 +0.5 0.03125 0.7812 +0.5 0.03125 0.8125 +0.5 0.03125 0.8438 +0.5 0.03125 0.875 +0.5 0.03125 0.9062 +0.5 0.03125 0.9375 +0.5 0.03125 0.9688 +0.5 0.03125 1 +0.5 0.0625 0 +0.5 0.0625 0.03125 +0.5 0.0625 0.0625 +0.5 0.0625 0.09375 +0.5 0.0625 0.125 +0.5 0.0625 0.1562 +0.5 0.0625 0.1875 +0.5 0.0625 0.2188 +0.5 0.0625 0.25 +0.5 0.0625 0.2812 +0.5 0.0625 0.3125 +0.5 0.0625 0.3438 +0.5 0.0625 0.375 +0.5 0.0625 0.4062 +0.5 0.0625 0.4375 +0.5 0.0625 0.4688 +0.5 0.0625 0.5 +0.5 0.0625 0.5312 +0.5 0.0625 0.5625 +0.5 0.0625 0.5938 +0.5 0.0625 0.625 +0.5 0.0625 0.6562 +0.5 0.0625 0.6875 +0.5 0.0625 0.7188 +0.5 0.0625 0.75 +0.5 0.0625 0.7812 +0.5 0.0625 0.8125 +0.5 0.0625 0.8438 +0.5 0.0625 0.875 +0.5 0.0625 0.9062 +0.5 0.0625 0.9375 +0.5 0.0625 0.9688 +0.5 0.0625 1 +0.5 0.09375 0 +0.5 0.09375 0.03125 +0.5 0.09375 0.0625 +0.5 0.09375 0.09375 +0.5 0.09375 0.125 +0.5 0.09375 0.1562 +0.5 0.09375 0.1875 +0.5 0.09375 0.2188 +0.5 0.09375 0.25 +0.5 0.09375 0.2812 +0.5 0.09375 0.3125 +0.5 0.09375 0.3438 +0.5 0.09375 0.375 +0.5 0.09375 0.4062 +0.5 0.09375 0.4375 +0.5 0.09375 0.4688 +0.5 0.09375 0.5 +0.5 0.09375 0.5312 +0.5 0.09375 0.5625 +0.5 0.09375 0.5938 +0.5 0.09375 0.625 +0.5 0.09375 0.6562 +0.5 0.09375 0.6875 +0.5 0.09375 0.7188 +0.5 0.09375 0.75 +0.5 0.09375 0.7812 +0.5 0.09375 0.8125 +0.5 0.09375 0.8438 +0.5 0.09375 0.875 +0.5 0.09375 0.9062 +0.5 0.09375 0.9375 +0.5 0.09375 0.9688 +0.5 0.09375 1 +0.5 0.125 0 +0.5 0.125 0.03125 +0.5 0.125 0.0625 +0.5 0.125 0.09375 +0.5 0.125 0.125 +0.5 0.125 0.1562 +0.5 0.125 0.1875 +0.5 0.125 0.2188 +0.5 0.125 0.25 +0.5 0.125 0.2812 +0.5 0.125 0.3125 +0.5 0.125 0.3438 +0.5 0.125 0.375 +0.5 0.125 0.4062 +0.5 0.125 0.4375 +0.5 0.125 0.4688 +0.5 0.125 0.5 +0.5 0.125 0.5312 +0.5 0.125 0.5625 +0.5 0.125 0.5938 +0.5 0.125 0.625 +0.5 0.125 0.6562 +0.5 0.125 0.6875 +0.5 0.125 0.7188 +0.5 0.125 0.75 +0.5 0.125 0.7812 +0.5 0.125 0.8125 +0.5 0.125 0.8438 +0.5 0.125 0.875 +0.5 0.125 0.9062 +0.5 0.125 0.9375 +0.5 0.125 0.9688 +0.5 0.125 1 +0.5 0.1562 0 +0.5 0.1562 0.03125 +0.5 0.1562 0.0625 +0.5 0.1562 0.09375 +0.5 0.1562 0.125 +0.5 0.1562 0.1562 +0.5 0.1562 0.1875 +0.5 0.1562 0.2188 +0.5 0.1562 0.25 +0.5 0.1562 0.2812 +0.5 0.1562 0.3125 +0.5 0.1562 0.3438 +0.5 0.1562 0.375 +0.5 0.1562 0.4062 +0.5 0.1562 0.4375 +0.5 0.1562 0.4688 +0.5 0.1562 0.5 +0.5 0.1562 0.5312 +0.5 0.1562 0.5625 +0.5 0.1562 0.5938 +0.5 0.1562 0.625 +0.5 0.1562 0.6562 +0.5 0.1562 0.6875 +0.5 0.1562 0.7188 +0.5 0.1562 0.75 +0.5 0.1562 0.7812 +0.5 0.1562 0.8125 +0.5 0.1562 0.8438 +0.5 0.1562 0.875 +0.5 0.1562 0.9062 +0.5 0.1562 0.9375 +0.5 0.1562 0.9688 +0.5 0.1562 1 +0.5 0.1875 0 +0.5 0.1875 0.03125 +0.5 0.1875 0.0625 +0.5 0.1875 0.09375 +0.5 0.1875 0.125 +0.5 0.1875 0.1562 +0.5 0.1875 0.1875 +0.5 0.1875 0.2188 +0.5 0.1875 0.25 +0.5 0.1875 0.2812 +0.5 0.1875 0.3125 +0.5 0.1875 0.3438 +0.5 0.1875 0.375 +0.5 0.1875 0.4062 +0.5 0.1875 0.4375 +0.5 0.1875 0.4688 +0.5 0.1875 0.5 +0.5 0.1875 0.5312 +0.5 0.1875 0.5625 +0.5 0.1875 0.5938 +0.5 0.1875 0.625 +0.5 0.1875 0.6562 +0.5 0.1875 0.6875 +0.5 0.1875 0.7188 +0.5 0.1875 0.75 +0.5 0.1875 0.7812 +0.5 0.1875 0.8125 +0.5 0.1875 0.8438 +0.5 0.1875 0.875 +0.5 0.1875 0.9062 +0.5 0.1875 0.9375 +0.5 0.1875 0.9688 +0.5 0.1875 1 +0.5 0.2188 0 +0.5 0.2188 0.03125 +0.5 0.2188 0.0625 +0.5 0.2188 0.09375 +0.5 0.2188 0.125 +0.5 0.2188 0.1562 +0.5 0.2188 0.1875 +0.5 0.2188 0.2188 +0.5 0.2188 0.25 +0.5 0.2188 0.2812 +0.5 0.2188 0.3125 +0.5 0.2188 0.3438 +0.5 0.2188 0.375 +0.5 0.2188 0.4062 +0.5 0.2188 0.4375 +0.5 0.2188 0.4688 +0.5 0.2188 0.5 +0.5 0.2188 0.5312 +0.5 0.2188 0.5625 +0.5 0.2188 0.5938 +0.5 0.2188 0.625 +0.5 0.2188 0.6562 +0.5 0.2188 0.6875 +0.5 0.2188 0.7188 +0.5 0.2188 0.75 +0.5 0.2188 0.7812 +0.5 0.2188 0.8125 +0.5 0.2188 0.8438 +0.5 0.2188 0.875 +0.5 0.2188 0.9062 +0.5 0.2188 0.9375 +0.5 0.2188 0.9688 +0.5 0.2188 1 +0.5 0.25 0 +0.5 0.25 0.03125 +0.5 0.25 0.0625 +0.5 0.25 0.09375 +0.5 0.25 0.125 +0.5 0.25 0.1562 +0.5 0.25 0.1875 +0.5 0.25 0.2188 +0.5 0.25 0.25 +0.5 0.25 0.2812 +0.5 0.25 0.3125 +0.5 0.25 0.3438 +0.5 0.25 0.375 +0.5 0.25 0.4062 +0.5 0.25 0.4375 +0.5 0.25 0.4688 +0.5 0.25 0.5 +0.5 0.25 0.5312 +0.5 0.25 0.5625 +0.5 0.25 0.5938 +0.5 0.25 0.625 +0.5 0.25 0.6562 +0.5 0.25 0.6875 +0.5 0.25 0.7188 +0.5 0.25 0.75 +0.5 0.25 0.7812 +0.5 0.25 0.8125 +0.5 0.25 0.8438 +0.5 0.25 0.875 +0.5 0.25 0.9062 +0.5 0.25 0.9375 +0.5 0.25 0.9688 +0.5 0.25 1 +0.5 0.2812 0 +0.5 0.2812 0.03125 +0.5 0.2812 0.0625 +0.5 0.2812 0.09375 +0.5 0.2812 0.125 +0.5 0.2812 0.1562 +0.5 0.2812 0.1875 +0.5 0.2812 0.2188 +0.5 0.2812 0.25 +0.5 0.2812 0.2812 +0.5 0.2812 0.3125 +0.5 0.2812 0.3438 +0.5 0.2812 0.375 +0.5 0.2812 0.4062 +0.5 0.2812 0.4375 +0.5 0.2812 0.4688 +0.5 0.2812 0.5 +0.5 0.2812 0.5312 +0.5 0.2812 0.5625 +0.5 0.2812 0.5938 +0.5 0.2812 0.625 +0.5 0.2812 0.6562 +0.5 0.2812 0.6875 +0.5 0.2812 0.7188 +0.5 0.2812 0.75 +0.5 0.2812 0.7812 +0.5 0.2812 0.8125 +0.5 0.2812 0.8438 +0.5 0.2812 0.875 +0.5 0.2812 0.9062 +0.5 0.2812 0.9375 +0.5 0.2812 0.9688 +0.5 0.2812 1 +0.5 0.3125 0 +0.5 0.3125 0.03125 +0.5 0.3125 0.0625 +0.5 0.3125 0.09375 +0.5 0.3125 0.125 +0.5 0.3125 0.1562 +0.5 0.3125 0.1875 +0.5 0.3125 0.2188 +0.5 0.3125 0.25 +0.5 0.3125 0.2812 +0.5 0.3125 0.3125 +0.5 0.3125 0.3438 +0.5 0.3125 0.375 +0.5 0.3125 0.4062 +0.5 0.3125 0.4375 +0.5 0.3125 0.4688 +0.5 0.3125 0.5 +0.5 0.3125 0.5312 +0.5 0.3125 0.5625 +0.5 0.3125 0.5938 +0.5 0.3125 0.625 +0.5 0.3125 0.6562 +0.5 0.3125 0.6875 +0.5 0.3125 0.7188 +0.5 0.3125 0.75 +0.5 0.3125 0.7812 +0.5 0.3125 0.8125 +0.5 0.3125 0.8438 +0.5 0.3125 0.875 +0.5 0.3125 0.9062 +0.5 0.3125 0.9375 +0.5 0.3125 0.9688 +0.5 0.3125 1 +0.5 0.3438 0 +0.5 0.3438 0.03125 +0.5 0.3438 0.0625 +0.5 0.3438 0.09375 +0.5 0.3438 0.125 +0.5 0.3438 0.1562 +0.5 0.3438 0.1875 +0.5 0.3438 0.2188 +0.5 0.3438 0.25 +0.5 0.3438 0.2812 +0.5 0.3438 0.3125 +0.5 0.3438 0.3438 +0.5 0.3438 0.375 +0.5 0.3438 0.4062 +0.5 0.3438 0.4375 +0.5 0.3438 0.4688 +0.5 0.3438 0.5 +0.5 0.3438 0.5312 +0.5 0.3438 0.5625 +0.5 0.3438 0.5938 +0.5 0.3438 0.625 +0.5 0.3438 0.6562 +0.5 0.3438 0.6875 +0.5 0.3438 0.7188 +0.5 0.3438 0.75 +0.5 0.3438 0.7812 +0.5 0.3438 0.8125 +0.5 0.3438 0.8438 +0.5 0.3438 0.875 +0.5 0.3438 0.9062 +0.5 0.3438 0.9375 +0.5 0.3438 0.9688 +0.5 0.3438 1 +0.5 0.375 0 +0.5 0.375 0.03125 +0.5 0.375 0.0625 +0.5 0.375 0.09375 +0.5 0.375 0.125 +0.5 0.375 0.1562 +0.5 0.375 0.1875 +0.5 0.375 0.2188 +0.5 0.375 0.25 +0.5 0.375 0.2812 +0.5 0.375 0.3125 +0.5 0.375 0.3438 +0.5 0.375 0.375 +0.5 0.375 0.4062 +0.5 0.375 0.4375 +0.5 0.375 0.4688 +0.5 0.375 0.5 +0.5 0.375 0.5312 +0.5 0.375 0.5625 +0.5 0.375 0.5938 +0.5 0.375 0.625 +0.5 0.375 0.6562 +0.5 0.375 0.6875 +0.5 0.375 0.7188 +0.5 0.375 0.75 +0.5 0.375 0.7812 +0.5 0.375 0.8125 +0.5 0.375 0.8438 +0.5 0.375 0.875 +0.5 0.375 0.9062 +0.5 0.375 0.9375 +0.5 0.375 0.9688 +0.5 0.375 1 +0.5 0.4062 0 +0.5 0.4062 0.03125 +0.5 0.4062 0.0625 +0.5 0.4062 0.09375 +0.5 0.4062 0.125 +0.5 0.4062 0.1562 +0.5 0.4062 0.1875 +0.5 0.4062 0.2188 +0.5 0.4062 0.25 +0.5 0.4062 0.2812 +0.5 0.4062 0.3125 +0.5 0.4062 0.3438 +0.5 0.4062 0.375 +0.5 0.4062 0.4062 +0.5 0.4062 0.4375 +0.5 0.4062 0.4688 +0.5 0.4062 0.5 +0.5 0.4062 0.5312 +0.5 0.4062 0.5625 +0.5 0.4062 0.5938 +0.5 0.4062 0.625 +0.5 0.4062 0.6562 +0.5 0.4062 0.6875 +0.5 0.4062 0.7188 +0.5 0.4062 0.75 +0.5 0.4062 0.7812 +0.5 0.4062 0.8125 +0.5 0.4062 0.8438 +0.5 0.4062 0.875 +0.5 0.4062 0.9062 +0.5 0.4062 0.9375 +0.5 0.4062 0.9688 +0.5 0.4062 1 +0.5 0.4375 0 +0.5 0.4375 0.03125 +0.5 0.4375 0.0625 +0.5 0.4375 0.09375 +0.5 0.4375 0.125 +0.5 0.4375 0.1562 +0.5 0.4375 0.1875 +0.5 0.4375 0.2188 +0.5 0.4375 0.25 +0.5 0.4375 0.2812 +0.5 0.4375 0.3125 +0.5 0.4375 0.3438 +0.5 0.4375 0.375 +0.5 0.4375 0.4062 +0.5 0.4375 0.4375 +0.5 0.4375 0.4688 +0.5 0.4375 0.5 +0.5 0.4375 0.5312 +0.5 0.4375 0.5625 +0.5 0.4375 0.5938 +0.5 0.4375 0.625 +0.5 0.4375 0.6562 +0.5 0.4375 0.6875 +0.5 0.4375 0.7188 +0.5 0.4375 0.75 +0.5 0.4375 0.7812 +0.5 0.4375 0.8125 +0.5 0.4375 0.8438 +0.5 0.4375 0.875 +0.5 0.4375 0.9062 +0.5 0.4375 0.9375 +0.5 0.4375 0.9688 +0.5 0.4375 1 +0.5 0.4688 0 +0.5 0.4688 0.03125 +0.5 0.4688 0.0625 +0.5 0.4688 0.09375 +0.5 0.4688 0.125 +0.5 0.4688 0.1562 +0.5 0.4688 0.1875 +0.5 0.4688 0.2188 +0.5 0.4688 0.25 +0.5 0.4688 0.2812 +0.5 0.4688 0.3125 +0.5 0.4688 0.3438 +0.5 0.4688 0.375 +0.5 0.4688 0.4062 +0.5 0.4688 0.4375 +0.5 0.4688 0.4688 +0.5 0.4688 0.5 +0.5 0.4688 0.5312 +0.5 0.4688 0.5625 +0.5 0.4688 0.5938 +0.5 0.4688 0.625 +0.5 0.4688 0.6562 +0.5 0.4688 0.6875 +0.5 0.4688 0.7188 +0.5 0.4688 0.75 +0.5 0.4688 0.7812 +0.5 0.4688 0.8125 +0.5 0.4688 0.8438 +0.5 0.4688 0.875 +0.5 0.4688 0.9062 +0.5 0.4688 0.9375 +0.5 0.4688 0.9688 +0.5 0.4688 1 +0.5 0.5 0 +0.5 0.5 0.03125 +0.5 0.5 0.0625 +0.5 0.5 0.09375 +0.5 0.5 0.125 +0.5 0.5 0.1562 +0.5 0.5 0.1875 +0.5 0.5 0.2188 +0.5 0.5 0.25 +0.5 0.5 0.2812 +0.5 0.5 0.3125 +0.5 0.5 0.3438 +0.5 0.5 0.375 +0.5 0.5 0.4062 +0.5 0.5 0.4375 +0.5 0.5 0.4688 +0.5 0.5 0.5 +0.5 0.5 0.5312 +0.5 0.5 0.5625 +0.5 0.5 0.5938 +0.5 0.5 0.625 +0.5 0.5 0.6562 +0.5 0.5 0.6875 +0.5 0.5 0.7188 +0.5 0.5 0.75 +0.5 0.5 0.7812 +0.5 0.5 0.8125 +0.5 0.5 0.8438 +0.5 0.5 0.875 +0.5 0.5 0.9062 +0.5 0.5 0.9375 +0.5 0.5 0.9688 +0.5 0.5 1 +0.5 0.5312 0 +0.5 0.5312 0.03125 +0.5 0.5312 0.0625 +0.5 0.5312 0.09375 +0.5 0.5312 0.125 +0.5 0.5312 0.1562 +0.5 0.5312 0.1875 +0.5 0.5312 0.2188 +0.5 0.5312 0.25 +0.5 0.5312 0.2812 +0.5 0.5312 0.3125 +0.5 0.5312 0.3438 +0.5 0.5312 0.375 +0.5 0.5312 0.4062 +0.5 0.5312 0.4375 +0.5 0.5312 0.4688 +0.5 0.5312 0.5 +0.5 0.5312 0.5312 +0.5 0.5312 0.5625 +0.5 0.5312 0.5938 +0.5 0.5312 0.625 +0.5 0.5312 0.6562 +0.5 0.5312 0.6875 +0.5 0.5312 0.7188 +0.5 0.5312 0.75 +0.5 0.5312 0.7812 +0.5 0.5312 0.8125 +0.5 0.5312 0.8438 +0.5 0.5312 0.875 +0.5 0.5312 0.9062 +0.5 0.5312 0.9375 +0.5 0.5312 0.9688 +0.5 0.5312 1 +0.5 0.5625 0 +0.5 0.5625 0.03125 +0.5 0.5625 0.0625 +0.5 0.5625 0.09375 +0.5 0.5625 0.125 +0.5 0.5625 0.1562 +0.5 0.5625 0.1875 +0.5 0.5625 0.2188 +0.5 0.5625 0.25 +0.5 0.5625 0.2812 +0.5 0.5625 0.3125 +0.5 0.5625 0.3438 +0.5 0.5625 0.375 +0.5 0.5625 0.4062 +0.5 0.5625 0.4375 +0.5 0.5625 0.4688 +0.5 0.5625 0.5 +0.5 0.5625 0.5312 +0.5 0.5625 0.5625 +0.5 0.5625 0.5938 +0.5 0.5625 0.625 +0.5 0.5625 0.6562 +0.5 0.5625 0.6875 +0.5 0.5625 0.7188 +0.5 0.5625 0.75 +0.5 0.5625 0.7812 +0.5 0.5625 0.8125 +0.5 0.5625 0.8438 +0.5 0.5625 0.875 +0.5 0.5625 0.9062 +0.5 0.5625 0.9375 +0.5 0.5625 0.9688 +0.5 0.5625 1 +0.5 0.5938 0 +0.5 0.5938 0.03125 +0.5 0.5938 0.0625 +0.5 0.5938 0.09375 +0.5 0.5938 0.125 +0.5 0.5938 0.1562 +0.5 0.5938 0.1875 +0.5 0.5938 0.2188 +0.5 0.5938 0.25 +0.5 0.5938 0.2812 +0.5 0.5938 0.3125 +0.5 0.5938 0.3438 +0.5 0.5938 0.375 +0.5 0.5938 0.4062 +0.5 0.5938 0.4375 +0.5 0.5938 0.4688 +0.5 0.5938 0.5 +0.5 0.5938 0.5312 +0.5 0.5938 0.5625 +0.5 0.5938 0.5938 +0.5 0.5938 0.625 +0.5 0.5938 0.6562 +0.5 0.5938 0.6875 +0.5 0.5938 0.7188 +0.5 0.5938 0.75 +0.5 0.5938 0.7812 +0.5 0.5938 0.8125 +0.5 0.5938 0.8438 +0.5 0.5938 0.875 +0.5 0.5938 0.9062 +0.5 0.5938 0.9375 +0.5 0.5938 0.9688 +0.5 0.5938 1 +0.5 0.625 0 +0.5 0.625 0.03125 +0.5 0.625 0.0625 +0.5 0.625 0.09375 +0.5 0.625 0.125 +0.5 0.625 0.1562 +0.5 0.625 0.1875 +0.5 0.625 0.2188 +0.5 0.625 0.25 +0.5 0.625 0.2812 +0.5 0.625 0.3125 +0.5 0.625 0.3438 +0.5 0.625 0.375 +0.5 0.625 0.4062 +0.5 0.625 0.4375 +0.5 0.625 0.4688 +0.5 0.625 0.5 +0.5 0.625 0.5312 +0.5 0.625 0.5625 +0.5 0.625 0.5938 +0.5 0.625 0.625 +0.5 0.625 0.6562 +0.5 0.625 0.6875 +0.5 0.625 0.7188 +0.5 0.625 0.75 +0.5 0.625 0.7812 +0.5 0.625 0.8125 +0.5 0.625 0.8438 +0.5 0.625 0.875 +0.5 0.625 0.9062 +0.5 0.625 0.9375 +0.5 0.625 0.9688 +0.5 0.625 1 +0.5 0.6562 0 +0.5 0.6562 0.03125 +0.5 0.6562 0.0625 +0.5 0.6562 0.09375 +0.5 0.6562 0.125 +0.5 0.6562 0.1562 +0.5 0.6562 0.1875 +0.5 0.6562 0.2188 +0.5 0.6562 0.25 +0.5 0.6562 0.2812 +0.5 0.6562 0.3125 +0.5 0.6562 0.3438 +0.5 0.6562 0.375 +0.5 0.6562 0.4062 +0.5 0.6562 0.4375 +0.5 0.6562 0.4688 +0.5 0.6562 0.5 +0.5 0.6562 0.5312 +0.5 0.6562 0.5625 +0.5 0.6562 0.5938 +0.5 0.6562 0.625 +0.5 0.6562 0.6562 +0.5 0.6562 0.6875 +0.5 0.6562 0.7188 +0.5 0.6562 0.75 +0.5 0.6562 0.7812 +0.5 0.6562 0.8125 +0.5 0.6562 0.8438 +0.5 0.6562 0.875 +0.5 0.6562 0.9062 +0.5 0.6562 0.9375 +0.5 0.6562 0.9688 +0.5 0.6562 1 +0.5 0.6875 0 +0.5 0.6875 0.03125 +0.5 0.6875 0.0625 +0.5 0.6875 0.09375 +0.5 0.6875 0.125 +0.5 0.6875 0.1562 +0.5 0.6875 0.1875 +0.5 0.6875 0.2188 +0.5 0.6875 0.25 +0.5 0.6875 0.2812 +0.5 0.6875 0.3125 +0.5 0.6875 0.3438 +0.5 0.6875 0.375 +0.5 0.6875 0.4062 +0.5 0.6875 0.4375 +0.5 0.6875 0.4688 +0.5 0.6875 0.5 +0.5 0.6875 0.5312 +0.5 0.6875 0.5625 +0.5 0.6875 0.5938 +0.5 0.6875 0.625 +0.5 0.6875 0.6562 +0.5 0.6875 0.6875 +0.5 0.6875 0.7188 +0.5 0.6875 0.75 +0.5 0.6875 0.7812 +0.5 0.6875 0.8125 +0.5 0.6875 0.8438 +0.5 0.6875 0.875 +0.5 0.6875 0.9062 +0.5 0.6875 0.9375 +0.5 0.6875 0.9688 +0.5 0.6875 1 +0.5 0.7188 0 +0.5 0.7188 0.03125 +0.5 0.7188 0.0625 +0.5 0.7188 0.09375 +0.5 0.7188 0.125 +0.5 0.7188 0.1562 +0.5 0.7188 0.1875 +0.5 0.7188 0.2188 +0.5 0.7188 0.25 +0.5 0.7188 0.2812 +0.5 0.7188 0.3125 +0.5 0.7188 0.3438 +0.5 0.7188 0.375 +0.5 0.7188 0.4062 +0.5 0.7188 0.4375 +0.5 0.7188 0.4688 +0.5 0.7188 0.5 +0.5 0.7188 0.5312 +0.5 0.7188 0.5625 +0.5 0.7188 0.5938 +0.5 0.7188 0.625 +0.5 0.7188 0.6562 +0.5 0.7188 0.6875 +0.5 0.7188 0.7188 +0.5 0.7188 0.75 +0.5 0.7188 0.7812 +0.5 0.7188 0.8125 +0.5 0.7188 0.8438 +0.5 0.7188 0.875 +0.5 0.7188 0.9062 +0.5 0.7188 0.9375 +0.5 0.7188 0.9688 +0.5 0.7188 1 +0.5 0.75 0 +0.5 0.75 0.03125 +0.5 0.75 0.0625 +0.5 0.75 0.09375 +0.5 0.75 0.125 +0.5 0.75 0.1562 +0.5 0.75 0.1875 +0.5 0.75 0.2188 +0.5 0.75 0.25 +0.5 0.75 0.2812 +0.5 0.75 0.3125 +0.5 0.75 0.3438 +0.5 0.75 0.375 +0.5 0.75 0.4062 +0.5 0.75 0.4375 +0.5 0.75 0.4688 +0.5 0.75 0.5 +0.5 0.75 0.5312 +0.5 0.75 0.5625 +0.5 0.75 0.5938 +0.5 0.75 0.625 +0.5 0.75 0.6562 +0.5 0.75 0.6875 +0.5 0.75 0.7188 +0.5 0.75 0.75 +0.5 0.75 0.7812 +0.5 0.75 0.8125 +0.5 0.75 0.8438 +0.5 0.75 0.875 +0.5 0.75 0.9062 +0.5 0.75 0.9375 +0.5 0.75 0.9688 +0.5 0.75 1 +0.5 0.7812 0 +0.5 0.7812 0.03125 +0.5 0.7812 0.0625 +0.5 0.7812 0.09375 +0.5 0.7812 0.125 +0.5 0.7812 0.1562 +0.5 0.7812 0.1875 +0.5 0.7812 0.2188 +0.5 0.7812 0.25 +0.5 0.7812 0.2812 +0.5 0.7812 0.3125 +0.5 0.7812 0.3438 +0.5 0.7812 0.375 +0.5 0.7812 0.4062 +0.5 0.7812 0.4375 +0.5 0.7812 0.4688 +0.5 0.7812 0.5 +0.5 0.7812 0.5312 +0.5 0.7812 0.5625 +0.5 0.7812 0.5938 +0.5 0.7812 0.625 +0.5 0.7812 0.6562 +0.5 0.7812 0.6875 +0.5 0.7812 0.7188 +0.5 0.7812 0.75 +0.5 0.7812 0.7812 +0.5 0.7812 0.8125 +0.5 0.7812 0.8438 +0.5 0.7812 0.875 +0.5 0.7812 0.9062 +0.5 0.7812 0.9375 +0.5 0.7812 0.9688 +0.5 0.7812 1 +0.5 0.8125 0 +0.5 0.8125 0.03125 +0.5 0.8125 0.0625 +0.5 0.8125 0.09375 +0.5 0.8125 0.125 +0.5 0.8125 0.1562 +0.5 0.8125 0.1875 +0.5 0.8125 0.2188 +0.5 0.8125 0.25 +0.5 0.8125 0.2812 +0.5 0.8125 0.3125 +0.5 0.8125 0.3438 +0.5 0.8125 0.375 +0.5 0.8125 0.4062 +0.5 0.8125 0.4375 +0.5 0.8125 0.4688 +0.5 0.8125 0.5 +0.5 0.8125 0.5312 +0.5 0.8125 0.5625 +0.5 0.8125 0.5938 +0.5 0.8125 0.625 +0.5 0.8125 0.6562 +0.5 0.8125 0.6875 +0.5 0.8125 0.7188 +0.5 0.8125 0.75 +0.5 0.8125 0.7812 +0.5 0.8125 0.8125 +0.5 0.8125 0.8438 +0.5 0.8125 0.875 +0.5 0.8125 0.9062 +0.5 0.8125 0.9375 +0.5 0.8125 0.9688 +0.5 0.8125 1 +0.5 0.8438 0 +0.5 0.8438 0.03125 +0.5 0.8438 0.0625 +0.5 0.8438 0.09375 +0.5 0.8438 0.125 +0.5 0.8438 0.1562 +0.5 0.8438 0.1875 +0.5 0.8438 0.2188 +0.5 0.8438 0.25 +0.5 0.8438 0.2812 +0.5 0.8438 0.3125 +0.5 0.8438 0.3438 +0.5 0.8438 0.375 +0.5 0.8438 0.4062 +0.5 0.8438 0.4375 +0.5 0.8438 0.4688 +0.5 0.8438 0.5 +0.5 0.8438 0.5312 +0.5 0.8438 0.5625 +0.5 0.8438 0.5938 +0.5 0.8438 0.625 +0.5 0.8438 0.6562 +0.5 0.8438 0.6875 +0.5 0.8438 0.7188 +0.5 0.8438 0.75 +0.5 0.8438 0.7812 +0.5 0.8438 0.8125 +0.5 0.8438 0.8438 +0.5 0.8438 0.875 +0.5 0.8438 0.9062 +0.5 0.8438 0.9375 +0.5 0.8438 0.9688 +0.5 0.8438 1 +0.5 0.875 0 +0.5 0.875 0.03125 +0.5 0.875 0.0625 +0.5 0.875 0.09375 +0.5 0.875 0.125 +0.5 0.875 0.1562 +0.5 0.875 0.1875 +0.5 0.875 0.2188 +0.5 0.875 0.25 +0.5 0.875 0.2812 +0.5 0.875 0.3125 +0.5 0.875 0.3438 +0.5 0.875 0.375 +0.5 0.875 0.4062 +0.5 0.875 0.4375 +0.5 0.875 0.4688 +0.5 0.875 0.5 +0.5 0.875 0.5312 +0.5 0.875 0.5625 +0.5 0.875 0.5938 +0.5 0.875 0.625 +0.5 0.875 0.6562 +0.5 0.875 0.6875 +0.5 0.875 0.7188 +0.5 0.875 0.75 +0.5 0.875 0.7812 +0.5 0.875 0.8125 +0.5 0.875 0.8438 +0.5 0.875 0.875 +0.5 0.875 0.9062 +0.5 0.875 0.9375 +0.5 0.875 0.9688 +0.5 0.875 1 +0.5 0.9062 0 +0.5 0.9062 0.03125 +0.5 0.9062 0.0625 +0.5 0.9062 0.09375 +0.5 0.9062 0.125 +0.5 0.9062 0.1562 +0.5 0.9062 0.1875 +0.5 0.9062 0.2188 +0.5 0.9062 0.25 +0.5 0.9062 0.2812 +0.5 0.9062 0.3125 +0.5 0.9062 0.3438 +0.5 0.9062 0.375 +0.5 0.9062 0.4062 +0.5 0.9062 0.4375 +0.5 0.9062 0.4688 +0.5 0.9062 0.5 +0.5 0.9062 0.5312 +0.5 0.9062 0.5625 +0.5 0.9062 0.5938 +0.5 0.9062 0.625 +0.5 0.9062 0.6562 +0.5 0.9062 0.6875 +0.5 0.9062 0.7188 +0.5 0.9062 0.75 +0.5 0.9062 0.7812 +0.5 0.9062 0.8125 +0.5 0.9062 0.8438 +0.5 0.9062 0.875 +0.5 0.9062 0.9062 +0.5 0.9062 0.9375 +0.5 0.9062 0.9688 +0.5 0.9062 1 +0.5 0.9375 0 +0.5 0.9375 0.03125 +0.5 0.9375 0.0625 +0.5 0.9375 0.09375 +0.5 0.9375 0.125 +0.5 0.9375 0.1562 +0.5 0.9375 0.1875 +0.5 0.9375 0.2188 +0.5 0.9375 0.25 +0.5 0.9375 0.2812 +0.5 0.9375 0.3125 +0.5 0.9375 0.3438 +0.5 0.9375 0.375 +0.5 0.9375 0.4062 +0.5 0.9375 0.4375 +0.5 0.9375 0.4688 +0.5 0.9375 0.5 +0.5 0.9375 0.5312 +0.5 0.9375 0.5625 +0.5 0.9375 0.5938 +0.5 0.9375 0.625 +0.5 0.9375 0.6562 +0.5 0.9375 0.6875 +0.5 0.9375 0.7188 +0.5 0.9375 0.75 +0.5 0.9375 0.7812 +0.5 0.9375 0.8125 +0.5 0.9375 0.8438 +0.5 0.9375 0.875 +0.5 0.9375 0.9062 +0.5 0.9375 0.9375 +0.5 0.9375 0.9688 +0.5 0.9375 1 +0.5 0.9688 0 +0.5 0.9688 0.03125 +0.5 0.9688 0.0625 +0.5 0.9688 0.09375 +0.5 0.9688 0.125 +0.5 0.9688 0.1562 +0.5 0.9688 0.1875 +0.5 0.9688 0.2188 +0.5 0.9688 0.25 +0.5 0.9688 0.2812 +0.5 0.9688 0.3125 +0.5 0.9688 0.3438 +0.5 0.9688 0.375 +0.5 0.9688 0.4062 +0.5 0.9688 0.4375 +0.5 0.9688 0.4688 +0.5 0.9688 0.5 +0.5 0.9688 0.5312 +0.5 0.9688 0.5625 +0.5 0.9688 0.5938 +0.5 0.9688 0.625 +0.5 0.9688 0.6562 +0.5 0.9688 0.6875 +0.5 0.9688 0.7188 +0.5 0.9688 0.75 +0.5 0.9688 0.7812 +0.5 0.9688 0.8125 +0.5 0.9688 0.8438 +0.5 0.9688 0.875 +0.5 0.9688 0.9062 +0.5 0.9688 0.9375 +0.5 0.9688 0.9688 +0.5 0.9688 1 +0.5 1 0 +0.5 1 0.03125 +0.5 1 0.0625 +0.5 1 0.09375 +0.5 1 0.125 +0.5 1 0.1562 +0.5 1 0.1875 +0.5 1 0.2188 +0.5 1 0.25 +0.5 1 0.2812 +0.5 1 0.3125 +0.5 1 0.3438 +0.5 1 0.375 +0.5 1 0.4062 +0.5 1 0.4375 +0.5 1 0.4688 +0.5 1 0.5 +0.5 1 0.5312 +0.5 1 0.5625 +0.5 1 0.5938 +0.5 1 0.625 +0.5 1 0.6562 +0.5 1 0.6875 +0.5 1 0.7188 +0.5 1 0.75 +0.5 1 0.7812 +0.5 1 0.8125 +0.5 1 0.8438 +0.5 1 0.875 +0.5 1 0.9062 +0.5 1 0.9375 +0.5 1 0.9688 +0.5 1 1 +0.5312 0 0 +0.5312 0 0.03125 +0.5312 0 0.0625 +0.5312 0 0.09375 +0.5312 0 0.125 +0.5312 0 0.1562 +0.5312 0 0.1875 +0.5312 0 0.2188 +0.5312 0 0.25 +0.5312 0 0.2812 +0.5312 0 0.3125 +0.5312 0 0.3438 +0.5312 0 0.375 +0.5312 0 0.4062 +0.5312 0 0.4375 +0.5312 0 0.4688 +0.5312 0 0.5 +0.5312 0 0.5312 +0.5312 0 0.5625 +0.5312 0 0.5938 +0.5312 0 0.625 +0.5312 0 0.6562 +0.5312 0 0.6875 +0.5312 0 0.7188 +0.5312 0 0.75 +0.5312 0 0.7812 +0.5312 0 0.8125 +0.5312 0 0.8438 +0.5312 0 0.875 +0.5312 0 0.9062 +0.5312 0 0.9375 +0.5312 0 0.9688 +0.5312 0 1 +0.5312 0.03125 0 +0.5312 0.03125 0.03125 +0.5312 0.03125 0.0625 +0.5312 0.03125 0.09375 +0.5312 0.03125 0.125 +0.5312 0.03125 0.1562 +0.5312 0.03125 0.1875 +0.5312 0.03125 0.2188 +0.5312 0.03125 0.25 +0.5312 0.03125 0.2812 +0.5312 0.03125 0.3125 +0.5312 0.03125 0.3438 +0.5312 0.03125 0.375 +0.5312 0.03125 0.4062 +0.5312 0.03125 0.4375 +0.5312 0.03125 0.4688 +0.5312 0.03125 0.5 +0.5312 0.03125 0.5312 +0.5312 0.03125 0.5625 +0.5312 0.03125 0.5938 +0.5312 0.03125 0.625 +0.5312 0.03125 0.6562 +0.5312 0.03125 0.6875 +0.5312 0.03125 0.7188 +0.5312 0.03125 0.75 +0.5312 0.03125 0.7812 +0.5312 0.03125 0.8125 +0.5312 0.03125 0.8438 +0.5312 0.03125 0.875 +0.5312 0.03125 0.9062 +0.5312 0.03125 0.9375 +0.5312 0.03125 0.9688 +0.5312 0.03125 1 +0.5312 0.0625 0 +0.5312 0.0625 0.03125 +0.5312 0.0625 0.0625 +0.5312 0.0625 0.09375 +0.5312 0.0625 0.125 +0.5312 0.0625 0.1562 +0.5312 0.0625 0.1875 +0.5312 0.0625 0.2188 +0.5312 0.0625 0.25 +0.5312 0.0625 0.2812 +0.5312 0.0625 0.3125 +0.5312 0.0625 0.3438 +0.5312 0.0625 0.375 +0.5312 0.0625 0.4062 +0.5312 0.0625 0.4375 +0.5312 0.0625 0.4688 +0.5312 0.0625 0.5 +0.5312 0.0625 0.5312 +0.5312 0.0625 0.5625 +0.5312 0.0625 0.5938 +0.5312 0.0625 0.625 +0.5312 0.0625 0.6562 +0.5312 0.0625 0.6875 +0.5312 0.0625 0.7188 +0.5312 0.0625 0.75 +0.5312 0.0625 0.7812 +0.5312 0.0625 0.8125 +0.5312 0.0625 0.8438 +0.5312 0.0625 0.875 +0.5312 0.0625 0.9062 +0.5312 0.0625 0.9375 +0.5312 0.0625 0.9688 +0.5312 0.0625 1 +0.5312 0.09375 0 +0.5312 0.09375 0.03125 +0.5312 0.09375 0.0625 +0.5312 0.09375 0.09375 +0.5312 0.09375 0.125 +0.5312 0.09375 0.1562 +0.5312 0.09375 0.1875 +0.5312 0.09375 0.2188 +0.5312 0.09375 0.25 +0.5312 0.09375 0.2812 +0.5312 0.09375 0.3125 +0.5312 0.09375 0.3438 +0.5312 0.09375 0.375 +0.5312 0.09375 0.4062 +0.5312 0.09375 0.4375 +0.5312 0.09375 0.4688 +0.5312 0.09375 0.5 +0.5312 0.09375 0.5312 +0.5312 0.09375 0.5625 +0.5312 0.09375 0.5938 +0.5312 0.09375 0.625 +0.5312 0.09375 0.6562 +0.5312 0.09375 0.6875 +0.5312 0.09375 0.7188 +0.5312 0.09375 0.75 +0.5312 0.09375 0.7812 +0.5312 0.09375 0.8125 +0.5312 0.09375 0.8438 +0.5312 0.09375 0.875 +0.5312 0.09375 0.9062 +0.5312 0.09375 0.9375 +0.5312 0.09375 0.9688 +0.5312 0.09375 1 +0.5312 0.125 0 +0.5312 0.125 0.03125 +0.5312 0.125 0.0625 +0.5312 0.125 0.09375 +0.5312 0.125 0.125 +0.5312 0.125 0.1562 +0.5312 0.125 0.1875 +0.5312 0.125 0.2188 +0.5312 0.125 0.25 +0.5312 0.125 0.2812 +0.5312 0.125 0.3125 +0.5312 0.125 0.3438 +0.5312 0.125 0.375 +0.5312 0.125 0.4062 +0.5312 0.125 0.4375 +0.5312 0.125 0.4688 +0.5312 0.125 0.5 +0.5312 0.125 0.5312 +0.5312 0.125 0.5625 +0.5312 0.125 0.5938 +0.5312 0.125 0.625 +0.5312 0.125 0.6562 +0.5312 0.125 0.6875 +0.5312 0.125 0.7188 +0.5312 0.125 0.75 +0.5312 0.125 0.7812 +0.5312 0.125 0.8125 +0.5312 0.125 0.8438 +0.5312 0.125 0.875 +0.5312 0.125 0.9062 +0.5312 0.125 0.9375 +0.5312 0.125 0.9688 +0.5312 0.125 1 +0.5312 0.1562 0 +0.5312 0.1562 0.03125 +0.5312 0.1562 0.0625 +0.5312 0.1562 0.09375 +0.5312 0.1562 0.125 +0.5312 0.1562 0.1562 +0.5312 0.1562 0.1875 +0.5312 0.1562 0.2188 +0.5312 0.1562 0.25 +0.5312 0.1562 0.2812 +0.5312 0.1562 0.3125 +0.5312 0.1562 0.3438 +0.5312 0.1562 0.375 +0.5312 0.1562 0.4062 +0.5312 0.1562 0.4375 +0.5312 0.1562 0.4688 +0.5312 0.1562 0.5 +0.5312 0.1562 0.5312 +0.5312 0.1562 0.5625 +0.5312 0.1562 0.5938 +0.5312 0.1562 0.625 +0.5312 0.1562 0.6562 +0.5312 0.1562 0.6875 +0.5312 0.1562 0.7188 +0.5312 0.1562 0.75 +0.5312 0.1562 0.7812 +0.5312 0.1562 0.8125 +0.5312 0.1562 0.8438 +0.5312 0.1562 0.875 +0.5312 0.1562 0.9062 +0.5312 0.1562 0.9375 +0.5312 0.1562 0.9688 +0.5312 0.1562 1 +0.5312 0.1875 0 +0.5312 0.1875 0.03125 +0.5312 0.1875 0.0625 +0.5312 0.1875 0.09375 +0.5312 0.1875 0.125 +0.5312 0.1875 0.1562 +0.5312 0.1875 0.1875 +0.5312 0.1875 0.2188 +0.5312 0.1875 0.25 +0.5312 0.1875 0.2812 +0.5312 0.1875 0.3125 +0.5312 0.1875 0.3438 +0.5312 0.1875 0.375 +0.5312 0.1875 0.4062 +0.5312 0.1875 0.4375 +0.5312 0.1875 0.4688 +0.5312 0.1875 0.5 +0.5312 0.1875 0.5312 +0.5312 0.1875 0.5625 +0.5312 0.1875 0.5938 +0.5312 0.1875 0.625 +0.5312 0.1875 0.6562 +0.5312 0.1875 0.6875 +0.5312 0.1875 0.7188 +0.5312 0.1875 0.75 +0.5312 0.1875 0.7812 +0.5312 0.1875 0.8125 +0.5312 0.1875 0.8438 +0.5312 0.1875 0.875 +0.5312 0.1875 0.9062 +0.5312 0.1875 0.9375 +0.5312 0.1875 0.9688 +0.5312 0.1875 1 +0.5312 0.2188 0 +0.5312 0.2188 0.03125 +0.5312 0.2188 0.0625 +0.5312 0.2188 0.09375 +0.5312 0.2188 0.125 +0.5312 0.2188 0.1562 +0.5312 0.2188 0.1875 +0.5312 0.2188 0.2188 +0.5312 0.2188 0.25 +0.5312 0.2188 0.2812 +0.5312 0.2188 0.3125 +0.5312 0.2188 0.3438 +0.5312 0.2188 0.375 +0.5312 0.2188 0.4062 +0.5312 0.2188 0.4375 +0.5312 0.2188 0.4688 +0.5312 0.2188 0.5 +0.5312 0.2188 0.5312 +0.5312 0.2188 0.5625 +0.5312 0.2188 0.5938 +0.5312 0.2188 0.625 +0.5312 0.2188 0.6562 +0.5312 0.2188 0.6875 +0.5312 0.2188 0.7188 +0.5312 0.2188 0.75 +0.5312 0.2188 0.7812 +0.5312 0.2188 0.8125 +0.5312 0.2188 0.8438 +0.5312 0.2188 0.875 +0.5312 0.2188 0.9062 +0.5312 0.2188 0.9375 +0.5312 0.2188 0.9688 +0.5312 0.2188 1 +0.5312 0.25 0 +0.5312 0.25 0.03125 +0.5312 0.25 0.0625 +0.5312 0.25 0.09375 +0.5312 0.25 0.125 +0.5312 0.25 0.1562 +0.5312 0.25 0.1875 +0.5312 0.25 0.2188 +0.5312 0.25 0.25 +0.5312 0.25 0.2812 +0.5312 0.25 0.3125 +0.5312 0.25 0.3438 +0.5312 0.25 0.375 +0.5312 0.25 0.4062 +0.5312 0.25 0.4375 +0.5312 0.25 0.4688 +0.5312 0.25 0.5 +0.5312 0.25 0.5312 +0.5312 0.25 0.5625 +0.5312 0.25 0.5938 +0.5312 0.25 0.625 +0.5312 0.25 0.6562 +0.5312 0.25 0.6875 +0.5312 0.25 0.7188 +0.5312 0.25 0.75 +0.5312 0.25 0.7812 +0.5312 0.25 0.8125 +0.5312 0.25 0.8438 +0.5312 0.25 0.875 +0.5312 0.25 0.9062 +0.5312 0.25 0.9375 +0.5312 0.25 0.9688 +0.5312 0.25 1 +0.5312 0.2812 0 +0.5312 0.2812 0.03125 +0.5312 0.2812 0.0625 +0.5312 0.2812 0.09375 +0.5312 0.2812 0.125 +0.5312 0.2812 0.1562 +0.5312 0.2812 0.1875 +0.5312 0.2812 0.2188 +0.5312 0.2812 0.25 +0.5312 0.2812 0.2812 +0.5312 0.2812 0.3125 +0.5312 0.2812 0.3438 +0.5312 0.2812 0.375 +0.5312 0.2812 0.4062 +0.5312 0.2812 0.4375 +0.5312 0.2812 0.4688 +0.5312 0.2812 0.5 +0.5312 0.2812 0.5312 +0.5312 0.2812 0.5625 +0.5312 0.2812 0.5938 +0.5312 0.2812 0.625 +0.5312 0.2812 0.6562 +0.5312 0.2812 0.6875 +0.5312 0.2812 0.7188 +0.5312 0.2812 0.75 +0.5312 0.2812 0.7812 +0.5312 0.2812 0.8125 +0.5312 0.2812 0.8438 +0.5312 0.2812 0.875 +0.5312 0.2812 0.9062 +0.5312 0.2812 0.9375 +0.5312 0.2812 0.9688 +0.5312 0.2812 1 +0.5312 0.3125 0 +0.5312 0.3125 0.03125 +0.5312 0.3125 0.0625 +0.5312 0.3125 0.09375 +0.5312 0.3125 0.125 +0.5312 0.3125 0.1562 +0.5312 0.3125 0.1875 +0.5312 0.3125 0.2188 +0.5312 0.3125 0.25 +0.5312 0.3125 0.2812 +0.5312 0.3125 0.3125 +0.5312 0.3125 0.3438 +0.5312 0.3125 0.375 +0.5312 0.3125 0.4062 +0.5312 0.3125 0.4375 +0.5312 0.3125 0.4688 +0.5312 0.3125 0.5 +0.5312 0.3125 0.5312 +0.5312 0.3125 0.5625 +0.5312 0.3125 0.5938 +0.5312 0.3125 0.625 +0.5312 0.3125 0.6562 +0.5312 0.3125 0.6875 +0.5312 0.3125 0.7188 +0.5312 0.3125 0.75 +0.5312 0.3125 0.7812 +0.5312 0.3125 0.8125 +0.5312 0.3125 0.8438 +0.5312 0.3125 0.875 +0.5312 0.3125 0.9062 +0.5312 0.3125 0.9375 +0.5312 0.3125 0.9688 +0.5312 0.3125 1 +0.5312 0.3438 0 +0.5312 0.3438 0.03125 +0.5312 0.3438 0.0625 +0.5312 0.3438 0.09375 +0.5312 0.3438 0.125 +0.5312 0.3438 0.1562 +0.5312 0.3438 0.1875 +0.5312 0.3438 0.2188 +0.5312 0.3438 0.25 +0.5312 0.3438 0.2812 +0.5312 0.3438 0.3125 +0.5312 0.3438 0.3438 +0.5312 0.3438 0.375 +0.5312 0.3438 0.4062 +0.5312 0.3438 0.4375 +0.5312 0.3438 0.4688 +0.5312 0.3438 0.5 +0.5312 0.3438 0.5312 +0.5312 0.3438 0.5625 +0.5312 0.3438 0.5938 +0.5312 0.3438 0.625 +0.5312 0.3438 0.6562 +0.5312 0.3438 0.6875 +0.5312 0.3438 0.7188 +0.5312 0.3438 0.75 +0.5312 0.3438 0.7812 +0.5312 0.3438 0.8125 +0.5312 0.3438 0.8438 +0.5312 0.3438 0.875 +0.5312 0.3438 0.9062 +0.5312 0.3438 0.9375 +0.5312 0.3438 0.9688 +0.5312 0.3438 1 +0.5312 0.375 0 +0.5312 0.375 0.03125 +0.5312 0.375 0.0625 +0.5312 0.375 0.09375 +0.5312 0.375 0.125 +0.5312 0.375 0.1562 +0.5312 0.375 0.1875 +0.5312 0.375 0.2188 +0.5312 0.375 0.25 +0.5312 0.375 0.2812 +0.5312 0.375 0.3125 +0.5312 0.375 0.3438 +0.5312 0.375 0.375 +0.5312 0.375 0.4062 +0.5312 0.375 0.4375 +0.5312 0.375 0.4688 +0.5312 0.375 0.5 +0.5312 0.375 0.5312 +0.5312 0.375 0.5625 +0.5312 0.375 0.5938 +0.5312 0.375 0.625 +0.5312 0.375 0.6562 +0.5312 0.375 0.6875 +0.5312 0.375 0.7188 +0.5312 0.375 0.75 +0.5312 0.375 0.7812 +0.5312 0.375 0.8125 +0.5312 0.375 0.8438 +0.5312 0.375 0.875 +0.5312 0.375 0.9062 +0.5312 0.375 0.9375 +0.5312 0.375 0.9688 +0.5312 0.375 1 +0.5312 0.4062 0 +0.5312 0.4062 0.03125 +0.5312 0.4062 0.0625 +0.5312 0.4062 0.09375 +0.5312 0.4062 0.125 +0.5312 0.4062 0.1562 +0.5312 0.4062 0.1875 +0.5312 0.4062 0.2188 +0.5312 0.4062 0.25 +0.5312 0.4062 0.2812 +0.5312 0.4062 0.3125 +0.5312 0.4062 0.3438 +0.5312 0.4062 0.375 +0.5312 0.4062 0.4062 +0.5312 0.4062 0.4375 +0.5312 0.4062 0.4688 +0.5312 0.4062 0.5 +0.5312 0.4062 0.5312 +0.5312 0.4062 0.5625 +0.5312 0.4062 0.5938 +0.5312 0.4062 0.625 +0.5312 0.4062 0.6562 +0.5312 0.4062 0.6875 +0.5312 0.4062 0.7188 +0.5312 0.4062 0.75 +0.5312 0.4062 0.7812 +0.5312 0.4062 0.8125 +0.5312 0.4062 0.8438 +0.5312 0.4062 0.875 +0.5312 0.4062 0.9062 +0.5312 0.4062 0.9375 +0.5312 0.4062 0.9688 +0.5312 0.4062 1 +0.5312 0.4375 0 +0.5312 0.4375 0.03125 +0.5312 0.4375 0.0625 +0.5312 0.4375 0.09375 +0.5312 0.4375 0.125 +0.5312 0.4375 0.1562 +0.5312 0.4375 0.1875 +0.5312 0.4375 0.2188 +0.5312 0.4375 0.25 +0.5312 0.4375 0.2812 +0.5312 0.4375 0.3125 +0.5312 0.4375 0.3438 +0.5312 0.4375 0.375 +0.5312 0.4375 0.4062 +0.5312 0.4375 0.4375 +0.5312 0.4375 0.4688 +0.5312 0.4375 0.5 +0.5312 0.4375 0.5312 +0.5312 0.4375 0.5625 +0.5312 0.4375 0.5938 +0.5312 0.4375 0.625 +0.5312 0.4375 0.6562 +0.5312 0.4375 0.6875 +0.5312 0.4375 0.7188 +0.5312 0.4375 0.75 +0.5312 0.4375 0.7812 +0.5312 0.4375 0.8125 +0.5312 0.4375 0.8438 +0.5312 0.4375 0.875 +0.5312 0.4375 0.9062 +0.5312 0.4375 0.9375 +0.5312 0.4375 0.9688 +0.5312 0.4375 1 +0.5312 0.4688 0 +0.5312 0.4688 0.03125 +0.5312 0.4688 0.0625 +0.5312 0.4688 0.09375 +0.5312 0.4688 0.125 +0.5312 0.4688 0.1562 +0.5312 0.4688 0.1875 +0.5312 0.4688 0.2188 +0.5312 0.4688 0.25 +0.5312 0.4688 0.2812 +0.5312 0.4688 0.3125 +0.5312 0.4688 0.3438 +0.5312 0.4688 0.375 +0.5312 0.4688 0.4062 +0.5312 0.4688 0.4375 +0.5312 0.4688 0.4688 +0.5312 0.4688 0.5 +0.5312 0.4688 0.5312 +0.5312 0.4688 0.5625 +0.5312 0.4688 0.5938 +0.5312 0.4688 0.625 +0.5312 0.4688 0.6562 +0.5312 0.4688 0.6875 +0.5312 0.4688 0.7188 +0.5312 0.4688 0.75 +0.5312 0.4688 0.7812 +0.5312 0.4688 0.8125 +0.5312 0.4688 0.8438 +0.5312 0.4688 0.875 +0.5312 0.4688 0.9062 +0.5312 0.4688 0.9375 +0.5312 0.4688 0.9688 +0.5312 0.4688 1 +0.5312 0.5 0 +0.5312 0.5 0.03125 +0.5312 0.5 0.0625 +0.5312 0.5 0.09375 +0.5312 0.5 0.125 +0.5312 0.5 0.1562 +0.5312 0.5 0.1875 +0.5312 0.5 0.2188 +0.5312 0.5 0.25 +0.5312 0.5 0.2812 +0.5312 0.5 0.3125 +0.5312 0.5 0.3438 +0.5312 0.5 0.375 +0.5312 0.5 0.4062 +0.5312 0.5 0.4375 +0.5312 0.5 0.4688 +0.5312 0.5 0.5 +0.5312 0.5 0.5312 +0.5312 0.5 0.5625 +0.5312 0.5 0.5938 +0.5312 0.5 0.625 +0.5312 0.5 0.6562 +0.5312 0.5 0.6875 +0.5312 0.5 0.7188 +0.5312 0.5 0.75 +0.5312 0.5 0.7812 +0.5312 0.5 0.8125 +0.5312 0.5 0.8438 +0.5312 0.5 0.875 +0.5312 0.5 0.9062 +0.5312 0.5 0.9375 +0.5312 0.5 0.9688 +0.5312 0.5 1 +0.5312 0.5312 0 +0.5312 0.5312 0.03125 +0.5312 0.5312 0.0625 +0.5312 0.5312 0.09375 +0.5312 0.5312 0.125 +0.5312 0.5312 0.1562 +0.5312 0.5312 0.1875 +0.5312 0.5312 0.2188 +0.5312 0.5312 0.25 +0.5312 0.5312 0.2812 +0.5312 0.5312 0.3125 +0.5312 0.5312 0.3438 +0.5312 0.5312 0.375 +0.5312 0.5312 0.4062 +0.5312 0.5312 0.4375 +0.5312 0.5312 0.4688 +0.5312 0.5312 0.5 +0.5312 0.5312 0.5312 +0.5312 0.5312 0.5625 +0.5312 0.5312 0.5938 +0.5312 0.5312 0.625 +0.5312 0.5312 0.6562 +0.5312 0.5312 0.6875 +0.5312 0.5312 0.7188 +0.5312 0.5312 0.75 +0.5312 0.5312 0.7812 +0.5312 0.5312 0.8125 +0.5312 0.5312 0.8438 +0.5312 0.5312 0.875 +0.5312 0.5312 0.9062 +0.5312 0.5312 0.9375 +0.5312 0.5312 0.9688 +0.5312 0.5312 1 +0.5312 0.5625 0 +0.5312 0.5625 0.03125 +0.5312 0.5625 0.0625 +0.5312 0.5625 0.09375 +0.5312 0.5625 0.125 +0.5312 0.5625 0.1562 +0.5312 0.5625 0.1875 +0.5312 0.5625 0.2188 +0.5312 0.5625 0.25 +0.5312 0.5625 0.2812 +0.5312 0.5625 0.3125 +0.5312 0.5625 0.3438 +0.5312 0.5625 0.375 +0.5312 0.5625 0.4062 +0.5312 0.5625 0.4375 +0.5312 0.5625 0.4688 +0.5312 0.5625 0.5 +0.5312 0.5625 0.5312 +0.5312 0.5625 0.5625 +0.5312 0.5625 0.5938 +0.5312 0.5625 0.625 +0.5312 0.5625 0.6562 +0.5312 0.5625 0.6875 +0.5312 0.5625 0.7188 +0.5312 0.5625 0.75 +0.5312 0.5625 0.7812 +0.5312 0.5625 0.8125 +0.5312 0.5625 0.8438 +0.5312 0.5625 0.875 +0.5312 0.5625 0.9062 +0.5312 0.5625 0.9375 +0.5312 0.5625 0.9688 +0.5312 0.5625 1 +0.5312 0.5938 0 +0.5312 0.5938 0.03125 +0.5312 0.5938 0.0625 +0.5312 0.5938 0.09375 +0.5312 0.5938 0.125 +0.5312 0.5938 0.1562 +0.5312 0.5938 0.1875 +0.5312 0.5938 0.2188 +0.5312 0.5938 0.25 +0.5312 0.5938 0.2812 +0.5312 0.5938 0.3125 +0.5312 0.5938 0.3438 +0.5312 0.5938 0.375 +0.5312 0.5938 0.4062 +0.5312 0.5938 0.4375 +0.5312 0.5938 0.4688 +0.5312 0.5938 0.5 +0.5312 0.5938 0.5312 +0.5312 0.5938 0.5625 +0.5312 0.5938 0.5938 +0.5312 0.5938 0.625 +0.5312 0.5938 0.6562 +0.5312 0.5938 0.6875 +0.5312 0.5938 0.7188 +0.5312 0.5938 0.75 +0.5312 0.5938 0.7812 +0.5312 0.5938 0.8125 +0.5312 0.5938 0.8438 +0.5312 0.5938 0.875 +0.5312 0.5938 0.9062 +0.5312 0.5938 0.9375 +0.5312 0.5938 0.9688 +0.5312 0.5938 1 +0.5312 0.625 0 +0.5312 0.625 0.03125 +0.5312 0.625 0.0625 +0.5312 0.625 0.09375 +0.5312 0.625 0.125 +0.5312 0.625 0.1562 +0.5312 0.625 0.1875 +0.5312 0.625 0.2188 +0.5312 0.625 0.25 +0.5312 0.625 0.2812 +0.5312 0.625 0.3125 +0.5312 0.625 0.3438 +0.5312 0.625 0.375 +0.5312 0.625 0.4062 +0.5312 0.625 0.4375 +0.5312 0.625 0.4688 +0.5312 0.625 0.5 +0.5312 0.625 0.5312 +0.5312 0.625 0.5625 +0.5312 0.625 0.5938 +0.5312 0.625 0.625 +0.5312 0.625 0.6562 +0.5312 0.625 0.6875 +0.5312 0.625 0.7188 +0.5312 0.625 0.75 +0.5312 0.625 0.7812 +0.5312 0.625 0.8125 +0.5312 0.625 0.8438 +0.5312 0.625 0.875 +0.5312 0.625 0.9062 +0.5312 0.625 0.9375 +0.5312 0.625 0.9688 +0.5312 0.625 1 +0.5312 0.6562 0 +0.5312 0.6562 0.03125 +0.5312 0.6562 0.0625 +0.5312 0.6562 0.09375 +0.5312 0.6562 0.125 +0.5312 0.6562 0.1562 +0.5312 0.6562 0.1875 +0.5312 0.6562 0.2188 +0.5312 0.6562 0.25 +0.5312 0.6562 0.2812 +0.5312 0.6562 0.3125 +0.5312 0.6562 0.3438 +0.5312 0.6562 0.375 +0.5312 0.6562 0.4062 +0.5312 0.6562 0.4375 +0.5312 0.6562 0.4688 +0.5312 0.6562 0.5 +0.5312 0.6562 0.5312 +0.5312 0.6562 0.5625 +0.5312 0.6562 0.5938 +0.5312 0.6562 0.625 +0.5312 0.6562 0.6562 +0.5312 0.6562 0.6875 +0.5312 0.6562 0.7188 +0.5312 0.6562 0.75 +0.5312 0.6562 0.7812 +0.5312 0.6562 0.8125 +0.5312 0.6562 0.8438 +0.5312 0.6562 0.875 +0.5312 0.6562 0.9062 +0.5312 0.6562 0.9375 +0.5312 0.6562 0.9688 +0.5312 0.6562 1 +0.5312 0.6875 0 +0.5312 0.6875 0.03125 +0.5312 0.6875 0.0625 +0.5312 0.6875 0.09375 +0.5312 0.6875 0.125 +0.5312 0.6875 0.1562 +0.5312 0.6875 0.1875 +0.5312 0.6875 0.2188 +0.5312 0.6875 0.25 +0.5312 0.6875 0.2812 +0.5312 0.6875 0.3125 +0.5312 0.6875 0.3438 +0.5312 0.6875 0.375 +0.5312 0.6875 0.4062 +0.5312 0.6875 0.4375 +0.5312 0.6875 0.4688 +0.5312 0.6875 0.5 +0.5312 0.6875 0.5312 +0.5312 0.6875 0.5625 +0.5312 0.6875 0.5938 +0.5312 0.6875 0.625 +0.5312 0.6875 0.6562 +0.5312 0.6875 0.6875 +0.5312 0.6875 0.7188 +0.5312 0.6875 0.75 +0.5312 0.6875 0.7812 +0.5312 0.6875 0.8125 +0.5312 0.6875 0.8438 +0.5312 0.6875 0.875 +0.5312 0.6875 0.9062 +0.5312 0.6875 0.9375 +0.5312 0.6875 0.9688 +0.5312 0.6875 1 +0.5312 0.7188 0 +0.5312 0.7188 0.03125 +0.5312 0.7188 0.0625 +0.5312 0.7188 0.09375 +0.5312 0.7188 0.125 +0.5312 0.7188 0.1562 +0.5312 0.7188 0.1875 +0.5312 0.7188 0.2188 +0.5312 0.7188 0.25 +0.5312 0.7188 0.2812 +0.5312 0.7188 0.3125 +0.5312 0.7188 0.3438 +0.5312 0.7188 0.375 +0.5312 0.7188 0.4062 +0.5312 0.7188 0.4375 +0.5312 0.7188 0.4688 +0.5312 0.7188 0.5 +0.5312 0.7188 0.5312 +0.5312 0.7188 0.5625 +0.5312 0.7188 0.5938 +0.5312 0.7188 0.625 +0.5312 0.7188 0.6562 +0.5312 0.7188 0.6875 +0.5312 0.7188 0.7188 +0.5312 0.7188 0.75 +0.5312 0.7188 0.7812 +0.5312 0.7188 0.8125 +0.5312 0.7188 0.8438 +0.5312 0.7188 0.875 +0.5312 0.7188 0.9062 +0.5312 0.7188 0.9375 +0.5312 0.7188 0.9688 +0.5312 0.7188 1 +0.5312 0.75 0 +0.5312 0.75 0.03125 +0.5312 0.75 0.0625 +0.5312 0.75 0.09375 +0.5312 0.75 0.125 +0.5312 0.75 0.1562 +0.5312 0.75 0.1875 +0.5312 0.75 0.2188 +0.5312 0.75 0.25 +0.5312 0.75 0.2812 +0.5312 0.75 0.3125 +0.5312 0.75 0.3438 +0.5312 0.75 0.375 +0.5312 0.75 0.4062 +0.5312 0.75 0.4375 +0.5312 0.75 0.4688 +0.5312 0.75 0.5 +0.5312 0.75 0.5312 +0.5312 0.75 0.5625 +0.5312 0.75 0.5938 +0.5312 0.75 0.625 +0.5312 0.75 0.6562 +0.5312 0.75 0.6875 +0.5312 0.75 0.7188 +0.5312 0.75 0.75 +0.5312 0.75 0.7812 +0.5312 0.75 0.8125 +0.5312 0.75 0.8438 +0.5312 0.75 0.875 +0.5312 0.75 0.9062 +0.5312 0.75 0.9375 +0.5312 0.75 0.9688 +0.5312 0.75 1 +0.5312 0.7812 0 +0.5312 0.7812 0.03125 +0.5312 0.7812 0.0625 +0.5312 0.7812 0.09375 +0.5312 0.7812 0.125 +0.5312 0.7812 0.1562 +0.5312 0.7812 0.1875 +0.5312 0.7812 0.2188 +0.5312 0.7812 0.25 +0.5312 0.7812 0.2812 +0.5312 0.7812 0.3125 +0.5312 0.7812 0.3438 +0.5312 0.7812 0.375 +0.5312 0.7812 0.4062 +0.5312 0.7812 0.4375 +0.5312 0.7812 0.4688 +0.5312 0.7812 0.5 +0.5312 0.7812 0.5312 +0.5312 0.7812 0.5625 +0.5312 0.7812 0.5938 +0.5312 0.7812 0.625 +0.5312 0.7812 0.6562 +0.5312 0.7812 0.6875 +0.5312 0.7812 0.7188 +0.5312 0.7812 0.75 +0.5312 0.7812 0.7812 +0.5312 0.7812 0.8125 +0.5312 0.7812 0.8438 +0.5312 0.7812 0.875 +0.5312 0.7812 0.9062 +0.5312 0.7812 0.9375 +0.5312 0.7812 0.9688 +0.5312 0.7812 1 +0.5312 0.8125 0 +0.5312 0.8125 0.03125 +0.5312 0.8125 0.0625 +0.5312 0.8125 0.09375 +0.5312 0.8125 0.125 +0.5312 0.8125 0.1562 +0.5312 0.8125 0.1875 +0.5312 0.8125 0.2188 +0.5312 0.8125 0.25 +0.5312 0.8125 0.2812 +0.5312 0.8125 0.3125 +0.5312 0.8125 0.3438 +0.5312 0.8125 0.375 +0.5312 0.8125 0.4062 +0.5312 0.8125 0.4375 +0.5312 0.8125 0.4688 +0.5312 0.8125 0.5 +0.5312 0.8125 0.5312 +0.5312 0.8125 0.5625 +0.5312 0.8125 0.5938 +0.5312 0.8125 0.625 +0.5312 0.8125 0.6562 +0.5312 0.8125 0.6875 +0.5312 0.8125 0.7188 +0.5312 0.8125 0.75 +0.5312 0.8125 0.7812 +0.5312 0.8125 0.8125 +0.5312 0.8125 0.8438 +0.5312 0.8125 0.875 +0.5312 0.8125 0.9062 +0.5312 0.8125 0.9375 +0.5312 0.8125 0.9688 +0.5312 0.8125 1 +0.5312 0.8438 0 +0.5312 0.8438 0.03125 +0.5312 0.8438 0.0625 +0.5312 0.8438 0.09375 +0.5312 0.8438 0.125 +0.5312 0.8438 0.1562 +0.5312 0.8438 0.1875 +0.5312 0.8438 0.2188 +0.5312 0.8438 0.25 +0.5312 0.8438 0.2812 +0.5312 0.8438 0.3125 +0.5312 0.8438 0.3438 +0.5312 0.8438 0.375 +0.5312 0.8438 0.4062 +0.5312 0.8438 0.4375 +0.5312 0.8438 0.4688 +0.5312 0.8438 0.5 +0.5312 0.8438 0.5312 +0.5312 0.8438 0.5625 +0.5312 0.8438 0.5938 +0.5312 0.8438 0.625 +0.5312 0.8438 0.6562 +0.5312 0.8438 0.6875 +0.5312 0.8438 0.7188 +0.5312 0.8438 0.75 +0.5312 0.8438 0.7812 +0.5312 0.8438 0.8125 +0.5312 0.8438 0.8438 +0.5312 0.8438 0.875 +0.5312 0.8438 0.9062 +0.5312 0.8438 0.9375 +0.5312 0.8438 0.9688 +0.5312 0.8438 1 +0.5312 0.875 0 +0.5312 0.875 0.03125 +0.5312 0.875 0.0625 +0.5312 0.875 0.09375 +0.5312 0.875 0.125 +0.5312 0.875 0.1562 +0.5312 0.875 0.1875 +0.5312 0.875 0.2188 +0.5312 0.875 0.25 +0.5312 0.875 0.2812 +0.5312 0.875 0.3125 +0.5312 0.875 0.3438 +0.5312 0.875 0.375 +0.5312 0.875 0.4062 +0.5312 0.875 0.4375 +0.5312 0.875 0.4688 +0.5312 0.875 0.5 +0.5312 0.875 0.5312 +0.5312 0.875 0.5625 +0.5312 0.875 0.5938 +0.5312 0.875 0.625 +0.5312 0.875 0.6562 +0.5312 0.875 0.6875 +0.5312 0.875 0.7188 +0.5312 0.875 0.75 +0.5312 0.875 0.7812 +0.5312 0.875 0.8125 +0.5312 0.875 0.8438 +0.5312 0.875 0.875 +0.5312 0.875 0.9062 +0.5312 0.875 0.9375 +0.5312 0.875 0.9688 +0.5312 0.875 1 +0.5312 0.9062 0 +0.5312 0.9062 0.03125 +0.5312 0.9062 0.0625 +0.5312 0.9062 0.09375 +0.5312 0.9062 0.125 +0.5312 0.9062 0.1562 +0.5312 0.9062 0.1875 +0.5312 0.9062 0.2188 +0.5312 0.9062 0.25 +0.5312 0.9062 0.2812 +0.5312 0.9062 0.3125 +0.5312 0.9062 0.3438 +0.5312 0.9062 0.375 +0.5312 0.9062 0.4062 +0.5312 0.9062 0.4375 +0.5312 0.9062 0.4688 +0.5312 0.9062 0.5 +0.5312 0.9062 0.5312 +0.5312 0.9062 0.5625 +0.5312 0.9062 0.5938 +0.5312 0.9062 0.625 +0.5312 0.9062 0.6562 +0.5312 0.9062 0.6875 +0.5312 0.9062 0.7188 +0.5312 0.9062 0.75 +0.5312 0.9062 0.7812 +0.5312 0.9062 0.8125 +0.5312 0.9062 0.8438 +0.5312 0.9062 0.875 +0.5312 0.9062 0.9062 +0.5312 0.9062 0.9375 +0.5312 0.9062 0.9688 +0.5312 0.9062 1 +0.5312 0.9375 0 +0.5312 0.9375 0.03125 +0.5312 0.9375 0.0625 +0.5312 0.9375 0.09375 +0.5312 0.9375 0.125 +0.5312 0.9375 0.1562 +0.5312 0.9375 0.1875 +0.5312 0.9375 0.2188 +0.5312 0.9375 0.25 +0.5312 0.9375 0.2812 +0.5312 0.9375 0.3125 +0.5312 0.9375 0.3438 +0.5312 0.9375 0.375 +0.5312 0.9375 0.4062 +0.5312 0.9375 0.4375 +0.5312 0.9375 0.4688 +0.5312 0.9375 0.5 +0.5312 0.9375 0.5312 +0.5312 0.9375 0.5625 +0.5312 0.9375 0.5938 +0.5312 0.9375 0.625 +0.5312 0.9375 0.6562 +0.5312 0.9375 0.6875 +0.5312 0.9375 0.7188 +0.5312 0.9375 0.75 +0.5312 0.9375 0.7812 +0.5312 0.9375 0.8125 +0.5312 0.9375 0.8438 +0.5312 0.9375 0.875 +0.5312 0.9375 0.9062 +0.5312 0.9375 0.9375 +0.5312 0.9375 0.9688 +0.5312 0.9375 1 +0.5312 0.9688 0 +0.5312 0.9688 0.03125 +0.5312 0.9688 0.0625 +0.5312 0.9688 0.09375 +0.5312 0.9688 0.125 +0.5312 0.9688 0.1562 +0.5312 0.9688 0.1875 +0.5312 0.9688 0.2188 +0.5312 0.9688 0.25 +0.5312 0.9688 0.2812 +0.5312 0.9688 0.3125 +0.5312 0.9688 0.3438 +0.5312 0.9688 0.375 +0.5312 0.9688 0.4062 +0.5312 0.9688 0.4375 +0.5312 0.9688 0.4688 +0.5312 0.9688 0.5 +0.5312 0.9688 0.5312 +0.5312 0.9688 0.5625 +0.5312 0.9688 0.5938 +0.5312 0.9688 0.625 +0.5312 0.9688 0.6562 +0.5312 0.9688 0.6875 +0.5312 0.9688 0.7188 +0.5312 0.9688 0.75 +0.5312 0.9688 0.7812 +0.5312 0.9688 0.8125 +0.5312 0.9688 0.8438 +0.5312 0.9688 0.875 +0.5312 0.9688 0.9062 +0.5312 0.9688 0.9375 +0.5312 0.9688 0.9688 +0.5312 0.9688 1 +0.5312 1 0 +0.5312 1 0.03125 +0.5312 1 0.0625 +0.5312 1 0.09375 +0.5312 1 0.125 +0.5312 1 0.1562 +0.5312 1 0.1875 +0.5312 1 0.2188 +0.5312 1 0.25 +0.5312 1 0.2812 +0.5312 1 0.3125 +0.5312 1 0.3438 +0.5312 1 0.375 +0.5312 1 0.4062 +0.5312 1 0.4375 +0.5312 1 0.4688 +0.5312 1 0.5 +0.5312 1 0.5312 +0.5312 1 0.5625 +0.5312 1 0.5938 +0.5312 1 0.625 +0.5312 1 0.6562 +0.5312 1 0.6875 +0.5312 1 0.7188 +0.5312 1 0.75 +0.5312 1 0.7812 +0.5312 1 0.8125 +0.5312 1 0.8438 +0.5312 1 0.875 +0.5312 1 0.9062 +0.5312 1 0.9375 +0.5312 1 0.9688 +0.5312 1 1 +0.5625 0 0 +0.5625 0 0.03125 +0.5625 0 0.0625 +0.5625 0 0.09375 +0.5625 0 0.125 +0.5625 0 0.1562 +0.5625 0 0.1875 +0.5625 0 0.2188 +0.5625 0 0.25 +0.5625 0 0.2812 +0.5625 0 0.3125 +0.5625 0 0.3438 +0.5625 0 0.375 +0.5625 0 0.4062 +0.5625 0 0.4375 +0.5625 0 0.4688 +0.5625 0 0.5 +0.5625 0 0.5312 +0.5625 0 0.5625 +0.5625 0 0.5938 +0.5625 0 0.625 +0.5625 0 0.6562 +0.5625 0 0.6875 +0.5625 0 0.7188 +0.5625 0 0.75 +0.5625 0 0.7812 +0.5625 0 0.8125 +0.5625 0 0.8438 +0.5625 0 0.875 +0.5625 0 0.9062 +0.5625 0 0.9375 +0.5625 0 0.9688 +0.5625 0 1 +0.5625 0.03125 0 +0.5625 0.03125 0.03125 +0.5625 0.03125 0.0625 +0.5625 0.03125 0.09375 +0.5625 0.03125 0.125 +0.5625 0.03125 0.1562 +0.5625 0.03125 0.1875 +0.5625 0.03125 0.2188 +0.5625 0.03125 0.25 +0.5625 0.03125 0.2812 +0.5625 0.03125 0.3125 +0.5625 0.03125 0.3438 +0.5625 0.03125 0.375 +0.5625 0.03125 0.4062 +0.5625 0.03125 0.4375 +0.5625 0.03125 0.4688 +0.5625 0.03125 0.5 +0.5625 0.03125 0.5312 +0.5625 0.03125 0.5625 +0.5625 0.03125 0.5938 +0.5625 0.03125 0.625 +0.5625 0.03125 0.6562 +0.5625 0.03125 0.6875 +0.5625 0.03125 0.7188 +0.5625 0.03125 0.75 +0.5625 0.03125 0.7812 +0.5625 0.03125 0.8125 +0.5625 0.03125 0.8438 +0.5625 0.03125 0.875 +0.5625 0.03125 0.9062 +0.5625 0.03125 0.9375 +0.5625 0.03125 0.9688 +0.5625 0.03125 1 +0.5625 0.0625 0 +0.5625 0.0625 0.03125 +0.5625 0.0625 0.0625 +0.5625 0.0625 0.09375 +0.5625 0.0625 0.125 +0.5625 0.0625 0.1562 +0.5625 0.0625 0.1875 +0.5625 0.0625 0.2188 +0.5625 0.0625 0.25 +0.5625 0.0625 0.2812 +0.5625 0.0625 0.3125 +0.5625 0.0625 0.3438 +0.5625 0.0625 0.375 +0.5625 0.0625 0.4062 +0.5625 0.0625 0.4375 +0.5625 0.0625 0.4688 +0.5625 0.0625 0.5 +0.5625 0.0625 0.5312 +0.5625 0.0625 0.5625 +0.5625 0.0625 0.5938 +0.5625 0.0625 0.625 +0.5625 0.0625 0.6562 +0.5625 0.0625 0.6875 +0.5625 0.0625 0.7188 +0.5625 0.0625 0.75 +0.5625 0.0625 0.7812 +0.5625 0.0625 0.8125 +0.5625 0.0625 0.8438 +0.5625 0.0625 0.875 +0.5625 0.0625 0.9062 +0.5625 0.0625 0.9375 +0.5625 0.0625 0.9688 +0.5625 0.0625 1 +0.5625 0.09375 0 +0.5625 0.09375 0.03125 +0.5625 0.09375 0.0625 +0.5625 0.09375 0.09375 +0.5625 0.09375 0.125 +0.5625 0.09375 0.1562 +0.5625 0.09375 0.1875 +0.5625 0.09375 0.2188 +0.5625 0.09375 0.25 +0.5625 0.09375 0.2812 +0.5625 0.09375 0.3125 +0.5625 0.09375 0.3438 +0.5625 0.09375 0.375 +0.5625 0.09375 0.4062 +0.5625 0.09375 0.4375 +0.5625 0.09375 0.4688 +0.5625 0.09375 0.5 +0.5625 0.09375 0.5312 +0.5625 0.09375 0.5625 +0.5625 0.09375 0.5938 +0.5625 0.09375 0.625 +0.5625 0.09375 0.6562 +0.5625 0.09375 0.6875 +0.5625 0.09375 0.7188 +0.5625 0.09375 0.75 +0.5625 0.09375 0.7812 +0.5625 0.09375 0.8125 +0.5625 0.09375 0.8438 +0.5625 0.09375 0.875 +0.5625 0.09375 0.9062 +0.5625 0.09375 0.9375 +0.5625 0.09375 0.9688 +0.5625 0.09375 1 +0.5625 0.125 0 +0.5625 0.125 0.03125 +0.5625 0.125 0.0625 +0.5625 0.125 0.09375 +0.5625 0.125 0.125 +0.5625 0.125 0.1562 +0.5625 0.125 0.1875 +0.5625 0.125 0.2188 +0.5625 0.125 0.25 +0.5625 0.125 0.2812 +0.5625 0.125 0.3125 +0.5625 0.125 0.3438 +0.5625 0.125 0.375 +0.5625 0.125 0.4062 +0.5625 0.125 0.4375 +0.5625 0.125 0.4688 +0.5625 0.125 0.5 +0.5625 0.125 0.5312 +0.5625 0.125 0.5625 +0.5625 0.125 0.5938 +0.5625 0.125 0.625 +0.5625 0.125 0.6562 +0.5625 0.125 0.6875 +0.5625 0.125 0.7188 +0.5625 0.125 0.75 +0.5625 0.125 0.7812 +0.5625 0.125 0.8125 +0.5625 0.125 0.8438 +0.5625 0.125 0.875 +0.5625 0.125 0.9062 +0.5625 0.125 0.9375 +0.5625 0.125 0.9688 +0.5625 0.125 1 +0.5625 0.1562 0 +0.5625 0.1562 0.03125 +0.5625 0.1562 0.0625 +0.5625 0.1562 0.09375 +0.5625 0.1562 0.125 +0.5625 0.1562 0.1562 +0.5625 0.1562 0.1875 +0.5625 0.1562 0.2188 +0.5625 0.1562 0.25 +0.5625 0.1562 0.2812 +0.5625 0.1562 0.3125 +0.5625 0.1562 0.3438 +0.5625 0.1562 0.375 +0.5625 0.1562 0.4062 +0.5625 0.1562 0.4375 +0.5625 0.1562 0.4688 +0.5625 0.1562 0.5 +0.5625 0.1562 0.5312 +0.5625 0.1562 0.5625 +0.5625 0.1562 0.5938 +0.5625 0.1562 0.625 +0.5625 0.1562 0.6562 +0.5625 0.1562 0.6875 +0.5625 0.1562 0.7188 +0.5625 0.1562 0.75 +0.5625 0.1562 0.7812 +0.5625 0.1562 0.8125 +0.5625 0.1562 0.8438 +0.5625 0.1562 0.875 +0.5625 0.1562 0.9062 +0.5625 0.1562 0.9375 +0.5625 0.1562 0.9688 +0.5625 0.1562 1 +0.5625 0.1875 0 +0.5625 0.1875 0.03125 +0.5625 0.1875 0.0625 +0.5625 0.1875 0.09375 +0.5625 0.1875 0.125 +0.5625 0.1875 0.1562 +0.5625 0.1875 0.1875 +0.5625 0.1875 0.2188 +0.5625 0.1875 0.25 +0.5625 0.1875 0.2812 +0.5625 0.1875 0.3125 +0.5625 0.1875 0.3438 +0.5625 0.1875 0.375 +0.5625 0.1875 0.4062 +0.5625 0.1875 0.4375 +0.5625 0.1875 0.4688 +0.5625 0.1875 0.5 +0.5625 0.1875 0.5312 +0.5625 0.1875 0.5625 +0.5625 0.1875 0.5938 +0.5625 0.1875 0.625 +0.5625 0.1875 0.6562 +0.5625 0.1875 0.6875 +0.5625 0.1875 0.7188 +0.5625 0.1875 0.75 +0.5625 0.1875 0.7812 +0.5625 0.1875 0.8125 +0.5625 0.1875 0.8438 +0.5625 0.1875 0.875 +0.5625 0.1875 0.9062 +0.5625 0.1875 0.9375 +0.5625 0.1875 0.9688 +0.5625 0.1875 1 +0.5625 0.2188 0 +0.5625 0.2188 0.03125 +0.5625 0.2188 0.0625 +0.5625 0.2188 0.09375 +0.5625 0.2188 0.125 +0.5625 0.2188 0.1562 +0.5625 0.2188 0.1875 +0.5625 0.2188 0.2188 +0.5625 0.2188 0.25 +0.5625 0.2188 0.2812 +0.5625 0.2188 0.3125 +0.5625 0.2188 0.3438 +0.5625 0.2188 0.375 +0.5625 0.2188 0.4062 +0.5625 0.2188 0.4375 +0.5625 0.2188 0.4688 +0.5625 0.2188 0.5 +0.5625 0.2188 0.5312 +0.5625 0.2188 0.5625 +0.5625 0.2188 0.5938 +0.5625 0.2188 0.625 +0.5625 0.2188 0.6562 +0.5625 0.2188 0.6875 +0.5625 0.2188 0.7188 +0.5625 0.2188 0.75 +0.5625 0.2188 0.7812 +0.5625 0.2188 0.8125 +0.5625 0.2188 0.8438 +0.5625 0.2188 0.875 +0.5625 0.2188 0.9062 +0.5625 0.2188 0.9375 +0.5625 0.2188 0.9688 +0.5625 0.2188 1 +0.5625 0.25 0 +0.5625 0.25 0.03125 +0.5625 0.25 0.0625 +0.5625 0.25 0.09375 +0.5625 0.25 0.125 +0.5625 0.25 0.1562 +0.5625 0.25 0.1875 +0.5625 0.25 0.2188 +0.5625 0.25 0.25 +0.5625 0.25 0.2812 +0.5625 0.25 0.3125 +0.5625 0.25 0.3438 +0.5625 0.25 0.375 +0.5625 0.25 0.4062 +0.5625 0.25 0.4375 +0.5625 0.25 0.4688 +0.5625 0.25 0.5 +0.5625 0.25 0.5312 +0.5625 0.25 0.5625 +0.5625 0.25 0.5938 +0.5625 0.25 0.625 +0.5625 0.25 0.6562 +0.5625 0.25 0.6875 +0.5625 0.25 0.7188 +0.5625 0.25 0.75 +0.5625 0.25 0.7812 +0.5625 0.25 0.8125 +0.5625 0.25 0.8438 +0.5625 0.25 0.875 +0.5625 0.25 0.9062 +0.5625 0.25 0.9375 +0.5625 0.25 0.9688 +0.5625 0.25 1 +0.5625 0.2812 0 +0.5625 0.2812 0.03125 +0.5625 0.2812 0.0625 +0.5625 0.2812 0.09375 +0.5625 0.2812 0.125 +0.5625 0.2812 0.1562 +0.5625 0.2812 0.1875 +0.5625 0.2812 0.2188 +0.5625 0.2812 0.25 +0.5625 0.2812 0.2812 +0.5625 0.2812 0.3125 +0.5625 0.2812 0.3438 +0.5625 0.2812 0.375 +0.5625 0.2812 0.4062 +0.5625 0.2812 0.4375 +0.5625 0.2812 0.4688 +0.5625 0.2812 0.5 +0.5625 0.2812 0.5312 +0.5625 0.2812 0.5625 +0.5625 0.2812 0.5938 +0.5625 0.2812 0.625 +0.5625 0.2812 0.6562 +0.5625 0.2812 0.6875 +0.5625 0.2812 0.7188 +0.5625 0.2812 0.75 +0.5625 0.2812 0.7812 +0.5625 0.2812 0.8125 +0.5625 0.2812 0.8438 +0.5625 0.2812 0.875 +0.5625 0.2812 0.9062 +0.5625 0.2812 0.9375 +0.5625 0.2812 0.9688 +0.5625 0.2812 1 +0.5625 0.3125 0 +0.5625 0.3125 0.03125 +0.5625 0.3125 0.0625 +0.5625 0.3125 0.09375 +0.5625 0.3125 0.125 +0.5625 0.3125 0.1562 +0.5625 0.3125 0.1875 +0.5625 0.3125 0.2188 +0.5625 0.3125 0.25 +0.5625 0.3125 0.2812 +0.5625 0.3125 0.3125 +0.5625 0.3125 0.3438 +0.5625 0.3125 0.375 +0.5625 0.3125 0.4062 +0.5625 0.3125 0.4375 +0.5625 0.3125 0.4688 +0.5625 0.3125 0.5 +0.5625 0.3125 0.5312 +0.5625 0.3125 0.5625 +0.5625 0.3125 0.5938 +0.5625 0.3125 0.625 +0.5625 0.3125 0.6562 +0.5625 0.3125 0.6875 +0.5625 0.3125 0.7188 +0.5625 0.3125 0.75 +0.5625 0.3125 0.7812 +0.5625 0.3125 0.8125 +0.5625 0.3125 0.8438 +0.5625 0.3125 0.875 +0.5625 0.3125 0.9062 +0.5625 0.3125 0.9375 +0.5625 0.3125 0.9688 +0.5625 0.3125 1 +0.5625 0.3438 0 +0.5625 0.3438 0.03125 +0.5625 0.3438 0.0625 +0.5625 0.3438 0.09375 +0.5625 0.3438 0.125 +0.5625 0.3438 0.1562 +0.5625 0.3438 0.1875 +0.5625 0.3438 0.2188 +0.5625 0.3438 0.25 +0.5625 0.3438 0.2812 +0.5625 0.3438 0.3125 +0.5625 0.3438 0.3438 +0.5625 0.3438 0.375 +0.5625 0.3438 0.4062 +0.5625 0.3438 0.4375 +0.5625 0.3438 0.4688 +0.5625 0.3438 0.5 +0.5625 0.3438 0.5312 +0.5625 0.3438 0.5625 +0.5625 0.3438 0.5938 +0.5625 0.3438 0.625 +0.5625 0.3438 0.6562 +0.5625 0.3438 0.6875 +0.5625 0.3438 0.7188 +0.5625 0.3438 0.75 +0.5625 0.3438 0.7812 +0.5625 0.3438 0.8125 +0.5625 0.3438 0.8438 +0.5625 0.3438 0.875 +0.5625 0.3438 0.9062 +0.5625 0.3438 0.9375 +0.5625 0.3438 0.9688 +0.5625 0.3438 1 +0.5625 0.375 0 +0.5625 0.375 0.03125 +0.5625 0.375 0.0625 +0.5625 0.375 0.09375 +0.5625 0.375 0.125 +0.5625 0.375 0.1562 +0.5625 0.375 0.1875 +0.5625 0.375 0.2188 +0.5625 0.375 0.25 +0.5625 0.375 0.2812 +0.5625 0.375 0.3125 +0.5625 0.375 0.3438 +0.5625 0.375 0.375 +0.5625 0.375 0.4062 +0.5625 0.375 0.4375 +0.5625 0.375 0.4688 +0.5625 0.375 0.5 +0.5625 0.375 0.5312 +0.5625 0.375 0.5625 +0.5625 0.375 0.5938 +0.5625 0.375 0.625 +0.5625 0.375 0.6562 +0.5625 0.375 0.6875 +0.5625 0.375 0.7188 +0.5625 0.375 0.75 +0.5625 0.375 0.7812 +0.5625 0.375 0.8125 +0.5625 0.375 0.8438 +0.5625 0.375 0.875 +0.5625 0.375 0.9062 +0.5625 0.375 0.9375 +0.5625 0.375 0.9688 +0.5625 0.375 1 +0.5625 0.4062 0 +0.5625 0.4062 0.03125 +0.5625 0.4062 0.0625 +0.5625 0.4062 0.09375 +0.5625 0.4062 0.125 +0.5625 0.4062 0.1562 +0.5625 0.4062 0.1875 +0.5625 0.4062 0.2188 +0.5625 0.4062 0.25 +0.5625 0.4062 0.2812 +0.5625 0.4062 0.3125 +0.5625 0.4062 0.3438 +0.5625 0.4062 0.375 +0.5625 0.4062 0.4062 +0.5625 0.4062 0.4375 +0.5625 0.4062 0.4688 +0.5625 0.4062 0.5 +0.5625 0.4062 0.5312 +0.5625 0.4062 0.5625 +0.5625 0.4062 0.5938 +0.5625 0.4062 0.625 +0.5625 0.4062 0.6562 +0.5625 0.4062 0.6875 +0.5625 0.4062 0.7188 +0.5625 0.4062 0.75 +0.5625 0.4062 0.7812 +0.5625 0.4062 0.8125 +0.5625 0.4062 0.8438 +0.5625 0.4062 0.875 +0.5625 0.4062 0.9062 +0.5625 0.4062 0.9375 +0.5625 0.4062 0.9688 +0.5625 0.4062 1 +0.5625 0.4375 0 +0.5625 0.4375 0.03125 +0.5625 0.4375 0.0625 +0.5625 0.4375 0.09375 +0.5625 0.4375 0.125 +0.5625 0.4375 0.1562 +0.5625 0.4375 0.1875 +0.5625 0.4375 0.2188 +0.5625 0.4375 0.25 +0.5625 0.4375 0.2812 +0.5625 0.4375 0.3125 +0.5625 0.4375 0.3438 +0.5625 0.4375 0.375 +0.5625 0.4375 0.4062 +0.5625 0.4375 0.4375 +0.5625 0.4375 0.4688 +0.5625 0.4375 0.5 +0.5625 0.4375 0.5312 +0.5625 0.4375 0.5625 +0.5625 0.4375 0.5938 +0.5625 0.4375 0.625 +0.5625 0.4375 0.6562 +0.5625 0.4375 0.6875 +0.5625 0.4375 0.7188 +0.5625 0.4375 0.75 +0.5625 0.4375 0.7812 +0.5625 0.4375 0.8125 +0.5625 0.4375 0.8438 +0.5625 0.4375 0.875 +0.5625 0.4375 0.9062 +0.5625 0.4375 0.9375 +0.5625 0.4375 0.9688 +0.5625 0.4375 1 +0.5625 0.4688 0 +0.5625 0.4688 0.03125 +0.5625 0.4688 0.0625 +0.5625 0.4688 0.09375 +0.5625 0.4688 0.125 +0.5625 0.4688 0.1562 +0.5625 0.4688 0.1875 +0.5625 0.4688 0.2188 +0.5625 0.4688 0.25 +0.5625 0.4688 0.2812 +0.5625 0.4688 0.3125 +0.5625 0.4688 0.3438 +0.5625 0.4688 0.375 +0.5625 0.4688 0.4062 +0.5625 0.4688 0.4375 +0.5625 0.4688 0.4688 +0.5625 0.4688 0.5 +0.5625 0.4688 0.5312 +0.5625 0.4688 0.5625 +0.5625 0.4688 0.5938 +0.5625 0.4688 0.625 +0.5625 0.4688 0.6562 +0.5625 0.4688 0.6875 +0.5625 0.4688 0.7188 +0.5625 0.4688 0.75 +0.5625 0.4688 0.7812 +0.5625 0.4688 0.8125 +0.5625 0.4688 0.8438 +0.5625 0.4688 0.875 +0.5625 0.4688 0.9062 +0.5625 0.4688 0.9375 +0.5625 0.4688 0.9688 +0.5625 0.4688 1 +0.5625 0.5 0 +0.5625 0.5 0.03125 +0.5625 0.5 0.0625 +0.5625 0.5 0.09375 +0.5625 0.5 0.125 +0.5625 0.5 0.1562 +0.5625 0.5 0.1875 +0.5625 0.5 0.2188 +0.5625 0.5 0.25 +0.5625 0.5 0.2812 +0.5625 0.5 0.3125 +0.5625 0.5 0.3438 +0.5625 0.5 0.375 +0.5625 0.5 0.4062 +0.5625 0.5 0.4375 +0.5625 0.5 0.4688 +0.5625 0.5 0.5 +0.5625 0.5 0.5312 +0.5625 0.5 0.5625 +0.5625 0.5 0.5938 +0.5625 0.5 0.625 +0.5625 0.5 0.6562 +0.5625 0.5 0.6875 +0.5625 0.5 0.7188 +0.5625 0.5 0.75 +0.5625 0.5 0.7812 +0.5625 0.5 0.8125 +0.5625 0.5 0.8438 +0.5625 0.5 0.875 +0.5625 0.5 0.9062 +0.5625 0.5 0.9375 +0.5625 0.5 0.9688 +0.5625 0.5 1 +0.5625 0.5312 0 +0.5625 0.5312 0.03125 +0.5625 0.5312 0.0625 +0.5625 0.5312 0.09375 +0.5625 0.5312 0.125 +0.5625 0.5312 0.1562 +0.5625 0.5312 0.1875 +0.5625 0.5312 0.2188 +0.5625 0.5312 0.25 +0.5625 0.5312 0.2812 +0.5625 0.5312 0.3125 +0.5625 0.5312 0.3438 +0.5625 0.5312 0.375 +0.5625 0.5312 0.4062 +0.5625 0.5312 0.4375 +0.5625 0.5312 0.4688 +0.5625 0.5312 0.5 +0.5625 0.5312 0.5312 +0.5625 0.5312 0.5625 +0.5625 0.5312 0.5938 +0.5625 0.5312 0.625 +0.5625 0.5312 0.6562 +0.5625 0.5312 0.6875 +0.5625 0.5312 0.7188 +0.5625 0.5312 0.75 +0.5625 0.5312 0.7812 +0.5625 0.5312 0.8125 +0.5625 0.5312 0.8438 +0.5625 0.5312 0.875 +0.5625 0.5312 0.9062 +0.5625 0.5312 0.9375 +0.5625 0.5312 0.9688 +0.5625 0.5312 1 +0.5625 0.5625 0 +0.5625 0.5625 0.03125 +0.5625 0.5625 0.0625 +0.5625 0.5625 0.09375 +0.5625 0.5625 0.125 +0.5625 0.5625 0.1562 +0.5625 0.5625 0.1875 +0.5625 0.5625 0.2188 +0.5625 0.5625 0.25 +0.5625 0.5625 0.2812 +0.5625 0.5625 0.3125 +0.5625 0.5625 0.3438 +0.5625 0.5625 0.375 +0.5625 0.5625 0.4062 +0.5625 0.5625 0.4375 +0.5625 0.5625 0.4688 +0.5625 0.5625 0.5 +0.5625 0.5625 0.5312 +0.5625 0.5625 0.5625 +0.5625 0.5625 0.5938 +0.5625 0.5625 0.625 +0.5625 0.5625 0.6562 +0.5625 0.5625 0.6875 +0.5625 0.5625 0.7188 +0.5625 0.5625 0.75 +0.5625 0.5625 0.7812 +0.5625 0.5625 0.8125 +0.5625 0.5625 0.8438 +0.5625 0.5625 0.875 +0.5625 0.5625 0.9062 +0.5625 0.5625 0.9375 +0.5625 0.5625 0.9688 +0.5625 0.5625 1 +0.5625 0.5938 0 +0.5625 0.5938 0.03125 +0.5625 0.5938 0.0625 +0.5625 0.5938 0.09375 +0.5625 0.5938 0.125 +0.5625 0.5938 0.1562 +0.5625 0.5938 0.1875 +0.5625 0.5938 0.2188 +0.5625 0.5938 0.25 +0.5625 0.5938 0.2812 +0.5625 0.5938 0.3125 +0.5625 0.5938 0.3438 +0.5625 0.5938 0.375 +0.5625 0.5938 0.4062 +0.5625 0.5938 0.4375 +0.5625 0.5938 0.4688 +0.5625 0.5938 0.5 +0.5625 0.5938 0.5312 +0.5625 0.5938 0.5625 +0.5625 0.5938 0.5938 +0.5625 0.5938 0.625 +0.5625 0.5938 0.6562 +0.5625 0.5938 0.6875 +0.5625 0.5938 0.7188 +0.5625 0.5938 0.75 +0.5625 0.5938 0.7812 +0.5625 0.5938 0.8125 +0.5625 0.5938 0.8438 +0.5625 0.5938 0.875 +0.5625 0.5938 0.9062 +0.5625 0.5938 0.9375 +0.5625 0.5938 0.9688 +0.5625 0.5938 1 +0.5625 0.625 0 +0.5625 0.625 0.03125 +0.5625 0.625 0.0625 +0.5625 0.625 0.09375 +0.5625 0.625 0.125 +0.5625 0.625 0.1562 +0.5625 0.625 0.1875 +0.5625 0.625 0.2188 +0.5625 0.625 0.25 +0.5625 0.625 0.2812 +0.5625 0.625 0.3125 +0.5625 0.625 0.3438 +0.5625 0.625 0.375 +0.5625 0.625 0.4062 +0.5625 0.625 0.4375 +0.5625 0.625 0.4688 +0.5625 0.625 0.5 +0.5625 0.625 0.5312 +0.5625 0.625 0.5625 +0.5625 0.625 0.5938 +0.5625 0.625 0.625 +0.5625 0.625 0.6562 +0.5625 0.625 0.6875 +0.5625 0.625 0.7188 +0.5625 0.625 0.75 +0.5625 0.625 0.7812 +0.5625 0.625 0.8125 +0.5625 0.625 0.8438 +0.5625 0.625 0.875 +0.5625 0.625 0.9062 +0.5625 0.625 0.9375 +0.5625 0.625 0.9688 +0.5625 0.625 1 +0.5625 0.6562 0 +0.5625 0.6562 0.03125 +0.5625 0.6562 0.0625 +0.5625 0.6562 0.09375 +0.5625 0.6562 0.125 +0.5625 0.6562 0.1562 +0.5625 0.6562 0.1875 +0.5625 0.6562 0.2188 +0.5625 0.6562 0.25 +0.5625 0.6562 0.2812 +0.5625 0.6562 0.3125 +0.5625 0.6562 0.3438 +0.5625 0.6562 0.375 +0.5625 0.6562 0.4062 +0.5625 0.6562 0.4375 +0.5625 0.6562 0.4688 +0.5625 0.6562 0.5 +0.5625 0.6562 0.5312 +0.5625 0.6562 0.5625 +0.5625 0.6562 0.5938 +0.5625 0.6562 0.625 +0.5625 0.6562 0.6562 +0.5625 0.6562 0.6875 +0.5625 0.6562 0.7188 +0.5625 0.6562 0.75 +0.5625 0.6562 0.7812 +0.5625 0.6562 0.8125 +0.5625 0.6562 0.8438 +0.5625 0.6562 0.875 +0.5625 0.6562 0.9062 +0.5625 0.6562 0.9375 +0.5625 0.6562 0.9688 +0.5625 0.6562 1 +0.5625 0.6875 0 +0.5625 0.6875 0.03125 +0.5625 0.6875 0.0625 +0.5625 0.6875 0.09375 +0.5625 0.6875 0.125 +0.5625 0.6875 0.1562 +0.5625 0.6875 0.1875 +0.5625 0.6875 0.2188 +0.5625 0.6875 0.25 +0.5625 0.6875 0.2812 +0.5625 0.6875 0.3125 +0.5625 0.6875 0.3438 +0.5625 0.6875 0.375 +0.5625 0.6875 0.4062 +0.5625 0.6875 0.4375 +0.5625 0.6875 0.4688 +0.5625 0.6875 0.5 +0.5625 0.6875 0.5312 +0.5625 0.6875 0.5625 +0.5625 0.6875 0.5938 +0.5625 0.6875 0.625 +0.5625 0.6875 0.6562 +0.5625 0.6875 0.6875 +0.5625 0.6875 0.7188 +0.5625 0.6875 0.75 +0.5625 0.6875 0.7812 +0.5625 0.6875 0.8125 +0.5625 0.6875 0.8438 +0.5625 0.6875 0.875 +0.5625 0.6875 0.9062 +0.5625 0.6875 0.9375 +0.5625 0.6875 0.9688 +0.5625 0.6875 1 +0.5625 0.7188 0 +0.5625 0.7188 0.03125 +0.5625 0.7188 0.0625 +0.5625 0.7188 0.09375 +0.5625 0.7188 0.125 +0.5625 0.7188 0.1562 +0.5625 0.7188 0.1875 +0.5625 0.7188 0.2188 +0.5625 0.7188 0.25 +0.5625 0.7188 0.2812 +0.5625 0.7188 0.3125 +0.5625 0.7188 0.3438 +0.5625 0.7188 0.375 +0.5625 0.7188 0.4062 +0.5625 0.7188 0.4375 +0.5625 0.7188 0.4688 +0.5625 0.7188 0.5 +0.5625 0.7188 0.5312 +0.5625 0.7188 0.5625 +0.5625 0.7188 0.5938 +0.5625 0.7188 0.625 +0.5625 0.7188 0.6562 +0.5625 0.7188 0.6875 +0.5625 0.7188 0.7188 +0.5625 0.7188 0.75 +0.5625 0.7188 0.7812 +0.5625 0.7188 0.8125 +0.5625 0.7188 0.8438 +0.5625 0.7188 0.875 +0.5625 0.7188 0.9062 +0.5625 0.7188 0.9375 +0.5625 0.7188 0.9688 +0.5625 0.7188 1 +0.5625 0.75 0 +0.5625 0.75 0.03125 +0.5625 0.75 0.0625 +0.5625 0.75 0.09375 +0.5625 0.75 0.125 +0.5625 0.75 0.1562 +0.5625 0.75 0.1875 +0.5625 0.75 0.2188 +0.5625 0.75 0.25 +0.5625 0.75 0.2812 +0.5625 0.75 0.3125 +0.5625 0.75 0.3438 +0.5625 0.75 0.375 +0.5625 0.75 0.4062 +0.5625 0.75 0.4375 +0.5625 0.75 0.4688 +0.5625 0.75 0.5 +0.5625 0.75 0.5312 +0.5625 0.75 0.5625 +0.5625 0.75 0.5938 +0.5625 0.75 0.625 +0.5625 0.75 0.6562 +0.5625 0.75 0.6875 +0.5625 0.75 0.7188 +0.5625 0.75 0.75 +0.5625 0.75 0.7812 +0.5625 0.75 0.8125 +0.5625 0.75 0.8438 +0.5625 0.75 0.875 +0.5625 0.75 0.9062 +0.5625 0.75 0.9375 +0.5625 0.75 0.9688 +0.5625 0.75 1 +0.5625 0.7812 0 +0.5625 0.7812 0.03125 +0.5625 0.7812 0.0625 +0.5625 0.7812 0.09375 +0.5625 0.7812 0.125 +0.5625 0.7812 0.1562 +0.5625 0.7812 0.1875 +0.5625 0.7812 0.2188 +0.5625 0.7812 0.25 +0.5625 0.7812 0.2812 +0.5625 0.7812 0.3125 +0.5625 0.7812 0.3438 +0.5625 0.7812 0.375 +0.5625 0.7812 0.4062 +0.5625 0.7812 0.4375 +0.5625 0.7812 0.4688 +0.5625 0.7812 0.5 +0.5625 0.7812 0.5312 +0.5625 0.7812 0.5625 +0.5625 0.7812 0.5938 +0.5625 0.7812 0.625 +0.5625 0.7812 0.6562 +0.5625 0.7812 0.6875 +0.5625 0.7812 0.7188 +0.5625 0.7812 0.75 +0.5625 0.7812 0.7812 +0.5625 0.7812 0.8125 +0.5625 0.7812 0.8438 +0.5625 0.7812 0.875 +0.5625 0.7812 0.9062 +0.5625 0.7812 0.9375 +0.5625 0.7812 0.9688 +0.5625 0.7812 1 +0.5625 0.8125 0 +0.5625 0.8125 0.03125 +0.5625 0.8125 0.0625 +0.5625 0.8125 0.09375 +0.5625 0.8125 0.125 +0.5625 0.8125 0.1562 +0.5625 0.8125 0.1875 +0.5625 0.8125 0.2188 +0.5625 0.8125 0.25 +0.5625 0.8125 0.2812 +0.5625 0.8125 0.3125 +0.5625 0.8125 0.3438 +0.5625 0.8125 0.375 +0.5625 0.8125 0.4062 +0.5625 0.8125 0.4375 +0.5625 0.8125 0.4688 +0.5625 0.8125 0.5 +0.5625 0.8125 0.5312 +0.5625 0.8125 0.5625 +0.5625 0.8125 0.5938 +0.5625 0.8125 0.625 +0.5625 0.8125 0.6562 +0.5625 0.8125 0.6875 +0.5625 0.8125 0.7188 +0.5625 0.8125 0.75 +0.5625 0.8125 0.7812 +0.5625 0.8125 0.8125 +0.5625 0.8125 0.8438 +0.5625 0.8125 0.875 +0.5625 0.8125 0.9062 +0.5625 0.8125 0.9375 +0.5625 0.8125 0.9688 +0.5625 0.8125 1 +0.5625 0.8438 0 +0.5625 0.8438 0.03125 +0.5625 0.8438 0.0625 +0.5625 0.8438 0.09375 +0.5625 0.8438 0.125 +0.5625 0.8438 0.1562 +0.5625 0.8438 0.1875 +0.5625 0.8438 0.2188 +0.5625 0.8438 0.25 +0.5625 0.8438 0.2812 +0.5625 0.8438 0.3125 +0.5625 0.8438 0.3438 +0.5625 0.8438 0.375 +0.5625 0.8438 0.4062 +0.5625 0.8438 0.4375 +0.5625 0.8438 0.4688 +0.5625 0.8438 0.5 +0.5625 0.8438 0.5312 +0.5625 0.8438 0.5625 +0.5625 0.8438 0.5938 +0.5625 0.8438 0.625 +0.5625 0.8438 0.6562 +0.5625 0.8438 0.6875 +0.5625 0.8438 0.7188 +0.5625 0.8438 0.75 +0.5625 0.8438 0.7812 +0.5625 0.8438 0.8125 +0.5625 0.8438 0.8438 +0.5625 0.8438 0.875 +0.5625 0.8438 0.9062 +0.5625 0.8438 0.9375 +0.5625 0.8438 0.9688 +0.5625 0.8438 1 +0.5625 0.875 0 +0.5625 0.875 0.03125 +0.5625 0.875 0.0625 +0.5625 0.875 0.09375 +0.5625 0.875 0.125 +0.5625 0.875 0.1562 +0.5625 0.875 0.1875 +0.5625 0.875 0.2188 +0.5625 0.875 0.25 +0.5625 0.875 0.2812 +0.5625 0.875 0.3125 +0.5625 0.875 0.3438 +0.5625 0.875 0.375 +0.5625 0.875 0.4062 +0.5625 0.875 0.4375 +0.5625 0.875 0.4688 +0.5625 0.875 0.5 +0.5625 0.875 0.5312 +0.5625 0.875 0.5625 +0.5625 0.875 0.5938 +0.5625 0.875 0.625 +0.5625 0.875 0.6562 +0.5625 0.875 0.6875 +0.5625 0.875 0.7188 +0.5625 0.875 0.75 +0.5625 0.875 0.7812 +0.5625 0.875 0.8125 +0.5625 0.875 0.8438 +0.5625 0.875 0.875 +0.5625 0.875 0.9062 +0.5625 0.875 0.9375 +0.5625 0.875 0.9688 +0.5625 0.875 1 +0.5625 0.9062 0 +0.5625 0.9062 0.03125 +0.5625 0.9062 0.0625 +0.5625 0.9062 0.09375 +0.5625 0.9062 0.125 +0.5625 0.9062 0.1562 +0.5625 0.9062 0.1875 +0.5625 0.9062 0.2188 +0.5625 0.9062 0.25 +0.5625 0.9062 0.2812 +0.5625 0.9062 0.3125 +0.5625 0.9062 0.3438 +0.5625 0.9062 0.375 +0.5625 0.9062 0.4062 +0.5625 0.9062 0.4375 +0.5625 0.9062 0.4688 +0.5625 0.9062 0.5 +0.5625 0.9062 0.5312 +0.5625 0.9062 0.5625 +0.5625 0.9062 0.5938 +0.5625 0.9062 0.625 +0.5625 0.9062 0.6562 +0.5625 0.9062 0.6875 +0.5625 0.9062 0.7188 +0.5625 0.9062 0.75 +0.5625 0.9062 0.7812 +0.5625 0.9062 0.8125 +0.5625 0.9062 0.8438 +0.5625 0.9062 0.875 +0.5625 0.9062 0.9062 +0.5625 0.9062 0.9375 +0.5625 0.9062 0.9688 +0.5625 0.9062 1 +0.5625 0.9375 0 +0.5625 0.9375 0.03125 +0.5625 0.9375 0.0625 +0.5625 0.9375 0.09375 +0.5625 0.9375 0.125 +0.5625 0.9375 0.1562 +0.5625 0.9375 0.1875 +0.5625 0.9375 0.2188 +0.5625 0.9375 0.25 +0.5625 0.9375 0.2812 +0.5625 0.9375 0.3125 +0.5625 0.9375 0.3438 +0.5625 0.9375 0.375 +0.5625 0.9375 0.4062 +0.5625 0.9375 0.4375 +0.5625 0.9375 0.4688 +0.5625 0.9375 0.5 +0.5625 0.9375 0.5312 +0.5625 0.9375 0.5625 +0.5625 0.9375 0.5938 +0.5625 0.9375 0.625 +0.5625 0.9375 0.6562 +0.5625 0.9375 0.6875 +0.5625 0.9375 0.7188 +0.5625 0.9375 0.75 +0.5625 0.9375 0.7812 +0.5625 0.9375 0.8125 +0.5625 0.9375 0.8438 +0.5625 0.9375 0.875 +0.5625 0.9375 0.9062 +0.5625 0.9375 0.9375 +0.5625 0.9375 0.9688 +0.5625 0.9375 1 +0.5625 0.9688 0 +0.5625 0.9688 0.03125 +0.5625 0.9688 0.0625 +0.5625 0.9688 0.09375 +0.5625 0.9688 0.125 +0.5625 0.9688 0.1562 +0.5625 0.9688 0.1875 +0.5625 0.9688 0.2188 +0.5625 0.9688 0.25 +0.5625 0.9688 0.2812 +0.5625 0.9688 0.3125 +0.5625 0.9688 0.3438 +0.5625 0.9688 0.375 +0.5625 0.9688 0.4062 +0.5625 0.9688 0.4375 +0.5625 0.9688 0.4688 +0.5625 0.9688 0.5 +0.5625 0.9688 0.5312 +0.5625 0.9688 0.5625 +0.5625 0.9688 0.5938 +0.5625 0.9688 0.625 +0.5625 0.9688 0.6562 +0.5625 0.9688 0.6875 +0.5625 0.9688 0.7188 +0.5625 0.9688 0.75 +0.5625 0.9688 0.7812 +0.5625 0.9688 0.8125 +0.5625 0.9688 0.8438 +0.5625 0.9688 0.875 +0.5625 0.9688 0.9062 +0.5625 0.9688 0.9375 +0.5625 0.9688 0.9688 +0.5625 0.9688 1 +0.5625 1 0 +0.5625 1 0.03125 +0.5625 1 0.0625 +0.5625 1 0.09375 +0.5625 1 0.125 +0.5625 1 0.1562 +0.5625 1 0.1875 +0.5625 1 0.2188 +0.5625 1 0.25 +0.5625 1 0.2812 +0.5625 1 0.3125 +0.5625 1 0.3438 +0.5625 1 0.375 +0.5625 1 0.4062 +0.5625 1 0.4375 +0.5625 1 0.4688 +0.5625 1 0.5 +0.5625 1 0.5312 +0.5625 1 0.5625 +0.5625 1 0.5938 +0.5625 1 0.625 +0.5625 1 0.6562 +0.5625 1 0.6875 +0.5625 1 0.7188 +0.5625 1 0.75 +0.5625 1 0.7812 +0.5625 1 0.8125 +0.5625 1 0.8438 +0.5625 1 0.875 +0.5625 1 0.9062 +0.5625 1 0.9375 +0.5625 1 0.9688 +0.5625 1 1 +0.5938 0 0 +0.5938 0 0.03125 +0.5938 0 0.0625 +0.5938 0 0.09375 +0.5938 0 0.125 +0.5938 0 0.1562 +0.5938 0 0.1875 +0.5938 0 0.2188 +0.5938 0 0.25 +0.5938 0 0.2812 +0.5938 0 0.3125 +0.5938 0 0.3438 +0.5938 0 0.375 +0.5938 0 0.4062 +0.5938 0 0.4375 +0.5938 0 0.4688 +0.5938 0 0.5 +0.5938 0 0.5312 +0.5938 0 0.5625 +0.5938 0 0.5938 +0.5938 0 0.625 +0.5938 0 0.6562 +0.5938 0 0.6875 +0.5938 0 0.7188 +0.5938 0 0.75 +0.5938 0 0.7812 +0.5938 0 0.8125 +0.5938 0 0.8438 +0.5938 0 0.875 +0.5938 0 0.9062 +0.5938 0 0.9375 +0.5938 0 0.9688 +0.5938 0 1 +0.5938 0.03125 0 +0.5938 0.03125 0.03125 +0.5938 0.03125 0.0625 +0.5938 0.03125 0.09375 +0.5938 0.03125 0.125 +0.5938 0.03125 0.1562 +0.5938 0.03125 0.1875 +0.5938 0.03125 0.2188 +0.5938 0.03125 0.25 +0.5938 0.03125 0.2812 +0.5938 0.03125 0.3125 +0.5938 0.03125 0.3438 +0.5938 0.03125 0.375 +0.5938 0.03125 0.4062 +0.5938 0.03125 0.4375 +0.5938 0.03125 0.4688 +0.5938 0.03125 0.5 +0.5938 0.03125 0.5312 +0.5938 0.03125 0.5625 +0.5938 0.03125 0.5938 +0.5938 0.03125 0.625 +0.5938 0.03125 0.6562 +0.5938 0.03125 0.6875 +0.5938 0.03125 0.7188 +0.5938 0.03125 0.75 +0.5938 0.03125 0.7812 +0.5938 0.03125 0.8125 +0.5938 0.03125 0.8438 +0.5938 0.03125 0.875 +0.5938 0.03125 0.9062 +0.5938 0.03125 0.9375 +0.5938 0.03125 0.9688 +0.5938 0.03125 1 +0.5938 0.0625 0 +0.5938 0.0625 0.03125 +0.5938 0.0625 0.0625 +0.5938 0.0625 0.09375 +0.5938 0.0625 0.125 +0.5938 0.0625 0.1562 +0.5938 0.0625 0.1875 +0.5938 0.0625 0.2188 +0.5938 0.0625 0.25 +0.5938 0.0625 0.2812 +0.5938 0.0625 0.3125 +0.5938 0.0625 0.3438 +0.5938 0.0625 0.375 +0.5938 0.0625 0.4062 +0.5938 0.0625 0.4375 +0.5938 0.0625 0.4688 +0.5938 0.0625 0.5 +0.5938 0.0625 0.5312 +0.5938 0.0625 0.5625 +0.5938 0.0625 0.5938 +0.5938 0.0625 0.625 +0.5938 0.0625 0.6562 +0.5938 0.0625 0.6875 +0.5938 0.0625 0.7188 +0.5938 0.0625 0.75 +0.5938 0.0625 0.7812 +0.5938 0.0625 0.8125 +0.5938 0.0625 0.8438 +0.5938 0.0625 0.875 +0.5938 0.0625 0.9062 +0.5938 0.0625 0.9375 +0.5938 0.0625 0.9688 +0.5938 0.0625 1 +0.5938 0.09375 0 +0.5938 0.09375 0.03125 +0.5938 0.09375 0.0625 +0.5938 0.09375 0.09375 +0.5938 0.09375 0.125 +0.5938 0.09375 0.1562 +0.5938 0.09375 0.1875 +0.5938 0.09375 0.2188 +0.5938 0.09375 0.25 +0.5938 0.09375 0.2812 +0.5938 0.09375 0.3125 +0.5938 0.09375 0.3438 +0.5938 0.09375 0.375 +0.5938 0.09375 0.4062 +0.5938 0.09375 0.4375 +0.5938 0.09375 0.4688 +0.5938 0.09375 0.5 +0.5938 0.09375 0.5312 +0.5938 0.09375 0.5625 +0.5938 0.09375 0.5938 +0.5938 0.09375 0.625 +0.5938 0.09375 0.6562 +0.5938 0.09375 0.6875 +0.5938 0.09375 0.7188 +0.5938 0.09375 0.75 +0.5938 0.09375 0.7812 +0.5938 0.09375 0.8125 +0.5938 0.09375 0.8438 +0.5938 0.09375 0.875 +0.5938 0.09375 0.9062 +0.5938 0.09375 0.9375 +0.5938 0.09375 0.9688 +0.5938 0.09375 1 +0.5938 0.125 0 +0.5938 0.125 0.03125 +0.5938 0.125 0.0625 +0.5938 0.125 0.09375 +0.5938 0.125 0.125 +0.5938 0.125 0.1562 +0.5938 0.125 0.1875 +0.5938 0.125 0.2188 +0.5938 0.125 0.25 +0.5938 0.125 0.2812 +0.5938 0.125 0.3125 +0.5938 0.125 0.3438 +0.5938 0.125 0.375 +0.5938 0.125 0.4062 +0.5938 0.125 0.4375 +0.5938 0.125 0.4688 +0.5938 0.125 0.5 +0.5938 0.125 0.5312 +0.5938 0.125 0.5625 +0.5938 0.125 0.5938 +0.5938 0.125 0.625 +0.5938 0.125 0.6562 +0.5938 0.125 0.6875 +0.5938 0.125 0.7188 +0.5938 0.125 0.75 +0.5938 0.125 0.7812 +0.5938 0.125 0.8125 +0.5938 0.125 0.8438 +0.5938 0.125 0.875 +0.5938 0.125 0.9062 +0.5938 0.125 0.9375 +0.5938 0.125 0.9688 +0.5938 0.125 1 +0.5938 0.1562 0 +0.5938 0.1562 0.03125 +0.5938 0.1562 0.0625 +0.5938 0.1562 0.09375 +0.5938 0.1562 0.125 +0.5938 0.1562 0.1562 +0.5938 0.1562 0.1875 +0.5938 0.1562 0.2188 +0.5938 0.1562 0.25 +0.5938 0.1562 0.2812 +0.5938 0.1562 0.3125 +0.5938 0.1562 0.3438 +0.5938 0.1562 0.375 +0.5938 0.1562 0.4062 +0.5938 0.1562 0.4375 +0.5938 0.1562 0.4688 +0.5938 0.1562 0.5 +0.5938 0.1562 0.5312 +0.5938 0.1562 0.5625 +0.5938 0.1562 0.5938 +0.5938 0.1562 0.625 +0.5938 0.1562 0.6562 +0.5938 0.1562 0.6875 +0.5938 0.1562 0.7188 +0.5938 0.1562 0.75 +0.5938 0.1562 0.7812 +0.5938 0.1562 0.8125 +0.5938 0.1562 0.8438 +0.5938 0.1562 0.875 +0.5938 0.1562 0.9062 +0.5938 0.1562 0.9375 +0.5938 0.1562 0.9688 +0.5938 0.1562 1 +0.5938 0.1875 0 +0.5938 0.1875 0.03125 +0.5938 0.1875 0.0625 +0.5938 0.1875 0.09375 +0.5938 0.1875 0.125 +0.5938 0.1875 0.1562 +0.5938 0.1875 0.1875 +0.5938 0.1875 0.2188 +0.5938 0.1875 0.25 +0.5938 0.1875 0.2812 +0.5938 0.1875 0.3125 +0.5938 0.1875 0.3438 +0.5938 0.1875 0.375 +0.5938 0.1875 0.4062 +0.5938 0.1875 0.4375 +0.5938 0.1875 0.4688 +0.5938 0.1875 0.5 +0.5938 0.1875 0.5312 +0.5938 0.1875 0.5625 +0.5938 0.1875 0.5938 +0.5938 0.1875 0.625 +0.5938 0.1875 0.6562 +0.5938 0.1875 0.6875 +0.5938 0.1875 0.7188 +0.5938 0.1875 0.75 +0.5938 0.1875 0.7812 +0.5938 0.1875 0.8125 +0.5938 0.1875 0.8438 +0.5938 0.1875 0.875 +0.5938 0.1875 0.9062 +0.5938 0.1875 0.9375 +0.5938 0.1875 0.9688 +0.5938 0.1875 1 +0.5938 0.2188 0 +0.5938 0.2188 0.03125 +0.5938 0.2188 0.0625 +0.5938 0.2188 0.09375 +0.5938 0.2188 0.125 +0.5938 0.2188 0.1562 +0.5938 0.2188 0.1875 +0.5938 0.2188 0.2188 +0.5938 0.2188 0.25 +0.5938 0.2188 0.2812 +0.5938 0.2188 0.3125 +0.5938 0.2188 0.3438 +0.5938 0.2188 0.375 +0.5938 0.2188 0.4062 +0.5938 0.2188 0.4375 +0.5938 0.2188 0.4688 +0.5938 0.2188 0.5 +0.5938 0.2188 0.5312 +0.5938 0.2188 0.5625 +0.5938 0.2188 0.5938 +0.5938 0.2188 0.625 +0.5938 0.2188 0.6562 +0.5938 0.2188 0.6875 +0.5938 0.2188 0.7188 +0.5938 0.2188 0.75 +0.5938 0.2188 0.7812 +0.5938 0.2188 0.8125 +0.5938 0.2188 0.8438 +0.5938 0.2188 0.875 +0.5938 0.2188 0.9062 +0.5938 0.2188 0.9375 +0.5938 0.2188 0.9688 +0.5938 0.2188 1 +0.5938 0.25 0 +0.5938 0.25 0.03125 +0.5938 0.25 0.0625 +0.5938 0.25 0.09375 +0.5938 0.25 0.125 +0.5938 0.25 0.1562 +0.5938 0.25 0.1875 +0.5938 0.25 0.2188 +0.5938 0.25 0.25 +0.5938 0.25 0.2812 +0.5938 0.25 0.3125 +0.5938 0.25 0.3438 +0.5938 0.25 0.375 +0.5938 0.25 0.4062 +0.5938 0.25 0.4375 +0.5938 0.25 0.4688 +0.5938 0.25 0.5 +0.5938 0.25 0.5312 +0.5938 0.25 0.5625 +0.5938 0.25 0.5938 +0.5938 0.25 0.625 +0.5938 0.25 0.6562 +0.5938 0.25 0.6875 +0.5938 0.25 0.7188 +0.5938 0.25 0.75 +0.5938 0.25 0.7812 +0.5938 0.25 0.8125 +0.5938 0.25 0.8438 +0.5938 0.25 0.875 +0.5938 0.25 0.9062 +0.5938 0.25 0.9375 +0.5938 0.25 0.9688 +0.5938 0.25 1 +0.5938 0.2812 0 +0.5938 0.2812 0.03125 +0.5938 0.2812 0.0625 +0.5938 0.2812 0.09375 +0.5938 0.2812 0.125 +0.5938 0.2812 0.1562 +0.5938 0.2812 0.1875 +0.5938 0.2812 0.2188 +0.5938 0.2812 0.25 +0.5938 0.2812 0.2812 +0.5938 0.2812 0.3125 +0.5938 0.2812 0.3438 +0.5938 0.2812 0.375 +0.5938 0.2812 0.4062 +0.5938 0.2812 0.4375 +0.5938 0.2812 0.4688 +0.5938 0.2812 0.5 +0.5938 0.2812 0.5312 +0.5938 0.2812 0.5625 +0.5938 0.2812 0.5938 +0.5938 0.2812 0.625 +0.5938 0.2812 0.6562 +0.5938 0.2812 0.6875 +0.5938 0.2812 0.7188 +0.5938 0.2812 0.75 +0.5938 0.2812 0.7812 +0.5938 0.2812 0.8125 +0.5938 0.2812 0.8438 +0.5938 0.2812 0.875 +0.5938 0.2812 0.9062 +0.5938 0.2812 0.9375 +0.5938 0.2812 0.9688 +0.5938 0.2812 1 +0.5938 0.3125 0 +0.5938 0.3125 0.03125 +0.5938 0.3125 0.0625 +0.5938 0.3125 0.09375 +0.5938 0.3125 0.125 +0.5938 0.3125 0.1562 +0.5938 0.3125 0.1875 +0.5938 0.3125 0.2188 +0.5938 0.3125 0.25 +0.5938 0.3125 0.2812 +0.5938 0.3125 0.3125 +0.5938 0.3125 0.3438 +0.5938 0.3125 0.375 +0.5938 0.3125 0.4062 +0.5938 0.3125 0.4375 +0.5938 0.3125 0.4688 +0.5938 0.3125 0.5 +0.5938 0.3125 0.5312 +0.5938 0.3125 0.5625 +0.5938 0.3125 0.5938 +0.5938 0.3125 0.625 +0.5938 0.3125 0.6562 +0.5938 0.3125 0.6875 +0.5938 0.3125 0.7188 +0.5938 0.3125 0.75 +0.5938 0.3125 0.7812 +0.5938 0.3125 0.8125 +0.5938 0.3125 0.8438 +0.5938 0.3125 0.875 +0.5938 0.3125 0.9062 +0.5938 0.3125 0.9375 +0.5938 0.3125 0.9688 +0.5938 0.3125 1 +0.5938 0.3438 0 +0.5938 0.3438 0.03125 +0.5938 0.3438 0.0625 +0.5938 0.3438 0.09375 +0.5938 0.3438 0.125 +0.5938 0.3438 0.1562 +0.5938 0.3438 0.1875 +0.5938 0.3438 0.2188 +0.5938 0.3438 0.25 +0.5938 0.3438 0.2812 +0.5938 0.3438 0.3125 +0.5938 0.3438 0.3438 +0.5938 0.3438 0.375 +0.5938 0.3438 0.4062 +0.5938 0.3438 0.4375 +0.5938 0.3438 0.4688 +0.5938 0.3438 0.5 +0.5938 0.3438 0.5312 +0.5938 0.3438 0.5625 +0.5938 0.3438 0.5938 +0.5938 0.3438 0.625 +0.5938 0.3438 0.6562 +0.5938 0.3438 0.6875 +0.5938 0.3438 0.7188 +0.5938 0.3438 0.75 +0.5938 0.3438 0.7812 +0.5938 0.3438 0.8125 +0.5938 0.3438 0.8438 +0.5938 0.3438 0.875 +0.5938 0.3438 0.9062 +0.5938 0.3438 0.9375 +0.5938 0.3438 0.9688 +0.5938 0.3438 1 +0.5938 0.375 0 +0.5938 0.375 0.03125 +0.5938 0.375 0.0625 +0.5938 0.375 0.09375 +0.5938 0.375 0.125 +0.5938 0.375 0.1562 +0.5938 0.375 0.1875 +0.5938 0.375 0.2188 +0.5938 0.375 0.25 +0.5938 0.375 0.2812 +0.5938 0.375 0.3125 +0.5938 0.375 0.3438 +0.5938 0.375 0.375 +0.5938 0.375 0.4062 +0.5938 0.375 0.4375 +0.5938 0.375 0.4688 +0.5938 0.375 0.5 +0.5938 0.375 0.5312 +0.5938 0.375 0.5625 +0.5938 0.375 0.5938 +0.5938 0.375 0.625 +0.5938 0.375 0.6562 +0.5938 0.375 0.6875 +0.5938 0.375 0.7188 +0.5938 0.375 0.75 +0.5938 0.375 0.7812 +0.5938 0.375 0.8125 +0.5938 0.375 0.8438 +0.5938 0.375 0.875 +0.5938 0.375 0.9062 +0.5938 0.375 0.9375 +0.5938 0.375 0.9688 +0.5938 0.375 1 +0.5938 0.4062 0 +0.5938 0.4062 0.03125 +0.5938 0.4062 0.0625 +0.5938 0.4062 0.09375 +0.5938 0.4062 0.125 +0.5938 0.4062 0.1562 +0.5938 0.4062 0.1875 +0.5938 0.4062 0.2188 +0.5938 0.4062 0.25 +0.5938 0.4062 0.2812 +0.5938 0.4062 0.3125 +0.5938 0.4062 0.3438 +0.5938 0.4062 0.375 +0.5938 0.4062 0.4062 +0.5938 0.4062 0.4375 +0.5938 0.4062 0.4688 +0.5938 0.4062 0.5 +0.5938 0.4062 0.5312 +0.5938 0.4062 0.5625 +0.5938 0.4062 0.5938 +0.5938 0.4062 0.625 +0.5938 0.4062 0.6562 +0.5938 0.4062 0.6875 +0.5938 0.4062 0.7188 +0.5938 0.4062 0.75 +0.5938 0.4062 0.7812 +0.5938 0.4062 0.8125 +0.5938 0.4062 0.8438 +0.5938 0.4062 0.875 +0.5938 0.4062 0.9062 +0.5938 0.4062 0.9375 +0.5938 0.4062 0.9688 +0.5938 0.4062 1 +0.5938 0.4375 0 +0.5938 0.4375 0.03125 +0.5938 0.4375 0.0625 +0.5938 0.4375 0.09375 +0.5938 0.4375 0.125 +0.5938 0.4375 0.1562 +0.5938 0.4375 0.1875 +0.5938 0.4375 0.2188 +0.5938 0.4375 0.25 +0.5938 0.4375 0.2812 +0.5938 0.4375 0.3125 +0.5938 0.4375 0.3438 +0.5938 0.4375 0.375 +0.5938 0.4375 0.4062 +0.5938 0.4375 0.4375 +0.5938 0.4375 0.4688 +0.5938 0.4375 0.5 +0.5938 0.4375 0.5312 +0.5938 0.4375 0.5625 +0.5938 0.4375 0.5938 +0.5938 0.4375 0.625 +0.5938 0.4375 0.6562 +0.5938 0.4375 0.6875 +0.5938 0.4375 0.7188 +0.5938 0.4375 0.75 +0.5938 0.4375 0.7812 +0.5938 0.4375 0.8125 +0.5938 0.4375 0.8438 +0.5938 0.4375 0.875 +0.5938 0.4375 0.9062 +0.5938 0.4375 0.9375 +0.5938 0.4375 0.9688 +0.5938 0.4375 1 +0.5938 0.4688 0 +0.5938 0.4688 0.03125 +0.5938 0.4688 0.0625 +0.5938 0.4688 0.09375 +0.5938 0.4688 0.125 +0.5938 0.4688 0.1562 +0.5938 0.4688 0.1875 +0.5938 0.4688 0.2188 +0.5938 0.4688 0.25 +0.5938 0.4688 0.2812 +0.5938 0.4688 0.3125 +0.5938 0.4688 0.3438 +0.5938 0.4688 0.375 +0.5938 0.4688 0.4062 +0.5938 0.4688 0.4375 +0.5938 0.4688 0.4688 +0.5938 0.4688 0.5 +0.5938 0.4688 0.5312 +0.5938 0.4688 0.5625 +0.5938 0.4688 0.5938 +0.5938 0.4688 0.625 +0.5938 0.4688 0.6562 +0.5938 0.4688 0.6875 +0.5938 0.4688 0.7188 +0.5938 0.4688 0.75 +0.5938 0.4688 0.7812 +0.5938 0.4688 0.8125 +0.5938 0.4688 0.8438 +0.5938 0.4688 0.875 +0.5938 0.4688 0.9062 +0.5938 0.4688 0.9375 +0.5938 0.4688 0.9688 +0.5938 0.4688 1 +0.5938 0.5 0 +0.5938 0.5 0.03125 +0.5938 0.5 0.0625 +0.5938 0.5 0.09375 +0.5938 0.5 0.125 +0.5938 0.5 0.1562 +0.5938 0.5 0.1875 +0.5938 0.5 0.2188 +0.5938 0.5 0.25 +0.5938 0.5 0.2812 +0.5938 0.5 0.3125 +0.5938 0.5 0.3438 +0.5938 0.5 0.375 +0.5938 0.5 0.4062 +0.5938 0.5 0.4375 +0.5938 0.5 0.4688 +0.5938 0.5 0.5 +0.5938 0.5 0.5312 +0.5938 0.5 0.5625 +0.5938 0.5 0.5938 +0.5938 0.5 0.625 +0.5938 0.5 0.6562 +0.5938 0.5 0.6875 +0.5938 0.5 0.7188 +0.5938 0.5 0.75 +0.5938 0.5 0.7812 +0.5938 0.5 0.8125 +0.5938 0.5 0.8438 +0.5938 0.5 0.875 +0.5938 0.5 0.9062 +0.5938 0.5 0.9375 +0.5938 0.5 0.9688 +0.5938 0.5 1 +0.5938 0.5312 0 +0.5938 0.5312 0.03125 +0.5938 0.5312 0.0625 +0.5938 0.5312 0.09375 +0.5938 0.5312 0.125 +0.5938 0.5312 0.1562 +0.5938 0.5312 0.1875 +0.5938 0.5312 0.2188 +0.5938 0.5312 0.25 +0.5938 0.5312 0.2812 +0.5938 0.5312 0.3125 +0.5938 0.5312 0.3438 +0.5938 0.5312 0.375 +0.5938 0.5312 0.4062 +0.5938 0.5312 0.4375 +0.5938 0.5312 0.4688 +0.5938 0.5312 0.5 +0.5938 0.5312 0.5312 +0.5938 0.5312 0.5625 +0.5938 0.5312 0.5938 +0.5938 0.5312 0.625 +0.5938 0.5312 0.6562 +0.5938 0.5312 0.6875 +0.5938 0.5312 0.7188 +0.5938 0.5312 0.75 +0.5938 0.5312 0.7812 +0.5938 0.5312 0.8125 +0.5938 0.5312 0.8438 +0.5938 0.5312 0.875 +0.5938 0.5312 0.9062 +0.5938 0.5312 0.9375 +0.5938 0.5312 0.9688 +0.5938 0.5312 1 +0.5938 0.5625 0 +0.5938 0.5625 0.03125 +0.5938 0.5625 0.0625 +0.5938 0.5625 0.09375 +0.5938 0.5625 0.125 +0.5938 0.5625 0.1562 +0.5938 0.5625 0.1875 +0.5938 0.5625 0.2188 +0.5938 0.5625 0.25 +0.5938 0.5625 0.2812 +0.5938 0.5625 0.3125 +0.5938 0.5625 0.3438 +0.5938 0.5625 0.375 +0.5938 0.5625 0.4062 +0.5938 0.5625 0.4375 +0.5938 0.5625 0.4688 +0.5938 0.5625 0.5 +0.5938 0.5625 0.5312 +0.5938 0.5625 0.5625 +0.5938 0.5625 0.5938 +0.5938 0.5625 0.625 +0.5938 0.5625 0.6562 +0.5938 0.5625 0.6875 +0.5938 0.5625 0.7188 +0.5938 0.5625 0.75 +0.5938 0.5625 0.7812 +0.5938 0.5625 0.8125 +0.5938 0.5625 0.8438 +0.5938 0.5625 0.875 +0.5938 0.5625 0.9062 +0.5938 0.5625 0.9375 +0.5938 0.5625 0.9688 +0.5938 0.5625 1 +0.5938 0.5938 0 +0.5938 0.5938 0.03125 +0.5938 0.5938 0.0625 +0.5938 0.5938 0.09375 +0.5938 0.5938 0.125 +0.5938 0.5938 0.1562 +0.5938 0.5938 0.1875 +0.5938 0.5938 0.2188 +0.5938 0.5938 0.25 +0.5938 0.5938 0.2812 +0.5938 0.5938 0.3125 +0.5938 0.5938 0.3438 +0.5938 0.5938 0.375 +0.5938 0.5938 0.4062 +0.5938 0.5938 0.4375 +0.5938 0.5938 0.4688 +0.5938 0.5938 0.5 +0.5938 0.5938 0.5312 +0.5938 0.5938 0.5625 +0.5938 0.5938 0.5938 +0.5938 0.5938 0.625 +0.5938 0.5938 0.6562 +0.5938 0.5938 0.6875 +0.5938 0.5938 0.7188 +0.5938 0.5938 0.75 +0.5938 0.5938 0.7812 +0.5938 0.5938 0.8125 +0.5938 0.5938 0.8438 +0.5938 0.5938 0.875 +0.5938 0.5938 0.9062 +0.5938 0.5938 0.9375 +0.5938 0.5938 0.9688 +0.5938 0.5938 1 +0.5938 0.625 0 +0.5938 0.625 0.03125 +0.5938 0.625 0.0625 +0.5938 0.625 0.09375 +0.5938 0.625 0.125 +0.5938 0.625 0.1562 +0.5938 0.625 0.1875 +0.5938 0.625 0.2188 +0.5938 0.625 0.25 +0.5938 0.625 0.2812 +0.5938 0.625 0.3125 +0.5938 0.625 0.3438 +0.5938 0.625 0.375 +0.5938 0.625 0.4062 +0.5938 0.625 0.4375 +0.5938 0.625 0.4688 +0.5938 0.625 0.5 +0.5938 0.625 0.5312 +0.5938 0.625 0.5625 +0.5938 0.625 0.5938 +0.5938 0.625 0.625 +0.5938 0.625 0.6562 +0.5938 0.625 0.6875 +0.5938 0.625 0.7188 +0.5938 0.625 0.75 +0.5938 0.625 0.7812 +0.5938 0.625 0.8125 +0.5938 0.625 0.8438 +0.5938 0.625 0.875 +0.5938 0.625 0.9062 +0.5938 0.625 0.9375 +0.5938 0.625 0.9688 +0.5938 0.625 1 +0.5938 0.6562 0 +0.5938 0.6562 0.03125 +0.5938 0.6562 0.0625 +0.5938 0.6562 0.09375 +0.5938 0.6562 0.125 +0.5938 0.6562 0.1562 +0.5938 0.6562 0.1875 +0.5938 0.6562 0.2188 +0.5938 0.6562 0.25 +0.5938 0.6562 0.2812 +0.5938 0.6562 0.3125 +0.5938 0.6562 0.3438 +0.5938 0.6562 0.375 +0.5938 0.6562 0.4062 +0.5938 0.6562 0.4375 +0.5938 0.6562 0.4688 +0.5938 0.6562 0.5 +0.5938 0.6562 0.5312 +0.5938 0.6562 0.5625 +0.5938 0.6562 0.5938 +0.5938 0.6562 0.625 +0.5938 0.6562 0.6562 +0.5938 0.6562 0.6875 +0.5938 0.6562 0.7188 +0.5938 0.6562 0.75 +0.5938 0.6562 0.7812 +0.5938 0.6562 0.8125 +0.5938 0.6562 0.8438 +0.5938 0.6562 0.875 +0.5938 0.6562 0.9062 +0.5938 0.6562 0.9375 +0.5938 0.6562 0.9688 +0.5938 0.6562 1 +0.5938 0.6875 0 +0.5938 0.6875 0.03125 +0.5938 0.6875 0.0625 +0.5938 0.6875 0.09375 +0.5938 0.6875 0.125 +0.5938 0.6875 0.1562 +0.5938 0.6875 0.1875 +0.5938 0.6875 0.2188 +0.5938 0.6875 0.25 +0.5938 0.6875 0.2812 +0.5938 0.6875 0.3125 +0.5938 0.6875 0.3438 +0.5938 0.6875 0.375 +0.5938 0.6875 0.4062 +0.5938 0.6875 0.4375 +0.5938 0.6875 0.4688 +0.5938 0.6875 0.5 +0.5938 0.6875 0.5312 +0.5938 0.6875 0.5625 +0.5938 0.6875 0.5938 +0.5938 0.6875 0.625 +0.5938 0.6875 0.6562 +0.5938 0.6875 0.6875 +0.5938 0.6875 0.7188 +0.5938 0.6875 0.75 +0.5938 0.6875 0.7812 +0.5938 0.6875 0.8125 +0.5938 0.6875 0.8438 +0.5938 0.6875 0.875 +0.5938 0.6875 0.9062 +0.5938 0.6875 0.9375 +0.5938 0.6875 0.9688 +0.5938 0.6875 1 +0.5938 0.7188 0 +0.5938 0.7188 0.03125 +0.5938 0.7188 0.0625 +0.5938 0.7188 0.09375 +0.5938 0.7188 0.125 +0.5938 0.7188 0.1562 +0.5938 0.7188 0.1875 +0.5938 0.7188 0.2188 +0.5938 0.7188 0.25 +0.5938 0.7188 0.2812 +0.5938 0.7188 0.3125 +0.5938 0.7188 0.3438 +0.5938 0.7188 0.375 +0.5938 0.7188 0.4062 +0.5938 0.7188 0.4375 +0.5938 0.7188 0.4688 +0.5938 0.7188 0.5 +0.5938 0.7188 0.5312 +0.5938 0.7188 0.5625 +0.5938 0.7188 0.5938 +0.5938 0.7188 0.625 +0.5938 0.7188 0.6562 +0.5938 0.7188 0.6875 +0.5938 0.7188 0.7188 +0.5938 0.7188 0.75 +0.5938 0.7188 0.7812 +0.5938 0.7188 0.8125 +0.5938 0.7188 0.8438 +0.5938 0.7188 0.875 +0.5938 0.7188 0.9062 +0.5938 0.7188 0.9375 +0.5938 0.7188 0.9688 +0.5938 0.7188 1 +0.5938 0.75 0 +0.5938 0.75 0.03125 +0.5938 0.75 0.0625 +0.5938 0.75 0.09375 +0.5938 0.75 0.125 +0.5938 0.75 0.1562 +0.5938 0.75 0.1875 +0.5938 0.75 0.2188 +0.5938 0.75 0.25 +0.5938 0.75 0.2812 +0.5938 0.75 0.3125 +0.5938 0.75 0.3438 +0.5938 0.75 0.375 +0.5938 0.75 0.4062 +0.5938 0.75 0.4375 +0.5938 0.75 0.4688 +0.5938 0.75 0.5 +0.5938 0.75 0.5312 +0.5938 0.75 0.5625 +0.5938 0.75 0.5938 +0.5938 0.75 0.625 +0.5938 0.75 0.6562 +0.5938 0.75 0.6875 +0.5938 0.75 0.7188 +0.5938 0.75 0.75 +0.5938 0.75 0.7812 +0.5938 0.75 0.8125 +0.5938 0.75 0.8438 +0.5938 0.75 0.875 +0.5938 0.75 0.9062 +0.5938 0.75 0.9375 +0.5938 0.75 0.9688 +0.5938 0.75 1 +0.5938 0.7812 0 +0.5938 0.7812 0.03125 +0.5938 0.7812 0.0625 +0.5938 0.7812 0.09375 +0.5938 0.7812 0.125 +0.5938 0.7812 0.1562 +0.5938 0.7812 0.1875 +0.5938 0.7812 0.2188 +0.5938 0.7812 0.25 +0.5938 0.7812 0.2812 +0.5938 0.7812 0.3125 +0.5938 0.7812 0.3438 +0.5938 0.7812 0.375 +0.5938 0.7812 0.4062 +0.5938 0.7812 0.4375 +0.5938 0.7812 0.4688 +0.5938 0.7812 0.5 +0.5938 0.7812 0.5312 +0.5938 0.7812 0.5625 +0.5938 0.7812 0.5938 +0.5938 0.7812 0.625 +0.5938 0.7812 0.6562 +0.5938 0.7812 0.6875 +0.5938 0.7812 0.7188 +0.5938 0.7812 0.75 +0.5938 0.7812 0.7812 +0.5938 0.7812 0.8125 +0.5938 0.7812 0.8438 +0.5938 0.7812 0.875 +0.5938 0.7812 0.9062 +0.5938 0.7812 0.9375 +0.5938 0.7812 0.9688 +0.5938 0.7812 1 +0.5938 0.8125 0 +0.5938 0.8125 0.03125 +0.5938 0.8125 0.0625 +0.5938 0.8125 0.09375 +0.5938 0.8125 0.125 +0.5938 0.8125 0.1562 +0.5938 0.8125 0.1875 +0.5938 0.8125 0.2188 +0.5938 0.8125 0.25 +0.5938 0.8125 0.2812 +0.5938 0.8125 0.3125 +0.5938 0.8125 0.3438 +0.5938 0.8125 0.375 +0.5938 0.8125 0.4062 +0.5938 0.8125 0.4375 +0.5938 0.8125 0.4688 +0.5938 0.8125 0.5 +0.5938 0.8125 0.5312 +0.5938 0.8125 0.5625 +0.5938 0.8125 0.5938 +0.5938 0.8125 0.625 +0.5938 0.8125 0.6562 +0.5938 0.8125 0.6875 +0.5938 0.8125 0.7188 +0.5938 0.8125 0.75 +0.5938 0.8125 0.7812 +0.5938 0.8125 0.8125 +0.5938 0.8125 0.8438 +0.5938 0.8125 0.875 +0.5938 0.8125 0.9062 +0.5938 0.8125 0.9375 +0.5938 0.8125 0.9688 +0.5938 0.8125 1 +0.5938 0.8438 0 +0.5938 0.8438 0.03125 +0.5938 0.8438 0.0625 +0.5938 0.8438 0.09375 +0.5938 0.8438 0.125 +0.5938 0.8438 0.1562 +0.5938 0.8438 0.1875 +0.5938 0.8438 0.2188 +0.5938 0.8438 0.25 +0.5938 0.8438 0.2812 +0.5938 0.8438 0.3125 +0.5938 0.8438 0.3438 +0.5938 0.8438 0.375 +0.5938 0.8438 0.4062 +0.5938 0.8438 0.4375 +0.5938 0.8438 0.4688 +0.5938 0.8438 0.5 +0.5938 0.8438 0.5312 +0.5938 0.8438 0.5625 +0.5938 0.8438 0.5938 +0.5938 0.8438 0.625 +0.5938 0.8438 0.6562 +0.5938 0.8438 0.6875 +0.5938 0.8438 0.7188 +0.5938 0.8438 0.75 +0.5938 0.8438 0.7812 +0.5938 0.8438 0.8125 +0.5938 0.8438 0.8438 +0.5938 0.8438 0.875 +0.5938 0.8438 0.9062 +0.5938 0.8438 0.9375 +0.5938 0.8438 0.9688 +0.5938 0.8438 1 +0.5938 0.875 0 +0.5938 0.875 0.03125 +0.5938 0.875 0.0625 +0.5938 0.875 0.09375 +0.5938 0.875 0.125 +0.5938 0.875 0.1562 +0.5938 0.875 0.1875 +0.5938 0.875 0.2188 +0.5938 0.875 0.25 +0.5938 0.875 0.2812 +0.5938 0.875 0.3125 +0.5938 0.875 0.3438 +0.5938 0.875 0.375 +0.5938 0.875 0.4062 +0.5938 0.875 0.4375 +0.5938 0.875 0.4688 +0.5938 0.875 0.5 +0.5938 0.875 0.5312 +0.5938 0.875 0.5625 +0.5938 0.875 0.5938 +0.5938 0.875 0.625 +0.5938 0.875 0.6562 +0.5938 0.875 0.6875 +0.5938 0.875 0.7188 +0.5938 0.875 0.75 +0.5938 0.875 0.7812 +0.5938 0.875 0.8125 +0.5938 0.875 0.8438 +0.5938 0.875 0.875 +0.5938 0.875 0.9062 +0.5938 0.875 0.9375 +0.5938 0.875 0.9688 +0.5938 0.875 1 +0.5938 0.9062 0 +0.5938 0.9062 0.03125 +0.5938 0.9062 0.0625 +0.5938 0.9062 0.09375 +0.5938 0.9062 0.125 +0.5938 0.9062 0.1562 +0.5938 0.9062 0.1875 +0.5938 0.9062 0.2188 +0.5938 0.9062 0.25 +0.5938 0.9062 0.2812 +0.5938 0.9062 0.3125 +0.5938 0.9062 0.3438 +0.5938 0.9062 0.375 +0.5938 0.9062 0.4062 +0.5938 0.9062 0.4375 +0.5938 0.9062 0.4688 +0.5938 0.9062 0.5 +0.5938 0.9062 0.5312 +0.5938 0.9062 0.5625 +0.5938 0.9062 0.5938 +0.5938 0.9062 0.625 +0.5938 0.9062 0.6562 +0.5938 0.9062 0.6875 +0.5938 0.9062 0.7188 +0.5938 0.9062 0.75 +0.5938 0.9062 0.7812 +0.5938 0.9062 0.8125 +0.5938 0.9062 0.8438 +0.5938 0.9062 0.875 +0.5938 0.9062 0.9062 +0.5938 0.9062 0.9375 +0.5938 0.9062 0.9688 +0.5938 0.9062 1 +0.5938 0.9375 0 +0.5938 0.9375 0.03125 +0.5938 0.9375 0.0625 +0.5938 0.9375 0.09375 +0.5938 0.9375 0.125 +0.5938 0.9375 0.1562 +0.5938 0.9375 0.1875 +0.5938 0.9375 0.2188 +0.5938 0.9375 0.25 +0.5938 0.9375 0.2812 +0.5938 0.9375 0.3125 +0.5938 0.9375 0.3438 +0.5938 0.9375 0.375 +0.5938 0.9375 0.4062 +0.5938 0.9375 0.4375 +0.5938 0.9375 0.4688 +0.5938 0.9375 0.5 +0.5938 0.9375 0.5312 +0.5938 0.9375 0.5625 +0.5938 0.9375 0.5938 +0.5938 0.9375 0.625 +0.5938 0.9375 0.6562 +0.5938 0.9375 0.6875 +0.5938 0.9375 0.7188 +0.5938 0.9375 0.75 +0.5938 0.9375 0.7812 +0.5938 0.9375 0.8125 +0.5938 0.9375 0.8438 +0.5938 0.9375 0.875 +0.5938 0.9375 0.9062 +0.5938 0.9375 0.9375 +0.5938 0.9375 0.9688 +0.5938 0.9375 1 +0.5938 0.9688 0 +0.5938 0.9688 0.03125 +0.5938 0.9688 0.0625 +0.5938 0.9688 0.09375 +0.5938 0.9688 0.125 +0.5938 0.9688 0.1562 +0.5938 0.9688 0.1875 +0.5938 0.9688 0.2188 +0.5938 0.9688 0.25 +0.5938 0.9688 0.2812 +0.5938 0.9688 0.3125 +0.5938 0.9688 0.3438 +0.5938 0.9688 0.375 +0.5938 0.9688 0.4062 +0.5938 0.9688 0.4375 +0.5938 0.9688 0.4688 +0.5938 0.9688 0.5 +0.5938 0.9688 0.5312 +0.5938 0.9688 0.5625 +0.5938 0.9688 0.5938 +0.5938 0.9688 0.625 +0.5938 0.9688 0.6562 +0.5938 0.9688 0.6875 +0.5938 0.9688 0.7188 +0.5938 0.9688 0.75 +0.5938 0.9688 0.7812 +0.5938 0.9688 0.8125 +0.5938 0.9688 0.8438 +0.5938 0.9688 0.875 +0.5938 0.9688 0.9062 +0.5938 0.9688 0.9375 +0.5938 0.9688 0.9688 +0.5938 0.9688 1 +0.5938 1 0 +0.5938 1 0.03125 +0.5938 1 0.0625 +0.5938 1 0.09375 +0.5938 1 0.125 +0.5938 1 0.1562 +0.5938 1 0.1875 +0.5938 1 0.2188 +0.5938 1 0.25 +0.5938 1 0.2812 +0.5938 1 0.3125 +0.5938 1 0.3438 +0.5938 1 0.375 +0.5938 1 0.4062 +0.5938 1 0.4375 +0.5938 1 0.4688 +0.5938 1 0.5 +0.5938 1 0.5312 +0.5938 1 0.5625 +0.5938 1 0.5938 +0.5938 1 0.625 +0.5938 1 0.6562 +0.5938 1 0.6875 +0.5938 1 0.7188 +0.5938 1 0.75 +0.5938 1 0.7812 +0.5938 1 0.8125 +0.5938 1 0.8438 +0.5938 1 0.875 +0.5938 1 0.9062 +0.5938 1 0.9375 +0.5938 1 0.9688 +0.5938 1 1 +0.625 0 0 +0.625 0 0.03125 +0.625 0 0.0625 +0.625 0 0.09375 +0.625 0 0.125 +0.625 0 0.1562 +0.625 0 0.1875 +0.625 0 0.2188 +0.625 0 0.25 +0.625 0 0.2812 +0.625 0 0.3125 +0.625 0 0.3438 +0.625 0 0.375 +0.625 0 0.4062 +0.625 0 0.4375 +0.625 0 0.4688 +0.625 0 0.5 +0.625 0 0.5312 +0.625 0 0.5625 +0.625 0 0.5938 +0.625 0 0.625 +0.625 0 0.6562 +0.625 0 0.6875 +0.625 0 0.7188 +0.625 0 0.75 +0.625 0 0.7812 +0.625 0 0.8125 +0.625 0 0.8438 +0.625 0 0.875 +0.625 0 0.9062 +0.625 0 0.9375 +0.625 0 0.9688 +0.625 0 1 +0.625 0.03125 0 +0.625 0.03125 0.03125 +0.625 0.03125 0.0625 +0.625 0.03125 0.09375 +0.625 0.03125 0.125 +0.625 0.03125 0.1562 +0.625 0.03125 0.1875 +0.625 0.03125 0.2188 +0.625 0.03125 0.25 +0.625 0.03125 0.2812 +0.625 0.03125 0.3125 +0.625 0.03125 0.3438 +0.625 0.03125 0.375 +0.625 0.03125 0.4062 +0.625 0.03125 0.4375 +0.625 0.03125 0.4688 +0.625 0.03125 0.5 +0.625 0.03125 0.5312 +0.625 0.03125 0.5625 +0.625 0.03125 0.5938 +0.625 0.03125 0.625 +0.625 0.03125 0.6562 +0.625 0.03125 0.6875 +0.625 0.03125 0.7188 +0.625 0.03125 0.75 +0.625 0.03125 0.7812 +0.625 0.03125 0.8125 +0.625 0.03125 0.8438 +0.625 0.03125 0.875 +0.625 0.03125 0.9062 +0.625 0.03125 0.9375 +0.625 0.03125 0.9688 +0.625 0.03125 1 +0.625 0.0625 0 +0.625 0.0625 0.03125 +0.625 0.0625 0.0625 +0.625 0.0625 0.09375 +0.625 0.0625 0.125 +0.625 0.0625 0.1562 +0.625 0.0625 0.1875 +0.625 0.0625 0.2188 +0.625 0.0625 0.25 +0.625 0.0625 0.2812 +0.625 0.0625 0.3125 +0.625 0.0625 0.3438 +0.625 0.0625 0.375 +0.625 0.0625 0.4062 +0.625 0.0625 0.4375 +0.625 0.0625 0.4688 +0.625 0.0625 0.5 +0.625 0.0625 0.5312 +0.625 0.0625 0.5625 +0.625 0.0625 0.5938 +0.625 0.0625 0.625 +0.625 0.0625 0.6562 +0.625 0.0625 0.6875 +0.625 0.0625 0.7188 +0.625 0.0625 0.75 +0.625 0.0625 0.7812 +0.625 0.0625 0.8125 +0.625 0.0625 0.8438 +0.625 0.0625 0.875 +0.625 0.0625 0.9062 +0.625 0.0625 0.9375 +0.625 0.0625 0.9688 +0.625 0.0625 1 +0.625 0.09375 0 +0.625 0.09375 0.03125 +0.625 0.09375 0.0625 +0.625 0.09375 0.09375 +0.625 0.09375 0.125 +0.625 0.09375 0.1562 +0.625 0.09375 0.1875 +0.625 0.09375 0.2188 +0.625 0.09375 0.25 +0.625 0.09375 0.2812 +0.625 0.09375 0.3125 +0.625 0.09375 0.3438 +0.625 0.09375 0.375 +0.625 0.09375 0.4062 +0.625 0.09375 0.4375 +0.625 0.09375 0.4688 +0.625 0.09375 0.5 +0.625 0.09375 0.5312 +0.625 0.09375 0.5625 +0.625 0.09375 0.5938 +0.625 0.09375 0.625 +0.625 0.09375 0.6562 +0.625 0.09375 0.6875 +0.625 0.09375 0.7188 +0.625 0.09375 0.75 +0.625 0.09375 0.7812 +0.625 0.09375 0.8125 +0.625 0.09375 0.8438 +0.625 0.09375 0.875 +0.625 0.09375 0.9062 +0.625 0.09375 0.9375 +0.625 0.09375 0.9688 +0.625 0.09375 1 +0.625 0.125 0 +0.625 0.125 0.03125 +0.625 0.125 0.0625 +0.625 0.125 0.09375 +0.625 0.125 0.125 +0.625 0.125 0.1562 +0.625 0.125 0.1875 +0.625 0.125 0.2188 +0.625 0.125 0.25 +0.625 0.125 0.2812 +0.625 0.125 0.3125 +0.625 0.125 0.3438 +0.625 0.125 0.375 +0.625 0.125 0.4062 +0.625 0.125 0.4375 +0.625 0.125 0.4688 +0.625 0.125 0.5 +0.625 0.125 0.5312 +0.625 0.125 0.5625 +0.625 0.125 0.5938 +0.625 0.125 0.625 +0.625 0.125 0.6562 +0.625 0.125 0.6875 +0.625 0.125 0.7188 +0.625 0.125 0.75 +0.625 0.125 0.7812 +0.625 0.125 0.8125 +0.625 0.125 0.8438 +0.625 0.125 0.875 +0.625 0.125 0.9062 +0.625 0.125 0.9375 +0.625 0.125 0.9688 +0.625 0.125 1 +0.625 0.1562 0 +0.625 0.1562 0.03125 +0.625 0.1562 0.0625 +0.625 0.1562 0.09375 +0.625 0.1562 0.125 +0.625 0.1562 0.1562 +0.625 0.1562 0.1875 +0.625 0.1562 0.2188 +0.625 0.1562 0.25 +0.625 0.1562 0.2812 +0.625 0.1562 0.3125 +0.625 0.1562 0.3438 +0.625 0.1562 0.375 +0.625 0.1562 0.4062 +0.625 0.1562 0.4375 +0.625 0.1562 0.4688 +0.625 0.1562 0.5 +0.625 0.1562 0.5312 +0.625 0.1562 0.5625 +0.625 0.1562 0.5938 +0.625 0.1562 0.625 +0.625 0.1562 0.6562 +0.625 0.1562 0.6875 +0.625 0.1562 0.7188 +0.625 0.1562 0.75 +0.625 0.1562 0.7812 +0.625 0.1562 0.8125 +0.625 0.1562 0.8438 +0.625 0.1562 0.875 +0.625 0.1562 0.9062 +0.625 0.1562 0.9375 +0.625 0.1562 0.9688 +0.625 0.1562 1 +0.625 0.1875 0 +0.625 0.1875 0.03125 +0.625 0.1875 0.0625 +0.625 0.1875 0.09375 +0.625 0.1875 0.125 +0.625 0.1875 0.1562 +0.625 0.1875 0.1875 +0.625 0.1875 0.2188 +0.625 0.1875 0.25 +0.625 0.1875 0.2812 +0.625 0.1875 0.3125 +0.625 0.1875 0.3438 +0.625 0.1875 0.375 +0.625 0.1875 0.4062 +0.625 0.1875 0.4375 +0.625 0.1875 0.4688 +0.625 0.1875 0.5 +0.625 0.1875 0.5312 +0.625 0.1875 0.5625 +0.625 0.1875 0.5938 +0.625 0.1875 0.625 +0.625 0.1875 0.6562 +0.625 0.1875 0.6875 +0.625 0.1875 0.7188 +0.625 0.1875 0.75 +0.625 0.1875 0.7812 +0.625 0.1875 0.8125 +0.625 0.1875 0.8438 +0.625 0.1875 0.875 +0.625 0.1875 0.9062 +0.625 0.1875 0.9375 +0.625 0.1875 0.9688 +0.625 0.1875 1 +0.625 0.2188 0 +0.625 0.2188 0.03125 +0.625 0.2188 0.0625 +0.625 0.2188 0.09375 +0.625 0.2188 0.125 +0.625 0.2188 0.1562 +0.625 0.2188 0.1875 +0.625 0.2188 0.2188 +0.625 0.2188 0.25 +0.625 0.2188 0.2812 +0.625 0.2188 0.3125 +0.625 0.2188 0.3438 +0.625 0.2188 0.375 +0.625 0.2188 0.4062 +0.625 0.2188 0.4375 +0.625 0.2188 0.4688 +0.625 0.2188 0.5 +0.625 0.2188 0.5312 +0.625 0.2188 0.5625 +0.625 0.2188 0.5938 +0.625 0.2188 0.625 +0.625 0.2188 0.6562 +0.625 0.2188 0.6875 +0.625 0.2188 0.7188 +0.625 0.2188 0.75 +0.625 0.2188 0.7812 +0.625 0.2188 0.8125 +0.625 0.2188 0.8438 +0.625 0.2188 0.875 +0.625 0.2188 0.9062 +0.625 0.2188 0.9375 +0.625 0.2188 0.9688 +0.625 0.2188 1 +0.625 0.25 0 +0.625 0.25 0.03125 +0.625 0.25 0.0625 +0.625 0.25 0.09375 +0.625 0.25 0.125 +0.625 0.25 0.1562 +0.625 0.25 0.1875 +0.625 0.25 0.2188 +0.625 0.25 0.25 +0.625 0.25 0.2812 +0.625 0.25 0.3125 +0.625 0.25 0.3438 +0.625 0.25 0.375 +0.625 0.25 0.4062 +0.625 0.25 0.4375 +0.625 0.25 0.4688 +0.625 0.25 0.5 +0.625 0.25 0.5312 +0.625 0.25 0.5625 +0.625 0.25 0.5938 +0.625 0.25 0.625 +0.625 0.25 0.6562 +0.625 0.25 0.6875 +0.625 0.25 0.7188 +0.625 0.25 0.75 +0.625 0.25 0.7812 +0.625 0.25 0.8125 +0.625 0.25 0.8438 +0.625 0.25 0.875 +0.625 0.25 0.9062 +0.625 0.25 0.9375 +0.625 0.25 0.9688 +0.625 0.25 1 +0.625 0.2812 0 +0.625 0.2812 0.03125 +0.625 0.2812 0.0625 +0.625 0.2812 0.09375 +0.625 0.2812 0.125 +0.625 0.2812 0.1562 +0.625 0.2812 0.1875 +0.625 0.2812 0.2188 +0.625 0.2812 0.25 +0.625 0.2812 0.2812 +0.625 0.2812 0.3125 +0.625 0.2812 0.3438 +0.625 0.2812 0.375 +0.625 0.2812 0.4062 +0.625 0.2812 0.4375 +0.625 0.2812 0.4688 +0.625 0.2812 0.5 +0.625 0.2812 0.5312 +0.625 0.2812 0.5625 +0.625 0.2812 0.5938 +0.625 0.2812 0.625 +0.625 0.2812 0.6562 +0.625 0.2812 0.6875 +0.625 0.2812 0.7188 +0.625 0.2812 0.75 +0.625 0.2812 0.7812 +0.625 0.2812 0.8125 +0.625 0.2812 0.8438 +0.625 0.2812 0.875 +0.625 0.2812 0.9062 +0.625 0.2812 0.9375 +0.625 0.2812 0.9688 +0.625 0.2812 1 +0.625 0.3125 0 +0.625 0.3125 0.03125 +0.625 0.3125 0.0625 +0.625 0.3125 0.09375 +0.625 0.3125 0.125 +0.625 0.3125 0.1562 +0.625 0.3125 0.1875 +0.625 0.3125 0.2188 +0.625 0.3125 0.25 +0.625 0.3125 0.2812 +0.625 0.3125 0.3125 +0.625 0.3125 0.3438 +0.625 0.3125 0.375 +0.625 0.3125 0.4062 +0.625 0.3125 0.4375 +0.625 0.3125 0.4688 +0.625 0.3125 0.5 +0.625 0.3125 0.5312 +0.625 0.3125 0.5625 +0.625 0.3125 0.5938 +0.625 0.3125 0.625 +0.625 0.3125 0.6562 +0.625 0.3125 0.6875 +0.625 0.3125 0.7188 +0.625 0.3125 0.75 +0.625 0.3125 0.7812 +0.625 0.3125 0.8125 +0.625 0.3125 0.8438 +0.625 0.3125 0.875 +0.625 0.3125 0.9062 +0.625 0.3125 0.9375 +0.625 0.3125 0.9688 +0.625 0.3125 1 +0.625 0.3438 0 +0.625 0.3438 0.03125 +0.625 0.3438 0.0625 +0.625 0.3438 0.09375 +0.625 0.3438 0.125 +0.625 0.3438 0.1562 +0.625 0.3438 0.1875 +0.625 0.3438 0.2188 +0.625 0.3438 0.25 +0.625 0.3438 0.2812 +0.625 0.3438 0.3125 +0.625 0.3438 0.3438 +0.625 0.3438 0.375 +0.625 0.3438 0.4062 +0.625 0.3438 0.4375 +0.625 0.3438 0.4688 +0.625 0.3438 0.5 +0.625 0.3438 0.5312 +0.625 0.3438 0.5625 +0.625 0.3438 0.5938 +0.625 0.3438 0.625 +0.625 0.3438 0.6562 +0.625 0.3438 0.6875 +0.625 0.3438 0.7188 +0.625 0.3438 0.75 +0.625 0.3438 0.7812 +0.625 0.3438 0.8125 +0.625 0.3438 0.8438 +0.625 0.3438 0.875 +0.625 0.3438 0.9062 +0.625 0.3438 0.9375 +0.625 0.3438 0.9688 +0.625 0.3438 1 +0.625 0.375 0 +0.625 0.375 0.03125 +0.625 0.375 0.0625 +0.625 0.375 0.09375 +0.625 0.375 0.125 +0.625 0.375 0.1562 +0.625 0.375 0.1875 +0.625 0.375 0.2188 +0.625 0.375 0.25 +0.625 0.375 0.2812 +0.625 0.375 0.3125 +0.625 0.375 0.3438 +0.625 0.375 0.375 +0.625 0.375 0.4062 +0.625 0.375 0.4375 +0.625 0.375 0.4688 +0.625 0.375 0.5 +0.625 0.375 0.5312 +0.625 0.375 0.5625 +0.625 0.375 0.5938 +0.625 0.375 0.625 +0.625 0.375 0.6562 +0.625 0.375 0.6875 +0.625 0.375 0.7188 +0.625 0.375 0.75 +0.625 0.375 0.7812 +0.625 0.375 0.8125 +0.625 0.375 0.8438 +0.625 0.375 0.875 +0.625 0.375 0.9062 +0.625 0.375 0.9375 +0.625 0.375 0.9688 +0.625 0.375 1 +0.625 0.4062 0 +0.625 0.4062 0.03125 +0.625 0.4062 0.0625 +0.625 0.4062 0.09375 +0.625 0.4062 0.125 +0.625 0.4062 0.1562 +0.625 0.4062 0.1875 +0.625 0.4062 0.2188 +0.625 0.4062 0.25 +0.625 0.4062 0.2812 +0.625 0.4062 0.3125 +0.625 0.4062 0.3438 +0.625 0.4062 0.375 +0.625 0.4062 0.4062 +0.625 0.4062 0.4375 +0.625 0.4062 0.4688 +0.625 0.4062 0.5 +0.625 0.4062 0.5312 +0.625 0.4062 0.5625 +0.625 0.4062 0.5938 +0.625 0.4062 0.625 +0.625 0.4062 0.6562 +0.625 0.4062 0.6875 +0.625 0.4062 0.7188 +0.625 0.4062 0.75 +0.625 0.4062 0.7812 +0.625 0.4062 0.8125 +0.625 0.4062 0.8438 +0.625 0.4062 0.875 +0.625 0.4062 0.9062 +0.625 0.4062 0.9375 +0.625 0.4062 0.9688 +0.625 0.4062 1 +0.625 0.4375 0 +0.625 0.4375 0.03125 +0.625 0.4375 0.0625 +0.625 0.4375 0.09375 +0.625 0.4375 0.125 +0.625 0.4375 0.1562 +0.625 0.4375 0.1875 +0.625 0.4375 0.2188 +0.625 0.4375 0.25 +0.625 0.4375 0.2812 +0.625 0.4375 0.3125 +0.625 0.4375 0.3438 +0.625 0.4375 0.375 +0.625 0.4375 0.4062 +0.625 0.4375 0.4375 +0.625 0.4375 0.4688 +0.625 0.4375 0.5 +0.625 0.4375 0.5312 +0.625 0.4375 0.5625 +0.625 0.4375 0.5938 +0.625 0.4375 0.625 +0.625 0.4375 0.6562 +0.625 0.4375 0.6875 +0.625 0.4375 0.7188 +0.625 0.4375 0.75 +0.625 0.4375 0.7812 +0.625 0.4375 0.8125 +0.625 0.4375 0.8438 +0.625 0.4375 0.875 +0.625 0.4375 0.9062 +0.625 0.4375 0.9375 +0.625 0.4375 0.9688 +0.625 0.4375 1 +0.625 0.4688 0 +0.625 0.4688 0.03125 +0.625 0.4688 0.0625 +0.625 0.4688 0.09375 +0.625 0.4688 0.125 +0.625 0.4688 0.1562 +0.625 0.4688 0.1875 +0.625 0.4688 0.2188 +0.625 0.4688 0.25 +0.625 0.4688 0.2812 +0.625 0.4688 0.3125 +0.625 0.4688 0.3438 +0.625 0.4688 0.375 +0.625 0.4688 0.4062 +0.625 0.4688 0.4375 +0.625 0.4688 0.4688 +0.625 0.4688 0.5 +0.625 0.4688 0.5312 +0.625 0.4688 0.5625 +0.625 0.4688 0.5938 +0.625 0.4688 0.625 +0.625 0.4688 0.6562 +0.625 0.4688 0.6875 +0.625 0.4688 0.7188 +0.625 0.4688 0.75 +0.625 0.4688 0.7812 +0.625 0.4688 0.8125 +0.625 0.4688 0.8438 +0.625 0.4688 0.875 +0.625 0.4688 0.9062 +0.625 0.4688 0.9375 +0.625 0.4688 0.9688 +0.625 0.4688 1 +0.625 0.5 0 +0.625 0.5 0.03125 +0.625 0.5 0.0625 +0.625 0.5 0.09375 +0.625 0.5 0.125 +0.625 0.5 0.1562 +0.625 0.5 0.1875 +0.625 0.5 0.2188 +0.625 0.5 0.25 +0.625 0.5 0.2812 +0.625 0.5 0.3125 +0.625 0.5 0.3438 +0.625 0.5 0.375 +0.625 0.5 0.4062 +0.625 0.5 0.4375 +0.625 0.5 0.4688 +0.625 0.5 0.5 +0.625 0.5 0.5312 +0.625 0.5 0.5625 +0.625 0.5 0.5938 +0.625 0.5 0.625 +0.625 0.5 0.6562 +0.625 0.5 0.6875 +0.625 0.5 0.7188 +0.625 0.5 0.75 +0.625 0.5 0.7812 +0.625 0.5 0.8125 +0.625 0.5 0.8438 +0.625 0.5 0.875 +0.625 0.5 0.9062 +0.625 0.5 0.9375 +0.625 0.5 0.9688 +0.625 0.5 1 +0.625 0.5312 0 +0.625 0.5312 0.03125 +0.625 0.5312 0.0625 +0.625 0.5312 0.09375 +0.625 0.5312 0.125 +0.625 0.5312 0.1562 +0.625 0.5312 0.1875 +0.625 0.5312 0.2188 +0.625 0.5312 0.25 +0.625 0.5312 0.2812 +0.625 0.5312 0.3125 +0.625 0.5312 0.3438 +0.625 0.5312 0.375 +0.625 0.5312 0.4062 +0.625 0.5312 0.4375 +0.625 0.5312 0.4688 +0.625 0.5312 0.5 +0.625 0.5312 0.5312 +0.625 0.5312 0.5625 +0.625 0.5312 0.5938 +0.625 0.5312 0.625 +0.625 0.5312 0.6562 +0.625 0.5312 0.6875 +0.625 0.5312 0.7188 +0.625 0.5312 0.75 +0.625 0.5312 0.7812 +0.625 0.5312 0.8125 +0.625 0.5312 0.8438 +0.625 0.5312 0.875 +0.625 0.5312 0.9062 +0.625 0.5312 0.9375 +0.625 0.5312 0.9688 +0.625 0.5312 1 +0.625 0.5625 0 +0.625 0.5625 0.03125 +0.625 0.5625 0.0625 +0.625 0.5625 0.09375 +0.625 0.5625 0.125 +0.625 0.5625 0.1562 +0.625 0.5625 0.1875 +0.625 0.5625 0.2188 +0.625 0.5625 0.25 +0.625 0.5625 0.2812 +0.625 0.5625 0.3125 +0.625 0.5625 0.3438 +0.625 0.5625 0.375 +0.625 0.5625 0.4062 +0.625 0.5625 0.4375 +0.625 0.5625 0.4688 +0.625 0.5625 0.5 +0.625 0.5625 0.5312 +0.625 0.5625 0.5625 +0.625 0.5625 0.5938 +0.625 0.5625 0.625 +0.625 0.5625 0.6562 +0.625 0.5625 0.6875 +0.625 0.5625 0.7188 +0.625 0.5625 0.75 +0.625 0.5625 0.7812 +0.625 0.5625 0.8125 +0.625 0.5625 0.8438 +0.625 0.5625 0.875 +0.625 0.5625 0.9062 +0.625 0.5625 0.9375 +0.625 0.5625 0.9688 +0.625 0.5625 1 +0.625 0.5938 0 +0.625 0.5938 0.03125 +0.625 0.5938 0.0625 +0.625 0.5938 0.09375 +0.625 0.5938 0.125 +0.625 0.5938 0.1562 +0.625 0.5938 0.1875 +0.625 0.5938 0.2188 +0.625 0.5938 0.25 +0.625 0.5938 0.2812 +0.625 0.5938 0.3125 +0.625 0.5938 0.3438 +0.625 0.5938 0.375 +0.625 0.5938 0.4062 +0.625 0.5938 0.4375 +0.625 0.5938 0.4688 +0.625 0.5938 0.5 +0.625 0.5938 0.5312 +0.625 0.5938 0.5625 +0.625 0.5938 0.5938 +0.625 0.5938 0.625 +0.625 0.5938 0.6562 +0.625 0.5938 0.6875 +0.625 0.5938 0.7188 +0.625 0.5938 0.75 +0.625 0.5938 0.7812 +0.625 0.5938 0.8125 +0.625 0.5938 0.8438 +0.625 0.5938 0.875 +0.625 0.5938 0.9062 +0.625 0.5938 0.9375 +0.625 0.5938 0.9688 +0.625 0.5938 1 +0.625 0.625 0 +0.625 0.625 0.03125 +0.625 0.625 0.0625 +0.625 0.625 0.09375 +0.625 0.625 0.125 +0.625 0.625 0.1562 +0.625 0.625 0.1875 +0.625 0.625 0.2188 +0.625 0.625 0.25 +0.625 0.625 0.2812 +0.625 0.625 0.3125 +0.625 0.625 0.3438 +0.625 0.625 0.375 +0.625 0.625 0.4062 +0.625 0.625 0.4375 +0.625 0.625 0.4688 +0.625 0.625 0.5 +0.625 0.625 0.5312 +0.625 0.625 0.5625 +0.625 0.625 0.5938 +0.625 0.625 0.625 +0.625 0.625 0.6562 +0.625 0.625 0.6875 +0.625 0.625 0.7188 +0.625 0.625 0.75 +0.625 0.625 0.7812 +0.625 0.625 0.8125 +0.625 0.625 0.8438 +0.625 0.625 0.875 +0.625 0.625 0.9062 +0.625 0.625 0.9375 +0.625 0.625 0.9688 +0.625 0.625 1 +0.625 0.6562 0 +0.625 0.6562 0.03125 +0.625 0.6562 0.0625 +0.625 0.6562 0.09375 +0.625 0.6562 0.125 +0.625 0.6562 0.1562 +0.625 0.6562 0.1875 +0.625 0.6562 0.2188 +0.625 0.6562 0.25 +0.625 0.6562 0.2812 +0.625 0.6562 0.3125 +0.625 0.6562 0.3438 +0.625 0.6562 0.375 +0.625 0.6562 0.4062 +0.625 0.6562 0.4375 +0.625 0.6562 0.4688 +0.625 0.6562 0.5 +0.625 0.6562 0.5312 +0.625 0.6562 0.5625 +0.625 0.6562 0.5938 +0.625 0.6562 0.625 +0.625 0.6562 0.6562 +0.625 0.6562 0.6875 +0.625 0.6562 0.7188 +0.625 0.6562 0.75 +0.625 0.6562 0.7812 +0.625 0.6562 0.8125 +0.625 0.6562 0.8438 +0.625 0.6562 0.875 +0.625 0.6562 0.9062 +0.625 0.6562 0.9375 +0.625 0.6562 0.9688 +0.625 0.6562 1 +0.625 0.6875 0 +0.625 0.6875 0.03125 +0.625 0.6875 0.0625 +0.625 0.6875 0.09375 +0.625 0.6875 0.125 +0.625 0.6875 0.1562 +0.625 0.6875 0.1875 +0.625 0.6875 0.2188 +0.625 0.6875 0.25 +0.625 0.6875 0.2812 +0.625 0.6875 0.3125 +0.625 0.6875 0.3438 +0.625 0.6875 0.375 +0.625 0.6875 0.4062 +0.625 0.6875 0.4375 +0.625 0.6875 0.4688 +0.625 0.6875 0.5 +0.625 0.6875 0.5312 +0.625 0.6875 0.5625 +0.625 0.6875 0.5938 +0.625 0.6875 0.625 +0.625 0.6875 0.6562 +0.625 0.6875 0.6875 +0.625 0.6875 0.7188 +0.625 0.6875 0.75 +0.625 0.6875 0.7812 +0.625 0.6875 0.8125 +0.625 0.6875 0.8438 +0.625 0.6875 0.875 +0.625 0.6875 0.9062 +0.625 0.6875 0.9375 +0.625 0.6875 0.9688 +0.625 0.6875 1 +0.625 0.7188 0 +0.625 0.7188 0.03125 +0.625 0.7188 0.0625 +0.625 0.7188 0.09375 +0.625 0.7188 0.125 +0.625 0.7188 0.1562 +0.625 0.7188 0.1875 +0.625 0.7188 0.2188 +0.625 0.7188 0.25 +0.625 0.7188 0.2812 +0.625 0.7188 0.3125 +0.625 0.7188 0.3438 +0.625 0.7188 0.375 +0.625 0.7188 0.4062 +0.625 0.7188 0.4375 +0.625 0.7188 0.4688 +0.625 0.7188 0.5 +0.625 0.7188 0.5312 +0.625 0.7188 0.5625 +0.625 0.7188 0.5938 +0.625 0.7188 0.625 +0.625 0.7188 0.6562 +0.625 0.7188 0.6875 +0.625 0.7188 0.7188 +0.625 0.7188 0.75 +0.625 0.7188 0.7812 +0.625 0.7188 0.8125 +0.625 0.7188 0.8438 +0.625 0.7188 0.875 +0.625 0.7188 0.9062 +0.625 0.7188 0.9375 +0.625 0.7188 0.9688 +0.625 0.7188 1 +0.625 0.75 0 +0.625 0.75 0.03125 +0.625 0.75 0.0625 +0.625 0.75 0.09375 +0.625 0.75 0.125 +0.625 0.75 0.1562 +0.625 0.75 0.1875 +0.625 0.75 0.2188 +0.625 0.75 0.25 +0.625 0.75 0.2812 +0.625 0.75 0.3125 +0.625 0.75 0.3438 +0.625 0.75 0.375 +0.625 0.75 0.4062 +0.625 0.75 0.4375 +0.625 0.75 0.4688 +0.625 0.75 0.5 +0.625 0.75 0.5312 +0.625 0.75 0.5625 +0.625 0.75 0.5938 +0.625 0.75 0.625 +0.625 0.75 0.6562 +0.625 0.75 0.6875 +0.625 0.75 0.7188 +0.625 0.75 0.75 +0.625 0.75 0.7812 +0.625 0.75 0.8125 +0.625 0.75 0.8438 +0.625 0.75 0.875 +0.625 0.75 0.9062 +0.625 0.75 0.9375 +0.625 0.75 0.9688 +0.625 0.75 1 +0.625 0.7812 0 +0.625 0.7812 0.03125 +0.625 0.7812 0.0625 +0.625 0.7812 0.09375 +0.625 0.7812 0.125 +0.625 0.7812 0.1562 +0.625 0.7812 0.1875 +0.625 0.7812 0.2188 +0.625 0.7812 0.25 +0.625 0.7812 0.2812 +0.625 0.7812 0.3125 +0.625 0.7812 0.3438 +0.625 0.7812 0.375 +0.625 0.7812 0.4062 +0.625 0.7812 0.4375 +0.625 0.7812 0.4688 +0.625 0.7812 0.5 +0.625 0.7812 0.5312 +0.625 0.7812 0.5625 +0.625 0.7812 0.5938 +0.625 0.7812 0.625 +0.625 0.7812 0.6562 +0.625 0.7812 0.6875 +0.625 0.7812 0.7188 +0.625 0.7812 0.75 +0.625 0.7812 0.7812 +0.625 0.7812 0.8125 +0.625 0.7812 0.8438 +0.625 0.7812 0.875 +0.625 0.7812 0.9062 +0.625 0.7812 0.9375 +0.625 0.7812 0.9688 +0.625 0.7812 1 +0.625 0.8125 0 +0.625 0.8125 0.03125 +0.625 0.8125 0.0625 +0.625 0.8125 0.09375 +0.625 0.8125 0.125 +0.625 0.8125 0.1562 +0.625 0.8125 0.1875 +0.625 0.8125 0.2188 +0.625 0.8125 0.25 +0.625 0.8125 0.2812 +0.625 0.8125 0.3125 +0.625 0.8125 0.3438 +0.625 0.8125 0.375 +0.625 0.8125 0.4062 +0.625 0.8125 0.4375 +0.625 0.8125 0.4688 +0.625 0.8125 0.5 +0.625 0.8125 0.5312 +0.625 0.8125 0.5625 +0.625 0.8125 0.5938 +0.625 0.8125 0.625 +0.625 0.8125 0.6562 +0.625 0.8125 0.6875 +0.625 0.8125 0.7188 +0.625 0.8125 0.75 +0.625 0.8125 0.7812 +0.625 0.8125 0.8125 +0.625 0.8125 0.8438 +0.625 0.8125 0.875 +0.625 0.8125 0.9062 +0.625 0.8125 0.9375 +0.625 0.8125 0.9688 +0.625 0.8125 1 +0.625 0.8438 0 +0.625 0.8438 0.03125 +0.625 0.8438 0.0625 +0.625 0.8438 0.09375 +0.625 0.8438 0.125 +0.625 0.8438 0.1562 +0.625 0.8438 0.1875 +0.625 0.8438 0.2188 +0.625 0.8438 0.25 +0.625 0.8438 0.2812 +0.625 0.8438 0.3125 +0.625 0.8438 0.3438 +0.625 0.8438 0.375 +0.625 0.8438 0.4062 +0.625 0.8438 0.4375 +0.625 0.8438 0.4688 +0.625 0.8438 0.5 +0.625 0.8438 0.5312 +0.625 0.8438 0.5625 +0.625 0.8438 0.5938 +0.625 0.8438 0.625 +0.625 0.8438 0.6562 +0.625 0.8438 0.6875 +0.625 0.8438 0.7188 +0.625 0.8438 0.75 +0.625 0.8438 0.7812 +0.625 0.8438 0.8125 +0.625 0.8438 0.8438 +0.625 0.8438 0.875 +0.625 0.8438 0.9062 +0.625 0.8438 0.9375 +0.625 0.8438 0.9688 +0.625 0.8438 1 +0.625 0.875 0 +0.625 0.875 0.03125 +0.625 0.875 0.0625 +0.625 0.875 0.09375 +0.625 0.875 0.125 +0.625 0.875 0.1562 +0.625 0.875 0.1875 +0.625 0.875 0.2188 +0.625 0.875 0.25 +0.625 0.875 0.2812 +0.625 0.875 0.3125 +0.625 0.875 0.3438 +0.625 0.875 0.375 +0.625 0.875 0.4062 +0.625 0.875 0.4375 +0.625 0.875 0.4688 +0.625 0.875 0.5 +0.625 0.875 0.5312 +0.625 0.875 0.5625 +0.625 0.875 0.5938 +0.625 0.875 0.625 +0.625 0.875 0.6562 +0.625 0.875 0.6875 +0.625 0.875 0.7188 +0.625 0.875 0.75 +0.625 0.875 0.7812 +0.625 0.875 0.8125 +0.625 0.875 0.8438 +0.625 0.875 0.875 +0.625 0.875 0.9062 +0.625 0.875 0.9375 +0.625 0.875 0.9688 +0.625 0.875 1 +0.625 0.9062 0 +0.625 0.9062 0.03125 +0.625 0.9062 0.0625 +0.625 0.9062 0.09375 +0.625 0.9062 0.125 +0.625 0.9062 0.1562 +0.625 0.9062 0.1875 +0.625 0.9062 0.2188 +0.625 0.9062 0.25 +0.625 0.9062 0.2812 +0.625 0.9062 0.3125 +0.625 0.9062 0.3438 +0.625 0.9062 0.375 +0.625 0.9062 0.4062 +0.625 0.9062 0.4375 +0.625 0.9062 0.4688 +0.625 0.9062 0.5 +0.625 0.9062 0.5312 +0.625 0.9062 0.5625 +0.625 0.9062 0.5938 +0.625 0.9062 0.625 +0.625 0.9062 0.6562 +0.625 0.9062 0.6875 +0.625 0.9062 0.7188 +0.625 0.9062 0.75 +0.625 0.9062 0.7812 +0.625 0.9062 0.8125 +0.625 0.9062 0.8438 +0.625 0.9062 0.875 +0.625 0.9062 0.9062 +0.625 0.9062 0.9375 +0.625 0.9062 0.9688 +0.625 0.9062 1 +0.625 0.9375 0 +0.625 0.9375 0.03125 +0.625 0.9375 0.0625 +0.625 0.9375 0.09375 +0.625 0.9375 0.125 +0.625 0.9375 0.1562 +0.625 0.9375 0.1875 +0.625 0.9375 0.2188 +0.625 0.9375 0.25 +0.625 0.9375 0.2812 +0.625 0.9375 0.3125 +0.625 0.9375 0.3438 +0.625 0.9375 0.375 +0.625 0.9375 0.4062 +0.625 0.9375 0.4375 +0.625 0.9375 0.4688 +0.625 0.9375 0.5 +0.625 0.9375 0.5312 +0.625 0.9375 0.5625 +0.625 0.9375 0.5938 +0.625 0.9375 0.625 +0.625 0.9375 0.6562 +0.625 0.9375 0.6875 +0.625 0.9375 0.7188 +0.625 0.9375 0.75 +0.625 0.9375 0.7812 +0.625 0.9375 0.8125 +0.625 0.9375 0.8438 +0.625 0.9375 0.875 +0.625 0.9375 0.9062 +0.625 0.9375 0.9375 +0.625 0.9375 0.9688 +0.625 0.9375 1 +0.625 0.9688 0 +0.625 0.9688 0.03125 +0.625 0.9688 0.0625 +0.625 0.9688 0.09375 +0.625 0.9688 0.125 +0.625 0.9688 0.1562 +0.625 0.9688 0.1875 +0.625 0.9688 0.2188 +0.625 0.9688 0.25 +0.625 0.9688 0.2812 +0.625 0.9688 0.3125 +0.625 0.9688 0.3438 +0.625 0.9688 0.375 +0.625 0.9688 0.4062 +0.625 0.9688 0.4375 +0.625 0.9688 0.4688 +0.625 0.9688 0.5 +0.625 0.9688 0.5312 +0.625 0.9688 0.5625 +0.625 0.9688 0.5938 +0.625 0.9688 0.625 +0.625 0.9688 0.6562 +0.625 0.9688 0.6875 +0.625 0.9688 0.7188 +0.625 0.9688 0.75 +0.625 0.9688 0.7812 +0.625 0.9688 0.8125 +0.625 0.9688 0.8438 +0.625 0.9688 0.875 +0.625 0.9688 0.9062 +0.625 0.9688 0.9375 +0.625 0.9688 0.9688 +0.625 0.9688 1 +0.625 1 0 +0.625 1 0.03125 +0.625 1 0.0625 +0.625 1 0.09375 +0.625 1 0.125 +0.625 1 0.1562 +0.625 1 0.1875 +0.625 1 0.2188 +0.625 1 0.25 +0.625 1 0.2812 +0.625 1 0.3125 +0.625 1 0.3438 +0.625 1 0.375 +0.625 1 0.4062 +0.625 1 0.4375 +0.625 1 0.4688 +0.625 1 0.5 +0.625 1 0.5312 +0.625 1 0.5625 +0.625 1 0.5938 +0.625 1 0.625 +0.625 1 0.6562 +0.625 1 0.6875 +0.625 1 0.7188 +0.625 1 0.75 +0.625 1 0.7812 +0.625 1 0.8125 +0.625 1 0.8438 +0.625 1 0.875 +0.625 1 0.9062 +0.625 1 0.9375 +0.625 1 0.9688 +0.625 1 1 +0.6562 0 0 +0.6562 0 0.03125 +0.6562 0 0.0625 +0.6562 0 0.09375 +0.6562 0 0.125 +0.6562 0 0.1562 +0.6562 0 0.1875 +0.6562 0 0.2188 +0.6562 0 0.25 +0.6562 0 0.2812 +0.6562 0 0.3125 +0.6562 0 0.3438 +0.6562 0 0.375 +0.6562 0 0.4062 +0.6562 0 0.4375 +0.6562 0 0.4688 +0.6562 0 0.5 +0.6562 0 0.5312 +0.6562 0 0.5625 +0.6562 0 0.5938 +0.6562 0 0.625 +0.6562 0 0.6562 +0.6562 0 0.6875 +0.6562 0 0.7188 +0.6562 0 0.75 +0.6562 0 0.7812 +0.6562 0 0.8125 +0.6562 0 0.8438 +0.6562 0 0.875 +0.6562 0 0.9062 +0.6562 0 0.9375 +0.6562 0 0.9688 +0.6562 0 1 +0.6562 0.03125 0 +0.6562 0.03125 0.03125 +0.6562 0.03125 0.0625 +0.6562 0.03125 0.09375 +0.6562 0.03125 0.125 +0.6562 0.03125 0.1562 +0.6562 0.03125 0.1875 +0.6562 0.03125 0.2188 +0.6562 0.03125 0.25 +0.6562 0.03125 0.2812 +0.6562 0.03125 0.3125 +0.6562 0.03125 0.3438 +0.6562 0.03125 0.375 +0.6562 0.03125 0.4062 +0.6562 0.03125 0.4375 +0.6562 0.03125 0.4688 +0.6562 0.03125 0.5 +0.6562 0.03125 0.5312 +0.6562 0.03125 0.5625 +0.6562 0.03125 0.5938 +0.6562 0.03125 0.625 +0.6562 0.03125 0.6562 +0.6562 0.03125 0.6875 +0.6562 0.03125 0.7188 +0.6562 0.03125 0.75 +0.6562 0.03125 0.7812 +0.6562 0.03125 0.8125 +0.6562 0.03125 0.8438 +0.6562 0.03125 0.875 +0.6562 0.03125 0.9062 +0.6562 0.03125 0.9375 +0.6562 0.03125 0.9688 +0.6562 0.03125 1 +0.6562 0.0625 0 +0.6562 0.0625 0.03125 +0.6562 0.0625 0.0625 +0.6562 0.0625 0.09375 +0.6562 0.0625 0.125 +0.6562 0.0625 0.1562 +0.6562 0.0625 0.1875 +0.6562 0.0625 0.2188 +0.6562 0.0625 0.25 +0.6562 0.0625 0.2812 +0.6562 0.0625 0.3125 +0.6562 0.0625 0.3438 +0.6562 0.0625 0.375 +0.6562 0.0625 0.4062 +0.6562 0.0625 0.4375 +0.6562 0.0625 0.4688 +0.6562 0.0625 0.5 +0.6562 0.0625 0.5312 +0.6562 0.0625 0.5625 +0.6562 0.0625 0.5938 +0.6562 0.0625 0.625 +0.6562 0.0625 0.6562 +0.6562 0.0625 0.6875 +0.6562 0.0625 0.7188 +0.6562 0.0625 0.75 +0.6562 0.0625 0.7812 +0.6562 0.0625 0.8125 +0.6562 0.0625 0.8438 +0.6562 0.0625 0.875 +0.6562 0.0625 0.9062 +0.6562 0.0625 0.9375 +0.6562 0.0625 0.9688 +0.6562 0.0625 1 +0.6562 0.09375 0 +0.6562 0.09375 0.03125 +0.6562 0.09375 0.0625 +0.6562 0.09375 0.09375 +0.6562 0.09375 0.125 +0.6562 0.09375 0.1562 +0.6562 0.09375 0.1875 +0.6562 0.09375 0.2188 +0.6562 0.09375 0.25 +0.6562 0.09375 0.2812 +0.6562 0.09375 0.3125 +0.6562 0.09375 0.3438 +0.6562 0.09375 0.375 +0.6562 0.09375 0.4062 +0.6562 0.09375 0.4375 +0.6562 0.09375 0.4688 +0.6562 0.09375 0.5 +0.6562 0.09375 0.5312 +0.6562 0.09375 0.5625 +0.6562 0.09375 0.5938 +0.6562 0.09375 0.625 +0.6562 0.09375 0.6562 +0.6562 0.09375 0.6875 +0.6562 0.09375 0.7188 +0.6562 0.09375 0.75 +0.6562 0.09375 0.7812 +0.6562 0.09375 0.8125 +0.6562 0.09375 0.8438 +0.6562 0.09375 0.875 +0.6562 0.09375 0.9062 +0.6562 0.09375 0.9375 +0.6562 0.09375 0.9688 +0.6562 0.09375 1 +0.6562 0.125 0 +0.6562 0.125 0.03125 +0.6562 0.125 0.0625 +0.6562 0.125 0.09375 +0.6562 0.125 0.125 +0.6562 0.125 0.1562 +0.6562 0.125 0.1875 +0.6562 0.125 0.2188 +0.6562 0.125 0.25 +0.6562 0.125 0.2812 +0.6562 0.125 0.3125 +0.6562 0.125 0.3438 +0.6562 0.125 0.375 +0.6562 0.125 0.4062 +0.6562 0.125 0.4375 +0.6562 0.125 0.4688 +0.6562 0.125 0.5 +0.6562 0.125 0.5312 +0.6562 0.125 0.5625 +0.6562 0.125 0.5938 +0.6562 0.125 0.625 +0.6562 0.125 0.6562 +0.6562 0.125 0.6875 +0.6562 0.125 0.7188 +0.6562 0.125 0.75 +0.6562 0.125 0.7812 +0.6562 0.125 0.8125 +0.6562 0.125 0.8438 +0.6562 0.125 0.875 +0.6562 0.125 0.9062 +0.6562 0.125 0.9375 +0.6562 0.125 0.9688 +0.6562 0.125 1 +0.6562 0.1562 0 +0.6562 0.1562 0.03125 +0.6562 0.1562 0.0625 +0.6562 0.1562 0.09375 +0.6562 0.1562 0.125 +0.6562 0.1562 0.1562 +0.6562 0.1562 0.1875 +0.6562 0.1562 0.2188 +0.6562 0.1562 0.25 +0.6562 0.1562 0.2812 +0.6562 0.1562 0.3125 +0.6562 0.1562 0.3438 +0.6562 0.1562 0.375 +0.6562 0.1562 0.4062 +0.6562 0.1562 0.4375 +0.6562 0.1562 0.4688 +0.6562 0.1562 0.5 +0.6562 0.1562 0.5312 +0.6562 0.1562 0.5625 +0.6562 0.1562 0.5938 +0.6562 0.1562 0.625 +0.6562 0.1562 0.6562 +0.6562 0.1562 0.6875 +0.6562 0.1562 0.7188 +0.6562 0.1562 0.75 +0.6562 0.1562 0.7812 +0.6562 0.1562 0.8125 +0.6562 0.1562 0.8438 +0.6562 0.1562 0.875 +0.6562 0.1562 0.9062 +0.6562 0.1562 0.9375 +0.6562 0.1562 0.9688 +0.6562 0.1562 1 +0.6562 0.1875 0 +0.6562 0.1875 0.03125 +0.6562 0.1875 0.0625 +0.6562 0.1875 0.09375 +0.6562 0.1875 0.125 +0.6562 0.1875 0.1562 +0.6562 0.1875 0.1875 +0.6562 0.1875 0.2188 +0.6562 0.1875 0.25 +0.6562 0.1875 0.2812 +0.6562 0.1875 0.3125 +0.6562 0.1875 0.3438 +0.6562 0.1875 0.375 +0.6562 0.1875 0.4062 +0.6562 0.1875 0.4375 +0.6562 0.1875 0.4688 +0.6562 0.1875 0.5 +0.6562 0.1875 0.5312 +0.6562 0.1875 0.5625 +0.6562 0.1875 0.5938 +0.6562 0.1875 0.625 +0.6562 0.1875 0.6562 +0.6562 0.1875 0.6875 +0.6562 0.1875 0.7188 +0.6562 0.1875 0.75 +0.6562 0.1875 0.7812 +0.6562 0.1875 0.8125 +0.6562 0.1875 0.8438 +0.6562 0.1875 0.875 +0.6562 0.1875 0.9062 +0.6562 0.1875 0.9375 +0.6562 0.1875 0.9688 +0.6562 0.1875 1 +0.6562 0.2188 0 +0.6562 0.2188 0.03125 +0.6562 0.2188 0.0625 +0.6562 0.2188 0.09375 +0.6562 0.2188 0.125 +0.6562 0.2188 0.1562 +0.6562 0.2188 0.1875 +0.6562 0.2188 0.2188 +0.6562 0.2188 0.25 +0.6562 0.2188 0.2812 +0.6562 0.2188 0.3125 +0.6562 0.2188 0.3438 +0.6562 0.2188 0.375 +0.6562 0.2188 0.4062 +0.6562 0.2188 0.4375 +0.6562 0.2188 0.4688 +0.6562 0.2188 0.5 +0.6562 0.2188 0.5312 +0.6562 0.2188 0.5625 +0.6562 0.2188 0.5938 +0.6562 0.2188 0.625 +0.6562 0.2188 0.6562 +0.6562 0.2188 0.6875 +0.6562 0.2188 0.7188 +0.6562 0.2188 0.75 +0.6562 0.2188 0.7812 +0.6562 0.2188 0.8125 +0.6562 0.2188 0.8438 +0.6562 0.2188 0.875 +0.6562 0.2188 0.9062 +0.6562 0.2188 0.9375 +0.6562 0.2188 0.9688 +0.6562 0.2188 1 +0.6562 0.25 0 +0.6562 0.25 0.03125 +0.6562 0.25 0.0625 +0.6562 0.25 0.09375 +0.6562 0.25 0.125 +0.6562 0.25 0.1562 +0.6562 0.25 0.1875 +0.6562 0.25 0.2188 +0.6562 0.25 0.25 +0.6562 0.25 0.2812 +0.6562 0.25 0.3125 +0.6562 0.25 0.3438 +0.6562 0.25 0.375 +0.6562 0.25 0.4062 +0.6562 0.25 0.4375 +0.6562 0.25 0.4688 +0.6562 0.25 0.5 +0.6562 0.25 0.5312 +0.6562 0.25 0.5625 +0.6562 0.25 0.5938 +0.6562 0.25 0.625 +0.6562 0.25 0.6562 +0.6562 0.25 0.6875 +0.6562 0.25 0.7188 +0.6562 0.25 0.75 +0.6562 0.25 0.7812 +0.6562 0.25 0.8125 +0.6562 0.25 0.8438 +0.6562 0.25 0.875 +0.6562 0.25 0.9062 +0.6562 0.25 0.9375 +0.6562 0.25 0.9688 +0.6562 0.25 1 +0.6562 0.2812 0 +0.6562 0.2812 0.03125 +0.6562 0.2812 0.0625 +0.6562 0.2812 0.09375 +0.6562 0.2812 0.125 +0.6562 0.2812 0.1562 +0.6562 0.2812 0.1875 +0.6562 0.2812 0.2188 +0.6562 0.2812 0.25 +0.6562 0.2812 0.2812 +0.6562 0.2812 0.3125 +0.6562 0.2812 0.3438 +0.6562 0.2812 0.375 +0.6562 0.2812 0.4062 +0.6562 0.2812 0.4375 +0.6562 0.2812 0.4688 +0.6562 0.2812 0.5 +0.6562 0.2812 0.5312 +0.6562 0.2812 0.5625 +0.6562 0.2812 0.5938 +0.6562 0.2812 0.625 +0.6562 0.2812 0.6562 +0.6562 0.2812 0.6875 +0.6562 0.2812 0.7188 +0.6562 0.2812 0.75 +0.6562 0.2812 0.7812 +0.6562 0.2812 0.8125 +0.6562 0.2812 0.8438 +0.6562 0.2812 0.875 +0.6562 0.2812 0.9062 +0.6562 0.2812 0.9375 +0.6562 0.2812 0.9688 +0.6562 0.2812 1 +0.6562 0.3125 0 +0.6562 0.3125 0.03125 +0.6562 0.3125 0.0625 +0.6562 0.3125 0.09375 +0.6562 0.3125 0.125 +0.6562 0.3125 0.1562 +0.6562 0.3125 0.1875 +0.6562 0.3125 0.2188 +0.6562 0.3125 0.25 +0.6562 0.3125 0.2812 +0.6562 0.3125 0.3125 +0.6562 0.3125 0.3438 +0.6562 0.3125 0.375 +0.6562 0.3125 0.4062 +0.6562 0.3125 0.4375 +0.6562 0.3125 0.4688 +0.6562 0.3125 0.5 +0.6562 0.3125 0.5312 +0.6562 0.3125 0.5625 +0.6562 0.3125 0.5938 +0.6562 0.3125 0.625 +0.6562 0.3125 0.6562 +0.6562 0.3125 0.6875 +0.6562 0.3125 0.7188 +0.6562 0.3125 0.75 +0.6562 0.3125 0.7812 +0.6562 0.3125 0.8125 +0.6562 0.3125 0.8438 +0.6562 0.3125 0.875 +0.6562 0.3125 0.9062 +0.6562 0.3125 0.9375 +0.6562 0.3125 0.9688 +0.6562 0.3125 1 +0.6562 0.3438 0 +0.6562 0.3438 0.03125 +0.6562 0.3438 0.0625 +0.6562 0.3438 0.09375 +0.6562 0.3438 0.125 +0.6562 0.3438 0.1562 +0.6562 0.3438 0.1875 +0.6562 0.3438 0.2188 +0.6562 0.3438 0.25 +0.6562 0.3438 0.2812 +0.6562 0.3438 0.3125 +0.6562 0.3438 0.3438 +0.6562 0.3438 0.375 +0.6562 0.3438 0.4062 +0.6562 0.3438 0.4375 +0.6562 0.3438 0.4688 +0.6562 0.3438 0.5 +0.6562 0.3438 0.5312 +0.6562 0.3438 0.5625 +0.6562 0.3438 0.5938 +0.6562 0.3438 0.625 +0.6562 0.3438 0.6562 +0.6562 0.3438 0.6875 +0.6562 0.3438 0.7188 +0.6562 0.3438 0.75 +0.6562 0.3438 0.7812 +0.6562 0.3438 0.8125 +0.6562 0.3438 0.8438 +0.6562 0.3438 0.875 +0.6562 0.3438 0.9062 +0.6562 0.3438 0.9375 +0.6562 0.3438 0.9688 +0.6562 0.3438 1 +0.6562 0.375 0 +0.6562 0.375 0.03125 +0.6562 0.375 0.0625 +0.6562 0.375 0.09375 +0.6562 0.375 0.125 +0.6562 0.375 0.1562 +0.6562 0.375 0.1875 +0.6562 0.375 0.2188 +0.6562 0.375 0.25 +0.6562 0.375 0.2812 +0.6562 0.375 0.3125 +0.6562 0.375 0.3438 +0.6562 0.375 0.375 +0.6562 0.375 0.4062 +0.6562 0.375 0.4375 +0.6562 0.375 0.4688 +0.6562 0.375 0.5 +0.6562 0.375 0.5312 +0.6562 0.375 0.5625 +0.6562 0.375 0.5938 +0.6562 0.375 0.625 +0.6562 0.375 0.6562 +0.6562 0.375 0.6875 +0.6562 0.375 0.7188 +0.6562 0.375 0.75 +0.6562 0.375 0.7812 +0.6562 0.375 0.8125 +0.6562 0.375 0.8438 +0.6562 0.375 0.875 +0.6562 0.375 0.9062 +0.6562 0.375 0.9375 +0.6562 0.375 0.9688 +0.6562 0.375 1 +0.6562 0.4062 0 +0.6562 0.4062 0.03125 +0.6562 0.4062 0.0625 +0.6562 0.4062 0.09375 +0.6562 0.4062 0.125 +0.6562 0.4062 0.1562 +0.6562 0.4062 0.1875 +0.6562 0.4062 0.2188 +0.6562 0.4062 0.25 +0.6562 0.4062 0.2812 +0.6562 0.4062 0.3125 +0.6562 0.4062 0.3438 +0.6562 0.4062 0.375 +0.6562 0.4062 0.4062 +0.6562 0.4062 0.4375 +0.6562 0.4062 0.4688 +0.6562 0.4062 0.5 +0.6562 0.4062 0.5312 +0.6562 0.4062 0.5625 +0.6562 0.4062 0.5938 +0.6562 0.4062 0.625 +0.6562 0.4062 0.6562 +0.6562 0.4062 0.6875 +0.6562 0.4062 0.7188 +0.6562 0.4062 0.75 +0.6562 0.4062 0.7812 +0.6562 0.4062 0.8125 +0.6562 0.4062 0.8438 +0.6562 0.4062 0.875 +0.6562 0.4062 0.9062 +0.6562 0.4062 0.9375 +0.6562 0.4062 0.9688 +0.6562 0.4062 1 +0.6562 0.4375 0 +0.6562 0.4375 0.03125 +0.6562 0.4375 0.0625 +0.6562 0.4375 0.09375 +0.6562 0.4375 0.125 +0.6562 0.4375 0.1562 +0.6562 0.4375 0.1875 +0.6562 0.4375 0.2188 +0.6562 0.4375 0.25 +0.6562 0.4375 0.2812 +0.6562 0.4375 0.3125 +0.6562 0.4375 0.3438 +0.6562 0.4375 0.375 +0.6562 0.4375 0.4062 +0.6562 0.4375 0.4375 +0.6562 0.4375 0.4688 +0.6562 0.4375 0.5 +0.6562 0.4375 0.5312 +0.6562 0.4375 0.5625 +0.6562 0.4375 0.5938 +0.6562 0.4375 0.625 +0.6562 0.4375 0.6562 +0.6562 0.4375 0.6875 +0.6562 0.4375 0.7188 +0.6562 0.4375 0.75 +0.6562 0.4375 0.7812 +0.6562 0.4375 0.8125 +0.6562 0.4375 0.8438 +0.6562 0.4375 0.875 +0.6562 0.4375 0.9062 +0.6562 0.4375 0.9375 +0.6562 0.4375 0.9688 +0.6562 0.4375 1 +0.6562 0.4688 0 +0.6562 0.4688 0.03125 +0.6562 0.4688 0.0625 +0.6562 0.4688 0.09375 +0.6562 0.4688 0.125 +0.6562 0.4688 0.1562 +0.6562 0.4688 0.1875 +0.6562 0.4688 0.2188 +0.6562 0.4688 0.25 +0.6562 0.4688 0.2812 +0.6562 0.4688 0.3125 +0.6562 0.4688 0.3438 +0.6562 0.4688 0.375 +0.6562 0.4688 0.4062 +0.6562 0.4688 0.4375 +0.6562 0.4688 0.4688 +0.6562 0.4688 0.5 +0.6562 0.4688 0.5312 +0.6562 0.4688 0.5625 +0.6562 0.4688 0.5938 +0.6562 0.4688 0.625 +0.6562 0.4688 0.6562 +0.6562 0.4688 0.6875 +0.6562 0.4688 0.7188 +0.6562 0.4688 0.75 +0.6562 0.4688 0.7812 +0.6562 0.4688 0.8125 +0.6562 0.4688 0.8438 +0.6562 0.4688 0.875 +0.6562 0.4688 0.9062 +0.6562 0.4688 0.9375 +0.6562 0.4688 0.9688 +0.6562 0.4688 1 +0.6562 0.5 0 +0.6562 0.5 0.03125 +0.6562 0.5 0.0625 +0.6562 0.5 0.09375 +0.6562 0.5 0.125 +0.6562 0.5 0.1562 +0.6562 0.5 0.1875 +0.6562 0.5 0.2188 +0.6562 0.5 0.25 +0.6562 0.5 0.2812 +0.6562 0.5 0.3125 +0.6562 0.5 0.3438 +0.6562 0.5 0.375 +0.6562 0.5 0.4062 +0.6562 0.5 0.4375 +0.6562 0.5 0.4688 +0.6562 0.5 0.5 +0.6562 0.5 0.5312 +0.6562 0.5 0.5625 +0.6562 0.5 0.5938 +0.6562 0.5 0.625 +0.6562 0.5 0.6562 +0.6562 0.5 0.6875 +0.6562 0.5 0.7188 +0.6562 0.5 0.75 +0.6562 0.5 0.7812 +0.6562 0.5 0.8125 +0.6562 0.5 0.8438 +0.6562 0.5 0.875 +0.6562 0.5 0.9062 +0.6562 0.5 0.9375 +0.6562 0.5 0.9688 +0.6562 0.5 1 +0.6562 0.5312 0 +0.6562 0.5312 0.03125 +0.6562 0.5312 0.0625 +0.6562 0.5312 0.09375 +0.6562 0.5312 0.125 +0.6562 0.5312 0.1562 +0.6562 0.5312 0.1875 +0.6562 0.5312 0.2188 +0.6562 0.5312 0.25 +0.6562 0.5312 0.2812 +0.6562 0.5312 0.3125 +0.6562 0.5312 0.3438 +0.6562 0.5312 0.375 +0.6562 0.5312 0.4062 +0.6562 0.5312 0.4375 +0.6562 0.5312 0.4688 +0.6562 0.5312 0.5 +0.6562 0.5312 0.5312 +0.6562 0.5312 0.5625 +0.6562 0.5312 0.5938 +0.6562 0.5312 0.625 +0.6562 0.5312 0.6562 +0.6562 0.5312 0.6875 +0.6562 0.5312 0.7188 +0.6562 0.5312 0.75 +0.6562 0.5312 0.7812 +0.6562 0.5312 0.8125 +0.6562 0.5312 0.8438 +0.6562 0.5312 0.875 +0.6562 0.5312 0.9062 +0.6562 0.5312 0.9375 +0.6562 0.5312 0.9688 +0.6562 0.5312 1 +0.6562 0.5625 0 +0.6562 0.5625 0.03125 +0.6562 0.5625 0.0625 +0.6562 0.5625 0.09375 +0.6562 0.5625 0.125 +0.6562 0.5625 0.1562 +0.6562 0.5625 0.1875 +0.6562 0.5625 0.2188 +0.6562 0.5625 0.25 +0.6562 0.5625 0.2812 +0.6562 0.5625 0.3125 +0.6562 0.5625 0.3438 +0.6562 0.5625 0.375 +0.6562 0.5625 0.4062 +0.6562 0.5625 0.4375 +0.6562 0.5625 0.4688 +0.6562 0.5625 0.5 +0.6562 0.5625 0.5312 +0.6562 0.5625 0.5625 +0.6562 0.5625 0.5938 +0.6562 0.5625 0.625 +0.6562 0.5625 0.6562 +0.6562 0.5625 0.6875 +0.6562 0.5625 0.7188 +0.6562 0.5625 0.75 +0.6562 0.5625 0.7812 +0.6562 0.5625 0.8125 +0.6562 0.5625 0.8438 +0.6562 0.5625 0.875 +0.6562 0.5625 0.9062 +0.6562 0.5625 0.9375 +0.6562 0.5625 0.9688 +0.6562 0.5625 1 +0.6562 0.5938 0 +0.6562 0.5938 0.03125 +0.6562 0.5938 0.0625 +0.6562 0.5938 0.09375 +0.6562 0.5938 0.125 +0.6562 0.5938 0.1562 +0.6562 0.5938 0.1875 +0.6562 0.5938 0.2188 +0.6562 0.5938 0.25 +0.6562 0.5938 0.2812 +0.6562 0.5938 0.3125 +0.6562 0.5938 0.3438 +0.6562 0.5938 0.375 +0.6562 0.5938 0.4062 +0.6562 0.5938 0.4375 +0.6562 0.5938 0.4688 +0.6562 0.5938 0.5 +0.6562 0.5938 0.5312 +0.6562 0.5938 0.5625 +0.6562 0.5938 0.5938 +0.6562 0.5938 0.625 +0.6562 0.5938 0.6562 +0.6562 0.5938 0.6875 +0.6562 0.5938 0.7188 +0.6562 0.5938 0.75 +0.6562 0.5938 0.7812 +0.6562 0.5938 0.8125 +0.6562 0.5938 0.8438 +0.6562 0.5938 0.875 +0.6562 0.5938 0.9062 +0.6562 0.5938 0.9375 +0.6562 0.5938 0.9688 +0.6562 0.5938 1 +0.6562 0.625 0 +0.6562 0.625 0.03125 +0.6562 0.625 0.0625 +0.6562 0.625 0.09375 +0.6562 0.625 0.125 +0.6562 0.625 0.1562 +0.6562 0.625 0.1875 +0.6562 0.625 0.2188 +0.6562 0.625 0.25 +0.6562 0.625 0.2812 +0.6562 0.625 0.3125 +0.6562 0.625 0.3438 +0.6562 0.625 0.375 +0.6562 0.625 0.4062 +0.6562 0.625 0.4375 +0.6562 0.625 0.4688 +0.6562 0.625 0.5 +0.6562 0.625 0.5312 +0.6562 0.625 0.5625 +0.6562 0.625 0.5938 +0.6562 0.625 0.625 +0.6562 0.625 0.6562 +0.6562 0.625 0.6875 +0.6562 0.625 0.7188 +0.6562 0.625 0.75 +0.6562 0.625 0.7812 +0.6562 0.625 0.8125 +0.6562 0.625 0.8438 +0.6562 0.625 0.875 +0.6562 0.625 0.9062 +0.6562 0.625 0.9375 +0.6562 0.625 0.9688 +0.6562 0.625 1 +0.6562 0.6562 0 +0.6562 0.6562 0.03125 +0.6562 0.6562 0.0625 +0.6562 0.6562 0.09375 +0.6562 0.6562 0.125 +0.6562 0.6562 0.1562 +0.6562 0.6562 0.1875 +0.6562 0.6562 0.2188 +0.6562 0.6562 0.25 +0.6562 0.6562 0.2812 +0.6562 0.6562 0.3125 +0.6562 0.6562 0.3438 +0.6562 0.6562 0.375 +0.6562 0.6562 0.4062 +0.6562 0.6562 0.4375 +0.6562 0.6562 0.4688 +0.6562 0.6562 0.5 +0.6562 0.6562 0.5312 +0.6562 0.6562 0.5625 +0.6562 0.6562 0.5938 +0.6562 0.6562 0.625 +0.6562 0.6562 0.6562 +0.6562 0.6562 0.6875 +0.6562 0.6562 0.7188 +0.6562 0.6562 0.75 +0.6562 0.6562 0.7812 +0.6562 0.6562 0.8125 +0.6562 0.6562 0.8438 +0.6562 0.6562 0.875 +0.6562 0.6562 0.9062 +0.6562 0.6562 0.9375 +0.6562 0.6562 0.9688 +0.6562 0.6562 1 +0.6562 0.6875 0 +0.6562 0.6875 0.03125 +0.6562 0.6875 0.0625 +0.6562 0.6875 0.09375 +0.6562 0.6875 0.125 +0.6562 0.6875 0.1562 +0.6562 0.6875 0.1875 +0.6562 0.6875 0.2188 +0.6562 0.6875 0.25 +0.6562 0.6875 0.2812 +0.6562 0.6875 0.3125 +0.6562 0.6875 0.3438 +0.6562 0.6875 0.375 +0.6562 0.6875 0.4062 +0.6562 0.6875 0.4375 +0.6562 0.6875 0.4688 +0.6562 0.6875 0.5 +0.6562 0.6875 0.5312 +0.6562 0.6875 0.5625 +0.6562 0.6875 0.5938 +0.6562 0.6875 0.625 +0.6562 0.6875 0.6562 +0.6562 0.6875 0.6875 +0.6562 0.6875 0.7188 +0.6562 0.6875 0.75 +0.6562 0.6875 0.7812 +0.6562 0.6875 0.8125 +0.6562 0.6875 0.8438 +0.6562 0.6875 0.875 +0.6562 0.6875 0.9062 +0.6562 0.6875 0.9375 +0.6562 0.6875 0.9688 +0.6562 0.6875 1 +0.6562 0.7188 0 +0.6562 0.7188 0.03125 +0.6562 0.7188 0.0625 +0.6562 0.7188 0.09375 +0.6562 0.7188 0.125 +0.6562 0.7188 0.1562 +0.6562 0.7188 0.1875 +0.6562 0.7188 0.2188 +0.6562 0.7188 0.25 +0.6562 0.7188 0.2812 +0.6562 0.7188 0.3125 +0.6562 0.7188 0.3438 +0.6562 0.7188 0.375 +0.6562 0.7188 0.4062 +0.6562 0.7188 0.4375 +0.6562 0.7188 0.4688 +0.6562 0.7188 0.5 +0.6562 0.7188 0.5312 +0.6562 0.7188 0.5625 +0.6562 0.7188 0.5938 +0.6562 0.7188 0.625 +0.6562 0.7188 0.6562 +0.6562 0.7188 0.6875 +0.6562 0.7188 0.7188 +0.6562 0.7188 0.75 +0.6562 0.7188 0.7812 +0.6562 0.7188 0.8125 +0.6562 0.7188 0.8438 +0.6562 0.7188 0.875 +0.6562 0.7188 0.9062 +0.6562 0.7188 0.9375 +0.6562 0.7188 0.9688 +0.6562 0.7188 1 +0.6562 0.75 0 +0.6562 0.75 0.03125 +0.6562 0.75 0.0625 +0.6562 0.75 0.09375 +0.6562 0.75 0.125 +0.6562 0.75 0.1562 +0.6562 0.75 0.1875 +0.6562 0.75 0.2188 +0.6562 0.75 0.25 +0.6562 0.75 0.2812 +0.6562 0.75 0.3125 +0.6562 0.75 0.3438 +0.6562 0.75 0.375 +0.6562 0.75 0.4062 +0.6562 0.75 0.4375 +0.6562 0.75 0.4688 +0.6562 0.75 0.5 +0.6562 0.75 0.5312 +0.6562 0.75 0.5625 +0.6562 0.75 0.5938 +0.6562 0.75 0.625 +0.6562 0.75 0.6562 +0.6562 0.75 0.6875 +0.6562 0.75 0.7188 +0.6562 0.75 0.75 +0.6562 0.75 0.7812 +0.6562 0.75 0.8125 +0.6562 0.75 0.8438 +0.6562 0.75 0.875 +0.6562 0.75 0.9062 +0.6562 0.75 0.9375 +0.6562 0.75 0.9688 +0.6562 0.75 1 +0.6562 0.7812 0 +0.6562 0.7812 0.03125 +0.6562 0.7812 0.0625 +0.6562 0.7812 0.09375 +0.6562 0.7812 0.125 +0.6562 0.7812 0.1562 +0.6562 0.7812 0.1875 +0.6562 0.7812 0.2188 +0.6562 0.7812 0.25 +0.6562 0.7812 0.2812 +0.6562 0.7812 0.3125 +0.6562 0.7812 0.3438 +0.6562 0.7812 0.375 +0.6562 0.7812 0.4062 +0.6562 0.7812 0.4375 +0.6562 0.7812 0.4688 +0.6562 0.7812 0.5 +0.6562 0.7812 0.5312 +0.6562 0.7812 0.5625 +0.6562 0.7812 0.5938 +0.6562 0.7812 0.625 +0.6562 0.7812 0.6562 +0.6562 0.7812 0.6875 +0.6562 0.7812 0.7188 +0.6562 0.7812 0.75 +0.6562 0.7812 0.7812 +0.6562 0.7812 0.8125 +0.6562 0.7812 0.8438 +0.6562 0.7812 0.875 +0.6562 0.7812 0.9062 +0.6562 0.7812 0.9375 +0.6562 0.7812 0.9688 +0.6562 0.7812 1 +0.6562 0.8125 0 +0.6562 0.8125 0.03125 +0.6562 0.8125 0.0625 +0.6562 0.8125 0.09375 +0.6562 0.8125 0.125 +0.6562 0.8125 0.1562 +0.6562 0.8125 0.1875 +0.6562 0.8125 0.2188 +0.6562 0.8125 0.25 +0.6562 0.8125 0.2812 +0.6562 0.8125 0.3125 +0.6562 0.8125 0.3438 +0.6562 0.8125 0.375 +0.6562 0.8125 0.4062 +0.6562 0.8125 0.4375 +0.6562 0.8125 0.4688 +0.6562 0.8125 0.5 +0.6562 0.8125 0.5312 +0.6562 0.8125 0.5625 +0.6562 0.8125 0.5938 +0.6562 0.8125 0.625 +0.6562 0.8125 0.6562 +0.6562 0.8125 0.6875 +0.6562 0.8125 0.7188 +0.6562 0.8125 0.75 +0.6562 0.8125 0.7812 +0.6562 0.8125 0.8125 +0.6562 0.8125 0.8438 +0.6562 0.8125 0.875 +0.6562 0.8125 0.9062 +0.6562 0.8125 0.9375 +0.6562 0.8125 0.9688 +0.6562 0.8125 1 +0.6562 0.8438 0 +0.6562 0.8438 0.03125 +0.6562 0.8438 0.0625 +0.6562 0.8438 0.09375 +0.6562 0.8438 0.125 +0.6562 0.8438 0.1562 +0.6562 0.8438 0.1875 +0.6562 0.8438 0.2188 +0.6562 0.8438 0.25 +0.6562 0.8438 0.2812 +0.6562 0.8438 0.3125 +0.6562 0.8438 0.3438 +0.6562 0.8438 0.375 +0.6562 0.8438 0.4062 +0.6562 0.8438 0.4375 +0.6562 0.8438 0.4688 +0.6562 0.8438 0.5 +0.6562 0.8438 0.5312 +0.6562 0.8438 0.5625 +0.6562 0.8438 0.5938 +0.6562 0.8438 0.625 +0.6562 0.8438 0.6562 +0.6562 0.8438 0.6875 +0.6562 0.8438 0.7188 +0.6562 0.8438 0.75 +0.6562 0.8438 0.7812 +0.6562 0.8438 0.8125 +0.6562 0.8438 0.8438 +0.6562 0.8438 0.875 +0.6562 0.8438 0.9062 +0.6562 0.8438 0.9375 +0.6562 0.8438 0.9688 +0.6562 0.8438 1 +0.6562 0.875 0 +0.6562 0.875 0.03125 +0.6562 0.875 0.0625 +0.6562 0.875 0.09375 +0.6562 0.875 0.125 +0.6562 0.875 0.1562 +0.6562 0.875 0.1875 +0.6562 0.875 0.2188 +0.6562 0.875 0.25 +0.6562 0.875 0.2812 +0.6562 0.875 0.3125 +0.6562 0.875 0.3438 +0.6562 0.875 0.375 +0.6562 0.875 0.4062 +0.6562 0.875 0.4375 +0.6562 0.875 0.4688 +0.6562 0.875 0.5 +0.6562 0.875 0.5312 +0.6562 0.875 0.5625 +0.6562 0.875 0.5938 +0.6562 0.875 0.625 +0.6562 0.875 0.6562 +0.6562 0.875 0.6875 +0.6562 0.875 0.7188 +0.6562 0.875 0.75 +0.6562 0.875 0.7812 +0.6562 0.875 0.8125 +0.6562 0.875 0.8438 +0.6562 0.875 0.875 +0.6562 0.875 0.9062 +0.6562 0.875 0.9375 +0.6562 0.875 0.9688 +0.6562 0.875 1 +0.6562 0.9062 0 +0.6562 0.9062 0.03125 +0.6562 0.9062 0.0625 +0.6562 0.9062 0.09375 +0.6562 0.9062 0.125 +0.6562 0.9062 0.1562 +0.6562 0.9062 0.1875 +0.6562 0.9062 0.2188 +0.6562 0.9062 0.25 +0.6562 0.9062 0.2812 +0.6562 0.9062 0.3125 +0.6562 0.9062 0.3438 +0.6562 0.9062 0.375 +0.6562 0.9062 0.4062 +0.6562 0.9062 0.4375 +0.6562 0.9062 0.4688 +0.6562 0.9062 0.5 +0.6562 0.9062 0.5312 +0.6562 0.9062 0.5625 +0.6562 0.9062 0.5938 +0.6562 0.9062 0.625 +0.6562 0.9062 0.6562 +0.6562 0.9062 0.6875 +0.6562 0.9062 0.7188 +0.6562 0.9062 0.75 +0.6562 0.9062 0.7812 +0.6562 0.9062 0.8125 +0.6562 0.9062 0.8438 +0.6562 0.9062 0.875 +0.6562 0.9062 0.9062 +0.6562 0.9062 0.9375 +0.6562 0.9062 0.9688 +0.6562 0.9062 1 +0.6562 0.9375 0 +0.6562 0.9375 0.03125 +0.6562 0.9375 0.0625 +0.6562 0.9375 0.09375 +0.6562 0.9375 0.125 +0.6562 0.9375 0.1562 +0.6562 0.9375 0.1875 +0.6562 0.9375 0.2188 +0.6562 0.9375 0.25 +0.6562 0.9375 0.2812 +0.6562 0.9375 0.3125 +0.6562 0.9375 0.3438 +0.6562 0.9375 0.375 +0.6562 0.9375 0.4062 +0.6562 0.9375 0.4375 +0.6562 0.9375 0.4688 +0.6562 0.9375 0.5 +0.6562 0.9375 0.5312 +0.6562 0.9375 0.5625 +0.6562 0.9375 0.5938 +0.6562 0.9375 0.625 +0.6562 0.9375 0.6562 +0.6562 0.9375 0.6875 +0.6562 0.9375 0.7188 +0.6562 0.9375 0.75 +0.6562 0.9375 0.7812 +0.6562 0.9375 0.8125 +0.6562 0.9375 0.8438 +0.6562 0.9375 0.875 +0.6562 0.9375 0.9062 +0.6562 0.9375 0.9375 +0.6562 0.9375 0.9688 +0.6562 0.9375 1 +0.6562 0.9688 0 +0.6562 0.9688 0.03125 +0.6562 0.9688 0.0625 +0.6562 0.9688 0.09375 +0.6562 0.9688 0.125 +0.6562 0.9688 0.1562 +0.6562 0.9688 0.1875 +0.6562 0.9688 0.2188 +0.6562 0.9688 0.25 +0.6562 0.9688 0.2812 +0.6562 0.9688 0.3125 +0.6562 0.9688 0.3438 +0.6562 0.9688 0.375 +0.6562 0.9688 0.4062 +0.6562 0.9688 0.4375 +0.6562 0.9688 0.4688 +0.6562 0.9688 0.5 +0.6562 0.9688 0.5312 +0.6562 0.9688 0.5625 +0.6562 0.9688 0.5938 +0.6562 0.9688 0.625 +0.6562 0.9688 0.6562 +0.6562 0.9688 0.6875 +0.6562 0.9688 0.7188 +0.6562 0.9688 0.75 +0.6562 0.9688 0.7812 +0.6562 0.9688 0.8125 +0.6562 0.9688 0.8438 +0.6562 0.9688 0.875 +0.6562 0.9688 0.9062 +0.6562 0.9688 0.9375 +0.6562 0.9688 0.9688 +0.6562 0.9688 1 +0.6562 1 0 +0.6562 1 0.03125 +0.6562 1 0.0625 +0.6562 1 0.09375 +0.6562 1 0.125 +0.6562 1 0.1562 +0.6562 1 0.1875 +0.6562 1 0.2188 +0.6562 1 0.25 +0.6562 1 0.2812 +0.6562 1 0.3125 +0.6562 1 0.3438 +0.6562 1 0.375 +0.6562 1 0.4062 +0.6562 1 0.4375 +0.6562 1 0.4688 +0.6562 1 0.5 +0.6562 1 0.5312 +0.6562 1 0.5625 +0.6562 1 0.5938 +0.6562 1 0.625 +0.6562 1 0.6562 +0.6562 1 0.6875 +0.6562 1 0.7188 +0.6562 1 0.75 +0.6562 1 0.7812 +0.6562 1 0.8125 +0.6562 1 0.8438 +0.6562 1 0.875 +0.6562 1 0.9062 +0.6562 1 0.9375 +0.6562 1 0.9688 +0.6562 1 1 +0.6875 0 0 +0.6875 0 0.03125 +0.6875 0 0.0625 +0.6875 0 0.09375 +0.6875 0 0.125 +0.6875 0 0.1562 +0.6875 0 0.1875 +0.6875 0 0.2188 +0.6875 0 0.25 +0.6875 0 0.2812 +0.6875 0 0.3125 +0.6875 0 0.3438 +0.6875 0 0.375 +0.6875 0 0.4062 +0.6875 0 0.4375 +0.6875 0 0.4688 +0.6875 0 0.5 +0.6875 0 0.5312 +0.6875 0 0.5625 +0.6875 0 0.5938 +0.6875 0 0.625 +0.6875 0 0.6562 +0.6875 0 0.6875 +0.6875 0 0.7188 +0.6875 0 0.75 +0.6875 0 0.7812 +0.6875 0 0.8125 +0.6875 0 0.8438 +0.6875 0 0.875 +0.6875 0 0.9062 +0.6875 0 0.9375 +0.6875 0 0.9688 +0.6875 0 1 +0.6875 0.03125 0 +0.6875 0.03125 0.03125 +0.6875 0.03125 0.0625 +0.6875 0.03125 0.09375 +0.6875 0.03125 0.125 +0.6875 0.03125 0.1562 +0.6875 0.03125 0.1875 +0.6875 0.03125 0.2188 +0.6875 0.03125 0.25 +0.6875 0.03125 0.2812 +0.6875 0.03125 0.3125 +0.6875 0.03125 0.3438 +0.6875 0.03125 0.375 +0.6875 0.03125 0.4062 +0.6875 0.03125 0.4375 +0.6875 0.03125 0.4688 +0.6875 0.03125 0.5 +0.6875 0.03125 0.5312 +0.6875 0.03125 0.5625 +0.6875 0.03125 0.5938 +0.6875 0.03125 0.625 +0.6875 0.03125 0.6562 +0.6875 0.03125 0.6875 +0.6875 0.03125 0.7188 +0.6875 0.03125 0.75 +0.6875 0.03125 0.7812 +0.6875 0.03125 0.8125 +0.6875 0.03125 0.8438 +0.6875 0.03125 0.875 +0.6875 0.03125 0.9062 +0.6875 0.03125 0.9375 +0.6875 0.03125 0.9688 +0.6875 0.03125 1 +0.6875 0.0625 0 +0.6875 0.0625 0.03125 +0.6875 0.0625 0.0625 +0.6875 0.0625 0.09375 +0.6875 0.0625 0.125 +0.6875 0.0625 0.1562 +0.6875 0.0625 0.1875 +0.6875 0.0625 0.2188 +0.6875 0.0625 0.25 +0.6875 0.0625 0.2812 +0.6875 0.0625 0.3125 +0.6875 0.0625 0.3438 +0.6875 0.0625 0.375 +0.6875 0.0625 0.4062 +0.6875 0.0625 0.4375 +0.6875 0.0625 0.4688 +0.6875 0.0625 0.5 +0.6875 0.0625 0.5312 +0.6875 0.0625 0.5625 +0.6875 0.0625 0.5938 +0.6875 0.0625 0.625 +0.6875 0.0625 0.6562 +0.6875 0.0625 0.6875 +0.6875 0.0625 0.7188 +0.6875 0.0625 0.75 +0.6875 0.0625 0.7812 +0.6875 0.0625 0.8125 +0.6875 0.0625 0.8438 +0.6875 0.0625 0.875 +0.6875 0.0625 0.9062 +0.6875 0.0625 0.9375 +0.6875 0.0625 0.9688 +0.6875 0.0625 1 +0.6875 0.09375 0 +0.6875 0.09375 0.03125 +0.6875 0.09375 0.0625 +0.6875 0.09375 0.09375 +0.6875 0.09375 0.125 +0.6875 0.09375 0.1562 +0.6875 0.09375 0.1875 +0.6875 0.09375 0.2188 +0.6875 0.09375 0.25 +0.6875 0.09375 0.2812 +0.6875 0.09375 0.3125 +0.6875 0.09375 0.3438 +0.6875 0.09375 0.375 +0.6875 0.09375 0.4062 +0.6875 0.09375 0.4375 +0.6875 0.09375 0.4688 +0.6875 0.09375 0.5 +0.6875 0.09375 0.5312 +0.6875 0.09375 0.5625 +0.6875 0.09375 0.5938 +0.6875 0.09375 0.625 +0.6875 0.09375 0.6562 +0.6875 0.09375 0.6875 +0.6875 0.09375 0.7188 +0.6875 0.09375 0.75 +0.6875 0.09375 0.7812 +0.6875 0.09375 0.8125 +0.6875 0.09375 0.8438 +0.6875 0.09375 0.875 +0.6875 0.09375 0.9062 +0.6875 0.09375 0.9375 +0.6875 0.09375 0.9688 +0.6875 0.09375 1 +0.6875 0.125 0 +0.6875 0.125 0.03125 +0.6875 0.125 0.0625 +0.6875 0.125 0.09375 +0.6875 0.125 0.125 +0.6875 0.125 0.1562 +0.6875 0.125 0.1875 +0.6875 0.125 0.2188 +0.6875 0.125 0.25 +0.6875 0.125 0.2812 +0.6875 0.125 0.3125 +0.6875 0.125 0.3438 +0.6875 0.125 0.375 +0.6875 0.125 0.4062 +0.6875 0.125 0.4375 +0.6875 0.125 0.4688 +0.6875 0.125 0.5 +0.6875 0.125 0.5312 +0.6875 0.125 0.5625 +0.6875 0.125 0.5938 +0.6875 0.125 0.625 +0.6875 0.125 0.6562 +0.6875 0.125 0.6875 +0.6875 0.125 0.7188 +0.6875 0.125 0.75 +0.6875 0.125 0.7812 +0.6875 0.125 0.8125 +0.6875 0.125 0.8438 +0.6875 0.125 0.875 +0.6875 0.125 0.9062 +0.6875 0.125 0.9375 +0.6875 0.125 0.9688 +0.6875 0.125 1 +0.6875 0.1562 0 +0.6875 0.1562 0.03125 +0.6875 0.1562 0.0625 +0.6875 0.1562 0.09375 +0.6875 0.1562 0.125 +0.6875 0.1562 0.1562 +0.6875 0.1562 0.1875 +0.6875 0.1562 0.2188 +0.6875 0.1562 0.25 +0.6875 0.1562 0.2812 +0.6875 0.1562 0.3125 +0.6875 0.1562 0.3438 +0.6875 0.1562 0.375 +0.6875 0.1562 0.4062 +0.6875 0.1562 0.4375 +0.6875 0.1562 0.4688 +0.6875 0.1562 0.5 +0.6875 0.1562 0.5312 +0.6875 0.1562 0.5625 +0.6875 0.1562 0.5938 +0.6875 0.1562 0.625 +0.6875 0.1562 0.6562 +0.6875 0.1562 0.6875 +0.6875 0.1562 0.7188 +0.6875 0.1562 0.75 +0.6875 0.1562 0.7812 +0.6875 0.1562 0.8125 +0.6875 0.1562 0.8438 +0.6875 0.1562 0.875 +0.6875 0.1562 0.9062 +0.6875 0.1562 0.9375 +0.6875 0.1562 0.9688 +0.6875 0.1562 1 +0.6875 0.1875 0 +0.6875 0.1875 0.03125 +0.6875 0.1875 0.0625 +0.6875 0.1875 0.09375 +0.6875 0.1875 0.125 +0.6875 0.1875 0.1562 +0.6875 0.1875 0.1875 +0.6875 0.1875 0.2188 +0.6875 0.1875 0.25 +0.6875 0.1875 0.2812 +0.6875 0.1875 0.3125 +0.6875 0.1875 0.3438 +0.6875 0.1875 0.375 +0.6875 0.1875 0.4062 +0.6875 0.1875 0.4375 +0.6875 0.1875 0.4688 +0.6875 0.1875 0.5 +0.6875 0.1875 0.5312 +0.6875 0.1875 0.5625 +0.6875 0.1875 0.5938 +0.6875 0.1875 0.625 +0.6875 0.1875 0.6562 +0.6875 0.1875 0.6875 +0.6875 0.1875 0.7188 +0.6875 0.1875 0.75 +0.6875 0.1875 0.7812 +0.6875 0.1875 0.8125 +0.6875 0.1875 0.8438 +0.6875 0.1875 0.875 +0.6875 0.1875 0.9062 +0.6875 0.1875 0.9375 +0.6875 0.1875 0.9688 +0.6875 0.1875 1 +0.6875 0.2188 0 +0.6875 0.2188 0.03125 +0.6875 0.2188 0.0625 +0.6875 0.2188 0.09375 +0.6875 0.2188 0.125 +0.6875 0.2188 0.1562 +0.6875 0.2188 0.1875 +0.6875 0.2188 0.2188 +0.6875 0.2188 0.25 +0.6875 0.2188 0.2812 +0.6875 0.2188 0.3125 +0.6875 0.2188 0.3438 +0.6875 0.2188 0.375 +0.6875 0.2188 0.4062 +0.6875 0.2188 0.4375 +0.6875 0.2188 0.4688 +0.6875 0.2188 0.5 +0.6875 0.2188 0.5312 +0.6875 0.2188 0.5625 +0.6875 0.2188 0.5938 +0.6875 0.2188 0.625 +0.6875 0.2188 0.6562 +0.6875 0.2188 0.6875 +0.6875 0.2188 0.7188 +0.6875 0.2188 0.75 +0.6875 0.2188 0.7812 +0.6875 0.2188 0.8125 +0.6875 0.2188 0.8438 +0.6875 0.2188 0.875 +0.6875 0.2188 0.9062 +0.6875 0.2188 0.9375 +0.6875 0.2188 0.9688 +0.6875 0.2188 1 +0.6875 0.25 0 +0.6875 0.25 0.03125 +0.6875 0.25 0.0625 +0.6875 0.25 0.09375 +0.6875 0.25 0.125 +0.6875 0.25 0.1562 +0.6875 0.25 0.1875 +0.6875 0.25 0.2188 +0.6875 0.25 0.25 +0.6875 0.25 0.2812 +0.6875 0.25 0.3125 +0.6875 0.25 0.3438 +0.6875 0.25 0.375 +0.6875 0.25 0.4062 +0.6875 0.25 0.4375 +0.6875 0.25 0.4688 +0.6875 0.25 0.5 +0.6875 0.25 0.5312 +0.6875 0.25 0.5625 +0.6875 0.25 0.5938 +0.6875 0.25 0.625 +0.6875 0.25 0.6562 +0.6875 0.25 0.6875 +0.6875 0.25 0.7188 +0.6875 0.25 0.75 +0.6875 0.25 0.7812 +0.6875 0.25 0.8125 +0.6875 0.25 0.8438 +0.6875 0.25 0.875 +0.6875 0.25 0.9062 +0.6875 0.25 0.9375 +0.6875 0.25 0.9688 +0.6875 0.25 1 +0.6875 0.2812 0 +0.6875 0.2812 0.03125 +0.6875 0.2812 0.0625 +0.6875 0.2812 0.09375 +0.6875 0.2812 0.125 +0.6875 0.2812 0.1562 +0.6875 0.2812 0.1875 +0.6875 0.2812 0.2188 +0.6875 0.2812 0.25 +0.6875 0.2812 0.2812 +0.6875 0.2812 0.3125 +0.6875 0.2812 0.3438 +0.6875 0.2812 0.375 +0.6875 0.2812 0.4062 +0.6875 0.2812 0.4375 +0.6875 0.2812 0.4688 +0.6875 0.2812 0.5 +0.6875 0.2812 0.5312 +0.6875 0.2812 0.5625 +0.6875 0.2812 0.5938 +0.6875 0.2812 0.625 +0.6875 0.2812 0.6562 +0.6875 0.2812 0.6875 +0.6875 0.2812 0.7188 +0.6875 0.2812 0.75 +0.6875 0.2812 0.7812 +0.6875 0.2812 0.8125 +0.6875 0.2812 0.8438 +0.6875 0.2812 0.875 +0.6875 0.2812 0.9062 +0.6875 0.2812 0.9375 +0.6875 0.2812 0.9688 +0.6875 0.2812 1 +0.6875 0.3125 0 +0.6875 0.3125 0.03125 +0.6875 0.3125 0.0625 +0.6875 0.3125 0.09375 +0.6875 0.3125 0.125 +0.6875 0.3125 0.1562 +0.6875 0.3125 0.1875 +0.6875 0.3125 0.2188 +0.6875 0.3125 0.25 +0.6875 0.3125 0.2812 +0.6875 0.3125 0.3125 +0.6875 0.3125 0.3438 +0.6875 0.3125 0.375 +0.6875 0.3125 0.4062 +0.6875 0.3125 0.4375 +0.6875 0.3125 0.4688 +0.6875 0.3125 0.5 +0.6875 0.3125 0.5312 +0.6875 0.3125 0.5625 +0.6875 0.3125 0.5938 +0.6875 0.3125 0.625 +0.6875 0.3125 0.6562 +0.6875 0.3125 0.6875 +0.6875 0.3125 0.7188 +0.6875 0.3125 0.75 +0.6875 0.3125 0.7812 +0.6875 0.3125 0.8125 +0.6875 0.3125 0.8438 +0.6875 0.3125 0.875 +0.6875 0.3125 0.9062 +0.6875 0.3125 0.9375 +0.6875 0.3125 0.9688 +0.6875 0.3125 1 +0.6875 0.3438 0 +0.6875 0.3438 0.03125 +0.6875 0.3438 0.0625 +0.6875 0.3438 0.09375 +0.6875 0.3438 0.125 +0.6875 0.3438 0.1562 +0.6875 0.3438 0.1875 +0.6875 0.3438 0.2188 +0.6875 0.3438 0.25 +0.6875 0.3438 0.2812 +0.6875 0.3438 0.3125 +0.6875 0.3438 0.3438 +0.6875 0.3438 0.375 +0.6875 0.3438 0.4062 +0.6875 0.3438 0.4375 +0.6875 0.3438 0.4688 +0.6875 0.3438 0.5 +0.6875 0.3438 0.5312 +0.6875 0.3438 0.5625 +0.6875 0.3438 0.5938 +0.6875 0.3438 0.625 +0.6875 0.3438 0.6562 +0.6875 0.3438 0.6875 +0.6875 0.3438 0.7188 +0.6875 0.3438 0.75 +0.6875 0.3438 0.7812 +0.6875 0.3438 0.8125 +0.6875 0.3438 0.8438 +0.6875 0.3438 0.875 +0.6875 0.3438 0.9062 +0.6875 0.3438 0.9375 +0.6875 0.3438 0.9688 +0.6875 0.3438 1 +0.6875 0.375 0 +0.6875 0.375 0.03125 +0.6875 0.375 0.0625 +0.6875 0.375 0.09375 +0.6875 0.375 0.125 +0.6875 0.375 0.1562 +0.6875 0.375 0.1875 +0.6875 0.375 0.2188 +0.6875 0.375 0.25 +0.6875 0.375 0.2812 +0.6875 0.375 0.3125 +0.6875 0.375 0.3438 +0.6875 0.375 0.375 +0.6875 0.375 0.4062 +0.6875 0.375 0.4375 +0.6875 0.375 0.4688 +0.6875 0.375 0.5 +0.6875 0.375 0.5312 +0.6875 0.375 0.5625 +0.6875 0.375 0.5938 +0.6875 0.375 0.625 +0.6875 0.375 0.6562 +0.6875 0.375 0.6875 +0.6875 0.375 0.7188 +0.6875 0.375 0.75 +0.6875 0.375 0.7812 +0.6875 0.375 0.8125 +0.6875 0.375 0.8438 +0.6875 0.375 0.875 +0.6875 0.375 0.9062 +0.6875 0.375 0.9375 +0.6875 0.375 0.9688 +0.6875 0.375 1 +0.6875 0.4062 0 +0.6875 0.4062 0.03125 +0.6875 0.4062 0.0625 +0.6875 0.4062 0.09375 +0.6875 0.4062 0.125 +0.6875 0.4062 0.1562 +0.6875 0.4062 0.1875 +0.6875 0.4062 0.2188 +0.6875 0.4062 0.25 +0.6875 0.4062 0.2812 +0.6875 0.4062 0.3125 +0.6875 0.4062 0.3438 +0.6875 0.4062 0.375 +0.6875 0.4062 0.4062 +0.6875 0.4062 0.4375 +0.6875 0.4062 0.4688 +0.6875 0.4062 0.5 +0.6875 0.4062 0.5312 +0.6875 0.4062 0.5625 +0.6875 0.4062 0.5938 +0.6875 0.4062 0.625 +0.6875 0.4062 0.6562 +0.6875 0.4062 0.6875 +0.6875 0.4062 0.7188 +0.6875 0.4062 0.75 +0.6875 0.4062 0.7812 +0.6875 0.4062 0.8125 +0.6875 0.4062 0.8438 +0.6875 0.4062 0.875 +0.6875 0.4062 0.9062 +0.6875 0.4062 0.9375 +0.6875 0.4062 0.9688 +0.6875 0.4062 1 +0.6875 0.4375 0 +0.6875 0.4375 0.03125 +0.6875 0.4375 0.0625 +0.6875 0.4375 0.09375 +0.6875 0.4375 0.125 +0.6875 0.4375 0.1562 +0.6875 0.4375 0.1875 +0.6875 0.4375 0.2188 +0.6875 0.4375 0.25 +0.6875 0.4375 0.2812 +0.6875 0.4375 0.3125 +0.6875 0.4375 0.3438 +0.6875 0.4375 0.375 +0.6875 0.4375 0.4062 +0.6875 0.4375 0.4375 +0.6875 0.4375 0.4688 +0.6875 0.4375 0.5 +0.6875 0.4375 0.5312 +0.6875 0.4375 0.5625 +0.6875 0.4375 0.5938 +0.6875 0.4375 0.625 +0.6875 0.4375 0.6562 +0.6875 0.4375 0.6875 +0.6875 0.4375 0.7188 +0.6875 0.4375 0.75 +0.6875 0.4375 0.7812 +0.6875 0.4375 0.8125 +0.6875 0.4375 0.8438 +0.6875 0.4375 0.875 +0.6875 0.4375 0.9062 +0.6875 0.4375 0.9375 +0.6875 0.4375 0.9688 +0.6875 0.4375 1 +0.6875 0.4688 0 +0.6875 0.4688 0.03125 +0.6875 0.4688 0.0625 +0.6875 0.4688 0.09375 +0.6875 0.4688 0.125 +0.6875 0.4688 0.1562 +0.6875 0.4688 0.1875 +0.6875 0.4688 0.2188 +0.6875 0.4688 0.25 +0.6875 0.4688 0.2812 +0.6875 0.4688 0.3125 +0.6875 0.4688 0.3438 +0.6875 0.4688 0.375 +0.6875 0.4688 0.4062 +0.6875 0.4688 0.4375 +0.6875 0.4688 0.4688 +0.6875 0.4688 0.5 +0.6875 0.4688 0.5312 +0.6875 0.4688 0.5625 +0.6875 0.4688 0.5938 +0.6875 0.4688 0.625 +0.6875 0.4688 0.6562 +0.6875 0.4688 0.6875 +0.6875 0.4688 0.7188 +0.6875 0.4688 0.75 +0.6875 0.4688 0.7812 +0.6875 0.4688 0.8125 +0.6875 0.4688 0.8438 +0.6875 0.4688 0.875 +0.6875 0.4688 0.9062 +0.6875 0.4688 0.9375 +0.6875 0.4688 0.9688 +0.6875 0.4688 1 +0.6875 0.5 0 +0.6875 0.5 0.03125 +0.6875 0.5 0.0625 +0.6875 0.5 0.09375 +0.6875 0.5 0.125 +0.6875 0.5 0.1562 +0.6875 0.5 0.1875 +0.6875 0.5 0.2188 +0.6875 0.5 0.25 +0.6875 0.5 0.2812 +0.6875 0.5 0.3125 +0.6875 0.5 0.3438 +0.6875 0.5 0.375 +0.6875 0.5 0.4062 +0.6875 0.5 0.4375 +0.6875 0.5 0.4688 +0.6875 0.5 0.5 +0.6875 0.5 0.5312 +0.6875 0.5 0.5625 +0.6875 0.5 0.5938 +0.6875 0.5 0.625 +0.6875 0.5 0.6562 +0.6875 0.5 0.6875 +0.6875 0.5 0.7188 +0.6875 0.5 0.75 +0.6875 0.5 0.7812 +0.6875 0.5 0.8125 +0.6875 0.5 0.8438 +0.6875 0.5 0.875 +0.6875 0.5 0.9062 +0.6875 0.5 0.9375 +0.6875 0.5 0.9688 +0.6875 0.5 1 +0.6875 0.5312 0 +0.6875 0.5312 0.03125 +0.6875 0.5312 0.0625 +0.6875 0.5312 0.09375 +0.6875 0.5312 0.125 +0.6875 0.5312 0.1562 +0.6875 0.5312 0.1875 +0.6875 0.5312 0.2188 +0.6875 0.5312 0.25 +0.6875 0.5312 0.2812 +0.6875 0.5312 0.3125 +0.6875 0.5312 0.3438 +0.6875 0.5312 0.375 +0.6875 0.5312 0.4062 +0.6875 0.5312 0.4375 +0.6875 0.5312 0.4688 +0.6875 0.5312 0.5 +0.6875 0.5312 0.5312 +0.6875 0.5312 0.5625 +0.6875 0.5312 0.5938 +0.6875 0.5312 0.625 +0.6875 0.5312 0.6562 +0.6875 0.5312 0.6875 +0.6875 0.5312 0.7188 +0.6875 0.5312 0.75 +0.6875 0.5312 0.7812 +0.6875 0.5312 0.8125 +0.6875 0.5312 0.8438 +0.6875 0.5312 0.875 +0.6875 0.5312 0.9062 +0.6875 0.5312 0.9375 +0.6875 0.5312 0.9688 +0.6875 0.5312 1 +0.6875 0.5625 0 +0.6875 0.5625 0.03125 +0.6875 0.5625 0.0625 +0.6875 0.5625 0.09375 +0.6875 0.5625 0.125 +0.6875 0.5625 0.1562 +0.6875 0.5625 0.1875 +0.6875 0.5625 0.2188 +0.6875 0.5625 0.25 +0.6875 0.5625 0.2812 +0.6875 0.5625 0.3125 +0.6875 0.5625 0.3438 +0.6875 0.5625 0.375 +0.6875 0.5625 0.4062 +0.6875 0.5625 0.4375 +0.6875 0.5625 0.4688 +0.6875 0.5625 0.5 +0.6875 0.5625 0.5312 +0.6875 0.5625 0.5625 +0.6875 0.5625 0.5938 +0.6875 0.5625 0.625 +0.6875 0.5625 0.6562 +0.6875 0.5625 0.6875 +0.6875 0.5625 0.7188 +0.6875 0.5625 0.75 +0.6875 0.5625 0.7812 +0.6875 0.5625 0.8125 +0.6875 0.5625 0.8438 +0.6875 0.5625 0.875 +0.6875 0.5625 0.9062 +0.6875 0.5625 0.9375 +0.6875 0.5625 0.9688 +0.6875 0.5625 1 +0.6875 0.5938 0 +0.6875 0.5938 0.03125 +0.6875 0.5938 0.0625 +0.6875 0.5938 0.09375 +0.6875 0.5938 0.125 +0.6875 0.5938 0.1562 +0.6875 0.5938 0.1875 +0.6875 0.5938 0.2188 +0.6875 0.5938 0.25 +0.6875 0.5938 0.2812 +0.6875 0.5938 0.3125 +0.6875 0.5938 0.3438 +0.6875 0.5938 0.375 +0.6875 0.5938 0.4062 +0.6875 0.5938 0.4375 +0.6875 0.5938 0.4688 +0.6875 0.5938 0.5 +0.6875 0.5938 0.5312 +0.6875 0.5938 0.5625 +0.6875 0.5938 0.5938 +0.6875 0.5938 0.625 +0.6875 0.5938 0.6562 +0.6875 0.5938 0.6875 +0.6875 0.5938 0.7188 +0.6875 0.5938 0.75 +0.6875 0.5938 0.7812 +0.6875 0.5938 0.8125 +0.6875 0.5938 0.8438 +0.6875 0.5938 0.875 +0.6875 0.5938 0.9062 +0.6875 0.5938 0.9375 +0.6875 0.5938 0.9688 +0.6875 0.5938 1 +0.6875 0.625 0 +0.6875 0.625 0.03125 +0.6875 0.625 0.0625 +0.6875 0.625 0.09375 +0.6875 0.625 0.125 +0.6875 0.625 0.1562 +0.6875 0.625 0.1875 +0.6875 0.625 0.2188 +0.6875 0.625 0.25 +0.6875 0.625 0.2812 +0.6875 0.625 0.3125 +0.6875 0.625 0.3438 +0.6875 0.625 0.375 +0.6875 0.625 0.4062 +0.6875 0.625 0.4375 +0.6875 0.625 0.4688 +0.6875 0.625 0.5 +0.6875 0.625 0.5312 +0.6875 0.625 0.5625 +0.6875 0.625 0.5938 +0.6875 0.625 0.625 +0.6875 0.625 0.6562 +0.6875 0.625 0.6875 +0.6875 0.625 0.7188 +0.6875 0.625 0.75 +0.6875 0.625 0.7812 +0.6875 0.625 0.8125 +0.6875 0.625 0.8438 +0.6875 0.625 0.875 +0.6875 0.625 0.9062 +0.6875 0.625 0.9375 +0.6875 0.625 0.9688 +0.6875 0.625 1 +0.6875 0.6562 0 +0.6875 0.6562 0.03125 +0.6875 0.6562 0.0625 +0.6875 0.6562 0.09375 +0.6875 0.6562 0.125 +0.6875 0.6562 0.1562 +0.6875 0.6562 0.1875 +0.6875 0.6562 0.2188 +0.6875 0.6562 0.25 +0.6875 0.6562 0.2812 +0.6875 0.6562 0.3125 +0.6875 0.6562 0.3438 +0.6875 0.6562 0.375 +0.6875 0.6562 0.4062 +0.6875 0.6562 0.4375 +0.6875 0.6562 0.4688 +0.6875 0.6562 0.5 +0.6875 0.6562 0.5312 +0.6875 0.6562 0.5625 +0.6875 0.6562 0.5938 +0.6875 0.6562 0.625 +0.6875 0.6562 0.6562 +0.6875 0.6562 0.6875 +0.6875 0.6562 0.7188 +0.6875 0.6562 0.75 +0.6875 0.6562 0.7812 +0.6875 0.6562 0.8125 +0.6875 0.6562 0.8438 +0.6875 0.6562 0.875 +0.6875 0.6562 0.9062 +0.6875 0.6562 0.9375 +0.6875 0.6562 0.9688 +0.6875 0.6562 1 +0.6875 0.6875 0 +0.6875 0.6875 0.03125 +0.6875 0.6875 0.0625 +0.6875 0.6875 0.09375 +0.6875 0.6875 0.125 +0.6875 0.6875 0.1562 +0.6875 0.6875 0.1875 +0.6875 0.6875 0.2188 +0.6875 0.6875 0.25 +0.6875 0.6875 0.2812 +0.6875 0.6875 0.3125 +0.6875 0.6875 0.3438 +0.6875 0.6875 0.375 +0.6875 0.6875 0.4062 +0.6875 0.6875 0.4375 +0.6875 0.6875 0.4688 +0.6875 0.6875 0.5 +0.6875 0.6875 0.5312 +0.6875 0.6875 0.5625 +0.6875 0.6875 0.5938 +0.6875 0.6875 0.625 +0.6875 0.6875 0.6562 +0.6875 0.6875 0.6875 +0.6875 0.6875 0.7188 +0.6875 0.6875 0.75 +0.6875 0.6875 0.7812 +0.6875 0.6875 0.8125 +0.6875 0.6875 0.8438 +0.6875 0.6875 0.875 +0.6875 0.6875 0.9062 +0.6875 0.6875 0.9375 +0.6875 0.6875 0.9688 +0.6875 0.6875 1 +0.6875 0.7188 0 +0.6875 0.7188 0.03125 +0.6875 0.7188 0.0625 +0.6875 0.7188 0.09375 +0.6875 0.7188 0.125 +0.6875 0.7188 0.1562 +0.6875 0.7188 0.1875 +0.6875 0.7188 0.2188 +0.6875 0.7188 0.25 +0.6875 0.7188 0.2812 +0.6875 0.7188 0.3125 +0.6875 0.7188 0.3438 +0.6875 0.7188 0.375 +0.6875 0.7188 0.4062 +0.6875 0.7188 0.4375 +0.6875 0.7188 0.4688 +0.6875 0.7188 0.5 +0.6875 0.7188 0.5312 +0.6875 0.7188 0.5625 +0.6875 0.7188 0.5938 +0.6875 0.7188 0.625 +0.6875 0.7188 0.6562 +0.6875 0.7188 0.6875 +0.6875 0.7188 0.7188 +0.6875 0.7188 0.75 +0.6875 0.7188 0.7812 +0.6875 0.7188 0.8125 +0.6875 0.7188 0.8438 +0.6875 0.7188 0.875 +0.6875 0.7188 0.9062 +0.6875 0.7188 0.9375 +0.6875 0.7188 0.9688 +0.6875 0.7188 1 +0.6875 0.75 0 +0.6875 0.75 0.03125 +0.6875 0.75 0.0625 +0.6875 0.75 0.09375 +0.6875 0.75 0.125 +0.6875 0.75 0.1562 +0.6875 0.75 0.1875 +0.6875 0.75 0.2188 +0.6875 0.75 0.25 +0.6875 0.75 0.2812 +0.6875 0.75 0.3125 +0.6875 0.75 0.3438 +0.6875 0.75 0.375 +0.6875 0.75 0.4062 +0.6875 0.75 0.4375 +0.6875 0.75 0.4688 +0.6875 0.75 0.5 +0.6875 0.75 0.5312 +0.6875 0.75 0.5625 +0.6875 0.75 0.5938 +0.6875 0.75 0.625 +0.6875 0.75 0.6562 +0.6875 0.75 0.6875 +0.6875 0.75 0.7188 +0.6875 0.75 0.75 +0.6875 0.75 0.7812 +0.6875 0.75 0.8125 +0.6875 0.75 0.8438 +0.6875 0.75 0.875 +0.6875 0.75 0.9062 +0.6875 0.75 0.9375 +0.6875 0.75 0.9688 +0.6875 0.75 1 +0.6875 0.7812 0 +0.6875 0.7812 0.03125 +0.6875 0.7812 0.0625 +0.6875 0.7812 0.09375 +0.6875 0.7812 0.125 +0.6875 0.7812 0.1562 +0.6875 0.7812 0.1875 +0.6875 0.7812 0.2188 +0.6875 0.7812 0.25 +0.6875 0.7812 0.2812 +0.6875 0.7812 0.3125 +0.6875 0.7812 0.3438 +0.6875 0.7812 0.375 +0.6875 0.7812 0.4062 +0.6875 0.7812 0.4375 +0.6875 0.7812 0.4688 +0.6875 0.7812 0.5 +0.6875 0.7812 0.5312 +0.6875 0.7812 0.5625 +0.6875 0.7812 0.5938 +0.6875 0.7812 0.625 +0.6875 0.7812 0.6562 +0.6875 0.7812 0.6875 +0.6875 0.7812 0.7188 +0.6875 0.7812 0.75 +0.6875 0.7812 0.7812 +0.6875 0.7812 0.8125 +0.6875 0.7812 0.8438 +0.6875 0.7812 0.875 +0.6875 0.7812 0.9062 +0.6875 0.7812 0.9375 +0.6875 0.7812 0.9688 +0.6875 0.7812 1 +0.6875 0.8125 0 +0.6875 0.8125 0.03125 +0.6875 0.8125 0.0625 +0.6875 0.8125 0.09375 +0.6875 0.8125 0.125 +0.6875 0.8125 0.1562 +0.6875 0.8125 0.1875 +0.6875 0.8125 0.2188 +0.6875 0.8125 0.25 +0.6875 0.8125 0.2812 +0.6875 0.8125 0.3125 +0.6875 0.8125 0.3438 +0.6875 0.8125 0.375 +0.6875 0.8125 0.4062 +0.6875 0.8125 0.4375 +0.6875 0.8125 0.4688 +0.6875 0.8125 0.5 +0.6875 0.8125 0.5312 +0.6875 0.8125 0.5625 +0.6875 0.8125 0.5938 +0.6875 0.8125 0.625 +0.6875 0.8125 0.6562 +0.6875 0.8125 0.6875 +0.6875 0.8125 0.7188 +0.6875 0.8125 0.75 +0.6875 0.8125 0.7812 +0.6875 0.8125 0.8125 +0.6875 0.8125 0.8438 +0.6875 0.8125 0.875 +0.6875 0.8125 0.9062 +0.6875 0.8125 0.9375 +0.6875 0.8125 0.9688 +0.6875 0.8125 1 +0.6875 0.8438 0 +0.6875 0.8438 0.03125 +0.6875 0.8438 0.0625 +0.6875 0.8438 0.09375 +0.6875 0.8438 0.125 +0.6875 0.8438 0.1562 +0.6875 0.8438 0.1875 +0.6875 0.8438 0.2188 +0.6875 0.8438 0.25 +0.6875 0.8438 0.2812 +0.6875 0.8438 0.3125 +0.6875 0.8438 0.3438 +0.6875 0.8438 0.375 +0.6875 0.8438 0.4062 +0.6875 0.8438 0.4375 +0.6875 0.8438 0.4688 +0.6875 0.8438 0.5 +0.6875 0.8438 0.5312 +0.6875 0.8438 0.5625 +0.6875 0.8438 0.5938 +0.6875 0.8438 0.625 +0.6875 0.8438 0.6562 +0.6875 0.8438 0.6875 +0.6875 0.8438 0.7188 +0.6875 0.8438 0.75 +0.6875 0.8438 0.7812 +0.6875 0.8438 0.8125 +0.6875 0.8438 0.8438 +0.6875 0.8438 0.875 +0.6875 0.8438 0.9062 +0.6875 0.8438 0.9375 +0.6875 0.8438 0.9688 +0.6875 0.8438 1 +0.6875 0.875 0 +0.6875 0.875 0.03125 +0.6875 0.875 0.0625 +0.6875 0.875 0.09375 +0.6875 0.875 0.125 +0.6875 0.875 0.1562 +0.6875 0.875 0.1875 +0.6875 0.875 0.2188 +0.6875 0.875 0.25 +0.6875 0.875 0.2812 +0.6875 0.875 0.3125 +0.6875 0.875 0.3438 +0.6875 0.875 0.375 +0.6875 0.875 0.4062 +0.6875 0.875 0.4375 +0.6875 0.875 0.4688 +0.6875 0.875 0.5 +0.6875 0.875 0.5312 +0.6875 0.875 0.5625 +0.6875 0.875 0.5938 +0.6875 0.875 0.625 +0.6875 0.875 0.6562 +0.6875 0.875 0.6875 +0.6875 0.875 0.7188 +0.6875 0.875 0.75 +0.6875 0.875 0.7812 +0.6875 0.875 0.8125 +0.6875 0.875 0.8438 +0.6875 0.875 0.875 +0.6875 0.875 0.9062 +0.6875 0.875 0.9375 +0.6875 0.875 0.9688 +0.6875 0.875 1 +0.6875 0.9062 0 +0.6875 0.9062 0.03125 +0.6875 0.9062 0.0625 +0.6875 0.9062 0.09375 +0.6875 0.9062 0.125 +0.6875 0.9062 0.1562 +0.6875 0.9062 0.1875 +0.6875 0.9062 0.2188 +0.6875 0.9062 0.25 +0.6875 0.9062 0.2812 +0.6875 0.9062 0.3125 +0.6875 0.9062 0.3438 +0.6875 0.9062 0.375 +0.6875 0.9062 0.4062 +0.6875 0.9062 0.4375 +0.6875 0.9062 0.4688 +0.6875 0.9062 0.5 +0.6875 0.9062 0.5312 +0.6875 0.9062 0.5625 +0.6875 0.9062 0.5938 +0.6875 0.9062 0.625 +0.6875 0.9062 0.6562 +0.6875 0.9062 0.6875 +0.6875 0.9062 0.7188 +0.6875 0.9062 0.75 +0.6875 0.9062 0.7812 +0.6875 0.9062 0.8125 +0.6875 0.9062 0.8438 +0.6875 0.9062 0.875 +0.6875 0.9062 0.9062 +0.6875 0.9062 0.9375 +0.6875 0.9062 0.9688 +0.6875 0.9062 1 +0.6875 0.9375 0 +0.6875 0.9375 0.03125 +0.6875 0.9375 0.0625 +0.6875 0.9375 0.09375 +0.6875 0.9375 0.125 +0.6875 0.9375 0.1562 +0.6875 0.9375 0.1875 +0.6875 0.9375 0.2188 +0.6875 0.9375 0.25 +0.6875 0.9375 0.2812 +0.6875 0.9375 0.3125 +0.6875 0.9375 0.3438 +0.6875 0.9375 0.375 +0.6875 0.9375 0.4062 +0.6875 0.9375 0.4375 +0.6875 0.9375 0.4688 +0.6875 0.9375 0.5 +0.6875 0.9375 0.5312 +0.6875 0.9375 0.5625 +0.6875 0.9375 0.5938 +0.6875 0.9375 0.625 +0.6875 0.9375 0.6562 +0.6875 0.9375 0.6875 +0.6875 0.9375 0.7188 +0.6875 0.9375 0.75 +0.6875 0.9375 0.7812 +0.6875 0.9375 0.8125 +0.6875 0.9375 0.8438 +0.6875 0.9375 0.875 +0.6875 0.9375 0.9062 +0.6875 0.9375 0.9375 +0.6875 0.9375 0.9688 +0.6875 0.9375 1 +0.6875 0.9688 0 +0.6875 0.9688 0.03125 +0.6875 0.9688 0.0625 +0.6875 0.9688 0.09375 +0.6875 0.9688 0.125 +0.6875 0.9688 0.1562 +0.6875 0.9688 0.1875 +0.6875 0.9688 0.2188 +0.6875 0.9688 0.25 +0.6875 0.9688 0.2812 +0.6875 0.9688 0.3125 +0.6875 0.9688 0.3438 +0.6875 0.9688 0.375 +0.6875 0.9688 0.4062 +0.6875 0.9688 0.4375 +0.6875 0.9688 0.4688 +0.6875 0.9688 0.5 +0.6875 0.9688 0.5312 +0.6875 0.9688 0.5625 +0.6875 0.9688 0.5938 +0.6875 0.9688 0.625 +0.6875 0.9688 0.6562 +0.6875 0.9688 0.6875 +0.6875 0.9688 0.7188 +0.6875 0.9688 0.75 +0.6875 0.9688 0.7812 +0.6875 0.9688 0.8125 +0.6875 0.9688 0.8438 +0.6875 0.9688 0.875 +0.6875 0.9688 0.9062 +0.6875 0.9688 0.9375 +0.6875 0.9688 0.9688 +0.6875 0.9688 1 +0.6875 1 0 +0.6875 1 0.03125 +0.6875 1 0.0625 +0.6875 1 0.09375 +0.6875 1 0.125 +0.6875 1 0.1562 +0.6875 1 0.1875 +0.6875 1 0.2188 +0.6875 1 0.25 +0.6875 1 0.2812 +0.6875 1 0.3125 +0.6875 1 0.3438 +0.6875 1 0.375 +0.6875 1 0.4062 +0.6875 1 0.4375 +0.6875 1 0.4688 +0.6875 1 0.5 +0.6875 1 0.5312 +0.6875 1 0.5625 +0.6875 1 0.5938 +0.6875 1 0.625 +0.6875 1 0.6562 +0.6875 1 0.6875 +0.6875 1 0.7188 +0.6875 1 0.75 +0.6875 1 0.7812 +0.6875 1 0.8125 +0.6875 1 0.8438 +0.6875 1 0.875 +0.6875 1 0.9062 +0.6875 1 0.9375 +0.6875 1 0.9688 +0.6875 1 1 +0.7188 0 0 +0.7188 0 0.03125 +0.7188 0 0.0625 +0.7188 0 0.09375 +0.7188 0 0.125 +0.7188 0 0.1562 +0.7188 0 0.1875 +0.7188 0 0.2188 +0.7188 0 0.25 +0.7188 0 0.2812 +0.7188 0 0.3125 +0.7188 0 0.3438 +0.7188 0 0.375 +0.7188 0 0.4062 +0.7188 0 0.4375 +0.7188 0 0.4688 +0.7188 0 0.5 +0.7188 0 0.5312 +0.7188 0 0.5625 +0.7188 0 0.5938 +0.7188 0 0.625 +0.7188 0 0.6562 +0.7188 0 0.6875 +0.7188 0 0.7188 +0.7188 0 0.75 +0.7188 0 0.7812 +0.7188 0 0.8125 +0.7188 0 0.8438 +0.7188 0 0.875 +0.7188 0 0.9062 +0.7188 0 0.9375 +0.7188 0 0.9688 +0.7188 0 1 +0.7188 0.03125 0 +0.7188 0.03125 0.03125 +0.7188 0.03125 0.0625 +0.7188 0.03125 0.09375 +0.7188 0.03125 0.125 +0.7188 0.03125 0.1562 +0.7188 0.03125 0.1875 +0.7188 0.03125 0.2188 +0.7188 0.03125 0.25 +0.7188 0.03125 0.2812 +0.7188 0.03125 0.3125 +0.7188 0.03125 0.3438 +0.7188 0.03125 0.375 +0.7188 0.03125 0.4062 +0.7188 0.03125 0.4375 +0.7188 0.03125 0.4688 +0.7188 0.03125 0.5 +0.7188 0.03125 0.5312 +0.7188 0.03125 0.5625 +0.7188 0.03125 0.5938 +0.7188 0.03125 0.625 +0.7188 0.03125 0.6562 +0.7188 0.03125 0.6875 +0.7188 0.03125 0.7188 +0.7188 0.03125 0.75 +0.7188 0.03125 0.7812 +0.7188 0.03125 0.8125 +0.7188 0.03125 0.8438 +0.7188 0.03125 0.875 +0.7188 0.03125 0.9062 +0.7188 0.03125 0.9375 +0.7188 0.03125 0.9688 +0.7188 0.03125 1 +0.7188 0.0625 0 +0.7188 0.0625 0.03125 +0.7188 0.0625 0.0625 +0.7188 0.0625 0.09375 +0.7188 0.0625 0.125 +0.7188 0.0625 0.1562 +0.7188 0.0625 0.1875 +0.7188 0.0625 0.2188 +0.7188 0.0625 0.25 +0.7188 0.0625 0.2812 +0.7188 0.0625 0.3125 +0.7188 0.0625 0.3438 +0.7188 0.0625 0.375 +0.7188 0.0625 0.4062 +0.7188 0.0625 0.4375 +0.7188 0.0625 0.4688 +0.7188 0.0625 0.5 +0.7188 0.0625 0.5312 +0.7188 0.0625 0.5625 +0.7188 0.0625 0.5938 +0.7188 0.0625 0.625 +0.7188 0.0625 0.6562 +0.7188 0.0625 0.6875 +0.7188 0.0625 0.7188 +0.7188 0.0625 0.75 +0.7188 0.0625 0.7812 +0.7188 0.0625 0.8125 +0.7188 0.0625 0.8438 +0.7188 0.0625 0.875 +0.7188 0.0625 0.9062 +0.7188 0.0625 0.9375 +0.7188 0.0625 0.9688 +0.7188 0.0625 1 +0.7188 0.09375 0 +0.7188 0.09375 0.03125 +0.7188 0.09375 0.0625 +0.7188 0.09375 0.09375 +0.7188 0.09375 0.125 +0.7188 0.09375 0.1562 +0.7188 0.09375 0.1875 +0.7188 0.09375 0.2188 +0.7188 0.09375 0.25 +0.7188 0.09375 0.2812 +0.7188 0.09375 0.3125 +0.7188 0.09375 0.3438 +0.7188 0.09375 0.375 +0.7188 0.09375 0.4062 +0.7188 0.09375 0.4375 +0.7188 0.09375 0.4688 +0.7188 0.09375 0.5 +0.7188 0.09375 0.5312 +0.7188 0.09375 0.5625 +0.7188 0.09375 0.5938 +0.7188 0.09375 0.625 +0.7188 0.09375 0.6562 +0.7188 0.09375 0.6875 +0.7188 0.09375 0.7188 +0.7188 0.09375 0.75 +0.7188 0.09375 0.7812 +0.7188 0.09375 0.8125 +0.7188 0.09375 0.8438 +0.7188 0.09375 0.875 +0.7188 0.09375 0.9062 +0.7188 0.09375 0.9375 +0.7188 0.09375 0.9688 +0.7188 0.09375 1 +0.7188 0.125 0 +0.7188 0.125 0.03125 +0.7188 0.125 0.0625 +0.7188 0.125 0.09375 +0.7188 0.125 0.125 +0.7188 0.125 0.1562 +0.7188 0.125 0.1875 +0.7188 0.125 0.2188 +0.7188 0.125 0.25 +0.7188 0.125 0.2812 +0.7188 0.125 0.3125 +0.7188 0.125 0.3438 +0.7188 0.125 0.375 +0.7188 0.125 0.4062 +0.7188 0.125 0.4375 +0.7188 0.125 0.4688 +0.7188 0.125 0.5 +0.7188 0.125 0.5312 +0.7188 0.125 0.5625 +0.7188 0.125 0.5938 +0.7188 0.125 0.625 +0.7188 0.125 0.6562 +0.7188 0.125 0.6875 +0.7188 0.125 0.7188 +0.7188 0.125 0.75 +0.7188 0.125 0.7812 +0.7188 0.125 0.8125 +0.7188 0.125 0.8438 +0.7188 0.125 0.875 +0.7188 0.125 0.9062 +0.7188 0.125 0.9375 +0.7188 0.125 0.9688 +0.7188 0.125 1 +0.7188 0.1562 0 +0.7188 0.1562 0.03125 +0.7188 0.1562 0.0625 +0.7188 0.1562 0.09375 +0.7188 0.1562 0.125 +0.7188 0.1562 0.1562 +0.7188 0.1562 0.1875 +0.7188 0.1562 0.2188 +0.7188 0.1562 0.25 +0.7188 0.1562 0.2812 +0.7188 0.1562 0.3125 +0.7188 0.1562 0.3438 +0.7188 0.1562 0.375 +0.7188 0.1562 0.4062 +0.7188 0.1562 0.4375 +0.7188 0.1562 0.4688 +0.7188 0.1562 0.5 +0.7188 0.1562 0.5312 +0.7188 0.1562 0.5625 +0.7188 0.1562 0.5938 +0.7188 0.1562 0.625 +0.7188 0.1562 0.6562 +0.7188 0.1562 0.6875 +0.7188 0.1562 0.7188 +0.7188 0.1562 0.75 +0.7188 0.1562 0.7812 +0.7188 0.1562 0.8125 +0.7188 0.1562 0.8438 +0.7188 0.1562 0.875 +0.7188 0.1562 0.9062 +0.7188 0.1562 0.9375 +0.7188 0.1562 0.9688 +0.7188 0.1562 1 +0.7188 0.1875 0 +0.7188 0.1875 0.03125 +0.7188 0.1875 0.0625 +0.7188 0.1875 0.09375 +0.7188 0.1875 0.125 +0.7188 0.1875 0.1562 +0.7188 0.1875 0.1875 +0.7188 0.1875 0.2188 +0.7188 0.1875 0.25 +0.7188 0.1875 0.2812 +0.7188 0.1875 0.3125 +0.7188 0.1875 0.3438 +0.7188 0.1875 0.375 +0.7188 0.1875 0.4062 +0.7188 0.1875 0.4375 +0.7188 0.1875 0.4688 +0.7188 0.1875 0.5 +0.7188 0.1875 0.5312 +0.7188 0.1875 0.5625 +0.7188 0.1875 0.5938 +0.7188 0.1875 0.625 +0.7188 0.1875 0.6562 +0.7188 0.1875 0.6875 +0.7188 0.1875 0.7188 +0.7188 0.1875 0.75 +0.7188 0.1875 0.7812 +0.7188 0.1875 0.8125 +0.7188 0.1875 0.8438 +0.7188 0.1875 0.875 +0.7188 0.1875 0.9062 +0.7188 0.1875 0.9375 +0.7188 0.1875 0.9688 +0.7188 0.1875 1 +0.7188 0.2188 0 +0.7188 0.2188 0.03125 +0.7188 0.2188 0.0625 +0.7188 0.2188 0.09375 +0.7188 0.2188 0.125 +0.7188 0.2188 0.1562 +0.7188 0.2188 0.1875 +0.7188 0.2188 0.2188 +0.7188 0.2188 0.25 +0.7188 0.2188 0.2812 +0.7188 0.2188 0.3125 +0.7188 0.2188 0.3438 +0.7188 0.2188 0.375 +0.7188 0.2188 0.4062 +0.7188 0.2188 0.4375 +0.7188 0.2188 0.4688 +0.7188 0.2188 0.5 +0.7188 0.2188 0.5312 +0.7188 0.2188 0.5625 +0.7188 0.2188 0.5938 +0.7188 0.2188 0.625 +0.7188 0.2188 0.6562 +0.7188 0.2188 0.6875 +0.7188 0.2188 0.7188 +0.7188 0.2188 0.75 +0.7188 0.2188 0.7812 +0.7188 0.2188 0.8125 +0.7188 0.2188 0.8438 +0.7188 0.2188 0.875 +0.7188 0.2188 0.9062 +0.7188 0.2188 0.9375 +0.7188 0.2188 0.9688 +0.7188 0.2188 1 +0.7188 0.25 0 +0.7188 0.25 0.03125 +0.7188 0.25 0.0625 +0.7188 0.25 0.09375 +0.7188 0.25 0.125 +0.7188 0.25 0.1562 +0.7188 0.25 0.1875 +0.7188 0.25 0.2188 +0.7188 0.25 0.25 +0.7188 0.25 0.2812 +0.7188 0.25 0.3125 +0.7188 0.25 0.3438 +0.7188 0.25 0.375 +0.7188 0.25 0.4062 +0.7188 0.25 0.4375 +0.7188 0.25 0.4688 +0.7188 0.25 0.5 +0.7188 0.25 0.5312 +0.7188 0.25 0.5625 +0.7188 0.25 0.5938 +0.7188 0.25 0.625 +0.7188 0.25 0.6562 +0.7188 0.25 0.6875 +0.7188 0.25 0.7188 +0.7188 0.25 0.75 +0.7188 0.25 0.7812 +0.7188 0.25 0.8125 +0.7188 0.25 0.8438 +0.7188 0.25 0.875 +0.7188 0.25 0.9062 +0.7188 0.25 0.9375 +0.7188 0.25 0.9688 +0.7188 0.25 1 +0.7188 0.2812 0 +0.7188 0.2812 0.03125 +0.7188 0.2812 0.0625 +0.7188 0.2812 0.09375 +0.7188 0.2812 0.125 +0.7188 0.2812 0.1562 +0.7188 0.2812 0.1875 +0.7188 0.2812 0.2188 +0.7188 0.2812 0.25 +0.7188 0.2812 0.2812 +0.7188 0.2812 0.3125 +0.7188 0.2812 0.3438 +0.7188 0.2812 0.375 +0.7188 0.2812 0.4062 +0.7188 0.2812 0.4375 +0.7188 0.2812 0.4688 +0.7188 0.2812 0.5 +0.7188 0.2812 0.5312 +0.7188 0.2812 0.5625 +0.7188 0.2812 0.5938 +0.7188 0.2812 0.625 +0.7188 0.2812 0.6562 +0.7188 0.2812 0.6875 +0.7188 0.2812 0.7188 +0.7188 0.2812 0.75 +0.7188 0.2812 0.7812 +0.7188 0.2812 0.8125 +0.7188 0.2812 0.8438 +0.7188 0.2812 0.875 +0.7188 0.2812 0.9062 +0.7188 0.2812 0.9375 +0.7188 0.2812 0.9688 +0.7188 0.2812 1 +0.7188 0.3125 0 +0.7188 0.3125 0.03125 +0.7188 0.3125 0.0625 +0.7188 0.3125 0.09375 +0.7188 0.3125 0.125 +0.7188 0.3125 0.1562 +0.7188 0.3125 0.1875 +0.7188 0.3125 0.2188 +0.7188 0.3125 0.25 +0.7188 0.3125 0.2812 +0.7188 0.3125 0.3125 +0.7188 0.3125 0.3438 +0.7188 0.3125 0.375 +0.7188 0.3125 0.4062 +0.7188 0.3125 0.4375 +0.7188 0.3125 0.4688 +0.7188 0.3125 0.5 +0.7188 0.3125 0.5312 +0.7188 0.3125 0.5625 +0.7188 0.3125 0.5938 +0.7188 0.3125 0.625 +0.7188 0.3125 0.6562 +0.7188 0.3125 0.6875 +0.7188 0.3125 0.7188 +0.7188 0.3125 0.75 +0.7188 0.3125 0.7812 +0.7188 0.3125 0.8125 +0.7188 0.3125 0.8438 +0.7188 0.3125 0.875 +0.7188 0.3125 0.9062 +0.7188 0.3125 0.9375 +0.7188 0.3125 0.9688 +0.7188 0.3125 1 +0.7188 0.3438 0 +0.7188 0.3438 0.03125 +0.7188 0.3438 0.0625 +0.7188 0.3438 0.09375 +0.7188 0.3438 0.125 +0.7188 0.3438 0.1562 +0.7188 0.3438 0.1875 +0.7188 0.3438 0.2188 +0.7188 0.3438 0.25 +0.7188 0.3438 0.2812 +0.7188 0.3438 0.3125 +0.7188 0.3438 0.3438 +0.7188 0.3438 0.375 +0.7188 0.3438 0.4062 +0.7188 0.3438 0.4375 +0.7188 0.3438 0.4688 +0.7188 0.3438 0.5 +0.7188 0.3438 0.5312 +0.7188 0.3438 0.5625 +0.7188 0.3438 0.5938 +0.7188 0.3438 0.625 +0.7188 0.3438 0.6562 +0.7188 0.3438 0.6875 +0.7188 0.3438 0.7188 +0.7188 0.3438 0.75 +0.7188 0.3438 0.7812 +0.7188 0.3438 0.8125 +0.7188 0.3438 0.8438 +0.7188 0.3438 0.875 +0.7188 0.3438 0.9062 +0.7188 0.3438 0.9375 +0.7188 0.3438 0.9688 +0.7188 0.3438 1 +0.7188 0.375 0 +0.7188 0.375 0.03125 +0.7188 0.375 0.0625 +0.7188 0.375 0.09375 +0.7188 0.375 0.125 +0.7188 0.375 0.1562 +0.7188 0.375 0.1875 +0.7188 0.375 0.2188 +0.7188 0.375 0.25 +0.7188 0.375 0.2812 +0.7188 0.375 0.3125 +0.7188 0.375 0.3438 +0.7188 0.375 0.375 +0.7188 0.375 0.4062 +0.7188 0.375 0.4375 +0.7188 0.375 0.4688 +0.7188 0.375 0.5 +0.7188 0.375 0.5312 +0.7188 0.375 0.5625 +0.7188 0.375 0.5938 +0.7188 0.375 0.625 +0.7188 0.375 0.6562 +0.7188 0.375 0.6875 +0.7188 0.375 0.7188 +0.7188 0.375 0.75 +0.7188 0.375 0.7812 +0.7188 0.375 0.8125 +0.7188 0.375 0.8438 +0.7188 0.375 0.875 +0.7188 0.375 0.9062 +0.7188 0.375 0.9375 +0.7188 0.375 0.9688 +0.7188 0.375 1 +0.7188 0.4062 0 +0.7188 0.4062 0.03125 +0.7188 0.4062 0.0625 +0.7188 0.4062 0.09375 +0.7188 0.4062 0.125 +0.7188 0.4062 0.1562 +0.7188 0.4062 0.1875 +0.7188 0.4062 0.2188 +0.7188 0.4062 0.25 +0.7188 0.4062 0.2812 +0.7188 0.4062 0.3125 +0.7188 0.4062 0.3438 +0.7188 0.4062 0.375 +0.7188 0.4062 0.4062 +0.7188 0.4062 0.4375 +0.7188 0.4062 0.4688 +0.7188 0.4062 0.5 +0.7188 0.4062 0.5312 +0.7188 0.4062 0.5625 +0.7188 0.4062 0.5938 +0.7188 0.4062 0.625 +0.7188 0.4062 0.6562 +0.7188 0.4062 0.6875 +0.7188 0.4062 0.7188 +0.7188 0.4062 0.75 +0.7188 0.4062 0.7812 +0.7188 0.4062 0.8125 +0.7188 0.4062 0.8438 +0.7188 0.4062 0.875 +0.7188 0.4062 0.9062 +0.7188 0.4062 0.9375 +0.7188 0.4062 0.9688 +0.7188 0.4062 1 +0.7188 0.4375 0 +0.7188 0.4375 0.03125 +0.7188 0.4375 0.0625 +0.7188 0.4375 0.09375 +0.7188 0.4375 0.125 +0.7188 0.4375 0.1562 +0.7188 0.4375 0.1875 +0.7188 0.4375 0.2188 +0.7188 0.4375 0.25 +0.7188 0.4375 0.2812 +0.7188 0.4375 0.3125 +0.7188 0.4375 0.3438 +0.7188 0.4375 0.375 +0.7188 0.4375 0.4062 +0.7188 0.4375 0.4375 +0.7188 0.4375 0.4688 +0.7188 0.4375 0.5 +0.7188 0.4375 0.5312 +0.7188 0.4375 0.5625 +0.7188 0.4375 0.5938 +0.7188 0.4375 0.625 +0.7188 0.4375 0.6562 +0.7188 0.4375 0.6875 +0.7188 0.4375 0.7188 +0.7188 0.4375 0.75 +0.7188 0.4375 0.7812 +0.7188 0.4375 0.8125 +0.7188 0.4375 0.8438 +0.7188 0.4375 0.875 +0.7188 0.4375 0.9062 +0.7188 0.4375 0.9375 +0.7188 0.4375 0.9688 +0.7188 0.4375 1 +0.7188 0.4688 0 +0.7188 0.4688 0.03125 +0.7188 0.4688 0.0625 +0.7188 0.4688 0.09375 +0.7188 0.4688 0.125 +0.7188 0.4688 0.1562 +0.7188 0.4688 0.1875 +0.7188 0.4688 0.2188 +0.7188 0.4688 0.25 +0.7188 0.4688 0.2812 +0.7188 0.4688 0.3125 +0.7188 0.4688 0.3438 +0.7188 0.4688 0.375 +0.7188 0.4688 0.4062 +0.7188 0.4688 0.4375 +0.7188 0.4688 0.4688 +0.7188 0.4688 0.5 +0.7188 0.4688 0.5312 +0.7188 0.4688 0.5625 +0.7188 0.4688 0.5938 +0.7188 0.4688 0.625 +0.7188 0.4688 0.6562 +0.7188 0.4688 0.6875 +0.7188 0.4688 0.7188 +0.7188 0.4688 0.75 +0.7188 0.4688 0.7812 +0.7188 0.4688 0.8125 +0.7188 0.4688 0.8438 +0.7188 0.4688 0.875 +0.7188 0.4688 0.9062 +0.7188 0.4688 0.9375 +0.7188 0.4688 0.9688 +0.7188 0.4688 1 +0.7188 0.5 0 +0.7188 0.5 0.03125 +0.7188 0.5 0.0625 +0.7188 0.5 0.09375 +0.7188 0.5 0.125 +0.7188 0.5 0.1562 +0.7188 0.5 0.1875 +0.7188 0.5 0.2188 +0.7188 0.5 0.25 +0.7188 0.5 0.2812 +0.7188 0.5 0.3125 +0.7188 0.5 0.3438 +0.7188 0.5 0.375 +0.7188 0.5 0.4062 +0.7188 0.5 0.4375 +0.7188 0.5 0.4688 +0.7188 0.5 0.5 +0.7188 0.5 0.5312 +0.7188 0.5 0.5625 +0.7188 0.5 0.5938 +0.7188 0.5 0.625 +0.7188 0.5 0.6562 +0.7188 0.5 0.6875 +0.7188 0.5 0.7188 +0.7188 0.5 0.75 +0.7188 0.5 0.7812 +0.7188 0.5 0.8125 +0.7188 0.5 0.8438 +0.7188 0.5 0.875 +0.7188 0.5 0.9062 +0.7188 0.5 0.9375 +0.7188 0.5 0.9688 +0.7188 0.5 1 +0.7188 0.5312 0 +0.7188 0.5312 0.03125 +0.7188 0.5312 0.0625 +0.7188 0.5312 0.09375 +0.7188 0.5312 0.125 +0.7188 0.5312 0.1562 +0.7188 0.5312 0.1875 +0.7188 0.5312 0.2188 +0.7188 0.5312 0.25 +0.7188 0.5312 0.2812 +0.7188 0.5312 0.3125 +0.7188 0.5312 0.3438 +0.7188 0.5312 0.375 +0.7188 0.5312 0.4062 +0.7188 0.5312 0.4375 +0.7188 0.5312 0.4688 +0.7188 0.5312 0.5 +0.7188 0.5312 0.5312 +0.7188 0.5312 0.5625 +0.7188 0.5312 0.5938 +0.7188 0.5312 0.625 +0.7188 0.5312 0.6562 +0.7188 0.5312 0.6875 +0.7188 0.5312 0.7188 +0.7188 0.5312 0.75 +0.7188 0.5312 0.7812 +0.7188 0.5312 0.8125 +0.7188 0.5312 0.8438 +0.7188 0.5312 0.875 +0.7188 0.5312 0.9062 +0.7188 0.5312 0.9375 +0.7188 0.5312 0.9688 +0.7188 0.5312 1 +0.7188 0.5625 0 +0.7188 0.5625 0.03125 +0.7188 0.5625 0.0625 +0.7188 0.5625 0.09375 +0.7188 0.5625 0.125 +0.7188 0.5625 0.1562 +0.7188 0.5625 0.1875 +0.7188 0.5625 0.2188 +0.7188 0.5625 0.25 +0.7188 0.5625 0.2812 +0.7188 0.5625 0.3125 +0.7188 0.5625 0.3438 +0.7188 0.5625 0.375 +0.7188 0.5625 0.4062 +0.7188 0.5625 0.4375 +0.7188 0.5625 0.4688 +0.7188 0.5625 0.5 +0.7188 0.5625 0.5312 +0.7188 0.5625 0.5625 +0.7188 0.5625 0.5938 +0.7188 0.5625 0.625 +0.7188 0.5625 0.6562 +0.7188 0.5625 0.6875 +0.7188 0.5625 0.7188 +0.7188 0.5625 0.75 +0.7188 0.5625 0.7812 +0.7188 0.5625 0.8125 +0.7188 0.5625 0.8438 +0.7188 0.5625 0.875 +0.7188 0.5625 0.9062 +0.7188 0.5625 0.9375 +0.7188 0.5625 0.9688 +0.7188 0.5625 1 +0.7188 0.5938 0 +0.7188 0.5938 0.03125 +0.7188 0.5938 0.0625 +0.7188 0.5938 0.09375 +0.7188 0.5938 0.125 +0.7188 0.5938 0.1562 +0.7188 0.5938 0.1875 +0.7188 0.5938 0.2188 +0.7188 0.5938 0.25 +0.7188 0.5938 0.2812 +0.7188 0.5938 0.3125 +0.7188 0.5938 0.3438 +0.7188 0.5938 0.375 +0.7188 0.5938 0.4062 +0.7188 0.5938 0.4375 +0.7188 0.5938 0.4688 +0.7188 0.5938 0.5 +0.7188 0.5938 0.5312 +0.7188 0.5938 0.5625 +0.7188 0.5938 0.5938 +0.7188 0.5938 0.625 +0.7188 0.5938 0.6562 +0.7188 0.5938 0.6875 +0.7188 0.5938 0.7188 +0.7188 0.5938 0.75 +0.7188 0.5938 0.7812 +0.7188 0.5938 0.8125 +0.7188 0.5938 0.8438 +0.7188 0.5938 0.875 +0.7188 0.5938 0.9062 +0.7188 0.5938 0.9375 +0.7188 0.5938 0.9688 +0.7188 0.5938 1 +0.7188 0.625 0 +0.7188 0.625 0.03125 +0.7188 0.625 0.0625 +0.7188 0.625 0.09375 +0.7188 0.625 0.125 +0.7188 0.625 0.1562 +0.7188 0.625 0.1875 +0.7188 0.625 0.2188 +0.7188 0.625 0.25 +0.7188 0.625 0.2812 +0.7188 0.625 0.3125 +0.7188 0.625 0.3438 +0.7188 0.625 0.375 +0.7188 0.625 0.4062 +0.7188 0.625 0.4375 +0.7188 0.625 0.4688 +0.7188 0.625 0.5 +0.7188 0.625 0.5312 +0.7188 0.625 0.5625 +0.7188 0.625 0.5938 +0.7188 0.625 0.625 +0.7188 0.625 0.6562 +0.7188 0.625 0.6875 +0.7188 0.625 0.7188 +0.7188 0.625 0.75 +0.7188 0.625 0.7812 +0.7188 0.625 0.8125 +0.7188 0.625 0.8438 +0.7188 0.625 0.875 +0.7188 0.625 0.9062 +0.7188 0.625 0.9375 +0.7188 0.625 0.9688 +0.7188 0.625 1 +0.7188 0.6562 0 +0.7188 0.6562 0.03125 +0.7188 0.6562 0.0625 +0.7188 0.6562 0.09375 +0.7188 0.6562 0.125 +0.7188 0.6562 0.1562 +0.7188 0.6562 0.1875 +0.7188 0.6562 0.2188 +0.7188 0.6562 0.25 +0.7188 0.6562 0.2812 +0.7188 0.6562 0.3125 +0.7188 0.6562 0.3438 +0.7188 0.6562 0.375 +0.7188 0.6562 0.4062 +0.7188 0.6562 0.4375 +0.7188 0.6562 0.4688 +0.7188 0.6562 0.5 +0.7188 0.6562 0.5312 +0.7188 0.6562 0.5625 +0.7188 0.6562 0.5938 +0.7188 0.6562 0.625 +0.7188 0.6562 0.6562 +0.7188 0.6562 0.6875 +0.7188 0.6562 0.7188 +0.7188 0.6562 0.75 +0.7188 0.6562 0.7812 +0.7188 0.6562 0.8125 +0.7188 0.6562 0.8438 +0.7188 0.6562 0.875 +0.7188 0.6562 0.9062 +0.7188 0.6562 0.9375 +0.7188 0.6562 0.9688 +0.7188 0.6562 1 +0.7188 0.6875 0 +0.7188 0.6875 0.03125 +0.7188 0.6875 0.0625 +0.7188 0.6875 0.09375 +0.7188 0.6875 0.125 +0.7188 0.6875 0.1562 +0.7188 0.6875 0.1875 +0.7188 0.6875 0.2188 +0.7188 0.6875 0.25 +0.7188 0.6875 0.2812 +0.7188 0.6875 0.3125 +0.7188 0.6875 0.3438 +0.7188 0.6875 0.375 +0.7188 0.6875 0.4062 +0.7188 0.6875 0.4375 +0.7188 0.6875 0.4688 +0.7188 0.6875 0.5 +0.7188 0.6875 0.5312 +0.7188 0.6875 0.5625 +0.7188 0.6875 0.5938 +0.7188 0.6875 0.625 +0.7188 0.6875 0.6562 +0.7188 0.6875 0.6875 +0.7188 0.6875 0.7188 +0.7188 0.6875 0.75 +0.7188 0.6875 0.7812 +0.7188 0.6875 0.8125 +0.7188 0.6875 0.8438 +0.7188 0.6875 0.875 +0.7188 0.6875 0.9062 +0.7188 0.6875 0.9375 +0.7188 0.6875 0.9688 +0.7188 0.6875 1 +0.7188 0.7188 0 +0.7188 0.7188 0.03125 +0.7188 0.7188 0.0625 +0.7188 0.7188 0.09375 +0.7188 0.7188 0.125 +0.7188 0.7188 0.1562 +0.7188 0.7188 0.1875 +0.7188 0.7188 0.2188 +0.7188 0.7188 0.25 +0.7188 0.7188 0.2812 +0.7188 0.7188 0.3125 +0.7188 0.7188 0.3438 +0.7188 0.7188 0.375 +0.7188 0.7188 0.4062 +0.7188 0.7188 0.4375 +0.7188 0.7188 0.4688 +0.7188 0.7188 0.5 +0.7188 0.7188 0.5312 +0.7188 0.7188 0.5625 +0.7188 0.7188 0.5938 +0.7188 0.7188 0.625 +0.7188 0.7188 0.6562 +0.7188 0.7188 0.6875 +0.7188 0.7188 0.7188 +0.7188 0.7188 0.75 +0.7188 0.7188 0.7812 +0.7188 0.7188 0.8125 +0.7188 0.7188 0.8438 +0.7188 0.7188 0.875 +0.7188 0.7188 0.9062 +0.7188 0.7188 0.9375 +0.7188 0.7188 0.9688 +0.7188 0.7188 1 +0.7188 0.75 0 +0.7188 0.75 0.03125 +0.7188 0.75 0.0625 +0.7188 0.75 0.09375 +0.7188 0.75 0.125 +0.7188 0.75 0.1562 +0.7188 0.75 0.1875 +0.7188 0.75 0.2188 +0.7188 0.75 0.25 +0.7188 0.75 0.2812 +0.7188 0.75 0.3125 +0.7188 0.75 0.3438 +0.7188 0.75 0.375 +0.7188 0.75 0.4062 +0.7188 0.75 0.4375 +0.7188 0.75 0.4688 +0.7188 0.75 0.5 +0.7188 0.75 0.5312 +0.7188 0.75 0.5625 +0.7188 0.75 0.5938 +0.7188 0.75 0.625 +0.7188 0.75 0.6562 +0.7188 0.75 0.6875 +0.7188 0.75 0.7188 +0.7188 0.75 0.75 +0.7188 0.75 0.7812 +0.7188 0.75 0.8125 +0.7188 0.75 0.8438 +0.7188 0.75 0.875 +0.7188 0.75 0.9062 +0.7188 0.75 0.9375 +0.7188 0.75 0.9688 +0.7188 0.75 1 +0.7188 0.7812 0 +0.7188 0.7812 0.03125 +0.7188 0.7812 0.0625 +0.7188 0.7812 0.09375 +0.7188 0.7812 0.125 +0.7188 0.7812 0.1562 +0.7188 0.7812 0.1875 +0.7188 0.7812 0.2188 +0.7188 0.7812 0.25 +0.7188 0.7812 0.2812 +0.7188 0.7812 0.3125 +0.7188 0.7812 0.3438 +0.7188 0.7812 0.375 +0.7188 0.7812 0.4062 +0.7188 0.7812 0.4375 +0.7188 0.7812 0.4688 +0.7188 0.7812 0.5 +0.7188 0.7812 0.5312 +0.7188 0.7812 0.5625 +0.7188 0.7812 0.5938 +0.7188 0.7812 0.625 +0.7188 0.7812 0.6562 +0.7188 0.7812 0.6875 +0.7188 0.7812 0.7188 +0.7188 0.7812 0.75 +0.7188 0.7812 0.7812 +0.7188 0.7812 0.8125 +0.7188 0.7812 0.8438 +0.7188 0.7812 0.875 +0.7188 0.7812 0.9062 +0.7188 0.7812 0.9375 +0.7188 0.7812 0.9688 +0.7188 0.7812 1 +0.7188 0.8125 0 +0.7188 0.8125 0.03125 +0.7188 0.8125 0.0625 +0.7188 0.8125 0.09375 +0.7188 0.8125 0.125 +0.7188 0.8125 0.1562 +0.7188 0.8125 0.1875 +0.7188 0.8125 0.2188 +0.7188 0.8125 0.25 +0.7188 0.8125 0.2812 +0.7188 0.8125 0.3125 +0.7188 0.8125 0.3438 +0.7188 0.8125 0.375 +0.7188 0.8125 0.4062 +0.7188 0.8125 0.4375 +0.7188 0.8125 0.4688 +0.7188 0.8125 0.5 +0.7188 0.8125 0.5312 +0.7188 0.8125 0.5625 +0.7188 0.8125 0.5938 +0.7188 0.8125 0.625 +0.7188 0.8125 0.6562 +0.7188 0.8125 0.6875 +0.7188 0.8125 0.7188 +0.7188 0.8125 0.75 +0.7188 0.8125 0.7812 +0.7188 0.8125 0.8125 +0.7188 0.8125 0.8438 +0.7188 0.8125 0.875 +0.7188 0.8125 0.9062 +0.7188 0.8125 0.9375 +0.7188 0.8125 0.9688 +0.7188 0.8125 1 +0.7188 0.8438 0 +0.7188 0.8438 0.03125 +0.7188 0.8438 0.0625 +0.7188 0.8438 0.09375 +0.7188 0.8438 0.125 +0.7188 0.8438 0.1562 +0.7188 0.8438 0.1875 +0.7188 0.8438 0.2188 +0.7188 0.8438 0.25 +0.7188 0.8438 0.2812 +0.7188 0.8438 0.3125 +0.7188 0.8438 0.3438 +0.7188 0.8438 0.375 +0.7188 0.8438 0.4062 +0.7188 0.8438 0.4375 +0.7188 0.8438 0.4688 +0.7188 0.8438 0.5 +0.7188 0.8438 0.5312 +0.7188 0.8438 0.5625 +0.7188 0.8438 0.5938 +0.7188 0.8438 0.625 +0.7188 0.8438 0.6562 +0.7188 0.8438 0.6875 +0.7188 0.8438 0.7188 +0.7188 0.8438 0.75 +0.7188 0.8438 0.7812 +0.7188 0.8438 0.8125 +0.7188 0.8438 0.8438 +0.7188 0.8438 0.875 +0.7188 0.8438 0.9062 +0.7188 0.8438 0.9375 +0.7188 0.8438 0.9688 +0.7188 0.8438 1 +0.7188 0.875 0 +0.7188 0.875 0.03125 +0.7188 0.875 0.0625 +0.7188 0.875 0.09375 +0.7188 0.875 0.125 +0.7188 0.875 0.1562 +0.7188 0.875 0.1875 +0.7188 0.875 0.2188 +0.7188 0.875 0.25 +0.7188 0.875 0.2812 +0.7188 0.875 0.3125 +0.7188 0.875 0.3438 +0.7188 0.875 0.375 +0.7188 0.875 0.4062 +0.7188 0.875 0.4375 +0.7188 0.875 0.4688 +0.7188 0.875 0.5 +0.7188 0.875 0.5312 +0.7188 0.875 0.5625 +0.7188 0.875 0.5938 +0.7188 0.875 0.625 +0.7188 0.875 0.6562 +0.7188 0.875 0.6875 +0.7188 0.875 0.7188 +0.7188 0.875 0.75 +0.7188 0.875 0.7812 +0.7188 0.875 0.8125 +0.7188 0.875 0.8438 +0.7188 0.875 0.875 +0.7188 0.875 0.9062 +0.7188 0.875 0.9375 +0.7188 0.875 0.9688 +0.7188 0.875 1 +0.7188 0.9062 0 +0.7188 0.9062 0.03125 +0.7188 0.9062 0.0625 +0.7188 0.9062 0.09375 +0.7188 0.9062 0.125 +0.7188 0.9062 0.1562 +0.7188 0.9062 0.1875 +0.7188 0.9062 0.2188 +0.7188 0.9062 0.25 +0.7188 0.9062 0.2812 +0.7188 0.9062 0.3125 +0.7188 0.9062 0.3438 +0.7188 0.9062 0.375 +0.7188 0.9062 0.4062 +0.7188 0.9062 0.4375 +0.7188 0.9062 0.4688 +0.7188 0.9062 0.5 +0.7188 0.9062 0.5312 +0.7188 0.9062 0.5625 +0.7188 0.9062 0.5938 +0.7188 0.9062 0.625 +0.7188 0.9062 0.6562 +0.7188 0.9062 0.6875 +0.7188 0.9062 0.7188 +0.7188 0.9062 0.75 +0.7188 0.9062 0.7812 +0.7188 0.9062 0.8125 +0.7188 0.9062 0.8438 +0.7188 0.9062 0.875 +0.7188 0.9062 0.9062 +0.7188 0.9062 0.9375 +0.7188 0.9062 0.9688 +0.7188 0.9062 1 +0.7188 0.9375 0 +0.7188 0.9375 0.03125 +0.7188 0.9375 0.0625 +0.7188 0.9375 0.09375 +0.7188 0.9375 0.125 +0.7188 0.9375 0.1562 +0.7188 0.9375 0.1875 +0.7188 0.9375 0.2188 +0.7188 0.9375 0.25 +0.7188 0.9375 0.2812 +0.7188 0.9375 0.3125 +0.7188 0.9375 0.3438 +0.7188 0.9375 0.375 +0.7188 0.9375 0.4062 +0.7188 0.9375 0.4375 +0.7188 0.9375 0.4688 +0.7188 0.9375 0.5 +0.7188 0.9375 0.5312 +0.7188 0.9375 0.5625 +0.7188 0.9375 0.5938 +0.7188 0.9375 0.625 +0.7188 0.9375 0.6562 +0.7188 0.9375 0.6875 +0.7188 0.9375 0.7188 +0.7188 0.9375 0.75 +0.7188 0.9375 0.7812 +0.7188 0.9375 0.8125 +0.7188 0.9375 0.8438 +0.7188 0.9375 0.875 +0.7188 0.9375 0.9062 +0.7188 0.9375 0.9375 +0.7188 0.9375 0.9688 +0.7188 0.9375 1 +0.7188 0.9688 0 +0.7188 0.9688 0.03125 +0.7188 0.9688 0.0625 +0.7188 0.9688 0.09375 +0.7188 0.9688 0.125 +0.7188 0.9688 0.1562 +0.7188 0.9688 0.1875 +0.7188 0.9688 0.2188 +0.7188 0.9688 0.25 +0.7188 0.9688 0.2812 +0.7188 0.9688 0.3125 +0.7188 0.9688 0.3438 +0.7188 0.9688 0.375 +0.7188 0.9688 0.4062 +0.7188 0.9688 0.4375 +0.7188 0.9688 0.4688 +0.7188 0.9688 0.5 +0.7188 0.9688 0.5312 +0.7188 0.9688 0.5625 +0.7188 0.9688 0.5938 +0.7188 0.9688 0.625 +0.7188 0.9688 0.6562 +0.7188 0.9688 0.6875 +0.7188 0.9688 0.7188 +0.7188 0.9688 0.75 +0.7188 0.9688 0.7812 +0.7188 0.9688 0.8125 +0.7188 0.9688 0.8438 +0.7188 0.9688 0.875 +0.7188 0.9688 0.9062 +0.7188 0.9688 0.9375 +0.7188 0.9688 0.9688 +0.7188 0.9688 1 +0.7188 1 0 +0.7188 1 0.03125 +0.7188 1 0.0625 +0.7188 1 0.09375 +0.7188 1 0.125 +0.7188 1 0.1562 +0.7188 1 0.1875 +0.7188 1 0.2188 +0.7188 1 0.25 +0.7188 1 0.2812 +0.7188 1 0.3125 +0.7188 1 0.3438 +0.7188 1 0.375 +0.7188 1 0.4062 +0.7188 1 0.4375 +0.7188 1 0.4688 +0.7188 1 0.5 +0.7188 1 0.5312 +0.7188 1 0.5625 +0.7188 1 0.5938 +0.7188 1 0.625 +0.7188 1 0.6562 +0.7188 1 0.6875 +0.7188 1 0.7188 +0.7188 1 0.75 +0.7188 1 0.7812 +0.7188 1 0.8125 +0.7188 1 0.8438 +0.7188 1 0.875 +0.7188 1 0.9062 +0.7188 1 0.9375 +0.7188 1 0.9688 +0.7188 1 1 +0.75 0 0 +0.75 0 0.03125 +0.75 0 0.0625 +0.75 0 0.09375 +0.75 0 0.125 +0.75 0 0.1562 +0.75 0 0.1875 +0.75 0 0.2188 +0.75 0 0.25 +0.75 0 0.2812 +0.75 0 0.3125 +0.75 0 0.3438 +0.75 0 0.375 +0.75 0 0.4062 +0.75 0 0.4375 +0.75 0 0.4688 +0.75 0 0.5 +0.75 0 0.5312 +0.75 0 0.5625 +0.75 0 0.5938 +0.75 0 0.625 +0.75 0 0.6562 +0.75 0 0.6875 +0.75 0 0.7188 +0.75 0 0.75 +0.75 0 0.7812 +0.75 0 0.8125 +0.75 0 0.8438 +0.75 0 0.875 +0.75 0 0.9062 +0.75 0 0.9375 +0.75 0 0.9688 +0.75 0 1 +0.75 0.03125 0 +0.75 0.03125 0.03125 +0.75 0.03125 0.0625 +0.75 0.03125 0.09375 +0.75 0.03125 0.125 +0.75 0.03125 0.1562 +0.75 0.03125 0.1875 +0.75 0.03125 0.2188 +0.75 0.03125 0.25 +0.75 0.03125 0.2812 +0.75 0.03125 0.3125 +0.75 0.03125 0.3438 +0.75 0.03125 0.375 +0.75 0.03125 0.4062 +0.75 0.03125 0.4375 +0.75 0.03125 0.4688 +0.75 0.03125 0.5 +0.75 0.03125 0.5312 +0.75 0.03125 0.5625 +0.75 0.03125 0.5938 +0.75 0.03125 0.625 +0.75 0.03125 0.6562 +0.75 0.03125 0.6875 +0.75 0.03125 0.7188 +0.75 0.03125 0.75 +0.75 0.03125 0.7812 +0.75 0.03125 0.8125 +0.75 0.03125 0.8438 +0.75 0.03125 0.875 +0.75 0.03125 0.9062 +0.75 0.03125 0.9375 +0.75 0.03125 0.9688 +0.75 0.03125 1 +0.75 0.0625 0 +0.75 0.0625 0.03125 +0.75 0.0625 0.0625 +0.75 0.0625 0.09375 +0.75 0.0625 0.125 +0.75 0.0625 0.1562 +0.75 0.0625 0.1875 +0.75 0.0625 0.2188 +0.75 0.0625 0.25 +0.75 0.0625 0.2812 +0.75 0.0625 0.3125 +0.75 0.0625 0.3438 +0.75 0.0625 0.375 +0.75 0.0625 0.4062 +0.75 0.0625 0.4375 +0.75 0.0625 0.4688 +0.75 0.0625 0.5 +0.75 0.0625 0.5312 +0.75 0.0625 0.5625 +0.75 0.0625 0.5938 +0.75 0.0625 0.625 +0.75 0.0625 0.6562 +0.75 0.0625 0.6875 +0.75 0.0625 0.7188 +0.75 0.0625 0.75 +0.75 0.0625 0.7812 +0.75 0.0625 0.8125 +0.75 0.0625 0.8438 +0.75 0.0625 0.875 +0.75 0.0625 0.9062 +0.75 0.0625 0.9375 +0.75 0.0625 0.9688 +0.75 0.0625 1 +0.75 0.09375 0 +0.75 0.09375 0.03125 +0.75 0.09375 0.0625 +0.75 0.09375 0.09375 +0.75 0.09375 0.125 +0.75 0.09375 0.1562 +0.75 0.09375 0.1875 +0.75 0.09375 0.2188 +0.75 0.09375 0.25 +0.75 0.09375 0.2812 +0.75 0.09375 0.3125 +0.75 0.09375 0.3438 +0.75 0.09375 0.375 +0.75 0.09375 0.4062 +0.75 0.09375 0.4375 +0.75 0.09375 0.4688 +0.75 0.09375 0.5 +0.75 0.09375 0.5312 +0.75 0.09375 0.5625 +0.75 0.09375 0.5938 +0.75 0.09375 0.625 +0.75 0.09375 0.6562 +0.75 0.09375 0.6875 +0.75 0.09375 0.7188 +0.75 0.09375 0.75 +0.75 0.09375 0.7812 +0.75 0.09375 0.8125 +0.75 0.09375 0.8438 +0.75 0.09375 0.875 +0.75 0.09375 0.9062 +0.75 0.09375 0.9375 +0.75 0.09375 0.9688 +0.75 0.09375 1 +0.75 0.125 0 +0.75 0.125 0.03125 +0.75 0.125 0.0625 +0.75 0.125 0.09375 +0.75 0.125 0.125 +0.75 0.125 0.1562 +0.75 0.125 0.1875 +0.75 0.125 0.2188 +0.75 0.125 0.25 +0.75 0.125 0.2812 +0.75 0.125 0.3125 +0.75 0.125 0.3438 +0.75 0.125 0.375 +0.75 0.125 0.4062 +0.75 0.125 0.4375 +0.75 0.125 0.4688 +0.75 0.125 0.5 +0.75 0.125 0.5312 +0.75 0.125 0.5625 +0.75 0.125 0.5938 +0.75 0.125 0.625 +0.75 0.125 0.6562 +0.75 0.125 0.6875 +0.75 0.125 0.7188 +0.75 0.125 0.75 +0.75 0.125 0.7812 +0.75 0.125 0.8125 +0.75 0.125 0.8438 +0.75 0.125 0.875 +0.75 0.125 0.9062 +0.75 0.125 0.9375 +0.75 0.125 0.9688 +0.75 0.125 1 +0.75 0.1562 0 +0.75 0.1562 0.03125 +0.75 0.1562 0.0625 +0.75 0.1562 0.09375 +0.75 0.1562 0.125 +0.75 0.1562 0.1562 +0.75 0.1562 0.1875 +0.75 0.1562 0.2188 +0.75 0.1562 0.25 +0.75 0.1562 0.2812 +0.75 0.1562 0.3125 +0.75 0.1562 0.3438 +0.75 0.1562 0.375 +0.75 0.1562 0.4062 +0.75 0.1562 0.4375 +0.75 0.1562 0.4688 +0.75 0.1562 0.5 +0.75 0.1562 0.5312 +0.75 0.1562 0.5625 +0.75 0.1562 0.5938 +0.75 0.1562 0.625 +0.75 0.1562 0.6562 +0.75 0.1562 0.6875 +0.75 0.1562 0.7188 +0.75 0.1562 0.75 +0.75 0.1562 0.7812 +0.75 0.1562 0.8125 +0.75 0.1562 0.8438 +0.75 0.1562 0.875 +0.75 0.1562 0.9062 +0.75 0.1562 0.9375 +0.75 0.1562 0.9688 +0.75 0.1562 1 +0.75 0.1875 0 +0.75 0.1875 0.03125 +0.75 0.1875 0.0625 +0.75 0.1875 0.09375 +0.75 0.1875 0.125 +0.75 0.1875 0.1562 +0.75 0.1875 0.1875 +0.75 0.1875 0.2188 +0.75 0.1875 0.25 +0.75 0.1875 0.2812 +0.75 0.1875 0.3125 +0.75 0.1875 0.3438 +0.75 0.1875 0.375 +0.75 0.1875 0.4062 +0.75 0.1875 0.4375 +0.75 0.1875 0.4688 +0.75 0.1875 0.5 +0.75 0.1875 0.5312 +0.75 0.1875 0.5625 +0.75 0.1875 0.5938 +0.75 0.1875 0.625 +0.75 0.1875 0.6562 +0.75 0.1875 0.6875 +0.75 0.1875 0.7188 +0.75 0.1875 0.75 +0.75 0.1875 0.7812 +0.75 0.1875 0.8125 +0.75 0.1875 0.8438 +0.75 0.1875 0.875 +0.75 0.1875 0.9062 +0.75 0.1875 0.9375 +0.75 0.1875 0.9688 +0.75 0.1875 1 +0.75 0.2188 0 +0.75 0.2188 0.03125 +0.75 0.2188 0.0625 +0.75 0.2188 0.09375 +0.75 0.2188 0.125 +0.75 0.2188 0.1562 +0.75 0.2188 0.1875 +0.75 0.2188 0.2188 +0.75 0.2188 0.25 +0.75 0.2188 0.2812 +0.75 0.2188 0.3125 +0.75 0.2188 0.3438 +0.75 0.2188 0.375 +0.75 0.2188 0.4062 +0.75 0.2188 0.4375 +0.75 0.2188 0.4688 +0.75 0.2188 0.5 +0.75 0.2188 0.5312 +0.75 0.2188 0.5625 +0.75 0.2188 0.5938 +0.75 0.2188 0.625 +0.75 0.2188 0.6562 +0.75 0.2188 0.6875 +0.75 0.2188 0.7188 +0.75 0.2188 0.75 +0.75 0.2188 0.7812 +0.75 0.2188 0.8125 +0.75 0.2188 0.8438 +0.75 0.2188 0.875 +0.75 0.2188 0.9062 +0.75 0.2188 0.9375 +0.75 0.2188 0.9688 +0.75 0.2188 1 +0.75 0.25 0 +0.75 0.25 0.03125 +0.75 0.25 0.0625 +0.75 0.25 0.09375 +0.75 0.25 0.125 +0.75 0.25 0.1562 +0.75 0.25 0.1875 +0.75 0.25 0.2188 +0.75 0.25 0.25 +0.75 0.25 0.2812 +0.75 0.25 0.3125 +0.75 0.25 0.3438 +0.75 0.25 0.375 +0.75 0.25 0.4062 +0.75 0.25 0.4375 +0.75 0.25 0.4688 +0.75 0.25 0.5 +0.75 0.25 0.5312 +0.75 0.25 0.5625 +0.75 0.25 0.5938 +0.75 0.25 0.625 +0.75 0.25 0.6562 +0.75 0.25 0.6875 +0.75 0.25 0.7188 +0.75 0.25 0.75 +0.75 0.25 0.7812 +0.75 0.25 0.8125 +0.75 0.25 0.8438 +0.75 0.25 0.875 +0.75 0.25 0.9062 +0.75 0.25 0.9375 +0.75 0.25 0.9688 +0.75 0.25 1 +0.75 0.2812 0 +0.75 0.2812 0.03125 +0.75 0.2812 0.0625 +0.75 0.2812 0.09375 +0.75 0.2812 0.125 +0.75 0.2812 0.1562 +0.75 0.2812 0.1875 +0.75 0.2812 0.2188 +0.75 0.2812 0.25 +0.75 0.2812 0.2812 +0.75 0.2812 0.3125 +0.75 0.2812 0.3438 +0.75 0.2812 0.375 +0.75 0.2812 0.4062 +0.75 0.2812 0.4375 +0.75 0.2812 0.4688 +0.75 0.2812 0.5 +0.75 0.2812 0.5312 +0.75 0.2812 0.5625 +0.75 0.2812 0.5938 +0.75 0.2812 0.625 +0.75 0.2812 0.6562 +0.75 0.2812 0.6875 +0.75 0.2812 0.7188 +0.75 0.2812 0.75 +0.75 0.2812 0.7812 +0.75 0.2812 0.8125 +0.75 0.2812 0.8438 +0.75 0.2812 0.875 +0.75 0.2812 0.9062 +0.75 0.2812 0.9375 +0.75 0.2812 0.9688 +0.75 0.2812 1 +0.75 0.3125 0 +0.75 0.3125 0.03125 +0.75 0.3125 0.0625 +0.75 0.3125 0.09375 +0.75 0.3125 0.125 +0.75 0.3125 0.1562 +0.75 0.3125 0.1875 +0.75 0.3125 0.2188 +0.75 0.3125 0.25 +0.75 0.3125 0.2812 +0.75 0.3125 0.3125 +0.75 0.3125 0.3438 +0.75 0.3125 0.375 +0.75 0.3125 0.4062 +0.75 0.3125 0.4375 +0.75 0.3125 0.4688 +0.75 0.3125 0.5 +0.75 0.3125 0.5312 +0.75 0.3125 0.5625 +0.75 0.3125 0.5938 +0.75 0.3125 0.625 +0.75 0.3125 0.6562 +0.75 0.3125 0.6875 +0.75 0.3125 0.7188 +0.75 0.3125 0.75 +0.75 0.3125 0.7812 +0.75 0.3125 0.8125 +0.75 0.3125 0.8438 +0.75 0.3125 0.875 +0.75 0.3125 0.9062 +0.75 0.3125 0.9375 +0.75 0.3125 0.9688 +0.75 0.3125 1 +0.75 0.3438 0 +0.75 0.3438 0.03125 +0.75 0.3438 0.0625 +0.75 0.3438 0.09375 +0.75 0.3438 0.125 +0.75 0.3438 0.1562 +0.75 0.3438 0.1875 +0.75 0.3438 0.2188 +0.75 0.3438 0.25 +0.75 0.3438 0.2812 +0.75 0.3438 0.3125 +0.75 0.3438 0.3438 +0.75 0.3438 0.375 +0.75 0.3438 0.4062 +0.75 0.3438 0.4375 +0.75 0.3438 0.4688 +0.75 0.3438 0.5 +0.75 0.3438 0.5312 +0.75 0.3438 0.5625 +0.75 0.3438 0.5938 +0.75 0.3438 0.625 +0.75 0.3438 0.6562 +0.75 0.3438 0.6875 +0.75 0.3438 0.7188 +0.75 0.3438 0.75 +0.75 0.3438 0.7812 +0.75 0.3438 0.8125 +0.75 0.3438 0.8438 +0.75 0.3438 0.875 +0.75 0.3438 0.9062 +0.75 0.3438 0.9375 +0.75 0.3438 0.9688 +0.75 0.3438 1 +0.75 0.375 0 +0.75 0.375 0.03125 +0.75 0.375 0.0625 +0.75 0.375 0.09375 +0.75 0.375 0.125 +0.75 0.375 0.1562 +0.75 0.375 0.1875 +0.75 0.375 0.2188 +0.75 0.375 0.25 +0.75 0.375 0.2812 +0.75 0.375 0.3125 +0.75 0.375 0.3438 +0.75 0.375 0.375 +0.75 0.375 0.4062 +0.75 0.375 0.4375 +0.75 0.375 0.4688 +0.75 0.375 0.5 +0.75 0.375 0.5312 +0.75 0.375 0.5625 +0.75 0.375 0.5938 +0.75 0.375 0.625 +0.75 0.375 0.6562 +0.75 0.375 0.6875 +0.75 0.375 0.7188 +0.75 0.375 0.75 +0.75 0.375 0.7812 +0.75 0.375 0.8125 +0.75 0.375 0.8438 +0.75 0.375 0.875 +0.75 0.375 0.9062 +0.75 0.375 0.9375 +0.75 0.375 0.9688 +0.75 0.375 1 +0.75 0.4062 0 +0.75 0.4062 0.03125 +0.75 0.4062 0.0625 +0.75 0.4062 0.09375 +0.75 0.4062 0.125 +0.75 0.4062 0.1562 +0.75 0.4062 0.1875 +0.75 0.4062 0.2188 +0.75 0.4062 0.25 +0.75 0.4062 0.2812 +0.75 0.4062 0.3125 +0.75 0.4062 0.3438 +0.75 0.4062 0.375 +0.75 0.4062 0.4062 +0.75 0.4062 0.4375 +0.75 0.4062 0.4688 +0.75 0.4062 0.5 +0.75 0.4062 0.5312 +0.75 0.4062 0.5625 +0.75 0.4062 0.5938 +0.75 0.4062 0.625 +0.75 0.4062 0.6562 +0.75 0.4062 0.6875 +0.75 0.4062 0.7188 +0.75 0.4062 0.75 +0.75 0.4062 0.7812 +0.75 0.4062 0.8125 +0.75 0.4062 0.8438 +0.75 0.4062 0.875 +0.75 0.4062 0.9062 +0.75 0.4062 0.9375 +0.75 0.4062 0.9688 +0.75 0.4062 1 +0.75 0.4375 0 +0.75 0.4375 0.03125 +0.75 0.4375 0.0625 +0.75 0.4375 0.09375 +0.75 0.4375 0.125 +0.75 0.4375 0.1562 +0.75 0.4375 0.1875 +0.75 0.4375 0.2188 +0.75 0.4375 0.25 +0.75 0.4375 0.2812 +0.75 0.4375 0.3125 +0.75 0.4375 0.3438 +0.75 0.4375 0.375 +0.75 0.4375 0.4062 +0.75 0.4375 0.4375 +0.75 0.4375 0.4688 +0.75 0.4375 0.5 +0.75 0.4375 0.5312 +0.75 0.4375 0.5625 +0.75 0.4375 0.5938 +0.75 0.4375 0.625 +0.75 0.4375 0.6562 +0.75 0.4375 0.6875 +0.75 0.4375 0.7188 +0.75 0.4375 0.75 +0.75 0.4375 0.7812 +0.75 0.4375 0.8125 +0.75 0.4375 0.8438 +0.75 0.4375 0.875 +0.75 0.4375 0.9062 +0.75 0.4375 0.9375 +0.75 0.4375 0.9688 +0.75 0.4375 1 +0.75 0.4688 0 +0.75 0.4688 0.03125 +0.75 0.4688 0.0625 +0.75 0.4688 0.09375 +0.75 0.4688 0.125 +0.75 0.4688 0.1562 +0.75 0.4688 0.1875 +0.75 0.4688 0.2188 +0.75 0.4688 0.25 +0.75 0.4688 0.2812 +0.75 0.4688 0.3125 +0.75 0.4688 0.3438 +0.75 0.4688 0.375 +0.75 0.4688 0.4062 +0.75 0.4688 0.4375 +0.75 0.4688 0.4688 +0.75 0.4688 0.5 +0.75 0.4688 0.5312 +0.75 0.4688 0.5625 +0.75 0.4688 0.5938 +0.75 0.4688 0.625 +0.75 0.4688 0.6562 +0.75 0.4688 0.6875 +0.75 0.4688 0.7188 +0.75 0.4688 0.75 +0.75 0.4688 0.7812 +0.75 0.4688 0.8125 +0.75 0.4688 0.8438 +0.75 0.4688 0.875 +0.75 0.4688 0.9062 +0.75 0.4688 0.9375 +0.75 0.4688 0.9688 +0.75 0.4688 1 +0.75 0.5 0 +0.75 0.5 0.03125 +0.75 0.5 0.0625 +0.75 0.5 0.09375 +0.75 0.5 0.125 +0.75 0.5 0.1562 +0.75 0.5 0.1875 +0.75 0.5 0.2188 +0.75 0.5 0.25 +0.75 0.5 0.2812 +0.75 0.5 0.3125 +0.75 0.5 0.3438 +0.75 0.5 0.375 +0.75 0.5 0.4062 +0.75 0.5 0.4375 +0.75 0.5 0.4688 +0.75 0.5 0.5 +0.75 0.5 0.5312 +0.75 0.5 0.5625 +0.75 0.5 0.5938 +0.75 0.5 0.625 +0.75 0.5 0.6562 +0.75 0.5 0.6875 +0.75 0.5 0.7188 +0.75 0.5 0.75 +0.75 0.5 0.7812 +0.75 0.5 0.8125 +0.75 0.5 0.8438 +0.75 0.5 0.875 +0.75 0.5 0.9062 +0.75 0.5 0.9375 +0.75 0.5 0.9688 +0.75 0.5 1 +0.75 0.5312 0 +0.75 0.5312 0.03125 +0.75 0.5312 0.0625 +0.75 0.5312 0.09375 +0.75 0.5312 0.125 +0.75 0.5312 0.1562 +0.75 0.5312 0.1875 +0.75 0.5312 0.2188 +0.75 0.5312 0.25 +0.75 0.5312 0.2812 +0.75 0.5312 0.3125 +0.75 0.5312 0.3438 +0.75 0.5312 0.375 +0.75 0.5312 0.4062 +0.75 0.5312 0.4375 +0.75 0.5312 0.4688 +0.75 0.5312 0.5 +0.75 0.5312 0.5312 +0.75 0.5312 0.5625 +0.75 0.5312 0.5938 +0.75 0.5312 0.625 +0.75 0.5312 0.6562 +0.75 0.5312 0.6875 +0.75 0.5312 0.7188 +0.75 0.5312 0.75 +0.75 0.5312 0.7812 +0.75 0.5312 0.8125 +0.75 0.5312 0.8438 +0.75 0.5312 0.875 +0.75 0.5312 0.9062 +0.75 0.5312 0.9375 +0.75 0.5312 0.9688 +0.75 0.5312 1 +0.75 0.5625 0 +0.75 0.5625 0.03125 +0.75 0.5625 0.0625 +0.75 0.5625 0.09375 +0.75 0.5625 0.125 +0.75 0.5625 0.1562 +0.75 0.5625 0.1875 +0.75 0.5625 0.2188 +0.75 0.5625 0.25 +0.75 0.5625 0.2812 +0.75 0.5625 0.3125 +0.75 0.5625 0.3438 +0.75 0.5625 0.375 +0.75 0.5625 0.4062 +0.75 0.5625 0.4375 +0.75 0.5625 0.4688 +0.75 0.5625 0.5 +0.75 0.5625 0.5312 +0.75 0.5625 0.5625 +0.75 0.5625 0.5938 +0.75 0.5625 0.625 +0.75 0.5625 0.6562 +0.75 0.5625 0.6875 +0.75 0.5625 0.7188 +0.75 0.5625 0.75 +0.75 0.5625 0.7812 +0.75 0.5625 0.8125 +0.75 0.5625 0.8438 +0.75 0.5625 0.875 +0.75 0.5625 0.9062 +0.75 0.5625 0.9375 +0.75 0.5625 0.9688 +0.75 0.5625 1 +0.75 0.5938 0 +0.75 0.5938 0.03125 +0.75 0.5938 0.0625 +0.75 0.5938 0.09375 +0.75 0.5938 0.125 +0.75 0.5938 0.1562 +0.75 0.5938 0.1875 +0.75 0.5938 0.2188 +0.75 0.5938 0.25 +0.75 0.5938 0.2812 +0.75 0.5938 0.3125 +0.75 0.5938 0.3438 +0.75 0.5938 0.375 +0.75 0.5938 0.4062 +0.75 0.5938 0.4375 +0.75 0.5938 0.4688 +0.75 0.5938 0.5 +0.75 0.5938 0.5312 +0.75 0.5938 0.5625 +0.75 0.5938 0.5938 +0.75 0.5938 0.625 +0.75 0.5938 0.6562 +0.75 0.5938 0.6875 +0.75 0.5938 0.7188 +0.75 0.5938 0.75 +0.75 0.5938 0.7812 +0.75 0.5938 0.8125 +0.75 0.5938 0.8438 +0.75 0.5938 0.875 +0.75 0.5938 0.9062 +0.75 0.5938 0.9375 +0.75 0.5938 0.9688 +0.75 0.5938 1 +0.75 0.625 0 +0.75 0.625 0.03125 +0.75 0.625 0.0625 +0.75 0.625 0.09375 +0.75 0.625 0.125 +0.75 0.625 0.1562 +0.75 0.625 0.1875 +0.75 0.625 0.2188 +0.75 0.625 0.25 +0.75 0.625 0.2812 +0.75 0.625 0.3125 +0.75 0.625 0.3438 +0.75 0.625 0.375 +0.75 0.625 0.4062 +0.75 0.625 0.4375 +0.75 0.625 0.4688 +0.75 0.625 0.5 +0.75 0.625 0.5312 +0.75 0.625 0.5625 +0.75 0.625 0.5938 +0.75 0.625 0.625 +0.75 0.625 0.6562 +0.75 0.625 0.6875 +0.75 0.625 0.7188 +0.75 0.625 0.75 +0.75 0.625 0.7812 +0.75 0.625 0.8125 +0.75 0.625 0.8438 +0.75 0.625 0.875 +0.75 0.625 0.9062 +0.75 0.625 0.9375 +0.75 0.625 0.9688 +0.75 0.625 1 +0.75 0.6562 0 +0.75 0.6562 0.03125 +0.75 0.6562 0.0625 +0.75 0.6562 0.09375 +0.75 0.6562 0.125 +0.75 0.6562 0.1562 +0.75 0.6562 0.1875 +0.75 0.6562 0.2188 +0.75 0.6562 0.25 +0.75 0.6562 0.2812 +0.75 0.6562 0.3125 +0.75 0.6562 0.3438 +0.75 0.6562 0.375 +0.75 0.6562 0.4062 +0.75 0.6562 0.4375 +0.75 0.6562 0.4688 +0.75 0.6562 0.5 +0.75 0.6562 0.5312 +0.75 0.6562 0.5625 +0.75 0.6562 0.5938 +0.75 0.6562 0.625 +0.75 0.6562 0.6562 +0.75 0.6562 0.6875 +0.75 0.6562 0.7188 +0.75 0.6562 0.75 +0.75 0.6562 0.7812 +0.75 0.6562 0.8125 +0.75 0.6562 0.8438 +0.75 0.6562 0.875 +0.75 0.6562 0.9062 +0.75 0.6562 0.9375 +0.75 0.6562 0.9688 +0.75 0.6562 1 +0.75 0.6875 0 +0.75 0.6875 0.03125 +0.75 0.6875 0.0625 +0.75 0.6875 0.09375 +0.75 0.6875 0.125 +0.75 0.6875 0.1562 +0.75 0.6875 0.1875 +0.75 0.6875 0.2188 +0.75 0.6875 0.25 +0.75 0.6875 0.2812 +0.75 0.6875 0.3125 +0.75 0.6875 0.3438 +0.75 0.6875 0.375 +0.75 0.6875 0.4062 +0.75 0.6875 0.4375 +0.75 0.6875 0.4688 +0.75 0.6875 0.5 +0.75 0.6875 0.5312 +0.75 0.6875 0.5625 +0.75 0.6875 0.5938 +0.75 0.6875 0.625 +0.75 0.6875 0.6562 +0.75 0.6875 0.6875 +0.75 0.6875 0.7188 +0.75 0.6875 0.75 +0.75 0.6875 0.7812 +0.75 0.6875 0.8125 +0.75 0.6875 0.8438 +0.75 0.6875 0.875 +0.75 0.6875 0.9062 +0.75 0.6875 0.9375 +0.75 0.6875 0.9688 +0.75 0.6875 1 +0.75 0.7188 0 +0.75 0.7188 0.03125 +0.75 0.7188 0.0625 +0.75 0.7188 0.09375 +0.75 0.7188 0.125 +0.75 0.7188 0.1562 +0.75 0.7188 0.1875 +0.75 0.7188 0.2188 +0.75 0.7188 0.25 +0.75 0.7188 0.2812 +0.75 0.7188 0.3125 +0.75 0.7188 0.3438 +0.75 0.7188 0.375 +0.75 0.7188 0.4062 +0.75 0.7188 0.4375 +0.75 0.7188 0.4688 +0.75 0.7188 0.5 +0.75 0.7188 0.5312 +0.75 0.7188 0.5625 +0.75 0.7188 0.5938 +0.75 0.7188 0.625 +0.75 0.7188 0.6562 +0.75 0.7188 0.6875 +0.75 0.7188 0.7188 +0.75 0.7188 0.75 +0.75 0.7188 0.7812 +0.75 0.7188 0.8125 +0.75 0.7188 0.8438 +0.75 0.7188 0.875 +0.75 0.7188 0.9062 +0.75 0.7188 0.9375 +0.75 0.7188 0.9688 +0.75 0.7188 1 +0.75 0.75 0 +0.75 0.75 0.03125 +0.75 0.75 0.0625 +0.75 0.75 0.09375 +0.75 0.75 0.125 +0.75 0.75 0.1562 +0.75 0.75 0.1875 +0.75 0.75 0.2188 +0.75 0.75 0.25 +0.75 0.75 0.2812 +0.75 0.75 0.3125 +0.75 0.75 0.3438 +0.75 0.75 0.375 +0.75 0.75 0.4062 +0.75 0.75 0.4375 +0.75 0.75 0.4688 +0.75 0.75 0.5 +0.75 0.75 0.5312 +0.75 0.75 0.5625 +0.75 0.75 0.5938 +0.75 0.75 0.625 +0.75 0.75 0.6562 +0.75 0.75 0.6875 +0.75 0.75 0.7188 +0.75 0.75 0.75 +0.75 0.75 0.7812 +0.75 0.75 0.8125 +0.75 0.75 0.8438 +0.75 0.75 0.875 +0.75 0.75 0.9062 +0.75 0.75 0.9375 +0.75 0.75 0.9688 +0.75 0.75 1 +0.75 0.7812 0 +0.75 0.7812 0.03125 +0.75 0.7812 0.0625 +0.75 0.7812 0.09375 +0.75 0.7812 0.125 +0.75 0.7812 0.1562 +0.75 0.7812 0.1875 +0.75 0.7812 0.2188 +0.75 0.7812 0.25 +0.75 0.7812 0.2812 +0.75 0.7812 0.3125 +0.75 0.7812 0.3438 +0.75 0.7812 0.375 +0.75 0.7812 0.4062 +0.75 0.7812 0.4375 +0.75 0.7812 0.4688 +0.75 0.7812 0.5 +0.75 0.7812 0.5312 +0.75 0.7812 0.5625 +0.75 0.7812 0.5938 +0.75 0.7812 0.625 +0.75 0.7812 0.6562 +0.75 0.7812 0.6875 +0.75 0.7812 0.7188 +0.75 0.7812 0.75 +0.75 0.7812 0.7812 +0.75 0.7812 0.8125 +0.75 0.7812 0.8438 +0.75 0.7812 0.875 +0.75 0.7812 0.9062 +0.75 0.7812 0.9375 +0.75 0.7812 0.9688 +0.75 0.7812 1 +0.75 0.8125 0 +0.75 0.8125 0.03125 +0.75 0.8125 0.0625 +0.75 0.8125 0.09375 +0.75 0.8125 0.125 +0.75 0.8125 0.1562 +0.75 0.8125 0.1875 +0.75 0.8125 0.2188 +0.75 0.8125 0.25 +0.75 0.8125 0.2812 +0.75 0.8125 0.3125 +0.75 0.8125 0.3438 +0.75 0.8125 0.375 +0.75 0.8125 0.4062 +0.75 0.8125 0.4375 +0.75 0.8125 0.4688 +0.75 0.8125 0.5 +0.75 0.8125 0.5312 +0.75 0.8125 0.5625 +0.75 0.8125 0.5938 +0.75 0.8125 0.625 +0.75 0.8125 0.6562 +0.75 0.8125 0.6875 +0.75 0.8125 0.7188 +0.75 0.8125 0.75 +0.75 0.8125 0.7812 +0.75 0.8125 0.8125 +0.75 0.8125 0.8438 +0.75 0.8125 0.875 +0.75 0.8125 0.9062 +0.75 0.8125 0.9375 +0.75 0.8125 0.9688 +0.75 0.8125 1 +0.75 0.8438 0 +0.75 0.8438 0.03125 +0.75 0.8438 0.0625 +0.75 0.8438 0.09375 +0.75 0.8438 0.125 +0.75 0.8438 0.1562 +0.75 0.8438 0.1875 +0.75 0.8438 0.2188 +0.75 0.8438 0.25 +0.75 0.8438 0.2812 +0.75 0.8438 0.3125 +0.75 0.8438 0.3438 +0.75 0.8438 0.375 +0.75 0.8438 0.4062 +0.75 0.8438 0.4375 +0.75 0.8438 0.4688 +0.75 0.8438 0.5 +0.75 0.8438 0.5312 +0.75 0.8438 0.5625 +0.75 0.8438 0.5938 +0.75 0.8438 0.625 +0.75 0.8438 0.6562 +0.75 0.8438 0.6875 +0.75 0.8438 0.7188 +0.75 0.8438 0.75 +0.75 0.8438 0.7812 +0.75 0.8438 0.8125 +0.75 0.8438 0.8438 +0.75 0.8438 0.875 +0.75 0.8438 0.9062 +0.75 0.8438 0.9375 +0.75 0.8438 0.9688 +0.75 0.8438 1 +0.75 0.875 0 +0.75 0.875 0.03125 +0.75 0.875 0.0625 +0.75 0.875 0.09375 +0.75 0.875 0.125 +0.75 0.875 0.1562 +0.75 0.875 0.1875 +0.75 0.875 0.2188 +0.75 0.875 0.25 +0.75 0.875 0.2812 +0.75 0.875 0.3125 +0.75 0.875 0.3438 +0.75 0.875 0.375 +0.75 0.875 0.4062 +0.75 0.875 0.4375 +0.75 0.875 0.4688 +0.75 0.875 0.5 +0.75 0.875 0.5312 +0.75 0.875 0.5625 +0.75 0.875 0.5938 +0.75 0.875 0.625 +0.75 0.875 0.6562 +0.75 0.875 0.6875 +0.75 0.875 0.7188 +0.75 0.875 0.75 +0.75 0.875 0.7812 +0.75 0.875 0.8125 +0.75 0.875 0.8438 +0.75 0.875 0.875 +0.75 0.875 0.9062 +0.75 0.875 0.9375 +0.75 0.875 0.9688 +0.75 0.875 1 +0.75 0.9062 0 +0.75 0.9062 0.03125 +0.75 0.9062 0.0625 +0.75 0.9062 0.09375 +0.75 0.9062 0.125 +0.75 0.9062 0.1562 +0.75 0.9062 0.1875 +0.75 0.9062 0.2188 +0.75 0.9062 0.25 +0.75 0.9062 0.2812 +0.75 0.9062 0.3125 +0.75 0.9062 0.3438 +0.75 0.9062 0.375 +0.75 0.9062 0.4062 +0.75 0.9062 0.4375 +0.75 0.9062 0.4688 +0.75 0.9062 0.5 +0.75 0.9062 0.5312 +0.75 0.9062 0.5625 +0.75 0.9062 0.5938 +0.75 0.9062 0.625 +0.75 0.9062 0.6562 +0.75 0.9062 0.6875 +0.75 0.9062 0.7188 +0.75 0.9062 0.75 +0.75 0.9062 0.7812 +0.75 0.9062 0.8125 +0.75 0.9062 0.8438 +0.75 0.9062 0.875 +0.75 0.9062 0.9062 +0.75 0.9062 0.9375 +0.75 0.9062 0.9688 +0.75 0.9062 1 +0.75 0.9375 0 +0.75 0.9375 0.03125 +0.75 0.9375 0.0625 +0.75 0.9375 0.09375 +0.75 0.9375 0.125 +0.75 0.9375 0.1562 +0.75 0.9375 0.1875 +0.75 0.9375 0.2188 +0.75 0.9375 0.25 +0.75 0.9375 0.2812 +0.75 0.9375 0.3125 +0.75 0.9375 0.3438 +0.75 0.9375 0.375 +0.75 0.9375 0.4062 +0.75 0.9375 0.4375 +0.75 0.9375 0.4688 +0.75 0.9375 0.5 +0.75 0.9375 0.5312 +0.75 0.9375 0.5625 +0.75 0.9375 0.5938 +0.75 0.9375 0.625 +0.75 0.9375 0.6562 +0.75 0.9375 0.6875 +0.75 0.9375 0.7188 +0.75 0.9375 0.75 +0.75 0.9375 0.7812 +0.75 0.9375 0.8125 +0.75 0.9375 0.8438 +0.75 0.9375 0.875 +0.75 0.9375 0.9062 +0.75 0.9375 0.9375 +0.75 0.9375 0.9688 +0.75 0.9375 1 +0.75 0.9688 0 +0.75 0.9688 0.03125 +0.75 0.9688 0.0625 +0.75 0.9688 0.09375 +0.75 0.9688 0.125 +0.75 0.9688 0.1562 +0.75 0.9688 0.1875 +0.75 0.9688 0.2188 +0.75 0.9688 0.25 +0.75 0.9688 0.2812 +0.75 0.9688 0.3125 +0.75 0.9688 0.3438 +0.75 0.9688 0.375 +0.75 0.9688 0.4062 +0.75 0.9688 0.4375 +0.75 0.9688 0.4688 +0.75 0.9688 0.5 +0.75 0.9688 0.5312 +0.75 0.9688 0.5625 +0.75 0.9688 0.5938 +0.75 0.9688 0.625 +0.75 0.9688 0.6562 +0.75 0.9688 0.6875 +0.75 0.9688 0.7188 +0.75 0.9688 0.75 +0.75 0.9688 0.7812 +0.75 0.9688 0.8125 +0.75 0.9688 0.8438 +0.75 0.9688 0.875 +0.75 0.9688 0.9062 +0.75 0.9688 0.9375 +0.75 0.9688 0.9688 +0.75 0.9688 1 +0.75 1 0 +0.75 1 0.03125 +0.75 1 0.0625 +0.75 1 0.09375 +0.75 1 0.125 +0.75 1 0.1562 +0.75 1 0.1875 +0.75 1 0.2188 +0.75 1 0.25 +0.75 1 0.2812 +0.75 1 0.3125 +0.75 1 0.3438 +0.75 1 0.375 +0.75 1 0.4062 +0.75 1 0.4375 +0.75 1 0.4688 +0.75 1 0.5 +0.75 1 0.5312 +0.75 1 0.5625 +0.75 1 0.5938 +0.75 1 0.625 +0.75 1 0.6562 +0.75 1 0.6875 +0.75 1 0.7188 +0.75 1 0.75 +0.75 1 0.7812 +0.75 1 0.8125 +0.75 1 0.8438 +0.75 1 0.875 +0.75 1 0.9062 +0.75 1 0.9375 +0.75 1 0.9688 +0.75 1 1 +0.7812 0 0 +0.7812 0 0.03125 +0.7812 0 0.0625 +0.7812 0 0.09375 +0.7812 0 0.125 +0.7812 0 0.1562 +0.7812 0 0.1875 +0.7812 0 0.2188 +0.7812 0 0.25 +0.7812 0 0.2812 +0.7812 0 0.3125 +0.7812 0 0.3438 +0.7812 0 0.375 +0.7812 0 0.4062 +0.7812 0 0.4375 +0.7812 0 0.4688 +0.7812 0 0.5 +0.7812 0 0.5312 +0.7812 0 0.5625 +0.7812 0 0.5938 +0.7812 0 0.625 +0.7812 0 0.6562 +0.7812 0 0.6875 +0.7812 0 0.7188 +0.7812 0 0.75 +0.7812 0 0.7812 +0.7812 0 0.8125 +0.7812 0 0.8438 +0.7812 0 0.875 +0.7812 0 0.9062 +0.7812 0 0.9375 +0.7812 0 0.9688 +0.7812 0 1 +0.7812 0.03125 0 +0.7812 0.03125 0.03125 +0.7812 0.03125 0.0625 +0.7812 0.03125 0.09375 +0.7812 0.03125 0.125 +0.7812 0.03125 0.1562 +0.7812 0.03125 0.1875 +0.7812 0.03125 0.2188 +0.7812 0.03125 0.25 +0.7812 0.03125 0.2812 +0.7812 0.03125 0.3125 +0.7812 0.03125 0.3438 +0.7812 0.03125 0.375 +0.7812 0.03125 0.4062 +0.7812 0.03125 0.4375 +0.7812 0.03125 0.4688 +0.7812 0.03125 0.5 +0.7812 0.03125 0.5312 +0.7812 0.03125 0.5625 +0.7812 0.03125 0.5938 +0.7812 0.03125 0.625 +0.7812 0.03125 0.6562 +0.7812 0.03125 0.6875 +0.7812 0.03125 0.7188 +0.7812 0.03125 0.75 +0.7812 0.03125 0.7812 +0.7812 0.03125 0.8125 +0.7812 0.03125 0.8438 +0.7812 0.03125 0.875 +0.7812 0.03125 0.9062 +0.7812 0.03125 0.9375 +0.7812 0.03125 0.9688 +0.7812 0.03125 1 +0.7812 0.0625 0 +0.7812 0.0625 0.03125 +0.7812 0.0625 0.0625 +0.7812 0.0625 0.09375 +0.7812 0.0625 0.125 +0.7812 0.0625 0.1562 +0.7812 0.0625 0.1875 +0.7812 0.0625 0.2188 +0.7812 0.0625 0.25 +0.7812 0.0625 0.2812 +0.7812 0.0625 0.3125 +0.7812 0.0625 0.3438 +0.7812 0.0625 0.375 +0.7812 0.0625 0.4062 +0.7812 0.0625 0.4375 +0.7812 0.0625 0.4688 +0.7812 0.0625 0.5 +0.7812 0.0625 0.5312 +0.7812 0.0625 0.5625 +0.7812 0.0625 0.5938 +0.7812 0.0625 0.625 +0.7812 0.0625 0.6562 +0.7812 0.0625 0.6875 +0.7812 0.0625 0.7188 +0.7812 0.0625 0.75 +0.7812 0.0625 0.7812 +0.7812 0.0625 0.8125 +0.7812 0.0625 0.8438 +0.7812 0.0625 0.875 +0.7812 0.0625 0.9062 +0.7812 0.0625 0.9375 +0.7812 0.0625 0.9688 +0.7812 0.0625 1 +0.7812 0.09375 0 +0.7812 0.09375 0.03125 +0.7812 0.09375 0.0625 +0.7812 0.09375 0.09375 +0.7812 0.09375 0.125 +0.7812 0.09375 0.1562 +0.7812 0.09375 0.1875 +0.7812 0.09375 0.2188 +0.7812 0.09375 0.25 +0.7812 0.09375 0.2812 +0.7812 0.09375 0.3125 +0.7812 0.09375 0.3438 +0.7812 0.09375 0.375 +0.7812 0.09375 0.4062 +0.7812 0.09375 0.4375 +0.7812 0.09375 0.4688 +0.7812 0.09375 0.5 +0.7812 0.09375 0.5312 +0.7812 0.09375 0.5625 +0.7812 0.09375 0.5938 +0.7812 0.09375 0.625 +0.7812 0.09375 0.6562 +0.7812 0.09375 0.6875 +0.7812 0.09375 0.7188 +0.7812 0.09375 0.75 +0.7812 0.09375 0.7812 +0.7812 0.09375 0.8125 +0.7812 0.09375 0.8438 +0.7812 0.09375 0.875 +0.7812 0.09375 0.9062 +0.7812 0.09375 0.9375 +0.7812 0.09375 0.9688 +0.7812 0.09375 1 +0.7812 0.125 0 +0.7812 0.125 0.03125 +0.7812 0.125 0.0625 +0.7812 0.125 0.09375 +0.7812 0.125 0.125 +0.7812 0.125 0.1562 +0.7812 0.125 0.1875 +0.7812 0.125 0.2188 +0.7812 0.125 0.25 +0.7812 0.125 0.2812 +0.7812 0.125 0.3125 +0.7812 0.125 0.3438 +0.7812 0.125 0.375 +0.7812 0.125 0.4062 +0.7812 0.125 0.4375 +0.7812 0.125 0.4688 +0.7812 0.125 0.5 +0.7812 0.125 0.5312 +0.7812 0.125 0.5625 +0.7812 0.125 0.5938 +0.7812 0.125 0.625 +0.7812 0.125 0.6562 +0.7812 0.125 0.6875 +0.7812 0.125 0.7188 +0.7812 0.125 0.75 +0.7812 0.125 0.7812 +0.7812 0.125 0.8125 +0.7812 0.125 0.8438 +0.7812 0.125 0.875 +0.7812 0.125 0.9062 +0.7812 0.125 0.9375 +0.7812 0.125 0.9688 +0.7812 0.125 1 +0.7812 0.1562 0 +0.7812 0.1562 0.03125 +0.7812 0.1562 0.0625 +0.7812 0.1562 0.09375 +0.7812 0.1562 0.125 +0.7812 0.1562 0.1562 +0.7812 0.1562 0.1875 +0.7812 0.1562 0.2188 +0.7812 0.1562 0.25 +0.7812 0.1562 0.2812 +0.7812 0.1562 0.3125 +0.7812 0.1562 0.3438 +0.7812 0.1562 0.375 +0.7812 0.1562 0.4062 +0.7812 0.1562 0.4375 +0.7812 0.1562 0.4688 +0.7812 0.1562 0.5 +0.7812 0.1562 0.5312 +0.7812 0.1562 0.5625 +0.7812 0.1562 0.5938 +0.7812 0.1562 0.625 +0.7812 0.1562 0.6562 +0.7812 0.1562 0.6875 +0.7812 0.1562 0.7188 +0.7812 0.1562 0.75 +0.7812 0.1562 0.7812 +0.7812 0.1562 0.8125 +0.7812 0.1562 0.8438 +0.7812 0.1562 0.875 +0.7812 0.1562 0.9062 +0.7812 0.1562 0.9375 +0.7812 0.1562 0.9688 +0.7812 0.1562 1 +0.7812 0.1875 0 +0.7812 0.1875 0.03125 +0.7812 0.1875 0.0625 +0.7812 0.1875 0.09375 +0.7812 0.1875 0.125 +0.7812 0.1875 0.1562 +0.7812 0.1875 0.1875 +0.7812 0.1875 0.2188 +0.7812 0.1875 0.25 +0.7812 0.1875 0.2812 +0.7812 0.1875 0.3125 +0.7812 0.1875 0.3438 +0.7812 0.1875 0.375 +0.7812 0.1875 0.4062 +0.7812 0.1875 0.4375 +0.7812 0.1875 0.4688 +0.7812 0.1875 0.5 +0.7812 0.1875 0.5312 +0.7812 0.1875 0.5625 +0.7812 0.1875 0.5938 +0.7812 0.1875 0.625 +0.7812 0.1875 0.6562 +0.7812 0.1875 0.6875 +0.7812 0.1875 0.7188 +0.7812 0.1875 0.75 +0.7812 0.1875 0.7812 +0.7812 0.1875 0.8125 +0.7812 0.1875 0.8438 +0.7812 0.1875 0.875 +0.7812 0.1875 0.9062 +0.7812 0.1875 0.9375 +0.7812 0.1875 0.9688 +0.7812 0.1875 1 +0.7812 0.2188 0 +0.7812 0.2188 0.03125 +0.7812 0.2188 0.0625 +0.7812 0.2188 0.09375 +0.7812 0.2188 0.125 +0.7812 0.2188 0.1562 +0.7812 0.2188 0.1875 +0.7812 0.2188 0.2188 +0.7812 0.2188 0.25 +0.7812 0.2188 0.2812 +0.7812 0.2188 0.3125 +0.7812 0.2188 0.3438 +0.7812 0.2188 0.375 +0.7812 0.2188 0.4062 +0.7812 0.2188 0.4375 +0.7812 0.2188 0.4688 +0.7812 0.2188 0.5 +0.7812 0.2188 0.5312 +0.7812 0.2188 0.5625 +0.7812 0.2188 0.5938 +0.7812 0.2188 0.625 +0.7812 0.2188 0.6562 +0.7812 0.2188 0.6875 +0.7812 0.2188 0.7188 +0.7812 0.2188 0.75 +0.7812 0.2188 0.7812 +0.7812 0.2188 0.8125 +0.7812 0.2188 0.8438 +0.7812 0.2188 0.875 +0.7812 0.2188 0.9062 +0.7812 0.2188 0.9375 +0.7812 0.2188 0.9688 +0.7812 0.2188 1 +0.7812 0.25 0 +0.7812 0.25 0.03125 +0.7812 0.25 0.0625 +0.7812 0.25 0.09375 +0.7812 0.25 0.125 +0.7812 0.25 0.1562 +0.7812 0.25 0.1875 +0.7812 0.25 0.2188 +0.7812 0.25 0.25 +0.7812 0.25 0.2812 +0.7812 0.25 0.3125 +0.7812 0.25 0.3438 +0.7812 0.25 0.375 +0.7812 0.25 0.4062 +0.7812 0.25 0.4375 +0.7812 0.25 0.4688 +0.7812 0.25 0.5 +0.7812 0.25 0.5312 +0.7812 0.25 0.5625 +0.7812 0.25 0.5938 +0.7812 0.25 0.625 +0.7812 0.25 0.6562 +0.7812 0.25 0.6875 +0.7812 0.25 0.7188 +0.7812 0.25 0.75 +0.7812 0.25 0.7812 +0.7812 0.25 0.8125 +0.7812 0.25 0.8438 +0.7812 0.25 0.875 +0.7812 0.25 0.9062 +0.7812 0.25 0.9375 +0.7812 0.25 0.9688 +0.7812 0.25 1 +0.7812 0.2812 0 +0.7812 0.2812 0.03125 +0.7812 0.2812 0.0625 +0.7812 0.2812 0.09375 +0.7812 0.2812 0.125 +0.7812 0.2812 0.1562 +0.7812 0.2812 0.1875 +0.7812 0.2812 0.2188 +0.7812 0.2812 0.25 +0.7812 0.2812 0.2812 +0.7812 0.2812 0.3125 +0.7812 0.2812 0.3438 +0.7812 0.2812 0.375 +0.7812 0.2812 0.4062 +0.7812 0.2812 0.4375 +0.7812 0.2812 0.4688 +0.7812 0.2812 0.5 +0.7812 0.2812 0.5312 +0.7812 0.2812 0.5625 +0.7812 0.2812 0.5938 +0.7812 0.2812 0.625 +0.7812 0.2812 0.6562 +0.7812 0.2812 0.6875 +0.7812 0.2812 0.7188 +0.7812 0.2812 0.75 +0.7812 0.2812 0.7812 +0.7812 0.2812 0.8125 +0.7812 0.2812 0.8438 +0.7812 0.2812 0.875 +0.7812 0.2812 0.9062 +0.7812 0.2812 0.9375 +0.7812 0.2812 0.9688 +0.7812 0.2812 1 +0.7812 0.3125 0 +0.7812 0.3125 0.03125 +0.7812 0.3125 0.0625 +0.7812 0.3125 0.09375 +0.7812 0.3125 0.125 +0.7812 0.3125 0.1562 +0.7812 0.3125 0.1875 +0.7812 0.3125 0.2188 +0.7812 0.3125 0.25 +0.7812 0.3125 0.2812 +0.7812 0.3125 0.3125 +0.7812 0.3125 0.3438 +0.7812 0.3125 0.375 +0.7812 0.3125 0.4062 +0.7812 0.3125 0.4375 +0.7812 0.3125 0.4688 +0.7812 0.3125 0.5 +0.7812 0.3125 0.5312 +0.7812 0.3125 0.5625 +0.7812 0.3125 0.5938 +0.7812 0.3125 0.625 +0.7812 0.3125 0.6562 +0.7812 0.3125 0.6875 +0.7812 0.3125 0.7188 +0.7812 0.3125 0.75 +0.7812 0.3125 0.7812 +0.7812 0.3125 0.8125 +0.7812 0.3125 0.8438 +0.7812 0.3125 0.875 +0.7812 0.3125 0.9062 +0.7812 0.3125 0.9375 +0.7812 0.3125 0.9688 +0.7812 0.3125 1 +0.7812 0.3438 0 +0.7812 0.3438 0.03125 +0.7812 0.3438 0.0625 +0.7812 0.3438 0.09375 +0.7812 0.3438 0.125 +0.7812 0.3438 0.1562 +0.7812 0.3438 0.1875 +0.7812 0.3438 0.2188 +0.7812 0.3438 0.25 +0.7812 0.3438 0.2812 +0.7812 0.3438 0.3125 +0.7812 0.3438 0.3438 +0.7812 0.3438 0.375 +0.7812 0.3438 0.4062 +0.7812 0.3438 0.4375 +0.7812 0.3438 0.4688 +0.7812 0.3438 0.5 +0.7812 0.3438 0.5312 +0.7812 0.3438 0.5625 +0.7812 0.3438 0.5938 +0.7812 0.3438 0.625 +0.7812 0.3438 0.6562 +0.7812 0.3438 0.6875 +0.7812 0.3438 0.7188 +0.7812 0.3438 0.75 +0.7812 0.3438 0.7812 +0.7812 0.3438 0.8125 +0.7812 0.3438 0.8438 +0.7812 0.3438 0.875 +0.7812 0.3438 0.9062 +0.7812 0.3438 0.9375 +0.7812 0.3438 0.9688 +0.7812 0.3438 1 +0.7812 0.375 0 +0.7812 0.375 0.03125 +0.7812 0.375 0.0625 +0.7812 0.375 0.09375 +0.7812 0.375 0.125 +0.7812 0.375 0.1562 +0.7812 0.375 0.1875 +0.7812 0.375 0.2188 +0.7812 0.375 0.25 +0.7812 0.375 0.2812 +0.7812 0.375 0.3125 +0.7812 0.375 0.3438 +0.7812 0.375 0.375 +0.7812 0.375 0.4062 +0.7812 0.375 0.4375 +0.7812 0.375 0.4688 +0.7812 0.375 0.5 +0.7812 0.375 0.5312 +0.7812 0.375 0.5625 +0.7812 0.375 0.5938 +0.7812 0.375 0.625 +0.7812 0.375 0.6562 +0.7812 0.375 0.6875 +0.7812 0.375 0.7188 +0.7812 0.375 0.75 +0.7812 0.375 0.7812 +0.7812 0.375 0.8125 +0.7812 0.375 0.8438 +0.7812 0.375 0.875 +0.7812 0.375 0.9062 +0.7812 0.375 0.9375 +0.7812 0.375 0.9688 +0.7812 0.375 1 +0.7812 0.4062 0 +0.7812 0.4062 0.03125 +0.7812 0.4062 0.0625 +0.7812 0.4062 0.09375 +0.7812 0.4062 0.125 +0.7812 0.4062 0.1562 +0.7812 0.4062 0.1875 +0.7812 0.4062 0.2188 +0.7812 0.4062 0.25 +0.7812 0.4062 0.2812 +0.7812 0.4062 0.3125 +0.7812 0.4062 0.3438 +0.7812 0.4062 0.375 +0.7812 0.4062 0.4062 +0.7812 0.4062 0.4375 +0.7812 0.4062 0.4688 +0.7812 0.4062 0.5 +0.7812 0.4062 0.5312 +0.7812 0.4062 0.5625 +0.7812 0.4062 0.5938 +0.7812 0.4062 0.625 +0.7812 0.4062 0.6562 +0.7812 0.4062 0.6875 +0.7812 0.4062 0.7188 +0.7812 0.4062 0.75 +0.7812 0.4062 0.7812 +0.7812 0.4062 0.8125 +0.7812 0.4062 0.8438 +0.7812 0.4062 0.875 +0.7812 0.4062 0.9062 +0.7812 0.4062 0.9375 +0.7812 0.4062 0.9688 +0.7812 0.4062 1 +0.7812 0.4375 0 +0.7812 0.4375 0.03125 +0.7812 0.4375 0.0625 +0.7812 0.4375 0.09375 +0.7812 0.4375 0.125 +0.7812 0.4375 0.1562 +0.7812 0.4375 0.1875 +0.7812 0.4375 0.2188 +0.7812 0.4375 0.25 +0.7812 0.4375 0.2812 +0.7812 0.4375 0.3125 +0.7812 0.4375 0.3438 +0.7812 0.4375 0.375 +0.7812 0.4375 0.4062 +0.7812 0.4375 0.4375 +0.7812 0.4375 0.4688 +0.7812 0.4375 0.5 +0.7812 0.4375 0.5312 +0.7812 0.4375 0.5625 +0.7812 0.4375 0.5938 +0.7812 0.4375 0.625 +0.7812 0.4375 0.6562 +0.7812 0.4375 0.6875 +0.7812 0.4375 0.7188 +0.7812 0.4375 0.75 +0.7812 0.4375 0.7812 +0.7812 0.4375 0.8125 +0.7812 0.4375 0.8438 +0.7812 0.4375 0.875 +0.7812 0.4375 0.9062 +0.7812 0.4375 0.9375 +0.7812 0.4375 0.9688 +0.7812 0.4375 1 +0.7812 0.4688 0 +0.7812 0.4688 0.03125 +0.7812 0.4688 0.0625 +0.7812 0.4688 0.09375 +0.7812 0.4688 0.125 +0.7812 0.4688 0.1562 +0.7812 0.4688 0.1875 +0.7812 0.4688 0.2188 +0.7812 0.4688 0.25 +0.7812 0.4688 0.2812 +0.7812 0.4688 0.3125 +0.7812 0.4688 0.3438 +0.7812 0.4688 0.375 +0.7812 0.4688 0.4062 +0.7812 0.4688 0.4375 +0.7812 0.4688 0.4688 +0.7812 0.4688 0.5 +0.7812 0.4688 0.5312 +0.7812 0.4688 0.5625 +0.7812 0.4688 0.5938 +0.7812 0.4688 0.625 +0.7812 0.4688 0.6562 +0.7812 0.4688 0.6875 +0.7812 0.4688 0.7188 +0.7812 0.4688 0.75 +0.7812 0.4688 0.7812 +0.7812 0.4688 0.8125 +0.7812 0.4688 0.8438 +0.7812 0.4688 0.875 +0.7812 0.4688 0.9062 +0.7812 0.4688 0.9375 +0.7812 0.4688 0.9688 +0.7812 0.4688 1 +0.7812 0.5 0 +0.7812 0.5 0.03125 +0.7812 0.5 0.0625 +0.7812 0.5 0.09375 +0.7812 0.5 0.125 +0.7812 0.5 0.1562 +0.7812 0.5 0.1875 +0.7812 0.5 0.2188 +0.7812 0.5 0.25 +0.7812 0.5 0.2812 +0.7812 0.5 0.3125 +0.7812 0.5 0.3438 +0.7812 0.5 0.375 +0.7812 0.5 0.4062 +0.7812 0.5 0.4375 +0.7812 0.5 0.4688 +0.7812 0.5 0.5 +0.7812 0.5 0.5312 +0.7812 0.5 0.5625 +0.7812 0.5 0.5938 +0.7812 0.5 0.625 +0.7812 0.5 0.6562 +0.7812 0.5 0.6875 +0.7812 0.5 0.7188 +0.7812 0.5 0.75 +0.7812 0.5 0.7812 +0.7812 0.5 0.8125 +0.7812 0.5 0.8438 +0.7812 0.5 0.875 +0.7812 0.5 0.9062 +0.7812 0.5 0.9375 +0.7812 0.5 0.9688 +0.7812 0.5 1 +0.7812 0.5312 0 +0.7812 0.5312 0.03125 +0.7812 0.5312 0.0625 +0.7812 0.5312 0.09375 +0.7812 0.5312 0.125 +0.7812 0.5312 0.1562 +0.7812 0.5312 0.1875 +0.7812 0.5312 0.2188 +0.7812 0.5312 0.25 +0.7812 0.5312 0.2812 +0.7812 0.5312 0.3125 +0.7812 0.5312 0.3438 +0.7812 0.5312 0.375 +0.7812 0.5312 0.4062 +0.7812 0.5312 0.4375 +0.7812 0.5312 0.4688 +0.7812 0.5312 0.5 +0.7812 0.5312 0.5312 +0.7812 0.5312 0.5625 +0.7812 0.5312 0.5938 +0.7812 0.5312 0.625 +0.7812 0.5312 0.6562 +0.7812 0.5312 0.6875 +0.7812 0.5312 0.7188 +0.7812 0.5312 0.75 +0.7812 0.5312 0.7812 +0.7812 0.5312 0.8125 +0.7812 0.5312 0.8438 +0.7812 0.5312 0.875 +0.7812 0.5312 0.9062 +0.7812 0.5312 0.9375 +0.7812 0.5312 0.9688 +0.7812 0.5312 1 +0.7812 0.5625 0 +0.7812 0.5625 0.03125 +0.7812 0.5625 0.0625 +0.7812 0.5625 0.09375 +0.7812 0.5625 0.125 +0.7812 0.5625 0.1562 +0.7812 0.5625 0.1875 +0.7812 0.5625 0.2188 +0.7812 0.5625 0.25 +0.7812 0.5625 0.2812 +0.7812 0.5625 0.3125 +0.7812 0.5625 0.3438 +0.7812 0.5625 0.375 +0.7812 0.5625 0.4062 +0.7812 0.5625 0.4375 +0.7812 0.5625 0.4688 +0.7812 0.5625 0.5 +0.7812 0.5625 0.5312 +0.7812 0.5625 0.5625 +0.7812 0.5625 0.5938 +0.7812 0.5625 0.625 +0.7812 0.5625 0.6562 +0.7812 0.5625 0.6875 +0.7812 0.5625 0.7188 +0.7812 0.5625 0.75 +0.7812 0.5625 0.7812 +0.7812 0.5625 0.8125 +0.7812 0.5625 0.8438 +0.7812 0.5625 0.875 +0.7812 0.5625 0.9062 +0.7812 0.5625 0.9375 +0.7812 0.5625 0.9688 +0.7812 0.5625 1 +0.7812 0.5938 0 +0.7812 0.5938 0.03125 +0.7812 0.5938 0.0625 +0.7812 0.5938 0.09375 +0.7812 0.5938 0.125 +0.7812 0.5938 0.1562 +0.7812 0.5938 0.1875 +0.7812 0.5938 0.2188 +0.7812 0.5938 0.25 +0.7812 0.5938 0.2812 +0.7812 0.5938 0.3125 +0.7812 0.5938 0.3438 +0.7812 0.5938 0.375 +0.7812 0.5938 0.4062 +0.7812 0.5938 0.4375 +0.7812 0.5938 0.4688 +0.7812 0.5938 0.5 +0.7812 0.5938 0.5312 +0.7812 0.5938 0.5625 +0.7812 0.5938 0.5938 +0.7812 0.5938 0.625 +0.7812 0.5938 0.6562 +0.7812 0.5938 0.6875 +0.7812 0.5938 0.7188 +0.7812 0.5938 0.75 +0.7812 0.5938 0.7812 +0.7812 0.5938 0.8125 +0.7812 0.5938 0.8438 +0.7812 0.5938 0.875 +0.7812 0.5938 0.9062 +0.7812 0.5938 0.9375 +0.7812 0.5938 0.9688 +0.7812 0.5938 1 +0.7812 0.625 0 +0.7812 0.625 0.03125 +0.7812 0.625 0.0625 +0.7812 0.625 0.09375 +0.7812 0.625 0.125 +0.7812 0.625 0.1562 +0.7812 0.625 0.1875 +0.7812 0.625 0.2188 +0.7812 0.625 0.25 +0.7812 0.625 0.2812 +0.7812 0.625 0.3125 +0.7812 0.625 0.3438 +0.7812 0.625 0.375 +0.7812 0.625 0.4062 +0.7812 0.625 0.4375 +0.7812 0.625 0.4688 +0.7812 0.625 0.5 +0.7812 0.625 0.5312 +0.7812 0.625 0.5625 +0.7812 0.625 0.5938 +0.7812 0.625 0.625 +0.7812 0.625 0.6562 +0.7812 0.625 0.6875 +0.7812 0.625 0.7188 +0.7812 0.625 0.75 +0.7812 0.625 0.7812 +0.7812 0.625 0.8125 +0.7812 0.625 0.8438 +0.7812 0.625 0.875 +0.7812 0.625 0.9062 +0.7812 0.625 0.9375 +0.7812 0.625 0.9688 +0.7812 0.625 1 +0.7812 0.6562 0 +0.7812 0.6562 0.03125 +0.7812 0.6562 0.0625 +0.7812 0.6562 0.09375 +0.7812 0.6562 0.125 +0.7812 0.6562 0.1562 +0.7812 0.6562 0.1875 +0.7812 0.6562 0.2188 +0.7812 0.6562 0.25 +0.7812 0.6562 0.2812 +0.7812 0.6562 0.3125 +0.7812 0.6562 0.3438 +0.7812 0.6562 0.375 +0.7812 0.6562 0.4062 +0.7812 0.6562 0.4375 +0.7812 0.6562 0.4688 +0.7812 0.6562 0.5 +0.7812 0.6562 0.5312 +0.7812 0.6562 0.5625 +0.7812 0.6562 0.5938 +0.7812 0.6562 0.625 +0.7812 0.6562 0.6562 +0.7812 0.6562 0.6875 +0.7812 0.6562 0.7188 +0.7812 0.6562 0.75 +0.7812 0.6562 0.7812 +0.7812 0.6562 0.8125 +0.7812 0.6562 0.8438 +0.7812 0.6562 0.875 +0.7812 0.6562 0.9062 +0.7812 0.6562 0.9375 +0.7812 0.6562 0.9688 +0.7812 0.6562 1 +0.7812 0.6875 0 +0.7812 0.6875 0.03125 +0.7812 0.6875 0.0625 +0.7812 0.6875 0.09375 +0.7812 0.6875 0.125 +0.7812 0.6875 0.1562 +0.7812 0.6875 0.1875 +0.7812 0.6875 0.2188 +0.7812 0.6875 0.25 +0.7812 0.6875 0.2812 +0.7812 0.6875 0.3125 +0.7812 0.6875 0.3438 +0.7812 0.6875 0.375 +0.7812 0.6875 0.4062 +0.7812 0.6875 0.4375 +0.7812 0.6875 0.4688 +0.7812 0.6875 0.5 +0.7812 0.6875 0.5312 +0.7812 0.6875 0.5625 +0.7812 0.6875 0.5938 +0.7812 0.6875 0.625 +0.7812 0.6875 0.6562 +0.7812 0.6875 0.6875 +0.7812 0.6875 0.7188 +0.7812 0.6875 0.75 +0.7812 0.6875 0.7812 +0.7812 0.6875 0.8125 +0.7812 0.6875 0.8438 +0.7812 0.6875 0.875 +0.7812 0.6875 0.9062 +0.7812 0.6875 0.9375 +0.7812 0.6875 0.9688 +0.7812 0.6875 1 +0.7812 0.7188 0 +0.7812 0.7188 0.03125 +0.7812 0.7188 0.0625 +0.7812 0.7188 0.09375 +0.7812 0.7188 0.125 +0.7812 0.7188 0.1562 +0.7812 0.7188 0.1875 +0.7812 0.7188 0.2188 +0.7812 0.7188 0.25 +0.7812 0.7188 0.2812 +0.7812 0.7188 0.3125 +0.7812 0.7188 0.3438 +0.7812 0.7188 0.375 +0.7812 0.7188 0.4062 +0.7812 0.7188 0.4375 +0.7812 0.7188 0.4688 +0.7812 0.7188 0.5 +0.7812 0.7188 0.5312 +0.7812 0.7188 0.5625 +0.7812 0.7188 0.5938 +0.7812 0.7188 0.625 +0.7812 0.7188 0.6562 +0.7812 0.7188 0.6875 +0.7812 0.7188 0.7188 +0.7812 0.7188 0.75 +0.7812 0.7188 0.7812 +0.7812 0.7188 0.8125 +0.7812 0.7188 0.8438 +0.7812 0.7188 0.875 +0.7812 0.7188 0.9062 +0.7812 0.7188 0.9375 +0.7812 0.7188 0.9688 +0.7812 0.7188 1 +0.7812 0.75 0 +0.7812 0.75 0.03125 +0.7812 0.75 0.0625 +0.7812 0.75 0.09375 +0.7812 0.75 0.125 +0.7812 0.75 0.1562 +0.7812 0.75 0.1875 +0.7812 0.75 0.2188 +0.7812 0.75 0.25 +0.7812 0.75 0.2812 +0.7812 0.75 0.3125 +0.7812 0.75 0.3438 +0.7812 0.75 0.375 +0.7812 0.75 0.4062 +0.7812 0.75 0.4375 +0.7812 0.75 0.4688 +0.7812 0.75 0.5 +0.7812 0.75 0.5312 +0.7812 0.75 0.5625 +0.7812 0.75 0.5938 +0.7812 0.75 0.625 +0.7812 0.75 0.6562 +0.7812 0.75 0.6875 +0.7812 0.75 0.7188 +0.7812 0.75 0.75 +0.7812 0.75 0.7812 +0.7812 0.75 0.8125 +0.7812 0.75 0.8438 +0.7812 0.75 0.875 +0.7812 0.75 0.9062 +0.7812 0.75 0.9375 +0.7812 0.75 0.9688 +0.7812 0.75 1 +0.7812 0.7812 0 +0.7812 0.7812 0.03125 +0.7812 0.7812 0.0625 +0.7812 0.7812 0.09375 +0.7812 0.7812 0.125 +0.7812 0.7812 0.1562 +0.7812 0.7812 0.1875 +0.7812 0.7812 0.2188 +0.7812 0.7812 0.25 +0.7812 0.7812 0.2812 +0.7812 0.7812 0.3125 +0.7812 0.7812 0.3438 +0.7812 0.7812 0.375 +0.7812 0.7812 0.4062 +0.7812 0.7812 0.4375 +0.7812 0.7812 0.4688 +0.7812 0.7812 0.5 +0.7812 0.7812 0.5312 +0.7812 0.7812 0.5625 +0.7812 0.7812 0.5938 +0.7812 0.7812 0.625 +0.7812 0.7812 0.6562 +0.7812 0.7812 0.6875 +0.7812 0.7812 0.7188 +0.7812 0.7812 0.75 +0.7812 0.7812 0.7812 +0.7812 0.7812 0.8125 +0.7812 0.7812 0.8438 +0.7812 0.7812 0.875 +0.7812 0.7812 0.9062 +0.7812 0.7812 0.9375 +0.7812 0.7812 0.9688 +0.7812 0.7812 1 +0.7812 0.8125 0 +0.7812 0.8125 0.03125 +0.7812 0.8125 0.0625 +0.7812 0.8125 0.09375 +0.7812 0.8125 0.125 +0.7812 0.8125 0.1562 +0.7812 0.8125 0.1875 +0.7812 0.8125 0.2188 +0.7812 0.8125 0.25 +0.7812 0.8125 0.2812 +0.7812 0.8125 0.3125 +0.7812 0.8125 0.3438 +0.7812 0.8125 0.375 +0.7812 0.8125 0.4062 +0.7812 0.8125 0.4375 +0.7812 0.8125 0.4688 +0.7812 0.8125 0.5 +0.7812 0.8125 0.5312 +0.7812 0.8125 0.5625 +0.7812 0.8125 0.5938 +0.7812 0.8125 0.625 +0.7812 0.8125 0.6562 +0.7812 0.8125 0.6875 +0.7812 0.8125 0.7188 +0.7812 0.8125 0.75 +0.7812 0.8125 0.7812 +0.7812 0.8125 0.8125 +0.7812 0.8125 0.8438 +0.7812 0.8125 0.875 +0.7812 0.8125 0.9062 +0.7812 0.8125 0.9375 +0.7812 0.8125 0.9688 +0.7812 0.8125 1 +0.7812 0.8438 0 +0.7812 0.8438 0.03125 +0.7812 0.8438 0.0625 +0.7812 0.8438 0.09375 +0.7812 0.8438 0.125 +0.7812 0.8438 0.1562 +0.7812 0.8438 0.1875 +0.7812 0.8438 0.2188 +0.7812 0.8438 0.25 +0.7812 0.8438 0.2812 +0.7812 0.8438 0.3125 +0.7812 0.8438 0.3438 +0.7812 0.8438 0.375 +0.7812 0.8438 0.4062 +0.7812 0.8438 0.4375 +0.7812 0.8438 0.4688 +0.7812 0.8438 0.5 +0.7812 0.8438 0.5312 +0.7812 0.8438 0.5625 +0.7812 0.8438 0.5938 +0.7812 0.8438 0.625 +0.7812 0.8438 0.6562 +0.7812 0.8438 0.6875 +0.7812 0.8438 0.7188 +0.7812 0.8438 0.75 +0.7812 0.8438 0.7812 +0.7812 0.8438 0.8125 +0.7812 0.8438 0.8438 +0.7812 0.8438 0.875 +0.7812 0.8438 0.9062 +0.7812 0.8438 0.9375 +0.7812 0.8438 0.9688 +0.7812 0.8438 1 +0.7812 0.875 0 +0.7812 0.875 0.03125 +0.7812 0.875 0.0625 +0.7812 0.875 0.09375 +0.7812 0.875 0.125 +0.7812 0.875 0.1562 +0.7812 0.875 0.1875 +0.7812 0.875 0.2188 +0.7812 0.875 0.25 +0.7812 0.875 0.2812 +0.7812 0.875 0.3125 +0.7812 0.875 0.3438 +0.7812 0.875 0.375 +0.7812 0.875 0.4062 +0.7812 0.875 0.4375 +0.7812 0.875 0.4688 +0.7812 0.875 0.5 +0.7812 0.875 0.5312 +0.7812 0.875 0.5625 +0.7812 0.875 0.5938 +0.7812 0.875 0.625 +0.7812 0.875 0.6562 +0.7812 0.875 0.6875 +0.7812 0.875 0.7188 +0.7812 0.875 0.75 +0.7812 0.875 0.7812 +0.7812 0.875 0.8125 +0.7812 0.875 0.8438 +0.7812 0.875 0.875 +0.7812 0.875 0.9062 +0.7812 0.875 0.9375 +0.7812 0.875 0.9688 +0.7812 0.875 1 +0.7812 0.9062 0 +0.7812 0.9062 0.03125 +0.7812 0.9062 0.0625 +0.7812 0.9062 0.09375 +0.7812 0.9062 0.125 +0.7812 0.9062 0.1562 +0.7812 0.9062 0.1875 +0.7812 0.9062 0.2188 +0.7812 0.9062 0.25 +0.7812 0.9062 0.2812 +0.7812 0.9062 0.3125 +0.7812 0.9062 0.3438 +0.7812 0.9062 0.375 +0.7812 0.9062 0.4062 +0.7812 0.9062 0.4375 +0.7812 0.9062 0.4688 +0.7812 0.9062 0.5 +0.7812 0.9062 0.5312 +0.7812 0.9062 0.5625 +0.7812 0.9062 0.5938 +0.7812 0.9062 0.625 +0.7812 0.9062 0.6562 +0.7812 0.9062 0.6875 +0.7812 0.9062 0.7188 +0.7812 0.9062 0.75 +0.7812 0.9062 0.7812 +0.7812 0.9062 0.8125 +0.7812 0.9062 0.8438 +0.7812 0.9062 0.875 +0.7812 0.9062 0.9062 +0.7812 0.9062 0.9375 +0.7812 0.9062 0.9688 +0.7812 0.9062 1 +0.7812 0.9375 0 +0.7812 0.9375 0.03125 +0.7812 0.9375 0.0625 +0.7812 0.9375 0.09375 +0.7812 0.9375 0.125 +0.7812 0.9375 0.1562 +0.7812 0.9375 0.1875 +0.7812 0.9375 0.2188 +0.7812 0.9375 0.25 +0.7812 0.9375 0.2812 +0.7812 0.9375 0.3125 +0.7812 0.9375 0.3438 +0.7812 0.9375 0.375 +0.7812 0.9375 0.4062 +0.7812 0.9375 0.4375 +0.7812 0.9375 0.4688 +0.7812 0.9375 0.5 +0.7812 0.9375 0.5312 +0.7812 0.9375 0.5625 +0.7812 0.9375 0.5938 +0.7812 0.9375 0.625 +0.7812 0.9375 0.6562 +0.7812 0.9375 0.6875 +0.7812 0.9375 0.7188 +0.7812 0.9375 0.75 +0.7812 0.9375 0.7812 +0.7812 0.9375 0.8125 +0.7812 0.9375 0.8438 +0.7812 0.9375 0.875 +0.7812 0.9375 0.9062 +0.7812 0.9375 0.9375 +0.7812 0.9375 0.9688 +0.7812 0.9375 1 +0.7812 0.9688 0 +0.7812 0.9688 0.03125 +0.7812 0.9688 0.0625 +0.7812 0.9688 0.09375 +0.7812 0.9688 0.125 +0.7812 0.9688 0.1562 +0.7812 0.9688 0.1875 +0.7812 0.9688 0.2188 +0.7812 0.9688 0.25 +0.7812 0.9688 0.2812 +0.7812 0.9688 0.3125 +0.7812 0.9688 0.3438 +0.7812 0.9688 0.375 +0.7812 0.9688 0.4062 +0.7812 0.9688 0.4375 +0.7812 0.9688 0.4688 +0.7812 0.9688 0.5 +0.7812 0.9688 0.5312 +0.7812 0.9688 0.5625 +0.7812 0.9688 0.5938 +0.7812 0.9688 0.625 +0.7812 0.9688 0.6562 +0.7812 0.9688 0.6875 +0.7812 0.9688 0.7188 +0.7812 0.9688 0.75 +0.7812 0.9688 0.7812 +0.7812 0.9688 0.8125 +0.7812 0.9688 0.8438 +0.7812 0.9688 0.875 +0.7812 0.9688 0.9062 +0.7812 0.9688 0.9375 +0.7812 0.9688 0.9688 +0.7812 0.9688 1 +0.7812 1 0 +0.7812 1 0.03125 +0.7812 1 0.0625 +0.7812 1 0.09375 +0.7812 1 0.125 +0.7812 1 0.1562 +0.7812 1 0.1875 +0.7812 1 0.2188 +0.7812 1 0.25 +0.7812 1 0.2812 +0.7812 1 0.3125 +0.7812 1 0.3438 +0.7812 1 0.375 +0.7812 1 0.4062 +0.7812 1 0.4375 +0.7812 1 0.4688 +0.7812 1 0.5 +0.7812 1 0.5312 +0.7812 1 0.5625 +0.7812 1 0.5938 +0.7812 1 0.625 +0.7812 1 0.6562 +0.7812 1 0.6875 +0.7812 1 0.7188 +0.7812 1 0.75 +0.7812 1 0.7812 +0.7812 1 0.8125 +0.7812 1 0.8438 +0.7812 1 0.875 +0.7812 1 0.9062 +0.7812 1 0.9375 +0.7812 1 0.9688 +0.7812 1 1 +0.8125 0 0 +0.8125 0 0.03125 +0.8125 0 0.0625 +0.8125 0 0.09375 +0.8125 0 0.125 +0.8125 0 0.1562 +0.8125 0 0.1875 +0.8125 0 0.2188 +0.8125 0 0.25 +0.8125 0 0.2812 +0.8125 0 0.3125 +0.8125 0 0.3438 +0.8125 0 0.375 +0.8125 0 0.4062 +0.8125 0 0.4375 +0.8125 0 0.4688 +0.8125 0 0.5 +0.8125 0 0.5312 +0.8125 0 0.5625 +0.8125 0 0.5938 +0.8125 0 0.625 +0.8125 0 0.6562 +0.8125 0 0.6875 +0.8125 0 0.7188 +0.8125 0 0.75 +0.8125 0 0.7812 +0.8125 0 0.8125 +0.8125 0 0.8438 +0.8125 0 0.875 +0.8125 0 0.9062 +0.8125 0 0.9375 +0.8125 0 0.9688 +0.8125 0 1 +0.8125 0.03125 0 +0.8125 0.03125 0.03125 +0.8125 0.03125 0.0625 +0.8125 0.03125 0.09375 +0.8125 0.03125 0.125 +0.8125 0.03125 0.1562 +0.8125 0.03125 0.1875 +0.8125 0.03125 0.2188 +0.8125 0.03125 0.25 +0.8125 0.03125 0.2812 +0.8125 0.03125 0.3125 +0.8125 0.03125 0.3438 +0.8125 0.03125 0.375 +0.8125 0.03125 0.4062 +0.8125 0.03125 0.4375 +0.8125 0.03125 0.4688 +0.8125 0.03125 0.5 +0.8125 0.03125 0.5312 +0.8125 0.03125 0.5625 +0.8125 0.03125 0.5938 +0.8125 0.03125 0.625 +0.8125 0.03125 0.6562 +0.8125 0.03125 0.6875 +0.8125 0.03125 0.7188 +0.8125 0.03125 0.75 +0.8125 0.03125 0.7812 +0.8125 0.03125 0.8125 +0.8125 0.03125 0.8438 +0.8125 0.03125 0.875 +0.8125 0.03125 0.9062 +0.8125 0.03125 0.9375 +0.8125 0.03125 0.9688 +0.8125 0.03125 1 +0.8125 0.0625 0 +0.8125 0.0625 0.03125 +0.8125 0.0625 0.0625 +0.8125 0.0625 0.09375 +0.8125 0.0625 0.125 +0.8125 0.0625 0.1562 +0.8125 0.0625 0.1875 +0.8125 0.0625 0.2188 +0.8125 0.0625 0.25 +0.8125 0.0625 0.2812 +0.8125 0.0625 0.3125 +0.8125 0.0625 0.3438 +0.8125 0.0625 0.375 +0.8125 0.0625 0.4062 +0.8125 0.0625 0.4375 +0.8125 0.0625 0.4688 +0.8125 0.0625 0.5 +0.8125 0.0625 0.5312 +0.8125 0.0625 0.5625 +0.8125 0.0625 0.5938 +0.8125 0.0625 0.625 +0.8125 0.0625 0.6562 +0.8125 0.0625 0.6875 +0.8125 0.0625 0.7188 +0.8125 0.0625 0.75 +0.8125 0.0625 0.7812 +0.8125 0.0625 0.8125 +0.8125 0.0625 0.8438 +0.8125 0.0625 0.875 +0.8125 0.0625 0.9062 +0.8125 0.0625 0.9375 +0.8125 0.0625 0.9688 +0.8125 0.0625 1 +0.8125 0.09375 0 +0.8125 0.09375 0.03125 +0.8125 0.09375 0.0625 +0.8125 0.09375 0.09375 +0.8125 0.09375 0.125 +0.8125 0.09375 0.1562 +0.8125 0.09375 0.1875 +0.8125 0.09375 0.2188 +0.8125 0.09375 0.25 +0.8125 0.09375 0.2812 +0.8125 0.09375 0.3125 +0.8125 0.09375 0.3438 +0.8125 0.09375 0.375 +0.8125 0.09375 0.4062 +0.8125 0.09375 0.4375 +0.8125 0.09375 0.4688 +0.8125 0.09375 0.5 +0.8125 0.09375 0.5312 +0.8125 0.09375 0.5625 +0.8125 0.09375 0.5938 +0.8125 0.09375 0.625 +0.8125 0.09375 0.6562 +0.8125 0.09375 0.6875 +0.8125 0.09375 0.7188 +0.8125 0.09375 0.75 +0.8125 0.09375 0.7812 +0.8125 0.09375 0.8125 +0.8125 0.09375 0.8438 +0.8125 0.09375 0.875 +0.8125 0.09375 0.9062 +0.8125 0.09375 0.9375 +0.8125 0.09375 0.9688 +0.8125 0.09375 1 +0.8125 0.125 0 +0.8125 0.125 0.03125 +0.8125 0.125 0.0625 +0.8125 0.125 0.09375 +0.8125 0.125 0.125 +0.8125 0.125 0.1562 +0.8125 0.125 0.1875 +0.8125 0.125 0.2188 +0.8125 0.125 0.25 +0.8125 0.125 0.2812 +0.8125 0.125 0.3125 +0.8125 0.125 0.3438 +0.8125 0.125 0.375 +0.8125 0.125 0.4062 +0.8125 0.125 0.4375 +0.8125 0.125 0.4688 +0.8125 0.125 0.5 +0.8125 0.125 0.5312 +0.8125 0.125 0.5625 +0.8125 0.125 0.5938 +0.8125 0.125 0.625 +0.8125 0.125 0.6562 +0.8125 0.125 0.6875 +0.8125 0.125 0.7188 +0.8125 0.125 0.75 +0.8125 0.125 0.7812 +0.8125 0.125 0.8125 +0.8125 0.125 0.8438 +0.8125 0.125 0.875 +0.8125 0.125 0.9062 +0.8125 0.125 0.9375 +0.8125 0.125 0.9688 +0.8125 0.125 1 +0.8125 0.1562 0 +0.8125 0.1562 0.03125 +0.8125 0.1562 0.0625 +0.8125 0.1562 0.09375 +0.8125 0.1562 0.125 +0.8125 0.1562 0.1562 +0.8125 0.1562 0.1875 +0.8125 0.1562 0.2188 +0.8125 0.1562 0.25 +0.8125 0.1562 0.2812 +0.8125 0.1562 0.3125 +0.8125 0.1562 0.3438 +0.8125 0.1562 0.375 +0.8125 0.1562 0.4062 +0.8125 0.1562 0.4375 +0.8125 0.1562 0.4688 +0.8125 0.1562 0.5 +0.8125 0.1562 0.5312 +0.8125 0.1562 0.5625 +0.8125 0.1562 0.5938 +0.8125 0.1562 0.625 +0.8125 0.1562 0.6562 +0.8125 0.1562 0.6875 +0.8125 0.1562 0.7188 +0.8125 0.1562 0.75 +0.8125 0.1562 0.7812 +0.8125 0.1562 0.8125 +0.8125 0.1562 0.8438 +0.8125 0.1562 0.875 +0.8125 0.1562 0.9062 +0.8125 0.1562 0.9375 +0.8125 0.1562 0.9688 +0.8125 0.1562 1 +0.8125 0.1875 0 +0.8125 0.1875 0.03125 +0.8125 0.1875 0.0625 +0.8125 0.1875 0.09375 +0.8125 0.1875 0.125 +0.8125 0.1875 0.1562 +0.8125 0.1875 0.1875 +0.8125 0.1875 0.2188 +0.8125 0.1875 0.25 +0.8125 0.1875 0.2812 +0.8125 0.1875 0.3125 +0.8125 0.1875 0.3438 +0.8125 0.1875 0.375 +0.8125 0.1875 0.4062 +0.8125 0.1875 0.4375 +0.8125 0.1875 0.4688 +0.8125 0.1875 0.5 +0.8125 0.1875 0.5312 +0.8125 0.1875 0.5625 +0.8125 0.1875 0.5938 +0.8125 0.1875 0.625 +0.8125 0.1875 0.6562 +0.8125 0.1875 0.6875 +0.8125 0.1875 0.7188 +0.8125 0.1875 0.75 +0.8125 0.1875 0.7812 +0.8125 0.1875 0.8125 +0.8125 0.1875 0.8438 +0.8125 0.1875 0.875 +0.8125 0.1875 0.9062 +0.8125 0.1875 0.9375 +0.8125 0.1875 0.9688 +0.8125 0.1875 1 +0.8125 0.2188 0 +0.8125 0.2188 0.03125 +0.8125 0.2188 0.0625 +0.8125 0.2188 0.09375 +0.8125 0.2188 0.125 +0.8125 0.2188 0.1562 +0.8125 0.2188 0.1875 +0.8125 0.2188 0.2188 +0.8125 0.2188 0.25 +0.8125 0.2188 0.2812 +0.8125 0.2188 0.3125 +0.8125 0.2188 0.3438 +0.8125 0.2188 0.375 +0.8125 0.2188 0.4062 +0.8125 0.2188 0.4375 +0.8125 0.2188 0.4688 +0.8125 0.2188 0.5 +0.8125 0.2188 0.5312 +0.8125 0.2188 0.5625 +0.8125 0.2188 0.5938 +0.8125 0.2188 0.625 +0.8125 0.2188 0.6562 +0.8125 0.2188 0.6875 +0.8125 0.2188 0.7188 +0.8125 0.2188 0.75 +0.8125 0.2188 0.7812 +0.8125 0.2188 0.8125 +0.8125 0.2188 0.8438 +0.8125 0.2188 0.875 +0.8125 0.2188 0.9062 +0.8125 0.2188 0.9375 +0.8125 0.2188 0.9688 +0.8125 0.2188 1 +0.8125 0.25 0 +0.8125 0.25 0.03125 +0.8125 0.25 0.0625 +0.8125 0.25 0.09375 +0.8125 0.25 0.125 +0.8125 0.25 0.1562 +0.8125 0.25 0.1875 +0.8125 0.25 0.2188 +0.8125 0.25 0.25 +0.8125 0.25 0.2812 +0.8125 0.25 0.3125 +0.8125 0.25 0.3438 +0.8125 0.25 0.375 +0.8125 0.25 0.4062 +0.8125 0.25 0.4375 +0.8125 0.25 0.4688 +0.8125 0.25 0.5 +0.8125 0.25 0.5312 +0.8125 0.25 0.5625 +0.8125 0.25 0.5938 +0.8125 0.25 0.625 +0.8125 0.25 0.6562 +0.8125 0.25 0.6875 +0.8125 0.25 0.7188 +0.8125 0.25 0.75 +0.8125 0.25 0.7812 +0.8125 0.25 0.8125 +0.8125 0.25 0.8438 +0.8125 0.25 0.875 +0.8125 0.25 0.9062 +0.8125 0.25 0.9375 +0.8125 0.25 0.9688 +0.8125 0.25 1 +0.8125 0.2812 0 +0.8125 0.2812 0.03125 +0.8125 0.2812 0.0625 +0.8125 0.2812 0.09375 +0.8125 0.2812 0.125 +0.8125 0.2812 0.1562 +0.8125 0.2812 0.1875 +0.8125 0.2812 0.2188 +0.8125 0.2812 0.25 +0.8125 0.2812 0.2812 +0.8125 0.2812 0.3125 +0.8125 0.2812 0.3438 +0.8125 0.2812 0.375 +0.8125 0.2812 0.4062 +0.8125 0.2812 0.4375 +0.8125 0.2812 0.4688 +0.8125 0.2812 0.5 +0.8125 0.2812 0.5312 +0.8125 0.2812 0.5625 +0.8125 0.2812 0.5938 +0.8125 0.2812 0.625 +0.8125 0.2812 0.6562 +0.8125 0.2812 0.6875 +0.8125 0.2812 0.7188 +0.8125 0.2812 0.75 +0.8125 0.2812 0.7812 +0.8125 0.2812 0.8125 +0.8125 0.2812 0.8438 +0.8125 0.2812 0.875 +0.8125 0.2812 0.9062 +0.8125 0.2812 0.9375 +0.8125 0.2812 0.9688 +0.8125 0.2812 1 +0.8125 0.3125 0 +0.8125 0.3125 0.03125 +0.8125 0.3125 0.0625 +0.8125 0.3125 0.09375 +0.8125 0.3125 0.125 +0.8125 0.3125 0.1562 +0.8125 0.3125 0.1875 +0.8125 0.3125 0.2188 +0.8125 0.3125 0.25 +0.8125 0.3125 0.2812 +0.8125 0.3125 0.3125 +0.8125 0.3125 0.3438 +0.8125 0.3125 0.375 +0.8125 0.3125 0.4062 +0.8125 0.3125 0.4375 +0.8125 0.3125 0.4688 +0.8125 0.3125 0.5 +0.8125 0.3125 0.5312 +0.8125 0.3125 0.5625 +0.8125 0.3125 0.5938 +0.8125 0.3125 0.625 +0.8125 0.3125 0.6562 +0.8125 0.3125 0.6875 +0.8125 0.3125 0.7188 +0.8125 0.3125 0.75 +0.8125 0.3125 0.7812 +0.8125 0.3125 0.8125 +0.8125 0.3125 0.8438 +0.8125 0.3125 0.875 +0.8125 0.3125 0.9062 +0.8125 0.3125 0.9375 +0.8125 0.3125 0.9688 +0.8125 0.3125 1 +0.8125 0.3438 0 +0.8125 0.3438 0.03125 +0.8125 0.3438 0.0625 +0.8125 0.3438 0.09375 +0.8125 0.3438 0.125 +0.8125 0.3438 0.1562 +0.8125 0.3438 0.1875 +0.8125 0.3438 0.2188 +0.8125 0.3438 0.25 +0.8125 0.3438 0.2812 +0.8125 0.3438 0.3125 +0.8125 0.3438 0.3438 +0.8125 0.3438 0.375 +0.8125 0.3438 0.4062 +0.8125 0.3438 0.4375 +0.8125 0.3438 0.4688 +0.8125 0.3438 0.5 +0.8125 0.3438 0.5312 +0.8125 0.3438 0.5625 +0.8125 0.3438 0.5938 +0.8125 0.3438 0.625 +0.8125 0.3438 0.6562 +0.8125 0.3438 0.6875 +0.8125 0.3438 0.7188 +0.8125 0.3438 0.75 +0.8125 0.3438 0.7812 +0.8125 0.3438 0.8125 +0.8125 0.3438 0.8438 +0.8125 0.3438 0.875 +0.8125 0.3438 0.9062 +0.8125 0.3438 0.9375 +0.8125 0.3438 0.9688 +0.8125 0.3438 1 +0.8125 0.375 0 +0.8125 0.375 0.03125 +0.8125 0.375 0.0625 +0.8125 0.375 0.09375 +0.8125 0.375 0.125 +0.8125 0.375 0.1562 +0.8125 0.375 0.1875 +0.8125 0.375 0.2188 +0.8125 0.375 0.25 +0.8125 0.375 0.2812 +0.8125 0.375 0.3125 +0.8125 0.375 0.3438 +0.8125 0.375 0.375 +0.8125 0.375 0.4062 +0.8125 0.375 0.4375 +0.8125 0.375 0.4688 +0.8125 0.375 0.5 +0.8125 0.375 0.5312 +0.8125 0.375 0.5625 +0.8125 0.375 0.5938 +0.8125 0.375 0.625 +0.8125 0.375 0.6562 +0.8125 0.375 0.6875 +0.8125 0.375 0.7188 +0.8125 0.375 0.75 +0.8125 0.375 0.7812 +0.8125 0.375 0.8125 +0.8125 0.375 0.8438 +0.8125 0.375 0.875 +0.8125 0.375 0.9062 +0.8125 0.375 0.9375 +0.8125 0.375 0.9688 +0.8125 0.375 1 +0.8125 0.4062 0 +0.8125 0.4062 0.03125 +0.8125 0.4062 0.0625 +0.8125 0.4062 0.09375 +0.8125 0.4062 0.125 +0.8125 0.4062 0.1562 +0.8125 0.4062 0.1875 +0.8125 0.4062 0.2188 +0.8125 0.4062 0.25 +0.8125 0.4062 0.2812 +0.8125 0.4062 0.3125 +0.8125 0.4062 0.3438 +0.8125 0.4062 0.375 +0.8125 0.4062 0.4062 +0.8125 0.4062 0.4375 +0.8125 0.4062 0.4688 +0.8125 0.4062 0.5 +0.8125 0.4062 0.5312 +0.8125 0.4062 0.5625 +0.8125 0.4062 0.5938 +0.8125 0.4062 0.625 +0.8125 0.4062 0.6562 +0.8125 0.4062 0.6875 +0.8125 0.4062 0.7188 +0.8125 0.4062 0.75 +0.8125 0.4062 0.7812 +0.8125 0.4062 0.8125 +0.8125 0.4062 0.8438 +0.8125 0.4062 0.875 +0.8125 0.4062 0.9062 +0.8125 0.4062 0.9375 +0.8125 0.4062 0.9688 +0.8125 0.4062 1 +0.8125 0.4375 0 +0.8125 0.4375 0.03125 +0.8125 0.4375 0.0625 +0.8125 0.4375 0.09375 +0.8125 0.4375 0.125 +0.8125 0.4375 0.1562 +0.8125 0.4375 0.1875 +0.8125 0.4375 0.2188 +0.8125 0.4375 0.25 +0.8125 0.4375 0.2812 +0.8125 0.4375 0.3125 +0.8125 0.4375 0.3438 +0.8125 0.4375 0.375 +0.8125 0.4375 0.4062 +0.8125 0.4375 0.4375 +0.8125 0.4375 0.4688 +0.8125 0.4375 0.5 +0.8125 0.4375 0.5312 +0.8125 0.4375 0.5625 +0.8125 0.4375 0.5938 +0.8125 0.4375 0.625 +0.8125 0.4375 0.6562 +0.8125 0.4375 0.6875 +0.8125 0.4375 0.7188 +0.8125 0.4375 0.75 +0.8125 0.4375 0.7812 +0.8125 0.4375 0.8125 +0.8125 0.4375 0.8438 +0.8125 0.4375 0.875 +0.8125 0.4375 0.9062 +0.8125 0.4375 0.9375 +0.8125 0.4375 0.9688 +0.8125 0.4375 1 +0.8125 0.4688 0 +0.8125 0.4688 0.03125 +0.8125 0.4688 0.0625 +0.8125 0.4688 0.09375 +0.8125 0.4688 0.125 +0.8125 0.4688 0.1562 +0.8125 0.4688 0.1875 +0.8125 0.4688 0.2188 +0.8125 0.4688 0.25 +0.8125 0.4688 0.2812 +0.8125 0.4688 0.3125 +0.8125 0.4688 0.3438 +0.8125 0.4688 0.375 +0.8125 0.4688 0.4062 +0.8125 0.4688 0.4375 +0.8125 0.4688 0.4688 +0.8125 0.4688 0.5 +0.8125 0.4688 0.5312 +0.8125 0.4688 0.5625 +0.8125 0.4688 0.5938 +0.8125 0.4688 0.625 +0.8125 0.4688 0.6562 +0.8125 0.4688 0.6875 +0.8125 0.4688 0.7188 +0.8125 0.4688 0.75 +0.8125 0.4688 0.7812 +0.8125 0.4688 0.8125 +0.8125 0.4688 0.8438 +0.8125 0.4688 0.875 +0.8125 0.4688 0.9062 +0.8125 0.4688 0.9375 +0.8125 0.4688 0.9688 +0.8125 0.4688 1 +0.8125 0.5 0 +0.8125 0.5 0.03125 +0.8125 0.5 0.0625 +0.8125 0.5 0.09375 +0.8125 0.5 0.125 +0.8125 0.5 0.1562 +0.8125 0.5 0.1875 +0.8125 0.5 0.2188 +0.8125 0.5 0.25 +0.8125 0.5 0.2812 +0.8125 0.5 0.3125 +0.8125 0.5 0.3438 +0.8125 0.5 0.375 +0.8125 0.5 0.4062 +0.8125 0.5 0.4375 +0.8125 0.5 0.4688 +0.8125 0.5 0.5 +0.8125 0.5 0.5312 +0.8125 0.5 0.5625 +0.8125 0.5 0.5938 +0.8125 0.5 0.625 +0.8125 0.5 0.6562 +0.8125 0.5 0.6875 +0.8125 0.5 0.7188 +0.8125 0.5 0.75 +0.8125 0.5 0.7812 +0.8125 0.5 0.8125 +0.8125 0.5 0.8438 +0.8125 0.5 0.875 +0.8125 0.5 0.9062 +0.8125 0.5 0.9375 +0.8125 0.5 0.9688 +0.8125 0.5 1 +0.8125 0.5312 0 +0.8125 0.5312 0.03125 +0.8125 0.5312 0.0625 +0.8125 0.5312 0.09375 +0.8125 0.5312 0.125 +0.8125 0.5312 0.1562 +0.8125 0.5312 0.1875 +0.8125 0.5312 0.2188 +0.8125 0.5312 0.25 +0.8125 0.5312 0.2812 +0.8125 0.5312 0.3125 +0.8125 0.5312 0.3438 +0.8125 0.5312 0.375 +0.8125 0.5312 0.4062 +0.8125 0.5312 0.4375 +0.8125 0.5312 0.4688 +0.8125 0.5312 0.5 +0.8125 0.5312 0.5312 +0.8125 0.5312 0.5625 +0.8125 0.5312 0.5938 +0.8125 0.5312 0.625 +0.8125 0.5312 0.6562 +0.8125 0.5312 0.6875 +0.8125 0.5312 0.7188 +0.8125 0.5312 0.75 +0.8125 0.5312 0.7812 +0.8125 0.5312 0.8125 +0.8125 0.5312 0.8438 +0.8125 0.5312 0.875 +0.8125 0.5312 0.9062 +0.8125 0.5312 0.9375 +0.8125 0.5312 0.9688 +0.8125 0.5312 1 +0.8125 0.5625 0 +0.8125 0.5625 0.03125 +0.8125 0.5625 0.0625 +0.8125 0.5625 0.09375 +0.8125 0.5625 0.125 +0.8125 0.5625 0.1562 +0.8125 0.5625 0.1875 +0.8125 0.5625 0.2188 +0.8125 0.5625 0.25 +0.8125 0.5625 0.2812 +0.8125 0.5625 0.3125 +0.8125 0.5625 0.3438 +0.8125 0.5625 0.375 +0.8125 0.5625 0.4062 +0.8125 0.5625 0.4375 +0.8125 0.5625 0.4688 +0.8125 0.5625 0.5 +0.8125 0.5625 0.5312 +0.8125 0.5625 0.5625 +0.8125 0.5625 0.5938 +0.8125 0.5625 0.625 +0.8125 0.5625 0.6562 +0.8125 0.5625 0.6875 +0.8125 0.5625 0.7188 +0.8125 0.5625 0.75 +0.8125 0.5625 0.7812 +0.8125 0.5625 0.8125 +0.8125 0.5625 0.8438 +0.8125 0.5625 0.875 +0.8125 0.5625 0.9062 +0.8125 0.5625 0.9375 +0.8125 0.5625 0.9688 +0.8125 0.5625 1 +0.8125 0.5938 0 +0.8125 0.5938 0.03125 +0.8125 0.5938 0.0625 +0.8125 0.5938 0.09375 +0.8125 0.5938 0.125 +0.8125 0.5938 0.1562 +0.8125 0.5938 0.1875 +0.8125 0.5938 0.2188 +0.8125 0.5938 0.25 +0.8125 0.5938 0.2812 +0.8125 0.5938 0.3125 +0.8125 0.5938 0.3438 +0.8125 0.5938 0.375 +0.8125 0.5938 0.4062 +0.8125 0.5938 0.4375 +0.8125 0.5938 0.4688 +0.8125 0.5938 0.5 +0.8125 0.5938 0.5312 +0.8125 0.5938 0.5625 +0.8125 0.5938 0.5938 +0.8125 0.5938 0.625 +0.8125 0.5938 0.6562 +0.8125 0.5938 0.6875 +0.8125 0.5938 0.7188 +0.8125 0.5938 0.75 +0.8125 0.5938 0.7812 +0.8125 0.5938 0.8125 +0.8125 0.5938 0.8438 +0.8125 0.5938 0.875 +0.8125 0.5938 0.9062 +0.8125 0.5938 0.9375 +0.8125 0.5938 0.9688 +0.8125 0.5938 1 +0.8125 0.625 0 +0.8125 0.625 0.03125 +0.8125 0.625 0.0625 +0.8125 0.625 0.09375 +0.8125 0.625 0.125 +0.8125 0.625 0.1562 +0.8125 0.625 0.1875 +0.8125 0.625 0.2188 +0.8125 0.625 0.25 +0.8125 0.625 0.2812 +0.8125 0.625 0.3125 +0.8125 0.625 0.3438 +0.8125 0.625 0.375 +0.8125 0.625 0.4062 +0.8125 0.625 0.4375 +0.8125 0.625 0.4688 +0.8125 0.625 0.5 +0.8125 0.625 0.5312 +0.8125 0.625 0.5625 +0.8125 0.625 0.5938 +0.8125 0.625 0.625 +0.8125 0.625 0.6562 +0.8125 0.625 0.6875 +0.8125 0.625 0.7188 +0.8125 0.625 0.75 +0.8125 0.625 0.7812 +0.8125 0.625 0.8125 +0.8125 0.625 0.8438 +0.8125 0.625 0.875 +0.8125 0.625 0.9062 +0.8125 0.625 0.9375 +0.8125 0.625 0.9688 +0.8125 0.625 1 +0.8125 0.6562 0 +0.8125 0.6562 0.03125 +0.8125 0.6562 0.0625 +0.8125 0.6562 0.09375 +0.8125 0.6562 0.125 +0.8125 0.6562 0.1562 +0.8125 0.6562 0.1875 +0.8125 0.6562 0.2188 +0.8125 0.6562 0.25 +0.8125 0.6562 0.2812 +0.8125 0.6562 0.3125 +0.8125 0.6562 0.3438 +0.8125 0.6562 0.375 +0.8125 0.6562 0.4062 +0.8125 0.6562 0.4375 +0.8125 0.6562 0.4688 +0.8125 0.6562 0.5 +0.8125 0.6562 0.5312 +0.8125 0.6562 0.5625 +0.8125 0.6562 0.5938 +0.8125 0.6562 0.625 +0.8125 0.6562 0.6562 +0.8125 0.6562 0.6875 +0.8125 0.6562 0.7188 +0.8125 0.6562 0.75 +0.8125 0.6562 0.7812 +0.8125 0.6562 0.8125 +0.8125 0.6562 0.8438 +0.8125 0.6562 0.875 +0.8125 0.6562 0.9062 +0.8125 0.6562 0.9375 +0.8125 0.6562 0.9688 +0.8125 0.6562 1 +0.8125 0.6875 0 +0.8125 0.6875 0.03125 +0.8125 0.6875 0.0625 +0.8125 0.6875 0.09375 +0.8125 0.6875 0.125 +0.8125 0.6875 0.1562 +0.8125 0.6875 0.1875 +0.8125 0.6875 0.2188 +0.8125 0.6875 0.25 +0.8125 0.6875 0.2812 +0.8125 0.6875 0.3125 +0.8125 0.6875 0.3438 +0.8125 0.6875 0.375 +0.8125 0.6875 0.4062 +0.8125 0.6875 0.4375 +0.8125 0.6875 0.4688 +0.8125 0.6875 0.5 +0.8125 0.6875 0.5312 +0.8125 0.6875 0.5625 +0.8125 0.6875 0.5938 +0.8125 0.6875 0.625 +0.8125 0.6875 0.6562 +0.8125 0.6875 0.6875 +0.8125 0.6875 0.7188 +0.8125 0.6875 0.75 +0.8125 0.6875 0.7812 +0.8125 0.6875 0.8125 +0.8125 0.6875 0.8438 +0.8125 0.6875 0.875 +0.8125 0.6875 0.9062 +0.8125 0.6875 0.9375 +0.8125 0.6875 0.9688 +0.8125 0.6875 1 +0.8125 0.7188 0 +0.8125 0.7188 0.03125 +0.8125 0.7188 0.0625 +0.8125 0.7188 0.09375 +0.8125 0.7188 0.125 +0.8125 0.7188 0.1562 +0.8125 0.7188 0.1875 +0.8125 0.7188 0.2188 +0.8125 0.7188 0.25 +0.8125 0.7188 0.2812 +0.8125 0.7188 0.3125 +0.8125 0.7188 0.3438 +0.8125 0.7188 0.375 +0.8125 0.7188 0.4062 +0.8125 0.7188 0.4375 +0.8125 0.7188 0.4688 +0.8125 0.7188 0.5 +0.8125 0.7188 0.5312 +0.8125 0.7188 0.5625 +0.8125 0.7188 0.5938 +0.8125 0.7188 0.625 +0.8125 0.7188 0.6562 +0.8125 0.7188 0.6875 +0.8125 0.7188 0.7188 +0.8125 0.7188 0.75 +0.8125 0.7188 0.7812 +0.8125 0.7188 0.8125 +0.8125 0.7188 0.8438 +0.8125 0.7188 0.875 +0.8125 0.7188 0.9062 +0.8125 0.7188 0.9375 +0.8125 0.7188 0.9688 +0.8125 0.7188 1 +0.8125 0.75 0 +0.8125 0.75 0.03125 +0.8125 0.75 0.0625 +0.8125 0.75 0.09375 +0.8125 0.75 0.125 +0.8125 0.75 0.1562 +0.8125 0.75 0.1875 +0.8125 0.75 0.2188 +0.8125 0.75 0.25 +0.8125 0.75 0.2812 +0.8125 0.75 0.3125 +0.8125 0.75 0.3438 +0.8125 0.75 0.375 +0.8125 0.75 0.4062 +0.8125 0.75 0.4375 +0.8125 0.75 0.4688 +0.8125 0.75 0.5 +0.8125 0.75 0.5312 +0.8125 0.75 0.5625 +0.8125 0.75 0.5938 +0.8125 0.75 0.625 +0.8125 0.75 0.6562 +0.8125 0.75 0.6875 +0.8125 0.75 0.7188 +0.8125 0.75 0.75 +0.8125 0.75 0.7812 +0.8125 0.75 0.8125 +0.8125 0.75 0.8438 +0.8125 0.75 0.875 +0.8125 0.75 0.9062 +0.8125 0.75 0.9375 +0.8125 0.75 0.9688 +0.8125 0.75 1 +0.8125 0.7812 0 +0.8125 0.7812 0.03125 +0.8125 0.7812 0.0625 +0.8125 0.7812 0.09375 +0.8125 0.7812 0.125 +0.8125 0.7812 0.1562 +0.8125 0.7812 0.1875 +0.8125 0.7812 0.2188 +0.8125 0.7812 0.25 +0.8125 0.7812 0.2812 +0.8125 0.7812 0.3125 +0.8125 0.7812 0.3438 +0.8125 0.7812 0.375 +0.8125 0.7812 0.4062 +0.8125 0.7812 0.4375 +0.8125 0.7812 0.4688 +0.8125 0.7812 0.5 +0.8125 0.7812 0.5312 +0.8125 0.7812 0.5625 +0.8125 0.7812 0.5938 +0.8125 0.7812 0.625 +0.8125 0.7812 0.6562 +0.8125 0.7812 0.6875 +0.8125 0.7812 0.7188 +0.8125 0.7812 0.75 +0.8125 0.7812 0.7812 +0.8125 0.7812 0.8125 +0.8125 0.7812 0.8438 +0.8125 0.7812 0.875 +0.8125 0.7812 0.9062 +0.8125 0.7812 0.9375 +0.8125 0.7812 0.9688 +0.8125 0.7812 1 +0.8125 0.8125 0 +0.8125 0.8125 0.03125 +0.8125 0.8125 0.0625 +0.8125 0.8125 0.09375 +0.8125 0.8125 0.125 +0.8125 0.8125 0.1562 +0.8125 0.8125 0.1875 +0.8125 0.8125 0.2188 +0.8125 0.8125 0.25 +0.8125 0.8125 0.2812 +0.8125 0.8125 0.3125 +0.8125 0.8125 0.3438 +0.8125 0.8125 0.375 +0.8125 0.8125 0.4062 +0.8125 0.8125 0.4375 +0.8125 0.8125 0.4688 +0.8125 0.8125 0.5 +0.8125 0.8125 0.5312 +0.8125 0.8125 0.5625 +0.8125 0.8125 0.5938 +0.8125 0.8125 0.625 +0.8125 0.8125 0.6562 +0.8125 0.8125 0.6875 +0.8125 0.8125 0.7188 +0.8125 0.8125 0.75 +0.8125 0.8125 0.7812 +0.8125 0.8125 0.8125 +0.8125 0.8125 0.8438 +0.8125 0.8125 0.875 +0.8125 0.8125 0.9062 +0.8125 0.8125 0.9375 +0.8125 0.8125 0.9688 +0.8125 0.8125 1 +0.8125 0.8438 0 +0.8125 0.8438 0.03125 +0.8125 0.8438 0.0625 +0.8125 0.8438 0.09375 +0.8125 0.8438 0.125 +0.8125 0.8438 0.1562 +0.8125 0.8438 0.1875 +0.8125 0.8438 0.2188 +0.8125 0.8438 0.25 +0.8125 0.8438 0.2812 +0.8125 0.8438 0.3125 +0.8125 0.8438 0.3438 +0.8125 0.8438 0.375 +0.8125 0.8438 0.4062 +0.8125 0.8438 0.4375 +0.8125 0.8438 0.4688 +0.8125 0.8438 0.5 +0.8125 0.8438 0.5312 +0.8125 0.8438 0.5625 +0.8125 0.8438 0.5938 +0.8125 0.8438 0.625 +0.8125 0.8438 0.6562 +0.8125 0.8438 0.6875 +0.8125 0.8438 0.7188 +0.8125 0.8438 0.75 +0.8125 0.8438 0.7812 +0.8125 0.8438 0.8125 +0.8125 0.8438 0.8438 +0.8125 0.8438 0.875 +0.8125 0.8438 0.9062 +0.8125 0.8438 0.9375 +0.8125 0.8438 0.9688 +0.8125 0.8438 1 +0.8125 0.875 0 +0.8125 0.875 0.03125 +0.8125 0.875 0.0625 +0.8125 0.875 0.09375 +0.8125 0.875 0.125 +0.8125 0.875 0.1562 +0.8125 0.875 0.1875 +0.8125 0.875 0.2188 +0.8125 0.875 0.25 +0.8125 0.875 0.2812 +0.8125 0.875 0.3125 +0.8125 0.875 0.3438 +0.8125 0.875 0.375 +0.8125 0.875 0.4062 +0.8125 0.875 0.4375 +0.8125 0.875 0.4688 +0.8125 0.875 0.5 +0.8125 0.875 0.5312 +0.8125 0.875 0.5625 +0.8125 0.875 0.5938 +0.8125 0.875 0.625 +0.8125 0.875 0.6562 +0.8125 0.875 0.6875 +0.8125 0.875 0.7188 +0.8125 0.875 0.75 +0.8125 0.875 0.7812 +0.8125 0.875 0.8125 +0.8125 0.875 0.8438 +0.8125 0.875 0.875 +0.8125 0.875 0.9062 +0.8125 0.875 0.9375 +0.8125 0.875 0.9688 +0.8125 0.875 1 +0.8125 0.9062 0 +0.8125 0.9062 0.03125 +0.8125 0.9062 0.0625 +0.8125 0.9062 0.09375 +0.8125 0.9062 0.125 +0.8125 0.9062 0.1562 +0.8125 0.9062 0.1875 +0.8125 0.9062 0.2188 +0.8125 0.9062 0.25 +0.8125 0.9062 0.2812 +0.8125 0.9062 0.3125 +0.8125 0.9062 0.3438 +0.8125 0.9062 0.375 +0.8125 0.9062 0.4062 +0.8125 0.9062 0.4375 +0.8125 0.9062 0.4688 +0.8125 0.9062 0.5 +0.8125 0.9062 0.5312 +0.8125 0.9062 0.5625 +0.8125 0.9062 0.5938 +0.8125 0.9062 0.625 +0.8125 0.9062 0.6562 +0.8125 0.9062 0.6875 +0.8125 0.9062 0.7188 +0.8125 0.9062 0.75 +0.8125 0.9062 0.7812 +0.8125 0.9062 0.8125 +0.8125 0.9062 0.8438 +0.8125 0.9062 0.875 +0.8125 0.9062 0.9062 +0.8125 0.9062 0.9375 +0.8125 0.9062 0.9688 +0.8125 0.9062 1 +0.8125 0.9375 0 +0.8125 0.9375 0.03125 +0.8125 0.9375 0.0625 +0.8125 0.9375 0.09375 +0.8125 0.9375 0.125 +0.8125 0.9375 0.1562 +0.8125 0.9375 0.1875 +0.8125 0.9375 0.2188 +0.8125 0.9375 0.25 +0.8125 0.9375 0.2812 +0.8125 0.9375 0.3125 +0.8125 0.9375 0.3438 +0.8125 0.9375 0.375 +0.8125 0.9375 0.4062 +0.8125 0.9375 0.4375 +0.8125 0.9375 0.4688 +0.8125 0.9375 0.5 +0.8125 0.9375 0.5312 +0.8125 0.9375 0.5625 +0.8125 0.9375 0.5938 +0.8125 0.9375 0.625 +0.8125 0.9375 0.6562 +0.8125 0.9375 0.6875 +0.8125 0.9375 0.7188 +0.8125 0.9375 0.75 +0.8125 0.9375 0.7812 +0.8125 0.9375 0.8125 +0.8125 0.9375 0.8438 +0.8125 0.9375 0.875 +0.8125 0.9375 0.9062 +0.8125 0.9375 0.9375 +0.8125 0.9375 0.9688 +0.8125 0.9375 1 +0.8125 0.9688 0 +0.8125 0.9688 0.03125 +0.8125 0.9688 0.0625 +0.8125 0.9688 0.09375 +0.8125 0.9688 0.125 +0.8125 0.9688 0.1562 +0.8125 0.9688 0.1875 +0.8125 0.9688 0.2188 +0.8125 0.9688 0.25 +0.8125 0.9688 0.2812 +0.8125 0.9688 0.3125 +0.8125 0.9688 0.3438 +0.8125 0.9688 0.375 +0.8125 0.9688 0.4062 +0.8125 0.9688 0.4375 +0.8125 0.9688 0.4688 +0.8125 0.9688 0.5 +0.8125 0.9688 0.5312 +0.8125 0.9688 0.5625 +0.8125 0.9688 0.5938 +0.8125 0.9688 0.625 +0.8125 0.9688 0.6562 +0.8125 0.9688 0.6875 +0.8125 0.9688 0.7188 +0.8125 0.9688 0.75 +0.8125 0.9688 0.7812 +0.8125 0.9688 0.8125 +0.8125 0.9688 0.8438 +0.8125 0.9688 0.875 +0.8125 0.9688 0.9062 +0.8125 0.9688 0.9375 +0.8125 0.9688 0.9688 +0.8125 0.9688 1 +0.8125 1 0 +0.8125 1 0.03125 +0.8125 1 0.0625 +0.8125 1 0.09375 +0.8125 1 0.125 +0.8125 1 0.1562 +0.8125 1 0.1875 +0.8125 1 0.2188 +0.8125 1 0.25 +0.8125 1 0.2812 +0.8125 1 0.3125 +0.8125 1 0.3438 +0.8125 1 0.375 +0.8125 1 0.4062 +0.8125 1 0.4375 +0.8125 1 0.4688 +0.8125 1 0.5 +0.8125 1 0.5312 +0.8125 1 0.5625 +0.8125 1 0.5938 +0.8125 1 0.625 +0.8125 1 0.6562 +0.8125 1 0.6875 +0.8125 1 0.7188 +0.8125 1 0.75 +0.8125 1 0.7812 +0.8125 1 0.8125 +0.8125 1 0.8438 +0.8125 1 0.875 +0.8125 1 0.9062 +0.8125 1 0.9375 +0.8125 1 0.9688 +0.8125 1 1 +0.8438 0 0 +0.8438 0 0.03125 +0.8438 0 0.0625 +0.8438 0 0.09375 +0.8438 0 0.125 +0.8438 0 0.1562 +0.8438 0 0.1875 +0.8438 0 0.2188 +0.8438 0 0.25 +0.8438 0 0.2812 +0.8438 0 0.3125 +0.8438 0 0.3438 +0.8438 0 0.375 +0.8438 0 0.4062 +0.8438 0 0.4375 +0.8438 0 0.4688 +0.8438 0 0.5 +0.8438 0 0.5312 +0.8438 0 0.5625 +0.8438 0 0.5938 +0.8438 0 0.625 +0.8438 0 0.6562 +0.8438 0 0.6875 +0.8438 0 0.7188 +0.8438 0 0.75 +0.8438 0 0.7812 +0.8438 0 0.8125 +0.8438 0 0.8438 +0.8438 0 0.875 +0.8438 0 0.9062 +0.8438 0 0.9375 +0.8438 0 0.9688 +0.8438 0 1 +0.8438 0.03125 0 +0.8438 0.03125 0.03125 +0.8438 0.03125 0.0625 +0.8438 0.03125 0.09375 +0.8438 0.03125 0.125 +0.8438 0.03125 0.1562 +0.8438 0.03125 0.1875 +0.8438 0.03125 0.2188 +0.8438 0.03125 0.25 +0.8438 0.03125 0.2812 +0.8438 0.03125 0.3125 +0.8438 0.03125 0.3438 +0.8438 0.03125 0.375 +0.8438 0.03125 0.4062 +0.8438 0.03125 0.4375 +0.8438 0.03125 0.4688 +0.8438 0.03125 0.5 +0.8438 0.03125 0.5312 +0.8438 0.03125 0.5625 +0.8438 0.03125 0.5938 +0.8438 0.03125 0.625 +0.8438 0.03125 0.6562 +0.8438 0.03125 0.6875 +0.8438 0.03125 0.7188 +0.8438 0.03125 0.75 +0.8438 0.03125 0.7812 +0.8438 0.03125 0.8125 +0.8438 0.03125 0.8438 +0.8438 0.03125 0.875 +0.8438 0.03125 0.9062 +0.8438 0.03125 0.9375 +0.8438 0.03125 0.9688 +0.8438 0.03125 1 +0.8438 0.0625 0 +0.8438 0.0625 0.03125 +0.8438 0.0625 0.0625 +0.8438 0.0625 0.09375 +0.8438 0.0625 0.125 +0.8438 0.0625 0.1562 +0.8438 0.0625 0.1875 +0.8438 0.0625 0.2188 +0.8438 0.0625 0.25 +0.8438 0.0625 0.2812 +0.8438 0.0625 0.3125 +0.8438 0.0625 0.3438 +0.8438 0.0625 0.375 +0.8438 0.0625 0.4062 +0.8438 0.0625 0.4375 +0.8438 0.0625 0.4688 +0.8438 0.0625 0.5 +0.8438 0.0625 0.5312 +0.8438 0.0625 0.5625 +0.8438 0.0625 0.5938 +0.8438 0.0625 0.625 +0.8438 0.0625 0.6562 +0.8438 0.0625 0.6875 +0.8438 0.0625 0.7188 +0.8438 0.0625 0.75 +0.8438 0.0625 0.7812 +0.8438 0.0625 0.8125 +0.8438 0.0625 0.8438 +0.8438 0.0625 0.875 +0.8438 0.0625 0.9062 +0.8438 0.0625 0.9375 +0.8438 0.0625 0.9688 +0.8438 0.0625 1 +0.8438 0.09375 0 +0.8438 0.09375 0.03125 +0.8438 0.09375 0.0625 +0.8438 0.09375 0.09375 +0.8438 0.09375 0.125 +0.8438 0.09375 0.1562 +0.8438 0.09375 0.1875 +0.8438 0.09375 0.2188 +0.8438 0.09375 0.25 +0.8438 0.09375 0.2812 +0.8438 0.09375 0.3125 +0.8438 0.09375 0.3438 +0.8438 0.09375 0.375 +0.8438 0.09375 0.4062 +0.8438 0.09375 0.4375 +0.8438 0.09375 0.4688 +0.8438 0.09375 0.5 +0.8438 0.09375 0.5312 +0.8438 0.09375 0.5625 +0.8438 0.09375 0.5938 +0.8438 0.09375 0.625 +0.8438 0.09375 0.6562 +0.8438 0.09375 0.6875 +0.8438 0.09375 0.7188 +0.8438 0.09375 0.75 +0.8438 0.09375 0.7812 +0.8438 0.09375 0.8125 +0.8438 0.09375 0.8438 +0.8438 0.09375 0.875 +0.8438 0.09375 0.9062 +0.8438 0.09375 0.9375 +0.8438 0.09375 0.9688 +0.8438 0.09375 1 +0.8438 0.125 0 +0.8438 0.125 0.03125 +0.8438 0.125 0.0625 +0.8438 0.125 0.09375 +0.8438 0.125 0.125 +0.8438 0.125 0.1562 +0.8438 0.125 0.1875 +0.8438 0.125 0.2188 +0.8438 0.125 0.25 +0.8438 0.125 0.2812 +0.8438 0.125 0.3125 +0.8438 0.125 0.3438 +0.8438 0.125 0.375 +0.8438 0.125 0.4062 +0.8438 0.125 0.4375 +0.8438 0.125 0.4688 +0.8438 0.125 0.5 +0.8438 0.125 0.5312 +0.8438 0.125 0.5625 +0.8438 0.125 0.5938 +0.8438 0.125 0.625 +0.8438 0.125 0.6562 +0.8438 0.125 0.6875 +0.8438 0.125 0.7188 +0.8438 0.125 0.75 +0.8438 0.125 0.7812 +0.8438 0.125 0.8125 +0.8438 0.125 0.8438 +0.8438 0.125 0.875 +0.8438 0.125 0.9062 +0.8438 0.125 0.9375 +0.8438 0.125 0.9688 +0.8438 0.125 1 +0.8438 0.1562 0 +0.8438 0.1562 0.03125 +0.8438 0.1562 0.0625 +0.8438 0.1562 0.09375 +0.8438 0.1562 0.125 +0.8438 0.1562 0.1562 +0.8438 0.1562 0.1875 +0.8438 0.1562 0.2188 +0.8438 0.1562 0.25 +0.8438 0.1562 0.2812 +0.8438 0.1562 0.3125 +0.8438 0.1562 0.3438 +0.8438 0.1562 0.375 +0.8438 0.1562 0.4062 +0.8438 0.1562 0.4375 +0.8438 0.1562 0.4688 +0.8438 0.1562 0.5 +0.8438 0.1562 0.5312 +0.8438 0.1562 0.5625 +0.8438 0.1562 0.5938 +0.8438 0.1562 0.625 +0.8438 0.1562 0.6562 +0.8438 0.1562 0.6875 +0.8438 0.1562 0.7188 +0.8438 0.1562 0.75 +0.8438 0.1562 0.7812 +0.8438 0.1562 0.8125 +0.8438 0.1562 0.8438 +0.8438 0.1562 0.875 +0.8438 0.1562 0.9062 +0.8438 0.1562 0.9375 +0.8438 0.1562 0.9688 +0.8438 0.1562 1 +0.8438 0.1875 0 +0.8438 0.1875 0.03125 +0.8438 0.1875 0.0625 +0.8438 0.1875 0.09375 +0.8438 0.1875 0.125 +0.8438 0.1875 0.1562 +0.8438 0.1875 0.1875 +0.8438 0.1875 0.2188 +0.8438 0.1875 0.25 +0.8438 0.1875 0.2812 +0.8438 0.1875 0.3125 +0.8438 0.1875 0.3438 +0.8438 0.1875 0.375 +0.8438 0.1875 0.4062 +0.8438 0.1875 0.4375 +0.8438 0.1875 0.4688 +0.8438 0.1875 0.5 +0.8438 0.1875 0.5312 +0.8438 0.1875 0.5625 +0.8438 0.1875 0.5938 +0.8438 0.1875 0.625 +0.8438 0.1875 0.6562 +0.8438 0.1875 0.6875 +0.8438 0.1875 0.7188 +0.8438 0.1875 0.75 +0.8438 0.1875 0.7812 +0.8438 0.1875 0.8125 +0.8438 0.1875 0.8438 +0.8438 0.1875 0.875 +0.8438 0.1875 0.9062 +0.8438 0.1875 0.9375 +0.8438 0.1875 0.9688 +0.8438 0.1875 1 +0.8438 0.2188 0 +0.8438 0.2188 0.03125 +0.8438 0.2188 0.0625 +0.8438 0.2188 0.09375 +0.8438 0.2188 0.125 +0.8438 0.2188 0.1562 +0.8438 0.2188 0.1875 +0.8438 0.2188 0.2188 +0.8438 0.2188 0.25 +0.8438 0.2188 0.2812 +0.8438 0.2188 0.3125 +0.8438 0.2188 0.3438 +0.8438 0.2188 0.375 +0.8438 0.2188 0.4062 +0.8438 0.2188 0.4375 +0.8438 0.2188 0.4688 +0.8438 0.2188 0.5 +0.8438 0.2188 0.5312 +0.8438 0.2188 0.5625 +0.8438 0.2188 0.5938 +0.8438 0.2188 0.625 +0.8438 0.2188 0.6562 +0.8438 0.2188 0.6875 +0.8438 0.2188 0.7188 +0.8438 0.2188 0.75 +0.8438 0.2188 0.7812 +0.8438 0.2188 0.8125 +0.8438 0.2188 0.8438 +0.8438 0.2188 0.875 +0.8438 0.2188 0.9062 +0.8438 0.2188 0.9375 +0.8438 0.2188 0.9688 +0.8438 0.2188 1 +0.8438 0.25 0 +0.8438 0.25 0.03125 +0.8438 0.25 0.0625 +0.8438 0.25 0.09375 +0.8438 0.25 0.125 +0.8438 0.25 0.1562 +0.8438 0.25 0.1875 +0.8438 0.25 0.2188 +0.8438 0.25 0.25 +0.8438 0.25 0.2812 +0.8438 0.25 0.3125 +0.8438 0.25 0.3438 +0.8438 0.25 0.375 +0.8438 0.25 0.4062 +0.8438 0.25 0.4375 +0.8438 0.25 0.4688 +0.8438 0.25 0.5 +0.8438 0.25 0.5312 +0.8438 0.25 0.5625 +0.8438 0.25 0.5938 +0.8438 0.25 0.625 +0.8438 0.25 0.6562 +0.8438 0.25 0.6875 +0.8438 0.25 0.7188 +0.8438 0.25 0.75 +0.8438 0.25 0.7812 +0.8438 0.25 0.8125 +0.8438 0.25 0.8438 +0.8438 0.25 0.875 +0.8438 0.25 0.9062 +0.8438 0.25 0.9375 +0.8438 0.25 0.9688 +0.8438 0.25 1 +0.8438 0.2812 0 +0.8438 0.2812 0.03125 +0.8438 0.2812 0.0625 +0.8438 0.2812 0.09375 +0.8438 0.2812 0.125 +0.8438 0.2812 0.1562 +0.8438 0.2812 0.1875 +0.8438 0.2812 0.2188 +0.8438 0.2812 0.25 +0.8438 0.2812 0.2812 +0.8438 0.2812 0.3125 +0.8438 0.2812 0.3438 +0.8438 0.2812 0.375 +0.8438 0.2812 0.4062 +0.8438 0.2812 0.4375 +0.8438 0.2812 0.4688 +0.8438 0.2812 0.5 +0.8438 0.2812 0.5312 +0.8438 0.2812 0.5625 +0.8438 0.2812 0.5938 +0.8438 0.2812 0.625 +0.8438 0.2812 0.6562 +0.8438 0.2812 0.6875 +0.8438 0.2812 0.7188 +0.8438 0.2812 0.75 +0.8438 0.2812 0.7812 +0.8438 0.2812 0.8125 +0.8438 0.2812 0.8438 +0.8438 0.2812 0.875 +0.8438 0.2812 0.9062 +0.8438 0.2812 0.9375 +0.8438 0.2812 0.9688 +0.8438 0.2812 1 +0.8438 0.3125 0 +0.8438 0.3125 0.03125 +0.8438 0.3125 0.0625 +0.8438 0.3125 0.09375 +0.8438 0.3125 0.125 +0.8438 0.3125 0.1562 +0.8438 0.3125 0.1875 +0.8438 0.3125 0.2188 +0.8438 0.3125 0.25 +0.8438 0.3125 0.2812 +0.8438 0.3125 0.3125 +0.8438 0.3125 0.3438 +0.8438 0.3125 0.375 +0.8438 0.3125 0.4062 +0.8438 0.3125 0.4375 +0.8438 0.3125 0.4688 +0.8438 0.3125 0.5 +0.8438 0.3125 0.5312 +0.8438 0.3125 0.5625 +0.8438 0.3125 0.5938 +0.8438 0.3125 0.625 +0.8438 0.3125 0.6562 +0.8438 0.3125 0.6875 +0.8438 0.3125 0.7188 +0.8438 0.3125 0.75 +0.8438 0.3125 0.7812 +0.8438 0.3125 0.8125 +0.8438 0.3125 0.8438 +0.8438 0.3125 0.875 +0.8438 0.3125 0.9062 +0.8438 0.3125 0.9375 +0.8438 0.3125 0.9688 +0.8438 0.3125 1 +0.8438 0.3438 0 +0.8438 0.3438 0.03125 +0.8438 0.3438 0.0625 +0.8438 0.3438 0.09375 +0.8438 0.3438 0.125 +0.8438 0.3438 0.1562 +0.8438 0.3438 0.1875 +0.8438 0.3438 0.2188 +0.8438 0.3438 0.25 +0.8438 0.3438 0.2812 +0.8438 0.3438 0.3125 +0.8438 0.3438 0.3438 +0.8438 0.3438 0.375 +0.8438 0.3438 0.4062 +0.8438 0.3438 0.4375 +0.8438 0.3438 0.4688 +0.8438 0.3438 0.5 +0.8438 0.3438 0.5312 +0.8438 0.3438 0.5625 +0.8438 0.3438 0.5938 +0.8438 0.3438 0.625 +0.8438 0.3438 0.6562 +0.8438 0.3438 0.6875 +0.8438 0.3438 0.7188 +0.8438 0.3438 0.75 +0.8438 0.3438 0.7812 +0.8438 0.3438 0.8125 +0.8438 0.3438 0.8438 +0.8438 0.3438 0.875 +0.8438 0.3438 0.9062 +0.8438 0.3438 0.9375 +0.8438 0.3438 0.9688 +0.8438 0.3438 1 +0.8438 0.375 0 +0.8438 0.375 0.03125 +0.8438 0.375 0.0625 +0.8438 0.375 0.09375 +0.8438 0.375 0.125 +0.8438 0.375 0.1562 +0.8438 0.375 0.1875 +0.8438 0.375 0.2188 +0.8438 0.375 0.25 +0.8438 0.375 0.2812 +0.8438 0.375 0.3125 +0.8438 0.375 0.3438 +0.8438 0.375 0.375 +0.8438 0.375 0.4062 +0.8438 0.375 0.4375 +0.8438 0.375 0.4688 +0.8438 0.375 0.5 +0.8438 0.375 0.5312 +0.8438 0.375 0.5625 +0.8438 0.375 0.5938 +0.8438 0.375 0.625 +0.8438 0.375 0.6562 +0.8438 0.375 0.6875 +0.8438 0.375 0.7188 +0.8438 0.375 0.75 +0.8438 0.375 0.7812 +0.8438 0.375 0.8125 +0.8438 0.375 0.8438 +0.8438 0.375 0.875 +0.8438 0.375 0.9062 +0.8438 0.375 0.9375 +0.8438 0.375 0.9688 +0.8438 0.375 1 +0.8438 0.4062 0 +0.8438 0.4062 0.03125 +0.8438 0.4062 0.0625 +0.8438 0.4062 0.09375 +0.8438 0.4062 0.125 +0.8438 0.4062 0.1562 +0.8438 0.4062 0.1875 +0.8438 0.4062 0.2188 +0.8438 0.4062 0.25 +0.8438 0.4062 0.2812 +0.8438 0.4062 0.3125 +0.8438 0.4062 0.3438 +0.8438 0.4062 0.375 +0.8438 0.4062 0.4062 +0.8438 0.4062 0.4375 +0.8438 0.4062 0.4688 +0.8438 0.4062 0.5 +0.8438 0.4062 0.5312 +0.8438 0.4062 0.5625 +0.8438 0.4062 0.5938 +0.8438 0.4062 0.625 +0.8438 0.4062 0.6562 +0.8438 0.4062 0.6875 +0.8438 0.4062 0.7188 +0.8438 0.4062 0.75 +0.8438 0.4062 0.7812 +0.8438 0.4062 0.8125 +0.8438 0.4062 0.8438 +0.8438 0.4062 0.875 +0.8438 0.4062 0.9062 +0.8438 0.4062 0.9375 +0.8438 0.4062 0.9688 +0.8438 0.4062 1 +0.8438 0.4375 0 +0.8438 0.4375 0.03125 +0.8438 0.4375 0.0625 +0.8438 0.4375 0.09375 +0.8438 0.4375 0.125 +0.8438 0.4375 0.1562 +0.8438 0.4375 0.1875 +0.8438 0.4375 0.2188 +0.8438 0.4375 0.25 +0.8438 0.4375 0.2812 +0.8438 0.4375 0.3125 +0.8438 0.4375 0.3438 +0.8438 0.4375 0.375 +0.8438 0.4375 0.4062 +0.8438 0.4375 0.4375 +0.8438 0.4375 0.4688 +0.8438 0.4375 0.5 +0.8438 0.4375 0.5312 +0.8438 0.4375 0.5625 +0.8438 0.4375 0.5938 +0.8438 0.4375 0.625 +0.8438 0.4375 0.6562 +0.8438 0.4375 0.6875 +0.8438 0.4375 0.7188 +0.8438 0.4375 0.75 +0.8438 0.4375 0.7812 +0.8438 0.4375 0.8125 +0.8438 0.4375 0.8438 +0.8438 0.4375 0.875 +0.8438 0.4375 0.9062 +0.8438 0.4375 0.9375 +0.8438 0.4375 0.9688 +0.8438 0.4375 1 +0.8438 0.4688 0 +0.8438 0.4688 0.03125 +0.8438 0.4688 0.0625 +0.8438 0.4688 0.09375 +0.8438 0.4688 0.125 +0.8438 0.4688 0.1562 +0.8438 0.4688 0.1875 +0.8438 0.4688 0.2188 +0.8438 0.4688 0.25 +0.8438 0.4688 0.2812 +0.8438 0.4688 0.3125 +0.8438 0.4688 0.3438 +0.8438 0.4688 0.375 +0.8438 0.4688 0.4062 +0.8438 0.4688 0.4375 +0.8438 0.4688 0.4688 +0.8438 0.4688 0.5 +0.8438 0.4688 0.5312 +0.8438 0.4688 0.5625 +0.8438 0.4688 0.5938 +0.8438 0.4688 0.625 +0.8438 0.4688 0.6562 +0.8438 0.4688 0.6875 +0.8438 0.4688 0.7188 +0.8438 0.4688 0.75 +0.8438 0.4688 0.7812 +0.8438 0.4688 0.8125 +0.8438 0.4688 0.8438 +0.8438 0.4688 0.875 +0.8438 0.4688 0.9062 +0.8438 0.4688 0.9375 +0.8438 0.4688 0.9688 +0.8438 0.4688 1 +0.8438 0.5 0 +0.8438 0.5 0.03125 +0.8438 0.5 0.0625 +0.8438 0.5 0.09375 +0.8438 0.5 0.125 +0.8438 0.5 0.1562 +0.8438 0.5 0.1875 +0.8438 0.5 0.2188 +0.8438 0.5 0.25 +0.8438 0.5 0.2812 +0.8438 0.5 0.3125 +0.8438 0.5 0.3438 +0.8438 0.5 0.375 +0.8438 0.5 0.4062 +0.8438 0.5 0.4375 +0.8438 0.5 0.4688 +0.8438 0.5 0.5 +0.8438 0.5 0.5312 +0.8438 0.5 0.5625 +0.8438 0.5 0.5938 +0.8438 0.5 0.625 +0.8438 0.5 0.6562 +0.8438 0.5 0.6875 +0.8438 0.5 0.7188 +0.8438 0.5 0.75 +0.8438 0.5 0.7812 +0.8438 0.5 0.8125 +0.8438 0.5 0.8438 +0.8438 0.5 0.875 +0.8438 0.5 0.9062 +0.8438 0.5 0.9375 +0.8438 0.5 0.9688 +0.8438 0.5 1 +0.8438 0.5312 0 +0.8438 0.5312 0.03125 +0.8438 0.5312 0.0625 +0.8438 0.5312 0.09375 +0.8438 0.5312 0.125 +0.8438 0.5312 0.1562 +0.8438 0.5312 0.1875 +0.8438 0.5312 0.2188 +0.8438 0.5312 0.25 +0.8438 0.5312 0.2812 +0.8438 0.5312 0.3125 +0.8438 0.5312 0.3438 +0.8438 0.5312 0.375 +0.8438 0.5312 0.4062 +0.8438 0.5312 0.4375 +0.8438 0.5312 0.4688 +0.8438 0.5312 0.5 +0.8438 0.5312 0.5312 +0.8438 0.5312 0.5625 +0.8438 0.5312 0.5938 +0.8438 0.5312 0.625 +0.8438 0.5312 0.6562 +0.8438 0.5312 0.6875 +0.8438 0.5312 0.7188 +0.8438 0.5312 0.75 +0.8438 0.5312 0.7812 +0.8438 0.5312 0.8125 +0.8438 0.5312 0.8438 +0.8438 0.5312 0.875 +0.8438 0.5312 0.9062 +0.8438 0.5312 0.9375 +0.8438 0.5312 0.9688 +0.8438 0.5312 1 +0.8438 0.5625 0 +0.8438 0.5625 0.03125 +0.8438 0.5625 0.0625 +0.8438 0.5625 0.09375 +0.8438 0.5625 0.125 +0.8438 0.5625 0.1562 +0.8438 0.5625 0.1875 +0.8438 0.5625 0.2188 +0.8438 0.5625 0.25 +0.8438 0.5625 0.2812 +0.8438 0.5625 0.3125 +0.8438 0.5625 0.3438 +0.8438 0.5625 0.375 +0.8438 0.5625 0.4062 +0.8438 0.5625 0.4375 +0.8438 0.5625 0.4688 +0.8438 0.5625 0.5 +0.8438 0.5625 0.5312 +0.8438 0.5625 0.5625 +0.8438 0.5625 0.5938 +0.8438 0.5625 0.625 +0.8438 0.5625 0.6562 +0.8438 0.5625 0.6875 +0.8438 0.5625 0.7188 +0.8438 0.5625 0.75 +0.8438 0.5625 0.7812 +0.8438 0.5625 0.8125 +0.8438 0.5625 0.8438 +0.8438 0.5625 0.875 +0.8438 0.5625 0.9062 +0.8438 0.5625 0.9375 +0.8438 0.5625 0.9688 +0.8438 0.5625 1 +0.8438 0.5938 0 +0.8438 0.5938 0.03125 +0.8438 0.5938 0.0625 +0.8438 0.5938 0.09375 +0.8438 0.5938 0.125 +0.8438 0.5938 0.1562 +0.8438 0.5938 0.1875 +0.8438 0.5938 0.2188 +0.8438 0.5938 0.25 +0.8438 0.5938 0.2812 +0.8438 0.5938 0.3125 +0.8438 0.5938 0.3438 +0.8438 0.5938 0.375 +0.8438 0.5938 0.4062 +0.8438 0.5938 0.4375 +0.8438 0.5938 0.4688 +0.8438 0.5938 0.5 +0.8438 0.5938 0.5312 +0.8438 0.5938 0.5625 +0.8438 0.5938 0.5938 +0.8438 0.5938 0.625 +0.8438 0.5938 0.6562 +0.8438 0.5938 0.6875 +0.8438 0.5938 0.7188 +0.8438 0.5938 0.75 +0.8438 0.5938 0.7812 +0.8438 0.5938 0.8125 +0.8438 0.5938 0.8438 +0.8438 0.5938 0.875 +0.8438 0.5938 0.9062 +0.8438 0.5938 0.9375 +0.8438 0.5938 0.9688 +0.8438 0.5938 1 +0.8438 0.625 0 +0.8438 0.625 0.03125 +0.8438 0.625 0.0625 +0.8438 0.625 0.09375 +0.8438 0.625 0.125 +0.8438 0.625 0.1562 +0.8438 0.625 0.1875 +0.8438 0.625 0.2188 +0.8438 0.625 0.25 +0.8438 0.625 0.2812 +0.8438 0.625 0.3125 +0.8438 0.625 0.3438 +0.8438 0.625 0.375 +0.8438 0.625 0.4062 +0.8438 0.625 0.4375 +0.8438 0.625 0.4688 +0.8438 0.625 0.5 +0.8438 0.625 0.5312 +0.8438 0.625 0.5625 +0.8438 0.625 0.5938 +0.8438 0.625 0.625 +0.8438 0.625 0.6562 +0.8438 0.625 0.6875 +0.8438 0.625 0.7188 +0.8438 0.625 0.75 +0.8438 0.625 0.7812 +0.8438 0.625 0.8125 +0.8438 0.625 0.8438 +0.8438 0.625 0.875 +0.8438 0.625 0.9062 +0.8438 0.625 0.9375 +0.8438 0.625 0.9688 +0.8438 0.625 1 +0.8438 0.6562 0 +0.8438 0.6562 0.03125 +0.8438 0.6562 0.0625 +0.8438 0.6562 0.09375 +0.8438 0.6562 0.125 +0.8438 0.6562 0.1562 +0.8438 0.6562 0.1875 +0.8438 0.6562 0.2188 +0.8438 0.6562 0.25 +0.8438 0.6562 0.2812 +0.8438 0.6562 0.3125 +0.8438 0.6562 0.3438 +0.8438 0.6562 0.375 +0.8438 0.6562 0.4062 +0.8438 0.6562 0.4375 +0.8438 0.6562 0.4688 +0.8438 0.6562 0.5 +0.8438 0.6562 0.5312 +0.8438 0.6562 0.5625 +0.8438 0.6562 0.5938 +0.8438 0.6562 0.625 +0.8438 0.6562 0.6562 +0.8438 0.6562 0.6875 +0.8438 0.6562 0.7188 +0.8438 0.6562 0.75 +0.8438 0.6562 0.7812 +0.8438 0.6562 0.8125 +0.8438 0.6562 0.8438 +0.8438 0.6562 0.875 +0.8438 0.6562 0.9062 +0.8438 0.6562 0.9375 +0.8438 0.6562 0.9688 +0.8438 0.6562 1 +0.8438 0.6875 0 +0.8438 0.6875 0.03125 +0.8438 0.6875 0.0625 +0.8438 0.6875 0.09375 +0.8438 0.6875 0.125 +0.8438 0.6875 0.1562 +0.8438 0.6875 0.1875 +0.8438 0.6875 0.2188 +0.8438 0.6875 0.25 +0.8438 0.6875 0.2812 +0.8438 0.6875 0.3125 +0.8438 0.6875 0.3438 +0.8438 0.6875 0.375 +0.8438 0.6875 0.4062 +0.8438 0.6875 0.4375 +0.8438 0.6875 0.4688 +0.8438 0.6875 0.5 +0.8438 0.6875 0.5312 +0.8438 0.6875 0.5625 +0.8438 0.6875 0.5938 +0.8438 0.6875 0.625 +0.8438 0.6875 0.6562 +0.8438 0.6875 0.6875 +0.8438 0.6875 0.7188 +0.8438 0.6875 0.75 +0.8438 0.6875 0.7812 +0.8438 0.6875 0.8125 +0.8438 0.6875 0.8438 +0.8438 0.6875 0.875 +0.8438 0.6875 0.9062 +0.8438 0.6875 0.9375 +0.8438 0.6875 0.9688 +0.8438 0.6875 1 +0.8438 0.7188 0 +0.8438 0.7188 0.03125 +0.8438 0.7188 0.0625 +0.8438 0.7188 0.09375 +0.8438 0.7188 0.125 +0.8438 0.7188 0.1562 +0.8438 0.7188 0.1875 +0.8438 0.7188 0.2188 +0.8438 0.7188 0.25 +0.8438 0.7188 0.2812 +0.8438 0.7188 0.3125 +0.8438 0.7188 0.3438 +0.8438 0.7188 0.375 +0.8438 0.7188 0.4062 +0.8438 0.7188 0.4375 +0.8438 0.7188 0.4688 +0.8438 0.7188 0.5 +0.8438 0.7188 0.5312 +0.8438 0.7188 0.5625 +0.8438 0.7188 0.5938 +0.8438 0.7188 0.625 +0.8438 0.7188 0.6562 +0.8438 0.7188 0.6875 +0.8438 0.7188 0.7188 +0.8438 0.7188 0.75 +0.8438 0.7188 0.7812 +0.8438 0.7188 0.8125 +0.8438 0.7188 0.8438 +0.8438 0.7188 0.875 +0.8438 0.7188 0.9062 +0.8438 0.7188 0.9375 +0.8438 0.7188 0.9688 +0.8438 0.7188 1 +0.8438 0.75 0 +0.8438 0.75 0.03125 +0.8438 0.75 0.0625 +0.8438 0.75 0.09375 +0.8438 0.75 0.125 +0.8438 0.75 0.1562 +0.8438 0.75 0.1875 +0.8438 0.75 0.2188 +0.8438 0.75 0.25 +0.8438 0.75 0.2812 +0.8438 0.75 0.3125 +0.8438 0.75 0.3438 +0.8438 0.75 0.375 +0.8438 0.75 0.4062 +0.8438 0.75 0.4375 +0.8438 0.75 0.4688 +0.8438 0.75 0.5 +0.8438 0.75 0.5312 +0.8438 0.75 0.5625 +0.8438 0.75 0.5938 +0.8438 0.75 0.625 +0.8438 0.75 0.6562 +0.8438 0.75 0.6875 +0.8438 0.75 0.7188 +0.8438 0.75 0.75 +0.8438 0.75 0.7812 +0.8438 0.75 0.8125 +0.8438 0.75 0.8438 +0.8438 0.75 0.875 +0.8438 0.75 0.9062 +0.8438 0.75 0.9375 +0.8438 0.75 0.9688 +0.8438 0.75 1 +0.8438 0.7812 0 +0.8438 0.7812 0.03125 +0.8438 0.7812 0.0625 +0.8438 0.7812 0.09375 +0.8438 0.7812 0.125 +0.8438 0.7812 0.1562 +0.8438 0.7812 0.1875 +0.8438 0.7812 0.2188 +0.8438 0.7812 0.25 +0.8438 0.7812 0.2812 +0.8438 0.7812 0.3125 +0.8438 0.7812 0.3438 +0.8438 0.7812 0.375 +0.8438 0.7812 0.4062 +0.8438 0.7812 0.4375 +0.8438 0.7812 0.4688 +0.8438 0.7812 0.5 +0.8438 0.7812 0.5312 +0.8438 0.7812 0.5625 +0.8438 0.7812 0.5938 +0.8438 0.7812 0.625 +0.8438 0.7812 0.6562 +0.8438 0.7812 0.6875 +0.8438 0.7812 0.7188 +0.8438 0.7812 0.75 +0.8438 0.7812 0.7812 +0.8438 0.7812 0.8125 +0.8438 0.7812 0.8438 +0.8438 0.7812 0.875 +0.8438 0.7812 0.9062 +0.8438 0.7812 0.9375 +0.8438 0.7812 0.9688 +0.8438 0.7812 1 +0.8438 0.8125 0 +0.8438 0.8125 0.03125 +0.8438 0.8125 0.0625 +0.8438 0.8125 0.09375 +0.8438 0.8125 0.125 +0.8438 0.8125 0.1562 +0.8438 0.8125 0.1875 +0.8438 0.8125 0.2188 +0.8438 0.8125 0.25 +0.8438 0.8125 0.2812 +0.8438 0.8125 0.3125 +0.8438 0.8125 0.3438 +0.8438 0.8125 0.375 +0.8438 0.8125 0.4062 +0.8438 0.8125 0.4375 +0.8438 0.8125 0.4688 +0.8438 0.8125 0.5 +0.8438 0.8125 0.5312 +0.8438 0.8125 0.5625 +0.8438 0.8125 0.5938 +0.8438 0.8125 0.625 +0.8438 0.8125 0.6562 +0.8438 0.8125 0.6875 +0.8438 0.8125 0.7188 +0.8438 0.8125 0.75 +0.8438 0.8125 0.7812 +0.8438 0.8125 0.8125 +0.8438 0.8125 0.8438 +0.8438 0.8125 0.875 +0.8438 0.8125 0.9062 +0.8438 0.8125 0.9375 +0.8438 0.8125 0.9688 +0.8438 0.8125 1 +0.8438 0.8438 0 +0.8438 0.8438 0.03125 +0.8438 0.8438 0.0625 +0.8438 0.8438 0.09375 +0.8438 0.8438 0.125 +0.8438 0.8438 0.1562 +0.8438 0.8438 0.1875 +0.8438 0.8438 0.2188 +0.8438 0.8438 0.25 +0.8438 0.8438 0.2812 +0.8438 0.8438 0.3125 +0.8438 0.8438 0.3438 +0.8438 0.8438 0.375 +0.8438 0.8438 0.4062 +0.8438 0.8438 0.4375 +0.8438 0.8438 0.4688 +0.8438 0.8438 0.5 +0.8438 0.8438 0.5312 +0.8438 0.8438 0.5625 +0.8438 0.8438 0.5938 +0.8438 0.8438 0.625 +0.8438 0.8438 0.6562 +0.8438 0.8438 0.6875 +0.8438 0.8438 0.7188 +0.8438 0.8438 0.75 +0.8438 0.8438 0.7812 +0.8438 0.8438 0.8125 +0.8438 0.8438 0.8438 +0.8438 0.8438 0.875 +0.8438 0.8438 0.9062 +0.8438 0.8438 0.9375 +0.8438 0.8438 0.9688 +0.8438 0.8438 1 +0.8438 0.875 0 +0.8438 0.875 0.03125 +0.8438 0.875 0.0625 +0.8438 0.875 0.09375 +0.8438 0.875 0.125 +0.8438 0.875 0.1562 +0.8438 0.875 0.1875 +0.8438 0.875 0.2188 +0.8438 0.875 0.25 +0.8438 0.875 0.2812 +0.8438 0.875 0.3125 +0.8438 0.875 0.3438 +0.8438 0.875 0.375 +0.8438 0.875 0.4062 +0.8438 0.875 0.4375 +0.8438 0.875 0.4688 +0.8438 0.875 0.5 +0.8438 0.875 0.5312 +0.8438 0.875 0.5625 +0.8438 0.875 0.5938 +0.8438 0.875 0.625 +0.8438 0.875 0.6562 +0.8438 0.875 0.6875 +0.8438 0.875 0.7188 +0.8438 0.875 0.75 +0.8438 0.875 0.7812 +0.8438 0.875 0.8125 +0.8438 0.875 0.8438 +0.8438 0.875 0.875 +0.8438 0.875 0.9062 +0.8438 0.875 0.9375 +0.8438 0.875 0.9688 +0.8438 0.875 1 +0.8438 0.9062 0 +0.8438 0.9062 0.03125 +0.8438 0.9062 0.0625 +0.8438 0.9062 0.09375 +0.8438 0.9062 0.125 +0.8438 0.9062 0.1562 +0.8438 0.9062 0.1875 +0.8438 0.9062 0.2188 +0.8438 0.9062 0.25 +0.8438 0.9062 0.2812 +0.8438 0.9062 0.3125 +0.8438 0.9062 0.3438 +0.8438 0.9062 0.375 +0.8438 0.9062 0.4062 +0.8438 0.9062 0.4375 +0.8438 0.9062 0.4688 +0.8438 0.9062 0.5 +0.8438 0.9062 0.5312 +0.8438 0.9062 0.5625 +0.8438 0.9062 0.5938 +0.8438 0.9062 0.625 +0.8438 0.9062 0.6562 +0.8438 0.9062 0.6875 +0.8438 0.9062 0.7188 +0.8438 0.9062 0.75 +0.8438 0.9062 0.7812 +0.8438 0.9062 0.8125 +0.8438 0.9062 0.8438 +0.8438 0.9062 0.875 +0.8438 0.9062 0.9062 +0.8438 0.9062 0.9375 +0.8438 0.9062 0.9688 +0.8438 0.9062 1 +0.8438 0.9375 0 +0.8438 0.9375 0.03125 +0.8438 0.9375 0.0625 +0.8438 0.9375 0.09375 +0.8438 0.9375 0.125 +0.8438 0.9375 0.1562 +0.8438 0.9375 0.1875 +0.8438 0.9375 0.2188 +0.8438 0.9375 0.25 +0.8438 0.9375 0.2812 +0.8438 0.9375 0.3125 +0.8438 0.9375 0.3438 +0.8438 0.9375 0.375 +0.8438 0.9375 0.4062 +0.8438 0.9375 0.4375 +0.8438 0.9375 0.4688 +0.8438 0.9375 0.5 +0.8438 0.9375 0.5312 +0.8438 0.9375 0.5625 +0.8438 0.9375 0.5938 +0.8438 0.9375 0.625 +0.8438 0.9375 0.6562 +0.8438 0.9375 0.6875 +0.8438 0.9375 0.7188 +0.8438 0.9375 0.75 +0.8438 0.9375 0.7812 +0.8438 0.9375 0.8125 +0.8438 0.9375 0.8438 +0.8438 0.9375 0.875 +0.8438 0.9375 0.9062 +0.8438 0.9375 0.9375 +0.8438 0.9375 0.9688 +0.8438 0.9375 1 +0.8438 0.9688 0 +0.8438 0.9688 0.03125 +0.8438 0.9688 0.0625 +0.8438 0.9688 0.09375 +0.8438 0.9688 0.125 +0.8438 0.9688 0.1562 +0.8438 0.9688 0.1875 +0.8438 0.9688 0.2188 +0.8438 0.9688 0.25 +0.8438 0.9688 0.2812 +0.8438 0.9688 0.3125 +0.8438 0.9688 0.3438 +0.8438 0.9688 0.375 +0.8438 0.9688 0.4062 +0.8438 0.9688 0.4375 +0.8438 0.9688 0.4688 +0.8438 0.9688 0.5 +0.8438 0.9688 0.5312 +0.8438 0.9688 0.5625 +0.8438 0.9688 0.5938 +0.8438 0.9688 0.625 +0.8438 0.9688 0.6562 +0.8438 0.9688 0.6875 +0.8438 0.9688 0.7188 +0.8438 0.9688 0.75 +0.8438 0.9688 0.7812 +0.8438 0.9688 0.8125 +0.8438 0.9688 0.8438 +0.8438 0.9688 0.875 +0.8438 0.9688 0.9062 +0.8438 0.9688 0.9375 +0.8438 0.9688 0.9688 +0.8438 0.9688 1 +0.8438 1 0 +0.8438 1 0.03125 +0.8438 1 0.0625 +0.8438 1 0.09375 +0.8438 1 0.125 +0.8438 1 0.1562 +0.8438 1 0.1875 +0.8438 1 0.2188 +0.8438 1 0.25 +0.8438 1 0.2812 +0.8438 1 0.3125 +0.8438 1 0.3438 +0.8438 1 0.375 +0.8438 1 0.4062 +0.8438 1 0.4375 +0.8438 1 0.4688 +0.8438 1 0.5 +0.8438 1 0.5312 +0.8438 1 0.5625 +0.8438 1 0.5938 +0.8438 1 0.625 +0.8438 1 0.6562 +0.8438 1 0.6875 +0.8438 1 0.7188 +0.8438 1 0.75 +0.8438 1 0.7812 +0.8438 1 0.8125 +0.8438 1 0.8438 +0.8438 1 0.875 +0.8438 1 0.9062 +0.8438 1 0.9375 +0.8438 1 0.9688 +0.8438 1 1 +0.875 0 0 +0.875 0 0.03125 +0.875 0 0.0625 +0.875 0 0.09375 +0.875 0 0.125 +0.875 0 0.1562 +0.875 0 0.1875 +0.875 0 0.2188 +0.875 0 0.25 +0.875 0 0.2812 +0.875 0 0.3125 +0.875 0 0.3438 +0.875 0 0.375 +0.875 0 0.4062 +0.875 0 0.4375 +0.875 0 0.4688 +0.875 0 0.5 +0.875 0 0.5312 +0.875 0 0.5625 +0.875 0 0.5938 +0.875 0 0.625 +0.875 0 0.6562 +0.875 0 0.6875 +0.875 0 0.7188 +0.875 0 0.75 +0.875 0 0.7812 +0.875 0 0.8125 +0.875 0 0.8438 +0.875 0 0.875 +0.875 0 0.9062 +0.875 0 0.9375 +0.875 0 0.9688 +0.875 0 1 +0.875 0.03125 0 +0.875 0.03125 0.03125 +0.875 0.03125 0.0625 +0.875 0.03125 0.09375 +0.875 0.03125 0.125 +0.875 0.03125 0.1562 +0.875 0.03125 0.1875 +0.875 0.03125 0.2188 +0.875 0.03125 0.25 +0.875 0.03125 0.2812 +0.875 0.03125 0.3125 +0.875 0.03125 0.3438 +0.875 0.03125 0.375 +0.875 0.03125 0.4062 +0.875 0.03125 0.4375 +0.875 0.03125 0.4688 +0.875 0.03125 0.5 +0.875 0.03125 0.5312 +0.875 0.03125 0.5625 +0.875 0.03125 0.5938 +0.875 0.03125 0.625 +0.875 0.03125 0.6562 +0.875 0.03125 0.6875 +0.875 0.03125 0.7188 +0.875 0.03125 0.75 +0.875 0.03125 0.7812 +0.875 0.03125 0.8125 +0.875 0.03125 0.8438 +0.875 0.03125 0.875 +0.875 0.03125 0.9062 +0.875 0.03125 0.9375 +0.875 0.03125 0.9688 +0.875 0.03125 1 +0.875 0.0625 0 +0.875 0.0625 0.03125 +0.875 0.0625 0.0625 +0.875 0.0625 0.09375 +0.875 0.0625 0.125 +0.875 0.0625 0.1562 +0.875 0.0625 0.1875 +0.875 0.0625 0.2188 +0.875 0.0625 0.25 +0.875 0.0625 0.2812 +0.875 0.0625 0.3125 +0.875 0.0625 0.3438 +0.875 0.0625 0.375 +0.875 0.0625 0.4062 +0.875 0.0625 0.4375 +0.875 0.0625 0.4688 +0.875 0.0625 0.5 +0.875 0.0625 0.5312 +0.875 0.0625 0.5625 +0.875 0.0625 0.5938 +0.875 0.0625 0.625 +0.875 0.0625 0.6562 +0.875 0.0625 0.6875 +0.875 0.0625 0.7188 +0.875 0.0625 0.75 +0.875 0.0625 0.7812 +0.875 0.0625 0.8125 +0.875 0.0625 0.8438 +0.875 0.0625 0.875 +0.875 0.0625 0.9062 +0.875 0.0625 0.9375 +0.875 0.0625 0.9688 +0.875 0.0625 1 +0.875 0.09375 0 +0.875 0.09375 0.03125 +0.875 0.09375 0.0625 +0.875 0.09375 0.09375 +0.875 0.09375 0.125 +0.875 0.09375 0.1562 +0.875 0.09375 0.1875 +0.875 0.09375 0.2188 +0.875 0.09375 0.25 +0.875 0.09375 0.2812 +0.875 0.09375 0.3125 +0.875 0.09375 0.3438 +0.875 0.09375 0.375 +0.875 0.09375 0.4062 +0.875 0.09375 0.4375 +0.875 0.09375 0.4688 +0.875 0.09375 0.5 +0.875 0.09375 0.5312 +0.875 0.09375 0.5625 +0.875 0.09375 0.5938 +0.875 0.09375 0.625 +0.875 0.09375 0.6562 +0.875 0.09375 0.6875 +0.875 0.09375 0.7188 +0.875 0.09375 0.75 +0.875 0.09375 0.7812 +0.875 0.09375 0.8125 +0.875 0.09375 0.8438 +0.875 0.09375 0.875 +0.875 0.09375 0.9062 +0.875 0.09375 0.9375 +0.875 0.09375 0.9688 +0.875 0.09375 1 +0.875 0.125 0 +0.875 0.125 0.03125 +0.875 0.125 0.0625 +0.875 0.125 0.09375 +0.875 0.125 0.125 +0.875 0.125 0.1562 +0.875 0.125 0.1875 +0.875 0.125 0.2188 +0.875 0.125 0.25 +0.875 0.125 0.2812 +0.875 0.125 0.3125 +0.875 0.125 0.3438 +0.875 0.125 0.375 +0.875 0.125 0.4062 +0.875 0.125 0.4375 +0.875 0.125 0.4688 +0.875 0.125 0.5 +0.875 0.125 0.5312 +0.875 0.125 0.5625 +0.875 0.125 0.5938 +0.875 0.125 0.625 +0.875 0.125 0.6562 +0.875 0.125 0.6875 +0.875 0.125 0.7188 +0.875 0.125 0.75 +0.875 0.125 0.7812 +0.875 0.125 0.8125 +0.875 0.125 0.8438 +0.875 0.125 0.875 +0.875 0.125 0.9062 +0.875 0.125 0.9375 +0.875 0.125 0.9688 +0.875 0.125 1 +0.875 0.1562 0 +0.875 0.1562 0.03125 +0.875 0.1562 0.0625 +0.875 0.1562 0.09375 +0.875 0.1562 0.125 +0.875 0.1562 0.1562 +0.875 0.1562 0.1875 +0.875 0.1562 0.2188 +0.875 0.1562 0.25 +0.875 0.1562 0.2812 +0.875 0.1562 0.3125 +0.875 0.1562 0.3438 +0.875 0.1562 0.375 +0.875 0.1562 0.4062 +0.875 0.1562 0.4375 +0.875 0.1562 0.4688 +0.875 0.1562 0.5 +0.875 0.1562 0.5312 +0.875 0.1562 0.5625 +0.875 0.1562 0.5938 +0.875 0.1562 0.625 +0.875 0.1562 0.6562 +0.875 0.1562 0.6875 +0.875 0.1562 0.7188 +0.875 0.1562 0.75 +0.875 0.1562 0.7812 +0.875 0.1562 0.8125 +0.875 0.1562 0.8438 +0.875 0.1562 0.875 +0.875 0.1562 0.9062 +0.875 0.1562 0.9375 +0.875 0.1562 0.9688 +0.875 0.1562 1 +0.875 0.1875 0 +0.875 0.1875 0.03125 +0.875 0.1875 0.0625 +0.875 0.1875 0.09375 +0.875 0.1875 0.125 +0.875 0.1875 0.1562 +0.875 0.1875 0.1875 +0.875 0.1875 0.2188 +0.875 0.1875 0.25 +0.875 0.1875 0.2812 +0.875 0.1875 0.3125 +0.875 0.1875 0.3438 +0.875 0.1875 0.375 +0.875 0.1875 0.4062 +0.875 0.1875 0.4375 +0.875 0.1875 0.4688 +0.875 0.1875 0.5 +0.875 0.1875 0.5312 +0.875 0.1875 0.5625 +0.875 0.1875 0.5938 +0.875 0.1875 0.625 +0.875 0.1875 0.6562 +0.875 0.1875 0.6875 +0.875 0.1875 0.7188 +0.875 0.1875 0.75 +0.875 0.1875 0.7812 +0.875 0.1875 0.8125 +0.875 0.1875 0.8438 +0.875 0.1875 0.875 +0.875 0.1875 0.9062 +0.875 0.1875 0.9375 +0.875 0.1875 0.9688 +0.875 0.1875 1 +0.875 0.2188 0 +0.875 0.2188 0.03125 +0.875 0.2188 0.0625 +0.875 0.2188 0.09375 +0.875 0.2188 0.125 +0.875 0.2188 0.1562 +0.875 0.2188 0.1875 +0.875 0.2188 0.2188 +0.875 0.2188 0.25 +0.875 0.2188 0.2812 +0.875 0.2188 0.3125 +0.875 0.2188 0.3438 +0.875 0.2188 0.375 +0.875 0.2188 0.4062 +0.875 0.2188 0.4375 +0.875 0.2188 0.4688 +0.875 0.2188 0.5 +0.875 0.2188 0.5312 +0.875 0.2188 0.5625 +0.875 0.2188 0.5938 +0.875 0.2188 0.625 +0.875 0.2188 0.6562 +0.875 0.2188 0.6875 +0.875 0.2188 0.7188 +0.875 0.2188 0.75 +0.875 0.2188 0.7812 +0.875 0.2188 0.8125 +0.875 0.2188 0.8438 +0.875 0.2188 0.875 +0.875 0.2188 0.9062 +0.875 0.2188 0.9375 +0.875 0.2188 0.9688 +0.875 0.2188 1 +0.875 0.25 0 +0.875 0.25 0.03125 +0.875 0.25 0.0625 +0.875 0.25 0.09375 +0.875 0.25 0.125 +0.875 0.25 0.1562 +0.875 0.25 0.1875 +0.875 0.25 0.2188 +0.875 0.25 0.25 +0.875 0.25 0.2812 +0.875 0.25 0.3125 +0.875 0.25 0.3438 +0.875 0.25 0.375 +0.875 0.25 0.4062 +0.875 0.25 0.4375 +0.875 0.25 0.4688 +0.875 0.25 0.5 +0.875 0.25 0.5312 +0.875 0.25 0.5625 +0.875 0.25 0.5938 +0.875 0.25 0.625 +0.875 0.25 0.6562 +0.875 0.25 0.6875 +0.875 0.25 0.7188 +0.875 0.25 0.75 +0.875 0.25 0.7812 +0.875 0.25 0.8125 +0.875 0.25 0.8438 +0.875 0.25 0.875 +0.875 0.25 0.9062 +0.875 0.25 0.9375 +0.875 0.25 0.9688 +0.875 0.25 1 +0.875 0.2812 0 +0.875 0.2812 0.03125 +0.875 0.2812 0.0625 +0.875 0.2812 0.09375 +0.875 0.2812 0.125 +0.875 0.2812 0.1562 +0.875 0.2812 0.1875 +0.875 0.2812 0.2188 +0.875 0.2812 0.25 +0.875 0.2812 0.2812 +0.875 0.2812 0.3125 +0.875 0.2812 0.3438 +0.875 0.2812 0.375 +0.875 0.2812 0.4062 +0.875 0.2812 0.4375 +0.875 0.2812 0.4688 +0.875 0.2812 0.5 +0.875 0.2812 0.5312 +0.875 0.2812 0.5625 +0.875 0.2812 0.5938 +0.875 0.2812 0.625 +0.875 0.2812 0.6562 +0.875 0.2812 0.6875 +0.875 0.2812 0.7188 +0.875 0.2812 0.75 +0.875 0.2812 0.7812 +0.875 0.2812 0.8125 +0.875 0.2812 0.8438 +0.875 0.2812 0.875 +0.875 0.2812 0.9062 +0.875 0.2812 0.9375 +0.875 0.2812 0.9688 +0.875 0.2812 1 +0.875 0.3125 0 +0.875 0.3125 0.03125 +0.875 0.3125 0.0625 +0.875 0.3125 0.09375 +0.875 0.3125 0.125 +0.875 0.3125 0.1562 +0.875 0.3125 0.1875 +0.875 0.3125 0.2188 +0.875 0.3125 0.25 +0.875 0.3125 0.2812 +0.875 0.3125 0.3125 +0.875 0.3125 0.3438 +0.875 0.3125 0.375 +0.875 0.3125 0.4062 +0.875 0.3125 0.4375 +0.875 0.3125 0.4688 +0.875 0.3125 0.5 +0.875 0.3125 0.5312 +0.875 0.3125 0.5625 +0.875 0.3125 0.5938 +0.875 0.3125 0.625 +0.875 0.3125 0.6562 +0.875 0.3125 0.6875 +0.875 0.3125 0.7188 +0.875 0.3125 0.75 +0.875 0.3125 0.7812 +0.875 0.3125 0.8125 +0.875 0.3125 0.8438 +0.875 0.3125 0.875 +0.875 0.3125 0.9062 +0.875 0.3125 0.9375 +0.875 0.3125 0.9688 +0.875 0.3125 1 +0.875 0.3438 0 +0.875 0.3438 0.03125 +0.875 0.3438 0.0625 +0.875 0.3438 0.09375 +0.875 0.3438 0.125 +0.875 0.3438 0.1562 +0.875 0.3438 0.1875 +0.875 0.3438 0.2188 +0.875 0.3438 0.25 +0.875 0.3438 0.2812 +0.875 0.3438 0.3125 +0.875 0.3438 0.3438 +0.875 0.3438 0.375 +0.875 0.3438 0.4062 +0.875 0.3438 0.4375 +0.875 0.3438 0.4688 +0.875 0.3438 0.5 +0.875 0.3438 0.5312 +0.875 0.3438 0.5625 +0.875 0.3438 0.5938 +0.875 0.3438 0.625 +0.875 0.3438 0.6562 +0.875 0.3438 0.6875 +0.875 0.3438 0.7188 +0.875 0.3438 0.75 +0.875 0.3438 0.7812 +0.875 0.3438 0.8125 +0.875 0.3438 0.8438 +0.875 0.3438 0.875 +0.875 0.3438 0.9062 +0.875 0.3438 0.9375 +0.875 0.3438 0.9688 +0.875 0.3438 1 +0.875 0.375 0 +0.875 0.375 0.03125 +0.875 0.375 0.0625 +0.875 0.375 0.09375 +0.875 0.375 0.125 +0.875 0.375 0.1562 +0.875 0.375 0.1875 +0.875 0.375 0.2188 +0.875 0.375 0.25 +0.875 0.375 0.2812 +0.875 0.375 0.3125 +0.875 0.375 0.3438 +0.875 0.375 0.375 +0.875 0.375 0.4062 +0.875 0.375 0.4375 +0.875 0.375 0.4688 +0.875 0.375 0.5 +0.875 0.375 0.5312 +0.875 0.375 0.5625 +0.875 0.375 0.5938 +0.875 0.375 0.625 +0.875 0.375 0.6562 +0.875 0.375 0.6875 +0.875 0.375 0.7188 +0.875 0.375 0.75 +0.875 0.375 0.7812 +0.875 0.375 0.8125 +0.875 0.375 0.8438 +0.875 0.375 0.875 +0.875 0.375 0.9062 +0.875 0.375 0.9375 +0.875 0.375 0.9688 +0.875 0.375 1 +0.875 0.4062 0 +0.875 0.4062 0.03125 +0.875 0.4062 0.0625 +0.875 0.4062 0.09375 +0.875 0.4062 0.125 +0.875 0.4062 0.1562 +0.875 0.4062 0.1875 +0.875 0.4062 0.2188 +0.875 0.4062 0.25 +0.875 0.4062 0.2812 +0.875 0.4062 0.3125 +0.875 0.4062 0.3438 +0.875 0.4062 0.375 +0.875 0.4062 0.4062 +0.875 0.4062 0.4375 +0.875 0.4062 0.4688 +0.875 0.4062 0.5 +0.875 0.4062 0.5312 +0.875 0.4062 0.5625 +0.875 0.4062 0.5938 +0.875 0.4062 0.625 +0.875 0.4062 0.6562 +0.875 0.4062 0.6875 +0.875 0.4062 0.7188 +0.875 0.4062 0.75 +0.875 0.4062 0.7812 +0.875 0.4062 0.8125 +0.875 0.4062 0.8438 +0.875 0.4062 0.875 +0.875 0.4062 0.9062 +0.875 0.4062 0.9375 +0.875 0.4062 0.9688 +0.875 0.4062 1 +0.875 0.4375 0 +0.875 0.4375 0.03125 +0.875 0.4375 0.0625 +0.875 0.4375 0.09375 +0.875 0.4375 0.125 +0.875 0.4375 0.1562 +0.875 0.4375 0.1875 +0.875 0.4375 0.2188 +0.875 0.4375 0.25 +0.875 0.4375 0.2812 +0.875 0.4375 0.3125 +0.875 0.4375 0.3438 +0.875 0.4375 0.375 +0.875 0.4375 0.4062 +0.875 0.4375 0.4375 +0.875 0.4375 0.4688 +0.875 0.4375 0.5 +0.875 0.4375 0.5312 +0.875 0.4375 0.5625 +0.875 0.4375 0.5938 +0.875 0.4375 0.625 +0.875 0.4375 0.6562 +0.875 0.4375 0.6875 +0.875 0.4375 0.7188 +0.875 0.4375 0.75 +0.875 0.4375 0.7812 +0.875 0.4375 0.8125 +0.875 0.4375 0.8438 +0.875 0.4375 0.875 +0.875 0.4375 0.9062 +0.875 0.4375 0.9375 +0.875 0.4375 0.9688 +0.875 0.4375 1 +0.875 0.4688 0 +0.875 0.4688 0.03125 +0.875 0.4688 0.0625 +0.875 0.4688 0.09375 +0.875 0.4688 0.125 +0.875 0.4688 0.1562 +0.875 0.4688 0.1875 +0.875 0.4688 0.2188 +0.875 0.4688 0.25 +0.875 0.4688 0.2812 +0.875 0.4688 0.3125 +0.875 0.4688 0.3438 +0.875 0.4688 0.375 +0.875 0.4688 0.4062 +0.875 0.4688 0.4375 +0.875 0.4688 0.4688 +0.875 0.4688 0.5 +0.875 0.4688 0.5312 +0.875 0.4688 0.5625 +0.875 0.4688 0.5938 +0.875 0.4688 0.625 +0.875 0.4688 0.6562 +0.875 0.4688 0.6875 +0.875 0.4688 0.7188 +0.875 0.4688 0.75 +0.875 0.4688 0.7812 +0.875 0.4688 0.8125 +0.875 0.4688 0.8438 +0.875 0.4688 0.875 +0.875 0.4688 0.9062 +0.875 0.4688 0.9375 +0.875 0.4688 0.9688 +0.875 0.4688 1 +0.875 0.5 0 +0.875 0.5 0.03125 +0.875 0.5 0.0625 +0.875 0.5 0.09375 +0.875 0.5 0.125 +0.875 0.5 0.1562 +0.875 0.5 0.1875 +0.875 0.5 0.2188 +0.875 0.5 0.25 +0.875 0.5 0.2812 +0.875 0.5 0.3125 +0.875 0.5 0.3438 +0.875 0.5 0.375 +0.875 0.5 0.4062 +0.875 0.5 0.4375 +0.875 0.5 0.4688 +0.875 0.5 0.5 +0.875 0.5 0.5312 +0.875 0.5 0.5625 +0.875 0.5 0.5938 +0.875 0.5 0.625 +0.875 0.5 0.6562 +0.875 0.5 0.6875 +0.875 0.5 0.7188 +0.875 0.5 0.75 +0.875 0.5 0.7812 +0.875 0.5 0.8125 +0.875 0.5 0.8438 +0.875 0.5 0.875 +0.875 0.5 0.9062 +0.875 0.5 0.9375 +0.875 0.5 0.9688 +0.875 0.5 1 +0.875 0.5312 0 +0.875 0.5312 0.03125 +0.875 0.5312 0.0625 +0.875 0.5312 0.09375 +0.875 0.5312 0.125 +0.875 0.5312 0.1562 +0.875 0.5312 0.1875 +0.875 0.5312 0.2188 +0.875 0.5312 0.25 +0.875 0.5312 0.2812 +0.875 0.5312 0.3125 +0.875 0.5312 0.3438 +0.875 0.5312 0.375 +0.875 0.5312 0.4062 +0.875 0.5312 0.4375 +0.875 0.5312 0.4688 +0.875 0.5312 0.5 +0.875 0.5312 0.5312 +0.875 0.5312 0.5625 +0.875 0.5312 0.5938 +0.875 0.5312 0.625 +0.875 0.5312 0.6562 +0.875 0.5312 0.6875 +0.875 0.5312 0.7188 +0.875 0.5312 0.75 +0.875 0.5312 0.7812 +0.875 0.5312 0.8125 +0.875 0.5312 0.8438 +0.875 0.5312 0.875 +0.875 0.5312 0.9062 +0.875 0.5312 0.9375 +0.875 0.5312 0.9688 +0.875 0.5312 1 +0.875 0.5625 0 +0.875 0.5625 0.03125 +0.875 0.5625 0.0625 +0.875 0.5625 0.09375 +0.875 0.5625 0.125 +0.875 0.5625 0.1562 +0.875 0.5625 0.1875 +0.875 0.5625 0.2188 +0.875 0.5625 0.25 +0.875 0.5625 0.2812 +0.875 0.5625 0.3125 +0.875 0.5625 0.3438 +0.875 0.5625 0.375 +0.875 0.5625 0.4062 +0.875 0.5625 0.4375 +0.875 0.5625 0.4688 +0.875 0.5625 0.5 +0.875 0.5625 0.5312 +0.875 0.5625 0.5625 +0.875 0.5625 0.5938 +0.875 0.5625 0.625 +0.875 0.5625 0.6562 +0.875 0.5625 0.6875 +0.875 0.5625 0.7188 +0.875 0.5625 0.75 +0.875 0.5625 0.7812 +0.875 0.5625 0.8125 +0.875 0.5625 0.8438 +0.875 0.5625 0.875 +0.875 0.5625 0.9062 +0.875 0.5625 0.9375 +0.875 0.5625 0.9688 +0.875 0.5625 1 +0.875 0.5938 0 +0.875 0.5938 0.03125 +0.875 0.5938 0.0625 +0.875 0.5938 0.09375 +0.875 0.5938 0.125 +0.875 0.5938 0.1562 +0.875 0.5938 0.1875 +0.875 0.5938 0.2188 +0.875 0.5938 0.25 +0.875 0.5938 0.2812 +0.875 0.5938 0.3125 +0.875 0.5938 0.3438 +0.875 0.5938 0.375 +0.875 0.5938 0.4062 +0.875 0.5938 0.4375 +0.875 0.5938 0.4688 +0.875 0.5938 0.5 +0.875 0.5938 0.5312 +0.875 0.5938 0.5625 +0.875 0.5938 0.5938 +0.875 0.5938 0.625 +0.875 0.5938 0.6562 +0.875 0.5938 0.6875 +0.875 0.5938 0.7188 +0.875 0.5938 0.75 +0.875 0.5938 0.7812 +0.875 0.5938 0.8125 +0.875 0.5938 0.8438 +0.875 0.5938 0.875 +0.875 0.5938 0.9062 +0.875 0.5938 0.9375 +0.875 0.5938 0.9688 +0.875 0.5938 1 +0.875 0.625 0 +0.875 0.625 0.03125 +0.875 0.625 0.0625 +0.875 0.625 0.09375 +0.875 0.625 0.125 +0.875 0.625 0.1562 +0.875 0.625 0.1875 +0.875 0.625 0.2188 +0.875 0.625 0.25 +0.875 0.625 0.2812 +0.875 0.625 0.3125 +0.875 0.625 0.3438 +0.875 0.625 0.375 +0.875 0.625 0.4062 +0.875 0.625 0.4375 +0.875 0.625 0.4688 +0.875 0.625 0.5 +0.875 0.625 0.5312 +0.875 0.625 0.5625 +0.875 0.625 0.5938 +0.875 0.625 0.625 +0.875 0.625 0.6562 +0.875 0.625 0.6875 +0.875 0.625 0.7188 +0.875 0.625 0.75 +0.875 0.625 0.7812 +0.875 0.625 0.8125 +0.875 0.625 0.8438 +0.875 0.625 0.875 +0.875 0.625 0.9062 +0.875 0.625 0.9375 +0.875 0.625 0.9688 +0.875 0.625 1 +0.875 0.6562 0 +0.875 0.6562 0.03125 +0.875 0.6562 0.0625 +0.875 0.6562 0.09375 +0.875 0.6562 0.125 +0.875 0.6562 0.1562 +0.875 0.6562 0.1875 +0.875 0.6562 0.2188 +0.875 0.6562 0.25 +0.875 0.6562 0.2812 +0.875 0.6562 0.3125 +0.875 0.6562 0.3438 +0.875 0.6562 0.375 +0.875 0.6562 0.4062 +0.875 0.6562 0.4375 +0.875 0.6562 0.4688 +0.875 0.6562 0.5 +0.875 0.6562 0.5312 +0.875 0.6562 0.5625 +0.875 0.6562 0.5938 +0.875 0.6562 0.625 +0.875 0.6562 0.6562 +0.875 0.6562 0.6875 +0.875 0.6562 0.7188 +0.875 0.6562 0.75 +0.875 0.6562 0.7812 +0.875 0.6562 0.8125 +0.875 0.6562 0.8438 +0.875 0.6562 0.875 +0.875 0.6562 0.9062 +0.875 0.6562 0.9375 +0.875 0.6562 0.9688 +0.875 0.6562 1 +0.875 0.6875 0 +0.875 0.6875 0.03125 +0.875 0.6875 0.0625 +0.875 0.6875 0.09375 +0.875 0.6875 0.125 +0.875 0.6875 0.1562 +0.875 0.6875 0.1875 +0.875 0.6875 0.2188 +0.875 0.6875 0.25 +0.875 0.6875 0.2812 +0.875 0.6875 0.3125 +0.875 0.6875 0.3438 +0.875 0.6875 0.375 +0.875 0.6875 0.4062 +0.875 0.6875 0.4375 +0.875 0.6875 0.4688 +0.875 0.6875 0.5 +0.875 0.6875 0.5312 +0.875 0.6875 0.5625 +0.875 0.6875 0.5938 +0.875 0.6875 0.625 +0.875 0.6875 0.6562 +0.875 0.6875 0.6875 +0.875 0.6875 0.7188 +0.875 0.6875 0.75 +0.875 0.6875 0.7812 +0.875 0.6875 0.8125 +0.875 0.6875 0.8438 +0.875 0.6875 0.875 +0.875 0.6875 0.9062 +0.875 0.6875 0.9375 +0.875 0.6875 0.9688 +0.875 0.6875 1 +0.875 0.7188 0 +0.875 0.7188 0.03125 +0.875 0.7188 0.0625 +0.875 0.7188 0.09375 +0.875 0.7188 0.125 +0.875 0.7188 0.1562 +0.875 0.7188 0.1875 +0.875 0.7188 0.2188 +0.875 0.7188 0.25 +0.875 0.7188 0.2812 +0.875 0.7188 0.3125 +0.875 0.7188 0.3438 +0.875 0.7188 0.375 +0.875 0.7188 0.4062 +0.875 0.7188 0.4375 +0.875 0.7188 0.4688 +0.875 0.7188 0.5 +0.875 0.7188 0.5312 +0.875 0.7188 0.5625 +0.875 0.7188 0.5938 +0.875 0.7188 0.625 +0.875 0.7188 0.6562 +0.875 0.7188 0.6875 +0.875 0.7188 0.7188 +0.875 0.7188 0.75 +0.875 0.7188 0.7812 +0.875 0.7188 0.8125 +0.875 0.7188 0.8438 +0.875 0.7188 0.875 +0.875 0.7188 0.9062 +0.875 0.7188 0.9375 +0.875 0.7188 0.9688 +0.875 0.7188 1 +0.875 0.75 0 +0.875 0.75 0.03125 +0.875 0.75 0.0625 +0.875 0.75 0.09375 +0.875 0.75 0.125 +0.875 0.75 0.1562 +0.875 0.75 0.1875 +0.875 0.75 0.2188 +0.875 0.75 0.25 +0.875 0.75 0.2812 +0.875 0.75 0.3125 +0.875 0.75 0.3438 +0.875 0.75 0.375 +0.875 0.75 0.4062 +0.875 0.75 0.4375 +0.875 0.75 0.4688 +0.875 0.75 0.5 +0.875 0.75 0.5312 +0.875 0.75 0.5625 +0.875 0.75 0.5938 +0.875 0.75 0.625 +0.875 0.75 0.6562 +0.875 0.75 0.6875 +0.875 0.75 0.7188 +0.875 0.75 0.75 +0.875 0.75 0.7812 +0.875 0.75 0.8125 +0.875 0.75 0.8438 +0.875 0.75 0.875 +0.875 0.75 0.9062 +0.875 0.75 0.9375 +0.875 0.75 0.9688 +0.875 0.75 1 +0.875 0.7812 0 +0.875 0.7812 0.03125 +0.875 0.7812 0.0625 +0.875 0.7812 0.09375 +0.875 0.7812 0.125 +0.875 0.7812 0.1562 +0.875 0.7812 0.1875 +0.875 0.7812 0.2188 +0.875 0.7812 0.25 +0.875 0.7812 0.2812 +0.875 0.7812 0.3125 +0.875 0.7812 0.3438 +0.875 0.7812 0.375 +0.875 0.7812 0.4062 +0.875 0.7812 0.4375 +0.875 0.7812 0.4688 +0.875 0.7812 0.5 +0.875 0.7812 0.5312 +0.875 0.7812 0.5625 +0.875 0.7812 0.5938 +0.875 0.7812 0.625 +0.875 0.7812 0.6562 +0.875 0.7812 0.6875 +0.875 0.7812 0.7188 +0.875 0.7812 0.75 +0.875 0.7812 0.7812 +0.875 0.7812 0.8125 +0.875 0.7812 0.8438 +0.875 0.7812 0.875 +0.875 0.7812 0.9062 +0.875 0.7812 0.9375 +0.875 0.7812 0.9688 +0.875 0.7812 1 +0.875 0.8125 0 +0.875 0.8125 0.03125 +0.875 0.8125 0.0625 +0.875 0.8125 0.09375 +0.875 0.8125 0.125 +0.875 0.8125 0.1562 +0.875 0.8125 0.1875 +0.875 0.8125 0.2188 +0.875 0.8125 0.25 +0.875 0.8125 0.2812 +0.875 0.8125 0.3125 +0.875 0.8125 0.3438 +0.875 0.8125 0.375 +0.875 0.8125 0.4062 +0.875 0.8125 0.4375 +0.875 0.8125 0.4688 +0.875 0.8125 0.5 +0.875 0.8125 0.5312 +0.875 0.8125 0.5625 +0.875 0.8125 0.5938 +0.875 0.8125 0.625 +0.875 0.8125 0.6562 +0.875 0.8125 0.6875 +0.875 0.8125 0.7188 +0.875 0.8125 0.75 +0.875 0.8125 0.7812 +0.875 0.8125 0.8125 +0.875 0.8125 0.8438 +0.875 0.8125 0.875 +0.875 0.8125 0.9062 +0.875 0.8125 0.9375 +0.875 0.8125 0.9688 +0.875 0.8125 1 +0.875 0.8438 0 +0.875 0.8438 0.03125 +0.875 0.8438 0.0625 +0.875 0.8438 0.09375 +0.875 0.8438 0.125 +0.875 0.8438 0.1562 +0.875 0.8438 0.1875 +0.875 0.8438 0.2188 +0.875 0.8438 0.25 +0.875 0.8438 0.2812 +0.875 0.8438 0.3125 +0.875 0.8438 0.3438 +0.875 0.8438 0.375 +0.875 0.8438 0.4062 +0.875 0.8438 0.4375 +0.875 0.8438 0.4688 +0.875 0.8438 0.5 +0.875 0.8438 0.5312 +0.875 0.8438 0.5625 +0.875 0.8438 0.5938 +0.875 0.8438 0.625 +0.875 0.8438 0.6562 +0.875 0.8438 0.6875 +0.875 0.8438 0.7188 +0.875 0.8438 0.75 +0.875 0.8438 0.7812 +0.875 0.8438 0.8125 +0.875 0.8438 0.8438 +0.875 0.8438 0.875 +0.875 0.8438 0.9062 +0.875 0.8438 0.9375 +0.875 0.8438 0.9688 +0.875 0.8438 1 +0.875 0.875 0 +0.875 0.875 0.03125 +0.875 0.875 0.0625 +0.875 0.875 0.09375 +0.875 0.875 0.125 +0.875 0.875 0.1562 +0.875 0.875 0.1875 +0.875 0.875 0.2188 +0.875 0.875 0.25 +0.875 0.875 0.2812 +0.875 0.875 0.3125 +0.875 0.875 0.3438 +0.875 0.875 0.375 +0.875 0.875 0.4062 +0.875 0.875 0.4375 +0.875 0.875 0.4688 +0.875 0.875 0.5 +0.875 0.875 0.5312 +0.875 0.875 0.5625 +0.875 0.875 0.5938 +0.875 0.875 0.625 +0.875 0.875 0.6562 +0.875 0.875 0.6875 +0.875 0.875 0.7188 +0.875 0.875 0.75 +0.875 0.875 0.7812 +0.875 0.875 0.8125 +0.875 0.875 0.8438 +0.875 0.875 0.875 +0.875 0.875 0.9062 +0.875 0.875 0.9375 +0.875 0.875 0.9688 +0.875 0.875 1 +0.875 0.9062 0 +0.875 0.9062 0.03125 +0.875 0.9062 0.0625 +0.875 0.9062 0.09375 +0.875 0.9062 0.125 +0.875 0.9062 0.1562 +0.875 0.9062 0.1875 +0.875 0.9062 0.2188 +0.875 0.9062 0.25 +0.875 0.9062 0.2812 +0.875 0.9062 0.3125 +0.875 0.9062 0.3438 +0.875 0.9062 0.375 +0.875 0.9062 0.4062 +0.875 0.9062 0.4375 +0.875 0.9062 0.4688 +0.875 0.9062 0.5 +0.875 0.9062 0.5312 +0.875 0.9062 0.5625 +0.875 0.9062 0.5938 +0.875 0.9062 0.625 +0.875 0.9062 0.6562 +0.875 0.9062 0.6875 +0.875 0.9062 0.7188 +0.875 0.9062 0.75 +0.875 0.9062 0.7812 +0.875 0.9062 0.8125 +0.875 0.9062 0.8438 +0.875 0.9062 0.875 +0.875 0.9062 0.9062 +0.875 0.9062 0.9375 +0.875 0.9062 0.9688 +0.875 0.9062 1 +0.875 0.9375 0 +0.875 0.9375 0.03125 +0.875 0.9375 0.0625 +0.875 0.9375 0.09375 +0.875 0.9375 0.125 +0.875 0.9375 0.1562 +0.875 0.9375 0.1875 +0.875 0.9375 0.2188 +0.875 0.9375 0.25 +0.875 0.9375 0.2812 +0.875 0.9375 0.3125 +0.875 0.9375 0.3438 +0.875 0.9375 0.375 +0.875 0.9375 0.4062 +0.875 0.9375 0.4375 +0.875 0.9375 0.4688 +0.875 0.9375 0.5 +0.875 0.9375 0.5312 +0.875 0.9375 0.5625 +0.875 0.9375 0.5938 +0.875 0.9375 0.625 +0.875 0.9375 0.6562 +0.875 0.9375 0.6875 +0.875 0.9375 0.7188 +0.875 0.9375 0.75 +0.875 0.9375 0.7812 +0.875 0.9375 0.8125 +0.875 0.9375 0.8438 +0.875 0.9375 0.875 +0.875 0.9375 0.9062 +0.875 0.9375 0.9375 +0.875 0.9375 0.9688 +0.875 0.9375 1 +0.875 0.9688 0 +0.875 0.9688 0.03125 +0.875 0.9688 0.0625 +0.875 0.9688 0.09375 +0.875 0.9688 0.125 +0.875 0.9688 0.1562 +0.875 0.9688 0.1875 +0.875 0.9688 0.2188 +0.875 0.9688 0.25 +0.875 0.9688 0.2812 +0.875 0.9688 0.3125 +0.875 0.9688 0.3438 +0.875 0.9688 0.375 +0.875 0.9688 0.4062 +0.875 0.9688 0.4375 +0.875 0.9688 0.4688 +0.875 0.9688 0.5 +0.875 0.9688 0.5312 +0.875 0.9688 0.5625 +0.875 0.9688 0.5938 +0.875 0.9688 0.625 +0.875 0.9688 0.6562 +0.875 0.9688 0.6875 +0.875 0.9688 0.7188 +0.875 0.9688 0.75 +0.875 0.9688 0.7812 +0.875 0.9688 0.8125 +0.875 0.9688 0.8438 +0.875 0.9688 0.875 +0.875 0.9688 0.9062 +0.875 0.9688 0.9375 +0.875 0.9688 0.9688 +0.875 0.9688 1 +0.875 1 0 +0.875 1 0.03125 +0.875 1 0.0625 +0.875 1 0.09375 +0.875 1 0.125 +0.875 1 0.1562 +0.875 1 0.1875 +0.875 1 0.2188 +0.875 1 0.25 +0.875 1 0.2812 +0.875 1 0.3125 +0.875 1 0.3438 +0.875 1 0.375 +0.875 1 0.4062 +0.875 1 0.4375 +0.875 1 0.4688 +0.875 1 0.5 +0.875 1 0.5312 +0.875 1 0.5625 +0.875 1 0.5938 +0.875 1 0.625 +0.875 1 0.6562 +0.875 1 0.6875 +0.875 1 0.7188 +0.875 1 0.75 +0.875 1 0.7812 +0.875 1 0.8125 +0.875 1 0.8438 +0.875 1 0.875 +0.875 1 0.9062 +0.875 1 0.9375 +0.875 1 0.9688 +0.875 1 1 +0.9062 0 0 +0.9062 0 0.03125 +0.9062 0 0.0625 +0.9062 0 0.09375 +0.9062 0 0.125 +0.9062 0 0.1562 +0.9062 0 0.1875 +0.9062 0 0.2188 +0.9062 0 0.25 +0.9062 0 0.2812 +0.9062 0 0.3125 +0.9062 0 0.3438 +0.9062 0 0.375 +0.9062 0 0.4062 +0.9062 0 0.4375 +0.9062 0 0.4688 +0.9062 0 0.5 +0.9062 0 0.5312 +0.9062 0 0.5625 +0.9062 0 0.5938 +0.9062 0 0.625 +0.9062 0 0.6562 +0.9062 0 0.6875 +0.9062 0 0.7188 +0.9062 0 0.75 +0.9062 0 0.7812 +0.9062 0 0.8125 +0.9062 0 0.8438 +0.9062 0 0.875 +0.9062 0 0.9062 +0.9062 0 0.9375 +0.9062 0 0.9688 +0.9062 0 1 +0.9062 0.03125 0 +0.9062 0.03125 0.03125 +0.9062 0.03125 0.0625 +0.9062 0.03125 0.09375 +0.9062 0.03125 0.125 +0.9062 0.03125 0.1562 +0.9062 0.03125 0.1875 +0.9062 0.03125 0.2188 +0.9062 0.03125 0.25 +0.9062 0.03125 0.2812 +0.9062 0.03125 0.3125 +0.9062 0.03125 0.3438 +0.9062 0.03125 0.375 +0.9062 0.03125 0.4062 +0.9062 0.03125 0.4375 +0.9062 0.03125 0.4688 +0.9062 0.03125 0.5 +0.9062 0.03125 0.5312 +0.9062 0.03125 0.5625 +0.9062 0.03125 0.5938 +0.9062 0.03125 0.625 +0.9062 0.03125 0.6562 +0.9062 0.03125 0.6875 +0.9062 0.03125 0.7188 +0.9062 0.03125 0.75 +0.9062 0.03125 0.7812 +0.9062 0.03125 0.8125 +0.9062 0.03125 0.8438 +0.9062 0.03125 0.875 +0.9062 0.03125 0.9062 +0.9062 0.03125 0.9375 +0.9062 0.03125 0.9688 +0.9062 0.03125 1 +0.9062 0.0625 0 +0.9062 0.0625 0.03125 +0.9062 0.0625 0.0625 +0.9062 0.0625 0.09375 +0.9062 0.0625 0.125 +0.9062 0.0625 0.1562 +0.9062 0.0625 0.1875 +0.9062 0.0625 0.2188 +0.9062 0.0625 0.25 +0.9062 0.0625 0.2812 +0.9062 0.0625 0.3125 +0.9062 0.0625 0.3438 +0.9062 0.0625 0.375 +0.9062 0.0625 0.4062 +0.9062 0.0625 0.4375 +0.9062 0.0625 0.4688 +0.9062 0.0625 0.5 +0.9062 0.0625 0.5312 +0.9062 0.0625 0.5625 +0.9062 0.0625 0.5938 +0.9062 0.0625 0.625 +0.9062 0.0625 0.6562 +0.9062 0.0625 0.6875 +0.9062 0.0625 0.7188 +0.9062 0.0625 0.75 +0.9062 0.0625 0.7812 +0.9062 0.0625 0.8125 +0.9062 0.0625 0.8438 +0.9062 0.0625 0.875 +0.9062 0.0625 0.9062 +0.9062 0.0625 0.9375 +0.9062 0.0625 0.9688 +0.9062 0.0625 1 +0.9062 0.09375 0 +0.9062 0.09375 0.03125 +0.9062 0.09375 0.0625 +0.9062 0.09375 0.09375 +0.9062 0.09375 0.125 +0.9062 0.09375 0.1562 +0.9062 0.09375 0.1875 +0.9062 0.09375 0.2188 +0.9062 0.09375 0.25 +0.9062 0.09375 0.2812 +0.9062 0.09375 0.3125 +0.9062 0.09375 0.3438 +0.9062 0.09375 0.375 +0.9062 0.09375 0.4062 +0.9062 0.09375 0.4375 +0.9062 0.09375 0.4688 +0.9062 0.09375 0.5 +0.9062 0.09375 0.5312 +0.9062 0.09375 0.5625 +0.9062 0.09375 0.5938 +0.9062 0.09375 0.625 +0.9062 0.09375 0.6562 +0.9062 0.09375 0.6875 +0.9062 0.09375 0.7188 +0.9062 0.09375 0.75 +0.9062 0.09375 0.7812 +0.9062 0.09375 0.8125 +0.9062 0.09375 0.8438 +0.9062 0.09375 0.875 +0.9062 0.09375 0.9062 +0.9062 0.09375 0.9375 +0.9062 0.09375 0.9688 +0.9062 0.09375 1 +0.9062 0.125 0 +0.9062 0.125 0.03125 +0.9062 0.125 0.0625 +0.9062 0.125 0.09375 +0.9062 0.125 0.125 +0.9062 0.125 0.1562 +0.9062 0.125 0.1875 +0.9062 0.125 0.2188 +0.9062 0.125 0.25 +0.9062 0.125 0.2812 +0.9062 0.125 0.3125 +0.9062 0.125 0.3438 +0.9062 0.125 0.375 +0.9062 0.125 0.4062 +0.9062 0.125 0.4375 +0.9062 0.125 0.4688 +0.9062 0.125 0.5 +0.9062 0.125 0.5312 +0.9062 0.125 0.5625 +0.9062 0.125 0.5938 +0.9062 0.125 0.625 +0.9062 0.125 0.6562 +0.9062 0.125 0.6875 +0.9062 0.125 0.7188 +0.9062 0.125 0.75 +0.9062 0.125 0.7812 +0.9062 0.125 0.8125 +0.9062 0.125 0.8438 +0.9062 0.125 0.875 +0.9062 0.125 0.9062 +0.9062 0.125 0.9375 +0.9062 0.125 0.9688 +0.9062 0.125 1 +0.9062 0.1562 0 +0.9062 0.1562 0.03125 +0.9062 0.1562 0.0625 +0.9062 0.1562 0.09375 +0.9062 0.1562 0.125 +0.9062 0.1562 0.1562 +0.9062 0.1562 0.1875 +0.9062 0.1562 0.2188 +0.9062 0.1562 0.25 +0.9062 0.1562 0.2812 +0.9062 0.1562 0.3125 +0.9062 0.1562 0.3438 +0.9062 0.1562 0.375 +0.9062 0.1562 0.4062 +0.9062 0.1562 0.4375 +0.9062 0.1562 0.4688 +0.9062 0.1562 0.5 +0.9062 0.1562 0.5312 +0.9062 0.1562 0.5625 +0.9062 0.1562 0.5938 +0.9062 0.1562 0.625 +0.9062 0.1562 0.6562 +0.9062 0.1562 0.6875 +0.9062 0.1562 0.7188 +0.9062 0.1562 0.75 +0.9062 0.1562 0.7812 +0.9062 0.1562 0.8125 +0.9062 0.1562 0.8438 +0.9062 0.1562 0.875 +0.9062 0.1562 0.9062 +0.9062 0.1562 0.9375 +0.9062 0.1562 0.9688 +0.9062 0.1562 1 +0.9062 0.1875 0 +0.9062 0.1875 0.03125 +0.9062 0.1875 0.0625 +0.9062 0.1875 0.09375 +0.9062 0.1875 0.125 +0.9062 0.1875 0.1562 +0.9062 0.1875 0.1875 +0.9062 0.1875 0.2188 +0.9062 0.1875 0.25 +0.9062 0.1875 0.2812 +0.9062 0.1875 0.3125 +0.9062 0.1875 0.3438 +0.9062 0.1875 0.375 +0.9062 0.1875 0.4062 +0.9062 0.1875 0.4375 +0.9062 0.1875 0.4688 +0.9062 0.1875 0.5 +0.9062 0.1875 0.5312 +0.9062 0.1875 0.5625 +0.9062 0.1875 0.5938 +0.9062 0.1875 0.625 +0.9062 0.1875 0.6562 +0.9062 0.1875 0.6875 +0.9062 0.1875 0.7188 +0.9062 0.1875 0.75 +0.9062 0.1875 0.7812 +0.9062 0.1875 0.8125 +0.9062 0.1875 0.8438 +0.9062 0.1875 0.875 +0.9062 0.1875 0.9062 +0.9062 0.1875 0.9375 +0.9062 0.1875 0.9688 +0.9062 0.1875 1 +0.9062 0.2188 0 +0.9062 0.2188 0.03125 +0.9062 0.2188 0.0625 +0.9062 0.2188 0.09375 +0.9062 0.2188 0.125 +0.9062 0.2188 0.1562 +0.9062 0.2188 0.1875 +0.9062 0.2188 0.2188 +0.9062 0.2188 0.25 +0.9062 0.2188 0.2812 +0.9062 0.2188 0.3125 +0.9062 0.2188 0.3438 +0.9062 0.2188 0.375 +0.9062 0.2188 0.4062 +0.9062 0.2188 0.4375 +0.9062 0.2188 0.4688 +0.9062 0.2188 0.5 +0.9062 0.2188 0.5312 +0.9062 0.2188 0.5625 +0.9062 0.2188 0.5938 +0.9062 0.2188 0.625 +0.9062 0.2188 0.6562 +0.9062 0.2188 0.6875 +0.9062 0.2188 0.7188 +0.9062 0.2188 0.75 +0.9062 0.2188 0.7812 +0.9062 0.2188 0.8125 +0.9062 0.2188 0.8438 +0.9062 0.2188 0.875 +0.9062 0.2188 0.9062 +0.9062 0.2188 0.9375 +0.9062 0.2188 0.9688 +0.9062 0.2188 1 +0.9062 0.25 0 +0.9062 0.25 0.03125 +0.9062 0.25 0.0625 +0.9062 0.25 0.09375 +0.9062 0.25 0.125 +0.9062 0.25 0.1562 +0.9062 0.25 0.1875 +0.9062 0.25 0.2188 +0.9062 0.25 0.25 +0.9062 0.25 0.2812 +0.9062 0.25 0.3125 +0.9062 0.25 0.3438 +0.9062 0.25 0.375 +0.9062 0.25 0.4062 +0.9062 0.25 0.4375 +0.9062 0.25 0.4688 +0.9062 0.25 0.5 +0.9062 0.25 0.5312 +0.9062 0.25 0.5625 +0.9062 0.25 0.5938 +0.9062 0.25 0.625 +0.9062 0.25 0.6562 +0.9062 0.25 0.6875 +0.9062 0.25 0.7188 +0.9062 0.25 0.75 +0.9062 0.25 0.7812 +0.9062 0.25 0.8125 +0.9062 0.25 0.8438 +0.9062 0.25 0.875 +0.9062 0.25 0.9062 +0.9062 0.25 0.9375 +0.9062 0.25 0.9688 +0.9062 0.25 1 +0.9062 0.2812 0 +0.9062 0.2812 0.03125 +0.9062 0.2812 0.0625 +0.9062 0.2812 0.09375 +0.9062 0.2812 0.125 +0.9062 0.2812 0.1562 +0.9062 0.2812 0.1875 +0.9062 0.2812 0.2188 +0.9062 0.2812 0.25 +0.9062 0.2812 0.2812 +0.9062 0.2812 0.3125 +0.9062 0.2812 0.3438 +0.9062 0.2812 0.375 +0.9062 0.2812 0.4062 +0.9062 0.2812 0.4375 +0.9062 0.2812 0.4688 +0.9062 0.2812 0.5 +0.9062 0.2812 0.5312 +0.9062 0.2812 0.5625 +0.9062 0.2812 0.5938 +0.9062 0.2812 0.625 +0.9062 0.2812 0.6562 +0.9062 0.2812 0.6875 +0.9062 0.2812 0.7188 +0.9062 0.2812 0.75 +0.9062 0.2812 0.7812 +0.9062 0.2812 0.8125 +0.9062 0.2812 0.8438 +0.9062 0.2812 0.875 +0.9062 0.2812 0.9062 +0.9062 0.2812 0.9375 +0.9062 0.2812 0.9688 +0.9062 0.2812 1 +0.9062 0.3125 0 +0.9062 0.3125 0.03125 +0.9062 0.3125 0.0625 +0.9062 0.3125 0.09375 +0.9062 0.3125 0.125 +0.9062 0.3125 0.1562 +0.9062 0.3125 0.1875 +0.9062 0.3125 0.2188 +0.9062 0.3125 0.25 +0.9062 0.3125 0.2812 +0.9062 0.3125 0.3125 +0.9062 0.3125 0.3438 +0.9062 0.3125 0.375 +0.9062 0.3125 0.4062 +0.9062 0.3125 0.4375 +0.9062 0.3125 0.4688 +0.9062 0.3125 0.5 +0.9062 0.3125 0.5312 +0.9062 0.3125 0.5625 +0.9062 0.3125 0.5938 +0.9062 0.3125 0.625 +0.9062 0.3125 0.6562 +0.9062 0.3125 0.6875 +0.9062 0.3125 0.7188 +0.9062 0.3125 0.75 +0.9062 0.3125 0.7812 +0.9062 0.3125 0.8125 +0.9062 0.3125 0.8438 +0.9062 0.3125 0.875 +0.9062 0.3125 0.9062 +0.9062 0.3125 0.9375 +0.9062 0.3125 0.9688 +0.9062 0.3125 1 +0.9062 0.3438 0 +0.9062 0.3438 0.03125 +0.9062 0.3438 0.0625 +0.9062 0.3438 0.09375 +0.9062 0.3438 0.125 +0.9062 0.3438 0.1562 +0.9062 0.3438 0.1875 +0.9062 0.3438 0.2188 +0.9062 0.3438 0.25 +0.9062 0.3438 0.2812 +0.9062 0.3438 0.3125 +0.9062 0.3438 0.3438 +0.9062 0.3438 0.375 +0.9062 0.3438 0.4062 +0.9062 0.3438 0.4375 +0.9062 0.3438 0.4688 +0.9062 0.3438 0.5 +0.9062 0.3438 0.5312 +0.9062 0.3438 0.5625 +0.9062 0.3438 0.5938 +0.9062 0.3438 0.625 +0.9062 0.3438 0.6562 +0.9062 0.3438 0.6875 +0.9062 0.3438 0.7188 +0.9062 0.3438 0.75 +0.9062 0.3438 0.7812 +0.9062 0.3438 0.8125 +0.9062 0.3438 0.8438 +0.9062 0.3438 0.875 +0.9062 0.3438 0.9062 +0.9062 0.3438 0.9375 +0.9062 0.3438 0.9688 +0.9062 0.3438 1 +0.9062 0.375 0 +0.9062 0.375 0.03125 +0.9062 0.375 0.0625 +0.9062 0.375 0.09375 +0.9062 0.375 0.125 +0.9062 0.375 0.1562 +0.9062 0.375 0.1875 +0.9062 0.375 0.2188 +0.9062 0.375 0.25 +0.9062 0.375 0.2812 +0.9062 0.375 0.3125 +0.9062 0.375 0.3438 +0.9062 0.375 0.375 +0.9062 0.375 0.4062 +0.9062 0.375 0.4375 +0.9062 0.375 0.4688 +0.9062 0.375 0.5 +0.9062 0.375 0.5312 +0.9062 0.375 0.5625 +0.9062 0.375 0.5938 +0.9062 0.375 0.625 +0.9062 0.375 0.6562 +0.9062 0.375 0.6875 +0.9062 0.375 0.7188 +0.9062 0.375 0.75 +0.9062 0.375 0.7812 +0.9062 0.375 0.8125 +0.9062 0.375 0.8438 +0.9062 0.375 0.875 +0.9062 0.375 0.9062 +0.9062 0.375 0.9375 +0.9062 0.375 0.9688 +0.9062 0.375 1 +0.9062 0.4062 0 +0.9062 0.4062 0.03125 +0.9062 0.4062 0.0625 +0.9062 0.4062 0.09375 +0.9062 0.4062 0.125 +0.9062 0.4062 0.1562 +0.9062 0.4062 0.1875 +0.9062 0.4062 0.2188 +0.9062 0.4062 0.25 +0.9062 0.4062 0.2812 +0.9062 0.4062 0.3125 +0.9062 0.4062 0.3438 +0.9062 0.4062 0.375 +0.9062 0.4062 0.4062 +0.9062 0.4062 0.4375 +0.9062 0.4062 0.4688 +0.9062 0.4062 0.5 +0.9062 0.4062 0.5312 +0.9062 0.4062 0.5625 +0.9062 0.4062 0.5938 +0.9062 0.4062 0.625 +0.9062 0.4062 0.6562 +0.9062 0.4062 0.6875 +0.9062 0.4062 0.7188 +0.9062 0.4062 0.75 +0.9062 0.4062 0.7812 +0.9062 0.4062 0.8125 +0.9062 0.4062 0.8438 +0.9062 0.4062 0.875 +0.9062 0.4062 0.9062 +0.9062 0.4062 0.9375 +0.9062 0.4062 0.9688 +0.9062 0.4062 1 +0.9062 0.4375 0 +0.9062 0.4375 0.03125 +0.9062 0.4375 0.0625 +0.9062 0.4375 0.09375 +0.9062 0.4375 0.125 +0.9062 0.4375 0.1562 +0.9062 0.4375 0.1875 +0.9062 0.4375 0.2188 +0.9062 0.4375 0.25 +0.9062 0.4375 0.2812 +0.9062 0.4375 0.3125 +0.9062 0.4375 0.3438 +0.9062 0.4375 0.375 +0.9062 0.4375 0.4062 +0.9062 0.4375 0.4375 +0.9062 0.4375 0.4688 +0.9062 0.4375 0.5 +0.9062 0.4375 0.5312 +0.9062 0.4375 0.5625 +0.9062 0.4375 0.5938 +0.9062 0.4375 0.625 +0.9062 0.4375 0.6562 +0.9062 0.4375 0.6875 +0.9062 0.4375 0.7188 +0.9062 0.4375 0.75 +0.9062 0.4375 0.7812 +0.9062 0.4375 0.8125 +0.9062 0.4375 0.8438 +0.9062 0.4375 0.875 +0.9062 0.4375 0.9062 +0.9062 0.4375 0.9375 +0.9062 0.4375 0.9688 +0.9062 0.4375 1 +0.9062 0.4688 0 +0.9062 0.4688 0.03125 +0.9062 0.4688 0.0625 +0.9062 0.4688 0.09375 +0.9062 0.4688 0.125 +0.9062 0.4688 0.1562 +0.9062 0.4688 0.1875 +0.9062 0.4688 0.2188 +0.9062 0.4688 0.25 +0.9062 0.4688 0.2812 +0.9062 0.4688 0.3125 +0.9062 0.4688 0.3438 +0.9062 0.4688 0.375 +0.9062 0.4688 0.4062 +0.9062 0.4688 0.4375 +0.9062 0.4688 0.4688 +0.9062 0.4688 0.5 +0.9062 0.4688 0.5312 +0.9062 0.4688 0.5625 +0.9062 0.4688 0.5938 +0.9062 0.4688 0.625 +0.9062 0.4688 0.6562 +0.9062 0.4688 0.6875 +0.9062 0.4688 0.7188 +0.9062 0.4688 0.75 +0.9062 0.4688 0.7812 +0.9062 0.4688 0.8125 +0.9062 0.4688 0.8438 +0.9062 0.4688 0.875 +0.9062 0.4688 0.9062 +0.9062 0.4688 0.9375 +0.9062 0.4688 0.9688 +0.9062 0.4688 1 +0.9062 0.5 0 +0.9062 0.5 0.03125 +0.9062 0.5 0.0625 +0.9062 0.5 0.09375 +0.9062 0.5 0.125 +0.9062 0.5 0.1562 +0.9062 0.5 0.1875 +0.9062 0.5 0.2188 +0.9062 0.5 0.25 +0.9062 0.5 0.2812 +0.9062 0.5 0.3125 +0.9062 0.5 0.3438 +0.9062 0.5 0.375 +0.9062 0.5 0.4062 +0.9062 0.5 0.4375 +0.9062 0.5 0.4688 +0.9062 0.5 0.5 +0.9062 0.5 0.5312 +0.9062 0.5 0.5625 +0.9062 0.5 0.5938 +0.9062 0.5 0.625 +0.9062 0.5 0.6562 +0.9062 0.5 0.6875 +0.9062 0.5 0.7188 +0.9062 0.5 0.75 +0.9062 0.5 0.7812 +0.9062 0.5 0.8125 +0.9062 0.5 0.8438 +0.9062 0.5 0.875 +0.9062 0.5 0.9062 +0.9062 0.5 0.9375 +0.9062 0.5 0.9688 +0.9062 0.5 1 +0.9062 0.5312 0 +0.9062 0.5312 0.03125 +0.9062 0.5312 0.0625 +0.9062 0.5312 0.09375 +0.9062 0.5312 0.125 +0.9062 0.5312 0.1562 +0.9062 0.5312 0.1875 +0.9062 0.5312 0.2188 +0.9062 0.5312 0.25 +0.9062 0.5312 0.2812 +0.9062 0.5312 0.3125 +0.9062 0.5312 0.3438 +0.9062 0.5312 0.375 +0.9062 0.5312 0.4062 +0.9062 0.5312 0.4375 +0.9062 0.5312 0.4688 +0.9062 0.5312 0.5 +0.9062 0.5312 0.5312 +0.9062 0.5312 0.5625 +0.9062 0.5312 0.5938 +0.9062 0.5312 0.625 +0.9062 0.5312 0.6562 +0.9062 0.5312 0.6875 +0.9062 0.5312 0.7188 +0.9062 0.5312 0.75 +0.9062 0.5312 0.7812 +0.9062 0.5312 0.8125 +0.9062 0.5312 0.8438 +0.9062 0.5312 0.875 +0.9062 0.5312 0.9062 +0.9062 0.5312 0.9375 +0.9062 0.5312 0.9688 +0.9062 0.5312 1 +0.9062 0.5625 0 +0.9062 0.5625 0.03125 +0.9062 0.5625 0.0625 +0.9062 0.5625 0.09375 +0.9062 0.5625 0.125 +0.9062 0.5625 0.1562 +0.9062 0.5625 0.1875 +0.9062 0.5625 0.2188 +0.9062 0.5625 0.25 +0.9062 0.5625 0.2812 +0.9062 0.5625 0.3125 +0.9062 0.5625 0.3438 +0.9062 0.5625 0.375 +0.9062 0.5625 0.4062 +0.9062 0.5625 0.4375 +0.9062 0.5625 0.4688 +0.9062 0.5625 0.5 +0.9062 0.5625 0.5312 +0.9062 0.5625 0.5625 +0.9062 0.5625 0.5938 +0.9062 0.5625 0.625 +0.9062 0.5625 0.6562 +0.9062 0.5625 0.6875 +0.9062 0.5625 0.7188 +0.9062 0.5625 0.75 +0.9062 0.5625 0.7812 +0.9062 0.5625 0.8125 +0.9062 0.5625 0.8438 +0.9062 0.5625 0.875 +0.9062 0.5625 0.9062 +0.9062 0.5625 0.9375 +0.9062 0.5625 0.9688 +0.9062 0.5625 1 +0.9062 0.5938 0 +0.9062 0.5938 0.03125 +0.9062 0.5938 0.0625 +0.9062 0.5938 0.09375 +0.9062 0.5938 0.125 +0.9062 0.5938 0.1562 +0.9062 0.5938 0.1875 +0.9062 0.5938 0.2188 +0.9062 0.5938 0.25 +0.9062 0.5938 0.2812 +0.9062 0.5938 0.3125 +0.9062 0.5938 0.3438 +0.9062 0.5938 0.375 +0.9062 0.5938 0.4062 +0.9062 0.5938 0.4375 +0.9062 0.5938 0.4688 +0.9062 0.5938 0.5 +0.9062 0.5938 0.5312 +0.9062 0.5938 0.5625 +0.9062 0.5938 0.5938 +0.9062 0.5938 0.625 +0.9062 0.5938 0.6562 +0.9062 0.5938 0.6875 +0.9062 0.5938 0.7188 +0.9062 0.5938 0.75 +0.9062 0.5938 0.7812 +0.9062 0.5938 0.8125 +0.9062 0.5938 0.8438 +0.9062 0.5938 0.875 +0.9062 0.5938 0.9062 +0.9062 0.5938 0.9375 +0.9062 0.5938 0.9688 +0.9062 0.5938 1 +0.9062 0.625 0 +0.9062 0.625 0.03125 +0.9062 0.625 0.0625 +0.9062 0.625 0.09375 +0.9062 0.625 0.125 +0.9062 0.625 0.1562 +0.9062 0.625 0.1875 +0.9062 0.625 0.2188 +0.9062 0.625 0.25 +0.9062 0.625 0.2812 +0.9062 0.625 0.3125 +0.9062 0.625 0.3438 +0.9062 0.625 0.375 +0.9062 0.625 0.4062 +0.9062 0.625 0.4375 +0.9062 0.625 0.4688 +0.9062 0.625 0.5 +0.9062 0.625 0.5312 +0.9062 0.625 0.5625 +0.9062 0.625 0.5938 +0.9062 0.625 0.625 +0.9062 0.625 0.6562 +0.9062 0.625 0.6875 +0.9062 0.625 0.7188 +0.9062 0.625 0.75 +0.9062 0.625 0.7812 +0.9062 0.625 0.8125 +0.9062 0.625 0.8438 +0.9062 0.625 0.875 +0.9062 0.625 0.9062 +0.9062 0.625 0.9375 +0.9062 0.625 0.9688 +0.9062 0.625 1 +0.9062 0.6562 0 +0.9062 0.6562 0.03125 +0.9062 0.6562 0.0625 +0.9062 0.6562 0.09375 +0.9062 0.6562 0.125 +0.9062 0.6562 0.1562 +0.9062 0.6562 0.1875 +0.9062 0.6562 0.2188 +0.9062 0.6562 0.25 +0.9062 0.6562 0.2812 +0.9062 0.6562 0.3125 +0.9062 0.6562 0.3438 +0.9062 0.6562 0.375 +0.9062 0.6562 0.4062 +0.9062 0.6562 0.4375 +0.9062 0.6562 0.4688 +0.9062 0.6562 0.5 +0.9062 0.6562 0.5312 +0.9062 0.6562 0.5625 +0.9062 0.6562 0.5938 +0.9062 0.6562 0.625 +0.9062 0.6562 0.6562 +0.9062 0.6562 0.6875 +0.9062 0.6562 0.7188 +0.9062 0.6562 0.75 +0.9062 0.6562 0.7812 +0.9062 0.6562 0.8125 +0.9062 0.6562 0.8438 +0.9062 0.6562 0.875 +0.9062 0.6562 0.9062 +0.9062 0.6562 0.9375 +0.9062 0.6562 0.9688 +0.9062 0.6562 1 +0.9062 0.6875 0 +0.9062 0.6875 0.03125 +0.9062 0.6875 0.0625 +0.9062 0.6875 0.09375 +0.9062 0.6875 0.125 +0.9062 0.6875 0.1562 +0.9062 0.6875 0.1875 +0.9062 0.6875 0.2188 +0.9062 0.6875 0.25 +0.9062 0.6875 0.2812 +0.9062 0.6875 0.3125 +0.9062 0.6875 0.3438 +0.9062 0.6875 0.375 +0.9062 0.6875 0.4062 +0.9062 0.6875 0.4375 +0.9062 0.6875 0.4688 +0.9062 0.6875 0.5 +0.9062 0.6875 0.5312 +0.9062 0.6875 0.5625 +0.9062 0.6875 0.5938 +0.9062 0.6875 0.625 +0.9062 0.6875 0.6562 +0.9062 0.6875 0.6875 +0.9062 0.6875 0.7188 +0.9062 0.6875 0.75 +0.9062 0.6875 0.7812 +0.9062 0.6875 0.8125 +0.9062 0.6875 0.8438 +0.9062 0.6875 0.875 +0.9062 0.6875 0.9062 +0.9062 0.6875 0.9375 +0.9062 0.6875 0.9688 +0.9062 0.6875 1 +0.9062 0.7188 0 +0.9062 0.7188 0.03125 +0.9062 0.7188 0.0625 +0.9062 0.7188 0.09375 +0.9062 0.7188 0.125 +0.9062 0.7188 0.1562 +0.9062 0.7188 0.1875 +0.9062 0.7188 0.2188 +0.9062 0.7188 0.25 +0.9062 0.7188 0.2812 +0.9062 0.7188 0.3125 +0.9062 0.7188 0.3438 +0.9062 0.7188 0.375 +0.9062 0.7188 0.4062 +0.9062 0.7188 0.4375 +0.9062 0.7188 0.4688 +0.9062 0.7188 0.5 +0.9062 0.7188 0.5312 +0.9062 0.7188 0.5625 +0.9062 0.7188 0.5938 +0.9062 0.7188 0.625 +0.9062 0.7188 0.6562 +0.9062 0.7188 0.6875 +0.9062 0.7188 0.7188 +0.9062 0.7188 0.75 +0.9062 0.7188 0.7812 +0.9062 0.7188 0.8125 +0.9062 0.7188 0.8438 +0.9062 0.7188 0.875 +0.9062 0.7188 0.9062 +0.9062 0.7188 0.9375 +0.9062 0.7188 0.9688 +0.9062 0.7188 1 +0.9062 0.75 0 +0.9062 0.75 0.03125 +0.9062 0.75 0.0625 +0.9062 0.75 0.09375 +0.9062 0.75 0.125 +0.9062 0.75 0.1562 +0.9062 0.75 0.1875 +0.9062 0.75 0.2188 +0.9062 0.75 0.25 +0.9062 0.75 0.2812 +0.9062 0.75 0.3125 +0.9062 0.75 0.3438 +0.9062 0.75 0.375 +0.9062 0.75 0.4062 +0.9062 0.75 0.4375 +0.9062 0.75 0.4688 +0.9062 0.75 0.5 +0.9062 0.75 0.5312 +0.9062 0.75 0.5625 +0.9062 0.75 0.5938 +0.9062 0.75 0.625 +0.9062 0.75 0.6562 +0.9062 0.75 0.6875 +0.9062 0.75 0.7188 +0.9062 0.75 0.75 +0.9062 0.75 0.7812 +0.9062 0.75 0.8125 +0.9062 0.75 0.8438 +0.9062 0.75 0.875 +0.9062 0.75 0.9062 +0.9062 0.75 0.9375 +0.9062 0.75 0.9688 +0.9062 0.75 1 +0.9062 0.7812 0 +0.9062 0.7812 0.03125 +0.9062 0.7812 0.0625 +0.9062 0.7812 0.09375 +0.9062 0.7812 0.125 +0.9062 0.7812 0.1562 +0.9062 0.7812 0.1875 +0.9062 0.7812 0.2188 +0.9062 0.7812 0.25 +0.9062 0.7812 0.2812 +0.9062 0.7812 0.3125 +0.9062 0.7812 0.3438 +0.9062 0.7812 0.375 +0.9062 0.7812 0.4062 +0.9062 0.7812 0.4375 +0.9062 0.7812 0.4688 +0.9062 0.7812 0.5 +0.9062 0.7812 0.5312 +0.9062 0.7812 0.5625 +0.9062 0.7812 0.5938 +0.9062 0.7812 0.625 +0.9062 0.7812 0.6562 +0.9062 0.7812 0.6875 +0.9062 0.7812 0.7188 +0.9062 0.7812 0.75 +0.9062 0.7812 0.7812 +0.9062 0.7812 0.8125 +0.9062 0.7812 0.8438 +0.9062 0.7812 0.875 +0.9062 0.7812 0.9062 +0.9062 0.7812 0.9375 +0.9062 0.7812 0.9688 +0.9062 0.7812 1 +0.9062 0.8125 0 +0.9062 0.8125 0.03125 +0.9062 0.8125 0.0625 +0.9062 0.8125 0.09375 +0.9062 0.8125 0.125 +0.9062 0.8125 0.1562 +0.9062 0.8125 0.1875 +0.9062 0.8125 0.2188 +0.9062 0.8125 0.25 +0.9062 0.8125 0.2812 +0.9062 0.8125 0.3125 +0.9062 0.8125 0.3438 +0.9062 0.8125 0.375 +0.9062 0.8125 0.4062 +0.9062 0.8125 0.4375 +0.9062 0.8125 0.4688 +0.9062 0.8125 0.5 +0.9062 0.8125 0.5312 +0.9062 0.8125 0.5625 +0.9062 0.8125 0.5938 +0.9062 0.8125 0.625 +0.9062 0.8125 0.6562 +0.9062 0.8125 0.6875 +0.9062 0.8125 0.7188 +0.9062 0.8125 0.75 +0.9062 0.8125 0.7812 +0.9062 0.8125 0.8125 +0.9062 0.8125 0.8438 +0.9062 0.8125 0.875 +0.9062 0.8125 0.9062 +0.9062 0.8125 0.9375 +0.9062 0.8125 0.9688 +0.9062 0.8125 1 +0.9062 0.8438 0 +0.9062 0.8438 0.03125 +0.9062 0.8438 0.0625 +0.9062 0.8438 0.09375 +0.9062 0.8438 0.125 +0.9062 0.8438 0.1562 +0.9062 0.8438 0.1875 +0.9062 0.8438 0.2188 +0.9062 0.8438 0.25 +0.9062 0.8438 0.2812 +0.9062 0.8438 0.3125 +0.9062 0.8438 0.3438 +0.9062 0.8438 0.375 +0.9062 0.8438 0.4062 +0.9062 0.8438 0.4375 +0.9062 0.8438 0.4688 +0.9062 0.8438 0.5 +0.9062 0.8438 0.5312 +0.9062 0.8438 0.5625 +0.9062 0.8438 0.5938 +0.9062 0.8438 0.625 +0.9062 0.8438 0.6562 +0.9062 0.8438 0.6875 +0.9062 0.8438 0.7188 +0.9062 0.8438 0.75 +0.9062 0.8438 0.7812 +0.9062 0.8438 0.8125 +0.9062 0.8438 0.8438 +0.9062 0.8438 0.875 +0.9062 0.8438 0.9062 +0.9062 0.8438 0.9375 +0.9062 0.8438 0.9688 +0.9062 0.8438 1 +0.9062 0.875 0 +0.9062 0.875 0.03125 +0.9062 0.875 0.0625 +0.9062 0.875 0.09375 +0.9062 0.875 0.125 +0.9062 0.875 0.1562 +0.9062 0.875 0.1875 +0.9062 0.875 0.2188 +0.9062 0.875 0.25 +0.9062 0.875 0.2812 +0.9062 0.875 0.3125 +0.9062 0.875 0.3438 +0.9062 0.875 0.375 +0.9062 0.875 0.4062 +0.9062 0.875 0.4375 +0.9062 0.875 0.4688 +0.9062 0.875 0.5 +0.9062 0.875 0.5312 +0.9062 0.875 0.5625 +0.9062 0.875 0.5938 +0.9062 0.875 0.625 +0.9062 0.875 0.6562 +0.9062 0.875 0.6875 +0.9062 0.875 0.7188 +0.9062 0.875 0.75 +0.9062 0.875 0.7812 +0.9062 0.875 0.8125 +0.9062 0.875 0.8438 +0.9062 0.875 0.875 +0.9062 0.875 0.9062 +0.9062 0.875 0.9375 +0.9062 0.875 0.9688 +0.9062 0.875 1 +0.9062 0.9062 0 +0.9062 0.9062 0.03125 +0.9062 0.9062 0.0625 +0.9062 0.9062 0.09375 +0.9062 0.9062 0.125 +0.9062 0.9062 0.1562 +0.9062 0.9062 0.1875 +0.9062 0.9062 0.2188 +0.9062 0.9062 0.25 +0.9062 0.9062 0.2812 +0.9062 0.9062 0.3125 +0.9062 0.9062 0.3438 +0.9062 0.9062 0.375 +0.9062 0.9062 0.4062 +0.9062 0.9062 0.4375 +0.9062 0.9062 0.4688 +0.9062 0.9062 0.5 +0.9062 0.9062 0.5312 +0.9062 0.9062 0.5625 +0.9062 0.9062 0.5938 +0.9062 0.9062 0.625 +0.9062 0.9062 0.6562 +0.9062 0.9062 0.6875 +0.9062 0.9062 0.7188 +0.9062 0.9062 0.75 +0.9062 0.9062 0.7812 +0.9062 0.9062 0.8125 +0.9062 0.9062 0.8438 +0.9062 0.9062 0.875 +0.9062 0.9062 0.9062 +0.9062 0.9062 0.9375 +0.9062 0.9062 0.9688 +0.9062 0.9062 1 +0.9062 0.9375 0 +0.9062 0.9375 0.03125 +0.9062 0.9375 0.0625 +0.9062 0.9375 0.09375 +0.9062 0.9375 0.125 +0.9062 0.9375 0.1562 +0.9062 0.9375 0.1875 +0.9062 0.9375 0.2188 +0.9062 0.9375 0.25 +0.9062 0.9375 0.2812 +0.9062 0.9375 0.3125 +0.9062 0.9375 0.3438 +0.9062 0.9375 0.375 +0.9062 0.9375 0.4062 +0.9062 0.9375 0.4375 +0.9062 0.9375 0.4688 +0.9062 0.9375 0.5 +0.9062 0.9375 0.5312 +0.9062 0.9375 0.5625 +0.9062 0.9375 0.5938 +0.9062 0.9375 0.625 +0.9062 0.9375 0.6562 +0.9062 0.9375 0.6875 +0.9062 0.9375 0.7188 +0.9062 0.9375 0.75 +0.9062 0.9375 0.7812 +0.9062 0.9375 0.8125 +0.9062 0.9375 0.8438 +0.9062 0.9375 0.875 +0.9062 0.9375 0.9062 +0.9062 0.9375 0.9375 +0.9062 0.9375 0.9688 +0.9062 0.9375 1 +0.9062 0.9688 0 +0.9062 0.9688 0.03125 +0.9062 0.9688 0.0625 +0.9062 0.9688 0.09375 +0.9062 0.9688 0.125 +0.9062 0.9688 0.1562 +0.9062 0.9688 0.1875 +0.9062 0.9688 0.2188 +0.9062 0.9688 0.25 +0.9062 0.9688 0.2812 +0.9062 0.9688 0.3125 +0.9062 0.9688 0.3438 +0.9062 0.9688 0.375 +0.9062 0.9688 0.4062 +0.9062 0.9688 0.4375 +0.9062 0.9688 0.4688 +0.9062 0.9688 0.5 +0.9062 0.9688 0.5312 +0.9062 0.9688 0.5625 +0.9062 0.9688 0.5938 +0.9062 0.9688 0.625 +0.9062 0.9688 0.6562 +0.9062 0.9688 0.6875 +0.9062 0.9688 0.7188 +0.9062 0.9688 0.75 +0.9062 0.9688 0.7812 +0.9062 0.9688 0.8125 +0.9062 0.9688 0.8438 +0.9062 0.9688 0.875 +0.9062 0.9688 0.9062 +0.9062 0.9688 0.9375 +0.9062 0.9688 0.9688 +0.9062 0.9688 1 +0.9062 1 0 +0.9062 1 0.03125 +0.9062 1 0.0625 +0.9062 1 0.09375 +0.9062 1 0.125 +0.9062 1 0.1562 +0.9062 1 0.1875 +0.9062 1 0.2188 +0.9062 1 0.25 +0.9062 1 0.2812 +0.9062 1 0.3125 +0.9062 1 0.3438 +0.9062 1 0.375 +0.9062 1 0.4062 +0.9062 1 0.4375 +0.9062 1 0.4688 +0.9062 1 0.5 +0.9062 1 0.5312 +0.9062 1 0.5625 +0.9062 1 0.5938 +0.9062 1 0.625 +0.9062 1 0.6562 +0.9062 1 0.6875 +0.9062 1 0.7188 +0.9062 1 0.75 +0.9062 1 0.7812 +0.9062 1 0.8125 +0.9062 1 0.8438 +0.9062 1 0.875 +0.9062 1 0.9062 +0.9062 1 0.9375 +0.9062 1 0.9688 +0.9062 1 1 +0.9375 0 0 +0.9375 0 0.03125 +0.9375 0 0.0625 +0.9375 0 0.09375 +0.9375 0 0.125 +0.9375 0 0.1562 +0.9375 0 0.1875 +0.9375 0 0.2188 +0.9375 0 0.25 +0.9375 0 0.2812 +0.9375 0 0.3125 +0.9375 0 0.3438 +0.9375 0 0.375 +0.9375 0 0.4062 +0.9375 0 0.4375 +0.9375 0 0.4688 +0.9375 0 0.5 +0.9375 0 0.5312 +0.9375 0 0.5625 +0.9375 0 0.5938 +0.9375 0 0.625 +0.9375 0 0.6562 +0.9375 0 0.6875 +0.9375 0 0.7188 +0.9375 0 0.75 +0.9375 0 0.7812 +0.9375 0 0.8125 +0.9375 0 0.8438 +0.9375 0 0.875 +0.9375 0 0.9062 +0.9375 0 0.9375 +0.9375 0 0.9688 +0.9375 0 1 +0.9375 0.03125 0 +0.9375 0.03125 0.03125 +0.9375 0.03125 0.0625 +0.9375 0.03125 0.09375 +0.9375 0.03125 0.125 +0.9375 0.03125 0.1562 +0.9375 0.03125 0.1875 +0.9375 0.03125 0.2188 +0.9375 0.03125 0.25 +0.9375 0.03125 0.2812 +0.9375 0.03125 0.3125 +0.9375 0.03125 0.3438 +0.9375 0.03125 0.375 +0.9375 0.03125 0.4062 +0.9375 0.03125 0.4375 +0.9375 0.03125 0.4688 +0.9375 0.03125 0.5 +0.9375 0.03125 0.5312 +0.9375 0.03125 0.5625 +0.9375 0.03125 0.5938 +0.9375 0.03125 0.625 +0.9375 0.03125 0.6562 +0.9375 0.03125 0.6875 +0.9375 0.03125 0.7188 +0.9375 0.03125 0.75 +0.9375 0.03125 0.7812 +0.9375 0.03125 0.8125 +0.9375 0.03125 0.8438 +0.9375 0.03125 0.875 +0.9375 0.03125 0.9062 +0.9375 0.03125 0.9375 +0.9375 0.03125 0.9688 +0.9375 0.03125 1 +0.9375 0.0625 0 +0.9375 0.0625 0.03125 +0.9375 0.0625 0.0625 +0.9375 0.0625 0.09375 +0.9375 0.0625 0.125 +0.9375 0.0625 0.1562 +0.9375 0.0625 0.1875 +0.9375 0.0625 0.2188 +0.9375 0.0625 0.25 +0.9375 0.0625 0.2812 +0.9375 0.0625 0.3125 +0.9375 0.0625 0.3438 +0.9375 0.0625 0.375 +0.9375 0.0625 0.4062 +0.9375 0.0625 0.4375 +0.9375 0.0625 0.4688 +0.9375 0.0625 0.5 +0.9375 0.0625 0.5312 +0.9375 0.0625 0.5625 +0.9375 0.0625 0.5938 +0.9375 0.0625 0.625 +0.9375 0.0625 0.6562 +0.9375 0.0625 0.6875 +0.9375 0.0625 0.7188 +0.9375 0.0625 0.75 +0.9375 0.0625 0.7812 +0.9375 0.0625 0.8125 +0.9375 0.0625 0.8438 +0.9375 0.0625 0.875 +0.9375 0.0625 0.9062 +0.9375 0.0625 0.9375 +0.9375 0.0625 0.9688 +0.9375 0.0625 1 +0.9375 0.09375 0 +0.9375 0.09375 0.03125 +0.9375 0.09375 0.0625 +0.9375 0.09375 0.09375 +0.9375 0.09375 0.125 +0.9375 0.09375 0.1562 +0.9375 0.09375 0.1875 +0.9375 0.09375 0.2188 +0.9375 0.09375 0.25 +0.9375 0.09375 0.2812 +0.9375 0.09375 0.3125 +0.9375 0.09375 0.3438 +0.9375 0.09375 0.375 +0.9375 0.09375 0.4062 +0.9375 0.09375 0.4375 +0.9375 0.09375 0.4688 +0.9375 0.09375 0.5 +0.9375 0.09375 0.5312 +0.9375 0.09375 0.5625 +0.9375 0.09375 0.5938 +0.9375 0.09375 0.625 +0.9375 0.09375 0.6562 +0.9375 0.09375 0.6875 +0.9375 0.09375 0.7188 +0.9375 0.09375 0.75 +0.9375 0.09375 0.7812 +0.9375 0.09375 0.8125 +0.9375 0.09375 0.8438 +0.9375 0.09375 0.875 +0.9375 0.09375 0.9062 +0.9375 0.09375 0.9375 +0.9375 0.09375 0.9688 +0.9375 0.09375 1 +0.9375 0.125 0 +0.9375 0.125 0.03125 +0.9375 0.125 0.0625 +0.9375 0.125 0.09375 +0.9375 0.125 0.125 +0.9375 0.125 0.1562 +0.9375 0.125 0.1875 +0.9375 0.125 0.2188 +0.9375 0.125 0.25 +0.9375 0.125 0.2812 +0.9375 0.125 0.3125 +0.9375 0.125 0.3438 +0.9375 0.125 0.375 +0.9375 0.125 0.4062 +0.9375 0.125 0.4375 +0.9375 0.125 0.4688 +0.9375 0.125 0.5 +0.9375 0.125 0.5312 +0.9375 0.125 0.5625 +0.9375 0.125 0.5938 +0.9375 0.125 0.625 +0.9375 0.125 0.6562 +0.9375 0.125 0.6875 +0.9375 0.125 0.7188 +0.9375 0.125 0.75 +0.9375 0.125 0.7812 +0.9375 0.125 0.8125 +0.9375 0.125 0.8438 +0.9375 0.125 0.875 +0.9375 0.125 0.9062 +0.9375 0.125 0.9375 +0.9375 0.125 0.9688 +0.9375 0.125 1 +0.9375 0.1562 0 +0.9375 0.1562 0.03125 +0.9375 0.1562 0.0625 +0.9375 0.1562 0.09375 +0.9375 0.1562 0.125 +0.9375 0.1562 0.1562 +0.9375 0.1562 0.1875 +0.9375 0.1562 0.2188 +0.9375 0.1562 0.25 +0.9375 0.1562 0.2812 +0.9375 0.1562 0.3125 +0.9375 0.1562 0.3438 +0.9375 0.1562 0.375 +0.9375 0.1562 0.4062 +0.9375 0.1562 0.4375 +0.9375 0.1562 0.4688 +0.9375 0.1562 0.5 +0.9375 0.1562 0.5312 +0.9375 0.1562 0.5625 +0.9375 0.1562 0.5938 +0.9375 0.1562 0.625 +0.9375 0.1562 0.6562 +0.9375 0.1562 0.6875 +0.9375 0.1562 0.7188 +0.9375 0.1562 0.75 +0.9375 0.1562 0.7812 +0.9375 0.1562 0.8125 +0.9375 0.1562 0.8438 +0.9375 0.1562 0.875 +0.9375 0.1562 0.9062 +0.9375 0.1562 0.9375 +0.9375 0.1562 0.9688 +0.9375 0.1562 1 +0.9375 0.1875 0 +0.9375 0.1875 0.03125 +0.9375 0.1875 0.0625 +0.9375 0.1875 0.09375 +0.9375 0.1875 0.125 +0.9375 0.1875 0.1562 +0.9375 0.1875 0.1875 +0.9375 0.1875 0.2188 +0.9375 0.1875 0.25 +0.9375 0.1875 0.2812 +0.9375 0.1875 0.3125 +0.9375 0.1875 0.3438 +0.9375 0.1875 0.375 +0.9375 0.1875 0.4062 +0.9375 0.1875 0.4375 +0.9375 0.1875 0.4688 +0.9375 0.1875 0.5 +0.9375 0.1875 0.5312 +0.9375 0.1875 0.5625 +0.9375 0.1875 0.5938 +0.9375 0.1875 0.625 +0.9375 0.1875 0.6562 +0.9375 0.1875 0.6875 +0.9375 0.1875 0.7188 +0.9375 0.1875 0.75 +0.9375 0.1875 0.7812 +0.9375 0.1875 0.8125 +0.9375 0.1875 0.8438 +0.9375 0.1875 0.875 +0.9375 0.1875 0.9062 +0.9375 0.1875 0.9375 +0.9375 0.1875 0.9688 +0.9375 0.1875 1 +0.9375 0.2188 0 +0.9375 0.2188 0.03125 +0.9375 0.2188 0.0625 +0.9375 0.2188 0.09375 +0.9375 0.2188 0.125 +0.9375 0.2188 0.1562 +0.9375 0.2188 0.1875 +0.9375 0.2188 0.2188 +0.9375 0.2188 0.25 +0.9375 0.2188 0.2812 +0.9375 0.2188 0.3125 +0.9375 0.2188 0.3438 +0.9375 0.2188 0.375 +0.9375 0.2188 0.4062 +0.9375 0.2188 0.4375 +0.9375 0.2188 0.4688 +0.9375 0.2188 0.5 +0.9375 0.2188 0.5312 +0.9375 0.2188 0.5625 +0.9375 0.2188 0.5938 +0.9375 0.2188 0.625 +0.9375 0.2188 0.6562 +0.9375 0.2188 0.6875 +0.9375 0.2188 0.7188 +0.9375 0.2188 0.75 +0.9375 0.2188 0.7812 +0.9375 0.2188 0.8125 +0.9375 0.2188 0.8438 +0.9375 0.2188 0.875 +0.9375 0.2188 0.9062 +0.9375 0.2188 0.9375 +0.9375 0.2188 0.9688 +0.9375 0.2188 1 +0.9375 0.25 0 +0.9375 0.25 0.03125 +0.9375 0.25 0.0625 +0.9375 0.25 0.09375 +0.9375 0.25 0.125 +0.9375 0.25 0.1562 +0.9375 0.25 0.1875 +0.9375 0.25 0.2188 +0.9375 0.25 0.25 +0.9375 0.25 0.2812 +0.9375 0.25 0.3125 +0.9375 0.25 0.3438 +0.9375 0.25 0.375 +0.9375 0.25 0.4062 +0.9375 0.25 0.4375 +0.9375 0.25 0.4688 +0.9375 0.25 0.5 +0.9375 0.25 0.5312 +0.9375 0.25 0.5625 +0.9375 0.25 0.5938 +0.9375 0.25 0.625 +0.9375 0.25 0.6562 +0.9375 0.25 0.6875 +0.9375 0.25 0.7188 +0.9375 0.25 0.75 +0.9375 0.25 0.7812 +0.9375 0.25 0.8125 +0.9375 0.25 0.8438 +0.9375 0.25 0.875 +0.9375 0.25 0.9062 +0.9375 0.25 0.9375 +0.9375 0.25 0.9688 +0.9375 0.25 1 +0.9375 0.2812 0 +0.9375 0.2812 0.03125 +0.9375 0.2812 0.0625 +0.9375 0.2812 0.09375 +0.9375 0.2812 0.125 +0.9375 0.2812 0.1562 +0.9375 0.2812 0.1875 +0.9375 0.2812 0.2188 +0.9375 0.2812 0.25 +0.9375 0.2812 0.2812 +0.9375 0.2812 0.3125 +0.9375 0.2812 0.3438 +0.9375 0.2812 0.375 +0.9375 0.2812 0.4062 +0.9375 0.2812 0.4375 +0.9375 0.2812 0.4688 +0.9375 0.2812 0.5 +0.9375 0.2812 0.5312 +0.9375 0.2812 0.5625 +0.9375 0.2812 0.5938 +0.9375 0.2812 0.625 +0.9375 0.2812 0.6562 +0.9375 0.2812 0.6875 +0.9375 0.2812 0.7188 +0.9375 0.2812 0.75 +0.9375 0.2812 0.7812 +0.9375 0.2812 0.8125 +0.9375 0.2812 0.8438 +0.9375 0.2812 0.875 +0.9375 0.2812 0.9062 +0.9375 0.2812 0.9375 +0.9375 0.2812 0.9688 +0.9375 0.2812 1 +0.9375 0.3125 0 +0.9375 0.3125 0.03125 +0.9375 0.3125 0.0625 +0.9375 0.3125 0.09375 +0.9375 0.3125 0.125 +0.9375 0.3125 0.1562 +0.9375 0.3125 0.1875 +0.9375 0.3125 0.2188 +0.9375 0.3125 0.25 +0.9375 0.3125 0.2812 +0.9375 0.3125 0.3125 +0.9375 0.3125 0.3438 +0.9375 0.3125 0.375 +0.9375 0.3125 0.4062 +0.9375 0.3125 0.4375 +0.9375 0.3125 0.4688 +0.9375 0.3125 0.5 +0.9375 0.3125 0.5312 +0.9375 0.3125 0.5625 +0.9375 0.3125 0.5938 +0.9375 0.3125 0.625 +0.9375 0.3125 0.6562 +0.9375 0.3125 0.6875 +0.9375 0.3125 0.7188 +0.9375 0.3125 0.75 +0.9375 0.3125 0.7812 +0.9375 0.3125 0.8125 +0.9375 0.3125 0.8438 +0.9375 0.3125 0.875 +0.9375 0.3125 0.9062 +0.9375 0.3125 0.9375 +0.9375 0.3125 0.9688 +0.9375 0.3125 1 +0.9375 0.3438 0 +0.9375 0.3438 0.03125 +0.9375 0.3438 0.0625 +0.9375 0.3438 0.09375 +0.9375 0.3438 0.125 +0.9375 0.3438 0.1562 +0.9375 0.3438 0.1875 +0.9375 0.3438 0.2188 +0.9375 0.3438 0.25 +0.9375 0.3438 0.2812 +0.9375 0.3438 0.3125 +0.9375 0.3438 0.3438 +0.9375 0.3438 0.375 +0.9375 0.3438 0.4062 +0.9375 0.3438 0.4375 +0.9375 0.3438 0.4688 +0.9375 0.3438 0.5 +0.9375 0.3438 0.5312 +0.9375 0.3438 0.5625 +0.9375 0.3438 0.5938 +0.9375 0.3438 0.625 +0.9375 0.3438 0.6562 +0.9375 0.3438 0.6875 +0.9375 0.3438 0.7188 +0.9375 0.3438 0.75 +0.9375 0.3438 0.7812 +0.9375 0.3438 0.8125 +0.9375 0.3438 0.8438 +0.9375 0.3438 0.875 +0.9375 0.3438 0.9062 +0.9375 0.3438 0.9375 +0.9375 0.3438 0.9688 +0.9375 0.3438 1 +0.9375 0.375 0 +0.9375 0.375 0.03125 +0.9375 0.375 0.0625 +0.9375 0.375 0.09375 +0.9375 0.375 0.125 +0.9375 0.375 0.1562 +0.9375 0.375 0.1875 +0.9375 0.375 0.2188 +0.9375 0.375 0.25 +0.9375 0.375 0.2812 +0.9375 0.375 0.3125 +0.9375 0.375 0.3438 +0.9375 0.375 0.375 +0.9375 0.375 0.4062 +0.9375 0.375 0.4375 +0.9375 0.375 0.4688 +0.9375 0.375 0.5 +0.9375 0.375 0.5312 +0.9375 0.375 0.5625 +0.9375 0.375 0.5938 +0.9375 0.375 0.625 +0.9375 0.375 0.6562 +0.9375 0.375 0.6875 +0.9375 0.375 0.7188 +0.9375 0.375 0.75 +0.9375 0.375 0.7812 +0.9375 0.375 0.8125 +0.9375 0.375 0.8438 +0.9375 0.375 0.875 +0.9375 0.375 0.9062 +0.9375 0.375 0.9375 +0.9375 0.375 0.9688 +0.9375 0.375 1 +0.9375 0.4062 0 +0.9375 0.4062 0.03125 +0.9375 0.4062 0.0625 +0.9375 0.4062 0.09375 +0.9375 0.4062 0.125 +0.9375 0.4062 0.1562 +0.9375 0.4062 0.1875 +0.9375 0.4062 0.2188 +0.9375 0.4062 0.25 +0.9375 0.4062 0.2812 +0.9375 0.4062 0.3125 +0.9375 0.4062 0.3438 +0.9375 0.4062 0.375 +0.9375 0.4062 0.4062 +0.9375 0.4062 0.4375 +0.9375 0.4062 0.4688 +0.9375 0.4062 0.5 +0.9375 0.4062 0.5312 +0.9375 0.4062 0.5625 +0.9375 0.4062 0.5938 +0.9375 0.4062 0.625 +0.9375 0.4062 0.6562 +0.9375 0.4062 0.6875 +0.9375 0.4062 0.7188 +0.9375 0.4062 0.75 +0.9375 0.4062 0.7812 +0.9375 0.4062 0.8125 +0.9375 0.4062 0.8438 +0.9375 0.4062 0.875 +0.9375 0.4062 0.9062 +0.9375 0.4062 0.9375 +0.9375 0.4062 0.9688 +0.9375 0.4062 1 +0.9375 0.4375 0 +0.9375 0.4375 0.03125 +0.9375 0.4375 0.0625 +0.9375 0.4375 0.09375 +0.9375 0.4375 0.125 +0.9375 0.4375 0.1562 +0.9375 0.4375 0.1875 +0.9375 0.4375 0.2188 +0.9375 0.4375 0.25 +0.9375 0.4375 0.2812 +0.9375 0.4375 0.3125 +0.9375 0.4375 0.3438 +0.9375 0.4375 0.375 +0.9375 0.4375 0.4062 +0.9375 0.4375 0.4375 +0.9375 0.4375 0.4688 +0.9375 0.4375 0.5 +0.9375 0.4375 0.5312 +0.9375 0.4375 0.5625 +0.9375 0.4375 0.5938 +0.9375 0.4375 0.625 +0.9375 0.4375 0.6562 +0.9375 0.4375 0.6875 +0.9375 0.4375 0.7188 +0.9375 0.4375 0.75 +0.9375 0.4375 0.7812 +0.9375 0.4375 0.8125 +0.9375 0.4375 0.8438 +0.9375 0.4375 0.875 +0.9375 0.4375 0.9062 +0.9375 0.4375 0.9375 +0.9375 0.4375 0.9688 +0.9375 0.4375 1 +0.9375 0.4688 0 +0.9375 0.4688 0.03125 +0.9375 0.4688 0.0625 +0.9375 0.4688 0.09375 +0.9375 0.4688 0.125 +0.9375 0.4688 0.1562 +0.9375 0.4688 0.1875 +0.9375 0.4688 0.2188 +0.9375 0.4688 0.25 +0.9375 0.4688 0.2812 +0.9375 0.4688 0.3125 +0.9375 0.4688 0.3438 +0.9375 0.4688 0.375 +0.9375 0.4688 0.4062 +0.9375 0.4688 0.4375 +0.9375 0.4688 0.4688 +0.9375 0.4688 0.5 +0.9375 0.4688 0.5312 +0.9375 0.4688 0.5625 +0.9375 0.4688 0.5938 +0.9375 0.4688 0.625 +0.9375 0.4688 0.6562 +0.9375 0.4688 0.6875 +0.9375 0.4688 0.7188 +0.9375 0.4688 0.75 +0.9375 0.4688 0.7812 +0.9375 0.4688 0.8125 +0.9375 0.4688 0.8438 +0.9375 0.4688 0.875 +0.9375 0.4688 0.9062 +0.9375 0.4688 0.9375 +0.9375 0.4688 0.9688 +0.9375 0.4688 1 +0.9375 0.5 0 +0.9375 0.5 0.03125 +0.9375 0.5 0.0625 +0.9375 0.5 0.09375 +0.9375 0.5 0.125 +0.9375 0.5 0.1562 +0.9375 0.5 0.1875 +0.9375 0.5 0.2188 +0.9375 0.5 0.25 +0.9375 0.5 0.2812 +0.9375 0.5 0.3125 +0.9375 0.5 0.3438 +0.9375 0.5 0.375 +0.9375 0.5 0.4062 +0.9375 0.5 0.4375 +0.9375 0.5 0.4688 +0.9375 0.5 0.5 +0.9375 0.5 0.5312 +0.9375 0.5 0.5625 +0.9375 0.5 0.5938 +0.9375 0.5 0.625 +0.9375 0.5 0.6562 +0.9375 0.5 0.6875 +0.9375 0.5 0.7188 +0.9375 0.5 0.75 +0.9375 0.5 0.7812 +0.9375 0.5 0.8125 +0.9375 0.5 0.8438 +0.9375 0.5 0.875 +0.9375 0.5 0.9062 +0.9375 0.5 0.9375 +0.9375 0.5 0.9688 +0.9375 0.5 1 +0.9375 0.5312 0 +0.9375 0.5312 0.03125 +0.9375 0.5312 0.0625 +0.9375 0.5312 0.09375 +0.9375 0.5312 0.125 +0.9375 0.5312 0.1562 +0.9375 0.5312 0.1875 +0.9375 0.5312 0.2188 +0.9375 0.5312 0.25 +0.9375 0.5312 0.2812 +0.9375 0.5312 0.3125 +0.9375 0.5312 0.3438 +0.9375 0.5312 0.375 +0.9375 0.5312 0.4062 +0.9375 0.5312 0.4375 +0.9375 0.5312 0.4688 +0.9375 0.5312 0.5 +0.9375 0.5312 0.5312 +0.9375 0.5312 0.5625 +0.9375 0.5312 0.5938 +0.9375 0.5312 0.625 +0.9375 0.5312 0.6562 +0.9375 0.5312 0.6875 +0.9375 0.5312 0.7188 +0.9375 0.5312 0.75 +0.9375 0.5312 0.7812 +0.9375 0.5312 0.8125 +0.9375 0.5312 0.8438 +0.9375 0.5312 0.875 +0.9375 0.5312 0.9062 +0.9375 0.5312 0.9375 +0.9375 0.5312 0.9688 +0.9375 0.5312 1 +0.9375 0.5625 0 +0.9375 0.5625 0.03125 +0.9375 0.5625 0.0625 +0.9375 0.5625 0.09375 +0.9375 0.5625 0.125 +0.9375 0.5625 0.1562 +0.9375 0.5625 0.1875 +0.9375 0.5625 0.2188 +0.9375 0.5625 0.25 +0.9375 0.5625 0.2812 +0.9375 0.5625 0.3125 +0.9375 0.5625 0.3438 +0.9375 0.5625 0.375 +0.9375 0.5625 0.4062 +0.9375 0.5625 0.4375 +0.9375 0.5625 0.4688 +0.9375 0.5625 0.5 +0.9375 0.5625 0.5312 +0.9375 0.5625 0.5625 +0.9375 0.5625 0.5938 +0.9375 0.5625 0.625 +0.9375 0.5625 0.6562 +0.9375 0.5625 0.6875 +0.9375 0.5625 0.7188 +0.9375 0.5625 0.75 +0.9375 0.5625 0.7812 +0.9375 0.5625 0.8125 +0.9375 0.5625 0.8438 +0.9375 0.5625 0.875 +0.9375 0.5625 0.9062 +0.9375 0.5625 0.9375 +0.9375 0.5625 0.9688 +0.9375 0.5625 1 +0.9375 0.5938 0 +0.9375 0.5938 0.03125 +0.9375 0.5938 0.0625 +0.9375 0.5938 0.09375 +0.9375 0.5938 0.125 +0.9375 0.5938 0.1562 +0.9375 0.5938 0.1875 +0.9375 0.5938 0.2188 +0.9375 0.5938 0.25 +0.9375 0.5938 0.2812 +0.9375 0.5938 0.3125 +0.9375 0.5938 0.3438 +0.9375 0.5938 0.375 +0.9375 0.5938 0.4062 +0.9375 0.5938 0.4375 +0.9375 0.5938 0.4688 +0.9375 0.5938 0.5 +0.9375 0.5938 0.5312 +0.9375 0.5938 0.5625 +0.9375 0.5938 0.5938 +0.9375 0.5938 0.625 +0.9375 0.5938 0.6562 +0.9375 0.5938 0.6875 +0.9375 0.5938 0.7188 +0.9375 0.5938 0.75 +0.9375 0.5938 0.7812 +0.9375 0.5938 0.8125 +0.9375 0.5938 0.8438 +0.9375 0.5938 0.875 +0.9375 0.5938 0.9062 +0.9375 0.5938 0.9375 +0.9375 0.5938 0.9688 +0.9375 0.5938 1 +0.9375 0.625 0 +0.9375 0.625 0.03125 +0.9375 0.625 0.0625 +0.9375 0.625 0.09375 +0.9375 0.625 0.125 +0.9375 0.625 0.1562 +0.9375 0.625 0.1875 +0.9375 0.625 0.2188 +0.9375 0.625 0.25 +0.9375 0.625 0.2812 +0.9375 0.625 0.3125 +0.9375 0.625 0.3438 +0.9375 0.625 0.375 +0.9375 0.625 0.4062 +0.9375 0.625 0.4375 +0.9375 0.625 0.4688 +0.9375 0.625 0.5 +0.9375 0.625 0.5312 +0.9375 0.625 0.5625 +0.9375 0.625 0.5938 +0.9375 0.625 0.625 +0.9375 0.625 0.6562 +0.9375 0.625 0.6875 +0.9375 0.625 0.7188 +0.9375 0.625 0.75 +0.9375 0.625 0.7812 +0.9375 0.625 0.8125 +0.9375 0.625 0.8438 +0.9375 0.625 0.875 +0.9375 0.625 0.9062 +0.9375 0.625 0.9375 +0.9375 0.625 0.9688 +0.9375 0.625 1 +0.9375 0.6562 0 +0.9375 0.6562 0.03125 +0.9375 0.6562 0.0625 +0.9375 0.6562 0.09375 +0.9375 0.6562 0.125 +0.9375 0.6562 0.1562 +0.9375 0.6562 0.1875 +0.9375 0.6562 0.2188 +0.9375 0.6562 0.25 +0.9375 0.6562 0.2812 +0.9375 0.6562 0.3125 +0.9375 0.6562 0.3438 +0.9375 0.6562 0.375 +0.9375 0.6562 0.4062 +0.9375 0.6562 0.4375 +0.9375 0.6562 0.4688 +0.9375 0.6562 0.5 +0.9375 0.6562 0.5312 +0.9375 0.6562 0.5625 +0.9375 0.6562 0.5938 +0.9375 0.6562 0.625 +0.9375 0.6562 0.6562 +0.9375 0.6562 0.6875 +0.9375 0.6562 0.7188 +0.9375 0.6562 0.75 +0.9375 0.6562 0.7812 +0.9375 0.6562 0.8125 +0.9375 0.6562 0.8438 +0.9375 0.6562 0.875 +0.9375 0.6562 0.9062 +0.9375 0.6562 0.9375 +0.9375 0.6562 0.9688 +0.9375 0.6562 1 +0.9375 0.6875 0 +0.9375 0.6875 0.03125 +0.9375 0.6875 0.0625 +0.9375 0.6875 0.09375 +0.9375 0.6875 0.125 +0.9375 0.6875 0.1562 +0.9375 0.6875 0.1875 +0.9375 0.6875 0.2188 +0.9375 0.6875 0.25 +0.9375 0.6875 0.2812 +0.9375 0.6875 0.3125 +0.9375 0.6875 0.3438 +0.9375 0.6875 0.375 +0.9375 0.6875 0.4062 +0.9375 0.6875 0.4375 +0.9375 0.6875 0.4688 +0.9375 0.6875 0.5 +0.9375 0.6875 0.5312 +0.9375 0.6875 0.5625 +0.9375 0.6875 0.5938 +0.9375 0.6875 0.625 +0.9375 0.6875 0.6562 +0.9375 0.6875 0.6875 +0.9375 0.6875 0.7188 +0.9375 0.6875 0.75 +0.9375 0.6875 0.7812 +0.9375 0.6875 0.8125 +0.9375 0.6875 0.8438 +0.9375 0.6875 0.875 +0.9375 0.6875 0.9062 +0.9375 0.6875 0.9375 +0.9375 0.6875 0.9688 +0.9375 0.6875 1 +0.9375 0.7188 0 +0.9375 0.7188 0.03125 +0.9375 0.7188 0.0625 +0.9375 0.7188 0.09375 +0.9375 0.7188 0.125 +0.9375 0.7188 0.1562 +0.9375 0.7188 0.1875 +0.9375 0.7188 0.2188 +0.9375 0.7188 0.25 +0.9375 0.7188 0.2812 +0.9375 0.7188 0.3125 +0.9375 0.7188 0.3438 +0.9375 0.7188 0.375 +0.9375 0.7188 0.4062 +0.9375 0.7188 0.4375 +0.9375 0.7188 0.4688 +0.9375 0.7188 0.5 +0.9375 0.7188 0.5312 +0.9375 0.7188 0.5625 +0.9375 0.7188 0.5938 +0.9375 0.7188 0.625 +0.9375 0.7188 0.6562 +0.9375 0.7188 0.6875 +0.9375 0.7188 0.7188 +0.9375 0.7188 0.75 +0.9375 0.7188 0.7812 +0.9375 0.7188 0.8125 +0.9375 0.7188 0.8438 +0.9375 0.7188 0.875 +0.9375 0.7188 0.9062 +0.9375 0.7188 0.9375 +0.9375 0.7188 0.9688 +0.9375 0.7188 1 +0.9375 0.75 0 +0.9375 0.75 0.03125 +0.9375 0.75 0.0625 +0.9375 0.75 0.09375 +0.9375 0.75 0.125 +0.9375 0.75 0.1562 +0.9375 0.75 0.1875 +0.9375 0.75 0.2188 +0.9375 0.75 0.25 +0.9375 0.75 0.2812 +0.9375 0.75 0.3125 +0.9375 0.75 0.3438 +0.9375 0.75 0.375 +0.9375 0.75 0.4062 +0.9375 0.75 0.4375 +0.9375 0.75 0.4688 +0.9375 0.75 0.5 +0.9375 0.75 0.5312 +0.9375 0.75 0.5625 +0.9375 0.75 0.5938 +0.9375 0.75 0.625 +0.9375 0.75 0.6562 +0.9375 0.75 0.6875 +0.9375 0.75 0.7188 +0.9375 0.75 0.75 +0.9375 0.75 0.7812 +0.9375 0.75 0.8125 +0.9375 0.75 0.8438 +0.9375 0.75 0.875 +0.9375 0.75 0.9062 +0.9375 0.75 0.9375 +0.9375 0.75 0.9688 +0.9375 0.75 1 +0.9375 0.7812 0 +0.9375 0.7812 0.03125 +0.9375 0.7812 0.0625 +0.9375 0.7812 0.09375 +0.9375 0.7812 0.125 +0.9375 0.7812 0.1562 +0.9375 0.7812 0.1875 +0.9375 0.7812 0.2188 +0.9375 0.7812 0.25 +0.9375 0.7812 0.2812 +0.9375 0.7812 0.3125 +0.9375 0.7812 0.3438 +0.9375 0.7812 0.375 +0.9375 0.7812 0.4062 +0.9375 0.7812 0.4375 +0.9375 0.7812 0.4688 +0.9375 0.7812 0.5 +0.9375 0.7812 0.5312 +0.9375 0.7812 0.5625 +0.9375 0.7812 0.5938 +0.9375 0.7812 0.625 +0.9375 0.7812 0.6562 +0.9375 0.7812 0.6875 +0.9375 0.7812 0.7188 +0.9375 0.7812 0.75 +0.9375 0.7812 0.7812 +0.9375 0.7812 0.8125 +0.9375 0.7812 0.8438 +0.9375 0.7812 0.875 +0.9375 0.7812 0.9062 +0.9375 0.7812 0.9375 +0.9375 0.7812 0.9688 +0.9375 0.7812 1 +0.9375 0.8125 0 +0.9375 0.8125 0.03125 +0.9375 0.8125 0.0625 +0.9375 0.8125 0.09375 +0.9375 0.8125 0.125 +0.9375 0.8125 0.1562 +0.9375 0.8125 0.1875 +0.9375 0.8125 0.2188 +0.9375 0.8125 0.25 +0.9375 0.8125 0.2812 +0.9375 0.8125 0.3125 +0.9375 0.8125 0.3438 +0.9375 0.8125 0.375 +0.9375 0.8125 0.4062 +0.9375 0.8125 0.4375 +0.9375 0.8125 0.4688 +0.9375 0.8125 0.5 +0.9375 0.8125 0.5312 +0.9375 0.8125 0.5625 +0.9375 0.8125 0.5938 +0.9375 0.8125 0.625 +0.9375 0.8125 0.6562 +0.9375 0.8125 0.6875 +0.9375 0.8125 0.7188 +0.9375 0.8125 0.75 +0.9375 0.8125 0.7812 +0.9375 0.8125 0.8125 +0.9375 0.8125 0.8438 +0.9375 0.8125 0.875 +0.9375 0.8125 0.9062 +0.9375 0.8125 0.9375 +0.9375 0.8125 0.9688 +0.9375 0.8125 1 +0.9375 0.8438 0 +0.9375 0.8438 0.03125 +0.9375 0.8438 0.0625 +0.9375 0.8438 0.09375 +0.9375 0.8438 0.125 +0.9375 0.8438 0.1562 +0.9375 0.8438 0.1875 +0.9375 0.8438 0.2188 +0.9375 0.8438 0.25 +0.9375 0.8438 0.2812 +0.9375 0.8438 0.3125 +0.9375 0.8438 0.3438 +0.9375 0.8438 0.375 +0.9375 0.8438 0.4062 +0.9375 0.8438 0.4375 +0.9375 0.8438 0.4688 +0.9375 0.8438 0.5 +0.9375 0.8438 0.5312 +0.9375 0.8438 0.5625 +0.9375 0.8438 0.5938 +0.9375 0.8438 0.625 +0.9375 0.8438 0.6562 +0.9375 0.8438 0.6875 +0.9375 0.8438 0.7188 +0.9375 0.8438 0.75 +0.9375 0.8438 0.7812 +0.9375 0.8438 0.8125 +0.9375 0.8438 0.8438 +0.9375 0.8438 0.875 +0.9375 0.8438 0.9062 +0.9375 0.8438 0.9375 +0.9375 0.8438 0.9688 +0.9375 0.8438 1 +0.9375 0.875 0 +0.9375 0.875 0.03125 +0.9375 0.875 0.0625 +0.9375 0.875 0.09375 +0.9375 0.875 0.125 +0.9375 0.875 0.1562 +0.9375 0.875 0.1875 +0.9375 0.875 0.2188 +0.9375 0.875 0.25 +0.9375 0.875 0.2812 +0.9375 0.875 0.3125 +0.9375 0.875 0.3438 +0.9375 0.875 0.375 +0.9375 0.875 0.4062 +0.9375 0.875 0.4375 +0.9375 0.875 0.4688 +0.9375 0.875 0.5 +0.9375 0.875 0.5312 +0.9375 0.875 0.5625 +0.9375 0.875 0.5938 +0.9375 0.875 0.625 +0.9375 0.875 0.6562 +0.9375 0.875 0.6875 +0.9375 0.875 0.7188 +0.9375 0.875 0.75 +0.9375 0.875 0.7812 +0.9375 0.875 0.8125 +0.9375 0.875 0.8438 +0.9375 0.875 0.875 +0.9375 0.875 0.9062 +0.9375 0.875 0.9375 +0.9375 0.875 0.9688 +0.9375 0.875 1 +0.9375 0.9062 0 +0.9375 0.9062 0.03125 +0.9375 0.9062 0.0625 +0.9375 0.9062 0.09375 +0.9375 0.9062 0.125 +0.9375 0.9062 0.1562 +0.9375 0.9062 0.1875 +0.9375 0.9062 0.2188 +0.9375 0.9062 0.25 +0.9375 0.9062 0.2812 +0.9375 0.9062 0.3125 +0.9375 0.9062 0.3438 +0.9375 0.9062 0.375 +0.9375 0.9062 0.4062 +0.9375 0.9062 0.4375 +0.9375 0.9062 0.4688 +0.9375 0.9062 0.5 +0.9375 0.9062 0.5312 +0.9375 0.9062 0.5625 +0.9375 0.9062 0.5938 +0.9375 0.9062 0.625 +0.9375 0.9062 0.6562 +0.9375 0.9062 0.6875 +0.9375 0.9062 0.7188 +0.9375 0.9062 0.75 +0.9375 0.9062 0.7812 +0.9375 0.9062 0.8125 +0.9375 0.9062 0.8438 +0.9375 0.9062 0.875 +0.9375 0.9062 0.9062 +0.9375 0.9062 0.9375 +0.9375 0.9062 0.9688 +0.9375 0.9062 1 +0.9375 0.9375 0 +0.9375 0.9375 0.03125 +0.9375 0.9375 0.0625 +0.9375 0.9375 0.09375 +0.9375 0.9375 0.125 +0.9375 0.9375 0.1562 +0.9375 0.9375 0.1875 +0.9375 0.9375 0.2188 +0.9375 0.9375 0.25 +0.9375 0.9375 0.2812 +0.9375 0.9375 0.3125 +0.9375 0.9375 0.3438 +0.9375 0.9375 0.375 +0.9375 0.9375 0.4062 +0.9375 0.9375 0.4375 +0.9375 0.9375 0.4688 +0.9375 0.9375 0.5 +0.9375 0.9375 0.5312 +0.9375 0.9375 0.5625 +0.9375 0.9375 0.5938 +0.9375 0.9375 0.625 +0.9375 0.9375 0.6562 +0.9375 0.9375 0.6875 +0.9375 0.9375 0.7188 +0.9375 0.9375 0.75 +0.9375 0.9375 0.7812 +0.9375 0.9375 0.8125 +0.9375 0.9375 0.8438 +0.9375 0.9375 0.875 +0.9375 0.9375 0.9062 +0.9375 0.9375 0.9375 +0.9375 0.9375 0.9688 +0.9375 0.9375 1 +0.9375 0.9688 0 +0.9375 0.9688 0.03125 +0.9375 0.9688 0.0625 +0.9375 0.9688 0.09375 +0.9375 0.9688 0.125 +0.9375 0.9688 0.1562 +0.9375 0.9688 0.1875 +0.9375 0.9688 0.2188 +0.9375 0.9688 0.25 +0.9375 0.9688 0.2812 +0.9375 0.9688 0.3125 +0.9375 0.9688 0.3438 +0.9375 0.9688 0.375 +0.9375 0.9688 0.4062 +0.9375 0.9688 0.4375 +0.9375 0.9688 0.4688 +0.9375 0.9688 0.5 +0.9375 0.9688 0.5312 +0.9375 0.9688 0.5625 +0.9375 0.9688 0.5938 +0.9375 0.9688 0.625 +0.9375 0.9688 0.6562 +0.9375 0.9688 0.6875 +0.9375 0.9688 0.7188 +0.9375 0.9688 0.75 +0.9375 0.9688 0.7812 +0.9375 0.9688 0.8125 +0.9375 0.9688 0.8438 +0.9375 0.9688 0.875 +0.9375 0.9688 0.9062 +0.9375 0.9688 0.9375 +0.9375 0.9688 0.9688 +0.9375 0.9688 1 +0.9375 1 0 +0.9375 1 0.03125 +0.9375 1 0.0625 +0.9375 1 0.09375 +0.9375 1 0.125 +0.9375 1 0.1562 +0.9375 1 0.1875 +0.9375 1 0.2188 +0.9375 1 0.25 +0.9375 1 0.2812 +0.9375 1 0.3125 +0.9375 1 0.3438 +0.9375 1 0.375 +0.9375 1 0.4062 +0.9375 1 0.4375 +0.9375 1 0.4688 +0.9375 1 0.5 +0.9375 1 0.5312 +0.9375 1 0.5625 +0.9375 1 0.5938 +0.9375 1 0.625 +0.9375 1 0.6562 +0.9375 1 0.6875 +0.9375 1 0.7188 +0.9375 1 0.75 +0.9375 1 0.7812 +0.9375 1 0.8125 +0.9375 1 0.8438 +0.9375 1 0.875 +0.9375 1 0.9062 +0.9375 1 0.9375 +0.9375 1 0.9688 +0.9375 1 1 +0.9688 0 0 +0.9688 0 0.03125 +0.9688 0 0.0625 +0.9688 0 0.09375 +0.9688 0 0.125 +0.9688 0 0.1562 +0.9688 0 0.1875 +0.9688 0 0.2188 +0.9688 0 0.25 +0.9688 0 0.2812 +0.9688 0 0.3125 +0.9688 0 0.3438 +0.9688 0 0.375 +0.9688 0 0.4062 +0.9688 0 0.4375 +0.9688 0 0.4688 +0.9688 0 0.5 +0.9688 0 0.5312 +0.9688 0 0.5625 +0.9688 0 0.5938 +0.9688 0 0.625 +0.9688 0 0.6562 +0.9688 0 0.6875 +0.9688 0 0.7188 +0.9688 0 0.75 +0.9688 0 0.7812 +0.9688 0 0.8125 +0.9688 0 0.8438 +0.9688 0 0.875 +0.9688 0 0.9062 +0.9688 0 0.9375 +0.9688 0 0.9688 +0.9688 0 1 +0.9688 0.03125 0 +0.9688 0.03125 0.03125 +0.9688 0.03125 0.0625 +0.9688 0.03125 0.09375 +0.9688 0.03125 0.125 +0.9688 0.03125 0.1562 +0.9688 0.03125 0.1875 +0.9688 0.03125 0.2188 +0.9688 0.03125 0.25 +0.9688 0.03125 0.2812 +0.9688 0.03125 0.3125 +0.9688 0.03125 0.3438 +0.9688 0.03125 0.375 +0.9688 0.03125 0.4062 +0.9688 0.03125 0.4375 +0.9688 0.03125 0.4688 +0.9688 0.03125 0.5 +0.9688 0.03125 0.5312 +0.9688 0.03125 0.5625 +0.9688 0.03125 0.5938 +0.9688 0.03125 0.625 +0.9688 0.03125 0.6562 +0.9688 0.03125 0.6875 +0.9688 0.03125 0.7188 +0.9688 0.03125 0.75 +0.9688 0.03125 0.7812 +0.9688 0.03125 0.8125 +0.9688 0.03125 0.8438 +0.9688 0.03125 0.875 +0.9688 0.03125 0.9062 +0.9688 0.03125 0.9375 +0.9688 0.03125 0.9688 +0.9688 0.03125 1 +0.9688 0.0625 0 +0.9688 0.0625 0.03125 +0.9688 0.0625 0.0625 +0.9688 0.0625 0.09375 +0.9688 0.0625 0.125 +0.9688 0.0625 0.1562 +0.9688 0.0625 0.1875 +0.9688 0.0625 0.2188 +0.9688 0.0625 0.25 +0.9688 0.0625 0.2812 +0.9688 0.0625 0.3125 +0.9688 0.0625 0.3438 +0.9688 0.0625 0.375 +0.9688 0.0625 0.4062 +0.9688 0.0625 0.4375 +0.9688 0.0625 0.4688 +0.9688 0.0625 0.5 +0.9688 0.0625 0.5312 +0.9688 0.0625 0.5625 +0.9688 0.0625 0.5938 +0.9688 0.0625 0.625 +0.9688 0.0625 0.6562 +0.9688 0.0625 0.6875 +0.9688 0.0625 0.7188 +0.9688 0.0625 0.75 +0.9688 0.0625 0.7812 +0.9688 0.0625 0.8125 +0.9688 0.0625 0.8438 +0.9688 0.0625 0.875 +0.9688 0.0625 0.9062 +0.9688 0.0625 0.9375 +0.9688 0.0625 0.9688 +0.9688 0.0625 1 +0.9688 0.09375 0 +0.9688 0.09375 0.03125 +0.9688 0.09375 0.0625 +0.9688 0.09375 0.09375 +0.9688 0.09375 0.125 +0.9688 0.09375 0.1562 +0.9688 0.09375 0.1875 +0.9688 0.09375 0.2188 +0.9688 0.09375 0.25 +0.9688 0.09375 0.2812 +0.9688 0.09375 0.3125 +0.9688 0.09375 0.3438 +0.9688 0.09375 0.375 +0.9688 0.09375 0.4062 +0.9688 0.09375 0.4375 +0.9688 0.09375 0.4688 +0.9688 0.09375 0.5 +0.9688 0.09375 0.5312 +0.9688 0.09375 0.5625 +0.9688 0.09375 0.5938 +0.9688 0.09375 0.625 +0.9688 0.09375 0.6562 +0.9688 0.09375 0.6875 +0.9688 0.09375 0.7188 +0.9688 0.09375 0.75 +0.9688 0.09375 0.7812 +0.9688 0.09375 0.8125 +0.9688 0.09375 0.8438 +0.9688 0.09375 0.875 +0.9688 0.09375 0.9062 +0.9688 0.09375 0.9375 +0.9688 0.09375 0.9688 +0.9688 0.09375 1 +0.9688 0.125 0 +0.9688 0.125 0.03125 +0.9688 0.125 0.0625 +0.9688 0.125 0.09375 +0.9688 0.125 0.125 +0.9688 0.125 0.1562 +0.9688 0.125 0.1875 +0.9688 0.125 0.2188 +0.9688 0.125 0.25 +0.9688 0.125 0.2812 +0.9688 0.125 0.3125 +0.9688 0.125 0.3438 +0.9688 0.125 0.375 +0.9688 0.125 0.4062 +0.9688 0.125 0.4375 +0.9688 0.125 0.4688 +0.9688 0.125 0.5 +0.9688 0.125 0.5312 +0.9688 0.125 0.5625 +0.9688 0.125 0.5938 +0.9688 0.125 0.625 +0.9688 0.125 0.6562 +0.9688 0.125 0.6875 +0.9688 0.125 0.7188 +0.9688 0.125 0.75 +0.9688 0.125 0.7812 +0.9688 0.125 0.8125 +0.9688 0.125 0.8438 +0.9688 0.125 0.875 +0.9688 0.125 0.9062 +0.9688 0.125 0.9375 +0.9688 0.125 0.9688 +0.9688 0.125 1 +0.9688 0.1562 0 +0.9688 0.1562 0.03125 +0.9688 0.1562 0.0625 +0.9688 0.1562 0.09375 +0.9688 0.1562 0.125 +0.9688 0.1562 0.1562 +0.9688 0.1562 0.1875 +0.9688 0.1562 0.2188 +0.9688 0.1562 0.25 +0.9688 0.1562 0.2812 +0.9688 0.1562 0.3125 +0.9688 0.1562 0.3438 +0.9688 0.1562 0.375 +0.9688 0.1562 0.4062 +0.9688 0.1562 0.4375 +0.9688 0.1562 0.4688 +0.9688 0.1562 0.5 +0.9688 0.1562 0.5312 +0.9688 0.1562 0.5625 +0.9688 0.1562 0.5938 +0.9688 0.1562 0.625 +0.9688 0.1562 0.6562 +0.9688 0.1562 0.6875 +0.9688 0.1562 0.7188 +0.9688 0.1562 0.75 +0.9688 0.1562 0.7812 +0.9688 0.1562 0.8125 +0.9688 0.1562 0.8438 +0.9688 0.1562 0.875 +0.9688 0.1562 0.9062 +0.9688 0.1562 0.9375 +0.9688 0.1562 0.9688 +0.9688 0.1562 1 +0.9688 0.1875 0 +0.9688 0.1875 0.03125 +0.9688 0.1875 0.0625 +0.9688 0.1875 0.09375 +0.9688 0.1875 0.125 +0.9688 0.1875 0.1562 +0.9688 0.1875 0.1875 +0.9688 0.1875 0.2188 +0.9688 0.1875 0.25 +0.9688 0.1875 0.2812 +0.9688 0.1875 0.3125 +0.9688 0.1875 0.3438 +0.9688 0.1875 0.375 +0.9688 0.1875 0.4062 +0.9688 0.1875 0.4375 +0.9688 0.1875 0.4688 +0.9688 0.1875 0.5 +0.9688 0.1875 0.5312 +0.9688 0.1875 0.5625 +0.9688 0.1875 0.5938 +0.9688 0.1875 0.625 +0.9688 0.1875 0.6562 +0.9688 0.1875 0.6875 +0.9688 0.1875 0.7188 +0.9688 0.1875 0.75 +0.9688 0.1875 0.7812 +0.9688 0.1875 0.8125 +0.9688 0.1875 0.8438 +0.9688 0.1875 0.875 +0.9688 0.1875 0.9062 +0.9688 0.1875 0.9375 +0.9688 0.1875 0.9688 +0.9688 0.1875 1 +0.9688 0.2188 0 +0.9688 0.2188 0.03125 +0.9688 0.2188 0.0625 +0.9688 0.2188 0.09375 +0.9688 0.2188 0.125 +0.9688 0.2188 0.1562 +0.9688 0.2188 0.1875 +0.9688 0.2188 0.2188 +0.9688 0.2188 0.25 +0.9688 0.2188 0.2812 +0.9688 0.2188 0.3125 +0.9688 0.2188 0.3438 +0.9688 0.2188 0.375 +0.9688 0.2188 0.4062 +0.9688 0.2188 0.4375 +0.9688 0.2188 0.4688 +0.9688 0.2188 0.5 +0.9688 0.2188 0.5312 +0.9688 0.2188 0.5625 +0.9688 0.2188 0.5938 +0.9688 0.2188 0.625 +0.9688 0.2188 0.6562 +0.9688 0.2188 0.6875 +0.9688 0.2188 0.7188 +0.9688 0.2188 0.75 +0.9688 0.2188 0.7812 +0.9688 0.2188 0.8125 +0.9688 0.2188 0.8438 +0.9688 0.2188 0.875 +0.9688 0.2188 0.9062 +0.9688 0.2188 0.9375 +0.9688 0.2188 0.9688 +0.9688 0.2188 1 +0.9688 0.25 0 +0.9688 0.25 0.03125 +0.9688 0.25 0.0625 +0.9688 0.25 0.09375 +0.9688 0.25 0.125 +0.9688 0.25 0.1562 +0.9688 0.25 0.1875 +0.9688 0.25 0.2188 +0.9688 0.25 0.25 +0.9688 0.25 0.2812 +0.9688 0.25 0.3125 +0.9688 0.25 0.3438 +0.9688 0.25 0.375 +0.9688 0.25 0.4062 +0.9688 0.25 0.4375 +0.9688 0.25 0.4688 +0.9688 0.25 0.5 +0.9688 0.25 0.5312 +0.9688 0.25 0.5625 +0.9688 0.25 0.5938 +0.9688 0.25 0.625 +0.9688 0.25 0.6562 +0.9688 0.25 0.6875 +0.9688 0.25 0.7188 +0.9688 0.25 0.75 +0.9688 0.25 0.7812 +0.9688 0.25 0.8125 +0.9688 0.25 0.8438 +0.9688 0.25 0.875 +0.9688 0.25 0.9062 +0.9688 0.25 0.9375 +0.9688 0.25 0.9688 +0.9688 0.25 1 +0.9688 0.2812 0 +0.9688 0.2812 0.03125 +0.9688 0.2812 0.0625 +0.9688 0.2812 0.09375 +0.9688 0.2812 0.125 +0.9688 0.2812 0.1562 +0.9688 0.2812 0.1875 +0.9688 0.2812 0.2188 +0.9688 0.2812 0.25 +0.9688 0.2812 0.2812 +0.9688 0.2812 0.3125 +0.9688 0.2812 0.3438 +0.9688 0.2812 0.375 +0.9688 0.2812 0.4062 +0.9688 0.2812 0.4375 +0.9688 0.2812 0.4688 +0.9688 0.2812 0.5 +0.9688 0.2812 0.5312 +0.9688 0.2812 0.5625 +0.9688 0.2812 0.5938 +0.9688 0.2812 0.625 +0.9688 0.2812 0.6562 +0.9688 0.2812 0.6875 +0.9688 0.2812 0.7188 +0.9688 0.2812 0.75 +0.9688 0.2812 0.7812 +0.9688 0.2812 0.8125 +0.9688 0.2812 0.8438 +0.9688 0.2812 0.875 +0.9688 0.2812 0.9062 +0.9688 0.2812 0.9375 +0.9688 0.2812 0.9688 +0.9688 0.2812 1 +0.9688 0.3125 0 +0.9688 0.3125 0.03125 +0.9688 0.3125 0.0625 +0.9688 0.3125 0.09375 +0.9688 0.3125 0.125 +0.9688 0.3125 0.1562 +0.9688 0.3125 0.1875 +0.9688 0.3125 0.2188 +0.9688 0.3125 0.25 +0.9688 0.3125 0.2812 +0.9688 0.3125 0.3125 +0.9688 0.3125 0.3438 +0.9688 0.3125 0.375 +0.9688 0.3125 0.4062 +0.9688 0.3125 0.4375 +0.9688 0.3125 0.4688 +0.9688 0.3125 0.5 +0.9688 0.3125 0.5312 +0.9688 0.3125 0.5625 +0.9688 0.3125 0.5938 +0.9688 0.3125 0.625 +0.9688 0.3125 0.6562 +0.9688 0.3125 0.6875 +0.9688 0.3125 0.7188 +0.9688 0.3125 0.75 +0.9688 0.3125 0.7812 +0.9688 0.3125 0.8125 +0.9688 0.3125 0.8438 +0.9688 0.3125 0.875 +0.9688 0.3125 0.9062 +0.9688 0.3125 0.9375 +0.9688 0.3125 0.9688 +0.9688 0.3125 1 +0.9688 0.3438 0 +0.9688 0.3438 0.03125 +0.9688 0.3438 0.0625 +0.9688 0.3438 0.09375 +0.9688 0.3438 0.125 +0.9688 0.3438 0.1562 +0.9688 0.3438 0.1875 +0.9688 0.3438 0.2188 +0.9688 0.3438 0.25 +0.9688 0.3438 0.2812 +0.9688 0.3438 0.3125 +0.9688 0.3438 0.3438 +0.9688 0.3438 0.375 +0.9688 0.3438 0.4062 +0.9688 0.3438 0.4375 +0.9688 0.3438 0.4688 +0.9688 0.3438 0.5 +0.9688 0.3438 0.5312 +0.9688 0.3438 0.5625 +0.9688 0.3438 0.5938 +0.9688 0.3438 0.625 +0.9688 0.3438 0.6562 +0.9688 0.3438 0.6875 +0.9688 0.3438 0.7188 +0.9688 0.3438 0.75 +0.9688 0.3438 0.7812 +0.9688 0.3438 0.8125 +0.9688 0.3438 0.8438 +0.9688 0.3438 0.875 +0.9688 0.3438 0.9062 +0.9688 0.3438 0.9375 +0.9688 0.3438 0.9688 +0.9688 0.3438 1 +0.9688 0.375 0 +0.9688 0.375 0.03125 +0.9688 0.375 0.0625 +0.9688 0.375 0.09375 +0.9688 0.375 0.125 +0.9688 0.375 0.1562 +0.9688 0.375 0.1875 +0.9688 0.375 0.2188 +0.9688 0.375 0.25 +0.9688 0.375 0.2812 +0.9688 0.375 0.3125 +0.9688 0.375 0.3438 +0.9688 0.375 0.375 +0.9688 0.375 0.4062 +0.9688 0.375 0.4375 +0.9688 0.375 0.4688 +0.9688 0.375 0.5 +0.9688 0.375 0.5312 +0.9688 0.375 0.5625 +0.9688 0.375 0.5938 +0.9688 0.375 0.625 +0.9688 0.375 0.6562 +0.9688 0.375 0.6875 +0.9688 0.375 0.7188 +0.9688 0.375 0.75 +0.9688 0.375 0.7812 +0.9688 0.375 0.8125 +0.9688 0.375 0.8438 +0.9688 0.375 0.875 +0.9688 0.375 0.9062 +0.9688 0.375 0.9375 +0.9688 0.375 0.9688 +0.9688 0.375 1 +0.9688 0.4062 0 +0.9688 0.4062 0.03125 +0.9688 0.4062 0.0625 +0.9688 0.4062 0.09375 +0.9688 0.4062 0.125 +0.9688 0.4062 0.1562 +0.9688 0.4062 0.1875 +0.9688 0.4062 0.2188 +0.9688 0.4062 0.25 +0.9688 0.4062 0.2812 +0.9688 0.4062 0.3125 +0.9688 0.4062 0.3438 +0.9688 0.4062 0.375 +0.9688 0.4062 0.4062 +0.9688 0.4062 0.4375 +0.9688 0.4062 0.4688 +0.9688 0.4062 0.5 +0.9688 0.4062 0.5312 +0.9688 0.4062 0.5625 +0.9688 0.4062 0.5938 +0.9688 0.4062 0.625 +0.9688 0.4062 0.6562 +0.9688 0.4062 0.6875 +0.9688 0.4062 0.7188 +0.9688 0.4062 0.75 +0.9688 0.4062 0.7812 +0.9688 0.4062 0.8125 +0.9688 0.4062 0.8438 +0.9688 0.4062 0.875 +0.9688 0.4062 0.9062 +0.9688 0.4062 0.9375 +0.9688 0.4062 0.9688 +0.9688 0.4062 1 +0.9688 0.4375 0 +0.9688 0.4375 0.03125 +0.9688 0.4375 0.0625 +0.9688 0.4375 0.09375 +0.9688 0.4375 0.125 +0.9688 0.4375 0.1562 +0.9688 0.4375 0.1875 +0.9688 0.4375 0.2188 +0.9688 0.4375 0.25 +0.9688 0.4375 0.2812 +0.9688 0.4375 0.3125 +0.9688 0.4375 0.3438 +0.9688 0.4375 0.375 +0.9688 0.4375 0.4062 +0.9688 0.4375 0.4375 +0.9688 0.4375 0.4688 +0.9688 0.4375 0.5 +0.9688 0.4375 0.5312 +0.9688 0.4375 0.5625 +0.9688 0.4375 0.5938 +0.9688 0.4375 0.625 +0.9688 0.4375 0.6562 +0.9688 0.4375 0.6875 +0.9688 0.4375 0.7188 +0.9688 0.4375 0.75 +0.9688 0.4375 0.7812 +0.9688 0.4375 0.8125 +0.9688 0.4375 0.8438 +0.9688 0.4375 0.875 +0.9688 0.4375 0.9062 +0.9688 0.4375 0.9375 +0.9688 0.4375 0.9688 +0.9688 0.4375 1 +0.9688 0.4688 0 +0.9688 0.4688 0.03125 +0.9688 0.4688 0.0625 +0.9688 0.4688 0.09375 +0.9688 0.4688 0.125 +0.9688 0.4688 0.1562 +0.9688 0.4688 0.1875 +0.9688 0.4688 0.2188 +0.9688 0.4688 0.25 +0.9688 0.4688 0.2812 +0.9688 0.4688 0.3125 +0.9688 0.4688 0.3438 +0.9688 0.4688 0.375 +0.9688 0.4688 0.4062 +0.9688 0.4688 0.4375 +0.9688 0.4688 0.4688 +0.9688 0.4688 0.5 +0.9688 0.4688 0.5312 +0.9688 0.4688 0.5625 +0.9688 0.4688 0.5938 +0.9688 0.4688 0.625 +0.9688 0.4688 0.6562 +0.9688 0.4688 0.6875 +0.9688 0.4688 0.7188 +0.9688 0.4688 0.75 +0.9688 0.4688 0.7812 +0.9688 0.4688 0.8125 +0.9688 0.4688 0.8438 +0.9688 0.4688 0.875 +0.9688 0.4688 0.9062 +0.9688 0.4688 0.9375 +0.9688 0.4688 0.9688 +0.9688 0.4688 1 +0.9688 0.5 0 +0.9688 0.5 0.03125 +0.9688 0.5 0.0625 +0.9688 0.5 0.09375 +0.9688 0.5 0.125 +0.9688 0.5 0.1562 +0.9688 0.5 0.1875 +0.9688 0.5 0.2188 +0.9688 0.5 0.25 +0.9688 0.5 0.2812 +0.9688 0.5 0.3125 +0.9688 0.5 0.3438 +0.9688 0.5 0.375 +0.9688 0.5 0.4062 +0.9688 0.5 0.4375 +0.9688 0.5 0.4688 +0.9688 0.5 0.5 +0.9688 0.5 0.5312 +0.9688 0.5 0.5625 +0.9688 0.5 0.5938 +0.9688 0.5 0.625 +0.9688 0.5 0.6562 +0.9688 0.5 0.6875 +0.9688 0.5 0.7188 +0.9688 0.5 0.75 +0.9688 0.5 0.7812 +0.9688 0.5 0.8125 +0.9688 0.5 0.8438 +0.9688 0.5 0.875 +0.9688 0.5 0.9062 +0.9688 0.5 0.9375 +0.9688 0.5 0.9688 +0.9688 0.5 1 +0.9688 0.5312 0 +0.9688 0.5312 0.03125 +0.9688 0.5312 0.0625 +0.9688 0.5312 0.09375 +0.9688 0.5312 0.125 +0.9688 0.5312 0.1562 +0.9688 0.5312 0.1875 +0.9688 0.5312 0.2188 +0.9688 0.5312 0.25 +0.9688 0.5312 0.2812 +0.9688 0.5312 0.3125 +0.9688 0.5312 0.3438 +0.9688 0.5312 0.375 +0.9688 0.5312 0.4062 +0.9688 0.5312 0.4375 +0.9688 0.5312 0.4688 +0.9688 0.5312 0.5 +0.9688 0.5312 0.5312 +0.9688 0.5312 0.5625 +0.9688 0.5312 0.5938 +0.9688 0.5312 0.625 +0.9688 0.5312 0.6562 +0.9688 0.5312 0.6875 +0.9688 0.5312 0.7188 +0.9688 0.5312 0.75 +0.9688 0.5312 0.7812 +0.9688 0.5312 0.8125 +0.9688 0.5312 0.8438 +0.9688 0.5312 0.875 +0.9688 0.5312 0.9062 +0.9688 0.5312 0.9375 +0.9688 0.5312 0.9688 +0.9688 0.5312 1 +0.9688 0.5625 0 +0.9688 0.5625 0.03125 +0.9688 0.5625 0.0625 +0.9688 0.5625 0.09375 +0.9688 0.5625 0.125 +0.9688 0.5625 0.1562 +0.9688 0.5625 0.1875 +0.9688 0.5625 0.2188 +0.9688 0.5625 0.25 +0.9688 0.5625 0.2812 +0.9688 0.5625 0.3125 +0.9688 0.5625 0.3438 +0.9688 0.5625 0.375 +0.9688 0.5625 0.4062 +0.9688 0.5625 0.4375 +0.9688 0.5625 0.4688 +0.9688 0.5625 0.5 +0.9688 0.5625 0.5312 +0.9688 0.5625 0.5625 +0.9688 0.5625 0.5938 +0.9688 0.5625 0.625 +0.9688 0.5625 0.6562 +0.9688 0.5625 0.6875 +0.9688 0.5625 0.7188 +0.9688 0.5625 0.75 +0.9688 0.5625 0.7812 +0.9688 0.5625 0.8125 +0.9688 0.5625 0.8438 +0.9688 0.5625 0.875 +0.9688 0.5625 0.9062 +0.9688 0.5625 0.9375 +0.9688 0.5625 0.9688 +0.9688 0.5625 1 +0.9688 0.5938 0 +0.9688 0.5938 0.03125 +0.9688 0.5938 0.0625 +0.9688 0.5938 0.09375 +0.9688 0.5938 0.125 +0.9688 0.5938 0.1562 +0.9688 0.5938 0.1875 +0.9688 0.5938 0.2188 +0.9688 0.5938 0.25 +0.9688 0.5938 0.2812 +0.9688 0.5938 0.3125 +0.9688 0.5938 0.3438 +0.9688 0.5938 0.375 +0.9688 0.5938 0.4062 +0.9688 0.5938 0.4375 +0.9688 0.5938 0.4688 +0.9688 0.5938 0.5 +0.9688 0.5938 0.5312 +0.9688 0.5938 0.5625 +0.9688 0.5938 0.5938 +0.9688 0.5938 0.625 +0.9688 0.5938 0.6562 +0.9688 0.5938 0.6875 +0.9688 0.5938 0.7188 +0.9688 0.5938 0.75 +0.9688 0.5938 0.7812 +0.9688 0.5938 0.8125 +0.9688 0.5938 0.8438 +0.9688 0.5938 0.875 +0.9688 0.5938 0.9062 +0.9688 0.5938 0.9375 +0.9688 0.5938 0.9688 +0.9688 0.5938 1 +0.9688 0.625 0 +0.9688 0.625 0.03125 +0.9688 0.625 0.0625 +0.9688 0.625 0.09375 +0.9688 0.625 0.125 +0.9688 0.625 0.1562 +0.9688 0.625 0.1875 +0.9688 0.625 0.2188 +0.9688 0.625 0.25 +0.9688 0.625 0.2812 +0.9688 0.625 0.3125 +0.9688 0.625 0.3438 +0.9688 0.625 0.375 +0.9688 0.625 0.4062 +0.9688 0.625 0.4375 +0.9688 0.625 0.4688 +0.9688 0.625 0.5 +0.9688 0.625 0.5312 +0.9688 0.625 0.5625 +0.9688 0.625 0.5938 +0.9688 0.625 0.625 +0.9688 0.625 0.6562 +0.9688 0.625 0.6875 +0.9688 0.625 0.7188 +0.9688 0.625 0.75 +0.9688 0.625 0.7812 +0.9688 0.625 0.8125 +0.9688 0.625 0.8438 +0.9688 0.625 0.875 +0.9688 0.625 0.9062 +0.9688 0.625 0.9375 +0.9688 0.625 0.9688 +0.9688 0.625 1 +0.9688 0.6562 0 +0.9688 0.6562 0.03125 +0.9688 0.6562 0.0625 +0.9688 0.6562 0.09375 +0.9688 0.6562 0.125 +0.9688 0.6562 0.1562 +0.9688 0.6562 0.1875 +0.9688 0.6562 0.2188 +0.9688 0.6562 0.25 +0.9688 0.6562 0.2812 +0.9688 0.6562 0.3125 +0.9688 0.6562 0.3438 +0.9688 0.6562 0.375 +0.9688 0.6562 0.4062 +0.9688 0.6562 0.4375 +0.9688 0.6562 0.4688 +0.9688 0.6562 0.5 +0.9688 0.6562 0.5312 +0.9688 0.6562 0.5625 +0.9688 0.6562 0.5938 +0.9688 0.6562 0.625 +0.9688 0.6562 0.6562 +0.9688 0.6562 0.6875 +0.9688 0.6562 0.7188 +0.9688 0.6562 0.75 +0.9688 0.6562 0.7812 +0.9688 0.6562 0.8125 +0.9688 0.6562 0.8438 +0.9688 0.6562 0.875 +0.9688 0.6562 0.9062 +0.9688 0.6562 0.9375 +0.9688 0.6562 0.9688 +0.9688 0.6562 1 +0.9688 0.6875 0 +0.9688 0.6875 0.03125 +0.9688 0.6875 0.0625 +0.9688 0.6875 0.09375 +0.9688 0.6875 0.125 +0.9688 0.6875 0.1562 +0.9688 0.6875 0.1875 +0.9688 0.6875 0.2188 +0.9688 0.6875 0.25 +0.9688 0.6875 0.2812 +0.9688 0.6875 0.3125 +0.9688 0.6875 0.3438 +0.9688 0.6875 0.375 +0.9688 0.6875 0.4062 +0.9688 0.6875 0.4375 +0.9688 0.6875 0.4688 +0.9688 0.6875 0.5 +0.9688 0.6875 0.5312 +0.9688 0.6875 0.5625 +0.9688 0.6875 0.5938 +0.9688 0.6875 0.625 +0.9688 0.6875 0.6562 +0.9688 0.6875 0.6875 +0.9688 0.6875 0.7188 +0.9688 0.6875 0.75 +0.9688 0.6875 0.7812 +0.9688 0.6875 0.8125 +0.9688 0.6875 0.8438 +0.9688 0.6875 0.875 +0.9688 0.6875 0.9062 +0.9688 0.6875 0.9375 +0.9688 0.6875 0.9688 +0.9688 0.6875 1 +0.9688 0.7188 0 +0.9688 0.7188 0.03125 +0.9688 0.7188 0.0625 +0.9688 0.7188 0.09375 +0.9688 0.7188 0.125 +0.9688 0.7188 0.1562 +0.9688 0.7188 0.1875 +0.9688 0.7188 0.2188 +0.9688 0.7188 0.25 +0.9688 0.7188 0.2812 +0.9688 0.7188 0.3125 +0.9688 0.7188 0.3438 +0.9688 0.7188 0.375 +0.9688 0.7188 0.4062 +0.9688 0.7188 0.4375 +0.9688 0.7188 0.4688 +0.9688 0.7188 0.5 +0.9688 0.7188 0.5312 +0.9688 0.7188 0.5625 +0.9688 0.7188 0.5938 +0.9688 0.7188 0.625 +0.9688 0.7188 0.6562 +0.9688 0.7188 0.6875 +0.9688 0.7188 0.7188 +0.9688 0.7188 0.75 +0.9688 0.7188 0.7812 +0.9688 0.7188 0.8125 +0.9688 0.7188 0.8438 +0.9688 0.7188 0.875 +0.9688 0.7188 0.9062 +0.9688 0.7188 0.9375 +0.9688 0.7188 0.9688 +0.9688 0.7188 1 +0.9688 0.75 0 +0.9688 0.75 0.03125 +0.9688 0.75 0.0625 +0.9688 0.75 0.09375 +0.9688 0.75 0.125 +0.9688 0.75 0.1562 +0.9688 0.75 0.1875 +0.9688 0.75 0.2188 +0.9688 0.75 0.25 +0.9688 0.75 0.2812 +0.9688 0.75 0.3125 +0.9688 0.75 0.3438 +0.9688 0.75 0.375 +0.9688 0.75 0.4062 +0.9688 0.75 0.4375 +0.9688 0.75 0.4688 +0.9688 0.75 0.5 +0.9688 0.75 0.5312 +0.9688 0.75 0.5625 +0.9688 0.75 0.5938 +0.9688 0.75 0.625 +0.9688 0.75 0.6562 +0.9688 0.75 0.6875 +0.9688 0.75 0.7188 +0.9688 0.75 0.75 +0.9688 0.75 0.7812 +0.9688 0.75 0.8125 +0.9688 0.75 0.8438 +0.9688 0.75 0.875 +0.9688 0.75 0.9062 +0.9688 0.75 0.9375 +0.9688 0.75 0.9688 +0.9688 0.75 1 +0.9688 0.7812 0 +0.9688 0.7812 0.03125 +0.9688 0.7812 0.0625 +0.9688 0.7812 0.09375 +0.9688 0.7812 0.125 +0.9688 0.7812 0.1562 +0.9688 0.7812 0.1875 +0.9688 0.7812 0.2188 +0.9688 0.7812 0.25 +0.9688 0.7812 0.2812 +0.9688 0.7812 0.3125 +0.9688 0.7812 0.3438 +0.9688 0.7812 0.375 +0.9688 0.7812 0.4062 +0.9688 0.7812 0.4375 +0.9688 0.7812 0.4688 +0.9688 0.7812 0.5 +0.9688 0.7812 0.5312 +0.9688 0.7812 0.5625 +0.9688 0.7812 0.5938 +0.9688 0.7812 0.625 +0.9688 0.7812 0.6562 +0.9688 0.7812 0.6875 +0.9688 0.7812 0.7188 +0.9688 0.7812 0.75 +0.9688 0.7812 0.7812 +0.9688 0.7812 0.8125 +0.9688 0.7812 0.8438 +0.9688 0.7812 0.875 +0.9688 0.7812 0.9062 +0.9688 0.7812 0.9375 +0.9688 0.7812 0.9688 +0.9688 0.7812 1 +0.9688 0.8125 0 +0.9688 0.8125 0.03125 +0.9688 0.8125 0.0625 +0.9688 0.8125 0.09375 +0.9688 0.8125 0.125 +0.9688 0.8125 0.1562 +0.9688 0.8125 0.1875 +0.9688 0.8125 0.2188 +0.9688 0.8125 0.25 +0.9688 0.8125 0.2812 +0.9688 0.8125 0.3125 +0.9688 0.8125 0.3438 +0.9688 0.8125 0.375 +0.9688 0.8125 0.4062 +0.9688 0.8125 0.4375 +0.9688 0.8125 0.4688 +0.9688 0.8125 0.5 +0.9688 0.8125 0.5312 +0.9688 0.8125 0.5625 +0.9688 0.8125 0.5938 +0.9688 0.8125 0.625 +0.9688 0.8125 0.6562 +0.9688 0.8125 0.6875 +0.9688 0.8125 0.7188 +0.9688 0.8125 0.75 +0.9688 0.8125 0.7812 +0.9688 0.8125 0.8125 +0.9688 0.8125 0.8438 +0.9688 0.8125 0.875 +0.9688 0.8125 0.9062 +0.9688 0.8125 0.9375 +0.9688 0.8125 0.9688 +0.9688 0.8125 1 +0.9688 0.8438 0 +0.9688 0.8438 0.03125 +0.9688 0.8438 0.0625 +0.9688 0.8438 0.09375 +0.9688 0.8438 0.125 +0.9688 0.8438 0.1562 +0.9688 0.8438 0.1875 +0.9688 0.8438 0.2188 +0.9688 0.8438 0.25 +0.9688 0.8438 0.2812 +0.9688 0.8438 0.3125 +0.9688 0.8438 0.3438 +0.9688 0.8438 0.375 +0.9688 0.8438 0.4062 +0.9688 0.8438 0.4375 +0.9688 0.8438 0.4688 +0.9688 0.8438 0.5 +0.9688 0.8438 0.5312 +0.9688 0.8438 0.5625 +0.9688 0.8438 0.5938 +0.9688 0.8438 0.625 +0.9688 0.8438 0.6562 +0.9688 0.8438 0.6875 +0.9688 0.8438 0.7188 +0.9688 0.8438 0.75 +0.9688 0.8438 0.7812 +0.9688 0.8438 0.8125 +0.9688 0.8438 0.8438 +0.9688 0.8438 0.875 +0.9688 0.8438 0.9062 +0.9688 0.8438 0.9375 +0.9688 0.8438 0.9688 +0.9688 0.8438 1 +0.9688 0.875 0 +0.9688 0.875 0.03125 +0.9688 0.875 0.0625 +0.9688 0.875 0.09375 +0.9688 0.875 0.125 +0.9688 0.875 0.1562 +0.9688 0.875 0.1875 +0.9688 0.875 0.2188 +0.9688 0.875 0.25 +0.9688 0.875 0.2812 +0.9688 0.875 0.3125 +0.9688 0.875 0.3438 +0.9688 0.875 0.375 +0.9688 0.875 0.4062 +0.9688 0.875 0.4375 +0.9688 0.875 0.4688 +0.9688 0.875 0.5 +0.9688 0.875 0.5312 +0.9688 0.875 0.5625 +0.9688 0.875 0.5938 +0.9688 0.875 0.625 +0.9688 0.875 0.6562 +0.9688 0.875 0.6875 +0.9688 0.875 0.7188 +0.9688 0.875 0.75 +0.9688 0.875 0.7812 +0.9688 0.875 0.8125 +0.9688 0.875 0.8438 +0.9688 0.875 0.875 +0.9688 0.875 0.9062 +0.9688 0.875 0.9375 +0.9688 0.875 0.9688 +0.9688 0.875 1 +0.9688 0.9062 0 +0.9688 0.9062 0.03125 +0.9688 0.9062 0.0625 +0.9688 0.9062 0.09375 +0.9688 0.9062 0.125 +0.9688 0.9062 0.1562 +0.9688 0.9062 0.1875 +0.9688 0.9062 0.2188 +0.9688 0.9062 0.25 +0.9688 0.9062 0.2812 +0.9688 0.9062 0.3125 +0.9688 0.9062 0.3438 +0.9688 0.9062 0.375 +0.9688 0.9062 0.4062 +0.9688 0.9062 0.4375 +0.9688 0.9062 0.4688 +0.9688 0.9062 0.5 +0.9688 0.9062 0.5312 +0.9688 0.9062 0.5625 +0.9688 0.9062 0.5938 +0.9688 0.9062 0.625 +0.9688 0.9062 0.6562 +0.9688 0.9062 0.6875 +0.9688 0.9062 0.7188 +0.9688 0.9062 0.75 +0.9688 0.9062 0.7812 +0.9688 0.9062 0.8125 +0.9688 0.9062 0.8438 +0.9688 0.9062 0.875 +0.9688 0.9062 0.9062 +0.9688 0.9062 0.9375 +0.9688 0.9062 0.9688 +0.9688 0.9062 1 +0.9688 0.9375 0 +0.9688 0.9375 0.03125 +0.9688 0.9375 0.0625 +0.9688 0.9375 0.09375 +0.9688 0.9375 0.125 +0.9688 0.9375 0.1562 +0.9688 0.9375 0.1875 +0.9688 0.9375 0.2188 +0.9688 0.9375 0.25 +0.9688 0.9375 0.2812 +0.9688 0.9375 0.3125 +0.9688 0.9375 0.3438 +0.9688 0.9375 0.375 +0.9688 0.9375 0.4062 +0.9688 0.9375 0.4375 +0.9688 0.9375 0.4688 +0.9688 0.9375 0.5 +0.9688 0.9375 0.5312 +0.9688 0.9375 0.5625 +0.9688 0.9375 0.5938 +0.9688 0.9375 0.625 +0.9688 0.9375 0.6562 +0.9688 0.9375 0.6875 +0.9688 0.9375 0.7188 +0.9688 0.9375 0.75 +0.9688 0.9375 0.7812 +0.9688 0.9375 0.8125 +0.9688 0.9375 0.8438 +0.9688 0.9375 0.875 +0.9688 0.9375 0.9062 +0.9688 0.9375 0.9375 +0.9688 0.9375 0.9688 +0.9688 0.9375 1 +0.9688 0.9688 0 +0.9688 0.9688 0.03125 +0.9688 0.9688 0.0625 +0.9688 0.9688 0.09375 +0.9688 0.9688 0.125 +0.9688 0.9688 0.1562 +0.9688 0.9688 0.1875 +0.9688 0.9688 0.2188 +0.9688 0.9688 0.25 +0.9688 0.9688 0.2812 +0.9688 0.9688 0.3125 +0.9688 0.9688 0.3438 +0.9688 0.9688 0.375 +0.9688 0.9688 0.4062 +0.9688 0.9688 0.4375 +0.9688 0.9688 0.4688 +0.9688 0.9688 0.5 +0.9688 0.9688 0.5312 +0.9688 0.9688 0.5625 +0.9688 0.9688 0.5938 +0.9688 0.9688 0.625 +0.9688 0.9688 0.6562 +0.9688 0.9688 0.6875 +0.9688 0.9688 0.7188 +0.9688 0.9688 0.75 +0.9688 0.9688 0.7812 +0.9688 0.9688 0.8125 +0.9688 0.9688 0.8438 +0.9688 0.9688 0.875 +0.9688 0.9688 0.9062 +0.9688 0.9688 0.9375 +0.9688 0.9688 0.9688 +0.9688 0.9688 1 +0.9688 1 0 +0.9688 1 0.03125 +0.9688 1 0.0625 +0.9688 1 0.09375 +0.9688 1 0.125 +0.9688 1 0.1562 +0.9688 1 0.1875 +0.9688 1 0.2188 +0.9688 1 0.25 +0.9688 1 0.2812 +0.9688 1 0.3125 +0.9688 1 0.3438 +0.9688 1 0.375 +0.9688 1 0.4062 +0.9688 1 0.4375 +0.9688 1 0.4688 +0.9688 1 0.5 +0.9688 1 0.5312 +0.9688 1 0.5625 +0.9688 1 0.5938 +0.9688 1 0.625 +0.9688 1 0.6562 +0.9688 1 0.6875 +0.9688 1 0.7188 +0.9688 1 0.75 +0.9688 1 0.7812 +0.9688 1 0.8125 +0.9688 1 0.8438 +0.9688 1 0.875 +0.9688 1 0.9062 +0.9688 1 0.9375 +0.9688 1 0.9688 +0.9688 1 1 +1 0 0 +1 0 0.03125 +1 0 0.0625 +1 0 0.09375 +1 0 0.125 +1 0 0.1562 +1 0 0.1875 +1 0 0.2188 +1 0 0.25 +1 0 0.2812 +1 0 0.3125 +1 0 0.3438 +1 0 0.375 +1 0 0.4062 +1 0 0.4375 +1 0 0.4688 +1 0 0.5 +1 0 0.5312 +1 0 0.5625 +1 0 0.5938 +1 0 0.625 +1 0 0.6562 +1 0 0.6875 +1 0 0.7188 +1 0 0.75 +1 0 0.7812 +1 0 0.8125 +1 0 0.8438 +1 0 0.875 +1 0 0.9062 +1 0 0.9375 +1 0 0.9688 +1 0 1 +1 0.03125 0 +1 0.03125 0.03125 +1 0.03125 0.0625 +1 0.03125 0.09375 +1 0.03125 0.125 +1 0.03125 0.1562 +1 0.03125 0.1875 +1 0.03125 0.2188 +1 0.03125 0.25 +1 0.03125 0.2812 +1 0.03125 0.3125 +1 0.03125 0.3438 +1 0.03125 0.375 +1 0.03125 0.4062 +1 0.03125 0.4375 +1 0.03125 0.4688 +1 0.03125 0.5 +1 0.03125 0.5312 +1 0.03125 0.5625 +1 0.03125 0.5938 +1 0.03125 0.625 +1 0.03125 0.6562 +1 0.03125 0.6875 +1 0.03125 0.7188 +1 0.03125 0.75 +1 0.03125 0.7812 +1 0.03125 0.8125 +1 0.03125 0.8438 +1 0.03125 0.875 +1 0.03125 0.9062 +1 0.03125 0.9375 +1 0.03125 0.9688 +1 0.03125 1 +1 0.0625 0 +1 0.0625 0.03125 +1 0.0625 0.0625 +1 0.0625 0.09375 +1 0.0625 0.125 +1 0.0625 0.1562 +1 0.0625 0.1875 +1 0.0625 0.2188 +1 0.0625 0.25 +1 0.0625 0.2812 +1 0.0625 0.3125 +1 0.0625 0.3438 +1 0.0625 0.375 +1 0.0625 0.4062 +1 0.0625 0.4375 +1 0.0625 0.4688 +1 0.0625 0.5 +1 0.0625 0.5312 +1 0.0625 0.5625 +1 0.0625 0.5938 +1 0.0625 0.625 +1 0.0625 0.6562 +1 0.0625 0.6875 +1 0.0625 0.7188 +1 0.0625 0.75 +1 0.0625 0.7812 +1 0.0625 0.8125 +1 0.0625 0.8438 +1 0.0625 0.875 +1 0.0625 0.9062 +1 0.0625 0.9375 +1 0.0625 0.9688 +1 0.0625 1 +1 0.09375 0 +1 0.09375 0.03125 +1 0.09375 0.0625 +1 0.09375 0.09375 +1 0.09375 0.125 +1 0.09375 0.1562 +1 0.09375 0.1875 +1 0.09375 0.2188 +1 0.09375 0.25 +1 0.09375 0.2812 +1 0.09375 0.3125 +1 0.09375 0.3438 +1 0.09375 0.375 +1 0.09375 0.4062 +1 0.09375 0.4375 +1 0.09375 0.4688 +1 0.09375 0.5 +1 0.09375 0.5312 +1 0.09375 0.5625 +1 0.09375 0.5938 +1 0.09375 0.625 +1 0.09375 0.6562 +1 0.09375 0.6875 +1 0.09375 0.7188 +1 0.09375 0.75 +1 0.09375 0.7812 +1 0.09375 0.8125 +1 0.09375 0.8438 +1 0.09375 0.875 +1 0.09375 0.9062 +1 0.09375 0.9375 +1 0.09375 0.9688 +1 0.09375 1 +1 0.125 0 +1 0.125 0.03125 +1 0.125 0.0625 +1 0.125 0.09375 +1 0.125 0.125 +1 0.125 0.1562 +1 0.125 0.1875 +1 0.125 0.2188 +1 0.125 0.25 +1 0.125 0.2812 +1 0.125 0.3125 +1 0.125 0.3438 +1 0.125 0.375 +1 0.125 0.4062 +1 0.125 0.4375 +1 0.125 0.4688 +1 0.125 0.5 +1 0.125 0.5312 +1 0.125 0.5625 +1 0.125 0.5938 +1 0.125 0.625 +1 0.125 0.6562 +1 0.125 0.6875 +1 0.125 0.7188 +1 0.125 0.75 +1 0.125 0.7812 +1 0.125 0.8125 +1 0.125 0.8438 +1 0.125 0.875 +1 0.125 0.9062 +1 0.125 0.9375 +1 0.125 0.9688 +1 0.125 1 +1 0.1562 0 +1 0.1562 0.03125 +1 0.1562 0.0625 +1 0.1562 0.09375 +1 0.1562 0.125 +1 0.1562 0.1562 +1 0.1562 0.1875 +1 0.1562 0.2188 +1 0.1562 0.25 +1 0.1562 0.2812 +1 0.1562 0.3125 +1 0.1562 0.3438 +1 0.1562 0.375 +1 0.1562 0.4062 +1 0.1562 0.4375 +1 0.1562 0.4688 +1 0.1562 0.5 +1 0.1562 0.5312 +1 0.1562 0.5625 +1 0.1562 0.5938 +1 0.1562 0.625 +1 0.1562 0.6562 +1 0.1562 0.6875 +1 0.1562 0.7188 +1 0.1562 0.75 +1 0.1562 0.7812 +1 0.1562 0.8125 +1 0.1562 0.8438 +1 0.1562 0.875 +1 0.1562 0.9062 +1 0.1562 0.9375 +1 0.1562 0.9688 +1 0.1562 1 +1 0.1875 0 +1 0.1875 0.03125 +1 0.1875 0.0625 +1 0.1875 0.09375 +1 0.1875 0.125 +1 0.1875 0.1562 +1 0.1875 0.1875 +1 0.1875 0.2188 +1 0.1875 0.25 +1 0.1875 0.2812 +1 0.1875 0.3125 +1 0.1875 0.3438 +1 0.1875 0.375 +1 0.1875 0.4062 +1 0.1875 0.4375 +1 0.1875 0.4688 +1 0.1875 0.5 +1 0.1875 0.5312 +1 0.1875 0.5625 +1 0.1875 0.5938 +1 0.1875 0.625 +1 0.1875 0.6562 +1 0.1875 0.6875 +1 0.1875 0.7188 +1 0.1875 0.75 +1 0.1875 0.7812 +1 0.1875 0.8125 +1 0.1875 0.8438 +1 0.1875 0.875 +1 0.1875 0.9062 +1 0.1875 0.9375 +1 0.1875 0.9688 +1 0.1875 1 +1 0.2188 0 +1 0.2188 0.03125 +1 0.2188 0.0625 +1 0.2188 0.09375 +1 0.2188 0.125 +1 0.2188 0.1562 +1 0.2188 0.1875 +1 0.2188 0.2188 +1 0.2188 0.25 +1 0.2188 0.2812 +1 0.2188 0.3125 +1 0.2188 0.3438 +1 0.2188 0.375 +1 0.2188 0.4062 +1 0.2188 0.4375 +1 0.2188 0.4688 +1 0.2188 0.5 +1 0.2188 0.5312 +1 0.2188 0.5625 +1 0.2188 0.5938 +1 0.2188 0.625 +1 0.2188 0.6562 +1 0.2188 0.6875 +1 0.2188 0.7188 +1 0.2188 0.75 +1 0.2188 0.7812 +1 0.2188 0.8125 +1 0.2188 0.8438 +1 0.2188 0.875 +1 0.2188 0.9062 +1 0.2188 0.9375 +1 0.2188 0.9688 +1 0.2188 1 +1 0.25 0 +1 0.25 0.03125 +1 0.25 0.0625 +1 0.25 0.09375 +1 0.25 0.125 +1 0.25 0.1562 +1 0.25 0.1875 +1 0.25 0.2188 +1 0.25 0.25 +1 0.25 0.2812 +1 0.25 0.3125 +1 0.25 0.3438 +1 0.25 0.375 +1 0.25 0.4062 +1 0.25 0.4375 +1 0.25 0.4688 +1 0.25 0.5 +1 0.25 0.5312 +1 0.25 0.5625 +1 0.25 0.5938 +1 0.25 0.625 +1 0.25 0.6562 +1 0.25 0.6875 +1 0.25 0.7188 +1 0.25 0.75 +1 0.25 0.7812 +1 0.25 0.8125 +1 0.25 0.8438 +1 0.25 0.875 +1 0.25 0.9062 +1 0.25 0.9375 +1 0.25 0.9688 +1 0.25 1 +1 0.2812 0 +1 0.2812 0.03125 +1 0.2812 0.0625 +1 0.2812 0.09375 +1 0.2812 0.125 +1 0.2812 0.1562 +1 0.2812 0.1875 +1 0.2812 0.2188 +1 0.2812 0.25 +1 0.2812 0.2812 +1 0.2812 0.3125 +1 0.2812 0.3438 +1 0.2812 0.375 +1 0.2812 0.4062 +1 0.2812 0.4375 +1 0.2812 0.4688 +1 0.2812 0.5 +1 0.2812 0.5312 +1 0.2812 0.5625 +1 0.2812 0.5938 +1 0.2812 0.625 +1 0.2812 0.6562 +1 0.2812 0.6875 +1 0.2812 0.7188 +1 0.2812 0.75 +1 0.2812 0.7812 +1 0.2812 0.8125 +1 0.2812 0.8438 +1 0.2812 0.875 +1 0.2812 0.9062 +1 0.2812 0.9375 +1 0.2812 0.9688 +1 0.2812 1 +1 0.3125 0 +1 0.3125 0.03125 +1 0.3125 0.0625 +1 0.3125 0.09375 +1 0.3125 0.125 +1 0.3125 0.1562 +1 0.3125 0.1875 +1 0.3125 0.2188 +1 0.3125 0.25 +1 0.3125 0.2812 +1 0.3125 0.3125 +1 0.3125 0.3438 +1 0.3125 0.375 +1 0.3125 0.4062 +1 0.3125 0.4375 +1 0.3125 0.4688 +1 0.3125 0.5 +1 0.3125 0.5312 +1 0.3125 0.5625 +1 0.3125 0.5938 +1 0.3125 0.625 +1 0.3125 0.6562 +1 0.3125 0.6875 +1 0.3125 0.7188 +1 0.3125 0.75 +1 0.3125 0.7812 +1 0.3125 0.8125 +1 0.3125 0.8438 +1 0.3125 0.875 +1 0.3125 0.9062 +1 0.3125 0.9375 +1 0.3125 0.9688 +1 0.3125 1 +1 0.3438 0 +1 0.3438 0.03125 +1 0.3438 0.0625 +1 0.3438 0.09375 +1 0.3438 0.125 +1 0.3438 0.1562 +1 0.3438 0.1875 +1 0.3438 0.2188 +1 0.3438 0.25 +1 0.3438 0.2812 +1 0.3438 0.3125 +1 0.3438 0.3438 +1 0.3438 0.375 +1 0.3438 0.4062 +1 0.3438 0.4375 +1 0.3438 0.4688 +1 0.3438 0.5 +1 0.3438 0.5312 +1 0.3438 0.5625 +1 0.3438 0.5938 +1 0.3438 0.625 +1 0.3438 0.6562 +1 0.3438 0.6875 +1 0.3438 0.7188 +1 0.3438 0.75 +1 0.3438 0.7812 +1 0.3438 0.8125 +1 0.3438 0.8438 +1 0.3438 0.875 +1 0.3438 0.9062 +1 0.3438 0.9375 +1 0.3438 0.9688 +1 0.3438 1 +1 0.375 0 +1 0.375 0.03125 +1 0.375 0.0625 +1 0.375 0.09375 +1 0.375 0.125 +1 0.375 0.1562 +1 0.375 0.1875 +1 0.375 0.2188 +1 0.375 0.25 +1 0.375 0.2812 +1 0.375 0.3125 +1 0.375 0.3438 +1 0.375 0.375 +1 0.375 0.4062 +1 0.375 0.4375 +1 0.375 0.4688 +1 0.375 0.5 +1 0.375 0.5312 +1 0.375 0.5625 +1 0.375 0.5938 +1 0.375 0.625 +1 0.375 0.6562 +1 0.375 0.6875 +1 0.375 0.7188 +1 0.375 0.75 +1 0.375 0.7812 +1 0.375 0.8125 +1 0.375 0.8438 +1 0.375 0.875 +1 0.375 0.9062 +1 0.375 0.9375 +1 0.375 0.9688 +1 0.375 1 +1 0.4062 0 +1 0.4062 0.03125 +1 0.4062 0.0625 +1 0.4062 0.09375 +1 0.4062 0.125 +1 0.4062 0.1562 +1 0.4062 0.1875 +1 0.4062 0.2188 +1 0.4062 0.25 +1 0.4062 0.2812 +1 0.4062 0.3125 +1 0.4062 0.3438 +1 0.4062 0.375 +1 0.4062 0.4062 +1 0.4062 0.4375 +1 0.4062 0.4688 +1 0.4062 0.5 +1 0.4062 0.5312 +1 0.4062 0.5625 +1 0.4062 0.5938 +1 0.4062 0.625 +1 0.4062 0.6562 +1 0.4062 0.6875 +1 0.4062 0.7188 +1 0.4062 0.75 +1 0.4062 0.7812 +1 0.4062 0.8125 +1 0.4062 0.8438 +1 0.4062 0.875 +1 0.4062 0.9062 +1 0.4062 0.9375 +1 0.4062 0.9688 +1 0.4062 1 +1 0.4375 0 +1 0.4375 0.03125 +1 0.4375 0.0625 +1 0.4375 0.09375 +1 0.4375 0.125 +1 0.4375 0.1562 +1 0.4375 0.1875 +1 0.4375 0.2188 +1 0.4375 0.25 +1 0.4375 0.2812 +1 0.4375 0.3125 +1 0.4375 0.3438 +1 0.4375 0.375 +1 0.4375 0.4062 +1 0.4375 0.4375 +1 0.4375 0.4688 +1 0.4375 0.5 +1 0.4375 0.5312 +1 0.4375 0.5625 +1 0.4375 0.5938 +1 0.4375 0.625 +1 0.4375 0.6562 +1 0.4375 0.6875 +1 0.4375 0.7188 +1 0.4375 0.75 +1 0.4375 0.7812 +1 0.4375 0.8125 +1 0.4375 0.8438 +1 0.4375 0.875 +1 0.4375 0.9062 +1 0.4375 0.9375 +1 0.4375 0.9688 +1 0.4375 1 +1 0.4688 0 +1 0.4688 0.03125 +1 0.4688 0.0625 +1 0.4688 0.09375 +1 0.4688 0.125 +1 0.4688 0.1562 +1 0.4688 0.1875 +1 0.4688 0.2188 +1 0.4688 0.25 +1 0.4688 0.2812 +1 0.4688 0.3125 +1 0.4688 0.3438 +1 0.4688 0.375 +1 0.4688 0.4062 +1 0.4688 0.4375 +1 0.4688 0.4688 +1 0.4688 0.5 +1 0.4688 0.5312 +1 0.4688 0.5625 +1 0.4688 0.5938 +1 0.4688 0.625 +1 0.4688 0.6562 +1 0.4688 0.6875 +1 0.4688 0.7188 +1 0.4688 0.75 +1 0.4688 0.7812 +1 0.4688 0.8125 +1 0.4688 0.8438 +1 0.4688 0.875 +1 0.4688 0.9062 +1 0.4688 0.9375 +1 0.4688 0.9688 +1 0.4688 1 +1 0.5 0 +1 0.5 0.03125 +1 0.5 0.0625 +1 0.5 0.09375 +1 0.5 0.125 +1 0.5 0.1562 +1 0.5 0.1875 +1 0.5 0.2188 +1 0.5 0.25 +1 0.5 0.2812 +1 0.5 0.3125 +1 0.5 0.3438 +1 0.5 0.375 +1 0.5 0.4062 +1 0.5 0.4375 +1 0.5 0.4688 +1 0.5 0.5 +1 0.5 0.5312 +1 0.5 0.5625 +1 0.5 0.5938 +1 0.5 0.625 +1 0.5 0.6562 +1 0.5 0.6875 +1 0.5 0.7188 +1 0.5 0.75 +1 0.5 0.7812 +1 0.5 0.8125 +1 0.5 0.8438 +1 0.5 0.875 +1 0.5 0.9062 +1 0.5 0.9375 +1 0.5 0.9688 +1 0.5 1 +1 0.5312 0 +1 0.5312 0.03125 +1 0.5312 0.0625 +1 0.5312 0.09375 +1 0.5312 0.125 +1 0.5312 0.1562 +1 0.5312 0.1875 +1 0.5312 0.2188 +1 0.5312 0.25 +1 0.5312 0.2812 +1 0.5312 0.3125 +1 0.5312 0.3438 +1 0.5312 0.375 +1 0.5312 0.4062 +1 0.5312 0.4375 +1 0.5312 0.4688 +1 0.5312 0.5 +1 0.5312 0.5312 +1 0.5312 0.5625 +1 0.5312 0.5938 +1 0.5312 0.625 +1 0.5312 0.6562 +1 0.5312 0.6875 +1 0.5312 0.7188 +1 0.5312 0.75 +1 0.5312 0.7812 +1 0.5312 0.8125 +1 0.5312 0.8438 +1 0.5312 0.875 +1 0.5312 0.9062 +1 0.5312 0.9375 +1 0.5312 0.9688 +1 0.5312 1 +1 0.5625 0 +1 0.5625 0.03125 +1 0.5625 0.0625 +1 0.5625 0.09375 +1 0.5625 0.125 +1 0.5625 0.1562 +1 0.5625 0.1875 +1 0.5625 0.2188 +1 0.5625 0.25 +1 0.5625 0.2812 +1 0.5625 0.3125 +1 0.5625 0.3438 +1 0.5625 0.375 +1 0.5625 0.4062 +1 0.5625 0.4375 +1 0.5625 0.4688 +1 0.5625 0.5 +1 0.5625 0.5312 +1 0.5625 0.5625 +1 0.5625 0.5938 +1 0.5625 0.625 +1 0.5625 0.6562 +1 0.5625 0.6875 +1 0.5625 0.7188 +1 0.5625 0.75 +1 0.5625 0.7812 +1 0.5625 0.8125 +1 0.5625 0.8438 +1 0.5625 0.875 +1 0.5625 0.9062 +1 0.5625 0.9375 +1 0.5625 0.9688 +1 0.5625 1 +1 0.5938 0 +1 0.5938 0.03125 +1 0.5938 0.0625 +1 0.5938 0.09375 +1 0.5938 0.125 +1 0.5938 0.1562 +1 0.5938 0.1875 +1 0.5938 0.2188 +1 0.5938 0.25 +1 0.5938 0.2812 +1 0.5938 0.3125 +1 0.5938 0.3438 +1 0.5938 0.375 +1 0.5938 0.4062 +1 0.5938 0.4375 +1 0.5938 0.4688 +1 0.5938 0.5 +1 0.5938 0.5312 +1 0.5938 0.5625 +1 0.5938 0.5938 +1 0.5938 0.625 +1 0.5938 0.6562 +1 0.5938 0.6875 +1 0.5938 0.7188 +1 0.5938 0.75 +1 0.5938 0.7812 +1 0.5938 0.8125 +1 0.5938 0.8438 +1 0.5938 0.875 +1 0.5938 0.9062 +1 0.5938 0.9375 +1 0.5938 0.9688 +1 0.5938 1 +1 0.625 0 +1 0.625 0.03125 +1 0.625 0.0625 +1 0.625 0.09375 +1 0.625 0.125 +1 0.625 0.1562 +1 0.625 0.1875 +1 0.625 0.2188 +1 0.625 0.25 +1 0.625 0.2812 +1 0.625 0.3125 +1 0.625 0.3438 +1 0.625 0.375 +1 0.625 0.4062 +1 0.625 0.4375 +1 0.625 0.4688 +1 0.625 0.5 +1 0.625 0.5312 +1 0.625 0.5625 +1 0.625 0.5938 +1 0.625 0.625 +1 0.625 0.6562 +1 0.625 0.6875 +1 0.625 0.7188 +1 0.625 0.75 +1 0.625 0.7812 +1 0.625 0.8125 +1 0.625 0.8438 +1 0.625 0.875 +1 0.625 0.9062 +1 0.625 0.9375 +1 0.625 0.9688 +1 0.625 1 +1 0.6562 0 +1 0.6562 0.03125 +1 0.6562 0.0625 +1 0.6562 0.09375 +1 0.6562 0.125 +1 0.6562 0.1562 +1 0.6562 0.1875 +1 0.6562 0.2188 +1 0.6562 0.25 +1 0.6562 0.2812 +1 0.6562 0.3125 +1 0.6562 0.3438 +1 0.6562 0.375 +1 0.6562 0.4062 +1 0.6562 0.4375 +1 0.6562 0.4688 +1 0.6562 0.5 +1 0.6562 0.5312 +1 0.6562 0.5625 +1 0.6562 0.5938 +1 0.6562 0.625 +1 0.6562 0.6562 +1 0.6562 0.6875 +1 0.6562 0.7188 +1 0.6562 0.75 +1 0.6562 0.7812 +1 0.6562 0.8125 +1 0.6562 0.8438 +1 0.6562 0.875 +1 0.6562 0.9062 +1 0.6562 0.9375 +1 0.6562 0.9688 +1 0.6562 1 +1 0.6875 0 +1 0.6875 0.03125 +1 0.6875 0.0625 +1 0.6875 0.09375 +1 0.6875 0.125 +1 0.6875 0.1562 +1 0.6875 0.1875 +1 0.6875 0.2188 +1 0.6875 0.25 +1 0.6875 0.2812 +1 0.6875 0.3125 +1 0.6875 0.3438 +1 0.6875 0.375 +1 0.6875 0.4062 +1 0.6875 0.4375 +1 0.6875 0.4688 +1 0.6875 0.5 +1 0.6875 0.5312 +1 0.6875 0.5625 +1 0.6875 0.5938 +1 0.6875 0.625 +1 0.6875 0.6562 +1 0.6875 0.6875 +1 0.6875 0.7188 +1 0.6875 0.75 +1 0.6875 0.7812 +1 0.6875 0.8125 +1 0.6875 0.8438 +1 0.6875 0.875 +1 0.6875 0.9062 +1 0.6875 0.9375 +1 0.6875 0.9688 +1 0.6875 1 +1 0.7188 0 +1 0.7188 0.03125 +1 0.7188 0.0625 +1 0.7188 0.09375 +1 0.7188 0.125 +1 0.7188 0.1562 +1 0.7188 0.1875 +1 0.7188 0.2188 +1 0.7188 0.25 +1 0.7188 0.2812 +1 0.7188 0.3125 +1 0.7188 0.3438 +1 0.7188 0.375 +1 0.7188 0.4062 +1 0.7188 0.4375 +1 0.7188 0.4688 +1 0.7188 0.5 +1 0.7188 0.5312 +1 0.7188 0.5625 +1 0.7188 0.5938 +1 0.7188 0.625 +1 0.7188 0.6562 +1 0.7188 0.6875 +1 0.7188 0.7188 +1 0.7188 0.75 +1 0.7188 0.7812 +1 0.7188 0.8125 +1 0.7188 0.8438 +1 0.7188 0.875 +1 0.7188 0.9062 +1 0.7188 0.9375 +1 0.7188 0.9688 +1 0.7188 1 +1 0.75 0 +1 0.75 0.03125 +1 0.75 0.0625 +1 0.75 0.09375 +1 0.75 0.125 +1 0.75 0.1562 +1 0.75 0.1875 +1 0.75 0.2188 +1 0.75 0.25 +1 0.75 0.2812 +1 0.75 0.3125 +1 0.75 0.3438 +1 0.75 0.375 +1 0.75 0.4062 +1 0.75 0.4375 +1 0.75 0.4688 +1 0.75 0.5 +1 0.75 0.5312 +1 0.75 0.5625 +1 0.75 0.5938 +1 0.75 0.625 +1 0.75 0.6562 +1 0.75 0.6875 +1 0.75 0.7188 +1 0.75 0.75 +1 0.75 0.7812 +1 0.75 0.8125 +1 0.75 0.8438 +1 0.75 0.875 +1 0.75 0.9062 +1 0.75 0.9375 +1 0.75 0.9688 +1 0.75 1 +1 0.7812 0 +1 0.7812 0.03125 +1 0.7812 0.0625 +1 0.7812 0.09375 +1 0.7812 0.125 +1 0.7812 0.1562 +1 0.7812 0.1875 +1 0.7812 0.2188 +1 0.7812 0.25 +1 0.7812 0.2812 +1 0.7812 0.3125 +1 0.7812 0.3438 +1 0.7812 0.375 +1 0.7812 0.4062 +1 0.7812 0.4375 +1 0.7812 0.4688 +1 0.7812 0.5 +1 0.7812 0.5312 +1 0.7812 0.5625 +1 0.7812 0.5938 +1 0.7812 0.625 +1 0.7812 0.6562 +1 0.7812 0.6875 +1 0.7812 0.7188 +1 0.7812 0.75 +1 0.7812 0.7812 +1 0.7812 0.8125 +1 0.7812 0.8438 +1 0.7812 0.875 +1 0.7812 0.9062 +1 0.7812 0.9375 +1 0.7812 0.9688 +1 0.7812 1 +1 0.8125 0 +1 0.8125 0.03125 +1 0.8125 0.0625 +1 0.8125 0.09375 +1 0.8125 0.125 +1 0.8125 0.1562 +1 0.8125 0.1875 +1 0.8125 0.2188 +1 0.8125 0.25 +1 0.8125 0.2812 +1 0.8125 0.3125 +1 0.8125 0.3438 +1 0.8125 0.375 +1 0.8125 0.4062 +1 0.8125 0.4375 +1 0.8125 0.4688 +1 0.8125 0.5 +1 0.8125 0.5312 +1 0.8125 0.5625 +1 0.8125 0.5938 +1 0.8125 0.625 +1 0.8125 0.6562 +1 0.8125 0.6875 +1 0.8125 0.7188 +1 0.8125 0.75 +1 0.8125 0.7812 +1 0.8125 0.8125 +1 0.8125 0.8438 +1 0.8125 0.875 +1 0.8125 0.9062 +1 0.8125 0.9375 +1 0.8125 0.9688 +1 0.8125 1 +1 0.8438 0 +1 0.8438 0.03125 +1 0.8438 0.0625 +1 0.8438 0.09375 +1 0.8438 0.125 +1 0.8438 0.1562 +1 0.8438 0.1875 +1 0.8438 0.2188 +1 0.8438 0.25 +1 0.8438 0.2812 +1 0.8438 0.3125 +1 0.8438 0.3438 +1 0.8438 0.375 +1 0.8438 0.4062 +1 0.8438 0.4375 +1 0.8438 0.4688 +1 0.8438 0.5 +1 0.8438 0.5312 +1 0.8438 0.5625 +1 0.8438 0.5938 +1 0.8438 0.625 +1 0.8438 0.6562 +1 0.8438 0.6875 +1 0.8438 0.7188 +1 0.8438 0.75 +1 0.8438 0.7812 +1 0.8438 0.8125 +1 0.8438 0.8438 +1 0.8438 0.875 +1 0.8438 0.9062 +1 0.8438 0.9375 +1 0.8438 0.9688 +1 0.8438 1 +1 0.875 0 +1 0.875 0.03125 +1 0.875 0.0625 +1 0.875 0.09375 +1 0.875 0.125 +1 0.875 0.1562 +1 0.875 0.1875 +1 0.875 0.2188 +1 0.875 0.25 +1 0.875 0.2812 +1 0.875 0.3125 +1 0.875 0.3438 +1 0.875 0.375 +1 0.875 0.4062 +1 0.875 0.4375 +1 0.875 0.4688 +1 0.875 0.5 +1 0.875 0.5312 +1 0.875 0.5625 +1 0.875 0.5938 +1 0.875 0.625 +1 0.875 0.6562 +1 0.875 0.6875 +1 0.875 0.7188 +1 0.875 0.75 +1 0.875 0.7812 +1 0.875 0.8125 +1 0.875 0.8438 +1 0.875 0.875 +1 0.875 0.9062 +1 0.875 0.9375 +1 0.875 0.9688 +1 0.875 1 +1 0.9062 0 +1 0.9062 0.03125 +1 0.9062 0.0625 +1 0.9062 0.09375 +1 0.9062 0.125 +1 0.9062 0.1562 +1 0.9062 0.1875 +1 0.9062 0.2188 +1 0.9062 0.25 +1 0.9062 0.2812 +1 0.9062 0.3125 +1 0.9062 0.3438 +1 0.9062 0.375 +1 0.9062 0.4062 +1 0.9062 0.4375 +1 0.9062 0.4688 +1 0.9062 0.5 +1 0.9062 0.5312 +1 0.9062 0.5625 +1 0.9062 0.5938 +1 0.9062 0.625 +1 0.9062 0.6562 +1 0.9062 0.6875 +1 0.9062 0.7188 +1 0.9062 0.75 +1 0.9062 0.7812 +1 0.9062 0.8125 +1 0.9062 0.8438 +1 0.9062 0.875 +1 0.9062 0.9062 +1 0.9062 0.9375 +1 0.9062 0.9688 +1 0.9062 1 +1 0.9375 0 +1 0.9375 0.03125 +1 0.9375 0.0625 +1 0.9375 0.09375 +1 0.9375 0.125 +1 0.9375 0.1562 +1 0.9375 0.1875 +1 0.9375 0.2188 +1 0.9375 0.25 +1 0.9375 0.2812 +1 0.9375 0.3125 +1 0.9375 0.3438 +1 0.9375 0.375 +1 0.9375 0.4062 +1 0.9375 0.4375 +1 0.9375 0.4688 +1 0.9375 0.5 +1 0.9375 0.5312 +1 0.9375 0.5625 +1 0.9375 0.5938 +1 0.9375 0.625 +1 0.9375 0.6562 +1 0.9375 0.6875 +1 0.9375 0.7188 +1 0.9375 0.75 +1 0.9375 0.7812 +1 0.9375 0.8125 +1 0.9375 0.8438 +1 0.9375 0.875 +1 0.9375 0.9062 +1 0.9375 0.9375 +1 0.9375 0.9688 +1 0.9375 1 +1 0.9688 0 +1 0.9688 0.03125 +1 0.9688 0.0625 +1 0.9688 0.09375 +1 0.9688 0.125 +1 0.9688 0.1562 +1 0.9688 0.1875 +1 0.9688 0.2188 +1 0.9688 0.25 +1 0.9688 0.2812 +1 0.9688 0.3125 +1 0.9688 0.3438 +1 0.9688 0.375 +1 0.9688 0.4062 +1 0.9688 0.4375 +1 0.9688 0.4688 +1 0.9688 0.5 +1 0.9688 0.5312 +1 0.9688 0.5625 +1 0.9688 0.5938 +1 0.9688 0.625 +1 0.9688 0.6562 +1 0.9688 0.6875 +1 0.9688 0.7188 +1 0.9688 0.75 +1 0.9688 0.7812 +1 0.9688 0.8125 +1 0.9688 0.8438 +1 0.9688 0.875 +1 0.9688 0.9062 +1 0.9688 0.9375 +1 0.9688 0.9688 +1 0.9688 1 +1 1 0 +1 1 0.03125 +1 1 0.0625 +1 1 0.09375 +1 1 0.125 +1 1 0.1562 +1 1 0.1875 +1 1 0.2188 +1 1 0.25 +1 1 0.2812 +1 1 0.3125 +1 1 0.3438 +1 1 0.375 +1 1 0.4062 +1 1 0.4375 +1 1 0.4688 +1 1 0.5 +1 1 0.5312 +1 1 0.5625 +1 1 0.5938 +1 1 0.625 +1 1 0.6562 +1 1 0.6875 +1 1 0.7188 +1 1 0.75 +1 1 0.7812 +1 1 0.8125 +1 1 0.8438 +1 1 0.875 +1 1 0.9062 +1 1 0.9375 +1 1 0.9688 +1 1 1 + + + + + Output Scaling - only used for full-range signals + 0.06256109481915934 + 0.91886608015640270 + 0. + 1. + + diff --git a/tests/data/files/clf/smpte_only/illegal/id_bad_value.clf b/tests/data/files/clf/smpte_only/illegal/id_bad_value.clf new file mode 100644 index 0000000000..fa425160e9 --- /dev/null +++ b/tests/data/files/clf/smpte_only/illegal/id_bad_value.clf @@ -0,0 +1,25 @@ + + + 3bae2da8 + The Id element does not adhere to the ST 2136-1 formatting. + CIE-XYZ D65 to CIELAB L*, a*, b* (scaled by 1/100, neutrals at 0.0 chroma) + CIE-XYZ, D65 white (scaled [0,1]) + CIELAB L*, a*, b* (scaled by 1/100, neutrals at 0.0 chroma) + + + 1.052126639 0.000000000 0.000000000 + 0.000000000 1.000000000 0.000000000 + 0.000000000 0.000000000 0.918224951 + + + + + + + + 0.00000000 1.00000000 0.00000000 + 4.31034483 -4.31034483 0.00000000 + 0.00000000 1.72413793 -1.72413793 + + + diff --git a/tests/data/files/clf/smpte_only/illegal/process_list_higher_ns_version.clf b/tests/data/files/clf/smpte_only/illegal/process_list_higher_ns_version.clf new file mode 100644 index 0000000000..eeea9dc8c6 --- /dev/null +++ b/tests/data/files/clf/smpte_only/illegal/process_list_higher_ns_version.clf @@ -0,0 +1,11 @@ + + + The xmlns is newer than the max supported version. + + + 3.24000 -1.53700 -0.49850 +-0.96930 1.87600 0.04156 + 0.05560 -0.20400 1.05730 + + + \ No newline at end of file diff --git a/tests/data/files/clf/smpte_only/namespaces.clf b/tests/data/files/clf/smpte_only/namespaces.clf new file mode 100644 index 0000000000..54670bb8f7 --- /dev/null +++ b/tests/data/files/clf/smpte_only/namespaces.clf @@ -0,0 +1,14 @@ + + + + Example CLF file using namespaces. + + + A tiny 2-sample RGB LUT1D. + 0 0 0 1 1 1 + + diff --git a/tests/data/files/clf/tabulation_support.clf b/tests/data/files/clf/tabulation_support.clf index 0411ece76f..4d0c566d42 100644 --- a/tests/data/files/clf/tabulation_support.clf +++ b/tests/data/files/clf/tabulation_support.clf @@ -1,5 +1,5 @@ - + Test that tabs work as separators diff --git a/tests/data/files/clf/xyz_to_rgb.clf b/tests/data/files/clf/xyz_to_rgb.clf index 14cf13ddbc..dbe21b44c1 100644 --- a/tests/data/files/clf/xyz_to_rgb.clf +++ b/tests/data/files/clf/xyz_to_rgb.clf @@ -1,5 +1,5 @@ - + Example with a Matrix and Lut1D XYZ to sRGB matrix diff --git a/tests/data/files/process_list_conflicting_versions.ctf b/tests/data/files/process_list_conflicting_versions.ctf new file mode 100644 index 0000000000..820cf40430 --- /dev/null +++ b/tests/data/files/process_list_conflicting_versions.ctf @@ -0,0 +1,12 @@ + + + Not allowed to use the CLF / ST 2136-1 namespace in a CTF file. + + XYZ to sRGB matrix + + 3.24000 -1.53700 -0.49850 +-0.96930 1.87600 0.04156 + 0.05560 -0.20400 1.05730 + + + diff --git a/tests/data/files/reference_nested_2.ctf b/tests/data/files/reference_nested_2.ctf index b045d2e1d3..8bf9ba9e49 100644 --- a/tests/data/files/reference_nested_2.ctf +++ b/tests/data/files/reference_nested_2.ctf @@ -1,5 +1,5 @@ - + diff --git a/tests/data/files/reference_one_matrix.ctf b/tests/data/files/reference_one_matrix.ctf index de574c1399..4512d084bf 100644 --- a/tests/data/files/reference_one_matrix.ctf +++ b/tests/data/files/reference_one_matrix.ctf @@ -1,5 +1,5 @@ - + diff --git a/tests/data/files/references_same_twice.ctf b/tests/data/files/references_same_twice.ctf index 25b9036d02..29e2a666b9 100644 --- a/tests/data/files/references_same_twice.ctf +++ b/tests/data/files/references_same_twice.ctf @@ -1,5 +1,5 @@ - - + + diff --git a/tests/gpu/CMakeLists.txt b/tests/gpu/CMakeLists.txt index 5f1c0379cf..df49452edd 100644 --- a/tests/gpu/CMakeLists.txt +++ b/tests/gpu/CMakeLists.txt @@ -1,8 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright Contributors to the OpenColorIO Project. -if(NOT OCIO_GL_ENABLED) - message(WARNING "GL component missing. Skipping the GPU unit tests.") +if(NOT OCIO_GL_ENABLED AND NOT (WIN32 AND OCIO_DIRECTX_ENABLED) AND NOT OCIO_VULKAN_ENABLED) + message(WARNING "GL, DirectX, and Vulkan components all missing. Skipping the GPU unit tests.") return() endif() @@ -41,23 +41,67 @@ target_link_libraries(test_gpu_exec testutils ) -add_test(NAME test_gpu COMMAND test_gpu_exec) +if(OCIO_GL_ENABLED) + add_test(NAME test_opengl COMMAND test_gpu_exec) +endif() if(APPLE) add_test(NAME test_metal COMMAND test_gpu_exec -metal) endif() +if(WIN32 AND OCIO_DIRECTX_ENABLED) + add_test(NAME test_dx COMMAND test_gpu_exec --dx) +endif() +if(OCIO_VULKAN_ENABLED) + add_test(NAME test_vulkan COMMAND test_gpu_exec --vulkan) +endif() + +# Copy dxcompiler.dll and dxil.dll to the test output directory. +# These are required at runtime when DXC (IDxcCompiler3) is used for SM6.0 shader compilation. +if(WIN32 AND OCIO_DIRECTX_ENABLED) + include(LocateDXCompilerRuntime) + if(DXCOMPILER_DLL) + add_custom_command(TARGET test_gpu_exec POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${DXCOMPILER_DLL}" "$" + COMMENT "Copying dxcompiler.dll to test output directory" + ) + if(DXIL_DLL) + add_custom_command(TARGET test_gpu_exec POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${DXIL_DLL}" "$" + COMMENT "Copying dxil.dll to test output directory" + ) + endif() + endif() +endif() # Note: To avoid changing PATH from outside the cmake files. if(MSVC AND BUILD_SHARED_LIBS) + # Build time list of runtime dll dirs for the exe target. + set(dll_dirs_expr "$,;>") - if (MSVC_IDE) - # Note: By default Microsoft Visual Studio editor happens the build type to the build directory. - set(BUILD_TYPE ${CMAKE_BUILD_TYPE}) - endif() - - set(NEW_PATH "${PROJECT_BINARY_DIR}/src/OpenColorIO/${BUILD_TYPE}") - set(NEW_PATH "${NEW_PATH}\\\;${GLUT_INCLUDE_DIR}/../bin") - set(NEW_PATH "${NEW_PATH}\\\;${GLEW_INCLUDE_DIRS}/../bin") + # Add folders for glut and glew DLLs. + set(extra_dirs "${GLUT_INCLUDE_DIR}/../bin\\;${GLEW_INCLUDE_DIRS}/../bin\\") - set_tests_properties(test_gpu PROPERTIES ENVIRONMENT PATH=${NEW_PATH}) + # Tell CTest to use this PATH while launching test_gpu_exec + if(OCIO_GL_ENABLED) + set_tests_properties(test_opengl PROPERTIES + ENVIRONMENT "PATH=${dll_dirs_expr}\\;${extra_dirs}" + ) + endif() + if(WIN32 AND OCIO_DIRECTX_ENABLED) + set_tests_properties(test_dx PROPERTIES + ENVIRONMENT "PATH=${dll_dirs_expr}\\;${extra_dirs}" + ) + endif() + if(OCIO_VULKAN_ENABLED) + set_tests_properties(test_vulkan PROPERTIES + ENVIRONMENT "PATH=${dll_dirs_expr}\\;${extra_dirs}" + ) + endif() + # Also set the debugger environment so that you can launch + # test_gpu_exec directly within Visual Studio. + set_property(TARGET test_gpu_exec PROPERTY + VS_DEBUGGER_ENVIRONMENT "PATH=${dll_dirs_expr};${extra_dirs};%PATH%" + ) endif() diff --git a/tests/gpu/FixedFunctionOp_test.cpp b/tests/gpu/FixedFunctionOp_test.cpp index 6c3879d858..08a6dd4534 100644 --- a/tests/gpu/FixedFunctionOp_test.cpp +++ b/tests/gpu/FixedFunctionOp_test.cpp @@ -303,7 +303,8 @@ OCIO_ADD_GPU_TEST(FixedFunction, style_aces_gamutcomp13_inv) }; test.setCustomValues(values); - test.setErrorThreshold(3e-6f); + // 3e-5 accommodates GPU pow() precision at large output values (~3.08) on DirectX. + test.setErrorThreshold(3e-5f); } OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_output_transform_fwd) @@ -618,8 +619,8 @@ OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_1000nit_p3_rndtrip) // TODO: Investigate why this is not closer. // Setting the CPUProcessor to OPTIMIZATION_NONE helps slightly, but is not the main - // cause of the error. - test.setErrorThreshold(0.012f); + // cause of the error. 0.014 accommodates DirectX floating point differences. + test.setErrorThreshold(0.014f); } OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_1000nit_p3_inv) @@ -656,7 +657,7 @@ OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_4000nit_p3_rndtrip) test.setCustomValues(values); // TODO: Investigate why this is not closer. - test.setErrorThreshold(0.018f); + test.setErrorThreshold(0.019f); } OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_4000nit_p3_inv) @@ -692,8 +693,8 @@ OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_4000nit_rec2020_rndtrip) GenerateIdentityLut3D(values, lut_size, lum_scale); test.setCustomValues(values); - // TODO: Investigate why this is not closer. - test.setErrorThreshold(0.03f); + // TODO: Investigate why this is not closer. 0.034 accommodates DirectX floating point differences. + test.setErrorThreshold(0.034f); } OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_4000nit_rec2020_inv) @@ -1107,6 +1108,74 @@ OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_gamut_compress_inv) test.setErrorThreshold(4e-4f); } +OCIO_ADD_GPU_TEST(FixedFunction, style_aces2_gamut_compress_no1dlut) +{ + // Test the 2D TEXTURE path used for Reach and Cusp table sampling + // OpenGL tests would otherwise not use it and prefer 1D TEXTURE + + const double data[9] = { + // Peak luminance + 1000.f, + // P3D65 gamut + 0.680, 0.320, 0.265, 0.690, 0.150, 0.060, 0.3127, 0.3290 + }; + OCIO::FixedFunctionTransformRcPtr func = + OCIO::FixedFunctionTransform::Create(OCIO::FIXED_FUNCTION_ACES_GAMUT_COMPRESS_20, &data[0], 9); + func->setDirection(OCIO::TRANSFORM_DIR_INVERSE); + + test.setProcessor(func); + + OCIOGPUTest::CustomValues values; + values.m_inputValues = + { + // ACEScg primaries and secondaries scaled by 4 + 110.702453613f, 211.251770020f, 25.025110245f, 1.0f, + 168.016815186f, 129.796249390f, 106.183448792f, 1.0f, + 140.814849854f, 193.459213257f, 147.056488037f, 1.0f, + 156.429519653f, 110.938514709f, 192.204727173f, 1.0f, + 80.456542969f, 98.490524292f, 268.442108154f, 1.0f, + 135.172195435f, 175.559280396f, 341.715240479f, 1.0f, + // OCIO test values + 18.187314987f, 33.819175720f, 4.173158169f, 0.5f, + 80.413116455f, 21.309329987f, 332.159759521f, 1.0f, + 83.447891235f, 37.852291107f, 182.925750732f, 0.0f, + // ColorChecker24 (SMPTE 2065-1 2021) + 27.411964417f, 13.382769585f, 38.146659851f, 1.0f, + 59.987670898f, 14.391894341f, 39.841842651f, 1.0f, + 43.298923492f, 12.199877739f, 249.107116699f, 1.0f, + 31.489658356f, 14.075142860f, 128.878036499f, 1.0f, + 50.749198914f, 12.731814384f, 285.658966064f, 1.0f, + 64.728637695f, 18.593795776f, 179.324264526f, 1.0f, + 53.399448395f, 37.394428253f, 50.924011230f, 1.0f, + 34.719596863f, 21.616765976f, 271.008331299f, 1.0f, + 43.910713196f, 36.788166046f, 13.975610733f, 1.0f, + 23.196525574f, 15.118354797f, 317.544281006f, 1.0f, + 63.348674774f, 33.283493042f, 119.145133972f, 1.0f, + 64.908889771f, 35.371044159f, 70.842193604f, 1.0f, + 24.876911163f, 23.143159866f, 273.228973389f, 1.0f, + 44.203376770f, 28.918329239f, 144.154159546f, 1.0f, + 32.824356079f, 43.447875977f, 17.892261505f, 1.0f, + 75.830871582f, 39.872474670f, 90.752044678f, 1.0f, + 45.823116302f, 34.652069092f, 348.832092285f, 1.0f, + 43.597240448f, 23.079078674f, 218.454376221f, 1.0f, + 96.212783813f, 0.322624743f, 108.271926880f, 1.0f, + 78.222122192f, 0.094044082f, 33.296318054f, 1.0f, + 60.364795685f, 0.031291425f, 291.004058838f, 1.0f, + 43.659111023f, 0.038717352f, 297.386047363f, 1.0f, + 26.623359680f, 0.269155562f, 234.276382446f, 1.0f, + 12.961384773f, 0.366550505f, 255.025634766f, 1.0f, + // Spectrally non-selective 18 % reflecting diffuser + 40.609165192f, 0.000000000f, 299.357757568f, 1.0f, + // Perfect reflecting diffuser + 101.899215698f, 0.000068110f, 5.640549183f, 1.0f, + }; + test.setCustomValues(values); + + test.setErrorThreshold(1e-4f); + + test.getShaderDesc()->setAllowTexture1D(false); +} + // The next four tests run into a problem on some graphics cards where 0.0 * Inf = 0.0, // rather than the correct value of NaN. Therefore turning off TestInfinity for these tests. diff --git a/tests/gpu/GPUUnitTest.cpp b/tests/gpu/GPUUnitTest.cpp index 6508131218..a5aa491c36 100644 --- a/tests/gpu/GPUUnitTest.cpp +++ b/tests/gpu/GPUUnitTest.cpp @@ -15,10 +15,22 @@ #include "apputils/argparse.h" #include "utils/StringUtils.h" +#include "graphicalapp.h" + +#ifdef OCIO_GL_ENABLED #include "oglapp.h" +#endif + +#ifdef OCIO_DIRECTX_ENABLED +#include "dxapp.h" +#endif + #if __APPLE__ #include "metalapp.h" #endif +#ifdef OCIO_VULKAN_ENABLED +#include "vulkanapp.h" +#endif namespace OCIO = OCIO_NAMESPACE; @@ -164,6 +176,16 @@ OCIO::GpuShaderDescRcPtr & OCIOGPUTest::getShaderDesc() m_shaderDesc = OCIO::GpuShaderDesc::CreateShaderDesc(); m_shaderDesc->setLanguage(m_gpuShadingLanguage); m_shaderDesc->setPixelName("myPixel"); + + // Vulkan doesn't support 1D textures well on all platforms (e.g., MoltenVK/macOS) + // Force 2D textures for Vulkan to ensure compatibility + if (m_gpuShadingLanguage == OCIO::GPU_LANGUAGE_GLSL_VK_4_6) + { + m_shaderDesc->setAllowTexture1D(false); + // Set texture binding start to 3 since bindings 1 and 2 are used for + // input/output storage buffers in the Vulkan compute shader + m_shaderDesc->setDescriptorSetIndex(0, 3); + } } return m_shaderDesc; } @@ -194,12 +216,12 @@ namespace constexpr unsigned g_winHeight = 256; constexpr unsigned g_components = 4; - void AllocateImageTexture(OCIO::OglAppRcPtr & app) + void AllocateImageTexture(OCIO::GraphicalAppRcPtr& app) { const unsigned numEntries = g_winWidth * g_winHeight * g_components; OCIOGPUTest::CustomValues::Values image(numEntries, 0.0f); - app->initImage(g_winWidth, g_winHeight, OCIO::OglApp::COMPONENTS_RGBA, &image[0]); + app->initImage(g_winWidth, g_winHeight, OCIO::GraphicalApp::COMPONENTS_RGBA, &image[0]); } void SetTestValue(float * image, float val, unsigned numComponents) @@ -214,7 +236,9 @@ namespace } } - void UpdateImageTexture(OCIO::OglAppRcPtr & app, OCIOGPUTestRcPtr & test) + // Shared helper to prepare input values for GPU testing. + // Returns a pointer to the prepared input values that should be uploaded to the GPU. + const float * PrepareInputValues(OCIOGPUTestRcPtr & test, bool testNaN, bool testInfinity) { // Note: User-specified custom values are padded out // to the preferred size (g_winWidth x g_winHeight). @@ -225,17 +249,6 @@ namespace { // It means to generate the input values. - -#if __APPLE__ && __aarch64__ - // The Apple M1 chip handles differently the Nan and Inf processing introducing - // differences with CPU processing. - const bool testNaN = false; - const bool testInfinity = false; -#else - const bool testNaN = test->getTestNaN(); - const bool testInfinity = test->getTestInfinity(); -#endif - float min = 0.0f; float max = 1.0f; if(test->getTestWideRange()) @@ -325,12 +338,28 @@ namespace throw OCIO::Exception("Missing some expected input values"); } - app->updateImage(&values.m_inputValues[0]); + return &values.m_inputValues[0]; } - void UpdateOCIOGLState(OCIO::OglAppRcPtr & app, OCIOGPUTestRcPtr & test) + void UpdateImageTexture(OCIO::GraphicalAppRcPtr & app, OCIOGPUTestRcPtr & test) { - app->setPrintShader(test->isVerbose()); +#if __APPLE__ && __aarch64__ + // The Apple M1 chip handles differently the Nan and Inf processing introducing + // differences with CPU processing. + const bool testNaN = false; + const bool testInfinity = false; +#else + const bool testNaN = test->getTestNaN(); + const bool testInfinity = test->getTestInfinity(); +#endif + + const float * inputValues = PrepareInputValues(test, testNaN, testInfinity); + app->updateImage(inputValues); + } + + void UpdateOCIOGPUState(OCIO::GraphicalAppRcPtr & app, OCIOGPUTestRcPtr & test) + { + app->setShaderVerbose(test->isVerbose()); OCIO::ConstProcessorRcPtr & processor = test->getProcessor(); OCIO::GpuShaderDescRcPtr & shaderDesc = test->getShaderDesc(); @@ -384,55 +413,18 @@ namespace constexpr size_t invalidIndex = std::numeric_limits::max(); - // Validate the GPU processing against the CPU one. - void ValidateImageTexture(OCIO::OglAppRcPtr & app, OCIOGPUTestRcPtr & test) + // Shared helper to validate GPU processing against CPU. + // The gpuImage parameter should already contain the GPU output. + void ValidateResults(OCIOGPUTestRcPtr & test, + const OCIOGPUTest::CustomValues::Values & cpuImage, + const OCIOGPUTest::CustomValues::Values & gpuImage, + size_t width, size_t height) { - // Each retest is rebuilding a cpu proc. - OCIO::ConstCPUProcessorRcPtr processor = test->getProcessor()->getDefaultCPUProcessor(); - const float epsilon = test->getErrorThreshold(); const float expectMinValue = test->getExpectedMinimalValue(); - - // Compute the width & height to avoid testing the padded values. - - const size_t numPixels = test->getCustomValues().m_originalInputValueSize / g_components; - - size_t width, height = 0; - if(numPixels<=g_winWidth) - { - width = numPixels; - height = 1; - } - else - { - width = g_winWidth; - height = numPixels/g_winWidth; - if((numPixels%g_winWidth)>0) height += 1; - } - - if(width==0 || width>g_winWidth || height==0 || height>g_winHeight) - { - throw OCIO::Exception("Mismatch with the expected image size"); - } - - // Step 1: Compute the output using the CPU engine. - - OCIOGPUTest::CustomValues::Values cpuImage = test->getCustomValues().m_inputValues; - OCIO::PackedImageDesc desc(&cpuImage[0], (long)width, (long)height, g_components); - processor->apply(desc); - - // Step 2: Grab the GPU output from the rendering buffer. - - OCIOGPUTest::CustomValues::Values gpuImage(g_winWidth*g_winHeight*g_components, 0.0f); - app->readImage(&gpuImage[0]); - - // Step 3: Compare the two results. - const OCIOGPUTest::CustomValues::Values & image = test->getCustomValues().m_inputValues; + float diff = 0.0f; - // Initialize these to a known reference value, if any of the four component checks - // below fail, it will be set to the index of the last failure. Only the last failure - // is printed below. size_t idxDiff = invalidIndex; size_t idxNan = invalidIndex; size_t idxInf = invalidIndex; @@ -440,6 +432,7 @@ namespace float minVals[4] = {huge, huge, huge, huge}; float maxVals[4] = {-huge, -huge, -huge, -huge}; const bool relativeTest = test->getRelativeComparison(); + for(size_t idx=0; idx<(width*height); ++idx) { for(size_t chan=0; chan<4; ++chan) @@ -524,6 +517,46 @@ namespace test->updateMaxDiff(diff, idxDiff); } } + + // Validate the GPU processing against the CPU one. + void ValidateImageTexture(OCIO::GraphicalAppRcPtr & app, OCIOGPUTestRcPtr & test) + { + // Each retest is rebuilding a cpu proc. + OCIO::ConstCPUProcessorRcPtr processor = test->getProcessor()->getDefaultCPUProcessor(); + + // Compute the width & height to avoid testing the padded values. + const size_t numPixels = test->getCustomValues().m_originalInputValueSize / g_components; + + size_t width, height = 0; + if(numPixels<=g_winWidth) + { + width = numPixels; + height = 1; + } + else + { + width = g_winWidth; + height = numPixels/g_winWidth; + if((numPixels%g_winWidth)>0) height += 1; + } + + if(width==0 || width>g_winWidth || height==0 || height>g_winHeight) + { + throw OCIO::Exception("Mismatch with the expected image size"); + } + + // Step 1: Compute the output using the CPU engine. + OCIOGPUTest::CustomValues::Values cpuImage = test->getCustomValues().m_inputValues; + OCIO::PackedImageDesc desc(&cpuImage[0], (long)width, (long)height, g_components); + processor->apply(desc); + + // Step 2: Grab the GPU output from the rendering buffer. + OCIOGPUTest::CustomValues::Values gpuImage(g_winWidth*g_winHeight*g_components, 0.0f); + app->readImage(&gpuImage[0]); + + // Step 3: Compare the two results. + ValidateResults(test, cpuImage, gpuImage, width, height); + } }; int main(int argc, const char ** argv) @@ -536,6 +569,12 @@ int main(int argc, const char ** argv) bool printHelp = false; bool useMetalRenderer = false; +#ifdef OCIO_VULKAN_ENABLED + bool useVulkanRenderer = false; +#endif +#ifdef OCIO_DIRECTX_ENABLED + bool useDxRenderer = false; +#endif bool verbose = false; bool stopOnFirstError = false; @@ -546,6 +585,12 @@ int main(int argc, const char ** argv) ap.options("\nCommand line arguments:\n", "--help", &printHelp, "Print help message", "--metal", &useMetalRenderer, "Run the GPU unit test with Metal", +#ifdef OCIO_DIRECTX_ENABLED + "--dx", &useDxRenderer, "Run the GPU unit test with DirectX 12", +#endif +#ifdef OCIO_VULKAN_ENABLED + "--vulkan", &useVulkanRenderer, "Run the GPU unit test with Vulkan", +#endif "-v", &verbose, "Output the GPU shader program", "--stop_on_error", &stopOnFirstError, "Stop on the first error", "--run_only %s", &filter, "Run only some unit tests\n" @@ -588,8 +633,8 @@ int main(int argc, const char ** argv) } // Step 1: Initialize the graphic library engines. - OCIO::OglAppRcPtr app; - + OCIO::GraphicalAppRcPtr app; + try { if(useMetalRenderer) @@ -601,9 +646,26 @@ int main(int argc, const char ** argv) return 1; #endif } +#ifdef OCIO_DIRECTX_ENABLED + else if(useDxRenderer) + { + app = std::make_shared("GPU tests - DirectX 12", 10, 10); + } +#endif +#ifdef OCIO_VULKAN_ENABLED + else if(useVulkanRenderer) + { + app = OCIO::VulkanApp::CreateVulkanApp(g_winWidth, g_winHeight); + } +#endif else { - app = OCIO::OglApp::CreateOglApp("GPU tests", 10, 10); +#ifdef OCIO_GL_ENABLED + app = OCIO::OglApp::CreateApp("GPU tests - OpenGL", 10, 10); +#else + std::cerr << std::endl << "No GPU backend available." << std::endl; + return 1; +#endif } } catch (const OCIO::Exception & e) @@ -611,14 +673,19 @@ int main(int argc, const char ** argv) std::cerr << std::endl << e.what() << std::endl; return 1; } + catch (const std::exception & e) + { + std::cerr << std::endl << e.what() << std::endl; + return 1; + } - app->printGLInfo(); + app->printGraphicsInfo(); // Step 2: Allocate the texture that holds the image. AllocateImageTexture(app); // Step 3: Create the frame buffer and render buffer. - app->createGLBuffers(); + app->createBuffers(); app->reshape(g_winWidth, g_winHeight); @@ -661,12 +728,31 @@ int main(int argc, const char ** argv) // Prepare the unit test. test->setVerbose(verbose); - test->setShadingLanguage( + + // Select the appropriate shading language based on the renderer + // (default GLSL 1.2 is used when none of the alternate backends match). + OCIO::GpuLanguage shadingLanguage = OCIO::GPU_LANGUAGE_GLSL_1_2; #if __APPLE__ - useMetalRenderer ? - OCIO::GPU_LANGUAGE_MSL_2_0 : + if (useMetalRenderer) + { + shadingLanguage = OCIO::GPU_LANGUAGE_MSL_2_0; + } +#endif +#ifdef OCIO_DIRECTX_ENABLED + if (useDxRenderer) + { + // SM_5_0 controls OCIO shader code generation syntax; DxApp always + // compiles to SM 6.0 via DXC regardless of this enum value. + shadingLanguage = OCIO::GPU_LANGUAGE_HLSL_SM_5_0; + } +#endif +#ifdef OCIO_VULKAN_ENABLED + if (useVulkanRenderer) + { + shadingLanguage = OCIO::GPU_LANGUAGE_GLSL_VK_4_6; + } #endif - OCIO::GPU_LANGUAGE_GLSL_1_2); + test->setShadingLanguage(shadingLanguage); bool enabledTest = true; try @@ -697,7 +783,7 @@ int main(int argc, const char ** argv) UpdateImageTexture(app, test); // Update the GPU shader program. - UpdateOCIOGLState(app, test); + UpdateOCIOGPUState(app, test); const size_t numRetest = test->getNumRetests(); // Need to run once and for each retest. @@ -723,10 +809,15 @@ int main(int argc, const char ** argv) ++failures; std::cerr << "FAILED - " << ex.what() << std::endl; } + catch(const std::exception & ex) + { + ++failures; + std::cerr << "FAILED - std::exception: " << ex.what() << std::endl; + } catch(...) { ++failures; - std::cerr << "FAILED - Unexpected error" << std::endl; + std::cerr << "FAILED - Unexpected error (unknown exception type)" << std::endl; } if (!enabledTest) diff --git a/tests/gpu/GradingPrimaryOp_test.cpp b/tests/gpu/GradingPrimaryOp_test.cpp index 86dd540a4f..8ade7ae568 100644 --- a/tests/gpu/GradingPrimaryOp_test.cpp +++ b/tests/gpu/GradingPrimaryOp_test.cpp @@ -133,7 +133,7 @@ OCIO_ADD_GPU_TEST(GradingPrimary, style_lin_rev_dynamic) namespace GPTest3 { -static constexpr OCIO::GradingStyle style = OCIO::GRADING_LIN; +static constexpr OCIO::GradingStyle style = OCIO::GRADING_VIDEO; static const OCIO::GradingRGBM lift{ 0.05, -0.04, 0.02, 0.05 }; static const OCIO::GradingRGBM gamma{ 0.9, 1.4, 0.7, 0.75 }; static const OCIO::GradingRGBM gain{ 1.2, 1.1, 1.25, 0.8 }; diff --git a/tests/gpu/Lut3DOp_test.cpp b/tests/gpu/Lut3DOp_test.cpp index d1ee3aa3de..3224b64bb1 100644 --- a/tests/gpu/Lut3DOp_test.cpp +++ b/tests/gpu/Lut3DOp_test.cpp @@ -8,6 +8,7 @@ #include #include "GPUUnitTest.h" +#include "LutLimits.h" namespace OCIO = OCIO_NAMESPACE; @@ -241,7 +242,7 @@ OCIO_ADD_GPU_TEST(Lut3DOp, 3dlut_biggest_supported) { // Linear interpolation OCIO::Lut3DTransformRcPtr lut = OCIO::Lut3DTransform::Create(); - lut->setGridSize(129); // Lut3DOpData::maxSupportedLength. + lut->setGridSize(OCIO::Max3DLUTLength); test.setProcessor(lut); diff --git a/tests/gpu/MatrixOp_test.cpp b/tests/gpu/MatrixOp_test.cpp index 6f47362d8e..6da6ea8a64 100644 --- a/tests/gpu/MatrixOp_test.cpp +++ b/tests/gpu/MatrixOp_test.cpp @@ -9,7 +9,8 @@ namespace OCIO = OCIO_NAMESPACE; -const float g_epsilon = 5e-7f; +// 1e-6 accommodates 1-2 ULP FMA rounding with DirectX tests (matrix output values ~7). +const float g_epsilon = 1e-6f; // Helper method to build unit tests diff --git a/tests/python/CPUProcessorTest.py b/tests/python/CPUProcessorTest.py index 4fc5e3c157..128281cfe9 100644 --- a/tests/python/CPUProcessorTest.py +++ b/tests/python/CPUProcessorTest.py @@ -19,7 +19,7 @@ class CPUProcessorTest(unittest.TestCase): - FLOAT_DELTA = 1e+5 + FLOAT_DELTA = 1e-5 UINT_DELTA = 1 @classmethod @@ -385,6 +385,28 @@ def test_apply_rgb_list(self): delta=self.FLOAT_DELTA ) + def test_apply_rgb_buffer_column_major(self): + if not np: + logger.warning("NumPy not found. Skipping test!") + return + + for arr, cpu_proc_fwd in [ + (self.float_rgb_2d, self.default_cpu_proc_fwd), + (self.float_rgb_3d, self.default_cpu_proc_fwd), + (self.half_rgb_2d, self.half_cpu_proc_fwd), + (self.half_rgb_3d, self.half_cpu_proc_fwd), + (self.uint16_rgb_2d, self.uint16_cpu_proc_fwd), + (self.uint16_rgb_3d, self.uint16_cpu_proc_fwd), + (self.uint8_rgb_2d, self.uint8_cpu_proc_fwd), + (self.uint8_rgb_3d, self.uint8_cpu_proc_fwd), + ]: + # Transpose to F-order (column-major) + arr_copy = arr.copy().T + + # Expect runtime error for non-C-contiguous array + with self.assertRaises(RuntimeError): + cpu_proc_fwd.applyRGB(arr_copy) + def test_apply_rgb_buffer(self): if not np: logger.warning("NumPy not found. Skipping test!") @@ -627,3 +649,48 @@ def test_apply_rgba_buffer(self): arr.flat[i], delta=self.UINT_DELTA ) + + def test_apply_rgba_buffer_column_major(self): + if not np: + logger.warning("NumPy not found. Skipping test!") + return + + for arr, cpu_proc_fwd in [ + ( + self.float_rgba_2d, + self.default_cpu_proc_fwd + ), + ( + self.float_rgba_3d, + self.default_cpu_proc_fwd + ), + ( + self.half_rgba_2d, + self.half_cpu_proc_fwd + ), + ( + self.half_rgba_3d, + self.half_cpu_proc_fwd + ), + ( + self.uint16_rgba_2d, + self.uint16_cpu_proc_fwd + ), + ( + self.uint16_rgba_3d, + self.uint16_cpu_proc_fwd + ), + ( + self.uint8_rgba_2d, + self.uint8_cpu_proc_fwd + ), + ( + self.uint8_rgba_3d, + self.uint8_cpu_proc_fwd, + ), + ]: + # Transpose to F-order (column-major) + arr_copy = arr.copy().T + # Expect runtime error for non-C-contiguous array + with self.assertRaises(RuntimeError): + cpu_proc_fwd.applyRGBA(arr_copy) diff --git a/tests/python/ConfigTest.py b/tests/python/ConfigTest.py index 9debc3da2e..62c2c7d043 100644 --- a/tests/python/ConfigTest.py +++ b/tests/python/ConfigTest.py @@ -1011,7 +1011,7 @@ def testFromEnvAndFromFile(uri, numberOfExpectedColorspaces, expectedConfigName) nbOfColorspacesForStudioConfig = 55 # Test that CreateFromFile does not work without ocio:// prefix for built-in config. - with self.assertRaises(OCIO.Exception) as cm: + with self.assertRaises(OCIO.ExceptionMissingFile) as cm: OCIO.Config.CreateFromFile(cgConfigName) # Test CG config. @@ -1446,6 +1446,27 @@ def test_active__displayview_lists(self): config.addActiveView(view="v1") self.assertEqual(config.getNumActiveViews(), 1) + def test_cyclic_color_space_transform(self): + """ + Regression test: a ColorSpace whose from_scene_reference is a + ColorSpaceTransform pointing back to itself must not crash the + process via stack overflow on getProcessor(). + """ + CYCLIC_PROFILE = """ocio_profile_version: 2 +roles: + default: cs0 +colorspaces: + - ! + name: cs0 + isdata: true + - ! + name: cs1 + from_scene_reference: ! {src: cs0, dst: cs1} +""" + cfg = OCIO.Config.CreateFromStream(CYCLIC_PROFILE) + with self.assertRaises(OCIO.Exception): + cfg.getProcessor("cs0", "cs1") + class ConfigVirtualWithActiveDisplayTest(unittest.TestCase): def setUp(self): diff --git a/tests/python/ConstantsTest.py b/tests/python/ConstantsTest.py index 852d6a9072..489e52f326 100644 --- a/tests/python/ConstantsTest.py +++ b/tests/python/ConstantsTest.py @@ -47,6 +47,7 @@ def test_string_constants(self): self.assertEqual(OCIO.METADATA_OUTPUT_DESCRIPTOR, 'OutputDescriptor') self.assertEqual(OCIO.METADATA_NAME, 'name') self.assertEqual(OCIO.METADATA_ID, 'id') + self.assertEqual(OCIO.METADATA_ID_ELEMENT, 'Id') # FileRules. self.assertEqual(OCIO.DEFAULT_RULE_NAME, 'Default') diff --git a/tests/python/GpuShaderDescTest.py b/tests/python/GpuShaderDescTest.py index a81dc4c2c1..dc8b21c691 100644 --- a/tests/python/GpuShaderDescTest.py +++ b/tests/python/GpuShaderDescTest.py @@ -17,7 +17,7 @@ import PyOpenColorIO as OCIO -from UnitTestUtils import STRING_TYPES +from UnitTestUtils import STRING_TYPES, TEST_DATAFILES_DIR class GpuShaderDescTest(unittest.TestCase): @@ -29,7 +29,7 @@ def test_shader_creator_interface(self): desc.setFunctionName("foo123") self.assertEqual("foo123", desc.getFunctionName()) desc.finalize() - self.assertEqual("glsl_1.3 foo123 ocio outColor 0 6001c324468d497f99aa06d3014798d8", + self.assertEqual("glsl_1.3 foo123 ocio outColor 0 0 1 6001c324468d497f99aa06d3014798d8", desc.getCacheID()) def test_uniform(self): @@ -132,14 +132,17 @@ def test_texture(self): desc = OCIO.GpuShaderDesc.CreateShaderDesc() buf = np.array([0,0.1,0.2,0.3,0.4,0.5]).astype(np.float32) - desc.addTexture('tex', 'sampler', 2, 3, - OCIO.GpuShaderDesc.TEXTURE_RED_CHANNEL, - OCIO.GpuShaderDesc.TEXTURE_2D, - OCIO.INTERP_DEFAULT, buf) - desc.addTexture(textureName='tex2', samplerName='sampler2', width=3, height=2, - channel=OCIO.GpuShaderDesc.TEXTURE_RED_CHANNEL, - dimensions=OCIO.GpuShaderDesc.TEXTURE_2D, - interpolation=OCIO.INTERP_DEFAULT, values=buf) + textureShaderBindingIndex = desc.addTexture('tex', 'sampler', 2, 3, + OCIO.GpuShaderDesc.TEXTURE_RED_CHANNEL, + OCIO.GpuShaderDesc.TEXTURE_2D, + OCIO.INTERP_DEFAULT, buf) + self.assertEqual(textureShaderBindingIndex, 1) + textureShaderBindingIndex = desc.addTexture(textureName='tex2', samplerName='sampler2', + width=3, height=2, + channel=OCIO.GpuShaderDesc.TEXTURE_RED_CHANNEL, + dimensions=OCIO.GpuShaderDesc.TEXTURE_2D, + interpolation=OCIO.INTERP_DEFAULT, values=buf) + self.assertEqual(textureShaderBindingIndex, 2) textures = desc.getTextures() self.assertEqual(len(textures), 2) t1 = next(textures) @@ -183,12 +186,14 @@ def test_texture_3d(self): desc = OCIO.GpuShaderDesc.CreateShaderDesc() buf = np.linspace(0, 1, num=8*3).astype(np.float32) bufTest1 = buf[3] - desc.add3DTexture('tex', 'sampler', 2, - OCIO.INTERP_DEFAULT, buf) + textureShaderBindingIndex = desc.add3DTexture('tex', 'sampler', 2, + OCIO.INTERP_DEFAULT, buf) + self.assertEqual(textureShaderBindingIndex, 1) buf = np.linspace(0, 1, num=27*3).astype(np.float32) bufTest2 = buf[42] - desc.add3DTexture('tex2', 'sampler2', 3, - OCIO.INTERP_DEFAULT, buf) + textureShaderBindingIndex = desc.add3DTexture('tex2', 'sampler2', 3, + OCIO.INTERP_DEFAULT, buf) + self.assertEqual(textureShaderBindingIndex, 2) textures = desc.get3DTextures() self.assertEqual(len(textures), 2) @@ -208,3 +213,67 @@ def test_texture_3d(self): v2 = t2.getValues() self.assertEqual(len(v2), 3*27) self.assertEqual(v2[42], bufTest2) + + def test_vulkan(self): + # Test texture binding functionality. + import os + + config = OCIO.Config.CreateRaw() + test_file = os.path.join(TEST_DATAFILES_DIR, 'clf', 'lut1d_lut3d_lut1d.clf') + file_tr = OCIO.FileTransform(src=test_file) + processor = config.getProcessor(file_tr) + + desc = OCIO.GpuShaderDesc.CreateShaderDesc() + desc.setDescriptorSetIndex(2, 10) + self.assertEqual(desc.getDescriptorSetIndex(), 2) + self.assertEqual(desc.getTextureBindingStart(), 10) + gpu_proc = processor.getDefaultGPUProcessor() + gpu_proc.extractGpuShaderInfo(desc) + + # Test 1D textures. + + textures = desc.getTextures() + self.assertEqual(len(textures), 2) + + t1 = next(textures) + self.assertEqual(t1.textureName, 'ocio_lut1d_0') + self.assertEqual(t1.samplerName, 'ocio_lut1d_0Sampler') + self.assertEqual(t1.width, 65) + self.assertEqual(t1.height, 1) + self.assertEqual(t1.channel, OCIO.GpuShaderDesc.TEXTURE_RED_CHANNEL) + self.assertEqual(t1.dimensions, OCIO.GpuShaderDesc.TEXTURE_1D) + self.assertEqual(t1.interpolation, OCIO.INTERP_LINEAR) + self.assertEqual(t1.textureShaderBindingIndex, 10) + if np: + v1 = t1.getValues() + self.assertEqual(len(v1), 65) + self.assertEqual(v1[0], np.float32(-0.25)) # -1023.75 / 4095 + + t2 = next(textures) + self.assertEqual(t2.textureName, 'ocio_lut1d_2') + self.assertEqual(t2.samplerName, 'ocio_lut1d_2Sampler') + self.assertEqual(t2.width, 4096) + self.assertEqual(t2.height, 17) + self.assertEqual(t2.channel, OCIO.GpuShaderDesc.TEXTURE_RED_CHANNEL) + self.assertEqual(t2.dimensions, OCIO.GpuShaderDesc.TEXTURE_2D) + self.assertEqual(t2.interpolation, OCIO.INTERP_LINEAR) + self.assertEqual(t2.textureShaderBindingIndex, 12) + if np: + v2 = t2.getValues() + self.assertEqual(len(v2), 69632) # 4096 x 17 + self.assertEqual(v2[0], np.float32(-0.0999755859375)) # halfToFloat(44646) + + # Test 3D textures. + + textures = desc.get3DTextures() + self.assertEqual(len(textures), 1) + t1 = next(textures) + self.assertEqual(t1.textureName, 'ocio_lut3d_1') + self.assertEqual(t1.samplerName, 'ocio_lut3d_1Sampler') + self.assertEqual(t1.edgeLen, 3) + self.assertEqual(t1.interpolation, OCIO.INTERP_LINEAR) + self.assertEqual(t1.textureShaderBindingIndex, 11) + if np: + v1 = t1.getValues() + self.assertEqual(len(v1), 3*3*3*3) + self.assertEqual(v1[0], np.float32(-0.05865102639296188)) # -60.0 / 1023 diff --git a/tests/python/GradingDataTest.py b/tests/python/GradingDataTest.py index 39cd8ba5cc..34abd89fff 100644 --- a/tests/python/GradingDataTest.py +++ b/tests/python/GradingDataTest.py @@ -368,6 +368,29 @@ def test_huecurve(self): assertEqualBSpline(self, hcrv.lum_sat, ls) self.assertEqual(hcrv.lum_sat, ls) + # Check that setting the hue curve preserves the spline type. + hcrv.hue_sat = ls + ls2 = hcrv.hue_sat + # Spline type is now different than what hue_sat normally uses (PERIODIC_1_B_SPLINE). + self.assertEqual(ls2.getSplineType(), OCIO.HORIZONTAL1_B_SPLINE) + self.assertEqual(hcrv.hue_sat, ls) + self.assertEqual(ls2, ls) + + # Check that setting the hue curve preserves the slopes. + self.assertEqual(ls.slopesAreDefault(), True) + slopes = ls.getSlopes() + slopes[1] = 0.5 + ls.setSlopes(slopes) + self.assertEqual(ls.slopesAreDefault(), False) + hcrv.hue_sat = ls + ls2 = hcrv.hue_sat + self.assertEqual(ls2.slopesAreDefault(), False) + slopes2 = ls2.getSlopes() + self.assertEqual(slopes2[1], 0.5) + self.assertEqual(slopes2, slopes) + self.assertEqual(hcrv.hue_sat, ls) + self.assertEqual(ls2, ls) + def test_rgbmsw(self): """ Test the GradingRGBMSW struct. diff --git a/tests/python/GroupTransformTest.py b/tests/python/GroupTransformTest.py index 0b4e47da68..cf3820cb32 100644 --- a/tests/python/GroupTransformTest.py +++ b/tests/python/GroupTransformTest.py @@ -162,7 +162,7 @@ def test_write_clf(self): self.assertEqual(grp.write(formatName='Academy/ASC Common LUT Format', config=config), """ - + Sample clf file. Sample matrix. diff --git a/tests/python/ProcessorTest.py b/tests/python/ProcessorTest.py index 2a989333e6..59ee32df2d 100644 --- a/tests/python/ProcessorTest.py +++ b/tests/python/ProcessorTest.py @@ -50,7 +50,7 @@ def test_cache_id(self): # Make the transform dynamic. ec.makeContrastDynamic() p = cfg.getProcessor(ec) - self.assertEqual(p.getCacheID(), '818420192074e6466468d59c9ea38667') + self.assertEqual(p.getCacheID(), '6468d59c-9ea3-8667-8184-20192074e646') def test_create_group_transform(self): # Test createGroupTransform() function. diff --git a/tests/testutils/UnitTest.h b/tests/testutils/UnitTest.h index f4bb339ee4..c66781e660 100644 --- a/tests/testutils/UnitTest.h +++ b/tests/testutils/UnitTest.h @@ -63,8 +63,6 @@ typedef std::vector UnitTests; UnitTests & GetUnitTests(); -extern int unit_test_failures; - struct AddTest { explicit AddTest(const OCIOTestRcPtr & test) @@ -132,6 +130,9 @@ int UnitTestMain(int argc, const char ** argv); #define OCIO_CHECK_EQUAL(x,y) OCIO_CHECK_EQUAL_FROM(x,y,__LINE__) +#define OCIO_CHECK_EQUAL_STR(x,y) \ + OCIO_CHECK_EQUAL_FROM(std::string_view((x)), std::string_view((y)),__LINE__) + // When using OCIO_CHECK_EQUAL in an helper method used by one or more // unit tests, the error message indicates the helper method line number // and not the unit test line number.